changeset 173:da1413358225

Sphinx documentation for VIFF 1.0.
author Martin Geisler <mg@lazybytes.net>
date Mon, 14 Dec 2009 17:13:25 +0100
parents 5f91351b54d8
children 1b68620145a0
files doc/1.0/_images/inheritance-1853b5fe4e7badd50948d04573e9169b50a03115.png doc/1.0/_images/inheritance-1853b5fe4e7badd50948d04573e9169b50a03115.png.map doc/1.0/_images/inheritance-20e3b4845d271fb6bf0df2dd54ba312dde1f754d.png doc/1.0/_images/inheritance-20e3b4845d271fb6bf0df2dd54ba312dde1f754d.png.map doc/1.0/_images/inheritance-264538c8121e2f80d730d336d6b4b9e8990cc047.png doc/1.0/_images/inheritance-264538c8121e2f80d730d336d6b4b9e8990cc047.png.map doc/1.0/_images/inheritance-4100e18547945068bc91aed143728d2259a2eee6.png doc/1.0/_images/inheritance-4100e18547945068bc91aed143728d2259a2eee6.png.map doc/1.0/_images/inheritance-434f28dafb9bd41fb4be5acd6fbeca28b43ac06f.png doc/1.0/_images/inheritance-434f28dafb9bd41fb4be5acd6fbeca28b43ac06f.png.map doc/1.0/_images/inheritance-5ac0ac613b2e4423965f646b50b489f2b09afac9.png doc/1.0/_images/inheritance-5ac0ac613b2e4423965f646b50b489f2b09afac9.png.map doc/1.0/_images/inheritance-6046153402aaeaf4ee9e593459bbfb3ce2c673cb.png doc/1.0/_images/inheritance-6046153402aaeaf4ee9e593459bbfb3ce2c673cb.png.map doc/1.0/_images/inheritance-693c1d374b2c4363ed61f051fd1542fd2fb12e57.png doc/1.0/_images/inheritance-693c1d374b2c4363ed61f051fd1542fd2fb12e57.png.map doc/1.0/_images/inheritance-9455c4fb81bb51a53bb2551efe60e480f5eceddd.png doc/1.0/_images/inheritance-9455c4fb81bb51a53bb2551efe60e480f5eceddd.png.map doc/1.0/_images/inheritance-dddf3179ae903542cb3ed4a0482b6c7fbc22df8b.png doc/1.0/_images/inheritance-dddf3179ae903542cb3ed4a0482b6c7fbc22df8b.png.map doc/1.0/_images/inheritance-f35b95880a76e1b6efb316898f9d2e5a0bfd170d.png doc/1.0/_images/inheritance-f35b95880a76e1b6efb316898f9d2e5a0bfd170d.png.map doc/1.0/_images/inheritance-f7c2db767443475744b3ae547d2bc944089e46df.png doc/1.0/_images/inheritance-f7c2db767443475744b3ae547d2bc944089e46df.png.map doc/1.0/_sources/active.txt doc/1.0/_sources/aes.txt doc/1.0/_sources/applications.txt doc/1.0/_sources/authors.txt doc/1.0/_sources/background.txt doc/1.0/_sources/bibliography.txt doc/1.0/_sources/coding-style.txt doc/1.0/_sources/comparison.txt doc/1.0/_sources/config.txt doc/1.0/_sources/constants.txt doc/1.0/_sources/contact.txt doc/1.0/_sources/development.txt doc/1.0/_sources/field.txt doc/1.0/_sources/glossary.txt doc/1.0/_sources/hashbroadcast.txt doc/1.0/_sources/history.txt doc/1.0/_sources/implementation.txt doc/1.0/_sources/index.txt doc/1.0/_sources/install.txt doc/1.0/_sources/matrix.txt doc/1.0/_sources/orlandi.txt doc/1.0/_sources/overview.txt doc/1.0/_sources/paillier.txt doc/1.0/_sources/passive.txt doc/1.0/_sources/preprocessing.txt doc/1.0/_sources/presentations.txt doc/1.0/_sources/program-counters.txt doc/1.0/_sources/prss.txt doc/1.0/_sources/runtime.txt doc/1.0/_sources/shamir.txt doc/1.0/_sources/todo.txt doc/1.0/_sources/unit-testing.txt doc/1.0/_sources/util.txt doc/1.0/_static/basic.css doc/1.0/_static/default.css doc/1.0/_static/doctools.js doc/1.0/_static/file.png doc/1.0/_static/jquery.js doc/1.0/_static/minus.png doc/1.0/_static/plus.png doc/1.0/_static/pygments.css doc/1.0/_static/searchtools.js doc/1.0/active.html doc/1.0/aes.html doc/1.0/applications.html doc/1.0/authors.html doc/1.0/background.html doc/1.0/bibliography.html doc/1.0/coding-style.html doc/1.0/comparison.html doc/1.0/config.html doc/1.0/constants.html doc/1.0/contact.html doc/1.0/development.html doc/1.0/field.html doc/1.0/genindex.html doc/1.0/glossary.html doc/1.0/hashbroadcast.html doc/1.0/history.html doc/1.0/implementation.html doc/1.0/index.html doc/1.0/install.html doc/1.0/matrix.html doc/1.0/modindex.html doc/1.0/objects.inv doc/1.0/orlandi.html doc/1.0/overview.html doc/1.0/paillier.html doc/1.0/passive.html doc/1.0/preprocessing.html doc/1.0/presentations.html doc/1.0/program-counters.html doc/1.0/prss.html doc/1.0/runtime.html doc/1.0/search.html doc/1.0/searchindex.js doc/1.0/shamir.html doc/1.0/todo.html doc/1.0/unit-testing.html doc/1.0/util.html
diffstat 104 files changed, 16600 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
Binary file doc/1.0/_images/inheritance-1853b5fe4e7badd50948d04573e9169b50a03115.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-1853b5fe4e7badd50948d04573e9169b50a03115.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,4 @@
+<map id="inheritancea3af458264" name="inheritancea3af458264">
+<area shape="rect" href="#viff.field.FieldElement" title="FieldElement" alt="" coords="7,5,108,32"/>
+<area shape="rect" href="#viff.field.GF256" title="GF256" alt="" coords="157,5,229,32"/>
+</map>
Binary file doc/1.0/_images/inheritance-20e3b4845d271fb6bf0df2dd54ba312dde1f754d.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-20e3b4845d271fb6bf0df2dd54ba312dde1f754d.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,3 @@
+<map id="inheritancef9d86d715a" name="inheritancef9d86d715a">
+<area shape="rect" href="#viff.runtime.Share" title="Share" alt="" coords="131,5,203,32"/>
+</map>
Binary file doc/1.0/_images/inheritance-264538c8121e2f80d730d336d6b4b9e8990cc047.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-264538c8121e2f80d730d336d6b4b9e8990cc047.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,6 @@
+<map id="inheritancee291c1fba7" name="inheritancee291c1fba7">
+<area shape="rect" href="#viff.comparison.ComparisonToft05Mixin" title="ComparisonToft05Mixin" alt="" coords="128,5,296,32"/>
+<area shape="rect" href="#viff.comparison.Toft05Runtime" title="Toft05Runtime" alt="" coords="344,31,456,57"/>
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="7,56,79,83"/>
+<area shape="rect" href="passive.html#viff.passive.PassiveRuntime" title="PassiveRuntime" alt="" coords="152,56,272,83"/>
+</map>
Binary file doc/1.0/_images/inheritance-4100e18547945068bc91aed143728d2259a2eee6.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-4100e18547945068bc91aed143728d2259a2eee6.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,4 @@
+<map id="inheritance56d8a87370" name="inheritance56d8a87370">
+<area shape="rect" href="#viff.runtime.Share" title="Share" alt="" coords="131,5,203,32"/>
+<area shape="rect" href="#viff.runtime.ShareList" title="ShareList" alt="" coords="252,5,332,32"/>
+</map>
Binary file doc/1.0/_images/inheritance-434f28dafb9bd41fb4be5acd6fbeca28b43ac06f.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-434f28dafb9bd41fb4be5acd6fbeca28b43ac06f.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,4 @@
+<map id="inheritancef014486c04" name="inheritancef014486c04">
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="7,5,79,32"/>
+<area shape="rect" href="#viff.paillier.PaillierRuntime" title="PaillierRuntime" alt="" coords="129,5,241,32"/>
+</map>
Binary file doc/1.0/_images/inheritance-5ac0ac613b2e4423965f646b50b489f2b09afac9.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-5ac0ac613b2e4423965f646b50b489f2b09afac9.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,4 @@
+<map id="inheritance5d5b083b4a" name="inheritance5d5b083b4a">
+<area shape="rect" href="runtime.html#viff.runtime.Share" title="Share" alt="" coords="131,5,203,32"/>
+<area shape="rect" href="#viff.orlandi.OrlandiShare" title="OrlandiShare" alt="" coords="251,5,355,32"/>
+</map>
Binary file doc/1.0/_images/inheritance-6046153402aaeaf4ee9e593459bbfb3ce2c673cb.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-6046153402aaeaf4ee9e593459bbfb3ce2c673cb.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,4 @@
+<map id="inheritance90ae1ad4d4" name="inheritance90ae1ad4d4">
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="7,5,79,32"/>
+<area shape="rect" href="#viff.passive.PassiveRuntime" title="PassiveRuntime" alt="" coords="128,5,248,32"/>
+</map>
Binary file doc/1.0/_images/inheritance-693c1d374b2c4363ed61f051fd1542fd2fb12e57.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-693c1d374b2c4363ed61f051fd1542fd2fb12e57.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,3 @@
+<map id="inheritanceb8b4880fbe" name="inheritanceb8b4880fbe">
+<area shape="rect" href="#viff.runtime.ShareExchanger" title="ShareExchanger" alt="" coords="648,28,762,52"/>
+</map>
Binary file doc/1.0/_images/inheritance-9455c4fb81bb51a53bb2551efe60e480f5eceddd.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-9455c4fb81bb51a53bb2551efe60e480f5eceddd.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,5 @@
+<map id="inheritance21c258f213" name="inheritance21c258f213">
+<area shape="rect" href="hashbroadcast.html#viff.hash_broadcast.HashBroadcastMixin" title="HashBroadcastMixin" alt="" coords="5,5,157,32"/>
+<area shape="rect" href="#viff.orlandi.OrlandiRuntime" title="OrlandiRuntime" alt="" coords="207,31,324,57"/>
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="45,56,117,83"/>
+</map>
Binary file doc/1.0/_images/inheritance-dddf3179ae903542cb3ed4a0482b6c7fbc22df8b.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-dddf3179ae903542cb3ed4a0482b6c7fbc22df8b.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,5 @@
+<map id="inheritance3685e35c7f" name="inheritance3685e35c7f">
+<area shape="rect" href="passive.html#viff.passive.PassiveRuntime" title="PassiveRuntime" alt="" coords="128,5,248,32"/>
+<area shape="rect" href="#viff.active.BasicActiveRuntime" title="BasicActiveRuntime" alt="" coords="296,5,443,32"/>
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="7,5,79,32"/>
+</map>
Binary file doc/1.0/_images/inheritance-f35b95880a76e1b6efb316898f9d2e5a0bfd170d.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-f35b95880a76e1b6efb316898f9d2e5a0bfd170d.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,6 @@
+<map id="inheritance5bed270536" name="inheritance5bed270536">
+<area shape="rect" href="#viff.comparison.ComparisonToft07Mixin" title="ComparisonToft07Mixin" alt="" coords="128,5,296,32"/>
+<area shape="rect" href="#viff.comparison.Toft07Runtime" title="Toft07Runtime" alt="" coords="344,31,456,57"/>
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="7,56,79,83"/>
+<area shape="rect" href="passive.html#viff.passive.PassiveRuntime" title="PassiveRuntime" alt="" coords="152,56,272,83"/>
+</map>
Binary file doc/1.0/_images/inheritance-f7c2db767443475744b3ae547d2bc944089e46df.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_images/inheritance-f7c2db767443475744b3ae547d2bc944089e46df.png.map	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,7 @@
+<map id="inheritance829e2e2490" name="inheritance829e2e2490">
+<area shape="rect" href="#viff.active.TriplesPRSSMixin" title="TriplesPRSSMixin" alt="" coords="307,5,432,32"/>
+<area shape="rect" href="#viff.active.ActiveRuntime" title="ActiveRuntime" alt="" coords="491,31,603,57"/>
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="7,56,79,83"/>
+<area shape="rect" href="passive.html#viff.passive.PassiveRuntime" title="PassiveRuntime" alt="" coords="128,56,248,83"/>
+<area shape="rect" href="#viff.active.BasicActiveRuntime" title="BasicActiveRuntime" alt="" coords="296,56,443,83"/>
+</map>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/active.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,26 @@
+
+A Thresholdbased Actively Secure Runtime
+========================================
+
+.. automodule:: viff.active
+
+   .. autoclass:: ActiveRuntime
+      :members:
+
+      .. inheritance-diagram:: ActiveRuntime
+         :parts: 1
+
+   .. autoclass:: BasicActiveRuntime
+      :members:
+
+      .. inheritance-diagram:: BasicActiveRuntime
+         :parts: 1
+
+   .. autoclass:: BrachaBroadcastMixin
+      :members:
+
+   .. autoclass:: TriplesHyperinvertibleMatricesMixin
+      :members:
+
+   .. autoclass:: TriplesPRSSMixin
+      :members:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/aes.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,6 @@
+
+AES Module
+==========
+
+.. automodule:: viff.aes
+   :members:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/applications.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,131 @@
+.. -*- coding: utf-8 -*-
+
+Applications
+============
+
+VIFF has been used for several small and some larger applications. The
+largest applications are listed below. Please see the ``apps/``
+directory in VIFF for more examples of small programs using VIFF.
+
+
+Nordic Sugar
+------------
+
+In Denmark, the production of sugarbeet is managed by sugarbeet
+contracts. A sugarbeet contract determines the quantity of sugarbeet
+that a farmer is allowed to produce. Traditionally, sugarbeet
+contracts have been traded between individual pairs of farmers. This
+has been done in spite of the fact that trading in a central market
+was known to increase the overall profit. A central market has,
+however, not been possible due to conflicting interests and lack of
+trust between the parties.
+
+In January 2008 the first large scale secure multiparty computation
+was carried out, effectively solving this problem. This was done by
+the SIMAP research project as reported in "`Multiparty Computation
+Goes Live`__" (also published at `Financial Crypto 2009`__). In the
+summer of 2009 the same computation was successfully repeated, this
+time using VIFF.
+
+.. __: http://eprint.iacr.org/2008/068
+.. __: http://www.springerlink.com/content/j4772m44r05x0527/
+
+The computation was a double auction in which the production rights
+for several thousand tons of sugarbeets were traded. During the first
+weeks of the auction, several hundred Danish sugarbeet farmers
+submitted their encrypted bids to a central database. Then the actual
+computation took place between three players:
+
+* Nordic Sugar, the Danish sugar company
+
+* DKS, the consolidation of Danish sugarbeet farmers
+
+* Partisia, a Danish company specialized in secure multiparty
+  solutions
+
+The computation took about 15 minutes using three laptops on a LAN.
+Most of the computation time was spend converting the encrypted bids
+to secret sharings. The actual multiparty computation took only a
+couple of minutes. As a result, the sugarbeet contracts could be
+traded at an optimal price without any sensitive information being
+disclosed.
+
+Using secure multiparty computation, trading sugarbeets using this
+kind of auction was possible without finding and paying a trusted
+third party to manage the auction. Such a trusted party would---if it
+could be found at all---probably have been quite expensive.
+
+
+Distributed RSA
+---------------
+
+Atle Mauland from the Norwegian University of Science and Technology
+(NTNU) used VIFF for his Master's Thesis titled "`Realizing Distributed
+RSA using Secure Multiparty Computations`__".
+
+.. __: http://daim.idi.ntnu.no/masteroppgave?id=4699
+
+The private key from a RSA key pair must be kept in a highly secure
+location (to prevent unauthorized persons from stealing it) but
+because we want to use the key, we cannot just write it on a piece of
+paper and store that in a safe.
+
+This tension between high availability and high security makes a
+distributed solution attractive. Atle Mauland implemented a protocol
+by Boneh and Franklin for generating RSA keys in a distributed
+fashion. The protocol ensures that the private key is never available
+in the clear to any given party and an attacker must break into all
+machines to learn the private key. Meanwhile, the parties can use
+their shares of the private key to securely decrypt messages encrypted
+under the public key.
+
+Generating a 1024-bit RSA key using VIFF took about 30 minutes on
+average (the time varied between 7 seconds and 2.5 hours). These
+results can likely be improved by using the GMPY library more
+aggressively.
+
+
+Distributed AES
+---------------
+
+The Advanced Encryption Standard (Rijndael) block cipher turns out to
+have nice arithmetic properties which makes its computation by
+arithmetic circuits relatively fast. Marcel Keller from the University
+of Aarhus has implemented a multiparty version of AES for VIFF.
+
+Using the :mod:`viff.aes` module, it is possible to securely
+compute a secret shared AES encrypted ciphertext of a (possibly)
+secret shared plaintext with a (possibly) secret shared key. The
+inputs have to be given either as a list of shares over
+:class:`~viff.field.GF256` (byte-wise) or as a string. The runtime has
+to be able to handle shares over GF256.
+
+Encrypting a 128-bit block using a 128-bit secret shared AES key takes
+about 2 seconds using three machines. Decryption is not implemented
+yet.
+
+
+Secure Voting
+-------------
+
+Typical Internet voting systems store all votes in a single location.
+Håvard Vegge  from the Norwegian University of Science and Technology
+(NTNU) used VIFF for his Master's Thesis titled "`Realizing Secure
+Multiparty Computations`__" to implement a distributed voting system.
+
+.. __: http://daim.idi.ntnu.no/masteroppgave?id=4559
+
+The system removes the single point of failure by storing the votes in
+secret shared form between three servers. The voters will do the
+secret sharing on their own machine, encrypt the shares, and send the
+encrypted shares to a database. Each share is encrypted under the
+public key belonging to the computation server that will do the actual
+multiparty computation.
+
+This project shows how VIFF can be integrated with many other
+technologies. The user creates a vote on a website programmed in PHP
+and the voting is cast using a Java applet. The applet has the
+responsibility of encrypting the votes for the computation servers.
+When all voters have cast their vote, a XML-RPC message is sent to the
+Python program running on the servers. That program decrypts the
+shares and uses VIFF to compute the result.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/authors.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,24 @@
+.. -*- coding: utf-8 -*-
+
+VIFF Development Team
+=====================
+
+The following people have contributed to VIFF (ordered by first commit
+to the repository):
+
+* Martin Geisler <mg@daimi.au.dk>
+* Tomas Toft
+* Mikkel Krøigård <mk@daimi.au.dk>
+* Thomas Pelle Jakobsen <mas@daimi.au.dk>
+* Jakob Illeborg Pagter
+* Sigurd Meldgaard
+* Marcel Keller <mkeller@cs.au.dk>
+* Tord Reistad
+* Ivan Damgård
+* Janus Dam Nielsen <janus.nielsen@alexandra.dk>
+
+If you have been forgotten, then please checkout `the repository`_,
+add yourself to the list and `send us a patch`_!
+
+.. _the repository: http://hg.viff.dk/viff/
+.. _send us a patch: mailto:viff-devel@viff.dk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/background.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,13 @@
+
+Background Information
+======================
+
+The following document will provide some background information on the
+design of VIFF.
+
+.. toctree::
+   :maxdepth: 2
+
+   program-counters
+   preprocessing
+   history
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/bibliography.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,80 @@
+.. -*- coding: utf-8 -*-
+
+Bibliography
+============
+
+.. note::
+
+   This list is far from complete. If you find more relevant
+   references then please `send us a mail`__ with the information.
+
+   .. __: mailto:viff-devel@viff.dk
+
+The algorithms used by VIFF are published in various academic papers.
+Here we will try to point out which parts of the code uses which
+papers.
+
+* The primary reference is [DGKN]_. This paper describes the
+  asynchronous protocol secure against active adversaries implemented
+  in VIFF.
+
+* The ``viff.shamir`` module is obviously based on [Shamir79]_.
+
+*  ``apps/millionaires.py``: Inspired by [Yao82]_.
+
+* The default comparison operation (``Runtime.greater_than_equal``) is
+  based on the comparison protocol from [Toft05]_.
+
+* Broadcast (``Runtime.broadcast``) is based on the original paper by
+  [Bracha84]_ and on the explanation by [Cachin05]_.
+
+* The pseudo-random secret sharing (PRSS) in ``viff.prss`` is
+  described in [CDI05]_. The
+  :meth:`~viff.passive.PassiveRuntime.prss_share_bit_double` method
+  uses a protocol described in [Damgård08]_.
+
+* The protocol for equality testing with secret shared result is from
+  [Nishide07]_.
+
+
+.. [Bracha84] G. Bracha, *An asynchronous [(n-1)/3]-resilient
+   consensus protocol*, Proc 3rd ACM Symposium on Principles of
+   Distributed Computing (PODC), 1984, 154-162.
+
+.. [Cachin05] Christian Cachin, *Security and Fault-tolerance in
+   Distributed Systems*, ETHZ, 2005, PDF__.
+
+   .. __: http://www.zurich.ibm.com/~cca/sft05/agreement.pdf
+
+.. [CDI05] Ronald Cramer, Ivan Damgård, and Yuval Ishai, *Share
+   Conversion, Pseudorandom Secret-Sharing and Applications to Secure
+   Computation*, Proc of TCC 2005, LNCS 3378, PS__.
+
+   .. __:  http://www.cs.technion.ac.il/~yuvali/pubs/CDI05.ps
+
+.. [Damgård08] Ivan Damgård and Rune Thorbek, *Efficient Conversion of
+   Secret-shared Values Between Different Fields*, Cryptology ePrint
+   Archive: `Report 2008/221`__.
+
+   .. __: http://eprint.iacr.org/2008/221
+
+.. [DGKN] Ivan Damgård, Martin Geisler, Mikkel Krøigaard, Jesper Buus
+   Nielsen, *Asynchronous Multiparty Computation: Theory and
+   Implementation*, Cryptology ePrint Archive: `Report 2008/415`__.
+
+   .. __: http://eprint.iacr.org/2008/415
+
+.. [Nishide07] Takashi Nishide and Kazuo Ohta, *Constant-Round
+   Multiparty Computation for Interval Test, Equality Test, and
+   Comparison*, IEICE Transactions, 90-A (5): 960-968.
+
+.. [Shamir79] Adi Shamir, *How to share a secret*, Communications of
+   the ACM, 22 (11): 612-613.
+
+.. [Toft05] Tomas Toft, *Secure Integer Computation with Applications
+   in Economics*, PhD Progress Report, July 2005, PDF__.
+
+   .. __: http://www.daimi.au.dk/~ttoft/publications/progress.pdf
+
+.. [Yao82] Andrew Chi-Chih Yao, *Protocols for Secure Computations*,
+   FOCS 1982, 160-164.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/coding-style.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,89 @@
+.. -*- coding: utf-8 -*-
+
+Coding Style
+============
+
+The VIFF code tries to follow the coding style laid out in :pep:`8`,
+which you should read or at least skim over. You can check your code
+against by running the pep8.py_ checker.
+
+.. _pep8.py: http://svn.browsershots.org/trunk/devtools/pep8/pep8.py
+
+
+The VIFF Coding Style in Short
+------------------------------
+
+A summary of the rules:
+
+* Use four spaces for indention, never tabs.
+
+  .. epigraph::
+
+     Thus spake the Lord: *Thou shalt indent with four spaces. No
+     more, no less. Four shall be the number of spaces thou shalt
+     indent, and the number of thy indenting shall be four. Eight
+     shalt thou not indent, nor either indent thou two, excepting that
+     thou then proceed to four. Tabs are right out.*
+
+     -- Georg Brandl
+
+* Use a single space around binary operators.
+
+* Name classes using ``CamelCase``.
+
+* Name variables, function, and methods using lowercase words like
+  ``foo_bar``.
+
+* Write docstrings for your functions and methods. Include test for
+  doctest_ if possible.
+
+  .. _doctest: http://docs.python.org/lib/module-doctest.html
+
+* Try to be consistent.
+
+These rules are there to make the source code more readable for both
+old and new people.
+
+The Twisted Coding Style
+------------------------
+
+VIFF uses Twisted_ and their code follows a slightly different coding
+style. Their style is closer to the style used in Java where functions
+and methods are named ``fooBar`` instead of ``foo_bar``.
+
+When writing code which is close to Twisted code, you might want to
+follow that style too. If you subclass a Twisted class to override
+some behavior, you might be forced to follow their style.
+
+If you have a choice, then you should only use the Twisted style if
+you expect people to call both your code and the Twisted code — if
+people will only call your code, then please follow the standard VIFF
+coding style.
+
+.. _Twisted: http://twistedmatrix.com/
+
+Hints for indexed variables
+---------------------------
+
+When the code is based on a mathematical text, one often sees lots of
+*b*\ :sub:`i` variables. A nice way to deal with those in code is to
+consider them part of a list called ``b`` and create it like this::
+
+  b = [self.rt.prss_share_random(Zp, binary=True)
+       for _ in range(k)]
+
+It is not a good idea to name the list ``bi`` since that is what you
+would want to call the elements in the list::
+
+  x = [bi * bi for bi in b]
+
+If the index of the current element is needed::
+
+  number = sum([2**i * bi for i, bi in enumerate(b)])
+
+If you want to work with the list by index, you get the nice
+correspondence between *b*\ :sub:`i` and ``b[i]``::
+
+  z = 0
+  for in range(k)
+    z += b[i] + x[k - i]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/comparison.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,31 @@
+
+Comparison protocols
+====================
+
+Two comparison protocols have been implemented in VIFF. They are
+available in the classes
+:class:`~viff.comparison.ComparisonToft05Mixin` and
+:class:`~viff.comparison.ComparisonToft07Mixin`. Both protocols have
+been designed by Tomas Toft.
+
+The classes are *mixin* classes which means that they are meant to be
+used ("mixed") with other classes to build a finished usable class.
+Two standard "flavors" are provided in the
+:class:`~viff.comparison.Toft05Runtime` and
+:class:`~viff.comparison.Toft07Runtime`.
+
+.. autoclass:: viff.comparison.ComparisonToft05Mixin
+   :members: greater_than_equal
+
+.. autoclass:: viff.comparison.Toft05Runtime
+
+   .. inheritance-diagram:: viff.comparison.Toft05Runtime
+      :parts: 1
+
+.. autoclass:: viff.comparison.ComparisonToft07Mixin
+   :members: greater_than_equal
+
+.. autoclass:: viff.comparison.Toft07Runtime
+
+   .. inheritance-diagram:: viff.comparison.Toft07Runtime
+      :parts: 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/config.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,18 @@
+
+Config Module
+=============
+
+.. automodule:: viff.config
+
+   .. autoclass:: Player
+      :members: prfs, dealer_prfs
+
+      .. attribute:: id
+                     host
+                     port
+
+         ID, hostname, and portnumber of the player.
+
+   .. autofunction:: generate_configs
+
+   .. autofunction:: load_config
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/constants.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,26 @@
+Constants Module
+================
+
+.. automodule:: viff.constants
+
+   .. attribute:: SHARE
+                  ECHO
+                  READY
+                  SEND
+                  PAILLIER
+                  TEXT
+
+      Constants used by :class:`~viff.runtime.ShareExchanger` and
+      others when sending shares and other messages. They serve to
+      distinguish messages sent with the same program counter from one
+      another.
+
+   .. attribute::INCONSISTENTHASH
+                  OK
+                  HASH
+                  SIGNAL
+
+      Constants used by
+      :class:`~viff.hash_broadcast.HashBroadcastMixin` when sending
+      shares and other messages. They serve to distinguish messages
+      sent with the same program counter from one another.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/contact.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,55 @@
+
+Contact
+=======
+
+If you need help with VIFF or want to comment on anything, then please
+contact us by the channels listed below. We are very interested in any
+and all feedback, so please don't be shy :-)
+
+
+Mailing lists
+-------------
+
+There are three mailing lists associated with VIFF. They are all very
+low volume with at most a handful of mails per day.
+
+:viff-devel_: This list is for general questions and discussions on
+  the development of VIFF. Unless you have a patch, you should send
+  your question here.
+
+  Any question can be sent there --- VIFF is still a little rough
+  around the edges, so please ask for help if you cannot get VIFF
+  working! The list is archived locally_, at Gmane_ (where you can
+  read/post over `NNTP using a newsreader`__) and at `The Mail
+  Archive`__.
+
+:viff-patches_: This is where you will want to send your patches for
+  VIFF. Don't worry about filling the list with huge patch series --
+  that is why the list is there!
+
+  You should subscribe to this list if you are interested in
+  discussing the latest code before it ends up in the main repository.
+
+:viff-commits_: This is a read-only list. Whenever something is pushed
+  to the VIFF repository, a mail is sent to this list with a short
+  description of the change.
+
+  Subscribe here if you want to be at the forefront of the
+  development.
+
+
+IRC
+---
+
+If you want to discuss something in realtime with the VIFF developers,
+then please join us at the ``#viff`` channel on ``irc.freenode.net``.
+
+
+.. _viff-devel:   http://lists.viff.dk/listinfo.cgi/viff-devel-viff.dk
+.. _viff-patches: http://lists.viff.dk/listinfo.cgi/viff-patches-viff.dk
+.. _viff-commits: http://lists.viff.dk/listinfo.cgi/viff-commits-viff.dk
+
+.. _locally: http://lists.viff.dk/pipermail/viff-devel-viff.dk/
+.. _Gmane: http://dir.gmane.org/gmane.comp.cryptography.viff.devel
+.. __: nntp://news.gmane.org/gmane.comp.cryptography.viff.devel
+.. __: http://www.mail-archive.com/viff-devel@viff.dk/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/development.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,175 @@
+.. -*- coding: utf-8 -*-
+
+Developer's Guide
+=================
+
+This page explains what you need to know if you want to start hacking
+on VIFF. In addition to these instructions you will want to read up on
+the `coding style`_ used by VIFF (it is the normal Python style,
+nothing fancy there).
+
+.. _coding style: coding-style.html
+
+
+Getting the Source Code
+-----------------------
+
+VIFF is developed using Mercurial_ (also known as ``hg`` after its
+command line program). This is a distributed revision control system
+which allows you to participate fully in the development even if you
+do not have what is traditionally known as "commit access". You can
+also work offline and take advantage of the many fast operations
+offered by Mercurial.
+
+.. _Mercurial: http://mercurial.selenic.com/
+
+After installing Mercurial you can checkout a copy of the source using
+this command line::
+
+   hg clone http://hg.viff.dk/viff/
+
+This will create a directory called ``viff/`` where you will find the
+source code. Please test that VIFF works as expected on your computer
+by following the instructions on `unit testing`_.
+
+.. _unit testing: unit-testing.html
+
+
+Contributing Changes
+--------------------
+
+When you have created a new feature or fixed a bug, then you need to
+send your changes to one of the VIFF developers. If you share a file
+system with one of the developers, then the easiest way to get your
+changes back into VIFF is to ensure that one of the developers has
+read access on the repository files. He can then simply pull the
+changesets over and eventually push them out to the VIFF repository.
+
+Alternatively, you can setup a Mercurial repository where one of the
+developers can ``hg pull`` from. You can do this by uploading your
+clone on some public web server (any webserver works for this since
+the developers can pull using ``hg pull http://...``) or by running::
+
+   hg serve -p 8000
+
+which creates a web server on port 8000 just like the one running at
+http://hg.viff.dk/viff/. The default port number is 8000, so you can
+leave that out.
+
+A final option is the patchbomb_ extension for Mercurial, which will
+allow you to use::
+
+   hg email -t viff-patches@viff.dk -o
+
+to send the changesets not present in the VIFF repository (``-o``) to
+the VIFF patches list (``-t viff-patches@viff.dk``). You will
+probably want to test using a ``-n`` flag or by sending the patches to
+your own address first to make sure everything looks okay. You can get
+the full list of options using ``hg help email``.
+
+.. _patchbomb: http://mercurial.selenic.com/wiki/PatchbombExtension
+
+The advantage of using patchbomb is that allows everybody to go over
+the code and comment on it before the changesets are pulled into the
+repository. The mails sent out by patchbomb contain all the metadata
+needed (name of committer, date, parent changeset, etc.) for importing
+the changes into the repository, just as if the changesets had been
+pulled using ``hg pull``.
+
+Commit Messages
+"""""""""""""""
+
+Please format your commit messages as follows::
+
+   topic: terse one-line summary (60 characters max)
+
+   After the summary line, you're encouraged to provide a bigger
+   description of your changes. If your change is small or obvious
+   from the diff, you can leave this out.
+
+   Please wrap your paragraphs at ~70 characters or so. That ensures
+   that they are readily readable on a standard terminal.
+
+The *topic* in the summary line describes which part of the code the
+changeset touches. There's no fixed list of topics, but a change to
+``viff/X.py`` normally gets the "X" topic.
+
+
+Revising Changes
+----------------
+
+When developing your changes you will probably make many commits
+representing contained steps. Even though you have made a commit, you
+can still change it *as long as you have not shared it with anybody*.
+The idea is that you are allowed to rewrite history as you see fit in
+your own private repository, but if your changes have been pulled to
+the outside, then you can no longer change them.
+
+Also, you can only change commits in a linear history back from your
+repository tip. This means that if you pull in changes from the main
+VIFF repository and merge them periodically, then you can no longer
+edit changesets past the last merge. We therefore recommend that you
+develop your feature until you are satisfied with it and only merges
+with whatever new changesets there might be in the VIFF repository
+when the feature is done and debugged.
+
+Now, to change a past commit you use the `Mercurial Queues extension`_
+also known as MQ. It gives you a powerful set of tools to work with
+the past history. The basic concept is that changesets can be
+converted into patches, which depend on each other and form a stack.
+Like any good stack, you can push and pop elements from it. In this
+case you push and pop patches.
+
+To get started you will want to import the normal changesets into MQ.
+Let us suppose you found an error in revision 430 (use ``hg view`` or
+``hg log`` to find the revision numbers). You then want to import
+revision 430 and the following changesets into MQ with this command::
+
+   hg qimport -r 430:tip
+
+Nothing much happened — your working directory is left unchanged. To
+see that the command did something you can check the current patch
+series with ``hg qseries``. When importing changesets revision N is
+called ``N.diff`` in the patch series.
+
+What we want is to pop off the other patches so that ``430.diff`` is
+the topmost patch. This is done with::
+
+   hg qgoto 430.diff
+
+This updates your working directory to look exactly like it did when
+you originally committed revision 430! You can now edit the files to
+correct the error you found, and when you are done you run::
+
+   hg qrefresh
+
+to refresh the patch in ``430.diff``. You can use ``hg qrefresh -e``
+to edit the commit message too. Now comes the fun part — you must now
+push the the other patches back on the stack with::
+
+   hg qpush -a
+
+If this goes well with no complaints, then you can finish the patches
+again with::
+
+   hg qfinish -a
+
+The end result is a completely normal repository with no sign of this
+surgery. You can repeat this as many times as needed to slowly develop
+your patches until you are satisfied with the results.
+
+
+If the changes you made to the patch are conflicting with other
+patches in your stack, then the pushing will stop where the error was
+encountered, and the conflicting patch hunk is stored in a ``.rej``
+file. There is no need to panic if this happens — all you need to do
+is to determine how the hunk in the ``.rej`` file(s) should be applied
+(if at all) and then run ``hg qrefresh`` to indicate that the current
+patch is okay. Now continue applying patches with ``hg qpush -a`` and
+fix any remaining conflicts.
+
+
+.. _Mercurial Queues extension: http://mercurial.selenic.com/
+                                wiki/MqExtension
+
+.. LocalWords:  changeset changesets
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/field.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,29 @@
+
+Finite Fields Module
+====================
+
+.. automodule:: viff.field
+
+   .. autoclass:: FieldElement
+
+   .. autoclass:: GF256
+      :members: __add__, __mul__, __pow__, __div__, __neg__,
+                __invert__, __eq__, __nonzero__, __int__
+
+      .. inheritance-diagram:: GF256
+         :parts: 1
+
+      .. attribute:: GF256.modulus
+
+         Field modulus, always 256.
+
+      .. method:: GF256.__sub__(other)
+                  GF256.__xor__(other)
+
+         Subtraction and exclusive-or. Since GF(2^8) has
+         characteristic 2, these two operations are identical to
+         addition.
+
+   .. autofunction:: GF
+
+   .. autofunction:: FakeGF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/glossary.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,18 @@
+
+Glossary
+========
+
+.. glossary::
+
+   Ideal functionality
+     An ideal functionality is an uncorruptable party in an ideal
+     protocol.
+
+   Program counter
+     A label associated with an operation, used to identify the data
+     when it is received over the network. Please see :ref:`program-counters`.
+
+   VIFF
+     Abbreviation for *Virtual Ideal Functionality Framework*. VIFF
+     allows you to write programs which behave as if they had access
+     to an :term:`ideal functionality`.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/hashbroadcast.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,12 @@
+
+An Hash Based Broadcast Protocol
+================================
+
+.. automodule:: viff.hash_broadcast
+
+   .. autoclass:: InconsistentHashException
+      :members:
+
+   .. autoclass:: HashBroadcastMixin
+      :members:
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/history.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,124 @@
+
+The History of VIFF
+===================
+
+VIFF was started by Martin Geisler in March 2007. The original name
+for the project was *PySMPC* since it was, well..., a Python library
+for doing secure multi-party computations (SMPC). That name was
+eventually dropped since it is somewhere between difficult and
+impossible pronouncing it in a fluent way. After a vote_ on Martin's
+blog, the name was changed to Virtual Ideal Functionality Framework
+with the much smoother abbreviation VIFF. The idea is that VIFF allows
+you to implement an ideal functionality in software, and can thus be
+seen as a framework for building *virtual* ideal functionalities.
+
+.. _vote: http://mgeisler.net/2007/10/vote-for-your-favorite-name/
+
+
+Background
+----------
+
+VIFF grew out of a research project called SIMAP_ which is conducted
+at the University of Aarhus, Denmark in collaboration with the
+University of Copenhagen and industry partners. SIMAP is short for
+*Secure Information Management and Processing* and the main goal of
+the project is to develop tools that can be used to build applications
+which use SMPC to solve real-world problems. The tools are a set of
+efficient cryptographic protocols and a domain-specific language which
+aims to allow normal programmers to use the cryptographic protocols in
+an easy and *secure* manner without being security experts themselves.
+In January 2008 the SIMAP project ran the `first ever large-scale SMPC
+application`_ in which Danish farmers traded sugar beet contracts using
+a secure double auction.
+
+.. _SIMAP: http://sikkerhed.alexandra.dk/uk/projects/simap/
+.. _first ever large-scale SMPC application:
+   http://sikkerhed.alexandra.dk/uk/projects/simap/MPCannouncement.pdf
+
+The SIMAP project is the successor to the SCET_ project (short for
+*Secure Computing Economy and Trust*) which implemented a prototype of
+the secure double auction used in SIMAP. The comparison protocol used
+is available as :class:`ComparisonToft05Mixin` in VIFF, but people
+might still refer to it as the "SCET comparison" on the mailing list.
+
+.. _SCET: http://sikkerhed.alexandra.dk/uk/projects/scet.htm
+
+
+Problems and solutions
+----------------------
+
+While the foundation for the sugar beet auction was being programmed
+in Java in the SIMAP project, Martin began experimenting with a new
+architecture in Python. The Java implementation was big with about
+8,500 lines of code for some 130 classes and interfaces and while
+implementing the comparison protocol it had become clear that there
+were a number of problems with its design.
+
+Problems
+""""""""
+
+We knew from the beginning that it was important to run things in
+parallel to use the bandwidth in the most efficient way. So a concept
+of "batch jobs" was introduced for grouping parallel operations
+together. The problem was that one had to write code for dealing with
+combinations of different batch jobs so when implementing a new
+operation (such as a comparison protocol) one had to define how a
+batch job would look like for the new operation and how the batch job
+would be combined with all other types of batch jobs. This severely
+limited the modularity since every new piece of code needed to know
+about every old piece.
+
+Another problem was that although the high lever interface manipulated
+secret shared values as first class objects, the runtime system did
+not. Instead the values were kept in a ``HashMap`` and referenced
+using integers by the internal runtime code. So extending the runtime
+system could not be extended in terms of itself, akin to how the
+earliest compilers had to be written in assembler instead of a higher
+level language.
+
+
+Solutions
+"""""""""
+
+The `Twisted network framework`_ turned out to be a both simple and
+elegant solution to the first problem. The key is the
+:class:`Deferred` class which allows the code to treat all operations
+equal: they all take deferred inputs and return a deferred output. All
+time is spend either working on local data or waiting for more inputs
+to arrive over the network. When data arrives the associated callbacks
+are immediately executed without regard to what kind of operation they
+are. This uniform interface means that as many operations as possible
+are executed in parallel. Extending the runtime with new operations is
+also much simpler since the framework will take care of running things
+in parallel -- new operations work the same as old "primitive"
+operations.
+
+It is interesting to note that this design relies heavily on the use
+of function pointers, something which Java lacks. Python also supports
+anonymous functions (lambda expressions) which are very convenient
+with this programming style. It might be possible to design a similar
+system in Java by using objects to represent the callbacks, but it
+would probably be much more cumbersome.
+
+The problem with representing secret shared values by integers
+internally instead of objects could of course have been solved equally
+well in Java.
+
+.. _Twisted network framework: http://twistedmatrix.com/
+
+
+Current status
+--------------
+
+VIFF supports most if not all the protocols that the SIMAP code
+supports, and extends them in some cases by providing security against
+active adversaries. VIFF started out as 450 lines of code which
+supported arithmetic with Shamir shares and pseudo-random secret
+sharing -- that was all it took to implement the basic ideas using
+Twisted. The code has since grown to a little less than 4,000 lines.
+
+Despite the growth in code size, we believe that VIFF can still be
+considered a light-weight library for secure multi-party computation.
+To the best of our knowledge VIFF is the only library available for
+general SMPC and we hope that it will become *the* standard SMCP
+library and thus a stable test-bed for new cryptographic protocols.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/implementation.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,25 @@
+
+Implementation
+==============
+
+VIFF consists of several modules which will be described next.
+
+.. toctree::
+   :maxdepth: 2
+
+   util
+   field
+   shamir
+   matrix
+   runtime
+   passive
+   active
+   paillier
+   comparison
+   prss
+   config
+   aes
+   constants
+   orlandi
+   hashbroadcast
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/index.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,52 @@
+
+Welcome to VIFF's documentation!
+================================
+
+The Virtual Ideal Functionality Framework is a general framework for
+doing secure multi-party computation.
+
+This is the documentation for VIFF |version|. If you have comments and
+suggestions for improvements to the documentation, then please `let us
+know`_.
+
+.. _let us know: viff-devel@viff.dk
+
+.. ifconfig:: version != release
+
+   .. warning::
+
+      This documentation is for a development version of VIFF (version
+      |release|) built |today| and it might be different from the last
+      released version. The documentation for other releases can be
+      found online_.
+
+      .. _online:  http://viff.dk/doc/
+
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   overview
+   install
+   applications
+   implementation
+   background
+   todo
+   coding-style
+   development
+   unit-testing
+   presentations
+   bibliography
+   contact
+   authors
+   glossary
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/install.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,250 @@
+.. -*- coding: utf-8 -*-
+.. (Links are marked with underscores, see the bottom of the file.)
+
+Installation Guide
+==================
+
+VIFF is written in Python and uses the Twisted framework for
+asynchronous communication, (optionally) OpenSSL and PyOpenSSL for
+secure communication, and GMPY for fast bignum arithmetic. You can
+find these components here:
+
+:Python:         http://python.org/
+:Twisted:        http://twistedmatrix.com/
+:OpenSSL:        http://www.openssl.org/
+:PyOpenSSL:      http://pyopenssl.sourceforge.net/
+:GMPY:           http://code.google.com/p/gmpy/
+
+VIFF has been successfully tested with the following versions:
+
+:Python:         2.4.1 -- 2.6.0 (3.0 is not yet supported)
+:Twisted:        2.5 -- 8.1.0
+:OpenSSL:        0.9.8g
+:PyOpenSSL:      0.7 -- 0.8
+:GMPY:           1.0alpha -- 1.0.3
+
+Please `report back`_ if you find that VIFF works with other versions
+than the ones listed here.
+
+Below you will find installation instructions for the different
+platforms on which we `test VIFF`_.
+
+
+Windows
+-------
+
+This describes the installation procedure for VIFF on Windows. It has
+been tested and verified on Windows XP Professional 2002 SP2 and
+Windows Vista Ultimate SP1.
+
+1) Download and install Python_.
+
+2) Include the path to your Python installation (e.g. ``C:\Python25\``)
+   in the ``PATH`` system environment variable. One way to edit this
+   environment variable is by right-clicking My Computer in the Start
+   menu, selecting Properties, Advanced, and then pressing the
+   Environment Variables button.
+
+3) Download and install Twisted_.
+
+4) Download and install GMPY_. If you are using Vista, right-click on
+   the installer and choose the option to run as administrator.
+
+5) Download and execute an `OpenSSL Win32 Installer`_. Problems have
+   been reported when using the latest release, 0.9.8h, so currently
+   0.9.8g is recommended.
+
+6) Download and install PyOpenSSL_. Again, run the installer as
+   administrator if you are using Vista.
+
+7) Download and install VIFF_. Note that if you are using the
+   installer on Vista, you will again need to run it as an
+   administrator.
+
+8) Proceed to `testing`_.
+
+
+Mac OS X
+--------
+
+This describes installation of VIFF on Max OS X 10.5.
+
+1) Download and install the full MacPython_ version 2.5 (the
+   Python-installation which comes with Mac OS X is not entirely
+   up-to-date).
+
+2) Download and Install Twisted_ from source. There is an installer
+   for Mac OS X 10.5 which can be used if you use Mac OS X
+   10.5. Notice again that Mac OS X comes with a pre-installed version
+   of Twisted, but this is not the full Twisted installation. After
+   installation change your ``PYTHONPATH`` (in your
+   ``~/.bash_profile``) to::
+
+      export PYTHONPATH="/Library/Python/2.5/site-packages:${PYTHONPATH}"
+      export PYTHONPATH=$PYTHONPATH:$HOME/opt/lib/python
+
+3) Optionally: download PyOpenSSL_ and tell us if it works!
+
+4) Download and install GMP_. You can preferably use the Macports or
+   Fink package utilities. If you download the other dependencies from
+   either Macports or Fink, they might depend on Python 2.4 which is
+   not preferable, you should use Python 2.5, unless you have good
+   reasons not to.
+
+5) Download and install GMPY_ following the instructions in
+   ``gmpy-1.02.macosx.README.txt`` (under Downloads).
+
+6) Install VIFF `from source`_. If you prefer you can just
+   install it in site-packages, it makes no difference.
+
+   For developers, either add VIFF to the PYTHONPATH::
+
+      export PYTHONPATH=$PYTHONPATH:$HOME/path-to-viff/viff
+
+   or create a symbolic link from the site-packages directory to the
+   VIFF Python files (``viff/viff/``), as otherwise you need to
+   re-install VIFF each time the project is modified.
+
+7) Proceed to `testing`_.
+
+GNU/Linux
+---------
+
+VIFF was originally developed on GNU/Linux and is well supported
+there. When installing the VIFF dependencies you either have the
+option of using your `package manager`_ or to install from source. VIFF
+itself must be installed `from source`_.
+
+
+Using a Package Manager
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Debian
+  You can install all dependencies by the command::
+
+     aptitude install python-twisted-core python-pyopenssl python-gmpy
+
+Ubuntu
+  Install the ``python-twisted-core`` and ``python-gmpy`` using
+  Synaptic package manager. This will automatically pull in
+  ``python-pyopenssl`` as a dependency.
+
+Gentoo
+  The following command will install the dependencies::
+
+     emerge -av twisted gmpy
+
+  Make sure to have the ``crypt`` use flag enabled, otherwise SSL
+  might not be available.
+
+If you know how to install using other package managers, please `let
+us know`_.
+
+VIFF itself is not yet packaged for any distribution, so you will have
+to install it from source as described below.
+
+
+Installing from Source
+~~~~~~~~~~~~~~~~~~~~~~
+
+If you do not have permission to use the package manager or simply
+prefer to install from source, then (assuming that Python is already
+installed) one can easily install VIFF and its dependencies by
+downloading and unpacking each of them and executing::
+
+   python setup.py install --home=$HOME/opt
+
+That will install everything under the given prefix. With the above
+command the Python modules are installed into::
+
+   $HOME/opt/lib/python
+
+You should add the directory to the ``PYTHONPATH`` environment
+variable. Bash users can normally do this by adding::
+
+   export PYTHONPATH=$PYTHONPATH:$HOME/opt/lib/python
+
+to their ``~/.bash_profile`` file, creating it if it is not already
+there. Consult the documentation for your shell to learn how
+environment variables are set.
+
+If you are doing development on VIFF, you might prefer to make a
+symlink from the ``viff`` folder in your repository to a place in your
+``PYTHONPATH``, like this::
+
+   sudo ln -s ~/viff/viff /usr/lib/python2.5/site-packages/viff
+
+Testing
+-------
+
+To verify the installation, try out one of the applications. We will
+run the millionaires example with three players and a threshold of
+one. For this test, we will let all players run on localhost: Player 1
+will run on port 9001, player 2 on port 9002, and player 3 on port
+9003. The test is done on Windows, but it works the same on the other
+platforms. Do the following:
+
+1) Go to the ``viff/apps/`` directory and generate the needed
+   configuration files by entering::
+
+     python generate-config-files.py -n 3 -t 1 \
+     localhost:9001 localhost:9002 localhost:9003
+
+   The backslash indicates that both lines should be typed as a single
+   line in the terminal.
+
+2) Open three separate command prompts and go to the ``viff/apps/``
+   directory in each. In the first, type::
+
+     python millionaires.py --no-ssl player-1.ini
+
+   in the second, type::
+
+     python millionaires.py --no-ssl player-2.ini
+
+   and in the last, type::
+
+     python millionaires.py --no-ssl player-3.ini
+
+   The order in which you start the players does not matter. They
+   should find each other within a couple of seconds after you have
+   started the final player.
+
+   If the installation works, you should see something like this from
+   e.g. player 3::
+
+      C:\viff\apps> python millionaires.py --no-ssl player-3.ini
+      Seeding random generator with random seed 7416
+      Not using SSL
+      I am Millionaire 3 and I am worth 20 millions.
+      From poorest to richest:
+        Millionaire 2
+        Millionaire 3 (20 millions)
+        Millionaire 1
+      Initiating shutdown sequence.
+
+   If something went wrong, then please `file a bug report`_ or report
+   it on the `VIFF mailing list`_. This will help us improve VIFF.
+
+   If things worked as they should, then you are *also* very welcome
+   to send a mail saying so to `VIFF mailing list`_! We would love to
+   hear your feedback.
+
+.. _problems with 8.0.1: http://tracker.viff.dk/issue37
+.. _report back:
+.. _VIFF mailing list:
+.. _let us know: viff-devel@viff.dk
+
+.. _VIFF: http://viff.dk/
+.. _test VIFF: http://buildbot.viff.dk/
+.. _Python: http://python.org/
+.. _Twisted: http://twistedmatrix.com/
+.. _GMP: http://gmplib.org/
+.. _GMPY: http://code.google.com/p/gmpy/
+.. _OpenSSL Win32 installer: http://www.slproweb.com/products/Win32OpenSSL.html
+.. _PyOpenSSL: http://pyopenssl.sourceforge.net/
+.. _MacPython: http://www.pythonmac.org
+.. _XCode: http://developer.apple.com/tools/xcode/
+.. _package manager: `Using a Package Manager`_
+.. _from source: `Installing from Source`_
+.. _file a bug report: http://tracker.viff.dk/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/matrix.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,11 @@
+
+Matrix Module
+=============
+
+.. automodule:: viff.matrix
+
+   .. autoclass:: Matrix
+      :members: __init__, __setitem__, __getitem__,
+                 __add__, __mul__, transpose, determinant
+
+   .. autofunction:: hyper
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/orlandi.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,20 @@
+
+The Orlandi Runtime - An Actively Secure Protocol with Full Threshold
+=======================================================================
+
+.. automodule:: viff.orlandi
+
+   .. autoclass:: OrlandiException
+      :members:
+
+   .. autoclass:: OrlandiShare
+      :members:
+
+      .. inheritance-diagram:: OrlandiShare
+         :parts: 1
+
+   .. autoclass:: OrlandiRuntime
+      :members:
+
+      .. inheritance-diagram:: OrlandiRuntime
+         :parts: 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/overview.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,101 @@
+
+Overview
+========
+
+VIFF allows you to write a program which will interact with other
+programs in order to execute a joint computation. This is called a
+multi-party computation, MPC for short.
+
+The programs will implement what we call a virtual :term:`ideal
+functionality` (IF). The idea is that the behavior of the programs
+should be indistinguishable from the behavior of programs interacting
+with a so-called ideal functionality. An ideal functionality is a
+player that cannot be corrupted, also known as a trusted third party
+(TTP).
+
+Interacting with an IF is easy: all players give their inputs to the
+IF, which computes the results. The results are then distributed to
+the correct players. The inputs and the results are sent over secure
+channels, and since the IF cannot be corrupted, this ideal protocol
+must be secure.
+
+In the real world there is no IF, but VIFF allows you to implement a
+virtual ideal functionality. The behavior of a bunch of programs using
+VIFF is indistinguishable from program running in the ideal world. It
+is indistinguishable in the sense that everything that can happen in
+the real world protocol could happen in the ideal world too. Since no
+attacks can occur in the ideal world, no attacks can occur in the real
+world as well. We call this a secure multi-party computation (MPC).
+
+Security Assumptions
+--------------------
+
+Please note that like all cryptographic systems, VIFF is only secure
+as long as certain assumptions are fulfilled. These assumptions
+include:
+
+- The adversary can only corrupt up to a certain threshold of the
+  total number of players. The threshold is 1/2 of the players for
+  :mod:`viff.passive` and 1/3 of the players for :mod:`viff.active`.
+  This means that you need three players to tolerate one corruption
+  (there must be an honest majority) for security against and passive
+  adversary and four players for security against an active adversary.
+
+- The adversary is computationally bounded. The protocols used by VIFF
+  rely on certain computational hardness assumptions, and therefore
+  only polynomial time adversaries are allowed. The BGW protocol used
+  in :mod:`viff.passive` is information theoretically secure, but we
+  still use cryptographic tools such as SSL to implement it.
+
+- The adversary is passive or active, depending on the protocol. Being
+  passive means that the adversary only monitors the network traffic,
+  but still follows the protocol. An active adversary is allowed to
+  deviated from the protocol in arbitrary ways.
+
+The precise assumptions for each protocol will eventually be included
+in the documentation, but this has not yet been done in all cases.
+
+Architecture
+------------
+
+VIFF consists of several modules. The :mod:`viff.runtime` module
+contains the :class:`~viff.runtime.Runtime` and
+:class:`~viff.runtime.Share` classes, in which the main functionality
+is implemented. The :mod:`viff.field` module contains implementations
+of finite fields --- these are the values inside the shares. Other
+modules provide support functions.
+
+Layers
+""""""
+
+The basic functionality in VIFF is implemented in the
+:class:`~viff.runtime.Runtime` class. This class offers methods to do
+simple network communication. The
+:class:`~viff.passive.PassiveRuntime` class implements the BGW
+protocol and offers methods for addition, multiplication, etc. These
+methods operate on :class:`~viff.runtime.Share` instances.
+
+Shares hold either :class:`GFElement <viff.field.GF>` or
+:class:`~viff.field.GF256` elements and are created from the
+:meth:`~viff.passive.PassiveRuntime.shamir_share` or
+:meth:`~viff.passive.PassiveRuntime.prss_share`
+:class:`~viff.runtime.Runtime` methods. Shares overload the standard
+arithmetic operators, so you can write ``a + b - c * d`` with four
+shares, and it will be translated correctly into the appropriate
+method calls on the :class:`~viff.runtime.Runtime` associated with the
+shares.
+
+A field element contain the concrete value on which we do
+calculations. This is just a normal Python (long) integer. The value
+is wrapped in an object that will keep track of doing modulo
+reductions as appropriate.
+
+So in a nutshell, VIFF has these layers:
+
+- Top-level layer for application programs: There you manipulate
+  Python integers or :class:`~viff.runtime.Share` instances.
+
+- Runtime layer: The runtime deals with Python integers or shares.
+
+- Field elements: Deals with arithmetic over Python integers, but with
+  modulo reductions as needed.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/paillier.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,15 @@
+
+Paillier Crypto System
+======================
+
+.. automodule:: viff.paillier
+
+   .. autoclass:: PaillierRuntime
+      :members:
+
+      .. inheritance-diagram:: PaillierRuntime
+         :parts: 1
+
+   .. autofunction:: encrypt
+
+   .. autofunction:: decrypt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/passive.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,11 @@
+
+Passive Secure Protocols
+========================
+
+.. automodule:: viff.passive
+
+   .. autoclass:: PassiveRuntime
+      :members:
+
+       .. inheritance-diagram:: PassiveRuntime
+          :parts: 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/preprocessing.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,91 @@
+
+.. _preprocessing:
+
+Preprocessing
+=============
+
+Some of the protocols in VIFF use auxiliary data which does not depend
+on the protocol inputs. Since the values does not depend on the actual
+inputs we can calculate them in advance in a *pre-processing* step.
+This is also called an *offline* calculation, not because it does not
+require network communication, but because it can be done outside of
+the peek hours.
+
+The best example is the multiplication protocol which is secure
+against active adversaries. It uses random numbers *a*, *b*, and *c*
+where *ab = c*. Since they are random they cannot depend on the inputs
+to the multiplication and we can thus safely calculate them in
+advance.
+
+
+Knowing how much to preprocess
+------------------------------
+
+When a program is invoked for the first time we cannot know how much
+preprocessed data it will need and all data must therefore be produced
+on demand (online). The problem is that there is no parsing step in
+the execution of a program using VIFF, so we have no chance of
+analysing the program in advance and since Python is a general
+Turing-complete programming language doing analysis would probably end
+up either impossible or very conservative meaning that the estimate
+would be higher than the actual need for would preprocessed data.
+
+What we can do is to monitor the program when it runs and note when
+preprocessed data was needed and how much. We then use this data on
+the next run.
+
+We record the following:
+
+* the program counter,
+* the function that produced the data,
+* the arguments used function.
+
+Using this information the next program run can start with a
+preprocessing phase where data is produced and associated with the
+program counters stored.
+
+This will obviously only work if executing the program always produces
+the same trace of program counters. And indeed a secure program must
+behave like this, for if the program counter trace changed depending
+on the (private) inputs to the program, then this would be observable
+from the outside and thus leak information.
+
+One can therefore build a program and test it on toy-input to
+establish the program counter trace. This trace can then be used when
+the program is deployed and used on real data.
+
+Branching programs
+~~~~~~~~~~~~~~~~~~
+
+The above is not entirely true for a program like the double auction.
+This program branches on values opened during the execution and could
+thus potentially produce different traces on each run while still
+being secure.
+
+There is no problem in this particular case since the double auction
+has the same trace in each branch, but this is not true in general. We
+will need to find a better mechanism for dealing with programs that
+intentionally leak information when executing and branch to different
+parts.
+
+
+Implementing preprocessing
+--------------------------
+
+Preprocessing is implemented using two tools: the
+:func:`~viff.runtime.preprocess` decorator is used on methods that
+produce data which can be preprocessed. It replaces the methods with
+proxies which will attempt to return preprocessed data. If the data
+could not be satisfied from the pool of preprocessed data, then the
+program counter and function arguments are stored before falling back
+to calculating the data online using the original method.
+
+To generate preprocessed data based on a trace of program counters one
+must call the :meth:`~viff.runtime.BasicRuntime.preprocess` method. It
+returns a :class:`Deferred` which triggers when all preprocessed data
+is ready which means that the online part of the computation can
+begin.
+
+Instead of starting the online phase immediately, one could also
+choose to store the preprocessed data for later use, but this has not
+been implemented yet.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/presentations.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,53 @@
+
+Presentations
+=============
+
+The following VIFF-related presentations are available:
+
+December 3rd, 2008:
+  Slides on possible performance improvements in VIFF, used in the
+  CACE_ WP4 meeting in Amsterdam. Available as PDF__.
+
+  .. _CACE: http://cace-project.eu/
+  .. __: http://viff.dk/files/cace-wp4-amsterdam-2008.pdf
+
+June 23rd, 2008:
+  Slides used for a talk at a ECRYPT PROVILAB_ (Protocols Virtual Lab)
+  meeting held in Berlin. Available as PDF__.
+
+  .. _PROVILAB: http://www.ecrypt.eu.org/provilab/
+  .. __: http://viff.dk/files/viff-ecrypt.pdf
+
+June 19th, 2008:
+  Slides used at a Siester Seminar talk held at IBM Zurich Research
+  Lab. Available as PDF__.
+
+  .. __: http://viff.dk/files/viff-ibm.pdf
+
+February 21st, 2008:
+  Slides used at a PhD Qualification Exam by Martin Geisler. Like the
+  report they accompany, the second part of the slides are about VIFF
+  and includes benchmark results.
+
+  Available as PDF__.
+
+  .. __: http://viff.dk/files/mg-progress-report-talk.pdf
+
+January 15th, 2008:
+  PhD Progress Report by Martin Geisler. The second part of the report
+  describes the design of VIFF and proves it secure in the Universally
+  Composability security framework by Canetti.
+
+  Available as PDF__.
+
+  .. __: http://viff.dk/files/mg-progress-report.pdf
+
+September 20th, 2007:
+  VIFF Design Talk given by Martin Geisler at a SIMAP_ meeting. The
+  talk describes some of the goals of the VIFF design. It is current
+  to version 0.2 of VIFF.
+
+  Available as PDF__.
+
+  .. _SIMAP: http://simap.dk/
+  .. __: http://viff.dk/files/design-talk.pdf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/program-counters.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,180 @@
+
+.. _program-counters:
+
+Program Counters
+================
+
+When two players execute a large computation they need to agree with
+each other on a labelling of the individual operations so that they
+know where each received result belongs. In VIFF we call these labels
+*program counters*. We will try to explain the design of these
+counters in this document and list some ideas for alternative
+implementations.
+
+The basic setup in VIFF is a set of players who communicate over
+reliable point-to-point links, e.g., TCP or SSL connections. It is
+important to remember that these links guarantee that all transmitted
+messages arrive unchanged at the destination and that they arrive in
+the order sent.
+
+
+The naive solution
+------------------
+
+The very first version of VIFF network data was numbered in the most
+naive way possible: using a single counter for each player. This
+worked fine most of the time, but once in a while a test would fail to
+give the correct result. It was only when one ran thousands of
+multiplications that the bug appeared, but its cause was quite simple.
+Consider a program like this where we assume that the shares *a*, *b*,
+*c*, and *d* have already been correctly defined::
+
+  x = mul(a, b)
+  y = mul(c, d)
+
+Back then, the :func:`mul` function was implemented like this::
+
+  def mul(share_a, share_b):
+      inc_pc()
+      result = gather_shares([share_a, share_b])
+      result.addCallback(lambda (a, b): a * b)
+      result.addCallback(shamir_share)
+      result.addCallback(recombine, threshold=2*threshold)
+      return result
+
+where :func:`inc_pc` took care of incrementing the global program
+counter. This simple implementation worked 99.99% of the time with
+three players connected on a LAN, but once in a while it would fail to
+calculate the correct results.
+
+In our example program, :func:`shamir_share` is called twice: once
+when *a* and *b* are ready, and once when *c* and *d* are ready. Most
+of the time *a* and *b* are ready first on all players, and so they
+all agree on the program counter value for this call to
+:func:`shamir_share`. But when we have bad luck, one player sees
+*c* and *d* arrive first and so the two calls to :func:`shamir_share`
+are switched for that player.
+
+The problem is the asynchronous nature of Twisted: all players agree
+on the execution tree, but depending on the exact timing they might
+reach the nodes in the tree in a different order. The tree looks like
+this in our little example:
+
+.. code-block:: none
+
+     x       y
+     |       |
+    mul     mul
+    / \     / \
+   a   b   c   d
+
+and the two :func:`mul` can be called in either order since they do
+not depend on each other.
+
+
+The working solution
+--------------------
+
+The solution used now in VIFF has two ingredients. First, callbacks
+that depend on the program counter (like `func`:shamir_share in our
+example above) are not added with :meth:`addCallback` but instead with
+the special :meth:`~viff.runtime.Runtime.schedule_callback` method.
+This method saves the program counter in effect at the time of the its
+call, and ensures that the saved program counter is temporarily made
+active when the callback is called.
+
+Secondly, the program counter is a *list* of counters. This is
+necessary to ensure that we can allocate new fresh counters at any
+point in the execution tree. The execution tree is never explicitly
+constructed in VIFF, so a simple static numbering is not possible.
+
+The program counter starts at the value ``[0]``. It is changed in two
+cases:
+
+* when a callback is scheduled using
+  :meth:`~viff.runtime.Runtime.schedule_callback`, a new sub-program
+  counter is allocated. A sub-program counter is simply a program
+  counter with another digit. Because of the asynchronous network, the
+  callback will be invoked at an unknown later time. When invoked, it
+  sees the sub-program counter. This ensures that that the parties
+  agree on any network traffic produced in the callback.
+
+  When a piece of code like this::
+
+    def cb(ignored):
+        print "callback:", self.program_counter
+    d = Deferred()
+
+    print "main:", self.program_counter
+    self.schedule_callback(d, cb)
+    print "main:", self.program_counter
+
+    d.callback(None)
+
+  is executed, one will see output like this:
+
+  .. code-block:: none
+
+     main: [0]
+     main: [1]
+     callback: [0, 0]
+
+* some functions depend on a unique program counter. These functions
+  simply increase the last digit in the current program counter::
+
+    self.program_counter[-1] += 1
+
+
+Alternatives
+------------
+
+We have come up with some alternative solutions, which are detailed
+below. More good ideas are of course welcome!
+
+History-based labels
+""""""""""""""""""""
+
+An attractive alternative is to label data sent over the net based on
+its *history*. The idea is that we associate a label ``H(x)`` with
+each variable *x*. The history is defined when new variables are
+defined --- if ``x = a * b``, then we can set ``H(x) = ("mul", H(a),
+H(b))``. To avoid growing the history without bounds we can hash it
+with a cryptographic hash function to bring it down to a fixed size.
+
+The problem with this idea is that we sometimes need to assign a
+history to a variable that depends on no other variables. An example
+of this is the result of a call to
+:meth:`~viff.runtime.Runtime.prss_share` which takes no useful arguments. A
+possible solution would be to add some dummy arguments on which the
+history could be based, even though they wont be used by the method.
+So if you would normally call the function :func:`hat` with no
+arguments to get a :class:`Rabbit` object, you have to change your
+code from this::
+
+  rabbit = hat()
+
+to this::
+
+  rabbit = hat(dummy=locals())
+
+where the call to :func:`locals` gives you access to the local
+variables. If the use of :func:`locals` could be hidden this might be
+an acceptable solution.
+
+Using the history of the variables has the big advantage that we label
+each piece of transmitted data with just information that is relevant
+to it: namely its position in the tree formed by the calculation and
+*not* its position in the execution tree formed by the implementation
+in VIFF. This is conceptually cleaner than the current solution.
+
+Program transformation
+""""""""""""""""""""""
+
+Another idea is to solve the labelling problem by having some external
+tool transform the program into one with explicit labels. Each send
+and each receive operation needs to be labelled and the labels much
+match pair-wise.
+
+It is not entirely clear how this should work in the presence of loops
+and if it is possible to implement this in an easier way than the
+current program counters.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/prss.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,18 @@
+
+PRSS Module
+===========
+
+.. automodule:: viff.prss
+
+   .. autoclass:: PRF
+      :members: __call__
+
+   .. autofunction:: prss
+
+   .. autofunction:: prss_lsb
+
+   .. autofunction:: random_replicated_sharing
+
+   .. autofunction:: convert_replicated_shamir
+
+   .. autofunction:: generate_subsets
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/runtime.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,106 @@
+
+Runtime Module
+==============
+
+.. automodule:: viff.runtime
+
+   .. autoclass:: Share
+
+      .. inheritance-diagram:: Share
+         :parts: 1
+
+      .. automethod:: Share.__init__
+
+      .. automethod:: Share.clone
+
+      .. method:: __add__(other)
+      .. method:: __sub__(other)
+      .. method:: __mul__(other)
+      .. method:: __xor__(other)
+      .. method:: __lt__(other)
+      .. method:: __eq__(other)
+
+         Overloaded operators. They all call back to the Runtime used
+         when the Share was constructed. The reverse-argument versions
+         are defined too.
+
+   .. autoclass:: ShareList
+
+      .. inheritance-diagram:: ShareList
+         :parts: 1
+
+   .. autofunction gather_shares
+
+   .. autoclass:: ShareExchanger
+      :members: sendShare, sendData, loseConnection
+
+      .. inheritance-diagram:: ShareExchanger
+         :parts: 1
+
+      .. attribute:: ShareExchanger.incoming_data
+
+         Data from our peer is put here, either as an empty
+         :class:`Deferred` if we are waiting on input from the player,
+         or the data itself if data is received from the other player
+         before we are ready to use it.
+
+   .. autofunction:: preprocess
+
+      See also :ref:`preprocessing` for more background information.
+
+   .. autofunction:: create_runtime
+
+   .. autoclass:: Runtime
+      :members:
+
+      .. attribute:: Runtime.id
+
+         Player ID. This is an integer in the range 1--*n* for *n*
+         players.
+
+      .. attribute:: Runtime.threshold
+
+         Default threshold used by
+         :meth:`~viff.passive.PassiveRuntime.shamir_share`,
+         :meth:`~viff.passive.PassiveRuntime.open`, and others.
+
+      .. attribute:: Runtime.program_counter
+
+         Whenever a share is sent over the network, it must be
+         uniquely identified so that the receiving player known what
+         operation the share is a result of. This is done by
+         associating a *program counter* with each operation.
+
+         Keeping the program counter synchronized between all players
+         ought to be easy, but because of the asynchronous nature of
+         network protocols, all players might not reach the same parts
+         of the program at the same time.
+
+         Consider two players *A* and *B* who are both waiting on the
+         variables *a* and *b*. Callbacks have been added to *a* and
+         *b*, and the question is what program counter the callbacks
+         should use when sending data out over the network.
+
+         Let *A* receive input for *a* and then for *b* a little
+         later, and let *B* receive the inputs in reversed order so
+         that the input for *b* arrives first. The goal is to keep the
+         program counters synchronized so that program counter *x*
+         refers to the same operation on all players. Because the
+         inputs arrive in different order at different players,
+         incrementing a simple global counter is not enough.
+
+         Instead, a *tree* is made, which follows the tree of
+         execution. At the top level the program counter starts at
+         ``[0]``. At the next operation it becomes ``[1]``, and so on.
+         If a callback is scheduled (see :meth:`schedule_callback`) at
+         program counter ``[x, y, z]``, any calls it makes will be
+         numbered ``[x, y, z, 1]``, then ``[x, y, z, 2]``, and so on.
+
+         Maintaining such a tree of program counters ensures that
+         different parts of the program execution never reuses the
+         same program counter for different variables.
+
+         The :meth:`schedule_callback` method is responsible for
+         scheduling callbacks with the correct program counter.
+
+         See :ref:`program-counters` for more background information.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/shamir.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,6 @@
+
+Shamir Module
+=============
+
+.. automodule:: viff.shamir
+   :members:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/todo.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,43 @@
+
+Planned Work on VIFF
+====================
+
+This document collects the bigger pieces of work we plan to do on
+VIFF --- pieces too big for the bug tracker.
+
+
+Active Security
+---------------
+
+The protocol implemented in :mod:`viff.active` is (believed to be)
+secure against active adversaries, but only as long as they don't
+actually try to cheat! In other words, the players will crash in bad
+ways if malformed data is received or too few shares are received.
+
+The following points should be addressed:
+
+* Error correction. The honest players must tolerate being sent wrong
+  shares or no shares at all from the corrupt players.
+
+  This is related to Issue4_, Issue29_, and Issue70_.
+
+  .. _Issue4: http://tracker.viff.dk/issue4
+  .. _Issue29: http://tracker.viff.dk/issue29
+  .. _Issue70: http://tracker.viff.dk/issue70
+
+* Byzantine agreement. After the preprocessing phase a Byzantime
+  agreement protocol should be run in order to determine if all honest
+  players are ready to continue.
+
+  At the moment an honest players simply aborts the protocol if it
+  detects any form of cheating --- the "idea" being that this will
+  make the other honest players crash too, thereby effectively halting
+  the protocol.
+
+Covert Adversaries
+------------------
+
+Implement an actively secure protocol for a covert adversary and
+threshold ``t < n/2``. The goal is to have almost the same complexity
+as for the passive case. Martin Geisler is working on a paper
+describing a solution.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/unit-testing.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,295 @@
+.. -*- coding: utf-8 -*-
+
+Unit Testing
+============
+
+VIFF employs a set of unit tests to help developers catch regressions
+and to ensure the correctness of the implementation. The code is
+continuously tested using a BuildBot_ and the results are available
+online_. If you see warnings or errors from the unit tests on the
+`BuildBot waterfall page`_, then please take it as an invitation to
+fix them!
+
+.. _BuildBot: http://buildbot.net/
+.. _online: http://buildbot.viff.dk/
+.. _BuildBot waterfall page: http://buildbot.viff.dk/waterfall
+
+When using Twisted it is natural to use its unit testing framework
+called Trial_. Trial has the big advantage over normal testing
+frameworks that it understands Twisted's Deferreds_ — if a unit test
+returns a Deferred, Trial waits for it to trigger before it declares
+the test a success or failure. Please refer to this tutorial_ for more
+information.
+
+.. _Trial: http://twistedmatrix.com/trac/wiki/TwistedTrial
+.. _Deferreds: http://twistedmatrix.com/projects/core/
+               documentation/howto/defer.html
+.. _tutorial: http://twistedmatrix.com/trac/browser/branches/
+              trial-tutorial-2443/doc/core/howto/trial.xhtml?format=raw
+
+Running the Unit Tests
+----------------------
+
+To run the VIFF unit tests you must make sure that ``import viff``
+works correctly in Python. In other words, you must make sure that
+VIFF is installed or that the root of your source tree is in
+``PYTHONPATH``. You can test this by changing to some unrelated
+directory, starting an interactive Python session and run:
+
+.. sourcecode:: pycon
+
+  >>> import viff
+  >>> print viff.__version__
+  0.3
+
+If it fails with an ImportError, then please double-check that your
+``PYTHONPATH`` is setup correctly.
+
+Now simply execute ``trial --reactor viff viff`` to run the unit
+tests. You should get output similar to this::
+
+  % trial --reactor viff viff
+  Seeding random generator with random seed 4658
+  Running 65 tests.
+  viff.test.test_active_runtime
+    ActiveRuntimeTest
+      test_broadcast ...                                           [OK]
+  viff.test.test_basic_runtime
+    ProgramCounterTest
+      test_callback ...                                            [OK]
+      test_complex_operation ...                                   [OK]
+      test_initial_value ...                                       [OK]
+      test_multiple_callbacks ...                             [SKIPPED]
+      test_nested_calls ...                                        [OK]
+      test_simple_operation ...                                    [OK]
+  viff.test.test_field
+    GF256TestCase
+      test_add ...                                                 [OK]
+      test_construct ...                                           [OK]
+      test_div ...                                                 [OK]
+      test_field ...                                               [OK]
+      test_invert ...                                              [OK]
+      test_mul ...                                                 [OK]
+      test_neg ...                                                 [OK]
+      test_pow ...                                                 [OK]
+      test_str ...                                                 [OK]
+      test_sub ...                                                 [OK]
+      test_xor ...                                                 [OK]
+    GFpElementTestCase
+      test_add ...                                                 [OK]
+      test_bit ...                                                 [OK]
+      test_div ...                                                 [OK]
+      test_field ...                                               [OK]
+      test_invert ...                                              [OK]
+      test_mul ...                                                 [OK]
+      test_neg ...                                                 [OK]
+      test_sqrt ...                                                [OK]
+      test_str ...                                                 [OK]
+      test_sub ...                                                 [OK]
+  doctest
+    DocTestCase
+      field ...                                                    [OK]
+      GF ...                                                       [OK]
+      __eq__ ...                                                   [OK]
+      __init__ ...                                                 [OK]
+      __nonzero__ ...                                              [OK]
+      __radd__ ...                                                 [OK]
+      __rmul__ ...                                                 [OK]
+  viff.test.test_prss
+    PRSSTestCase
+      test_generate_subsets ...                                    [OK]
+  doctest
+    DocTestCase
+      PRF ...                                                      [OK]
+      __call__ ...                                                 [OK]
+      __init__ ...                                                 [OK]
+      generate_subsets ...                                         [OK]
+      prss ...                                                     [OK]
+  viff.test.test_runtime
+    RuntimeTest
+      test_add ...                                                 [OK]
+      test_add_coerce ...                                          [OK]
+      test_convert_bit_share ...                                   [OK]
+      test_greater_than ...                                        [OK]
+      test_greater_than_equal ...                                  [OK]
+      test_greater_than_equalII ...                                [OK]
+      test_less_than ...                                           [OK]
+      test_less_than_equal ...                                     [OK]
+      test_mul ...                                                 [OK]
+      test_open ...                                                [OK]
+      test_open_no_mutate ...                                      [OK]
+      test_prss_share_bit ...                                      [OK]
+      test_prss_share_int ...                                      [OK]
+      test_prss_share_random_bit ...                               [OK]
+      test_prss_share_random_int ...                               [OK]
+      test_shamir_share ...                                        [OK]
+      test_shamir_share_asymmetric ...                             [OK]
+      test_sub ...                                                 [OK]
+      test_sub_coerce ...                                          [OK]
+      test_xor ...                                                 [OK]
+  doctest
+    DocTestCase
+      share ...                                                    [OK]
+      clone_deferred ...                                           [OK]
+      dlift ...                                                    [OK]
+      find_prime ...                                               [OK]
+
+  =====================================================================
+  [SKIPPED]: viff.test.test_basic_runtime.ProgramCounterTest.
+  test_multiple_callbacks
+
+  TODO: Scheduling callbacks fails to increment program counter!
+  ---------------------------------------------------------------------
+  Ran 65 tests in 18.305s
+
+  PASSED (skips=1, successes=64)
+
+Lots of success! But one of the tests was skipped — we do this when we
+have a test which represents a known problem. Otherwise every test run
+would be cluttered with long of traceback messages, making it
+difficult to notice new *unexpected* failures.
+
+.. warning::
+
+   Always run ``trial`` with the ``--reactor viff`` arguments. This
+   ensures that the tests are run with the special VIFF reactor. The
+   tests currently cannot be run without this reactor, but we might
+   lift this restriction in the future.
+
+
+Writing Unit Tests
+------------------
+
+The unit tests live in the ``viff.test`` package. There you will find
+a number of modules, which in turn contain classes inheriting from
+``twisted.trial.unittest.TestCase``. Trial recognizes these classes
+and will execute methods starting with ``test``.
+
+Simple Tests
+~~~~~~~~~~~~
+
+Adding a new unit test can be as simple as defining a new method in a
+suitable class. The method will want to assert certain things during
+the test, and for that Trial offers a large number of convenient
+methods such as ``assertEqual``, ``assertTrue``, and so on. The full
+reference is available `online`__. Notice that they describe the
+methods under names like ``failUnlessSomething`` which is aliased to
+``assertSomething``. So far all the VIFF unit tests use the
+``assertSomething`` style, but you are welcome to use the other if you
+prefer.
+
+.. __: http://twistedmatrix.com/documents/current/api/
+       twisted.trial.unittest._Assertions.html
+
+A simple example of a unit test is ``viff.test.test_field`` which
+looks like this (heavily abbreviated):
+
+.. sourcecode:: python
+
+  """Tests for viff.field."""
+
+  from viff.field import GF, GF256
+  from twisted.trial.unittest import TestCase
+
+  #: Declare doctests for Trial.
+  __doctests__ = ['viff.field']
+
+  class GFpElementTestCase(TestCase):
+      """Tests for elements from a Zp field."""
+
+      def setUp(self):
+          """Initialize Zp to Z31."""
+          self.field = GF(31)
+
+      def test_invert(self):
+          """Test inverse operation, including inverting zero."""
+          self.assertRaises(ZeroDivisionError, lambda: ~self.field(0))
+          self.assertEquals(~self.field(1), self.field(1))
+
+      def test_sqrt(self):
+          """Test extraction of square roots."""
+          square = self.field(4)**2
+          root = square.sqrt()
+          self.assertEquals(root**2, square)
+
+This demonstrates the most important features in a simple unit test:
+
+* First the needed definitions are imported as normal.
+
+* Setting the ``__doctest__`` field makes Trial run the doctests_ in
+  the named module.
+
+* A class is defined which inherit from ``TestCase``.
+
+* A ``setUp`` method is used to collect preperations that are needed
+  for every test.
+
+* Several test methods are defined. They make use of the assertions
+  offered by Trial.
+
+.. _doctests: http://docs.python.org/lib/module-doctest.html
+
+
+Tests Involving a VIFF Runtime
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Trial really shines when it comes to testing that involves networking.
+First, it allows us to forget about the networking — the network
+connections are replaced by direct method calls on the receiver's
+transport. This makes the test repeatable unlike if real network
+connections were used since they may fail if they cannot bind to the
+wanted port number.
+
+In VIFF the ``util.py`` file contains the logic needed to connect a
+number of Runtime instances in this way. All you need to do is to
+create a subclass of RuntimeTestCase and decorate the test methods
+with ``protocol`` like this example (abbreviated from
+``viff.test.test_active_runtime``):
+
+.. sourcecode:: python
+
+  from viff.test.util import RuntimeTestCase, protocol
+
+  class ActiveRuntimeTest(RuntimeTestCase):
+      """Test for active security."""
+
+      #: Number of players.
+      num_players = 4
+
+      @protocol
+      def test_broadcast(self, runtime):
+          """Test Bracha broadcast."""
+          if runtime.id == 1:
+              x = runtime.broadcast([1], "Hello world!")
+          else:
+              x = runtime.broadcast([1])
+          x.addCallback(self.assertEquals, "Hello world!")
+          return x
+
+By decorating ``test_broadcast`` with ``protocol`` we ensure that the
+method will be called with a Runtime instance. Furthermore, the method
+will be called ``num_player`` times, each time with another Runtime
+instance. The net result is that the test behaves just like if four
+players had started four programs containing the method body.
+
+In the method you can branch on ``runtime.id``. This is needed in the
+typical case where you want only one of the parties to input something
+to a calculation.
+
+In this example all four parties get an ``x`` which will eventually
+contain the string "Hello World". Using Trial we can return ``x`` and
+Trial will then wait for ``x`` to trigger before declaring the test a
+success or failure. We have attached ``self.assertEquals`` as a
+callback on ``x`` with an extra argument of "Hello World". This means
+that when ``x`` eventually triggers, the assertion is run and the test
+finishes.
+
+This is the real power of Trial. You can do some calculations and
+finish by returning a Deferred (and remember that Shares are Deferreds
+in VIFF). The value of this Deferred is not important, it is only
+important that it triggers when the test is done. You will often need
+to use ``twisted.internet.defer.gatherResults`` to combine several
+Deferreds into one that you can return to Trial. Just make sure that
+your final Deferred depends on all other Deferreds so that you do not
+leave lingering Deferreds behind. Trial will complain loudly if you
+do, so it should be easy to spot.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_sources/util.txt	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,27 @@
+
+Utility Functions Module
+========================
+
+.. automodule:: viff.util
+   :members:
+
+   .. envvar:: VIFF_SEED
+
+      The :data:`rand` random generator is seeded using this
+      environment variable, if it is defined.
+
+   .. data:: rand
+
+      All VIFF code uses this random number generator for all
+      randomness needed.
+
+      The generator is by default initialized with a random seed,
+      unless the environment variable :envvar:`VIFF_SEED` is set to a
+      value, in which case that value is used instead. If
+      :envvar:`VIFF_SEED` is defined, but empty, then no seed is used
+      and a protocol run cannot be reproduced exactly.
+
+   .. envvar:: VIFF_PROFILE
+
+      Defining this variable will change :func:`profile` from a no-op
+      to real decorator.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_static/basic.css	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,405 @@
+/**
+ * Sphinx stylesheet -- basic theme
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+    clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+img {
+    border: 0;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dt:target, .highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.refcount {
+    color: #060;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.body div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_static/default.css	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,210 @@
+/**
+ * Sphinx stylesheet -- default theme
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: #ffffff;
+    color: #000000;
+    padding: 0 20px 30px 20px;
+}
+
+div.footer {
+    color: #ffffff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #ffffff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    line-height: 30px;
+    color: #ffffff;
+}
+
+div.related a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar {
+}
+
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: #ffffff;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    color: #ffffff;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.topic {
+    background-color: #eee;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+p.admonition-title {
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+pre {
+    padding: 5px;
+    background-color: #eeffcc;
+    color: #333333;
+    line-height: 120%;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_static/doctools.js	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,232 @@
+/// XXX: make it cross browser
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+ */
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {}
+}
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+}
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i] == item)
+      return true;
+  }
+  return false;
+}
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) {
+        var span = document.createElement("span");
+        span.className = className;
+        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this)
+      });
+    }
+  }
+  return this.each(function() {
+    highlight(this);
+  });
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initModIndex();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can savely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated == 'undefined')
+      return string;
+    return (typeof translated == 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated == 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlight');
+        });
+      }, 10);
+      $('<li class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
+          .appendTo($('.sidebar .this-page-menu'));
+    }
+  },
+
+  /**
+   * init the modindex toggle buttons
+   */
+  initModIndex : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      console.log($('tr.cg-' + idnum).toggle());
+      if (src.substr(-9) == 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
+    $('span.highlight').removeClass('highlight');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this == '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});
Binary file doc/1.0/_static/file.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_static/jquery.js	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,4376 @@
+/*!
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){
+
+var 
+	// Will speed up references to window, and allows munging its name.
+	window = this,
+	// Will speed up references to undefined, and allows munging its name.
+	undefined,
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	jQuery = window.jQuery = window.$ = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// A simple way to check for HTML strings or ID strings
+	// (both of which we optimize for)
+	quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
+	// Is it a simple selector
+	isSimple = /^.[^:#\[\.,]*$/;
+
+jQuery.fn = jQuery.prototype = {
+	init: function( selector, context ) {
+		// Make sure that a selection was provided
+		selector = selector || document;
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this[0] = selector;
+			this.length = 1;
+			this.context = selector;
+			return this;
+		}
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			var match = quickExpr.exec( selector );
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] )
+					selector = jQuery.clean( [ match[1] ], context );
+
+				// HANDLE: $("#id")
+				else {
+					var elem = document.getElementById( match[3] );
+
+					// Handle the case where IE and Opera return items
+					// by name instead of ID
+					if ( elem && elem.id != match[3] )
+						return jQuery().find( selector );
+
+					// Otherwise, we inject the element directly into the jQuery object
+					var ret = jQuery( elem || [] );
+					ret.context = document;
+					ret.selector = selector;
+					return ret;
+				}
+
+			// HANDLE: $(expr, [context])
+			// (which is just equivalent to: $(content).find(expr)
+			} else
+				return jQuery( context ).find( selector );
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) )
+			return jQuery( document ).ready( selector );
+
+		// Make sure that old selector state is passed along
+		if ( selector.selector && selector.context ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return this.setArray(jQuery.isArray( selector ) ?
+			selector :
+			jQuery.makeArray(selector));
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.3.2",
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num === undefined ?
+
+			// Return a 'clean' array
+			Array.prototype.slice.call( this ) :
+
+			// Return just the object
+			this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = jQuery( elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" )
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		else if ( name )
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Force the current matched set of elements to become
+	// the specified array of elements (destroying the stack in the process)
+	// You should use pushStack() in order to do this, but maintain the stack
+	setArray: function( elems ) {
+		// Resetting the length to 0, then using the native Array push
+		// is a super-fast way to populate an object with array-like properties
+		this.length = 0;
+		Array.prototype.push.apply( this, elems );
+
+		return this;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem && elem.jquery ? elem[0] : elem
+		, this );
+	},
+
+	attr: function( name, value, type ) {
+		var options = name;
+
+		// Look for the case where we're accessing a style value
+		if ( typeof name === "string" )
+			if ( value === undefined )
+				return this[0] && jQuery[ type || "attr" ]( this[0], name );
+
+			else {
+				options = {};
+				options[ name ] = value;
+			}
+
+		// Check to see if we're setting style values
+		return this.each(function(i){
+			// Set all the styles
+			for ( name in options )
+				jQuery.attr(
+					type ?
+						this.style :
+						this,
+					name, jQuery.prop( this, options[ name ], type, i, name )
+				);
+		});
+	},
+
+	css: function( key, value ) {
+		// ignore negative width and height values
+		if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
+			value = undefined;
+		return this.attr( key, value, "curCSS" );
+	},
+
+	text: function( text ) {
+		if ( typeof text !== "object" && text != null )
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+
+		var ret = "";
+
+		jQuery.each( text || this, function(){
+			jQuery.each( this.childNodes, function(){
+				if ( this.nodeType != 8 )
+					ret += this.nodeType != 1 ?
+						this.nodeValue :
+						jQuery.fn.text( [ this ] );
+			});
+		});
+
+		return ret;
+	},
+
+	wrapAll: function( html ) {
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).clone();
+
+			if ( this[0].parentNode )
+				wrap.insertBefore( this[0] );
+
+			wrap.map(function(){
+				var elem = this;
+
+				while ( elem.firstChild )
+					elem = elem.firstChild;
+
+				return elem;
+			}).append(this);
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		return this.each(function(){
+			jQuery( this ).contents().wrapAll( html );
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function(){
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function(elem){
+			if (this.nodeType == 1)
+				this.appendChild( elem );
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function(elem){
+			if (this.nodeType == 1)
+				this.insertBefore( elem, this.firstChild );
+		});
+	},
+
+	before: function() {
+		return this.domManip(arguments, false, function(elem){
+			this.parentNode.insertBefore( elem, this );
+		});
+	},
+
+	after: function() {
+		return this.domManip(arguments, false, function(elem){
+			this.parentNode.insertBefore( elem, this.nextSibling );
+		});
+	},
+
+	end: function() {
+		return this.prevObject || jQuery( [] );
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: [].push,
+	sort: [].sort,
+	splice: [].splice,
+
+	find: function( selector ) {
+		if ( this.length === 1 ) {
+			var ret = this.pushStack( [], "find", selector );
+			ret.length = 0;
+			jQuery.find( selector, this[0], ret );
+			return ret;
+		} else {
+			return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
+				return jQuery.find( selector, elem );
+			})), "find", selector );
+		}
+	},
+
+	clone: function( events ) {
+		// Do the clone
+		var ret = this.map(function(){
+			if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
+				// IE copies events bound via attachEvent when
+				// using cloneNode. Calling detachEvent on the
+				// clone will also remove the events from the orignal
+				// In order to get around this, we use innerHTML.
+				// Unfortunately, this means some modifications to
+				// attributes in IE that are actually only stored
+				// as properties will not be copied (such as the
+				// the name attribute on an input).
+				var html = this.outerHTML;
+				if ( !html ) {
+					var div = this.ownerDocument.createElement("div");
+					div.appendChild( this.cloneNode(true) );
+					html = div.innerHTML;
+				}
+
+				return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
+			} else
+				return this.cloneNode(true);
+		});
+
+		// Copy the events from the original to the clone
+		if ( events === true ) {
+			var orig = this.find("*").andSelf(), i = 0;
+
+			ret.find("*").andSelf().each(function(){
+				if ( this.nodeName !== orig[i].nodeName )
+					return;
+
+				var events = jQuery.data( orig[i], "events" );
+
+				for ( var type in events ) {
+					for ( var handler in events[ type ] ) {
+						jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
+					}
+				}
+
+				i++;
+			});
+		}
+
+		// Return the cloned set
+		return ret;
+	},
+
+	filter: function( selector ) {
+		return this.pushStack(
+			jQuery.isFunction( selector ) &&
+			jQuery.grep(this, function(elem, i){
+				return selector.call( elem, i );
+			}) ||
+
+			jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
+				return elem.nodeType === 1;
+			}) ), "filter", selector );
+	},
+
+	closest: function( selector ) {
+		var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
+			closer = 0;
+
+		return this.map(function(){
+			var cur = this;
+			while ( cur && cur.ownerDocument ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
+					jQuery.data(cur, "closest", closer);
+					return cur;
+				}
+				cur = cur.parentNode;
+				closer++;
+			}
+		});
+	},
+
+	not: function( selector ) {
+		if ( typeof selector === "string" )
+			// test special case where just one selector is passed in
+			if ( isSimple.test( selector ) )
+				return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
+			else
+				selector = jQuery.multiFilter( selector, this );
+
+		var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
+		return this.filter(function() {
+			return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
+		});
+	},
+
+	add: function( selector ) {
+		return this.pushStack( jQuery.unique( jQuery.merge(
+			this.get(),
+			typeof selector === "string" ?
+				jQuery( selector ) :
+				jQuery.makeArray( selector )
+		)));
+	},
+
+	is: function( selector ) {
+		return !!selector && jQuery.multiFilter( selector, this ).length > 0;
+	},
+
+	hasClass: function( selector ) {
+		return !!selector && this.is( "." + selector );
+	},
+
+	val: function( value ) {
+		if ( value === undefined ) {			
+			var elem = this[0];
+
+			if ( elem ) {
+				if( jQuery.nodeName( elem, 'option' ) )
+					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
+				
+				// We need to handle select boxes special
+				if ( jQuery.nodeName( elem, "select" ) ) {
+					var index = elem.selectedIndex,
+						values = [],
+						options = elem.options,
+						one = elem.type == "select-one";
+
+					// Nothing was selected
+					if ( index < 0 )
+						return null;
+
+					// Loop through all the selected options
+					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+						var option = options[ i ];
+
+						if ( option.selected ) {
+							// Get the specifc value for the option
+							value = jQuery(option).val();
+
+							// We don't need an array for one selects
+							if ( one )
+								return value;
+
+							// Multi-Selects return an array
+							values.push( value );
+						}
+					}
+
+					return values;				
+				}
+
+				// Everything else, we just grab the value
+				return (elem.value || "").replace(/\r/g, "");
+
+			}
+
+			return undefined;
+		}
+
+		if ( typeof value === "number" )
+			value += '';
+
+		return this.each(function(){
+			if ( this.nodeType != 1 )
+				return;
+
+			if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
+				this.checked = (jQuery.inArray(this.value, value) >= 0 ||
+					jQuery.inArray(this.name, value) >= 0);
+
+			else if ( jQuery.nodeName( this, "select" ) ) {
+				var values = jQuery.makeArray(value);
+
+				jQuery( "option", this ).each(function(){
+					this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
+						jQuery.inArray( this.text, values ) >= 0);
+				});
+
+				if ( !values.length )
+					this.selectedIndex = -1;
+
+			} else
+				this.value = value;
+		});
+	},
+
+	html: function( value ) {
+		return value === undefined ?
+			(this[0] ?
+				this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
+				null) :
+			this.empty().append( value );
+	},
+
+	replaceWith: function( value ) {
+		return this.after( value ).remove();
+	},
+
+	eq: function( i ) {
+		return this.slice( i, +i + 1 );
+	},
+
+	slice: function() {
+		return this.pushStack( Array.prototype.slice.apply( this, arguments ),
+			"slice", Array.prototype.slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function(elem, i){
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	},
+
+	domManip: function( args, table, callback ) {
+		if ( this[0] ) {
+			var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
+				scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
+				first = fragment.firstChild;
+
+			if ( first )
+				for ( var i = 0, l = this.length; i < l; i++ )
+					callback.call( root(this[i], first), this.length > 1 || i > 0 ?
+							fragment.cloneNode(true) : fragment );
+		
+			if ( scripts )
+				jQuery.each( scripts, evalScript );
+		}
+
+		return this;
+		
+		function root( elem, cur ) {
+			return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
+				(elem.getElementsByTagName("tbody")[0] ||
+				elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+				elem;
+		}
+	}
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+function evalScript( i, elem ) {
+	if ( elem.src )
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+
+	else
+		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+
+	if ( elem.parentNode )
+		elem.parentNode.removeChild( elem );
+}
+
+function now(){
+	return +new Date;
+}
+
+jQuery.extend = jQuery.fn.extend = function() {
+	// copy reference to target object
+	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) )
+		target = {};
+
+	// extend jQuery itself if only one argument is passed
+	if ( length == i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ )
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null )
+			// Extend the base object
+			for ( var name in options ) {
+				var src = target[ name ], copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy )
+					continue;
+
+				// Recurse if we're merging object values
+				if ( deep && copy && typeof copy === "object" && !copy.nodeType )
+					target[ name ] = jQuery.extend( deep, 
+						// Never move original objects, clone them
+						src || ( copy.length != null ? [ ] : { } )
+					, copy );
+
+				// Don't bring in undefined values
+				else if ( copy !== undefined )
+					target[ name ] = copy;
+
+			}
+
+	// Return the modified object
+	return target;
+};
+
+// exclude the following css properties to add px
+var	exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+	// cache defaultView
+	defaultView = document.defaultView || {},
+	toString = Object.prototype.toString;
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		window.$ = _$;
+
+		if ( deep )
+			window.jQuery = _jQuery;
+
+		return jQuery;
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return toString.call(obj) === "[object Function]";
+	},
+
+	isArray: function( obj ) {
+		return toString.call(obj) === "[object Array]";
+	},
+
+	// check if an element is in a (or is an) XML document
+	isXMLDoc: function( elem ) {
+		return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
+			!!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
+	},
+
+	// Evalulates a script in a global context
+	globalEval: function( data ) {
+		if ( data && /\S/.test(data) ) {
+			// Inspired by code by Andrea Giammarchi
+			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+			var head = document.getElementsByTagName("head")[0] || document.documentElement,
+				script = document.createElement("script");
+
+			script.type = "text/javascript";
+			if ( jQuery.support.scriptEval )
+				script.appendChild( document.createTextNode( data ) );
+			else
+				script.text = data;
+
+			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+			// This arises when a base node is used (#2709).
+			head.insertBefore( script, head.firstChild );
+			head.removeChild( script );
+		}
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0, length = object.length;
+
+		if ( args ) {
+			if ( length === undefined ) {
+				for ( name in object )
+					if ( callback.apply( object[ name ], args ) === false )
+						break;
+			} else
+				for ( ; i < length; )
+					if ( callback.apply( object[ i++ ], args ) === false )
+						break;
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( length === undefined ) {
+				for ( name in object )
+					if ( callback.call( object[ name ], name, object[ name ] ) === false )
+						break;
+			} else
+				for ( var value = object[0];
+					i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
+		}
+
+		return object;
+	},
+
+	prop: function( elem, value, type, i, name ) {
+		// Handle executable functions
+		if ( jQuery.isFunction( value ) )
+			value = value.call( elem, i );
+
+		// Handle passing in a number to a CSS property
+		return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
+			value + "px" :
+			value;
+	},
+
+	className: {
+		// internal only, use addClass("class")
+		add: function( elem, classNames ) {
+			jQuery.each((classNames || "").split(/\s+/), function(i, className){
+				if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
+					elem.className += (elem.className ? " " : "") + className;
+			});
+		},
+
+		// internal only, use removeClass("class")
+		remove: function( elem, classNames ) {
+			if (elem.nodeType == 1)
+				elem.className = classNames !== undefined ?
+					jQuery.grep(elem.className.split(/\s+/), function(className){
+						return !jQuery.className.has( classNames, className );
+					}).join(" ") :
+					"";
+		},
+
+		// internal only, use hasClass("class")
+		has: function( elem, className ) {
+			return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( var name in options )
+			elem.style[ name ] = old[ name ];
+	},
+
+	css: function( elem, name, force, extra ) {
+		if ( name == "width" || name == "height" ) {
+			var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
+
+			function getWH() {
+				val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
+
+				if ( extra === "border" )
+					return;
+
+				jQuery.each( which, function() {
+					if ( !extra )
+						val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+					if ( extra === "margin" )
+						val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
+					else
+						val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+				});
+			}
+
+			if ( elem.offsetWidth !== 0 )
+				getWH();
+			else
+				jQuery.swap( elem, props, getWH );
+
+			return Math.max(0, Math.round(val));
+		}
+
+		return jQuery.curCSS( elem, name, force );
+	},
+
+	curCSS: function( elem, name, force ) {
+		var ret, style = elem.style;
+
+		// We need to handle opacity special in IE
+		if ( name == "opacity" && !jQuery.support.opacity ) {
+			ret = jQuery.attr( style, "opacity" );
+
+			return ret == "" ?
+				"1" :
+				ret;
+		}
+
+		// Make sure we're using the right name for getting the float value
+		if ( name.match( /float/i ) )
+			name = styleFloat;
+
+		if ( !force && style && style[ name ] )
+			ret = style[ name ];
+
+		else if ( defaultView.getComputedStyle ) {
+
+			// Only "float" is needed here
+			if ( name.match( /float/i ) )
+				name = "float";
+
+			name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
+
+			var computedStyle = defaultView.getComputedStyle( elem, null );
+
+			if ( computedStyle )
+				ret = computedStyle.getPropertyValue( name );
+
+			// We should always get a number back from opacity
+			if ( name == "opacity" && ret == "" )
+				ret = "1";
+
+		} else if ( elem.currentStyle ) {
+			var camelCase = name.replace(/\-(\w)/g, function(all, letter){
+				return letter.toUpperCase();
+			});
+
+			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
+
+			// From the awesome hack by Dean Edwards
+			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+			// If we're not dealing with a regular pixel number
+			// but a number that has a weird ending, we need to convert it to pixels
+			if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
+				// Remember the original values
+				var left = style.left, rsLeft = elem.runtimeStyle.left;
+
+				// Put in the new values to get a computed value out
+				elem.runtimeStyle.left = elem.currentStyle.left;
+				style.left = ret || 0;
+				ret = style.pixelLeft + "px";
+
+				// Revert the changed values
+				style.left = left;
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret;
+	},
+
+	clean: function( elems, context, fragment ) {
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" )
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+
+		// If a single string is passed in and it's a single tag
+		// just do a createElement and skip the rest
+		if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
+			var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
+			if ( match )
+				return [ context.createElement( match[1] ) ];
+		}
+
+		var ret = [], scripts = [], div = context.createElement("div");
+
+		jQuery.each(elems, function(i, elem){
+			if ( typeof elem === "number" )
+				elem += '';
+
+			if ( !elem )
+				return;
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				// Fix "XHTML"-style tags in all browsers
+				elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
+					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
+						all :
+						front + "></" + tag + ">";
+				});
+
+				// Trim whitespace, otherwise indexOf won't work as expected
+				var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
+
+				var wrap =
+					// option or optgroup
+					!tags.indexOf("<opt") &&
+					[ 1, "<select multiple='multiple'>", "</select>" ] ||
+
+					!tags.indexOf("<leg") &&
+					[ 1, "<fieldset>", "</fieldset>" ] ||
+
+					tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
+					[ 1, "<table>", "</table>" ] ||
+
+					!tags.indexOf("<tr") &&
+					[ 2, "<table><tbody>", "</tbody></table>" ] ||
+
+				 	// <thead> matched above
+					(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
+					[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
+
+					!tags.indexOf("<col") &&
+					[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
+
+					// IE can't serialize <link> and <script> tags normally
+					!jQuery.support.htmlSerialize &&
+					[ 1, "div<div>", "</div>" ] ||
+
+					[ 0, "", "" ];
+
+				// Go to html and back, then peel off extra wrappers
+				div.innerHTML = wrap[1] + elem + wrap[2];
+
+				// Move to the right depth
+				while ( wrap[0]-- )
+					div = div.lastChild;
+
+				// Remove IE's autoinserted <tbody> from table fragments
+				if ( !jQuery.support.tbody ) {
+
+					// String was a <table>, *may* have spurious <tbody>
+					var hasBody = /<tbody/i.test(elem),
+						tbody = !tags.indexOf("<table") && !hasBody ?
+							div.firstChild && div.firstChild.childNodes :
+
+						// String was a bare <thead> or <tfoot>
+						wrap[1] == "<table>" && !hasBody ?
+							div.childNodes :
+							[];
+
+					for ( var j = tbody.length - 1; j >= 0 ; --j )
+						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
+							tbody[ j ].parentNode.removeChild( tbody[ j ] );
+
+					}
+
+				// IE completely kills leading whitespace when innerHTML is used
+				if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
+					div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
+				
+				elem = jQuery.makeArray( div.childNodes );
+			}
+
+			if ( elem.nodeType )
+				ret.push( elem );
+			else
+				ret = jQuery.merge( ret, elem );
+
+		});
+
+		if ( fragment ) {
+			for ( var i = 0; ret[i]; i++ ) {
+				if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+				} else {
+					if ( ret[i].nodeType === 1 )
+						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
+					fragment.appendChild( ret[i] );
+				}
+			}
+			
+			return scripts;
+		}
+
+		return ret;
+	},
+
+	attr: function( elem, name, value ) {
+		// don't set attributes on text and comment nodes
+		if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
+			return undefined;
+
+		var notxml = !jQuery.isXMLDoc( elem ),
+			// Whether we are setting (or getting)
+			set = value !== undefined;
+
+		// Try to normalize/fix the name
+		name = notxml && jQuery.props[ name ] || name;
+
+		// Only do all the following if this is a node (faster for style)
+		// IE elem.getAttribute passes even for style
+		if ( elem.tagName ) {
+
+			// These attributes require special treatment
+			var special = /href|src|style/.test( name );
+
+			// Safari mis-reports the default selected property of a hidden option
+			// Accessing the parent's selectedIndex property fixes it
+			if ( name == "selected" && elem.parentNode )
+				elem.parentNode.selectedIndex;
+
+			// If applicable, access the attribute via the DOM 0 way
+			if ( name in elem && notxml && !special ) {
+				if ( set ){
+					// We can't allow the type property to be changed (since it causes problems in IE)
+					if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
+						throw "type property can't be changed";
+
+					elem[ name ] = value;
+				}
+
+				// browsers index elements by id/name on forms, give priority to attributes.
+				if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
+					return elem.getAttributeNode( name ).nodeValue;
+
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				if ( name == "tabIndex" ) {
+					var attributeNode = elem.getAttributeNode( "tabIndex" );
+					return attributeNode && attributeNode.specified
+						? attributeNode.value
+						: elem.nodeName.match(/(button|input|object|select|textarea)/i)
+							? 0
+							: elem.nodeName.match(/^(a|area)$/i) && elem.href
+								? 0
+								: undefined;
+				}
+
+				return elem[ name ];
+			}
+
+			if ( !jQuery.support.style && notxml &&  name == "style" )
+				return jQuery.attr( elem.style, "cssText", value );
+
+			if ( set )
+				// convert the value to a string (all browsers do this but IE) see #1070
+				elem.setAttribute( name, "" + value );
+
+			var attr = !jQuery.support.hrefNormalized && notxml && special
+					// Some attributes require a special call on IE
+					? elem.getAttribute( name, 2 )
+					: elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return attr === null ? undefined : attr;
+		}
+
+		// elem is actually elem.style ... set the style
+
+		// IE uses filters for opacity
+		if ( !jQuery.support.opacity && name == "opacity" ) {
+			if ( set ) {
+				// IE has trouble with opacity if it does not have layout
+				// Force it by setting the zoom level
+				elem.zoom = 1;
+
+				// Set the alpha filter to set the opacity
+				elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
+					(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+			}
+
+			return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
+				(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
+				"";
+		}
+
+		name = name.replace(/-([a-z])/ig, function(all, letter){
+			return letter.toUpperCase();
+		});
+
+		if ( set )
+			elem[ name ] = value;
+
+		return elem[ name ];
+	},
+
+	trim: function( text ) {
+		return (text || "").replace( /^\s+|\s+$/g, "" );
+	},
+
+	makeArray: function( array ) {
+		var ret = [];
+
+		if( array != null ){
+			var i = array.length;
+			// The window, strings (and functions) also have 'length'
+			if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
+				ret[0] = array;
+			else
+				while( i )
+					ret[--i] = array[i];
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+		for ( var i = 0, length = array.length; i < length; i++ )
+		// Use === because on IE, window == document
+			if ( array[ i ] === elem )
+				return i;
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		// We have to loop this way because IE & Opera overwrite the length
+		// expando of getElementsByTagName
+		var i = 0, elem, pos = first.length;
+		// Also, we need to make sure that the correct elements are being returned
+		// (IE returns comment nodes in a '*' query)
+		if ( !jQuery.support.getAll ) {
+			while ( (elem = second[ i++ ]) != null )
+				if ( elem.nodeType != 8 )
+					first[ pos++ ] = elem;
+
+		} else
+			while ( (elem = second[ i++ ]) != null )
+				first[ pos++ ] = elem;
+
+		return first;
+	},
+
+	unique: function( array ) {
+		var ret = [], done = {};
+
+		try {
+
+			for ( var i = 0, length = array.length; i < length; i++ ) {
+				var id = jQuery.data( array[ i ] );
+
+				if ( !done[ id ] ) {
+					done[ id ] = true;
+					ret.push( array[ i ] );
+				}
+			}
+
+		} catch( e ) {
+			ret = array;
+		}
+
+		return ret;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [];
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ )
+			if ( !inv != !callback( elems[ i ], i ) )
+				ret.push( elems[ i ] );
+
+		return ret;
+	},
+
+	map: function( elems, callback ) {
+		var ret = [];
+
+		// Go through the array, translating each of the items to their
+		// new value (or values).
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			var value = callback( elems[ i ], i );
+
+			if ( value != null )
+				ret[ ret.length ] = value;
+		}
+
+		return ret.concat.apply( [], ret );
+	}
+});
+
+// Use of jQuery.browser is deprecated.
+// It's included for backwards compatibility and plugins,
+// although they should work to migrate away.
+
+var userAgent = navigator.userAgent.toLowerCase();
+
+// Figure out what browser is being used
+jQuery.browser = {
+	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
+	safari: /webkit/.test( userAgent ),
+	opera: /opera/.test( userAgent ),
+	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
+	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
+};
+
+jQuery.each({
+	parent: function(elem){return elem.parentNode;},
+	parents: function(elem){return jQuery.dir(elem,"parentNode");},
+	next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
+	prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
+	nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
+	prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
+	siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
+	children: function(elem){return jQuery.sibling(elem.firstChild);},
+	contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
+}, function(name, fn){
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = jQuery.map( this, fn );
+
+		if ( selector && typeof selector == "string" )
+			ret = jQuery.multiFilter( selector, ret );
+
+		return this.pushStack( jQuery.unique( ret ), name, selector );
+	};
+});
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function(name, original){
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [], insert = jQuery( selector );
+
+		for ( var i = 0, l = insert.length; i < l; i++ ) {
+			var elems = (i > 0 ? this.clone(true) : this).get();
+			jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
+			ret = ret.concat( elems );
+		}
+
+		return this.pushStack( ret, name, selector );
+	};
+});
+
+jQuery.each({
+	removeAttr: function( name ) {
+		jQuery.attr( this, name, "" );
+		if (this.nodeType == 1)
+			this.removeAttribute( name );
+	},
+
+	addClass: function( classNames ) {
+		jQuery.className.add( this, classNames );
+	},
+
+	removeClass: function( classNames ) {
+		jQuery.className.remove( this, classNames );
+	},
+
+	toggleClass: function( classNames, state ) {
+		if( typeof state !== "boolean" )
+			state = !jQuery.className.has( this, classNames );
+		jQuery.className[ state ? "add" : "remove" ]( this, classNames );
+	},
+
+	remove: function( selector ) {
+		if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
+			// Prevent memory leaks
+			jQuery( "*", this ).add([this]).each(function(){
+				jQuery.event.remove(this);
+				jQuery.removeData(this);
+			});
+			if (this.parentNode)
+				this.parentNode.removeChild( this );
+		}
+	},
+
+	empty: function() {
+		// Remove element nodes and prevent memory leaks
+		jQuery(this).children().remove();
+
+		// Remove any remaining nodes
+		while ( this.firstChild )
+			this.removeChild( this.firstChild );
+	}
+}, function(name, fn){
+	jQuery.fn[ name ] = function(){
+		return this.each( fn, arguments );
+	};
+});
+
+// Helper function used by the dimensions and offset modules
+function num(elem, prop) {
+	return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+}
+var expando = "jQuery" + now(), uuid = 0, windowData = {};
+
+jQuery.extend({
+	cache: {},
+
+	data: function( elem, name, data ) {
+		elem = elem == window ?
+			windowData :
+			elem;
+
+		var id = elem[ expando ];
+
+		// Compute a unique ID for the element
+		if ( !id )
+			id = elem[ expando ] = ++uuid;
+
+		// Only generate the data cache if we're
+		// trying to access or manipulate it
+		if ( name && !jQuery.cache[ id ] )
+			jQuery.cache[ id ] = {};
+
+		// Prevent overriding the named cache with undefined values
+		if ( data !== undefined )
+			jQuery.cache[ id ][ name ] = data;
+
+		// Return the named cache data, or the ID for the element
+		return name ?
+			jQuery.cache[ id ][ name ] :
+			id;
+	},
+
+	removeData: function( elem, name ) {
+		elem = elem == window ?
+			windowData :
+			elem;
+
+		var id = elem[ expando ];
+
+		// If we want to remove a specific section of the element's data
+		if ( name ) {
+			if ( jQuery.cache[ id ] ) {
+				// Remove the section of cache data
+				delete jQuery.cache[ id ][ name ];
+
+				// If we've removed all the data, remove the element's cache
+				name = "";
+
+				for ( name in jQuery.cache[ id ] )
+					break;
+
+				if ( !name )
+					jQuery.removeData( elem );
+			}
+
+		// Otherwise, we want to remove all of the element's data
+		} else {
+			// Clean up the element expando
+			try {
+				delete elem[ expando ];
+			} catch(e){
+				// IE has trouble directly removing the expando
+				// but it's ok with using removeAttribute
+				if ( elem.removeAttribute )
+					elem.removeAttribute( expando );
+			}
+
+			// Completely remove the data cache
+			delete jQuery.cache[ id ];
+		}
+	},
+	queue: function( elem, type, data ) {
+		if ( elem ){
+	
+			type = (type || "fx") + "queue";
+	
+			var q = jQuery.data( elem, type );
+	
+			if ( !q || jQuery.isArray(data) )
+				q = jQuery.data( elem, type, jQuery.makeArray(data) );
+			else if( data )
+				q.push( data );
+	
+		}
+		return q;
+	},
+
+	dequeue: function( elem, type ){
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift();
+		
+		if( !type || type === "fx" )
+			fn = queue[0];
+			
+		if( fn !== undefined )
+			fn.call(elem);
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ){
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			if ( data === undefined && this.length )
+				data = jQuery.data( this[0], key );
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+		} else
+			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
+				jQuery.data( this, key, value );
+			});
+	},
+
+	removeData: function( key ){
+		return this.each(function(){
+			jQuery.removeData( this, key );
+		});
+	},
+	queue: function(type, data){
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined )
+			return jQuery.queue( this[0], type );
+
+		return this.each(function(){
+			var queue = jQuery.queue( this, type, data );
+			
+			 if( type == "fx" && queue.length == 1 )
+				queue[0].call(this);
+		});
+	},
+	dequeue: function(type){
+		return this.each(function(){
+			jQuery.dequeue( this, type );
+		});
+	}
+});/*!
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
+	done = 0,
+	toString = Object.prototype.toString;
+
+var Sizzle = function(selector, context, results, seed) {
+	results = results || [];
+	context = context || document;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 )
+		return [];
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var parts = [], m, set, checkSet, check, mode, extra, prune = true;
+	
+	// Reset the position of the chunker regexp (start from head)
+	chunker.lastIndex = 0;
+	
+	while ( (m = chunker.exec(selector)) !== null ) {
+		parts.push( m[1] );
+		
+		if ( m[2] ) {
+			extra = RegExp.rightContext;
+			break;
+		}
+	}
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] )
+					selector += parts.shift();
+
+				set = posProcess( selector, set );
+			}
+		}
+	} else {
+		var ret = seed ?
+			{ expr: parts.pop(), set: makeArray(seed) } :
+			Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
+		set = Sizzle.filter( ret.expr, ret.set );
+
+		if ( parts.length > 0 ) {
+			checkSet = makeArray(set);
+		} else {
+			prune = false;
+		}
+
+		while ( parts.length ) {
+			var cur = parts.pop(), pop = cur;
+
+			if ( !Expr.relative[ cur ] ) {
+				cur = "";
+			} else {
+				pop = parts.pop();
+			}
+
+			if ( pop == null ) {
+				pop = context;
+			}
+
+			Expr.relative[ cur ]( checkSet, pop, isXML(context) );
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		throw "Syntax error, unrecognized expression: " + (cur || selector);
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+		} else if ( context.nodeType === 1 ) {
+			for ( var i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+		} else {
+			for ( var i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, context, results, seed );
+
+		if ( sortOrder ) {
+			hasDuplicate = false;
+			results.sort(sortOrder);
+
+			if ( hasDuplicate ) {
+				for ( var i = 1; i < results.length; i++ ) {
+					if ( results[i] === results[i-1] ) {
+						results.splice(i--, 1);
+					}
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function(expr, set){
+	return Sizzle(expr, null, null, set);
+};
+
+Sizzle.find = function(expr, context, isXML){
+	var set, match;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var type = Expr.order[i], match;
+		
+		if ( (match = Expr.match[ type ].exec( expr )) ) {
+			var left = RegExp.leftContext;
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace(/\\/g, "");
+				set = Expr.find[ type ]( match, context, isXML );
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = context.getElementsByTagName("*");
+	}
+
+	return {set: set, expr: expr};
+};
+
+Sizzle.filter = function(expr, set, inplace, not){
+	var old = expr, result = [], curLoop = set, match, anyFound,
+		isXMLFilter = set && set[0] && isXML(set[0]);
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.match[ type ].exec( expr )) != null ) {
+				var filter = Expr.filter[ type ], found, item;
+				anyFound = false;
+
+				if ( curLoop == result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+								} else {
+									curLoop[i] = false;
+								}
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr == old ) {
+			if ( anyFound == null ) {
+				throw "Syntax error, unrecognized expression: " + expr;
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
+	},
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+	attrHandle: {
+		href: function(elem){
+			return elem.getAttribute("href");
+		}
+	},
+	relative: {
+		"+": function(checkSet, part, isXML){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !/\W/.test(part),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag && !isXML ) {
+				part = part.toUpperCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+		">": function(checkSet, part, isXML){
+			var isPartStr = typeof part === "string";
+
+			if ( isPartStr && !/\W/.test(part) ) {
+				part = isXML ? part : part.toUpperCase();
+
+				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+					var elem = checkSet[i];
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName === part ? parent : false;
+					}
+				}
+			} else {
+				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+					var elem = checkSet[i];
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+		"": function(checkSet, part, isXML){
+			var doneName = done++, checkFn = dirCheck;
+
+			if ( !part.match(/\W/) ) {
+				var nodeCheck = part = isXML ? part : part.toUpperCase();
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
+		},
+		"~": function(checkSet, part, isXML){
+			var doneName = done++, checkFn = dirCheck;
+
+			if ( typeof part === "string" && !part.match(/\W/) ) {
+				var nodeCheck = part = isXML ? part : part.toUpperCase();
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
+		}
+	},
+	find: {
+		ID: function(match, context, isXML){
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				return m ? [m] : [];
+			}
+		},
+		NAME: function(match, context, isXML){
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [], results = context.getElementsByName(match[1]);
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+		TAG: function(match, context){
+			return context.getElementsByTagName(match[1]);
+		}
+	},
+	preFilter: {
+		CLASS: function(match, curLoop, inplace, result, not, isXML){
+			match = " " + match[1].replace(/\\/g, "") + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
+						if ( !inplace )
+							result.push( elem );
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+		ID: function(match){
+			return match[1].replace(/\\/g, "");
+		},
+		TAG: function(match, curLoop){
+			for ( var i = 0; curLoop[i] === false; i++ ){}
+			return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
+		},
+		CHILD: function(match){
+			if ( match[1] == "nth" ) {
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+					match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+		ATTR: function(match, curLoop, inplace, result, not, isXML){
+			var name = match[1].replace(/\\/g, "");
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+		PSEUDO: function(match, curLoop, inplace, result, not){
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+					return false;
+				}
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+		POS: function(match){
+			match.unshift( true );
+			return match;
+		}
+	},
+	filters: {
+		enabled: function(elem){
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+		disabled: function(elem){
+			return elem.disabled === true;
+		},
+		checked: function(elem){
+			return elem.checked === true;
+		},
+		selected: function(elem){
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			elem.parentNode.selectedIndex;
+			return elem.selected === true;
+		},
+		parent: function(elem){
+			return !!elem.firstChild;
+		},
+		empty: function(elem){
+			return !elem.firstChild;
+		},
+		has: function(elem, i, match){
+			return !!Sizzle( match[3], elem ).length;
+		},
+		header: function(elem){
+			return /h\d/i.test( elem.nodeName );
+		},
+		text: function(elem){
+			return "text" === elem.type;
+		},
+		radio: function(elem){
+			return "radio" === elem.type;
+		},
+		checkbox: function(elem){
+			return "checkbox" === elem.type;
+		},
+		file: function(elem){
+			return "file" === elem.type;
+		},
+		password: function(elem){
+			return "password" === elem.type;
+		},
+		submit: function(elem){
+			return "submit" === elem.type;
+		},
+		image: function(elem){
+			return "image" === elem.type;
+		},
+		reset: function(elem){
+			return "reset" === elem.type;
+		},
+		button: function(elem){
+			return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
+		},
+		input: function(elem){
+			return /input|select|textarea|button/i.test(elem.nodeName);
+		}
+	},
+	setFilters: {
+		first: function(elem, i){
+			return i === 0;
+		},
+		last: function(elem, i, match, array){
+			return i === array.length - 1;
+		},
+		even: function(elem, i){
+			return i % 2 === 0;
+		},
+		odd: function(elem, i){
+			return i % 2 === 1;
+		},
+		lt: function(elem, i, match){
+			return i < match[3] - 0;
+		},
+		gt: function(elem, i, match){
+			return i > match[3] - 0;
+		},
+		nth: function(elem, i, match){
+			return match[3] - 0 == i;
+		},
+		eq: function(elem, i, match){
+			return match[3] - 0 == i;
+		}
+	},
+	filter: {
+		PSEUDO: function(elem, match, i, array){
+			var name = match[1], filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var i = 0, l = not.length; i < l; i++ ) {
+					if ( not[i] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+			}
+		},
+		CHILD: function(elem, match){
+			var type = match[1], node = elem;
+			switch (type) {
+				case 'only':
+				case 'first':
+					while (node = node.previousSibling)  {
+						if ( node.nodeType === 1 ) return false;
+					}
+					if ( type == 'first') return true;
+					node = elem;
+				case 'last':
+					while (node = node.nextSibling)  {
+						if ( node.nodeType === 1 ) return false;
+					}
+					return true;
+				case 'nth':
+					var first = match[2], last = match[3];
+
+					if ( first == 1 && last == 0 ) {
+						return true;
+					}
+					
+					var doneName = match[0],
+						parent = elem.parentNode;
+	
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+						parent.sizcache = doneName;
+					}
+					
+					var diff = elem.nodeIndex - last;
+					if ( first == 0 ) {
+						return diff == 0;
+					} else {
+						return ( diff % first == 0 && diff / first >= 0 );
+					}
+			}
+		},
+		ID: function(elem, match){
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+		TAG: function(elem, match){
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
+		},
+		CLASS: function(elem, match){
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+		ATTR: function(elem, match){
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value != check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+		POS: function(elem, match, i, array){
+			var name = match[2], filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS;
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+}
+
+var makeArray = function(array, results) {
+	array = Array.prototype.slice.call( array );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes );
+
+// Provide a fallback method if it does not work
+} catch(e){
+	makeArray = function(array, results) {
+		var ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var i = 0, l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+			} else {
+				for ( var i = 0; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
+		if ( ret === 0 ) {
+			hasDuplicate = true;
+		}
+		return ret;
+	};
+} else if ( "sourceIndex" in document.documentElement ) {
+	sortOrder = function( a, b ) {
+		var ret = a.sourceIndex - b.sourceIndex;
+		if ( ret === 0 ) {
+			hasDuplicate = true;
+		}
+		return ret;
+	};
+} else if ( document.createRange ) {
+	sortOrder = function( a, b ) {
+		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
+		aRange.selectNode(a);
+		aRange.collapse(true);
+		bRange.selectNode(b);
+		bRange.collapse(true);
+		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
+		if ( ret === 0 ) {
+			hasDuplicate = true;
+		}
+		return ret;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("form"),
+		id = "script" + (new Date).getTime();
+	form.innerHTML = "<input name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	var root = document.documentElement;
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( !!document.getElementById( id ) ) {
+		Expr.find.ID = function(match, context, isXML){
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
+			}
+		};
+
+		Expr.filter.ID = function(elem, match){
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function(match, context){
+			var results = context.getElementsByTagName(match[1]);
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+		Expr.attrHandle.href = function(elem){
+			return elem.getAttribute("href", 2);
+		};
+	}
+})();
+
+if ( document.querySelectorAll ) (function(){
+	var oldSizzle = Sizzle, div = document.createElement("div");
+	div.innerHTML = "<p class='TEST'></p>";
+
+	// Safari can't handle uppercase or unicode characters when
+	// in quirks mode.
+	if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+		return;
+	}
+	
+	Sizzle = function(query, context, extra, seed){
+		context = context || document;
+
+		// Only use querySelectorAll on non-XML documents
+		// (ID selectors don't work in non-HTML documents)
+		if ( !seed && context.nodeType === 9 && !isXML(context) ) {
+			try {
+				return makeArray( context.querySelectorAll(query), extra );
+			} catch(e){}
+		}
+		
+		return oldSizzle(query, context, extra, seed);
+	};
+
+	Sizzle.find = oldSizzle.find;
+	Sizzle.filter = oldSizzle.filter;
+	Sizzle.selectors = oldSizzle.selectors;
+	Sizzle.matches = oldSizzle.matches;
+})();
+
+if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
+	var div = document.createElement("div");
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	if ( div.getElementsByClassName("e").length === 0 )
+		return;
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 )
+		return;
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function(match, context, isXML) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	var sibDir = dir == "previousSibling" && !isXML;
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+		if ( elem ) {
+			if ( sibDir && elem.nodeType === 1 ){
+				elem.sizcache = doneName;
+				elem.sizset = i;
+			}
+			elem = elem[dir];
+			var match = false;
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	var sibDir = dir == "previousSibling" && !isXML;
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+		if ( elem ) {
+			if ( sibDir && elem.nodeType === 1 ) {
+				elem.sizcache = doneName;
+				elem.sizset = i;
+			}
+			elem = elem[dir];
+			var match = false;
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+var contains = document.compareDocumentPosition ?  function(a, b){
+	return a.compareDocumentPosition(b) & 16;
+} : function(a, b){
+	return a !== b && (a.contains ? a.contains(b) : true);
+};
+
+var isXML = function(elem){
+	return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
+		!!elem.ownerDocument && isXML( elem.ownerDocument );
+};
+
+var posProcess = function(selector, context){
+	var tmpSet = [], later = "", match,
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.filter = Sizzle.filter;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+
+Sizzle.selectors.filters.hidden = function(elem){
+	return elem.offsetWidth === 0 || elem.offsetHeight === 0;
+};
+
+Sizzle.selectors.filters.visible = function(elem){
+	return elem.offsetWidth > 0 || elem.offsetHeight > 0;
+};
+
+Sizzle.selectors.filters.animated = function(elem){
+	return jQuery.grep(jQuery.timers, function(fn){
+		return elem === fn.elem;
+	}).length;
+};
+
+jQuery.multiFilter = function( expr, elems, not ) {
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	return Sizzle.matches(expr, elems);
+};
+
+jQuery.dir = function( elem, dir ){
+	var matched = [], cur = elem[dir];
+	while ( cur && cur != document ) {
+		if ( cur.nodeType == 1 )
+			matched.push( cur );
+		cur = cur[dir];
+	}
+	return matched;
+};
+
+jQuery.nth = function(cur, result, dir, elem){
+	result = result || 1;
+	var num = 0;
+
+	for ( ; cur; cur = cur[dir] )
+		if ( cur.nodeType == 1 && ++num == result )
+			break;
+
+	return cur;
+};
+
+jQuery.sibling = function(n, elem){
+	var r = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType == 1 && n != elem )
+			r.push( n );
+	}
+
+	return r;
+};
+
+return;
+
+window.Sizzle = Sizzle;
+
+})();
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function(elem, types, handler, data) {
+		if ( elem.nodeType == 3 || elem.nodeType == 8 )
+			return;
+
+		// For whatever reason, IE has trouble passing the window object
+		// around, causing it to be cloned in the process
+		if ( elem.setInterval && elem != window )
+			elem = window;
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid )
+			handler.guid = this.guid++;
+
+		// if data is passed, bind to handler
+		if ( data !== undefined ) {
+			// Create temporary function pointer to original handler
+			var fn = handler;
+
+			// Create unique handler function, wrapped around original handler
+			handler = this.proxy( fn );
+
+			// Store data in unique handler
+			handler.data = data;
+		}
+
+		// Init the element's event structure
+		var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
+			handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
+				// Handle the second event of a trigger and when
+				// an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+					jQuery.event.handle.apply(arguments.callee.elem, arguments) :
+					undefined;
+			});
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native
+		// event in IE.
+		handle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		jQuery.each(types.split(/\s+/), function(index, type) {
+			// Namespaced event handlers
+			var namespaces = type.split(".");
+			type = namespaces.shift();
+			handler.type = namespaces.slice().sort().join(".");
+
+			// Get the current list of functions bound to this event
+			var handlers = events[type];
+			
+			if ( jQuery.event.specialAll[type] )
+				jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
+
+			// Init the event handler queue
+			if (!handlers) {
+				handlers = events[type] = {};
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
+					// Bind the global event handler to the element
+					if (elem.addEventListener)
+						elem.addEventListener(type, handle, false);
+					else if (elem.attachEvent)
+						elem.attachEvent("on" + type, handle);
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers[handler.guid] = handler;
+
+			// Keep track of which events have been used, for global triggering
+			jQuery.event.global[type] = true;
+		});
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	guid: 1,
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function(elem, types, handler) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType == 3 || elem.nodeType == 8 )
+			return;
+
+		var events = jQuery.data(elem, "events"), ret, index;
+
+		if ( events ) {
+			// Unbind all events for the element
+			if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
+				for ( var type in events )
+					this.remove( elem, type + (types || "") );
+			else {
+				// types is actually an event object here
+				if ( types.type ) {
+					handler = types.handler;
+					types = types.type;
+				}
+
+				// Handle multiple events seperated by a space
+				// jQuery(...).unbind("mouseover mouseout", fn);
+				jQuery.each(types.split(/\s+/), function(index, type){
+					// Namespaced event handlers
+					var namespaces = type.split(".");
+					type = namespaces.shift();
+					var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
+
+					if ( events[type] ) {
+						// remove the given handler for the given type
+						if ( handler )
+							delete events[type][handler.guid];
+
+						// remove all handlers for the given type
+						else
+							for ( var handle in events[type] )
+								// Handle the removal of namespaced events
+								if ( namespace.test(events[type][handle].type) )
+									delete events[type][handle];
+									
+						if ( jQuery.event.specialAll[type] )
+							jQuery.event.specialAll[type].teardown.call(elem, namespaces);
+
+						// remove generic event handler if no more handlers exist
+						for ( ret in events[type] ) break;
+						if ( !ret ) {
+							if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
+								if (elem.removeEventListener)
+									elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
+								else if (elem.detachEvent)
+									elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
+							}
+							ret = null;
+							delete events[type];
+						}
+					}
+				});
+			}
+
+			// Remove the expando if it's no longer used
+			for ( ret in events ) break;
+			if ( !ret ) {
+				var handle = jQuery.data( elem, "handle" );
+				if ( handle ) handle.elem = null;
+				jQuery.removeData( elem, "events" );
+				jQuery.removeData( elem, "handle" );
+			}
+		}
+	},
+
+	// bubbling is internal
+	trigger: function( event, data, elem, bubbling ) {
+		// Event object or event type
+		var type = event.type || event;
+
+		if( !bubbling ){
+			event = typeof event === "object" ?
+				// jQuery.Event object
+				event[expando] ? event :
+				// Object literal
+				jQuery.extend( jQuery.Event(type), event ) :
+				// Just the event type (string)
+				jQuery.Event(type);
+
+			if ( type.indexOf("!") >= 0 ) {
+				event.type = type = type.slice(0, -1);
+				event.exclusive = true;
+			}
+
+			// Handle a global trigger
+			if ( !elem ) {
+				// Don't bubble custom events when global (to avoid too much overhead)
+				event.stopPropagation();
+				// Only trigger if we've ever bound an event for it
+				if ( this.global[type] )
+					jQuery.each( jQuery.cache, function(){
+						if ( this.events && this.events[type] )
+							jQuery.event.trigger( event, data, this.handle.elem );
+					});
+			}
+
+			// Handle triggering a single element
+
+			// don't do events on text and comment nodes
+			if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
+				return undefined;
+			
+			// Clean up in case it is reused
+			event.result = undefined;
+			event.target = elem;
+			
+			// Clone the incoming data, if any
+			data = jQuery.makeArray(data);
+			data.unshift( event );
+		}
+
+		event.currentTarget = elem;
+
+		// Trigger the event, it is assumed that "handle" is a function
+		var handle = jQuery.data(elem, "handle");
+		if ( handle )
+			handle.apply( elem, data );
+
+		// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
+		if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
+			event.result = false;
+
+		// Trigger the native events (except for clicks on links)
+		if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
+			this.triggered = true;
+			try {
+				elem[ type ]();
+			// prevent IE from throwing an error for some hidden elements
+			} catch (e) {}
+		}
+
+		this.triggered = false;
+
+		if ( !event.isPropagationStopped() ) {
+			var parent = elem.parentNode || elem.ownerDocument;
+			if ( parent )
+				jQuery.event.trigger(event, data, parent, true);
+		}
+	},
+
+	handle: function(event) {
+		// returned undefined or false
+		var all, handlers;
+
+		event = arguments[0] = jQuery.event.fix( event || window.event );
+		event.currentTarget = this;
+		
+		// Namespaced event handlers
+		var namespaces = event.type.split(".");
+		event.type = namespaces.shift();
+
+		// Cache this now, all = true means, any handler
+		all = !namespaces.length && !event.exclusive;
+		
+		var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
+
+		handlers = ( jQuery.data(this, "events") || {} )[event.type];
+
+		for ( var j in handlers ) {
+			var handler = handlers[j];
+
+			// Filter the functions by class
+			if ( all || namespace.test(handler.type) ) {
+				// Pass in a reference to the handler function itself
+				// So that we can later remove it
+				event.handler = handler;
+				event.data = handler.data;
+
+				var ret = handler.apply(this, arguments);
+
+				if( ret !== undefined ){
+					event.result = ret;
+					if ( ret === false ) {
+						event.preventDefault();
+						event.stopPropagation();
+					}
+				}
+
+				if( event.isImmediatePropagationStopped() )
+					break;
+
+			}
+		}
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function(event) {
+		if ( event[expando] )
+			return event;
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ){
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target )
+			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType == 3 )
+			event.target = event.target.parentNode;
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement )
+			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var doc = document.documentElement, body = document.body;
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
+		}
+
+		// Add which for key events
+		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
+			event.which = event.charCode || event.keyCode;
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey )
+			event.metaKey = event.ctrlKey;
+
+		// Add which for click: 1 == left; 2 == middle; 3 == right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button )
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+
+		return event;
+	},
+
+	proxy: function( fn, proxy ){
+		proxy = proxy || function(){ return fn.apply(this, arguments); };
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
+		// So proxy can be declared as an argument
+		return proxy;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: bindReady,
+			teardown: function() {}
+		}
+	},
+	
+	specialAll: {
+		live: {
+			setup: function( selector, namespaces ){
+				jQuery.event.add( this, namespaces[0], liveHandler );
+			},
+			teardown:  function( namespaces ){
+				if ( namespaces.length ) {
+					var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
+					
+					jQuery.each( (jQuery.data(this, "events").live || {}), function(){
+						if ( name.test(this.type) )
+							remove++;
+					});
+					
+					if ( remove < 1 )
+						jQuery.event.remove( this, namespaces[0], liveHandler );
+				}
+			}
+		}
+	}
+};
+
+jQuery.Event = function( src ){
+	// Allow instantiation without the 'new' keyword
+	if( !this.preventDefault )
+		return new jQuery.Event(src);
+	
+	// Event object
+	if( src && src.type ){
+		this.originalEvent = src;
+		this.type = src.type;
+	// Event type
+	}else
+		this.type = src;
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = now();
+	
+	// Mark it as fixed
+	this[expando] = true;
+};
+
+function returnFalse(){
+	return false;
+}
+function returnTrue(){
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if( !e )
+			return;
+		// if preventDefault exists run it on the original event
+		if (e.preventDefault)
+			e.preventDefault();
+		// otherwise set the returnValue property of the original event to false (IE)
+		e.returnValue = false;
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if( !e )
+			return;
+		// if stopPropagation exists run it on the original event
+		if (e.stopPropagation)
+			e.stopPropagation();
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation:function(){
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function(event) {
+	// Check if mouse(over|out) are still within the same parent element
+	var parent = event.relatedTarget;
+	// Traverse up the tree
+	while ( parent && parent != this )
+		try { parent = parent.parentNode; }
+		catch(e) { parent = this; }
+	
+	if( parent != this ){
+		// set the correct event type
+		event.type = event.data;
+		// handle event if we actually just moused on to a non sub-element
+		jQuery.event.handle.apply( this, arguments );
+	}
+};
+	
+jQuery.each({ 
+	mouseover: 'mouseenter', 
+	mouseout: 'mouseleave'
+}, function( orig, fix ){
+	jQuery.event.special[ fix ] = {
+		setup: function(){
+			jQuery.event.add( this, orig, withinElement, fix );
+		},
+		teardown: function(){
+			jQuery.event.remove( this, orig, withinElement );
+		}
+	};			   
+});
+
+jQuery.fn.extend({
+	bind: function( type, data, fn ) {
+		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
+			jQuery.event.add( this, type, fn || data, fn && data );
+		});
+	},
+
+	one: function( type, data, fn ) {
+		var one = jQuery.event.proxy( fn || data, function(event) {
+			jQuery(this).unbind(event, one);
+			return (fn || data).apply( this, arguments );
+		});
+		return this.each(function(){
+			jQuery.event.add( this, type, one, fn && data);
+		});
+	},
+
+	unbind: function( type, fn ) {
+		return this.each(function(){
+			jQuery.event.remove( this, type, fn );
+		});
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function(){
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if( this[0] ){
+			var event = jQuery.Event(type);
+			event.preventDefault();
+			event.stopPropagation();
+			jQuery.event.trigger( event, data, this[0] );
+			return event.result;
+		}		
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments, i = 1;
+
+		// link all the functions, so any of them can unbind this click handler
+		while( i < args.length )
+			jQuery.event.proxy( fn, args[i++] );
+
+		return this.click( jQuery.event.proxy( fn, function(event) {
+			// Figure out which function to execute
+			this.lastToggle = ( this.lastToggle || 0 ) % i;
+
+			// Make sure that clicks stop
+			event.preventDefault();
+
+			// and execute the function
+			return args[ this.lastToggle++ ].apply( this, arguments ) || false;
+		}));
+	},
+
+	hover: function(fnOver, fnOut) {
+		return this.mouseenter(fnOver).mouseleave(fnOut);
+	},
+
+	ready: function(fn) {
+		// Attach the listeners
+		bindReady();
+
+		// If the DOM is already ready
+		if ( jQuery.isReady )
+			// Execute the function immediately
+			fn.call( document, jQuery );
+
+		// Otherwise, remember the function for later
+		else
+			// Add the function to the wait list
+			jQuery.readyList.push( fn );
+
+		return this;
+	},
+	
+	live: function( type, fn ){
+		var proxy = jQuery.event.proxy( fn );
+		proxy.guid += this.selector + type;
+
+		jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
+
+		return this;
+	},
+	
+	die: function( type, fn ){
+		jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
+		return this;
+	}
+});
+
+function liveHandler( event ){
+	var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
+		stop = true,
+		elems = [];
+
+	jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
+		if ( check.test(fn.type) ) {
+			var elem = jQuery(event.target).closest(fn.data)[0];
+			if ( elem )
+				elems.push({ elem: elem, fn: fn });
+		}
+	});
+
+	elems.sort(function(a,b) {
+		return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
+	});
+	
+	jQuery.each(elems, function(){
+		if ( this.fn.call(this.elem, event, this.fn.data) === false )
+			return (stop = false);
+	});
+
+	return stop;
+}
+
+function liveConvert(type, selector){
+	return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
+}
+
+jQuery.extend({
+	isReady: false,
+	readyList: [],
+	// Handle when the DOM is ready
+	ready: function() {
+		// Make sure that the DOM is not already loaded
+		if ( !jQuery.isReady ) {
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If there are functions bound, to execute
+			if ( jQuery.readyList ) {
+				// Execute all of them
+				jQuery.each( jQuery.readyList, function(){
+					this.call( document, jQuery );
+				});
+
+				// Reset the list of functions
+				jQuery.readyList = null;
+			}
+
+			// Trigger any bound ready events
+			jQuery(document).triggerHandler("ready");
+		}
+	}
+});
+
+var readyBound = false;
+
+function bindReady(){
+	if ( readyBound ) return;
+	readyBound = true;
+
+	// Mozilla, Opera and webkit nightlies currently support this event
+	if ( document.addEventListener ) {
+		// Use the handy event callback
+		document.addEventListener( "DOMContentLoaded", function(){
+			document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
+			jQuery.ready();
+		}, false );
+
+	// If IE event model is used
+	} else if ( document.attachEvent ) {
+		// ensure firing before onload,
+		// maybe late but safe also for iframes
+		document.attachEvent("onreadystatechange", function(){
+			if ( document.readyState === "complete" ) {
+				document.detachEvent( "onreadystatechange", arguments.callee );
+				jQuery.ready();
+			}
+		});
+
+		// If IE and not an iframe
+		// continually check to see if the document is ready
+		if ( document.documentElement.doScroll && window == window.top ) (function(){
+			if ( jQuery.isReady ) return;
+
+			try {
+				// If IE is used, use the trick by Diego Perini
+				// http://javascript.nwbox.com/IEContentLoaded/
+				document.documentElement.doScroll("left");
+			} catch( error ) {
+				setTimeout( arguments.callee, 0 );
+				return;
+			}
+
+			// and execute any waiting functions
+			jQuery.ready();
+		})();
+	}
+
+	// A fallback to window.onload, that will always work
+	jQuery.event.add( window, "load", jQuery.ready );
+}
+
+jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
+	"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
+	"change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
+
+	// Handle event binding
+	jQuery.fn[name] = function(fn){
+		return fn ? this.bind(name, fn) : this.trigger(name);
+	};
+});
+
+// Prevent memory leaks in IE
+// And prevent errors on refresh with events like mouseover in other browsers
+// Window isn't included so as not to unbind existing unload events
+jQuery( window ).bind( 'unload', function(){ 
+	for ( var id in jQuery.cache )
+		// Skip the window
+		if ( id != 1 && jQuery.cache[ id ].handle )
+			jQuery.event.remove( jQuery.cache[ id ].handle.elem );
+}); 
+(function(){
+
+	jQuery.support = {};
+
+	var root = document.documentElement,
+		script = document.createElement("script"),
+		div = document.createElement("div"),
+		id = "script" + (new Date).getTime();
+
+	div.style.display = "none";
+	div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
+
+	var all = div.getElementsByTagName("*"),
+		a = div.getElementsByTagName("a")[0];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return;
+	}
+
+	jQuery.support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: div.firstChild.nodeType == 3,
+		
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+		
+		// Make sure that you can get all elements in an <object> element
+		// IE 7 always returns no results
+		objectAll: !!div.getElementsByTagName("object")[0]
+			.getElementsByTagName("*").length,
+		
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+		
+		// Get the style information from getAttribute
+		// (IE uses .cssText insted)
+		style: /red/.test( a.getAttribute("style") ),
+		
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: a.getAttribute("href") === "/a",
+		
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		opacity: a.style.opacity === "0.5",
+		
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Will be defined later
+		scriptEval: false,
+		noCloneEvent: true,
+		boxModel: null
+	};
+	
+	script.type = "text/javascript";
+	try {
+		script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+	} catch(e){}
+
+	root.insertBefore( script, root.firstChild );
+	
+	// Make sure that the execution of code works by injecting a script
+	// tag with appendChild/createTextNode
+	// (IE doesn't support this, fails, and uses .text instead)
+	if ( window[ id ] ) {
+		jQuery.support.scriptEval = true;
+		delete window[ id ];
+	}
+
+	root.removeChild( script );
+
+	if ( div.attachEvent && div.fireEvent ) {
+		div.attachEvent("onclick", function(){
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			jQuery.support.noCloneEvent = false;
+			div.detachEvent("onclick", arguments.callee);
+		});
+		div.cloneNode(true).fireEvent("onclick");
+	}
+
+	// Figure out if the W3C box model works as expected
+	// document.body must exist before we can do this
+	jQuery(function(){
+		var div = document.createElement("div");
+		div.style.width = div.style.paddingLeft = "1px";
+
+		document.body.appendChild( div );
+		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+		document.body.removeChild( div ).style.display = 'none';
+	});
+})();
+
+var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
+
+jQuery.props = {
+	"for": "htmlFor",
+	"class": "className",
+	"float": styleFloat,
+	cssFloat: styleFloat,
+	styleFloat: styleFloat,
+	readonly: "readOnly",
+	maxlength: "maxLength",
+	cellspacing: "cellSpacing",
+	rowspan: "rowSpan",
+	tabindex: "tabIndex"
+};
+jQuery.fn.extend({
+	// Keep a copy of the old load
+	_load: jQuery.fn.load,
+
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" )
+			return this._load( url );
+
+		var off = url.indexOf(" ");
+		if ( off >= 0 ) {
+			var selector = url.slice(off, url.length);
+			url = url.slice(0, off);
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params )
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = null;
+
+			// Otherwise, build a param string
+			} else if( typeof params === "object" ) {
+				params = jQuery.param( params );
+				type = "POST";
+			}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			complete: function(res, status){
+				// If successful, inject the HTML into all the matched elements
+				if ( status == "success" || status == "notmodified" )
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div/>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						res.responseText );
+
+				if( callback )
+					self.each( callback, [res.responseText, status, res] );
+			}
+		});
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param(this.serializeArray());
+	},
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray(this.elements) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				(this.checked || /select|textarea/i.test(this.nodeName) ||
+					/text|hidden|password|search/i.test(this.type));
+		})
+		.map(function(i, elem){
+			var val = jQuery(this).val();
+			return val == null ? null :
+				jQuery.isArray(val) ?
+					jQuery.map( val, function(val, i){
+						return {name: elem.name, value: val};
+					}) :
+					{name: elem.name, value: val};
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
+	jQuery.fn[o] = function(f){
+		return this.bind(o, f);
+	};
+});
+
+var jsc = now();
+
+jQuery.extend({
+  
+	get: function( url, data, callback, type ) {
+		// shift arguments if data argument was ommited
+		if ( jQuery.isFunction( data ) ) {
+			callback = data;
+			data = null;
+		}
+
+		return jQuery.ajax({
+			type: "GET",
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get(url, null, callback, "script");
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get(url, data, callback, "json");
+	},
+
+	post: function( url, data, callback, type ) {
+		if ( jQuery.isFunction( data ) ) {
+			callback = data;
+			data = {};
+		}
+
+		return jQuery.ajax({
+			type: "POST",
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	},
+
+	ajaxSetup: function( settings ) {
+		jQuery.extend( jQuery.ajaxSettings, settings );
+	},
+
+	ajaxSettings: {
+		url: location.href,
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		username: null,
+		password: null,
+		*/
+		// Create the request object; Microsoft failed to properly
+		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
+		// This function can be overriden by calling jQuery.ajaxSetup
+		xhr:function(){
+			return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
+		},
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			script: "text/javascript, application/javascript",
+			json: "application/json, text/javascript",
+			text: "text/plain",
+			_default: "*/*"
+		}
+	},
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+
+	ajax: function( s ) {
+		// Extend the settings, but re-extend 's' so that it can be
+		// checked again later (in the test suite, specifically)
+		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
+
+		var jsonp, jsre = /=\?(&|$)/g, status, data,
+			type = s.type.toUpperCase();
+
+		// convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" )
+			s.data = jQuery.param(s.data);
+
+		// Handle JSONP Parameter Callbacks
+		if ( s.dataType == "jsonp" ) {
+			if ( type == "GET" ) {
+				if ( !s.url.match(jsre) )
+					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+			} else if ( !s.data || !s.data.match(jsre) )
+				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+			s.dataType = "json";
+		}
+
+		// Build temporary JSONP function
+		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
+			jsonp = "jsonp" + jsc++;
+
+			// Replace the =? sequence both in the query string and the data
+			if ( s.data )
+				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+			// We need to make sure
+			// that a JSONP style response is executed properly
+			s.dataType = "script";
+
+			// Handle JSONP-style loading
+			window[ jsonp ] = function(tmp){
+				data = tmp;
+				success();
+				complete();
+				// Garbage collect
+				window[ jsonp ] = undefined;
+				try{ delete window[ jsonp ]; } catch(e){}
+				if ( head )
+					head.removeChild( script );
+			};
+		}
+
+		if ( s.dataType == "script" && s.cache == null )
+			s.cache = false;
+
+		if ( s.cache === false && type == "GET" ) {
+			var ts = now();
+			// try replacing _= if it is there
+			var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
+			// if nothing was replaced, add timestamp to the end
+			s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
+		}
+
+		// If data is available, append data to url for get requests
+		if ( s.data && type == "GET" ) {
+			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
+
+			// IE likes to send both get and post data, prevent this
+			s.data = null;
+		}
+
+		// Watch for a new set of requests
+		if ( s.global && ! jQuery.active++ )
+			jQuery.event.trigger( "ajaxStart" );
+
+		// Matches an absolute URL, and saves the domain
+		var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
+
+		// If we're requesting a remote document
+		// and trying to load JSON or Script with a GET
+		if ( s.dataType == "script" && type == "GET" && parts
+			&& ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
+
+			var head = document.getElementsByTagName("head")[0];
+			var script = document.createElement("script");
+			script.src = s.url;
+			if (s.scriptCharset)
+				script.charset = s.scriptCharset;
+
+			// Handle Script loading
+			if ( !jsonp ) {
+				var done = false;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function(){
+					if ( !done && (!this.readyState ||
+							this.readyState == "loaded" || this.readyState == "complete") ) {
+						done = true;
+						success();
+						complete();
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+						head.removeChild( script );
+					}
+				};
+			}
+
+			head.appendChild(script);
+
+			// We handle everything using the script element injection
+			return undefined;
+		}
+
+		var requestDone = false;
+
+		// Create the request object
+		var xhr = s.xhr();
+
+		// Open the socket
+		// Passing null username, generates a login popup on Opera (#2865)
+		if( s.username )
+			xhr.open(type, s.url, s.async, s.username, s.password);
+		else
+			xhr.open(type, s.url, s.async);
+
+		// Need an extra try/catch for cross domain requests in Firefox 3
+		try {
+			// Set the correct header, if data is being sent
+			if ( s.data )
+				xhr.setRequestHeader("Content-Type", s.contentType);
+
+			// Set the If-Modified-Since header, if ifModified mode.
+			if ( s.ifModified )
+				xhr.setRequestHeader("If-Modified-Since",
+					jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
+
+			// Set header so the called script knows that it's an XMLHttpRequest
+			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+
+			// Set the Accepts header for the server, depending on the dataType
+			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
+				s.accepts[ s.dataType ] + ", */*" :
+				s.accepts._default );
+		} catch(e){}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
+			// Handle the global AJAX counter
+			if ( s.global && ! --jQuery.active )
+				jQuery.event.trigger( "ajaxStop" );
+			// close opended socket
+			xhr.abort();
+			return false;
+		}
+
+		if ( s.global )
+			jQuery.event.trigger("ajaxSend", [xhr, s]);
+
+		// Wait for a response to come back
+		var onreadystatechange = function(isTimeout){
+			// The request was aborted, clear the interval and decrement jQuery.active
+			if (xhr.readyState == 0) {
+				if (ival) {
+					// clear poll interval
+					clearInterval(ival);
+					ival = null;
+					// Handle the global AJAX counter
+					if ( s.global && ! --jQuery.active )
+						jQuery.event.trigger( "ajaxStop" );
+				}
+			// The transfer is complete and the data is available, or the request timed out
+			} else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
+				requestDone = true;
+
+				// clear poll interval
+				if (ival) {
+					clearInterval(ival);
+					ival = null;
+				}
+
+				status = isTimeout == "timeout" ? "timeout" :
+					!jQuery.httpSuccess( xhr ) ? "error" :
+					s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
+					"success";
+
+				if ( status == "success" ) {
+					// Watch for, and catch, XML document parse errors
+					try {
+						// process the data (runs the xml through httpData regardless of callback)
+						data = jQuery.httpData( xhr, s.dataType, s );
+					} catch(e) {
+						status = "parsererror";
+					}
+				}
+
+				// Make sure that the request was successful or notmodified
+				if ( status == "success" ) {
+					// Cache Last-Modified header, if ifModified mode.
+					var modRes;
+					try {
+						modRes = xhr.getResponseHeader("Last-Modified");
+					} catch(e) {} // swallow exception thrown by FF if header is not available
+
+					if ( s.ifModified && modRes )
+						jQuery.lastModified[s.url] = modRes;
+
+					// JSONP handles its own success callback
+					if ( !jsonp )
+						success();
+				} else
+					jQuery.handleError(s, xhr, status);
+
+				// Fire the complete handlers
+				complete();
+
+				if ( isTimeout )
+					xhr.abort();
+
+				// Stop memory leaks
+				if ( s.async )
+					xhr = null;
+			}
+		};
+
+		if ( s.async ) {
+			// don't attach the handler to the request, just poll it instead
+			var ival = setInterval(onreadystatechange, 13);
+
+			// Timeout checker
+			if ( s.timeout > 0 )
+				setTimeout(function(){
+					// Check to see if the request is still happening
+					if ( xhr && !requestDone )
+						onreadystatechange( "timeout" );
+				}, s.timeout);
+		}
+
+		// Send the data
+		try {
+			xhr.send(s.data);
+		} catch(e) {
+			jQuery.handleError(s, xhr, null, e);
+		}
+
+		// firefox 1.5 doesn't fire statechange for sync requests
+		if ( !s.async )
+			onreadystatechange();
+
+		function success(){
+			// If a local callback was specified, fire it and pass it the data
+			if ( s.success )
+				s.success( data, status );
+
+			// Fire the global callback
+			if ( s.global )
+				jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
+		}
+
+		function complete(){
+			// Process result
+			if ( s.complete )
+				s.complete(xhr, status);
+
+			// The request was completed
+			if ( s.global )
+				jQuery.event.trigger( "ajaxComplete", [xhr, s] );
+
+			// Handle the global AJAX counter
+			if ( s.global && ! --jQuery.active )
+				jQuery.event.trigger( "ajaxStop" );
+		}
+
+		// return XMLHttpRequest to allow aborting the request etc.
+		return xhr;
+	},
+
+	handleError: function( s, xhr, status, e ) {
+		// If a local callback was specified, fire it
+		if ( s.error ) s.error( xhr, status, e );
+
+		// Fire the global callback
+		if ( s.global )
+			jQuery.event.trigger( "ajaxError", [xhr, s, e] );
+	},
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Determines if an XMLHttpRequest was successful or not
+	httpSuccess: function( xhr ) {
+		try {
+			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
+			return !xhr.status && location.protocol == "file:" ||
+				( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
+		} catch(e){}
+		return false;
+	},
+
+	// Determines if an XMLHttpRequest returns NotModified
+	httpNotModified: function( xhr, url ) {
+		try {
+			var xhrRes = xhr.getResponseHeader("Last-Modified");
+
+			// Firefox always returns 200. check Last-Modified date
+			return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
+		} catch(e){}
+		return false;
+	},
+
+	httpData: function( xhr, type, s ) {
+		var ct = xhr.getResponseHeader("content-type"),
+			xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
+			data = xml ? xhr.responseXML : xhr.responseText;
+
+		if ( xml && data.documentElement.tagName == "parsererror" )
+			throw "parsererror";
+			
+		// Allow a pre-filtering function to sanitize the response
+		// s != null is checked to keep backwards compatibility
+		if( s && s.dataFilter )
+			data = s.dataFilter( data, type );
+
+		// The filter can actually parse the response
+		if( typeof data === "string" ){
+
+			// If the type is "script", eval it in global context
+			if ( type == "script" )
+				jQuery.globalEval( data );
+
+			// Get the JavaScript object, if JSON is used.
+			if ( type == "json" )
+				data = window["eval"]("(" + data + ")");
+		}
+		
+		return data;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a ) {
+		var s = [ ];
+
+		function add( key, value ){
+			s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
+		};
+
+		// If an array was passed in, assume that it is an array
+		// of form elements
+		if ( jQuery.isArray(a) || a.jquery )
+			// Serialize the form elements
+			jQuery.each( a, function(){
+				add( this.name, this.value );
+			});
+
+		// Otherwise, assume that it's an object of key/value pairs
+		else
+			// Serialize the key/values
+			for ( var j in a )
+				// If the value is an array then the key names need to be repeated
+				if ( jQuery.isArray(a[j]) )
+					jQuery.each( a[j], function(){
+						add( j, this );
+					});
+				else
+					add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
+
+		// Return the resulting serialization
+		return s.join("&").replace(/%20/g, "+");
+	}
+
+});
+var elemdisplay = {},
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	];
+
+function genFx( type, num ){
+	var obj = {};
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
+		obj[ this ] = type;
+	});
+	return obj;
+}
+
+jQuery.fn.extend({
+	show: function(speed,callback){
+		if ( speed ) {
+			return this.animate( genFx("show", 3), speed, callback);
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ){
+				var old = jQuery.data(this[i], "olddisplay");
+				
+				this[i].style.display = old || "";
+				
+				if ( jQuery.css(this[i], "display") === "none" ) {
+					var tagName = this[i].tagName, display;
+					
+					if ( elemdisplay[ tagName ] ) {
+						display = elemdisplay[ tagName ];
+					} else {
+						var elem = jQuery("<" + tagName + " />").appendTo("body");
+						
+						display = elem.css("display");
+						if ( display === "none" )
+							display = "block";
+						
+						elem.remove();
+						
+						elemdisplay[ tagName ] = display;
+					}
+					
+					jQuery.data(this[i], "olddisplay", display);
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( var i = 0, l = this.length; i < l; i++ ){
+				this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
+			}
+			
+			return this;
+		}
+	},
+
+	hide: function(speed,callback){
+		if ( speed ) {
+			return this.animate( genFx("hide", 3), speed, callback);
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ){
+				var old = jQuery.data(this[i], "olddisplay");
+				if ( !old && old !== "none" )
+					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( var i = 0, l = this.length; i < l; i++ ){
+				this[i].style.display = "none";
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2 ){
+		var bool = typeof fn === "boolean";
+
+		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
+			this._toggle.apply( this, arguments ) :
+			fn == null || bool ?
+				this.each(function(){
+					var state = bool ? fn : jQuery(this).is(":hidden");
+					jQuery(this)[ state ? "show" : "hide" ]();
+				}) :
+				this.animate(genFx("toggle", 3), fn, fn2);
+	},
+
+	fadeTo: function(speed,to,callback){
+		return this.animate({opacity: to}, speed, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		return this[ optall.queue === false ? "each" : "queue" ](function(){
+		
+			var opt = jQuery.extend({}, optall), p,
+				hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
+				self = this;
+	
+			for ( p in prop ) {
+				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
+					return opt.complete.call(this);
+
+				if ( ( p == "height" || p == "width" ) && this.style ) {
+					// Store display property
+					opt.display = jQuery.css(this, "display");
+
+					// Make sure that nothing sneaks out
+					opt.overflow = this.style.overflow;
+				}
+			}
+
+			if ( opt.overflow != null )
+				this.style.overflow = "hidden";
+
+			opt.curAnim = jQuery.extend({}, prop);
+
+			jQuery.each( prop, function(name, val){
+				var e = new jQuery.fx( self, opt, name );
+
+				if ( /toggle|show|hide/.test(val) )
+					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+				else {
+					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
+						start = e.cur(true) || 0;
+
+					if ( parts ) {
+						var end = parseFloat(parts[2]),
+							unit = parts[3] || "px";
+
+						// We need to compute starting value
+						if ( unit != "px" ) {
+							self.style[ name ] = (end || 1) + unit;
+							start = ((end || 1) / e.cur(true)) * start;
+							self.style[ name ] = start + unit;
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] )
+							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
+
+						e.custom( start, end, unit );
+					} else
+						e.custom( start, val, "" );
+				}
+			});
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function(clearQueue, gotoEnd){
+		var timers = jQuery.timers;
+
+		if (clearQueue)
+			this.queue([]);
+
+		this.each(function(){
+			// go in reverse order so anything added to the queue during the loop is ignored
+			for ( var i = timers.length - 1; i >= 0; i-- )
+				if ( timers[i].elem == this ) {
+					if (gotoEnd)
+						// force the next step to be the last
+						timers[i](true);
+					timers.splice(i, 1);
+				}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if (!gotoEnd)
+			this.dequeue();
+
+		return this;
+	}
+
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" }
+}, function( name, props ){
+	jQuery.fn[ name ] = function( speed, callback ){
+		return this.animate( props, speed, callback );
+	};
+});
+
+jQuery.extend({
+
+	speed: function(speed, easing, fn) {
+		var opt = typeof speed === "object" ? speed : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function(){
+			if ( opt.queue !== false )
+				jQuery(this).dequeue();
+			if ( jQuery.isFunction( opt.old ) )
+				opt.old.call( this );
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ){
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		if ( !options.orig )
+			options.orig = {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+
+	// Simple function for setting a style value
+	update: function(){
+		if ( this.options.step )
+			this.options.step.call( this.elem, this.now, this );
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+
+		// Set display property to block for height/width animations
+		if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
+			this.elem.style.display = "block";
+	},
+
+	// Get the current size
+	cur: function(force){
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
+			return this.elem[ this.prop ];
+
+		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
+		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
+	},
+
+	// Start an animation from one number to another
+	custom: function(from, to, unit){
+		this.startTime = now();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || "px";
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		var self = this;
+		function t(gotoEnd){
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval(function(){
+				var timers = jQuery.timers;
+
+				for ( var i = 0; i < timers.length; i++ )
+					if ( !timers[i]() )
+						timers.splice(i--, 1);
+
+				if ( !timers.length ) {
+					clearInterval( timerId );
+					timerId = undefined;
+				}
+			}, 13);
+		}
+	},
+
+	// Simple 'show' function
+	show: function(){
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery(this.elem).show();
+	},
+
+	// Simple 'hide' function
+	hide: function(){
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function(gotoEnd){
+		var t = now();
+
+		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			this.options.curAnim[ this.prop ] = true;
+
+			var done = true;
+			for ( var i in this.options.curAnim )
+				if ( this.options.curAnim[i] !== true )
+					done = false;
+
+			if ( done ) {
+				if ( this.options.display != null ) {
+					// Reset the overflow
+					this.elem.style.overflow = this.options.overflow;
+
+					// Reset the display
+					this.elem.style.display = this.options.display;
+					if ( jQuery.css(this.elem, "display") == "none" )
+						this.elem.style.display = "block";
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( this.options.hide )
+					jQuery(this.elem).hide();
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( this.options.hide || this.options.show )
+					for ( var p in this.options.curAnim )
+						jQuery.attr(this.elem.style, p, this.options.orig[p]);
+					
+				// Execute the complete function
+				this.options.complete.call( this.elem );
+			}
+
+			return false;
+		} else {
+			var n = t - this.startTime;
+			this.state = n / this.options.duration;
+
+			// Perform the easing function, defaults to swing
+			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
+			this.now = this.start + ((this.end - this.start) * this.pos);
+
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+
+};
+
+jQuery.extend( jQuery.fx, {
+	speeds:{
+		slow: 600,
+ 		fast: 200,
+ 		// Default speed
+ 		_default: 400
+	},
+	step: {
+
+		opacity: function(fx){
+			jQuery.attr(fx.elem.style, "opacity", fx.now);
+		},
+
+		_default: function(fx){
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			else
+				fx.elem[ fx.prop ] = fx.now;
+		}
+	}
+});
+if ( document.documentElement["getBoundingClientRect"] )
+	jQuery.fn.offset = function() {
+		if ( !this[0] ) return { top: 0, left: 0 };
+		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
+		var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
+			clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
+			left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
+		return { top: top, left: left };
+	};
+else 
+	jQuery.fn.offset = function() {
+		if ( !this[0] ) return { top: 0, left: 0 };
+		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
+		jQuery.offset.initialized || jQuery.offset.initialize();
+
+		var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
+			doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
+			body = doc.body, defaultView = doc.defaultView,
+			prevComputedStyle = defaultView.getComputedStyle(elem, null),
+			top = elem.offsetTop, left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			computedStyle = defaultView.getComputedStyle(elem, null);
+			top -= elem.scrollTop, left -= elem.scrollLeft;
+			if ( elem === offsetParent ) {
+				top += elem.offsetTop, left += elem.offsetLeft;
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
+					top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
+					left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
+				prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
+			}
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
+				top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
+				left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
+			top  += body.offsetTop,
+			left += body.offsetLeft;
+
+		if ( prevComputedStyle.position === "fixed" )
+			top  += Math.max(docElem.scrollTop, body.scrollTop),
+			left += Math.max(docElem.scrollLeft, body.scrollLeft);
+
+		return { top: top, left: left };
+	};
+
+jQuery.offset = {
+	initialize: function() {
+		if ( this.initialized ) return;
+		var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
+			html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
+
+		rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
+		for ( prop in rules ) container.style[prop] = rules[prop];
+
+		container.innerHTML = html;
+		body.insertBefore(container, body.firstChild);
+		innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		body.style.marginTop = '1px';
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
+		body.style.marginTop = bodyMarginTop;
+
+		body.removeChild(container);
+		this.initialized = true;
+	},
+
+	bodyOffset: function(body) {
+		jQuery.offset.initialized || jQuery.offset.initialize();
+		var top = body.offsetTop, left = body.offsetLeft;
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
+			top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
+			left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
+		return { top: top, left: left };
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		var left = 0, top = 0, results;
+
+		if ( this[0] ) {
+			// Get *real* offsetParent
+			var offsetParent = this.offsetParent(),
+
+			// Get correct offsets
+			offset       = this.offset(),
+			parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+			// Subtract element margins
+			// note: when an element has margin: auto the offsetLeft and marginLeft 
+			// are the same in Safari causing offset.left to incorrectly be 0
+			offset.top  -= num( this, 'marginTop'  );
+			offset.left -= num( this, 'marginLeft' );
+
+			// Add offsetParent borders
+			parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
+			parentOffset.left += num( offsetParent, 'borderLeftWidth' );
+
+			// Subtract the two offsets
+			results = {
+				top:  offset.top  - parentOffset.top,
+				left: offset.left - parentOffset.left
+			};
+		}
+
+		return results;
+	},
+
+	offsetParent: function() {
+		var offsetParent = this[0].offsetParent || document.body;
+		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
+			offsetParent = offsetParent.offsetParent;
+		return jQuery(offsetParent);
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ['Left', 'Top'], function(i, name) {
+	var method = 'scroll' + name;
+	
+	jQuery.fn[ method ] = function(val) {
+		if (!this[0]) return null;
+
+		return val !== undefined ?
+
+			// Set the scroll offset
+			this.each(function() {
+				this == window || this == document ?
+					window.scrollTo(
+						!i ? val : jQuery(window).scrollLeft(),
+						 i ? val : jQuery(window).scrollTop()
+					) :
+					this[ method ] = val;
+			}) :
+
+			// Return the scroll offset
+			this[0] == window || this[0] == document ?
+				self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
+					jQuery.boxModel && document.documentElement[ method ] ||
+					document.body[ method ] :
+				this[0][ method ];
+	};
+});
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function(i, name){
+
+	var tl = i ? "Left"  : "Top",  // top or left
+		br = i ? "Right" : "Bottom", // bottom or right
+		lower = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn["inner" + name] = function(){
+		return this[0] ?
+			jQuery.css( this[0], lower, false, "padding" ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn["outer" + name] = function(margin) {
+		return this[0] ?
+			jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
+			null;
+	};
+	
+	var type = name.toLowerCase();
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		return this[0] == window ?
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
+			document.body[ "client" + name ] :
+
+			// Get document width or height
+			this[0] == document ?
+				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+				Math.max(
+					document.documentElement["client" + name],
+					document.body["scroll" + name], document.documentElement["scroll" + name],
+					document.body["offset" + name], document.documentElement["offset" + name]
+				) :
+
+				// Get or set width or height on the element
+				size === undefined ?
+					// Get width or height on the element
+					(this.length ? jQuery.css( this[0], type ) : null) :
+
+					// Set the width or height on the element (default to pixels if value is unitless)
+					this.css( type, typeof size === "string" ? size : size + "px" );
+	};
+
+});
+})();
Binary file doc/1.0/_static/minus.png has changed
Binary file doc/1.0/_static/plus.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_static/pygments.css	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,61 @@
+.hll { background-color: #ffffcc }
+.c { color: #408090; font-style: italic } /* Comment */
+.err { border: 1px solid #FF0000 } /* Error */
+.k { color: #007020; font-weight: bold } /* Keyword */
+.o { color: #666666 } /* Operator */
+.cm { color: #408090; font-style: italic } /* Comment.Multiline */
+.cp { color: #007020 } /* Comment.Preproc */
+.c1 { color: #408090; font-style: italic } /* Comment.Single */
+.cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.gd { color: #A00000 } /* Generic.Deleted */
+.ge { font-style: italic } /* Generic.Emph */
+.gr { color: #FF0000 } /* Generic.Error */
+.gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.gi { color: #00A000 } /* Generic.Inserted */
+.go { color: #303030 } /* Generic.Output */
+.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.gs { font-weight: bold } /* Generic.Strong */
+.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.gt { color: #0040D0 } /* Generic.Traceback */
+.kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.kp { color: #007020 } /* Keyword.Pseudo */
+.kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.kt { color: #902000 } /* Keyword.Type */
+.m { color: #208050 } /* Literal.Number */
+.s { color: #4070a0 } /* Literal.String */
+.na { color: #4070a0 } /* Name.Attribute */
+.nb { color: #007020 } /* Name.Builtin */
+.nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.no { color: #60add5 } /* Name.Constant */
+.nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.ne { color: #007020 } /* Name.Exception */
+.nf { color: #06287e } /* Name.Function */
+.nl { color: #002070; font-weight: bold } /* Name.Label */
+.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.nt { color: #062873; font-weight: bold } /* Name.Tag */
+.nv { color: #bb60d5 } /* Name.Variable */
+.ow { color: #007020; font-weight: bold } /* Operator.Word */
+.w { color: #bbbbbb } /* Text.Whitespace */
+.mf { color: #208050 } /* Literal.Number.Float */
+.mh { color: #208050 } /* Literal.Number.Hex */
+.mi { color: #208050 } /* Literal.Number.Integer */
+.mo { color: #208050 } /* Literal.Number.Oct */
+.sb { color: #4070a0 } /* Literal.String.Backtick */
+.sc { color: #4070a0 } /* Literal.String.Char */
+.sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.s2 { color: #4070a0 } /* Literal.String.Double */
+.se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.sh { color: #4070a0 } /* Literal.String.Heredoc */
+.si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.sx { color: #c65d09 } /* Literal.String.Other */
+.sr { color: #235388 } /* Literal.String.Regex */
+.s1 { color: #4070a0 } /* Literal.String.Single */
+.ss { color: #517918 } /* Literal.String.Symbol */
+.bp { color: #007020 } /* Name.Builtin.Pseudo */
+.vc { color: #bb60d5 } /* Name.Variable.Class */
+.vg { color: #bb60d5 } /* Name.Variable.Global */
+.vi { color: #bb60d5 } /* Name.Variable.Instance */
+.il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/_static/searchtools.js	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,467 @@
+/**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words, hlwords is the list of normal, unstemmed
+ * words. the first one is used to find the occurance, the
+ * latter for highlighting it.
+ */
+
+jQuery.makeSearchSummary = function(text, keywords, hlwords) {
+  var textLower = text.toLowerCase();
+  var start = 0;
+  $.each(keywords, function() {
+    var i = textLower.indexOf(this.toLowerCase());
+    if (i > -1)
+      start = i;
+  });
+  start = Math.max(start - 120, 0);
+  var excerpt = ((start > 0) ? '...' : '') +
+  $.trim(text.substr(start, 240)) +
+  ((start + 240 - text.length) ? '...' : '');
+  var rv = $('<div class="context"></div>').text(excerpt);
+  $.each(hlwords, function() {
+    rv = rv.highlightText(this, 'highlight');
+  });
+  return rv;
+}
+
+/**
+ * Porter Stemmer
+ */
+var PorterStemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
+
+/**
+ * Search Module
+ */
+var Search = {
+
+  _index : null,
+  _queued_query : null,
+  _pulse_status : -1,
+
+  init : function() {
+      var params = $.getQueryParameters();
+      if (params.q) {
+          var query = params.q[0];
+          $('input[name="q"]')[0].value = query;
+          this.performSearch(query);
+      }
+  },
+
+  /**
+   * Sets the index
+   */
+  setIndex : function(index) {
+    var q;
+    this._index = index;
+    if ((q = this._queued_query) !== null) {
+      this._queued_query = null;
+      Search.query(q);
+    }
+  },
+
+  hasIndex : function() {
+      return this._index !== null;
+  },
+
+  deferQuery : function(query) {
+      this._queued_query = query;
+  },
+
+  stopPulse : function() {
+      this._pulse_status = 0;
+  },
+
+  startPulse : function() {
+    if (this._pulse_status >= 0)
+        return;
+    function pulse() {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      var dotString = '';
+      for (var i = 0; i < Search._pulse_status; i++)
+        dotString += '.';
+      Search.dots.text(dotString);
+      if (Search._pulse_status > -1)
+        window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something
+   */
+  performSearch : function(query) {
+    // create the required interface elements
+    this.out = $('#search-results');
+    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+    this.dots = $('<span></span>').appendTo(this.title);
+    this.status = $('<p style="display: none"></p>').appendTo(this.out);
+    this.output = $('<ul class="search"/>').appendTo(this.out);
+
+    $('#search-progress').text(_('Preparing search...'));
+    this.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (this.hasIndex())
+      this.query(query);
+    else
+      this.deferQuery(query);
+  },
+
+  query : function(query) {
+    // stem the searchterms and add them to the
+    // correct list
+    var stemmer = new PorterStemmer();
+    var searchterms = [];
+    var excluded = [];
+    var hlterms = [];
+    var tmp = query.split(/\s+/);
+    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+    for (var i = 0; i < tmp.length; i++) {
+      // stem the word
+      var word = stemmer.stemWord(tmp[i]).toLowerCase();
+      // select the correct list
+      if (word[0] == '-') {
+        var toAppend = excluded;
+        word = word.substr(1);
+      }
+      else {
+        var toAppend = searchterms;
+        hlterms.push(tmp[i].toLowerCase());
+      }
+      // only add if not already in the list
+      if (!$.contains(toAppend, word))
+        toAppend.push(word);
+    };
+    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+    console.debug('SEARCH: searching for:');
+    console.info('required: ', searchterms);
+    console.info('excluded: ', excluded);
+
+    // prepare search
+    var filenames = this._index.filenames;
+    var titles = this._index.titles;
+    var terms = this._index.terms;
+    var descrefs = this._index.descrefs;
+    var modules = this._index.modules;
+    var desctypes = this._index.desctypes;
+    var fileMap = {};
+    var files = null;
+    var objectResults = [];
+    var regularResults = [];
+    $('#search-progress').empty();
+
+    // lookup as object
+    if (object != null) {
+      for (var module in modules) {
+        if (module.indexOf(object) > -1) {
+          fn = modules[module];
+          descr = _('module, in ') + titles[fn];
+          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
+        }
+      }
+      for (var prefix in descrefs) {
+        for (var name in descrefs[prefix]) {
+          var fullname = (prefix ? prefix + '.' : '') + name;
+          if (fullname.toLowerCase().indexOf(object) > -1) {
+            match = descrefs[prefix][name];
+            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
+            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
+          }
+        }
+      }
+    }
+
+    // sort results descending
+    objectResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+
+    // perform the search on the required terms
+    for (var i = 0; i < searchterms.length; i++) {
+      var word = searchterms[i];
+      // no match but word was a required one
+      if ((files = terms[word]) == null)
+        break;
+      if (files.length == undefined) {
+        files = [files];
+      }
+      // create the mapping
+      for (var j = 0; j < files.length; j++) {
+        var file = files[j];
+        if (file in fileMap)
+          fileMap[file].push(word);
+        else
+          fileMap[file] = [word];
+      }
+    }
+
+    // now check if the files don't contain excluded terms
+    for (var file in fileMap) {
+      var valid = true;
+
+      // check if all requirements are matched
+      if (fileMap[file].length != searchterms.length)
+        continue;
+
+      // ensure that none of the excluded terms is in the
+      // search result.
+      for (var i = 0; i < excluded.length; i++) {
+        if (terms[excluded[i]] == file ||
+            $.contains(terms[excluded[i]] || [], file)) {
+          valid = false;
+          break;
+        }
+      }
+
+      // if we have still a valid result we can add it
+      // to the result list
+      if (valid)
+        regularResults.push([filenames[file], titles[file], '', null]);
+    }
+
+    // delete unused variables in order to not waste
+    // memory until list is retrieved completely
+    delete filenames, titles, terms;
+
+    // now sort the regular results descending by title
+    regularResults.sort(function(a, b) {
+      var left = a[1].toLowerCase();
+      var right = b[1].toLowerCase();
+      return (left > right) ? -1 : ((left < right) ? 1 : 0);
+    });
+
+    // combine both
+    var results = regularResults.concat(objectResults);
+
+    // print the results
+    var resultCount = results.length;
+    function displayNextItem() {
+      // results left, load the summary and display it
+      if (results.length) {
+        var item = results.pop();
+        var listItem = $('<li style="display:none"></li>');
+        listItem.append($('<a/>').attr(
+          'href',
+          item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+          highlightstring + item[2]).html(item[1]));
+        if (item[3]) {
+          listItem.append($('<span> (' + item[3] + ')</span>'));
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          $.get('_sources/' + item[0] + '.txt', function(data) {
+            listItem.append($.makeSearchSummary(data, searchterms, hlterms));
+            Search.output.append(listItem);
+            listItem.slideDown(5, function() {
+              displayNextItem();
+            });
+          });
+        } else {
+          // no source available, just display title
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        }
+      }
+      // search finished, update title and status message
+      else {
+        Search.stopPulse();
+        Search.title.text(_('Search Results'));
+        if (!resultCount)
+          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+        else
+            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+        Search.status.fadeIn(500);
+      }
+    }
+    displayNextItem();
+  }
+}
+
+$(document).ready(function() {
+  Search.init();
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/active.html	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,259 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>A Thresholdbased Actively Secure Runtime &mdash; VIFF v1.0 documentation</title>
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '1.0',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="VIFF v1.0 documentation" href="index.html" />
+    <link rel="up" title="Implementation" href="implementation.html" />
+    <link rel="next" title="Paillier Crypto System" href="paillier.html" />
+    <link rel="prev" title="Passive Secure Protocols" href="passive.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             accesskey="M">modules</a> |</li>
+        <li class="right" >
+          <a href="paillier.html" title="Paillier Crypto System"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="passive.html" title="Passive Secure Protocols"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li>
+          <li><a href="implementation.html" accesskey="U">Implementation</a> &raquo;</li> 
+      </ul>
+    </div>  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="module-viff.active">
+<h1>A Thresholdbased Actively Secure Runtime<a class="headerlink" href="#module-viff.active" title="Permalink to this headline">¶</a></h1>
+<p>A thresholdbased actively secure runtime.</p>
+<dl class="class">
+<dt id="viff.active.ActiveRuntime">
+<em class="property">class </em><tt class="descclassname">viff.active.</tt><tt class="descname">ActiveRuntime</tt><big>(</big><em>player</em>, <em>threshold</em>, <em>options=None</em><big>)</big><a class="headerlink" href="#viff.active.ActiveRuntime" title="Permalink to this definition">¶</a></dt>
+<dd><p>Default mix of <a title="viff.active.BasicActiveRuntime" class="reference internal" href="#viff.active.BasicActiveRuntime"><tt class="xref docutils literal"><span class="pre">BasicActiveRuntime</span></tt></a> and
+<a title="viff.active.TriplesPRSSMixin" class="reference internal" href="#viff.active.TriplesPRSSMixin"><tt class="xref docutils literal"><span class="pre">TriplesPRSSMixin</span></tt></a>.</p>
+<p class="graphviz">
+<img src="_images/inheritance-f7c2db767443475744b3ae547d2bc944089e46df.png" alt="digraph inheritance829e2e2490 {
+rankdir=LR;
+size=&quot;8.0, 12.0&quot;;
+  &quot;TriplesPRSSMixin&quot; [style=&quot;setlinewidth(0.5)&quot;,URL=&quot;#viff.active.TriplesPRSSMixin&quot;,fontname=Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans,height=0.25,shape=box,fontsize=10];
+  &quot;Runtime&quot; [style=&quot;setlinewidth(0.5)&quot;,URL=&quot;runtime.html#viff.runtime.Runtime&quot;,fontname=Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans,height=0.25,shape=box,fontsize=10];
+  &quot;PassiveRuntime&quot; [style=&quot;setlinewidth(0.5)&quot;,URL=&quot;passive.html#viff.passive.PassiveRuntime&quot;,fontname=Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans,height=0.25,shape=box,fontsize=10];
+  &quot;Runtime&quot; -&gt; &quot;PassiveRuntime&quot; [arrowsize=0.5,style=&quot;setlinewidth(0.5)&quot;];
+  &quot;ActiveRuntime&quot; [style=&quot;setlinewidth(0.5)&quot;,URL=&quot;#viff.active.ActiveRuntime&quot;,fontname=Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans,height=0.25,shape=box,fontsize=10];
+  &quot;TriplesPRSSMixin&quot; -&gt; &quot;ActiveRuntime&quot; [arrowsize=0.5,style=&quot;setlinewidth(0.5)&quot;];
+  &quot;BasicActiveRuntime&quot; -&gt; &quot;ActiveRuntime&quot; [arrowsize=0.5,style=&quot;setlinewidth(0.5)&quot;];
+  &quot;BasicActiveRuntime&quot; [style=&quot;setlinewidth(0.5)&quot;,URL=&quot;#viff.active.BasicActiveRuntime&quot;,fontname=Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans,height=0.25,shape=box,fontsize=10];
+  &quot;PassiveRuntime&quot; -&gt; &quot;BasicActiveRuntime&quot; [arrowsize=0.5,style=&quot;setlinewidth(0.5)&quot;];
+}" usemap="#inheritance829e2e2490" class="inheritance"/>
+<map id="inheritance829e2e2490" name="inheritance829e2e2490">
+<area shape="rect" href="#viff.active.TriplesPRSSMixin" title="TriplesPRSSMixin" alt="" coords="307,5,432,32"/>
+<area shape="rect" href="#viff.active.ActiveRuntime" title="ActiveRuntime" alt="" coords="491,31,603,57"/>
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="7,56,79,83"/>
+<area shape="rect" href="passive.html#viff.passive.PassiveRuntime" title="PassiveRuntime" alt="" coords="128,56,248,83"/>
+<area shape="rect" href="#viff.active.BasicActiveRuntime" title="BasicActiveRuntime" alt="" coords="296,56,443,83"/>
+</map>
+</p>
+</dd></dl>
+
+<dl class="class">
+<dt id="viff.active.BasicActiveRuntime">
+<em class="property">class </em><tt class="descclassname">viff.active.</tt><tt class="descname">BasicActiveRuntime</tt><big>(</big><em>player</em>, <em>threshold</em>, <em>options=None</em><big>)</big><a class="headerlink" href="#viff.active.BasicActiveRuntime" title="Permalink to this definition">¶</a></dt>
+<dd><p>Basic runtime secure against active adversaries.</p>
+<p>This class depends on either
+<a title="viff.active.TriplesHyperinvertibleMatricesMixin" class="reference internal" href="#viff.active.TriplesHyperinvertibleMatricesMixin"><tt class="xref docutils literal"><span class="pre">TriplesHyperinvertibleMatricesMixin</span></tt></a> or
+<a title="viff.active.TriplesPRSSMixin" class="reference internal" href="#viff.active.TriplesPRSSMixin"><tt class="xref docutils literal"><span class="pre">TriplesPRSSMixin</span></tt></a> to provide a <tt class="xref docutils literal"><span class="pre">get_triple()</span></tt> method.</p>
+<p>Instead of using this class directly, one should probably use
+<a title="viff.active.ActiveRuntime" class="reference internal" href="#viff.active.ActiveRuntime"><tt class="xref docutils literal"><span class="pre">ActiveRuntime</span></tt></a> instead.</p>
+<p class="graphviz">
+<img src="_images/inheritance-dddf3179ae903542cb3ed4a0482b6c7fbc22df8b.png" alt="digraph inheritance3685e35c7f {
+rankdir=LR;
+size=&quot;8.0, 12.0&quot;;
+  &quot;PassiveRuntime&quot; [style=&quot;setlinewidth(0.5)&quot;,URL=&quot;passive.html#viff.passive.PassiveRuntime&quot;,fontname=Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans,height=0.25,shape=box,fontsize=10];
+  &quot;Runtime&quot; -&gt; &quot;PassiveRuntime&quot; [arrowsize=0.5,style=&quot;setlinewidth(0.5)&quot;];
+  &quot;Runtime&quot; [style=&quot;setlinewidth(0.5)&quot;,URL=&quot;runtime.html#viff.runtime.Runtime&quot;,fontname=Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans,height=0.25,shape=box,fontsize=10];
+  &quot;BasicActiveRuntime&quot; [style=&quot;setlinewidth(0.5)&quot;,URL=&quot;#viff.active.BasicActiveRuntime&quot;,fontname=Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans,height=0.25,shape=box,fontsize=10];
+  &quot;PassiveRuntime&quot; -&gt; &quot;BasicActiveRuntime&quot; [arrowsize=0.5,style=&quot;setlinewidth(0.5)&quot;];
+}" usemap="#inheritance3685e35c7f" class="inheritance"/>
+<map id="inheritance3685e35c7f" name="inheritance3685e35c7f">
+<area shape="rect" href="passive.html#viff.passive.PassiveRuntime" title="PassiveRuntime" alt="" coords="128,5,248,32"/>
+<area shape="rect" href="#viff.active.BasicActiveRuntime" title="BasicActiveRuntime" alt="" coords="296,5,443,32"/>
+<area shape="rect" href="runtime.html#viff.runtime.Runtime" title="Runtime" alt="" coords="7,5,79,32"/>
+</map>
+</p>
+<dl class="method">
+<dt id="viff.active.BasicActiveRuntime.mul">
+<tt class="descname">mul</tt><big>(</big><em>share_x</em>, <em>share_y</em><big>)</big><a class="headerlink" href="#viff.active.BasicActiveRuntime.mul" title="Permalink to this definition">¶</a></dt>
+<dd><p>Multiplication of shares.</p>
+<p>Preprocessing: 1 multiplication triple.
+Communication: 2 openings.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="viff.active.BrachaBroadcastMixin">
+<em class="property">class </em><tt class="descclassname">viff.active.</tt><tt class="descname">BrachaBroadcastMixin</tt><a class="headerlink" href="#viff.active.BrachaBroadcastMixin" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bracha broadcast mixin class. This mixin class adds a
+<a title="viff.active.BrachaBroadcastMixin.broadcast" class="reference internal" href="#viff.active.BrachaBroadcastMixin.broadcast"><tt class="xref docutils literal"><span class="pre">broadcast()</span></tt></a> method which can be used for a reliable
+broadcast.</p>
+<dl class="method">
+<dt id="viff.active.BrachaBroadcastMixin.broadcast">
+<tt class="descname">broadcast</tt><big>(</big><em>senders</em>, <em>message=None</em><big>)</big><a class="headerlink" href="#viff.active.BrachaBroadcastMixin.broadcast" title="Permalink to this definition">¶</a></dt>
+<dd><p>Perform one or more Bracha broadcast(s).</p>
+<p>The list of <em>senders</em> given will determine the subset of players
+who wish to broadcast a message. If this player wishes to
+broadcast, its ID must be in the list of senders and the
+optional <em>message</em> parameter must be used.</p>
+<p>If the list of senders consists only of a single sender, the
+result will be a single element, otherwise it will be a list.</p>
+<p>A Bracha broadcast is reliable against an active adversary
+corrupting up to t &lt; n/3 of the players. For more details, see
+the paper &#8220;An asynchronous [(n-1)/3]-resilient consensus
+protocol&#8221; by G. Bracha in Proc. 3rd ACM Symposium on
+Principles of Distributed Computing, 1984, pages 154-162.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="viff.active.TriplesHyperinvertibleMatricesMixin">
+<em class="property">class </em><tt class="descclassname">viff.active.</tt><tt class="descname">TriplesHyperinvertibleMatricesMixin</tt><a class="headerlink" href="#viff.active.TriplesHyperinvertibleMatricesMixin" title="Permalink to this definition">¶</a></dt>
+<dd><p>Mixin class which generates multiplication triples using
+hyperinvertible matrices.</p>
+<dl class="method">
+<dt id="viff.active.TriplesHyperinvertibleMatricesMixin.double_share_random">
+<tt class="descname">double_share_random</tt><big>(</big><em>T</em>, <em>d1</em>, <em>d2</em>, <em>field</em><big>)</big><a class="headerlink" href="#viff.active.TriplesHyperinvertibleMatricesMixin.double_share_random" title="Permalink to this definition">¶</a></dt>
+<dd><p>Double-share a random secret using two polynomials.</p>
+<p>The guarantee is that a number of shares are made and out of
+those, the <em>T</em> that are returned by this method will be correct
+double-sharings of a random number using <em>d1</em> and <em>d2</em> as the
+polynomial degrees.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="viff.active.TriplesHyperinvertibleMatricesMixin.generate_triples">
+<tt class="descname">generate_triples</tt><big>(</big><em>field</em>, <em>quantity=None</em>, <em>gather=True</em><big>)</big><a class="headerlink" href="#viff.active.TriplesHyperinvertibleMatricesMixin.generate_triples" title="Permalink to this definition">¶</a></dt>
+<dd><p>Generate multiplication triples.</p>
+<p>These are random numbers <em>a</em>, <em>b</em>, and <em>c</em> such that <tt class="docutils literal"><span class="pre">c</span> <span class="pre">=</span>
+<span class="pre">ab</span></tt>. This function can be used in pre-processing.</p>
+<p>Returns a tuple with the number of triples generated and a
+Deferred which will yield a list of 3-tuples.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="viff.active.TriplesHyperinvertibleMatricesMixin.single_share_random">
+<tt class="descname">single_share_random</tt><big>(</big><em>T</em>, <em>degree</em>, <em>field</em><big>)</big><a class="headerlink" href="#viff.active.TriplesHyperinvertibleMatricesMixin.single_share_random" title="Permalink to this definition">¶</a></dt>
+<dd><p>Share a random secret.</p>
+<p>The guarantee is that a number of shares are made and out of
+those, the <em>T</em> that are returned by this method will be
+correct sharings of a random number using <em>degree</em> as the
+polynomial degree.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="viff.active.TriplesPRSSMixin">
+<em class="property">class </em><tt class="descclassname">viff.active.</tt><tt class="descname">TriplesPRSSMixin</tt><a class="headerlink" href="#viff.active.TriplesPRSSMixin" title="Permalink to this definition">¶</a></dt>
+<dd><p>Mixin class for generating multiplication triples using PRSS.</p>
+<dl class="method">
+<dt id="viff.active.TriplesPRSSMixin.generate_triples">
+<tt class="descname">generate_triples</tt><big>(</big><em>field</em>, <em>quantity=1</em>, <em>gather=True</em><big>)</big><a class="headerlink" href="#viff.active.TriplesPRSSMixin.generate_triples" title="Permalink to this definition">¶</a></dt>
+<dd><p>Generate <em>quantity</em> multiplication triples using PRSS.</p>
+<p>These are random numbers <em>a</em>, <em>b</em>, and <em>c</em> such that <tt class="docutils literal"><span class="pre">c</span> <span class="pre">=</span>
+<span class="pre">ab</span></tt>. This function can be used in pre-processing.</p>
+<p>Returns a tuple with the number of triples generated and a
+Deferred which will yield a singleton-list with a 3-tuple.</p>
+</dd></dl>
+
+</dd></dl>
+
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+            <h4>Previous topic</h4>
+            <p class="topless"><a href="passive.html"
+                                  title="previous chapter">Passive Secure Protocols</a></p>
+            <h4>Next topic</h4>
+            <p class="topless"><a href="paillier.html"
+                                  title="next chapter">Paillier Crypto System</a></p>
+            <h3>This Page</h3>
+            <ul class="this-page-menu">
+              <li><a href="_sources/active.txt"
+                     rel="nofollow">Show Source</a></li>
+            </ul>
+          <div id="searchbox" style="display: none">
+            <h3>Quick search</h3>
+              <form class="search" action="search.html" method="get">
+                <input type="text" name="q" size="18" />
+                <input type="submit" value="Go" />
+                <input type="hidden" name="check_keywords" value="yes" />
+                <input type="hidden" name="area" value="default" />
+              </form>
+              <p class="searchtip" style="font-size: 90%">
+              Enter search terms or a module, class or function name.
+              </p>
+          </div>
+          <script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="paillier.html" title="Paillier Crypto System"
+             >next</a> |</li>
+        <li class="right" >
+          <a href="passive.html" title="Passive Secure Protocols"
+             >previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li>
+          <li><a href="implementation.html" >Implementation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+      &copy; Copyright 2008, VIFF Development Team.
+      Last updated on Dec 14, 2009.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.3.
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/aes.html	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>AES Module &mdash; VIFF v1.0 documentation</title>
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '1.0',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="VIFF v1.0 documentation" href="index.html" />
+    <link rel="up" title="Implementation" href="implementation.html" />
+    <link rel="next" title="Constants Module" href="constants.html" />
+    <link rel="prev" title="Config Module" href="config.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             accesskey="M">modules</a> |</li>
+        <li class="right" >
+          <a href="constants.html" title="Constants Module"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="config.html" title="Config Module"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li>
+          <li><a href="implementation.html" accesskey="U">Implementation</a> &raquo;</li> 
+      </ul>
+    </div>  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="module-viff.aes">
+<h1>AES Module<a class="headerlink" href="#module-viff.aes" title="Permalink to this headline">¶</a></h1>
+<p>MPC implementation of AES (Rijndael). This module can be used to
+securely compute a secret shared AES encrypted ciphertext of a
+(possibly) secret shared plaintext with a (possibly) secret shared
+key. The inputs have to be given either as a list of shares over GF256
+(byte-wise) or as a string. The runtime has to be able to handle
+shares over GF256. Decryption is not implemented yet.</p>
+<p>The implementation is based on the fact that AES has arithmetic
+properties which makes its computation by arithmetic circuits
+relatively fast.</p>
+<dl class="class">
+<dt id="viff.aes.AES">
+<em class="property">class </em><tt class="descclassname">viff.aes.</tt><tt class="descname">AES</tt><big>(</big><em>runtime</em>, <em>key_size</em>, <em>block_size=128</em>, <em>use_exponentiation=False</em>, <em>quiet=False</em><big>)</big><a class="headerlink" href="#viff.aes.AES" title="Permalink to this definition">¶</a></dt>
+<dd><p>AES instantiation.</p>
+<p>This class is used together with a <a title="viff.runtime.Runtime" class="reference external" href="runtime.html#viff.runtime.Runtime"><tt class="xref docutils literal"><span class="pre">Runtime</span></tt></a>
+object:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">aes</span> <span class="o">=</span> <span class="n">AES</span><span class="p">(</span><span class="n">runtime</span><span class="p">,</span> <span class="mi">192</span><span class="p">)</span>
+<span class="n">cleartext</span> <span class="o">=</span> <span class="p">[</span><span class="n">Share</span><span class="p">(</span><span class="n">runtime</span><span class="p">,</span> <span class="n">GF256</span><span class="p">,</span> <span class="n">GF256</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">128</span><span class="o">/</span><span class="mi">8</span><span class="p">)]</span>
+<span class="n">key</span> <span class="o">=</span> <span class="p">[</span><span class="n">runtime</span><span class="o">.</span><span class="n">prss_share_random</span><span class="p">(</span><span class="n">GF256</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">192</span><span class="o">/</span><span class="mi">8</span><span class="p">)]</span>
+<span class="n">ciphertext</span> <span class="o">=</span> <span class="n">aes</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="s">&quot;abcdefghijklmnop&quot;</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
+<span class="n">ciphertext</span> <span class="o">=</span> <span class="n">aes</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">cleartext</span><span class="p">,</span> <span class="s">&quot;keykeykeykeykeykeykeykey&quot;</span><span class="p">)</span>
+<span class="n">ciphertext</span> <span class="o">=</span> <span class="n">aes</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">cleartext</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>In every case <em>ciphertext</em> will be a list of shares over GF256.</p>
+<dl class="method">
+<dt id="viff.aes.AES.add_round_key">
+<tt class="descname">add_round_key</tt><big>(</big><em>state</em>, <em>round_key</em><big>)</big><a class="headerlink" href="#viff.aes.AES.add_round_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Rijndael AddRoundKey.</p>
+<p>State should be a list of 4 rows and round_key a list of
+4-byte columns (words).</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="viff.aes.AES.byte_sub">
+<tt class="descname">byte_sub</tt><big>(</big><em>state</em>, <em>use_lin_comb=True</em><big>)</big><a class="headerlink" href="#viff.aes.AES.byte_sub" title="Permalink to this definition">¶</a></dt>
+<dd><p>ByteSub operation of Rijndael.</p>
+<p>The first argument should be a matrix consisting of elements
+of GF(2^8).</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="viff.aes.AES.encrypt">
+<tt class="descname">encrypt</tt><big>(</big><em>cleartext</em>, <em>key</em>, <em>benchmark=False</em>, <em>prepare_at_once=False</em><big>)</big><a class="headerlink" href="#viff.aes.AES.encrypt" title="Permalink to this definition">¶</a></dt>
+<dd><p>Rijndael encryption.</p>
+<p>Cleartext and key should be either a string or a list of bytes
+(possibly shared as elements of GF256).</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="viff.aes.AES.key_expansion">
+<tt class="descname">key_expansion</tt><big>(</big><em>key</em>, <em>new_length=None</em><big>)</big><a class="headerlink" href="#viff.aes.AES.key_expansion" title="Permalink to this definition">¶</a></dt>
+<dd><p>Rijndael key expansion.</p>
+<p>Input and output are lists of 4-byte columns (words).
+<em>new_length</em> is the round for which the key should be expanded.
+If ommitted, the key is expanded for all rounds.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="viff.aes.AES.mix_column">
+<tt class="descname">mix_column</tt><big>(</big><em>state</em>, <em>use_lin_comb=True</em><big>)</big><a class="headerlink" href="#viff.aes.AES.mix_column" title="Permalink to this definition">¶</a></dt>
+<dd><p>Rijndael MixColumn.</p>
+<p>Input should be a list of 4 rows.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="viff.aes.AES.shift_row">
+<tt class="descname">shift_row</tt><big>(</big><em>state</em><big>)</big><a class="headerlink" href="#viff.aes.AES.shift_row" title="Permalink to this definition">¶</a></dt>
+<dd><p>Rijndael ShiftRow.</p>
+<p>State should be a list of 4 rows.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="viff.aes.bit_decompose">
+<tt class="descclassname">viff.aes.</tt><tt class="descname">bit_decompose</tt><big>(</big><em>share</em>, <em>use_lin_comb=True</em><big>)</big><a class="headerlink" href="#viff.aes.bit_decompose" title="Permalink to this definition">¶</a></dt>
+<dd>Bit decomposition for GF256 shares.</dd></dl>
+
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+            <h4>Previous topic</h4>
+            <p class="topless"><a href="config.html"
+                                  title="previous chapter">Config Module</a></p>
+            <h4>Next topic</h4>
+            <p class="topless"><a href="constants.html"
+                                  title="next chapter">Constants Module</a></p>
+            <h3>This Page</h3>
+            <ul class="this-page-menu">
+              <li><a href="_sources/aes.txt"
+                     rel="nofollow">Show Source</a></li>
+            </ul>
+          <div id="searchbox" style="display: none">
+            <h3>Quick search</h3>
+              <form class="search" action="search.html" method="get">
+                <input type="text" name="q" size="18" />
+                <input type="submit" value="Go" />
+                <input type="hidden" name="check_keywords" value="yes" />
+                <input type="hidden" name="area" value="default" />
+              </form>
+              <p class="searchtip" style="font-size: 90%">
+              Enter search terms or a module, class or function name.
+              </p>
+          </div>
+          <script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="constants.html" title="Constants Module"
+             >next</a> |</li>
+        <li class="right" >
+          <a href="config.html" title="Config Module"
+             >previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li>
+          <li><a href="implementation.html" >Implementation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+      &copy; Copyright 2008, VIFF Development Team.
+      Last updated on Dec 14, 2009.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.3.
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/applications.html	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,223 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Applications &mdash; VIFF v1.0 documentation</title>
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '1.0',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="VIFF v1.0 documentation" href="index.html" />
+    <link rel="next" title="Implementation" href="implementation.html" />
+    <link rel="prev" title="Installation Guide" href="install.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             accesskey="M">modules</a> |</li>
+        <li class="right" >
+          <a href="implementation.html" title="Implementation"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="install.html" title="Installation Guide"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="applications">
+<h1>Applications<a class="headerlink" href="#applications" title="Permalink to this headline">¶</a></h1>
+<p>VIFF has been used for several small and some larger applications. The
+largest applications are listed below. Please see the <tt class="docutils literal"><span class="pre">apps/</span></tt>
+directory in VIFF for more examples of small programs using VIFF.</p>
+<div class="section" id="nordic-sugar">
+<h2>Nordic Sugar<a class="headerlink" href="#nordic-sugar" title="Permalink to this headline">¶</a></h2>
+<p>In Denmark, the production of sugarbeet is managed by sugarbeet
+contracts. A sugarbeet contract determines the quantity of sugarbeet
+that a farmer is allowed to produce. Traditionally, sugarbeet
+contracts have been traded between individual pairs of farmers. This
+has been done in spite of the fact that trading in a central market
+was known to increase the overall profit. A central market has,
+however, not been possible due to conflicting interests and lack of
+trust between the parties.</p>
+<p>In January 2008 the first large scale secure multiparty computation
+was carried out, effectively solving this problem. This was done by
+the SIMAP research project as reported in &#8220;<a class="reference external" href="http://eprint.iacr.org/2008/068">Multiparty Computation
+Goes Live</a>&#8221; (also published at <a class="reference external" href="http://www.springerlink.com/content/j4772m44r05x0527/">Financial Crypto 2009</a>). In the
+summer of 2009 the same computation was successfully repeated, this
+time using VIFF.</p>
+<p>The computation was a double auction in which the production rights
+for several thousand tons of sugarbeets were traded. During the first
+weeks of the auction, several hundred Danish sugarbeet farmers
+submitted their encrypted bids to a central database. Then the actual
+computation took place between three players:</p>
+<ul class="simple">
+<li>Nordic Sugar, the Danish sugar company</li>
+<li>DKS, the consolidation of Danish sugarbeet farmers</li>
+<li>Partisia, a Danish company specialized in secure multiparty
+solutions</li>
+</ul>
+<p>The computation took about 15 minutes using three laptops on a LAN.
+Most of the computation time was spend converting the encrypted bids
+to secret sharings. The actual multiparty computation took only a
+couple of minutes. As a result, the sugarbeet contracts could be
+traded at an optimal price without any sensitive information being
+disclosed.</p>
+<p>Using secure multiparty computation, trading sugarbeets using this
+kind of auction was possible without finding and paying a trusted
+third party to manage the auction. Such a trusted party would&#8212;if it
+could be found at all&#8212;probably have been quite expensive.</p>
+</div>
+<div class="section" id="distributed-rsa">
+<h2>Distributed RSA<a class="headerlink" href="#distributed-rsa" title="Permalink to this headline">¶</a></h2>
+<p>Atle Mauland from the Norwegian University of Science and Technology
+(NTNU) used VIFF for his Master&#8217;s Thesis titled &#8220;<a class="reference external" href="http://daim.idi.ntnu.no/masteroppgave?id=4699">Realizing Distributed
+RSA using Secure Multiparty Computations</a>&#8220;.</p>
+<p>The private key from a RSA key pair must be kept in a highly secure
+location (to prevent unauthorized persons from stealing it) but
+because we want to use the key, we cannot just write it on a piece of
+paper and store that in a safe.</p>
+<p>This tension between high availability and high security makes a
+distributed solution attractive. Atle Mauland implemented a protocol
+by Boneh and Franklin for generating RSA keys in a distributed
+fashion. The protocol ensures that the private key is never available
+in the clear to any given party and an attacker must break into all
+machines to learn the private key. Meanwhile, the parties can use
+their shares of the private key to securely decrypt messages encrypted
+under the public key.</p>
+<p>Generating a 1024-bit RSA key using VIFF took about 30 minutes on
+average (the time varied between 7 seconds and 2.5 hours). These
+results can likely be improved by using the GMPY library more
+aggressively.</p>
+</div>
+<div class="section" id="distributed-aes">
+<h2>Distributed AES<a class="headerlink" href="#distributed-aes" title="Permalink to this headline">¶</a></h2>
+<p>The Advanced Encryption Standard (Rijndael) block cipher turns out to
+have nice arithmetic properties which makes its computation by
+arithmetic circuits relatively fast. Marcel Keller from the University
+of Aarhus has implemented a multiparty version of AES for VIFF.</p>
+<p>Using the <a title="" class="reference external" href="aes.html#module-viff.aes"><tt class="xref docutils literal"><span class="pre">viff.aes</span></tt></a> module, it is possible to securely
+compute a secret shared AES encrypted ciphertext of a (possibly)
+secret shared plaintext with a (possibly) secret shared key. The
+inputs have to be given either as a list of shares over
+<a title="viff.field.GF256" class="reference external" href="field.html#viff.field.GF256"><tt class="xref docutils literal"><span class="pre">GF256</span></tt></a> (byte-wise) or as a string. The runtime has
+to be able to handle shares over GF256.</p>
+<p>Encrypting a 128-bit block using a 128-bit secret shared AES key takes
+about 2 seconds using three machines. Decryption is not implemented
+yet.</p>
+</div>
+<div class="section" id="secure-voting">
+<h2>Secure Voting<a class="headerlink" href="#secure-voting" title="Permalink to this headline">¶</a></h2>
+<p>Typical Internet voting systems store all votes in a single location.
+Håvard Vegge  from the Norwegian University of Science and Technology
+(NTNU) used VIFF for his Master&#8217;s Thesis titled &#8220;<a class="reference external" href="http://daim.idi.ntnu.no/masteroppgave?id=4559">Realizing Secure
+Multiparty Computations</a>&#8221; to implement a distributed voting system.</p>
+<p>The system removes the single point of failure by storing the votes in
+secret shared form between three servers. The voters will do the
+secret sharing on their own machine, encrypt the shares, and send the
+encrypted shares to a database. Each share is encrypted under the
+public key belonging to the computation server that will do the actual
+multiparty computation.</p>
+<p>This project shows how VIFF can be integrated with many other
+technologies. The user creates a vote on a website programmed in PHP
+and the voting is cast using a Java applet. The applet has the
+responsibility of encrypting the votes for the computation servers.
+When all voters have cast their vote, a XML-RPC message is sent to the
+Python program running on the servers. That program decrypts the
+shares and uses VIFF to compute the result.</p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+            <h3><a href="index.html">Table Of Contents</a></h3>
+            <ul>
+<li><a class="reference external" href="">Applications</a><ul>
+<li><a class="reference external" href="#nordic-sugar">Nordic Sugar</a></li>
+<li><a class="reference external" href="#distributed-rsa">Distributed RSA</a></li>
+<li><a class="reference external" href="#distributed-aes">Distributed AES</a></li>
+<li><a class="reference external" href="#secure-voting">Secure Voting</a></li>
+</ul>
+</li>
+</ul>
+
+            <h4>Previous topic</h4>
+            <p class="topless"><a href="install.html"
+                                  title="previous chapter">Installation Guide</a></p>
+            <h4>Next topic</h4>
+            <p class="topless"><a href="implementation.html"
+                                  title="next chapter">Implementation</a></p>
+            <h3>This Page</h3>
+            <ul class="this-page-menu">
+              <li><a href="_sources/applications.txt"
+                     rel="nofollow">Show Source</a></li>
+            </ul>
+          <div id="searchbox" style="display: none">
+            <h3>Quick search</h3>
+              <form class="search" action="search.html" method="get">
+                <input type="text" name="q" size="18" />
+                <input type="submit" value="Go" />
+                <input type="hidden" name="check_keywords" value="yes" />
+                <input type="hidden" name="area" value="default" />
+              </form>
+              <p class="searchtip" style="font-size: 90%">
+              Enter search terms or a module, class or function name.
+              </p>
+          </div>
+          <script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="implementation.html" title="Implementation"
+             >next</a> |</li>
+        <li class="right" >
+          <a href="install.html" title="Installation Guide"
+             >previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+      &copy; Copyright 2008, VIFF Development Team.
+      Last updated on Dec 14, 2009.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.3.
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/authors.html	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>VIFF Development Team &mdash; VIFF v1.0 documentation</title>
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '1.0',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="VIFF v1.0 documentation" href="index.html" />
+    <link rel="next" title="Glossary" href="glossary.html" />
+    <link rel="prev" title="Contact" href="contact.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             accesskey="M">modules</a> |</li>
+        <li class="right" >
+          <a href="glossary.html" title="Glossary"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="contact.html" title="Contact"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="viff-development-team">
+<h1>VIFF Development Team<a class="headerlink" href="#viff-development-team" title="Permalink to this headline">¶</a></h1>
+<p>The following people have contributed to VIFF (ordered by first commit
+to the repository):</p>
+<ul class="simple">
+<li>Martin Geisler &lt;<a class="reference external" href="mailto:mg&#37;&#52;&#48;daimi&#46;au&#46;dk">mg<span>&#64;</span>daimi<span>&#46;</span>au<span>&#46;</span>dk</a>&gt;</li>
+<li>Tomas Toft</li>
+<li>Mikkel Krøigård &lt;<a class="reference external" href="mailto:mk&#37;&#52;&#48;daimi&#46;au&#46;dk">mk<span>&#64;</span>daimi<span>&#46;</span>au<span>&#46;</span>dk</a>&gt;</li>
+<li>Thomas Pelle Jakobsen &lt;<a class="reference external" href="mailto:mas&#37;&#52;&#48;daimi&#46;au&#46;dk">mas<span>&#64;</span>daimi<span>&#46;</span>au<span>&#46;</span>dk</a>&gt;</li>
+<li>Jakob Illeborg Pagter</li>
+<li>Sigurd Meldgaard</li>
+<li>Marcel Keller &lt;<a class="reference external" href="mailto:mkeller&#37;&#52;&#48;cs&#46;au&#46;dk">mkeller<span>&#64;</span>cs<span>&#46;</span>au<span>&#46;</span>dk</a>&gt;</li>
+<li>Tord Reistad</li>
+<li>Ivan Damgård</li>
+<li>Janus Dam Nielsen &lt;<a class="reference external" href="mailto:janus&#46;nielsen&#37;&#52;&#48;alexandra&#46;dk">janus<span>&#46;</span>nielsen<span>&#64;</span>alexandra<span>&#46;</span>dk</a>&gt;</li>
+</ul>
+<p>If you have been forgotten, then please checkout <a class="reference external" href="http://hg.viff.dk/viff/">the repository</a>,
+add yourself to the list and <a class="reference external" href="mailto:viff-devel&#37;&#52;&#48;viff&#46;dk">send us a patch</a>!</p>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+            <h4>Previous topic</h4>
+            <p class="topless"><a href="contact.html"
+                                  title="previous chapter">Contact</a></p>
+            <h4>Next topic</h4>
+            <p class="topless"><a href="glossary.html"
+                                  title="next chapter">Glossary</a></p>
+            <h3>This Page</h3>
+            <ul class="this-page-menu">
+              <li><a href="_sources/authors.txt"
+                     rel="nofollow">Show Source</a></li>
+            </ul>
+          <div id="searchbox" style="display: none">
+            <h3>Quick search</h3>
+              <form class="search" action="search.html" method="get">
+                <input type="text" name="q" size="18" />
+                <input type="submit" value="Go" />
+                <input type="hidden" name="check_keywords" value="yes" />
+                <input type="hidden" name="area" value="default" />
+              </form>
+              <p class="searchtip" style="font-size: 90%">
+              Enter search terms or a module, class or function name.
+              </p>
+          </div>
+          <script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="glossary.html" title="Glossary"
+             >next</a> |</li>
+        <li class="right" >
+          <a href="contact.html" title="Contact"
+             >previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+      &copy; Copyright 2008, VIFF Development Team.
+      Last updated on Dec 14, 2009.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.3.
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/background.html	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,134 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Background Information &mdash; VIFF v1.0 documentation</title>
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '1.0',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="VIFF v1.0 documentation" href="index.html" />
+    <link rel="next" title="Program Counters" href="program-counters.html" />
+    <link rel="prev" title="An Hash Based Broadcast Protocol" href="hashbroadcast.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             accesskey="M">modules</a> |</li>
+        <li class="right" >
+          <a href="program-counters.html" title="Program Counters"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="hashbroadcast.html" title="An Hash Based Broadcast Protocol"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="background-information">
+<h1>Background Information<a class="headerlink" href="#background-information" title="Permalink to this headline">¶</a></h1>
+<p>The following document will provide some background information on the
+design of VIFF.</p>
+<ul>
+<li class="toctree-l1"><a class="reference external" href="program-counters.html">Program Counters</a><ul>
+<li class="toctree-l2"><a class="reference external" href="program-counters.html#the-naive-solution">The naive solution</a></li>
+<li class="toctree-l2"><a class="reference external" href="program-counters.html#the-working-solution">The working solution</a></li>
+<li class="toctree-l2"><a class="reference external" href="program-counters.html#alternatives">Alternatives</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference external" href="preprocessing.html">Preprocessing</a><ul>
+<li class="toctree-l2"><a class="reference external" href="preprocessing.html#knowing-how-much-to-preprocess">Knowing how much to preprocess</a></li>
+<li class="toctree-l2"><a class="reference external" href="preprocessing.html#implementing-preprocessing">Implementing preprocessing</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference external" href="history.html">The History of VIFF</a><ul>
+<li class="toctree-l2"><a class="reference external" href="history.html#background">Background</a></li>
+<li class="toctree-l2"><a class="reference external" href="history.html#problems-and-solutions">Problems and solutions</a></li>
+<li class="toctree-l2"><a class="reference external" href="history.html#current-status">Current status</a></li>
+</ul>
+</li>
+</ul>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+            <h4>Previous topic</h4>
+            <p class="topless"><a href="hashbroadcast.html"
+                                  title="previous chapter">An Hash Based Broadcast Protocol</a></p>
+            <h4>Next topic</h4>
+            <p class="topless"><a href="program-counters.html"
+                                  title="next chapter">Program Counters</a></p>
+            <h3>This Page</h3>
+            <ul class="this-page-menu">
+              <li><a href="_sources/background.txt"
+                     rel="nofollow">Show Source</a></li>
+            </ul>
+          <div id="searchbox" style="display: none">
+            <h3>Quick search</h3>
+              <form class="search" action="search.html" method="get">
+                <input type="text" name="q" size="18" />
+                <input type="submit" value="Go" />
+                <input type="hidden" name="check_keywords" value="yes" />
+                <input type="hidden" name="area" value="default" />
+              </form>
+              <p class="searchtip" style="font-size: 90%">
+              Enter search terms or a module, class or function name.
+              </p>
+          </div>
+          <script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="program-counters.html" title="Program Counters"
+             >next</a> |</li>
+        <li class="right" >
+          <a href="hashbroadcast.html" title="An Hash Based Broadcast Protocol"
+             >previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+      &copy; Copyright 2008, VIFF Development Team.
+      Last updated on Dec 14, 2009.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.3.
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/bibliography.html	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,206 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Bibliography &mdash; VIFF v1.0 documentation</title>
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '1.0',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="VIFF v1.0 documentation" href="index.html" />
+    <link rel="next" title="Contact" href="contact.html" />
+    <link rel="prev" title="Presentations" href="presentations.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             accesskey="M">modules</a> |</li>
+        <li class="right" >
+          <a href="contact.html" title="Contact"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="presentations.html" title="Presentations"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="bibliography">
+<h1>Bibliography<a class="headerlink" href="#bibliography" title="Permalink to this headline">¶</a></h1>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">This list is far from complete. If you find more relevant
+references then please <a class="reference external" href="mailto:viff-devel&#37;&#52;&#48;viff&#46;dk">send us a mail</a> with the information.</p>
+</div>
+<p>The algorithms used by VIFF are published in various academic papers.
+Here we will try to point out which parts of the code uses which
+papers.</p>
+<ul class="simple">
+<li>The primary reference is <a class="reference internal" href="#dgkn">[DGKN]</a>. This paper describes the
+asynchronous protocol secure against active adversaries implemented
+in VIFF.</li>
+<li>The <tt class="docutils literal"><span class="pre">viff.shamir</span></tt> module is obviously based on <a class="reference internal" href="#shamir79">[Shamir79]</a>.</li>
+<li><tt class="docutils literal"><span class="pre">apps/millionaires.py</span></tt>: Inspired by <a class="reference internal" href="#yao82">[Yao82]</a>.</li>
+<li>The default comparison operation (<tt class="docutils literal"><span class="pre">Runtime.greater_than_equal</span></tt>) is
+based on the comparison protocol from <a class="reference internal" href="#toft05">[Toft05]</a>.</li>
+<li>Broadcast (<tt class="docutils literal"><span class="pre">Runtime.broadcast</span></tt>) is based on the original paper by
+<a class="reference internal" href="#bracha84">[Bracha84]</a> and on the explanation by <a class="reference internal" href="#cachin05">[Cachin05]</a>.</li>
+<li>The pseudo-random secret sharing (PRSS) in <tt class="docutils literal"><span class="pre">viff.prss</span></tt> is
+described in <a class="reference internal" href="#cdi05">[CDI05]</a>. The
+<a title="viff.passive.PassiveRuntime.prss_share_bit_double" class="reference external" href="passive.html#viff.passive.PassiveRuntime.prss_share_bit_double"><tt class="xref docutils literal"><span class="pre">prss_share_bit_double()</span></tt></a> method
+uses a protocol described in <a class="reference internal" href="#damg-rd08">[Damgård08]</a>.</li>
+<li>The protocol for equality testing with secret shared result is from
+<a class="reference internal" href="#nishide07">[Nishide07]</a>.</li>
+</ul>
+<table class="docutils citation" frame="void" id="bracha84" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id6">[Bracha84]</a></td><td>G. Bracha, <em>An asynchronous [(n-1)/3]-resilient
+consensus protocol</em>, Proc 3rd ACM Symposium on Principles of
+Distributed Computing (PODC), 1984, 154-162.</td></tr>
+</tbody>
+</table>
+<table class="docutils citation" frame="void" id="cachin05" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id7">[Cachin05]</a></td><td>Christian Cachin, <em>Security and Fault-tolerance in
+Distributed Systems</em>, ETHZ, 2005, <a class="reference external" href="http://www.zurich.ibm.com/~cca/sft05/agreement.pdf">PDF</a>.</td></tr>
+</tbody>
+</table>
+<table class="docutils citation" frame="void" id="cdi05" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id8">[CDI05]</a></td><td>Ronald Cramer, Ivan Damgård, and Yuval Ishai, <em>Share
+Conversion, Pseudorandom Secret-Sharing and Applications to Secure
+Computation</em>, Proc of TCC 2005, LNCS 3378, <a class="reference external" href="http://www.cs.technion.ac.il/~yuvali/pubs/CDI05.ps">PS</a>.</td></tr>
+</tbody>
+</table>
+<table class="docutils citation" frame="void" id="damg-rd08" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id9">[Damgård08]</a></td><td>Ivan Damgård and Rune Thorbek, <em>Efficient Conversion of
+Secret-shared Values Between Different Fields</em>, Cryptology ePrint
+Archive: <a class="reference external" href="http://eprint.iacr.org/2008/221">Report 2008/221</a>.</td></tr>
+</tbody>
+</table>
+<table class="docutils citation" frame="void" id="dgkn" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id2">[DGKN]</a></td><td>Ivan Damgård, Martin Geisler, Mikkel Krøigaard, Jesper Buus
+Nielsen, <em>Asynchronous Multiparty Computation: Theory and
+Implementation</em>, Cryptology ePrint Archive: <a class="reference external" href="http://eprint.iacr.org/2008/415">Report 2008/415</a>.</td></tr>
+</tbody>
+</table>
+<table class="docutils citation" frame="void" id="nishide07" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id10">[Nishide07]</a></td><td>Takashi Nishide and Kazuo Ohta, <em>Constant-Round
+Multiparty Computation for Interval Test, Equality Test, and
+Comparison</em>, IEICE Transactions, 90-A (5): 960-968.</td></tr>
+</tbody>
+</table>
+<table class="docutils citation" frame="void" id="shamir79" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id3">[Shamir79]</a></td><td>Adi Shamir, <em>How to share a secret</em>, Communications of
+the ACM, 22 (11): 612-613.</td></tr>
+</tbody>
+</table>
+<table class="docutils citation" frame="void" id="toft05" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id5">[Toft05]</a></td><td>Tomas Toft, <em>Secure Integer Computation with Applications
+in Economics</em>, PhD Progress Report, July 2005, <a class="reference external" href="http://www.daimi.au.dk/~ttoft/publications/progress.pdf">PDF</a>.</td></tr>
+</tbody>
+</table>
+<table class="docutils citation" frame="void" id="yao82" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id4">[Yao82]</a></td><td>Andrew Chi-Chih Yao, <em>Protocols for Secure Computations</em>,
+FOCS 1982, 160-164.</td></tr>
+</tbody>
+</table>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+            <h4>Previous topic</h4>
+            <p class="topless"><a href="presentations.html"
+                                  title="previous chapter">Presentations</a></p>
+            <h4>Next topic</h4>
+            <p class="topless"><a href="contact.html"
+                                  title="next chapter">Contact</a></p>
+            <h3>This Page</h3>
+            <ul class="this-page-menu">
+              <li><a href="_sources/bibliography.txt"
+                     rel="nofollow">Show Source</a></li>
+            </ul>
+          <div id="searchbox" style="display: none">
+            <h3>Quick search</h3>
+              <form class="search" action="search.html" method="get">
+                <input type="text" name="q" size="18" />
+                <input type="submit" value="Go" />
+                <input type="hidden" name="check_keywords" value="yes" />
+                <input type="hidden" name="area" value="default" />
+              </form>
+              <p class="searchtip" style="font-size: 90%">
+              Enter search terms or a module, class or function name.
+              </p>
+          </div>
+          <script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="contact.html" title="Contact"
+             >next</a> |</li>
+        <li class="right" >
+          <a href="presentations.html" title="Presentations"
+             >previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+      &copy; Copyright 2008, VIFF Development Team.
+      Last updated on Dec 14, 2009.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.3.
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/1.0/coding-style.html	Mon Dec 14 17:13:25 2009 +0100
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Coding Style &mdash; VIFF v1.0 documentation</title>
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '1.0',
+        COLLAPSE_MODINDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="VIFF v1.0 documentation" href="index.html" />
+    <link rel="next" title="Developer’s Guide" href="development.html" />
+    <link rel="prev" title="Planned Work on VIFF" href="todo.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             accesskey="M">modules</a> |</li>
+        <li class="right" >
+          <a href="development.html" title="Developer’s Guide"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="todo.html" title="Planned Work on VIFF"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="coding-style">
+<h1>Coding Style<a class="headerlink" href="#coding-style" title="Permalink to this headline">¶</a></h1>
+<p>The VIFF code tries to follow the coding style laid out in <span class="target" id="index-0"></span><a class="reference external" href="http://www.python.org/dev/peps/pep-0008"><strong>PEP 8</strong></a>,
+which you should read or at least skim over. You can check your code
+against by running the <a class="reference external" href="http://svn.browsershots.org/trunk/devtools/pep8/pep8.py">pep8.py</a> checker.</p>
+<div class="section" id="the-viff-coding-style-in-short">
+<h2>The VIFF Coding Style in Short<a class="headerlink" href="#the-viff-coding-style-in-short" title="Permalink to this headline">¶</a></h2>
+<p>A summary of the rules:</p>
+<ul>
+<li><p class="first">Use four spaces for indention, never tabs.</p>
+<blockquote class="epigraph">
+<p>Thus spake the Lord: <em>Thou shalt indent with four spaces. No
+more, no less. Four shall be the number of spaces thou shalt
+indent, and the number of thy indenting shall be four. Eight
+shalt thou not indent, nor either indent thou two, excepting that
+thou then proceed to four. Tabs are right out.</em></p>
+<p class="attribution">&mdash;Georg Brandl</p>
+</blockquote>
+</li>
+<li><p class="first">Use a single space around binary operators.</p>
+</li>
+<li><p class="first">Name classes using <tt class="docutils literal"><span class="pre">CamelCase</span></tt>.</p>
+</li>
+<li><p class="first">Name variables, function, and methods using lowercase words like
+<tt class="docutils literal"><span class="pre">foo_bar</span></tt>.</p>
+</li>
+<li><p class="first">Write docstrings for your functions and methods. Include test for
+<a class="reference external" href="http://docs.python.org/lib/module-doctest.html">doctest</a> if possible.</p>
+</li>
+<li><p class="first">Try to be consistent.</p>
+</li>
+</ul>
+<p>These rules are there to make the source code more readable for both
+old and new people.</p>
+</div>
+<div class="section" id="the-twisted-coding-style">
+<h2>The Twisted Coding Style<a class="headerlink" href="#the-twisted-coding-style" title="Permalink to this headline">¶</a></h2>
+<p>VIFF uses <a class="reference external" href="http://twistedmatrix.com/">Twisted</a> and their code follows a slightly different coding
+style. Their style is closer to the style used in Java where functions
+and methods are named <tt class="docutils literal"><span class="pre">fooBar</span></tt> instead of <tt class="docutils literal"><span class="pre">foo_bar</span></tt>.</p>
+<p>When writing code which is close to Twisted code, you might want to
+follow that style too. If you subclass a Twisted class to override
+some behavior, you might be forced to follow their style.</p>
+<p>If you have a choice, then you should only use the Twisted style if
+you expect people to call both your code and the Twisted code — if
+people will only call your code, then please follow the standard VIFF
+coding style.</p>
+</div>
+<div class="section" id="hints-for-indexed-variables">
+<h2>Hints for indexed variables<a class="headerlink" href="#hints-for-indexed-variables" title="Permalink to this headline">¶</a></h2>
+<p>When the code is based on a mathematical text, one often sees lots of
+<em>b</em><sub>i</sub> variables. A nice way to deal with those in code is to
+consider them part of a list called <tt class="docutils literal"><span class="pre">b</span></tt> and create it like this:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">rt</span><span class="o">.</span><span class="n">prss_share_random</span><span class="p">(</span><span class="n">Zp</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
+     <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">k</span><span class="p">)]</span>
+</pre></div>
+</div>
+<p>It is not a good idea to name the list <tt class="docutils literal"><span class="pre">bi</span></tt> since that is what you
+would want to call the elements in the list:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">bi</span> <span class="o">*</span> <span class="n">bi</span> <span class="k">for</span> <span class="n">bi</span> <span class="ow">in</span> <span class="n">b</span><span class="p">]</span>
+</pre></div>
+</div>
+<p>If the index of the current element is needed:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">number</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">([</span><span class="mi">2</span><span class="o">**</span><span class="n">i</span> <span class="o">*</span> <span class="n">bi</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">bi</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">b</span><span class="p">)])</span>
+</pre></div>
+</div>
+<p>If you want to work with the list by index, you get the nice
+correspondence between <em>b</em><sub>i</sub> and <tt class="docutils literal"><span class="pre">b[i]</span></tt>:</p>
+<div class="highlight-python"><pre>z = 0
+for in range(k)
+  z += b[i] + x[k - i]</pre>
+</div>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+            <h3><a href="index.html">Table Of Contents</a></h3>
+            <ul>
+<li><a class="reference external" href="">Coding Style</a><ul>
+<li><a class="reference external" href="#the-viff-coding-style-in-short">The VIFF Coding Style in Short</a></li>
+<li><a class="reference external" href="#the-twisted-coding-style">The Twisted Coding Style</a></li>
+<li><a class="reference external" href="#hints-for-indexed-variables">Hints for indexed variables</a></li>
+</ul>
+</li>
+</ul>
+
+            <h4>Previous topic</h4>
+            <p class="topless"><a href="todo.html"
+                                  title="previous chapter">Planned Work on VIFF</a></p>
+            <h4>Next topic</h4>
+            <p class="topless"><a href="development.html"
+                                  title="next chapter">Developer&#8217;s Guide</a></p>
+            <h3>This Page</h3>
+            <ul class="this-page-menu">
+              <li><a href="_sources/coding-style.txt"
+                     rel="nofollow">Show Source</a></li>
+            </ul>
+          <div id="searchbox" style="display: none">
+            <h3>Quick search</h3>
+              <form class="search" action="search.html" method="get">
+                <input type="text" name="q" size="18" />
+                <input type="submit" value="Go" />
+                <input type="hidden" name="check_keywords" value="yes" />
+                <input type="hidden" name="area" value="default" />
+              </form>
+              <p class="searchtip" style="font-size: 90%">
+              Enter search terms or a module, class or function name.
+              </p>
+          </div>
+          <script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="modindex.html" title="Global Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="development.html" title="Developer’s Guide"
+             >next</a> |</li>
+        <li class="right" >
+          <a href="todo.html" title="Planned Work on VIFF"
+             >previous</a> |</li>
+        <li><a href="index.html">VIFF v1.0 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+      &copy; Copyright 2008, VIFF Development Team.