diff options
163 files changed, 4207 insertions, 27310 deletions
@@ -1,3 +1,52 @@ +2012-04-03 Jean-Paul Calderone <exarkun@twistedmatrix.com> + + * OpenSSL/crypto/pkey.c: Release the GIL around RSA and DSA key + generation, based on code from INADA Naoki. + +2012-02-13 Jean-Paul Calderone <exarkun@twistedmatrix.com> + + * OpenSSL/ssl/ssl.c: Add session cache related constants for use + with the new Context.set_session_cache_mode method. + + * OpenSSL/ssl/context.c: Add new Context methods + set_session_cache_mode and get_session_cache_mode. + +2011-11-01 Jean-Paul Calderone <exarkun@twistedmatrix.com> + + * OpenSSL/crypto/pkey.c: Raise TypeError when trying to check a + PKey instance which has no private component, instead of crashing. + Based on fix by <lp:~dataway>. + +2011-09-14 Žiga Seilnacht <lp:ziga-seilnacht> + + * OpenSSL/crypto/crypto.c: Allow exceptions from passphrase + callbacks to propagate up out of load_privatekey + * OpenSSL/crypto/crypto.c: Raise an exception when a too-long + passphrase is returned from a passphrase callback, instead of + silently truncating it. + * OpenSSL/crypto/crypto.c: Fix a memory leak when a passphrase + callback returns the wrong type. + +2011-09-13 Jean-Paul Calderone <exarkun@twistedmatrix.com> + + * OpenSSL/crypto/crl.c: Add error handling for the use of + X509_CRL_sign. + +2011-09-11 Jonathan Ballet <lp:multani> + + * doc/: Convert the LaTeX documentation to Sphinx-using ReST. + * OpenSSL/: Convert the epytext API documentation to Sphinx-using ReST. + +2011-09-08 Guillermo Gonzalez <guillermo.gonzalez@canonical.com> + + * OpenSSL/ssl/context.c: Add Context.set_mode method. + * OpenSSL/ssl/ssl.c: Add MODE_RELEASE_BUFFERS and OP_NO_COMPRESSION + constants. + +2011-09-02 Jean-Paul Calderone <exarkun@twistedmatrix.com> + + * Release 0.13 + 2011-06-12 Jean-Paul Calderone <exarkun@twistedmatrix.com> * OpenSSL/crypto/pkey.c: Add the PKey.check method, mostly diff --git a/MANIFEST.in b/MANIFEST.in index 0c2be95..a8cd9a9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,7 @@ recursive-include OpenSSL *.h include LICENSE ChangeLog INSTALL README TODO MANIFEST.in OpenSSL/RATIONALE -include doc/pyOpenSSL.tex doc/Makefile -recursive-include doc/tools * +recursive-include doc * recursive-include examples * recursive-include rpm * global-exclude *.pyc +prune doc/_build diff --git a/OpenSSL/crypto/crl.c b/OpenSSL/crypto/crl.c index eec5bcb..3f56d83 100644 --- a/OpenSSL/crypto/crl.c +++ b/OpenSSL/crypto/crl.c @@ -2,7 +2,6 @@ #define crypto_MODULE #include "crypto.h" - static X509_REVOKED * X509_REVOKED_dup(X509_REVOKED *orig) { X509_REVOKED *dupe = NULL; @@ -37,7 +36,7 @@ static char crypto_CRL_get_revoked_doc[] = "\n\ Return revoked portion of the CRL structure (by value\n\ not reference).\n\ \n\ -@return: A tuple of Revoked objects.\n\ +:return: A tuple of Revoked objects.\n\ "; static PyObject * crypto_CRL_get_revoked(crypto_CRLObj *self, PyObject *args) { @@ -84,9 +83,9 @@ crypto_CRL_get_revoked(crypto_CRLObj *self, PyObject *args) { static char crypto_CRL_add_revoked_doc[] = "\n\ Add a revoked (by value not reference) to the CRL structure\n\ \n\ -@param cert: The new revoked.\n\ -@type cert: L{X509}\n\ -@return: None\n\ +:param cert: The new revoked.\n\ +:type cert: :class:`X509`\n\ +:return: None\n\ "; static PyObject * crypto_CRL_add_revoked(crypto_CRLObj *self, PyObject *args, PyObject *keywds) { @@ -112,14 +111,14 @@ crypto_CRL_add_revoked(crypto_CRLObj *self, PyObject *args, PyObject *keywds) { static char crypto_CRL_export_doc[] = "\n\ export(cert, key[, type[, days]]) -> export a CRL as a string\n\ \n\ -@param cert: Used to sign CRL.\n\ -@type cert: L{X509}\n\ -@param key: Used to sign CRL.\n\ -@type key: L{PKey}\n\ -@param type: The export format, either L{FILETYPE_PEM}, L{FILETYPE_ASN1}, or L{FILETYPE_TEXT}.\n\ -@param days: The number of days until the next update of this CRL.\n\ -@type days: L{int}\n\ -@return: L{str}\n\ +:param cert: Used to sign CRL.\n\ +:type cert: :class:`X509`\n\ +:param key: Used to sign CRL.\n\ +:type key: :class:`PKey`\n\ +:param type: The export format, either :py:data:`FILETYPE_PEM`, :py:data:`FILETYPE_ASN1`, or :py:data:`FILETYPE_TEXT`.\n\ +:param days: The number of days until the next update of this CRL.\n\ +:type days: :py:data:`int`\n\ +:return: :py:data:`str`\n\ "; static PyObject * crypto_CRL_export(crypto_CRLObj *self, PyObject *args, PyObject *keywds) { @@ -131,13 +130,27 @@ crypto_CRL_export(crypto_CRLObj *self, PyObject *args, PyObject *keywds) { ASN1_TIME *tmptm; crypto_X509Obj *x509; static char *kwlist[] = {"cert", "key", "type", "days", NULL}; - + if (!PyArg_ParseTupleAndKeywords(args, keywds, "O!O!|ii:dump_crl", kwlist, - &crypto_X509_Type, &x509, + &crypto_X509_Type, &x509, &crypto_PKey_Type, &key, &type, &days)) { return NULL; } - + + +#if OPENSSL_VERSION_NUMBER >= 0x01000000L + /* Older versions of OpenSSL had no problem with trying to export using an + * uninitialized key. Newer versions segfault, instead. We can only check + * on the new versions, though, because the old versions don't even have the + * field that the segfault is triggered by. + */ + if (!key->pkey->ameth) { + PyErr_SetString( + crypto_Error, "Cannot export with an unitialized key"); + return NULL; + } +#endif + bio = BIO_new(BIO_s_mem()); tmptm = ASN1_TIME_new(); if (!tmptm) { @@ -149,7 +162,13 @@ crypto_CRL_export(crypto_CRLObj *self, PyObject *args, PyObject *keywds) { X509_CRL_set_nextUpdate(self->crl, tmptm); ASN1_TIME_free(tmptm); X509_CRL_set_issuer_name(self->crl, X509_get_subject_name(x509->x509)); - X509_CRL_sign(self->crl, key->pkey, EVP_md5()); + + if (!X509_CRL_sign(self->crl, key->pkey, EVP_md5())) { + exception_from_error_queue(crypto_Error); + BIO_free(bio); + return NULL; + } + switch (type) { case X509_FILETYPE_PEM: ret = PEM_write_bio_X509_CRL(bio, self->crl); @@ -223,7 +242,7 @@ CRL() -> CRL instance\n\ \n\ Create a new empty CRL object.\n\ \n\ -@returns: The CRL object\n\ +:returns: The CRL object\n\ "; static PyObject* crypto_CRL_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) { diff --git a/OpenSSL/crypto/crypto.c b/OpenSSL/crypto/crypto.c index 3573a12..ad35ce9 100644 --- a/OpenSSL/crypto/crypto.c +++ b/OpenSSL/crypto/crypto.c @@ -45,32 +45,82 @@ global_passphrase_callback(char *buf, int len, int rwflag, void *cb_arg) func = (PyObject *)cb_arg; argv = Py_BuildValue("(i)", rwflag); + if (argv == NULL) { + return 0; + } ret = PyEval_CallObject(func, argv); Py_DECREF(argv); - if (ret == NULL) + if (ret == NULL) { return 0; - if (!PyBytes_Check(ret)) - { + } + if (!PyBytes_Check(ret)) { + Py_DECREF(ret); PyErr_SetString(PyExc_ValueError, "String expected"); return 0; } nchars = PyBytes_Size(ret); - if (nchars > len) - nchars = len; + if (nchars > len) { + Py_DECREF(ret); + PyErr_SetString(PyExc_ValueError, + "passphrase returned by callback is too long"); + return 0; + } strncpy(buf, PyBytes_AsString(ret), nchars); + Py_DECREF(ret); return nchars; } +static PyObject * +raise_current_error(void) +{ + if (PyErr_Occurred()) { + /* + * The python exception from callback is more informative than + * OpenSSL's error. + */ + flush_error_queue(); + return NULL; + } + exception_from_error_queue(crypto_Error); + return NULL; +} + +static int +setup_callback(int type, PyObject *pw, pem_password_cb **cb, void **cb_arg) { + if (pw == NULL) { + *cb = NULL; + *cb_arg = NULL; + return 1; + } + if (type != X509_FILETYPE_PEM) { + PyErr_SetString(PyExc_ValueError, + "only FILETYPE_PEM key format supports encryption"); + return 0; + } + if (PyBytes_Check(pw)) { + *cb = NULL; + *cb_arg = PyBytes_AsString(pw); + } else if (PyCallable_Check(pw)) { + *cb = global_passphrase_callback; + *cb_arg = pw; + } else { + PyErr_SetString(PyExc_TypeError, + "Last argument must be string or callable"); + return 0; + } + return 1; +} + static char crypto_load_privatekey_doc[] = "\n\ Load a private key from a buffer\n\ \n\ -@param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ -@param buffer: The buffer the key is stored in\n\ -@param passphrase: (optional) if encrypted PEM format, this can be\n\ +:param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ +:param buffer: The buffer the key is stored in\n\ +:param passphrase: (optional) if encrypted PEM format, this can be\n\ either the passphrase to use, or a callback for\n\ providing the passphrase.\n\ \n\ -@return: The PKey object\n\ +:return: The PKey object\n\ "; static PyObject * @@ -85,31 +135,20 @@ crypto_load_privatekey(PyObject *spam, PyObject *args) BIO *bio; EVP_PKEY *pkey; - if (!PyArg_ParseTuple(args, "is#|O:load_privatekey", &type, &buffer, &len, &pw)) + if (!PyArg_ParseTuple(args, "is#|O:load_privatekey", + &type, &buffer, &len, &pw)) { + return NULL; + } + if (!setup_callback(type, pw, &cb, &cb_arg)) { return NULL; - - if (pw != NULL) - { - if (PyBytes_Check(pw)) - { - cb = NULL; - cb_arg = PyBytes_AsString(pw); - } - else if (PyCallable_Check(pw)) - { - cb = global_passphrase_callback; - cb_arg = pw; - } - else - { - PyErr_SetString(PyExc_TypeError, "Last argument must be string or callable"); - return NULL; - } } bio = BIO_new_mem_buf(buffer, len); - switch (type) - { + if (bio == NULL) { + exception_from_error_queue(crypto_Error); + return NULL; + } + switch (type) { case X509_FILETYPE_PEM: pkey = PEM_read_bio_PrivateKey(bio, NULL, cb, cb_arg); break; @@ -125,10 +164,8 @@ crypto_load_privatekey(PyObject *spam, PyObject *args) } BIO_free(bio); - if (pkey == NULL) - { - exception_from_error_queue(crypto_Error); - return NULL; + if (pkey == NULL) { + return raise_current_error(); } return (PyObject *)crypto_PKey_New(pkey, 1); @@ -137,15 +174,15 @@ crypto_load_privatekey(PyObject *spam, PyObject *args) static char crypto_dump_privatekey_doc[] = "\n\ Dump a private key to a buffer\n\ \n\ -@param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ -@param pkey: The PKey to dump\n\ -@param cipher: (optional) if encrypted PEM format, the cipher to\n\ +:param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ +:param pkey: The PKey to dump\n\ +:param cipher: (optional) if encrypted PEM format, the cipher to\n\ use\n\ -@param passphrase - (optional) if encrypted PEM format, this can be either\n\ - the passphrase to use, or a callback for providing the\n\ - passphrase.\n\ -@return: The buffer with the dumped key in\n\ -@rtype: C{str}\n\ +:param passphrase: (optional) if encrypted PEM format, this can be either\n\ + the passphrase to use, or a callback for providing the\n\ + passphrase.\n\ +:return: The buffer with the dumped key in\n\ +:rtype: :py:data:`str`\n\ "; static PyObject * @@ -164,49 +201,32 @@ crypto_dump_privatekey(PyObject *spam, PyObject *args) crypto_PKeyObj *pkey; if (!PyArg_ParseTuple(args, "iO!|sO:dump_privatekey", &type, - &crypto_PKey_Type, &pkey, &cipher_name, &pw)) + &crypto_PKey_Type, &pkey, &cipher_name, &pw)) { return NULL; - - if (cipher_name != NULL && pw == NULL) - { + } + if (cipher_name != NULL && pw == NULL) { PyErr_SetString(PyExc_ValueError, "Illegal number of arguments"); return NULL; } - if (cipher_name != NULL) - { + if (cipher_name != NULL) { cipher = EVP_get_cipherbyname(cipher_name); - if (cipher == NULL) - { + if (cipher == NULL) { PyErr_SetString(PyExc_ValueError, "Invalid cipher name"); return NULL; } - if (PyBytes_Check(pw)) - { - cb = NULL; - cb_arg = PyBytes_AsString(pw); - } - else if (PyCallable_Check(pw)) - { - cb = global_passphrase_callback; - cb_arg = pw; - } - else - { - PyErr_SetString(PyExc_TypeError, "Last argument must be string or callable"); + if (!setup_callback(type, pw, &cb, &cb_arg)) { return NULL; } } bio = BIO_new(BIO_s_mem()); - switch (type) - { + if (bio == NULL) { + exception_from_error_queue(crypto_Error); + return NULL; + } + switch (type) { case X509_FILETYPE_PEM: ret = PEM_write_bio_PrivateKey(bio, pkey->pkey, cipher, NULL, 0, cb, cb_arg); - if (PyErr_Occurred()) - { - BIO_free(bio); - return NULL; - } break; case X509_FILETYPE_ASN1: @@ -215,8 +235,12 @@ crypto_dump_privatekey(PyObject *spam, PyObject *args) case X509_FILETYPE_TEXT: rsa = EVP_PKEY_get1_RSA(pkey->pkey); + if (rsa == NULL) { + ret = 0; + break; + } ret = RSA_print(bio, rsa, 0); - RSA_free(rsa); + RSA_free(rsa); break; default: @@ -225,11 +249,9 @@ crypto_dump_privatekey(PyObject *spam, PyObject *args) return NULL; } - if (ret == 0) - { + if (ret == 0) { BIO_free(bio); - exception_from_error_queue(crypto_Error); - return NULL; + return raise_current_error(); } buf_len = BIO_get_mem_data(bio, &temp); @@ -242,9 +264,9 @@ crypto_dump_privatekey(PyObject *spam, PyObject *args) static char crypto_load_certificate_doc[] = "\n\ Load a certificate from a buffer\n\ \n\ -@param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ +:param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ buffer - The buffer the certificate is stored in\n\ -@return: The X509 object\n\ +:return: The X509 object\n\ "; static PyObject * @@ -289,9 +311,9 @@ crypto_load_certificate(PyObject *spam, PyObject *args) static char crypto_dump_certificate_doc[] = "\n\ Dump a certificate to a buffer\n\ \n\ -@param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ -@param cert: The certificate to dump\n\ -@return: The buffer with the dumped certificate in\n\ +:param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ +:param cert: The certificate to dump\n\ +:return: The buffer with the dumped certificate in\n\ "; static PyObject * @@ -345,9 +367,9 @@ crypto_dump_certificate(PyObject *spam, PyObject *args) static char crypto_load_certificate_request_doc[] = "\n\ Load a certificate request from a buffer\n\ \n\ -@param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ +:param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ buffer - The buffer the certificate request is stored in\n\ -@return: The X509Req object\n\ +:return: The X509Req object\n\ "; static PyObject * @@ -392,9 +414,9 @@ crypto_load_certificate_request(PyObject *spam, PyObject *args) static char crypto_dump_certificate_request_doc[] = "\n\ Dump a certificate request to a buffer\n\ \n\ -@param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ +:param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ req - The certificate request to dump\n\ -@return: The buffer with the dumped certificate request in\n\ +:return: The buffer with the dumped certificate request in\n\ "; static PyObject * @@ -448,10 +470,10 @@ crypto_dump_certificate_request(PyObject *spam, PyObject *args) static char crypto_load_crl_doc[] = "\n\ Load a certificate revocation list from a buffer\n\ \n\ -@param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ -@param buffer: The buffer the CRL is stored in\n\ +:param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)\n\ +:param buffer: The buffer the CRL is stored in\n\ \n\ -@return: The PKey object\n\ +:return: The PKey object\n\ "; static PyObject * @@ -493,9 +515,9 @@ crypto_load_crl(PyObject *spam, PyObject *args) { static char crypto_load_pkcs7_data_doc[] = "\n\ Load pkcs7 data from a buffer\n\ \n\ -@param type: The file type (one of FILETYPE_PEM or FILETYPE_ASN1)\n\ +:param type: The file type (one of FILETYPE_PEM or FILETYPE_ASN1)\n\ buffer - The buffer with the pkcs7 data.\n\ -@return: The PKCS7 object\n\ +:return: The PKCS7 object\n\ "; static PyObject * @@ -509,8 +531,8 @@ crypto_load_pkcs7_data(PyObject *spam, PyObject *args) if (!PyArg_ParseTuple(args, "is#:load_pkcs7_data", &type, &buffer, &len)) return NULL; - /* - * Try to read the pkcs7 data from the bio + /* + * Try to read the pkcs7 data from the bio */ bio = BIO_new_mem_buf(buffer, len); switch (type) @@ -545,9 +567,9 @@ crypto_load_pkcs7_data(PyObject *spam, PyObject *args) static char crypto_load_pkcs12_doc[] = "\n\ Load a PKCS12 object from a buffer\n\ \n\ -@param buffer: The buffer the certificate is stored in\n\ +:param buffer: The buffer the certificate is stored in\n\ passphrase (Optional) - The password to decrypt the PKCS12 lump\n\ -@returns: The PKCS12 object\n\ +:returns: The PKCS12 object\n\ "; static PyObject * @@ -577,8 +599,8 @@ crypto_load_pkcs12(PyObject *spam, PyObject *args) static char crypto_X509_verify_cert_error_string_doc[] = "\n\ Get X509 verify certificate error string.\n\ \n\ -@param errnum: The error number.\n\ -@return: Error string as a Python string\n\ +:param errnum: The error number.\n\ +:return: Error string as a Python string\n\ "; static PyObject * @@ -607,10 +629,10 @@ crypto_exception_from_error_queue(PyObject *spam, PyObject *eggs) { static char crypto_sign_doc[] = "\n\ Sign data with a digest\n\ \n\ -@param pkey: Pkey to sign with\n\ -@param data: data to be signed\n\ -@param digest: message digest to use\n\ -@return: signature\n\ +:param pkey: Pkey to sign with\n\ +:param data: data to be signed\n\ +:param digest: message digest to use\n\ +:return: signature\n\ "; static PyObject * @@ -654,11 +676,11 @@ crypto_sign(PyObject *spam, PyObject *args) { static char crypto_verify_doc[] = "\n\ Verify a signature\n\ \n\ -@param cert: signing certificate (X509 object)\n\ -@param signature: signature returned by sign function\n\ -@param data: data to be verified\n\ -@param digest: message digest to use\n\ -@return: None if the signature is correct, raise exception otherwise\n\ +:param cert: signing certificate (X509 object)\n\ +:param signature: signature returned by sign function\n\ +:param data: data to be verified\n\ +:param digest: message digest to use\n\ +:return: None if the signature is correct, raise exception otherwise\n\ "; static PyObject * diff --git a/OpenSSL/crypto/netscape_spki.c b/OpenSSL/crypto/netscape_spki.c index 9369d50..8110a24 100644 --- a/OpenSSL/crypto/netscape_spki.c +++ b/OpenSSL/crypto/netscape_spki.c @@ -38,9 +38,9 @@ crypto_NetscapeSPKI_New(NETSCAPE_SPKI *name, int dealloc) static char crypto_NetscapeSPKI_doc[] = "\n\ NetscapeSPKI([enc]) -> NetscapeSPKI instance\n\ \n\ -@param enc: Base64 encoded NetscapeSPKI object.\n\ -@type enc: C{str}\n\ -@return: The NetscapeSPKI object\n\ +:param enc: Base64 encoded NetscapeSPKI object.\n\ +:type enc: :py:data:`str`\n\ +:return: The NetscapeSPKI object\n\ "; static PyObject * @@ -84,9 +84,9 @@ crypto_NetscapeSPKI_dealloc(crypto_NetscapeSPKIObj *self) static char crypto_NetscapeSPKI_sign_doc[] = "\n\ Sign the certificate request using the supplied key and digest\n\ \n\ -@param pkey: The key to sign with\n\ -@param digest: The message digest to use\n\ -@return: None\n\ +:param pkey: The key to sign with\n\ +:param digest: The message digest to use\n\ +:return: None\n\ "; static PyObject * @@ -129,9 +129,9 @@ crypto_NetscapeSPKI_sign(crypto_NetscapeSPKIObj *self, PyObject *args) static char crypto_NetscapeSPKI_verify_doc[] = "\n\ Verifies a certificate request using the supplied public key\n\ \n\ -@param key: a public key\n\ -@return: True if the signature is correct.\n\ -@raise OpenSSL.crypto.Error: If the signature is invalid or there is a\n\ +:param key: a public key\n\ +:return: True if the signature is correct.\n\ +:raise OpenSSL.crypto.Error: If the signature is invalid or there is a\n\ problem verifying the signature.\n\ "; @@ -156,7 +156,7 @@ crypto_NetscapeSPKI_verify(crypto_NetscapeSPKIObj *self, PyObject *args) static char crypto_NetscapeSPKI_b64_encode_doc[] = "\n\ Generate a base64 encoded string from an SPKI\n\ \n\ -@return: The base64 encoded string\n\ +:return: The base64 encoded string\n\ "; PyObject * @@ -175,7 +175,7 @@ crypto_NetscapeSPKI_b64_encode(crypto_NetscapeSPKIObj *self, PyObject *args) static char crypto_NetscapeSPKI_get_pubkey_doc[] = "\n\ Get the public key of the certificate\n\ \n\ -@return: The public key\n\ +:return: The public key\n\ "; static PyObject * @@ -204,8 +204,8 @@ crypto_NetscapeSPKI_get_pubkey(crypto_NetscapeSPKIObj *self, PyObject *args) static char crypto_NetscapeSPKI_set_pubkey_doc[] = "\n\ Set the public key of the certificate\n\ \n\ -@param pkey: The public key\n\ -@return: None\n\ +:param pkey: The public key\n\ +:return: None\n\ "; static PyObject * diff --git a/OpenSSL/crypto/pkcs12.c b/OpenSSL/crypto/pkcs12.c index a1a5a79..f8e66a8 100644 --- a/OpenSSL/crypto/pkcs12.c +++ b/OpenSSL/crypto/pkcs12.c @@ -26,7 +26,7 @@ static int crypto_PKCS12_clear(crypto_PKCS12Obj *self); static char crypto_PKCS12_get_certificate_doc[] = "\n\ Return certificate portion of the PKCS12 structure\n\ \n\ -@return: X509 object containing the certificate\n\ +:return: X509 object containing the certificate\n\ "; static PyObject * crypto_PKCS12_get_certificate(crypto_PKCS12Obj *self, PyObject *args) @@ -41,9 +41,9 @@ crypto_PKCS12_get_certificate(crypto_PKCS12Obj *self, PyObject *args) static char crypto_PKCS12_set_certificate_doc[] = "\n\ Replace the certificate portion of the PKCS12 structure\n\ \n\ -@param cert: The new certificate.\n\ -@type cert: L{X509} or L{NoneType}\n\ -@return: None\n\ +:param cert: The new certificate.\n\ +:type cert: :py:class:`X509` or :py:data:`None`\n\ +:return: None\n\ "; static PyObject * crypto_PKCS12_set_certificate(crypto_PKCS12Obj *self, PyObject *args, PyObject *keywds) { @@ -70,7 +70,7 @@ crypto_PKCS12_set_certificate(crypto_PKCS12Obj *self, PyObject *args, PyObject * static char crypto_PKCS12_get_privatekey_doc[] = "\n\ Return private key portion of the PKCS12 structure\n\ \n\ -@returns: PKey object containing the private key\n\ +:returns: PKey object containing the private key\n\ "; static crypto_PKeyObj * crypto_PKCS12_get_privatekey(crypto_PKCS12Obj *self, PyObject *args) @@ -85,9 +85,9 @@ crypto_PKCS12_get_privatekey(crypto_PKCS12Obj *self, PyObject *args) static char crypto_PKCS12_set_privatekey_doc[] = "\n\ Replace or set the certificate portion of the PKCS12 structure\n\ \n\ -@param pkey: The new private key.\n\ -@type pkey: L{PKey}\n\ -@return: None\n\ +:param pkey: The new private key.\n\ +:type pkey: :py:class:`PKey`\n\ +:return: None\n\ "; static PyObject * crypto_PKCS12_set_privatekey(crypto_PKCS12Obj *self, PyObject *args, PyObject *keywds) { @@ -114,7 +114,7 @@ crypto_PKCS12_set_privatekey(crypto_PKCS12Obj *self, PyObject *args, PyObject *k static char crypto_PKCS12_get_ca_certificates_doc[] = "\n\ Return CA certificates within of the PKCS12 object\n\ \n\ -@return: A newly created tuple containing the CA certificates in the chain,\n\ +:return: A newly created tuple containing the CA certificates in the chain,\n\ if any are present, or None if no CA certificates are present.\n\ "; static PyObject * @@ -130,9 +130,9 @@ crypto_PKCS12_get_ca_certificates(crypto_PKCS12Obj *self, PyObject *args) static char crypto_PKCS12_set_ca_certificates_doc[] = "\n\ Replace or set the CA certificates withing the PKCS12 object.\n\ \n\ -@param cacerts: The new CA certificates.\n\ -@type cacerts: Iterable of L{X509} or L{NoneType}\n\ -@return: None\n\ +:param cacerts: The new CA certificates.\n\ +:type cacerts: Iterable of :py:class:`X509` or :py:data:`None`\n\ +:return: None\n\ "; static PyObject * crypto_PKCS12_set_ca_certificates(crypto_PKCS12Obj *self, PyObject *args, PyObject *keywds) @@ -176,7 +176,7 @@ crypto_PKCS12_set_ca_certificates(crypto_PKCS12Obj *self, PyObject *args, PyObje static char crypto_PKCS12_get_friendlyname_doc[] = "\n\ Return friendly name portion of the PKCS12 structure\n\ \n\ -@returns: String containing the friendlyname\n\ +:returns: String containing the friendlyname\n\ "; static PyObject * crypto_PKCS12_get_friendlyname(crypto_PKCS12Obj *self, PyObject *args) { @@ -190,9 +190,9 @@ crypto_PKCS12_get_friendlyname(crypto_PKCS12Obj *self, PyObject *args) { static char crypto_PKCS12_set_friendlyname_doc[] = "\n\ Replace or set the certificate portion of the PKCS12 structure\n\ \n\ -@param name: The new friendly name.\n\ -@type name: L{str}\n\ -@return: None\n\ +:param name: The new friendly name.\n\ +:type name: :py:data:`str`\n\ +:return: None\n\ "; static PyObject * crypto_PKCS12_set_friendlyname(crypto_PKCS12Obj *self, PyObject *args, PyObject *keywds) { @@ -220,13 +220,13 @@ static char crypto_PKCS12_export_doc[] = "\n\ export([passphrase=None][, friendly_name=None][, iter=2048][, maciter=1]\n\ Dump a PKCS12 object as a string. See also \"man PKCS12_create\".\n\ \n\ -@param passphrase: used to encrypt the PKCS12\n\ -@type passphrase: L{str}\n\ -@param iter: How many times to repeat the encryption\n\ -@type iter: L{int}\n\ -@param maciter: How many times to repeat the MAC\n\ -@type maciter: L{int}\n\ -@return: The string containing the PKCS12\n\ +:param passphrase: used to encrypt the PKCS12\n\ +:type passphrase: :py:data:`str`\n\ +:param iter: How many times to repeat the encryption\n\ +:type iter: :py:data:`int`\n\ +:param maciter: How many times to repeat the MAC\n\ +:type maciter: :py:data:`int`\n\ +:return: The string containing the PKCS12\n\ "; static PyObject * crypto_PKCS12_export(crypto_PKCS12Obj *self, PyObject *args, PyObject *keywds) { @@ -439,7 +439,7 @@ PKCS12() -> PKCS12 instance\n\ \n\ Create a new empty PKCS12 object.\n\ \n\ -@returns: The PKCS12 object\n\ +:returns: The PKCS12 object\n\ "; static PyObject * crypto_PKCS12_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) { diff --git a/OpenSSL/crypto/pkcs7.c b/OpenSSL/crypto/pkcs7.c index 1770f7f..24adde8 100644 --- a/OpenSSL/crypto/pkcs7.c +++ b/OpenSSL/crypto/pkcs7.c @@ -15,7 +15,7 @@ static char crypto_PKCS7_type_is_signed_doc[] = "\n\ Check if this NID_pkcs7_signed object\n\ \n\ -@return: True if the PKCS7 is of type signed\n\ +:return: True if the PKCS7 is of type signed\n\ "; static PyObject * @@ -33,7 +33,7 @@ crypto_PKCS7_type_is_signed(crypto_PKCS7Obj *self, PyObject *args) static char crypto_PKCS7_type_is_enveloped_doc[] = "\n\ Check if this NID_pkcs7_enveloped object\n\ \n\ -@returns: True if the PKCS7 is of type enveloped\n\ +:returns: True if the PKCS7 is of type enveloped\n\ "; static PyObject * @@ -51,7 +51,7 @@ crypto_PKCS7_type_is_enveloped(crypto_PKCS7Obj *self, PyObject *args) static char crypto_PKCS7_type_is_signedAndEnveloped_doc[] = "\n\ Check if this NID_pkcs7_signedAndEnveloped object\n\ \n\ -@returns: True if the PKCS7 is of type signedAndEnveloped\n\ +:returns: True if the PKCS7 is of type signedAndEnveloped\n\ "; static PyObject * @@ -69,7 +69,7 @@ crypto_PKCS7_type_is_signedAndEnveloped(crypto_PKCS7Obj *self, PyObject *args) static char crypto_PKCS7_type_is_data_doc[] = "\n\ Check if this NID_pkcs7_data object\n\ \n\ -@return: True if the PKCS7 is of type data\n\ +:return: True if the PKCS7 is of type data\n\ "; static PyObject * @@ -87,7 +87,7 @@ crypto_PKCS7_type_is_data(crypto_PKCS7Obj *self, PyObject *args) static char crypto_PKCS7_get_type_name_doc[] = "\n\ Returns the type name of the PKCS7 structure\n\ \n\ -@return: A string with the typename\n\ +:return: A string with the typename\n\ "; static PyObject * diff --git a/OpenSSL/crypto/pkey.c b/OpenSSL/crypto/pkey.c index fc1cce5..f23ec70 100644 --- a/OpenSSL/crypto/pkey.c +++ b/OpenSSL/crypto/pkey.c @@ -30,9 +30,9 @@ do { \ static char crypto_PKey_generate_key_doc[] = "\n\ Generate a key of a given type, with a given number of a bits\n\ \n\ -@param type: The key type (TYPE_RSA or TYPE_DSA)\n\ -@param bits: The number of bits\n\ -@return: None\n\ +:param type: The key type (TYPE_RSA or TYPE_DSA)\n\ +:param bits: The number of bits\n\ +:return: None\n\ "; static PyObject * @@ -91,7 +91,7 @@ crypto_PKey_generate_key(crypto_PKeyObj *self, PyObject *args) static char crypto_PKey_bits_doc[] = "\n\ Returns the number of bits of the key\n\ \n\ -@return: The number of bits of the key.\n\ +:return: The number of bits of the key.\n\ "; static PyObject * @@ -106,7 +106,7 @@ crypto_PKey_bits(crypto_PKeyObj *self, PyObject *args) static char crypto_PKey_type_doc[] = "\n\ Returns the type of the key\n\ \n\ -@return: The type of the key.\n\ +:return: The type of the key.\n\ "; static PyObject * @@ -121,9 +121,9 @@ crypto_PKey_type(crypto_PKeyObj *self, PyObject *args) static char crypto_PKey_check_doc[] = "\n\ Check the consistency of an RSA private key.\n\ \n\ -@return: True if key is consistent.\n\ -@raise Error: if the key is inconsistent.\n\ -@raise TypeError: if the key is of a type which cannot be checked.\n\ +:return: True if key is consistent.\n\ +:raise Error: if the key is inconsistent.\n\ +:raise TypeError: if the key is of a type which cannot be checked.\n\ Only RSA keys can currently be checked.\n\ "; @@ -135,6 +135,11 @@ crypto_PKey_check(crypto_PKeyObj *self, PyObject *args) { return NULL; } + if (self->only_public) { + PyErr_SetString(PyExc_TypeError, "public key only"); + return NULL; + } + if (self->pkey->type == EVP_PKEY_RSA) { RSA *rsa; rsa = EVP_PKEY_get1_RSA(self->pkey); @@ -205,7 +210,7 @@ PKey() -> PKey instance\n\ \n\ Create a new PKey object.\n\ \n\ -@return: The PKey object\n\ +:return: The PKey object\n\ "; static PyObject* crypto_PKey_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) { diff --git a/OpenSSL/crypto/revoked.c b/OpenSSL/crypto/revoked.c index 93f9946..ed183b7 100644 --- a/OpenSSL/crypto/revoked.c +++ b/OpenSSL/crypto/revoked.c @@ -26,7 +26,7 @@ static const char *crl_reasons[] = { static char crypto_Revoked_all_reasons_doc[] = "\n\ Return a list of all the supported reason strings.\n\ \n\ -@return: A list of reason strings.\n\ +:return: A list of reason strings.\n\ "; static PyObject * crypto_Revoked_all_reasons(crypto_RevokedObj *self, PyObject *args) { @@ -126,9 +126,9 @@ reason_str_to_code(const char * reason_str) { static char crypto_Revoked_set_reason_doc[] = "\n\ Set the reason of a Revoked object.\n\ \n\ -@param reason: The reason string.\n\ -@type reason: L{str}\n\ -@return: None\n\ +:param reason: The reason string.\n\ +:type reason: :py:data:`str`\n\ +:return: None\n\ "; static PyObject * crypto_Revoked_set_reason(crypto_RevokedObj *self, PyObject *args, PyObject *keywds) { @@ -176,7 +176,7 @@ crypto_Revoked_set_reason(crypto_RevokedObj *self, PyObject *args, PyObject *key static char crypto_Revoked_get_reason_doc[] = "\n\ Return the reason of a Revoked object.\n\ \n\ -@return: The reason as a string\n\ +:return: The reason as a string\n\ "; static PyObject * crypto_Revoked_get_reason(crypto_RevokedObj *self, PyObject *args) { @@ -204,7 +204,7 @@ crypto_Revoked_get_reason(crypto_RevokedObj *self, PyObject *args) { static char crypto_Revoked_get_rev_date_doc[] = "\n\ Retrieve the revocation date\n\ \n\ -@return: A string giving the timestamp, in the format:\n\ +:return: A string giving the timestamp, in the format:\n\ \n\ YYYYMMDDhhmmssZ\n\ YYYYMMDDhhmmss+hhmm\n\ @@ -221,13 +221,13 @@ crypto_Revoked_get_rev_date(crypto_RevokedObj *self, PyObject *args) { static char crypto_Revoked_set_rev_date_doc[] = "\n\ Set the revocation timestamp\n\ \n\ -@param when: A string giving the timestamp, in the format:\n\ +:param when: A string giving the timestamp, in the format:\n\ \n\ YYYYMMDDhhmmssZ\n\ YYYYMMDDhhmmss+hhmm\n\ YYYYMMDDhhmmss-hhmm\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject* @@ -278,7 +278,7 @@ ASN1_INTEGER_to_PyString(ASN1_INTEGER *asn1_int) { static char crypto_Revoked_get_serial_doc[] = "\n\ Return the serial number of a Revoked structure\n\ \n\ -@return: The serial number as a string\n\ +:return: The serial number as a string\n\ "; static PyObject * crypto_Revoked_get_serial(crypto_RevokedObj *self, PyObject *args) { @@ -298,9 +298,9 @@ crypto_Revoked_get_serial(crypto_RevokedObj *self, PyObject *args) { static char crypto_Revoked_set_serial_doc[] = "\n\ Set the serial number of a revoked Revoked structure\n\ \n\ -@param hex_str: The new serial number.\n\ -@type hex_str: L{str}\n\ -@return: None\n\ +:param hex_str: The new serial number.\n\ +:type hex_str: :py:data:`str`\n\ +:return: None\n\ "; static PyObject * crypto_Revoked_set_serial(crypto_RevokedObj *self, PyObject *args, PyObject *keywds) { @@ -377,7 +377,7 @@ Revoked() -> Revoked instance\n\ \n\ Create a new empty Revoked object.\n\ \n\ -@returns: The Revoked object\n\ +:returns: The Revoked object\n\ "; static PyObject* crypto_Revoked_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) { diff --git a/OpenSSL/crypto/x509.c b/OpenSSL/crypto/x509.c index 0754dec..4329ddb 100644 --- a/OpenSSL/crypto/x509.c +++ b/OpenSSL/crypto/x509.c @@ -23,7 +23,7 @@ static char crypto_X509_get_version_doc[] = "\n\ Return version number of the certificate\n\ \n\ -@return: Version number as a Python integer\n\ +:return: Version number as a Python integer\n\ "; static PyObject * @@ -38,8 +38,8 @@ crypto_X509_get_version(crypto_X509Obj *self, PyObject *args) static char crypto_X509_set_version_doc[] = "\n\ Set version number of the certificate\n\ \n\ -@param version: The version number\n\ -@return: None\n\ +:param version: The version number\n\ +:return: None\n\ "; static PyObject * @@ -59,7 +59,7 @@ crypto_X509_set_version(crypto_X509Obj *self, PyObject *args) static char crypto_X509_get_serial_number_doc[] = "\n\ Return serial number of the certificate\n\ \n\ -@return: Serial number as a Python integer\n\ +:return: Serial number as a Python integer\n\ "; static PyObject * @@ -85,8 +85,8 @@ crypto_X509_get_serial_number(crypto_X509Obj *self, PyObject *args) static char crypto_X509_set_serial_number_doc[] = "\n\ Set serial number of the certificate\n\ \n\ -@param serial: The serial number\n\ -@return: None\n\ +:param serial: The serial number\n\ +:return: None\n\ "; static PyObject * @@ -176,7 +176,7 @@ crypto_X509_set_serial_number(crypto_X509Obj *self, PyObject *args) static char crypto_X509_get_issuer_doc[] = "\n\ Create an X509Name object for the issuer of the certificate\n\ \n\ -@return: An X509Name object\n\ +:return: An X509Name object\n\ "; static PyObject * @@ -201,9 +201,9 @@ crypto_X509_get_issuer(crypto_X509Obj *self, PyObject *args) static char crypto_X509_set_issuer_doc[] = "\n\ Set the issuer of the certificate\n\ \n\ -@param issuer: The issuer name\n\ -@type issuer: L{X509Name}\n\ -@return: None\n\ +:param issuer: The issuer name\n\ +:type issuer: :py:class:`X509Name`\n\ +:return: None\n\ "; static PyObject * @@ -228,7 +228,7 @@ crypto_X509_set_issuer(crypto_X509Obj *self, PyObject *args) static char crypto_X509_get_subject_doc[] = "\n\ Create an X509Name object for the subject of the certificate\n\ \n\ -@return: An X509Name object\n\ +:return: An X509Name object\n\ "; static PyObject * @@ -253,9 +253,9 @@ crypto_X509_get_subject(crypto_X509Obj *self, PyObject *args) static char crypto_X509_set_subject_doc[] = "\n\ Set the subject of the certificate\n\ \n\ -@param subject: The subject name\n\ -@type subject: L{X509Name}\n\ -@return: None\n\ +:param subject: The subject name\n\ +:type subject: :py:class:`X509Name`\n\ +:return: None\n\ "; static PyObject * @@ -280,7 +280,7 @@ crypto_X509_set_subject(crypto_X509Obj *self, PyObject *args) static char crypto_X509_get_pubkey_doc[] = "\n\ Get the public key of the certificate\n\ \n\ -@return: The public key\n\ +:return: The public key\n\ "; static PyObject * @@ -309,8 +309,8 @@ crypto_X509_get_pubkey(crypto_X509Obj *self, PyObject *args) static char crypto_X509_set_pubkey_doc[] = "\n\ Set the public key of the certificate\n\ \n\ -@param pkey: The public key\n\ -@return: None\n\ +:param pkey: The public key\n\ +:return: None\n\ "; static PyObject * @@ -358,13 +358,13 @@ _set_asn1_time(char *format, ASN1_TIME* timestamp, PyObject *args) static char crypto_X509_set_notBefore_doc[] = "\n\ Set the time stamp for when the certificate starts being valid\n\ \n\ -@param when: A string giving the timestamp, in the format:\n\ +:param when: A string giving the timestamp, in the format:\n\ \n\ YYYYMMDDhhmmssZ\n\ YYYYMMDDhhmmss+hhmm\n\ YYYYMMDDhhmmss-hhmm\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject* @@ -378,13 +378,13 @@ crypto_X509_set_notBefore(crypto_X509Obj *self, PyObject *args) static char crypto_X509_set_notAfter_doc[] = "\n\ Set the time stamp for when the certificate stops being valid\n\ \n\ -@param when: A string giving the timestamp, in the format:\n\ +:param when: A string giving the timestamp, in the format:\n\ \n\ YYYYMMDDhhmmssZ\n\ YYYYMMDDhhmmss+hhmm\n\ YYYYMMDDhhmmss-hhmm\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject* @@ -433,12 +433,13 @@ _get_asn1_time(char *format, ASN1_TIME* timestamp, PyObject *args) static char crypto_X509_get_notBefore_doc[] = "\n\ Retrieve the time stamp for when the certificate starts being valid\n\ \n\ -@return: A string giving the timestamp, in the format:\n\ +:return: A string giving the timestamp, in the format::\n\ \n\ YYYYMMDDhhmmssZ\n\ YYYYMMDDhhmmss+hhmm\n\ YYYYMMDDhhmmss-hhmm\n\ - or None if there is no value set.\n\ +\n\ + or None if there is no value set.\n\ "; static PyObject* @@ -455,12 +456,13 @@ crypto_X509_get_notBefore(crypto_X509Obj *self, PyObject *args) static char crypto_X509_get_notAfter_doc[] = "\n\ Retrieve the time stamp for when the certificate stops being valid\n\ \n\ -@return: A string giving the timestamp, in the format:\n\ +:return: A string giving the timestamp, in the format::\n\ \n\ YYYYMMDDhhmmssZ\n\ YYYYMMDDhhmmss+hhmm\n\ YYYYMMDDhhmmss-hhmm\n\ - or None if there is no value set.\n\ +\n\ + or None if there is no value set.\n\ "; static PyObject* @@ -478,9 +480,9 @@ static char crypto_X509_gmtime_adj_notBefore_doc[] = "\n\ Change the timestamp for when the certificate starts being valid to the current\n\ time plus an offset.\n \ \n\ -@param amount: The number of seconds by which to adjust the starting validity\n\ +:param amount: The number of seconds by which to adjust the starting validity\n\ time.\n\ -@return: None\n\ +:return: None\n\ "; static PyObject * @@ -500,9 +502,9 @@ crypto_X509_gmtime_adj_notBefore(crypto_X509Obj *self, PyObject *args) static char crypto_X509_gmtime_adj_notAfter_doc[] = "\n\ Adjust the time stamp for when the certificate stops being valid\n\ \n\ -@param amount: The number of seconds by which to adjust the ending validity\n\ +:param amount: The number of seconds by which to adjust the ending validity\n\ time.\n\ -@return: None\n\ +:return: None\n\ "; static PyObject * @@ -523,9 +525,9 @@ crypto_X509_gmtime_adj_notAfter(crypto_X509Obj *self, PyObject *args) static char crypto_X509_get_signature_algorithm_doc[] = "\n\ Retrieve the signature algorithm used in the certificate\n\ \n\ -@return: A byte string giving the name of the signature algorithm used in\n\ +:return: A byte string giving the name of the signature algorithm used in\n\ the certificate.\n\ -@raise ValueError: If the signature algorithm is undefined.\n\ +:raise ValueError: If the signature algorithm is undefined.\n\ "; static PyObject * @@ -550,9 +552,9 @@ crypto_X509_get_signature_algorithm(crypto_X509Obj *self, PyObject *args) { static char crypto_X509_sign_doc[] = "\n\ Sign the certificate using the supplied key and digest\n\ \n\ -@param pkey: The key to sign with\n\ -@param digest: The message digest to use\n\ -@return: None\n\ +:param pkey: The key to sign with\n\ +:param digest: The message digest to use\n\ +:return: None\n\ "; static PyObject * @@ -595,7 +597,7 @@ crypto_X509_sign(crypto_X509Obj *self, PyObject *args) static char crypto_X509_has_expired_doc[] = "\n\ Check whether the certificate has expired.\n\ \n\ -@return: True if the certificate has expired, false otherwise\n\ +:return: True if the certificate has expired, false otherwise\n\ "; static PyObject * @@ -616,7 +618,7 @@ crypto_X509_has_expired(crypto_X509Obj *self, PyObject *args) static char crypto_X509_subject_name_hash_doc[] = "\n\ Return the hash of the X509 subject.\n\ \n\ -@return: The hash of the subject\n\ +:return: The hash of the subject\n\ "; static PyObject * @@ -631,7 +633,7 @@ crypto_X509_subject_name_hash(crypto_X509Obj *self, PyObject *args) static char crypto_X509_digest_doc[] = "\n\ Return the digest of the X509 object.\n\ \n\ -@return: The digest of the object\n\ +:return: The digest of the object\n\ "; static PyObject * @@ -672,8 +674,8 @@ crypto_X509_digest(crypto_X509Obj *self, PyObject *args) static char crypto_X509_add_extensions_doc[] = "\n\ Add extensions to the certificate.\n\ \n\ -@param extensions: a sequence of X509Extension objects\n\ -@return: None\n\ +:param extensions: a sequence of X509Extension objects\n\ +:return: None\n\ "; static PyObject * @@ -717,7 +719,7 @@ crypto_X509_add_extensions(crypto_X509Obj *self, PyObject *args) static char crypto_X509_get_extension_count_doc[] = "\n\ Get the number of extensions on the certificate.\n\ \n\ -@return: Number of extensions as a Python integer\n\ +:return: Number of extensions as a Python integer\n\ "; static PyObject * @@ -732,8 +734,8 @@ crypto_X509_get_extension_count(crypto_X509Obj *self, PyObject *args) { static char crypto_X509_get_extension_doc[] = "\n\ Get a specific extension of the certificate by index.\n\ \n\ -@param index: The index of the extension to retrieve.\n\ -@return: The X509Extension object at the specified index.\n\ +:param index: The index of the extension to retrieve.\n\ +:return: The X509Extension object at the specified index.\n\ "; static PyObject * @@ -824,11 +826,11 @@ crypto_X509_New(X509 *cert, int dealloc) static char crypto_X509_doc[] = "\n\ -X509() -> X509 instance\n\ +A class representing X.509 certificates.\n\ \n\ Create a new X509 object.\n\ \n\ -@returns: The X509 object\n\ +:returns: The :class:`X509` object\n\ "; static PyObject * diff --git a/OpenSSL/crypto/x509ext.c b/OpenSSL/crypto/x509ext.c index adbe084..f65fd0f 100644 --- a/OpenSSL/crypto/x509ext.c +++ b/OpenSSL/crypto/x509ext.c @@ -16,7 +16,7 @@ static char crypto_X509Extension_get_critical_doc[] = "\n\ Returns the critical field of the X509Extension\n\ \n\ -@return: The critical field.\n\ +:return: The critical field.\n\ "; static PyObject * @@ -31,7 +31,7 @@ crypto_X509Extension_get_critical(crypto_X509ExtensionObj *self, PyObject *args) static char crypto_X509Extension_get_short_name_doc[] = "\n\ Returns the short version of the type name of the X509Extension\n\ \n\ -@return: The short type name.\n\ +:return: The short type name.\n\ "; static PyObject * @@ -54,7 +54,7 @@ crypto_X509Extension_get_short_name(crypto_X509ExtensionObj *self, PyObject *arg static char crypto_X509Extension_get_data_doc[] = "\n\ Returns the data of the X509Extension\n\ \n\ -@return: A C{str} giving the X509Extension's ASN.1 encoded data.\n\ +:return: A :py:data:`str` giving the X509Extension's ASN.1 encoded data.\n\ "; static PyObject * @@ -185,16 +185,16 @@ static char crypto_X509Extension_doc[] = "\n\ X509Extension(typename, critical, value[, subject][, issuer]) -> \n\ X509Extension instance\n\ \n\ -@param typename: The name of the extension to create.\n\ -@type typename: C{str}\n\ -@param critical: A flag indicating whether this is a critical extension.\n\ -@param value: The value of the extension.\n\ -@type value: C{str}\n\ -@param subject: Optional X509 cert to use as subject.\n\ -@type subject: C{X509}\n\ -@param issuer: Optional X509 cert to use as issuer.\n\ -@type issuer: C{X509}\n\ -@return: The X509Extension object\n\ +:param typename: The name of the extension to create.\n\ +:type typename: :py:data:`str`\n\ +:param critical: A flag indicating whether this is a critical extension.\n\ +:param value: The value of the extension.\n\ +:type value: :py:data:`str`\n\ +:param subject: Optional X509 cert to use as subject.\n\ +:type subject: :py:class:`X509`\n\ +:param issuer: Optional X509 cert to use as issuer.\n\ +:type issuer: :py:class:`X509`\n\ +:return: The X509Extension object\n\ "; static PyObject * diff --git a/OpenSSL/crypto/x509name.c b/OpenSSL/crypto/x509name.c index a62c957..705683e 100644 --- a/OpenSSL/crypto/x509name.c +++ b/OpenSSL/crypto/x509name.c @@ -48,8 +48,8 @@ X509Name(name) -> New X509Name object\n\ \n\ Create a new X509Name, copying the given X509Name instance.\n\ \n\ -@param name: An X509Name object to copy\n\ -@return: The X509Name object\n\ +:param name: An X509Name object to copy\n\ +:return: The X509Name object\n\ "; static PyObject * @@ -320,7 +320,7 @@ crypto_X509Name_repr(crypto_X509NameObj *self) static char crypto_X509Name_hash_doc[] = "\n\ Return the hash value of this name\n\ \n\ -@return: None\n\ +:return: None\n\ "; /* @@ -344,7 +344,7 @@ crypto_X509Name_hash(crypto_X509NameObj *self, PyObject* args) static char crypto_X509Name_der_doc[] = "\n\ Return the DER encoding of this name\n\ \n\ -@return: None\n\ +:return: None\n\ "; /* @@ -367,7 +367,7 @@ crypto_X509Name_der(crypto_X509NameObj *self, PyObject *args) static char crypto_X509Name_get_components_doc[] = "\n\ Returns the split-up components of this name.\n\ \n\ -@return: List of tuples (name, value).\n\ +:return: List of tuples (name, value).\n\ "; static PyObject * diff --git a/OpenSSL/crypto/x509req.c b/OpenSSL/crypto/x509req.c index a2d1f11..a331712 100644 --- a/OpenSSL/crypto/x509req.c +++ b/OpenSSL/crypto/x509req.c @@ -16,7 +16,7 @@ static char crypto_X509Req_get_subject_doc[] = "\n\ Create an X509Name object for the subject of the certificate request\n\ \n\ -@return: An X509Name object\n\ +:return: An X509Name object\n\ "; static PyObject * @@ -44,7 +44,7 @@ crypto_X509Req_get_subject(crypto_X509ReqObj *self, PyObject *args) static char crypto_X509Req_get_pubkey_doc[] = "\n\ Get the public key from the certificate request\n\ \n\ -@return: The public key\n\ +:return: The public key\n\ "; static PyObject * @@ -73,8 +73,8 @@ crypto_X509Req_get_pubkey(crypto_X509ReqObj *self, PyObject *args) static char crypto_X509Req_set_pubkey_doc[] = "\n\ Set the public key of the certificate request\n\ \n\ -@param pkey: The public key to use\n\ -@return: None\n\ +:param pkey: The public key to use\n\ +:return: None\n\ "; static PyObject * @@ -98,9 +98,9 @@ crypto_X509Req_set_pubkey(crypto_X509ReqObj *self, PyObject *args) static char crypto_X509Req_sign_doc[] = "\n\ Sign the certificate request using the supplied key and digest\n\ \n\ -@param pkey: The key to sign with\n\ -@param digest: The message digest to use\n\ -@return: None\n\ +:param pkey: The key to sign with\n\ +:param digest: The message digest to use\n\ +:return: None\n\ "; static PyObject * @@ -143,9 +143,9 @@ crypto_X509Req_sign(crypto_X509ReqObj *self, PyObject *args) static char crypto_X509Req_verify_doc[] = "\n\ Verifies a certificate request using the supplied public key\n\ \n\ -@param key: a public key\n\ -@return: True if the signature is correct.\n\ -@raise OpenSSL.crypto.Error: If the signature is invalid or there is a\n\ +:param key: a public key\n\ +:return: True if the signature is correct.\n\ +:raise OpenSSL.crypto.Error: If the signature is invalid or there is a\n\ problem verifying the signature.\n\ "; @@ -173,8 +173,8 @@ crypto_X509Req_verify(crypto_X509ReqObj *self, PyObject *args) static char crypto_X509Req_add_extensions_doc[] = "\n\ Add extensions to the request.\n\ \n\ -@param extensions: a sequence of X509Extension objects\n\ -@return: None\n\ +:param extensions: a sequence of X509Extension objects\n\ +:return: None\n\ "; static PyObject * @@ -234,8 +234,8 @@ static char crypto_X509Req_set_version_doc[] = "\n\ Set the version subfield (RFC 2459, section 4.1.2.1) of the certificate\n\ request.\n\ \n\ -@param version: The version number\n\ -@return: None\n\ +:param version: The version number\n\ +:return: None\n\ "; static PyObject * @@ -259,7 +259,7 @@ static char crypto_X509Req_get_version_doc[] = "\n\ Get the version subfield (RFC 2459, section 4.1.2.1) of the certificate\n\ request.\n\ \n\ -@return: an integer giving the value of the version subfield\n\ +:return: an integer giving the value of the version subfield\n\ "; static PyObject * @@ -328,7 +328,7 @@ X509Req() -> X509Req instance\n\ \n\ Create a new X509Req object.\n\ \n\ -@return: The X509Req object\n\ +:return: The X509Req object\n\ "; static PyObject * diff --git a/OpenSSL/crypto/x509store.c b/OpenSSL/crypto/x509store.c index bf22756..a9750ed 100644 --- a/OpenSSL/crypto/x509store.c +++ b/OpenSSL/crypto/x509store.c @@ -14,8 +14,8 @@ static char crypto_X509Store_add_cert_doc[] = "\n\ Add a certificate\n\ \n\ -@param cert: The certificate to add\n\ -@return: None\n\ +:param cert: The certificate to add\n\ +:return: None\n\ "; static PyObject * diff --git a/OpenSSL/rand/rand.c b/OpenSSL/rand/rand.c index 8307ac6..712ad56 100644 --- a/OpenSSL/rand/rand.c +++ b/OpenSSL/rand/rand.c @@ -33,9 +33,9 @@ See the file RATIONALE for a short explanation of why this module was written.\n static char rand_add_doc[] = "\n\ Add data with a given entropy to the PRNG\n\ \n\ -@param buffer: Buffer with random data\n\ -@param entropy: The entropy (in bytes) measurement of the buffer\n\ -@return: None\n\ +:param buffer: Buffer with random data\n\ +:param entropy: The entropy (in bytes) measurement of the buffer\n\ +:return: None\n\ "; static PyObject * @@ -57,8 +57,8 @@ rand_add(PyObject *spam, PyObject *args) static char rand_seed_doc[] = "\n\ Alias for rand_add, with entropy equal to length\n\ \n\ -@param buffer: Buffer with random data\n\ -@return: None\n\ +:param buffer: Buffer with random data\n\ +:return: None\n\ "; static PyObject * @@ -79,7 +79,7 @@ rand_seed(PyObject *spam, PyObject *args) static char rand_status_doc[] = "\n\ Retrieve the status of the PRNG\n\ \n\ -@return: True if the PRNG is seeded enough, false otherwise\n\ +:return: True if the PRNG is seeded enough, false otherwise\n\ "; static PyObject * @@ -96,7 +96,7 @@ static char rand_screen_doc[] = "\n\ Add the current contents of the screen to the PRNG state. Availability:\n\ Windows.\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject * @@ -116,9 +116,9 @@ Query an entropy gathering daemon (EGD) for random data and add it to the\n\ PRNG. I haven't found any problems when the socket is missing, the function\n\ just returns 0.\n\ \n\ -@param path: The path to the EGD socket\n\ -@param bytes: (optional) The number of bytes to read, default is 255\n\ -@returns: The number of bytes read (NB: a value of 0 isn't necessarily an\n\ +:param path: The path to the EGD socket\n\ +:param bytes: (optional) The number of bytes to read, default is 255\n\ +:returns: The number of bytes read (NB: a value of 0 isn't necessarily an\n\ error, check rand.status())\n\ "; @@ -137,7 +137,7 @@ rand_egd(PyObject *spam, PyObject *args) static char rand_cleanup_doc[] = "\n\ Erase the memory used by the PRNG.\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject * @@ -155,10 +155,10 @@ rand_cleanup(PyObject *spam, PyObject *args) static char rand_load_file_doc[] = "\n\ Seed the PRNG with data from a file\n\ \n\ -@param filename: The file to read data from\n\ -@param maxbytes: (optional) The number of bytes to read, default is\n\ +:param filename: The file to read data from\n\ +:param maxbytes: (optional) The number of bytes to read, default is\n\ to read the entire file\n\ -@return: The number of bytes read\n\ +:return: The number of bytes read\n\ "; static PyObject * @@ -176,8 +176,8 @@ rand_load_file(PyObject *spam, PyObject *args) static char rand_write_file_doc[] = "\n\ Save PRNG state to a file\n\ \n\ -@param filename: The file to write data to\n\ -@return: The number of bytes written\n\ +:param filename: The file to write data to\n\ +:return: The number of bytes written\n\ "; static PyObject * @@ -194,8 +194,8 @@ rand_write_file(PyObject *spam, PyObject *args) static char rand_bytes_doc[] = "\n\ Get some randomm bytes as a string.\n\ \n\ -@param num_bytes: The number of bytes to fetch\n\ -@return: A string of random bytes\n\ +:param num_bytes: The number of bytes to fetch\n\ +:return: A string of random bytes\n\ "; #if PY_VERSION_HEX < 0x02050000 diff --git a/OpenSSL/ssl/connection.c b/OpenSSL/ssl/connection.c index 9e9794b..9428376 100755 --- a/OpenSSL/ssl/connection.c +++ b/OpenSSL/ssl/connection.c @@ -251,7 +251,7 @@ handle_ssl_errors(SSL *ssl, int err, int ret) static char ssl_Connection_get_context_doc[] = "\n\ Get session context\n\ \n\ -@return: A Context object\n\ +:return: A Context object\n\ "; static PyObject * ssl_Connection_get_context(ssl_ConnectionObj *self, PyObject *args) { @@ -266,7 +266,7 @@ ssl_Connection_get_context(ssl_ConnectionObj *self, PyObject *args) { static char ssl_Connection_set_context_doc[] = "\n\ Switch this connection to a new session context\n\ \n\ -@param context: A L{Context} instance giving the new session context to use.\n\ +:param context: A :py:class:`Context` instance giving the new session context to use.\n\ \n\ "; static PyObject * @@ -305,7 +305,7 @@ static char ssl_Connection_get_servername_doc[] = "\n\ Retrieve the servername extension value if provided in the client hello\n\ message, or None if there wasn't one.\n\ \n\ -@return: A byte string giving the server name or C{None}.\n\ +:return: A byte string giving the server name or :py:data:`None`.\n\ \n\ "; static PyObject * @@ -331,7 +331,7 @@ ssl_Connection_get_servername(ssl_ConnectionObj *self, PyObject *args) { static char ssl_Connection_set_tlsext_host_name_doc[] = "\n\ Set the value of the servername extension to send in the client hello.\n\ \n\ -@param name: A byte string giving the name.\n\ +:param name: A byte string giving the name.\n\ \n\ "; static PyObject * @@ -354,7 +354,7 @@ ssl_Connection_set_tlsext_host_name(ssl_ConnectionObj *self, PyObject *args) { static char ssl_Connection_pending_doc[] = "\n\ Get the number of bytes that can be safely read from the connection\n\ \n\ -@return: The number of bytes available in the receive buffer.\n\ +:return: The number of bytes available in the receive buffer.\n\ "; static PyObject * ssl_Connection_pending(ssl_ConnectionObj *self, PyObject *args) { @@ -372,8 +372,8 @@ static char ssl_Connection_bio_write_doc[] = "\n\ When using non-socket connections this function sends\n\ \"dirty\" data that would have traveled in on the network.\n\ \n\ -@param buf: The string to put into the memory BIO.\n\ -@return: The number of bytes written\n\ +:param buf: The string to put into the memory BIO.\n\ +:return: The number of bytes written\n\ "; static PyObject * ssl_Connection_bio_write(ssl_ConnectionObj *self, PyObject *args) @@ -414,10 +414,10 @@ Send data on the connection. NOTE: If you get one of the WantRead,\n\ WantWrite or WantX509Lookup exceptions on this, you have to call the\n\ method again with the SAME buffer.\n\ \n\ -@param buf: The string to send\n\ -@param flags: (optional) Included for compatibility with the socket\n\ +:param buf: The string to send\n\ +:param flags: (optional) Included for compatibility with the socket\n\ API, the value is ignored\n\ -@return: The number of bytes written\n\ +:return: The number of bytes written\n\ "; static PyObject * ssl_Connection_send(ssl_ConnectionObj *self, PyObject *args) { @@ -425,17 +425,98 @@ ssl_Connection_send(ssl_ConnectionObj *self, PyObject *args) { char *buf; #if PY_VERSION_HEX >= 0x02060000 - Py_buffer pbuf; - if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags)) + /* + * Sit back and I'll tell you a story of intrigue and corruption, deceit and + * murder. + * + * A Py_buffer is used to hold any kind of byte-like data - a string, a + * memoryview, a buffer, etc. PyArg_ParseTuple takes whatever kind of + * object was supplied, notices the "s*" format specifier, and tries to copy + * the metadata for that object into the Py_buffer also passed in. + * + * According to the Python documentation: + * + * ... the caller is responsible for calling PyBuffer_Release with the + * structure after it has processed the data. + * + * Correct use of PyBuffer_Release is necessary due to the fact that + * Py_buffer must hold a reference to the original Python object from which + * it was initialized. PyBuffer_Release will decrement the reference count + * of that original object, allowing it to eventually be deallocated - but + * only after the Py_buffer is no longer in use. + * + * To support failures partway through parsing a format string, + * PyArg_ParseTuple maintains an internal PyListObject of PyCObjects it has + * created so far. This allows it to easily clean up these objects when + * parsing fails, before returning an error to the caller (incidentally, it + * also makes sure to clean up the Py_buffer it initialized in this case, by + * calling PyBuffer_Release - which means the caller *must not* use + * PyBuffer_Release when PyArg_ParseTuple fails; not exactly what the + * documentation directs). + * + * The PyCObjects are given destructors which clean up some structure + * PyArg_ParseTuple has created (or initialized) - often another PyObject + * which needs to be decref'd. + * + * When parsing completes, the reference count of the PyListObject is merely + * decremented. The normal Python garbage collection logic (the reference + * counting logic, in this case) takes over and collects both the list and + * all of the objects in it. When each PyCObject in the list is collected, + * it triggers its destructor to clean up the structure it wraps. This all + * happens immediately, before the Py_XDECREF of the PyListObject returns. + * + * The PyListObject is similarly destroyed in the success case, but not + * until each PyCObject it contains has had its destructor set to NULL to + * prevent it from cleaning up its contents. + * + * When PyArg_ParseTuple returns in an error case, therefore, + * PyRelease_Buffer has already been used on the Py_buffer passed to + * PyArg_ParseTuple. + * + * This is fortuitous, as the Py_buffer is typically (always?) allocated on + * the stack of the caller of PyArg_ParseTuple. Once that caller returns, + * that stack memory is no longer valid, and the Py_buffer may no longer be + * used. + * + * On a Python runtime which does not use reference counting, the + * PyListObject may not actually be collected before Py_XDECREF returns. It + * may not even be collected before PyArg_ParseTuple returns. In fact, in + * particularly unfortunate cases, it may even not be collected before the + * caller of PyArg_ParseTuple returns. It may not be called until long, + * long after the stack memory the Py_buffer was allocated on has been + * re-used for some other function call, after the memory holding a pointer + * to the structure that owns the memory the Py_buffer wrapped has been + * overwritten. When PyBuffer_Release is used on the Py_buffer in this + * case, it will try to decrement a random integer - probably part of a + * local variable on some part of the stack. + * + * The PyPy runtime does not use reference counting. + * + * The solution adopted here is to allocate the Py_buffer on the heap, + * instead. As there is no mechanism for learning when the PyCObject used + * by PyArg_ParseTuple to do its internal cleanup has had its way with the + * Py_buffer, the Py_buffer is leaked in the error case, to ensure it is + * still valid whenever PyBuffer_Release is called on it. + * + * Real programs should rarely, if ever, trigger the error case of + * PyArg_ParseTuple, so this is probably okay. Plus, I'm tired of this + * stupid bug. -exarkun + */ + + Py_buffer *pbuf = PyMem_Malloc(sizeof *pbuf); + + if (!PyArg_ParseTuple(args, "s*|i:send", pbuf, &flags)) { return NULL; + } - buf = pbuf.buf; - len = pbuf.len; + buf = pbuf->buf; + len = pbuf->len; #else - if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags)) + if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags)) { return NULL; + } #endif MY_BEGIN_ALLOW_THREADS(self->tstate) @@ -443,7 +524,8 @@ ssl_Connection_send(ssl_ConnectionObj *self, PyObject *args) { MY_END_ALLOW_THREADS(self->tstate) #if PY_VERSION_HEX >= 0x02060000 - PyBuffer_Release(&pbuf); + PyBuffer_Release(pbuf); + PyMem_Free(pbuf); #endif if (PyErr_Occurred()) @@ -469,10 +551,10 @@ Send \"all\" data on the connection. This calls send() repeatedly until\n\ all data is sent. If an error occurs, it's impossible to tell how much data\n\ has been sent.\n\ \n\ -@param buf: The string to send\n\ -@param flags: (optional) Included for compatibility with the socket\n\ +:param buf: The string to send\n\ +:param flags: (optional) Included for compatibility with the socket\n\ API, the value is ignored\n\ -@return: The number of bytes written\n\ +:return: The number of bytes written\n\ "; static PyObject * ssl_Connection_sendall(ssl_ConnectionObj *self, PyObject *args) @@ -482,16 +564,18 @@ ssl_Connection_sendall(ssl_ConnectionObj *self, PyObject *args) PyObject *pyret = Py_None; #if PY_VERSION_HEX >= 0x02060000 - Py_buffer pbuf; + Py_buffer *pbuf = PyMem_Malloc(sizeof *pbuf); - if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags)) + if (!PyArg_ParseTuple(args, "s*|i:sendall", pbuf, &flags)) { return NULL; + } - buf = pbuf.buf; - len = pbuf.len; + buf = pbuf->buf; + len = pbuf->len; #else - if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags)) + if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags)) { return NULL; + } #endif do { @@ -520,7 +604,8 @@ ssl_Connection_sendall(ssl_ConnectionObj *self, PyObject *args) } while (len > 0); #if PY_VERSION_HEX >= 0x02060000 - PyBuffer_Release(&pbuf); + PyBuffer_Release(pbuf); + PyMem_Free(pbuf); #endif Py_XINCREF(pyret); @@ -532,10 +617,10 @@ Receive data on the connection. NOTE: If you get one of the WantRead,\n\ WantWrite or WantX509Lookup exceptions on this, you have to call the\n\ method again with the SAME buffer.\n\ \n\ -@param bufsiz: The maximum number of bytes to read\n\ -@param flags: (optional) Included for compatibility with the socket\n\ +:param bufsiz: The maximum number of bytes to read\n\ +:param flags: (optional) Included for compatibility with the socket\n\ API, the value is ignored\n\ -@return: The string read from the Connection\n\ +:return: The string read from the Connection\n\ "; static PyObject * ssl_Connection_recv(ssl_ConnectionObj *self, PyObject *args) @@ -580,8 +665,8 @@ static char ssl_Connection_bio_read_doc[] = "\n\ When using non-socket connections this function reads\n\ the \"dirty\" data that would have traveled away on the network.\n\ \n\ -@param bufsiz: The maximum number of bytes to read\n\ -@return: The string read.\n\ +:param bufsiz: The maximum number of bytes to read\n\ +:return: The string read.\n\ "; static PyObject * ssl_Connection_bio_read(ssl_ConnectionObj *self, PyObject *args) @@ -634,7 +719,7 @@ ssl_Connection_bio_read(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_renegotiate_doc[] = "\n\ Renegotiate the session\n\ \n\ -@return: True if the renegotiation can be started, false otherwise\n\ +:return: True if the renegotiation can be started, false otherwise\n\ "; static PyObject * ssl_Connection_renegotiate(ssl_ConnectionObj *self, PyObject *args) { @@ -660,7 +745,7 @@ static char ssl_Connection_do_handshake_doc[] = "\n\ Perform an SSL handshake (usually called after renegotiate() or one of\n\ set_*_state()). This can raise the same exceptions as send and recv.\n\ \n\ -@return: None.\n\ +:return: None.\n\ "; static PyObject * ssl_Connection_do_handshake(ssl_ConnectionObj *self, PyObject *args) @@ -698,7 +783,7 @@ static char ssl_Connection_renegotiate_pending_doc[] = "\n\ Check if there's a renegotiation in progress, it will return false once\n\ a renegotiation is finished.\n\ \n\ -@return: Whether there's a renegotiation in progress\n\ +:return: Whether there's a renegotiation in progress\n\ "; static PyObject * ssl_Connection_renegotiate_pending(ssl_ConnectionObj *self, PyObject *args) @@ -713,7 +798,7 @@ ssl_Connection_renegotiate_pending(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_total_renegotiations_doc[] = "\n\ Find out the total number of renegotiations.\n\ \n\ -@return: The number of renegotiations.\n\ +:return: The number of renegotiations.\n\ "; static PyObject * ssl_Connection_total_renegotiations(ssl_ConnectionObj *self, PyObject *args) @@ -728,7 +813,7 @@ static char ssl_Connection_set_accept_state_doc[] = "\n\ Set the connection to work in server mode. The handshake will be handled\n\ automatically by read/write.\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject * ssl_Connection_set_accept_state(ssl_ConnectionObj *self, PyObject *args) @@ -746,7 +831,7 @@ static char ssl_Connection_set_connect_state_doc[] = "\n\ Set the connection to work in client mode. The handshake will be handled\n\ automatically by read/write.\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject * ssl_Connection_set_connect_state(ssl_ConnectionObj *self, PyObject *args) @@ -763,8 +848,8 @@ ssl_Connection_set_connect_state(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_connect_doc[] = "\n\ Connect to remote host and set up client-side SSL\n\ \n\ -@param addr: A remote address\n\ -@return: What the socket's connect method returns\n\ +:param addr: A remote address\n\ +:return: What the socket's connect method returns\n\ "; static PyObject * ssl_Connection_connect(ssl_ConnectionObj *self, PyObject *args) @@ -788,8 +873,8 @@ static char ssl_Connection_connect_ex_doc[] = "\n\ Connect to remote host and set up client-side SSL. Note that if the socket's\n\ connect_ex method doesn't return 0, SSL won't be initialized.\n\ \n\ -@param addr: A remove address\n\ -@return: What the socket's connect_ex method returns\n\ +:param addr: A remove address\n\ +:return: What the socket's connect_ex method returns\n\ "; static PyObject * ssl_Connection_connect_ex(ssl_ConnectionObj *self, PyObject *args) @@ -809,7 +894,7 @@ ssl_Connection_connect_ex(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_accept_doc[] = "\n\ Accept incoming connection and set up SSL on it\n\ \n\ -@return: A (conn,addr) pair where conn is a Connection and addr is an\n\ +:return: A (conn,addr) pair where conn is a Connection and addr is an\n\ address\n\ "; static PyObject * @@ -853,7 +938,7 @@ static char ssl_Connection_bio_shutdown_doc[] = "\n\ When using non-socket connections this function signals end of\n\ data on the input for this connection.\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject * @@ -875,7 +960,7 @@ ssl_Connection_bio_shutdown(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_shutdown_doc[] = "\n\ Send closure alert\n\ \n\ -@return: True if the shutdown completed successfully (i.e. both sides\n\ +:return: True if the shutdown completed successfully (i.e. both sides\n\ have sent closure alerts), false otherwise (i.e. you have to\n\ wait for a ZeroReturnError on a recv() method call\n\ "; @@ -917,7 +1002,7 @@ ssl_Connection_shutdown(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_get_cipher_list_doc[] = "\n\ Get the session cipher list\n\ \n\ -@return: A list of cipher strings\n\ +:return: A list of cipher strings\n\ "; static PyObject * ssl_Connection_get_cipher_list(ssl_ConnectionObj *self, PyObject *args) @@ -943,9 +1028,9 @@ ssl_Connection_get_cipher_list(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_get_client_ca_list_doc[] = "\n\ Get CAs whose certificates are suggested for client authentication.\n\ \n\ -@return: If this is a server connection, a list of X509Names representing\n\ - the acceptable CAs as set by L{OpenSSL.SSL.Context.set_client_ca_list} or\n\ - L{OpenSSL.SSL.Context.add_client_ca}. If this is a client connection,\n\ +:return: If this is a server connection, a list of X509Names representing\n\ + the acceptable CAs as set by :py:meth:`OpenSSL.SSL.Context.set_client_ca_list` or\n\ + :py:meth:`OpenSSL.SSL.Context.add_client_ca`. If this is a client connection,\n\ the list of such X509Names sent by the server, or an empty list if that\n\ has not yet happened.\n\ "; @@ -997,7 +1082,7 @@ static char ssl_Connection_makefile_doc[] = "\n\ The makefile() method is not implemented, since there is no dup semantics\n\ for SSL connections\n\ \n\ -@raise NotImplementedError\n\ +:raise NotImplementedError\n\ "; static PyObject * ssl_Connection_makefile(ssl_ConnectionObj *self, PyObject *args) @@ -1009,7 +1094,7 @@ ssl_Connection_makefile(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_get_app_data_doc[] = "\n\ Get application data\n\ \n\ -@return: The application data\n\ +:return: The application data\n\ "; static PyObject * ssl_Connection_get_app_data(ssl_ConnectionObj *self, PyObject *args) @@ -1024,8 +1109,8 @@ ssl_Connection_get_app_data(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_set_app_data_doc[] = "\n\ Set application data\n\ \n\ -@param data - The application data\n\ -@return: None\n\ +:param data - The application data\n\ +:return: None\n\ "; static PyObject * ssl_Connection_set_app_data(ssl_ConnectionObj *self, PyObject *args) @@ -1046,7 +1131,7 @@ ssl_Connection_set_app_data(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_get_shutdown_doc[] = "\n\ Get shutdown state\n\ \n\ -@return: The shutdown state, a bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.\n\ +:return: The shutdown state, a bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.\n\ "; static PyObject * ssl_Connection_get_shutdown(ssl_ConnectionObj *self, PyObject *args) @@ -1060,8 +1145,8 @@ ssl_Connection_get_shutdown(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_set_shutdown_doc[] = "\n\ Set shutdown state\n\ \n\ -@param state - bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.\n\ -@return: None\n\ +:param state - bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.\n\ +:return: None\n\ "; static PyObject * ssl_Connection_set_shutdown(ssl_ConnectionObj *self, PyObject *args) @@ -1079,7 +1164,7 @@ ssl_Connection_set_shutdown(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_state_string_doc[] = "\n\ Get a verbose state description\n\ \n\ -@return: A string representing the state\n\ +:return: A string representing the state\n\ "; static PyObject * ssl_Connection_state_string(ssl_ConnectionObj *self, PyObject *args) @@ -1093,7 +1178,7 @@ ssl_Connection_state_string(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_client_random_doc[] = "\n\ Get a copy of the client hello nonce.\n\ \n\ -@return: A string representing the state\n\ +:return: A string representing the state\n\ "; static PyObject * ssl_Connection_client_random(ssl_ConnectionObj *self, PyObject *args) @@ -1111,7 +1196,7 @@ ssl_Connection_client_random(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_server_random_doc[] = "\n\ Get a copy of the server hello nonce.\n\ \n\ -@return: A string representing the state\n\ +:return: A string representing the state\n\ "; static PyObject * ssl_Connection_server_random(ssl_ConnectionObj *self, PyObject *args) @@ -1129,7 +1214,7 @@ ssl_Connection_server_random(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_master_key_doc[] = "\n\ Get a copy of the master key.\n\ \n\ -@return: A string representing the state\n\ +:return: A string representing the state\n\ "; static PyObject * ssl_Connection_master_key(ssl_ConnectionObj *self, PyObject *args) @@ -1147,7 +1232,7 @@ ssl_Connection_master_key(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_sock_shutdown_doc[] = "\n\ See shutdown(2)\n\ \n\ -@return: What the socket's shutdown() method returns\n\ +:return: What the socket's shutdown() method returns\n\ "; static PyObject * ssl_Connection_sock_shutdown(ssl_ConnectionObj *self, PyObject *args) @@ -1164,7 +1249,7 @@ ssl_Connection_sock_shutdown(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_get_peer_certificate_doc[] = "\n\ Retrieve the other side's certificate (if any)\n\ \n\ -@return: The peer's certificate\n\ +:return: The peer's certificate\n\ "; static PyObject * ssl_Connection_get_peer_certificate(ssl_ConnectionObj *self, PyObject *args) @@ -1189,7 +1274,7 @@ ssl_Connection_get_peer_certificate(ssl_ConnectionObj *self, PyObject *args) static char ssl_Connection_get_peer_cert_chain_doc[] = "\n\ Retrieve the other side's certificate (if any)\n\ \n\ -@return: A list of X509 instances giving the peer's certificate chain,\n\ +:return: A list of X509 instances giving the peer's certificate chain,\n\ or None if it does not have one.\n\ "; static PyObject * @@ -1228,7 +1313,7 @@ static char ssl_Connection_want_read_doc[] = "\n\ Checks if more data has to be read from the transport layer to complete an\n\ operation.\n\ \n\ -@return: True iff more data has to be read\n\ +:return: True iff more data has to be read\n\ "; static PyObject * ssl_Connection_want_read(ssl_ConnectionObj *self, PyObject *args) @@ -1243,7 +1328,7 @@ static char ssl_Connection_want_write_doc[] = "\n\ Checks if there is data to write to the transport layer to complete an\n\ operation.\n\ \n\ -@return: True iff there is data to write\n\ +:return: True iff there is data to write\n\ "; static PyObject * ssl_Connection_want_write(ssl_ConnectionObj *self, PyObject *args) @@ -1254,6 +1339,63 @@ ssl_Connection_want_write(ssl_ConnectionObj *self, PyObject *args) return PyLong_FromLong((long)SSL_want_write(self->ssl)); } +static char ssl_Connection_get_session_doc[] = "\n\ +Returns the Session currently used.\n\ +\n\ +@return: An instance of :py:class:`OpenSSL.SSL.Session` or :py:obj:`None` if\n\ + no session exists.\n\ +"; +static PyObject * +ssl_Connection_get_session(ssl_ConnectionObj *self, PyObject *args) { + ssl_SessionObj *session; + SSL_SESSION *native_session; + + if (!PyArg_ParseTuple(args, ":get_session")) { + return NULL; + } + + native_session = SSL_get1_session(self->ssl); + + if (native_session == NULL) { + Py_INCREF(Py_None); + return Py_None; + } + + session = ssl_Session_from_SSL_SESSION(native_session); + if (!session) { + Py_INCREF(Py_None); + return Py_None; + } + + return (PyObject*)session; +} + +static char ssl_Connection_set_session_doc[] = "\n\ +Set the session to be used when the TLS/SSL connection is established.\n\ +\n\ +:param session: A Session instance representing the session to use.\n\ +:returns: None\n\ +"; +static PyObject * +ssl_Connection_set_session(ssl_ConnectionObj *self, PyObject *args) { + ssl_SessionObj *session; + + if (!PyArg_ParseTuple(args, "O!:set_session", &ssl_Session_Type, &session)) { + return NULL; + } + + if (SSL_set_session(self->ssl, session->session) == 0) { + /* The only case which leads to this seems to be a mismatch, between + * this connection and the session, of the SSL method. + */ + exception_from_error_queue(ssl_Error); + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + /* * Member methods in the Connection object * ADD_METHOD(name) expands to a correct PyMethodDef declaration @@ -1309,6 +1451,8 @@ static PyMethodDef ssl_Connection_methods[] = ADD_METHOD(want_write), ADD_METHOD(set_accept_state), ADD_METHOD(set_connect_state), + ADD_METHOD(get_session), + ADD_METHOD(set_session), { NULL, NULL } }; #undef ADD_ALIAS @@ -1320,8 +1464,8 @@ Connection(context, socket) -> Connection instance\n\ Create a new Connection object, using the given OpenSSL.SSL.Context instance\n\ and socket.\n\ \n\ -@param context: An SSL Context to use for this connection\n\ -@param socket: The socket to use for transport layer\n\ +:param context: An SSL Context to use for this connection\n\ +:param socket: The socket to use for transport layer\n\ "; /* diff --git a/OpenSSL/ssl/context.c b/OpenSSL/ssl/context.c index c2bdcab..e971c0a 100644 --- a/OpenSSL/ssl/context.c +++ b/OpenSSL/ssl/context.c @@ -292,7 +292,7 @@ Context(method) -> Context instance\n\ OpenSSL.SSL.Context instances define the parameters for setting up new SSL\n\ connections.\n\ \n\ -@param method: One of " SSLv2_METHOD_TEXT "SSLv3_METHOD, SSLv23_METHOD, or\n\ +:param method: One of " SSLv2_METHOD_TEXT "SSLv3_METHOD, SSLv23_METHOD, or\n\ TLSv1_METHOD.\n\ "; @@ -302,9 +302,9 @@ static char ssl_Context_load_verify_locations_doc[] = "\n\ Let SSL know where we can find trusted certificates for the certificate\n\ chain\n\ \n\ -@param cafile: In which file we can find the certificates\n\ -@param capath: In which directory we can find the certificates\n\ -@return: None\n\ +:param cafile: In which file we can find the certificates\n\ +:param capath: In which directory we can find the certificates\n\ +:return: None\n\ "; static PyObject * ssl_Context_load_verify_locations(ssl_ContextObj *self, PyObject *args) { @@ -330,7 +330,7 @@ ssl_Context_load_verify_locations(ssl_ContextObj *self, PyObject *args) { static char ssl_Context_set_default_verify_paths_doc[] = "\n\ Use the platform-specific CA certificate locations\n\ \n\ -@return: None\n\ +:return: None\n\ "; static PyObject * ssl_Context_set_default_verify_paths(ssl_ContextObj *self, PyObject *args) { @@ -354,10 +354,10 @@ ssl_Context_set_default_verify_paths(ssl_ContextObj *self, PyObject *args) { static char ssl_Context_set_passwd_cb_doc[] = "\n\ Set the passphrase callback\n\ \n\ -@param callback: The Python callback to use\n\ -@param userdata: (optional) A Python object which will be given as\n\ +:param callback: The Python callback to use\n\ +:param userdata: (optional) A Python object which will be given as\n\ argument to the callback\n\ -@return: None\n\ +:return: None\n\ "; static PyObject * ssl_Context_set_passwd_cb(ssl_ContextObj *self, PyObject *args) @@ -459,8 +459,8 @@ parse_certificate_argument(const char* format, PyObject* args) { static char ssl_Context_add_extra_chain_cert_doc[] = "\n\ Add certificate to chain\n\ \n\ -@param certobj: The X509 certificate object to add to the chain\n\ -@return: None\n\ +:param certobj: The X509 certificate object to add to the chain\n\ +:return: None\n\ "; static PyObject * @@ -496,8 +496,8 @@ ssl_Context_add_extra_chain_cert(ssl_ContextObj *self, PyObject *args) static char ssl_Context_use_certificate_chain_file_doc[] = "\n\ Load a certificate chain from a file\n\ \n\ -@param certfile: The name of the certificate chain file\n\ -@return: None\n\ +:param certfile: The name of the certificate chain file\n\ +:return: None\n\ "; static PyObject * ssl_Context_use_certificate_chain_file(ssl_ContextObj *self, PyObject *args) @@ -523,9 +523,9 @@ ssl_Context_use_certificate_chain_file(ssl_ContextObj *self, PyObject *args) static char ssl_Context_use_certificate_file_doc[] = "\n\ Load a certificate from a file\n\ \n\ -@param certfile: The name of the certificate file\n\ -@param filetype: (optional) The encoding of the file, default is PEM\n\ -@return: None\n\ +:param certfile: The name of the certificate file\n\ +:param filetype: (optional) The encoding of the file, default is PEM\n\ +:return: None\n\ "; static PyObject * ssl_Context_use_certificate_file(ssl_ContextObj *self, PyObject *args) @@ -551,8 +551,8 @@ ssl_Context_use_certificate_file(ssl_ContextObj *self, PyObject *args) static char ssl_Context_use_certificate_doc[] = "\n\ Load a certificate from a X509 object\n\ \n\ -@param cert: The X509 object\n\ -@return: None\n\ +:param cert: The X509 object\n\ +:return: None\n\ "; static PyObject * ssl_Context_use_certificate(ssl_ContextObj *self, PyObject *args) @@ -578,9 +578,9 @@ ssl_Context_use_certificate(ssl_ContextObj *self, PyObject *args) static char ssl_Context_use_privatekey_file_doc[] = "\n\ Load a private key from a file\n\ \n\ -@param keyfile: The name of the key file\n\ -@param filetype: (optional) The encoding of the file, default is PEM\n\ -@return: None\n\ +:param keyfile: The name of the key file\n\ +:param filetype: (optional) The encoding of the file, default is PEM\n\ +:return: None\n\ "; static PyObject * ssl_Context_use_privatekey_file(ssl_ContextObj *self, PyObject *args) @@ -616,8 +616,8 @@ ssl_Context_use_privatekey_file(ssl_ContextObj *self, PyObject *args) static char ssl_Context_use_privatekey_doc[] = "\n\ Load a private key from a PKey object\n\ \n\ -@param pkey: The PKey object\n\ -@return: None\n\ +:param pkey: The PKey object\n\ +:return: None\n\ "; static PyObject * ssl_Context_use_privatekey(ssl_ContextObj *self, PyObject *args) { @@ -646,7 +646,7 @@ ssl_Context_use_privatekey(ssl_ContextObj *self, PyObject *args) { static char ssl_Context_check_privatekey_doc[] = "\n\ Check that the private key and certificate match up\n\ \n\ -@return: None (raises an exception if something's wrong)\n\ +:return: None (raises an exception if something's wrong)\n\ "; static PyObject * ssl_Context_check_privatekey(ssl_ContextObj *self, PyObject *args) @@ -667,13 +667,13 @@ ssl_Context_check_privatekey(ssl_ContextObj *self, PyObject *args) } static char ssl_Context_load_client_ca_doc[] = "\n\ -Load the trusted certificates that will be sent to the client (basically\n \ +Load the trusted certificates that will be sent to the client (basically\n\ telling the client \"These are the guys I trust\"). Does not actually\n\ imply any of the certificates are trusted; that must be configured\n\ separately.\n\ \n\ -@param cafile: The name of the certificates file\n\ -@return: None\n\ +:param cafile: The name of the certificates file\n\ +:return: None\n\ "; static PyObject * ssl_Context_load_client_ca(ssl_ContextObj *self, PyObject *args) @@ -690,11 +690,11 @@ ssl_Context_load_client_ca(ssl_ContextObj *self, PyObject *args) } static char ssl_Context_set_session_id_doc[] = "\n\ -Set the session identifier, this is needed if you want to do session\n\ -resumption (which, ironically, isn't implemented yet)\n\ +Set the session identifier. This is needed if you want to do session\n\ +resumption.\n\ \n\ -@param buf: A Python object that can be safely converted to a string\n\ -@returns: None\n\ +:param buf: A Python object that can be safely converted to a string\n\ +:returns: None\n\ "; static PyObject * ssl_Context_set_session_id(ssl_ContextObj *self, PyObject *args) @@ -717,13 +717,46 @@ ssl_Context_set_session_id(ssl_ContextObj *self, PyObject *args) } } +static char ssl_Context_set_session_cache_mode_doc[] = "\n\ +Enable/disable session caching and specify the mode used.\n\ +\n\ +:param mode: One or more of the SESS_CACHE_* flags (combine using bitwise or)\n\ +:returns: The previously set caching mode.\n\ +"; +static PyObject * +ssl_Context_set_session_cache_mode(ssl_ContextObj *self, PyObject *args) { + long mode, result; + + if (!PyArg_ParseTuple(args, "l:set_session_cache_mode", &mode)) { + return NULL; + } + + result = SSL_CTX_set_session_cache_mode(self->ctx, mode); + return PyLong_FromLong(result); + +} + +static char ssl_Context_get_session_cache_mode_doc[] = "\n\ +:returns: The currently used cache mode.\n\ +"; +static PyObject * +ssl_Context_get_session_cache_mode(ssl_ContextObj *self, PyObject *args) { + long result; + + if (!PyArg_ParseTuple(args, ":get_session_cache_mode")) { + return NULL; + } + result = SSL_CTX_get_session_cache_mode(self->ctx); + return PyLong_FromLong(result); +} + static char ssl_Context_set_verify_doc[] = "\n\ Set the verify mode and verify callback\n\ \n\ -@param mode: The verify mode, this is either VERIFY_NONE or\n\ +:param mode: The verify mode, this is either VERIFY_NONE or\n\ VERIFY_PEER combined with possible other flags\n\ -@param callback: The Python callback to use\n\ -@return: None\n\ +:param callback: The Python callback to use\n\ +:return: None\n\ \n\ See SSL_CTX_set_verify(3SSL) for further details.\n\ "; @@ -754,8 +787,8 @@ ssl_Context_set_verify(ssl_ContextObj *self, PyObject *args) static char ssl_Context_set_verify_depth_doc[] = "\n\ Set the verify depth\n\ \n\ -@param depth: An integer specifying the verify depth\n\ -@return: None\n\ +:param depth: An integer specifying the verify depth\n\ +:return: None\n\ "; static PyObject * ssl_Context_set_verify_depth(ssl_ContextObj *self, PyObject *args) @@ -773,7 +806,7 @@ ssl_Context_set_verify_depth(ssl_ContextObj *self, PyObject *args) static char ssl_Context_get_verify_mode_doc[] = "\n\ Get the verify mode\n\ \n\ -@return: The verify mode\n\ +:return: The verify mode\n\ "; static PyObject * ssl_Context_get_verify_mode(ssl_ContextObj *self, PyObject *args) @@ -790,7 +823,7 @@ ssl_Context_get_verify_mode(ssl_ContextObj *self, PyObject *args) static char ssl_Context_get_verify_depth_doc[] = "\n\ Get the verify depth\n\ \n\ -@return: The verify depth\n\ +:return: The verify depth\n\ "; static PyObject * ssl_Context_get_verify_depth(ssl_ContextObj *self, PyObject *args) @@ -807,8 +840,8 @@ ssl_Context_get_verify_depth(ssl_ContextObj *self, PyObject *args) static char ssl_Context_load_tmp_dh_doc[] = "\n\ Load parameters for Ephemeral Diffie-Hellman\n\ \n\ -@param dhfile: The file to load EDH parameters from\n\ -@return: None\n\ +:param dhfile: The file to load EDH parameters from\n\ +:return: None\n\ "; static PyObject * ssl_Context_load_tmp_dh(ssl_ContextObj *self, PyObject *args) @@ -838,8 +871,8 @@ ssl_Context_load_tmp_dh(ssl_ContextObj *self, PyObject *args) static char ssl_Context_set_cipher_list_doc[] = "\n\ Change the cipher list\n\ \n\ -@param cipher_list: A cipher list, see ciphers(1)\n\ -@return: None\n\ +:param cipher_list: A cipher list, see ciphers(1)\n\ +:return: None\n\ "; static PyObject * ssl_Context_set_cipher_list(ssl_ContextObj *self, PyObject *args) @@ -867,8 +900,8 @@ Set the list of preferred client certificate signers for this server context.\n\ This list of certificate authorities will be sent to the client when the\n\ server requests a client certificate.\n\ \n\ -@param certificate_authorities: a sequence of X509Names.\n\ -@return: None\n\ +:param certificate_authorities: a sequence of X509Names.\n\ +:return: None\n\ "; static PyObject * @@ -945,8 +978,8 @@ Add the CA certificate to the list of preferred signers for this context.\n\ The list of certificate authorities will be sent to the client when the\n\ server requests a client certificate.\n\ \n\ -@param certificate_authority: certificate authority's X509 certificate.\n\ -@return: None\n\ +:param certificate_authority: certificate authority's X509 certificate.\n\ +:return: None\n\ "; static PyObject * @@ -969,8 +1002,8 @@ ssl_Context_add_client_ca(ssl_ContextObj *self, PyObject *args) static char ssl_Context_set_timeout_doc[] = "\n\ Set session timeout\n\ \n\ -@param timeout: The timeout in seconds\n\ -@return: The previous session timeout\n\ +:param timeout: The timeout in seconds\n\ +:return: The previous session timeout\n\ "; static PyObject * ssl_Context_set_timeout(ssl_ContextObj *self, PyObject *args) @@ -987,7 +1020,7 @@ ssl_Context_set_timeout(ssl_ContextObj *self, PyObject *args) static char ssl_Context_get_timeout_doc[] = "\n\ Get the session timeout\n\ \n\ -@return: The session timeout\n\ +:return: The session timeout\n\ "; static PyObject * ssl_Context_get_timeout(ssl_ContextObj *self, PyObject *args) @@ -1004,8 +1037,8 @@ ssl_Context_get_timeout(ssl_ContextObj *self, PyObject *args) static char ssl_Context_set_info_callback_doc[] = "\n\ Set the info callback\n\ \n\ -@param callback: The Python callback to use\n\ -@return: None\n\ +:param callback: The Python callback to use\n\ +:return: None\n\ "; static PyObject * ssl_Context_set_info_callback(ssl_ContextObj *self, PyObject *args) @@ -1033,7 +1066,7 @@ ssl_Context_set_info_callback(ssl_ContextObj *self, PyObject *args) static char ssl_Context_get_app_data_doc[] = "\n\ Get the application data (supplied via set_app_data())\n\ \n\ -@return: The application data\n\ +:return: The application data\n\ "; static PyObject * ssl_Context_get_app_data(ssl_ContextObj *self, PyObject *args) @@ -1048,8 +1081,8 @@ ssl_Context_get_app_data(ssl_ContextObj *self, PyObject *args) static char ssl_Context_set_app_data_doc[] = "\n\ Set the application data (will be returned from get_app_data())\n\ \n\ -@param data: Any Python object\n\ -@return: None\n\ +:param data: Any Python object\n\ +:return: None\n\ "; static PyObject * ssl_Context_set_app_data(ssl_ContextObj *self, PyObject *args) @@ -1070,7 +1103,7 @@ ssl_Context_set_app_data(ssl_ContextObj *self, PyObject *args) static char ssl_Context_get_cert_store_doc[] = "\n\ Get the certificate store for the context\n\ \n\ -@return: A X509Store object\n\ +:return: A X509Store object\n\ "; static PyObject * ssl_Context_get_cert_store(ssl_ContextObj *self, PyObject *args) @@ -1094,8 +1127,8 @@ ssl_Context_get_cert_store(ssl_ContextObj *self, PyObject *args) static char ssl_Context_set_options_doc[] = "\n\ Add options. Options set before are not cleared!\n\ \n\ -@param options: The options to add.\n\ -@return: The new option bitmask.\n\ +:param options: The options to add.\n\ +:return: The new option bitmask.\n\ "; static PyObject * ssl_Context_set_options(ssl_ContextObj *self, PyObject *args) @@ -1108,10 +1141,27 @@ ssl_Context_set_options(ssl_ContextObj *self, PyObject *args) return PyLong_FromLong(SSL_CTX_set_options(self->ctx, options)); } +static char ssl_Context_set_mode_doc[] = "\n\ +Add modes via bitmask. Modes set before are not cleared!\n\ +\n\ +:param mode: The mode to add.\n\ +:return: The new mode bitmask.\n\ +"; +static PyObject * +ssl_Context_set_mode(ssl_ContextObj *self, PyObject *args) { + long mode; + + if (!PyArg_ParseTuple(args, "l:set_mode", &mode)) { + return NULL; + } + + return PyLong_FromLong(SSL_CTX_set_mode(self->ctx, mode)); +} + static char ssl_Context_set_tlsext_servername_callback_doc[] = "\n\ Specify a callback function to be called when clients specify a server name.\n\ \n\ -@param callback: The callback function. It will be invoked with one\n\ +:param callback: The callback function. It will be invoked with one\n\ argument, the Connection instance.\n\ \n\ "; @@ -1159,6 +1209,8 @@ static PyMethodDef ssl_Context_methods[] = { ADD_METHOD(check_privatekey), ADD_METHOD(load_client_ca), ADD_METHOD(set_session_id), + ADD_METHOD(set_session_cache_mode), + ADD_METHOD(get_session_cache_mode), ADD_METHOD(set_verify), ADD_METHOD(set_verify_depth), ADD_METHOD(get_verify_mode), @@ -1174,6 +1226,7 @@ static PyMethodDef ssl_Context_methods[] = { ADD_METHOD(set_app_data), ADD_METHOD(get_cert_store), ADD_METHOD(set_options), + ADD_METHOD(set_mode), ADD_METHOD(set_tlsext_servername_callback), { NULL, NULL } }; @@ -1196,7 +1249,7 @@ ssl_Context_init(ssl_ContextObj *self, int i_method) { #ifdef OPENSSL_NO_SSL2 PyErr_SetString(PyExc_ValueError, "SSLv2_METHOD not supported by this version of OpenSSL"); return NULL; -#else +#else method = SSLv2_method(); #endif break; @@ -1215,6 +1268,11 @@ ssl_Context_init(ssl_ContextObj *self, int i_method) { } self->ctx = SSL_CTX_new(method); + if (self->ctx == NULL) { + exception_from_error_queue(ssl_Error); + return NULL; + } + Py_INCREF(Py_None); self->passphrase_callback = Py_None; Py_INCREF(Py_None); diff --git a/OpenSSL/ssl/session.c b/OpenSSL/ssl/session.c new file mode 100644 index 0000000..f9932a4 --- /dev/null +++ b/OpenSSL/ssl/session.c @@ -0,0 +1,159 @@ +/* + * session.c + * + * Copyright (C) Jean-Paul Calderone + * Copyright (C) Alejandro Alvarez Ayllon + * See LICENSE for details. + * + * SSL Session object data structures and functions. + * + */ +#include <Python.h> +#define SSL_MODULE +#include "ssl.h" + +static char ssl_Session_doc[] = "\n\ +Session() -> Session instance\n\ +\n\ +"; + +/* + * Initialize an already-constructed Session instance with an OpenSSL session + * structure (or NULL). A reference to the OpenSSL session structure is stolen. + */ +static ssl_SessionObj* +ssl_Session_init(ssl_SessionObj *self, SSL_SESSION *native_session) { + self->session = native_session; + return self; +} + +/* + * Create a Session object + */ +static PyObject* +ssl_Session_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) { + ssl_SessionObj *self; + + if (!PyArg_ParseTuple(args, ":Session")) { + return NULL; + } + + self = PyObject_New(ssl_SessionObj, &ssl_Session_Type); + if (self == NULL) { + return NULL; + } + + return (PyObject *)ssl_Session_init(self, NULL); +} + +/* + * Create a Session object from an existing SSL_SESSION*. A reference to the + * SSL_SESSION* is stolen. + */ +ssl_SessionObj* +ssl_Session_from_SSL_SESSION(SSL_SESSION *native_session) { + ssl_SessionObj *self; + + self = PyObject_New(ssl_SessionObj, &ssl_Session_Type); + if (self == NULL) { + return NULL; + } + + return ssl_Session_init(self, native_session); +} + +/* + * Discard the reference to the OpenSSL session structure, if there is one, so + * that it can be freed if it is no longer in use. Also release the memory for + * the Python object. + */ +static void +ssl_Session_dealloc(ssl_SessionObj *self) { + if (self->session != NULL) { + SSL_SESSION_free(self->session); + self->session = NULL; + } + Py_TYPE(self)->tp_free((PyObject*)self); +} + +/* + * Member methods in the Session object + * ADD_METHOD(name) expands to a correct PyMethodDef declaration + * { 'name', (PyCFunction)ssl_Session_name, METH_VARARGS } + * for convenience + * ADD_ALIAS(name,real) creates an "alias" of the ssl_Session_real + * function with the name 'name' + */ +#define ADD_METHOD(name) { #name, (PyCFunction)ssl_Session_##name, METH_VARARGS, ssl_Session_##name##_doc } +static PyMethodDef ssl_Session_methods[] = { + { NULL, NULL } +}; +#undef ADD_METHOD + +/* + * The Python Session type definition. + */ +PyTypeObject ssl_Session_Type = { + PyOpenSSL_HEAD_INIT(&PyType_Type, 0) + "OpenSSL.SSL.Session", + sizeof(ssl_SessionObj), + 0, + (destructor)ssl_Session_dealloc, /* tp_dealloc */ + NULL, /* print */ + NULL, /* tp_getattr */ + NULL, /* setattr */ + NULL, /* compare */ + NULL, /* repr */ + NULL, /* as_number */ + NULL, /* as_sequence */ + NULL, /* as_mapping */ + NULL, /* hash */ + NULL, /* call */ + NULL, /* str */ + NULL, /* getattro */ + NULL, /* setattro */ + NULL, /* as_buffer */ + Py_TPFLAGS_DEFAULT, // Py_TPFLAGS_HAVE_GC, /* tp_flags */ + ssl_Session_doc, /* tp_doc */ + NULL, // (traverseproc)ssl_Session_traverse, /* tp_traverse */ + NULL, // (inquiry)ssl_Session_clear, /* tp_clear */ + NULL, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + NULL, /* tp_iter */ + NULL, /* tp_iternext */ + ssl_Session_methods, /* tp_methods */ + NULL, /* tp_members */ + NULL, /* tp_getset */ + NULL, /* tp_base */ + NULL, /* tp_dict */ + NULL, /* tp_descr_get */ + NULL, /* tp_descr_set */ + 0, /* tp_dictoffset */ + NULL, /* tp_init */ + NULL, /* tp_alloc */ + ssl_Session_new, /* tp_new */ +}; + +/* + * Initialize the Session part of the SSL sub module + * + * Arguments: dict - The OpenSSL.SSL module + * Returns: 1 for success, 0 otherwise + */ +int +init_ssl_session(PyObject *module) { + + if (PyType_Ready(&ssl_Session_Type) < 0) { + return 0; + } + + /* PyModule_AddObject steals a reference. + */ + Py_INCREF((PyObject *)&ssl_Session_Type); + if (PyModule_AddObject(module, "Session", (PyObject *)&ssl_Session_Type) < 0) { + return 0; + } + + return 1; +} + diff --git a/OpenSSL/ssl/session.h b/OpenSSL/ssl/session.h new file mode 100644 index 0000000..4e8de11 --- /dev/null +++ b/OpenSSL/ssl/session.h @@ -0,0 +1,27 @@ +/* + * session.h + * Copyright (C) Jean-Paul Calderone + * See LICENSE for details. + * + * Defined here is the Python type which represents an SSL session by wrapping + * an OpenSSL SSL_SESSION*. + * + */ + +#ifndef PyOpenSSL_SSL_SESSION_H_ +#define PyOpenSSL_SSL_SESSION_H_ + +#include <Python.h> +#include <openssl/ssl.h> + +typedef struct { + PyObject_HEAD + SSL_SESSION *session; +} ssl_SessionObj; + +extern PyTypeObject ssl_Session_Type; + +extern int init_ssl_session(PyObject *); +extern ssl_SessionObj *ssl_Session_from_SSL_SESSION(SSL_SESSION *native_session); + +#endif diff --git a/OpenSSL/ssl/ssl.c b/OpenSSL/ssl/ssl.c index 0dd9871..5725d5d 100644 --- a/OpenSSL/ssl/ssl.c +++ b/OpenSSL/ssl/ssl.c @@ -53,7 +53,7 @@ PyObject *ssl_Error, /* Base class */ static char ssl_SSLeay_version_doc[] = "\n\ Return a string describing the version of OpenSSL in use.\n\ \n\ -@param type: One of the SSLEAY_ constants defined in this module.\n\ +:param type: One of the SSLEAY_ constants defined in this module.\n\ "; static PyObject * @@ -224,6 +224,10 @@ do { \ PyModule_AddIntConstant(module, "OP_NETSCAPE_CA_DN_BUG", SSL_OP_NETSCAPE_CA_DN_BUG); PyModule_AddIntConstant(module, "OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG", SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG); +#ifdef SSL_OP_NO_COMPRESSION + PyModule_AddIntConstant(module, "OP_NO_COMPRESSION", SSL_OP_NO_COMPRESSION); +#endif + /* DTLS related options. The first two of these were introduced in * 2005, the third in 2007. To accomodate systems which are still using * older versions, make them optional. */ @@ -270,11 +274,32 @@ do { \ PyModule_AddIntConstant(module, "SSLEAY_PLATFORM", SSLEAY_PLATFORM); PyModule_AddIntConstant(module, "SSLEAY_DIR", SSLEAY_DIR); + /* Cache modes */ +#define CACHE_MODE(mode) \ + PyModule_AddIntConstant(module, "SESS_CACHE_" #mode, SSL_SESS_CACHE_##mode) + + CACHE_MODE(OFF); + CACHE_MODE(CLIENT); + CACHE_MODE(SERVER); + CACHE_MODE(BOTH); + CACHE_MODE(NO_AUTO_CLEAR); + CACHE_MODE(NO_INTERNAL_LOOKUP); + CACHE_MODE(NO_INTERNAL_STORE); + CACHE_MODE(NO_INTERNAL); +#undef CACHE_MODE + /* Straight up version number */ PyModule_AddIntConstant(module, "OPENSSL_VERSION_NUMBER", OPENSSL_VERSION_NUMBER); + /* SSL modes constants */ +#ifdef SSL_MODE_RELEASE_BUFFERS + PyModule_AddIntConstant(module, "MODE_RELEASE_BUFFERS", SSL_MODE_RELEASE_BUFFERS); +#endif + if (!init_ssl_context(module)) goto error; + if (!init_ssl_session(module)) + goto error; if (!init_ssl_connection(module)) goto error; diff --git a/OpenSSL/ssl/ssl.h b/OpenSSL/ssl/ssl.h index 6a0a57e..3074ba5 100644 --- a/OpenSSL/ssl/ssl.h +++ b/OpenSSL/ssl/ssl.h @@ -16,6 +16,7 @@ #include <Python.h> #include <pythread.h> #include "context.h" +#include "session.h" #include "connection.h" #include "../util.h" #include "../crypto/crypto.h" diff --git a/OpenSSL/test/__init__.py b/OpenSSL/test/__init__.py index ccb4e9a..9b08060 100644 --- a/OpenSSL/test/__init__.py +++ b/OpenSSL/test/__init__.py @@ -2,5 +2,5 @@ # See LICENSE for details. """ -Package containing unit tests for L{OpenSSL}. +Package containing unit tests for :py:mod:`OpenSSL`. """ diff --git a/OpenSSL/test/test_crypto.py b/OpenSSL/test/test_crypto.py index 5cdcefb..16799ef 100644 --- a/OpenSSL/test/test_crypto.py +++ b/OpenSSL/test/test_crypto.py @@ -2,12 +2,12 @@ # See LICENSE file for details. """ -Unit tests for L{OpenSSL.crypto}. +Unit tests for :py:mod:`OpenSSL.crypto`. """ from unittest import main -import os, re +import os, re, sys from subprocess import PIPE, Popen from datetime import datetime, timedelta @@ -268,7 +268,7 @@ oolb6NMg/R3enNPvS1O4UU1H8wpaF77L4yiSWlE0p4w= class X509ExtTests(TestCase): """ - Tests for L{OpenSSL.crypto.X509Extension}. + Tests for :py:class:`OpenSSL.crypto.X509Extension`. """ def setUp(self): @@ -296,8 +296,8 @@ class X509ExtTests(TestCase): def test_str(self): """ - The string representation of L{X509Extension} instances as returned by - C{str} includes stuff. + The string representation of :py:class:`X509Extension` instances as returned by + :py:data:`str` includes stuff. """ # This isn't necessarily the best string representation. Perhaps it # will be changed/improved in the future. @@ -308,7 +308,7 @@ class X509ExtTests(TestCase): def test_type(self): """ - L{X509Extension} and L{X509ExtensionType} refer to the same type object + :py:class:`X509Extension` and :py:class:`X509ExtensionType` refer to the same type object and can be used to create instances of that type. """ self.assertIdentical(X509Extension, X509ExtensionType) @@ -319,8 +319,8 @@ class X509ExtTests(TestCase): def test_construction(self): """ - L{X509Extension} accepts an extension type name, a critical flag, - and an extension value and returns an L{X509ExtensionType} instance. + :py:class:`X509Extension` accepts an extension type name, a critical flag, + and an extension value and returns an :py:class:`X509ExtensionType` instance. """ basic = X509Extension(b('basicConstraints'), True, b('CA:true')) self.assertTrue( @@ -338,7 +338,7 @@ class X509ExtTests(TestCase): def test_invalid_extension(self): """ - L{X509Extension} raises something if it is passed a bad extension + :py:class:`X509Extension` raises something if it is passed a bad extension name or value. """ self.assertRaises( @@ -357,7 +357,7 @@ class X509ExtTests(TestCase): def test_get_critical(self): """ - L{X509ExtensionType.get_critical} returns the value of the + :py:meth:`X509ExtensionType.get_critical` returns the value of the extension's critical flag. """ ext = X509Extension(b('basicConstraints'), True, b('CA:true')) @@ -368,7 +368,7 @@ class X509ExtTests(TestCase): def test_get_short_name(self): """ - L{X509ExtensionType.get_short_name} returns a string giving the short + :py:meth:`X509ExtensionType.get_short_name` returns a string giving the short type name of the extension. """ ext = X509Extension(b('basicConstraints'), True, b('CA:true')) @@ -379,7 +379,7 @@ class X509ExtTests(TestCase): def test_get_data(self): """ - L{X509Extension.get_data} returns a string giving the data of the + :py:meth:`X509Extension.get_data` returns a string giving the data of the extension. """ ext = X509Extension(b('basicConstraints'), True, b('CA:true')) @@ -389,7 +389,7 @@ class X509ExtTests(TestCase): def test_get_data_wrong_args(self): """ - L{X509Extension.get_data} raises L{TypeError} if passed any arguments. + :py:meth:`X509Extension.get_data` raises :py:exc:`TypeError` if passed any arguments. """ ext = X509Extension(b('basicConstraints'), True, b('CA:true')) self.assertRaises(TypeError, ext.get_data, None) @@ -399,7 +399,7 @@ class X509ExtTests(TestCase): def test_unused_subject(self): """ - The C{subject} parameter to L{X509Extension} may be provided for an + The :py:data:`subject` parameter to :py:class:`X509Extension` may be provided for an extension which does not use it and is ignored in this case. """ ext1 = X509Extension( @@ -414,8 +414,8 @@ class X509ExtTests(TestCase): def test_subject(self): """ - If an extension requires a subject, the C{subject} parameter to - L{X509Extension} provides its value. + If an extension requires a subject, the :py:data:`subject` parameter to + :py:class:`X509Extension` provides its value. """ ext3 = X509Extension( b('subjectKeyIdentifier'), False, b('hash'), subject=self.x509) @@ -427,7 +427,7 @@ class X509ExtTests(TestCase): def test_missing_subject(self): """ - If an extension requires a subject and the C{subject} parameter is + If an extension requires a subject and the :py:data:`subject` parameter is given no value, something happens. """ self.assertRaises( @@ -436,8 +436,8 @@ class X509ExtTests(TestCase): def test_invalid_subject(self): """ - If the C{subject} parameter is given a value which is not an L{X509} - instance, L{TypeError} is raised. + If the :py:data:`subject` parameter is given a value which is not an + :py:class:`X509` instance, :py:exc:`TypeError` is raised. """ for badObj in [True, object(), "hello", [], self]: self.assertRaises( @@ -448,7 +448,7 @@ class X509ExtTests(TestCase): def test_unused_issuer(self): """ - The C{issuer} parameter to L{X509Extension} may be provided for an + The :py:data:`issuer` parameter to :py:class:`X509Extension` may be provided for an extension which does not use it and is ignored in this case. """ ext1 = X509Extension( @@ -462,8 +462,8 @@ class X509ExtTests(TestCase): def test_issuer(self): """ - If an extension requires a issuer, the C{issuer} parameter to - L{X509Extension} provides its value. + If an extension requires a issuer, the :py:data:`issuer` parameter to + :py:class:`X509Extension` provides its value. """ ext2 = X509Extension( b('authorityKeyIdentifier'), False, b('issuer:always'), @@ -477,7 +477,7 @@ class X509ExtTests(TestCase): def test_missing_issuer(self): """ - If an extension requires an issue and the C{issuer} parameter is given + If an extension requires an issue and the :py:data:`issuer` parameter is given no value, something happens. """ self.assertRaises( @@ -489,8 +489,8 @@ class X509ExtTests(TestCase): def test_invalid_issuer(self): """ - If the C{issuer} parameter is given a value which is not an L{X509} - instance, L{TypeError} is raised. + If the :py:data:`issuer` parameter is given a value which is not an + :py:class:`X509` instance, :py:exc:`TypeError` is raised. """ for badObj in [True, object(), "hello", [], self]: self.assertRaises( @@ -503,12 +503,12 @@ class X509ExtTests(TestCase): class PKeyTests(TestCase): """ - Unit tests for L{OpenSSL.crypto.PKey}. + Unit tests for :py:class:`OpenSSL.crypto.PKey`. """ def test_type(self): """ - L{PKey} and L{PKeyType} refer to the same type object and can be used - to create instances of that type. + :py:class:`PKey` and :py:class:`PKeyType` refer to the same type object + and can be used to create instances of that type. """ self.assertIdentical(PKey, PKeyType) self.assertConsistentType(PKey, 'PKey') @@ -516,7 +516,7 @@ class PKeyTests(TestCase): def test_construction(self): """ - L{PKey} takes no arguments and returns a new L{PKey} instance. + :py:class:`PKey` takes no arguments and returns a new :py:class:`PKey` instance. """ self.assertRaises(TypeError, PKey, None) key = PKey() @@ -527,8 +527,8 @@ class PKeyTests(TestCase): def test_pregeneration(self): """ - L{PKeyType.bits} and L{PKeyType.type} return C{0} before the key is - generated. L{PKeyType.check} raises L{TypeError} before the key is + :py:attr:`PKeyType.bits` and :py:attr:`PKeyType.type` return :py:data:`0` before the key is + generated. :py:attr:`PKeyType.check` raises :py:exc:`TypeError` before the key is generated. """ key = PKey() @@ -539,11 +539,11 @@ class PKeyTests(TestCase): def test_failedGeneration(self): """ - L{PKeyType.generate_key} takes two arguments, the first giving the key - type as one of L{TYPE_RSA} or L{TYPE_DSA} and the second giving the + :py:meth:`PKeyType.generate_key` takes two arguments, the first giving the key + type as one of :py:data:`TYPE_RSA` or :py:data:`TYPE_DSA` and the second giving the number of bits to generate. If an invalid type is specified or - generation fails, L{Error} is raised. If an invalid number of bits is - specified, L{ValueError} or L{Error} is raised. + generation fails, :py:exc:`Error` is raised. If an invalid number of bits is + specified, :py:exc:`ValueError` or :py:exc:`Error` is raised. """ key = PKey() self.assertRaises(TypeError, key.generate_key) @@ -574,8 +574,8 @@ class PKeyTests(TestCase): def test_rsaGeneration(self): """ - L{PKeyType.generate_key} generates an RSA key when passed - L{TYPE_RSA} as a type and a reasonable number of bits. + :py:meth:`PKeyType.generate_key` generates an RSA key when passed + :py:data:`TYPE_RSA` as a type and a reasonable number of bits. """ bits = 128 key = PKey() @@ -587,8 +587,8 @@ class PKeyTests(TestCase): def test_dsaGeneration(self): """ - L{PKeyType.generate_key} generates a DSA key when passed - L{TYPE_DSA} as a type and a reasonable number of bits. + :py:meth:`PKeyType.generate_key` generates a DSA key when passed + :py:data:`TYPE_DSA` as a type and a reasonable number of bits. """ # 512 is a magic number. The DSS (Digital Signature Standard) # allows a minimum of 512 bits for DSA. DSA_generate_parameters @@ -603,7 +603,7 @@ class PKeyTests(TestCase): def test_regeneration(self): """ - L{PKeyType.generate_key} can be called multiple times on the same + :py:meth:`PKeyType.generate_key` can be called multiple times on the same key to generate new keys. """ key = PKey() @@ -615,7 +615,7 @@ class PKeyTests(TestCase): def test_inconsistentKey(self): """ - L{PKeyType.check} returns C{False} if the key is not consistent. + :py:`PKeyType.check` returns :py:exc:`Error` if the key is not consistent. """ key = load_privatekey(FILETYPE_PEM, inconsistentPrivateKeyPEM) self.assertRaises(Error, key.check) @@ -623,17 +623,31 @@ class PKeyTests(TestCase): def test_check_wrong_args(self): """ - L{PKeyType.check} raises L{TypeError} if called with any arguments. + :py:meth:`PKeyType.check` raises :py:exc:`TypeError` if called with any arguments. """ self.assertRaises(TypeError, PKey().check, None) self.assertRaises(TypeError, PKey().check, object()) self.assertRaises(TypeError, PKey().check, 1) + def test_check_public_key(self): + """ + :py:meth:`PKeyType.check` raises :py:exc:`TypeError` if only the public + part of the key is available. + """ + # A trick to get a public-only key + key = PKey() + key.generate_key(TYPE_RSA, 512) + cert = X509() + cert.set_pubkey(key) + pub = cert.get_pubkey() + self.assertRaises(TypeError, pub.check) + + class X509NameTests(TestCase): """ - Unit tests for L{OpenSSL.crypto.X509Name}. + Unit tests for :py:class:`OpenSSL.crypto.X509Name`. """ def _x509name(self, **attrs): # XXX There's no other way to get a new X509Name yet. @@ -650,7 +664,7 @@ class X509NameTests(TestCase): def test_type(self): """ - The type of X509Name objects is L{X509NameType}. + The type of X509Name objects is :py:class:`X509NameType`. """ self.assertIdentical(X509Name, X509NameType) self.assertEqual(X509NameType.__name__, 'X509Name') @@ -665,8 +679,8 @@ class X509NameTests(TestCase): def test_onlyStringAttributes(self): """ - Attempting to set a non-L{str} attribute name on an L{X509NameType} - instance causes L{TypeError} to be raised. + Attempting to set a non-:py:data:`str` attribute name on an :py:class:`X509NameType` + instance causes :py:exc:`TypeError` to be raised. """ name = self._x509name() # Beyond these cases, you may also think that unicode should be @@ -682,8 +696,8 @@ class X509NameTests(TestCase): def test_setInvalidAttribute(self): """ - Attempting to set any attribute name on an L{X509NameType} instance for - which no corresponding NID is defined causes L{AttributeError} to be + Attempting to set any attribute name on an :py:class:`X509NameType` instance for + which no corresponding NID is defined causes :py:exc:`AttributeError` to be raised. """ name = self._x509name() @@ -692,7 +706,7 @@ class X509NameTests(TestCase): def test_attributes(self): """ - L{X509NameType} instances have attributes for each standard (?) + :py:class:`X509NameType` instances have attributes for each standard (?) X509Name field. """ name = self._x509name() @@ -712,8 +726,8 @@ class X509NameTests(TestCase): def test_copy(self): """ - L{X509Name} creates a new L{X509NameType} instance with all the same - attributes as an existing L{X509NameType} instance when called with + :py:class:`X509Name` creates a new :py:class:`X509NameType` instance with all the same + attributes as an existing :py:class:`X509NameType` instance when called with one. """ name = self._x509name(commonName="foo", emailAddress="bar@example.com") @@ -733,7 +747,7 @@ class X509NameTests(TestCase): def test_repr(self): """ - L{repr} passed an L{X509NameType} instance should return a string + :py:func:`repr` passed an :py:class:`X509NameType` instance should return a string containing a description of the type and the NIDs which have been set on it. """ @@ -745,7 +759,7 @@ class X509NameTests(TestCase): def test_comparison(self): """ - L{X509NameType} instances should compare based on their NIDs. + :py:class:`X509NameType` instances should compare based on their NIDs. """ def _equality(a, b, assertTrue, assertFalse): assertTrue(a == b, "(%r == %r) --> False" % (a, b)) @@ -820,7 +834,7 @@ class X509NameTests(TestCase): def test_hash(self): """ - L{X509Name.hash} returns an integer hash based on the value of the + :py:meth:`X509Name.hash` returns an integer hash based on the value of the name. """ a = self._x509name(CN="foo") @@ -832,7 +846,7 @@ class X509NameTests(TestCase): def test_der(self): """ - L{X509Name.der} returns the DER encoded form of the name. + :py:meth:`X509Name.der` returns the DER encoded form of the name. """ a = self._x509name(CN="foo", C="US") self.assertEqual( @@ -843,7 +857,8 @@ class X509NameTests(TestCase): def test_get_components(self): """ - L{X509Name.get_components} returns a C{list} of two-tuples of C{str} + :py:meth:`X509Name.get_components` returns a :py:data:`list` of + two-tuples of :py:data:`str` giving the NIDs and associated values which make up the name. """ a = self._x509name() @@ -862,14 +877,16 @@ class _PKeyInteractionTestsMixin: """ def signable(self): """ - Return something with a C{set_pubkey}, C{set_pubkey}, and C{sign} method. + Return something with a :py:meth:`set_pubkey`, :py:meth:`set_pubkey`, + and :py:meth:`sign` method. """ raise NotImplementedError() def test_signWithUngenerated(self): """ - L{X509Req.sign} raises L{ValueError} when pass a L{PKey} with no parts. + :py:meth:`X509Req.sign` raises :py:exc:`ValueError` when pass a + :py:class:`PKey` with no parts. """ request = self.signable() key = PKey() @@ -878,8 +895,8 @@ class _PKeyInteractionTestsMixin: def test_signWithPublicKey(self): """ - L{X509Req.sign} raises L{ValueError} when pass a L{PKey} with no - private part as the signing key. + :py:meth:`X509Req.sign` raises :py:exc:`ValueError` when pass a + :py:class:`PKey` with no private part as the signing key. """ request = self.signable() key = PKey() @@ -891,7 +908,7 @@ class _PKeyInteractionTestsMixin: def test_signWithUnknownDigest(self): """ - L{X509Req.sign} raises L{ValueError} when passed a digest name which is + :py:meth:`X509Req.sign` raises :py:exc:`ValueError` when passed a digest name which is not known. """ request = self.signable() @@ -902,8 +919,8 @@ class _PKeyInteractionTestsMixin: def test_sign(self): """ - L{X509Req.sign} succeeds when passed a private key object and a valid - digest function. C{X509Req.verify} can be used to check the signature. + :py:meth:`X509Req.sign` succeeds when passed a private key object and a valid + digest function. :py:meth:`X509Req.verify` can be used to check the signature. """ request = self.signable() key = PKey() @@ -924,18 +941,18 @@ class _PKeyInteractionTestsMixin: class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): """ - Tests for L{OpenSSL.crypto.X509Req}. + Tests for :py:class:`OpenSSL.crypto.X509Req`. """ def signable(self): """ - Create and return a new L{X509Req}. + Create and return a new :py:class:`X509Req`. """ return X509Req() def test_type(self): """ - L{X509Req} and L{X509ReqType} refer to the same type object and can be + :py:obj:`X509Req` and :py:obj:`X509ReqType` refer to the same type object and can be used to create instances of that type. """ self.assertIdentical(X509Req, X509ReqType) @@ -944,7 +961,7 @@ class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): def test_construction(self): """ - L{X509Req} takes no arguments and returns an L{X509ReqType} instance. + :py:obj:`X509Req` takes no arguments and returns an :py:obj:`X509ReqType` instance. """ request = X509Req() self.assertTrue( @@ -954,8 +971,8 @@ class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): def test_version(self): """ - L{X509ReqType.set_version} sets the X.509 version of the certificate - request. L{X509ReqType.get_version} returns the X.509 version of + :py:obj:`X509ReqType.set_version` sets the X.509 version of the certificate + request. :py:obj:`X509ReqType.get_version` returns the X.509 version of the certificate request. The initial value of the version is 0. """ request = X509Req() @@ -968,9 +985,9 @@ class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): def test_version_wrong_args(self): """ - L{X509ReqType.set_version} raises L{TypeError} if called with the wrong - number of arguments or with a non-C{int} argument. - L{X509ReqType.get_version} raises L{TypeError} if called with any + :py:obj:`X509ReqType.set_version` raises :py:obj:`TypeError` if called with the wrong + number of arguments or with a non-:py:obj:`int` argument. + :py:obj:`X509ReqType.get_version` raises :py:obj:`TypeError` if called with any arguments. """ request = X509Req() @@ -982,7 +999,7 @@ class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): def test_get_subject(self): """ - L{X509ReqType.get_subject} returns an L{X509Name} for the subject of + :py:obj:`X509ReqType.get_subject` returns an :py:obj:`X509Name` for the subject of the request and which is valid even after the request object is otherwise dead. """ @@ -1000,7 +1017,7 @@ class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): def test_get_subject_wrong_args(self): """ - L{X509ReqType.get_subject} raises L{TypeError} if called with any + :py:obj:`X509ReqType.get_subject` raises :py:obj:`TypeError` if called with any arguments. """ request = X509Req() @@ -1009,7 +1026,7 @@ class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): def test_add_extensions(self): """ - L{X509Req.add_extensions} accepts a C{list} of L{X509Extension} + :py:obj:`X509Req.add_extensions` accepts a :py:obj:`list` of :py:obj:`X509Extension` instances and adds them to the X509 request. """ request = X509Req() @@ -1020,9 +1037,9 @@ class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): def test_add_extensions_wrong_args(self): """ - L{X509Req.add_extensions} raises L{TypeError} if called with the wrong - number of arguments or with a non-C{list}. Or it raises L{ValueError} - if called with a C{list} containing objects other than L{X509Extension} + :py:obj:`X509Req.add_extensions` raises :py:obj:`TypeError` if called with the wrong + number of arguments or with a non-:py:obj:`list`. Or it raises :py:obj:`ValueError` + if called with a :py:obj:`list` containing objects other than :py:obj:`X509Extension` instances. """ request = X509Req() @@ -1035,7 +1052,7 @@ class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): class X509Tests(TestCase, _PKeyInteractionTestsMixin): """ - Tests for L{OpenSSL.crypto.X509}. + Tests for :py:obj:`OpenSSL.crypto.X509`. """ pemData = cleartextCertificatePEM + cleartextPrivateKeyPEM @@ -1061,14 +1078,14 @@ WpOdIpB8KksUTCzV591Nr1wd """ def signable(self): """ - Create and return a new L{X509}. + Create and return a new :py:obj:`X509`. """ return X509() def test_type(self): """ - L{X509} and L{X509Type} refer to the same type object and can be used + :py:obj:`X509` and :py:obj:`X509Type` refer to the same type object and can be used to create instances of that type. """ self.assertIdentical(X509, X509Type) @@ -1077,7 +1094,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_construction(self): """ - L{X509} takes no arguments and returns an instance of L{X509Type}. + :py:obj:`X509` takes no arguments and returns an instance of :py:obj:`X509Type`. """ certificate = X509() self.assertTrue( @@ -1093,7 +1110,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_version_wrong_args(self): """ - L{X509.get_version} raises L{TypeError} if invoked with any arguments. + :py:obj:`X509.get_version` raises :py:obj:`TypeError` if invoked with any arguments. """ cert = X509() self.assertRaises(TypeError, cert.get_version, None) @@ -1101,8 +1118,8 @@ WpOdIpB8KksUTCzV591Nr1wd def test_set_version_wrong_args(self): """ - L{X509.set_version} raises L{TypeError} if invoked with the wrong number - of arguments or an argument not of type C{int}. + :py:obj:`X509.set_version` raises :py:obj:`TypeError` if invoked with the wrong number + of arguments or an argument not of type :py:obj:`int`. """ cert = X509() self.assertRaises(TypeError, cert.set_version) @@ -1112,8 +1129,8 @@ WpOdIpB8KksUTCzV591Nr1wd def test_version(self): """ - L{X509.set_version} sets the certificate version number. - L{X509.get_version} retrieves it. + :py:obj:`X509.set_version` sets the certificate version number. + :py:obj:`X509.get_version` retrieves it. """ cert = X509() cert.set_version(1234) @@ -1122,7 +1139,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_serial_number_wrong_args(self): """ - L{X509.get_serial_number} raises L{TypeError} if invoked with any + :py:obj:`X509.get_serial_number` raises :py:obj:`TypeError` if invoked with any arguments. """ cert = X509() @@ -1131,8 +1148,8 @@ WpOdIpB8KksUTCzV591Nr1wd def test_serial_number(self): """ - The serial number of an L{X509Type} can be retrieved and modified with - L{X509Type.get_serial_number} and L{X509Type.set_serial_number}. + The serial number of an :py:obj:`X509Type` can be retrieved and modified with + :py:obj:`X509Type.get_serial_number` and :py:obj:`X509Type.set_serial_number`. """ certificate = X509() self.assertRaises(TypeError, certificate.set_serial_number) @@ -1152,7 +1169,7 @@ WpOdIpB8KksUTCzV591Nr1wd def _setBoundTest(self, which): """ - L{X509Type.set_notBefore} takes a string in the format of an ASN1 + :py:obj:`X509Type.set_notBefore` takes a string in the format of an ASN1 GENERALIZEDTIME and sets the beginning of the certificate's validity period to it. """ @@ -1191,7 +1208,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_set_notBefore(self): """ - L{X509Type.set_notBefore} takes a string in the format of an ASN1 + :py:obj:`X509Type.set_notBefore` takes a string in the format of an ASN1 GENERALIZEDTIME and sets the beginning of the certificate's validity period to it. """ @@ -1200,7 +1217,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_set_notAfter(self): """ - L{X509Type.set_notAfter} takes a string in the format of an ASN1 + :py:obj:`X509Type.set_notAfter` takes a string in the format of an ASN1 GENERALIZEDTIME and sets the end of the certificate's validity period to it. """ @@ -1209,7 +1226,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_notBefore(self): """ - L{X509Type.get_notBefore} returns a string in the format of an ASN1 + :py:obj:`X509Type.get_notBefore` returns a string in the format of an ASN1 GENERALIZEDTIME even for certificates which store it as UTCTIME internally. """ @@ -1219,7 +1236,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_notAfter(self): """ - L{X509Type.get_notAfter} returns a string in the format of an ASN1 + :py:obj:`X509Type.get_notAfter` returns a string in the format of an ASN1 GENERALIZEDTIME even for certificates which store it as UTCTIME internally. """ @@ -1229,8 +1246,8 @@ WpOdIpB8KksUTCzV591Nr1wd def test_gmtime_adj_notBefore_wrong_args(self): """ - L{X509Type.gmtime_adj_notBefore} raises L{TypeError} if called with the - wrong number of arguments or a non-C{int} argument. + :py:obj:`X509Type.gmtime_adj_notBefore` raises :py:obj:`TypeError` if called with the + wrong number of arguments or a non-:py:obj:`int` argument. """ cert = X509() self.assertRaises(TypeError, cert.gmtime_adj_notBefore) @@ -1240,7 +1257,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_gmtime_adj_notBefore(self): """ - L{X509Type.gmtime_adj_notBefore} changes the not-before timestamp to be + :py:obj:`X509Type.gmtime_adj_notBefore` changes the not-before timestamp to be the current time plus the number of seconds passed in. """ cert = load_certificate(FILETYPE_PEM, self.pemData) @@ -1251,8 +1268,8 @@ WpOdIpB8KksUTCzV591Nr1wd def test_gmtime_adj_notAfter_wrong_args(self): """ - L{X509Type.gmtime_adj_notAfter} raises L{TypeError} if called with the - wrong number of arguments or a non-C{int} argument. + :py:obj:`X509Type.gmtime_adj_notAfter` raises :py:obj:`TypeError` if called with the + wrong number of arguments or a non-:py:obj:`int` argument. """ cert = X509() self.assertRaises(TypeError, cert.gmtime_adj_notAfter) @@ -1262,7 +1279,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_gmtime_adj_notAfter(self): """ - L{X509Type.gmtime_adj_notAfter} changes the not-after timestamp to be + :py:obj:`X509Type.gmtime_adj_notAfter` changes the not-after timestamp to be the current time plus the number of seconds passed in. """ cert = load_certificate(FILETYPE_PEM, self.pemData) @@ -1273,7 +1290,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_has_expired_wrong_args(self): """ - L{X509Type.has_expired} raises L{TypeError} if called with any + :py:obj:`X509Type.has_expired` raises :py:obj:`TypeError` if called with any arguments. """ cert = X509() @@ -1282,7 +1299,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_has_expired(self): """ - L{X509Type.has_expired} returns C{True} if the certificate's not-after + :py:obj:`X509Type.has_expired` returns :py:obj:`True` if the certificate's not-after time is in the past. """ cert = X509() @@ -1292,7 +1309,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_has_not_expired(self): """ - L{X509Type.has_expired} returns C{False} if the certificate's not-after + :py:obj:`X509Type.has_expired` returns :py:obj:`False` if the certificate's not-after time is in the future. """ cert = X509() @@ -1302,7 +1319,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_digest(self): """ - L{X509.digest} returns a string giving ":"-separated hex-encoded words + :py:obj:`X509.digest` returns a string giving ":"-separated hex-encoded words of the digest of the certificate. """ cert = X509() @@ -1327,7 +1344,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_extension_count(self): """ - L{X509.get_extension_count} returns the number of extensions that are + :py:obj:`X509.get_extension_count` returns the number of extensions that are present in the certificate. """ pkey = load_privatekey(FILETYPE_PEM, client_key_pem) @@ -1351,7 +1368,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_extension(self): """ - L{X509.get_extension} takes an integer and returns an L{X509Extension} + :py:obj:`X509.get_extension` takes an integer and returns an :py:obj:`X509Extension` corresponding to the extension at that index. """ pkey = load_privatekey(FILETYPE_PEM, client_key_pem) @@ -1384,7 +1401,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_invalid_digest_algorithm(self): """ - L{X509.digest} raises L{ValueError} if called with an unrecognized hash + :py:obj:`X509.digest` raises :py:obj:`ValueError` if called with an unrecognized hash algorithm. """ cert = X509() @@ -1393,7 +1410,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_subject_wrong_args(self): """ - L{X509.get_subject} raises L{TypeError} if called with any arguments. + :py:obj:`X509.get_subject` raises :py:obj:`TypeError` if called with any arguments. """ cert = X509() self.assertRaises(TypeError, cert.get_subject, None) @@ -1401,7 +1418,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_subject(self): """ - L{X509.get_subject} returns an L{X509Name} instance. + :py:obj:`X509.get_subject` returns an :py:obj:`X509Name` instance. """ cert = load_certificate(FILETYPE_PEM, self.pemData) subj = cert.get_subject() @@ -1414,8 +1431,8 @@ WpOdIpB8KksUTCzV591Nr1wd def test_set_subject_wrong_args(self): """ - L{X509.set_subject} raises a L{TypeError} if called with the wrong - number of arguments or an argument not of type L{X509Name}. + :py:obj:`X509.set_subject` raises a :py:obj:`TypeError` if called with the wrong + number of arguments or an argument not of type :py:obj:`X509Name`. """ cert = X509() self.assertRaises(TypeError, cert.set_subject) @@ -1425,7 +1442,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_set_subject(self): """ - L{X509.set_subject} changes the subject of the certificate to the one + :py:obj:`X509.set_subject` changes the subject of the certificate to the one passed in. """ cert = X509() @@ -1440,7 +1457,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_issuer_wrong_args(self): """ - L{X509.get_issuer} raises L{TypeError} if called with any arguments. + :py:obj:`X509.get_issuer` raises :py:obj:`TypeError` if called with any arguments. """ cert = X509() self.assertRaises(TypeError, cert.get_issuer, None) @@ -1448,7 +1465,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_issuer(self): """ - L{X509.get_issuer} returns an L{X509Name} instance. + :py:obj:`X509.get_issuer` returns an :py:obj:`X509Name` instance. """ cert = load_certificate(FILETYPE_PEM, self.pemData) subj = cert.get_issuer() @@ -1462,8 +1479,8 @@ WpOdIpB8KksUTCzV591Nr1wd def test_set_issuer_wrong_args(self): """ - L{X509.set_issuer} raises a L{TypeError} if called with the wrong - number of arguments or an argument not of type L{X509Name}. + :py:obj:`X509.set_issuer` raises a :py:obj:`TypeError` if called with the wrong + number of arguments or an argument not of type :py:obj:`X509Name`. """ cert = X509() self.assertRaises(TypeError, cert.set_issuer) @@ -1473,7 +1490,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_set_issuer(self): """ - L{X509.set_issuer} changes the issuer of the certificate to the one + :py:obj:`X509.set_issuer` changes the issuer of the certificate to the one passed in. """ cert = X509() @@ -1488,8 +1505,8 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_pubkey_uninitialized(self): """ - When called on a certificate with no public key, L{X509.get_pubkey} - raises L{OpenSSL.crypto.Error}. + When called on a certificate with no public key, :py:obj:`X509.get_pubkey` + raises :py:obj:`OpenSSL.crypto.Error`. """ cert = X509() self.assertRaises(Error, cert.get_pubkey) @@ -1497,7 +1514,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_subject_name_hash_wrong_args(self): """ - L{X509.subject_name_hash} raises L{TypeError} if called with any + :py:obj:`X509.subject_name_hash` raises :py:obj:`TypeError` if called with any arguments. """ cert = X509() @@ -1506,7 +1523,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_subject_name_hash(self): """ - L{X509.subject_name_hash} returns the hash of the certificate's subject + :py:obj:`X509.subject_name_hash` returns the hash of the certificate's subject name. """ cert = load_certificate(FILETYPE_PEM, self.pemData) @@ -1519,7 +1536,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_signature_algorithm(self): """ - L{X509Type.get_signature_algorithm} returns a string which means + :py:obj:`X509Type.get_signature_algorithm` returns a string which means the algorithm used to sign the certificate. """ cert = load_certificate(FILETYPE_PEM, self.pemData) @@ -1529,7 +1546,7 @@ WpOdIpB8KksUTCzV591Nr1wd def test_get_undefined_signature_algorithm(self): """ - L{X509Type.get_signature_algorithm} raises L{ValueError} if the + :py:obj:`X509Type.get_signature_algorithm` raises :py:obj:`ValueError` if the signature algorithm is undefined or unknown. """ # This certificate has been modified to indicate a bogus OID in the @@ -1562,13 +1579,13 @@ tgI5 class PKCS12Tests(TestCase): """ - Test for L{OpenSSL.crypto.PKCS12} and L{OpenSSL.crypto.load_pkcs12}. + Test for :py:obj:`OpenSSL.crypto.PKCS12` and :py:obj:`OpenSSL.crypto.load_pkcs12`. """ pemData = cleartextCertificatePEM + cleartextPrivateKeyPEM def test_type(self): """ - L{PKCS12Type} is a type object. + :py:obj:`PKCS12Type` is a type object. """ self.assertIdentical(PKCS12, PKCS12Type) self.assertConsistentType(PKCS12, 'PKCS12') @@ -1576,7 +1593,7 @@ class PKCS12Tests(TestCase): def test_empty_construction(self): """ - L{PKCS12} returns a new instance of L{PKCS12} with no certificate, + :py:obj:`PKCS12` returns a new instance of :py:obj:`PKCS12` with no certificate, private key, CA certificates, or friendly name. """ p12 = PKCS12() @@ -1588,8 +1605,8 @@ class PKCS12Tests(TestCase): def test_type_errors(self): """ - The L{PKCS12} setter functions (C{set_certificate}, C{set_privatekey}, - C{set_ca_certificates}, and C{set_friendlyname}) raise L{TypeError} + The :py:obj:`PKCS12` setter functions (:py:obj:`set_certificate`, :py:obj:`set_privatekey`, + :py:obj:`set_ca_certificates`, and :py:obj:`set_friendlyname`) raise :py:obj:`TypeError` when passed objects of types other than those expected. """ p12 = PKCS12() @@ -1609,8 +1626,8 @@ class PKCS12Tests(TestCase): def test_key_only(self): """ - A L{PKCS12} with only a private key can be exported using - L{PKCS12.export} and loaded again using L{load_pkcs12}. + A :py:obj:`PKCS12` with only a private key can be exported using + :py:obj:`PKCS12.export` and loaded again using :py:obj:`load_pkcs12`. """ passwd = 'blah' p12 = PKCS12() @@ -1636,8 +1653,8 @@ class PKCS12Tests(TestCase): def test_cert_only(self): """ - A L{PKCS12} with only a certificate can be exported using - L{PKCS12.export} and loaded again using L{load_pkcs12}. + A :py:obj:`PKCS12` with only a certificate can be exported using + :py:obj:`PKCS12.export` and loaded again using :py:obj:`load_pkcs12`. """ passwd = 'blah' p12 = PKCS12() @@ -1716,7 +1733,7 @@ class PKCS12Tests(TestCase): def test_load_pkcs12(self): """ A PKCS12 string generated using the openssl command line can be loaded - with L{load_pkcs12} and its components extracted and examined. + with :py:obj:`load_pkcs12` and its components extracted and examined. """ passwd = 'whatever' pem = client_key_pem + client_cert_pem @@ -1734,7 +1751,7 @@ class PKCS12Tests(TestCase): def test_load_pkcs12_garbage(self): """ - L{load_pkcs12} raises L{OpenSSL.crypto.Error} when passed a string + :py:obj:`load_pkcs12` raises :py:obj:`OpenSSL.crypto.Error` when passed a string which is not a PKCS12 dump. """ passwd = 'whatever' @@ -1745,9 +1762,9 @@ class PKCS12Tests(TestCase): def test_replace(self): """ - L{PKCS12.set_certificate} replaces the certificate in a PKCS12 cluster. - L{PKCS12.set_privatekey} replaces the private key. - L{PKCS12.set_ca_certificates} replaces the CA certificates. + :py:obj:`PKCS12.set_certificate` replaces the certificate in a PKCS12 cluster. + :py:obj:`PKCS12.set_privatekey` replaces the private key. + :py:obj:`PKCS12.set_ca_certificates` replaces the CA certificates. """ p12 = self.gen_pkcs12(client_cert_pem, client_key_pem, root_cert_pem) p12.set_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) @@ -1765,9 +1782,9 @@ class PKCS12Tests(TestCase): def test_friendly_name(self): """ - The I{friendlyName} of a PKCS12 can be set and retrieved via - L{PKCS12.get_friendlyname} and L{PKCS12_set_friendlyname}, and a - L{PKCS12} with a friendly name set can be dumped with L{PKCS12.export}. + The *friendlyName* of a PKCS12 can be set and retrieved via + :py:obj:`PKCS12.get_friendlyname` and :py:obj:`PKCS12_set_friendlyname`, and a + :py:obj:`PKCS12` with a friendly name set can be dumped with :py:obj:`PKCS12.export`. """ passwd = 'Dogmeat[]{}!@#$%^&*()~`?/.,<>-_+=";:' p12 = self.gen_pkcs12(server_cert_pem, server_key_pem, root_cert_pem) @@ -1805,7 +1822,7 @@ class PKCS12Tests(TestCase): def test_removing_ca_cert(self): """ - Passing C{None} to L{PKCS12.set_ca_certificates} removes all CA + Passing :py:obj:`None` to :py:obj:`PKCS12.set_ca_certificates` removes all CA certificates. """ p12 = self.gen_pkcs12(server_cert_pem, server_key_pem, root_cert_pem) @@ -1815,7 +1832,7 @@ class PKCS12Tests(TestCase): def test_export_without_mac(self): """ - Exporting a PKCS12 with a C{maciter} of C{-1} excludes the MAC + Exporting a PKCS12 with a :py:obj:`maciter` of ``-1`` excludes the MAC entirely. """ passwd = 'Lake Michigan' @@ -1863,7 +1880,7 @@ class PKCS12Tests(TestCase): def test_export_without_args(self): """ - All the arguments to L{PKCS12.export} are optional. + All the arguments to :py:obj:`PKCS12.export` are optional. """ p12 = self.gen_pkcs12(server_cert_pem, server_key_pem, root_cert_pem) dumped_p12 = p12.export() # no args @@ -1873,7 +1890,7 @@ class PKCS12Tests(TestCase): def test_key_cert_mismatch(self): """ - L{PKCS12.export} raises an exception when a key and certificate + :py:obj:`PKCS12.export` raises an exception when a key and certificate mismatch. """ p12 = self.gen_pkcs12(server_cert_pem, client_key_pem, root_cert_pem) @@ -1888,14 +1905,14 @@ def cmdLineQuote(s): """ Internal method for quoting a single command-line argument. - @type: C{str} - @param s: A single unquoted string to quote for something that is expecting - cmd.exe-style quoting + See http://www.perlmonks.org/?node_id=764004 - @rtype: C{str} - @return: A cmd.exe-style quoted string + :type: :py:obj:`str` + :param s: A single unquoted string to quote for something that is expecting + cmd.exe-style quoting - @see: U{http://www.perlmonks.org/?node_id=764004} + :rtype: :py:obj:`str` + :return: A cmd.exe-style quoted string """ s = _cmdLineQuoteRe2.sub(r"\1\1", _cmdLineQuoteRe.sub(r'\1\1\\"', s)) return '"%s"' % s @@ -1905,14 +1922,14 @@ def cmdLineQuote(s): def quoteArguments(arguments): """ Quote an iterable of command-line arguments for passing to CreateProcess or - a similar API. This allows the list passed to C{reactor.spawnProcess} to - match the child process's C{sys.argv} properly. + a similar API. This allows the list passed to :py:obj:`reactor.spawnProcess` to + match the child process's :py:obj:`sys.argv` properly. - @type arguments: C{iterable} of C{str} - @param arguments: An iterable of unquoted arguments to quote + :type arguments: :py:obj:`iterable` of :py:obj:`str` + :param arguments: An iterable of unquoted arguments to quote - @rtype: C{str} - @return: A space-delimited string containing quoted versions of L{arguments} + :rtype: :py:obj:`str` + :return: A space-delimited string containing quoted versions of :py:obj:`arguments` """ return ' '.join(map(cmdLineQuote, arguments)) @@ -1937,20 +1954,20 @@ def _runopenssl(pem, *args): class FunctionTests(TestCase): """ - Tests for free-functions in the L{OpenSSL.crypto} module. + Tests for free-functions in the :py:obj:`OpenSSL.crypto` module. """ def test_load_privatekey_invalid_format(self): """ - L{load_privatekey} raises L{ValueError} if passed an unknown filetype. + :py:obj:`load_privatekey` raises :py:obj:`ValueError` if passed an unknown filetype. """ self.assertRaises(ValueError, load_privatekey, 100, root_key_pem) def test_load_privatekey_invalid_passphrase_type(self): """ - L{load_privatekey} raises L{TypeError} if passed a passphrase that is - neither a c{str} nor a callable. + :py:obj:`load_privatekey` raises :py:obj:`TypeError` if passed a passphrase that is + neither a :py:obj:`str` nor a callable. """ self.assertRaises( TypeError, @@ -1960,7 +1977,7 @@ class FunctionTests(TestCase): def test_load_privatekey_wrong_args(self): """ - L{load_privatekey} raises L{TypeError} if called with the wrong number + :py:obj:`load_privatekey` raises :py:obj:`TypeError` if called with the wrong number of arguments. """ self.assertRaises(TypeError, load_privatekey) @@ -1968,7 +1985,7 @@ class FunctionTests(TestCase): def test_load_privatekey_wrongPassphrase(self): """ - L{load_privatekey} raises L{OpenSSL.crypto.Error} when it is passed an + :py:obj:`load_privatekey` raises :py:obj:`OpenSSL.crypto.Error` when it is passed an encrypted PEM and an incorrect passphrase. """ self.assertRaises( @@ -1976,9 +1993,21 @@ class FunctionTests(TestCase): load_privatekey, FILETYPE_PEM, encryptedPrivateKeyPEM, b("quack")) + def test_load_privatekey_passphraseWrongType(self): + """ + :py:obj:`load_privatekey` raises :py:obj:`ValueError` when it is passed a passphrase + with a private key encoded in a format, that doesn't support + encryption. + """ + key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) + blob = dump_privatekey(FILETYPE_ASN1, key) + self.assertRaises(ValueError, + load_privatekey, FILETYPE_ASN1, blob, "secret") + + def test_load_privatekey_passphrase(self): """ - L{load_privatekey} can create a L{PKey} object from an encrypted PEM + :py:obj:`load_privatekey` can create a :py:obj:`PKey` object from an encrypted PEM string if given the passphrase. """ key = load_privatekey( @@ -1987,16 +2016,28 @@ class FunctionTests(TestCase): self.assertTrue(isinstance(key, PKeyType)) + def test_load_privatekey_passphrase_exception(self): + """ + If the passphrase callback raises an exception, that exception is raised + by :py:obj:`load_privatekey`. + """ + def cb(ignored): + raise ArithmeticError + + self.assertRaises(ArithmeticError, + load_privatekey, FILETYPE_PEM, encryptedPrivateKeyPEM, cb) + + def test_load_privatekey_wrongPassphraseCallback(self): """ - L{load_privatekey} raises L{OpenSSL.crypto.Error} when it is passed an - encrypted PEM and a passphrase callback which returns an incorrect - passphrase. + :py:obj:`load_privatekey` raises :py:obj:`OpenSSL.crypto.Error` when it + is passed an encrypted PEM and a passphrase callback which returns an + incorrect passphrase. """ called = [] def cb(*a): called.append(None) - return "quack" + return b("quack") self.assertRaises( Error, load_privatekey, FILETYPE_PEM, encryptedPrivateKeyPEM, cb) @@ -2005,7 +2046,7 @@ class FunctionTests(TestCase): def test_load_privatekey_passphraseCallback(self): """ - L{load_privatekey} can create a L{PKey} object from an encrypted PEM + :py:obj:`load_privatekey` can create a :py:obj:`PKey` object from an encrypted PEM string if given a passphrase callback which returns the correct password. """ @@ -2018,33 +2059,31 @@ class FunctionTests(TestCase): self.assertEqual(called, [False]) - def test_load_privatekey_passphrase_exception(self): + def test_load_privatekey_passphrase_wrong_return_type(self): """ - An exception raised by the passphrase callback passed to - L{load_privatekey} causes L{OpenSSL.crypto.Error} to be raised. - - This isn't as nice as just letting the exception pass through. The - behavior might be changed to that eventually. + :py:obj:`load_privatekey` raises :py:obj:`ValueError` if the passphrase + callback returns something other than a byte string. """ - def broken(ignored): - raise RuntimeError("This is not working.") self.assertRaises( - Error, + ValueError, load_privatekey, - FILETYPE_PEM, encryptedPrivateKeyPEM, broken) + FILETYPE_PEM, encryptedPrivateKeyPEM, lambda *args: 3) def test_dump_privatekey_wrong_args(self): """ - L{dump_privatekey} raises L{TypeError} if called with the wrong number + :py:obj:`dump_privatekey` raises :py:obj:`TypeError` if called with the wrong number of arguments. """ self.assertRaises(TypeError, dump_privatekey) + # If cipher name is given, password is required. + self.assertRaises( + ValueError, dump_privatekey, FILETYPE_PEM, PKey(), "foo") def test_dump_privatekey_unknown_cipher(self): """ - L{dump_privatekey} raises L{ValueError} if called with an unrecognized + :py:obj:`dump_privatekey` raises :py:obj:`ValueError` if called with an unrecognized cipher name. """ key = PKey() @@ -2056,8 +2095,8 @@ class FunctionTests(TestCase): def test_dump_privatekey_invalid_passphrase_type(self): """ - L{dump_privatekey} raises L{TypeError} if called with a passphrase which - is neither a C{str} nor a callable. + :py:obj:`dump_privatekey` raises :py:obj:`TypeError` if called with a passphrase which + is neither a :py:obj:`str` nor a callable. """ key = PKey() key.generate_key(TYPE_RSA, 512) @@ -2068,7 +2107,7 @@ class FunctionTests(TestCase): def test_dump_privatekey_invalid_filetype(self): """ - L{dump_privatekey} raises L{ValueError} if called with an unrecognized + :py:obj:`dump_privatekey` raises :py:obj:`ValueError` if called with an unrecognized filetype. """ key = PKey() @@ -2076,9 +2115,21 @@ class FunctionTests(TestCase): self.assertRaises(ValueError, dump_privatekey, 100, key) + def test_load_privatekey_passphraseCallbackLength(self): + """ + :py:obj:`crypto.load_privatekey` should raise an error when the passphrase + provided by the callback is too long, not silently truncate it. + """ + def cb(ignored): + return "a" * 1025 + + self.assertRaises(ValueError, + load_privatekey, FILETYPE_PEM, encryptedPrivateKeyPEM, cb) + + def test_dump_privatekey_passphrase(self): """ - L{dump_privatekey} writes an encrypted PEM when given a passphrase. + :py:obj:`dump_privatekey` writes an encrypted PEM when given a passphrase. """ passphrase = b("foo") key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) @@ -2090,9 +2141,20 @@ class FunctionTests(TestCase): self.assertEqual(loadedKey.bits(), key.bits()) + def test_dump_privatekey_passphraseWrongType(self): + """ + :py:obj:`dump_privatekey` raises :py:obj:`ValueError` when it is passed a passphrase + with a private key encoded in a format, that doesn't support + encryption. + """ + key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) + self.assertRaises(ValueError, + dump_privatekey, FILETYPE_ASN1, key, "blowfish", "secret") + + def test_dump_certificate(self): """ - L{dump_certificate} writes PEM, DER, and text. + :py:obj:`dump_certificate` writes PEM, DER, and text. """ pemData = cleartextCertificatePEM + cleartextPrivateKeyPEM cert = load_certificate(FILETYPE_PEM, pemData) @@ -2111,7 +2173,7 @@ class FunctionTests(TestCase): def test_dump_privatekey(self): """ - L{dump_privatekey} writes a PEM, DER, and text. + :py:obj:`dump_privatekey` writes a PEM, DER, and text. """ key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) self.assertTrue(key.check()) @@ -2131,7 +2193,7 @@ class FunctionTests(TestCase): def test_dump_certificate_request(self): """ - L{dump_certificate_request} writes a PEM, DER, and text. + :py:obj:`dump_certificate_request` writes a PEM, DER, and text. """ req = load_certificate_request(FILETYPE_PEM, cleartextCertificateRequestPEM) dumped_pem = dump_certificate_request(FILETYPE_PEM, req) @@ -2150,7 +2212,7 @@ class FunctionTests(TestCase): def test_dump_privatekey_passphraseCallback(self): """ - L{dump_privatekey} writes an encrypted PEM when given a callback which + :py:obj:`dump_privatekey` writes an encrypted PEM when given a callback which returns the correct passphrase. """ passphrase = b("foo") @@ -2168,10 +2230,36 @@ class FunctionTests(TestCase): self.assertEqual(loadedKey.bits(), key.bits()) + def test_dump_privatekey_passphrase_exception(self): + """ + :py:obj:`dump_privatekey` should not overwrite the exception raised + by the passphrase callback. + """ + def cb(ignored): + raise ArithmeticError + + key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) + self.assertRaises(ArithmeticError, + dump_privatekey, FILETYPE_PEM, key, "blowfish", cb) + + + def test_dump_privatekey_passphraseCallbackLength(self): + """ + :py:obj:`crypto.dump_privatekey` should raise an error when the passphrase + provided by the callback is too long, not silently truncate it. + """ + def cb(ignored): + return "a" * 1025 + + key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) + self.assertRaises(ValueError, + dump_privatekey, FILETYPE_PEM, key, "blowfish", cb) + + def test_load_pkcs7_data(self): """ - L{load_pkcs7_data} accepts a PKCS#7 string and returns an instance of - L{PKCS7Type}. + :py:obj:`load_pkcs7_data` accepts a PKCS#7 string and returns an instance of + :py:obj:`PKCS7Type`. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) self.assertTrue(isinstance(pkcs7, PKCS7Type)) @@ -2180,11 +2268,11 @@ class FunctionTests(TestCase): class PKCS7Tests(TestCase): """ - Tests for L{PKCS7Type}. + Tests for :py:obj:`PKCS7Type`. """ def test_type(self): """ - L{PKCS7Type} is a type object. + :py:obj:`PKCS7Type` is a type object. """ self.assertTrue(isinstance(PKCS7Type, type)) self.assertEqual(PKCS7Type.__name__, 'PKCS7') @@ -2197,7 +2285,7 @@ class PKCS7Tests(TestCase): def test_type_is_signed_wrong_args(self): """ - L{PKCS7Type.type_is_signed} raises L{TypeError} if called with any + :py:obj:`PKCS7Type.type_is_signed` raises :py:obj:`TypeError` if called with any arguments. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) @@ -2206,8 +2294,8 @@ class PKCS7Tests(TestCase): def test_type_is_signed(self): """ - L{PKCS7Type.type_is_signed} returns C{True} if the PKCS7 object is of - the type I{signed}. + :py:obj:`PKCS7Type.type_is_signed` returns :py:obj:`True` if the PKCS7 object is of + the type *signed*. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) self.assertTrue(pkcs7.type_is_signed()) @@ -2215,7 +2303,7 @@ class PKCS7Tests(TestCase): def test_type_is_enveloped_wrong_args(self): """ - L{PKCS7Type.type_is_enveloped} raises L{TypeError} if called with any + :py:obj:`PKCS7Type.type_is_enveloped` raises :py:obj:`TypeError` if called with any arguments. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) @@ -2224,8 +2312,8 @@ class PKCS7Tests(TestCase): def test_type_is_enveloped(self): """ - L{PKCS7Type.type_is_enveloped} returns C{False} if the PKCS7 object is - not of the type I{enveloped}. + :py:obj:`PKCS7Type.type_is_enveloped` returns :py:obj:`False` if the PKCS7 object is + not of the type *enveloped*. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) self.assertFalse(pkcs7.type_is_enveloped()) @@ -2233,7 +2321,7 @@ class PKCS7Tests(TestCase): def test_type_is_signedAndEnveloped_wrong_args(self): """ - L{PKCS7Type.type_is_signedAndEnveloped} raises L{TypeError} if called + :py:obj:`PKCS7Type.type_is_signedAndEnveloped` raises :py:obj:`TypeError` if called with any arguments. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) @@ -2242,8 +2330,8 @@ class PKCS7Tests(TestCase): def test_type_is_signedAndEnveloped(self): """ - L{PKCS7Type.type_is_signedAndEnveloped} returns C{False} if the PKCS7 - object is not of the type I{signed and enveloped}. + :py:obj:`PKCS7Type.type_is_signedAndEnveloped` returns :py:obj:`False` if the PKCS7 + object is not of the type *signed and enveloped*. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) self.assertFalse(pkcs7.type_is_signedAndEnveloped()) @@ -2251,7 +2339,7 @@ class PKCS7Tests(TestCase): def test_type_is_data(self): """ - L{PKCS7Type.type_is_data} returns C{False} if the PKCS7 object is not of + :py:obj:`PKCS7Type.type_is_data` returns :py:obj:`False` if the PKCS7 object is not of the type data. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) @@ -2260,7 +2348,7 @@ class PKCS7Tests(TestCase): def test_type_is_data_wrong_args(self): """ - L{PKCS7Type.type_is_data} raises L{TypeError} if called with any + :py:obj:`PKCS7Type.type_is_data` raises :py:obj:`TypeError` if called with any arguments. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) @@ -2269,7 +2357,7 @@ class PKCS7Tests(TestCase): def test_get_type_name_wrong_args(self): """ - L{PKCS7Type.get_type_name} raises L{TypeError} if called with any + :py:obj:`PKCS7Type.get_type_name` raises :py:obj:`TypeError` if called with any arguments. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) @@ -2278,7 +2366,7 @@ class PKCS7Tests(TestCase): def test_get_type_name(self): """ - L{PKCS7Type.get_type_name} returns a C{str} giving the type name. + :py:obj:`PKCS7Type.get_type_name` returns a :py:obj:`str` giving the type name. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) self.assertEquals(pkcs7.get_type_name(), b('pkcs7-signedData')) @@ -2287,7 +2375,7 @@ class PKCS7Tests(TestCase): def test_attribute(self): """ If an attribute other than one of the methods tested here is accessed on - an instance of L{PKCS7Type}, L{AttributeError} is raised. + an instance of :py:obj:`PKCS7Type`, :py:obj:`AttributeError` is raised. """ pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) self.assertRaises(AttributeError, getattr, pkcs7, "foo") @@ -2296,18 +2384,18 @@ class PKCS7Tests(TestCase): class NetscapeSPKITests(TestCase, _PKeyInteractionTestsMixin): """ - Tests for L{OpenSSL.crypto.NetscapeSPKI}. + Tests for :py:obj:`OpenSSL.crypto.NetscapeSPKI`. """ def signable(self): """ - Return a new L{NetscapeSPKI} for use with signing tests. + Return a new :py:obj:`NetscapeSPKI` for use with signing tests. """ return NetscapeSPKI() def test_type(self): """ - L{NetscapeSPKI} and L{NetscapeSPKIType} refer to the same type object + :py:obj:`NetscapeSPKI` and :py:obj:`NetscapeSPKIType` refer to the same type object and can be used to create instances of that type. """ self.assertIdentical(NetscapeSPKI, NetscapeSPKIType) @@ -2316,7 +2404,7 @@ class NetscapeSPKITests(TestCase, _PKeyInteractionTestsMixin): def test_construction(self): """ - L{NetscapeSPKI} returns an instance of L{NetscapeSPKIType}. + :py:obj:`NetscapeSPKI` returns an instance of :py:obj:`NetscapeSPKIType`. """ nspki = NetscapeSPKI() self.assertTrue(isinstance(nspki, NetscapeSPKIType)) @@ -2324,8 +2412,8 @@ class NetscapeSPKITests(TestCase, _PKeyInteractionTestsMixin): def test_invalid_attribute(self): """ - Accessing a non-existent attribute of a L{NetscapeSPKI} instance causes - an L{AttributeError} to be raised. + Accessing a non-existent attribute of a :py:obj:`NetscapeSPKI` instance causes + an :py:obj:`AttributeError` to be raised. """ nspki = NetscapeSPKI() self.assertRaises(AttributeError, lambda: nspki.foo) @@ -2333,7 +2421,7 @@ class NetscapeSPKITests(TestCase, _PKeyInteractionTestsMixin): def test_b64_encode(self): """ - L{NetscapeSPKI.b64_encode} encodes the certificate to a base64 blob. + :py:obj:`NetscapeSPKI.b64_encode` encodes the certificate to a base64 blob. """ nspki = NetscapeSPKI() blob = nspki.b64_encode() @@ -2343,11 +2431,11 @@ class NetscapeSPKITests(TestCase, _PKeyInteractionTestsMixin): class RevokedTests(TestCase): """ - Tests for L{OpenSSL.crypto.Revoked} + Tests for :py:obj:`OpenSSL.crypto.Revoked` """ def test_construction(self): """ - Confirm we can create L{OpenSSL.crypto.Revoked}. Check + Confirm we can create :py:obj:`OpenSSL.crypto.Revoked`. Check that it is empty. """ revoked = Revoked() @@ -2360,8 +2448,8 @@ class RevokedTests(TestCase): def test_construction_wrong_args(self): """ - Calling L{OpenSSL.crypto.Revoked} with any arguments results - in a L{TypeError} being raised. + Calling :py:obj:`OpenSSL.crypto.Revoked` with any arguments results + in a :py:obj:`TypeError` being raised. """ self.assertRaises(TypeError, Revoked, None) self.assertRaises(TypeError, Revoked, 1) @@ -2371,7 +2459,7 @@ class RevokedTests(TestCase): def test_serial(self): """ Confirm we can set and get serial numbers from - L{OpenSSL.crypto.Revoked}. Confirm errors are handled + :py:obj:`OpenSSL.crypto.Revoked`. Confirm errors are handled with grace. """ revoked = Revoked() @@ -2394,7 +2482,7 @@ class RevokedTests(TestCase): def test_date(self): """ Confirm we can set and get revocation dates from - L{OpenSSL.crypto.Revoked}. Confirm errors are handled + :py:obj:`OpenSSL.crypto.Revoked`. Confirm errors are handled with grace. """ revoked = Revoked() @@ -2411,7 +2499,7 @@ class RevokedTests(TestCase): def test_reason(self): """ Confirm we can set and get revocation reasons from - L{OpenSSL.crypto.Revoked}. The "get" need to work + :py:obj:`OpenSSL.crypto.Revoked`. The "get" need to work as "set". Likewise, each reason of all_reasons() must work. """ revoked = Revoked() @@ -2431,9 +2519,9 @@ class RevokedTests(TestCase): def test_set_reason_wrong_arguments(self): """ - Calling L{OpenSSL.crypto.Revoked.set_reason} with other than + Calling :py:obj:`OpenSSL.crypto.Revoked.set_reason` with other than one argument, or an argument which isn't a valid reason, - results in L{TypeError} or L{ValueError} being raised. + results in :py:obj:`TypeError` or :py:obj:`ValueError` being raised. """ revoked = Revoked() self.assertRaises(TypeError, revoked.set_reason, 100) @@ -2442,8 +2530,8 @@ class RevokedTests(TestCase): def test_get_reason_wrong_arguments(self): """ - Calling L{OpenSSL.crypto.Revoked.get_reason} with any - arguments results in L{TypeError} being raised. + Calling :py:obj:`OpenSSL.crypto.Revoked.get_reason` with any + arguments results in :py:obj:`TypeError` being raised. """ revoked = Revoked() self.assertRaises(TypeError, revoked.get_reason, None) @@ -2454,14 +2542,14 @@ class RevokedTests(TestCase): class CRLTests(TestCase): """ - Tests for L{OpenSSL.crypto.CRL} + Tests for :py:obj:`OpenSSL.crypto.CRL` """ cert = load_certificate(FILETYPE_PEM, cleartextCertificatePEM) pkey = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) def test_construction(self): """ - Confirm we can create L{OpenSSL.crypto.CRL}. Check + Confirm we can create :py:obj:`OpenSSL.crypto.CRL`. Check that it is empty """ crl = CRL() @@ -2471,8 +2559,8 @@ class CRLTests(TestCase): def test_construction_wrong_args(self): """ - Calling L{OpenSSL.crypto.CRL} with any number of arguments - results in a L{TypeError} being raised. + Calling :py:obj:`OpenSSL.crypto.CRL` with any number of arguments + results in a :py:obj:`TypeError` being raised. """ self.assertRaises(TypeError, CRL, 1) self.assertRaises(TypeError, CRL, "") @@ -2512,10 +2600,19 @@ class CRLTests(TestCase): self.assertEqual(text, dumped_text) + def test_export_invalid(self): + """ + If :py:obj:`CRL.export` is used with an uninitialized :py:obj:`X509` + instance, :py:obj:`OpenSSL.crypto.Error` is raised. + """ + crl = CRL() + self.assertRaises(Error, crl.export, X509(), PKey()) + + def test_add_revoked_keyword(self): """ - L{OpenSSL.CRL.add_revoked} accepts its single argument as the - I{revoked} keyword argument. + :py:obj:`OpenSSL.CRL.add_revoked` accepts its single argument as the + ``revoked`` keyword argument. """ crl = CRL() revoked = Revoked() @@ -2525,10 +2622,10 @@ class CRLTests(TestCase): def test_export_wrong_args(self): """ - Calling L{OpenSSL.CRL.export} with fewer than two or more than + Calling :py:obj:`OpenSSL.CRL.export` with fewer than two or more than four arguments, or with arguments other than the certificate, private key, integer file type, and integer number of days it - expects, results in a L{TypeError} being raised. + expects, results in a :py:obj:`TypeError` being raised. """ crl = CRL() self.assertRaises(TypeError, crl.export) @@ -2543,9 +2640,9 @@ class CRLTests(TestCase): def test_export_unknown_filetype(self): """ - Calling L{OpenSSL.CRL.export} with a file type other than - L{FILETYPE_PEM}, L{FILETYPE_ASN1}, or L{FILETYPE_TEXT} results - in a L{ValueError} being raised. + Calling :py:obj:`OpenSSL.CRL.export` with a file type other than + :py:obj:`FILETYPE_PEM`, :py:obj:`FILETYPE_ASN1`, or :py:obj:`FILETYPE_TEXT` results + in a :py:obj:`ValueError` being raised. """ crl = CRL() self.assertRaises(ValueError, crl.export, self.cert, self.pkey, 100, 10) @@ -2554,7 +2651,7 @@ class CRLTests(TestCase): def test_get_revoked(self): """ Use python to create a simple CRL with two revocations. - Get back the L{Revoked} using L{OpenSSL.CRL.get_revoked} and + Get back the :py:obj:`Revoked` using :py:obj:`OpenSSL.CRL.get_revoked` and verify them. """ crl = CRL() @@ -2580,8 +2677,8 @@ class CRLTests(TestCase): def test_get_revoked_wrong_args(self): """ - Calling L{OpenSSL.CRL.get_revoked} with any arguments results - in a L{TypeError} being raised. + Calling :py:obj:`OpenSSL.CRL.get_revoked` with any arguments results + in a :py:obj:`TypeError` being raised. """ crl = CRL() self.assertRaises(TypeError, crl.get_revoked, None) @@ -2592,8 +2689,8 @@ class CRLTests(TestCase): def test_add_revoked_wrong_args(self): """ - Calling L{OpenSSL.CRL.add_revoked} with other than one - argument results in a L{TypeError} being raised. + Calling :py:obj:`OpenSSL.CRL.add_revoked` with other than one + argument results in a :py:obj:`TypeError` being raised. """ crl = CRL() self.assertRaises(TypeError, crl.add_revoked) @@ -2626,8 +2723,8 @@ class CRLTests(TestCase): def test_load_crl_wrong_args(self): """ - Calling L{OpenSSL.crypto.load_crl} with other than two - arguments results in a L{TypeError} being raised. + Calling :py:obj:`OpenSSL.crypto.load_crl` with other than two + arguments results in a :py:obj:`TypeError` being raised. """ self.assertRaises(TypeError, load_crl) self.assertRaises(TypeError, load_crl, FILETYPE_PEM) @@ -2636,27 +2733,27 @@ class CRLTests(TestCase): def test_load_crl_bad_filetype(self): """ - Calling L{OpenSSL.crypto.load_crl} with an unknown file type - raises a L{ValueError}. + Calling :py:obj:`OpenSSL.crypto.load_crl` with an unknown file type + raises a :py:obj:`ValueError`. """ self.assertRaises(ValueError, load_crl, 100, crlData) def test_load_crl_bad_data(self): """ - Calling L{OpenSSL.crypto.load_crl} with file data which can't - be loaded raises a L{OpenSSL.crypto.Error}. + Calling :py:obj:`OpenSSL.crypto.load_crl` with file data which can't + be loaded raises a :py:obj:`OpenSSL.crypto.Error`. """ self.assertRaises(Error, load_crl, FILETYPE_PEM, "hello, world") class SignVerifyTests(TestCase): """ - Tests for L{OpenSSL.crypto.sign} and L{OpenSSL.crypto.verify}. + Tests for :py:obj:`OpenSSL.crypto.sign` and :py:obj:`OpenSSL.crypto.verify`. """ def test_sign_verify(self): """ - L{sign} generates a cryptographic signature which L{verify} can check. + :py:obj:`sign` generates a cryptographic signature which :py:obj:`verify` can check. """ content = b( "It was a bright cold day in April, and the clocks were striking " @@ -2697,7 +2794,7 @@ class SignVerifyTests(TestCase): def test_sign_nulls(self): """ - L{sign} produces a signature for a string with embedded nulls. + :py:obj:`sign` produces a signature for a string with embedded nulls. """ content = b("Watch out! \0 Did you see it?") priv_key = load_privatekey(FILETYPE_PEM, root_key_pem) diff --git a/OpenSSL/test/test_rand.py b/OpenSSL/test/test_rand.py index 00fc6d1..8a3c5fe 100644 --- a/OpenSSL/test/test_rand.py +++ b/OpenSSL/test/test_rand.py @@ -2,7 +2,7 @@ # See LICENSE for details. """ -Unit tests for L{OpenSSL.rand}. +Unit tests for :py:obj:`OpenSSL.rand`. """ from unittest import main @@ -16,8 +16,8 @@ from OpenSSL import rand class RandTests(TestCase): def test_bytes_wrong_args(self): """ - L{OpenSSL.rand.bytes} raises L{TypeError} if called with the wrong - number of arguments or with a non-C{int} argument. + :py:obj:`OpenSSL.rand.bytes` raises :py:obj:`TypeError` if called with the wrong + number of arguments or with a non-:py:obj:`int` argument. """ self.assertRaises(TypeError, rand.bytes) self.assertRaises(TypeError, rand.bytes, None) @@ -44,7 +44,7 @@ class RandTests(TestCase): def test_add_wrong_args(self): """ When called with the wrong number of arguments, or with arguments not of - type C{str} and C{int}, L{OpenSSL.rand.add} raises L{TypeError}. + type :py:obj:`str` and :py:obj:`int`, :py:obj:`OpenSSL.rand.add` raises :py:obj:`TypeError`. """ self.assertRaises(TypeError, rand.add) self.assertRaises(TypeError, rand.add, b("foo"), None) @@ -54,15 +54,15 @@ class RandTests(TestCase): def test_add(self): """ - L{OpenSSL.rand.add} adds entropy to the PRNG. + :py:obj:`OpenSSL.rand.add` adds entropy to the PRNG. """ rand.add(b('hamburger'), 3) def test_seed_wrong_args(self): """ - When called with the wrong number of arguments, or with a non-C{str} - argument, L{OpenSSL.rand.seed} raises L{TypeError}. + When called with the wrong number of arguments, or with a non-:py:obj:`str` + argument, :py:obj:`OpenSSL.rand.seed` raises :py:obj:`TypeError`. """ self.assertRaises(TypeError, rand.seed) self.assertRaises(TypeError, rand.seed, None) @@ -71,14 +71,14 @@ class RandTests(TestCase): def test_seed(self): """ - L{OpenSSL.rand.seed} adds entropy to the PRNG. + :py:obj:`OpenSSL.rand.seed` adds entropy to the PRNG. """ rand.seed(b('milk shake')) def test_status_wrong_args(self): """ - L{OpenSSL.rand.status} raises L{TypeError} when called with any + :py:obj:`OpenSSL.rand.status` raises :py:obj:`TypeError` when called with any arguments. """ self.assertRaises(TypeError, rand.status, None) @@ -86,8 +86,8 @@ class RandTests(TestCase): def test_status(self): """ - L{OpenSSL.rand.status} returns C{True} if the PRNG has sufficient - entropy, C{False} otherwise. + :py:obj:`OpenSSL.rand.status` returns :py:obj:`True` if the PRNG has sufficient + entropy, :py:obj:`False` otherwise. """ # It's hard to know what it is actually going to return. Different # OpenSSL random engines decide differently whether they have enough @@ -97,8 +97,8 @@ class RandTests(TestCase): def test_egd_wrong_args(self): """ - L{OpenSSL.rand.egd} raises L{TypeError} when called with the wrong - number of arguments or with arguments not of type C{str} and C{int}. + :py:obj:`OpenSSL.rand.egd` raises :py:obj:`TypeError` when called with the wrong + number of arguments or with arguments not of type :py:obj:`str` and :py:obj:`int`. """ self.assertRaises(TypeError, rand.egd) self.assertRaises(TypeError, rand.egd, None) @@ -109,8 +109,8 @@ class RandTests(TestCase): def test_egd_missing(self): """ - L{OpenSSL.rand.egd} returns C{0} or C{-1} if the EGD socket passed - to it does not exist. + :py:obj:`OpenSSL.rand.egd` returns :py:obj:`0` or :py:obj:`-1` if the + EGD socket passed to it does not exist. """ result = rand.egd(self.mktemp()) expected = (-1, 0) @@ -121,7 +121,7 @@ class RandTests(TestCase): def test_cleanup_wrong_args(self): """ - L{OpenSSL.rand.cleanup} raises L{TypeError} when called with any + :py:obj:`OpenSSL.rand.cleanup` raises :py:obj:`TypeError` when called with any arguments. """ self.assertRaises(TypeError, rand.cleanup, None) @@ -129,16 +129,16 @@ class RandTests(TestCase): def test_cleanup(self): """ - L{OpenSSL.rand.cleanup} releases the memory used by the PRNG and returns - C{None}. + :py:obj:`OpenSSL.rand.cleanup` releases the memory used by the PRNG and returns + :py:obj:`None`. """ self.assertIdentical(rand.cleanup(), None) def test_load_file_wrong_args(self): """ - L{OpenSSL.rand.load_file} raises L{TypeError} when called the wrong - number of arguments or arguments not of type C{str} and C{int}. + :py:obj:`OpenSSL.rand.load_file` raises :py:obj:`TypeError` when called the wrong + number of arguments or arguments not of type :py:obj:`str` and :py:obj:`int`. """ self.assertRaises(TypeError, rand.load_file) self.assertRaises(TypeError, rand.load_file, "foo", None) @@ -148,8 +148,8 @@ class RandTests(TestCase): def test_write_file_wrong_args(self): """ - L{OpenSSL.rand.write_file} raises L{TypeError} when called with the - wrong number of arguments or a non-C{str} argument. + :py:obj:`OpenSSL.rand.write_file` raises :py:obj:`TypeError` when called with the + wrong number of arguments or a non-:py:obj:`str` argument. """ self.assertRaises(TypeError, rand.write_file) self.assertRaises(TypeError, rand.write_file, None) diff --git a/OpenSSL/test/test_ssl.py b/OpenSSL/test/test_ssl.py index 2ab67fd..3e4e3da 100644 --- a/OpenSSL/test/test_ssl.py +++ b/OpenSSL/test/test_ssl.py @@ -2,7 +2,7 @@ # See LICENSE for details. """ -Unit tests for L{OpenSSL.SSL}. +Unit tests for :py:obj:`OpenSSL.SSL`. """ from gc import collect @@ -10,7 +10,7 @@ from errno import ECONNREFUSED, EINPROGRESS, EWOULDBLOCK from sys import platform, version_info from socket import error, socket from os import makedirs -from os.path import join +from os.path import join, dirname from unittest import main from weakref import ref @@ -26,9 +26,16 @@ from OpenSSL.SSL import SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD, TLSv1_METHOD from OpenSSL.SSL import OP_NO_SSLv2, OP_NO_SSLv3, OP_SINGLE_DH_USE from OpenSSL.SSL import ( VERIFY_PEER, VERIFY_FAIL_IF_NO_PEER_CERT, VERIFY_CLIENT_ONCE, VERIFY_NONE) + +from OpenSSL.SSL import ( + SESS_CACHE_OFF, SESS_CACHE_CLIENT, SESS_CACHE_SERVER, SESS_CACHE_BOTH, + SESS_CACHE_NO_AUTO_CLEAR, SESS_CACHE_NO_INTERNAL_LOOKUP, + SESS_CACHE_NO_INTERNAL_STORE, SESS_CACHE_NO_INTERNAL) + from OpenSSL.SSL import ( Error, SysCallError, WantReadError, ZeroReturnError, SSLeay_version) -from OpenSSL.SSL import Context, ContextType, Connection, ConnectionType +from OpenSSL.SSL import ( + Context, ContextType, Session, Connection, ConnectionType) from OpenSSL.test.util import TestCase, bytes, b from OpenSSL.test.test_crypto import ( @@ -50,6 +57,16 @@ try: except ImportError: OP_NO_TICKET = None +try: + from OpenSSL.SSL import OP_NO_COMPRESSION +except ImportError: + OP_NO_COMPRESSION = None + +try: + from OpenSSL.SSL import MODE_RELEASE_BUFFERS +except ImportError: + MODE_RELEASE_BUFFERS = None + from OpenSSL.SSL import ( SSL_ST_CONNECT, SSL_ST_ACCEPT, SSL_ST_MASK, SSL_ST_INIT, SSL_ST_BEFORE, SSL_ST_OK, SSL_ST_RENEGOTIATE, @@ -172,16 +189,30 @@ class _LoopbackMixin: Helper mixin which defines methods for creating a connected socket pair and for forcing two connected SSL sockets to talk to each other via memory BIOs. """ - def _loopback(self): - (server, client) = socket_pair() + def _loopbackClientFactory(self, socket): + client = Connection(Context(TLSv1_METHOD), socket) + client.set_connect_state() + return client + + def _loopbackServerFactory(self, socket): ctx = Context(TLSv1_METHOD) ctx.use_privatekey(load_privatekey(FILETYPE_PEM, server_key_pem)) ctx.use_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) - server = Connection(ctx, server) + server = Connection(ctx, socket) server.set_accept_state() - client = Connection(Context(TLSv1_METHOD), client) - client.set_connect_state() + return server + + + def _loopback(self, serverFactory=None, clientFactory=None): + if serverFactory is None: + serverFactory = self._loopbackServerFactory + if clientFactory is None: + clientFactory = self._loopbackClientFactory + + (server, client) = socket_pair() + server = serverFactory(server) + client = clientFactory(client) handshake(client, server) @@ -192,10 +223,10 @@ class _LoopbackMixin: def _interactInMemory(self, client_conn, server_conn): """ - Try to read application bytes from each of the two L{Connection} + Try to read application bytes from each of the two :py:obj:`Connection` objects. Copy bytes back and forth between their send/receive buffers for as long as there is anything to copy. When there is nothing more - to copy, return C{None}. If one of them actually manages to deliver + to copy, return :py:obj:`None`. If one of them actually manages to deliver some application bytes, return a two-tuple of the connection from which the bytes were read and the bytes themselves. """ @@ -241,12 +272,12 @@ class _LoopbackMixin: class VersionTests(TestCase): """ Tests for version information exposed by - L{OpenSSL.SSL.SSLeay_version} and - L{OpenSSL.SSL.OPENSSL_VERSION_NUMBER}. + :py:obj:`OpenSSL.SSL.SSLeay_version` and + :py:obj:`OpenSSL.SSL.OPENSSL_VERSION_NUMBER`. """ def test_OPENSSL_VERSION_NUMBER(self): """ - L{OPENSSL_VERSION_NUMBER} is an integer with status in the low + :py:obj:`OPENSSL_VERSION_NUMBER` is an integer with status in the low byte and the patch, fix, minor, and major versions in the nibbles above that. """ @@ -255,7 +286,7 @@ class VersionTests(TestCase): def test_SSLeay_version(self): """ - L{SSLeay_version} takes a version type indicator and returns + :py:obj:`SSLeay_version` takes a version type indicator and returns one of a number of version strings based on that indicator. """ versions = {} @@ -270,19 +301,19 @@ class VersionTests(TestCase): class ContextTests(TestCase, _LoopbackMixin): """ - Unit tests for L{OpenSSL.SSL.Context}. + Unit tests for :py:obj:`OpenSSL.SSL.Context`. """ def test_method(self): """ - L{Context} can be instantiated with one of L{SSLv2_METHOD}, - L{SSLv3_METHOD}, L{SSLv23_METHOD}, or L{TLSv1_METHOD}. + :py:obj:`Context` can be instantiated with one of :py:obj:`SSLv2_METHOD`, + :py:obj:`SSLv3_METHOD`, :py:obj:`SSLv23_METHOD`, or :py:obj:`TLSv1_METHOD`. """ for meth in [SSLv3_METHOD, SSLv23_METHOD, TLSv1_METHOD]: Context(meth) try: Context(SSLv2_METHOD) - except ValueError: + except (Error, ValueError): # Some versions of OpenSSL have SSLv2, some don't. # Difficult to say in advance. pass @@ -293,7 +324,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_type(self): """ - L{Context} and L{ContextType} refer to the same type object and can be + :py:obj:`Context` and :py:obj:`ContextType` refer to the same type object and can be used to create instances of that type. """ self.assertIdentical(Context, ContextType) @@ -302,7 +333,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_use_privatekey(self): """ - L{Context.use_privatekey} takes an L{OpenSSL.crypto.PKey} instance. + :py:obj:`Context.use_privatekey` takes an :py:obj:`OpenSSL.crypto.PKey` instance. """ key = PKey() key.generate_key(TYPE_RSA, 128) @@ -313,7 +344,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_set_app_data_wrong_args(self): """ - L{Context.set_app_data} raises L{TypeError} if called with other than + :py:obj:`Context.set_app_data` raises :py:obj:`TypeError` if called with other than one argument. """ context = Context(TLSv1_METHOD) @@ -323,7 +354,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_get_app_data_wrong_args(self): """ - L{Context.get_app_data} raises L{TypeError} if called with any + :py:obj:`Context.get_app_data` raises :py:obj:`TypeError` if called with any arguments. """ context = Context(TLSv1_METHOD) @@ -332,8 +363,8 @@ class ContextTests(TestCase, _LoopbackMixin): def test_app_data(self): """ - L{Context.set_app_data} stores an object for later retrieval using - L{Context.get_app_data}. + :py:obj:`Context.set_app_data` stores an object for later retrieval using + :py:obj:`Context.get_app_data`. """ app_data = object() context = Context(TLSv1_METHOD) @@ -343,8 +374,8 @@ class ContextTests(TestCase, _LoopbackMixin): def test_set_options_wrong_args(self): """ - L{Context.set_options} raises L{TypeError} if called with the wrong - number of arguments or a non-C{int} argument. + :py:obj:`Context.set_options` raises :py:obj:`TypeError` if called with the wrong + number of arguments or a non-:py:obj:`int` argument. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.set_options) @@ -352,10 +383,34 @@ class ContextTests(TestCase, _LoopbackMixin): self.assertRaises(TypeError, context.set_options, 1, None) + def test_set_mode_wrong_args(self): + """ + :py:obj:`Context.set`mode} raises :py:obj:`TypeError` if called with the wrong + number of arguments or a non-:py:obj:`int` argument. + """ + context = Context(TLSv1_METHOD) + self.assertRaises(TypeError, context.set_mode) + self.assertRaises(TypeError, context.set_mode, None) + self.assertRaises(TypeError, context.set_mode, 1, None) + + + if MODE_RELEASE_BUFFERS is not None: + def test_set_mode(self): + """ + :py:obj:`Context.set_mode` accepts a mode bitvector and returns the newly + set mode. + """ + context = Context(TLSv1_METHOD) + self.assertTrue( + MODE_RELEASE_BUFFERS & context.set_mode(MODE_RELEASE_BUFFERS)) + else: + "MODE_RELEASE_BUFFERS unavailable - OpenSSL version may be too old" + + def test_set_timeout_wrong_args(self): """ - L{Context.set_timeout} raises L{TypeError} if called with the wrong - number of arguments or a non-C{int} argument. + :py:obj:`Context.set_timeout` raises :py:obj:`TypeError` if called with the wrong + number of arguments or a non-:py:obj:`int` argument. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.set_timeout) @@ -365,7 +420,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_get_timeout_wrong_args(self): """ - L{Context.get_timeout} raises L{TypeError} if called with any arguments. + :py:obj:`Context.get_timeout` raises :py:obj:`TypeError` if called with any arguments. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.get_timeout, None) @@ -373,8 +428,8 @@ class ContextTests(TestCase, _LoopbackMixin): def test_timeout(self): """ - L{Context.set_timeout} sets the session timeout for all connections - created using the context object. L{Context.get_timeout} retrieves this + :py:obj:`Context.set_timeout` sets the session timeout for all connections + created using the context object. :py:obj:`Context.get_timeout` retrieves this value. """ context = Context(TLSv1_METHOD) @@ -384,8 +439,8 @@ class ContextTests(TestCase, _LoopbackMixin): def test_set_verify_depth_wrong_args(self): """ - L{Context.set_verify_depth} raises L{TypeError} if called with the wrong - number of arguments or a non-C{int} argument. + :py:obj:`Context.set_verify_depth` raises :py:obj:`TypeError` if called with the wrong + number of arguments or a non-:py:obj:`int` argument. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.set_verify_depth) @@ -395,7 +450,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_get_verify_depth_wrong_args(self): """ - L{Context.get_verify_depth} raises L{TypeError} if called with any arguments. + :py:obj:`Context.get_verify_depth` raises :py:obj:`TypeError` if called with any arguments. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.get_verify_depth, None) @@ -403,9 +458,9 @@ class ContextTests(TestCase, _LoopbackMixin): def test_verify_depth(self): """ - L{Context.set_verify_depth} sets the number of certificates in a chain + :py:obj:`Context.set_verify_depth` sets the number of certificates in a chain to follow before giving up. The value can be retrieved with - L{Context.get_verify_depth}. + :py:obj:`Context.get_verify_depth`. """ context = Context(TLSv1_METHOD) context.set_verify_depth(11) @@ -429,7 +484,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_set_passwd_cb_wrong_args(self): """ - L{Context.set_passwd_cb} raises L{TypeError} if called with the + :py:obj:`Context.set_passwd_cb` raises :py:obj:`TypeError` if called with the wrong arguments or with a non-callable first argument. """ context = Context(TLSv1_METHOD) @@ -440,7 +495,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_set_passwd_cb(self): """ - L{Context.set_passwd_cb} accepts a callable which will be invoked when + :py:obj:`Context.set_passwd_cb` accepts a callable which will be invoked when a private key is loaded from an encrypted PEM. """ passphrase = b("foobar") @@ -460,7 +515,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_passwd_callback_exception(self): """ - L{Context.use_privatekey_file} propagates any exception raised by the + :py:obj:`Context.use_privatekey_file` propagates any exception raised by the passphrase callback. """ pemFile = self._write_encrypted_pem(b("monkeys are nice")) @@ -474,7 +529,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_passwd_callback_false(self): """ - L{Context.use_privatekey_file} raises L{OpenSSL.SSL.Error} if the + :py:obj:`Context.use_privatekey_file` raises :py:obj:`OpenSSL.SSL.Error` if the passphrase callback returns a false value. """ pemFile = self._write_encrypted_pem(b("monkeys are nice")) @@ -488,7 +543,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_passwd_callback_non_string(self): """ - L{Context.use_privatekey_file} raises L{OpenSSL.SSL.Error} if the + :py:obj:`Context.use_privatekey_file` raises :py:obj:`OpenSSL.SSL.Error` if the passphrase callback returns a true non-string value. """ pemFile = self._write_encrypted_pem(b("monkeys are nice")) @@ -521,7 +576,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_set_info_callback(self): """ - L{Context.set_info_callback} accepts a callable which will be invoked + :py:obj:`Context.set_info_callback` accepts a callable which will be invoked when certain information about an SSL connection is available. """ (server, client) = socket_pair() @@ -556,8 +611,8 @@ class ContextTests(TestCase, _LoopbackMixin): def _load_verify_locations_test(self, *args): """ Create a client context which will verify the peer certificate and call - its C{load_verify_locations} method with C{*args}. Then connect it to a - server and ensure that the handshake succeeds. + its :py:obj:`load_verify_locations` method with the given arguments. + Then connect it to a server and ensure that the handshake succeeds. """ (server, client) = socket_pair() @@ -593,7 +648,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_load_verify_file(self): """ - L{Context.load_verify_locations} accepts a file name and uses the + :py:obj:`Context.load_verify_locations` accepts a file name and uses the certificates within for verification purposes. """ cafile = self.mktemp() @@ -606,7 +661,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_load_verify_invalid_file(self): """ - L{Context.load_verify_locations} raises L{Error} when passed a + :py:obj:`Context.load_verify_locations` raises :py:obj:`Error` when passed a non-existent cafile. """ clientContext = Context(TLSv1_METHOD) @@ -616,7 +671,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_load_verify_directory(self): """ - L{Context.load_verify_locations} accepts a directory name and uses + :py:obj:`Context.load_verify_locations` accepts a directory name and uses the certificates within for verification purposes. """ capath = self.mktemp() @@ -635,8 +690,8 @@ class ContextTests(TestCase, _LoopbackMixin): def test_load_verify_locations_wrong_args(self): """ - L{Context.load_verify_locations} raises L{TypeError} if called with - the wrong number of arguments or with non-C{str} arguments. + :py:obj:`Context.load_verify_locations` raises :py:obj:`TypeError` if called with + the wrong number of arguments or with non-:py:obj:`str` arguments. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.load_verify_locations) @@ -651,7 +706,7 @@ class ContextTests(TestCase, _LoopbackMixin): else: def test_set_default_verify_paths(self): """ - L{Context.set_default_verify_paths} causes the platform-specific CA + :py:obj:`Context.set_default_verify_paths` causes the platform-specific CA certificate locations to be used for verification purposes. """ # Testing this requires a server with a certificate signed by one of @@ -680,8 +735,8 @@ class ContextTests(TestCase, _LoopbackMixin): def test_set_default_verify_paths_signature(self): """ - L{Context.set_default_verify_paths} takes no arguments and raises - L{TypeError} if given any. + :py:obj:`Context.set_default_verify_paths` takes no arguments and raises + :py:obj:`TypeError` if given any. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.set_default_verify_paths, None) @@ -691,9 +746,9 @@ class ContextTests(TestCase, _LoopbackMixin): def test_add_extra_chain_cert_invalid_cert(self): """ - L{Context.add_extra_chain_cert} raises L{TypeError} if called with + :py:obj:`Context.add_extra_chain_cert` raises :py:obj:`TypeError` if called with other than one argument or if called with an object which is not an - instance of L{X509}. + instance of :py:obj:`X509`. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.add_extra_chain_cert) @@ -726,10 +781,10 @@ class ContextTests(TestCase, _LoopbackMixin): def test_add_extra_chain_cert(self): """ - L{Context.add_extra_chain_cert} accepts an L{X509} instance to add to + :py:obj:`Context.add_extra_chain_cert` accepts an :py:obj:`X509` instance to add to the certificate chain. - See L{_create_certificate_chain} for the details of the certificate + See :py:obj:`_create_certificate_chain` for the details of the certificate chain tested. The chain is tested by starting a server with scert and connecting @@ -770,7 +825,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_use_certificate_chain_file(self): """ - L{Context.use_certificate_chain_file} reads a certificate chain from + :py:obj:`Context.use_certificate_chain_file` reads a certificate chain from the specified file. The chain is tested by starting a server with scert and connecting @@ -809,7 +864,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_get_verify_mode_wrong_args(self): """ - L{Context.get_verify_mode} raises L{TypeError} if called with any + :py:obj:`Context.get_verify_mode` raises :py:obj:`TypeError` if called with any arguments. """ context = Context(TLSv1_METHOD) @@ -818,8 +873,8 @@ class ContextTests(TestCase, _LoopbackMixin): def test_get_verify_mode(self): """ - L{Context.get_verify_mode} returns the verify mode flags previously - passed to L{Context.set_verify}. + :py:obj:`Context.get_verify_mode` returns the verify mode flags previously + passed to :py:obj:`Context.set_verify`. """ context = Context(TLSv1_METHOD) self.assertEquals(context.get_verify_mode(), 0) @@ -831,8 +886,8 @@ class ContextTests(TestCase, _LoopbackMixin): def test_load_tmp_dh_wrong_args(self): """ - L{Context.load_tmp_dh} raises L{TypeError} if called with the wrong - number of arguments or with a non-C{str} argument. + :py:obj:`Context.load_tmp_dh` raises :py:obj:`TypeError` if called with the wrong + number of arguments or with a non-:py:obj:`str` argument. """ context = Context(TLSv1_METHOD) self.assertRaises(TypeError, context.load_tmp_dh) @@ -842,7 +897,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_load_tmp_dh_missing_file(self): """ - L{Context.load_tmp_dh} raises L{OpenSSL.SSL.Error} if the specified file + :py:obj:`Context.load_tmp_dh` raises :py:obj:`OpenSSL.SSL.Error` if the specified file does not exist. """ context = Context(TLSv1_METHOD) @@ -851,7 +906,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_load_tmp_dh(self): """ - L{Context.load_tmp_dh} loads Diffie-Hellman parameters from the + :py:obj:`Context.load_tmp_dh` loads Diffie-Hellman parameters from the specified file. """ context = Context(TLSv1_METHOD) @@ -865,7 +920,7 @@ class ContextTests(TestCase, _LoopbackMixin): def test_set_cipher_list(self): """ - L{Context.set_cipher_list} accepts a C{str} naming the ciphers which + :py:obj:`Context.set_cipher_list` accepts a :py:obj:`str` naming the ciphers which connections created with the context object will be able to choose from. """ context = Context(TLSv1_METHOD) @@ -874,15 +929,46 @@ class ContextTests(TestCase, _LoopbackMixin): self.assertEquals(conn.get_cipher_list(), ["EXP-RC4-MD5"]) + def test_set_session_cache_mode_wrong_args(self): + """ + L{Context.set_session_cache_mode} raises L{TypeError} if called with + other than one integer argument. + """ + context = Context(TLSv1_METHOD) + self.assertRaises(TypeError, context.set_session_cache_mode) + self.assertRaises(TypeError, context.set_session_cache_mode, object()) + + + def test_get_session_cache_mode_wrong_args(self): + """ + L{Context.get_session_cache_mode} raises L{TypeError} if called with any + arguments. + """ + context = Context(TLSv1_METHOD) + self.assertRaises(TypeError, context.get_session_cache_mode, 1) + + + def test_session_cache_mode(self): + """ + L{Context.set_session_cache_mode} specifies how sessions are cached. + The setting can be retrieved via L{Context.get_session_cache_mode}. + """ + context = Context(TLSv1_METHOD) + old = context.set_session_cache_mode(SESS_CACHE_OFF) + off = context.set_session_cache_mode(SESS_CACHE_BOTH) + self.assertEqual(SESS_CACHE_OFF, off) + self.assertEqual(SESS_CACHE_BOTH, context.get_session_cache_mode()) + + class ServerNameCallbackTests(TestCase, _LoopbackMixin): """ - Tests for L{Context.set_tlsext_servername_callback} and its interaction with - L{Connection}. + Tests for :py:obj:`Context.set_tlsext_servername_callback` and its interaction with + :py:obj:`Connection`. """ def test_wrong_args(self): """ - L{Context.set_tlsext_servername_callback} raises L{TypeError} if called + :py:obj:`Context.set_tlsext_servername_callback` raises :py:obj:`TypeError` if called with other than one argument. """ context = Context(TLSv1_METHOD) @@ -892,7 +978,7 @@ class ServerNameCallbackTests(TestCase, _LoopbackMixin): def test_old_callback_forgotten(self): """ - If L{Context.set_tlsext_servername_callback} is used to specify a new + If :py:obj:`Context.set_tlsext_servername_callback` is used to specify a new callback, the one it replaces is dereferenced. """ def callback(connection): @@ -915,8 +1001,8 @@ class ServerNameCallbackTests(TestCase, _LoopbackMixin): def test_no_servername(self): """ When a client specifies no server name, the callback passed to - L{Context.set_tlsext_servername_callback} is invoked and the result of - L{Connection.get_servername} is C{None}. + :py:obj:`Context.set_tlsext_servername_callback` is invoked and the result of + :py:obj:`Connection.get_servername` is :py:obj:`None`. """ args = [] def servername(conn): @@ -948,8 +1034,8 @@ class ServerNameCallbackTests(TestCase, _LoopbackMixin): def test_servername(self): """ When a client specifies a server name in its hello message, the callback - passed to L{Contexts.set_tlsext_servername_callback} is invoked and the - result of L{Connection.get_servername} is that server name. + passed to :py:obj:`Contexts.set_tlsext_servername_callback` is invoked and the + result of :py:obj:`Connection.get_servername` is that server name. """ args = [] def servername(conn): @@ -975,9 +1061,33 @@ class ServerNameCallbackTests(TestCase, _LoopbackMixin): +class SessionTests(TestCase): + """ + Unit tests for :py:obj:`OpenSSL.SSL.Session`. + """ + def test_construction(self): + """ + :py:class:`Session` can be constructed with no arguments, creating a new + instance of that type. + """ + new_session = Session() + self.assertTrue(isinstance(new_session, Session)) + + + def test_construction_wrong_args(self): + """ + If any arguments are passed to :py:class:`Session`, :py:obj:`TypeError` + is raised. + """ + self.assertRaises(TypeError, Session, 123) + self.assertRaises(TypeError, Session, "hello") + self.assertRaises(TypeError, Session, object()) + + + class ConnectionTests(TestCase, _LoopbackMixin): """ - Unit tests for L{OpenSSL.SSL.Connection}. + Unit tests for :py:obj:`OpenSSL.SSL.Connection`. """ # XXX want_write # XXX want_read @@ -999,7 +1109,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_type(self): """ - L{Connection} and L{ConnectionType} refer to the same type object and + :py:obj:`Connection` and :py:obj:`ConnectionType` refer to the same type object and can be used to create instances of that type. """ self.assertIdentical(Connection, ConnectionType) @@ -1009,8 +1119,8 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_get_context(self): """ - L{Connection.get_context} returns the L{Context} instance used to - construct the L{Connection} instance. + :py:obj:`Connection.get_context` returns the :py:obj:`Context` instance used to + construct the :py:obj:`Connection` instance. """ context = Context(TLSv1_METHOD) connection = Connection(context, None) @@ -1019,7 +1129,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_get_context_wrong_args(self): """ - L{Connection.get_context} raises L{TypeError} if called with any + :py:obj:`Connection.get_context` raises :py:obj:`TypeError` if called with any arguments. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1028,8 +1138,8 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_set_context_wrong_args(self): """ - L{Connection.set_context} raises L{TypeError} if called with a - non-L{Context} instance argument or with any number of arguments other + :py:obj:`Connection.set_context` raises :py:obj:`TypeError` if called with a + non-:py:obj:`Context` instance argument or with any number of arguments other than 1. """ ctx = Context(TLSv1_METHOD) @@ -1046,7 +1156,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_set_context(self): """ - L{Connection.set_context} specifies a new L{Context} instance to be used + :py:obj:`Connection.set_context` specifies a new :py:obj:`Context` instance to be used for the connection. """ original = Context(SSLv23_METHOD) @@ -1062,9 +1172,9 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_set_tlsext_host_name_wrong_args(self): """ - If L{Connection.set_tlsext_host_name} is called with a non-byte string + If :py:obj:`Connection.set_tlsext_host_name` is called with a non-byte string argument or a byte string with an embedded NUL or other than one - argument, L{TypeError} is raised. + argument, :py:obj:`TypeError` is raised. """ conn = Connection(Context(TLSv1_METHOD), None) self.assertRaises(TypeError, conn.set_tlsext_host_name) @@ -1082,7 +1192,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_get_servername_wrong_args(self): """ - L{Connection.get_servername} raises L{TypeError} if called with any + :py:obj:`Connection.get_servername` raises :py:obj:`TypeError` if called with any arguments. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1093,7 +1203,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_pending(self): """ - L{Connection.pending} returns the number of bytes available for + :py:obj:`Connection.pending` returns the number of bytes available for immediate read. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1102,7 +1212,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_pending_wrong_args(self): """ - L{Connection.pending} raises L{TypeError} if called with any arguments. + :py:obj:`Connection.pending` raises :py:obj:`TypeError` if called with any arguments. """ connection = Connection(Context(TLSv1_METHOD), None) self.assertRaises(TypeError, connection.pending, None) @@ -1110,7 +1220,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_connect_wrong_args(self): """ - L{Connection.connect} raises L{TypeError} if called with a non-address + :py:obj:`Connection.connect` raises :py:obj:`TypeError` if called with a non-address argument or with the wrong number of arguments. """ connection = Connection(Context(TLSv1_METHOD), socket()) @@ -1121,7 +1231,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_connect_refused(self): """ - L{Connection.connect} raises L{socket.error} if the underlying socket + :py:obj:`Connection.connect` raises :py:obj:`socket.error` if the underlying socket connect method raises it. """ client = socket() @@ -1133,7 +1243,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_connect(self): """ - L{Connection.connect} establishes a connection to the specified address. + :py:obj:`Connection.connect` establishes a connection to the specified address. """ port = socket() port.bind(('', 0)) @@ -1149,7 +1259,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): else: def test_connect_ex(self): """ - If there is a connection error, L{Connection.connect_ex} returns the + If there is a connection error, :py:obj:`Connection.connect_ex` returns the errno instead of raising an exception. """ port = socket() @@ -1166,7 +1276,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_accept_wrong_args(self): """ - L{Connection.accept} raises L{TypeError} if called with any arguments. + :py:obj:`Connection.accept` raises :py:obj:`TypeError` if called with any arguments. """ connection = Connection(Context(TLSv1_METHOD), socket()) self.assertRaises(TypeError, connection.accept, None) @@ -1174,8 +1284,8 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_accept(self): """ - L{Connection.accept} accepts a pending connection attempt and returns a - tuple of a new L{Connection} (the accepted client) and the address the + :py:obj:`Connection.accept` accepts a pending connection attempt and returns a + tuple of a new :py:obj:`Connection` (the accepted client) and the address the connection originated from. """ ctx = Context(TLSv1_METHOD) @@ -1201,7 +1311,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_shutdown_wrong_args(self): """ - L{Connection.shutdown} raises L{TypeError} if called with the wrong + :py:obj:`Connection.shutdown` raises :py:obj:`TypeError` if called with the wrong number of arguments or with arguments other than integers. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1214,7 +1324,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_shutdown(self): """ - L{Connection.shutdown} performs an SSL-level connection shutdown. + :py:obj:`Connection.shutdown` performs an SSL-level connection shutdown. """ server, client = self._loopback() self.assertFalse(server.shutdown()) @@ -1229,7 +1339,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_set_shutdown(self): """ - L{Connection.set_shutdown} sets the state of the SSL connection shutdown + :py:obj:`Connection.set_shutdown` sets the state of the SSL connection shutdown process. """ connection = Connection(Context(TLSv1_METHOD), socket()) @@ -1239,8 +1349,8 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_app_data_wrong_args(self): """ - L{Connection.set_app_data} raises L{TypeError} if called with other than - one argument. L{Connection.get_app_data} raises L{TypeError} if called + :py:obj:`Connection.set_app_data` raises :py:obj:`TypeError` if called with other than + one argument. :py:obj:`Connection.get_app_data` raises :py:obj:`TypeError` if called with any arguments. """ conn = Connection(Context(TLSv1_METHOD), None) @@ -1252,8 +1362,8 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_app_data(self): """ Any object can be set as app data by passing it to - L{Connection.set_app_data} and later retrieved with - L{Connection.get_app_data}. + :py:obj:`Connection.set_app_data` and later retrieved with + :py:obj:`Connection.get_app_data`. """ conn = Connection(Context(TLSv1_METHOD), None) app_data = object() @@ -1263,8 +1373,8 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_makefile(self): """ - L{Connection.makefile} is not implemented and calling that method raises - L{NotImplementedError}. + :py:obj:`Connection.makefile` is not implemented and calling that method raises + :py:obj:`NotImplementedError`. """ conn = Connection(Context(TLSv1_METHOD), None) self.assertRaises(NotImplementedError, conn.makefile) @@ -1272,7 +1382,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_get_peer_cert_chain_wrong_args(self): """ - L{Connection.get_peer_cert_chain} raises L{TypeError} if called with any + :py:obj:`Connection.get_peer_cert_chain` raises :py:obj:`TypeError` if called with any arguments. """ conn = Connection(Context(TLSv1_METHOD), None) @@ -1284,7 +1394,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_get_peer_cert_chain(self): """ - L{Connection.get_peer_cert_chain} returns a list of certificates which + :py:obj:`Connection.get_peer_cert_chain` returns a list of certificates which the connected server returned for the certification verification. """ chain = _create_certificate_chain() @@ -1318,7 +1428,7 @@ class ConnectionTests(TestCase, _LoopbackMixin): def test_get_peer_cert_chain_none(self): """ - L{Connection.get_peer_cert_chain} returns C{None} if the peer sends no + :py:obj:`Connection.get_peer_cert_chain` returns :py:obj:`None` if the peer sends no certificate chain. """ ctx = Context(TLSv1_METHOD) @@ -1332,14 +1442,151 @@ class ConnectionTests(TestCase, _LoopbackMixin): self.assertIdentical(None, server.get_peer_cert_chain()) + def test_get_session_wrong_args(self): + """ + :py:obj:`Connection.get_session` raises :py:obj:`TypeError` if called + with any arguments. + """ + ctx = Context(TLSv1_METHOD) + server = Connection(ctx, None) + self.assertRaises(TypeError, server.get_session, 123) + self.assertRaises(TypeError, server.get_session, "hello") + self.assertRaises(TypeError, server.get_session, object()) + + + def test_get_session_unconnected(self): + """ + :py:obj:`Connection.get_session` returns :py:obj:`None` when used with + an object which has not been connected. + """ + ctx = Context(TLSv1_METHOD) + server = Connection(ctx, None) + session = server.get_session() + self.assertIdentical(None, session) + + + def test_server_get_session(self): + """ + On the server side of a connection, :py:obj:`Connection.get_session` + returns a :py:class:`Session` instance representing the SSL session for + that connection. + """ + server, client = self._loopback() + session = server.get_session() + self.assertTrue(session, Session) + + + def test_client_get_session(self): + """ + On the client side of a connection, :py:obj:`Connection.get_session` + returns a :py:class:`Session` instance representing the SSL session for + that connection. + """ + server, client = self._loopback() + session = client.get_session() + self.assertTrue(session, Session) + + + def test_set_session_wrong_args(self): + """ + If called with an object that is not an instance of :py:class:`Session`, + or with other than one argument, :py:obj:`Connection.set_session` raises + :py:obj:`TypeError`. + """ + ctx = Context(TLSv1_METHOD) + connection = Connection(ctx, None) + self.assertRaises(TypeError, connection.set_session) + self.assertRaises(TypeError, connection.set_session, 123) + self.assertRaises(TypeError, connection.set_session, "hello") + self.assertRaises(TypeError, connection.set_session, object()) + self.assertRaises( + TypeError, connection.set_session, Session(), Session()) + + + def test_client_set_session(self): + """ + :py:obj:`Connection.set_session`, when used prior to a connection being + established, accepts a :py:class:`Session` instance and causes an + attempt to re-use the session it represents when the SSL handshake is + performed. + """ + key = load_privatekey(FILETYPE_PEM, server_key_pem) + cert = load_certificate(FILETYPE_PEM, server_cert_pem) + ctx = Context(TLSv1_METHOD) + ctx.use_privatekey(key) + ctx.use_certificate(cert) + ctx.set_session_id("unity-test") + + def makeServer(socket): + server = Connection(ctx, socket) + server.set_accept_state() + return server + + originalServer, originalClient = self._loopback( + serverFactory=makeServer) + originalSession = originalClient.get_session() + + def makeClient(socket): + client = self._loopbackClientFactory(socket) + client.set_session(originalSession) + return client + resumedServer, resumedClient = self._loopback( + serverFactory=makeServer, + clientFactory=makeClient) + + # This is a proxy: in general, we have no access to any unique + # identifier for the session (new enough versions of OpenSSL expose a + # hash which could be usable, but "new enough" is very, very new). + # Instead, exploit the fact that the master key is re-used if the + # session is re-used. As long as the master key for the two connections + # is the same, the session was re-used! + self.assertEqual( + originalServer.master_key(), resumedServer.master_key()) + + + def test_set_session_wrong_method(self): + """ + If :py:obj:`Connection.set_session` is passed a :py:class:`Session` + instance associated with a context using a different SSL method than the + :py:obj:`Connection` is using, a :py:class:`OpenSSL.SSL.Error` is + raised. + """ + key = load_privatekey(FILETYPE_PEM, server_key_pem) + cert = load_certificate(FILETYPE_PEM, server_cert_pem) + ctx = Context(TLSv1_METHOD) + ctx.use_privatekey(key) + ctx.use_certificate(cert) + ctx.set_session_id("unity-test") + + def makeServer(socket): + server = Connection(ctx, socket) + server.set_accept_state() + return server + + originalServer, originalClient = self._loopback( + serverFactory=makeServer) + originalSession = originalClient.get_session() + + def makeClient(socket): + # Intentionally use a different, incompatible method here. + client = Connection(Context(SSLv3_METHOD), socket) + client.set_connect_state() + client.set_session(originalSession) + return client + + self.assertRaises( + Error, + self._loopback, clientFactory=makeClient, serverFactory=makeServer) + + class ConnectionGetCipherListTests(TestCase): """ - Tests for L{Connection.get_cipher_list}. + Tests for :py:obj:`Connection.get_cipher_list`. """ def test_wrong_args(self): """ - L{Connection.get_cipher_list} raises L{TypeError} if called with any + :py:obj:`Connection.get_cipher_list` raises :py:obj:`TypeError` if called with any arguments. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1348,7 +1595,7 @@ class ConnectionGetCipherListTests(TestCase): def test_result(self): """ - L{Connection.get_cipher_list} returns a C{list} of C{str} giving the + :py:obj:`Connection.get_cipher_list` returns a :py:obj:`list` of :py:obj:`str` giving the names of the ciphers which might be used. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1361,12 +1608,12 @@ class ConnectionGetCipherListTests(TestCase): class ConnectionSendTests(TestCase, _LoopbackMixin): """ - Tests for L{Connection.send} + Tests for :py:obj:`Connection.send` """ def test_wrong_args(self): """ When called with arguments other than a single string, - L{Connection.send} raises L{TypeError}. + :py:obj:`Connection.send` raises :py:obj:`TypeError`. """ connection = Connection(Context(TLSv1_METHOD), None) self.assertRaises(TypeError, connection.send) @@ -1376,7 +1623,7 @@ class ConnectionSendTests(TestCase, _LoopbackMixin): def test_short_bytes(self): """ - When passed a short byte string, L{Connection.send} transmits all of it + When passed a short byte string, :py:obj:`Connection.send` transmits all of it and returns the number of bytes sent. """ server, client = self._loopback() @@ -1392,7 +1639,7 @@ class ConnectionSendTests(TestCase, _LoopbackMixin): def test_short_memoryview(self): """ When passed a memoryview onto a small number of bytes, - L{Connection.send} transmits all of them and returns the number of + :py:obj:`Connection.send` transmits all of them and returns the number of bytes sent. """ server, client = self._loopback() @@ -1404,12 +1651,12 @@ class ConnectionSendTests(TestCase, _LoopbackMixin): class ConnectionSendallTests(TestCase, _LoopbackMixin): """ - Tests for L{Connection.sendall}. + Tests for :py:obj:`Connection.sendall`. """ def test_wrong_args(self): """ When called with arguments other than a single string, - L{Connection.sendall} raises L{TypeError}. + :py:obj:`Connection.sendall` raises :py:obj:`TypeError`. """ connection = Connection(Context(TLSv1_METHOD), None) self.assertRaises(TypeError, connection.sendall) @@ -1419,7 +1666,7 @@ class ConnectionSendallTests(TestCase, _LoopbackMixin): def test_short(self): """ - L{Connection.sendall} transmits all of the bytes in the string passed to + :py:obj:`Connection.sendall` transmits all of the bytes in the string passed to it. """ server, client = self._loopback() @@ -1435,7 +1682,7 @@ class ConnectionSendallTests(TestCase, _LoopbackMixin): def test_short_memoryview(self): """ When passed a memoryview onto a small number of bytes, - L{Connection.sendall} transmits all of them. + :py:obj:`Connection.sendall` transmits all of them. """ server, client = self._loopback() server.sendall(memoryview(b('x'))) @@ -1444,7 +1691,7 @@ class ConnectionSendallTests(TestCase, _LoopbackMixin): def test_long(self): """ - L{Connection.sendall} transmits all of the bytes in the string passed to + :py:obj:`Connection.sendall` transmits all of the bytes in the string passed to it even if this requires multiple calls of an underlying write function. """ server, client = self._loopback() @@ -1464,7 +1711,7 @@ class ConnectionSendallTests(TestCase, _LoopbackMixin): def test_closed(self): """ - If the underlying socket is closed, L{Connection.sendall} propagates the + If the underlying socket is closed, :py:obj:`Connection.sendall` propagates the write error from the low level write call. """ server, client = self._loopback() @@ -1479,7 +1726,7 @@ class ConnectionRenegotiateTests(TestCase, _LoopbackMixin): """ def test_renegotiate_wrong_args(self): """ - L{Connection.renegotiate} raises L{TypeError} if called with any + :py:obj:`Connection.renegotiate` raises :py:obj:`TypeError` if called with any arguments. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1488,7 +1735,7 @@ class ConnectionRenegotiateTests(TestCase, _LoopbackMixin): def test_total_renegotiations_wrong_args(self): """ - L{Connection.total_renegotiations} raises L{TypeError} if called with + :py:obj:`Connection.total_renegotiations` raises :py:obj:`TypeError` if called with any arguments. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1497,7 +1744,7 @@ class ConnectionRenegotiateTests(TestCase, _LoopbackMixin): def test_total_renegotiations(self): """ - L{Connection.total_renegotiations} returns C{0} before any + :py:obj:`Connection.total_renegotiations` returns :py:obj:`0` before any renegotiations have happened. """ connection = Connection(Context(TLSv1_METHOD), None) @@ -1528,11 +1775,11 @@ class ConnectionRenegotiateTests(TestCase, _LoopbackMixin): class ErrorTests(TestCase): """ - Unit tests for L{OpenSSL.SSL.Error}. + Unit tests for :py:obj:`OpenSSL.SSL.Error`. """ def test_type(self): """ - L{Error} is an exception type. + :py:obj:`Error` is an exception type. """ self.assertTrue(issubclass(Error, Exception)) self.assertEqual(Error.__name__, 'Error') @@ -1541,7 +1788,7 @@ class ErrorTests(TestCase): class ConstantsTests(TestCase): """ - Tests for the values of constants exposed in L{OpenSSL.SSL}. + Tests for the values of constants exposed in :py:obj:`OpenSSL.SSL`. These are values defined by OpenSSL intended only to be used as flags to OpenSSL APIs. The only assertions it seems can be made about them is @@ -1551,8 +1798,8 @@ class ConstantsTests(TestCase): if OP_NO_QUERY_MTU is not None: def test_op_no_query_mtu(self): """ - The value of L{OpenSSL.SSL.OP_NO_QUERY_MTU} is 0x1000, the value of - I{SSL_OP_NO_QUERY_MTU} defined by I{openssl/ssl.h}. + The value of :py:obj:`OpenSSL.SSL.OP_NO_QUERY_MTU` is 0x1000, the value of + :py:const:`SSL_OP_NO_QUERY_MTU` defined by :file:`openssl/ssl.h`. """ self.assertEqual(OP_NO_QUERY_MTU, 0x1000) else: @@ -1562,8 +1809,8 @@ class ConstantsTests(TestCase): if OP_COOKIE_EXCHANGE is not None: def test_op_cookie_exchange(self): """ - The value of L{OpenSSL.SSL.OP_COOKIE_EXCHANGE} is 0x2000, the value - of I{SSL_OP_COOKIE_EXCHANGE} defined by I{openssl/ssl.h}. + The value of :py:obj:`OpenSSL.SSL.OP_COOKIE_EXCHANGE` is 0x2000, the value + of :py:const:`SSL_OP_COOKIE_EXCHANGE` defined by :file:`openssl/ssl.h`. """ self.assertEqual(OP_COOKIE_EXCHANGE, 0x2000) else: @@ -1573,23 +1820,100 @@ class ConstantsTests(TestCase): if OP_NO_TICKET is not None: def test_op_no_ticket(self): """ - The value of L{OpenSSL.SSL.OP_NO_TICKET} is 0x4000, the value of - I{SSL_OP_NO_TICKET} defined by I{openssl/ssl.h}. + The value of :py:obj:`OpenSSL.SSL.OP_NO_TICKET` is 0x4000, the value of + :py:const:`SSL_OP_NO_TICKET` defined by :file:`openssl/ssl.h`. """ self.assertEqual(OP_NO_TICKET, 0x4000) else: "OP_NO_TICKET unavailable - OpenSSL version may be too old" + if OP_NO_COMPRESSION is not None: + def test_op_no_compression(self): + """ + The value of :py:obj:`OpenSSL.SSL.OP_NO_COMPRESSION` is 0x20000, the value + of :py:const:`SSL_OP_NO_COMPRESSION` defined by :file:`openssl/ssl.h`. + """ + self.assertEqual(OP_NO_COMPRESSION, 0x20000) + else: + "OP_NO_COMPRESSION unavailable - OpenSSL version may be too old" + + + def test_sess_cache_off(self): + """ + The value of L{OpenSSL.SSL.SESS_CACHE_OFF} 0x0, the value of + L{SSL_SESS_CACHE_OFF} defined by I{openssl/ssl.h}. + """ + self.assertEqual(0x0, SESS_CACHE_OFF) + + + def test_sess_cache_client(self): + """ + The value of L{OpenSSL.SSL.SESS_CACHE_CLIENT} 0x1, the value of + L{SSL_SESS_CACHE_CLIENT} defined by I{openssl/ssl.h}. + """ + self.assertEqual(0x1, SESS_CACHE_CLIENT) + + + def test_sess_cache_server(self): + """ + The value of L{OpenSSL.SSL.SESS_CACHE_SERVER} 0x2, the value of + L{SSL_SESS_CACHE_SERVER} defined by I{openssl/ssl.h}. + """ + self.assertEqual(0x2, SESS_CACHE_SERVER) + + + def test_sess_cache_both(self): + """ + The value of L{OpenSSL.SSL.SESS_CACHE_BOTH} 0x3, the value of + L{SSL_SESS_CACHE_BOTH} defined by I{openssl/ssl.h}. + """ + self.assertEqual(0x3, SESS_CACHE_BOTH) + + + def test_sess_cache_no_auto_clear(self): + """ + The value of L{OpenSSL.SSL.SESS_CACHE_NO_AUTO_CLEAR} 0x80, the value of + L{SSL_SESS_CACHE_NO_AUTO_CLEAR} defined by I{openssl/ssl.h}. + """ + self.assertEqual(0x80, SESS_CACHE_NO_AUTO_CLEAR) + + + def test_sess_cache_no_internal_lookup(self): + """ + The value of L{OpenSSL.SSL.SESS_CACHE_NO_INTERNAL_LOOKUP} 0x100, the + value of L{SSL_SESS_CACHE_NO_INTERNAL_LOOKUP} defined by + I{openssl/ssl.h}. + """ + self.assertEqual(0x100, SESS_CACHE_NO_INTERNAL_LOOKUP) + + + def test_sess_cache_no_internal_store(self): + """ + The value of L{OpenSSL.SSL.SESS_CACHE_NO_INTERNAL_STORE} 0x200, the + value of L{SSL_SESS_CACHE_NO_INTERNAL_STORE} defined by + I{openssl/ssl.h}. + """ + self.assertEqual(0x200, SESS_CACHE_NO_INTERNAL_STORE) + + + def test_sess_cache_no_internal(self): + """ + The value of L{OpenSSL.SSL.SESS_CACHE_NO_INTERNAL} 0x300, the value of + L{SSL_SESS_CACHE_NO_INTERNAL} defined by I{openssl/ssl.h}. + """ + self.assertEqual(0x300, SESS_CACHE_NO_INTERNAL) + + class MemoryBIOTests(TestCase, _LoopbackMixin): """ - Tests for L{OpenSSL.SSL.Connection} using a memory BIO. + Tests for :py:obj:`OpenSSL.SSL.Connection` using a memory BIO. """ def _server(self, sock): """ - Create a new server-side SSL L{Connection} object wrapped around - C{sock}. + Create a new server-side SSL :py:obj:`Connection` object wrapped around + :py:obj:`sock`. """ # Create the server side Connection. This is mostly setup boilerplate # - use TLSv1, use a particular certificate, etc. @@ -1610,8 +1934,8 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def _client(self, sock): """ - Create a new client-side SSL L{Connection} object wrapped around - C{sock}. + Create a new client-side SSL :py:obj:`Connection` object wrapped around + :py:obj:`sock`. """ # Now create the client side Connection. Similar boilerplate to the # above. @@ -1630,7 +1954,7 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_memoryConnect(self): """ - Two L{Connection}s which use memory BIOs can be manually connected by + Two :py:obj:`Connection`s which use memory BIOs can be manually connected by reading from the output of each and writing those bytes to the input of the other and in this way establish a connection and exchange application-level bytes with each other. @@ -1674,10 +1998,10 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_socketConnect(self): """ - Just like L{test_memoryConnect} but with an actual socket. + Just like :py:obj:`test_memoryConnect` but with an actual socket. This is primarily to rule out the memory BIO code as the source of - any problems encountered while passing data over a L{Connection} (if + any problems encountered while passing data over a :py:obj:`Connection` (if this test fails, there must be a problem outside the memory BIO code, as no memory BIO is involved here). Even though this isn't a memory BIO test, it's convenient to have it here. @@ -1698,8 +2022,8 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_socketOverridesMemory(self): """ - Test that L{OpenSSL.SSL.bio_read} and L{OpenSSL.SSL.bio_write} don't - work on L{OpenSSL.SSL.Connection}() that use sockets. + Test that :py:obj:`OpenSSL.SSL.bio_read` and :py:obj:`OpenSSL.SSL.bio_write` don't + work on :py:obj:`OpenSSL.SSL.Connection`() that use sockets. """ context = Context(SSLv3_METHOD) client = socket() @@ -1712,7 +2036,7 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_outgoingOverflow(self): """ If more bytes than can be written to the memory BIO are passed to - L{Connection.send} at once, the number of bytes which were written is + :py:obj:`Connection.send` at once, the number of bytes which were written is returned and that many bytes from the beginning of the input can be read from the other end of the connection. """ @@ -1738,8 +2062,8 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_shutdown(self): """ - L{Connection.bio_shutdown} signals the end of the data stream from - which the L{Connection} reads. + :py:obj:`Connection.bio_shutdown` signals the end of the data stream from + which the :py:obj:`Connection` reads. """ server = self._server(None) server.bio_shutdown() @@ -1751,13 +2075,13 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def _check_client_ca_list(self, func): """ - Verify the return value of the C{get_client_ca_list} method for server and client connections. + Verify the return value of the :py:obj:`get_client_ca_list` method for server and client connections. - @param func: A function which will be called with the server context + :param func: A function which will be called with the server context before the client and server are connected to each other. This function should specify a list of CAs for the server to send to the client and return that same list. The list will be used to verify - that C{get_client_ca_list} returns the proper value at various + that :py:obj:`get_client_ca_list` returns the proper value at various times. """ server = self._server(None) @@ -1775,7 +2099,7 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_set_client_ca_list_errors(self): """ - L{Context.set_client_ca_list} raises a L{TypeError} if called with a + :py:obj:`Context.set_client_ca_list` raises a :py:obj:`TypeError` if called with a non-list or a list that contains objects other than X509Names. """ ctx = Context(TLSv1_METHOD) @@ -1786,9 +2110,9 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_set_empty_ca_list(self): """ - If passed an empty list, L{Context.set_client_ca_list} configures the + If passed an empty list, :py:obj:`Context.set_client_ca_list` configures the context to send no CA names to the client and, on both the server and - client sides, L{Connection.get_client_ca_list} returns an empty list + client sides, :py:obj:`Connection.get_client_ca_list` returns an empty list after the connection is set up. """ def no_ca(ctx): @@ -1800,9 +2124,9 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_set_one_ca_list(self): """ If passed a list containing a single X509Name, - L{Context.set_client_ca_list} configures the context to send that CA + :py:obj:`Context.set_client_ca_list` configures the context to send that CA name to the client and, on both the server and client sides, - L{Connection.get_client_ca_list} returns a list containing that + :py:obj:`Connection.get_client_ca_list` returns a list containing that X509Name after the connection is set up. """ cacert = load_certificate(FILETYPE_PEM, root_cert_pem) @@ -1816,9 +2140,9 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_set_multiple_ca_list(self): """ If passed a list containing multiple X509Name objects, - L{Context.set_client_ca_list} configures the context to send those CA + :py:obj:`Context.set_client_ca_list` configures the context to send those CA names to the client and, on both the server and client sides, - L{Connection.get_client_ca_list} returns a list containing those + :py:obj:`Connection.get_client_ca_list` returns a list containing those X509Names after the connection is set up. """ secert = load_certificate(FILETYPE_PEM, server_cert_pem) @@ -1837,7 +2161,7 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_reset_ca_list(self): """ If called multiple times, only the X509Names passed to the final call - of L{Context.set_client_ca_list} are used to configure the CA names + of :py:obj:`Context.set_client_ca_list` are used to configure the CA names sent to the client. """ cacert = load_certificate(FILETYPE_PEM, root_cert_pem) @@ -1857,7 +2181,7 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_mutated_ca_list(self): """ - If the list passed to L{Context.set_client_ca_list} is mutated + If the list passed to :py:obj:`Context.set_client_ca_list` is mutated afterwards, this does not affect the list of CA names sent to the client. """ @@ -1877,7 +2201,7 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_add_client_ca_errors(self): """ - L{Context.add_client_ca} raises L{TypeError} if called with a non-X509 + :py:obj:`Context.add_client_ca` raises :py:obj:`TypeError` if called with a non-X509 object or with a number of arguments other than one. """ ctx = Context(TLSv1_METHOD) @@ -1890,7 +2214,7 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_one_add_client_ca(self): """ A certificate's subject can be added as a CA to be sent to the client - with L{Context.add_client_ca}. + with :py:obj:`Context.add_client_ca`. """ cacert = load_certificate(FILETYPE_PEM, root_cert_pem) cadesc = cacert.get_subject() @@ -1903,7 +2227,7 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_multiple_add_client_ca(self): """ Multiple CA names can be sent to the client by calling - L{Context.add_client_ca} with multiple X509 objects. + :py:obj:`Context.add_client_ca` with multiple X509 objects. """ cacert = load_certificate(FILETYPE_PEM, root_cert_pem) secert = load_certificate(FILETYPE_PEM, server_cert_pem) @@ -1920,8 +2244,8 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_set_and_add_client_ca(self): """ - A call to L{Context.set_client_ca_list} followed by a call to - L{Context.add_client_ca} results in using the CA names from the first + A call to :py:obj:`Context.set_client_ca_list` followed by a call to + :py:obj:`Context.add_client_ca` results in using the CA names from the first call and the CA name from the second call. """ cacert = load_certificate(FILETYPE_PEM, root_cert_pem) @@ -1941,8 +2265,8 @@ class MemoryBIOTests(TestCase, _LoopbackMixin): def test_set_after_add_client_ca(self): """ - A call to L{Context.set_client_ca_list} after a call to - L{Context.add_client_ca} replaces the CA name specified by the former + A call to :py:obj:`Context.set_client_ca_list` after a call to + :py:obj:`Context.add_client_ca` replaces the CA name specified by the former call with the names specified by the latter cal. """ cacert = load_certificate(FILETYPE_PEM, root_cert_pem) diff --git a/OpenSSL/test/util.py b/OpenSSL/test/util.py index 643fb91..79da76b 100644 --- a/OpenSSL/test/util.py +++ b/OpenSSL/test/util.py @@ -27,12 +27,12 @@ else: class TestCase(TestCase): """ - L{TestCase} adds useful testing functionality beyond what is available - from the standard library L{unittest.TestCase}. + :py:class:`TestCase` adds useful testing functionality beyond what is available + from the standard library :py:class:`unittest.TestCase`. """ def tearDown(self): """ - Clean up any files or directories created using L{TestCase.mktemp}. + Clean up any files or directories created using :py:meth:`TestCase.mktemp`. Subclasses must invoke this method if they override it or the cleanup will not occur. """ @@ -52,12 +52,12 @@ class TestCase(TestCase): def failUnlessIn(self, containee, container, msg=None): """ - Fail the test if C{containee} is not found in C{container}. + Fail the test if :py:data:`containee` is not found in :py:data:`container`. - @param containee: the value that should be in C{container} - @param container: a sequence type, or in the case of a mapping type, + :param containee: the value that should be in :py:class:`container` + :param container: a sequence type, or in the case of a mapping type, will follow semantics of 'if key in dict.keys()' - @param msg: if msg is None, then the failure message will be + :param msg: if msg is None, then the failure message will be '%r not in %r' % (first, second) """ if containee not in container: @@ -68,11 +68,11 @@ class TestCase(TestCase): def failUnlessIdentical(self, first, second, msg=None): """ - Fail the test if C{first} is not C{second}. This is an + Fail the test if :py:data:`first` is not :py:data:`second`. This is an obect-identity-equality test, not an object equality - (i.e. C{__eq__}) test. + (i.e. :py:func:`__eq__`) test. - @param msg: if msg is None, then the failure message will be + :param msg: if msg is None, then the failure message will be '%r is not %r' % (first, second) """ if first is not second: @@ -83,11 +83,11 @@ class TestCase(TestCase): def failIfIdentical(self, first, second, msg=None): """ - Fail the test if C{first} is C{second}. This is an + Fail the test if :py:data:`first` is :py:data:`second`. This is an obect-identity-equality test, not an object equality - (i.e. C{__eq__}) test. + (i.e. :py:func:`__eq__`) test. - @param msg: if msg is None, then the failure message will be + :param msg: if msg is None, then the failure message will be '%r is %r' % (first, second) """ if first is second: @@ -98,15 +98,16 @@ class TestCase(TestCase): def failUnlessRaises(self, exception, f, *args, **kwargs): """ - Fail the test unless calling the function C{f} with the given - C{args} and C{kwargs} raises C{exception}. The failure will report - the traceback and call stack of the unexpected exception. + Fail the test unless calling the function :py:data:`f` with the given + :py:data:`args` and :py:data:`kwargs` raises :py:data:`exception`. The + failure will report the traceback and call stack of the unexpected + exception. - @param exception: exception type that is to be expected - @param f: the function to call + :param exception: exception type that is to be expected + :param f: the function to call - @return: The raised exception instance, if it is of the given type. - @raise self.failureException: Raised if the function call does + :return: The raised exception instance, if it is of the given type. + :raise self.failureException: Raised if the function call does not raise an exception or if it raises an exception of a different type. """ @@ -150,14 +151,14 @@ class TestCase(TestCase): # Other stuff def assertConsistentType(self, theType, name, *constructionArgs): """ - Perform various assertions about C{theType} to ensure that it is a + Perform various assertions about :py:data:`theType` to ensure that it is a well-defined type. This is useful for extension types, where it's pretty easy to do something wacky. If something about the type is unusual, an exception will be raised. - @param theType: The type object about which to make assertions. - @param name: A string giving the name of the type. - @param constructionArgs: Positional arguments to use with C{theType} to + :param theType: The type object about which to make assertions. + :param name: A string giving the name of the type. + :param constructionArgs: Positional arguments to use with :py:data:`theType` to create an instance of it. """ self.assertEqual(theType.__name__, name) diff --git a/OpenSSL/version.py b/OpenSSL/version.py index b7255e9..be51903 100644 --- a/OpenSSL/version.py +++ b/OpenSSL/version.py @@ -6,4 +6,4 @@ pyOpenSSL - A simple wrapper around the OpenSSL library """ -__version__ = '0.12' +__version__ = '0.13' diff --git a/doc/Makefile b/doc/Makefile index 07aabdc..4202bee 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,20 +1,130 @@ -PAPER = a4 -MKHOWTO = python tools/mkhowto --$(PAPER) +# Makefile for Sphinx documentation +# -default: html +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build -all: ps html text dvi +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -dvi ps text: pyOpenSSL.tex - $(MKHOWTO) --$@ $^ +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest -html: pyOpenSSL.tex - $(MKHOWTO) --html --iconserver . $^ - -rm -rf html - mv pyOpenSSL html +help: + @echo "Please use \`make <target>' where <target> is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: - rm -rf html pyOpenSSL.dvi pyOpenSSL.ps pyOpenSSL.txt \ - pyOpenSSL.l2h pyOpenSSL.how + -rm -rf $(BUILDDIR)/* -.PHONY: default all html dvi ps text clean +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pyOpenSSL.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pyOpenSSL.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/pyOpenSSL" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pyOpenSSL" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." @@ -1,18 +1,4 @@ +This is the pyOpenSSL documentation source. It uses Sphinx. To build the +documentation, install Sphinx 1.0 and run: -Only the .tex format documentation is original, -because the others are derived from it, so don't -edit them directly. To build the other formats -use a command of ... - - make all - - -To build the documentation you will need to have -latex2html and lynx installed. On Fedora both can -be obtained with ... - - sudo yum install latex2html lynx - -Or on Debian or Ubuntu ... - - sudo apt-get install latex2html lynx + $ make html diff --git a/doc/api.rst b/doc/api.rst new file mode 100644 index 0000000..826ec4d --- /dev/null +++ b/doc/api.rst @@ -0,0 +1,18 @@ +.. _openssl: + +:py:mod:`OpenSSL` --- Python interface to OpenSSL +================================================= + +.. py:module:: OpenSSL + :synopsis: Python interface to OpenSSL + + +This package provides a high-level interface to the functions in the +OpenSSL library. The following modules are defined: + +.. toctree:: + :maxdepth: 2 + + api/crypto + api/rand + api/ssl diff --git a/doc/api/crypto.rst b/doc/api/crypto.rst new file mode 100644 index 0000000..4d3961c --- /dev/null +++ b/doc/api/crypto.rst @@ -0,0 +1,751 @@ +.. _openssl-crypto: + +:py:mod:`crypto` --- Generic cryptographic module +================================================= + +.. py:module:: OpenSSL.crypto + :synopsis: Generic cryptographic module + + +.. py:data:: X509Type + + See :py:class:`X509`. + + +.. py:class:: X509() + + A class representing X.509 certificates. + + +.. py:data:: X509NameType + + See :py:class:`X509Name`. + + +.. py:class:: X509Name(x509name) + + A class representing X.509 Distinguished Names. + + This constructor creates a copy of *x509name* which should be an + instance of :py:class:`X509Name`. + + +.. py:data:: X509ReqType + + See :py:class:`X509Req`. + + +.. py:class:: X509Req() + + A class representing X.509 certificate requests. + + +.. py:data:: X509StoreType + + A Python type object representing the X509Store object type. + + +.. py:data:: PKeyType + + See :py:class:`PKey`. + + +.. py:class:: PKey() + + A class representing DSA or RSA keys. + + +.. py:data:: PKCS7Type + + A Python type object representing the PKCS7 object type. + + +.. py:data:: PKCS12Type + + A Python type object representing the PKCS12 object type. + + +.. py:data:: X509ExtensionType + + See :py:class:`X509Extension`. + + +.. py:class:: X509Extension(typename, critical, value[, subject][, issuer]) + + A class representing an X.509 v3 certificate extensions. See + http://openssl.org/docs/apps/x509v3_config.html#STANDARD_EXTENSIONS for + *typename* strings and their options. Optional parameters *subject* and + *issuer* must be X509 objects. + + +.. py:data:: NetscapeSPKIType + + See :py:class:`NetscapeSPKI`. + + +.. py:class:: NetscapeSPKI([enc]) + + A class representing Netscape SPKI objects. + + If the *enc* argument is present, it should be a base64-encoded string + representing a NetscapeSPKI object, as returned by the :py:meth:`b64_encode` + method. + + +.. py:class:: CRL() + + A class representing Certifcate Revocation List objects. + + +.. py:class:: Revoked() + + A class representing Revocation objects of CRL. + + +.. py:data:: FILETYPE_PEM + FILETYPE_ASN1 + + File type constants. + + +.. py:data:: TYPE_RSA + TYPE_DSA + + Key type constants. + + +.. py:exception:: Error + + Generic exception used in the :py:mod:`.crypto` module. + + +.. py:function:: dump_certificate(type, cert) + + Dump the certificate *cert* into a buffer string encoded with the type + *type*. + + +.. py:function:: dump_certificate_request(type, req) + + Dump the certificate request *req* into a buffer string encoded with the + type *type*. + + +.. py:function:: dump_privatekey(type, pkey[, cipher, passphrase]) + + Dump the private key *pkey* into a buffer string encoded with the type + *type*, optionally (if *type* is :py:const:`FILETYPE_PEM`) encrypting it + using *cipher* and *passphrase*. + + *passphrase* must be either a string or a callback for providing the + pass phrase. + + +.. py:function:: load_certificate(type, buffer) + + Load a certificate (X509) from the string *buffer* encoded with the + type *type*. + + +.. py:function:: load_certificate_request(type, buffer) + + Load a certificate request (X509Req) from the string *buffer* encoded with + the type *type*. + + +.. py:function:: load_privatekey(type, buffer[, passphrase]) + + Load a private key (PKey) from the string *buffer* encoded with the type + *type* (must be one of :py:const:`FILETYPE_PEM` and + :py:const:`FILETYPE_ASN1`). + + *passphrase* must be either a string or a callback for providing the pass + phrase. + + +.. py:function:: load_crl(type, buffer) + + Load Certificate Revocation List (CRL) data from a string *buffer*. + *buffer* encoded with the type *type*. The type *type* must either + :py:const:`FILETYPE_PEM` or :py:const:`FILETYPE_ASN1`). + + +.. py:function:: load_pkcs7_data(type, buffer) + + Load pkcs7 data from the string *buffer* encoded with the type *type*. + + +.. py:function:: load_pkcs12(buffer[, passphrase]) + + Load pkcs12 data from the string *buffer*. If the pkcs12 structure is + encrypted, a *passphrase* must be included. The MAC is always + checked and thus required. + + See also the man page for the C function :py:func:`PKCS12_parse`. + + +.. py:function:: sign(key, data, digest) + + Sign a data string using the given key and message digest. + + *key* is a :py:class:`PKey` instance. *data* is a ``str`` instance. + *digest* is a ``str`` naming a supported message digest type, for example + :py:const:`sha1`. + + .. versionadded:: 0.11 + + +.. py:function:: verify(certificate, signature, data, digest) + + Verify the signature for a data string. + + *certificate* is a :py:class:`X509` instance corresponding to the private + key which generated the signature. *signature* is a *str* instance giving + the signature itself. *data* is a *str* instance giving the data to which + the signature applies. *digest* is a *str* instance naming the message + digest type of the signature, for example :py:const:`sha1`. + + .. versionadded:: 0.11 + + +.. _openssl-x509: + +X509 objects +------------ + +X509 objects have the following methods: + +.. py:method:: X509.get_issuer() + + Return an X509Name object representing the issuer of the certificate. + + +.. py:method:: X509.get_pubkey() + + Return a :py:class:`PKey` object representing the public key of the certificate. + + +.. py:method:: X509.get_serial_number() + + Return the certificate serial number. + + +.. py:method:: X509.get_signature_algorithm() + + Return the signature algorithm used in the certificate. If the algorithm is + undefined, raise :py:data:`ValueError`. + + +.. py:method:: X509.get_subject() + + Return an :py:class:`X509Name` object representing the subject of the certificate. + + +.. py:method:: X509.get_version() + + Return the certificate version. + + +.. py:method:: X509.get_notBefore() + + Return a string giving the time before which the certificate is not valid. The + string is formatted as an ASN1 GENERALIZEDTIME:: + + YYYYMMDDhhmmssZ + YYYYMMDDhhmmss+hhmm + YYYYMMDDhhmmss-hhmm + + If no value exists for this field, :py:data:`None` is returned. + + +.. py:method:: X509.get_notAfter() + + Return a string giving the time after which the certificate is not valid. The + string is formatted as an ASN1 GENERALIZEDTIME:: + + YYYYMMDDhhmmssZ + YYYYMMDDhhmmss+hhmm + YYYYMMDDhhmmss-hhmm + + If no value exists for this field, :py:data:`None` is returned. + + +.. py:method:: X509.set_notBefore(when) + + Change the time before which the certificate is not valid. *when* is a + string formatted as an ASN1 GENERALIZEDTIME:: + + YYYYMMDDhhmmssZ + YYYYMMDDhhmmss+hhmm + YYYYMMDDhhmmss-hhmm + + +.. py:method:: X509.set_notAfter(when) + + Change the time after which the certificate is not valid. *when* is a + string formatted as an ASN1 GENERALIZEDTIME:: + + YYYYMMDDhhmmssZ + YYYYMMDDhhmmss+hhmm + YYYYMMDDhhmmss-hhmm + + + +.. py:method:: X509.gmtime_adj_notBefore(time) + + Adjust the timestamp (in GMT) when the certificate starts being valid. + + +.. py:method:: X509.gmtime_adj_notAfter(time) + + Adjust the timestamp (in GMT) when the certificate stops being valid. + + +.. py:method:: X509.has_expired() + + Checks the certificate's time stamp against current time. Returns true if the + certificate has expired and false otherwise. + + +.. py:method:: X509.set_issuer(issuer) + + Set the issuer of the certificate to *issuer*. + + +.. py:method:: X509.set_pubkey(pkey) + + Set the public key of the certificate to *pkey*. + + +.. py:method:: X509.set_serial_number(serialno) + + Set the serial number of the certificate to *serialno*. + + +.. py:method:: X509.set_subject(subject) + + Set the subject of the certificate to *subject*. + + +.. py:method:: X509.set_version(version) + + Set the certificate version to *version*. + + +.. py:method:: X509.sign(pkey, digest) + + Sign the certificate, using the key *pkey* and the message digest algorithm + identified by the string *digest*. + + +.. py:method:: X509.subject_name_hash() + + Return the hash of the certificate subject. + +.. py:method:: X509.digest(digest_name) + + Return a digest of the certificate, using the *digest_name* method. + *digest_name* must be a string describing a digest algorithm supported + by OpenSSL (by EVP_get_digestbyname, specifically). For example, + :py:const:`"md5"` or :py:const:`"sha1"`. + + +.. py:method:: X509.add_extensions(extensions) + + Add the extensions in the sequence *extensions* to the certificate. + + +.. py:method:: X509.get_extension_count() + + Return the number of extensions on this certificate. + + .. versionadded:: 0.12 + + +.. py:method:: X509.get_extension(index) + + Retrieve the extension on this certificate at the given index. + + Extensions on a certificate are kept in order. The index parameter selects + which extension will be returned. The returned object will be an + :py:class:`X509Extension` instance. + + .. versionadded:: 0.12 + + +.. _openssl-x509name: + +X509Name objects +---------------- + +X509Name objects have the following methods: + +.. py:method:: X509Name.hash() + + Return an integer giving the first four bytes of the MD5 digest of the DER + representation of the name. + + +.. py:method:: X509Name.der() + + Return a string giving the DER representation of the name. + + +.. py:method:: X509Name.get_components() + + Return a list of two-tuples of strings giving the components of the name. + + +X509Name objects have the following members: + +.. py:attribute:: X509Name.countryName + + The country of the entity. :py:attr:`C` may be used as an alias for + :py:attr:`countryName`. + + +.. py:attribute:: X509Name.stateOrProvinceName + + The state or province of the entity. :py:attr:`ST` may be used as an alias for + :py:attr:`stateOrProvinceName`. + + +.. py:attribute:: X509Name.localityName + + The locality of the entity. :py:attr:`L` may be used as an alias for + :py:attr:`localityName`. + + +.. py:attribute:: X509Name.organizationName + + The organization name of the entity. :py:attr:`O` may be used as an alias for + :py:attr:`organizationName`. + + +.. py:attribute:: X509Name.organizationalUnitName + + The organizational unit of the entity. :py:attr:`OU` may be used as an alias for + :py:attr:`organizationalUnitName`. + + +.. py:attribute:: X509Name.commonName + + The common name of the entity. :py:attr:`CN` may be used as an alias for + :py:attr:`commonName`. + + +.. py:attribute:: X509Name.emailAddress + + The e-mail address of the entity. + + +.. _openssl-x509req: + +X509Req objects +--------------- + +X509Req objects have the following methods: + +.. py:method:: X509Req.get_pubkey() + + Return a :py:class:`PKey` object representing the public key of the certificate request. + + +.. py:method:: X509Req.get_subject() + + Return an :py:class:`X509Name` object representing the subject of the certificate. + + +.. py:method:: X509Req.set_pubkey(pkey) + + Set the public key of the certificate request to *pkey*. + + +.. py:method:: X509Req.sign(pkey, digest) + + Sign the certificate request, using the key *pkey* and the message digest + algorithm identified by the string *digest*. + + +.. py:method:: X509Req.verify(pkey) + + Verify a certificate request using the public key *pkey*. + + +.. py:method:: X509Req.set_version(version) + + Set the version (RFC 2459, 4.1.2.1) of the certificate request to + *version*. + + +.. py:method:: X509Req.get_version() + + Get the version (RFC 2459, 4.1.2.1) of the certificate request. + + +.. _openssl-x509store: + +X509Store objects +----------------- + +The X509Store object has currently just one method: + +.. py:method:: X509Store.add_cert(cert) + + Add the certificate *cert* to the certificate store. + + +.. _openssl-pkey: + +PKey objects +------------ + +The PKey object has the following methods: + +.. py:method:: PKey.bits() + + Return the number of bits of the key. + + +.. py:method:: PKey.generate_key(type, bits) + + Generate a public/private key pair of the type *type* (one of + :py:const:`TYPE_RSA` and :py:const:`TYPE_DSA`) with the size *bits*. + + +.. py:method:: PKey.type() + + Return the type of the key. + + +.. py:method:: PKey.check() + + Check the consistency of this key, returning True if it is consistent and + raising an exception otherwise. This is only valid for RSA keys. See the + OpenSSL RSA_check_key man page for further limitations. + + +.. _openssl-pkcs7: + +PKCS7 objects +------------- + +PKCS7 objects have the following methods: + +.. py:method:: PKCS7.type_is_signed() + + FIXME + + +.. py:method:: PKCS7.type_is_enveloped() + + FIXME + + +.. py:method:: PKCS7.type_is_signedAndEnveloped() + + FIXME + + +.. py:method:: PKCS7.type_is_data() + + FIXME + + +.. py:method:: PKCS7.get_type_name() + + Get the type name of the PKCS7. + + +.. _openssl-pkcs12: + +PKCS12 objects +-------------- + +PKCS12 objects have the following methods: + +.. py:method:: PKCS12.export([passphrase=None][, iter=2048][, maciter=1]) + + Returns a PKCS12 object as a string. + + The optional *passphrase* must be a string not a callback. + + See also the man page for the C function :py:func:`PKCS12_create`. + + +.. py:method:: PKCS12.get_ca_certificates() + + Return CA certificates within the PKCS12 object as a tuple. Returns + :py:const:`None` if no CA certificates are present. + + +.. py:method:: PKCS12.get_certificate() + + Return certificate portion of the PKCS12 structure. + + +.. py:method:: PKCS12.get_friendlyname() + + Return friendlyName portion of the PKCS12 structure. + + +.. py:method:: PKCS12.get_privatekey() + + Return private key portion of the PKCS12 structure + + +.. py:method:: PKCS12.set_ca_certificates(cacerts) + + Replace or set the CA certificates within the PKCS12 object with the sequence *cacerts*. + + Set *cacerts* to :py:const:`None` to remove all CA certificates. + + +.. py:method:: PKCS12.set_certificate(cert) + + Replace or set the certificate portion of the PKCS12 structure. + + +.. py:method:: PKCS12.set_friendlyname(name) + + Replace or set the friendlyName portion of the PKCS12 structure. + + +.. py:method:: PKCS12.set_privatekey(pkey) + + Replace or set private key portion of the PKCS12 structure + + +.. _openssl-509ext: + +X509Extension objects +--------------------- + +X509Extension objects have several methods: + +.. py:method:: X509Extension.get_critical() + + Return the critical field of the extension object. + + +.. py:method:: X509Extension.get_short_name() + + Retrieve the short descriptive name for this extension. + + The result is a byte string like :py:const:`basicConstraints`. + + .. versionadded:: 0.12 + + +.. py:method:: X509Extension.get_data() + + Retrieve the data for this extension. + + The result is the ASN.1 encoded form of the extension data as a byte string. + + .. versionadded:: 0.12 + + +.. _openssl-netscape-spki: + +NetscapeSPKI objects +-------------------- + +NetscapeSPKI objects have the following methods: + +.. py:method:: NetscapeSPKI.b64_encode() + + Return a base64-encoded string representation of the object. + + +.. py:method:: NetscapeSPKI.get_pubkey() + + Return the public key of object. + + +.. py:method:: NetscapeSPKI.set_pubkey(key) + + Set the public key of the object to *key*. + + +.. py:method:: NetscapeSPKI.sign(key, digest_name) + + Sign the NetscapeSPKI object using the given *key* and *digest_name*. + *digest_name* must be a string describing a digest algorithm supported by + OpenSSL (by EVP_get_digestbyname, specifically). For example, + :py:const:`"md5"` or :py:const:`"sha1"`. + + +.. py:method:: NetscapeSPKI.verify(key) + + Verify the NetscapeSPKI object using the given *key*. + + +.. _crl: + +CRL objects +----------- + +CRL objects have the following methods: + +.. py:method:: CRL.add_revoked(revoked) + + Add a Revoked object to the CRL, by value not reference. + + +.. py:method:: CRL.export(cert, key[, type=FILETYPE_PEM][, days=100]) + + Use *cert* and *key* to sign the CRL and return the CRL as a string. + *days* is the number of days before the next CRL is due. + + +.. py:method:: CRL.get_revoked() + + Return a tuple of Revoked objects, by value not reference. + + +.. _revoked: + +Revoked objects +--------------- + +Revoked objects have the following methods: + +.. py:method:: Revoked.all_reasons() + + Return a list of all supported reasons. + + +.. py:method:: Revoked.get_reason() + + Return the revocation reason as a str. Can be + None, which differs from "Unspecified". + + +.. py:method:: Revoked.get_rev_date() + + Return the revocation date as a str. + The string is formatted as an ASN1 GENERALIZEDTIME. + + +.. py:method:: Revoked.get_serial() + + Return a str containing a hex number of the serial of the revoked certificate. + + +.. py:method:: Revoked.set_reason(reason) + + Set the revocation reason. *reason* must be None or a string, but the + values are limited. Spaces and case are ignored. See + :py:meth:`all_reasons`. + + +.. py:method:: Revoked.set_rev_date(date) + + Set the revocation date. + The string is formatted as an ASN1 GENERALIZEDTIME. + + +.. py:method:: Revoked.set_serial(serial) + + *serial* is a string containing a hex number of the serial of the revoked certificate. diff --git a/doc/api/rand.rst b/doc/api/rand.rst new file mode 100644 index 0000000..18789b8 --- /dev/null +++ b/doc/api/rand.rst @@ -0,0 +1,79 @@ +.. _openssl-rand: + +:py:mod:`rand` --- An interface to the OpenSSL pseudo random number generator +============================================================================= + +.. py:module:: OpenSSL.rand + :synopsis: An interface to the OpenSSL pseudo random number generator + + +This module handles the OpenSSL pseudo random number generator (PRNG) and +declares the following: + +.. py:function:: add(string, entropy) + + Mix bytes from *string* into the PRNG state. The *entropy* argument is + (the lower bound of) an estimate of how much randomness is contained in + *string*, measured in bytes. For more information, see e.g. :rfc:`1750`. + + +.. py:function:: bytes(num_bytes) + + Get some random bytes from the PRNG as a string. + + This is a wrapper for the C function :py:func:`RAND_bytes`. + + +.. py:function:: cleanup() + + Erase the memory used by the PRNG. + + This is a wrapper for the C function :py:func:`RAND_cleanup`. + + +.. py:function:: egd(path[, bytes]) + + Query the `Entropy Gathering Daemon <http://www.lothar.com/tech/crypto/>`_ on + socket *path* for *bytes* bytes of random data and uses :py:func:`add` to + seed the PRNG. The default value of *bytes* is 255. + + +.. py:function:: load_file(path[, bytes]) + + Read *bytes* bytes (or all of it, if *bytes* is negative) of data from the + file *path* to seed the PRNG. The default value of *bytes* is -1. + + +.. py:function:: screen() + + Add the current contents of the screen to the PRNG state. + + Availability: Windows. + + +.. py:function:: seed(string) + + This is equivalent to calling :py:func:`add` with *entropy* as the length + of the string. + + +.. py:function:: status() + + Returns true if the PRNG has been seeded with enough data, and false otherwise. + + +.. py:function:: write_file(path) + + Write a number of random bytes (currently 1024) to the file *path*. This + file can then be used with :py:func:`load_file` to seed the PRNG again. + + +.. py:exception:: Error + + If the current RAND method supports any errors, this is raised when needed. + The default method does not raise this when the entropy pool is depleted. + + Whenever this exception is raised directly, it has a list of error messages + from the OpenSSL error queue, where each item is a tuple *(lib, function, + reason)*. Here *lib*, *function* and *reason* are all strings, describing + where and what the problem is. See :manpage:`err(3)` for more information. diff --git a/doc/api/ssl.rst b/doc/api/ssl.rst new file mode 100644 index 0000000..872cd5a --- /dev/null +++ b/doc/api/ssl.rst @@ -0,0 +1,740 @@ +.. _openssl-ssl: + +:py:mod:`SSL` --- An interface to the SSL-specific parts of OpenSSL +=================================================================== + +.. py:module:: OpenSSL.SSL + :synopsis: An interface to the SSL-specific parts of OpenSSL + + +This module handles things specific to SSL. There are two objects defined: +Context, Connection. + +.. py:data:: SSLv2_METHOD + SSLv3_METHOD + SSLv23_METHOD + TLSv1_METHOD + + These constants represent the different SSL methods to use when creating a + context object. + + +.. py:data:: VERIFY_NONE + VERIFY_PEER + VERIFY_FAIL_IF_NO_PEER_CERT + + These constants represent the verification mode used by the Context + object's :py:meth:`set_verify` method. + + +.. py:data:: FILETYPE_PEM + FILETYPE_ASN1 + + File type constants used with the :py:meth:`use_certificate_file` and + :py:meth:`use_privatekey_file` methods of Context objects. + + +.. py:data:: OP_SINGLE_DH_USE + OP_EPHEMERAL_RSA + OP_NO_SSLv2 + OP_NO_SSLv3 + OP_NO_TLSv1 + OP_NO_TICKET + OP_NO_COMPRESSION + + Constants used with :py:meth:`set_options` of Context objects. + + :py:const:`OP_SINGLE_DH_USE` means to always create a new key when using + ephemeral Diffie-Hellman. :py:const:`OP_EPHEMERAL_RSA` means to always use + ephemeral RSA keys when doing RSA operations. :py:const:`OP_NO_SSLv2`, + :py:const:`OP_NO_SSLv3` and :py:const:`OP_NO_TLSv1` means to disable those + specific protocols. This is interesting if you're using e.g. + :py:const:`SSLv23_METHOD` to get an SSLv2-compatible handshake, but don't want + to use SSLv2. + + +.. py:data:: MODE_NO_COMPRESSION + + Constant used with :py:meth:`set_mode` of Context objects to disable + automatic compression of application traffic. + + +.. py:data:: SSLEAY_VERSION + SSLEAY_CFLAGS + SSLEAY_BUILT_ON + SSLEAY_PLATFORM + SSLEAY_DIR + + Constants used with :py:meth:`SSLeay_version` to specify what OpenSSL version + information to retrieve. See the man page for the :py:func:`SSLeay_version` C + API for details. + +.. py:data:: SESS_CACHE_OFF + SESS_CACHE_CLIENT + SESS_CACHE_SERVER + SESS_CACHE_BOTH + SESS_CACHE_NO_AUTO_CLEAR + SESS_CACHE_NO_INTERNAL_LOOKUP + SESS_CACHE_NO_INTERNAL_STORE + SESS_CACHE_NO_INTERNAL + + Constants used with :py:meth:`Context.set_session_cache_mode` to specify + the behavior of the session cache and potential session reuse. See the man + page for the :py:func:`SSL_CTX_set_session_cache_mode` C API for details. + + .. versionadded:: 0.14 + +.. py:data:: OPENSSL_VERSION_NUMBER + + An integer giving the version number of the OpenSSL library used to build this + version of pyOpenSSL. See the man page for the :py:func:`SSLeay_version` C API + for details. + + +.. py:function:: SSLeay_version(type) + + Retrieve a string describing some aspect of the underlying OpenSSL version. The + type passed in should be one of the :py:const:`SSLEAY_*` constants defined in + this module. + + +.. py:data:: ContextType + + See :py:class:`Context`. + + +.. py:class:: Context(method) + + A class representing SSL contexts. Contexts define the parameters of one or + more SSL connections. + + *method* should be :py:const:`SSLv2_METHOD`, :py:const:`SSLv3_METHOD`, + :py:const:`SSLv23_METHOD` or :py:const:`TLSv1_METHOD`. + + +.. py:class:: Session() + + A class representing an SSL session. A session defines certain connection + parameters which may be re-used to speed up the setup of subsequent + connections. + + .. versionadded:: 0.14 + + +.. py:data:: ConnectionType + + See :py:class:`Connection`. + + +.. py:class:: Connection(context, socket) + + A class representing SSL connections. + + *context* should be an instance of :py:class:`Context` and *socket* + should be a socket [#connection-context-socket]_ object. *socket* may be + *None*; in this case, the Connection is created with a memory BIO: see + the :py:meth:`bio_read`, :py:meth:`bio_write`, and :py:meth:`bio_shutdown` + methods. + +.. py:exception:: Error + + This exception is used as a base class for the other SSL-related + exceptions, but may also be raised directly. + + Whenever this exception is raised directly, it has a list of error messages + from the OpenSSL error queue, where each item is a tuple *(lib, function, + reason)*. Here *lib*, *function* and *reason* are all strings, describing + where and what the problem is. See :manpage:`err(3)` for more information. + + +.. py:exception:: ZeroReturnError + + This exception matches the error return code + :py:data:`SSL_ERROR_ZERO_RETURN`, and is raised when the SSL Connection has + been closed. In SSL 3.0 and TLS 1.0, this only occurs if a closure alert has + occurred in the protocol, i.e. the connection has been closed cleanly. Note + that this does not necessarily mean that the transport layer (e.g. a socket) + has been closed. + + It may seem a little strange that this is an exception, but it does match an + :py:data:`SSL_ERROR` code, and is very convenient. + + +.. py:exception:: WantReadError + + The operation did not complete; the same I/O method should be called again + later, with the same arguments. Any I/O method can lead to this since new + handshakes can occur at any time. + + The wanted read is for **dirty** data sent over the network, not the + **clean** data inside the tunnel. For a socket based SSL connection, + **read** means data coming at us over the network. Until that read + succeeds, the attempted :py:meth:`OpenSSL.SSL.Connection.recv`, + :py:meth:`OpenSSL.SSL.Connection.send`, or + :py:meth:`OpenSSL.SSL.Connection.do_handshake` is prevented or incomplete. You + probably want to :py:meth:`select()` on the socket before trying again. + + +.. py:exception:: WantWriteError + + See :py:exc:`WantReadError`. The socket send buffer may be too full to + write more data. + + +.. py:exception:: WantX509LookupError + + The operation did not complete because an application callback has asked to be + called again. The I/O method should be called again later, with the same + arguments. + + .. note:: This won't occur in this version, as there are no such + callbacks in this version. + + +.. py:exception:: SysCallError + + The :py:exc:`SysCallError` occurs when there's an I/O error and OpenSSL's + error queue does not contain any information. This can mean two things: An + error in the transport protocol, or an end of file that violates the protocol. + The parameter to the exception is always a pair *(errnum, + errstr)*. + + + +.. _openssl-context: + +Context objects +--------------- + +Context objects have the following methods: + +.. :py:class:: OpenSSL.SSL.Context + +.. py:method:: Context.check_privatekey() + + Check if the private key (loaded with :py:meth:`use_privatekey`) matches the + certificate (loaded with :py:meth:`use_certificate`). Returns + :py:data:`None` if they match, raises :py:exc:`Error` otherwise. + + +.. py:method:: Context.get_app_data() + + Retrieve application data as set by :py:meth:`set_app_data`. + + +.. py:method:: Context.get_cert_store() + + Retrieve the certificate store (a X509Store object) that the context uses. + This can be used to add "trusted" certificates without using the. + :py:meth:`load_verify_locations` method. + + +.. py:method:: Context.get_timeout() + + Retrieve session timeout, as set by :py:meth:`set_timeout`. The default is 300 + seconds. + + +.. py:method:: Context.get_verify_depth() + + Retrieve the Context object's verify depth, as set by + :py:meth:`set_verify_depth`. + + +.. py:method:: Context.get_verify_mode() + + Retrieve the Context object's verify mode, as set by :py:meth:`set_verify`. + + +.. py:method:: Context.load_client_ca(pemfile) + + Read a file with PEM-formatted certificates that will be sent to the client + when requesting a client certificate. + + +.. py:method:: Context.set_client_ca_list(certificate_authorities) + + Replace the current list of preferred certificate signers that would be + sent to the client when requesting a client certificate with the + *certificate_authorities* sequence of :py:class:`OpenSSL.crypto.X509Name`'s. + + .. versionadded:: 0.10 + + +.. py:method:: Context.add_client_ca(certificate_authority) + + Extract a :py:class:`OpenSSL.crypto.X509Name` from the *certificate_authority* + :py:class:`OpenSSL.crypto.X509` certificate and add it to the list of preferred + certificate signers sent to the client when requesting a client certificate. + + .. versionadded:: 0.10 + + +.. py:method:: Context.load_verify_locations(pemfile, capath) + + Specify where CA certificates for verification purposes are located. These + are trusted certificates. Note that the certificates have to be in PEM + format. If capath is passed, it must be a directory prepared using the + ``c_rehash`` tool included with OpenSSL. Either, but not both, of + *pemfile* or *capath* may be :py:data:`None`. + + +.. py:method:: Context.set_default_verify_paths() + + Specify that the platform provided CA certificates are to be used for + verification purposes. This method may not work properly on OS X. + + +.. py:method:: Context.load_tmp_dh(dhfile) + + Load parameters for Ephemeral Diffie-Hellman from *dhfile*. + + +.. py:method:: Context.set_app_data(data) + + Associate *data* with this Context object. *data* can be retrieved + later using the :py:meth:`get_app_data` method. + + +.. py:method:: Context.set_cipher_list(ciphers) + + Set the list of ciphers to be used in this context. See the OpenSSL manual for + more information (e.g. :manpage:`ciphers(1)`) + + +.. py:method:: Context.set_info_callback(callback) + + Set the information callback to *callback*. This function will be called + from time to time during SSL handshakes. + + *callback* should take three arguments: a Connection object and two integers. + The first integer specifies where in the SSL handshake the function was + called, and the other the return code from a (possibly failed) internal + function call. + + +.. py:method:: Context.set_options(options) + + Add SSL options. Options you have set before are not cleared! + This method should be used with the :py:const:`OP_*` constants. + + +.. py:method:: Context.set_mode(mode) + + Add SSL mode. Modes you have set before are not cleared! This method should + be used with the :py:const:`MODE_*` constants. + + +.. py:method:: Context.set_passwd_cb(callback[, userdata]) + + Set the passphrase callback to *callback*. This function will be called + when a private key with a passphrase is loaded. *callback* must accept + three positional arguments. First, an integer giving the maximum length of + the passphrase it may return. If the returned passphrase is longer than + this, it will be truncated. Second, a boolean value which will be true if + the user should be prompted for the passphrase twice and the callback should + verify that the two values supplied are equal. Third, the value given as the + *userdata* parameter to :py:meth:`set_passwd_cb`. If an error occurs, + *callback* should return a false value (e.g. an empty string). + + +.. py:method:: Context.set_session_cache_mode(mode) + + Set the behavior of the session cache used by all connections using this + Context. The previously set mode is returned. See :py:const:`SESS_CACHE_*` + for details about particular modes. + + .. versionadded:: 0.14 + + +.. py:method:: Context.get_session_cache_mode() + + Get the current session cache mode. + + .. versionadded:: 0.14 + + +.. py:method:: Context.set_session_id(name) + + Set the context *name* within which a session can be reused for this + Context object. This is needed when doing session resumption, because there is + no way for a stored session to know which Context object it is associated with. + *name* may be any binary data. + + +.. py:method:: Context.set_timeout(timeout) + + Set the timeout for newly created sessions for this Context object to + *timeout*. *timeout* must be given in (whole) seconds. The default + value is 300 seconds. See the OpenSSL manual for more information (e.g. + :manpage:`SSL_CTX_set_timeout(3)`). + + +.. py:method:: Context.set_verify(mode, callback) + + Set the verification flags for this Context object to *mode* and specify + that *callback* should be used for verification callbacks. *mode* should be + one of :py:const:`VERIFY_NONE` and :py:const:`VERIFY_PEER`. If + :py:const:`VERIFY_PEER` is used, *mode* can be OR:ed with + :py:const:`VERIFY_FAIL_IF_NO_PEER_CERT` and :py:const:`VERIFY_CLIENT_ONCE` + to further control the behaviour. + + *callback* should take five arguments: A Connection object, an X509 object, + and three integer variables, which are in turn potential error number, error + depth and return code. *callback* should return true if verification passes + and false otherwise. + + +.. py:method:: Context.set_verify_depth(depth) + + Set the maximum depth for the certificate chain verification that shall be + allowed for this Context object. + + +.. py:method:: Context.use_certificate(cert) + + Use the certificate *cert* which has to be a X509 object. + + +.. py:method:: Context.add_extra_chain_cert(cert) + + Adds the certificate *cert*, which has to be a X509 object, to the + certificate chain presented together with the certificate. + + +.. py:method:: Context.use_certificate_chain_file(file) + + Load a certificate chain from *file* which must be PEM encoded. + + +.. py:method:: Context.use_privatekey(pkey) + + Use the private key *pkey* which has to be a PKey object. + + +.. py:method:: Context.use_certificate_file(file[, format]) + + Load the first certificate found in *file*. The certificate must be in the + format specified by *format*, which is either :py:const:`FILETYPE_PEM` or + :py:const:`FILETYPE_ASN1`. The default is :py:const:`FILETYPE_PEM`. + + +.. py:method:: Context.use_privatekey_file(file[, format]) + + Load the first private key found in *file*. The private key must be in the + format specified by *format*, which is either :py:const:`FILETYPE_PEM` or + :py:const:`FILETYPE_ASN1`. The default is :py:const:`FILETYPE_PEM`. + + +.. py:method:: Context.set_tlsext_servername_callback(callback) + + Specify a one-argument callable to use as the TLS extension server name + callback. When a connection using the server name extension is made using + this context, the callback will be invoked with the :py:class:`Connection` + instance. + + .. versionadded:: 0.13 + + +.. _openssl-session: + +Session objects +--------------- + +Session objects have no methods. + + +.. _openssl-connection: + +Connection objects +------------------ + +Connection objects have the following methods: + +.. py:method:: Connection.accept() + + Call the :py:meth:`accept` method of the underlying socket and set up SSL on the + returned socket, using the Context object supplied to this Connection object at + creation. Returns a pair *(conn, address)*. where *conn* is the new + Connection object created, and *address* is as returned by the socket's + :py:meth:`accept`. + + +.. py:method:: Connection.bind(address) + + Call the :py:meth:`bind` method of the underlying socket. + + +.. py:method:: Connection.close() + + Call the :py:meth:`close` method of the underlying socket. Note: If you want + correct SSL closure, you need to call the :py:meth:`shutdown` method first. + + +.. py:method:: Connection.connect(address) + + Call the :py:meth:`connect` method of the underlying socket and set up SSL on the + socket, using the Context object supplied to this Connection object at + creation. + + +.. py:method:: Connection.connect_ex(address) + + Call the :py:meth:`connect_ex` method of the underlying socket and set up SSL on + the socket, using the Context object supplied to this Connection object at + creation. Note that if the :py:meth:`connect_ex` method of the socket doesn't + return 0, SSL won't be initialized. + + +.. py:method:: Connection.do_handshake() + + Perform an SSL handshake (usually called after :py:meth:`renegotiate` or one of + :py:meth:`set_accept_state` or :py:meth:`set_accept_state`). This can raise the + same exceptions as :py:meth:`send` and :py:meth:`recv`. + + +.. py:method:: Connection.fileno() + + Retrieve the file descriptor number for the underlying socket. + + +.. py:method:: Connection.listen(backlog) + + Call the :py:meth:`listen` method of the underlying socket. + + +.. py:method:: Connection.get_app_data() + + Retrieve application data as set by :py:meth:`set_app_data`. + + +.. py:method:: Connection.get_cipher_list() + + Retrieve the list of ciphers used by the Connection object. WARNING: This API + has changed. It used to take an optional parameter and just return a string, + but not it returns the entire list in one go. + + +.. py:method:: Connection.get_client_ca_list() + + Retrieve the list of preferred client certificate issuers sent by the server + as :py:class:`OpenSSL.crypto.X509Name` objects. + + If this is a client :py:class:`Connection`, the list will be empty until the + connection with the server is established. + + If this is a server :py:class:`Connection`, return the list of certificate + authorities that will be sent or has been sent to the client, as controlled + by this :py:class:`Connection`'s :py:class:`Context`. + + .. versionadded:: 0.10 + + +.. py:method:: Connection.get_context() + + Retrieve the Context object associated with this Connection. + + +.. py:method:: Connection.set_context(context) + + Specify a replacement Context object for this Connection. + + +.. py:method:: Connection.get_peer_certificate() + + Retrieve the other side's certificate (if any) + + +.. py:method:: Connection.get_peer_cert_chain() + + Retrieve the tuple of the other side's certificate chain (if any) + + +.. py:method:: Connection.getpeername() + + Call the :py:meth:`getpeername` method of the underlying socket. + + +.. py:method:: Connection.getsockname() + + Call the :py:meth:`getsockname` method of the underlying socket. + + +.. py:method:: Connection.getsockopt(level, optname[, buflen]) + + Call the :py:meth:`getsockopt` method of the underlying socket. + + +.. py:method:: Connection.pending() + + Retrieve the number of bytes that can be safely read from the SSL buffer + (**not** the underlying transport buffer). + + +.. py:method:: Connection.recv(bufsize) + + Receive data from the Connection. The return value is a string representing the + data received. The maximum amount of data to be received at once, is specified + by *bufsize*. + + +.. py:method:: Connection.bio_write(bytes) + + If the Connection was created with a memory BIO, this method can be used to add + bytes to the read end of that memory BIO. The Connection can then read the + bytes (for example, in response to a call to :py:meth:`recv`). + + +.. py:method:: Connection.renegotiate() + + Renegotiate the SSL session. Call this if you wish to change cipher suites or + anything like that. + + +.. py:method:: Connection.send(string) + + Send the *string* data to the Connection. + + +.. py:method:: Connection.bio_read(bufsize) + + If the Connection was created with a memory BIO, this method can be used to + read bytes from the write end of that memory BIO. Many Connection methods will + add bytes which must be read in this manner or the buffer will eventually fill + up and the Connection will be able to take no further actions. + + +.. py:method:: Connection.sendall(string) + + Send all of the *string* data to the Connection. This calls :py:meth:`send` + repeatedly until all data is sent. If an error occurs, it's impossible to tell + how much data has been sent. + + +.. py:method:: Connection.set_accept_state() + + Set the connection to work in server mode. The handshake will be handled + automatically by read/write. + + +.. py:method:: Connection.set_app_data(data) + + Associate *data* with this Connection object. *data* can be retrieved + later using the :py:meth:`get_app_data` method. + + +.. py:method:: Connection.set_connect_state() + + Set the connection to work in client mode. The handshake will be handled + automatically by read/write. + + +.. py:method:: Connection.setblocking(flag) + + Call the :py:meth:`setblocking` method of the underlying socket. + + +.. py:method:: Connection.setsockopt(level, optname, value) + + Call the :py:meth:`setsockopt` method of the underlying socket. + + +.. py:method:: Connection.shutdown() + + Send the shutdown message to the Connection. Returns true if the shutdown + message exchange is completed and false otherwise (in which case you call + :py:meth:`recv` or :py:meth:`send` when the connection becomes + readable/writeable. + + +.. py:method:: Connection.get_shutdown() + + Get the shutdown state of the Connection. Returns a bitvector of either or + both of *SENT_SHUTDOWN* and *RECEIVED_SHUTDOWN*. + + +.. py:method:: Connection.set_shutdown(state) + + Set the shutdown state of the Connection. *state* is a bitvector of + either or both of *SENT_SHUTDOWN* and *RECEIVED_SHUTDOWN*. + + +.. py:method:: Connection.sock_shutdown(how) + + Call the :py:meth:`shutdown` method of the underlying socket. + + +.. py:method:: Connection.bio_shutdown() + + If the Connection was created with a memory BIO, this method can be used to + indicate that *end of file* has been reached on the read end of that memory + BIO. + + +.. py:method:: Connection.state_string() + + Retrieve a verbose string detailing the state of the Connection. + + +.. py:method:: Connection.client_random() + + Retrieve the random value used with the client hello message. + + +.. py:method:: Connection.server_random() + + Retrieve the random value used with the server hello message. + + +.. py:method:: Connection.master_key() + + Retrieve the value of the master key for this session. + + +.. py:method:: Connection.want_read() + + Checks if more data has to be read from the transport layer to complete an + operation. + + +.. py:method:: Connection.want_write() + + Checks if there is data to write to the transport layer to complete an + operation. + + +.. py:method:: Connection.set_tlsext_host_name(name) + + Specify the byte string to send as the server name in the client hello message. + + .. versionadded:: 0.13 + + +.. py:method:: Connection.get_servername() + + Get the value of the server name received in the client hello message. + + .. versionadded:: 0.13 + + +.. py:method:: Connection.get_session() + + Get a :py:class:`Session` instance representing the SSL session in use by + the connection, or :py:obj:`None` if there is no session. + + .. versionadded:: 0.14 + + +.. py:method:: Connection.set_session(session) + + Set a new SSL session (using a :py:class:`Session` instance) to be used by + the connection. + + .. versionadded:: 0.14 + + +.. Rubric:: Footnotes + +.. [#connection-context-socket] Actually, all that is required is an object that + **behaves** like a socket, you could even use files, even though it'd be + tricky to get the handshakes right! diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..be9784b --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,219 @@ +# -*- coding: utf-8 -*- +# +# pyOpenSSL documentation build configuration file, created by +# sphinx-quickstart on Sat Jul 16 07:12:22 2011. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +DOC_DIR = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, os.path.abspath(os.path.join(DOC_DIR, ".."))) + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'pyOpenSSL' +copyright = u'2011, Jean-Paul Calderone' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.13' +# The full version, including alpha/beta/rc tags. +release = '0.13' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# "<project> v<release> documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a <link> tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'pyOpenSSLdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'pyOpenSSL.tex', u'pyOpenSSL Documentation', + u'Jean-Paul Calderone', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'pyopenssl', u'pyOpenSSL Documentation', + [u'Jean-Paul Calderone'], 1) +] diff --git a/doc/html/about.html b/doc/html/about.html deleted file mode 100644 index ae0996e..0000000 --- a/doc/html/about.html +++ /dev/null @@ -1,104 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>About this document ...</title> -<META NAME="description" CONTENT="About this document ..."> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="previous" href="internals.html"> -<LINK REL="up" HREF="pyOpenSSL.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="socket-methods.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="socket-methods.html">4.3 Acessing Socket Methods</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H1><A NAME="SECTION000600000000000000000"> -About this document ...</A> -</H1> - <strong>Python OpenSSL Manual</strong> -<p> This document was generated using the <a - href="http://saftsack.fs.uni-bayreuth.de/~latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> translator. -</p> - -<p> <a - href="http://saftsack.fs.uni-bayreuth.de/~latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> is Copyright © - 1993, 1994, 1995, 1996, 1997, <a - href="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos - Drakos</a>, Computer Based Learning Unit, University of - Leeds, and Copyright © 1997, 1998, <a - href="http://www.maths.mq.edu.au/~ross/">Ross - Moore</a>, Mathematics Department, Macquarie University, - Sydney. -</p> - -<p> The application of <a - href="http://saftsack.fs.uni-bayreuth.de/~latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> to the Python - documentation has been heavily tailored by Fred L. Drake, - Jr. Original navigation icons were contributed by Christopher - Petrilli. -</p> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="socket-methods.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="socket-methods.html">4.3 Acessing Socket Methods</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/blank.gif b/doc/html/blank.gif Binary files differdeleted file mode 100644 index 2e31f4e..0000000 --- a/doc/html/blank.gif +++ /dev/null diff --git a/doc/html/building-unix.html b/doc/html/building-unix.html deleted file mode 100644 index a9376fe..0000000 --- a/doc/html/building-unix.html +++ /dev/null @@ -1,125 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>2.1 Building the Module on a Unix System </title> -<META NAME="description" CONTENT="2.1 Building the Module on a Unix System "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="building-windows.html"> -<LINK REL="previous" href="building.html"> -<LINK REL="up" href="building.html"> -<LINK REL="next" href="building-windows.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="building.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="building.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="building-windows.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="building.html">2 Building and Installing</A> -<b class="navlabel">Up:</b> <a class="sectref" href="building.html">2 Building and Installing</A> -<b class="navlabel">Next:</b> <a class="sectref" href="building-windows.html">2.2 Building the Module</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H2><A NAME="SECTION000310000000000000000"> </A> -<BR> -2.1 Building the Module on a Unix System -</H2> - -<P> -pyOpenSSL uses distutils, so there really shouldn't be any problems. To build -the library: -<dl><dd><pre class="verbatim"> -python setup.py build -</pre></dl> - -<P> -If your OpenSSL header files aren't in <code>/usr/include</code>, you may need to -supply the <code>-I</code> flag to let the setup script know where to look. The same -goes for the libraries of course, use the <code>-L</code> flag. Note that -<code>build</code> won't accept these flags, so you have to run first -<code>build_ext</code> and then <code>build</code>! Example: -<dl><dd><pre class="verbatim"> -python setup.py build_ext -I/usr/local/ssl/include -L/usr/local/ssl/lib -python setup.py build -</pre></dl> - -<P> -Now you should have a directory called <code>OpenSSL</code> that contains e.g. -<code>SSL.so</code> and <code>__init__.py</code> somewhere in the build dicrectory, -so just: -<dl><dd><pre class="verbatim"> -python setup.py install -</pre></dl> - -<P> -If you, for some arcane reason, don't want the module to appear in the -<code>site-packages</code> directory, use the <code>--prefix</code> option. - -<P> -You can, of course, do -<dl><dd><pre class="verbatim"> -python setup.py --help -</pre></dl> - -<P> -to find out more about how to use the script. - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="building.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="building.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="building-windows.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="building.html">2 Building and Installing</A> -<b class="navlabel">Up:</b> <a class="sectref" href="building.html">2 Building and Installing</A> -<b class="navlabel">Next:</b> <a class="sectref" href="building-windows.html">2.2 Building the Module</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/building-windows.html b/doc/html/building-windows.html deleted file mode 100644 index 018c7e8..0000000 --- a/doc/html/building-windows.html +++ /dev/null @@ -1,117 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>2.2 Building the Module on a Windows System </title> -<META NAME="description" CONTENT="2.2 Building the Module on a Windows System "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="previous" href="building-unix.html"> -<LINK REL="up" href="building.html"> -<LINK REL="next" href="openssl.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="building-unix.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="building.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="building-unix.html">2.1 Building the Module</A> -<b class="navlabel">Up:</b> <a class="sectref" href="building.html">2 Building and Installing</A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H2><A NAME="SECTION000320000000000000000"> </A> -<BR> -2.2 Building the Module on a Windows System -</H2> - -<P> -Big thanks to Itamar Shtull-Trauring and Oleg Orlov for their help with -Windows build instructions. Same as for Unix systems, we have to separate -the <code>build_ext</code> and the <code>build</code>. - -<P> -Building the library: - -<P> -<dl><dd><pre class="verbatim"> -setup.py build_ext -I ...\openssl\inc32 -L ...\openssl\out32dll -setup.py build -</pre></dl> - -<P> -Where <code>...\openssl</code> is of course the location of your OpenSSL installation. - -<P> -Installation is the same as for Unix systems: -<dl><dd><pre class="verbatim"> -setup.py install -</pre></dl> - -<P> -And similarily, you can do -<dl><dd><pre class="verbatim"> -setup.py --help -</pre></dl> - -<P> -to get more information. - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="building-unix.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="building.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="building-unix.html">2.1 Building the Module</A> -<b class="navlabel">Up:</b> <a class="sectref" href="building.html">2 Building and Installing</A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/building.html b/doc/html/building.html deleted file mode 100644 index 9fb0a8d..0000000 --- a/doc/html/building.html +++ /dev/null @@ -1,105 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>2 Building and Installing </title> -<META NAME="description" CONTENT="2 Building and Installing "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl.html"> -<LINK REL="previous" href="intro.html"> -<LINK REL="up" HREF="pyOpenSSL.html"> -<LINK REL="next" href="building-unix.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="intro.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="building-unix.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="intro.html">1 Introduction</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="building-unix.html">2.1 Building the Module</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H1><A NAME="SECTION000300000000000000000"> </A> -<BR> -2 Building and Installing -</H1> - -<P> -These instructions can also be found in the file <code>INSTALL</code>. - -<P> -I have tested this on Debian Linux systems (woody and sid), Solaris 2.6 and -2.7. Others have successfully compiled it on Windows and NT. - -<P> - -<p><hr> -<!--Table of Child-Links--> -<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A> - -<UL CLASS="ChildLinks"> -<LI><A NAME="tex2html80" - href="building-unix.html">2.1 Building the Module on a Unix System </A> -<LI><A NAME="tex2html81" - href="building-windows.html">2.2 Building the Module on a Windows System </A> -</UL> -<!--End of Table of Child-Links--> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="intro.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="building-unix.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="intro.html">1 Introduction</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="building-unix.html">2.1 Building the Module</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/callbacks.html b/doc/html/callbacks.html deleted file mode 100644 index 0275e75..0000000 --- a/doc/html/callbacks.html +++ /dev/null @@ -1,121 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>4.2 Callbacks </title> -<META NAME="description" CONTENT="4.2 Callbacks "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="socket-methods.html"> -<LINK REL="previous" href="exceptions.html"> -<LINK REL="up" href="internals.html"> -<LINK REL="next" href="socket-methods.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="exceptions.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="internals.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="socket-methods.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="exceptions.html">4.1 Exceptions</A> -<b class="navlabel">Up:</b> <a class="sectref" href="internals.html">4 Internals</A> -<b class="navlabel">Next:</b> <a class="sectref" href="socket-methods.html">4.3 Acessing Socket Methods</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H2><A NAME="SECTION000520000000000000000"> </A> -<BR> -4.2 Callbacks -</H2> - -<P> -There are a number of problems with callbacks. First of all, OpenSSL is written -as a C library, it's not meant to have Python callbacks, so a way around that -is needed. Another problem is thread support. A lot of the OpenSSL I/O -functions can block if the socket is in blocking mode, and then you want other -Python threads to be able to do other things. The real trouble is if you've -released the global CPython interpreter lock to do a potentially blocking -operation, and the operation calls a callback. Then we must take the GIL back, -since calling Python APIs without holding it is not allowed. - -<P> -There are two solutions to the first problem, both of which are necessary. The -first solution to use is if the C callback allows ''userdata'' to be passed to -it (an arbitrary pointer normally). This is great! We can set our Python -function object as the real userdata and emulate userdata for the Python -function in another way. The other solution can be used if an object with an -''app_data'' system always is passed to the callback. For example, the SSL -object in OpenSSL has app_data functions and in e.g. the verification -callbacks, you can retrieve the related SSL object. What we do is to set our -wrapper <tt class="class">Connection</tt> object as app_data for the SSL object, and we can -easily find the Python callback. - -<P> -The other problem is solved using thread local variables. Whenever the GIL is -released before calling into an OpenSSL API, the PyThreadState pointer returned -by <tt class="cfunction">PyEval_SaveState</tt> is stored in a global thread local variable -(using Python's own TLS API, <tt class="cfunction">PyThread_set_key_value</tt>). When it is -necessary to re-acquire the GIL, either after the OpenSSL API returns or in a C -callback invoked by that OpenSSL API, the value of the thread local variable is -retrieved (<tt class="cfunction">PyThread_get_key_value</tt>) and used to re-acquire the GIL. -This allows Python threads to execute while OpenSSL APIs are running and allows -use of any particular pyOpenSSL object from any Python thread, since there is -no per-thread state associated with any of these objects and since OpenSSL is -threadsafe (as long as properly initialized, as pyOpenSSL initializes it). - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="exceptions.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="internals.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="socket-methods.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="exceptions.html">4.1 Exceptions</A> -<b class="navlabel">Up:</b> <a class="sectref" href="internals.html">4 Internals</A> -<b class="navlabel">Next:</b> <a class="sectref" href="socket-methods.html">4.3 Acessing Socket Methods</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/contents.gif b/doc/html/contents.gif Binary files differdeleted file mode 100644 index 6d299c4..0000000 --- a/doc/html/contents.gif +++ /dev/null diff --git a/doc/html/contents.html b/doc/html/contents.html deleted file mode 100644 index c006687..0000000 --- a/doc/html/contents.html +++ /dev/null @@ -1,114 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>Contents</title> -<META NAME="description" CONTENT="Contents"> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="intro.html"> -<LINK REL="previous" HREF="pyOpenSSL.html"> -<LINK REL="up" HREF="pyOpenSSL.html"> -<LINK REL="next" href="intro.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A HREF="pyOpenSSL.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="intro.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="intro.html">1 Introduction</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> -<BR> -<BR><H2><A NAME="SECTION000100000000000000000"> -Contents</A> -</H2> -<!--Table of Contents--> - -<UL CLASS="TofC"> -<LI><A NAME="tex2html46" - href="intro.html">1 Introduction </A> -<LI><A NAME="tex2html47" - href="building.html">2 Building and Installing </A> -<UL> -<LI><A NAME="tex2html48" - href="building-unix.html">2.1 Building the Module on a Unix System </A> -<LI><A NAME="tex2html49" - href="building-windows.html">2.2 Building the Module on a Windows System </A> -</UL> -<BR> -<LI><A NAME="tex2html50" - href="openssl.html">3 OpenSSL -- Python interface to OpenSSL </A> -<UL> -<LI><A NAME="tex2html51" - href="openssl-crypto.html">3.1 crypto -- Generic cryptographic module </A> -<LI><A NAME="tex2html52" - href="openssl-rand.html">3.2 rand -- An interface to the OpenSSL pseudo random number generator </A> -<LI><A NAME="tex2html53" - href="openssl-ssl.html">3.3 SSL -- An interface to the SSL-specific parts of OpenSSL </A> -</UL> -<BR> -<LI><A NAME="tex2html54" - href="internals.html">4 Internals </A> -<UL> -<LI><A NAME="tex2html55" - href="exceptions.html">4.1 Exceptions </A> -<LI><A NAME="tex2html56" - href="callbacks.html">4.2 Callbacks </A> -<LI><A NAME="tex2html57" - href="socket-methods.html">4.3 Acessing Socket Methods </A> -</UL></UL> -<!--End of Table of Contents--> -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A HREF="pyOpenSSL.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="intro.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="intro.html">1 Introduction</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/crl.html b/doc/html/crl.html deleted file mode 100644 index 4ce6acb..0000000 --- a/doc/html/crl.html +++ /dev/null @@ -1,108 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.11 CRL objects </title> -<META NAME="description" CONTENT="3.1.11 CRL objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="revoked.html"> -<LINK REL="previous" href="openssl-netscape-spki.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="revoked.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-netscape-spki.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="revoked.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-netscape-spki.html">3.1.10 NetscapeSPKI objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="revoked.html">3.1.12 Revoked objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION0004111000000000000000"> </A> -<BR> -3.1.11 CRL objects -</H3> - -<P> -CRL objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-106'><tt class='method'>add_revoked</tt></a></b>(<var>revoked</var>) -<dd> -Add a Revoked object to the CRL, by value not reference. -</dl> - -<P> -<dl><dt><b><a name='l2h-107'><tt class='method'>export</tt></a></b>(<var>cert, key</var><big>[</big><var>, type=FILETYPE_PEM</var><big>]</big><big>[</big><var>, days=100</var><big>]</big>) -<dd> -Use <var>cert</var> and <var>key</var> to sign the CRL and return the CRL as a string. -<var>days</var> is the number of days before the next CRL is due. -</dl> - -<P> -<dl><dt><b><a name='l2h-108'><tt class='method'>get_revoked</tt></a></b>() -<dd> -Return a tuple of Revoked objects, by value not reference. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-netscape-spki.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="revoked.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-netscape-spki.html">3.1.10 NetscapeSPKI objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="revoked.html">3.1.12 Revoked objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/exceptions.html b/doc/html/exceptions.html deleted file mode 100644 index 038d546..0000000 --- a/doc/html/exceptions.html +++ /dev/null @@ -1,97 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>4.1 Exceptions </title> -<META NAME="description" CONTENT="4.1 Exceptions "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="callbacks.html"> -<LINK REL="previous" href="internals.html"> -<LINK REL="up" href="internals.html"> -<LINK REL="next" href="callbacks.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="internals.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="internals.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="callbacks.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="internals.html">4 Internals</A> -<b class="navlabel">Up:</b> <a class="sectref" href="internals.html">4 Internals</A> -<b class="navlabel">Next:</b> <a class="sectref" href="callbacks.html">4.2 Callbacks</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H2><A NAME="SECTION000510000000000000000"> </A> -<BR> -4.1 Exceptions -</H2> - -<P> -We realized early that most of the exceptions would be raised by the I/O -functions of OpenSSL, so it felt natural to mimic OpenSSL's error code system, -translating them into Python exceptions. This naturally gives us the exceptions -<tt class="exception">SSL.ZeroReturnError</tt>, <tt class="exception">SSL.WantReadError</tt>, -<tt class="exception">SSL.WantWriteError</tt>, <tt class="exception">SSL.WantX509LookupError</tt> and -<tt class="exception">SSL.SysCallError</tt>. - -<P> -For more information about this, see section <A href="openssl-ssl.html#openssl-ssl">3.3</A>. - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="internals.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="internals.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="callbacks.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="internals.html">4 Internals</A> -<b class="navlabel">Up:</b> <a class="sectref" href="internals.html">4 Internals</A> -<b class="navlabel">Next:</b> <a class="sectref" href="callbacks.html">4.2 Callbacks</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/index.gif b/doc/html/index.gif Binary files differdeleted file mode 100644 index 32eecfb..0000000 --- a/doc/html/index.gif +++ /dev/null diff --git a/doc/html/index.html b/doc/html/index.html deleted file mode 100644 index c5d7e7a..0000000 --- a/doc/html/index.html +++ /dev/null @@ -1,173 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>Python OpenSSL Manual</title> -<META NAME="description" CONTENT="Python OpenSSL Manual"> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="contents.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><A href="contents.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Next:</b> <a class="sectref" href="contents.html">Contents</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<P> - -<div class="titlepage"> -<center> -<h1>Python OpenSSL Manual</h1> -<p><b><font size='+2'>Jean-Paul Calderone</font></b></p> -<p><span class="email">exarkun@twistedmatrix.com</span></p> -<p> -</center> -</div> - -<P> - -<H3>Abstract:</H3> -<DIV CLASS="ABSTRACT"> - -This module is a rather thin wrapper around (a subset of) the OpenSSL library. -With thin wrapper I mean that a lot of the object methods do nothing more than -calling a corresponding function in the OpenSSL library. -</DIV> -<P> - -<P> - -<p><hr> -<!--Table of Child-Links--> - - -<UL CLASS="ChildLinks"> -<LI><A NAME="tex2html8" - href="contents.html">Contents</A> -<LI><A NAME="tex2html9" - href="intro.html">1 Introduction </A> -<LI><A NAME="tex2html10" - href="building.html">2 Building and Installing </A> -<UL> -<LI><A NAME="tex2html11" - href="building-unix.html">2.1 Building the Module on a Unix System </A> -<LI><A NAME="tex2html12" - href="building-windows.html">2.2 Building the Module on a Windows System </A> -</UL> -<BR> -<LI><A NAME="tex2html13" - href="openssl.html">3 <tt class="module">OpenSSL</tt> -- Python interface to OpenSSL </A> -<UL> -<LI><A NAME="tex2html14" - href="openssl-crypto.html">3.1 <tt class="module">crypto</tt> -- Generic cryptographic module </A> -<UL> -<LI><A NAME="tex2html15" - href="openssl-x509ext.html">3.1.1 X509Extension objects </A> -<LI><A NAME="tex2html16" - href="openssl-x509.html">3.1.2 X509 objects </A> -<LI><A NAME="tex2html17" - href="openssl-x509name.html">3.1.3 X509Name objects </A> -<LI><A NAME="tex2html18" - href="openssl-x509req.html">3.1.4 X509Req objects </A> -<LI><A NAME="tex2html19" - href="openssl-x509store.html">3.1.5 X509Store objects </A> -<LI><A NAME="tex2html20" - href="openssl-pkey.html">3.1.6 PKey objects </A> -<LI><A NAME="tex2html21" - href="openssl-pkcs7.html">3.1.7 PKCS7 objects </A> -<LI><A NAME="tex2html22" - href="openssl-pkcs12.html">3.1.8 PKCS12 objects </A> -<LI><A NAME="tex2html23" - href="openssl-509ext.html">3.1.9 X509Extension objects </A> -<LI><A NAME="tex2html24" - href="openssl-netscape-spki.html">3.1.10 NetscapeSPKI objects </A> -<LI><A NAME="tex2html25" - href="crl.html">3.1.11 CRL objects </A> -<LI><A NAME="tex2html26" - href="revoked.html">3.1.12 Revoked objects </A> -</UL> -<LI><A NAME="tex2html27" - href="openssl-rand.html">3.2 <tt class="module">rand</tt> -- An interface to the OpenSSL pseudo random number generator </A> -<LI><A NAME="tex2html28" - href="openssl-ssl.html">3.3 <tt class="module">SSL</tt> -- An interface to the SSL-specific parts of OpenSSL </A> -<UL> -<LI><A NAME="tex2html29" - href="openssl-context.html">3.3.1 Context objects </A> -<LI><A NAME="tex2html30" - href="openssl-connection.html">3.3.2 Connection objects </A> -</UL> -</UL> -<BR> -<LI><A NAME="tex2html31" - href="internals.html">4 Internals </A> -<UL> -<LI><A NAME="tex2html32" - href="exceptions.html">4.1 Exceptions </A> -<LI><A NAME="tex2html33" - href="callbacks.html">4.2 Callbacks </A> -<LI><A NAME="tex2html34" - href="socket-methods.html">4.3 Acessing Socket Methods </A> -</UL> -<BR> -<LI><A NAME="tex2html35" - href="about.html">About this document ...</A> -</UL> -<!--End of Table of Child-Links--> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><A href="contents.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Next:</b> <a class="sectref" href="contents.html">Contents</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/internals.html b/doc/html/internals.html deleted file mode 100644 index 3fe630b..0000000 --- a/doc/html/internals.html +++ /dev/null @@ -1,104 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>4 Internals </title> -<META NAME="description" CONTENT="4 Internals "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="about.html"> -<LINK REL="previous" href="openssl.html"> -<LINK REL="up" HREF="pyOpenSSL.html"> -<LINK REL="next" href="exceptions.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-connection.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="exceptions.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-connection.html">3.3.2 Connection objects</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="exceptions.html">4.1 Exceptions</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H1><A NAME="SECTION000500000000000000000"> </A> -<BR> -4 Internals -</H1> - -<P> -We ran into three main problems developing this: Exceptions, callbacks and -accessing socket methods. This is what this chapter is about. - -<P> - -<p><hr> -<!--Table of Child-Links--> -<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A> - -<UL CLASS="ChildLinks"> -<LI><A NAME="tex2html336" - href="exceptions.html">4.1 Exceptions </A> -<LI><A NAME="tex2html337" - href="callbacks.html">4.2 Callbacks </A> -<LI><A NAME="tex2html338" - href="socket-methods.html">4.3 Acessing Socket Methods </A> -</UL> -<!--End of Table of Child-Links--> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-connection.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="exceptions.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-connection.html">3.3.2 Connection objects</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="exceptions.html">4.1 Exceptions</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/intro.html b/doc/html/intro.html deleted file mode 100644 index 7cb1cf1..0000000 --- a/doc/html/intro.html +++ /dev/null @@ -1,110 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>1 Introduction </title> -<META NAME="description" CONTENT="1 Introduction "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="building.html"> -<LINK REL="previous" href="contents.html"> -<LINK REL="up" HREF="pyOpenSSL.html"> -<LINK REL="next" href="building.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="contents.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="building.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="contents.html">Contents</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="building.html">2 Building and Installing</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H1><A NAME="SECTION000200000000000000000"> </A> -<BR> -1 Introduction -</H1> - -<P> -The reason pyOpenSSL was created is that the SSL support in the socket module -in Python 2.1 (the contemporary version of Python when the pyOpenSSL project -was begun) was severely limited. Other OpenSSL wrappers for Python at the time -were also limited, though in different ways. Unfortunately, Python's standard -library SSL support has remained weak, although other packages (such as -M2Crypto<A NAME="tex2html1" - HREF="#foot1200"><SUP>1</SUP></A>) -have made great advances and now equal or exceed pyOpenSSL's functionality. - -<P> -The reason pyOpenSSL continues to be maintained is that there is a significant -user community around it, as well as a large amount of software which depends -on it. It is a great benefit to many people for pyOpenSSL to continue to exist -and advance. - -<P> -<BR><HR><H4>Footnotes</H4> -<DL> -<DT><A NAME="foot1200">... -M2Crypto</A><A - href="intro.html#tex2html1"><SUP>1</SUP></A></DT> -<DD>See <a class="url" href="http://chandlerproject.org/Projects/MeTooCrypto">http://chandlerproject.org/Projects/MeTooCrypto</a> - -</DD> -</DL> -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="contents.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="building.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="contents.html">Contents</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="building.html">2 Building and Installing</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/modules.gif b/doc/html/modules.gif Binary files differdeleted file mode 100644 index f5860b6..0000000 --- a/doc/html/modules.gif +++ /dev/null diff --git a/doc/html/next.gif b/doc/html/next.gif Binary files differdeleted file mode 100644 index 5dcaff8..0000000 --- a/doc/html/next.gif +++ /dev/null diff --git a/doc/html/openssl-509ext.html b/doc/html/openssl-509ext.html deleted file mode 100644 index 5334adf..0000000 --- a/doc/html/openssl-509ext.html +++ /dev/null @@ -1,101 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.9 X509Extension objects </title> -<META NAME="description" CONTENT="3.1.9 X509Extension objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-netscape-spki.html"> -<LINK REL="previous" href="openssl-pkcs12.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-netscape-spki.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-pkcs12.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-netscape-spki.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-pkcs12.html">3.1.8 PKCS12 objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-netscape-spki.html">3.1.10 NetscapeSPKI objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000419000000000000000"> </A> -<BR> -3.1.9 X509Extension objects -</H3> - -<P> -X509Extension objects have several methods: - -<P> -<dl><dt><b><a name='l2h-99'><tt class='method'>get_critical</tt></a></b>() -<dd> -Return the critical field of the extension object. -</dl> - -<P> -<dl><dt><b><a name='l2h-100'><tt class='method'>get_short_name</tt></a></b>() -<dd> -Return the short type name of the extension object. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-pkcs12.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-netscape-spki.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-pkcs12.html">3.1.8 PKCS12 objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-netscape-spki.html">3.1.10 NetscapeSPKI objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-connection.html b/doc/html/openssl-connection.html deleted file mode 100644 index 36441af..0000000 --- a/doc/html/openssl-connection.html +++ /dev/null @@ -1,374 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.3.2 Connection objects </title> -<META NAME="description" CONTENT="3.3.2 Connection objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="previous" href="openssl-context.html"> -<LINK REL="up" href="openssl-ssl.html"> -<LINK REL="next" href="internals.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-context.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-ssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="internals.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-context.html">3.3.1 Context objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-ssl.html">3.3 SSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="internals.html">4 Internals</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000432000000000000000"> </A> -<BR> -3.3.2 Connection objects -</H3> - -<P> -Connection objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-179'><tt class='method'>accept</tt></a></b>() -<dd> -Call the <tt class="method">accept</tt> method of the underlying socket and set up SSL on the -returned socket, using the Context object supplied to this Connection object at -creation. Returns a pair <code>(<var>conn</var>, <var>address</var>)</code>. where <var>conn</var> -is the new Connection object created, and <var>address</var> is as returned by the -socket's <tt class="method">accept</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-180'><tt class='method'>bind</tt></a></b>(<var>address</var>) -<dd> -Call the <tt class="method">bind</tt> method of the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-181'><tt class='method'>close</tt></a></b>() -<dd> -Call the <tt class="method">close</tt> method of the underlying socket. Note: If you want -correct SSL closure, you need to call the <tt class="method">shutdown</tt> method first. -</dl> - -<P> -<dl><dt><b><a name='l2h-182'><tt class='method'>connect</tt></a></b>(<var>address</var>) -<dd> -Call the <tt class="method">connect</tt> method of the underlying socket and set up SSL on the -socket, using the Context object supplied to this Connection object at -creation. -</dl> - -<P> -<dl><dt><b><a name='l2h-183'><tt class='method'>connect_ex</tt></a></b>(<var>address</var>) -<dd> -Call the <tt class="method">connect_ex</tt> method of the underlying socket and set up SSL on -the socket, using the Context object supplied to this Connection object at -creation. Note that if the <tt class="method">connect_ex</tt> method of the socket doesn't -return 0, SSL won't be initialized. -</dl> - -<P> -<dl><dt><b><a name='l2h-184'><tt class='method'>do_handshake</tt></a></b>() -<dd> -Perform an SSL handshake (usually called after <tt class="method">renegotiate</tt> or one of -<tt class="method">set_accept_state</tt> or <tt class="method">set_accept_state</tt>). This can raise the -same exceptions as <tt class="method">send</tt> and <tt class="method">recv</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-185'><tt class='method'>fileno</tt></a></b>() -<dd> -Retrieve the file descriptor number for the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-186'><tt class='method'>listen</tt></a></b>(<var>backlog</var>) -<dd> -Call the <tt class="method">listen</tt> method of the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-187'><tt class='method'>get_app_data</tt></a></b>() -<dd> -Retrieve application data as set by <tt class="method">set_app_data</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-188'><tt class='method'>get_cipher_list</tt></a></b>() -<dd> -Retrieve the list of ciphers used by the Connection object. WARNING: This API -has changed. It used to take an optional parameter and just return a string, -but not it returns the entire list in one go. -</dl> - -<P> -<dl><dt><b><a name='l2h-189'><tt class='method'>get_client_ca_list</tt></a></b>() -<dd> -Retrieve the list of preferred client certificate issuers sent by the server -as <tt class="class">OpenSSL.crypto.X509Name</tt> objects. - -<P> -If this is a client <tt class="class">Connection</tt>, the list will be empty until the -connection with the server is established. - -<P> -If this is a server <tt class="class">Connection</tt>, return the list of certificate -authorities that will be sent or has been sent to the client, as controlled -by this <tt class="class">Connection</tt>'s <tt class="class">Context</tt>. - -<P> - -<span class='versionnote'>New in version 0.10.</span> - -</dl> - -<P> -<dl><dt><b><a name='l2h-190'><tt class='method'>get_context</tt></a></b>() -<dd> -Retrieve the Context object associated with this Connection. -</dl> - -<P> -<dl><dt><b><a name='l2h-191'><tt class='method'>get_peer_certificate</tt></a></b>() -<dd> -Retrieve the other side's certificate (if any) -</dl> - -<P> -<dl><dt><b><a name='l2h-192'><tt class='method'>getpeername</tt></a></b>() -<dd> -Call the <tt class="method">getpeername</tt> method of the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-193'><tt class='method'>getsockname</tt></a></b>() -<dd> -Call the <tt class="method">getsockname</tt> method of the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-194'><tt class='method'>getsockopt</tt></a></b>(<var>level, optname</var><big>[</big><var>, buflen</var><big>]</big>) -<dd> -Call the <tt class="method">getsockopt</tt> method of the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-195'><tt class='method'>pending</tt></a></b>() -<dd> -Retrieve the number of bytes that can be safely read from the SSL buffer -(<i>not</i> the underlying transport buffer). -</dl> - -<P> -<dl><dt><b><a name='l2h-196'><tt class='method'>recv</tt></a></b>(<var>bufsize</var>) -<dd> -Receive data from the Connection. The return value is a string representing the -data received. The maximum amount of data to be received at once, is specified -by <var>bufsize</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-197'><tt class='method'>bio_write</tt></a></b>(<var>bytes</var>) -<dd> -If the Connection was created with a memory BIO, this method can be used to add -bytes to the read end of that memory BIO. The Connection can then read the -bytes (for example, in response to a call to <tt class="method">recv</tt>). -</dl> - -<P> -<dl><dt><b><a name='l2h-198'><tt class='method'>renegotiate</tt></a></b>() -<dd> -Renegotiate the SSL session. Call this if you wish to change cipher suites or -anything like that. -</dl> - -<P> -<dl><dt><b><a name='l2h-199'><tt class='method'>send</tt></a></b>(<var>string</var>) -<dd> -Send the <var>string</var> data to the Connection. -</dl> - -<P> -<dl><dt><b><a name='l2h-200'><tt class='method'>bio_read</tt></a></b>(<var>bufsize</var>) -<dd> -If the Connection was created with a memory BIO, this method can be used to -read bytes from the write end of that memory BIO. Many Connection methods will -add bytes which must be read in this manner or the buffer will eventually fill -up and the Connection will be able to take no further actions. -</dl> - -<P> -<dl><dt><b><a name='l2h-201'><tt class='method'>sendall</tt></a></b>(<var>string</var>) -<dd> -Send all of the <var>string</var> data to the Connection. This calls <tt class="method">send</tt> -repeatedly until all data is sent. If an error occurs, it's impossible to tell -how much data has been sent. -</dl> - -<P> -<dl><dt><b><a name='l2h-202'><tt class='method'>set_accept_state</tt></a></b>() -<dd> -Set the connection to work in server mode. The handshake will be handled -automatically by read/write. -</dl> - -<P> -<dl><dt><b><a name='l2h-203'><tt class='method'>set_app_data</tt></a></b>(<var>data</var>) -<dd> -Associate <var>data</var> with this Connection object. <var>data</var> can be retrieved -later using the <tt class="method">get_app_data</tt> method. -</dl> - -<P> -<dl><dt><b><a name='l2h-204'><tt class='method'>set_connect_state</tt></a></b>() -<dd> -Set the connection to work in client mode. The handshake will be handled -automatically by read/write. -</dl> - -<P> -<dl><dt><b><a name='l2h-205'><tt class='method'>setblocking</tt></a></b>(<var>flag</var>) -<dd> -Call the <tt class="method">setblocking</tt> method of the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-206'><tt class='method'>setsockopt</tt></a></b>(<var>level, optname, value</var>) -<dd> -Call the <tt class="method">setsockopt</tt> method of the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-207'><tt class='method'>shutdown</tt></a></b>() -<dd> -Send the shutdown message to the Connection. Returns true if the shutdown -message exchange is completed and false otherwise (in which case you call -<tt class="method">recv()</tt> or <tt class="method">send()</tt> when the connection becomes -readable/writeable. -</dl> - -<P> -<dl><dt><b><a name='l2h-208'><tt class='method'>get_shutdown</tt></a></b>() -<dd> -Get the shutdown state of the Connection. Returns a bitvector of either or -both of <var>SENT_SHUTDOWN</var> and <var>RECEIVED_SHUTDOWN</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-209'><tt class='method'>set_shutdown</tt></a></b>(<var>state</var>) -<dd> -Set the shutdown state of the Connection. <var>state</var> is a bitvector of -either or both of <var>SENT_SHUTDOWN</var> and <var>RECEIVED_SHUTDOWN</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-210'><tt class='method'>sock_shutdown</tt></a></b>(<var>how</var>) -<dd> -Call the <tt class="method">shutdown</tt> method of the underlying socket. -</dl> - -<P> -<dl><dt><b><a name='l2h-211'><tt class='method'>bio_shutdown</tt></a></b>() -<dd> -If the Connection was created with a memory BIO, this method can be used to -indicate that ``end of file'' has been reached on the read end of that memory -BIO. -</dl> - -<P> -<dl><dt><b><a name='l2h-212'><tt class='method'>state_string</tt></a></b>() -<dd> -Retrieve a verbose string detailing the state of the Connection. -</dl> - -<P> -<dl><dt><b><a name='l2h-213'><tt class='method'>client_random</tt></a></b>() -<dd> -Retrieve the random value used with the client hello message. -</dl> - -<P> -<dl><dt><b><a name='l2h-214'><tt class='method'>server_random</tt></a></b>() -<dd> -Retrieve the random value used with the server hello message. -</dl> - -<P> -<dl><dt><b><a name='l2h-215'><tt class='method'>master_key</tt></a></b>() -<dd> -Retrieve the value of the master key for this session. -</dl> - -<P> -<dl><dt><b><a name='l2h-216'><tt class='method'>want_read</tt></a></b>() -<dd> -Checks if more data has to be read from the transport layer to complete an -operation. -</dl> - -<P> -<dl><dt><b><a name='l2h-217'><tt class='method'>want_write</tt></a></b>() -<dd> -Checks if there is data to write to the transport layer to complete an -operation. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-context.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-ssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="internals.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-context.html">3.3.1 Context objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-ssl.html">3.3 SSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="internals.html">4 Internals</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-context.html b/doc/html/openssl-context.html deleted file mode 100644 index c42e56f..0000000 --- a/doc/html/openssl-context.html +++ /dev/null @@ -1,314 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.3.1 Context objects </title> -<META NAME="description" CONTENT="3.3.1 Context objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-connection.html"> -<LINK REL="previous" href="openssl-ssl.html"> -<LINK REL="up" href="openssl-ssl.html"> -<LINK REL="next" href="openssl-connection.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-ssl.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-ssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-connection.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-ssl.html">3.3 SSL </A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-ssl.html">3.3 SSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-connection.html">3.3.2 Connection objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000431000000000000000"> </A> -<BR> -3.3.1 Context objects -</H3> - -<P> -Context objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-152'><tt class='method'>check_privatekey</tt></a></b>() -<dd> -Check if the private key (loaded with <tt class="method">use_privatekey<big>[</big>_file<big>]</big></tt>) -matches the certificate (loaded with <tt class="method">use_certificate<big>[</big>_file<big>]</big></tt>). -Returns <code>None</code> if they match, raises <tt class="exception">Error</tt> otherwise. -</dl> - -<P> -<dl><dt><b><a name='l2h-153'><tt class='method'>get_app_data</tt></a></b>() -<dd> -Retrieve application data as set by <tt class="method">set_app_data</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-154'><tt class='method'>get_cert_store</tt></a></b>() -<dd> -Retrieve the certificate store (a X509Store object) that the context uses. -This can be used to add "trusted" certificates without using the. -<tt class="method">load_verify_locations()</tt> method. -</dl> - -<P> -<dl><dt><b><a name='l2h-155'><tt class='method'>get_timeout</tt></a></b>() -<dd> -Retrieve session timeout, as set by <tt class="method">set_timeout</tt>. The default is 300 -seconds. -</dl> - -<P> -<dl><dt><b><a name='l2h-156'><tt class='method'>get_verify_depth</tt></a></b>() -<dd> -Retrieve the Context object's verify depth, as set by -<tt class="method">set_verify_depth</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-157'><tt class='method'>get_verify_mode</tt></a></b>() -<dd> -Retrieve the Context object's verify mode, as set by <tt class="method">set_verify</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-158'><tt class='method'>load_client_ca</tt></a></b>(<var>pemfile</var>) -<dd> -Read a file with PEM-formatted certificates that will be sent to the client -when requesting a client certificate. -</dl> - -<P> -<dl><dt><b><a name='l2h-159'><tt class='method'>set_client_ca_list</tt></a></b>(<var>certificate_authorities</var>) -<dd> -Replace the current list of preferred certificate signers that would be -sent to the client when requesting a client certificate with the -<var>certificate_authorities</var> sequence of <tt class="class">OpenSSL.crypto.X509Name</tt>s. - -<P> - -<span class='versionnote'>New in version 0.10.</span> - -</dl> - -<P> -<dl><dt><b><a name='l2h-160'><tt class='method'>add_client_ca</tt></a></b>(<var>certificate_authority</var>) -<dd> -Extract a <tt class="class">OpenSSL.crypto.X509Name</tt> from the <var>certificate_authority</var> -<tt class="class">OpenSSL.crypto.X509</tt> certificate and add it to the list of preferred -certificate signers sent to the client when requesting a client certificate. - -<P> - -<span class='versionnote'>New in version 0.10.</span> - -</dl> - -<P> -<dl><dt><b><a name='l2h-161'><tt class='method'>load_verify_locations</tt></a></b>(<var>pemfile, capath</var>) -<dd> -Specify where CA certificates for verification purposes are located. These -are trusted certificates. Note that the certificates have to be in PEM -format. If capath is passed, it must be a directory prepared using the -<code>c_rehash</code> tool included with OpenSSL. Either, but not both, of -<var>pemfile</var> or <var>capath</var> may be <code>None</code>. -</dl> - -<P> -<dl><dt><b><a name='l2h-162'><tt class='method'>set_default_verify_paths</tt></a></b>() -<dd> -Specify that the platform provided CA certificates are to be used for -verification purposes. This method may not work properly on OS X. -</dl> - -<P> -<dl><dt><b><a name='l2h-163'><tt class='method'>load_tmp_dh</tt></a></b>(<var>dhfile</var>) -<dd> -Load parameters for Ephemeral Diffie-Hellman from <var>dhfile</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-164'><tt class='method'>set_app_data</tt></a></b>(<var>data</var>) -<dd> -Associate <var>data</var> with this Context object. <var>data</var> can be retrieved -later using the <tt class="method">get_app_data</tt> method. -</dl> - -<P> -<dl><dt><b><a name='l2h-165'><tt class='method'>set_cipher_list</tt></a></b>(<var>ciphers</var>) -<dd> -Set the list of ciphers to be used in this context. See the OpenSSL manual for -more information (e.g. ciphers(1)) -</dl> - -<P> -<dl><dt><b><a name='l2h-166'><tt class='method'>set_info_callback</tt></a></b>(<var>callback</var>) -<dd> -Set the information callback to <var>callback</var>. This function will be called -from time to time during SSL handshakes. -<var>callback</var> should take three arguments: a Connection object and two -integers. The first integer specifies where in the SSL handshake the function -was called, and the other the return code from a (possibly failed) internal -function call. -</dl> - -<P> -<dl><dt><b><a name='l2h-167'><tt class='method'>set_options</tt></a></b>(<var>options</var>) -<dd> -Add SSL options. Options you have set before are not cleared! -This method should be used with the <tt class="constant">OP_*</tt> constants. -</dl> - -<P> -<dl><dt><b><a name='l2h-168'><tt class='method'>set_passwd_cb</tt></a></b>(<var>callback</var><big>[</big><var>, userdata</var><big>]</big>) -<dd> -Set the passphrase callback to <var>callback</var>. This function will be called -when a private key with a passphrase is loaded. <var>callback</var> must accept -three positional arguments. First, an integer giving the maximum length of -the passphrase it may return. If the returned passphrase is longer than -this, it will be truncated. Second, a boolean value which will be true if -the user should be prompted for the passphrase twice and the callback should -verify that the two values supplied are equal. Third, the value given as the -<var>userdata</var> parameter to <tt class="method">set_passwd_cb</tt>. If an error occurs, -<var>callback</var> should return a false value (e.g. an empty string). -</dl> - -<P> -<dl><dt><b><a name='l2h-169'><tt class='method'>set_session_id</tt></a></b>(<var>name</var>) -<dd> -Set the context <var>name</var> within which a session can be reused for this -Context object. This is needed when doing session resumption, because there is -no way for a stored session to know which Context object it is associated with. -<var>name</var> may be any binary data. -</dl> - -<P> -<dl><dt><b><a name='l2h-170'><tt class='method'>set_timeout</tt></a></b>(<var>timeout</var>) -<dd> -Set the timeout for newly created sessions for this Context object to -<var>timeout</var>. <var>timeout</var> must be given in (whole) seconds. The default -value is 300 seconds. See the OpenSSL manual for more information (e.g. -SSL_CTX_set_timeout(3)). -</dl> - -<P> -<dl><dt><b><a name='l2h-171'><tt class='method'>set_verify</tt></a></b>(<var>mode, callback</var>) -<dd> -Set the verification flags for this Context object to <var>mode</var> and specify -that <var>callback</var> should be used for verification callbacks. <var>mode</var> -should be one of <tt class="constant">VERIFY_NONE</tt> and <tt class="constant">VERIFY_PEER</tt>. If -<tt class="constant">VERIFY_PEER</tt> is used, <var>mode</var> can be OR:ed with -<tt class="constant">VERIFY_FAIL_IF_NO_PEER_CERT</tt> and <tt class="constant">VERIFY_CLIENT_ONCE</tt> to -further control the behaviour. -<var>callback</var> should take five arguments: A Connection object, an X509 object, -and three integer variables, which are in turn potential error number, error -depth and return code. <var>callback</var> should return true if verification passes -and false otherwise. -</dl> - -<P> -<dl><dt><b><a name='l2h-172'><tt class='method'>set_verify_depth</tt></a></b>(<var>depth</var>) -<dd> -Set the maximum depth for the certificate chain verification that shall be -allowed for this Context object. -</dl> - -<P> -<dl><dt><b><a name='l2h-173'><tt class='method'>use_certificate</tt></a></b>(<var>cert</var>) -<dd> -Use the certificate <var>cert</var> which has to be a X509 object. -</dl> - -<P> -<dl><dt><b><a name='l2h-174'><tt class='method'>add_extra_chain_cert</tt></a></b>(<var>cert</var>) -<dd> -Adds the certificate <var>cert</var>, which has to be a X509 object, to the -certificate chain presented together with the certificate. -</dl> - -<P> -<dl><dt><b><a name='l2h-175'><tt class='method'>use_certificate_chain_file</tt></a></b>(<var>file</var>) -<dd> -Load a certificate chain from <var>file</var> which must be PEM encoded. -</dl> - -<P> -<dl><dt><b><a name='l2h-176'><tt class='method'>use_privatekey</tt></a></b>(<var>pkey</var>) -<dd> -Use the private key <var>pkey</var> which has to be a PKey object. -</dl> - -<P> -<dl><dt><b><a name='l2h-177'><tt class='method'>use_certificate_file</tt></a></b>(<var>file</var><big>[</big><var>, format</var><big>]</big>) -<dd> -Load the first certificate found in <var>file</var>. The certificate must be in the -format specified by <var>format</var>, which is either <tt class="constant">FILETYPE_PEM</tt> or -<tt class="constant">FILETYPE_ASN1</tt>. The default is <tt class="constant">FILETYPE_PEM</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-178'><tt class='method'>use_privatekey_file</tt></a></b>(<var>file</var><big>[</big><var>, format</var><big>]</big>) -<dd> -Load the first private key found in <var>file</var>. The private key must be in the -format specified by <var>format</var>, which is either <tt class="constant">FILETYPE_PEM</tt> or -<tt class="constant">FILETYPE_ASN1</tt>. The default is <tt class="constant">FILETYPE_PEM</tt>. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-ssl.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-ssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-connection.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-ssl.html">3.3 SSL </A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-ssl.html">3.3 SSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-connection.html">3.3.2 Connection objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-crypto.html b/doc/html/openssl-crypto.html deleted file mode 100644 index 7fc909f..0000000 --- a/doc/html/openssl-crypto.html +++ /dev/null @@ -1,361 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1 crypto -- Generic cryptographic module </title> -<META NAME="description" CONTENT="3.1 crypto -- Generic cryptographic module "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-rand.html"> -<LINK REL="previous" href="openssl.html"> -<LINK REL="up" href="openssl.html"> -<LINK REL="next" href="openssl-x509ext.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-x509ext.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-x509ext.html">3.1.1 X509Extension objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H2><A NAME="SECTION000410000000000000000"> </A> -<BR> -3.1 <tt class="module">crypto</tt> -- Generic cryptographic module -</H2> - -<P> - - -<P> -<dl><dt><b><a name='l2h-6'><tt>X509Type</tt></a></b> -<dd> -See <tt class="class">X509</tt>. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-7'><tt class='class'>X509</tt></a></b>() -<dd> -A class representing X.509 certificates. -</dl> - -<P> -<dl><dt><b><a name='l2h-8'><tt>X509NameType</tt></a></b> -<dd> -See <tt class="class">X509Name</tt>. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-9'><tt class='class'>X509Name</tt></a></b>(<var>x509name</var>) -<dd> -A class representing X.509 Distinguished Names. - -<P> -This constructor creates a copy of <var>x509name</var> which should be an -instance of <tt class="class">X509Name</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-10'><tt>X509ReqType</tt></a></b> -<dd> -See <tt class="class">X509Req</tt>. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-11'><tt class='class'>X509Req</tt></a></b>() -<dd> -A class representing X.509 certificate requests. -</dl> - -<P> -<dl><dt><b><a name='l2h-12'><tt>X509StoreType</tt></a></b> -<dd> -A Python type object representing the X509Store object type. -</dl> - -<P> -<dl><dt><b><a name='l2h-13'><tt>PKeyType</tt></a></b> -<dd> -See <tt class="class">PKey</tt>. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-14'><tt class='class'>PKey</tt></a></b>() -<dd> -A class representing DSA or RSA keys. -</dl> - -<P> -<dl><dt><b><a name='l2h-15'><tt>PKCS7Type</tt></a></b> -<dd> -A Python type object representing the PKCS7 object type. -</dl> - -<P> -<dl><dt><b><a name='l2h-16'><tt>PKCS12Type</tt></a></b> -<dd> -A Python type object representing the PKCS12 object type. -</dl> - -<P> -<dl><dt><b><a name='l2h-17'><tt>X509ExtensionType</tt></a></b> -<dd> -See <tt class="class">X509Extension</tt>. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-18'><tt class='class'>X509Extension</tt></a></b>(<var>typename, critical, value</var><big>[</big><var>, subject</var><big>]</big><big>[</big><var>, issuer</var><big>]</big>) -<dd> -A class representing an X.509 v3 certificate extensions. -See <a class="url" href="http://openssl.org/docs/apps/x509v3_config.html#STANDARD_EXTENSIONS">http://openssl.org/docs/apps/x509v3_config.html#STANDARD_EXTENSIONS</a>for <var>typename</var> strings and their options. -Optional parameters <var>subject</var> and <var>issuer</var> must be X509 objects. -</dl> - -<P> -<dl><dt><b><a name='l2h-19'><tt>NetscapeSPKIType</tt></a></b> -<dd> -See <tt class="class">NetscapeSPKI</tt>. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-20'><tt class='class'>NetscapeSPKI</tt></a></b>(<big>[</big><var>enc</var><big>]</big>) -<dd> -A class representing Netscape SPKI objects. - -<P> -If the <var>enc</var> argument is present, it should be a base64-encoded string -representing a NetscapeSPKI object, as returned by the <tt class="method">b64_encode</tt> -method. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-21'><tt class='class'>CRL</tt></a></b>() -<dd> -A class representing Certifcate Revocation List objects. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-22'><tt class='class'>Revoked</tt></a></b>() -<dd> -A class representing Revocation objects of CRL. -</dl> - -<P> -<dl><dt><b><a name='l2h-23'><tt>FILETYPE_PEM</tt></a></b> -<dd> -<dt><b><a name='l2h-37'><tt>FILETYPE_ASN1</tt></a></b><dd> -File type constants. -</dl> - -<P> -<dl><dt><b><a name='l2h-24'><tt>TYPE_RSA</tt></a></b> -<dd> -<dt><b><a name='l2h-38'><tt>TYPE_DSA</tt></a></b><dd> -Key type constants. -</dl> - -<P> -<dl><dt><b>exception <a name='l2h-25'><tt class='exception'>Error</tt></a></b> -<dd> -Generic exception used in the <tt class="module">crypto</tt> module. -</dl> - -<P> -<dl><dt><b><a name='l2h-26'><tt class='function'>dump_certificate</tt></a></b>(<var>type, cert</var>) -<dd> -Dump the certificate <var>cert</var> into a buffer string encoded with the type -<var>type</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-27'><tt class='function'>dump_certificate_request</tt></a></b>(<var>type, req</var>) -<dd> -Dump the certificate request <var>req</var> into a buffer string encoded with the -type <var>type</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-28'><tt class='function'>dump_privatekey</tt></a></b>(<var>type, pkey</var><big>[</big><var>, cipher, passphrase</var><big>]</big>) -<dd> -Dump the private key <var>pkey</var> into a buffer string encoded with the type -<var>type</var>, optionally (if <var>type</var> is <tt class="constant">FILETYPE_PEM</tt>) encrypting it -using <var>cipher</var> and <var>passphrase</var>. - -<P> -<var>passphrase</var> must be either a string or a callback for providing the -pass phrase. -</dl> - -<P> -<dl><dt><b><a name='l2h-29'><tt class='function'>load_certificate</tt></a></b>(<var>type, buffer</var>) -<dd> -Load a certificate (X509) from the string <var>buffer</var> encoded with the -type <var>type</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-30'><tt class='function'>load_certificate_request</tt></a></b>(<var>type, buffer</var>) -<dd> -Load a certificate request (X509Req) from the string <var>buffer</var> encoded with -the type <var>type</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-31'><tt class='function'>load_privatekey</tt></a></b>(<var>type, buffer</var><big>[</big><var>, passphrase</var><big>]</big>) -<dd> -Load a private key (PKey) from the string <var>buffer</var> encoded with -the type <var>type</var> (must be one of <tt class="constant">FILETYPE_PEM</tt> and -<tt class="constant">FILETYPE_ASN1</tt>). - -<P> -<var>passphrase</var> must be either a string or a callback for providing the -pass phrase. -</dl> - -<P> -<dl><dt><b><a name='l2h-32'><tt class='function'>load_crl</tt></a></b>(<var>type, buffer</var>) -<dd> -Load Certificate Revocation List (CRL) data from a string <var>buffer</var>. -<var>buffer</var> encoded with the type <var>type</var>. The type <var>type</var> -must either <tt class="constant">FILETYPE_PEM</tt> or <tt class="constant">FILETYPE_ASN1</tt>). -</dl> - -<P> -<dl><dt><b><a name='l2h-33'><tt class='function'>load_pkcs7_data</tt></a></b>(<var>type, buffer</var>) -<dd> -Load pkcs7 data from the string <var>buffer</var> encoded with the type <var>type</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-34'><tt class='function'>load_pkcs12</tt></a></b>(<var>buffer</var><big>[</big><var>, passphrase</var><big>]</big>) -<dd> -Load pkcs12 data from the string <var>buffer</var>. If the pkcs12 structure is -encrypted, a <var>passphrase</var> must be included. The MAC is always -checked and thus required. - -<P> -See also the man page for the C function <tt class="function">PKCS12_parse</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-35'><tt class='function'>sign</tt></a></b>(<var>key, data, digest</var>) -<dd> -Sign a data string using the given key and message digest. - -<P> -<var>key</var> is a <code>PKey</code> instance. <var>data</var> is a <code>str</code> instance. -<var>digest</var> is a <code>str</code> naming a supported message digest type, for example -<code>``sha1''</code>. - -<span class='versionnote'>New in version 0.11.</span> - -</dl> - -<P> -<dl><dt><b><a name='l2h-36'><tt class='function'>verify</tt></a></b>(<var>certificate, signature, data, digest</var>) -<dd> -Verify the signature for a data string. - -<P> -<var>certificate</var> is a <code>X509</code> instance corresponding to the private key -which generated the signature. <var>signature</var> is a <var>str</var> instance giving -the signature itself. <var>data</var> is a <var>str</var> instance giving the data to -which the signature applies. <var>digest</var> is a <var>str</var> instance naming the -message digest type of the signature, for example <code>``sha1''</code>. - -<span class='versionnote'>New in version 0.11.</span> - -</dl> - -<P> - -<p><hr> -<!--Table of Child-Links--> -<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A> - -<UL CLASS="ChildLinks"> -<LI><A NAME="tex2html141" - href="openssl-x509ext.html">3.1.1 X509Extension objects </A> -<LI><A NAME="tex2html142" - href="openssl-x509.html">3.1.2 X509 objects </A> -<LI><A NAME="tex2html143" - href="openssl-x509name.html">3.1.3 X509Name objects </A> -<LI><A NAME="tex2html144" - href="openssl-x509req.html">3.1.4 X509Req objects </A> -<LI><A NAME="tex2html145" - href="openssl-x509store.html">3.1.5 X509Store objects </A> -<LI><A NAME="tex2html146" - href="openssl-pkey.html">3.1.6 PKey objects </A> -<LI><A NAME="tex2html147" - href="openssl-pkcs7.html">3.1.7 PKCS7 objects </A> -<LI><A NAME="tex2html148" - href="openssl-pkcs12.html">3.1.8 PKCS12 objects </A> -<LI><A NAME="tex2html149" - href="openssl-509ext.html">3.1.9 X509Extension objects </A> -<LI><A NAME="tex2html150" - href="openssl-netscape-spki.html">3.1.10 NetscapeSPKI objects </A> -<LI><A NAME="tex2html151" - href="crl.html">3.1.11 CRL objects </A> -<LI><A NAME="tex2html152" - href="revoked.html">3.1.12 Revoked objects </A> -</UL> -<!--End of Table of Child-Links--> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-x509ext.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-x509ext.html">3.1.1 X509Extension objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-netscape-spki.html b/doc/html/openssl-netscape-spki.html deleted file mode 100644 index d4cfcc0..0000000 --- a/doc/html/openssl-netscape-spki.html +++ /dev/null @@ -1,122 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.10 NetscapeSPKI objects </title> -<META NAME="description" CONTENT="3.1.10 NetscapeSPKI objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="crl.html"> -<LINK REL="previous" href="openssl-509ext.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="crl.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-509ext.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="crl.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-509ext.html">3.1.9 X509Extension objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="crl.html">3.1.11 CRL objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION0004110000000000000000"> </A> -<BR> -3.1.10 NetscapeSPKI objects -</H3> - -<P> -NetscapeSPKI objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-101'><tt class='method'>b64_encode</tt></a></b>() -<dd> -Return a base64-encoded string representation of the object. -</dl> - -<P> -<dl><dt><b><a name='l2h-102'><tt class='method'>get_pubkey</tt></a></b>() -<dd> -Return the public key of object. -</dl> - -<P> -<dl><dt><b><a name='l2h-103'><tt class='method'>set_pubkey</tt></a></b>(<var>key</var>) -<dd> -Set the public key of the object to <var>key</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-104'><tt class='method'>sign</tt></a></b>(<var>key, digest_name</var>) -<dd> -Sign the NetscapeSPKI object using the given <var>key</var> and -<var>digest_name</var>. <var>digest_name</var> must be a string describing a digest -algorithm supported by OpenSSL (by EVP_get_digestbyname, specifically). For -example, <tt class="constant">"md5"</tt> or <tt class="constant">"sha1"</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-105'><tt class='method'>verify</tt></a></b>(<var>key</var>) -<dd> -Verify the NetscapeSPKI object using the given <var>key</var>. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-509ext.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="crl.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-509ext.html">3.1.9 X509Extension objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="crl.html">3.1.11 CRL objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-pkcs12.html b/doc/html/openssl-pkcs12.html deleted file mode 100644 index 60bb008..0000000 --- a/doc/html/openssl-pkcs12.html +++ /dev/null @@ -1,153 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.8 PKCS12 objects </title> -<META NAME="description" CONTENT="3.1.8 PKCS12 objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-509ext.html"> -<LINK REL="previous" href="openssl-pkcs7.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-509ext.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-pkcs7.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-509ext.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-pkcs7.html">3.1.7 PKCS7 objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-509ext.html">3.1.9 X509Extension objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000418000000000000000"> </A> -<BR> -3.1.8 PKCS12 objects -</H3> - -<P> -PKCS12 objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-90'><tt class='method'>export</tt></a></b>(<big>[</big><var>passphrase=None</var><big>]</big><big>[</big><var>, iter=2048</var><big>]</big><big>[</big><var>, maciter=1</var><big>]</big>) -<dd> -Returns a PKCS12 object as a string. - -<P> -The optional <var>passphrase</var> must be a string not a callback. - -<P> -See also the man page for the C function <tt class="function">PKCS12_create</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-91'><tt class='method'>get_ca_certificates</tt></a></b>() -<dd> -Return CA certificates within the PKCS12 object as a tuple. Returns -<tt class="constant">None</tt> if no CA certificates are present. -</dl> - -<P> -<dl><dt><b><a name='l2h-92'><tt class='method'>get_certificate</tt></a></b>() -<dd> -Return certificate portion of the PKCS12 structure. -</dl> - -<P> -<dl><dt><b><a name='l2h-93'><tt class='method'>get_friendlyname</tt></a></b>() -<dd> -Return friendlyName portion of the PKCS12 structure. -</dl> - -<P> -<dl><dt><b><a name='l2h-94'><tt class='method'>get_privatekey</tt></a></b>() -<dd> -Return private key portion of the PKCS12 structure -</dl> - -<P> -<dl><dt><b><a name='l2h-95'><tt class='method'>set_ca_certificates</tt></a></b>(<var>cacerts</var>) -<dd> -Replace or set the CA certificates within the PKCS12 object with the sequence <var>cacerts</var>. - -<P> -Set <var>cacerts</var> to <tt class="constant">None</tt> to remove all CA certificates. -</dl> - -<P> -<dl><dt><b><a name='l2h-96'><tt class='method'>set_certificate</tt></a></b>(<var>cert</var>) -<dd> -Replace or set the certificate portion of the PKCS12 structure. -</dl> - -<P> -<dl><dt><b><a name='l2h-97'><tt class='method'>set_friendlyname</tt></a></b>(<var>name</var>) -<dd> -Replace or set the friendlyName portion of the PKCS12 structure. -</dl> - -<P> -<dl><dt><b><a name='l2h-98'><tt class='method'>set_privatekey</tt></a></b>(<var>pkey</var>) -<dd> -Replace or set private key portion of the PKCS12 structure -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-pkcs7.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-509ext.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-pkcs7.html">3.1.7 PKCS7 objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-509ext.html">3.1.9 X509Extension objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-pkcs7.html b/doc/html/openssl-pkcs7.html deleted file mode 100644 index cdf8644..0000000 --- a/doc/html/openssl-pkcs7.html +++ /dev/null @@ -1,119 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.7 PKCS7 objects </title> -<META NAME="description" CONTENT="3.1.7 PKCS7 objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-pkcs12.html"> -<LINK REL="previous" href="openssl-pkey.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-pkcs12.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-pkey.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-pkcs12.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-pkey.html">3.1.6 PKey objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-pkcs12.html">3.1.8 PKCS12 objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000417000000000000000"> </A> -<BR> -3.1.7 PKCS7 objects -</H3> - -<P> -PKCS7 objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-85'><tt class='method'>type_is_signed</tt></a></b>() -<dd> -FIXME -</dl> - -<P> -<dl><dt><b><a name='l2h-86'><tt class='method'>type_is_enveloped</tt></a></b>() -<dd> -FIXME -</dl> - -<P> -<dl><dt><b><a name='l2h-87'><tt class='method'>type_is_signedAndEnveloped</tt></a></b>() -<dd> -FIXME -</dl> - -<P> -<dl><dt><b><a name='l2h-88'><tt class='method'>type_is_data</tt></a></b>() -<dd> -FIXME -</dl> - -<P> -<dl><dt><b><a name='l2h-89'><tt class='method'>get_type_name</tt></a></b>() -<dd> -Get the type name of the PKCS7. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-pkey.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-pkcs12.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-pkey.html">3.1.6 PKey objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-pkcs12.html">3.1.8 PKCS12 objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-pkey.html b/doc/html/openssl-pkey.html deleted file mode 100644 index f10cd19..0000000 --- a/doc/html/openssl-pkey.html +++ /dev/null @@ -1,108 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.6 PKey objects </title> -<META NAME="description" CONTENT="3.1.6 PKey objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-pkcs7.html"> -<LINK REL="previous" href="openssl-x509store.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-pkcs7.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509store.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-pkcs7.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509store.html">3.1.5 X509Store objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-pkcs7.html">3.1.7 PKCS7 objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000416000000000000000"> </A> -<BR> -3.1.6 PKey objects -</H3> - -<P> -The PKey object has the following methods: - -<P> -<dl><dt><b><a name='l2h-82'><tt class='method'>bits</tt></a></b>() -<dd> -Return the number of bits of the key. -</dl> - -<P> -<dl><dt><b><a name='l2h-83'><tt class='method'>generate_key</tt></a></b>(<var>type, bits</var>) -<dd> -Generate a public/private key pair of the type <var>type</var> (one of -<tt class="constant">TYPE_RSA</tt> and <tt class="constant">TYPE_DSA</tt>) with the size <var>bits</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-84'><tt class='method'>type</tt></a></b>() -<dd> -Return the type of the key. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509store.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-pkcs7.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509store.html">3.1.5 X509Store objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-pkcs7.html">3.1.7 PKCS7 objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-rand.html b/doc/html/openssl-rand.html deleted file mode 100644 index 46e7189..0000000 --- a/doc/html/openssl-rand.html +++ /dev/null @@ -1,185 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.2 rand -- An interface to the OpenSSL pseudo random number generator </title> -<META NAME="description" CONTENT="3.2 rand -- An interface to the OpenSSL pseudo random number generator "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-ssl.html"> -<LINK REL="previous" href="openssl-crypto.html"> -<LINK REL="up" href="openssl.html"> -<LINK REL="next" href="openssl-ssl.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="revoked.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-ssl.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="revoked.html">3.1.12 Revoked objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-ssl.html">3.3 SSL </A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H2><A NAME="SECTION000420000000000000000"> </A> -<BR> -3.2 <tt class="module">rand</tt> -- An interface to the OpenSSL pseudo random number generator -</H2> - -<P> - - -<P> -This module handles the OpenSSL pseudo random number generator (PRNG) and -declares the following: - -<P> -<dl><dt><b><a name='l2h-117'><tt class='function'>add</tt></a></b>(<var>string, entropy</var>) -<dd> -Mix bytes from <var>string</var> into the PRNG state. The <var>entropy</var> argument is -(the lower bound of) an estimate of how much randomness is contained in -<var>string</var>, measured in bytes. For more information, see e.g. <a class="rfc" name="rfcref-2324" -href="http://www.ietf.org/rfc/rfc1750.txt">RFC 1750</a>. -</dl> - -<P> -<dl><dt><b><a name='l2h-118'><tt class='function'>bytes</tt></a></b>(<var>num_bytes</var>) -<dd> -Get some random bytes from the PRNG as a string. - -<P> -This is a wrapper for the C function <tt class="function">RAND_bytes</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-119'><tt class='function'>cleanup</tt></a></b>() -<dd> -Erase the memory used by the PRNG. - -<P> -This is a wrapper for the C function <tt class="function">RAND_cleanup</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-120'><tt class='function'>egd</tt></a></b>(<var>path</var><big>[</big><var>, bytes</var><big>]</big>) -<dd> -Query the Entropy Gathering Daemon<A NAME="tex2html2" - HREF="#foot1227"><SUP>2</SUP></A> on socket <var>path</var> for <var>bytes</var> -bytes of random data and and uses <tt class="function">add</tt> to seed the PRNG. The default -value of <var>bytes</var> is 255. -</dl> - -<P> -<dl><dt><b><a name='l2h-121'><tt class='function'>load_file</tt></a></b>(<var>path</var><big>[</big><var>, bytes</var><big>]</big>) -<dd> -Read <var>bytes</var> bytes (or all of it, if <var>bytes</var> is negative) of data from -the file <var>path</var> to seed the PRNG. The default value of <var>bytes</var> is -1. -</dl> - -<P> -<dl><dt><b><a name='l2h-122'><tt class='function'>screen</tt></a></b>() -<dd> -Add the current contents of the screen to the PRNG state. -Availability: Windows. -</dl> - -<P> -<dl><dt><b><a name='l2h-123'><tt class='function'>seed</tt></a></b>(<var>string</var>) -<dd> -This is equivalent to calling <tt class="function">add</tt> with <var>entropy</var> as the length -of the string. -</dl> - -<P> -<dl><dt><b><a name='l2h-124'><tt class='function'>status</tt></a></b>() -<dd> -Returns true if the PRNG has been seeded with enough data, and false otherwise. -</dl> - -<P> -<dl><dt><b><a name='l2h-125'><tt class='function'>write_file</tt></a></b>(<var>path</var>) -<dd> -Write a number of random bytes (currently 1024) to the file <var>path</var>. This -file can then be used with <tt class="function">load_file</tt> to seed the PRNG again. -</dl> - -<P> -<dl><dt><b>exception <a name='l2h-126'><tt class='exception'>Error</tt></a></b> -<dd> -If the current RAND method supports any errors, this is raised when needed. -The default method does not raise this when the entropy pool is depleted. - -<P> -Whenever this exception is raised directly, it has a list of error messages -from the OpenSSL error queue, where each item is a tuple <code>(<var>lib</var>, -<var>function</var>, <var>reason</var>)</code>. Here <var>lib</var>, <var>function</var> and <var>reason</var> -are all strings, describing where and what the problem is. See <span class='manpage'><i>err</i>(3)</span> -for more information. -</dl> - -<P> -<BR><HR><H4>Footnotes</H4> -<DL> -<DT><A NAME="foot1227">... Daemon</A><A - href="openssl-rand.html#tex2html2"><SUP>2</SUP></A></DT> -<DD>See -<a class="url" href="http://www.lothar.com/tech/crypto/">http://www.lothar.com/tech/crypto/</a> - -</DD> -</DL> -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="revoked.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-ssl.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="revoked.html">3.1.12 Revoked objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-ssl.html">3.3 SSL </A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-ssl.html b/doc/html/openssl-ssl.html deleted file mode 100644 index a607e41..0000000 --- a/doc/html/openssl-ssl.html +++ /dev/null @@ -1,264 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.3 SSL -- An interface to the SSL-specific parts of OpenSSL </title> -<META NAME="description" CONTENT="3.3 SSL -- An interface to the SSL-specific parts of OpenSSL "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="previous" href="openssl-rand.html"> -<LINK REL="up" href="openssl.html"> -<LINK REL="next" href="openssl-context.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-rand.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-context.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-rand.html">3.2 rand </A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-context.html">3.3.1 Context objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H2><A NAME="SECTION000430000000000000000"> </A> -<BR> -3.3 <tt class="module">SSL</tt> -- An interface to the SSL-specific parts of OpenSSL -</H2> - -<P> - - -<P> -This module handles things specific to SSL. There are two objects defined: -Context, Connection. - -<P> -<dl><dt><b><a name='l2h-128'><tt>SSLv2_METHOD</tt></a></b> -<dd> -<dt><b><a name='l2h-142'><tt>SSLv3_METHOD</tt></a></b><dd> -<dt><b><a name='l2h-143'><tt>SSLv23_METHOD</tt></a></b><dd> -<dt><b><a name='l2h-144'><tt>TLSv1_METHOD</tt></a></b><dd> -These constants represent the different SSL methods to use when creating a -context object. -</dl> - -<P> -<dl><dt><b><a name='l2h-129'><tt>VERIFY_NONE</tt></a></b> -<dd> -<dt><b><a name='l2h-145'><tt>VERIFY_PEER</tt></a></b><dd> -<dt><b><a name='l2h-146'><tt>VERIFY_FAIL_IF_NO_PEER_CERT</tt></a></b><dd> -These constants represent the verification mode used by the Context -object's <tt class="method">set_verify</tt> method. -</dl> - -<P> -<dl><dt><b><a name='l2h-130'><tt>FILETYPE_PEM</tt></a></b> -<dd> -<dt><b><a name='l2h-147'><tt>FILETYPE_ASN1</tt></a></b><dd> -File type constants used with the <tt class="method">use_certificate_file</tt> and -<tt class="method">use_privatekey_file</tt> methods of Context objects. -</dl> - -<P> -<dl><dt><b><a name='l2h-131'><tt>OP_SINGLE_DH_USE</tt></a></b> -<dd> -<dt><b><a name='l2h-148'><tt>OP_EPHEMERAL_RSA</tt></a></b><dd> -<dt><b><a name='l2h-149'><tt>OP_NO_SSLv2</tt></a></b><dd> -<dt><b><a name='l2h-150'><tt>OP_NO_SSLv3</tt></a></b><dd> -<dt><b><a name='l2h-151'><tt>OP_NO_TLSv1</tt></a></b><dd> -Constants used with <tt class="method">set_options</tt> of Context objects. -<tt class="constant">OP_SINGLE_DH_USE</tt> means to always create a new key when using ephemeral -Diffie-Hellman. <tt class="constant">OP_EPHEMERAL_RSA</tt> means to always use ephemeral RSA keys -when doing RSA operations. <tt class="constant">OP_NO_SSLv2</tt>, <tt class="constant">OP_NO_SSLv3</tt> and -<tt class="constant">OP_NO_TLSv1</tt> means to disable those specific protocols. This is -interesting if you're using e.g. <tt class="constant">SSLv23_METHOD</tt> to get an SSLv2-compatible -handshake, but don't want to use SSLv2. -</dl> - -<P> -<dl><dt><b><a name='l2h-132'><tt>ContextType</tt></a></b> -<dd> -See <tt class="class">Context</tt>. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-133'><tt class='class'>Context</tt></a></b>(<var>method</var>) -<dd> -A class representing SSL contexts. Contexts define the parameters of one or -more SSL connections. - -<P> -<var>method</var> should be <tt class="constant">SSLv2_METHOD</tt>, <tt class="constant">SSLv3_METHOD</tt>, -<tt class="constant">SSLv23_METHOD</tt> or <tt class="constant">TLSv1_METHOD</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-134'><tt>ConnectionType</tt></a></b> -<dd> -See <tt class="class">Connection</tt>. -</dl> - -<P> -<dl><dt><b>class <a name='l2h-135'><tt class='class'>Connection</tt></a></b>(<var>context, socket</var>) -<dd> -A class representing SSL connections. - -<P> -<var>context</var> should be an instance of <tt class="class">Context</tt> and <var>socket</var> -should be a socket <A NAME="tex2html4" - HREF="#foot1231"><SUP>3</SUP></A> object. <var>socket</var> may be -<var>None</var>; in this case, the Connection is created with a memory BIO: see -the <tt class="method">bio_read</tt>, <tt class="method">bio_write</tt>, and <tt class="method">bio_shutdown</tt> -methods. -</dl> - -<P> -<dl><dt><b>exception <a name='l2h-136'><tt class='exception'>Error</tt></a></b> -<dd> -This exception is used as a base class for the other SSL-related -exceptions, but may also be raised directly. - -<P> -Whenever this exception is raised directly, it has a list of error messages -from the OpenSSL error queue, where each item is a tuple <code>(<var>lib</var>, -<var>function</var>, <var>reason</var>)</code>. Here <var>lib</var>, <var>function</var> and <var>reason</var> -are all strings, describing where and what the problem is. See <span class='manpage'><i>err</i>(3)</span> -for more information. -</dl> - -<P> -<dl><dt><b>exception <a name='l2h-137'><tt class='exception'>ZeroReturnError</tt></a></b> -<dd> -This exception matches the error return code <code>SSL_ERROR_ZERO_RETURN</code>, and -is raised when the SSL Connection has been closed. In SSL 3.0 and TLS 1.0, this -only occurs if a closure alert has occurred in the protocol, i.e. the -connection has been closed cleanly. Note that this does not necessarily -mean that the transport layer (e.g. a socket) has been closed. - -<P> -It may seem a little strange that this is an exception, but it does match an -<code>SSL_ERROR</code> code, and is very convenient. -</dl> - -<P> -<dl><dt><b>exception <a name='l2h-138'><tt class='exception'>WantReadError</tt></a></b> -<dd> -The operation did not complete; the same I/O method should be called again -later, with the same arguments. Any I/O method can lead to this since new -handshakes can occur at any time. - -<P> -The wanted read is for <i>dirty</i> data sent over the network, not the -<i>clean</i> data inside the tunnel. For a socket based SSL connection, -<i>read</i> means data coming at us over the network. Until that read -succeeds, the attempted <tt class="method">OpenSSL.SSL.Connection.recv</tt>, -<tt class="method">OpenSSL.SSL.Connection.send</tt>, or -<tt class="method">OpenSSL.SSL.Connection.do_handshake</tt> is prevented or incomplete. You -probably want to <tt class="method">select()</tt> on the socket before trying again. -</dl> - -<P> -<dl><dt><b>exception <a name='l2h-139'><tt class='exception'>WantWriteError</tt></a></b> -<dd> -See <tt class="exception">WantReadError</tt>. The socket send buffer may be too full to -write more data. -</dl> - -<P> -<dl><dt><b>exception <a name='l2h-140'><tt class='exception'>WantX509LookupError</tt></a></b> -<dd> -The operation did not complete because an application callback has asked to be -called again. The I/O method should be called again later, with the same -arguments. Note: This won't occur in this version, as there are no such -callbacks in this version. -</dl> - -<P> -<dl><dt><b>exception <a name='l2h-141'><tt class='exception'>SysCallError</tt></a></b> -<dd> -The <tt class="exception">SysCallError</tt> occurs when there's an I/O error and OpenSSL's -error queue does not contain any information. This can mean two things: An -error in the transport protocol, or an end of file that violates the protocol. -The parameter to the exception is always a pair <code>(<var>errnum</var>, -<var>errstr</var>)</code>. -</dl> - -<P> -<BR><HR><H4>Footnotes</H4> -<DL> -<DT><A NAME="foot1231">... socket</A><A - href="openssl-ssl.html#tex2html4"><SUP>3</SUP></A></DT> -<DD>Actually, all that is required is an object -that <i>behaves</i> like a socket, you could even use files, even though -it'd be tricky to get the handshakes right! - -</DD> -</DL> -<p><hr> -<!--Table of Child-Links--> -<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A> - -<UL CLASS="ChildLinks"> -<LI><A NAME="tex2html303" - href="openssl-context.html">3.3.1 Context objects </A> -<LI><A NAME="tex2html304" - href="openssl-connection.html">3.3.2 Connection objects </A> -</UL> -<!--End of Table of Child-Links--> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-rand.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-context.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-rand.html">3.2 rand </A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl.html">3 OpenSSL </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-context.html">3.3.1 Context objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-x509.html b/doc/html/openssl-x509.html deleted file mode 100644 index ab814a3..0000000 --- a/doc/html/openssl-x509.html +++ /dev/null @@ -1,269 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.2 X509 objects </title> -<META NAME="description" CONTENT="3.1.2 X509 objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-x509name.html"> -<LINK REL="previous" href="openssl-x509ext.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-x509name.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509ext.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-x509name.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509ext.html">3.1.1 X509Extension objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-x509name.html">3.1.3 X509Name objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000412000000000000000"> </A> -<BR> -3.1.2 X509 objects -</H3> - -<P> -X509 objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-41'><tt class='method'>get_issuer</tt></a></b>() -<dd> -Return an X509Name object representing the issuer of the certificate. -</dl> - -<P> -<dl><dt><b><a name='l2h-42'><tt class='method'>get_pubkey</tt></a></b>() -<dd> -Return a PKey object representing the public key of the certificate. -</dl> - -<P> -<dl><dt><b><a name='l2h-43'><tt class='method'>get_serial_number</tt></a></b>() -<dd> -Return the certificate serial number. -</dl> - -<P> -<dl><dt><b><a name='l2h-44'><tt class='method'>get_subject</tt></a></b>() -<dd> -Return an X509Name object representing the subject of the certificate. -</dl> - -<P> -<dl><dt><b><a name='l2h-45'><tt class='method'>get_version</tt></a></b>() -<dd> -Return the certificate version. -</dl> - -<P> -<dl><dt><b><a name='l2h-46'><tt class='method'>get_notBefore</tt></a></b>() -<dd> -Return a string giving the time before which the certificate is not valid. The -string is formatted as an ASN1 GENERALIZEDTIME: -<dl><dd><pre class="verbatim"> - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm -</pre></dl> -If no value exists for this field, <code>None</code> is returned. -</dl> - -<P> -<dl><dt><b><a name='l2h-47'><tt class='method'>get_notAfter</tt></a></b>() -<dd> -Return a string giving the time after which the certificate is not valid. The -string is formatted as an ASN1 GENERALIZEDTIME: -<dl><dd><pre class="verbatim"> - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm -</pre></dl> -If no value exists for this field, <code>None</code> is returned. -</dl> - -<P> -<dl><dt><b><a name='l2h-48'><tt class='method'>set_notBefore</tt></a></b>(<var>when</var>) -<dd> -Change the time before which the certificate is not valid. <var>when</var> is a -string formatted as an ASN1 GENERALIZEDTIME: -<dl><dd><pre class="verbatim"> - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm -</pre></dl> -</dl> - -<P> -<dl><dt><b><a name='l2h-49'><tt class='method'>set_notAfter</tt></a></b>(<var>when</var>) -<dd> -Change the time after which the certificate is not valid. <var>when</var> is a -string formatted as an ASN1 GENERALIZEDTIME: -<dl><dd><pre class="verbatim"> - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm -</pre></dl> -</dl> - -<P> -<dl><dt><b><a name='l2h-50'><tt class='method'>gmtime_adj_notBefore</tt></a></b>(<var>time</var>) -<dd> -Adjust the timestamp (in GMT) when the certificate starts being valid. -</dl> - -<P> -<dl><dt><b><a name='l2h-51'><tt class='method'>gmtime_adj_notAfter</tt></a></b>(<var>time</var>) -<dd> -Adjust the timestamp (in GMT) when the certificate stops being valid. -</dl> - -<P> -<dl><dt><b><a name='l2h-52'><tt class='method'>has_expired</tt></a></b>() -<dd> -Checks the certificate's time stamp against current time. Returns true if the -certificate has expired and false otherwise. -</dl> - -<P> -<dl><dt><b><a name='l2h-53'><tt class='method'>set_issuer</tt></a></b>(<var>issuer</var>) -<dd> -Set the issuer of the certificate to <var>issuer</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-54'><tt class='method'>set_pubkey</tt></a></b>(<var>pkey</var>) -<dd> -Set the public key of the certificate to <var>pkey</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-55'><tt class='method'>set_serial_number</tt></a></b>(<var>serialno</var>) -<dd> -Set the serial number of the certificate to <var>serialno</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-56'><tt class='method'>set_subject</tt></a></b>(<var>subject</var>) -<dd> -Set the subject of the certificate to <var>subject</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-57'><tt class='method'>set_version</tt></a></b>(<var>version</var>) -<dd> -Set the certificate version to <var>version</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-58'><tt class='method'>sign</tt></a></b>(<var>pkey, digest</var>) -<dd> -Sign the certificate, using the key <var>pkey</var> and the message digest algorithm -identified by the string <var>digest</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-59'><tt class='method'>subject_name_hash</tt></a></b>() -<dd> -Return the hash of the certificate subject. -</dl> - -<P> -<dl><dt><b><a name='l2h-60'><tt class='method'>digest</tt></a></b>(<var>digest_name</var>) -<dd> -Return a digest of the certificate, using the <var>digest_name</var> method. -<var>digest_name</var> must be a string describing a digest algorithm supported -by OpenSSL (by EVP_get_digestbyname, specifically). For example, -<tt class="constant">"md5"</tt> or <tt class="constant">"sha1"</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-61'><tt class='method'>add_extensions</tt></a></b>(<var>extensions</var>) -<dd> -Add the extensions in the sequence <var>extensions</var> to the certificate. -</dl> - -<P> -<dl><dt><b><a name='l2h-62'><tt class='method'>get_extension_count</tt></a></b>() -<dd> -Return the number of extensions on this certificate. - -<span class='versionnote'>New in version 0.12.</span> - -</dl> - -<P> -<dl><dt><b><a name='l2h-63'><tt class='method'>get_extension</tt></a></b>(<var>index</var>) -<dd> -Retrieve the extension on this certificate at the given index. - -<P> -Extensions on a certificate are kept in order. The index parameter selects -which extension will be returned. The returned object will be an X509Extension -instance. - -<span class='versionnote'>New in version 0.12.</span> - -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509ext.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-x509name.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509ext.html">3.1.1 X509Extension objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-x509name.html">3.1.3 X509Name objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-x509name.html b/doc/html/openssl-x509name.html deleted file mode 100644 index e5bbdec..0000000 --- a/doc/html/openssl-x509name.html +++ /dev/null @@ -1,159 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.3 X509Name objects </title> -<META NAME="description" CONTENT="3.1.3 X509Name objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-x509req.html"> -<LINK REL="previous" href="openssl-x509.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-x509req.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-x509req.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509.html">3.1.2 X509 objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-x509req.html">3.1.4 X509Req objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000413000000000000000"> </A> -<BR> -3.1.3 X509Name objects -</H3> - -<P> -X509Name objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-64'><tt class='method'>hash</tt></a></b>() -<dd> -Return an integer giving the first four bytes of the MD5 digest of the DER -representation of the name. -</dl> - -<P> -<dl><dt><b><a name='l2h-65'><tt class='method'>der</tt></a></b>() -<dd> -Return a string giving the DER representation of the name. -</dl> - -<P> -<dl><dt><b><a name='l2h-66'><tt class='method'>get_components</tt></a></b>() -<dd> -Return a list of two-tuples of strings giving the components of the name. -</dl> - -<P> -X509Name objects have the following members: - -<P> -<dl><dt><b><a name='l2h-67'><tt class='member'>countryName</tt></a></b> -<dd> -The country of the entity. <code>C</code> may be used as an alias for -<code>countryName</code>. -</dl> - -<P> -<dl><dt><b><a name='l2h-68'><tt class='member'>stateOrProvinceName</tt></a></b> -<dd> -The state or province of the entity. <code>ST</code> may be used as an alias for -<code>stateOrProvinceName</code>· -</dl> - -<P> -<dl><dt><b><a name='l2h-69'><tt class='member'>localityName</tt></a></b> -<dd> -The locality of the entity. <code>L</code> may be used as an alias for -<code>localityName</code>. -</dl> - -<P> -<dl><dt><b><a name='l2h-70'><tt class='member'>organizationName</tt></a></b> -<dd> -The organization name of the entity. <code>O</code> may be used as an alias for -<code>organizationName</code>. -</dl> - -<P> -<dl><dt><b><a name='l2h-71'><tt class='member'>organizationalUnitName</tt></a></b> -<dd> -The organizational unit of the entity. <code>OU</code> may be used as an alias for -<code>organizationalUnitName</code>. -</dl> - -<P> -<dl><dt><b><a name='l2h-72'><tt class='member'>commonName</tt></a></b> -<dd> -The common name of the entity. <code>CN</code> may be used as an alias for -<code>commonName</code>. -</dl> - -<P> -<dl><dt><b><a name='l2h-73'><tt class='member'>emailAddress</tt></a></b> -<dd> -The e-mail address of the entity. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-x509req.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509.html">3.1.2 X509 objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-x509req.html">3.1.4 X509Req objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-x509req.html b/doc/html/openssl-x509req.html deleted file mode 100644 index 3625c27..0000000 --- a/doc/html/openssl-x509req.html +++ /dev/null @@ -1,133 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.4 X509Req objects </title> -<META NAME="description" CONTENT="3.1.4 X509Req objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-x509store.html"> -<LINK REL="previous" href="openssl-x509name.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-x509store.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509name.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-x509store.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509name.html">3.1.3 X509Name objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-x509store.html">3.1.5 X509Store objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000414000000000000000"> </A> -<BR> -3.1.4 X509Req objects -</H3> - -<P> -X509Req objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-74'><tt class='method'>get_pubkey</tt></a></b>() -<dd> -Return a PKey object representing the public key of the certificate request. -</dl> - -<P> -<dl><dt><b><a name='l2h-75'><tt class='method'>get_subject</tt></a></b>() -<dd> -Return an X509Name object representing the subject of the certificate. -</dl> - -<P> -<dl><dt><b><a name='l2h-76'><tt class='method'>set_pubkey</tt></a></b>(<var>pkey</var>) -<dd> -Set the public key of the certificate request to <var>pkey</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-77'><tt class='method'>sign</tt></a></b>(<var>pkey, digest</var>) -<dd> -Sign the certificate request, using the key <var>pkey</var> and the message digest -algorithm identified by the string <var>digest</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-78'><tt class='method'>verify</tt></a></b>(<var>pkey</var>) -<dd> -Verify a certificate request using the public key <var>pkey</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-79'><tt class='method'>set_version</tt></a></b>(<var>version</var>) -<dd> -Set the version (RFC 2459, 4.1.2.1) of the certificate request to -<var>version</var>. -</dl> - -<P> -<dl><dt><b><a name='l2h-80'><tt class='method'>get_version</tt></a></b>() -<dd> -Get the version (RFC 2459, 4.1.2.1) of the certificate request. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509name.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-x509store.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509name.html">3.1.3 X509Name objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-x509store.html">3.1.5 X509Store objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl-x509store.html b/doc/html/openssl-x509store.html deleted file mode 100644 index 03d589e..0000000 --- a/doc/html/openssl-x509store.html +++ /dev/null @@ -1,95 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.5 X509Store objects </title> -<META NAME="description" CONTENT="3.1.5 X509Store objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="openssl-pkey.html"> -<LINK REL="previous" href="openssl-x509req.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-pkey.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509req.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-pkey.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509req.html">3.1.4 X509Req objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-pkey.html">3.1.6 PKey objects</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION000415000000000000000"> </A> -<BR> -3.1.5 X509Store objects -</H3> - -<P> -The X509Store object has currently just one method: - -<P> -<dl><dt><b><a name='l2h-81'><tt class='method'>add_cert</tt></a></b>(<var>cert</var>) -<dd> -Add the certificate <var>cert</var> to the certificate store. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="openssl-x509req.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-pkey.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="openssl-x509req.html">3.1.4 X509Req objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-pkey.html">3.1.6 PKey objects</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/openssl.html b/doc/html/openssl.html deleted file mode 100644 index 4ecc438..0000000 --- a/doc/html/openssl.html +++ /dev/null @@ -1,157 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3 OpenSSL -- Python interface to OpenSSL </title> -<META NAME="description" CONTENT="3 OpenSSL -- Python interface to OpenSSL "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="internals.html"> -<LINK REL="previous" href="building.html"> -<LINK REL="up" HREF="pyOpenSSL.html"> -<LINK REL="next" href="openssl-crypto.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="building-windows.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="building-windows.html">2.2 Building the Module</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H1><A NAME="SECTION000400000000000000000"> </A> -<BR> -3 <tt class="module">OpenSSL</tt> -- Python interface to OpenSSL -</H1> - -<P> - - -<P> -This package provides a high-level interface to the functions in the -OpenSSL library. The following modules are defined: - -<P> -<dl><dt><b><a name='l2h-2'><tt>crypto</tt></a></b> -<dd> -Generic cryptographic module. Note that if anything is incomplete, this module is! -</dl> - -<P> -<dl><dt><b><a name='l2h-3'><tt>rand</tt></a></b> -<dd> -An interface to the OpenSSL pseudo random number generator. -</dl> - -<P> -<dl><dt><b><a name='l2h-4'><tt>SSL</tt></a></b> -<dd> -An interface to the SSL-specific parts of OpenSSL. -</dl> - -<P> - -<p><hr> -<!--Table of Child-Links--> -<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A> - -<UL CLASS="ChildLinks"> -<LI><A NAME="tex2html113" - href="openssl-crypto.html">3.1 <tt class="module">crypto</tt> -- Generic cryptographic module </A> -<UL> -<LI><A NAME="tex2html114" - href="openssl-x509ext.html">3.1.1 X509Extension objects </A> -<LI><A NAME="tex2html115" - href="openssl-x509.html">3.1.2 X509 objects </A> -<LI><A NAME="tex2html116" - href="openssl-x509name.html">3.1.3 X509Name objects </A> -<LI><A NAME="tex2html117" - href="openssl-x509req.html">3.1.4 X509Req objects </A> -<LI><A NAME="tex2html118" - href="openssl-x509store.html">3.1.5 X509Store objects </A> -<LI><A NAME="tex2html119" - href="openssl-pkey.html">3.1.6 PKey objects </A> -<LI><A NAME="tex2html120" - href="openssl-pkcs7.html">3.1.7 PKCS7 objects </A> -<LI><A NAME="tex2html121" - href="openssl-pkcs12.html">3.1.8 PKCS12 objects </A> -<LI><A NAME="tex2html122" - href="openssl-509ext.html">3.1.9 X509Extension objects </A> -<LI><A NAME="tex2html123" - href="openssl-netscape-spki.html">3.1.10 NetscapeSPKI objects </A> -<LI><A NAME="tex2html124" - href="crl.html">3.1.11 CRL objects </A> -<LI><A NAME="tex2html125" - href="revoked.html">3.1.12 Revoked objects </A> -</UL> -<BR> -<LI><A NAME="tex2html126" - href="openssl-rand.html">3.2 <tt class="module">rand</tt> -- An interface to the OpenSSL pseudo random number generator </A> -<LI><A NAME="tex2html127" - href="openssl-ssl.html">3.3 <tt class="module">SSL</tt> -- An interface to the SSL-specific parts of OpenSSL </A> -<UL> -<LI><A NAME="tex2html128" - href="openssl-context.html">3.3.1 Context objects </A> -<LI><A NAME="tex2html129" - href="openssl-connection.html">3.3.2 Connection objects </A> -</UL></UL> -<!--End of Table of Child-Links--> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="building-windows.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A HREF="pyOpenSSL.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="building-windows.html">2.2 Building the Module</A> -<b class="navlabel">Up:</b> <a class="sectref" HREF="pyOpenSSL.html">Python OpenSSL Manual</A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/previous.gif b/doc/html/previous.gif Binary files differdeleted file mode 100644 index de1da16..0000000 --- a/doc/html/previous.gif +++ /dev/null diff --git a/doc/html/pyOpenSSL.css b/doc/html/pyOpenSSL.css deleted file mode 100644 index 767cf74..0000000 --- a/doc/html/pyOpenSSL.css +++ /dev/null @@ -1,88 +0,0 @@ -/* - * The first part of this is the standard CSS generated by LaTeX2HTML, - * with the "empty" declarations removed. - */ - -/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ -.math { font-family: "Century Schoolbook", serif; } -.math i { font-family: "Century Schoolbook", serif; - font-weight: bold } -.boldmath { font-family: "Century Schoolbook", serif; - font-weight: bold } - -/* Implement both fixed-size and relative sizes: */ -small.xtiny { font-size : xx-small } -small.tiny { font-size : x-small } -small.scriptsize { font-size : smaller } -small.footnotesize { font-size : small } -big.xlarge { font-size : large } -big.xxlarge { font-size : x-large } -big.huge { font-size : larger } -big.xhuge { font-size : xx-large } - -/* - * Document-specific styles come next; - * these are added for the Python documentation. - * - * Note that the size specifications for the H* elements are because - * Netscape on Solaris otherwise doesn't get it right; they all end up - * the normal text size. - */ - -body { color: #000000; - background-color: #ffffff; } - -a:active { color: #ff0000; } -a:visited { color: #551a8b; } -a:link { color: #0000bb; } - -h1, h2, h3, h4, h5, h6 { font-family: avantgarde, sans-serif; - font-weight: bold } -h1 { font-size: 180% } -h2 { font-size: 150% } -h3, h4 { font-size: 120% } -code, tt { font-family: monospace } -var { font-family: times, serif; - font-style: italic; - font-weight: normal } - -.navigation td { background-color: #99ccff; - font-weight: bold; - font-family: avantgarde, sans-serif; - font-size: 110% } - -.release-info { font-style: italic; } - -.titlegraphic { vertical-align: top; } - -.verbatim { color: #00008b } - -.email { font-family: avantgarde, sans-serif } -.mimetype { font-family: avantgarde, sans-serif } -.newsgroup { font-family: avantgarde, sans-serif } -.url { font-family: avantgarde, sans-serif } -.file { font-family: avantgarde, sans-serif } - -.tableheader { background-color: #99ccff; - font-family: avantgarde, sans-serif; } - -.refcount-info { font-style: italic } -.refcount-info .value { font-weight: bold; - color: #006600 } - -/* - * Some decoration for the "See also:" blocks, in part inspired by some of - * the styling on Lars Marius Garshol's XSA pages. - * (The blue in the navigation bars is #99CCFF.) - */ -.seealso { background-color: #fffaf0; - border: thin solid black; - padding: 4pt } - -.seealso .heading { font-size: 110% } - -/* - * Class 'availability' is used for module availability statements at - * the top of modules. - */ -.availability .platform { font-weight: bold } diff --git a/doc/html/pyOpenSSL.how b/doc/html/pyOpenSSL.how deleted file mode 100644 index 2464192..0000000 --- a/doc/html/pyOpenSSL.how +++ /dev/null @@ -1 +0,0 @@ -+++ perl /home/exarkun/Projects/pyOpenSSL/trunk/doc/tools/node2label.pl *.html diff --git a/doc/html/pyOpenSSL.html b/doc/html/pyOpenSSL.html deleted file mode 100644 index c5d7e7a..0000000 --- a/doc/html/pyOpenSSL.html +++ /dev/null @@ -1,173 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>Python OpenSSL Manual</title> -<META NAME="description" CONTENT="Python OpenSSL Manual"> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="next" href="contents.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><A href="contents.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Next:</b> <a class="sectref" href="contents.html">Contents</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<P> - -<div class="titlepage"> -<center> -<h1>Python OpenSSL Manual</h1> -<p><b><font size='+2'>Jean-Paul Calderone</font></b></p> -<p><span class="email">exarkun@twistedmatrix.com</span></p> -<p> -</center> -</div> - -<P> - -<H3>Abstract:</H3> -<DIV CLASS="ABSTRACT"> - -This module is a rather thin wrapper around (a subset of) the OpenSSL library. -With thin wrapper I mean that a lot of the object methods do nothing more than -calling a corresponding function in the OpenSSL library. -</DIV> -<P> - -<P> - -<p><hr> -<!--Table of Child-Links--> - - -<UL CLASS="ChildLinks"> -<LI><A NAME="tex2html8" - href="contents.html">Contents</A> -<LI><A NAME="tex2html9" - href="intro.html">1 Introduction </A> -<LI><A NAME="tex2html10" - href="building.html">2 Building and Installing </A> -<UL> -<LI><A NAME="tex2html11" - href="building-unix.html">2.1 Building the Module on a Unix System </A> -<LI><A NAME="tex2html12" - href="building-windows.html">2.2 Building the Module on a Windows System </A> -</UL> -<BR> -<LI><A NAME="tex2html13" - href="openssl.html">3 <tt class="module">OpenSSL</tt> -- Python interface to OpenSSL </A> -<UL> -<LI><A NAME="tex2html14" - href="openssl-crypto.html">3.1 <tt class="module">crypto</tt> -- Generic cryptographic module </A> -<UL> -<LI><A NAME="tex2html15" - href="openssl-x509ext.html">3.1.1 X509Extension objects </A> -<LI><A NAME="tex2html16" - href="openssl-x509.html">3.1.2 X509 objects </A> -<LI><A NAME="tex2html17" - href="openssl-x509name.html">3.1.3 X509Name objects </A> -<LI><A NAME="tex2html18" - href="openssl-x509req.html">3.1.4 X509Req objects </A> -<LI><A NAME="tex2html19" - href="openssl-x509store.html">3.1.5 X509Store objects </A> -<LI><A NAME="tex2html20" - href="openssl-pkey.html">3.1.6 PKey objects </A> -<LI><A NAME="tex2html21" - href="openssl-pkcs7.html">3.1.7 PKCS7 objects </A> -<LI><A NAME="tex2html22" - href="openssl-pkcs12.html">3.1.8 PKCS12 objects </A> -<LI><A NAME="tex2html23" - href="openssl-509ext.html">3.1.9 X509Extension objects </A> -<LI><A NAME="tex2html24" - href="openssl-netscape-spki.html">3.1.10 NetscapeSPKI objects </A> -<LI><A NAME="tex2html25" - href="crl.html">3.1.11 CRL objects </A> -<LI><A NAME="tex2html26" - href="revoked.html">3.1.12 Revoked objects </A> -</UL> -<LI><A NAME="tex2html27" - href="openssl-rand.html">3.2 <tt class="module">rand</tt> -- An interface to the OpenSSL pseudo random number generator </A> -<LI><A NAME="tex2html28" - href="openssl-ssl.html">3.3 <tt class="module">SSL</tt> -- An interface to the SSL-specific parts of OpenSSL </A> -<UL> -<LI><A NAME="tex2html29" - href="openssl-context.html">3.3.1 Context objects </A> -<LI><A NAME="tex2html30" - href="openssl-connection.html">3.3.2 Connection objects </A> -</UL> -</UL> -<BR> -<LI><A NAME="tex2html31" - href="internals.html">4 Internals </A> -<UL> -<LI><A NAME="tex2html32" - href="exceptions.html">4.1 Exceptions </A> -<LI><A NAME="tex2html33" - href="callbacks.html">4.2 Callbacks </A> -<LI><A NAME="tex2html34" - href="socket-methods.html">4.3 Acessing Socket Methods </A> -</UL> -<BR> -<LI><A NAME="tex2html35" - href="about.html">About this document ...</A> -</UL> -<!--End of Table of Child-Links--> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><A href="contents.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Next:</b> <a class="sectref" href="contents.html">Contents</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/revoked.html b/doc/html/revoked.html deleted file mode 100644 index e2e5d9f..0000000 --- a/doc/html/revoked.html +++ /dev/null @@ -1,135 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>3.1.12 Revoked objects </title> -<META NAME="description" CONTENT="3.1.12 Revoked objects "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="previous" href="crl.html"> -<LINK REL="up" href="openssl-crypto.html"> -<LINK REL="next" href="openssl-rand.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="crl.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-rand.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="crl.html">3.1.11 CRL objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-rand.html">3.2 rand </A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H3><A NAME="SECTION0004112000000000000000"> </A> -<BR> -3.1.12 Revoked objects -</H3> - -<P> -Revoked objects have the following methods: - -<P> -<dl><dt><b><a name='l2h-109'><tt class='method'>all_reasons</tt></a></b>() -<dd> -Return a list of all supported reasons. -</dl> - -<P> -<dl><dt><b><a name='l2h-110'><tt class='method'>get_reason</tt></a></b>() -<dd> -Return the revocation reason as a str. Can be -None, which differs from "Unspecified". -</dl> - -<P> -<dl><dt><b><a name='l2h-111'><tt class='method'>get_rev_date</tt></a></b>() -<dd> -Return the revocation date as a str. -The string is formatted as an ASN1 GENERALIZEDTIME. -</dl> - -<P> -<dl><dt><b><a name='l2h-112'><tt class='method'>get_serial</tt></a></b>() -<dd> -Return a str containing a hex number of the serial of the revoked certificate. -</dl> - -<P> -<dl><dt><b><a name='l2h-113'><tt class='method'>set_reason</tt></a></b>(<var>reason</var>) -<dd> -Set the revocation reason. <var>reason</var> must -be None or a string, but the values are limited. -Spaces and case are ignored. See <tt class="method">all_reasons</tt>. -</dl> - -<P> -<dl><dt><b><a name='l2h-114'><tt class='method'>set_rev_date</tt></a></b>(<var>date</var>) -<dd> -Set the revocation date. -The string is formatted as an ASN1 GENERALIZEDTIME. -</dl> - -<P> -<dl><dt><b><a name='l2h-115'><tt class='method'>set_serial</tt></a></b>(<var>serial</var>) -<dd> -<var>serial</var> is a string containing a hex number of the serial of the revoked certificate. -</dl> - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="crl.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="openssl-crypto.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="openssl-rand.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="crl.html">3.1.11 CRL objects</A> -<b class="navlabel">Up:</b> <a class="sectref" href="openssl-crypto.html">3.1 crypto </A> -<b class="navlabel">Next:</b> <a class="sectref" href="openssl-rand.html">3.2 rand </A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/socket-methods.html b/doc/html/socket-methods.html deleted file mode 100644 index 46ecc01..0000000 --- a/doc/html/socket-methods.html +++ /dev/null @@ -1,119 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> -<title>4.3 Acessing Socket Methods </title> -<META NAME="description" CONTENT="4.3 Acessing Socket Methods "> -<META NAME="keywords" CONTENT="pyOpenSSL"> -<META NAME="resource-type" CONTENT="document"> -<META NAME="distribution" CONTENT="global"> -<link rel="STYLESHEET" href="pyOpenSSL.css"> -<LINK REL="previous" href="callbacks.html"> -<LINK REL="up" href="internals.html"> -<LINK REL="next" href="about.html"> -</head> -<body> -<DIV CLASS="navigation"> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="callbacks.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="internals.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="about.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="callbacks.html">4.2 Callbacks</A> -<b class="navlabel">Up:</b> <a class="sectref" href="internals.html">4 Internals</A> -<b class="navlabel">Next:</b> <a class="sectref" href="about.html">About this document ...</A> -<br><hr> -</DIV> -<!--End of Navigation Panel--> - -<H2><A NAME="SECTION000530000000000000000"> </A> -<BR> -4.3 Acessing Socket Methods -</H2> - -<P> -We quickly saw the benefit of wrapping socket methods in the -<tt class="class">SSL.Connection</tt> class, for an easy transition into using SSL. The -problem here is that the <tt class="module">socket</tt> module lacks a C API, and all the -methods are declared static. One approach would be to have <tt class="module">OpenSSL</tt> as -a submodule to the <tt class="module">socket</tt> module, placing all the code in -<span class="file">socketmodule.c</span>, but this is obviously not a good solution, since you -might not want to import tonnes of extra stuff you're not going to use when -importing the <tt class="module">socket</tt> module. The other approach is to somehow get a -pointer to the method to be called, either the C function, or a callable Python -object. This is not really a good solution either, since there's a lot of -lookups involved. - -<P> -The way it works is that you have to supply a ``<tt class="class">socket</tt>-like'' transport -object to the <tt class="class">SSL.Connection</tt>. The only requirement of this object is -that it has a <tt class="method">fileno()</tt> method that returns a file descriptor that's -valid at the C level (i.e. you can use the system calls read and write). If you -want to use the <tt class="method">connect()</tt> or <tt class="method">accept()</tt> methods of the -<tt class="class">SSL.Connection</tt> object, the transport object has to supply such -methods too. Apart from them, any method lookups in the <tt class="class">SSL.Connection</tt> -object that fail are passed on to the underlying transport object. - -<P> -Future changes might be to allow Python-level transport objects, that instead -of having <tt class="method">fileno()</tt> methods, have <tt class="method">read()</tt> and <tt class="method">write()</tt> -methods, so more advanced features of Python can be used. This would probably -entail some sort of OpenSSL ``BIOs'', but converting Python strings back and -forth is expensive, so this shouldn't be used unless necessary. Other nice -things would be to be able to pass in different transport objects for reading -and writing, but then the <tt class="method">fileno()</tt> method of <tt class="class">SSL.Connection</tt> -becomes virtually useless. Also, should the method resolution be used on the -read-transport or the write-transport? - -<P> - -<DIV CLASS="navigation"> -<p><hr> -<table align="center" width="100%" cellpadding="0" cellspacing="2"> -<tr> -<td><A href="callbacks.html"><img src="previous.gif" - border="0" height="32" - alt="Previous Page" width="32"></A></td> -<td><A href="internals.html"><img src="up.gif" - border="0" height="32" - alt="Up One Level" width="32"></A></td> -<td><A href="about.html"><img src="next.gif" - border="0" height="32" - alt="Next Page" width="32"></A></td> -<td align="center" width="100%">Python OpenSSL Manual</td> -<td><A href="contents.html"><img src="contents.gif" - border="0" height="32" - alt="Contents" width="32"></A></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -<td><img src="blank.gif" - border="0" height="32" - alt="" width="32"></td> -</tr></table> -<b class="navlabel">Previous:</b> <a class="sectref" href="callbacks.html">4.2 Callbacks</A> -<b class="navlabel">Up:</b> <a class="sectref" href="internals.html">4 Internals</A> -<b class="navlabel">Next:</b> <a class="sectref" href="about.html">About this document ...</A> -<hr> -<span class="release-info">Release 0.12.</span> -</DIV> -<!--End of Navigation Panel--> - -</BODY> -</HTML> diff --git a/doc/html/up.gif b/doc/html/up.gif Binary files differdeleted file mode 100644 index a9d3e13..0000000 --- a/doc/html/up.gif +++ /dev/null diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..a63df87 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,27 @@ +Welcome to pyOpenSSL's documentation! +===================================== + +.. topic:: Abstract + + This module is a rather thin wrapper around (a subset of) the OpenSSL library. + With thin wrapper I mean that a lot of the object methods do nothing more than + calling a corresponding function in the OpenSSL library. + + +Contents: + +.. toctree:: + :maxdepth: 3 + + introduction + install + api + internals + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/doc/install.rst b/doc/install.rst new file mode 100644 index 0000000..f525726 --- /dev/null +++ b/doc/install.rst @@ -0,0 +1,69 @@ +.. _building: + +Building and Installing +======================= + +These instructions can also be found in the file ``INSTALL``. + +I have tested this on Debian Linux systems (woody and sid), Solaris 2.6 and +2.7. Others have successfully compiled it on Windows and NT. + +.. _building-unix: + +Building the Module on a Unix System +------------------------------------ + +pyOpenSSL uses distutils, so there really shouldn't be any problems. To build +the library:: + + python setup.py build + +If your OpenSSL header files aren't in ``/usr/include``, you may need to supply +the ``-I`` flag to let the setup script know where to look. The same goes for +the libraries of course, use the ``-L`` flag. Note that ``build`` won't accept +these flags, so you have to run first ``build_ext`` and then ``build``! +Example:: + + python setup.py build_ext -I/usr/local/ssl/include -L/usr/local/ssl/lib + python setup.py build + +Now you should have a directory called ``OpenSSL`` that contains e.g. +``SSL.so`` and ``__init__.py`` somewhere in the build dicrectory, +so just:: + + python setup.py install + +If you, for some arcane reason, don't want the module to appear in the +``site-packages`` directory, use the ``--prefix`` option. + +You can, of course, do:: + + python setup.py --help + +to find out more about how to use the script. + +.. _building-windows: + +Building the Module on a Windows System +--------------------------------------- + +Big thanks to Itamar Shtull-Trauring and Oleg Orlov for their help with +Windows build instructions. Same as for Unix systems, we have to separate +the ``build_ext`` and the ``build``. + +Building the library:: + + setup.py build_ext -I ...\openssl\inc32 -L ...\openssl\out32dll + setup.py build + +Where ``...\openssl`` is of course the location of your OpenSSL installation. + +Installation is the same as for Unix systems:: + + setup.py install + +And similarily, you can do:: + + setup.py --help + +to get more information. diff --git a/doc/internals.rst b/doc/internals.rst new file mode 100644 index 0000000..839c446 --- /dev/null +++ b/doc/internals.rst @@ -0,0 +1,97 @@ +.. _internals: + +Internals +========= + +We ran into three main problems developing this: Exceptions, callbacks and +accessing socket methods. This is what this chapter is about. + + +.. _exceptions: + +Exceptions +---------- + +We realized early that most of the exceptions would be raised by the I/O +functions of OpenSSL, so it felt natural to mimic OpenSSL's error code system, +translating them into Python exceptions. This naturally gives us the exceptions +:py:exc:`.SSL.ZeroReturnError`, :py:exc:`.SSL.WantReadError`, +:py:exc:`.SSL.WantWriteError`, :py:exc:`.SSL.WantX509LookupError` and +:py:exc:`.SSL.SysCallError`. + +For more information about this, see section :ref:`openssl-ssl`. + + +.. _callbacks: + +Callbacks +--------- + +There are a number of problems with callbacks. First of all, OpenSSL is written +as a C library, it's not meant to have Python callbacks, so a way around that +is needed. Another problem is thread support. A lot of the OpenSSL I/O +functions can block if the socket is in blocking mode, and then you want other +Python threads to be able to do other things. The real trouble is if you've +released the global CPython interpreter lock to do a potentially blocking +operation, and the operation calls a callback. Then we must take the GIL back, +since calling Python APIs without holding it is not allowed. + +There are two solutions to the first problem, both of which are necessary. The +first solution to use is if the C callback allows ''userdata'' to be passed to +it (an arbitrary pointer normally). This is great! We can set our Python +function object as the real userdata and emulate userdata for the Python +function in another way. The other solution can be used if an object with an +''app_data'' system always is passed to the callback. For example, the SSL +object in OpenSSL has app_data functions and in e.g. the verification +callbacks, you can retrieve the related SSL object. What we do is to set our +wrapper :py:class:`.Connection` object as app_data for the SSL object, and we can +easily find the Python callback. + +The other problem is solved using thread local variables. Whenever the GIL is +released before calling into an OpenSSL API, the PyThreadState pointer returned +by :c:func:`PyEval_SaveState` is stored in a global thread local variable +(using Python's own TLS API, :c:func:`PyThread_set_key_value`). When it is +necessary to re-acquire the GIL, either after the OpenSSL API returns or in a C +callback invoked by that OpenSSL API, the value of the thread local variable is +retrieved (:c:func:`PyThread_get_key_value`) and used to re-acquire the GIL. +This allows Python threads to execute while OpenSSL APIs are running and allows +use of any particular pyOpenSSL object from any Python thread, since there is +no per-thread state associated with any of these objects and since OpenSSL is +threadsafe (as long as properly initialized, as pyOpenSSL initializes it). + + +.. _socket-methods: + +Accessing Socket Methods +------------------------ + +We quickly saw the benefit of wrapping socket methods in the +:py:class:`.SSL.Connection` class, for an easy transition into using SSL. The +problem here is that the :py:mod:`socket` module lacks a C API, and all the +methods are declared static. One approach would be to have :py:mod:`.OpenSSL` as +a submodule to the :py:mod:`socket` module, placing all the code in +``socketmodule.c``, but this is obviously not a good solution, since you +might not want to import tonnes of extra stuff you're not going to use when +importing the :py:mod:`socket` module. The other approach is to somehow get a +pointer to the method to be called, either the C function, or a callable Python +object. This is not really a good solution either, since there's a lot of +lookups involved. + +The way it works is that you have to supply a :py:class:`socket`- **like** transport +object to the :py:class:`.SSL.Connection`. The only requirement of this object is +that it has a :py:meth:`fileno()` method that returns a file descriptor that's +valid at the C level (i.e. you can use the system calls read and write). If you +want to use the :py:meth:`connect()` or :py:meth:`accept()` methods of the +:py:class:`.SSL.Connection` object, the transport object has to supply such +methods too. Apart from them, any method lookups in the :py:class:`.SSL.Connection` +object that fail are passed on to the underlying transport object. + +Future changes might be to allow Python-level transport objects, that instead +of having :py:meth:`fileno()` methods, have :py:meth:`read()` and :py:meth:`write()` +methods, so more advanced features of Python can be used. This would probably +entail some sort of OpenSSL **BIOs**, but converting Python strings back and +forth is expensive, so this shouldn't be used unless necessary. Other nice +things would be to be able to pass in different transport objects for reading +and writing, but then the :py:meth:`fileno()` method of :py:class:`.SSL.Connection` +becomes virtually useless. Also, should the method resolution be used on the +read-transport or the write-transport? diff --git a/doc/introduction.rst b/doc/introduction.rst new file mode 100644 index 0000000..c29f80c --- /dev/null +++ b/doc/introduction.rst @@ -0,0 +1,17 @@ +.. _intro: + +Introduction +============ + +The reason pyOpenSSL was created is that the SSL support in the socket module in +Python 2.1 (the contemporary version of Python when the pyOpenSSL project was +begun) was severely limited. Other OpenSSL wrappers for Python at the time were +also limited, though in different ways. Unfortunately, Python's standard +library SSL support has remained weak, although other packages (such as +`M2Crypto <http://chandlerproject.org/Projects/MeTooCrypto>`_) +have made great advances and now equal or exceed pyOpenSSL's functionality. + +The reason pyOpenSSL continues to be maintained is that there is a significant +user community around it, as well as a large amount of software which depends on +it. It is a great benefit to many people for pyOpenSSL to continue to exist and +advance. diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..5ef04de --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,170 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^<target^>` where ^<target^> is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\pyOpenSSL.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\pyOpenSSL.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/doc/pyOpenSSL.ps b/doc/pyOpenSSL.ps deleted file mode 100644 index 3eef2c6..0000000 --- a/doc/pyOpenSSL.ps +++ /dev/null @@ -1,5948 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software -%%Title: pyOpenSSL.dvi -%%CreationDate: Mon Apr 11 19:56:45 2011 -%%Pages: 18 -%%PageOrder: Ascend -%%BoundingBox: 0 0 596 842 -%%DocumentPaperSizes: a4 -%%EndComments -%DVIPSWebPage: (www.radicaleye.com) -%DVIPSCommandLine: dvips -N0 -o pyOpenSSL.ps pyOpenSSL -%DVIPSParameters: dpi=600 -%DVIPSSource: TeX output 2011.04.11:1956 -%%BeginProcSet: tex.pro 0 0 -%! -/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S -N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 -mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 -0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ -landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize -mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ -matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round -exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ -statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] -N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin -/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array -/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 -array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N -df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A -definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get -}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} -B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr -1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S -/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy -setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask -restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn -/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put -}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ -bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A -mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ -SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ -userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X -1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 -index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N -/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ -/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) -(LaserWriter 16/600)]{A length product length le{A length product exch 0 -exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse -end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask -grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} -imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round -exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto -fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p -delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} -B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ -p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S -rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end - -%%EndProcSet -TeXDict begin 39158280 55380996 1000 600 600 (pyOpenSSL.dvi) -@start -%DVIPSBitmapFont: Fa ecti0800 8 6 -/Fa 6 119 df<0007C000001FF000007C39C000F81FC001F01FC003E00FC007C00FC00F -C00FC01F800F801F800F803F000F803F001F807F001F007E001F007E001F007E003F00FE -003E00FC003E00FC003E00FC007E18FC007C38F8007C38F8007C38F800FC387801FC787C -03F8707C03F8703C0F78E01E1E3DE00FF81FC003E00F001D1F799D24>97 -D<00F8001FF8001FF80001F80001F80001F00001F00003F00003F00003E00003E00007E0 -0007E00007C00007C0000FC0000FC7C00F9FF00FF8781FF03C1FE03E1FC01E1F801F3F00 -1F3F001F3E001F3E001F7E003F7E003F7C003F7C003F7C007FFC007EF8007EF8007EF800 -FCF800FCF800F8F801F8F801F0F803E07807E07807C03C0F801E3E000FF80003E000182F -78AD21>I<0003F800000FFE00003E0F0000F8070001F0038003E0038007C003800FC007 -801F8007001F800F003F001E003F003C007F03F8007FFFE0007FFE00007E000000FE0000 -00FC000000FC000000FC000000FC0000007C0000007C0001807C0003C07C0007803E000F -003E001E001F007C000F83F00003FFC00000FE00001A1F799D21>101 -D<001F000003FF000003FF0000003F0000003F0000003E0000003E0000007E0000007E00 -00007C0000007C000000FC000000FC000000F8000000F8000001F8000001F87E0001F3FF -8001F787C003FE03E003FC03E003F803E003F803E007F003E007E003E007E003E007C003 -E00FC007E00FC007C00F8007C00F8007C01F800FC01F800F801F000F801F001F803F001F -063F001F0E3E003F0E3E003E0E7E003E1E7E007E1C7C007C1C7C003C38FC003C38FC003C -70F8001FE0700007801F2F7BAD24>104 D<000FC0007FF000F03C01E01C03C01E07801E -07803E07803E0F803C0F80180FC0000FF8000FFF0007FFC003FFE001FFF0007FF00007F0 -0003F00001F07800F0FC00F0FC00F0FC01F0F801E0E001E0E003C0F00780781F001FFC00 -07F000171F7A9D1D>115 D<03C001C00FF003E01E7807F01C7C07F0387C07F0787C03F0 -707C01F070FC01F0F0F801E0E0F801E0E1F800E0C1F001E001F001C003F001C003E001C0 -03E003C007E0038007C0038007C0038007C007000FC007000F8007000F800E000F800E00 -0F801C0007801C0007C0380003C0700003E0E00000FFC000003F00001C1F7A9D21>118 -D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fb ecrm1440 14.4 2 -/Fb 2 94 df<FFFFC0FFFFC0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FFFFC0FFFFC0127875D920>91 D<FFFFC0FFFFC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC000 -1FC0001FC0001FC0FFFFC0FFFFC012787ED920>93 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fc ecti1000 10 57 -/Fc 57 123 df<00000000FF0003F000000003FFE00FFC0000000FC0F01F1E0000003F00 -783E0F0000007E01F87C3F0000007C03F8FC7F000000FC03F8F87F000001F803F9F87F00 -0001F803F1F87E000001F801E1F83C000003F00003F000000003F00003F000000003F000 -03F000000007F00003F000000007E00007F000000007E00007E000000007E00007E00000 -0007E00007E00000000FE00007E00000000FC0000FE00000000FC0000FC00000000FC000 -0FC00000000FC0000FC000000FFFFFFFFFFFC0000FFFFFFFFFFFC0000FFFFFFFFFFFC000 -001F80001F800000001F80001F800000001F80001F800000003F80003F800000003F0000 -3F000000003F00003F000000003F00003F000000003F00003F000000007F00007F000000 -007E00007E000000007E00007E000000007E00007E000000007E00007E00000000FE0000 -FE00000000FC0000FC00000000FC0000FC00000000FC0000FC00000000FC0000FC000000 -01FC0000FC00000001F80001FC00000001F80001F800000001F80001F800000001F80001 -F800000003F80001F800000003F00003F800000003F00003F000000003F00003F0000000 -03F00003F000000007F00003F000000007E00007E000000007E00007E000000007E00007 -E000000007E00007E00000000FC0000FC00000000FC0000FC00000000FC0000FC0000000 -0FC0000FC00000001F80001F800000001F80001F800000001F80001F8000001C1F03801F -0000007E1F0FC03F0000007E3E0FC03E000000FE3E1FC07C000000FE3C1FC07C000000FE -7C1FC0F8000000F8780F01E000000078F00F07C00000003FE003FF000000000F8000FC00 -000000404C82BA33>27 D<000000003FFC0000000001FFFF8000000007E007C00000001F -8001E00000003F0001F00000007E0003F0000000FC0007F0000000FC0007F0000001F800 -07F0000001F80007E0000003F0000380000003F0000000000003F0000000000003F00000 -00000007F0000000000007E0000000000007E0000000000007E0000000000007E0000000 -00000FE000000000000FC000000000000FC000000000000FC0000000000FFFFFFFFF0000 -0FFFFFFFFF00000FFFFFFFFE0000001F80007E0000001F80007E0000001F8000FE000000 -3F8000FC0000003F0000FC0000003F0000FC0000003F0001FC0000003F0001F80000007F -0001F80000007E0001F80000007E0003F80000007E0003F00000007E0003F0000000FE00 -03F0000000FC0007F0000000FC0007E0000000FC0007E0000000FC0007E0000001FC000F -E0000001FC000FC0000001F8000FC1C00001F8000FC1C00001F8001FC1C00001F8001F83 -C00003F8001F83800003F0001F83800003F0001F83800003F0001F87000007F0001F8700 -0007E0001F0F000007E0000F8E000007E000079E000007E00003FC00000FE00000F00000 -0FC000000000000FC000000000000FC000000000000F8000000000001F8000000000001F -80000000001C1F00000000007E1F00000000007E3F0000000000FE3E0000000000FE3C00 -00000000FE7C0000000000F878000000000078F000000000003FE000000000000F800000 -000000344C82BA2F>I<000000007FE00000000003FFFC7E0000000FC03E7E0000001F00 -0F7E0000003E003FFE0000007C007FFE000000FC007FFC000000F8007FFC000001F8007F -FC000001F8003DFC000003F00001F8000003F00001F8000003F00003F8000003F00003F8 -000007E00003F0000007E00003F0000007E00007F0000007E00007F000000FE00007E000 -000FC00007E000000FC0000FE000000FC0000FE000000FC0000FC0000FFFFFFFFFC0000F -FFFFFFFFC0000FFFFFFFFFC000001F80001F8000001F80001F8000001F80003F8000003F -80003F8000003F00003F0000003F00003F0000003F00007F0000003F00007F0000007F00 -007E0000007E00007E0000007E0000FE0000007E0000FE0000007E0000FC000000FE0000 -FC000000FC0001FC000000FC0001FC000000FC0001F8000000FC0001F8000001FC0003F8 -000001F80003F8000001F80003F0700001F80003F0700001F80007F0700003F80007F0F0 -0003F00007E0E00003F00007E0E00003F00007E0E00003F00007E1C00007F00007E1C000 -07E00007C3C00007E00003E3800007E00001E7800007E00000FF00000FC000003C00000F -C000000000000FC000000000000FC000000000001F8000000000001F8000000000001F80 -000000001C1F00000000007E1F00000000007E3E0000000000FE3E0000000000FE3C0000 -000000FE7C0000000000F878000000000078F000000000003FE000000000000F80000000 -0000374C82BA31>I<03C007F00FF01FF01FF81FF81FF81FF007B0003000700060006000 -E000C001C00380030007000E001C0038007000E000C0000D197A8819>44 -D<000003F80000001FFE0000007C1F000000F00F800003E007C00007C003C0000F8003E0 -000F0003E0001F0003E0003E0003F0003E0003F0007C0003F000FC0003F000FC0003F001 -F80003F001F80003F003F80007F003F80007F003F00007F007F00007E007F00007E007E0 -000FE00FE0000FE00FE0000FE00FE0000FE01FC0001FC01FC0001FC01FC0001FC01FC000 -1FC03F80003F803F80003F803F80003F803F80003F807F00007F007F00007F007F00007F -007F00007E007E0000FE007E0000FE00FE0000FC00FE0001FC00FE0001F800FC0001F800 -FC0003F000FC0003F000FC0003E000FC0007E0007C0007C0007C000F80007C000F80007C -001F00003E003E00003E007C00001F00F800000F83E0000007FF80000000FE0000002439 -77B62A>48 D<000000380000003800000070000000F0000001F0000003F0000007E00000 -0FE000003FE00000FFE00007FFC0003FCFC0003F1FC000101FC000001F8000001F800000 -3F8000003F8000003F0000003F0000007F0000007F0000007E0000007E000000FE000000 -FE000000FC000000FC000001FC000001FC000001F8000001F8000003F8000003F8000003 -F0000003F0000007F0000007F0000007E0000007E000000FE000000FE000000FC000000F -C000001FC000001FC000001F8000001F8000003F8000003F8000003F0000007F8000FFFF -FF80FFFFFF80FFFFFF801D3777B62A>I<000003F00000001FFE0000007C0F800000F007 -C00001C003E000038003F000070001F0000F0001F8001E0001F8001C0001F8003C6001F8 -00387001FC00783001FC00703001FC00F03001FC00E03001FC00E07003FC01E06003F801 -C06003F801C0E003F801C0C007F801C1C007F00181800FF00183800FE001C7001FC001FE -003FC00078003F800000007F00000000FE00000001F800000003F000000007E00000001F -800000003F00000000FC00000001F000000007C00000000F800000003E000000007C0000 -0000F80000C001F00001C003E00001C003C00001C007800003C00F000003800E00000780 -1E00000F803C00001F003FF8003F007FFFC07E00783FFFFC00700FFFFC00F007FFF800E0 -01FFF000E000FFC000E0001F0000263979B62A>I<00000000E000000003F000000003F0 -00000003F000000007F000000007E000000007E000000007E00000000FE00000000FC000 -00000FC00000001FC00000001F800000001F800000003F800000003F000000003F000000 -007E000000007E000000007E00000000FC00000000FC00000001F800000001F800000003 -F000000003F000000003E000000007C000000007C00000000F800000001F800000001F00 -0000003E000000003E000000007C00000000F81C000000F83E000001F07E000003E07E00 -0003C07E000007C0FE00000F80FC00001F00FC00003E00FC00003C01FC00007801F80000 -F001F80001E001F80003C003F80007FE03F0001FFFC3F0003FFFFBF0007C01FFF040F000 -3FFFE0600007FFE0000007FF0000000FE00000000FC00000000FC00000000FC00000001F -C00000001F800000001F800000001F800000003F800000003F000000003F000000003F00 -0000003F000000003E000000001C000024477DB62A>52 D<000300003800078000F80007 -F007F00007FFFFE00007FFFF80000FFFFF00000FFFFE00000FFFF800000FFFC000001E1C -0000001C000000001C000000001C000000003C0000000038000000003800000000380000 -0000780000000070000000007000000000707F000000F1FFC00000E783E00000FE01F000 -00F800F80001F000F80001E000FC0001C0007C000180007C000000007E000000007E0000 -00007E00000000FE00000000FE00000000FE00000000FE00000001FE00000001FC001E00 -01FC007F0001FC007F0003FC00FF0003F800FF0003F800FE0007F000F80007F000E00007 -E000E0000FE000E0001FC000E0001F8000F0003F0000F0007E00007800FC00007C01F800 -003E07F000001FFFC000000FFF00000003F8000000253977B62A>I<000003F80000000F -FF0000003FFF800000FE07E00001F003E00003E001F00007C001F0000F8000F8001F0000 -F8001F0000F8003E0000F8003E0000F8003E0001F8007E0001F0007E0001F0007E0003F0 -007E0003E0007F0007E0007F800FC0007FC00F80007FE01F00003FF03E00003FF8780000 -1FFDF000000FFFC0000007FF80000003FFC0000003FFE000000FFFF000001E7FF800007C -1FFC0000F80FFC0003E007FE0007C003FE000FC001FF001F8000FF001F00007F003E0000 -7F007E00003F007C00003F007C00003F00FC00003E00F800003E00F800003E00F800007E -00F800007C00F80000F800F80000F800F80001F000FC0003E0007C0007C0007E000F8000 -3F003F00001F80FE00000FFFF8000003FFE0000000FF000000253978B62A>56 -D<000003F80000000FFE0000003FFF800000FE0FC00001F807E00003F003E00007E003F0 -000FC001F0001F8001F0003F0001F0007F0001F8007E0001F800FE0001F800FE0001F801 -FC0001F801FC0003F801FC0003F803FC0003F803F80003F803F80003F003F80007F007F8 -0007F007F00007F007F0000FF007F0000FF007F0000FE007F0001FE003E0001FE003E000 -3FE003F0007FC001F0007FC001F000FFC000F801FFC0007803BF80003C0F3F80001FFC3F -800007F07F000000007F000000007E00000000FE00000000FC00000001FC00000001F800 -000003F000000003F0003E0007E0007F000FC0007F000F80007F001F8000FE003F0000FC -007E00007000FC00007803F000007C0FE000003FFF8000001FFE00000003F80000002539 -78B62A>I<07FFFFFFFFFFFC0FFFFFFFFFFFFE0000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000FFFFFFFFFFFFE07FFFFFFFFFFF -C03714779E40>61 D<00000003FE000E0000003FFF801E000000FFFFE03C000003FE01F0 -3C00000FF000787C00003FC0003CFC00007F00001FF80000FE00000FF80003FC00000FF8 -0007F8000007F8000FF0000007F0001FE0000003F0003FC0000003F0003F80000003F000 -7F00000003E000FF00000003E001FE00000003E001FC00000003E003FC00000003C007F8 -00000003C007F800000003C00FF000000003C00FF000000003801FE000000003801FE000 -000000001FE000000000003FC000000000003FC000000000003FC000000000007FC00000 -0000007F8000000000007F8000000000007F800000000000FF800000000000FF00000000 -0000FF000000000000FF000000000000FF000000000000FF000000003800FF0000000038 -00FF000000007800FE000000007000FF000000007000FF00000000F0007F00000000E000 -7F00000001E0007F00000001C0007F00000003C0003F8000000780003F8000000700001F -8000000E00001FC000001E00000FC000003C00000FE0000078000007F00001F0000003F8 -0003C0000001FE000F800000007F807E000000003FFFFC000000000FFFE00000000000FF -00000000373D74BA3B>67 D<0003FFFFFFFE00000003FFFFFFFFC0000003FFFFFFFFF000 -000007F8000FF800000007F00003FC00000007F00000FE0000000FF000007F0000000FF0 -00003F8000000FE000001F8000000FE000001FC000001FE000000FC000001FE000000FE0 -00001FC000000FE000001FC0000007E000003FC0000007E000003FC0000007F000003F80 -000007F000003F80000007F000007F80000007F000007F80000007F000007F00000007F0 -00007F00000007F00000FF00000007F00000FF0000000FF00000FE0000000FF00000FE00 -00000FF00001FE0000000FF00001FE0000000FE00001FC0000001FE00001FC0000001FE0 -0003FC0000001FE00003FC0000001FC00003F80000003FC00003F80000003FC00007F800 -00003F800007F80000007F800007F00000007F000007F00000007F00000FF0000000FE00 -000FF0000000FE00000FE0000001FC00000FE0000001F800001FE0000003F800001FE000 -0007F000001FC0000007E000001FC000000FC000003FC000001F8000003FC000003F8000 -003F8000007F0000003F800000FC0000007F800003F80000007F800007F00000007F0000 -1FC0000000FF0001FF8000007FFFFFFFFE000000FFFFFFFFF0000000FFFFFFFF80000000 -3C397CB83F>I<0007FFFFFFFFFF0007FFFFFFFFFF0007FFFFFFFFFF00000FF00003FF00 -000FE000007F00000FE000003E00001FE000003E00001FE000001E00001FC000001E0000 -1FC000001E00003FC000001E00003FC000001E00003F8000001E00003F8000001C00007F -8000001C00007F8000001C00007F0003801C00007F0003801C0000FF0007801C0000FF00 -0780000000FE000700000000FE000F00000001FE000F00000001FE001F00000001FC003E -00000001FC007E00000003FFFFFE00000003FFFFFE00000003FFFFFC00000003F800FC00 -000007F8007C00000007F8003C00000007F0003800000007F000380000000FF000780000 -000FF0007800E0000FE0007000E0000FE0007001E0001FE0007001C0001FE0000001C000 -1FC0000003C0001FC000000380003FC000000780003FC000000700003F8000000F00003F -8000000F00007F8000001E00007F8000003E00007F0000003C00007F0000007C0000FF00 -0000FC0000FF000001F80000FE000007F80001FE00007FF000FFFFFFFFFFF000FFFFFFFF -FFF000FFFFFFFFFFE00038397BB838>I<0007FFFFFFFFFE0007FFFFFFFFFE0007FFFFFF -FFFE00000FF00007FE00000FE00000FE00000FE000007C00001FE000003C00001FE00000 -3C00001FC000003C00001FC000003C00003FC000003C00003FC000003C00003F8000003C -00003F8000003800007F8000003800007F8000003800007F0000003800007F0003803800 -00FF000780380000FF000780000000FE000700000000FE000700000001FE000F00000001 -FE000F00000001FC001E00000001FC003E00000003FC00FE00000003FFFFFE00000003FF -FFFC00000003FFFFFC00000007F800FC00000007F8007C00000007F0007800000007F000 -780000000FF000780000000FF000780000000FE000700000000FE000700000001FE000F0 -0000001FE000F00000001FC000000000001FC000000000003FC000000000003FC0000000 -00003F8000000000003F8000000000007F8000000000007F8000000000007F0000000000 -007F000000000000FF000000000000FF000000000000FE000000000001FF0000000000FF -FFFF00000000FFFFFF00000000FFFFFF0000000037397BB836>I<0003FFFFF80FFFFFE0 -0003FFFFF80FFFFFE00003FFFFF80FFFFFE0000007F800001FE000000007F000001FC000 -000007F000001FC00000000FF000003FC00000000FF000003F800000000FE000003F8000 -00000FE000003F800000001FE000007F800000001FE000007F000000001FC000007F0000 -00001FC000007F000000003FC00000FF000000003FC00000FE000000003F800000FE0000 -00003F800000FE000000007F800001FE000000007F800001FC000000007F000001FC0000 -00007F000001FC00000000FF000003FC00000000FF000003F800000000FE000003F80000 -0000FE000003F800000001FFFFFFFFF800000001FFFFFFFFF000000001FFFFFFFFF00000 -0001FC000007F000000003FC00000FF000000003FC00000FE000000003F800000FE00000 -0003F800000FE000000007F800001FE000000007F800001FC000000007F000001FC00000 -0007F000001FC00000000FF000003FC00000000FF000003F800000000FE000003F800000 -000FE000003F800000001FE000007F800000001FE000007F000000001FC000007F000000 -001FC000007F000000003FC00000FF000000003FC00000FE000000003F800000FE000000 -003F800000FE000000007F800001FE000000007F800001FC000000007F000001FC000000 -00FF000003FC0000007FFFFE01FFFFF80000FFFFFE03FFFFF80000FFFFFE03FFFFF80000 -43397CB83E>72 D<0003FFFFF80003FFFFF80003FFFFF8000007F800000007F000000007 -F00000000FF00000000FF00000000FE00000000FE00000001FE00000001FE00000001FC0 -0000001FC00000003FC00000003FC00000003F800000003F800000007F800000007F8000 -00007F000000007F00000000FF00000000FF00000000FE00000000FE00000001FE000000 -01FE00000001FC00000001FC00000003FC00000003FC00000003F800000003F800000007 -F800000007F800000007F000000007F00000000FF00000000FF00000000FE00000000FE0 -0000001FE00000001FE00000001FC00000001FC00000003FC00000003FC00000003F8000 -00003F800000007F800000007F800000007F00000000FF800000FFFFFF0000FFFFFF0000 -FFFFFE000025397CB820>I<0007FFFFFC000007FFFFFC000007FFFFF80000000FF80000 -00000FF0000000000FE0000000001FE0000000001FE0000000001FC0000000001FC00000 -00003FC0000000003FC0000000003F80000000003F80000000007F80000000007F800000 -00007F00000000007F0000000000FF0000000000FF0000000000FE0000000000FE000000 -0001FE0000000001FE0000000001FC0000000001FC0000000003FC0000000003FC000000 -0003F80000000003F80000000007F80000000007F80000000007F00000000007F0000000 -000FF0000000000FF000000C000FE000001C000FE000001C001FE000003C001FE0000038 -001FC0000078001FC0000078003FC0000070003FC00000F0003F800000E0003F800001E0 -007F800003E0007F800003C0007F000007C0007F00000FC000FF00001F8000FF00003F80 -00FE0000FF8001FE0007FF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFE002E397BB834> -76 D<0007FFF800000007FFF00007FFF80000000FFFF00007FFF80000001FFFE000000F -F80000001FF00000000FF80000003FE00000000FF80000003FE00000001FF80000007FE0 -0000001FF8000000EFC00000001DF8000000EFC00000001CFC000001CFC00000003CFC00 -0001DFC00000003CFC0000039F8000000038FC0000071F8000000038FC0000071F800000 -0078FC00000E3F8000000078FC00000E3F0000000070FC00001C3F0000000070FC00001C -3F00000000F0FC0000387F00000000F0FC0000707E00000000E0FC0000707E00000000E0 -7E0000E07E00000001E07E0000E0FE00000001E07E0001C0FC00000001C07E000380FC00 -000001C07E000380FC00000003C07E000701FC00000003C07E000701F800000003807E00 -0E01F800000003807E000E01F800000007807E001C03F800000007807E003803F0000000 -07007E003803F000000007003F007003F00000000F003F007007F00000000F003F00E007 -E00000000E003F01C007E00000000E003F01C007E00000001E003F03800FE00000001E00 -3F03800FC00000001C003F07000FC00000001C003F07000FC00000003C003F0E001FC000 -00003C003F1C001F8000000038003F1C001F8000000038001FB8001F8000000078001FB8 -003F8000000078001FF0003F0000000070001FE0003F0000000070001FE0003F00000000 -F0001FC0007F00000000F0001FC0007E00000001F0001F80007E00000007F8001F8000FE -000000FFFFC01F007FFFFC0000FFFFC01E007FFFFC0000FFFFC00E007FFFFC00004C397A -B84A>I<0003FFF80000FFFFE00003FFF80000FFFFE00003FFFC0000FFFFE0000007FC00 -0007F800000007FE000003F000000007FE000003E00000000FFE000003C00000000FFF00 -0003C00000000E7F000003800000000E7F000003800000001E7F800007800000001E3F80 -0007000000001C3F800007000000001C3FC00007000000003C1FC0000F000000003C1FE0 -000E00000000380FE0000E00000000380FE0000E00000000780FF0001E000000007807F0 -001C000000007007F0001C000000007007F8001C00000000F003F8003C00000000F003FC -003800000000E003FC003800000000E001FC003800000001E001FE007800000001E000FE -007000000001C000FE007000000001C000FF007000000003C0007F00F000000003C0007F -00E00000000380007F80E00000000380003F80E00000000780003FC1E00000000780001F -C1C00000000700001FC1C00000000700001FE1C00000000F00000FE3C00000000F00000F -E3800000000E00000FF3800000000E000007F3800000001E000007FF800000001E000007 -FF000000001C000003FF000000001C000003FF000000003C000001FF000000003C000001 -FE0000000038000001FE0000000038000000FE0000000078000000FE0000000078000000 -FC00000000F80000007C00000003FC0000007C0000007FFFE000003C000000FFFFE00000 -38000000FFFFE000003800000043397CB83E>I<00000003FE00000000003FFFC0000000 -00FC07F000000003E001F80000000F80007C0000003F00003E0000007E00001F000000F8 -00001F800001F000000FC00007E000000FC0000FC0000007E0001FC0000007E0001F8000 -0007F0003F00000003F0007E00000003F000FE00000003F801FC00000003F801FC000000 -03F803F800000003F803F800000003F807F000000003F807F000000003F80FF000000003 -F80FE000000003F81FE000000007F81FC000000007F83FC000000007F83FC000000007F8 -3FC000000007F87F800000000FF07F800000000FF07F800000000FF07F800000000FF0FF -000000001FE0FF000000001FE0FF000000001FE0FF000000003FC0FF000000003FC0FF00 -0000003F80FF000000007F80FF000000007F00FF00000000FF00FF00000000FE00FF0000 -0001FE00FF00000001FC007F00000003F8007F00000007F0007F00000007F0007F000000 -0FE0003F0000001FC0003F8000003F80001F8000003F00001FC000007E00000FC00000FC -000007E00003F0000003F00007E0000001F8000F80000000FC003F000000003F01FC0000 -00001FFFE00000000001FF00000000353D74BA40>I<0007FFFFFFF8000007FFFFFFFF00 -0007FFFFFFFF8000000FF0003FE000000FE0000FF000000FE00003F800001FE00003F800 -001FE00001FC00001FC00001FC00001FC00001FC00003FC00001FE00003FC00001FE0000 -3F800001FE00003F800001FE00007F800001FE00007F800003FC00007F000003FC00007F -000003FC0000FF000003F80000FF000007F80000FE000007F00000FE00000FE00001FE00 -000FE00001FE00001FC00001FC00003F800001FC0000FE000003FC0001FC000003FC000F -F0000003FFFFFFC0000003FFFFFE00000007F8000000000007F8000000000007F0000000 -000007F000000000000FF000000000000FF000000000000FE000000000000FE000000000 -001FE000000000001FE000000000001FC000000000001FC000000000003FC00000000000 -3FC000000000003F8000000000003F8000000000007F8000000000007F8000000000007F -0000000000007F000000000000FF000000000000FF000000000000FE000000000001FE00 -00000000FFFFFC00000000FFFFFC00000000FFFFFC0000000037397BB838>I<0003FFFF -FFF0000003FFFFFFFE000003FFFFFFFF80000007F8003FC0000007F0000FF0000007F000 -07F000000FF00003F800000FF00001FC00000FE00001FC00000FE00001FC00001FE00001 -FE00001FE00001FE00001FC00001FE00001FC00001FE00003FC00001FE00003FC00003FC -00003F800003FC00003F800003FC00007F800007F800007F800007F000007F00000FF000 -007F00000FE00000FF00001FC00000FF00003F000000FE0000FE000000FE0001F8000001 -FE000FE0000001FFFFFF80000001FFFFFC00000001FC003F00000003FC000F80000003FC -000FC0000003F80007E0000003F80007F0000007F80003F0000007F80003F0000007F000 -03F0000007F00003F800000FF00007F800000FF00007F000000FE00007F000000FE00007 -F000001FE0000FF000001FE0000FF000001FC0000FF000001FC0000FF000003FC0000FF0 -00003FC0001FF000003F80001FE007003F80001FE007007F80001FE00F007F80001FE00E -007F00001FE00E00FF00000FE01C7FFFFE000FE03CFFFFFE0007F078FFFFFE0003F0F000 -00000000FFE000000000003F80383B7CB83D>82 D<0000003FC00E000001FFF01C000007 -FFFC1C00001FC07E3C00003F001F7C00007C000FF80000F80007F80001F00003F80003E0 -0003F80007C00001F00007C00001F0000F800001F0000F800001F0001F800001E0001F00 -0001E0001F000001E0001F000001E0003F000001C0003F000001C0003F000001C0003F80 -000000003F80000000003FC0000000001FE0000000001FFC000000001FFF800000000FFF -F00000000FFFFE00000007FFFF80000003FFFFE0000000FFFFF00000003FFFF800000007 -FFF8000000007FFC000000000FFC0000000003FC0000000001FC0000000001FC00000000 -00FC0000000000FC00000000007C000E0000007C000E0000007C000E0000007C001E0000 -00FC001E000000F8001E000000F8001E000000F8003E000001F0003E000001F0003E0000 -03E0003E000003E0007F000007C0007F00000F80007F80001F00007FC0003E0000F9F000 -FC0000F8FC03F80000F07FFFE00000E01FFF800000C003FC0000002F3D7ABA2F>I<07FF -FFFFFFFFE007FFFFFFFFFFE00FFFFFFFFFFFE00FF800FF001FE00FC000FE0007C01F8000 -FE0007C01F0001FE0003C01E0001FE0003C01C0001FC0003C03C0001FC0003803C0003FC -000380380003FC000380780003F8000380700003F8000780700007F8000780F00007F800 -0700E00007F0000700E00007F0000700E0000FF000070000000FF000000000000FE00000 -0000000FE000000000001FE000000000001FE000000000001FC000000000001FC0000000 -00003FC000000000003FC000000000003F8000000000003F8000000000007F8000000000 -007F8000000000007F0000000000007F000000000000FF000000000000FF000000000000 -FE000000000000FE000000000001FE000000000001FE000000000001FC000000000001FC -000000000003FC000000000003FC000000000003F8000000000003F8000000000007F800 -0000000007F8000000000007F0000000000007F000000000000FF000000000000FF00000 -0000000FE000000000003FF0000000007FFFFFF8000000FFFFFFF8000000FFFFFFF80000 -00333971B83B>I<3FFFFF800FFFFE3FFFFF800FFFFE3FFFFF800FFFFE007F8000007F80 -007F0000003F00007F0000003E0000FF0000003C0000FF0000003C0000FE000000380000 -FE000000380001FE000000780001FE000000700001FC000000700001FC000000700003FC -000000F00003FC000000E00003F8000000E00003F8000000E00007F8000001E00007F800 -0001C00007F0000001C00007F0000001C0000FF0000003C0000FF000000380000FE00000 -0380000FE000000380001FE000000780001FE000000700001FC000000700001FC0000007 -00003FC000000F00003FC000000E00003F8000000E00003F8000000E00007F8000001E00 -007F8000001C00007F0000001C00007F0000001C00007F0000003C0000FF000000380000 -FE000000380000FE000000780000FE000000700000FE000000700000FE000000F00000FE -000001E00000FE000001C00000FE000003C000007E0000078000007E00000F0000007E00 -000E0000003F00003E0000001F80007C0000001F8000F00000000FC003E000000007F01F -C000000001FFFF00000000007FFC00000000001FE000000000373B70B83E>I<FFFFF800 -03FFFEFFFFF80003FFFEFFFFF80003FFFC03FE0000007FC003FC0000003F0001FC000000 -3E0001FC0000003C0001FC000000380001FC000000700001FC000000700001FC000000E0 -0001FC000001E00001FC000001C00001FE000003800001FE000003800000FE0000070000 -00FE00000F000000FE00000E000000FE00001C000000FE00001C000000FE000038000000 -FE000038000000FE000070000000FE0000E0000000FE0000E0000000FF0001C00000007F -0001C00000007F0003800000007F0007800000007F0007000000007F000E000000007F00 -0E000000007F001C000000007F003C000000007F0038000000007F0070000000007F8070 -000000003F80E0000000003F81E0000000003F81C0000000003F8380000000003F838000 -0000003F8700000000003F8700000000003F8E00000000003F9E00000000003F9C000000 -00003FF800000000003FF800000000001FF000000000001FF000000000001FE000000000 -001FC000000000001FC000000000001F8000000000001F8000000000001F000000000000 -1E0000000000001E0000000000373B6FB83E>I<FFFFF80FFFFF001FFFF0FFFFF80FFFFF -003FFFF0FFFFF00FFFFF003FFFE007FE00007FE00003FE0003F800003F800001FC0003F8 -00003F800000F00003F800003F800000F00003F800003F800001E00003F800003F800001 -C00003F800003F800003C00003F800003F800003800003F800003F800007800003F80000 -7F800007000003F800007F80000E000003F80000FF80000E000003F80001FF80001C0000 -03F80001FF80001C000003F80003BF800038000003FC0003BF800038000001FC00073F80 -0070000001FC00073F800070000001FC000E3F8000E0000001FC000E3FC000E0000001FC -001C1FC001C0000001FC001C1FC003C0000001FC00381FC00380000001FC00381FC00700 -000001FC00701FC00700000001FC00F01FC00E00000001FC00E01FC00E00000001FC01C0 -1FC01C00000001FC01C01FC01C00000001FC03801FC03800000001FC03801FC038000000 -01FC07001FC07000000001FC07001FC07000000001FC0E001FC0E000000001FC0E001FC1 -E000000001FC1C001FC1C000000001FC1C001FC38000000001FC38001FC38000000001FC -78001FC70000000001FC70001FC70000000001FCE0001FCE0000000001FEE0001FCE0000 -000000FFC0001FDC0000000000FFC0001FDC0000000000FF80001FF80000000000FF8000 -1FF80000000000FF00001FF00000000000FF00000FF00000000000FE00000FE000000000 -00FE00000FC00000000000FC00000FC00000000000FC00000F800000000000F800000F80 -0000000000F000000F000000000000F000000F000000000000E000000E00000000004C3B -6FB853>I<FFFFF80003FFFEFFFFF80003FFFEFFFFF80003FFFE03FE0000007FC001FE00 -00003F0001FE0000003E0001FE000000780000FE000000F00000FF000000E00000FF0000 -01C000007F000003C000007F8000078000007F8000070000007F80000E0000003F80001C -0000003FC0003C0000003FC000780000001FC000700000001FE000E00000001FE001C000 -00000FE003C00000000FF007800000000FF007000000000FF00E0000000007F01C000000 -0007F83C0000000007F8780000000003F8F00000000003FCE00000000003FDC000000000 -01FF800000000001FF800000000001FF000000000001FE000000000000FC000000000001 -FC000000000001FC000000000001FC000000000001F8000000000003F8000000000003F8 -000000000003F8000000000003F0000000000007F0000000000007F0000000000007F000 -0000000007E000000000000FE000000000000FE000000000000FE000000000000FC00000 -0000001FC000000000001FC000000000003FC0000000001FFFFF800000003FFFFF800000 -003FFFFF8000000037396FB83E>89 D<FFFFFFFFFFFCFFFFFFFFFFFEFFFFFFFFFFFEFFFF -FFFFFFFC2F047C7040>95 D<0000F800000007FE0000001F871C00003E03FE00007C03FE -0000F801FE0001F801FE0003F000FC0007E000FC000FE000FC000FC001FC001FC001F800 -1FC001F8003F8001F8003F8003F8007F8003F0007F0003F0007F0003F0007F0007F000FF -0007E000FE0007E000FE0007E000FE000FE000FE000FC000FC000FC1C0FC000FC1C0FC00 -1FC1C0FC001F83C0FC001F8380FC003F8380FC003F87807C007F87007C00FF07003E01FF -0F003E038F8E001F0F079E0007FE03FC0001F000F000222677A42A>97 -D<003F00001FFF00001FFF00001FFF0000007F0000007E0000007E0000007E000000FE00 -0000FC000000FC000000FC000001FC000001F8000001F8000001F8000003F8000003F000 -0003F0000003F0000007F0000007E0F80007E7FE0007EF0F800FFC07C00FF807C00FF003 -E00FE003E01FC003F01FC003F01F8003F01F8003F03F8003F03F0003F03F0003F03F0007 -F07F0007F07E0007F07E0007F07E000FF0FE000FF0FC000FE0FC000FE0FC001FE0FC001F -C0F8001FC0F8003F80F8003F80F8003F00F8007F00F8007E00F800FC007801F8007C01F0 -003C03E0003E07C0001E1F80000FFE000001F000001C3B77B926>I<00007F000003FFC0 -000FC1E0001F0070007E007800FC003801F801F803F003F807F003F807E003F80FE003F8 -1FC003F01FC000003F8000003F8000007F8000007F0000007F0000007F000000FF000000 -FE000000FE000000FE000000FE000000FC000000FC000000FC000000FC000030FC000038 -FC0000787C0000F07E0001E03E0003C03E000F801F003E000F81F80003FFE00000FF0000 -1D2677A426>I<00000001F8000000FFF8000000FFF8000000FFF800000003F800000003 -F000000003F000000007F000000007F000000007E000000007E00000000FE00000000FE0 -0000000FC00000000FC00000001FC00000001FC00000001F800000001F800000003F8000 -00003F800000F83F000007FE3F00001F877F00003E03FF00007C03FE0000F801FE0001F8 -01FE0003F000FE0007E000FC000FE000FC000FC001FC001FC001FC001FC001F8003F8001 -F8003F8003F8007F8003F8007F0003F0007F0003F0007F0007F000FF0007F000FE0007E0 -00FE0007E000FE000FE000FE000FE000FC000FC1C0FC000FC1C0FC001FC1C0FC001FC3C0 -FC001F8380FC003F8380FC003F87807C007F87007C00FF07003E01FF0F003E038F8E001F -0F079E0007FE03FC0001F000F000253B77B92A>I<00007F000003FFC0000FC1E0003F00 -F0007E007800FC007801F8007803F0007807E000780FE000780FC000F81FC000F03F8001 -F03F8007E03F801F807F81FF007FFFF8007FFF80007F000000FF000000FE000000FE0000 -00FE000000FE000000FE000000FC000000FC000000FC0000307C0000387C0000787E0000 -F03E0001E03E0003C01F000F800F003E000781F80003FFE00000FF00001D2677A426>I< -00000007C00000001FF00000003E380000007C3C000000F8FC000000F9FC000001F9FC00 -0001F1FC000003F1F8000003F0F0000003F000000007F000000007E000000007E0000000 -07E000000007E00000000FE00000000FC00000000FC00000000FC00000000FC00000001F -C00000001F8000000FFFFFC0001FFFFFC0001FFFFF8000003F800000003F000000003F00 -0000003F000000003F000000007F000000007E000000007E000000007E000000007E0000 -0000FE00000000FC00000000FC00000000FC00000000FC00000001FC00000001F8000000 -01F800000001F800000001F800000003F800000003F000000003F000000003F000000003 -F000000007F000000007E000000007E000000007E000000007E00000000FE00000000FC0 -0000000FC00000000FC00000001FC00000001F800000001F800000001F800000001F0000 -00003F0000001C3F0000007E3E0000007E3E000000FE3C000000FE7C000000FE78000000 -F8F000000078F00000003FC00000000F80000000264C82BA19>I<000007C00000003FF0 -000000FC38E00001F01FF00003E01FF00007C00FF0000F800FF0001F8007F0003F0007E0 -007F0007E0007E000FE000FE000FE000FC000FC001FC000FC001FC001FC003FC001FC003 -F8001F8003F8001F8003F8003F8007F8003F8007F0003F0007F0003F0007F0007F0007F0 -007F0007E0007E0007E0007E0007E000FE0007E000FE0007E000FC0003E001FC0003E003 -FC0003E007FC0001F00FF80000F01FF80000787BF800003FF3F800000FC3F000000003F0 -00000007F000000007F000000007E000000007E00000000FE00000000FC0001C000FC000 -7E001FC0007E001F8000FE003F0000FE007E0000FE00FC00007801F800007C07E000001F -FF80000003FE00000024367CA426>I<0003F0000001FFF0000001FFF0000001FFF00000 -0007F000000007E000000007E000000007E00000000FE00000000FC00000000FC0000000 -0FC00000001FC00000001F800000001F800000001F800000003F800000003F000000003F -000000003F000000007F000000007E07F000007E1FFC00007E783E0000FFE01F0000FFC0 -1F8000FF800F8000FF000F8001FE000F8001FE000FC001FC000FC001F8001F8003F8001F -8003F0001F8003F0001F8003F0003F8007F0003F0007E0003F0007E0003F0007E0007F00 -0FE0007E000FC0007E000FC000FE000FC000FC001FC000FC001F8001FC1C1F8001F81C1F -8001F83C3F8003F8383F0003F0383F0003F0383F0003F0707F0003E0707E0003E0F07E00 -03E0E07E0003E1C0FE0001E380FC0000FF003800003C00263B7BB92A>I<0001C00007E0 -0007F0000FF0000FE00007E0000380000000000000000000000000000000000000000000 -00000000000000000000000000F00003FC00071E000E1F001C1F001C1F00381F00383F00 -703F00703F00707F00F07E00E07E00E0FE0000FC0000FC0001FC0001F80003F80003F800 -03F00007F00007E00007E0000FE0E00FC0E00FC1E01FC1C01F81C01F81C01F83801F0380 -1F07001F07001F0E000F1C0007F80001E000143879B619>I<0000000E0000003F000000 -7F0000007F0000007F0000007E0000001C00000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000001F8000007FC00000F1 -F00001C0F0000380F8000780F8000701F8000F01F8000E01F8001E01F8001C03F8003C03 -F8003803F0003803F0000007F0000007F0000007E0000007E000000FE000000FE000000F -C000000FC000001FC000001FC000001F8000001F8000003F8000003F8000003F0000003F -0000007F0000007F0000007E0000007E000000FE000000FE000000FC000000FC000001FC -000001FC000001F8000001F8000003F8000003F0001C03F0007E07E0007E07E000FE0FC0 -00FE0F8000FE1F0000F83E0000787C00003FF000000FC00000204883B619>I<0003F000 -0001FFF0000001FFF0000001FFF000000007F000000007E000000007E000000007E00000 -000FE00000000FC00000000FC00000000FC00000001FC00000001F800000001F80000000 -1F800000003F800000003F000000003F000000003F000000007F000000007E000F80007E -003FE0007E00F0E000FE01C1F000FC0387F000FC0707F000FC0E07F001FC1C07E001F838 -07E001F830038001F870000003F8E0000003F1C0000003F380000003FF00000007FC0000 -0007FE00000007FFC0000007E7F800000FE1FC00000FC07E00000FC07F00000FC03F0000 -1FC03F80001F801F81C01F801F81C01F801F83C03F803F83803F003F03803F003F03803F -003F07807F003F07007E003E07007E001E0E007E001E1E00FE000F3C00FC0007F8003800 -01E000243B7BB926>I<000FC007FFC007FFC007FFC0001FC0001F80001F80003F80003F -80003F00003F00007F00007F00007E00007E0000FE0000FE0000FC0000FC0001FC0001FC -0001F80001F80003F80003F80003F00003F00007F00007F00007E00007E0000FE0000FE0 -000FC0000FC0001FC0001FC0001F80001F80003F80003F80003F00003F00007F00007F00 -007E0E007E0E00FE0E00FE1E00FC1C00FC1C00FC3C00FC3800F83800F878007870007CE0 -001FE0000F8000123B79B915>I<01E000FE0007F00007F803FF801FFC000E3C0F07C078 -3E001E3E3C03E1E01F001C1F7803F3C01F80383FF001F7800F80383FE001F7000F80783F -C001FE000F80703FC001FE000FC0703F8001FC000FC0703F0003F8001F80F07F0003F800 -1F80E07E0003F0001F80E07E0003F0001F80007E0007F0003F8000FE0007F0003F0000FC -0007E0003F0000FC0007E0003F0000FC000FE0007F0001FC000FE0007E0001F8000FC000 -7E0001F8000FC000FE0001F8001FC000FC0003F8001FC000FC0003F0001F8001FC1C03F0 -001F8001F81C03F0003F8001F83C07F0003F8003F83807E0003F0003F03807E0003F0003 -F03807E0007F0003F0700FE0007F0003E0700FC0007E0003E0F00FC0007E0003E0E00FC0 -00FE0003E1C01FC000FE0001E3C01F8000FC0000FF000700003800003C003E2679A444> -I<01E000FE000007F803FF80000E3C0F07C0001E3E3C03E0001C1F7803F000383FF001F0 -00383FE001F000783FC001F000703FC001F800703F8001F800703F0003F000F07F0003F0 -00E07E0003F000E07E0003F000007E0007F00000FE0007E00000FC0007E00000FC0007E0 -0000FC000FE00001FC000FC00001F8000FC00001F8001FC00001F8001F800003F8001F80 -0003F0003F838003F0003F038003F0003F078007F0007F070007E0007E070007E0007E07 -0007E0007E0E000FE0007C0E000FC0007C1E000FC0007C1C000FC0007C38001FC0003C78 -001F80001FE000070000078000292679A42F>I<00007F000003FFC0000FC1F0001F00F8 -007E007C00FC007C01F8007E03F0003E07F0003F07E0003F0FE0003F1FC0003F1FC0003F -3F80003F3F80007F7F80007F7F00007F7F00007F7F0000FFFF0000FFFE0000FEFE0000FE -FE0001FEFE0001FCFC0001FCFC0003F8FC0003F8FC0007F0FC0007E0FC000FE07C000FC0 -7E001F803E003F003E007E001F00F8000F83F00003FFC00000FE0000202677A42A>I<00 -078007C000001FE03FF000003CF0787C000038F8E03E0000787FC03E0000707F801F0000 -70FF001F0000F0FE001F8000E0FE001F8000E0FC001F8001E1FC001F8001C1FC001F8001 -C1F8001F8001C1F8001F800003F8003F800003F8003F800003F0003F800003F0003F8000 -07F0007F800007F0007F800007E0007F000007E0007F00000FE000FF00000FE000FE0000 -0FC000FE00000FC001FC00001FC001FC00001FC001F800001F8003F800001F8003F00000 -3F8007E000003FC00FC000003FC00F8000003FE01F0000007FE03E0000007F70FC000000 -7E3FF00000007E0F80000000FE0000000000FE0000000000FC0000000000FC0000000001 -FC0000000001FC0000000001F80000000001F80000000003F80000000003F80000000003 -F00000000007F000000000FFFFC0000000FFFFC0000000FFFFC0000000293580A42A>I< -0000F8030007FE07001F871F003E03BF007C03FE00F801FE01F801FE03F000FE07E000FC -0FE000FC0FC000FC1FC001FC1FC001F83F8001F83F8001F87F8003F87F0003F07F0003F0 -7F0003F0FF0007F0FE0007E0FE0007E0FE0007E0FE000FE0FC000FC0FC000FC0FC000FC0 -FC001FC0FC001F80FC003F80FC003F807C007F807C00FF003E01FF003E03BF001F0F7F00 -07FE7E0001F07E0000007E000000FE000000FC000000FC000000FC000001FC000001F800 -0001F8000001F8000003F8000003F0000007F00001FFFFC001FFFFC001FFFFC0203577A4 -26>I<03C003F0000FF01FFC001E783C0F001C7C700F003C3EE03F80383FC03F80387F80 -3F80787F803F00707F003F00707F001C00F07E000000E0FE000000E0FC000000E0FC0000 -0000FC00000001FC00000001F800000001F800000001F800000003F800000003F0000000 -03F000000003F000000007F000000007E000000007E000000007E00000000FE00000000F -C00000000FC00000000FC00000001FC00000001F800000001F800000001F800000003F80 -0000003F000000000E00000000212679A423>I<0000FE000007FF80000F83C0003E00E0 -007C00F00078007000F800F001F803F001F003F001F003F001F003E003F001C003F80000 -03FC000003FFC00001FFF80001FFFE0000FFFF00007FFF80003FFF80000FFFC00000FFC0 -00003FC000001FC000000FC03E000FC07E000FC0FE000F80FE000F80FE000F80FC001F00 -E0001F00F0003E0070007C003800F8001E03E0000FFFC00001FE00001C267AA422>I<00 -03800007C0000FC0000FC0000FC0000FC0001FC0001F80001F80001F80003F80003F0000 -3F00003F00007F00007E007FFFFF7FFFFFFFFFFF00FC0000FC0000FC0001FC0001F80001 -F80001F80003F80003F00003F00003F00007F00007E00007E00007E0000FE0000FC0000F -C0000FC0001FC0001F801C1F801C1F803C3F80383F00783F00703F00F03F00E03F01C03E -03C01F07800F0F0007FC0001F000183579B31C>I<00F800000003FE0001C0078F0003E0 -0E0F8007E01E0F8007E01C0F8007E0380F800FE0381F800FE0781F800FC0701F800FC070 -3F801FC0F03F001FC0E03F001F80E07F001F80007E003F80007E003F8000FE003F0000FC -003F0000FC007F0001FC007F0001F8007E0001F8007E0001F800FE0003F800FE0003F000 -FC0E03F000FC0E03F001FC1E03F001FC1C03F001F81C03E001F81C03E001F83C03F003F8 -3803F007F83801F007F07001F01EF8F000F83C78E0003FF03FC0000FC00F00272679A42D ->I<00F0000E0003FC003F00071E007F800E1F007F801C1F007F803C1F007F80381F003F -80383F001F80703F000F80703F000F80707F000F80F07E000F00E07E000700E0FE000700 -00FC000F0000FC000E0001FC000E0001F8000E0001F8001E0003F8001C0003F0001C0003 -F0001C0003F0003C0007F000380007E000380007E000700007E000700007E000700007E0 -00E00007E000E00007E001C00007E003C00003E003800003F007000001F00E000000F83C -0000007FF80000000FC00000212679A426>I<00F0000000070003FC0003801F80071E00 -07C03FC00E1F000FC03FC01C1F000FC03FC03C1F000FC03FC0381F001FC01FC0383F001F -800FC0703F001F8007C0703F001F8007C0707F003F8007C0F07E003F800780E07E003F00 -0380E0FE003F00038000FC007F00078000FC007F00070001FC007E00070001F8007E0007 -0001F800FE000F0003F800FE000E0003F000FC000E0003F000FC000E0003F000FC001E00 -07F001FC001C0007E001F8001C0007E001F8003C0007E001F800380007E001F800380007 -E001F800780007E001F800700007E003F800F00007E003F800E00003E007F801E00003F0 -0FFC03C00001F01E7C07800000FC3C3E0F0000003FF81FFE0000000FE003F00000322679 -A437>I<0007E007C0001FF81FF800787C383C00F03E703C01E01EE0FE03C01FE0FE0380 -1FC0FE07001FC0FC0F001F80FC0E001F80700E003F80001E003F00001C003F00001C003F -000000007F000000007F000000007E000000007E00000000FE00000000FE00000000FC00 -000000FC00000001FC00000001FC00000001F800700001F800700003F800F00003F800E0 -1C03F000E07E03F001E07E07F001C0FE07F00380FE0FF00780FE0EF00F00781CF81E0078 -387C3C003FF03FF00007C00FC00027267CA427>I<00F000000003FC0001C0071E0003E0 -0E1F0007E01C1F0007E03C1F0007E0381F000FE0383F000FC0703F000FC0703F000FC070 -7F001FC0F07E001F80E07E001F80E0FE001F8000FC003F8000FC003F0001FC003F0001F8 -003F0001F8007F0003F8007E0003F0007E0003F0007E0003F000FE0007F000FC0007E000 -FC0007E000FC0007E001FC0007E001F80007E001F80007E001F80007E003F80007E003F0 -0007E007F00003E00FF00003F01FF00001F87FE000007FF7E000001FC7E00000000FE000 -00000FC00000000FC00000001FC0003F001F80007F003F80007F003F00007F007E00007F -007C00007E00FC00007001F800007003E000003807C000003C1F8000000FFE00000003F0 -000000233679A428>I<0003C00380000FF00780001FF80700003FFC0F00007FFC0E0000 -FFFE1E0000F83FFC0001F007F80001E000F00001C000E00001C001E000000003C0000000 -07800000000F000000001E000000003C000000007800000000F000000001E000000003C0 -00000007800000000F000000001E000000003C0000000078001C0000F0001C0001E0003C -0003C00038000380007800078000F8000FF801F0001FFF07E0003E1FFFE0003C0FFFC000 -780FFF80007007FF0000F003FC0000E000F0000021267BA422>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fd ectt1200 12 11 -/Fd 11 122 df<7FFFF8000000FFFFFC000000FFFFFE000000FFFFFE000000FFFFFC0000 -007FFFF800000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC000003E001FC000007 -F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007 -F001FC000007F001FC000007F07FFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFF -F0FFFFFFFFFFF07FFFFFFFFFE02C3D7DBC33>76 D<0007FE0078003FFFC07C00FFFFF0FC -01FFFFFCFC07FFFFFFFC0FFFFFFFFC0FFC03FFFC1FF0007FFC3FE0003FFC3F80001FFC7F -80000FFC7F000007FCFF000003FCFE000003FCFE000003FCFE000001FCFE000001FCFE00 -0001FCFE000001FCFF000000F87F000000007F800000007FC00000003FE00000003FF000 -00001FFE0000000FFFE0000007FFFF000003FFFFF00001FFFFFC00007FFFFF00001FFFFF -800003FFFFC000003FFFE0000003FFF00000003FF80000000FFC00000007FC00000003FE -00000001FE00000000FE00000000FF00000000FF7C0000007FFE0000007FFE0000007FFE -0000007FFE0000007FFE0000007FFF000000FFFF000000FEFF800000FEFF800001FCFFC0 -0003FCFFF00007F8FFFC000FF8FFFF807FF0FFFFFFFFE0FFFFFFFFC0FCFFFFFF80FC3FFF -FE00F80FFFFC007800FFE000283F7BBD33>83 D<001FFC00000000FFFF80000003FFFFE0 -000007FFFFF000000FFFFFFC00001FFFFFFE00001FF007FF00001FE001FF00001FE000FF -80001FE0003F80000FC0003FC0000780001FC0000000001FE0000000000FE0000000000F -E0000000000FE0000000000FE0000000000FE00000000FFFE0000001FFFFE000001FFFFF -E000007FFFFFE00001FFFFFFE00007FFFF0FE0000FFFC00FE0001FFC000FE0003FF0000F -E0007FC0000FE0007F80000FE000FF00000FE000FE00000FE000FE00000FE000FE00000F -E000FE00000FE000FE00000FE000FF00001FE0007F00001FE0007F80007FE0003FE000FF -F0003FF807FFFFF01FFFFFFFFFF80FFFFFFFFFF807FFFFF3FFF803FFFFC1FFF800FFFF00 -3FF0001FF00000002D2E7BAC33>97 D<0000FFF0000007FFFE00001FFFFF80003FFFFFC0 -007FFFFFE001FFFFFFF003FFC01FF003FE000FF007FC000FF00FF8000FF01FF00007E01F -E00003C03FC00000003F800000003F800000007F800000007F000000007F00000000FF00 -000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 -0000FE00000000FE00000000FF000000007F000000007F000000007F800000003F800001 -F03FC00003F81FE00003F81FF00007F80FF80007F007FC000FF007FF001FE003FFE07FE0 -01FFFFFFC000FFFFFF80003FFFFF00001FFFFC000007FFF8000000FFC000252E79AC33> -99 D<0000007FF800000000FFFC00000001FFFC00000001FFFC00000000FFFC00000000 -7FFC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00000000 -01FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000001FF -01FC000007FFC1FC00001FFFF1FC00007FFFF9FC0000FFFFFFFC0001FFFFFFFC0003FF81 -FFFC0007FE003FFC000FF8001FFC000FF0000FFC001FE00007FC001FC00003FC003FC000 -03FC003F800001FC007F800001FC007F000001FC007F000001FC00FF000001FC00FE0000 -01FC00FE000001FC00FE000001FC00FE000001FC00FE000001FC00FE000001FC00FE0000 -01FC00FE000001FC00FE000001FC00FF000001FC007F000001FC007F000003FC007F8000 -03FC003F800003FC003FC00007FC003FC00007FC001FE0000FFC001FF0001FFC000FF800 -3FFC0007FC007FFC0003FF81FFFFF003FFFFFFFFF800FFFFFDFFFC007FFFF9FFFC003FFF -E1FFF8000FFF80FFF00001FE0000002E3E7DBC33>I<000001FF00003FFC07FFC0007FFE -1FFFF000FFFE7FFFF800FFFEFFFFF8007FFFFFFFFC003FFFFF07FE0000FFF801FE0000FF -F000FE0000FFE000FF0000FFC0007F0000FF80007F0000FF80007F0000FF00007F0000FF -00007F0000FF00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE -00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE -00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE -00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F003FFF -F80FFFFC7FFFFC1FFFFEFFFFFE3FFFFFFFFFFE3FFFFF7FFFFC1FFFFE3FFFF80FFFFC302C -7FAB33>110 D<0001FE0000000FFFC000003FFFF000007FFFF80000FFFFFC0001FFFFFE -0003FF03FF0007FC00FF800FF8007FC00FF0003FC01FE0001FE01FC0000FE03F800007F0 -3F800007F07F800007F87F000003F87F000003F87F000003F8FE000001FCFE000001FCFE -000001FCFE000001FCFE000001FCFE000001FCFE000001FCFE000001FCFE000001FCFE00 -0001FCFF000003FC7F000003F87F000003F87F800007F83F800007F03FC0000FF03FC000 -0FF01FE0001FE01FF0003FE00FF8007FC007FC00FF8003FF03FF0001FFFFFE0000FFFFFC -00007FFFF800003FFFF000000FFFC0000001FE0000262E7AAC33>I<000001FE00003FFC -0FFFC0007FFE1FFFF000FFFE7FFFF800FFFEFFFFFE007FFFFFFFFF003FFFFE07FF0000FF -F800FF8000FFE0007FC000FFC0003FE000FF80001FE000FF80000FF000FF00000FF000FF -000007F000FE000007F800FE000003F800FE000003F800FE000003FC00FE000001FC00FE -000001FC00FE000001FC00FE000001FC00FE000001FC00FE000001FC00FE000001FC00FE -000001FC00FE000001FC00FE000003FC00FE000003F800FE000003F800FF000007F800FF -000007F000FF80000FF000FF80000FE000FFC0001FE000FFC0003FC000FFE0007FC000FF -F801FF8000FFFE07FF0000FFFFFFFE0000FEFFFFFC0000FE7FFFF80000FE3FFFE00000FE -0FFF800000FE03FE000000FE0000000000FE0000000000FE0000000000FE0000000000FE -0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE -0000000000FE0000000000FE0000000000FE0000000000FE000000003FFFF80000007FFF -FC000000FFFFFE000000FFFFFE0000007FFFFC0000003FFFF80000002E427FAB33>I<00 -000003FE007FFF801FFF80FFFFC07FFFE0FFFFC1FFFFE0FFFFC3FFFFF0FFFFC7FFFFF07F -FFCFFE0FF0001FDFF00FF0001FFFC007E0001FFF8003C0001FFF000000001FFE00000000 -1FFC000000001FF8000000001FF8000000001FF0000000001FF0000000001FE000000000 -1FE0000000001FE0000000001FC0000000001FC0000000001FC0000000001FC000000000 -1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 -1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000 -1FC0000000001FC00000007FFFFFFE0000FFFFFFFF0000FFFFFFFF0000FFFFFFFF0000FF -FFFFFF00007FFFFFFE00002C2C7DAB33>114 D<0003C00000000007E0000000000FE000 -0000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000 -0000000FE0000000000FE0000000000FE00000003FFFFFFFFC007FFFFFFFFE00FFFFFFFF -FE00FFFFFFFFFE00FFFFFFFFFE007FFFFFFFFC00000FE0000000000FE0000000000FE000 -0000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000 -0000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000 -0000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000 -0000000FE0001F00000FE0003F80000FE0003F80000FE0003F80000FE0003F80000FE000 -3F80000FE0007F80000FF0007F000007F000FF000007F801FF000007FE07FE000003FFFF -FC000001FFFFF8000000FFFFF00000007FFFE00000001FFF8000000007FC000029387EB6 -33>116 D<7FFF801FFFE0FFFFC03FFFF0FFFFE07FFFF8FFFFE07FFFF8FFFFC03FFFF07F -FF801FFFE003F80000FC0001F80001FC0001F80001F80001FC0001F80000FC0003F80000 -FE0003F000007E0003F000007E0003F000007F0007E000003F0007E000003F0007E00000 -3F800FC000001F800FC000001F800FC000000FC01F8000000FC01F8000000FE01F800000 -07E03F00000007E03F00000007F03F00000003F03F00000003F07E00000001F87E000000 -01F87E00000001F87C00000000F8FC00000000FCFC00000000FCF8000000007CF8000000 -007DF8000000003FF0000000003FF0000000003FF0000000001FE0000000001FE0000000 -001FE0000000000FC0000000000FC0000000001FC0000000001F80000000001F80000000 -003F80000000003F00000000003F00000000003F00000000007E00000000007E00000000 -00FE0000003F00FC0000003F01FC0000007F81F80000007F83F80000007F87F00000007F -9FF00000007FFFE00000003FFFC00000003FFF800000001FFF000000000FFC0000000003 -F0000000002D427DAA33>121 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fe ectt1440 14.4 6 -/Fe 6 113 df<7FFFFF00000000FFFFFF80000000FFFFFFC0000000FFFFFFC0000000FF -FFFFC0000000FFFFFF800000007FFFFF0000000000FE000000000000FE000000000000FE -000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00 -0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000 -00000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000 -000000FE000000000000FE000000000000FE000000000000FE000000000000FE00000000 -0000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000 -00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000 -FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE -000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00 -0000000000FE000000000000FE000000000000FE000000000000FE00000007C000FE0000 -000FE000FE0000000FE000FE0000000FE000FE0000000FE000FE0000000FE000FE000000 -0FE000FE0000000FE000FE0000000FE000FE0000000FE000FE0000000FE000FE0000000F -E07FFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0 -FFFFFFFFFFFFE07FFFFFFFFFFFC033497BC83D>76 D<0003FFFFC000003FFFFFFC0000FF -FFFFFF0003FFFFFFFFC007FFFFFFFFE00FFFFFFFFFF01FFFFFFFFFF81FFF0000FFF81FF8 -00001FF83FF000000FFC3FC0000003FC3FC0000003FC7F80000001FE7F80000001FE7F80 -000001FE7F00000000FE7F00000000FE7F00000000FE7F00000000FE7F00000000FEFF00 -000000FFFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE00 -0000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE00 -0000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE00 -0000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE00 -0000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE00 -0000007FFE000000007FFE000000007FFF00000000FFFF00000000FF7F00000000FE7F00 -000000FE7F00000000FE7F00000000FE7F00000000FE7F80000001FE7F80000001FE7F80 -000001FE3FC0000003FC3FE0000007FC3FF000000FFC1FFC00003FF81FFF8001FFF81FFF -FFFFFFF80FFFFFFFFFF007FFFFFFFFE003FFFFFFFFC000FFFFFFFF00003FFFFFFC000003 -FFFFC000304B7AC93D>79 D<0000FFE000F00007FFFC00F8001FFFFF81F8007FFFFFE1F8 -01FFFFFFF1F803FFFFFFFBF807FFFFFFFFF80FFF803FFFF80FFC0007FFF81FF00001FFF8 -3FE00000FFF83FC000003FF87F8000003FF87F8000001FF87F0000000FF8FF0000000FF8 -FE00000007F8FE00000007F8FE00000007F8FE00000003F8FE00000003F8FE00000003F8 -FF00000003F87F00000001F07F00000000007F80000000003FC0000000003FE000000000 -1FF0000000001FFC000000000FFF0000000007FFF000000003FFFF00000001FFFFF80000 -007FFFFF8000003FFFFFE000000FFFFFF8000001FFFFFE0000001FFFFF00000001FFFF80 -0000001FFFC000000001FFE0000000003FF0000000001FF80000000007F80000000003FC -0000000003FC0000000001FE0000000000FE0000000000FE0000000000FF7C000000007F -FE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFF000000007F -FF00000000FFFF00000000FEFF80000000FEFF80000001FEFFC0000003FCFFE0000007FC -FFF800000FF8FFFC00001FF8FFFF80007FF0FFFFF801FFE0FFFFFFFFFFC0FEFFFFFFFF80 -FC7FFFFFFF00FC1FFFFFFE00FC07FFFFF800F800FFFFE00078000FFF0000304B7AC93D> -83 D<00001FF800000000FFFF80000003FFFFE000000FFFFFF800001FFFFFFC00003FFF -FFFE00007FFFFFFF0000FFF80FFF8001FFC001FFC003FF00007FE007FC00001FE00FF800 -000FF00FF000000FF01FE0000007F81FE0000003F83FC0000003F83F80000003FC3F8000 -0001FC7F80000001FC7F00000001FC7F00000001FEFF00000000FEFE00000000FEFFFFFF -FFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFF -FFFFFCFE0000000000FF00000000007F00000000007F00000000007F00000000007F8000 -0000003F80000000003FC0000000001FE00000007C1FE0000000FE0FF0000000FE0FF800 -0000FE07FC000001FE03FF000003FC03FF800007FC01FFF0001FF800FFFE00FFF0007FFF -FFFFE0003FFFFFFFC0000FFFFFFF800007FFFFFF000001FFFFFC0000007FFFE000000007 -FF00002F3679B43D>101 D<0000003FE000007FFE01FFFC0000FFFF07FFFE0000FFFF1F -FFFF8000FFFF3FFFFF8000FFFF7FFFFFC000FFFFFFFFFFE0007FFFFFC07FE000007FFE00 -1FF000007FFC000FF000007FF80007F000007FF00007F800007FE00007F800007FC00003 -F800007FC00003F800007F800003F800007F800003F800007F800003F800007F000003F8 -00007F000003F800007F000003F800007F000003F800007F000003F800007F000003F800 -007F000003F800007F000003F800007F000003F800007F000003F800007F000003F80000 -7F000003F800007F000003F800007F000003F800007F000003F800007F000003F800007F -000003F800007F000003F800007F000003F800007F000003F800007F000003F800007F00 -0003F800007F000003F800007F000003F800007F000003F800007F000003F800007F0000 -03F8007FFFFF01FFFFF8FFFFFF83FFFFFCFFFFFF87FFFFFCFFFFFF87FFFFFCFFFFFF87FF -FFFCFFFFFF83FFFFFC7FFFFF01FFFFF836347DB33D>110 D<0000001FF000007FFE00FF -FC0000FFFF03FFFF0000FFFF0FFFFFC000FFFF3FFFFFE000FFFF7FFFFFF000FFFFFFFFFF -F8007FFFFFC07FFC00007FFF000FFE00007FFC0007FE00007FF80001FF00007FF00000FF -00007FE00000FF80007FC000007F80007F8000003FC0007F8000003FC0007F8000001FE0 -007F0000001FE0007F0000000FE0007F0000000FE0007F0000000FF0007F0000000FF000 -7F00000007F0007F00000007F0007F00000007F0007F00000007F0007F00000007F0007F -00000007F0007F00000007F0007F00000007F0007F00000007F0007F0000000FF0007F00 -00000FF0007F0000000FE0007F8000000FE0007F8000001FE0007F8000001FC0007FC000 -003FC0007FC000003FC0007FE000007F80007FE00000FF80007FF00001FF00007FF80003 -FF00007FFC0007FE00007FFE001FFC00007FFFC0FFF800007FFFFFFFF800007F7FFFFFE0 -00007F3FFFFFC000007F0FFFFF8000007F07FFFE0000007F01FFF80000007F003FE00000 -007F0000000000007F0000000000007F0000000000007F0000000000007F000000000000 -7F0000000000007F0000000000007F0000000000007F0000000000007F0000000000007F -0000000000007F0000000000007F0000000000007F0000000000007F0000000000007F00 -00000000007F0000000000007F0000000000007F00000000007FFFFF00000000FFFFFF80 -000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF800000007FFFFF0000 -0000344F7DB33D>112 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Ff ecss1000 10 55 -/Ff 55 122 df<FFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFF -FFFFFFC0FFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFC05205809853>22 -D<0001F807F00007FE07F0000FFE07F0001FFE07F0003FFE07F0007F0E07F0007E0207F0 -00FE00000000FC00000000FC00000001FC00000001FC00000001FC00000001FC00000001 -FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC -00000001FC00000001FC000000FFFFFE07F0FFFFFE07F0FFFFFE07F0FFFFFE07F0FFFFFE -07F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007 -F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F0 -01FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001 -FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC -0007F001FC0007F001FC0007F001FC0007F0243D7FBC2C>28 D<FFFFFCFFFFFCFFFFFCFF -FFFCFFFFFC16057F941C>45 D<FEFEFEFEFEFEFE0707788617>I<0003F80000001FFF00 -00007FFFC00000FFFFE00001FFFFF00003FE0FF80007F803FC000FF001FE000FE000FE00 -1FC0007F001F80003F003F80003F803F80003F803F00001F807F00001FC07F00001FC07F -00001FC07E00000FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00 -000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE0000 -0FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000F -E0FE00000FE07F00001FC07F00001FC07F00001FC07F00001FC07F00001FC03F80003F80 -3F80003F803F80003F801FC0007F001FC0007F000FE000FE000FF001FE0007F803FC0003 -FE0FF80001FFFFF00000FFFFE000007FFFC000001FFF00000003F80000233A7DB72A>48 -D<0000C0000001C0000007C000001FC00000FFC000FFFFC000FFFFC000FFFFC000FFFFC0 -00FF1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 -00001FC000001FC000001FC000001FC000001FC000001FC0007FFFFFF07FFFFFF07FFFFF -F07FFFFFF07FFFFFF01C3879B72A>I<000FF80000007FFF000001FFFFC00003FFFFE000 -07FFFFF0000FFFFFF8001FF01FFC001FC007FE003F0001FF003E0000FF007E0000FF807C -00007F80FC00003F80F800003F807800003FC03800003FC03000001FC01000001FC00000 -001FC00000001FC00000003FC00000003FC00000003F800000003F800000007F80000000 -7F00000000FE00000000FE00000001FC00000003F800000007F00000000FE00000001FC0 -0000003F800000007F00000000FE00000001FC00000003F800000007F00000000FC00000 -001F800000003F000000007E00000000FC00000001F800000003F000000007E00000000F -C00000001F800000003F000000007FFFFFFFC07FFFFFFFC07FFFFFFFC07FFFFFFFC07FFF -FFFFC07FFFFFFFC022387DB72A>I<0007F80000003FFF000000FFFFC00001FFFFE00003 -FFFFF0000FFFFFF8000FFC0FFC001FE003FE003FC001FE001F0000FE000E0000FF000E00 -00FF000400007F000000007F000000007F00000000FF00000000FF00000000FE00000001 -FE00000001FC00000003FC00000007F80000000FF00000007FE000001FFFC000001FFF80 -00001FFE0000001FFF8000001FFFE00000000FF800000003FC00000000FE000000007F00 -0000007F800000003F800000003FC00000003FC00000001FE00000001FE00000001FE000 -00001FE00000001FE00000001FE00000001FE04000003FE06000003FC07000003FC0F800 -007F80FC00007F80FF0000FF007FC003FF003FF80FFE001FFFFFFC000FFFFFF80003FFFF -F00001FFFFC000007FFF00000007FC0000233A7DB72A>I<000007F80000000FF8000000 -0FF80000001BF80000003BF80000003BF80000007BF800000073F8000000F3F8000001F3 -F8000001F3F8000003E3F8000003E3F8000007C3F800000FC3F800000FC3F800001F83F8 -00001F83F800003F03F800007F03F800007E03F80000FE03F80000FC03F80001F803F800 -03F803F80003F003F80007F003F80007E003F8000FE003F8001FC003F8001F8003F8003F -8003F8003F0003F8007F0003F800FE0003F800FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFF -FFFFF8FFFFFFFFF8000003F800000003F800000003F800000003F800000003F800000003 -F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8 -00000003F80025367EB52A>I<1FFFFFFE001FFFFFFE001FFFFFFE001FFFFFFE001FFFFF -FE001FFFFFFE001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000 -001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0000000 -1FC1FC00001FCFFF00001FDFFFC0001FFFFFE0001FFFFFF0001FFE07F8001FF803FC001F -F001FE001FE000FF001FC000FF001F80007F000000007F800000007F800000003F800000 -003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000000 -3FC00000003FC00000007F801000007F803800007F80380000FF007C0001FF00FF0003FE -007F8007FC003FF01FF8001FFFFFF0000FFFFFE00007FFFFC00003FFFF800000FFFE0000 -001FF0000022387DB52A>I<00003FE0000001FFF8000007FFFE00000FFFFE00003FFFFE -00007FFFFE0000FFE01E0001FF00060001FE00000003F800000007F000000007F0000000 -0FE00000001FC00000001FC00000001F800000003F800000003F800000007F007F00007F -03FFC0007F0FFFF0007F3FFFF8007E7FFFFC00FEFE07FE00FFF801FE00FFE000FF00FFC0 -007F00FFC0003F80FF80003F80FF80001FC0FF00001FC0FF00001FC0FF00000FE0FE0000 -0FE0FE00000FE0FE00000FE0FE00000FE0FF00000FE07E00000FE07F00000FE07F00000F -E07F00000FE07F00000FE03F00001FC03F80001FC03F80001FC01F80003F801FC0003F80 -0FE0007F000FE000FF0007F801FE0007FE07FC0003FFFFF80001FFFFF00000FFFFE00000 -3FFFC000001FFF00000003FC0000233A7DB72A>I<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0 -FFFFFFFFE0FFFFFFFFE0FFFFFFFFE000000007E00000000FC00000001F800000003F0000 -00007E00000000FE00000000FC00000001F800000003F800000007F000000007F0000000 -0FE00000001FC00000001FC00000003F800000003F800000007F000000007F00000000FE -00000000FE00000001FE00000001FC00000003FC00000003F800000007F800000007F800 -000007F00000000FF00000000FF00000000FF00000000FE00000001FE00000001FE00000 -001FE00000001FC00000003FC00000003FC00000003FC00000003FC00000003FC0000000 -3F800000007F800000007F800000007F800000007F800000007F800000007F800000007F -800000007F80000023377DB52A>I<0003F80000001FFF0000007FFFC00000FFFFE00003 -FFFFF80003FFFFF80007FC07FC000FF001FE000FE000FE001FC0007F001F80003F003F80 -003F803F00001F803F00001F803F00001F803F00001F803F00001F803F00001F801F8000 -3F001F80003F000FC0007E000FC0007E0007E000FC0003F803F80000FFFFE000007FFFC0 -00000FFE0000001FFF000000FFFFE00001FF1FF00007F803FC000FE000FE001FC0007F00 -3F80003F803F00001F807F00001FC07F00001FC0FE00000FE0FE00000FE0FE00000FE0FE -00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07F00001FC07F00001FC07F80 -003FC03F80003F803FC0007F801FF001FF000FFC07FE0007FFFFFC0003FFFFF80001FFFF -F00000FFFFE000003FFF80000007FC0000233A7DB72A>I<0003FC0000001FFF0000007F -FFC00000FFFFE00001FFFFF00003FFFFF80007FC07FC000FF001FC001FE000FE001FC000 -7E003F80007F003F80003F007F00003F807F00003F807F00001F80FE00001FC0FE00001F -C0FE00001FC0FE00000FC0FE00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0 -FE00000FE0FE00001FE07F00001FE07F00001FE07F00003FE03F80003FE03F80007FE01F -C0007FE01FE000FFE00FF003FFE00FFC0FEFE007FFFFCFC003FFFF9FC001FFFE1FC0007F -F81FC0001FC01FC00000001F800000003F800000003F800000007F000000007F00000000 -FE00000000FE00000001FC00000003F800060007F80007001FF0000FC07FE0000FFFFFC0 -001FFFFF80000FFFFF000007FFFC000001FFF80000003FC00000233A7DB72A>I<000007 -F8000000000007F800000000000FFC00000000000FFC00000000001FFE00000000001FFE -00000000001F7E00000000003F7F00000000003E7F00000000003E7F00000000007E3F80 -000000007E3F80000000007C3F8000000000FC3FC000000000FC1FC000000000FC1FC000 -000001F81FE000000001F80FE000000003F80FF000000003F00FF000000003F00FF00000 -0007F007F800000007E007F800000007E007F80000000FE003FC0000000FC003FC000000 -0FC003FC0000001FC001FE0000001F8001FE0000003F8001FF0000003F8000FF0000003F -0000FF0000007F0000FF8000007F00007F8000007E00007F800000FE00003FC00000FFFF -FFFFC00000FFFFFFFFC00001FFFFFFFFE00001FFFFFFFFE00001FFFFFFFFE00003F80000 -0FF00003F000000FF00007F000000FF80007F0000007F80007E0000007F8000FE0000007 -FC000FE0000003FC000FC0000003FC001FC0000003FE001FC0000001FE001F80000001FE -003F80000000FF003F80000000FF007F00000000FF807F000000007F807E000000007F80 -FE000000007FC0323A7EB937>65 D<FFFFFF800000FFFFFFF80000FFFFFFFE0000FFFFFF -FF8000FFFFFFFFC000FF0001FFF000FF00003FF800FF00000FF800FF000007FC00FF0000 -03FE00FF000001FE00FF000000FE00FF000000FF00FF0000007F00FF0000007F00FF0000 -007F00FF0000007F00FF000000FF00FF000000FE00FF000001FE00FF000003FC00FF0000 -07FC00FF00000FF800FF00003FF000FF0000FFC000FFFFFFFF8000FFFFFFFE0000FFFFFF -F80000FFFFFFFF0000FFFFFFFFC000FF0003FFF000FF00003FF800FF000007FC00FF0000 -03FE00FF000000FF00FF0000007F80FF0000003FC0FF0000003FC0FF0000001FC0FF0000 -001FE0FF0000000FE0FF0000000FE0FF0000000FE0FF0000000FE0FF0000001FE0FF0000 -001FC0FF0000003FC0FF0000003FC0FF0000007F80FF000001FF80FF000003FF00FF0000 -0FFE00FF00007FFC00FFFFFFFFF800FFFFFFFFE000FFFFFFFF8000FFFFFFFE0000FFFFFF -E000002B3A79B937>I<000003FF800000001FFFF8000000FFFFFF000001FFFFFFC00007 -FFFFFFC0000FFFFFFFC0001FFE00FF80007FF0000F8000FFC000038000FF8000018001FF -0000000003FE0000000007FC0000000007F8000000000FF8000000000FF0000000001FE0 -000000001FE0000000003FC0000000003FC0000000003FC0000000007F80000000007F80 -000000007F80000000007F8000000000FF0000000000FF0000000000FF0000000000FF00 -00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 -00000000FF0000000000FF00000000007F80000000007F80000000007F80000000007F80 -000000003FC0000000003FC0000000003FC0000000001FE0000000001FE0000000000FF0 -000000000FF80000000007F80000000007FC0000000003FE0000000001FF0000002000FF -800000E000FFC00001E0007FF0000FE0001FFE007FE0000FFFFFFFE00007FFFFFFC00001 -FFFFFF000000FFFFFE0000001FFFF000000003FF80002B3E7BBB35>I<FFFFFFFFF0FFFF -FFFFF0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000 -00FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000 -FF00000000FF00000000FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FF -00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FFFFFFFF -FCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFC263A78B932 ->69 D<000003FF800000003FFFF8000000FFFFFE000003FFFFFFC00007FFFFFFE0000FFF -FFFFE0003FFE00FFE0007FF0001FC000FFC00007C000FF800001C001FF0000004003FE00 -00000007FC0000000007F8000000000FF8000000000FF0000000001FE0000000001FE000 -0000003FC0000000003FC0000000003FC0000000007F80000000007F80000000007F8000 -0000007F8000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000 -000000FF0000000000FF0000000000FF0000000000FF0000000000FF00003FFFF0FF0000 -3FFFF0FF00003FFFF07F80003FFFF07F80003FFFF07F80000007F07F80000007F03FC000 -0007F03FC0000007F03FC0000007F01FE0000007F01FE0000007F00FF0000007F00FF800 -0007F007F8000007F007FC000007F003FE000007F001FF000007F000FF800007F000FFC0 -0007F0007FF00007F0003FFE007FF0000FFFFFFFF00007FFFFFFF00003FFFFFFC00000FF -FFFF0000003FFFF800000003FF80002C3E7BBB37>71 D<FFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFF083A79B917>73 D<FE0000001FF0FE0000003FE0FE0000007FC0FE -000000FF80FE000001FF00FE000003FE00FE000007FC00FE00000FF800FE00001FF000FE -00003FE000FE00003FC000FE00007F8000FE0000FF0000FE0001FE0000FE0003FC0000FE -0007F80000FE000FF80000FE001FF00000FE003FE00000FE007FC00000FE00FF800000FE -01FF000000FE03FE000000FE07FE000000FE0FFF000000FE0FFF000000FE1FFF800000FE -3FFFC00000FE7F9FC00000FEFF1FE00000FFFE0FF00000FFFE07F00000FFFC07F80000FF -F803FC0000FFF001FC0000FFE001FE0000FFC000FF0000FF80007F0000FF00007F8000FE -00003FC000FE00001FC000FE00001FE000FE00000FF000FE000007F000FE000007F800FE -000003FC00FE000001FC00FE000001FE00FE000000FF00FE0000007F00FE0000007F80FE -0000003FC0FE0000001FC0FE0000001FE0FE0000000FF0FE00000007F0FE00000007F8FE -00000003FC2E3A78B93A>75 D<FF00000000FF00000000FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000 -00FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000 -FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF -00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000 -00FF00000000FF00000000FF00000000FF00000000FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0 -FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0223A79B92D>I<FFC000000007FFFFC000000007FF -FFC000000007FFFFE00000000FFFFFE00000000FFFFFF00000001FFFFEF00000001F7FFE -F00000001F7FFEF80000003F7FFE780000003E7FFE780000003E7FFE7C0000007E7FFE7C -0000007E7FFE3E000000FC7FFE3E000000FC7FFE3E000000FC7FFE3F000001FC7FFE1F00 -0001F87FFE1F000001F87FFE1F800003F87FFE0F800003F07FFE0FC00007F07FFE0FC000 -07F07FFE07C00007E07FFE07E0000FE07FFE07E0000FE07FFE03E0000FC07FFE03F0001F -C07FFE03F0001FC07FFE01F0001F807FFE01F8003F807FFE01F8003F807FFE00F8003F00 -7FFE00FC007F007FFE007C007E007FFE007E00FE007FFE007E00FE007FFE003E00FC007F -FE003F01FC007FFE003F01FC007FFE001F01F8007FFE001F83F8007FFE001F83F8007FFE -000F83F0007FFE000FC7F0007FFE0007C7E0007FFE0007C7E0007FFE0007C7E0007FFE00 -03EFC0007FFE0003EFC0007FFE0003FFC0007FFE0001FF80007FFE0001FF80007FFE0000 -FF00007FFE0000FF00007FFE0000FF00007FFE00000000007FFE00000000007F383A78B9 -49>I<FFE000001FC0FFE000001FC0FFF000001FC0FFF000001FC0FFF800001FC0FFF800 -001FC0FEFC00001FC0FEFC00001FC0FE7E00001FC0FE7E00001FC0FE7F00001FC0FE3F00 -001FC0FE3F80001FC0FE1F80001FC0FE1F80001FC0FE0FC0001FC0FE0FC0001FC0FE0FE0 -001FC0FE07E0001FC0FE07F0001FC0FE03F0001FC0FE03F8001FC0FE01F8001FC0FE01FC -001FC0FE00FC001FC0FE00FE001FC0FE00FE001FC0FE007F001FC0FE007F001FC0FE003F -801FC0FE003F801FC0FE001FC01FC0FE001FC01FC0FE000FC01FC0FE000FE01FC0FE0007 -E01FC0FE0007F01FC0FE0003F01FC0FE0003F81FC0FE0001F81FC0FE0001FC1FC0FE0000 -FC1FC0FE0000FC1FC0FE00007E1FC0FE00007E1FC0FE00007F1FC0FE00003F1FC0FE0000 -3F9FC0FE00001F9FC0FE00001F9FC0FE00000FDFC0FE00000FDFC0FE000007FFC0FE0000 -07FFC0FE000003FFC0FE000003FFC0FE000001FFC0FE000001FFC02A3A78B93B>I<0000 -07F800000000007FFF8000000001FFFFE000000003FFFFF00000000FFFFFFC0000001FFC -0FFE0000003FE001FF0000007F80007F800000FF00003FC00001FE00001FE00003FC0000 -0FF00003F8000007F00007F8000007F8000FF0000003FC000FE0000001FC001FE0000001 -FE001FC0000000FE001FC0000000FE003FC0000000FF003F800000007F007F800000007F -807F800000007F807F800000007F807F000000003F807F000000003F80FF000000003FC0 -FF000000003FC0FF000000003FC0FF000000003FC0FF000000003FC0FF000000003FC0FF -000000003FC0FF000000003FC0FF000000003FC0FF000000003FC0FF000000003FC0FF00 -0000003FC07F800000007F807F800000007F807F800000007F807F800000007F807F8000 -00007F803FC0000000FF003FC0000000FF003FE0000001FF001FE0000001FE001FE00000 -01FE000FF0000003FC000FF0000003FC0007F8000007F80003FC00000FF00003FE00001F -F00001FE00001FE00000FF00003FC000007FC000FF8000003FE001FF0000001FFC0FFE00 -00000FFFFFFC00000007FFFFF800000001FFFFE0000000007FFF800000000007F8000000 -323E7BBB3D>I<FFFFFFC00000FFFFFFF80000FFFFFFFF0000FFFFFFFF8000FFFFFFFFE0 -00FF0000FFF000FF00001FF800FF000007FC00FF000003FC00FF000001FE00FF000000FE -00FF000000FF00FF0000007F00FF0000007F80FF0000007F80FF0000003F80FF0000003F -80FF0000003F80FF0000003F80FF0000007F80FF0000007F80FF0000007F00FF000000FF -00FF000000FE00FF000001FE00FF000003FC00FF000007FC00FF00001FF800FF0000FFF0 -00FFFFFFFFE000FFFFFFFF8000FFFFFFFF0000FFFFFFF80000FFFFFFC00000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000293A79B935 ->I<FFFFFF800000FFFFFFF80000FFFFFFFE0000FFFFFFFF8000FFFFFFFFC000FF0000FF -E000FF00001FF000FF00000FF800FF000003FC00FF000001FC00FF000001FE00FF000000 -FE00FF000000FF00FF000000FF00FF0000007F00FF0000007F00FF0000007F00FF000000 -FF00FF000000FF00FF000000FE00FF000001FE00FF000001FC00FF000003FC00FF00000F -F800FF00001FF000FF0000FFE000FFFFFFFFC000FFFFFFFF8000FFFFFFFE0000FFFFFFF8 -0000FFFFFFE00000FF000FF00000FF0007F00000FF0007F80000FF0003F80000FF0003FC -0000FF0001FC0000FF0001FE0000FF0000FF0000FF00007F0000FF00007F8000FF00003F -8000FF00003FC000FF00001FE000FF00001FE000FF00000FF000FF00000FF000FF000007 -F800FF000003F800FF000003FC00FF000001FE00FF000001FE00FF000000FF00FF000000 -FF00FF0000007F80FF0000003FC0FF0000003FC0FF0000001FE02B3A78B936>82 -D<0003FF0000001FFFF000007FFFFE0001FFFFFF8003FFFFFFC007FFFFFFC00FFE00FFC0 -1FF0001F803FE00007803F800003807F800000807F000000007F00000000FE00000000FE -00000000FE00000000FE00000000FE00000000FE00000000FF000000007F000000007F80 -0000007FC00000003FF00000003FFC0000001FFFC000000FFFFC000007FFFF800003FFFF -E00001FFFFF80000FFFFFC00003FFFFE000007FFFF0000007FFF80000007FFC0000000FF -E00000007FE00000001FF00000000FF00000000FF000000007F800000007F800000003F8 -00000003F800000003F800000003F800000003F800000003F800000007F040000007F060 -000007F07800000FE07C00001FE0FF00003FC0FFC000FF80FFFC03FF807FFFFFFF001FFF -FFFE000FFFFFF80001FFFFF000007FFFC0000007FE0000253E7CBB2E>I<FE0000007FC0 -00000FE07F0000007FC000000FC07F000000FFC000001FC07F000000FFE000001FC07F00 -0000FFE000001FC03F800000FFE000001F803F800001FBE000003F803F800001FBF00000 -3F803F800001F3F000003F801FC00001F3F000007F001FC00003F1F800007F001FC00003 -F1F800007F000FE00003F1F800007E000FE00007E1F80000FE000FE00007E1FC0000FE00 -0FE00007E0FC0000FE0007F00007E0FC0000FC0007F0000FC0FC0001FC0007F0000FC0FE -0001FC0007F0000FC07E0001FC0003F8000FC07E0001F80003F8001F807E0003F80003F8 -001F807F0003F80001FC001F803F0003F00001FC001F803F0007F00001FC003F003F8007 -F00001FC003F001F8007F00000FE003F001F8007E00000FE007E001F800FE00000FE007E -001FC00FE000007E007E000FC00FC000007F007E000FC00FC000007F00FC000FC01FC000 -007F00FC000FE01FC000003F00FC0007E01F8000003F80FC0007E01F8000003F80F80007 -E03F8000003F81F80007F03F8000001F81F80003F03F0000001F81F80003F03F0000001F -C1F00003F07F0000000FC3F00001F87E0000000FC3F00001F87E0000000FC3E00001F87E -0000000FE3E00001F87E00000007E3E00000F8FC00000007E7E00000FCFC00000007E7C0 -0000FCFC00000007E7C00000FCFC00000003E7C000007CF800000003F7C000007DF80000 -0003F78000007DF800000001FF8000003FF000000001FF8000003FF000000001FF000000 -3FF000000001FF0000003FF000000000FF0000001FE000000000FF0000001FE000004B3A -7FB94E>87 D<3FE0000000FF003FF0000001FE001FF0000003FE000FF8000003FC0007FC -000007F80007FC00000FF80003FE00000FF00001FF00001FE00000FF00003FE00000FF80 -003FC000007FC0007F8000003FE000FF0000001FE001FF0000001FF001FE0000000FF803 -FC00000007F807FC00000007FC07F800000003FE0FF000000001FE1FF000000000FF1FE0 -00000000FFBFC0000000007FFF80000000003FFF80000000001FFF00000000001FFE0000 -0000000FFE000000000007FC000000000003F8000000000007FC00000000000FFE000000 -00001FFF00000000001FFF00000000003FFF80000000007FBFC0000000007F3FC0000000 -00FF1FE000000001FE0FF000000001FC07F800000003FC07F800000007F803FC0000000F -F001FE0000000FF001FF0000001FE000FF0000003FC0007F8000003FC0007FC000007F80 -003FE00000FF00001FE00001FF00001FF00001FE00000FF80003FC000007FC0007FC0000 -07FC0007F8000003FE000FF0000001FF001FF0000000FF801FE0000000FF803FC0000000 -7FC07FC00000003FE0FF800000003FF0343A7FB937>I<001FF00000FFFC0003FFFF000F -FFFF801FFFFFC01FE01FE01F000FF01C0007F0180003F8100003F8000003F8000001FC00 -0001FC000001FC000001FC000001FC000001FC000001FC00003FFC000FFFFC00FFFFFC03 -FFFFFC0FFFFFFC1FFE01FC3FE001FC7F8001FC7F0001FCFE0001FCFE0001FCFE0001FCFE -0001FCFE0003FCFF0003FC7F800FFC7FE03FFC3FFFFFFC1FFFFFFC0FFFF9FC07FFE1FC01 -FE00001E287DA628>97 D<FE00000000FE00000000FE00000000FE00000000FE00000000 -FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE -00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 -000000FE00000000FE00000000FE01FC0000FE0FFF0000FE3FFFC000FEFFFFE000FFFFFF -F000FFF03FF800FFC007F800FF8003FC00FF0001FC00FE0000FE00FE0000FE00FE00007F -00FE00007F00FE00007F00FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80 -FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE00007F00FE00007F00FE -00007F00FE0000FF00FE0000FE00FE0001FE00FF0001FC00FF8003FC00FFC00FF800FFF0 -3FF000FFFFFFE000FEFFFFC000FE7FFF8000FE1FFE00000007F80000213D7ABB2B>I<00 -03FE00001FFFC0007FFFE000FFFFF801FFFFFC03FC03FC07F8007C0FE000381FC000081F -C000003F8000003F8000007F0000007F0000007F0000007E000000FE000000FE000000FE -000000FE000000FE000000FE000000FE000000FE000000FE0000007F0000007F0000007F -0000003F8000003F8000003FC000021FC000060FE0001E07F0007E07FC03FE03FFFFFE00 -FFFFFC007FFFF0001FFFC00007FC001F287DA625>I<0000003F800000003F800000003F -800000003F800000003F800000003F800000003F800000003F800000003F800000003F80 -0000003F800000003F800000003F800000003F800000003F800000003F800000003F8000 -00003F800000003F800000003F800000003F800000003F80000FE03F80003FFC3F8000FF -FF3F8001FFFFBF8003FFFFFF8007FE07FF800FF801FF801FE000FF801FC0007F803FC000 -3F803F80003F807F80003F807F00003F807F00003F807F00003F80FE00003F80FE00003F -80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80 -FE00003F807F00003F807F00003F807F00003F803F80003F803F80007F801FC0007F801F -E000FF800FF003FF8007FE07FF8003FFFFBF8001FFFF3F8000FFFE3F80007FF83F80000F -E00000213D7DBB2B>I<0007F800001FFE00007FFF8001FFFFC003FFFFE007FC0FF00FF0 -03F80FE001F81FC000FC1F80007C3F80007E3F00003E7F00003E7E00003E7E00001FFE00 -001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000FC000000FE000000FE00 -00007E0000007E0000007F0000003F0000003F8000001FC000001FE000020FF0000E07F8 -003E03FE01FE01FFFFFE00FFFFFC007FFFF0001FFFC00003FE0020287EA625>I<0000FF -000003FFC0000FFFC0001FFFC0003FFFC0007F81C000FE004000FC000001FC000001F800 -0001F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800 -0003F8000003F8000003F8000003F8000003F80000FFFFFC00FFFFFC00FFFFFC00FFFFFC -00FFFFFC0003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800 -0003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800 -0003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F8000003F800 -0003F8000003F8000003F8000003F8000003F8000003F800001A3D7FBC19>I<0007E001 -F8003FFC1FF8007FFEFFFC01FFFFFFFC03FFFFFFFC03F81FF80007F00FE0000FE007F000 -0FC003F0000FC003F0001F8001F8001F8001F8001F8001F8001F8001F8001F8001F8001F -8001F8001F8001F8000FC003F0000FC003F0000FE007F00007F00FE00003F81FC00007FF -FFC00007FFFF80000FFFFE00000F3FFC00001F07E000001F000000001F000000001F0000 -00001F800000001FC00000000FFFFFC0000FFFFFF8000FFFFFFE0007FFFFFF8007FFFFFF -C00FFFFFFFE01FFFFFFFE03F80007FF07F00000FF07E000003F8FC000001F8FC000001F8 -FC000001F8FC000001F8FE000003F87E000003F07F80000FF03FC0001FE01FFC01FFC00F -FFFFFF8007FFFFFF0001FFFFFC00007FFFF0000007FF000026387EA52A>I<FE000000FE -000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE -000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE -000000FE000000FE000000FE01FC00FE0FFF80FE1FFFC0FE7FFFE0FEFFFFF0FFF81FF8FF -E007F8FFC003F8FF8003FCFF8001FCFF0001FCFF0001FCFF0001FCFE0001FCFE0001FCFE -0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE -0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE -0001FCFE0001FCFE0001FCFE0001FCFE0001FC1E3C7ABB2B>I<FFFFFFFFFFFFFFFF0000 -000000000000000000007F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F -7F7F7F7F7F7F7F7F7F7F7F08397BB814>I<000FF0000FF0000FF0000FF0000FF0000FF0 -000FF0000FF0000000000000000000000000000000000000000000000000000000000000 -0000000000000007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 -0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 -0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 -0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 -400FE0601FE0FC7FC0FFFFC0FFFF807FFF001FFE0003F800144A85B816>I<FE00000000 -FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE -00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 -000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 -0000FE0003FE00FE0007FC00FE000FF800FE001FF000FE003FE000FE007FC000FE00FF80 -00FE01FF0000FE03FE0000FE03FC0000FE07F80000FE0FF00000FE1FE00000FE3FC00000 -FE7F800000FEFFC00000FFFFE00000FFFFE00000FFFFF00000FFF7F80000FFE3F80000FF -C1FC0000FF80FE0000FF00FF0000FE007F0000FE003F8000FE003FC000FE001FC000FE00 -0FE000FE000FF000FE0007F000FE0003F800FE0001FC00FE0001FE00FE0000FE00FE0000 -7F00FE00007F80213C7ABB29>I<FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE -FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE -FEFE073C7ABB14>I<0001FC0003F800FE0FFF801FFF00FE1FFFC03FFF80FE7FFFE0FFFF -C0FEFFFFF1FFFFE0FFF81FFBF03FF0FFE007FBC00FF0FFC003FF8007F0FF8003FF0007F8 -FF8001FF0003F8FF0001FE0003F8FF0001FE0003F8FF0001FE0003F8FE0001FC0003F8FE -0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE00 -01FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001 -FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC -0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F8FE0001FC00 -03F8FE0001FC0003F8FE0001FC0003F8FE0001FC0003F835267AA542>I<0001FC00FE0F -FF80FE1FFFC0FE7FFFE0FEFFFFF0FFF81FF8FFE007F8FFC003F8FF8003FCFF8001FCFF00 -01FCFF0001FCFF0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE00 -01FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE00 -01FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE00 -01FC1E267AA52B>I<0003FE0000000FFF8000003FFFE00000FFFFF80001FFFFFC0003FE -03FE0007F800FF000FF0007F800FE0003F801FC0001FC03F80000FE03F80000FE03F0000 -07E07F000007F07F000007F07E000003F0FE000003F8FE000003F8FE000003F8FE000003 -F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F87F000007F07F000007F0 -7F000007F03F80000FE03F80000FE01FC0001FC01FE0003FC00FF0007F8007F800FF0003 -FE03FE0001FFFFFC0000FFFFF800007FFFF000001FFFC0000003FE000025287EA62A>I< -0001FC0000FE0FFF0000FE3FFFC000FEFFFFE000FFFFFFF000FFF03FF800FFC00FF800FF -8003FC00FF0003FC00FE0001FE00FE0000FE00FE0000FF00FE00007F00FE00007F00FE00 -007F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE0000 -3F80FE00003F80FE00003F80FE00007F00FE00007F00FE00007F00FE0000FF00FE0000FE -00FE0001FE00FF0003FC00FF8007FC00FFC00FF800FFF03FF000FFFFFFE000FEFFFFC000 -FE7FFF8000FE1FFE0000FE07F80000FE00000000FE00000000FE00000000FE00000000FE -00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 -000000FE00000000FE00000000FE0000000021367AA52B>I<0007F03F80003FFC3F8000 -FFFE3F8001FFFFBF8003FFFFFF8007FE07FF800FF801FF801FF000FF801FE000FF803FC0 -007F803F80007F807F80003F807F00003F807F00003F807F00003F80FE00003F80FE0000 -3F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F -80FF00003F807F00003F807F00003F807F80003F803F80003F803FC0007F801FE0007F80 -1FE000FF800FF801FF8007FE07FF8007FFFFFF8003FFFF3F8000FFFE3F80007FF83F8000 -1FE03F800000003F800000003F800000003F800000003F800000003F800000003F800000 -003F800000003F800000003F800000003F800000003F800000003F800000003F80000000 -3F800000003F8021367DA52B>I<0000F0FC07F0FC0FF0FC3FF0FC7FF0FCFFF0FDFF00FD -FC00FFF000FFE000FFC000FFC000FF8000FF0000FF0000FF0000FE0000FE0000FE0000FE -0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE -0000FE0000FE0000FE0000FE0000FE0000FE000014267AA51C>I<007FE00001FFFC0007 -FFFF800FFFFFC01FFFFFC03FC03FC03F0007803F0001807E0000007E0000007E0000007E -0000007F0000007F0000003F8000003FF000003FFF80001FFFF0000FFFFC0007FFFE0003 -FFFF0000FFFF80001FFF800000FFC000003FC000000FE000000FE0000007E0000007E000 -0007E0400007E0600007E078000FC0FE001FC0FFC07F80FFFFFF807FFFFF001FFFFE0003 -FFF800007FC0001B287EA620>I<01FC000001FC000001FC000001FC000001FC000001FC -000001FC000001FC000001FC000001FC0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF -FF0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC -000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC -000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FE008001FE -018000FF07C000FFFFC000FFFFC0007FFF00003FFC00001FE0001A307FAE1E>I<FE0001 -FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001 -FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001 -FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001FCFE0001 -FCFE0003FCFE0003FCFE0007FCFF001FFC7F807FFC7FFFFFFC3FFFF9FC3FFFF1FC0FFFC1 -FC03FC00001E267AA42B>I<FF00000FE07F00001FC07F00001FC07F80001FC03F80003F -803F80003F803FC0003F801FC0007F001FC0007F000FE0007E000FE000FE000FE000FE00 -07F001FC0007F001FC0007F001FC0003F803F80003F803F80003F803F80001FC03F00001 -FC07F00000FC07E00000FE07E00000FE0FE000007E0FC000007F0FC000007F1FC000003F -1F8000003F1F8000003F9F8000001FBF0000001FBF0000001FBF0000000FBE0000000FFE -00000007FC00000007FC00000007FC000023257FA426>I<FE0001FE0001FC7F0001FE00 -01F87F0003FE0003F87F0003FE0003F87F8003DF0003F83F8003DF0007F03F8007DF0007 -F03F80079F8007F01FC0079F8007E01FC00F9F800FE01FC00F8F800FE00FE00F8FC00FC0 -0FE00F0FC01FC00FE01F0FC01FC00FE01F07E01FC007F01F07E01F8007F01E07E03F8007 -F03E07E03F8003F03E03F03F0003F83E03F03F0003F83C03F07F0001F87C03F07E0001F8 -7C01F87E0001FC7C01F87E0001FC7801F8FE0000FCF800F8FC0000FCF800F8FC0000FCF0 -00FCFC00007CF000FCF800007CF0007DF800007EF0007DF800007EE0007DF800003EE000 -3DF000003FE0003FF000003FC0003FF000001FC0003FE000001FC0001FE00036257FA439 ->I<7F80000FE03F80001FC01FC0003FC01FE0007F800FF0007F0007F000FE0003F801FC -0001FC03FC0001FE03F80000FF07F000007F0FE000003F9FC000001FDFC000000FFF8000 -000FFF00000007FE00000003FC00000001FC00000001FC00000003FE00000007FE000000 -0FFF0000000FDF8000001F9FC000003F0FE000007F07F00000FE03F00000FC03F80001FC -01FC0003F800FE0007F0007F000FF0007F000FE0003F801FC0001FC03F80001FE07F8000 -0FF0FF000007F8252580A426>I<FF00000FE07F00001FC07F00001FC03F80001FC03F80 -003F803FC0003F801FC0007F001FC0007F000FE0007F000FE000FE000FF000FE0007F000 -FC0007F001FC0003F801FC0003F801F80003FC03F80001FC03F80001FC03F00000FE07F0 -0000FE07E000007E07E000007E0FE000007F0FC000003F0FC000003F0FC000001F9F8000 -001F9F8000001F9F0000000F9F0000000F9F000000079E00000007DE00000007DE000000 -03FC00000003FC00000001F800000001F800000001F800000001F000000003F000000003 -E000000003E000000007E000000007C00000000FC00000000FC00000001F800000201F80 -0000383F0000003FFE0000003FFE0000003FFC0000003FF80000000FE000000023367FA4 -26>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fg ecrm0800 8 26 -/Fg 26 122 df<0000FF00000007FFE000001F80F000003E003800007C007C0000F800FC -0001F000FC0003F000FC0003E000780003E000300003E000000003E000000003E0000000 -03E000000003E000000003E000000003E000000003E0007C00FFFFFFFC00FFFFFFFC0003 -E000FC0003E0007C0003E0007C0003E0007C0003E0007C0003E0007C0003E0007C0003E0 -007C0003E0007C0003E0007C0003E0007C0003E0007C0003E0007C0003E0007C0003E000 -7C0003E0007C0003E0007C0003E0007C0003E0007C0003E0007C0003E0007C0003E0007C -0003E0007C0003E0007C0007F000FE007FFF0FFFE07FFF0FFFE0232F7FAE27>28 -D<3C7EFFFFFFFFFFFFFF7E7E7E7E7E7E7E7E7E3C3C3C3C3C3C3C3C3C3C18181818000000 -000000003C7EFFFFFFFF7E3C082F7AAE14>33 D<3C007E00FF00FF00FF80FF807F803D80 -018001800180038003000300070006000E001C0038007000600009157AAD14>39 -D<3C007E00FF00FF00FF80FF807F803D80018001800180038003000300070006000E001C -0038007000600009157A8714>44 D<000001800000000003C00000000003C00000000003 -C00000000007E00000000007E0000000000FF0000000000FF0000000000FF0000000001B -F80000000019F80000000019F80000000030FC0000000030FC0000000070FE0000000060 -7E00000000607E00000000C03F00000000C03F00000000C03F00000001801F8000000180 -1F80000003801FC0000003000FC0000003000FC00000060007E00000060007E000000600 -07E000000C0003F000000C0003F000001FFFFFF800001FFFFFF80000180001F800003000 -00FC0000300000FC0000300000FC00006000007E00006000007E0000E000007F0000C000 -003F0000C000003F0001C000001F8003C000001F8007C000001FC00FF000003FE0FFFC00 -03FFFFFFFC0003FFFF302F7EAE35>65 D<003F803001FFF07007C07C700F000EF01E0007 -F03C0003F0780001F0780000F0700000F0F0000070F0000070F0000070F0000030F80000 -30F8000030FC0000007E0000007F0000003FE000003FFE00001FFFE0000FFFFC0007FFFF -0001FFFF80003FFFE00003FFE000003FF0000007F8000001F8000000F8000000FC000000 -7CC000007CC000003CC000003CC000003CE000003CE000003CE0000078F0000078F80000 -70FC0000F0FE0001E0F78003C0E3F00F00E07FFE00C00FF0001E2F7CAD27>83 -D<00FF000007FFC0000F01F0001C00F8003F007C003F003E003F003E003F003F001E001F -0000001F0000001F0000001F0000001F000007FF00007FFF0001FE1F0007F01F001FC01F -003F801F007F001F007E001F00FE001F06FC001F06FC001F06FC001F06FC003F06FE003F -067E007F067F00EF8C1F83C7FC0FFF03F801FC01E01F207D9E23>97 -D<07C0000000FFC0000000FFC00000000FC000000007C000000007C000000007C0000000 -07C000000007C000000007C000000007C000000007C000000007C000000007C000000007 -C000000007C000000007C0FE000007C7FF800007CF03E00007DC01F00007F8007C0007F0 -007E0007E0003E0007C0001F0007C0001F8007C0001F8007C0000F8007C0000FC007C000 -0FC007C0000FC007C0000FC007C0000FC007C0000FC007C0000FC007C0000FC007C0000F -C007C0001F8007C0001F8007C0001F0007C0003F0007E0003E0007F0007C0007B000F800 -07BC01F000070E07E0000607FF80000001FC0000222F7EAD27>I<001FE000007FFC0001 -F01E0003E0070007C01F800F801F801F001F803F001F803E000F007E0000007E0000007C -000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC -0000007E0000007E0000007E0000C03F0000C01F0001C01F8001800FC0038007E0070001 -F03E00007FF800001FC0001A207E9E1F>I<000000F80000001FF80000001FF800000001 -F800000000F800000000F800000000F800000000F800000000F800000000F800000000F8 -00000000F800000000F800000000F800000000F800000000F800000FE0F800007FF8F800 -01F81EF80003E007F80007C003F8000F8001F8001F0001F8003F0000F8003E0000F8007E -0000F8007E0000F800FC0000F800FC0000F800FC0000F800FC0000F800FC0000F800FC00 -00F800FC0000F800FC0000F800FC0000F8007C0000F8007E0000F8007E0000F8003E0001 -F8001F0001F8001F8003F8000F8007F80003E00EFC0001F03CFFC0007FF0FFC0001FC0F8 -00222F7EAD27>I<001F800000FFF00003E0780007C03E000F801E001F001F001F000F80 -3E000F807E0007807E0007C07C0007C0FC0007C0FC0007C0FC0007C0FFFFFFC0FFFFFFC0 -FC000000FC000000FC000000FC000000FC0000007E0000007E0000003E0000C03F0000C0 -1F0001C00F8003800FC0030003E00F0001F03C00007FF800001FC0001A207E9E1F>I<00 -3F00F800FFC3FE03E1FF1E07807C1E0F807C0C1F003E001F003E003E001F003E001F003E -001F003E001F003E001F003E001F003E001F001F003E001F003E000F807C00078078000F -E1F0000CFFC0001C3F00001C0000001C0000001C0000001E0000001F0000000FFFF8000F -FFFF0007FFFFC00FFFFFF01E0007F83C0000F87800007CF800007CF000003CF000003CF0 -00003CF000003CF800007C7C0000F83E0001F01F0003E007E01F8001FFFE00003FF0001F -2D7E9D23>103 D<07C0000000FFC0000000FFC00000000FC000000007C000000007C000 -000007C000000007C000000007C000000007C000000007C000000007C000000007C00000 -0007C000000007C000000007C000000007C0FE000007C3FF800007C703E00007DE01F000 -07F801F00007F000F80007F000F80007E000F80007E000F80007C000F80007C000F80007 -C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C0 -00F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000 -F80007C000F8000FE001FC00FFFE1FFFC0FFFE1FFFC0222E7EAD27>I<07800FC01FE01F -E01FE01FE00FC007800000000000000000000000000000000007C0FFC0FFC00FC007C007 -C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 -C007C007C007C00FE0FFFCFFFC0E2E7EAD14>I<000F00001F80003FC0003FC0003FC000 -3FC0001F80000F000000000000000000000000000000000000000000000000000007C000 -FFC000FFC0000FC00007C00007C00007C00007C00007C00007C00007C00007C00007C000 -07C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C000 -07C00007C00007C00007C00007C00007C00007C00007C00007C00007C03007C07807C0FC -0F80FC0F80FC0F00F81F00783E003FF80007E000123C83AD16>I<07C0000000FFC00000 -00FFC00000000FC000000007C000000007C000000007C000000007C000000007C0000000 -07C000000007C000000007C000000007C000000007C000000007C000000007C000000007 -C000000007C01FFE0007C01FFE0007C00FF00007C007C00007C007800007C00E000007C0 -1C000007C038000007C070000007C0E0000007C3C0000007C7C0000007CFE0000007DFF0 -000007F9F0000007F0F8000007E0FC000007C07E000007C03E000007C01F000007C01F80 -0007C00FC00007C007C00007C003E00007C003F00007C001F8000FE003FC00FFFE07FF80 -FFFE07FF80212E7EAD25>I<07C0FFC0FFC00FC007C007C007C007C007C007C007C007C0 -07C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C0 -07C007C007C007C007C007C007C007C007C007C007C007C007C00FE0FFFEFFFE0F2E7EAD -14>I<07C0FE0000FFC3FF8000FFC703E0000FDE01F00007F801F00007F000F80007F000 -F80007E000F80007E000F80007C000F80007C000F80007C000F80007C000F80007C000F8 -0007C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000F800 -07C000F80007C000F80007C000F80007C000F80007C000F80007C000F8000FE001FC00FF -FE1FFFC0FFFE1FFFC0221E7E9D27>110 D<001FE000007FF80001F03E0003C00F000780 -07800F0003C01F0003E03E0001F03E0001F07C0000F87C0000F87C0000F8FC0000FCFC00 -00FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000FC7C0000F87C00 -00F83E0001F03E0001F01F0003E01F0003E00F8007C007C00F8001F03E00007FF800001F -E0001E207E9E23>I<000FE01800007FF8380001F81C380003E00E780007C00778000F80 -03F8001F8001F8003F0001F8003F0001F8007E0000F8007E0000F800FE0000F800FC0000 -F800FC0000F800FC0000F800FC0000F800FC0000F800FC0000F800FC0000F800FC0000F8 -007E0000F8007E0000F8007E0000F8003F0001F8001F0001F8001F8003F8000FC007F800 -03E00EF80001F03CF800007FF0F800001FC0F800000000F800000000F800000000F80000 -0000F800000000F800000000F800000000F800000000F800000000F800000001FC000000 -1FFFC000001FFFC0222B7E9D25>113 D<0781F0FF87FCFF9E7E0F987E07B87E07B07E07 -F03C07E00007E00007E00007C00007C00007C00007C00007C00007C00007C00007C00007 -C00007C00007C00007C00007C00007C00007C00007C00007C0000FE000FFFF00FFFF0017 -1E7E9D1B>I<01FE1807FFB81E01F83C00F8780078F00038F00038F00018F00018F80018 -FC0018FF00007FF0003FFF001FFFC00FFFF001FFF8001FFC0001FCC0007EC0003EC0003E -E0001EE0001EF0001EF0001EF8003CF8003CFC0078FF01F0E3FFC0C0FF0017207E9E1C> -I<00600000600000600000600000E00000E00000E00001E00003E00003E00007E0001FE0 -00FFFFF0FFFFF003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0 -0003E00003E00003E00003E00003E00003E01803E01803E01803E01803E01803E01803E0 -1803E03801F03001F07000F860003FE0000F80152A7FA81B>I<07C000F800FFC01FF800 -FFC01FF8000FC001F80007C000F80007C000F80007C000F80007C000F80007C000F80007 -C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C0 -00F80007C000F80007C000F80007C000F80007C000F80007C000F80007C001F80007C001 -F80007C001F80007C003F80003E007F80003E00EFC0001F81CFFC0007FF8FFC0001FE0F8 -00221F7E9D27>I<FFFC01FFC0FFFC01FFC00FE0007E0007E0007C0007E000380003E000 -300003E000700001F000600001F000600000F800C00000F800C00000F800C000007C0180 -00007C018000003E030000003E030000003F070000001F060000001F060000000F8C0000 -000F8C0000000FDC00000007D800000007D800000003F000000003F000000003F0000000 -01E000000001E000000000C00000221E7F9C25>I<FFFC01FFC0FFFC01FFC00FE0007E00 -07E0007C0007E000380003E000300003F000700001F000600001F000600000F800C00000 -F800C00000FC01C000007C018000007E038000003E030000003E030000001F060000001F -060000001F8E0000000F8C0000000F8C00000007D800000007D800000003F000000003F0 -00000003F000000001E000000001E000000000C000000000C00000000180000000018000 -00000380000000030000007803000000FC06000000FC06000000FC0C000000FC1C000000 -783800000070700000003FE00000000F80000000222B7F9C25>121 -D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fh ecrm0600 6 3 -/Fh 3 52 df<00E00001E00007E000FFE000F9E00001E00001E00001E00001E00001E000 -01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000 -01E00001E00001E00001E00001E00001E00001E00001E00003F000FFFFC0FFFFC012217A -A01E>49 D<01FC0007FF801C0FC03003E06001F06000F8F800F8FC00FCFC00FCFC007C78 -007C3000FC0000FC0000F80000F80001F00003E00003C0000780000F00001E0000380000 -700000E00001C00C03800C0600180C00181800183FFFF87FFFF8FFFFF0FFFFF016217CA0 -1E>I<00FF0003FFC00F03E01C00F01C00F83E00FC3E007C3E007C1E00FC0C00FC0000F8 -0000F80001F00003E0000FC001FF0001FF000003E00000F000007800007C00003E00003F -30003F78003FFC003FFC003FFC003EF8007E60007C3800F81E03F00FFFC001FF0018227D -A01E>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fi ectt0900 9 32 -/Fi 32 122 df<0001C0000003E0000003E0000003E0000003E0000003E0000003E00000 -03E0000003E0000003E0000003E0000003E0000003E0000003E0003FFFFFFCFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFF0003E0000003E0000003E0000003E0000003E0000003E00000 -03E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000001C00020 -227DA727>43 D<7FFFFF80FFFFFFC0FFFFFFC0FFFFFFC07FFFFF801A057A9227>45 -D<1E007F807F80FFC0FFC0FFC0FFC07F807F801E000A0A728927>I<000000380000007C -0000007C000000FC000000F8000001F8000001F0000003F0000003E0000007E0000007C0 -000007C000000FC000000F8000001F8000001F0000003F0000003E0000007E0000007C00 -0000FC000000F8000001F8000001F0000003F0000003E0000007E0000007C000000FC000 -000F8000000F8000001F8000001F0000003F0000003E0000007E0000007C000000FC0000 -00F8000001F8000001F0000003F0000003E0000007E0000007C000000FC000000F800000 -0F8000001F8000001F0000003F0000003E0000007E0000007C000000FC000000F8000000 -F8000000700000001E3A7CB327>I<003FE00001FFF80003FFFE000FFFFF801FFFFFC03F -E07FE03F800FE07F0007F07E0003F8FE0001F8FC0001F8FE0001FCFE0000FCFE0000FCFE -0000FC7C0000FC000000FC000000FC000001FC000001F8000001F8000003F8000003F000 -0007F000000FE000001FC000003FC000007F800000FF000001FE000003FC000007F80000 -0FF000001FE000003FC000007F800000FE000001FC000007F800780FF000FC1FE000FC3F -C000FC7FFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC7FFFFFF81E2F7CAE27>50 -D<001FF80000FFFE0003FFFF800FFFFFC00FFFFFE01FF01FF03FC007F83F8001F83F8001 -FC3F8000FC3F8000FC1F0000FC040000FC000000FC000001FC000001F8000003F8000007 -F000000FF000003FE0001FFFC0003FFF80003FFF80003FFFE0001FFFF000001FF8000003 -FC000001FC000000FE0000007E0000007F0000003F0000003F3800003F7C00003FFE0000 -3FFE00003FFE00007FFC00007EFE0000FE7F0001FC7F8003FC3FF01FF81FFFFFF00FFFFF -E003FFFF8000FFFE00001FF80020307DAE27>I<7FFFFC00007FFFFF0000FFFFFFC0007F -FFFFE0007FFFFFF00007E00FF80007E007F80007E001FC0007E000FE0007E000FE0007E0 -007E0007E0007F0007E0003F0007E0003F8007E0001F8007E0001F8007E0001F8007E000 -1FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000F -C007E0000FC007E0000FC007E0000FC007E0000FC007E0001F8007E0001F8007E0001F80 -07E0003F8007E0003F0007E0003F0007E0007F0007E000FE0007E000FE0007E001FC0007 -E003F80007E00FF8007FFFFFF0007FFFFFE000FFFFFFC0007FFFFF00007FFFFC0000222E -7FAD27>68 D<7FFFFFE0FFFFFFF0FFFFFFF0FFFFFFF07FFFFFE0001F8000001F8000001F -8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F -8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F -8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F -8000001F8000001F8000001F8000001F8000001F8000001F80007FFFFFE0FFFFFFF0FFFF -FFF0FFFFFFF07FFFFFE01C2E7BAD27>73 D<7FFFC000007FFFE00000FFFFE000007FFFE0 -00007FFFC0000003F000000003F000000003F000000003F000000003F000000003F00000 -0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000078003F0000FC003F0000FC003F0000FC003F0000FC003F0000FC003F000 -0FC003F0000FC07FFFFFFFC07FFFFFFFC0FFFFFFFFC07FFFFFFFC07FFFFFFF80222E7FAD -27>76 D<7FE0007FE0FFF000FFF0FFF000FFF0FFF801FFF07FF801FFE00FF801FF000FB8 -01DF000FBC03DF000FBC03DF000FBC03DF000FBE07DF000F9E079F000F9E079F000F9E07 -9F000F9F0F9F000F9F0F9F000F8F0F1F000F8F0F1F000F8F9F1F000F8F9F1F000F879E1F -000F879E1F000F879E1F000F879E1F000F839C1F000F83FC1F000F83FC1F000F83FC1F00 -0F81F81F000F81F81F000F80F01F000F80001F000F80001F000F80001F000F80001F000F -80001F000F80001F000F80001F000F80001F000F80001F000F80001F007FF000FFE0FFF8 -01FFF0FFF801FFF0FFF801FFF07FF000FFE0242E7FAD27>I<7FFC03FFE07FFE07FFE0FF -FE07FFF07FFE07FFE07FFC03FFE007F000FE0003F000FC0003F801FC0001F801F80001F8 -01F80001FC03F80000FC03F00000FE07F000007E07E000007E07E000003F0FC000003F0F -C000001F9F8000001F9F8000001F9F8000000F9F0000000F9F00000007FE00000007FE00 -000003FC00000003FC00000001F800000001F800000001F800000001F800000001F80000 -0001F800000001F800000001F800000001F800000001F800000001F800000001F8000000 -01F800000001F800000001F80000001FFF8000003FFFC000003FFFC000003FFFC000001F -FF8000242E7FAD27>89 D<3FFFFFFE7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7E0000FE7E -0001FC7E0001FC7E0003F87E0007F07E0007F03C000FE000001FC000001FC000003F8000 -007F0000007F000000FE000000FC000001FC000003F8000003F0000007F000000FE00000 -0FC000001FC000003F8000003F0000007F000000FE000000FE000001FC000003F8001E03 -F8003F07F0003F0FE0003F0FE0003F1FC0003F3F80003F3F80003F7F00003FFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFF7FFFFFFE202E7DAD27>I<70000000F8000000F8000000FC00 -00007C0000007E0000003E0000003F0000001F0000001F8000000F8000000F8000000FC0 -000007C0000007E0000003E0000003F0000001F0000001F8000000F8000000FC0000007C -0000007E0000003E0000003F0000001F0000001F8000000F8000000F8000000FC0000007 -C0000007E0000003E0000003F0000001F0000001F8000000F8000000FC0000007C000000 -7E0000003E0000003F0000001F0000001F8000000F8000000FC0000007C0000007C00000 -07E0000003E0000003F0000001F0000001F8000000F8000000FC0000007C0000007C0000 -00381E3A7CB327>92 D<7FFFFFF8FFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC7FFFFFF81E06 -7C7E27>95 D<01FFE0000007FFF800000FFFFE00001FFFFF80001FFFFFC0001FC07FC000 -1FC00FE0000F8007E000020007F000000003F000000003F0000007FFF000007FFFF00003 -FFFFF0000FFFFFF0001FFFFFF0003FFC03F0007FE003F0007F0003F000FE0003F000FC00 -03F000FC0003F000FC0003F000FC0003F000FE0007F0007F000FF0007FC07FF0003FFFFF -FFC01FFFFFFFE00FFFFFFFE003FFF8FFE0007FC03FC023207D9F27>97 -D<7FE0000000FFF0000000FFF0000000FFF00000007FF000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F07F800003F1FFE00003F7FFF80003FFFFFC0003FFFFFE0003FFC0FF0003FF007F8003FC -001FC003F8000FC003F8000FE003F00007E003F00007E003F00007F003F00003F003F000 -03F003F00003F003F00003F003F00003F003F00003F003F00007F003F80007E003F80007 -E003F8000FE003FC001FC003FE003FC003FF007F8003FFC1FF0003FFFFFE0003FFFFFC00 -03F7FFF80003F3FFE00001E07F0000242E80AD27>I<000FFF00007FFFC001FFFFE003FF -FFF007FFFFF00FF807F01FE007F03FC003E03F8000807F0000007E0000007E000000FE00 -0000FC000000FC000000FC000000FC000000FC000000FC000000FE0000007E0000007E00 -00007F0000F03F8001F83FC001F81FE003F80FF80FF007FFFFF003FFFFE001FFFFC0007F -FF00000FF8001D207B9F27>I<00001FF80000003FFC0000003FFC0000003FFC0000001F -FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC -00000000FC00000000FC00000FF0FC00007FFCFC0001FFFFFC0003FFFFFC0007FFFFFC00 -0FF81FFC001FE007FC003FC003FC003F8001FC007F0001FC007E0000FC007E0000FC00FE -0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00FE00 -00FC007E0001FC007E0001FC007F0003FC003F0003FC003F8007FC001FE00FFC000FF03F -FC0007FFFFFFE003FFFFFFF001FFFEFFF0007FF8FFF0001FE07FE0242E7EAD27>I<000F -F800003FFE0000FFFF8003FFFFC007FFFFE00FFC0FF01FE003F81FC001F83F8001FC7F00 -00FC7E0000FC7E00007EFE00007EFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFCFC00 -0000FE0000007E0000007F0000003F00003C3F80007E1FC0007E1FF000FE0FFC07FC07FF -FFFC01FFFFF800FFFFF0003FFFC00007FE001F207D9F27>I<7FE0000000FFF0000000FF -F0000000FFF00000007FF000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F000000003F000000003F000000003F03FC00003F1FFF00003F7FF -F80003FFFFFC0003FFFFFE0003FFE0FE0003FF007F0003FE003F0003FC003F0003F8003F -0003F8003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F00 -03F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003 -F0003F0003F0003F0003F0003F007FFF83FFF8FFFFC7FFFCFFFFC7FFFCFFFFC7FFFC7FFF -83FFF8262E80AD27>104 D<000F0000001F8000003FC000003FC000003FC000003FC000 -001F8000000F000000000000000000000000000000000000000000000000000000000000 -3FFF80007FFFC0007FFFC0007FFFC0003FFFC000000FC000000FC000000FC000000FC000 -000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000 -000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000 -7FFFFFF0FFFFFFF0FFFFFFF8FFFFFFF07FFFFFF01D2F7BAE27>I<7FFF8000FFFFC000FF -FFC000FFFFC0007FFFC000000FC000000FC000000FC000000FC000000FC000000FC00000 -0FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000 -0FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000 -0FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000 -0FC000000FC000000FC0007FFFFFF8FFFFFFFCFFFFFFFCFFFFFFFC7FFFFFF81E2E7CAD27 ->108 D<7F07C01F0000FF9FF07FC000FFFFF9FFE000FFFFFFFFF0007FFFFFFFF0000FFC -7FF1F8000FF03FC0F8000FE03F80F8000FC03F00F8000FC03F00F8000FC03F00F8000F80 -3E00F8000F803E00F8000F803E00F8000F803E00F8000F803E00F8000F803E00F8000F80 -3E00F8000F803E00F8000F803E00F8000F803E00F8000F803E00F8000F803E00F8000F80 -3E00F8000F803E00F8000F803E00F8000F803E00F8007FF0FFC3FF00FFF8FFE3FF80FFF9 -FFE7FF80FFF8FFE3FF807FF0FFC3FF002920819F27>I<7FE03FC000FFF1FFF000FFF7FF -F800FFFFFFFC007FFFFFFE0003FFE0FE0003FF007F0003FE003F0003FC003F0003F8003F -0003F8003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F00 -03F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003 -F0003F0003F0003F0003F0003F007FFF83FFF8FFFFC7FFFCFFFFC7FFFCFFFFC7FFFC7FFF -83FFF82620809F27>I<001FE000007FF80001FFFE0003FFFF0007FFFF800FF03FC01FC0 -0FE03F8007F03F0003F07F0003F87E0001F87E0001F8FC0000FCFC0000FCFC0000FCFC00 -00FCFC0000FCFC0000FCFC0000FCFE0001FC7E0001F87E0001F87F0003F83F8007F03F80 -07F01FE01FE00FF03FC007FFFF8003FFFF0001FFFE00007FF800001FE0001E207C9F27> -I<7FE07F8000FFF1FFE000FFF7FFF800FFFFFFFC007FFFFFFE0003FFC0FF0003FF007F80 -03FC001FC003F8000FC003F8000FE003F00007E003F00007E003F00007F003F00003F003 -F00003F003F00003F003F00003F003F00003F003F00003F003F00007F003F80007E003F8 -0007E003F8000FE003FC001FC003FE003FC003FF007F8003FFC1FF0003FFFFFE0003FFFF -FC0003F7FFF80003F3FFE00003F07F000003F000000003F000000003F000000003F00000 -0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 -03F00000007FFF800000FFFFC00000FFFFC00000FFFFC000007FFF8000002431809F27> -I<7FFC03FC00FFFE0FFF00FFFE3FFF80FFFE7FFFC07FFEFFFFC0007FFE1FC0007FF81FC0 -007FF00F80007FE00200007FC00000007F800000007F800000007F000000007F00000000 -7E000000007E000000007E000000007E000000007E000000007E000000007E000000007E -000000007E000000007E000000007E000000007E000000007E0000007FFFFF8000FFFFFF -C000FFFFFFC000FFFFFFC0007FFFFF800022207E9F27>114 D<00FFF38007FFFFC01FFF -FFC03FFFFFC07FFFFFC07F803FC0FC000FC0F8000FC0F8000FC0F8000780FC0000007F80 -00007FFC00003FFFF0001FFFFC0007FFFF0001FFFF80000FFFC000003FE0000007E07800 -03F0FC0001F0FC0001F0FE0001F0FE0003F0FF0007E0FFE01FE0FFFFFFC0FFFFFF80FFFF -FF00FBFFFC00707FF0001C207B9F27>I<003C0000007E0000007E0000007E0000007E00 -00007E0000007E0000007E0000007E00007FFFFFF0FFFFFFF8FFFFFFF8FFFFFFF87FFFFF -F0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E00 -00007E0000007E0000007E0000007E0000007E0000007E0018007E007E007E007E007E00 -7E007E007E007E00FE003F00FC003F83FC003FFFF8001FFFF0000FFFE00003FFC00000FF -001F297EA827>I<7FE007FE00FFF00FFF00FFF00FFF00FFF00FFF007FF007FF0003F000 -3F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F -0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F00 -03F0003F0003F0003F0003F0003F0003F0007F0003F0007F0003F001FF0003FC07FF0001 -FFFFFFF800FFFFFFFC00FFFFFFFC003FFFBFFC000FFC1FF82620809F27>I<3FFC1FFF00 -7FFE3FFF007FFE3FFF807FFE3FFF003FFC1FFF0001F807E00000FC0FC00000FC1F800000 -7E1F0000003F3F0000001F7E0000001FFC0000000FF800000007F800000003F000000003 -E000000003F000000007F80000000FF80000001FFC0000001F3E0000003E3F0000007E1F -0000007C0F800000F80FC00001F807E00003F003E0007FFE1FFF807FFE1FFF80FFFF3FFF -C07FFE1FFF807FFE1FFF8022207E9F27>120 D<7FFC0FFF80FFFE1FFFC0FFFE1FFFC0FF -FE1FFFC07FFC0FFF8007E000F80003E001F80003E001F00003F001F00001F003F00001F8 -03E00000F803E00000F803E00000FC07C000007C07C000007C07C000007E0F8000003E0F -8000003E0F8000001F0F0000001F1F0000001F1F0000000F1F0000000F9E0000000FBE00 -000007BE00000007FC00000003FC00000003FC00000003F800000001F800000001F80000 -0001F000000001F000000003F000000003E000000003E000000007E000000007C0000008 -07C000003E0FC000007F0F8000007F1F8000007E7F0000007FFE0000003FFC0000003FF8 -0000001FF000000007C000000022317E9F27>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fj ecss1200 12 41 -/Fj 41 122 df<FFFFFFFFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFFFFFFFF80FFFFFF -FFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFFFFFFFF80 -FFFFFFFFFFFFFFFFFFFFFFFF806106809D62>22 D<00007F003FC00001FFC03FC00003FF -C03FC0000FFFC03FC0000FFFC03FC0001FFFC03FC0003FC1C03FC0003F80403FC0007F00 -000000007F0000000000FE0000000000FE0000000000FE0000000001FE0000000001FE00 -00000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE00 -00000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE00 -00000001FE0000000001FE0000000001FE00000000FFFFFFC03FC0FFFFFFC03FC0FFFFFF -C03FC0FFFFFFC03FC0FFFFFFC03FC0FFFFFFC03FC001FE00003FC001FE00003FC001FE00 -003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00 -003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00 -003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00 -003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00 -003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00 -003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC02A4A7E -C934>28 D<FFFFFFC0FFFFFFC0FFFFFFC0FFFFFFC0FFFFFFC0FFFFFFC01A067F9821>45 -D<FFFFFFFFFFFFFFFF080877871B>I<000018000000007800000000F800000003F80000 -000FF80000007FF80000FFFFF80000FFFFF80000FFFFF80000FFFFF80000FFF7F80000FF -87F800000007F800000007F800000007F800000007F800000007F800000007F800000007 -F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8 -00000007F800000007F800000007F800000007F800000007F800000007F800000007F800 -000007F800000007F800000007F800000007F800000007F800000007F800000007F80000 -0007F800000007F800000007F800000007F800000007F800000007F800000007F8000000 -07F800000007F800000007F800000007F800000007F800000007F800000007F800000007 -F800000007F800000007F800000007F800000007F800000007F800000007F800007FFFFF -FF807FFFFFFF807FFFFFFF807FFFFFFF807FFFFFFF807FFFFFFF80214378C231>49 -D<0003FE0000001FFFE000007FFFF80000FFFFFC0001FFFFFF0003FFFFFF8007FC07FFC0 -0FF000FFC01FC0003FE01F80001FF03F80000FF03F00000FF87F000007F87E000003FC7E -000003FCFE000003FCFC000001FE7C000001FE3C000001FE38000001FE18000001FE0800 -0001FE00000001FE00000001FE00000001FE00000001FE00000003FC00000003FC000000 -03FC00000007F800000007F80000000FF00000000FE00000001FE00000003FC00000003F -800000007F00000000FF00000001FE00000003FC00000007F80000000FF00000001FE000 -00003FC00000007F00000000FE00000001FC00000003F800000007F00000000FE0000000 -1FC00000001F800000003F000000007E00000000FC00000001F800000003F000000007E0 -0000000FC00000001F800000003F000000007FFFFFFFFE7FFFFFFFFE7FFFFFFFFE7FFFFF -FFFE7FFFFFFFFE7FFFFFFFFE27437CC231>I<0001FF0000000FFFE000003FFFF80000FF -FFFE0001FFFFFF0007FFFFFF800FFF01FFC01FF8007FE03FE0001FE03FC0001FF07F0000 -0FF03E00000FF03E000007F81C000007F818000007F808000007F800000007F800000007 -F800000007F80000000FF00000000FF00000000FF00000001FE00000001FE00000003FC0 -0000007FC0000000FF80000003FF0000001FFE00000FFFFC00000FFFF800000FFFE00000 -0FFFF000000FFFFC00000FFFFF00000001FF800000007FC00000001FE00000000FF00000 -000FF800000007FC00000007FC00000003FE00000003FE00000003FE00000001FF000000 -01FF00000001FF00000001FF00000001FF00000001FF00000001FF00000001FF40000003 -FE60000003FE60000003FEF0000007FCF8000007FCFE00000FF87F00000FF83FC0001FF0 -1FF0007FE00FFE01FFE007FFFFFF8003FFFFFF0001FFFFFE00007FFFF800001FFFE00000 -01FF000028457CC231>I<000000FF8000000001FF8000000003FF8000000003FF800000 -00077F80000000077F800000000F7F800000000F7F800000001E7F800000003E7F800000 -003E7F800000007E7F800000007C7F80000000FC7F80000000FC7F80000001F87F800000 -03F87F80000003F07F80000007F07F80000007F07F8000000FE07F8000000FE07F800000 -1FC07F8000003FC07F8000003F807F8000007F807F8000007F007F800000FF007F800000 -FE007F800001FE007F800001FC007F800003FC007F800007F8007F800007F8007F80000F -F0007F80000FE0007F80001FE0007F80001FC0007F80003FC0007F80007F80007F80007F -80007F8000FF00007F8000FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FF -FFFFFFFFC0FFFFFFFFFFC00000007F80000000007F80000000007F80000000007F800000 -00007F80000000007F80000000007F80000000007F80000000007F80000000007F800000 -00007F80000000007F80000000007F80000000007F80000000007F80000000007F800000 -00007F80002A417DC031>I<000000FF80000000000001FFC0000000000001FFC0000000 -000001FFC0000000000003FFE0000000000003FFE0000000000003FFE0000000000007F7 -F0000000000007F7F0000000000007E7F000000000000FE7F800000000000FE3F8000000 -00000FE3F800000000001FC3FC00000000001FC1FC00000000003FC1FE00000000003F81 -FE00000000003F81FE00000000007F80FF00000000007F00FF00000000007F00FF000000 -0000FF007F8000000000FE007F8000000000FE007F8000000001FE003FC000000001FC00 -3FC000000001FC003FC000000003FC001FE000000003F8001FE000000003F8001FE00000 -0007F8000FF000000007F0000FF000000007F0000FF00000000FF00007F80000000FE000 -07F80000001FE00007FC0000001FE00003FC0000001FC00003FC0000003FC00003FE0000 -003FC00001FE0000003F800001FE0000007F800001FF0000007F800000FF0000007FFFFF -FFFF000000FFFFFFFFFF800000FFFFFFFFFF800000FFFFFFFFFF800001FFFFFFFFFFC000 -01FFFFFFFFFFC00001FC0000003FC00003FC0000001FE00003FC0000001FE00007F80000 -001FF00007F80000000FF00007F00000000FF0000FF00000000FF8000FF000000007F800 -0FE000000007F8001FE000000007FC001FE000000003FC001FC000000003FC003FC00000 -0003FE003FC000000001FE003F8000000001FE007F8000000000FF007F8000000000FF00 -7F0000000000FF00FF00000000007F80FF00000000007F8039457DC440>65 -D<FFFFFFF8000000FFFFFFFF800000FFFFFFFFE00000FFFFFFFFF80000FFFFFFFFFE0000 -FFFFFFFFFF0000FF00003FFFC000FF000007FFE000FF000000FFF000FF0000003FF000FF -0000001FF800FF0000000FF800FF00000007FC00FF00000003FC00FF00000003FE00FF00 -000001FE00FF00000001FE00FF00000001FE00FF00000001FE00FF00000001FE00FF0000 -0003FE00FF00000003FC00FF00000007FC00FF00000007F800FF0000000FF800FF000000 -1FF000FF0000007FE000FF000000FFC000FF000007FF8000FF00003FFF0000FFFFFFFFFC -0000FFFFFFFFF00000FFFFFFFFC00000FFFFFFFFE00000FFFFFFFFFC0000FFFFFFFFFF00 -00FF00003FFFC000FF000003FFE000FF0000007FF000FF0000001FF800FF0000000FFC00 -FF00000007FE00FF00000003FF00FF00000001FF00FF00000000FF80FF000000007F80FF -000000007FC0FF000000007FC0FF000000003FC0FF000000003FC0FF000000003FC0FF00 -0000003FC0FF000000007FC0FF000000007FC0FF000000007F80FF00000000FF80FF0000 -0001FF80FF00000003FF00FF00000007FE00FF0000000FFE00FF0000003FFC00FF000000 -FFF800FF00000FFFF000FFFFFFFFFFE000FFFFFFFFFF8000FFFFFFFFFF0000FFFFFFFFFC -0000FFFFFFFFE00000FFFFFFFE000000324577C441>I<0000003FFE0000000003FFFFF0 -0000000FFFFFFE0000003FFFFFFF800000FFFFFFFF800001FFFFFFFF800003FFE007FF00 -000FFF0000FF00001FFC00001F00003FF800000700007FE000000300007FC00000000000 -FF800000000001FF000000000003FF000000000003FE000000000007FC000000000007FC -00000000000FF800000000000FF800000000001FF000000000001FF000000000003FE000 -000000003FE000000000003FE000000000007FC000000000007FC000000000007FC00000 -0000007FC000000000007FC00000000000FF800000000000FF800000000000FF80000000 -0000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000000 -00FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000 -7FC000000000007FC000000000007FC000000000007FC000000000007FC000000000003F -E000000000003FE000000000003FE000000000001FF000000000001FF000000000000FF8 -00000000000FF8000000000007FC000000000007FC000000000003FE000000000003FF00 -0000000001FF000000000000FF8000000080007FC000000180007FE000000380003FF800 -000F80001FFC00001FC0000FFF00007FC00003FFE003FFC00001FFFFFFFF800000FFFFFF -FE0000003FFFFFFC0000000FFFFFF000000003FFFFC0000000003FFC000032497AC63E> -I<FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFF -E0FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00000000 -00FF0000000000FF0000000000FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFF -F0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF02C4577C43A>69 D<0000003FFC00000000 -01FFFFE00000000FFFFFF80000003FFFFFFF000000FFFFFFFFC00001FFFFFFFFE00003FF -E007FFE00007FF00007FE0001FFC00001FC0003FF8000007C0003FF0000003C0007FC000 -0001C000FF80000000C001FF800000000003FF000000000003FE000000000007FC000000 -000007FC00000000000FF800000000000FF800000000001FF000000000001FF000000000 -003FE000000000003FE000000000003FE000000000007FC000000000007FC00000000000 -7FC000000000007FC000000000007FC00000000000FF800000000000FF800000000000FF -800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF80 -0000000000FF800000000000FF800000000000FF800001FFFFF0FF800001FFFFF0FF8000 -01FFFFF07FC00001FFFFF07FC00001FFFFF07FC00001FFFFF07FC00000000FF07FC00000 -000FF03FE00000000FF03FE00000000FF03FE00000000FF01FF00000000FF01FF0000000 -0FF00FF80000000FF00FF80000000FF007FC0000000FF007FC0000000FF003FE0000000F -F003FF0000000FF001FF8000000FF000FF8000000FF0007FC000000FF0003FF000000FF0 -003FF800000FF0001FFC00000FF00007FF00003FF00003FFE007FFF00001FFFFFFFFF000 -00FFFFFFFFE000003FFFFFFF0000000FFFFFFC00000001FFFFE0000000003FFC00003449 -7AC641>71 D<FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000 -FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF -00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000 -00FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000 -FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF -00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FFFFFF -FFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE274577C435>76 -D<FFE00000000003FFC0FFF00000000007FFC0FFF00000000007FFC0FFF00000000007FF -C0FFF8000000000FFFC0FFF8000000000FFFC0FFF8000000000FFFC0FF7C000000001FBF -C0FF7C000000001FBFC0FF7E000000003FBFC0FF7E000000003FBFC0FF3E000000003F3F -C0FF3F000000007F3FC0FF3F000000007F3FC0FF1F000000007E3FC0FF1F80000000FE3F -C0FF1F80000000FE3FC0FF1FC0000001FE3FC0FF0FC0000001FC3FC0FF0FC0000001FC3F -C0FF0FE0000003FC3FC0FF07E0000003F83FC0FF07E0000003F83FC0FF07F0000007F83F -C0FF03F0000007F03FC0FF03F0000007F03FC0FF03F800000FF03FC0FF01F800000FE03F -C0FF01FC00001FE03FC0FF01FC00001FE03FC0FF00FC00001FC03FC0FF00FE00003FC03F -C0FF00FE00003FC03FC0FF007E00003F803FC0FF007F00007F803FC0FF007F00007F803F -C0FF003F00007F003FC0FF003F8000FF003FC0FF001F8000FE003FC0FF001FC001FE003F -C0FF001FC001FE003FC0FF000FC001FC003FC0FF000FE003FC003FC0FF000FE003FC003F -C0FF0007E003F8003FC0FF0007F007F8003FC0FF0007F007F8003FC0FF0003F007F0003F -C0FF0003F80FF0003FC0FF0001F80FE0003FC0FF0001F80FE0003FC0FF0001FC1FE0003F -C0FF0000FC1FC0003FC0FF0000FC1FC0003FC0FF0000FE3FC0003FC0FF00007E3F80003F -C0FF00007E3F80003FC0FF00007F7F80003FC0FF00003F7F00003FC0FF00003F7F00003F -C0FF00001FFE00003FC0FF00001FFE00003FC0FF00001FFE00003FC0FF00000FFC00003F -C0FF00000FFC00003FC0FF00000FFC00003FC0FF000007F800003FC0FF0000000000003F -C0FF0000000000003FC0424577C455>I<0000003FE0000000000003FFFE00000000001F -FFFFC0000000003FFFFFE000000000FFFFFFF800000003FFFFFFFE00000007FFC01FFF00 -00000FFF0007FF8000001FFC0001FFC000003FF000007FE000007FE000003FF00000FFC0 -00001FF80000FF8000000FF80001FF00000007FC0003FE00000003FE0003FC00000001FE -0007FC00000001FF000FF800000000FF800FF800000000FF800FF0000000007F801FF000 -0000007FC01FE0000000003FC03FE0000000003FE03FE0000000003FE03FC0000000001F -E07FC0000000001FF07FC0000000001FF07FC0000000001FF07FC0000000001FF07F8000 -0000000FF0FF80000000000FF8FF80000000000FF8FF80000000000FF8FF80000000000F -F8FF80000000000FF8FF80000000000FF8FF80000000000FF8FF80000000000FF8FF8000 -0000000FF8FF80000000000FF8FF80000000000FF8FF80000000000FF8FFC0000000001F -F87FC0000000001FF07FC0000000001FF07FC0000000001FF07FC0000000001FF07FE000 -0000003FF03FE0000000003FE03FE0000000003FE03FE0000000003FE01FF0000000007F -C01FF0000000007FC01FF800000000FFC00FF800000000FF800FFC00000001FF8007FC00 -000001FF0007FE00000003FF0003FF00000007FE0001FF00000007FC0001FF8000000FFC -0000FFC000001FF800007FE000003FF000003FF80000FFE000001FFC0001FFC000000FFF -0007FF80000007FFE03FFF00000003FFFFFFFE00000000FFFFFFF8000000007FFFFFF000 -0000001FFFFFC00000000003FFFE0000000000007FF00000003D497BC648>79 -D<00003FF800000003FFFF8000000FFFFFE000003FFFFFF800007FFFFFFE0000FFFFFFFF -0001FFC00FFF0003FE0001FF0007F800007E000FF000003E000FE000001E001FC0000006 -003FC0000006003F80000000003F80000000007F00000000007F00000000007F00000000 -007F00000000007F00000000007F00000000007F80000000007F80000000007FC0000000 -003FC0000000003FE0000000003FF0000000001FFC000000000FFF000000000FFFE00000 -0007FFFC00000003FFFFC0000001FFFFFC000000FFFFFF0000007FFFFFC000003FFFFFE0 -00000FFFFFF8000003FFFFFC0000003FFFFE00000003FFFE000000007FFF0000000007FF -8000000001FFC000000000FFC0000000007FC0000000003FE0000000001FE0000000001F -E0000000000FF0000000000FF00000000007F00000000007F00000000007F00000000007 -F00000000007F00000000007F00000000007F0000000000FE0600000000FE0700000000F -E0780000001FC07C0000003FC07E0000003F80FF800000FF00FFE00001FF00FFFC0007FE -007FFF801FFC001FFFFFFFF80007FFFFFFF00001FFFFFFC000007FFFFF8000000FFFFC00 -000000FFE000002C497CC636>83 D<FF00000001FEFF00000001FEFF00000001FEFF0000 -0001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF0000 -0001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF0000 -0001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF0000 -0001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF0000 -0001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF0000 -0001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF0000 -0001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF0000 -0001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FEFF00000001FE7F8000 -0003FC7F80000003FC7F80000003FC7F80000003FC3FC0000007F83FC0000007F81FE000 -000FF01FE000000FF00FF000001FE00FF800003FE007FC00007FC003FE0000FF8001FF80 -03FF0000FFF01FFE00007FFFFFFC00003FFFFFF800000FFFFFE0000007FFFFC0000001FF -FF000000001FF000002F4777C442>85 D<FF80000001FFC00000007F807F80000001FFC0 -000000FF007F80000001FFC0000000FF007F80000003FFC0000000FF003FC0000003FFE0 -000000FE003FC0000003FFE0000001FE003FC0000003FFE0000001FE003FC0000007F7E0 -000001FE001FE0000007F7F0000001FC001FE0000007E7F0000003FC001FE000000FE7F0 -000003FC001FF000000FE3F8000003FC000FF000000FE3F8000007F8000FF000000FE3F8 -000007F8000FF000001FC3F8000007F80007F800001FC3FC000007F00007F800001FC1FC -00000FF00007F800001FC1FC00000FF00007F800003F81FC00000FF00003FC00003F81FE -00000FE00003FC00003F80FE00001FE00003FC00003F80FE00001FE00003FC00007F00FE -00001FE00001FE00007F00FF00003FC00001FE00007F007F00003FC00001FE0000FF007F -00003FC00000FF0000FE007F80003F800000FF0000FE007F80007F800000FF0000FE003F -80007F800000FF0001FE003F80007F8000007F8001FC003FC0007F0000007F8001FC001F -C000FF0000007F8001FC001FC000FF0000007F8003F8001FC000FF0000003FC003F8001F -E000FE0000003FC003F8000FE001FE0000003FC003F8000FE001FE0000001FC007F0000F -E001FC0000001FE007F0000FF001FC0000001FE007F00007F003FC0000001FE007F00007 -F003FC0000000FE00FE00007F003F80000000FF00FE00007F803F80000000FF00FE00003 -F807F80000000FF00FE00003F807F800000007F01FC00003F807F000000007F81FC00001 -FC07F000000007F81FC00001FC0FF000000003F81F800001FC0FE000000003F83F800001 -FC0FE000000003F83F800000FE0FE000000003FC3F800000FE1FE000000001FC3F000000 -FE1FC000000001FC3F000000FE1FC000000001FC7F0000007E1FC000000001FE7F000000 -7F1FC000000000FE7E0000007F3F8000000000FE7E0000003F3F8000000000FE7E000000 -3F3F80000000007E7C0000003F3F00000000007EFC0000003FBF00000000007EFC000000 -1FBF00000000007FFC0000001FFF00000000003FF80000001FFE00000000003FF8000000 -1FFE00000000003FF80000000FFE00000000003FF80000000FFE00000000001FF0000000 -0FFC00000000001FF000000007FC00000059457FC45C>87 D<0007FE0000007FFFC00003 -FFFFE0000FFFFFF8001FFFFFFC001FFFFFFE001FF803FF001F8001FF001E0000FF801800 -007F801000003FC00000003FC00000003FE00000001FE00000001FE00000001FE0000000 -1FE00000001FE00000001FE00000001FE00000001FE000007FFFE0000FFFFFE0003FFFFF -E001FFFFFFE003FFFFFFE00FFFE01FE01FFE001FE03FF0001FE07FC0001FE07F80001FE0 -FF00001FE0FE00001FE0FE00001FE0FE00001FE0FE00001FE0FE00003FE0FF00003FE07F -80007FE07FC001FFE07FF00FFFE03FFFFFFFE01FFFFFFFE01FFFFFDFE00FFFFF1FE003FF -F81FE000FF800000232F7CAD2F>97 D<FF00000000FF00000000FF00000000FF00000000 -FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF -00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF003FC000FF03FFF000FF0FFFF800FF3FFFFE00FF7FFFFF -00FFFFFFFF00FFFE07FF80FFF000FFC0FFE0007FC0FFC0001FE0FF80001FF0FF00000FF0 -FF000007F0FF000007F8FF000003F8FF000003F8FF000003F8FF000003FCFF000001FCFF -000001FCFF000001FCFF000001FCFF000001FCFF000001FCFF000001FCFF000001FCFF00 -0001FCFF000001FCFF000003F8FF000003F8FF000003F8FF000007F8FF000007F0FF0000 -0FF0FF00000FF0FF80001FE0FFC0003FE0FFE0007FC0FFF001FF80FFFC07FF80FFFFFFFF -00FF7FFFFE00FF3FFFFC00FF1FFFF000FF07FFC0000000FF0000264A79C832>I<0000FF -C0000007FFFC00001FFFFF00003FFFFFC000FFFFFFE001FFFFFFE003FF003FE003FC0007 -C007F80001C00FF00000C01FE00000001FC00000003FC00000003F800000003F80000000 -7F000000007F000000007F000000007F00000000FE00000000FE00000000FE00000000FE -00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000007F00 -0000007F000000007F000000007F800000003F800000003F800000001FC00000201FE000 -00600FF00001E00FF80003E007FC000FE003FF007FE001FFFFFFE000FFFFFFC0007FFFFF -00001FFFFE000007FFF0000000FF8000232F7CAD2B>I<00000003FC00000003FC000000 -03FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003 -FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC -00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00 -000003FC00000003FC00000003FC00000003FC0007F803FC001FFF83FC007FFFE3FC00FF -FFF3FC01FFFFFFFC03FFFFFFFC07FF80FFFC0FFE003FFC0FF8000FFC1FF00007FC1FE000 -07FC3FC00003FC3FC00003FC7F800003FC7F800003FC7F000003FC7F000003FCFF000003 -FCFE000003FCFE000003FCFE000003FCFE000003FCFE000003FCFE000003FCFE000003FC -FE000003FCFE000003FCFE000003FCFF000003FC7F000003FC7F000003FC7F000003FC7F -800003FC3F800003FC3FC00007FC1FE00007FC1FE0000FFC0FF8001FFC0FFC007FFC07FF -81FFFC03FFFFFFFC01FFFFFBFC00FFFFE3FC007FFFC3FC001FFF03FC0007F80000264A7C -C832>I<0001FE00000007FFC000001FFFF000007FFFF80000FFFFFC0001FFFFFE0003FF -03FF0007FC007F000FF8003F800FF0001F801FE0000FC01FC0000FC03F800007E03F8000 -07E07F000003E07F000003E07E000003E07E000001F0FFFFFFFFF0FFFFFFFFF0FFFFFFFF -F0FFFFFFFFF0FFFFFFFFF0FFFFFFFFF0FC00000000FC00000000FE00000000FE00000000 -FE000000007E000000007E000000007F000000003F000000003F800000003F800000001F -C00000001FE00000100FF000007007F80001F003FE0007F003FF803FF001FFFFFFF000FF -FFFFE0003FFFFF80001FFFFE000007FFF8000000FFC000242F7DAD2B>I<00001FF00000 -7FFE0001FFFE0003FFFE0007FFFE000FFFFE001FF01E003FC002003F8000007F0000007F -000000FE000000FE000000FE000001FE000001FE000001FE000001FE000001FE000001FE -000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE -000001FE0000FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8001FE000001FE -000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE -000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE -000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE -000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE -00001F4A7EC91E>I<0003FC000FE0000FFF00FFE0003FFFC7FFE0007FFFFFFFF000FFFF -FFFFF001FFFFFFFFF003FE07FF800007F801FE000007F000FE00000FE0007F00000FC000 -3F00000FC0003F00001F80001F80001F80001F80001F80001F80001F80001F80001F8000 -1F80001F80001F80001F80001F80001F80001F80000FC0003F00000FC0003F00000FE000 -7F000007F000FE000007F801FE000003FE07FC000007FFFFF8000007FFFFF000000FFFFF -E000000FBFFFC000001F8FFF0000001F83FC0000001F00000000001F80000000001F8000 -0000001F80000000001FC0000000001FE0000000001FFFFFF800000FFFFFFF80000FFFFF -FFE00007FFFFFFF80003FFFFFFFC0007FFFFFFFE001FFFFFFFFF001FFFFFFFFF003FC000 -0FFF807F800000FF807F0000007F80FF0000003FC0FE0000001FC0FE0000001FC0FE0000 -001FC0FE0000001FC0FE0000001FC07F0000003F807F8000007F803FC00000FF003FF800 -07FF001FFF003FFE000FFFFFFFFC0007FFFFFFF80001FFFFFFE000007FFFFF8000001FFF -FE00000001FFE000002C427DAC31>I<FF00000000FF00000000FF00000000FF00000000 -FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF -00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF007FC000FF01FFF800FF07FFFC00FF1FFFFE00FF3FFFFF -00FF7FFFFF80FFFE03FF80FFF800FFC0FFF0007FC0FFE0003FC0FFC0003FE0FFC0001FE0 -FF80001FE0FF80001FE0FF80001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF -00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00 -001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF0000 -1FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001F -E0FF00001FE0FF00001FE0FF00001FE0FF00001FE0234979C832>I<FF80FF80FF80FF80 -FF80FF80FF80FF80FF800000000000000000000000000000000000000000000000000000 -0000000000007F807F807F807F807F807F807F807F807F807F807F807F807F807F807F80 -7F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F80 -7F807F807F807F807F807F807F807F807F807F807F8009457AC417>I<FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000 -00FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000 -FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00007FE0FF -0000FFC0FF0001FF80FF0003FF00FF0007FE00FF000FFC00FF001FF800FF001FF000FF00 -3FE000FF007FC000FF00FF8000FF01FF0000FF03FE0000FF07FE0000FF0FFC0000FF1FF8 -0000FF3FF00000FF7FF00000FFFFF00000FFFFF80000FFFFFC0000FFFFFC0000FFFDFE00 -00FFF9FF0000FFF0FF0000FFE07F8000FFC07FC000FFC03FC000FF803FE000FF001FF000 -FF000FF000FF000FF800FF0007F800FF0003FC00FF0003FE00FF0001FE00FF0000FF00FF -0000FF80FF00007F80FF00003FC0FF00003FE0FF00001FE0FF00000FF0FF00000FF82549 -79C82F>107 D<FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFF084979C817>I<00007FC0000FF800FF01FFF8003FFF00FF07FFFC00 -FFFF80FF1FFFFE03FFFFC0FF3FFFFF07FFFFE0FF7FFFFF8FFFFFF0FFFE03FF9FC07FF0FF -F800FFFF001FF8FFF0007FFE000FF8FFE0003FFC0007F8FFC0003FF80007FCFFC0001FF8 -0003FCFF80001FF00003FCFF80001FF00003FCFF80001FF00003FCFF00001FE00003FCFF -00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE0 -0003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF -00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE0 -0003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF -00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE0 -0003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF00001FE00003FCFF -00001FE00003FCFF00001FE00003FC3E2D79AC4D>I<00007FC000FF01FFF800FF07FFFC -00FF1FFFFE00FF3FFFFF00FF7FFFFF80FFFE03FF80FFF800FFC0FFF0007FC0FFE0003FC0 -FFC0003FE0FFC0001FE0FF80001FE0FF80001FE0FF80001FE0FF00001FE0FF00001FE0FF -00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00 -001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF0000 -1FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001F -E0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0232D79AC32 ->I<00007F8000000003FFF00000000FFFFC0000003FFFFF0000007FFFFF800000FFFFFF -C00001FF807FE00003FE001FF00007F80007F8000FF00003FC000FE00001FC001FC00000 -FE001FC00000FE003F8000007F003F8000007F007F0000003F807F0000003F807F000000 -3F807E0000001F80FE0000001FC0FE0000001FC0FE0000001FC0FE0000001FC0FE000000 -1FC0FE0000001FC0FE0000001FC0FE0000001FC0FE0000001FC0FF0000003FC07F000000 -3F807F0000003F807F0000003F807F8000007F803F8000007F003FC00000FF001FC00000 -FE001FE00001FE000FF00003FC0007F80007F80007FE001FF80003FF807FF00001FFFFFF -E00000FFFFFFC000003FFFFF0000001FFFFE00000003FFF0000000007F8000002A2F7DAD -31>I<00003FC000FF03FFF000FF0FFFF800FF3FFFFE00FF7FFFFF00FFFFFFFF00FFFE07 -FF80FFF000FFC0FFE0007FC0FFC0003FE0FF80001FF0FF00000FF0FF00000FF0FF000007 -F8FF000007F8FF000003F8FF000003F8FF000003FCFF000001FCFF000001FCFF000001FC -FF000001FCFF000001FCFF000001FCFF000001FCFF000001FCFF000001FCFF000001FCFF -000003F8FF000003F8FF000003F8FF000007F8FF000007F0FF00000FF0FF00001FF0FF80 -001FE0FFC0003FE0FFE000FFC0FFF001FF80FFFC0FFF80FFFFFFFF00FF7FFFFE00FF3FFF -FC00FF1FFFF000FF07FFC000FF00FF0000FF00000000FF00000000FF00000000FF000000 -00FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000 -FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000000026 -4079AC32>I<00001FFE00FFFE03FFFE07FFFE1FFFFE3FFFFE7FFFFEFFF0FEFF80FFFE00 -FFFC00FFF800FFF000FFE000FFC000FFC000FF8000FF8000FF8000FF0000FF0000FF0000 -FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 -FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000182D79 -AC21>114 D<003FF80001FFFF0003FFFFC00FFFFFF01FFFFFF83FFFFFF83FE00FF87F80 -01F07F000070FE000030FE000000FE000000FE000000FE000000FE000000FF000000FF80 -00007FE000007FFC00003FFFE0001FFFFC001FFFFF0007FFFF8003FFFFE001FFFFF0007F -FFF00007FFF800003FFC000007FC000003FC000001FE000001FE000000FE000000FE0000 -00FE000000FE400000FE700001FC780001FC7E0003FCFFE01FF8FFFFFFF0FFFFFFF07FFF -FFE01FFFFF8003FFFE00003FF0001F2F7DAD25>I<01FE000001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE00 -00FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE00 -0001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE000001FF00 -0001FF000801FF003800FF81F800FFFFFC007FFFFC007FFFFC003FFFF0001FFF80000FF8 -001E3A7EB823>I<FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF0000 -1FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001F -E0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0 -FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF -00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00003FE0FF00003FE0FF00 -007FE0FF00007FE0FF8000FFE0FF8003FFE07FE00FFFE07FFFFFFFE03FFFFFDFE03FFFFF -1FE01FFFFC1FE007FFF01FE001FF000000232D79AB32>I<FF80001FE00001FE7F80001F -F00003FC7F80001FF00003FC7F80003FF00003FC3FC0003FF80007F83FC0003DF80007F8 -3FC0007DF80007F81FE0007DF80007F01FE0007CFC000FF01FE0007CFC000FF01FE000FC -FC000FF00FF000FCFE001FE00FF000F8FE001FE00FF001F8FE001FE007F801F87E001FC0 -07F801F87F003FC007F801F07F003FC007F803F07F003FC003FC03F03F003F8003FC03F0 -3F807F8003FC03E03F807F8001FC07E03F807F0001FE07E01F807F0001FE07E01FC0FF00 -01FE07C01FC0FF0000FE0FC01FC0FE0000FF0FC00FC0FE0000FF0FC00FE1FE00007F0F80 -0FE1FC00007F0F800FE1FC00007F1F8007E1FC00003F9F8007F3F800003F9F0007F3F800 -003F9F0003F3F800003F9F0003F3F800001F9E0003F3F000001FBE0003F3F000001FBE00 -01F3F000000FBE0001F3E000000FFC0001FFE000000FFC0000FFE000000FFC0000FFE000 -0007F80000FFC0000007F80000FFC0003F2C7FAB42>119 D<7FC000007FC03FE00000FF -801FE00000FF001FF00001FF000FF80003FE0007FC0007FC0003FE0007F80001FE000FF0 -0000FF001FF00000FF803FE000007FC03FC000003FE07F8000001FE0FF0000000FF1FF00 -000007FBFE00000007FFFC00000003FFF800000001FFF000000000FFF0000000007FE000 -0000007FC0000000003F80000000007FC000000000FFE000000000FFF000000001FFF800 -000003FBFC00000007F9FC0000000FF0FE0000000FE0FF0000001FE07F8000003FC03FC0 -00007F801FE00000FF001FE00000FF000FF00001FE0007F80003FC0007FC0007FC0003FE -000FF80001FE000FF00000FF001FE00000FF803FE000007FC07FC000003FE0FF8000001F -F02C2C80AB2D>I<FF000000FFFF000000FFFF800000FF7F800001FE7FC00001FE3FC000 -01FE3FC00003FC3FE00003FC1FE00007F81FF00007F80FF00007F80FF0000FF00FF8000F -F007F8000FF007FC001FE003FC001FE003FC001FC001FE003FC001FE003FC001FE003F80 -00FF007F8000FF007F80007F007F00007F80FF00007F80FE00003F80FE00003FC1FE0000 -1FC1FC00001FC1FC00001FE1F800000FE3F800000FE3F8000007E3F0000007F3F0000007 -F3F0000003F7E0000003F7E0000001F7C0000001F7C0000000FFC0000000FF80000000FF -800000007F800000007F000000007F000000007E00000000FE00000000FE00000000FC00 -000001FC00000001FC00000001F800000003F800000003F000000007F000000007E00000 -400FE00000781FC000007FFFC000007FFF8000007FFF0000007FFE0000007FFC0000000F -F000000028407EAB2D>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fk ecrm0700 7 3 -/Fk 3 52 df<00380000780001F8001FF800FEF800E0F80000F80000F80000F80000F800 -00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800 -00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800 -00F80001FC00FFFFF8FFFFF815267BA521>49 D<00FF000003FFE0000E03F0001800F800 -30007C0060007E0078003F00FC003F00FE001F80FE001F80FE001F80FE001F807C001F80 -00001F8000001F0000003F0000003E0000007E0000007C000000F8000001F0000003E000 -0003C00000078000000E0000001C0000003800000070018000E001800180018003000300 -060003000C0003001FFFFF003FFFFF007FFFFE00FFFFFE00FFFFFE0019267DA521>I<00 -FF000003FFE0000F01F8001C007C0030007E003C003E007E003F007E003F007E003F007E -003F003C003F0000003E0000007E0000007C000000F8000001F0000007E00001FF800001 -FF00000001E0000000F00000007C0000003E0000003F0000001F0000001F8000001F8038 -001F807C001F80FE001F80FE001F80FE001F00FC003F0078003E0070007C003800F8001F -01F00007FFC00000FF000019277DA521>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fl ectt1000 10 71 -/Fl 71 123 df<007000001C01F800007E03F80000FE07F80001FE0FF00003FC1FC00007 -F03F80000FE03F00000FC07E00001F807C00001F00FC00003F00F800003E00FFC0003FF0 -FFE0003FF8FFF0003FFCFFF8003FFEFFF8003FFEFFF8003FFE7FF8001FFE7FF8001FFE3F -F0000FFC1FE00007F807C00001F027177FB22C>16 D<1F000007C03FC0000FF07FE0001F -F8FFF0003FFCFFF0003FFCFFF8003FFEFFF8003FFEFFF8003FFE7FF8001FFE3FF8000FFE -1FF80007FE00F800003E01F800007E01F000007C03F00000FC07E00001F80FE00003F81F -C00007F07F80001FE0FF00003FC0FE00003F80FC00003F007000001C0027177DB22C>I< -3C001E007F007F00FF007F80FF007F80FF007F80FF007F80FF007F80FF007F807F007F00 -7F007F007F007F007F007F007F007F007F007F007E003F007E003F007E003F007E003F00 -7E003F007E003F003E003E003E003E003E003E003C001E001C001C00191977B32C>34 -D<0000380000FC0001FC0003FC0007F8000FF0001FC0003F80007F0000FE0001FC0003F8 -0003F00007F00007E0000FE0000FC0001F80001F80003F80003F00003F00007F00007E00 -007E00007E0000FE0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00 -00FC0000FC0000FC0000FE00007E00007E00007E00007F00003F00003F00003F80001F80 -001F80000FC0000FE00007E00007F00003F00003F80001FC0000FE00007F00003F80001F -C0000FF00007F80003FC0001FC0000FC000038164272B92C>40 D<700000FC0000FE0000 -FF00007F80003FC0000FE00007F00003F80001FC0000FE00007F00003F00003F80001F80 -001FC0000FC00007E00007E00007F00003F00003F00003F80001F80001F80001F80001FC -0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC -0001FC0001F80001F80001F80003F80003F00003F00007F00007E00007E0000FC0001FC0 -001F80003F80003F00007F0000FE0001FC0003F80007F0000FE0003FC0007F8000FF0000 -FE0000FC0000700000164279B92C>I<000380000007C0000007C0000007C0000007C000 -0007C0000007C0002007C008F807C03EFE07C0FEFF07C1FEFFC7C7FEFFE7CFFE3FFFFFF8 -0FFFFFE003FFFF8001FFFF00007FFC00007FFC0001FFFF0003FFFF800FFFFFE03FFFFFF8 -FFE7CFFEFFC7C7FEFF07C1FEFE07C0FEF807C03E2007C0080007C0000007C0000007C000 -0007C0000007C0000007C000000380001F247AAA2C>I<0F801FE03FF07FF87FF87FFC7F -FC7FFC3FFC1FFC0FFC00FC00F800F801F803F007F01FE07FC0FF80FF00FC0070000E1771 -8A2C>44 D<7FFFFFF0FFFFFFF8FFFFFFF8FFFFFFF87FFFFFF01D0579942C>I<1F003F80 -7FC0FFE0FFE0FFE0FFE0FFE07FC03F801F000B0B708A2C>I<00000007000000000F8000 -00000F800000001F800000001F000000003F000000003E000000007E000000007C000000 -007C00000000FC00000000F800000001F800000001F000000003F000000003E000000007 -E000000007C00000000FC00000000F800000001F800000001F000000003F000000003E00 -0000003E000000007E000000007C00000000FC00000000F800000001F800000001F00000 -0003F000000003E000000007E000000007C00000000FC00000000F800000001F80000000 -1F000000003F000000003E000000003E000000007E000000007C00000000FC00000000F8 -00000001F800000001F000000003F000000003E000000007E000000007C00000000FC000 -00000F800000001F800000001F000000001F000000003F000000003E000000007E000000 -007C00000000FC00000000F800000000F800000000700000000021417BB92C>I<0003F8 -0000000FFE0000003FFF8000007FFFC00000FFFFE00001FE0FF00003F803F80007F001FC -0007E000FC000FC0007E000FC0007E001F80003F001F80003F003F00001F803F00001F80 -3E00000F807E00000FC07E00000FC07E00000FC07C000007C0FC000007E0FC000007E0FC -000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC00 -0007E0FC000007E0FC000007E0FE00000FE07E00000FC07E00000FC07E00000FC07E0000 -0FC03F00001F803F00001F803F00001F801F80003F001F80003F000FC0007E000FE000FE -0007E000FC0007F001FC0003F803F80001FE0FF00000FFFFE000007FFFC000003FFF8000 -000FFE00000003F8000023357CB32C>I<00070000000F8000000F8000001F8000001F80 -00003F8000007F800000FF800001FF800007FF80007FFF8000FFFF8000FFDF8000FF9F80 -007C1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80 -00001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80 -00001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80 -00001F8000001F8000001F8000001F8000001F8000001F80007FFFFFE0FFFFFFF0FFFFFF -F0FFFFFFF07FFFFFE01C3477B32C>I<000FF80000007FFF800001FFFFE00007FFFFF000 -0FFFFFFC001FF80FFE003FE001FF003F80007F007F00003F807E00001F80FE00001FC0FE -00000FC0FF00000FE0FF000007E0FF000007E0FF000007E07E000007E03C000007E00000 -0007E000000007E00000000FE00000000FC00000001FC00000001F800000003F80000000 -3F000000007F00000000FE00000001FC00000003FC00000007F80000000FF00000001FE0 -0000003FC0000000FF80000001FE00000003FC00000007F80000000FF00000003FE00000 -007F80000000FF00000001FE00000003FC0003C007F80007E01FE00007E03FC00007E07F -FFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE07FFFFFFFC023347CB32C>I<000FFC0000 -007FFF800001FFFFE00007FFFFF8000FFFFFFC001FF807FE001FC000FE003F80007F003F -C0003F003FC0003F803FC0001F803FC0001F801F80001F800F00001F800000001F800000 -003F800000003F000000007F00000000FE00000001FE00000003FC0000001FF800001FFF -F000003FFFE000003FFFE000003FFFF800001FFFFC00000007FE00000000FF000000007F -000000003F800000001FC00000000FC00000000FC00000000FE000000007E000000007E0 -3C000007E07E000007E0FF000007E0FF00000FE0FF00000FC0FF00000FC0FE00001FC07F -00003F807F80007F003FC000FF001FF807FE000FFFFFFC0007FFFFF80003FFFFE000007F -FF8000000FFC000023357CB32C>I<000007F00000000FF80000001FF80000003FF80000 -003FF80000007EF80000007EF8000000FCF8000001F8F8000001F8F8000003F0F8000007 -E0F8000007E0F800000FC0F800001F80F800001F80F800003F00F800007E00F800007E00 -F80000FC00F80001F800F80001F800F80003F000F80003E000F80007E000F8000FC000F8 -000FC000F8001F8000F8003F0000F8003F0000F8007E0000F800FC0000F800FFFFFFFFFC -FFFFFFFFFEFFFFFFFFFEFFFFFFFFFE7FFFFFFFFC000000F800000000F800000000F80000 -0000F800000000F800000000F800000000F800000000F800000000F800000000F8000000 -7FFFF00000FFFFF80000FFFFF80000FFFFF800007FFFF027347EB32C>I<0FFFFFFE001F -FFFFFF001FFFFFFF001FFFFFFF001FFFFFFE001F800000001F800000001F800000001F80 -0000001F800000001F800000001F800000001F800000001F800000001F800000001F8000 -00001F800000001F800000001F83FE00001F9FFF80001FFFFFE0001FFFFFF8001FFFFFFC -001FFE03FE001FF000FF001FC0007F001F80003F801F00001F800F00001FC00000000FC0 -0000000FC000000007E000000007E000000007E000000007E03C000007E07E000007E0FF -000007E0FF00000FE0FF00000FC0FF00000FC0FE00001FC07E00003F807F00007F003F80 -00FF003FC001FE001FF80FFC000FFFFFF80007FFFFF00001FFFFC000007FFF0000000FF8 -000023347CB22C>I<00003FC0000001FFF8000007FFFC00001FFFFE00003FFFFF00007F -E07F0000FF003F8001FE007F8003F8007F8007F0007F8007E0007F800FE0003F001FC000 -1E001F800000003F800000003F000000003F000000007F000000007E000000007E03FE00 -007E1FFF8000FC7FFFE000FDFFFFF000FFFFFFF800FFFE07FC00FFF001FE00FFC0007F00 -FF80003F80FF00001F80FF00001FC0FE00000FC0FE00000FE0FE000007E0FE000007E0FE -000007E07E000007E07E000007E07E000007E07E000007E03F000007E03F00000FE03F80 -000FC01F80001FC01FC0001F800FC0003F800FE0007F0007F801FE0003FE07FC0001FFFF -F80000FFFFF000007FFFE000001FFF80000007FC000023357CB32C>I<7800000000FFFF -FFFFC0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFC0FC00003F80FC00007F00FC0000 -FE00780000FC00000001FC00000003F800000007F000000007E00000000FE00000000FC0 -0000001F800000003F800000003F000000007F000000007E00000000FE00000000FC0000 -0001FC00000001F800000001F800000003F000000003F000000007F000000007E0000000 -07E000000007E00000000FC00000000FC00000000FC00000000FC00000001F800000001F -800000001F800000001F800000001F800000003F800000003F000000003F000000003F00 -0000003F000000003F000000003F000000003F000000003F000000003F000000003F0000 -00001E00000023357CB32C>I<0007FC0000003FFF000000FFFFC00001FFFFE00003FFFF -F00007FC07F8000FF001FC001FE000FE003F80007E003F80007F007F00003F007E00001F -80FE00001F80FC00001F80FC00000FC0FC00000FC0FC00000FC0FC00000FC0FC00000FE0 -FC00000FE0FC00000FE0FE00000FE07E00000FE07F00001FE03F00001FE03F80003FE01F -C0007FE00FF001FFE007FC0FFFE003FFFFFFE001FFFFF7E000FFFFC7E0003FFF0FE0000F -F80FC00000000FC00000000FC00000001FC00000001F800000003F800000003F000F0000 -7F001F80007E003FC000FE003FC001FC003FC003F8003FC007F8003F801FF0001FE07FE0 -001FFFFFC0000FFFFF000007FFFE000001FFF80000007FC0000023357CB32C>57 -D<0000FE00000001FF00000001FF00000001FF00000001FF00000003FF80000003FF8000 -0003EF80000003EF80000007EF80000007EFC0000007EFC0000007C7C0000007C7C00000 -0FC7E000000FC7E000000FC7E000000FC3E000001F83F000001F83F000001F83F000001F -83F000001F83F000003F01F800003F01F800003F01F800003F01F800007E00FC00007E00 -FC00007E00FC00007E00FC00007E00FC0000FC007E0000FFFFFE0000FFFFFE0000FFFFFE -0001FFFFFF0001FFFFFF0001F8003F0001F8003F0001F8003F0003F0001F8003F0001F80 -03F0001F8003F0001F8007F0001FC007E0000FC07FFE00FFFC7FFF01FFFCFFFF01FFFE7F -FF01FFFC7FFE00FFFC27347EB32C>65 D<7FFFFFE0007FFFFFF800FFFFFFFE007FFFFFFF -007FFFFFFFC003F0003FC003F0000FE003F00007F003F00003F003F00003F003F00001F8 -03F00001F803F00001F803F00001F803F00001F803F00001F803F00003F003F00003F003 -F00007F003F0000FE003F0001FC003F000FF8003FFFFFF0003FFFFFE0003FFFFFC0003FF -FFFF0003FFFFFFC003F0001FE003F00007F003F00003F803F00001F803F00000FC03F000 -00FC03F00000FE03F000007E03F000007E03F000007E03F000007E03F000007E03F00000 -7E03F00000FE03F00000FC03F00001FC03F00003F803F0000FF803F0003FF07FFFFFFFE0 -7FFFFFFFC0FFFFFFFF807FFFFFFE007FFFFFF00027337FB22C>I<0000FF00700007FFE0 -F8000FFFF9F8003FFFFDF8007FFFFFF800FF81FFF801FE007FF803FC001FF807F0000FF8 -07F00007F80FE00007F80FC00003F81F800003F81F800001F83F000001F83F000001F87F -000001F87E000000F07E000000007E00000000FE00000000FC00000000FC00000000FC00 -000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0000 -0000FC00000000FE000000007E000000007E000000007E000000007F000000F03F000001 -F83F000001F81F800001F81F800001F80FC00003F80FE00003F007F00007F007F00007E0 -03FC001FE001FE003FC000FF81FF80007FFFFF00003FFFFE00000FFFFC000007FFF00000 -00FF800025357DB32C>I<7FFFFF0000FFFFFFC000FFFFFFF000FFFFFFF8007FFFFFFC00 -07E003FE0007E000FF0007E0007F8007E0003F8007E0001FC007E0000FE007E0000FE007 -E00007E007E00007F007E00003F007E00003F807E00001F807E00001F807E00001F807E0 -0001F807E00000FC07E00000FC07E00000FC07E00000FC07E00000FC07E00000FC07E000 -00FC07E00000FC07E00000FC07E00000FC07E00000FC07E00000FC07E00001F807E00001 -F807E00001F807E00003F807E00003F007E00003F007E00007F007E00007E007E0000FE0 -07E0001FC007E0003FC007E0007F8007E000FF0007E003FE007FFFFFFC00FFFFFFF800FF -FFFFF000FFFFFFC0007FFFFF000026337EB22C>I<7FFFFFFFF0FFFFFFFFF8FFFFFFFFF8 -FFFFFFFFF87FFFFFFFF803F00001F803F00001F803F00001F803F00001F803F00001F803 -F00001F803F00001F803F00000F003F000000003F000000003F000000003F000000003F0 -01E00003F003F00003F003F00003F003F00003F003F00003FFFFF00003FFFFF00003FFFF -F00003FFFFF00003FFFFF00003F003F00003F003F00003F003F00003F003F00003F001E0 -0003F000000003F000000003F000000003F000000003F000000003F000003C03F000007E -03F000007E03F000007E03F000007E03F000007E03F000007E03F000007E03F000007E7F -FFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE7FFFFFFFFC27337EB22C>I<7FFFFFFFF8 -FFFFFFFFFCFFFFFFFFFCFFFFFFFFFC7FFFFFFFFC03F00000FC03F00000FC03F00000FC03 -F00000FC03F00000FC03F00000FC03F00000FC03F000007803F000000003F000000003F0 -00000003F000000003F000000003F000F00003F001F80003F001F80003F001F80003F001 -F80003FFFFF80003FFFFF80003FFFFF80003FFFFF80003FFFFF80003F001F80003F001F8 -0003F001F80003F001F80003F000F00003F000000003F000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F000000003F00000007FFFE00000FFFFE00000FFFFF00000FFFFE000007FFFE000002633 -7EB22C>I<0001FC0380000FFF87C0001FFFEFC0007FFFFFC000FFFFFFC001FF07FFC003 -FC01FFC003F800FFC007F0007FC00FE0003FC00FC0001FC01FC0001FC01F80001FC03F80 -000FC03F00000FC03F00000FC07E00000FC07E000007807E000000007E00000000FE0000 -0000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC000000 -00FC00000000FC0003FFF8FC0007FFFCFC0007FFFCFE0007FFFC7E0003FFF87E00000FC0 -7E00000FC07E00000FC03F00001FC03F00001FC03F80001FC01F80001FC01FC0003FC00F -C0003FC00FE0007FC007F0007FC003F800FFC003FC01FFC001FF07FFC000FFFFFFC0007F -FFEFC0001FFFCFC0000FFF07800001FC000026357DB32C>I<7FFE00FFFCFFFF01FFFEFF -FF01FFFEFFFF01FFFE7FFE00FFFC07E0000FC007E0000FC007E0000FC007E0000FC007E0 -000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E000 -0FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007FFFFFFC007FFFFFF -C007FFFFFFC007FFFFFFC007FFFFFFC007E0000FC007E0000FC007E0000FC007E0000FC0 -07E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007 -E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0000FC007E0 -000FC07FFE00FFFCFFFF01FFFEFFFF01FFFEFFFF01FFFE7FFE00FFFC27337EB22C>I<7F -FFFFF8FFFFFFFCFFFFFFFCFFFFFFFC7FFFFFF8000FC000000FC000000FC000000FC00000 -0FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000 -0FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000 -0FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000 -0FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000 -0FC0007FFFFFF8FFFFFFFCFFFFFFFCFFFFFFFC7FFFFFF81E3379B22C>I<7FFC007FF8FF -FE00FFFCFFFE00FFFCFFFE00FFFC7FFC007FF807C0001F8007C0003F8007C0007F0007C0 -007E0007C000FC0007C001F80007C003F80007C007F00007C007E00007C00FC00007C01F -800007C03F800007C07F000007C07E000007C0FC000007C1F8000007C3F8000007C7FC00 -0007C7FC000007CFFE000007DFBE000007FFBF000007FF1F000007FE1F800007FC0FC000 -07F80FC00007F807E00007F003E00007E003F00007C001F00007C001F80007C000FC0007 -C000FC0007C0007E0007C0003E0007C0003F0007C0001F0007C0001F8007C0000FC007C0 -000FC007C00007E07FFC001FFCFFFE003FFEFFFE003FFEFFFE003FFE7FFC001FFC27337E -B22C>75 D<7FFFE00000FFFFF00000FFFFF00000FFFFF000007FFFE0000003F000000003 -F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 -000003F000000003F000000003F000000003F000000003F000000003F000000003F00000 -0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 -03F000000003F000000003F00000F003F00001F803F00001F803F00001F803F00001F803 -F00001F803F00001F803F00001F803F00001F87FFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFF -FFFFF87FFFFFFFF025337DB22C>I<7FE0000FFCFFF0001FFEFFF0001FFEFFF8003FFE7F -F8003FFC0FF8003FE00FBC007BE00FBC007BE00FBC007BE00FBC007BE00F9E00F3E00F9E -00F3E00F9E00F3E00F9F01F3E00F9F01F3E00F8F01E3E00F8F01E3E00F8F83E3E00F8F83 -E3E00F8783C3E00F87C7C3E00F87C7C3E00F83C783E00F83C783E00F83EF83E00F83EF83 -E00F81EF03E00F81EF03E00F81FF03E00F80FE03E00F80FE03E00F80FE03E00F807C03E0 -0F803803E00F800003E00F800003E00F800003E00F800003E00F800003E00F800003E00F -800003E00F800003E00F800003E00F800003E00F800003E00F800003E07FF0001FFCFFF8 -003FFEFFF8003FFEFFF8003FFE7FF0001FFC27337EB22C>I<7FF0007FFCFFF800FFFEFF -F800FFFEFFFC00FFFE7FFC007FFC07FE0007C007DE0007C007DE0007C007DF0007C007CF -0007C007CF0007C007CF8007C007C78007C007C7C007C007C7C007C007C3C007C007C3E0 -07C007C3E007C007C1E007C007C1F007C007C1F007C007C0F007C007C0F807C007C0F807 -C007C07C07C007C07C07C007C07C07C007C03E07C007C03E07C007C01E07C007C01F07C0 -07C01F07C007C00F07C007C00F87C007C00F87C007C00787C007C007C7C007C007C7C007 -C003C7C007C003E7C007C001E7C007C001E7C007C001F7C007C000F7C007C000F7C007C0 -00FFC07FFC007FC0FFFE007FC0FFFE003FC0FFFE003FC07FFC001F8027337EB22C>I<00 -7FFF000003FFFFE0000FFFFFF8001FFFFFFC003FFFFFFE003FE003FE003F8000FE007F00 -007F007F00007F007E00003F007E00003F007E00003F00FE00003F80FC00001F80FC0000 -1F80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F -80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80 -FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80FC -00001F80FC00001F80FC00001F80FE00003F80FE00003F807E00003F007E00003F007E00 -003F007F00007F007F00007F003F8000FE003FF007FE003FFFFFFE001FFFFFFC000FFFFF -F80003FFFFE000007FFF000021357BB32C>I<7FFFFFC000FFFFFFF800FFFFFFFC00FFFF -FFFF007FFFFFFF8003F000FFC003F0003FC003F0000FE003F00007F003F00007F003F000 -03F003F00003F803F00001F803F00001F803F00001F803F00001F803F00001F803F00001 -F803F00003F803F00003F003F00007F003F00007F003F0000FE003F0003FC003F000FFC0 -03FFFFFF8003FFFFFF0003FFFFFC0003FFFFF80003FFFFC00003F000000003F000000003 -F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F000000003F000000003F000000003F000000003F00000007FFF80 -0000FFFFC00000FFFFC00000FFFFC000007FFF80000025337EB22C>I<7FFFFC000000FF -FFFF800000FFFFFFE00000FFFFFFF800007FFFFFFC000007E007FE000007E001FE000007 -E0007F000007E0003F800007E0001F800007E0001F800007E0000FC00007E0000FC00007 -E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0001F800007E0001F800007 -E0003F800007E0007F000007E001FE000007E007FE000007FFFFFC000007FFFFF8000007 -FFFFE0000007FFFFF0000007FFFFF8000007E007FC000007E001FE000007E000FE000007 -E0007F000007E0003F000007E0003F000007E0003F000007E0003F000007E0003F000007 -E0003F000007E0003F000007E0003F000007E0003F0F0007E0003F1F8007E0003F1F8007 -E0003F1F8007E0003F1F8007E0003F1F807FFE001FBF80FFFF001FFF00FFFF000FFF00FF -FF000FFE007FFE0007FC0000000001F00029347EB22C>82 D<001FF8070000FFFF0F8001 -FFFFCF8007FFFFFF800FFFFFFF801FF01FFF803FC003FF803F8001FF807F0000FF807E00 -007F80FE00003F80FC00003F80FC00001F80FC00001F80FC00001F80FC00001F80FE0000 -0F007E000000007F000000007F800000003FE00000001FFC0000001FFFC000000FFFFC00 -0003FFFFC00001FFFFF000007FFFF8000007FFFC0000007FFE00000007FF00000000FF80 -0000003F800000001FC00000001FC00000000FE00000000FE078000007E0FC000007E0FC -000007E0FC000007E0FC000007E0FC000007E0FE00000FC0FE00000FC0FF00001F80FF80 -003F80FFE0007F00FFFE01FF00FFFFFFFE00FFFFFFFC00F9FFFFF000F83FFFC0007007FF -000023357CB32C>I<7FFFFFFFFCFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFC00 -7E007EFC007E007EFC007E007EFC007E007EFC007E007EFC007E007EFC007E007E78007E -003C00007E000000007E000000007E000000007E000000007E000000007E000000007E00 -0000007E000000007E000000007E000000007E000000007E000000007E000000007E0000 -00007E000000007E000000007E000000007E000000007E000000007E000000007E000000 -007E000000007E000000007E000000007E000000007E000000007E000000007E00000000 -7E000000007E000000007E000000007E000000007E0000003FFFFC00003FFFFC00007FFF -FE00003FFFFC00003FFFFC0027337EB22C>I<7FFF803FFFC0FFFFC07FFFE0FFFFC07FFF -E0FFFFC07FFFE07FFF803FFFC003F00001F80003F00001F80003F00001F80003F00001F8 -0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F8 -0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F8 -0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F8 -0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F8 -0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F80003F8 -0001F80003F00001F80003F00001FC0007F00000FC0007E00000FE000FE000007F001FC0 -00003F803F8000003FE0FF8000001FFFFF0000000FFFFE00000003FFF800000001FFF000 -0000003F8000002B3480B22C>I<7FFC007FFCFFFE00FFFEFFFE00FFFEFFFE00FFFE7FFC -007FFC0FC00007E00FE0000FE007E0000FC007E0000FC007E0000FC007F0001FC003F000 -1F8003F0001F8003F0001F8003F8003F8001F8003F0001F8003F0001F8003F0001FC007F -0000FC007E0000FC007E0000FC007E0000FC007E00007E00FC00007E00FC00007E00FC00 -007E00FC00003F01F800003F01F800003F01F800003F01F800001F83F000001F83F00000 -1F83F000001F83F000000F83E000000FC7E000000FC7E000000FC7E0000007C7C0000007 -C7C0000007EFC0000007EFC0000003EF80000003EF80000003FF80000003FF80000001FF -00000001FF00000001FF00000001FF00000000FE000027347EB22C>I<7FF00007FF00FF -F8000FFF80FFF8000FFF80FFF8000FFF807FF00007FF001F0000007C001F0000007C001F -0000007C001F0000007C000F800000F8000F800000F8000F800000F8000F800000F8000F -800000F8000F800000F8000F800000F80007C00001F00007C00001F00007C00001F00007 -C00001F00007C03E01F00007C07F01F00007C07F01F00007C07F01F00003E0FF83E00003 -E0FF83E00003E0F783E00003E0F783E00003E1F7C3E00003E1F7C3E00003E1F7C3E00001 -E1E3C3C00001E1E3C3C00001F1E3C7C00001F3E3E7C00001F3E3E7C00001F3E3E7C00001 -F3C1E7C00001F3C1E7C00000F3C1E7800000F3C1E7800000F7C1F7800000F780F7800000 -F780F7800000F780F7800000FF80FF8000007F80FF0000007F007F0000007F007F000000 -7F007F0000007F007F0000003E003E000029347FB22C>I<3FFF03FFE07FFF07FFF07FFF -87FFF07FFF07FFF03FFF03FFE001F800FE0001FC00FE0000FC01FC0000FE01FC00007E01 -F800007F03F800003F03F000003F87F000001F87E000001FCFE000000FCFC000000FFFC0 -000007FF80000007FF80000003FF00000003FF00000001FE00000001FE00000000FC0000 -0000FC00000001FE00000001FE00000003FF00000003FF00000007FF80000007FFC00000 -0FCFC000000FCFE000001FC7E000001F87F000003F83F000003F03F800007F01F800007E -01FC0000FE00FC0000FC00FE0001FC007E0001F8007F0003F8003F0003F0003F8003F000 -1F807FFE00FFFC7FFF01FFFCFFFF01FFFE7FFF01FFFC7FFE00FFFC27337EB22C>I<7FFC -007FFCFFFE00FFFEFFFE00FFFEFFFE00FFFE7FFC007FFC07F0000FC007F0001FC003F000 -1F8003F8003F8001F8003F8001FC007F0000FC007F0000FE007E00007E00FE00007F00FC -00003F01FC00003F81F800001F81F800001F83F000000FC3F000000FC7F0000007E7E000 -0007E7E0000003E7C0000003EFC0000001FF80000001FF80000001FF00000000FF000000 -00FE000000007E000000007E000000007E000000007E000000007E000000007E00000000 -7E000000007E000000007E000000007E000000007E000000007E000000007E000000007E -000000007E000000007E00000007FFE000000FFFF000000FFFF000000FFFF0000007FFE0 -0027337EB22C>I<3FFFFFFFC07FFFFFFFE07FFFFFFFE07FFFFFFFE07FFFFFFFE07E0000 -1FC07E00003F807E00003F807E00007F007E00007E007E0000FE007E0001FC003C0001F8 -00000003F800000007F000000007F00000000FE00000001FC00000001FC00000003F8000 -00007F000000007F00000000FE00000001FC00000001FC00000003F800000007F0000000 -07F00000000FE00000001FC00000001FC00000003F800000007F000000007F00000000FE -00000001FC00000001FC00000003F80003C003F00007E007F00007E00FE00007E00FC000 -07E01FC00007E03F800007E03F800007E07F000007E0FFFFFFFFE0FFFFFFFFE0FFFFFFFF -E0FFFFFFFFE07FFFFFFFC023337CB22C>I<7000000000F800000000F800000000FC0000 -00007C000000007E000000003E000000003F000000001F000000001F000000001F800000 -000F800000000FC000000007C000000007E000000003E000000003F000000001F0000000 -01F800000000F800000000FC000000007C000000007E000000003E000000003E00000000 -3F000000001F000000001F800000000F800000000FC000000007C000000007E000000003 -E000000003F000000001F000000001F800000000F800000000FC000000007C000000007E -000000003E000000003E000000003F000000001F000000001F800000000F800000000FC0 -00000007C000000007E000000003E000000003F000000001F000000001F800000000F800 -000000FC000000007C000000007C000000007E000000003E000000003F000000001F0000 -00001F800000000F800000000F80000000070021417BB92C>92 D<7FFFFFFF00FFFFFFFF -80FFFFFFFF80FFFFFFFF80FFFFFFFF807FFFFFFF0021067B7D2C>95 -D<01FFF0000007FFFE00001FFFFF80001FFFFFE0003FFFFFF0003FC01FF8003FC007F800 -3FC001FC001F8000FC00060000FE000000007E000000007E000000007E000000FFFE0000 -1FFFFE0000FFFFFE0003FFFFFE000FFFFFFE001FFF807E003FF8007E007FC0007E007F00 -007E00FE00007E00FC00007E00FC00007E00FC00007E00FC00007E00FE00007E007F0000 -FE007F8003FE003FE01FFE001FFFFFFFFC0FFFFFFFFE07FFFFBFFE01FFFE1FFE003FF007 -FC27247CA32C>97 D<7FF0000000FFF8000000FFF8000000FFF80000007FF800000001F8 -00000001F800000001F800000001F800000001F800000001F800000001F800000001F800 -000001F800000001F800000001F81FE00001F8FFF80001FBFFFE0001FFFFFF0001FFFFFF -8001FFF07FC001FF801FE001FF0007F001FE0003F801FC0003F801FC0001FC01F80000FC -01F80000FC01F80000FE01F800007E01F800007E01F800007E01F800007E01F800007E01 -F800007E01F800007E01F800007E01F80000FE01FC0000FC01FC0000FC01FC0001F801FE -0003F801FF0007F001FF000FF001FF801FE001FFE07FC001FFFFFF8001FFFFFF0001FBFF -FE0001F8FFF80000F03FC00027337FB22C>I<0003FFE000001FFFF800007FFFFE0001FF -FFFE0003FFFFFF0007FE00FF000FF000FF001FE000FF001FC0007E003F800018003F0000 -00007F000000007E000000007E00000000FC00000000FC00000000FC00000000FC000000 -00FC00000000FC00000000FC00000000FC000000007E000000007E000000007F00000000 -3F00000F003F80001F801FC0001F801FE0003F800FF0007F0007FE03FF0003FFFFFE0001 -FFFFFC00007FFFF800001FFFE0000003FF000021247AA32C>I<00000FFE0000001FFF00 -00001FFF0000001FFF0000000FFF000000003F000000003F000000003F000000003F0000 -00003F000000003F000000003F000000003F000000003F000000003F000007F83F00003F -FE3F0000FFFFBF0001FFFFFF0003FFFFFF0007FC0FFF000FF003FF001FE001FF001FC000 -FF003F80007F003F00007F007E00003F007E00003F00FE00003F00FC00003F00FC00003F -00FC00003F00FC00003F00FC00003F00FC00003F00FC00003F00FC00003F00FE00003F00 -7E00007F007E00007F007F0000FF003F8000FF003F8001FF001FC003FF000FF007FF0007 -FC1FFF0003FFFFFFFC01FFFFBFFE00FFFF3FFE003FFC3FFE000FF01FFC27337DB22C>I< -0003FE0000001FFFC000007FFFF00001FFFFF80003FFFFFC0007FE03FE000FF800FF001F -E0003F801FC0003F803F80001FC03F00000FC07F00000FC07E00000FE07E000007E0FC00 -0007E0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFC0FC00000000FE0000 -00007E000000007E000000007F000000003F000003C03F800007E01FC00007E00FF0000F -E007F8003FC007FF00FFC001FFFFFF8000FFFFFF00003FFFFC00000FFFF0000001FF8000 -23247CA32C>I<00000FF80000003FFE000000FFFF000001FFFF800003FFFF800007FC7F -800007F07F80000FE03F00000FC03F00000FC00000000FC00000000FC00000000FC00000 -000FC00000000FC000007FFFFFFE00FFFFFFFF00FFFFFFFF00FFFFFFFF007FFFFFFE0000 -0FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000F -C00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0 -0000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC000 -00000FC00000000FC00000000FC00000000FC000003FFFFFF0007FFFFFF8007FFFFFF800 -7FFFFFF8003FFFFFF00021337DB22C>I<00000003F80007F80FFC001FFE3FFE007FFFFF -FF01FFFFFFFF03FFFFFE7F03FC0FF87F07F003F83E0FE001FC1C0FC000FC001FC000FE00 -1F80007E001F80007E001F80007E001F80007E001F80007E001F80007E001FC000FE000F -C000FC000FE001FC0007F003F80003FC0FF00007FFFFF00007FFFFE0000FFFFF80000F9F -FE00000F87F800000F800000000F800000000F800000000FC000000007E000000007FFFF -F00003FFFFFE0007FFFFFF800FFFFFFFE01FFFFFFFF03FC0001FF87F000003FC7E000000 -FC7C0000007CFC0000007EF80000003EF80000003EF80000003EF80000003EFC0000007E -7E000000FC7F800003FC3FE0000FF81FFC007FF00FFFFFFFE003FFFFFF8001FFFFFF0000 -3FFFF8000007FFC00028387EA42C>I<7FF000000000FFF800000000FFF800000000FFF8 -000000007FF80000000001F80000000001F80000000001F80000000001F80000000001F8 -0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8 -1FE0000001F87FFC000001F9FFFE000001FBFFFF000001FFFFFF000001FFF03F800001FF -C01F800001FF801FC00001FF000FC00001FE000FC00001FC000FC00001FC000FC00001F8 -000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8 -000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8 -000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8 -000FC0007FFFE0FFFF00FFFFF1FFFF80FFFFF1FFFF80FFFFF1FFFF807FFFE0FFFF002933 -7FB22C>I<00070000001FC000001FC000003FE000003FE000003FE000001FC000001FC0 -0000070000000000000000000000000000000000000000000000000000000000007FFFC0 -007FFFE000FFFFE0007FFFE0007FFFE0000007E0000007E0000007E0000007E0000007E0 -000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 -000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 -000007E0000007E0000007E0007FFFFFFCFFFFFFFEFFFFFFFEFFFFFFFE7FFFFFFC1F3479 -B32C>I<00000E0000003F8000003F8000007FC000007FC000007FC000003F8000003F80 -00000E000000000000000000000000000000000000000000000000000000000001FFFF80 -03FFFFC003FFFFC003FFFFC001FFFFC000000FC000000FC000000FC000000FC000000FC0 -00000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0 -00000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0 -00000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0 -00000FC000000FC000000FC000000FC000000FC000000FC000001FC03C001F807E003F80 -FF003F00FF007F00FF01FE00FFFFFC007FFFF8007FFFF0001FFFE00007FF00001A467CB3 -2C>I<7FE0000000FFF0000000FFF0000000FFF00000007FF000000001F000000001F000 -000001F000000001F000000001F000000001F000000001F000000001F000000001F00000 -0001F000000001F01FFFF001F03FFFF801F03FFFF801F03FFFF801F01FFFF001F000FE00 -01F001FC0001F003F80001F007F00001F00FE00001F01FC00001F03F800001F07F000001 -F0FE000001F1FC000001F3FC000001F7FE000001FFFF000001FFFF000001FF9F800001FF -0FC00001FE0FE00001FC07E00001F803F00001F001F80001F001FC0001F000FC0001F000 -7E0001F0003F0001F0003F8001F0001F807FFFC0FFFCFFFFE1FFFEFFFFE1FFFEFFFFE1FF -FE7FFFC0FFFC27337EB22C>I<7FFFE00000FFFFF00000FFFFF00000FFFFF000007FFFF0 -00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 -000003F000000003F000000003F000000003F000000003F000000003F000000003F00000 -0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F000000003F000000003F000000003F000007FFFFFFF80FFFFFFFF -C0FFFFFFFFC0FFFFFFFFC07FFFFFFF8022337BB22C>I<7F83F007E0007FCFFC1FF800FF -DFFE3FFC007FFFFEFFFC007FFFFFFFFE0007FE1FFC3E0007FC1FF83F0007F80FF01F0007 -F00FE01F0007E00FC01F0007E00FC01F0007E00FC01F0007C00F801F0007C00F801F0007 -C00F801F0007C00F801F0007C00F801F0007C00F801F0007C00F801F0007C00F801F0007 -C00F801F0007C00F801F0007C00F801F0007C00F801F0007C00F801F0007C00F801F0007 -C00F801F0007C00F801F0007C00F801F0007C00F801F0007C00F801F007FFC3FF87FF07F -FC7FF8FFF0FFFE7FFCFFF87FFC7FF8FFF07FFC3FF87FF02D2481A32C>I<7FF01FE00000 -FFF87FFC0000FFF9FFFE0000FFFBFFFF00007FFFFFFF000001FFF03F800001FFC01F8000 -01FF801FC00001FF000FC00001FE000FC00001FC000FC00001FC000FC00001F8000FC000 -01F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC000 -01F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC000 -01F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC000 -7FFFE0FFFF00FFFFF1FFFF80FFFFF1FFFF80FFFFF1FFFF807FFFE0FFFF0029247FA32C> -I<0007FC0000001FFF0000007FFFC00001FFFFF00003FFFFF80007FC07FC000FF001FE00 -1FE000FF001F80003F003F80003F803F00001F807E00000FC07E00000FC07E00000FC0FC -000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FE00 -000FE07E00000FC07E00000FC07F00001FC03F00001F803F80003F801FC0007F001FE000 -FF000FF001FE0007FC07FC0003FFFFF80001FFFFF000007FFFC000001FFF00000007FC00 -0023247CA32C>I<7FF01FE000FFF8FFF800FFFBFFFE00FFFFFFFF007FFFFFFF8001FFF0 -7FC001FF801FE001FF0007F001FE0003F801FC0003F801FC0001FC01F80000FC01F80000 -FC01F80000FE01F800007E01F800007E01F800007E01F800007E01F800007E01F800007E -01F800007E01F800007E01F80000FE01FC0000FC01FC0000FC01FC0001F801FE0003F801 -FF0007F001FF000FF001FF801FE001FFE07FC001FFFFFF8001FFFFFF0001FBFFFE0001F8 -FFF80001F83FC00001F800000001F800000001F800000001F800000001F800000001F800 -000001F800000001F800000001F800000001F800000001F800000001F800000001F80000 -007FFFE00000FFFFF00000FFFFF00000FFFFF000007FFFE0000027367FA32C>I<0003FC -078000001FFF0FC000007FFFCFC00001FFFFEFC00003FFFFFFC00007FE07FFC0000FF001 -FFC0001FE000FFC0001FC0007FC0003F80003FC0003F00003FC0007F00001FC0007E0000 -1FC0007E00000FC000FC00000FC000FC00000FC000FC00000FC000FC00000FC000FC0000 -0FC000FC00000FC000FC00000FC000FC00000FC000FE00000FC0007E00001FC0007E0000 -1FC0003F00003FC0003F80003FC0001FC0007FC0001FE000FFC0000FF003FFC00007FC0F -FFC00003FFFFFFC00001FFFFEFC000007FFF8FC000003FFF0FC0000007F80FC000000000 -0FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC000000000 -0FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC000000000 -0FC000000003FFFF00000007FFFF80000007FFFF80000007FFFF80000003FFFF0029367D -A32C>I<7FFE003FC0FFFF01FFF0FFFF07FFF8FFFF1FFFFC7FFF3FFFFC003F7FE1FC003F -FF01FC003FFC00F8003FF80070003FF00000003FE00000003FE00000003FC00000003F80 -0000003F800000003F800000003F000000003F000000003F000000003F000000003F0000 -00003F000000003F000000003F000000003F000000003F000000003F000000003F000000 -003F000000003F000000003F0000007FFFFFE000FFFFFFF000FFFFFFF000FFFFFFF0007F -FFFFE00026247EA32C>I<007FF87003FFFFF80FFFFFF81FFFFFF83FFFFFF87FC00FF87E -0003F8FC0001F8F80001F8F80001F8F80001F8FC0000F07F0000007FF000003FFFC0001F -FFFE000FFFFF8003FFFFE0007FFFF80001FFFC000007FC000000FE7800007FFC00003FFC -00001FFE00001FFE00001FFF00003FFF80003EFFC000FEFFF007FCFFFFFFFCFFFFFFF8FF -FFFFE0F8FFFF80701FFC0020247AA32C>I<001E000000003F000000003F000000003F00 -0000003F000000003F000000003F000000003F000000003F000000003F0000007FFFFFFF -00FFFFFFFF80FFFFFFFF80FFFFFFFF807FFFFFFF00003F000000003F000000003F000000 -003F000000003F000000003F000000003F000000003F000000003F000000003F00000000 -3F000000003F000000003F000000003F000000003F000000003F000000003F000000003F -0003C0003F0007E0003F0007E0003F0007E0003F0007E0003F0007E0003F800FE0001F80 -1FC0001FE07FC0000FFFFF80000FFFFF000003FFFE000001FFF80000003FE000232E7EAD -2C>I<7FF003FF8000FFF807FFC000FFF807FFC000FFF807FFC0007FF803FFC00001F800 -0FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F800 -0FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F800 -0FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F8000FC00001F800 -0FC00001F8000FC00001F8000FC00001F8001FC00001F8001FC00001F8003FC00001FC00 -7FC00000FE03FFC00000FFFFFFFF00007FFFFFFF80003FFFFFFF80001FFFCFFF800003FE -07FF0029247FA32C>I<7FFF01FFFCFFFF01FFFEFFFF83FFFEFFFF01FFFE7FFF01FFFC03 -E0000F8003E0000F8003F0001F8001F0001F0001F0001F0001F8003F0000F8003E0000F8 -003E0000FC007E00007C007C00007C007C00007E00FC00003E00F800003E00F800003F01 -F800001F01F000001F01F000001F83F000000F83E000000F83E000000FC7E0000007C7C0 -000007C7C0000007EFC0000003EF80000003EF80000003FF80000001FF00000001FF0000 -0000FE000000007C000027247EA32C>I<7FFF007FFF007FFF80FFFF00FFFF80FFFF807F -FF80FFFF007FFF007FFF0007C00001F00007C00001F00007C00001F00007C00001F00007 -C00001F00007C00001F00003E00003E00003E00003E00003E00003E00003E03E03E00003 -E07F03E00003E07F03E00001F07F07C00001F0FF87C00001F0FF87C00001F0F787C00001 -F0F787C00001F1F7C7C00000F1F7C7800000F9E3CF800000F9E3CF800000FBE3EF800000 -FBE3EF800000FBE3EF8000007BC1EF0000007FC1FF0000007FC1FF0000007F80FF000000 -7F80FF0000003F80FE0000001F007C000029247FA32C>I<3FFF03FFF07FFF87FFF87FFF -87FFF87FFF87FFF83FFF03FFF000FC007E0000FC00FC00007E01F800003F01F000001F83 -F000001F87E000000FCFC0000007EF80000003FF80000001FF00000001FE00000000FC00 -0000007C00000000FE00000001FE00000001FF00000003EF80000007CFC000000FC7C000 -000F83E000001F01F000003F01F800007E00F800007C007C0000F8007E0001F8003F007F -FF01FFFC7FFF83FFFCFFFF83FFFE7FFF83FFFC7FFF01FFFC27247EA32C>I<7FFF01FFFC -FFFF81FFFEFFFF83FFFEFFFF81FFFE7FFF01FFFC03E0000F8001F0000F8001F0001F8001 -F8001F0000F8001F0000F8003F0000FC003E00007C003E00007E007E00003E007C00003E -007C00003F00FC00001F00F800001F00F800000F81F800000F81F000000F81F0000007C1 -F0000007C3E0000007C3E0000003E3E0000003E7C0000001E7C0000001F7C0000001F780 -000000FF80000000FF80000000FF000000007F000000007F000000003E000000003E0000 -00007E000000007C000000007C00000000FC00000000F800000000F800000C01F800003F -01F000007F83F000007F87E000007E0FE000007E1FC000007FFF8000003FFF0000001FFE -0000000FFC00000007E000000027367EA32C>I<3FFFFFFFE07FFFFFFFF07FFFFFFFF07F -FFFFFFF07FFFFFFFF07E00001FE07E00003FC07E00007F807E0000FF007E0001FE003C00 -03FC00000007F80000000FF00000001FE00000003FC00000007F80000000FF00000001FC -00000003F80000000FF00000001FE00000003FC00000007F80000000FF00000001FE0001 -E003FC0003F007F80003F00FF00003F01FE00003F03FC00003F07F800003F0FFFFFFFFF0 -FFFFFFFFF0FFFFFFFFF0FFFFFFFFF07FFFFFFFE024247DA32C>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fm ecbx1000 10 30 -/Fm 30 122 df<FFFFFFFFFFFFFFFFFFFFFFFCFFFFFFFFFFFFFFFFFFFFFFFCFFFFFFFFFF -FFFFFFFFFFFFFC5E0380975F>22 D<00001E000000003E00000000FE00000007FE000000 -7FFE0000FFFFFE0000FFFFFE0000FFFFFE0000FF8FFE0000000FFE0000000FFE0000000F -FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE -0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00 -00000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000 -000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000000 -0FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000F -FE0000000FFE0000000FFE00007FFFFFFF807FFFFFFF807FFFFFFF807FFFFFFF80213679 -B530>49 D<000FFE0000007FFFC00001FFFFF00007FFFFFC000FE03FFF001F800FFF803F -0003FFC07F8003FFE07FE001FFE0FFE000FFF0FFF000FFF0FFF000FFF0FFF0007FF8FFF0 -007FF8FFF0007FF8FFF0007FF87FE0007FF83FC0007FF80600007FF80000007FF8000000 -FFF0000000FFF0000000FFE0000001FFE0000001FFC0000003FF80000003FF00000007FE -0000000FFC0000001FF00000001FE00000003FC00000007F00000000FE00000001FC0000 -0003F000780007E00078000FC00078001F800078003F0000F8007C0000F000F80000F000 -F00001F001FFFFFFF003FFFFFFF007FFFFFFF00FFFFFFFF01FFFFFFFF03FFFFFFFF07FFF -FFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE025367BB530>I<0003FF000000 -1FFFF000007FFFFC0001FC07FF0003F003FF8007E001FFC007C000FFE00FF800FFE00FFC -00FFF01FFE00FFF01FFE00FFF01FFE00FFF01FFE00FFF01FFE00FFF01FFE00FFF00FFC00 -FFE007F800FFE003F001FFE0000001FFC0000003FF80000003FF00000007FE0000000FFC -0000003FF000000FFFC000000FFF8000000FFFF000000007FE00000001FF80000000FFC0 -000000FFE00000007FF00000007FF80000003FFC0000003FFC0000003FFE1FC0003FFE3F -E0003FFE7FF0003FFEFFF8003FFEFFF8003FFEFFF8003FFEFFF8003FFEFFF8003FFCFFF8 -003FFCFFF0007FFC7FF0007FF87FC000FFF03F8000FFF01FC001FFE00FFC07FF8007FFFF -FF0001FFFFFC00007FFFF0000007FF000027377CB530>I<00000007C0000000000FC000 -0000000FC0000000001FC0000000003FC0000000007FC000000000FFC000000001FFC000 -000001FFC000000003FFC000000007FFC00000000FFFC00000001FFFC00000003EFFC000 -00003CFFC000000078FFC0000000F0FFC0000001F0FFC0000003E0FFC0000003C0FFC000 -000780FFC000000F00FFC000001F00FFC000003E00FFC000007C00FFC000007800FFC000 -00F000FFC00001E000FFC00003E000FFC00007C000FFC000078000FFC0000F0000FFC000 -1E0000FFC0003C0000FFC0007C0000FFC000F80000FFC000FFFFFFFFFF80FFFFFFFFFF80 -FFFFFFFFFF80FFFFFFFFFF80000001FFC000000001FFC000000001FFC000000001FFC000 -000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000 -0003FFFFFF800003FFFFFF800003FFFFFF800003FFFFFF8029367DB530>I<3C00000000 -003E00000000003FE0000000003FFFFFFFFF803FFFFFFFFF803FFFFFFFFF803FFFFFFFFF -803FFFFFFFFF007FFFFFFFFE007FFFFFFFFC007FFFFFFFF8007FFFFFFFF0007FFFFFFFE0 -007FFFFFFFE0007C00000FC0007800001F80007800003F0000F800007E0000F00000FC00 -00F00000F80000F00001F80000F00003F00000000007E0000000000FC0000000000FC000 -0000001F80000000003F80000000007F00000000007F0000000000FE0000000000FE0000 -000001FE0000000001FC0000000003FC0000000003FC0000000007FC0000000007FC0000 -00000FFC000000000FF8000000000FF8000000001FF8000000001FF8000000001FF80000 -00001FF8000000001FF8000000003FF8000000003FF8000000003FF8000000003FF80000 -00003FF8000000003FF8000000003FF8000000003FF8000000003FF8000000001FF00000 -00000FE00000000007C000000029397BB730>55 D<FFFFFFFFFFC00000FFFFFFFFFFFC00 -00FFFFFFFFFFFF0000FFFFFFFFFFFFC000007FF00003FFE000007FF00000FFF000007FF0 -00007FF800007FF000003FFC00007FF000001FFC00007FF000001FFE00007FF000001FFE -00007FF000000FFF00007FF000000FFF00007FF000000FFF00007FF000000FFF00007FF0 -00000FFF00007FF000000FFF00007FF000000FFF00007FF000001FFE00007FF000001FFE -00007FF000001FFC00007FF000003FFC00007FF000007FF800007FF00000FFF000007FF0 -0001FFC000007FF0000FFF8000007FFFFFFFFC0000007FFFFFFFFC0000007FFFFFFFFF80 -00007FF00000FFF000007FF000003FF800007FF000001FFC00007FF000000FFE00007FF0 -000007FF00007FF0000007FF80007FF0000003FFC0007FF0000003FFC0007FF0000003FF -C0007FF0000003FFE0007FF0000003FFE0007FF0000003FFE0007FF0000003FFE0007FF0 -000003FFE0007FF0000003FFE0007FF0000003FFE0007FF0000003FFC0007FF0000003FF -C0007FF0000007FFC0007FF000000FFF80007FF000000FFF00007FF000001FFF00007FF0 -00007FFE00007FF00001FFFC00FFFFFFFFFFFFF000FFFFFFFFFFFFC000FFFFFFFFFFFF00 -00FFFFFFFFFFF000003B397DB844>66 D<FFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC007FF8 -00007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF8 -00007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF8 -00007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF8 -00007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF8 -00007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF800007FF8 -00007FF800007FF800007FF800FFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC1E397DB824>73 -D<FFFFFFFF000000FFFFFFFF000000FFFFFFFF000000FFFFFFFF000000007FF800000000 -007FF800000000007FF800000000007FF800000000007FF800000000007FF80000000000 -7FF800000000007FF800000000007FF800000000007FF800000000007FF800000000007F -F800000000007FF800000000007FF800000000007FF800000000007FF800000000007FF8 -00000000007FF800000000007FF800000000007FF800000000007FF800000000007FF800 -000000007FF800000000007FF800000000007FF800000000007FF800000000007FF80000 -0000007FF800000000007FF800000000007FF800000000007FF800000780007FF8000007 -80007FF800000780007FF800000780007FF800000780007FF800000F80007FF800000F00 -007FF800000F00007FF800000F00007FF800001F00007FF800001F00007FF800003F0000 -7FF800003F00007FF800007F00007FF80000FF00007FF80001FF00007FF80003FF00007F -F8000FFE00007FF8007FFE00FFFFFFFFFFFE00FFFFFFFFFFFE00FFFFFFFFFFFE00FFFFFF -FFFFFE0031397DB839>76 D<000000FFF800000000000FFFFF80000000007FFFFFF00000 -0001FFC01FFC00000007FF0007FF0000001FFC0001FFC000003FF000007FE000007FE000 -003FF00000FFC000001FF80001FF8000000FFC0003FF8000000FFE0007FF00000007FF00 -07FF00000007FF000FFE00000003FF800FFE00000003FF801FFC00000001FFC01FFC0000 -0001FFC03FFC00000001FFE03FFC00000001FFE03FFC00000001FFE07FF800000000FFF0 -7FF800000000FFF07FF800000000FFF07FF800000000FFF0FFF800000000FFF8FFF80000 -0000FFF8FFF800000000FFF8FFF800000000FFF8FFF800000000FFF8FFF800000000FFF8 -FFF800000000FFF8FFF800000000FFF8FFF800000000FFF8FFF800000000FFF8FFF80000 -0000FFF8FFF800000000FFF87FF800000000FFF07FFC00000001FFF07FFC00000001FFF0 -7FFC00000001FFF03FFC00000001FFE03FFC00000001FFE03FFE00000003FFE01FFE0000 -0003FFC01FFE00000003FFC00FFF00000007FF8007FF00000007FF0007FF8000000FFF00 -03FFC000001FFE0001FFC000001FFC0000FFE000003FF800007FF000007FF000003FFC00 -01FFE000001FFF0007FFC0000007FFC01FFF00000001FFFFFFFC000000007FFFFFF00000 -00000FFFFF800000000000FFF80000003D3B7BB948>79 D<FFFFFFFFFF0000FFFFFFFFFF -F000FFFFFFFFFFFE00FFFFFFFFFFFF80007FF8000FFFC0007FF80001FFE0007FF80000FF -F0007FF800007FF8007FF800003FFC007FF800003FFC007FF800001FFE007FF800001FFE -007FF800001FFF007FF800001FFF007FF800001FFF007FF800001FFF007FF800001FFF00 -7FF800001FFF007FF800001FFF007FF800001FFF007FF800001FFE007FF800001FFE007F -F800003FFC007FF800003FFC007FF800007FF8007FF80000FFF0007FF80001FFE0007FF8 -000FFFC0007FFFFFFFFF00007FFFFFFFFC00007FFFFFFFE000007FF800000000007FF800 -000000007FF800000000007FF800000000007FF800000000007FF800000000007FF80000 -0000007FF800000000007FF800000000007FF800000000007FF800000000007FF8000000 -00007FF800000000007FF800000000007FF800000000007FF800000000007FF800000000 -007FF800000000007FF800000000007FF800000000007FF800000000007FF800000000FF -FFFFFC000000FFFFFFFC000000FFFFFFFC000000FFFFFFFC00000038397DB841>I<0007 -FF000E00003FFFE01E0000FFFFF83E0003FFFFFE7E0007FC01FFFE000FF0001FFE001FE0 -000FFE003FC00003FE003F800001FE007F800000FE007F000000FE007F0000007E00FF00 -00007E00FF0000003E00FF0000003E00FF8000003E00FF8000001E00FFC000001E00FFE0 -00001E00FFF000000000FFFC000000007FFFE00000007FFFFE0000007FFFFFF000003FFF -FFFE00003FFFFFFF80001FFFFFFFC0000FFFFFFFF00007FFFFFFF80003FFFFFFFC0000FF -FFFFFE00003FFFFFFE00000FFFFFFF000001FFFFFF0000000FFFFF800000007FFF800000 -000FFFC000000003FFC000000001FFC000000000FFC0F00000007FC0F00000007FC0F000 -00007FC0F00000003FC0F00000003FC0F80000003FC0F80000003F80FC0000003F80FC00 -00007F80FE0000007F00FF0000007F00FF800000FE00FFE00001FC00FFF80003FC00FFFF -801FF800FCFFFFFFE000F83FFFFFC000F007FFFE0000E0007FF000002A3B7BB935>83 -D<003FFE00000003FFFFE000000FFFFFF800001FF00FFE00003FF003FF00003FF801FF80 -003FF800FFC0003FF800FFC0003FF8007FE0003FF8007FE0001FF0007FE0000FE0007FE0 -000380007FE0000000007FE0000000007FE00000003FFFE000000FFFFFE000007FFFFFE0 -0001FFF87FE00007FF807FE0000FFE007FE0003FF8007FE0003FF0007FE0007FE0007FE0 -00FFE0007FE000FFC0007FE000FFC0007FE000FFC0007FE000FFC0007FE000FFC000FFE0 -00FFE001FFE0007FE001FFE0003FF007FFF8001FFC1FBFFFC00FFFFE1FFFC003FFF80FFF -C0003FE003FFC02A257DA42E>97 D<0001FFC000000FFFFC00007FFFFF0000FF80FF8003 -FE00FFC007FC01FFC00FF801FFC01FF801FFC01FF001FFC03FF001FFC03FF000FF807FE0 -007F007FE0001C007FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 -0000FFE0000000FFE0000000FFE0000000FFE00000007FE00000007FE00000007FF00000 -003FF00000003FF00001E01FF80001E01FF80003E00FFC0007C007FE00078003FF001F80 -00FFC07E00007FFFFC00000FFFF0000001FF800023257DA42A>99 -D<000000007F800000007FFF800000007FFF800000007FFF800000007FFF8000000003FF -8000000001FF8000000001FF8000000001FF8000000001FF8000000001FF8000000001FF -8000000001FF8000000001FF8000000001FF8000000001FF8000000001FF8000000001FF -8000000001FF8000000001FF8000000001FF800001FF81FF80000FFFF1FF80003FFFFDFF -8000FFC07FFF8003FF001FFF8007FC0007FF800FFC0003FF801FF80001FF801FF00001FF -803FF00001FF803FF00001FF807FE00001FF807FE00001FF807FE00001FF80FFE00001FF -80FFE00001FF80FFE00001FF80FFE00001FF80FFE00001FF80FFE00001FF80FFE00001FF -80FFE00001FF80FFE00001FF80FFE00001FF807FE00001FF807FE00001FF807FF00001FF -803FF00001FF803FF00001FF801FF80003FF800FF80007FF8007FC000FFF8003FE001FFF -C001FF80FDFFFE007FFFF9FFFE001FFFE1FFFE0001FF01FFFE2F3A7DB935>I<0003FF80 -00001FFFF000007FFFFC0001FF83FE0003FE007F8007FC003F800FF8003FC01FF8001FE0 -1FF0001FE03FF0000FF03FF0000FF07FE0000FF07FE0000FF87FE00007F8FFE00007F8FF -E00007F8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFE0000000FFE0000000FFE0000000FFE0 -0000007FE00000007FE00000007FE00000003FF00000003FF00000781FF00000780FF800 -00F80FFC0000F007FC0003F001FF000FE000FFC07FC0007FFFFF00000FFFFC000001FFE0 -0025257DA42C>I<00001FF0000001FFFC000007FFFF00001FF87F80003FE0FF8000FFC1 -FFC000FFC1FFC001FF81FFC001FF81FFC003FF01FFC003FF00FF8003FF00FF8003FF003E -0003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000 -03FF000000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF000003FF00000003FF00000003 -FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF -00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00 -000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000 -0003FF00000003FF00000003FF00000003FF00000003FF000000FFFFFE0000FFFFFE0000 -FFFFFE0000FFFFFE0000223A7DB91D>I<000000001F000007FE00FFC0007FFFE3FFC001 -FFFFFFEFE007FE07FF8FE00FF801FF1FE01FF000FF8FE03FF000FFCFE03FE0007FC7C03F -E0007FC0007FE0007FE0007FE0007FE0007FE0007FE0007FE0007FE0007FE0007FE0007F -E0007FE0003FE0007FC0003FE0007FC0003FF000FFC0001FF000FF80000FF801FF000007 -FE07FE00000FFFFFF800000F7FFFE000001E07FE0000001E00000000001E00000000003E -00000000003F00000000003F80000000001FC0000000001FFFFFF800001FFFFFFF80001F -FFFFFFE0000FFFFFFFF80007FFFFFFFC0003FFFFFFFE0007FFFFFFFE001FFFFFFFFF003F -C0000FFF007F000000FF80FF0000007F80FE0000007F80FE0000003F80FE0000003F80FE -0000003F80FF0000007F807F0000007F007F800000FF003FC00001FE001FF00007FC0007 -FE003FF00001FFFFFFC000007FFFFF00000007FFF000002B377DA530>I<00FF00000000 -FFFF00000000FFFF00000000FFFF00000000FFFF0000000007FF0000000003FF00000000 -03FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00000000 -03FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00000000 -03FF0000000003FF0000000003FF007FC00003FF03FFF80003FF0FFFFE0003FF1F03FF00 -03FF3C01FF8003FF7801FF8003FFF000FF8003FFE000FFC003FFC000FFC003FFC000FFC0 -03FF8000FFC003FF8000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0 -03FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0 -03FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0 -03FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0FFFFFC3FFFFF -FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFF303A7DB935>I<01F00007FC000FFE000FFE -001FFF001FFF001FFF001FFF001FFF000FFE000FFE0007FC0001F0000000000000000000 -0000000000000000000000000000000000000000FF007FFF007FFF007FFF007FFF0007FF -0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF -0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF -0003FF0003FF0003FF00FFFFF8FFFFF8FFFFF8FFFFF8153B7DBA1B>I<00FF00FFFF00FF -FF00FFFF00FFFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003 -FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003 -FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003 -FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003 -FF0003FF0003FF0003FF00FFFFFCFFFFFCFFFFFCFFFFFC163A7DB91B>108 -D<00FE007FC000FFFE03FFF800FFFE0FFFFE00FFFE1F03FF00FFFE3C01FF8007FE7801FF -8003FEF000FF8003FFE000FFC003FFC000FFC003FFC000FFC003FF8000FFC003FF8000FF -C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF -C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF -C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF -C003FF0000FFC003FF0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFF -FFFFFFFC3FFFFF30257DA435>110 D<0001FFC00000000FFFF80000007FFFFF000000FF -80FF800003FE003FE00007FC001FF0000FF8000FF8001FF00007FC001FF00007FC003FF0 -0007FE003FE00003FE007FE00003FF007FE00003FF007FE00003FF00FFE00003FF80FFE0 -0003FF80FFE00003FF80FFE00003FF80FFE00003FF80FFE00003FF80FFE00003FF80FFE0 -0003FF80FFE00003FF807FE00003FF007FE00003FF007FE00003FF003FE00003FE003FF0 -0007FE001FF00007FC001FF00007FC000FF8000FF80007FC001FF00003FE003FE00001FF -80FFC000007FFFFF0000001FFFFC00000001FFC0000029257DA430>I<00FF01FF8000FF -FF0FFFF000FFFF3FFFFC00FFFFFE07FF00FFFFF001FF8003FFE000FFC003FF80007FE003 -FF00007FF003FF00003FF803FF00003FF803FF00001FFC03FF00001FFC03FF00001FFC03 -FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03 -FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFC03FF00001FFC03 -FF00001FFC03FF00001FF803FF00003FF803FF00003FF003FF80007FF003FFC0007FE003 -FFE000FFC003FFF003FF8003FFFC07FE0003FF3FFFF80003FF0FFFE00003FF03FF000003 -FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003 -FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00000000FF -FFFC000000FFFFFC000000FFFFFC000000FFFFFC0000002F357EA435>I<00FE03F000FF -FE0FFE00FFFE3FFF00FFFE7C7F80FFFEF8FFC007FEF0FFC003FFE0FFC003FFC0FFC003FF -C0FFC003FF807F8003FF803F0003FF800C0003FF80000003FF00000003FF00000003FF00 -000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000 -0003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000 -03FF00000003FF00000003FF000000FFFFFE0000FFFFFE0000FFFFFE0000FFFFFE000022 -257EA427>114 D<003FF03803FFFEF80FFFFFF81FC00FF83F0003F87E0001F87C0000F8 -FC0000F8FC000078FE000078FF000078FF800000FFFC0000FFFFE0007FFFFC007FFFFF80 -3FFFFFC01FFFFFF00FFFFFF803FFFFF800FFFFFC001FFFFC00007FFE000007FEF00001FE -F00000FEF80000FEF800007EFC00007EFC00007CFE0000FCFF0000F8FF8001F8FFF007F0 -FFFFFFC0F8FFFF00E01FF8001F257DA426>I<000F0000000F0000000F0000000F000000 -0F0000001F0000001F0000001F0000001F0000003F0000003F0000007F000000FF000000 -FF000001FF000007FF00001FFFFFE0FFFFFFE0FFFFFFE0FFFFFFE003FF000003FF000003 -FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF000003 -FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF007803FF007803 -FF007803FF007803FF007803FF007803FF007803FF007803FF00F801FF80F001FF81F000 -FFC3E0003FFFC0001FFF800003FE001D357EB425>I<00FF00003FC0FFFF003FFFC0FFFF -003FFFC0FFFF003FFFC0FFFF003FFFC007FF0001FFC003FF0000FFC003FF0000FFC003FF -0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF -0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF -0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF -0000FFC003FF0001FFC003FF0001FFC003FF0003FFC003FF0003FFC001FF0007FFC001FF -800FFFE000FFC03EFFFF007FFFFCFFFF001FFFF0FFFF0003FF80FFFF30257DA435>I<FF -FFF01FFFF0FFFFF01FFFF0FFFFF01FFFF0FFFFF01FFFF003FF8003F80001FFC003E00000 -FFC007E000007FE007C000003FF00F8000003FF81F0000001FFC3E0000000FFC7C000000 -07FEFC00000003FFF800000003FFF000000001FFE000000000FFC0000000007FE0000000 -003FF0000000003FF8000000007FFC000000007FFC00000000FFFE00000001F3FF000000 -03E3FF80000007C1FFC000000FC0FFC000001F807FE000001F003FF000003E003FF80000 -7C001FFC0000F8000FFC0001F80007FE00FFFF003FFFF8FFFF003FFFF8FFFF003FFFF8FF -FF003FFFF82D257EA432>120 D<FFFFF001FFF8FFFFF001FFF8FFFFF001FFF8FFFFF001 -FFF803FF00001F0003FF00001E0003FF80003E0001FF80003C0001FFC0007C0000FFC000 -780000FFE000F800007FE000F000007FF001F000003FF001E000003FF801E000001FF803 -C000001FF803C000001FFC07C000000FFC078000000FFE0F80000007FE0F00000007FF1F -00000003FF1E00000003FFBE00000001FFBC00000001FFFC00000000FFF800000000FFF8 -00000000FFF8000000007FF0000000007FF0000000003FE0000000003FE0000000001FC0 -000000001FC0000000000F80000000000F80000000000F00000000000F00000000001F00 -000000001E0000003F003E0000007F803C000000FFC07C000000FFC078000000FFC0F800 -0000FFC1F0000000FFC3E00000007F87C00000007D1F800000003FFF000000001FFC0000 -000007F0000000002D357EA432>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fn ecrm0900 9 30 -/Fn 30 122 df<0000C00001C0000380000F00000E00001C00003C0000780000F00000F0 -0001E00003C00003C00007C0000780000F80000F00001F00001F00001E00003E00003E00 -003E00003C00007C00007C00007C00007C00007C0000F80000F80000F80000F80000F800 -00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800007C00 -007C00007C00007C00007C00003C00003E00003E00003E00001E00001F00001F00000F00 -000F800007800007C00003C00003C00001E00000F00000F000007800003C00001C00000E -00000F000003800001C00000C0124A79B71E>40 D<C00000E000007000003C00001C0000 -0E00000F000007800003C00003C00001E00000F00000F00000F800007800007C00003C00 -003E00003E00001E00001F00001F00001F00000F00000F80000F80000F80000F80000F80 -0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0 -0007C00007C00007C00007C0000F80000F80000F80000F80000F80000F00001F00001F00 -001F00001E00003E00003E00003C00007C0000780000F80000F00000F00001E00003C000 -03C0000780000F00000E00001C00003C0000700000E00000C00000124A7CB71E>I<3C7E -FFFFFFFF7E3C08087A8715>46 D<FFFFFEFFFFFEFFFFFE01FF0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 -FE0000FE0000FE0000FE0001FF00FFFFFEFFFFFEFFFFFE17337EB21C>73 -D<FFFFFE000000FFFFFE000000FFFFFE00000003FE0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 -0001FC0000000001FC0000018001FC0000018001FC0000018001FC0000018001FC000003 -8001FC0000030001FC0000030001FC0000030001FC0000030001FC0000070001FC000007 -0001FC00000F0001FC00001F0001FC00003F0001FC00007F0001FC0000FE0003FC0007FE -00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE0029337DB230>76 D<000007FC0000000000 -7FFFC000000001FC07F000000007E000FC0000000F80003E0000003F00001F8000007E00 -000FC00000FC000007E00001F8000003F00003F0000001F80003F0000001F80007E00000 -00FC000FE0000000FE000FC00000007E001FC00000007F001FC00000007F003F80000000 -3F803F800000003F807F800000003FC07F800000003FC07F000000001FC07F000000001F -C0FF000000001FE0FF000000001FE0FF000000001FE0FF000000001FE0FF000000001FE0 -FF000000001FE0FF000000001FE0FF000000001FE0FF000000001FE0FF000000001FE0FF -000000001FE07F000000001FC07F800000003FC07F800000003FC07F800000003FC03F80 -0000003F803FC00000007F803FC00000007F801FC00000007F001FE0000000FF000FE000 -0000FE0007F0000001FC0007F0000001FC0003F8000003F80001F8000003F00000FC0000 -07E000007E00000FC000003F00001F8000001FC0007F00000007E000FC00000001FC07F0 -000000007FFFC00000000007FC00000033377CB43C>79 D<001FE00300007FFC070001FF -FF070007F01FCF000F8003FF001F0000FF003E00007F003E00003F007C00001F007C0000 -1F007800000F00F800000700F800000700F800000700F800000700FC00000300FC000003 -00FE00000300FE000000007F000000007FC00000003FF00000003FFF0000001FFFF00000 -0FFFFF000007FFFFC00003FFFFF00000FFFFF800003FFFFC000003FFFE0000003FFF0000 -0003FF00000000FF800000007F800000003F800000001FC00000000FC0C000000FC0C000 -000FC0C0000007C0C0000007C0C0000007C0E0000007C0E0000007C0F000000F80F00000 -0F80F800000F00FC00001F00FE00003E00FF00007E00FFC000FC00F1FC03F800E0FFFFE0 -00E01FFF8000C003FE000022377CB42B>83 D<7FFFFFFFFFFE7FFFFFFFFFFE7FFFFFFFFF -FE7F8007F001FE7C0007F0003E780007F0001E700007F0000E700007F0000E600007F000 -06E00007F00007E00007F00007E00007F00007C00007F00003C00007F00003C00007F000 -03C00007F00003C00007F00003C00007F00003000007F00000000007F00000000007F000 -00000007F00000000007F00000000007F00000000007F00000000007F00000000007F000 -00000007F00000000007F00000000007F00000000007F00000000007F00000000007F000 -00000007F00000000007F00000000007F00000000007F00000000007F00000000007F000 -00000007F00000000007F00000000007F00000000007F00000000007F00000000007F000 -00000007F00000000007F0000000000FF80000001FFFFFFC00001FFFFFFC00001FFFFFFC -0030337DB237>I<FFFFF007FFFF800FFFF0FFFFF007FFFF800FFFF0FFFFF007FFFF800F -FFF003FF00003FF00001FF0001FC00001FE000007C0001FC00001FE00000380001FE0000 -0FE00000380000FE00000FE00000300000FE00000FF00000300000FF000007F000007000 -007F000007F000006000007F000007F000006000007F80000FF80000E000003F80000FF8 -0000C000003F80000FF80000C000003FC00019FC0001C000001FC00019FC00018000001F -C00019FC00018000001FE00030FE00038000000FE00030FE00030000000FE00030FE0003 -0000000FF000607F000700000007F000607F000600000007F000607F000600000007F800 -C03F800E00000003F800C03F800C00000003F800C03F800C00000003FC01801FC01C0000 -0001FC01801FC01800000001FC01801FC01800000001FE03000FE03800000000FE03000F -E03000000000FE03000FE03000000000FF060007F030000000007F060007F06000000000 -7F060007F060000000007F8C0003F860000000003F8C0003F8C0000000003F8C0003F8C0 -000000003FD80001FCC0000000001FD80001FD80000000001FD80001FD80000000001FF0 -0000FF80000000000FF00000FF00000000000FF00000FF00000000000FE000007F000000 -000007E000007E000000000007E000007E000000000007C000003E000000000003C00000 -3C000000000003C000003C0000000000038000001C000000000001800000180000004C35 -7FB24F>87 D<007F80000003FFF000000F80FC00001C003E00003F003F00003F801F8000 -3F800FC0003F800FC0003F8007E0001F0007E000000007E000000007E000000007E00000 -0007E0000001FFE000001FFFE00000FF87E00003FC07E0000FF007E0001FC007E0003F80 -07E0007F8007E0007F0007E000FF0007E0C0FE0007E0C0FE0007E0C0FE0007E0C0FE000F -E0C0FE000FE0C0FF001FE0C07F003BE0C03F8071F1801FC1E1FF8007FFC0FF0000FE003C -0022237DA126>97 D<03F0000000FFF0000000FFF0000000FFF000000007F000000003F0 -00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 -000003F000000003F000000003F000000003F000000003F000000003F000000003F03F80 -0003F0FFE00003F3C0F80003F7007E0003FE003F0003FC001F8003F8000FC003F0000FC0 -03F00007E003F00007F003F00007F003F00003F003F00003F803F00003F803F00003F803 -F00003F803F00003F803F00003F803F00003F803F00003F803F00003F803F00003F803F0 -0003F003F00007F003F00007E003F00007E003F0000FC003F8000FC003FC001F8003EC00 -3F0003CF007C00038381F8000301FFE00000007F000025357EB32B>I<0007F800003FFF -0000FC07C001F000E003E003F007C007F00FC007F01F8007F03F8007F03F0003E07F0000 -007F0000007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE000000FE000000FE0000007F0000007F0000003F0000183F8000181F8000381FC000 -300FC0007007E000E003F001C000FC0F80003FFE000007F0001D237EA122>I<0000003F -0000000FFF0000000FFF0000000FFF000000007F000000003F000000003F000000003F00 -0000003F000000003F000000003F000000003F000000003F000000003F000000003F0000 -00003F000000003F000000003F000000003F000007F03F00003FFC3F0000FC0F3F0001F0 -03BF0007E001FF000FC000FF001F80007F001F80003F003F00003F003F00003F007F0000 -3F007E00003F00FE00003F00FE00003F00FE00003F00FE00003F00FE00003F00FE00003F -00FE00003F00FE00003F00FE00003F00FE00003F007E00003F007F00003F007F00003F00 -3F00003F001F80007F001F80007F000FC000FF0007E001FF8003F007BFFC00F81E3FFC00 -3FFC3FFC000FE03F0026357DB32B>I<000FE000007FFC0000F83F0003F00F8007E00FC0 -0FC007E01F8003E01F8003F03F0003F03F0001F07F0001F87E0001F87E0001F8FE0001F8 -FE0001F8FFFFFFF8FFFFFFF8FE000000FE000000FE000000FE000000FE0000007E000000 -7F0000007F0000003F0000183F0000181F8000380F8000300FC0007007E000E001F003C0 -00FC0F00003FFE000007F0001D237EA122>I<0001FC000007FF00001F0780003E0FC000 -7C1FC000FC1FC001F81FC001F81FC003F8070003F0000003F0000003F0000003F0000003 -F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000FFFFF000FF -FFF000FFFFF00003F0000003F0000003F0000003F0000003F0000003F0000003F0000003 -F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003 -F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000007 -F800007FFFE0007FFFE0007FFFE0001A357FB417>I<0000001F00001FC07F8000FFF8E3 -C001F07FC7C007E03F03C00FC01F83800F800F80001F800FC0001F0007C0003F0007E000 -3F0007E0003F0007E0003F0007E0003F0007E0003F0007E0001F0007C0001F800FC0000F -800F80000FC01F800007E03F000007F07C00000EFFF800000C1FC000001C000000001C00 -0000001C000000001E000000001E000000001F000000000FFFFE00000FFFFFC00007FFFF -F00003FFFFFC0007FFFFFE001F0001FE003E00007F007C00003F007C00001F80F800000F -80F800000F80F800000F80F800000F80F800000F80FC00001F807C00001F003E00003E00 -1F00007C000FC001F80003F007E00000FFFF8000001FFC000022337EA126>I<03F00000 -00FFF0000000FFF0000000FFF000000007F000000003F000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F000000003F000000003F000000003F000000003F01FC00003F07FF00003F1E0FC0003F3 -807C0003F7007E0003FE007E0003FC003F0003FC003F0003F8003F0003F8003F0003F000 -3F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F -0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F00 -03F0003F0003F0003F0003F0003F0003F0003F0007F8007F80FFFFC7FFFCFFFFC7FFFCFF -FFC7FFFC26347EB32B>I<07800FC01FE01FE01FE01FE00FC00780000000000000000000 -000000000000000000000007E0FFE0FFE0FFE00FE007E007E007E007E007E007E007E007 -E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E00FF0FF -FFFFFFFFFF10337EB215>I<0003C00007E0000FF0000FF0000FF0000FF00007E00003C0 -0000000000000000000000000000000000000000000000000000000000000003F000FFF0 -00FFF000FFF00007F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 -0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 -0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 -0003F03803F07C03F0FE03E0FE07E0FE07C0FE0FC07C0F80381F001FFC0007F000144384 -B217>I<07E0FFE0FFE0FFE00FE007E007E007E007E007E007E007E007E007E007E007E0 -07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E0 -07E007E007E007E007E007E007E007E007E007E007E007E007E007E00FF0FFFFFFFFFFFF -10347EB315>108 D<03F01FE000FF0000FFF07FF803FFC000FFF1E07C0F03E000FFF380 -3E1C01F00007F7003F3801F80003FE003F7001F80003FC001FE000FC0003FC001FE000FC -0003F8001FC000FC0003F8001FC000FC0003F0001F8000FC0003F0001F8000FC0003F000 -1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC -0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000 -1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC -0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0007F8003FC001FE00FFFFC7 -FFFE3FFFF0FFFFC7FFFE3FFFF0FFFFC7FFFE3FFFF03C217EA041>I<03F01FC000FFF07F -F000FFF1E0FC00FFF3807C0007F7007E0003FE007E0003FC003F0003FC003F0003F8003F -0003F8003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F00 -03F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003 -F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0007F8007F80FFFF -C7FFFCFFFFC7FFFCFFFFC7FFFC26217EA02B>I<0007F00000003FFE000000FC1F800001 -F007C00003C001E00007C001F0000F8000F8001F00007C001F00007C003F00007E003E00 -003E007E00003F007E00003F007E00003F00FE00003F80FE00003F80FE00003F80FE0000 -3F80FE00003F80FE00003F80FE00003F80FE00003F807E00003F007E00003F007E00003F -003F00007E003F00007E001F00007C001F8000FC000FC001F80007C001F00003F007E000 -00FC1F8000003FFE00000007F0000021237EA126>I<03F03F8000FFF0FFE000FFF3C0F8 -00FFF7007E0007FE003F0003FC001F8003F8001FC003F0000FC003F0000FE003F00007F0 -03F00007F003F00007F003F00003F803F00003F803F00003F803F00003F803F00003F803 -F00003F803F00003F803F00003F803F00003F803F00007F803F00007F003F00007F003F0 -0007E003F0000FE003F0000FC003F8001FC003FC003F8003FC003F0003FF00FC0003F381 -F80003F1FFE00003F07F000003F000000003F000000003F000000003F000000003F00000 -0003F000000003F000000003F000000003F000000003F000000007F8000000FFFFC00000 -FFFFC00000FFFFC0000025307EA02B>I<03E07C00FFE1FF00FFE38F80FFE71FC007EE1F -C003EC1FC003EC1FC003FC0F8003F8000003F8000003F8000003F0000003F0000003F000 -0003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000 -0003F0000003F0000003F0000003F0000003F0000003F0000007F80000FFFFE000FFFFE0 -00FFFFE0001A217FA01E>114 D<00FF060007FFCE001F00FE003C003E0078001E007800 -0E00F0000E00F0000600F0000600F8000600F8000600FE000000FF8000007FFC00003FFF -C0003FFFF0000FFFF80007FFFC0000FFFE00000FFF000000FF0000003F80C0001F80C000 -0F80E0000780E0000780E0000780F0000780F0000700F8000F00FC000E00FE001C00F780 -7800E1FFE000C07F800019237EA11E>I<00300000300000300000300000300000700000 -700000700000F00000F00001F00001F00003F00007F0001FFFFEFFFFFEFFFFFE03F00003 -F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003 -F00003F00003F00303F00303F00303F00303F00303F00303F00303F00303F00701F80601 -F80600FC0E007E1C001FF80007E0182F7FAD1E>I<03F0003F00FFF00FFF00FFF00FFF00 -FFF00FFF0007F0007F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003 -F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0 -003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F000 -7F0003F0007F0003F0007F0003F000FF0001F000FF0001F801FF8000F803BFFC007E073F -FC001FFE3FFC0007F83F0026227EA02B>I<FFFF1FFF81FFF0FFFF1FFF81FFF0FFFF1FFF -81FFF007F801FC003F8007F001F8001E0003F000F8001C0003F000FC001C0001F8007C00 -180001F8007C00180001FC007E00380000FC00FE00300000FC00FE003000007E01FF0060 -00007E019F006000007E019F806000003F030F80C000003F030F80C000003F030FC0C000 -001F8607C18000001F8607C18000001FC607E38000000FCC03E30000000FCC03E3000000 -07FC03F600000007F801F600000007F801FE00000003F000FC00000003F000FC00000003 -F000FC00000001E0007800000001E0007800000001E0007800000000C00030000034217F -9F37>119 D<7FFF807FF87FFF807FF87FFF807FF807F8001FC003F8000F8001F8000700 -01F800060000FC000C0000FC000C0000FE001C00007E001800007E001800003F00300000 -3F003000003F807000001F806000001FC0E000000FC0C000000FC0C0000007E180000007 -E180000007F380000003F300000003FB00000001FE00000001FE00000000FC00000000FC -00000000FC00000000780000000078000000003000000000300000000060000000006000 -000000E000000000C000000000C0000000018000007801800000FC03000000FC03000000 -FC06000000FC0E000000701C00000078380000001FF00000000FC000000025307F9F29> -121 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fo ecbx0900 9 7 -/Fo 7 117 df<0000001F800000000000001F800000000000003FC00000000000003FC0 -0000000000007FE00000000000007FE00000000000007FE0000000000000FFF000000000 -0000FFF0000000000001FFF8000000000001FFF8000000000001FFF8000000000003FFFC -000000000003FFFC000000000007FFFE000000000007CFFE000000000007CFFE00000000 -000FCFFF00000000000F87FF00000000001F87FF80000000001F03FF80000000003F03FF -C0000000003E01FFC0000000003E01FFC0000000007E01FFE0000000007C00FFE0000000 -00FC00FFF000000000F8007FF000000000F8007FF000000001F8007FF800000001F0003F -F800000003F0003FFC00000003E0001FFC00000003E0001FFC00000007FFFFFFFE000000 -07FFFFFFFE0000000FFFFFFFFF0000000FFFFFFFFF0000001F800007FF8000001F000003 -FF8000001F000003FF8000003F000003FFC000003E000001FFC000007E000001FFE00000 -7C000000FFE000007C000000FFE00000FC000000FFF00000F80000007FF000FFFFF0003F -FFFFF0FFFFF0003FFFFFF0FFFFF0003FFFFFF0FFFFF0003FFFFFF03C347DB343>65 -D<007FFE000003FFFFE00007FFFFF8000FF00FFC001FF803FF001FF801FF001FF800FF80 -1FF800FFC01FF8007FC00FF0007FC007E0007FC00180007FC00000007FC000007FFFC000 -0FFFFFC000FFFFFFC003FFF07FC00FFF007FC01FF8007FC03FF0007FC07FE0007FC0FFC0 -007FC0FF80007FC0FF80007FC0FF80007FC0FF8000FFC0FFC000FFC07FC001FFC07FE003 -FFE03FF80FBFFF0FFFFF1FFF03FFFC0FFF007FE007FF28217EA02B>97 -D<01FC00000000FFFC00000000FFFC00000000FFFC00000000FFFC000000000FFC000000 -0007FC0000000007FC0000000007FC0000000007FC0000000007FC0000000007FC000000 -0007FC0000000007FC0000000007FC0000000007FC0000000007FC0000000007FC000000 -0007FC0000000007FC0FF8000007FC7FFF000007FDFFFFC00007FFF01FF00007FF800FF8 -0007FF0007FC0007FE0003FE0007FC0001FF0007FC0001FF0007FC0001FF8007FC0000FF -8007FC0000FF8007FC0000FFC007FC0000FFC007FC0000FFC007FC0000FFC007FC0000FF -C007FC0000FFC007FC0000FFC007FC0000FFC007FC0000FFC007FC0000FF8007FC0000FF -8007FC0001FF8007FC0001FF0007FC0001FF0007FE0003FE0007FF0007FC0007FF800FF8 -0007F7E03FF00007E1FFFFC00007C07FFF000007801FF000002A347DB331>I<0007FF80 -00003FFFF00000FFFFFC0003FE01FE0007FC03FF000FF803FF001FF003FF003FE003FF00 -3FE003FF007FE001FE007FC000FC007FC0003000FFC0000000FFC0000000FFC0000000FF -C0000000FFC0000000FFC0000000FFC0000000FFC0000000FFC00000007FC00000007FE0 -0000007FE00000003FE00007803FF00007801FF8000F800FF8001F0007FE003E0003FF80 -FC0000FFFFF800003FFFE0000007FF000021217DA027>I<01F81F80FFF87FF0FFF8FFF8 -FFF9E3FCFFFBC7FE0FFF87FE07FF07FE07FF07FE07FE07FE07FE03FC07FE01F807FE0060 -07FC000007FC000007FC000007FC000007FC000007FC000007FC000007FC000007FC0000 -07FC000007FC000007FC000007FC000007FC000007FC000007FC000007FC0000FFFFF000 -FFFFF000FFFFF000FFFFF0001F217EA024>114 D<00FFE1C007FFFFC00FFFFFC03F803F -C07E000FC07E0007C0FC0007C0FC0003C0FE0003C0FE0003C0FF800000FFFC0000FFFFE0 -007FFFFC007FFFFE003FFFFF800FFFFFC007FFFFE000FFFFE0000FFFF000007FF000000F -F0F00007F0F00003F0F80003F0F80003F0FC0003E0FE0007E0FF000FC0FFC01F80FFFFFF -00F9FFFC00E03FE0001C217DA023>I<003C0000003C0000003C0000003C0000003C0000 -007C0000007C0000007C000000FC000000FC000001FC000001FC000003FC000007FC0000 -1FFFFF80FFFFFF80FFFFFF80FFFFFF8007FC000007FC000007FC000007FC000007FC0000 -07FC000007FC000007FC000007FC000007FC000007FC000007FC000007FC000007FC0000 -07FC000007FC000007FC03C007FC03C007FC03C007FC03C007FC03C007FC03C007FC03C0 -07FE078003FE078001FF0F0000FFFE00003FFC00000FF0001A2F7EAE22>I -E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fp ecss0900 9 46 -/Fp 46 122 df<0007E03F80000FF83F80003FF83F80007FF83F80007FF83F8000FC183F -8000F8083F8001F800000001F000000001F000000003F000000003F000000003F0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F000000003F0000000FFFFF81F80FFFFF81F80FFFFF81F80FFFFF81F80FFFFF81F8003F0 -001F8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F8003F000 -1F8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F -8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F80 -03F0001F8003F0001F8003F0001F8003F0001F8003F0001F8003F0001F8021377FB629> -28 D<000000380038000000007C007C000000007C007C000000007C007C00000000FC00 -FC00000000F800F800000000F800F800000000F800F800000000F800F800000001F801F8 -00000001F001F000000001F001F000000001F001F000000001F001F000000003F003F000 -000003E003E000000003E003E000000003E003E000000003E003E000000007E007E00000 -0007C007C000000007C007C000000007C007C000000007C007C0003FFFFFFFFFFFF8FFFF -FFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFE00003F003F000000003E -003E000000003E003E000000003E003E000000003E003E000000003E003E000000007E00 -7E000000007C007C000000007C007C000000007C007C000000007C007C00000000FC00FC -0000FFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFE3FFFFFFFFFFF -F80003E003E000000003E003E000000003E003E000000007E007E000000007C007C00000 -0007C007C000000007C007C00000000FC00FC00000000F800F800000000F800F80000000 -0F800F800000001F801F800000001F001F000000001F001F000000001F001F000000001F -001F000000003F003F000000003E003E000000003E003E000000003E003E000000007E00 -7E000000007C007C000000007C007C000000007C007C0000000038003800000037477CB5 -40>35 D<FEFEFEFEFEFEFE0707798615>46 D<00000070000000F8000000F8000001F800 -0001F0000001F0000003F0000003E0000003E0000007E0000007C0000007C000000FC000 -000F8000000F8000001F8000001F0000001F0000003F0000003E0000003E0000007E0000 -007C0000007C000000FC000000F8000000F8000001F8000001F0000001F0000003F00000 -03E0000003E0000007E0000007C0000007C000000FC000000F8000001F8000001F000000 -1F0000003F0000003E0000003E0000007E0000007C0000007C000000FC000000F8000000 -F8000001F8000001F0000001F0000003F0000003E0000003E0000007E0000007C0000007 -C000000FC000000F8000000F8000001F8000001F0000001F0000003F0000003E0000003E -0000007E0000007C0000007C000000FC000000F8000000F8000000700000001D4B7CB726 ->I<000FE000007FFC0000FFFE0001FFFF0003FFFF8007F83FC00FE00FE01FC007F01F80 -03F01F0001F03F0001F83F0001F83E0000F87E0000FC7E0000FC7E0000FC7C00007CFC00 -007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00 -007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00007EFC00 -007E7E0000FC7E0000FC7E0000FC7E0000FC7E0000FC3F0001F83F0001F83F8003F81F80 -03F01FC007F00FE00FE007F83FC007FFFFC003FFFF8000FFFE00007FFC00000FE0001F35 -7DB226>I<001FE00000FFFC0003FFFF0007FFFF800FFFFFC01FF03FE03FC00FF07F0007 -F03E0003F01C0003F81C0001F8080001F8000001F8000003F8000003F8000003F0000003 -F0000007F000000FE000001FE000003FC00001FF80007FFF00007FFE00007FF800007FFC -00007FFF0000003FC000000FE0000007F0000003F8000001F8000001FC000001FC000000 -FE000000FE000000FE000000FE000000FE000000FE000000FE400001FC600001FC700001 -FCF80003F8FC0007F87F000FF03FE03FE01FFFFFC00FFFFF8003FFFF0000FFFC00001FE0 -001F357DB226>51 D<1FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01F8000001F8000 -001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000 -001F8000001F87E0001FBFFC001FFFFE001FFFFF001FFFFF801FF83FC01FE00FE01FC007 -F01F8007F01F8003F81F0003F8000003F8000001FC000001FC000001FC000001FC000001 -FC000001FC000001FC000001FC000001FC000003F8200003F8300003F8700007F0780007 -F0FC000FE07F001FC03FC07FC01FFFFF800FFFFE0007FFFC0001FFF000003FC0001E337D -B026>53 D<000FE000007FF80000FFFE0001FFFF0003FFFF8007F83FC00FE00FE01FC007 -E01F8003F03F0001F07E0001F87E0001F87E0000F8FC0000FCFC0000FCFC0000FCFC0000 -7CFC00007CFC00007EFC00007EFC00007EFC00007EFC00007EFC0000FE7E0000FE7E0000 -FE7E0001FE7F0001FE3F0003FE3F8007FE1FC00FFE0FF03F7E0FFFFE7E07FFFCFC03FFF8 -FC01FFE0FC007F00FC000000F8000001F8000001F8000003F0000003F0000007E0000007 -E000000FC008001F800C007F001F81FF001FFFFE003FFFF8001FFFF00007FFC00000FF00 -001F357DB226>57 D<FEFEFEFEFEFEFE00000000000000000000000000000000000000FE -FEFEFEFEFEFE072179A015>I<000007F8000000007FFF00000001FFFFC0000007FFFFE0 -00000FFFFFF000001FF80FF800007FC003FC0000FF8000FC0001FE0000FE0001FC00007E -0003F8007E7F0007F001FFBF000FE007FFFF000FC00FFFFF801FC01FFFFF801F803FC3FF -803F807F00FF803F007E007F803F00FC003FC07E00FC003FC07E01F8001FC07E01F8001F -C0FE01F8001FC0FC03F0000FC0FC03F0000FC0FC03F0000FC0FC03F0000FC0FC03F0000F -C0FC03F0000FC0FC03F0000FC0FC03F0000FC0FC03F0000FC0FC03F0000FC0FE01F8001F -807E01F8001F807E01F8001F807E00FC003F003F00FC003F003F007E007E003F807F00FE -001F803FC3FC001FC01FFFF8000FC00FFFF0000FE007FFE00007F001FF800003F8007E00 -0001FC0000000001FE0000000000FF80000FC0007FC0003F80001FF803FF00000FFFFFFE -000007FFFFF8000001FFFFF00000007FFF8000000007FC00002A387CB633>64 -D<00001FE0000000001FE0000000001FE0000000003FF0000000003FF0000000003FF000 -0000007DF80000000079F800000000F9FC00000000F8FC00000000F8FC00000001F0FE00 -000001F0FE00000001F07E00000003E07F00000003E07F00000007E03F80000007C03F80 -000007C03F8000000FC01FC000000F801FC000000F801FC000001F800FE000001F000FE0 -00003F0007F000003F0007F000003E0007F000007E0003F800007C0003F800007C0003F8 -0000FC0001FC0000F80001FC0001F80001FE0001FFFFFFFE0001FFFFFFFE0003FFFFFFFF -0003FFFFFFFF0003FFFFFFFF0007E000003F8007C000003F800FC000003FC00FC000001F -C00F8000001FC01F8000001FE01F8000000FE01F0000000FE03F00000007F03E00000007 -F07E00000007F87E00000003F87C00000003F8FC00000001FC2E347EB333>I<00000FFC -0000007FFFC00003FFFFF00007FFFFFC001FFFFFFC003FF807FC007FC000F800FF000078 -01FE00001803FC00000807F800000007F00000000FE00000000FE00000001FC00000001F -C00000003F800000003F800000007F000000007F000000007F000000007F00000000FE00 -000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 -0000FE00000000FE00000000FE00000000FE000000007F000000007F000000007F000000 -007F000000003F800000003F800000001FC00000001FC00000000FE00000000FE0000000 -07F000000007F800000003FC00000201FE00000600FF00001E007FC0007E003FF803FE00 -1FFFFFFE0007FFFFFC0003FFFFF000007FFFC000000FFE0027387BB531>67 -D<FFFFFF800000FFFFFFF00000FFFFFFFC0000FFFFFFFF0000FFFFFFFFC000FE0001FFE0 -00FE00003FF000FE00000FF800FE000007FC00FE000001FE00FE000000FE00FE000000FF -00FE0000007F00FE0000003F80FE0000003F80FE0000001FC0FE0000001FC0FE0000000F -E0FE0000000FE0FE0000000FE0FE00000007E0FE00000007F0FE00000007F0FE00000007 -F0FE00000007F0FE00000007F0FE00000007F0FE00000007F0FE00000007F0FE00000007 -F0FE00000007F0FE00000007F0FE00000007E0FE0000000FE0FE0000000FE0FE0000000F -C0FE0000001FC0FE0000001FC0FE0000003F80FE0000007F80FE0000007F00FE000000FF -00FE000001FE00FE000003FC00FE00000FF800FE00003FF000FE0001FFE000FFFFFFFFC0 -00FFFFFFFF0000FFFFFFFE0000FFFFFFF00000FFFFFF8000002C3479B338>I<FFFFFFFF -C0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FE00000000FE00000000FE00000000 -FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE -00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FFFF -FFFF00FFFFFFFF00FFFFFFFF00FFFFFFFF00FFFFFFFF00FE00000000FE00000000FE0000 -0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000 -00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000 -FE00000000FE00000000FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FF -FFFFFFE0233479B32E>I<FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE -FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE073479B315>73 -D<FF800000007FC0FFC0000000FFC0FFC0000000FFC0FFC0000000FFC0FFE0000001FFC0 -FFE0000001FFC0FDE0000001EFC0FDF0000003EFC0FDF0000003EFC0FCF8000007CFC0FC -F8000007CFC0FCF8000007CFC0FC7C00000F8FC0FC7C00000F8FC0FC7C00000F8FC0FC7E -00001F8FC0FC3E00001F0FC0FC3F00003F0FC0FC3F00003F0FC0FC1F00003E0FC0FC1F80 -007E0FC0FC1F80007E0FC0FC0F80007C0FC0FC0FC000FC0FC0FC07C000F80FC0FC07E001 -F80FC0FC07E001F80FC0FC03E001F00FC0FC03F003F00FC0FC03F003F00FC0FC01F003E0 -0FC0FC01F807E00FC0FC01F807E00FC0FC00F807C00FC0FC00FC0FC00FC0FC007C0F800F -C0FC007C0F800FC0FC007E1F800FC0FC003E1F000FC0FC003E1F000FC0FC003F3F000FC0 -FC001F3E000FC0FC001F3E000FC0FC000F3C000FC0FC000FFC000FC0FC000FFC000FC0FC -0007F8000FC0FC0007F8000FC0FC0007F8000FC0FC0003F0000FC0FC000000000FC0FC00 -0000000FC0323478B343>77 D<FFC000007EFFE000007EFFE000007EFFF000007EFFF000 -007EFFF800007EFDF800007EFCFC00007EFCFC00007EFCFE00007EFC7E00007EFC7F0000 -7EFC3F00007EFC3F80007EFC1F80007EFC1FC0007EFC0FC0007EFC0FE0007EFC0FE0007E -FC07F0007EFC07F0007EFC03F8007EFC03F8007EFC01FC007EFC01FC007EFC00FE007EFC -00FE007EFC007F007EFC007F007EFC003F807EFC003F807EFC001FC07EFC001FC07EFC00 -0FE07EFC000FE07EFC0007E07EFC0007F07EFC0003F07EFC0003F87EFC0001F87EFC0001 -FC7EFC0000FC7EFC0000FE7EFC00007E7EFC00007E7EFC00003F7EFC00003FFEFC00001F -FEFC00001FFEFC00000FFEFC00000FFEFC000007FE273479B336>I<00000FF000000000 -FFFF00000003FFFFC000000FFFFFF000001FFFFFF800003FF00FFC00007FC003FE0000FF -0000FF0001FE00007F8003FC00003FC007F800001FE007F000000FE00FE0000007F00FC0 -000003F01FC0000003F81F80000001F83F80000001FC3F80000001FC7F00000000FE7F00 -000000FE7F00000000FE7E000000007EFE000000007FFE000000007FFE000000007FFE00 -0000007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE00 -0000007FFE000000007FFF00000000FF7F00000000FE7F00000000FE7F00000000FE7F80 -000001FE3F80000001FC3F80000001FC3FC0000003FC1FC0000003F81FE0000007F80FE0 -000007F007F000000FE007F800001FE003FC00003FC001FE00007F8000FF0000FF00007F -C003FE00003FF00FFC00001FFFFFF800000FFFFFF0000003FFFFC0000000FFFF00000000 -1FF8000030387CB539>I<FFFFFF0000FFFFFFE000FFFFFFF800FFFFFFFC00FFFFFFFF00 -FE0003FF80FE00007FC0FE00001FC0FE00000FE0FE000007F0FE000007F0FE000003F0FE -000003F8FE000003F8FE000001F8FE000001F8FE000001F8FE000003F8FE000003F8FE00 -0003F0FE000007F0FE000007F0FE00000FE0FE00001FC0FE00007FC0FE0003FF80FFFFFF -FF00FFFFFFFC00FFFFFFF800FFFFFFE000FFFFFF0000FE00000000FE00000000FE000000 -00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000 -FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE -00000000FE00000000FE00000000FE00000000253479B331>I<FFFFFF0000FFFFFFE000 -FFFFFFFC00FFFFFFFE00FFFFFFFF80FE0001FFC0FE00003FE0FE00000FF0FE000007F0FE -000003F8FE000001F8FE000001FCFE000000FCFE000000FCFE000000FCFE000000FCFE00 -0001FCFE000001F8FE000003F8FE000007F0FE00000FF0FE00003FE0FE0001FFC0FFFFFF -FF80FFFFFFFE00FFFFFFFC00FFFFFFE000FFFFFF8000FE001FC000FE000FC000FE000FE0 -00FE0007F000FE0003F000FE0003F800FE0001F800FE0001FC00FE0000FE00FE0000FE00 -FE00007F00FE00003F00FE00003F80FE00001FC0FE00001FC0FE00000FE0FE000007E0FE -000007F0FE000003F8FE000003F8FE000001FCFE000000FCFE000000FEFE0000007F2834 -79B332>82 D<0003FE0000001FFFE000007FFFF80001FFFFFE0003FFFFFF0007FC03FF00 -0FF0007F001FC0001E001F80000E003F000006003F000002007E000000007E000000007E -000000007E000000007E000000007E000000007F000000007F000000003F800000003FC0 -0000001FF00000001FFC0000000FFFE0000007FFFE000003FFFF800001FFFFE000007FFF -F800001FFFFC000003FFFE0000003FFF00000003FF00000000FF800000003FC00000001F -C00000001FC00000000FE00000000FE000000007E000000007E000000007E000000007E0 -00000007E000000007E04000000FC06000000FC07000001F807C00001F80FF00007F00FF -C000FF00FFF803FE007FFFFFFC001FFFFFF00007FFFFE00000FFFF8000000FFC00002338 -7DB52B>I<FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF800 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000 -001FC0000000001FC0000000001FC0000000001FC0000000001FC000002D347DB334>I< -7FC0000007F03FC000000FF01FE000000FE00FF000001FC007F800003FC007F800007F80 -03FC00007F0001FE0000FE0000FE0001FE0000FF0001FC00007F8003F800003FC007F000 -001FC00FF000000FE00FE000000FF01FC0000007F83F80000003F83F80000001FC7F0000 -0001FEFE00000000FFFE000000007FFC000000003FF8000000001FF0000000001FF00000 -00000FE0000000001FE0000000001FF0000000003FF8000000007FFC000000007EFE0000 -0000FEFE00000001FC7F00000003F83F80000003F01FC0000007F01FC000000FE00FE000 -001FC007F000001FC007F800003F8003FC00007F0001FC0000FF0000FE0000FE0000FF00 -01FC00007F8003F800003F8003F800003FC007F000001FE00FE000000FF01FE0000007F0 -1FC0000007F83F80000003FC7F00000001FEFF00000001FF30347FB333>88 -D<7FFFFFFFFFFCFFFFFFFFFFFEFFFFFFFFFFFE7FFFFFFFFFFC2F047A6F3C>95 -D<003FC00003FFF0000FFFFC001FFFFE001FFFFF001FC07F801E001F8018001FC010000F -C000000FE0000007E0000007E0000007E0000007E0000007E0000007E00003FFE0003FFF -E001FFFFE007FFFFE01FFFC7E03FF007E07F8007E07E0007E0FC0007E0FC0007E0FC0007 -E0FC000FE0FE000FE07F003FE07FC0FFE07FFFFFE03FFFFFE01FFFE7E00FFF87E003FC00 -001B247DA225>97 D<000FF800003FFF0000FFFFE001FFFFF003FFFFF007F807F00FE001 -E01FC000601F8000003F0000003F0000007E0000007E0000007E000000FC000000FC0000 -00FC000000FC000000FC000000FC000000FC000000FC000000FC0000007E0000007E0000 -007E0000003F0000103F8000301F8000F00FE001F00FF80FF007FFFFF003FFFFE000FFFF -80007FFE00000FF0001C247DA222>99 D<000000FC000000FC000000FC000000FC000000 -FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000 -FC000000FC000000FC000000FC000000FC000000FC000000FC003F80FC00FFF0FC03FFFC -FC07FFFEFC0FFFFFFC0FF81FFC1FE007FC3FC001FC3F8001FC7F0000FC7E0000FC7E0000 -FC7E0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000 -FCFC0000FC7E0000FC7E0000FC7E0000FC7F0001FC3F8001FC3F8003FC1FE007FC0FF81F -FC0FFFFFFC07FFFCFC03FFF8FC00FFE0FC003F80001E377DB528>I<001FC000007FF800 -01FFFC0003FFFE0007FFFF000FF07F801FC01F801F8007C03F0007C03F0003E07E0001E0 -7E0001E07C0001E0FC0000F0FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF0F8000000 -F8000000FC000000FC0000007C0000007E0000007E0000003F0000003F8000101FC00070 -0FE001F00FF80FF007FFFFF003FFFFE000FFFF80007FFE00000FF0001C247DA222>I<00 -1FC00F80007FF0FF8000FFFFFFC001FFFFFFC003FFFFFFC007F07F00000FC01F80000F80 -0F80000F800F80001F0007C0001F0007C0001F0007C0001F0007C0001F0007C0001F0007 -C0001F0007C0000F800F80000F800F80000FC01F800007F07F000007FFFE00000FFFFC00 -000FFFF800001F7FF000001F1FC000001F000000001F000000001F000000001F80000000 -0FFFFE00000FFFFFE00007FFFFF0000FFFFFFC001FFFFFFE003FFFFFFE007F8003FF007E -00007F00FE00003F80FC00001F80FC00001F80FC00001F80FC00001F80FE00003F807F00 -007F007F8000FF003FF007FE001FFFFFFC000FFFFFF80003FFFFE00000FFFF8000001FFC -000022337EA126>103 D<FC000000FC000000FC000000FC000000FC000000FC000000FC -000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC -000000FC000000FC000000FC000000FC000000FC07F000FC3FFE00FC7FFF00FCFFFF80FF -FFFF80FFE07FC0FF801FC0FF000FE0FF000FE0FE0007E0FE0007E0FE0007E0FC0007E0FC -0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC -0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC -0007E0FC0007E0FC0007E01B367AB528>I<FEFEFEFEFEFEFE0000000000000000000000 -007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E0734 -7BB313>I<003F80003F80003F80003F80003F80003F80003F8000000000000000000000 -0000000000000000000000000000000000000000000000000000001F80001F80001F8000 -1F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8000 -1F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8000 -1F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8000 -1F80001F80403F80603F00F8FF00FFFE00FFFE007FFC001FF80007E000114484B314>I< -FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000 -FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000 -FC000000FC000000FC000000FC000FF0FC001FE0FC003FC0FC007F80FC00FF00FC01FE00 -FC03FC00FC07F800FC0FF000FC1FE000FC3FC000FC7F8000FCFF0000FDFF0000FFFF8000 -FFFF8000FFFFC000FFE7E000FFC7E000FF83F000FF01F800FE01FC00FC00FC00FC007E00 -FC003F00FC003F80FC001F80FC000FC0FC0007E0FC0007E0FC0003F0FC0001F8FC0001FC -1E367AB526>I<FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC -FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC06367AB513>I<0007F000 -3F80FC3FFE01FFF0FC7FFF03FFF8FCFFFF87FFFCFFFFFF9FFFFCFFE07FDF03FEFF801FFC -00FEFF000FF8007FFF000FF8007FFE0007F0003FFE0007F0003FFE0007F0003FFC0007E0 -003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0 -003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0 -003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0003FFC0007E0 -003FFC0007E0003FFC0007E0003FFC0007E0003F30227AA13D>I<0007F000FC3FFE00FC -7FFF00FCFFFF80FFFFFF80FFE07FC0FF801FC0FF000FE0FF000FE0FE0007E0FE0007E0FE -0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC -0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC -0007E0FC0007E0FC0007E0FC0007E0FC0007E01B227AA128>I<0007F00000003FFE0000 -00FFFF800001FFFFC00003FFFFE00007F80FF0000FE003F8001FC001FC001F8000FC003F -00007E003F00007E007E00003F007E00003F007C00001F00FC00001F80FC00001F80FC00 -001F80FC00001F80FC00001F80FC00001F80FC00001F80FC00001F80FE00003F807E0000 -3F007E00003F007F00007F003F00007E003F8000FE001FC001FC000FE003F8000FF80FF8 -0007FFFFF00001FFFFC00000FFFF8000003FFE00000007F0000021247EA226>I<0003F8 -00FC1FFE00FC7FFF00FDFFFF80FFFFFFC0FFE07FE0FF801FE0FF000FF0FE0007F0FC0003 -F8FC0003F8FC0001F8FC0001FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000FCFC0000 -FCFC0000FCFC0000FCFC0001FCFC0001F8FC0001F8FC0003F8FC0003F0FE0007F0FF000F -E0FF801FE0FFE07FC0FFFFFF80FDFFFF00FCFFFE00FC3FFC00FC07E000FC000000FC0000 -00FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0000 -00FC000000FC000000FC0000001E317AA128>I<0003C0F81FC0F83FC0F8FFC0F9FFC0FB -FFC0FBFC00FFF000FFC000FF8000FF0000FF0000FE0000FE0000FE0000FC0000FC0000FC -0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC -0000FC0000FC0000FC0000FC000012227AA11A>114 D<00FF800007FFF0000FFFFC001F -FFFE003FFFFE007F00FE007E001C00FC000C00FC000000FC000000FC000000FC000000FE -0000007F8000007FF800003FFF80001FFFE0000FFFF80003FFFC0000FFFE00000FFF0000 -00FF0000003F8000003F8000001F8000001F8000001F8040001F8060003F8078003F00FF -00FF00FFFFFE00FFFFFC007FFFF8000FFFF00001FF800019247EA21D>I<03F00003F000 -03F00003F00003F00003F00003F00003F00003F00003F000FFFFFEFFFFFEFFFFFEFFFFFE -FFFFFE03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F000 -03F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F80003F802 -01FC1E01FFFF01FFFF00FFFF007FFC003FC0182C7FAA1C>I<FC0007E0FC0007E0FC0007 -E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007 -E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007 -E0FC0007E0FC0007E0FC0007E0FC0007E0FC000FE0FC001FE0FE003FE0FF00FFE07FFFFF -E07FFFF7E03FFFE7E01FFF07E007F800001B227AA028>I<FC00003F7E00003E7E00007E -7F00007E3F0000FC3F0000FC3F8000FC1F8001F81F8001F80FC003F00FC003F00FC003F0 -07E007E007E007E003F007C003F00FC003F00FC001F80F8001F81F8001F81F8000FC1F00 -00FC3F00007C3E00007E3E00007E7E00003E7C00003E7C00003E7C00001F7800001FF800 -000FF000000FF000000FF00020217FA023>I<FC0007F0001F80FE0007F0001F807E000F -F0003F007E000FF8003F007E000F78003F003F001F78003E003F001F78007E003F001E7C -007E001F803E7C007C001F803E3C00FC001F803E3E00FC000F803C3E00F8000FC07C3E01 -F8000FC07C1E01F8000FC07C1F01F80007E0781F01F00007E0F81F03F00007E0F80F83F0 -0003E0F80F83E00003F0F00F83E00003F1F00F87E00001F1F007C7C00001F1E007C7C000 -01F1E007C7C00001FBE003CFC00000FBE003CF800000FBC003EF800000FBC001EF800000 -7BC001EF0000007F8001FF0000007F8001FF0000003F8000FE0000003F0000FE00003121 -7FA034>I<7E00003F003F00007F001F8000FE001FC000FC000FE001F80007E003F00003 -F007E00001F80FE00000FC0FC000007E1F8000007F3F0000003F7E0000001FFC0000000F -F800000007F800000003F000000003F000000007F80000000FFC0000001FFC0000003F3E -0000003E1F0000007C1F800000FC0FC00001F807E00003F003F00007E003F00007E001F8 -000FC000FC001F80007E003F00007F007F00003F80FE00001FC0222180A023>I<FE0000 -3F7E00007E7E00007E3F00007E3F0000FC3F8000FC1F8001F81FC001F80FC001F80FC003 -F007E003F007E003E007F007E003F007E003F007C001F80FC001F80F8000F80F8000FC1F -8000FC1F00007C1F00007E3E00003E3E00003E3E00001F3C00001F7C00000F7800000F78 -00000F78000007F0000007F0000003E0000003E0000003E0000003C0000007C000000780 -0000078000000F8000000F0000001F0000001E0000203E0000387C00003FFC00003FF800 -003FF800003FF000000FC0000020317FA023>I E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fq ecrm1000 10 83 -/Fq 83 184 df<01800060038000E0070001C00E0003801C0007001800060038000E0030 -000C0070001C006000180060001800E0003800C0003000C0003000C0003000C0003000CE -003380FF803FE0FFC03FF0FFC03FF0FFC03FF07FC01FF07FC01FF03F800FE00E0003801C -1981B91C>16 D<1C0007007F001FC0FF803FE0FF803FE0FFC03FF0FFC03FF0FFC03FF07F -C01FF01CC0073000C0003000C0003000C0003000C0003001C00070018000600180006003 -8000E0030000C0070001C0060001800E0003801C00070038000E0070001C00600018001C -1980B91C>I<FFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFC05202809653>22 -D<00000FF800FC0000007FFF07FF000001F807DF83C00007E001FF0FC0001F8007FE1FE0 -003F000FFC1FE0007E000FFC1FE0007E000FF81FE000FC000FF81FE000FC000FF0078001 -F80007F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F8 -0003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F800 -03F0000001F80003F0000001F80003F00000FFFFFFFFFFF800FFFFFFFFFFF800FFFFFFFF -FFF80001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0 -000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F000 -0001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F00000 -01F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001 -F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F8 -0003F0000001F80003F0000001F80003F0000001F80003F0000003FC0007F800007FFFE0 -FFFFF0007FFFE0FFFFF0007FFFE0FFFFF000333B7FBA30>27 D<00000FF8000000007FFE -00000001F80780000007E001C000001F8000E000003F0007E000007E000FF000007E000F -F00000FC000FF00000FC000FF00001F8000FF00001F80007E00001F80001800001F80000 -000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000 -000001F80000000001F80000000001F80003F000FFFFFFFFF000FFFFFFFFF000FFFFFFFF -F00001F8000FF00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 -F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 -F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 -F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 -F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00003FC0007 -F8007FFFE0FFFFC07FFFE0FFFFC07FFFE0FFFFC02A3B7FBA2E>I<00000FFC000000007F -FF70000001F803F0000007E007F000001F800FF000003F000FF000007E000FF000007E00 -0FF00000FC000FF00000FC0007F00001F80003F00001F80003F00001F80003F00001F800 -03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 -03F00001F80003F00001F80003F00001F80003F000FFFFFFFFF000FFFFFFFFF000FFFFFF -FFF00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 -03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 -03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 -03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 -03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00003FC00 -07F8007FFFE0FFFFC07FFFE0FFFFC07FFFE0FFFFC02A3B7FBA2E>I<00000FF0001FF000 -0000007FFE00FFFC00000001F80F83F00F00000007E001CFC0038000001F8000FF0001C0 -00003F0007FE000FC000007E000FFC001FE000007E000FFC001FE00000FC000FF8001FE0 -0000FC000FF8001FE00001F8000FF0001FE00001F80007F0000FC00001F80003F0000300 -0001F80003F00000000001F80003F00000000001F80003F00000000001F80003F0000000 -0001F80003F00000000001F80003F00000000001F80003F00000000001F80003F0000000 -0001F80003F00000000001F80003F00007E000FFFFFFFFFFFFFFE000FFFFFFFFFFFFFFE0 -00FFFFFFFFFFFFFFE00001F80003F0001FE00001F80003F00007E00001F80003F00007E0 -0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 -0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 -0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 -0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 -0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 -0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 -0001F80003F00007E00001F80003F00007E00003FC0007F8000FF0007FFFE0FFFFC1FFFF -807FFFE0FFFFC1FFFF807FFFE0FFFFC1FFFF80413B7FBA45>I<1C007F00FF80FF80FF80 -FF80FF80FF80FF80FF807F007F007F007F007F007F007F007F007F007F007F003E003E00 -3E003E003E003E003E003E003E003E003E001C001C001C001C001C001C001C001C001C00 -1C001C00000000000000000000000000000000001C007F00FF80FF80FF80FF80FF807F00 -1C00093C79BB17>33 D<7C007CFE00FEFF01FEFF01FEFF01FEFE00FEFE00FEFE00FEFE00 -FEFE00FEFE00FEFE00FE7E00FC7C007C7C007C7C007C7C007C7C007C7C007C7C007C7C00 -7C3C0078380038380038380038380038380038380038380038180030171E77BA2A>I<1C -007F00FF80FF80FFC0FFC0FFC07FC01CC000C000C000C000C001C0018001800380030007 -0006000E001C003800700060000A1979B917>39 D<0000600000E00001C0000380000700 -000E00001E00003C0000780000780000F00001E00001E00003C00003C00007C000078000 -0F80000F00000F00001F00001E00001E00003E00003E00003E00007C00007C00007C0000 -7C00007C00007C0000F80000F80000F80000F80000F80000F80000F80000F80000F80000 -F80000F80000F80000F80000F80000F80000F80000F80000F800007C00007C00007C0000 -7C00007C00007C00003E00003E00003E00001E00001E00001F00000F00000F00000F8000 -07800007C00003C00003C00001E00001E00000F000007800007800003C00001E00000E00 -0007000003800001C00000E0000060135278BD20>I<C00000E000007000003800001C00 -000E00000F000007800003C00003C00001E00000F00000F000007800007800007C00003C -00003E00001E00001E00001F00000F00000F00000F80000F80000F800007C00007C00007 -C00007C00007C00007C00003E00003E00003E00003E00003E00003E00003E00003E00003 -E00003E00003E00003E00003E00003E00003E00003E00003E00003E00007C00007C00007 -C00007C00007C00007C0000F80000F80000F80000F00000F00001F00001E00001E00003E -00003C00007C0000780000780000F00000F00001E00003C00003C0000780000F00000E00 -001C0000380000700000E00000C0000013527CBD20>I<1C007F00FF80FF80FFC0FFC0FF -C07FC01CC000C000C000C000C001C00180018003800300070006000E001C003800700060 -000A19798817>44 D<FFFFFCFFFFFCFFFFFCFFFFFCFFFFFC16057F941C>I<1C007F00FF -80FF80FF80FF80FF807F001C000909798817>I<00000006000000060000000E0000000C -0000000C0000001C00000018000000380000003000000030000000700000006000000060 -000000E0000000C0000000C0000001C00000018000000180000003800000030000000700 -000006000000060000000E0000000C0000000C0000001C00000018000000180000003800 -000030000000300000007000000060000000E0000000C0000000C0000001C00000018000 -00018000000380000003000000030000000700000006000000060000000E0000000C0000 -001C00000018000000180000003800000030000000300000007000000060000000600000 -00E0000000C0000000C0000001C000000180000003800000030000000300000007000000 -06000000060000000E0000000C0000000C0000001C000000180000001800000038000000 -30000000700000006000000060000000E0000000C0000000C00000001F537BBD2A>I<00 -03F80000001FFF0000007E0FC00000F803E00001E000F00003C000780007C0007C000F80 -003E000F80003E001F00001F001F00001F003F00001F803F00001F803F00001F807E0000 -0FC07E00000FC07E00000FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000F -E0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0 -FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE -00000FE0FE00000FE07E00000FC07E00000FC07E00000FC07E00000FC07F00001FC03F00 -001F803F00001F803F00001F801F00001F001F00001F000F80003E000F80003E0007C000 -7C0003E000F80003F001F80000F803E000007E0FC000001FFF00000003F8000023397DB6 -2A>I<0001C0000003C0000007C000001FC00000FFC000FFFFC000FFFFC000FF1FC00000 -1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 -1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 -1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 -1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 -1FC000001FC000001FC000001FC000001FC000001FC000001FC000003FE0007FFFFFF07F -FFFFF07FFFFFF01C3779B62A>I<000FF00000007FFE000001FFFF800003E03FE0000F00 -0FF0001E0007F8001C0003FC00380001FE00700001FE00700000FF00600000FF00FE0000 -FF00FF00007F80FF80007F80FF80007F80FF80007F80FF80007F80FF80007F807F00007F -801C00007F800000007F80000000FF00000000FF00000000FE00000001FE00000001FC00 -000003FC00000003F800000007F00000000FE00000000FC00000001F800000003F000000 -007E00000000FC00000001F800000001E000000003C000000007800000000F000000001E -000180003C000180007800018000F000038001E000030003C00003000780000300070000 -07000FFFFFFF001FFFFFFF003FFFFFFF007FFFFFFE00FFFFFFFE00FFFFFFFE00FFFFFFFE -0021377CB62A>I<0007F80000003FFF000000FFFFC00001F80FF00003C007F800078003 -FC000E0001FE000F8001FE001FE000FF001FF000FF001FF000FF001FF000FF001FF000FF -001FF000FF000FE000FF0007C000FF00000001FE00000001FE00000001FC00000003FC00 -000003F800000007F000000007E00000000F800000007F0000001FFC0000001FFF800000 -000FE000000007F000000001FC00000001FE00000000FF000000007F800000007F800000 -007FC00000007FC00000003FC00000003FE00000003FE01E00003FE07F80003FE07F8000 -3FE0FFC0003FE0FFC0003FE0FFC0003FE0FFC0003FC0FFC0007FC0FF80007F807E00007F -80700000FF00380001FE001E0001FE000F8003F80007F00FF00001FFFFC000007FFF0000 -000FF8000023397DB62A>I<000000380000000038000000007800000000F800000000F8 -00000001F800000003F800000007F800000007F80000000FF80000001FF80000001BF800 -000033F800000073F800000063F8000000C3F8000001C3F800000183F800000303F80000 -0703F800000603F800000C03F800001C03F800001803F800003003F800007003F8000060 -03F80000C003F80001C003F800038003F800030003F800070003F8000E0003F8000C0003 -F800180003F800380003F800300003F800600003F800E00003F800FFFFFFFFF8FFFFFFFF -F8FFFFFFFFF8000003F800000003F800000003F800000003F800000003F800000003F800 -000003F800000003F800000003F800000003F800000007FC000003FFFFF80003FFFFF800 -03FFFFF825387EB72A>I<0600000C000780003C0007F003F80007FFFFF80007FFFFF000 -07FFFFE00007FFFF800007FFFF000007FFFC0000067FE000000600000000060000000006 -000000000600000000060000000006000000000600000000060000000006000000000600 -0000000607F80000061FFE000006780F800006E007E00007C003F000078001F800070001 -F800060000FC00060000FE00000000FE00000000FF000000007F000000007F000000007F -800000007F800000007F800000007F801C00007F807F00007F80FF00007F80FF80007F80 -FF80007F80FF80007F80FF00007F00FF0000FF00FC0000FF00600000FE00700000FE0070 -0001FC00380001F8001C0003F8001E0007F0000F800FE00007E03F800001FFFF0000007F -FC0000001FE0000021397CB62A>I<00003FC0000001FFF0000007FFFC00000FE03E0000 -3F800700007E001F0000FC003F8001F8007F8003F0007F8007F0007F8007E0007F800FE0 -003F000FC0001E001FC00000001F800000003F800000003F800000003F800000007F8000 -00007F000000007F01FC00007F07FF8000FF1E07E000FF3801F000FF7000F800FF6000FC -00FFE0007E00FFC0003F00FFC0003F80FF80003F80FF80001FC0FF80001FC0FF80001FC0 -FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE07F00001FE07F00001FE07F -00001FE07F00001FE07F80001FE03F80001FE03F80001FC03F80001FC01F80003F801FC0 -003F800FC0003F000FE0007F0007E000FE0003F000FC0001F801F80000FE07F000007FFF -C000001FFF00000003FC000023397DB62A>I<300000000038000000003E000000003FFF -FFFFE03FFFFFFFE03FFFFFFFE03FFFFFFFC07FFFFFFFC07FFFFFFF807FFFFFFF00700000 -06006000000E006000001C006000003800E000003000C000007000C00000E000C00000C0 -00000001C00000000380000000070000000006000000000E000000001C000000001C0000 -0000380000000078000000007000000000F000000000E000000001E000000001E0000000 -03E000000003C000000007C000000007C00000000FC00000000FC00000000FC00000001F -C00000001F800000001F800000003F800000003F800000003F800000003F800000003F80 -0000007F800000007F800000007F800000007F800000007F800000007F800000007F8000 -00007F800000007F800000003F000000001E000000233A7BB72A>I<0003F80000001FFF -0000007FFFC00000FC07F00001E001F80003C0007C000780003C000700003E000F00001E -000E00001F001E00000F001E00000F001E00000F001F00000F001F00000F001F80001F00 -1FC0001E001FE0001E000FF8003C000FFC007C000FFF00780007FF80F00003FFE3E00003 -FFF7800000FFFF0000007FFE0000003FFF8000000FFFE000003FFFF00000F9FFF80001E0 -7FFE0003C03FFF000F800FFF001F0007FF801E0001FFC03C0000FFC07C00003FC0780000 -1FE07800000FE0F8000007E0F0000003E0F0000003E0F0000001E0F0000001E0F0000001 -E0F8000001C0F8000001C078000003C07C000003803E000007801F00000F000F80001E00 -07E0007C0003F803F00000FFFFE000003FFF80000007FC000023397DB62A>I<0003F800 -00001FFF0000007FFFC00001FC07E00003F803F00007E001F8000FE000FC001FC0007E00 -1F80007E003F80003F003F80003F007F00003F807F00003F80FF00003F80FF00001FC0FF -00001FC0FF00001FC0FF00001FC0FF00001FC0FF00001FE0FF00001FE0FF00001FE0FF00 -001FE0FF00001FE07F00003FE07F00003FE07F00003FE03F80003FE03F80007FE01F8000 -7FE00FC000FFE007E000DFE003E001DFE001F0039FE000FC0F1FE0003FFC1FC00007F01F -C00000001FC00000001FC00000003FC00000003F800000003F800000003F000000007F00 -0F00007F001F80007E003FC000FC003FC000FC003FC001F8003FC003F0003F8007E0001F -000FE0001C001F80000F807F000007FFFE000001FFF80000003FC0000023397DB62A>I< -1C007F00FF80FF80FF80FF80FF807F001C00000000000000000000000000000000000000 -0000000000000000000000000000000000001C007F00FF80FF80FF80FF80FF807F001C00 -092479A317>I<1C007F00FF80FF80FF80FF80FF807F001C000000000000000000000000 -000000000000000000000000000000000000000000000000001C007F00FF80FF80FFC0FF -C0FFC07FC01CC000C000C000C000C001C00180018003800300070006000E001C00380070 -0060000A3479A317>I<003FE00001FFFE0007C03F800E000FC03C0007F0300003F07000 -03F87C0001F8FE0001FCFF0001FCFF0001FCFF0001FCFF0001FC7E0001FC3C0003F80000 -03F8000007F0000007F000000FE000001F8000003F0000007E0000007C000000F8000001 -F0000001E0000003C0000003800000038000000700000007000000070000000600000006 -000000060000000600000006000000060000000600000006000000060000000600000000 -000000000000000000000000000000000000000000000000000000000000000E0000003F -8000007FC000007FC000007FC000007FC000007FC000003F8000000E00001E3B7CBA27> -63 D<0000003800000000000038000000000000380000000000007C0000000000007C00 -00000000007C000000000000FE000000000000FE000000000000FE000000000001FF0000 -00000001FF000000000001FF0000000000037F8000000000037F8000000000077FC00000 -0000063FC000000000063FC0000000000E3FE0000000000C1FE0000000000C1FE0000000 -001C1FF000000000180FF000000000180FF000000000380FF8000000003007F800000000 -3007F8000000007007FC000000006003FC000000006003FC00000000C003FE00000000C0 -01FE00000000C001FE000000018001FF000000018000FF000000018000FF000000030000 -FF8000000300007F8000000300007F8000000600007FC0000007FFFFFFC0000007FFFFFF -C000000FFFFFFFE000000C00001FE000000C00001FE000001800000FF000001800000FF0 -00001800000FF0000030000007F8000030000007F8000030000007F8000060000003FC00 -0060000003FC0000E0000003FC0000E0000001FE0001E0000001FE0003F0000001FF000F -FC000007FF80FFFF8000FFFFFEFFFF8000FFFFFEFFFF8000FFFFFE373C7DBB3E>65 -D<FFFFFFFFE00000FFFFFFFFFC0000FFFFFFFFFF000001FF80007FC00000FF00001FE000 -00FF00000FF00000FF000007F80000FF000003FC0000FF000003FC0000FF000001FE0000 -FF000001FE0000FF000001FF0000FF000001FF0000FF000001FF0000FF000001FF0000FF -000001FF0000FF000001FF0000FF000001FF0000FF000001FE0000FF000003FE0000FF00 -0003FC0000FF000007F80000FF00000FF00000FF00001FE00000FF00003FC00000FF0000 -FF800000FFFFFFFC000000FFFFFFFC000000FF00007F800000FF00001FE00000FF000007 -F00000FF000003F80000FF000001FC0000FF000001FE0000FF000000FF0000FF000000FF -0000FF000000FF8000FF0000007F8000FF0000007FC000FF0000007FC000FF0000007FC0 -00FF0000007FC000FF0000007FC000FF0000007FC000FF0000007FC000FF0000007F8000 -FF000000FF8000FF000000FF8000FF000001FF0000FF000001FE0000FF000003FE0000FF -000007FC0000FF00001FF80001FF80007FF000FFFFFFFFFFC000FFFFFFFFFF0000FFFFFF -FFF8000032397DB83B>I<000001FF80018000000FFFE0038000007FFFF803800001FF80 -7E07800003FC000F0F80000FF000039F80001FE00001DF80003F800000FF80007F000000 -7F8000FE0000003F8001FE0000003F8003FC0000001F8007F80000000F8007F80000000F -800FF000000007800FF000000007801FE000000007801FE000000003803FE00000000380 -3FC000000003807FC000000001807FC000000001807FC000000001807F800000000180FF -800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF80 -0000000000FF800000000000FF800000000000FF800000000000FF800000000000FF8000 -00000000FF800000000000FF8000000000007F8000000000007FC000000001807FC00000 -0001807FC000000001803FC000000001803FE000000001801FE000000003801FE0000000 -03000FF000000003000FF0000000070007F8000000070007F8000000060003FC0000000E -0001FE0000001C0000FE0000001800007F0000003800003F8000007000001FE00000E000 -000FF00003C0000003FC000F80000001FF803F000000007FFFFC000000000FFFF0000000 -0001FF800000313D7BBA3C>I<FFFFFFFFC00000FFFFFFFFF80000FFFFFFFFFE000001FF -8001FF800000FF00003FE00000FF00000FF00000FF000003F80000FF000001FC0000FF00 -0000FE0000FF0000007F0000FF0000007F0000FF0000003F8000FF0000003FC000FF0000 -001FC000FF0000001FE000FF0000000FE000FF0000000FF000FF0000000FF000FF000000 -0FF000FF00000007F800FF00000007F800FF00000007F800FF00000007F800FF00000007 -FC00FF00000007FC00FF00000007FC00FF00000007FC00FF00000007FC00FF00000007FC -00FF00000007FC00FF00000007FC00FF00000007FC00FF00000007FC00FF00000007FC00 -FF00000007FC00FF00000007F800FF00000007F800FF00000007F800FF00000007F800FF -0000000FF000FF0000000FF000FF0000000FE000FF0000000FE000FF0000001FE000FF00 -00001FC000FF0000003F8000FF0000003F8000FF0000007F0000FF000000FE0000FF0000 -01FC0000FF000003F80000FF00000FF00000FF00003FE00001FF8000FF8000FFFFFFFFFF -0000FFFFFFFFF80000FFFFFFFFC0000036397DB83F>I<FFFFFFFFFFFE00FFFFFFFFFFFE -00FFFFFFFFFFFE0001FF800007FE0000FF000000FE0000FF0000003F0000FF0000001F00 -00FF0000000F0000FF000000070000FF000000070000FF000000070000FF000000030000 -FF000000030000FF000000030000FF000000038000FF000000018000FF0000C0018000FF -0000C0018000FF0000C0018000FF0000C0000000FF0000C0000000FF0000C0000000FF00 -01C0000000FF0001C0000000FF0003C0000000FF000FC0000000FFFFFFC0000000FFFFFF -C0000000FFFFFFC0000000FF000FC0000000FF0003C0000000FF0001C0000000FF0001C0 -000000FF0000C0000000FF0000C0000000FF0000C0006000FF0000C0006000FF0000C000 -6000FF0000C000E000FF00000000C000FF00000000C000FF00000000C000FF00000000C0 -00FF00000001C000FF00000001C000FF00000001C000FF000000038000FF000000038000 -FF000000078000FF000000078000FF0000000F8000FF0000003F8000FF0000007F8001FF -800007FF00FFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFF0033397EB838>I<FFFFFF -FFFFF8FFFFFFFFFFF8FFFFFFFFFFF801FF80001FF800FF000001F800FF000000FC00FF00 -00007C00FF0000003C00FF0000001C00FF0000001C00FF0000000C00FF0000000C00FF00 -00000C00FF0000000C00FF0000000E00FF0000000600FF0000000600FF0001800600FF00 -01800600FF0001800000FF0001800000FF0001800000FF0001800000FF0003800000FF00 -03800000FF0007800000FF001F800000FFFFFF800000FFFFFF800000FFFFFF800000FF00 -1F800000FF0007800000FF0003800000FF0003800000FF0001800000FF0001800000FF00 -01800000FF0001800000FF0001800000FF0001800000FF0000000000FF0000000000FF00 -00000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 -00000000FF0000000000FF0000000000FF0000000000FF0000000001FFC0000000FFFFFF -C00000FFFFFFC00000FFFFFFC000002F397DB836>I<000000FF8000C000000FFFF001C0 -00003FFFFC01C00000FF803F03C00003FC000787C0000FF00003CFC0001FE00000EFC000 -3FC000007FC0007F8000003FC000FF0000001FC001FE0000001FC003FC0000000FC007F8 -00000007C007F800000007C00FF000000003C00FF000000003C01FE000000003C01FE000 -000001C03FE000000001C03FC000000001C07FC000000000C07FC000000000C07FC00000 -0000C07FC000000000C0FF800000000000FF800000000000FF800000000000FF80000000 -0000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000000 -00FF800000000000FF800000000000FF800000FFFFFFFF800000FFFFFF7FC00000FFFFFF -7FC00000007FE07FC00000003FC07FC00000003FC03FC00000003FC03FE00000003FC01F -E00000003FC01FE00000003FC00FF00000003FC00FF00000003FC007F80000003FC007F8 -0000003FC003FC0000003FC001FE0000003FC000FF0000007FC0007F8000007FC0003FC0 -0000FFC0001FE00000EFC0000FF80003C7C00003FE000783C00000FFC03F01C000003FFF -FC00C000000FFFF00000000000FF800000383D7CBA41>I<FFFFFF01FFFFFEFFFFFF01FF -FFFEFFFFFF01FFFFFE01FF800003FF0000FF000001FE0000FF000001FE0000FF000001FE -0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE00 -00FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000 -FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF -000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FFFFFFFFFE0000FFFF -FFFFFE0000FFFFFFFFFE0000FF000001FE0000FF000001FE0000FF000001FE0000FF0000 -01FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001 -FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE -0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE00 -00FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0000FF000001FE0001 -FF800003FF00FFFFFF01FFFFFEFFFFFF01FFFFFEFFFFFF01FFFFFE37397DB83E>I<FFFF -FFC0FFFFFFC0FFFFFFC000FFC000007F8000007F8000007F8000007F8000007F8000007F -8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F -8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F -8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F -8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F -8000007F8000007F8000007F8000007F8000007F8000007F8000007F800000FFC000FFFF -FFC0FFFFFFC0FFFFFFC01A397EB81E>I<FFFFFF0001FFFF00FFFFFF0001FFFF00FFFFFF -0001FFFF0001FF8000007FF00000FF0000003F800000FF0000003E000000FF0000003C00 -0000FF00000038000000FF00000070000000FF000000E0000000FF000001C0000000FF00 -000380000000FF00000700000000FF00000E00000000FF00001C00000000FF0000380000 -0000FF00007000000000FF0000E000000000FF0001C000000000FF00078000000000FF00 -0E0000000000FF001C0000000000FF003E0000000000FF007E0000000000FF00FF000000 -0000FF01FF0000000000FF03FF8000000000FF077FC000000000FF0E7FC000000000FF1C -3FE000000000FF381FF000000000FF701FF000000000FFE00FF800000000FFC007FC0000 -0000FF8007FC00000000FF0003FE00000000FF0001FF00000000FF0001FF00000000FF00 -00FF80000000FF00007FC0000000FF00007FC0000000FF00003FE0000000FF00001FF000 -0000FF00001FF0000000FF00000FF8000000FF00000FF8000000FF000007FC000000FF00 -0003FE000000FF000003FE000000FF000001FF000000FF000000FF800000FF000000FFC0 -0000FF000000FFE00001FF800001FFF000FFFFFF001FFFFF80FFFFFF001FFFFF80FFFFFF -001FFFFF8039397DB841>75 D<FFFFFFE00000FFFFFFE00000FFFFFFE0000001FFC00000 -0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000000 -0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000000 -0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000000 -0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000000 -0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000000 -0000FF0000000000FF0000001800FF0000001800FF0000001800FF0000001800FF000000 -1800FF0000003800FF0000003000FF0000003000FF0000003000FF0000007000FF000000 -7000FF0000007000FF000000F000FF000000F000FF000001F000FF000003F000FF00000F -F000FF00001FE001FF8000FFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE02D397DB834 ->I<FFFF0000000007FFF8FFFF800000000FFFF8FFFF800000000FFFF801FF800000000F -FC0000DFC00000001BF80000DFC00000001BF80000CFE000000033F80000CFE000000033 -F80000CFE000000033F80000C7F000000063F80000C7F000000063F80000C7F000000063 -F80000C3F8000000C3F80000C3F8000000C3F80000C1FC00000183F80000C1FC00000183 -F80000C1FC00000183F80000C0FE00000303F80000C0FE00000303F80000C07F00000603 -F80000C07F00000603F80000C07F00000603F80000C03F80000C03F80000C03F80000C03 -F80000C03F80000C03F80000C01FC0001803F80000C01FC0001803F80000C00FE0003003 -F80000C00FE0003003F80000C00FE0003003F80000C007F0006003F80000C007F0006003 -F80000C003F800C003F80000C003F800C003F80000C003F800C003F80000C001FC018003 -F80000C001FC018003F80000C001FC018003F80000C000FE030003F80000C000FE030003 -F80000C0007F060003F80000C0007F060003F80000C0007F060003F80000C0003F8C0003 -F80000C0003F8C0003F80000C0001FD80003F80000C0001FD80003F80000C0001FD80003 -F80000C0000FF00003F80000C0000FF00003F80000C0000FF00003F80001E00007E00003 -F80003F00007E00003F8000FFC0003C00007FC00FFFFC003C003FFFFF8FFFFC003C003FF -FFF8FFFFC0018003FFFFF845397DB84C>I<FFFF000007FFFEFFFF800007FFFEFFFFC000 -07FFFE00FFC000007FE000FFE000001F8000DFF000000F0000DFF00000060000CFF80000 -060000C7FC0000060000C7FC0000060000C3FE0000060000C1FF0000060000C1FF000006 -0000C0FF8000060000C07FC000060000C07FC000060000C03FE000060000C01FF0000600 -00C01FF800060000C00FF800060000C007FC00060000C007FE00060000C003FE00060000 -C001FF00060000C001FF80060000C000FF80060000C0007FC0060000C0007FE0060000C0 -003FE0060000C0001FF0060000C0000FF8060000C0000FF8060000C00007FC060000C000 -03FE060000C00003FE060000C00001FF060000C00000FF860000C00000FF860000C00000 -7FC60000C000003FE60000C000003FE60000C000001FF60000C000000FFE0000C000000F -FE0000C0000007FE0000C0000003FE0000C0000003FE0000C0000001FE0000C0000000FE -0000C0000000FE0000C00000007E0001E00000003E0003F00000003E000FFC0000001E00 -FFFFC000000E00FFFFC000000E00FFFFC00000060037397DB83E>I<000003FF00000000 -001FFFE000000000FE01FC00000001F8007E00000007E0001F8000000FC0000FC000003F -800007F000007F000003F80000FE000001FC0001FC000000FE0001F80000007E0003F800 -00007F0007F00000003F8007F00000003F800FE00000001FC00FE00000001FC01FE00000 -001FE01FC00000000FE03FC00000000FF03FC00000000FF03FC00000000FF07FC0000000 -0FF87F8000000007F87F8000000007F87F8000000007F8FF8000000007FCFF8000000007 -FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FC -FF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FC7F -8000000007F87FC00000000FF87FC00000000FF87FC00000000FF83FC00000000FF03FC0 -0000000FF01FE00000001FE01FE00000001FE01FE00000001FE00FF00000003FC007F000 -00003F8007F80000007F8003F80000007F0001FC000000FE0001FC000000FE0000FE0000 -01FC00007F000003F800003F800007F000001FC0000FE0000007E0001F80000003F8007F -00000000FE01FC000000001FFFE00000000003FF000000363D7BBA41>I<FFFFFFFFC000 -00FFFFFFFFFC0000FFFFFFFFFF000001FF8000FFC00000FF00001FE00000FF00000FF000 -00FF000003F80000FF000003FC0000FF000001FE0000FF000001FE0000FF000000FF0000 -FF000000FF0000FF000000FF8000FF000000FF8000FF000000FF8000FF000000FF8000FF -000000FF8000FF000000FF8000FF000000FF8000FF000000FF0000FF000000FF0000FF00 -0001FE0000FF000001FE0000FF000003FC0000FF000003F80000FF00000FF00000FF0000 -1FE00000FF0000FF800000FFFFFFFE000000FFFFFFF0000000FF000000000000FF000000 -000000FF000000000000FF000000000000FF000000000000FF000000000000FF00000000 -0000FF000000000000FF000000000000FF000000000000FF000000000000FF0000000000 -00FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000 -FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF -000000000001FF8000000000FFFFFF00000000FFFFFF00000000FFFFFF0000000031397E -B838>I<000003FF00000000001FFFE000000000FE01FC00000001F8007E00000007E000 -1F8000000FC0000FC000003F800007F000007F000003F80000FE000001FC0001FC000000 -FE0001FC000000FE0003F80000007F0007F80000007F8007F00000003F800FF00000003F -C00FE00000001FC01FE00000001FE01FE00000001FE03FC00000000FF03FC00000000FF0 -3FC00000000FF07FC00000000FF87FC00000000FF87F8000000007F87F8000000007F8FF -8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF80 -00000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000 -000007FCFF8000000007FC7F8000000007F87F8000000007F87FC00000000FF87FC00000 -000FF83FC00000000FF03FC00000000FF01FE00000001FE01FE00000001FE01FE0000000 -1FE00FF00000003FC007F0007C003F8007F001FF003F8003F80383807F0001FC0701C0FE -0001FC0E00C0FE0000FE0C00E1FC00007F0C0063F800003F8C0077F000001FCC003FE000 -0007EE003F80000003FF007F00000000FF81FC000C00001FFFFC000C000003FF1C000C00 -0000001E001C000000001F001C000000001F003C000000001F807C000000001FC0F80000 -00000FFFF8000000000FFFF8000000000FFFF8000000000FFFF00000000007FFF0000000 -0007FFE00000000003FFC00000000001FF8000000000007E00364B7BBA41>I<FFFFFFFE -00000000FFFFFFFFE0000000FFFFFFFFF800000001FF8007FE00000000FF0000FF800000 -00FF00003FC0000000FF00001FE0000000FF00000FF0000000FF000007F8000000FF0000 -07F8000000FF000003FC000000FF000003FC000000FF000003FE000000FF000003FE0000 -00FF000003FE000000FF000003FE000000FF000003FE000000FF000003FE000000FF0000 -03FC000000FF000003FC000000FF000007F8000000FF000007F8000000FF00000FF00000 -00FF00001FE0000000FF00003F80000000FF0000FF00000000FF0007FC00000000FFFFFF -E000000000FFFFFFC000000000FF000FF000000000FF0003F800000000FF0000FE000000 -00FF0000FF00000000FF00007F80000000FF00003FC0000000FF00003FC0000000FF0000 -1FC0000000FF00001FE0000000FF00001FE0000000FF00001FE0000000FF00001FE00000 -00FF00001FE0000000FF00001FF0000000FF00001FF0000000FF00001FF0000000FF0000 -1FF0000000FF00001FF0000000FF00001FF0000000FF00001FF0018000FF00001FF00180 -00FF00001FF8018000FF00000FF8018000FF00000FF8038001FF800007F80300FFFFFF00 -03FC0700FFFFFF0001FC0600FFFFFF0000FE0E0000000000003FFC00000000000007F000 -393B7DB83D>I<000FF800C0003FFE01C000FFFF81C003F807E3C007E000F7C00FC0007F -C01F80003FC03F00001FC03E00000FC07E000007C07E000007C07C000003C0FC000003C0 -FC000001C0FC000001C0FC000001C0FE000000C0FE000000C0FE000000C0FF000000C0FF -800000007FC00000007FE00000007FF80000003FFF8000001FFFF800001FFFFF80000FFF -FFE00007FFFFF80003FFFFFE0000FFFFFF00003FFFFF800007FFFFC000007FFFC0000007 -FFE00000007FE00000003FF00000001FF00000000FF000000007F800000007F8C0000003 -F8C0000003F8C0000001F8C0000001F8C0000001F8E0000001F8E0000001F8E0000001F0 -F0000001F0F0000003F0F8000003E0FC000007E0FE000007C0FF00000FC0FF80001F80FB -F0003F00F0FE00FE00E03FFFF800E00FFFE000C001FF0000253D7CBA2E>I<3FFFFFFFFF -FFE03FFFFFFFFFFFE03FFFFFFFFFFFE03FC003FF001FE03E0001FE0003E07C0001FE0001 -F0780001FE0000F0700001FE000070700001FE000070700001FE000070600001FE000030 -600001FE000030600001FE000030600001FE000030E00001FE000038C00001FE000018C0 -0001FE000018C00001FE000018C00001FE000018000001FE000000000001FE0000000000 -01FE000000000001FE000000000001FE000000000001FE000000000001FE000000000001 -FE000000000001FE000000000001FE000000000001FE000000000001FE000000000001FE -000000000001FE000000000001FE000000000001FE000000000001FE000000000001FE00 -0000000001FE000000000001FE000000000001FE000000000001FE000000000001FE0000 -00000001FE000000000001FE000000000001FE000000000001FE000000000001FE000000 -000001FE000000000001FE000000000001FE000000000001FE000000000001FE00000000 -0001FE000000000007FF800000001FFFFFFFE000001FFFFFFFE000001FFFFFFFE0003539 -7DB83C>I<FFFFFF0007FFFEFFFFFF0007FFFEFFFFFF0007FFFE01FF8000007FE000FF00 -00001F8000FF0000000F0000FF000000060000FF000000060000FF000000060000FF0000 -00060000FF000000060000FF000000060000FF000000060000FF000000060000FF000000 -060000FF000000060000FF000000060000FF000000060000FF000000060000FF00000006 -0000FF000000060000FF000000060000FF000000060000FF000000060000FF0000000600 -00FF000000060000FF000000060000FF000000060000FF000000060000FF000000060000 -FF000000060000FF000000060000FF000000060000FF000000060000FF000000060000FF -000000060000FF000000060000FF000000060000FF000000060000FF000000060000FF00 -0000060000FF000000060000FF0000000E00007F0000000C00007F8000000C00007F8000 -001C00003F8000001C00003F8000001800001FC000003800001FC000007000000FE00000 -F0000007F00000E0000003F80001C0000001FC000780000000FE000F000000007F807E00 -0000001FFFF80000000007FFE000000000007F800000373B7DB83E>I<FFFFFC00007FFF -80FFFFFC00007FFF80FFFFFC00007FFF8003FF8000000FFC0001FF00000007E00001FF00 -000003C00000FF00000001800000FF800000038000007F800000030000007F8000000300 -00007FC00000030000003FC00000060000003FC00000060000003FE000000E0000001FE0 -00000C0000001FF000000C0000000FF00000180000000FF00000180000000FF800001800 -000007F800003000000007F800003000000007FC00007000000003FC00006000000003FC -00006000000001FE0000C000000001FE0000C000000001FF0000C000000000FF00018000 -000000FF00018000000000FF800380000000007F800300000000007F800300000000003F -C00600000000003FC00600000000003FE00600000000001FE00C00000000001FE00C0000 -0000001FF01C00000000000FF01800000000000FF018000000000007F830000000000007 -F830000000000007FC30000000000003FC60000000000003FC60000000000003FEE00000 -00000001FEC0000000000001FEC0000000000000FF80000000000000FF80000000000000 -FF800000000000007F000000000000007F000000000000007F000000000000003E000000 -000000003E000000000000001C000000000000001C000000000000001C00000000393B7E -B83E>I<FFFFFC07FFFFF001FFFFFFFFFC07FFFFF001FFFFFFFFFC07FFFFF001FFFF07FF -80001FFE00001FF803FE00000FF8000007E001FE000007F8000003C001FE000007F80000 -038001FF000007F80000038000FF000003FC0000030000FF000003FC0000030000FF8000 -03FC00000700007F800001FE00000600007F800001FE00000600007FC00001FE00000600 -003FC00003FF00000C00003FC00003FF00000C00003FE00003FF00000C00001FE00007FF -80001800001FE000067F80001800001FE000067F80001800000FF0000E7FC0003000000F -F0000C3FC0003000000FF0000C3FC00030000007F8001C3FE00060000007F800181FE000 -60000007F800181FE00060000003FC00181FF000C0000003FC00300FF000C0000003FC00 -300FF000C0000001FE00300FF80180000001FE006007F80180000001FE006007F8018000 -0000FF006007F80300000000FF00C003FC0300000000FF00C003FC0300000000FF80C003 -FC07000000007F818001FE06000000007F818001FE06000000007FC18001FE0E00000000 -3FC30000FF0C000000003FC30000FF0C000000003FE30000FF1C000000001FE600007F98 -000000001FE600007F98000000001FF600007F98000000000FFC00003FF0000000000FFC -00003FF0000000000FFC00003FF00000000007FC00003FE00000000007F800001FE00000 -000007F800001FE00000000003F800001FC00000000003F000000FC00000000003F00000 -0FC00000000001F000000F800000000001E0000007800000000001E00000078000000000 -00E0000007000000000000C0000003000000503B7EB855>I<7FFFFF003FFFFC007FFFFF -003FFFFC007FFFFF003FFFFC0000FFF80007FF8000007FE00003FC0000003FE00001F000 -00001FF00001E00000001FF00001C00000000FF800018000000007FC00038000000007FC -00070000000003FE00060000000003FE000E0000000001FF001C0000000000FF80180000 -000000FF803800000000007FC03000000000003FE06000000000003FE0E000000000001F -F0C000000000000FF18000000000000FFB80000000000007FF00000000000007FE000000 -00000003FE00000000000001FF00000000000001FF00000000000000FF80000000000000 -7FC00000000000007FC0000000000000FFE0000000000000DFE00000000000019FF00000 -000000038FF80000000000030FF800000000000607FC00000000000E03FE00000000000C -03FE00000000001801FF00000000003800FF00000000003000FF800000000060007FC000 -000000E0007FC000000000C0003FE00000000180001FF00000000380001FF00000000300 -000FF800000006000007FC0000000E000007FC0000000C000003FE0000001C000001FE00 -00003C000001FF000000FE000001FF800007FF800007FFE000FFFFE0003FFFFF80FFFFE0 -003FFFFF80FFFFE0003FFFFF8039397EB83E>I<FFFFFE00003FFFE0FFFFFE00003FFFE0 -FFFFFE00003FFFE003FFE0000007FE0000FFC0000003F000007FC0000001E000007FC000 -0001C000003FE00000018000001FF00000038000001FF00000030000000FF80000060000 -000FF800000600000007FC00000C00000003FE00001C00000003FE00001800000001FF00 -003800000001FF00003000000000FF800060000000007FC000E0000000007FC000C00000 -00003FE001C0000000003FE00180000000001FF00380000000000FF80300000000000FF8 -06000000000007FC0E000000000007FC0C000000000003FE1C000000000001FF18000000 -000001FF30000000000000FFB0000000000000FFE00000000000007FE00000000000003F -C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000 -0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F -C00000000000003FC00000000000003FC00000000000003FC00000000000003FC0000000 -0000003FC00000000000003FC00000000000003FC00000000000003FC00000000000003F -C00000000000003FC00000000000007FE000000000003FFFFFC0000000003FFFFFC00000 -00003FFFFFC000003B397FB83E>I<3FFFFFFFFF003FFFFFFFFF003FFFFFFFFF003FFC00 -01FE003FC00003FE003F800007FC003E000007FC003C00000FF8003C00000FF000380000 -1FF0007800003FE0007000003FE0007000007FC0007000007F8000600000FF8000600001 -FF0000600001FF0000600003FE0000600003FC0000000007FC000000000FF8000000000F -F8000000001FF0000000001FE0000000003FE0000000007FC0000000007FC000000000FF -8000000000FF0000000001FF0000000003FE0000000003FE0000000007FC0000000007F8 -000000000FF8000000001FF0000180001FF0000180003FE0000180003FC0000180007FC0 -00018000FF8000018000FF8000038001FF0000038001FE0000038003FE0000038007FC00 -00038007FC000007000FF8000007000FF000000F001FF000001F003FE000003F003FE000 -007F007FC00001FF007F80000FFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF0029397B -B833>I<7FFFFFFFFFFF80FFFFFFFFFFFFC0FFFFFFFFFFFFC07FFFFFFFFFFF8032047970 -41>95 D<0180038007000E001C00180038003000700060006000E000C000C000C000C000 -CE00FF80FFC0FFC0FFC07FC07FC03F800E000A197AB917>I<001FE0000000FFFC000003 -E03F000007000F80000F8007E0001FC003F0001FE003F0001FE001F8001FE001F8001FE0 -00FC000FC000FC00078000FC00000000FC00000000FC00000000FC00000000FC0000007F -FC000007FFFC00003FE0FC0000FE00FC0003F800FC000FF000FC001FC000FC003FC000FC -007F8000FC007F0000FC007F0000FC0CFE0000FC0CFE0000FC0CFE0000FC0CFE0001FC0C -FE0001FC0CFF0003FC0C7F00077C0C7F80063E183FC01E3E180FE0781FF003FFF00FE000 -7F8007C026277DA52A>I<03F0000000FFF0000000FFF0000000FFF00000000FF0000000 -03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 -F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F01FE00003F07FF80003F1E03E0003F3801F8003F7000FC003FE00 -07E003FC0003F003F80001F803F00001F803F00000FC03F00000FC03F00000FE03F00000 -FE03F000007E03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F -03F000007F03F000007F03F000007F03F000007F03F000007E03F00000FE03F00000FE03 -F00000FC03F00001FC03F80001F803F80003F003FC0003F003EE0007E003C6000FC003C7 -801F000381E07E000300FFF80000001FC000283B7EB92E>I<0003FC00001FFF80007E03 -E001F8007003F000F807E001FC0FC003FC0FC003FC1F8003FC3F8003FC3F0001F87F0000 -F07F0000007F0000007E000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE000000FE000000FE000000FE0000007E0000007F0000007F0000003F0000063F8000 -061F80000E1FC0000C0FC0001C07E0003803F0007001F800E0007C07C0001FFF000007F8 -001F277DA525>I<0000000FC0000003FFC0000003FFC0000003FFC00000003FC0000000 -0FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000F -C00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0 -0000000FC00003F80FC0001FFF0FC0007E078FC000F801EFC003F0007FC007E0003FC00F -C0001FC00FC0001FC01F80000FC03F80000FC03F00000FC07F00000FC07F00000FC07E00 -000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE0000 -0FC0FE00000FC0FE00000FC0FE00000FC07E00000FC07F00000FC07F00000FC03F00000F -C03F00000FC01F80001FC01F80001FC00FC0003FC007E0007FC003F000EFF001F801CFFF -007C078FFF001FFE0FFF0007F80FC0283B7DB92E>I<0007F800001FFF00007C0FC001F8 -03E003F001F007E001F80FC000F81F80007C1F80007C3F00007E3F00003E7F00003E7F00 -003F7E00003FFE00003FFE00003FFE00003FFFFFFFFFFFFFFFFFFE000000FE000000FE00 -0000FE000000FE0000007E0000007E0000007F0000007F0000003F0000033F8000031F80 -00070FC0000607C0000E07E0001C01F0003800F80070007E03E0001FFF800003FC002027 -7EA525>I<00007E000003FF80000FC1E0001F87E0003F0FF0007E0FF0007E0FF000FC0F -F000FC0FF001F803C001F8000001F8000001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F8000001F80000FFFFFC00FFFFFC00FFFFFC -0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000003FC00007FFFF8007FFFF8007FFFF8001C3B7FBA19>I<00000003 -F0000FF00FF8003FFC3C3C00F81F707C01F00FE07C03E007C07C07C003E0100FC003F000 -0FC003F0001F8001F8001F8001F8001F8001F8001F8001F8001F8001F8001F8001F8001F -8001F8001F8001F8000FC003F0000FC003F00007C003E00003E007C00003F00F800003F8 -1F0000073FFC0000060FF000000E000000000E000000000E000000000E000000000F0000 -00000F000000000FC000000007FFFFC00007FFFFF80003FFFFFE0001FFFFFF8003FFFFFF -C00F80007FE01F00000FF03E000003F07C000001F07C000001F8F8000000F8F8000000F8 -F8000000F8F8000000F8F8000000F8FC000001F87C000001F03E000003E03F000007E00F -80000F8007E0003F0001FC01FC00007FFFF0000007FF000026387EA52A>I<03F0000000 -00FFF000000000FFF000000000FFF0000000000FF00000000003F00000000003F0000000 -0003F00000000003F00000000003F00000000003F00000000003F00000000003F0000000 -0003F00000000003F00000000003F00000000003F00000000003F00000000003F0000000 -0003F00000000003F00000000003F00FF0000003F03FFC000003F0F03F000003F1C01F80 -0003F3800FC00003F7000FC00003FE000FC00003FC0007E00003FC0007E00003F80007E0 -0003F80007E00003F80007E00003F00007E00003F00007E00003F00007E00003F00007E0 -0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E0 -0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E0 -0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00007F8000FF0 -00FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF80293A7EB92E>I<0380000FE0001FF0001F -F0001FF0001FF0001FF0000FE00003800000000000000000000000000000000000000000 -000000000000000000000003F000FFF000FFF000FFF00007F00003F00003F00003F00003 -F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003 -F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003 -F00007F800FFFFC0FFFFC0FFFFC012387EB717>I<0001C00007F0000FF8000FF8000FF8 -000FF8000FF80007F00001C0000000000000000000000000000000000000000000000000 -0000000000000001F800FFF800FFF800FFF80007F80001F80001F80001F80001F80001F8 -0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 -0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 -0001F80001F80001F80001F80001F80001F80001F80001F80001F83C01F87E01F8FF01F0 -FF03F0FF03F0FF03E0FE07C07C07C03C0F000FFE0003F800154984B719>I<03F0000000 -FFF0000000FFF0000000FFF00000000FF000000003F000000003F000000003F000000003 -F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 -00000003F000000003F000000003F000000003F000000003F000000003F000000003F001 -FFFC03F001FFFC03F001FFFC03F0007FC003F0007F0003F0007C0003F000700003F000E0 -0003F001C00003F003800003F007000003F01E000003F038000003F078000003F0FC0000 -03F1FC000003F3FE000003F73F000003FE3F800003F81F800003F00FC00003F00FE00003 -F007E00003F003F00003F001F80003F001FC0003F000FC0003F0007E0003F0007F0003F0 -003F0003F0003F8003F0001FC007F8003FF0FFFFC0FFFFFFFFC0FFFFFFFFC0FFFF283A7E -B92C>I<03F000FFF000FFF000FFF0000FF00003F00003F00003F00003F00003F00003F0 -0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 -0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 -0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 -0003F00003F00003F00003F00003F00003F00003F00007F800FFFFC0FFFFC0FFFFC0123A -7EB917>I<03F00FF0001FE000FFF03FFC007FF800FFF0F03F01E07E00FFF1C01F83803F -000FF3800FC7001F8003F7000FCE001F8003FE000FDC001F8003FC0007F8000FC003FC00 -07F8000FC003F80007F0000FC003F80007F0000FC003F80007F0000FC003F00007E0000F -C003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F000 -07E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000F -C003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F000 -07E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000F -C003F00007E0000FC003F00007E0000FC007F8000FF0001FE0FFFFC1FFFF83FFFFFFFFC1 -FFFF83FFFFFFFFC1FFFF83FFFF40257EA445>I<03F00FF00000FFF03FFC0000FFF0F03F -0000FFF1C01F80000FF3800FC00003F7000FC00003FE000FC00003FC0007E00003FC0007 -E00003F80007E00003F80007E00003F80007E00003F00007E00003F00007E00003F00007 -E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007 -E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007 -E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007 -E00007F8000FF000FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF8029257EA42E>I<0003FE -0000000FFF8000003E03E00000F800F80001F0007C0003E0003E0007C0001F000F80000F -801F80000FC01F000007C03F000007E03F000007E07E000003F07E000003F07E000003F0 -7E000003F0FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE -000003F8FE000003F8FE000003F87E000003F07E000003F07F000007F03F000007E03F00 -0007E01F80000FC00F80000F800FC0001F8007E0003F0003F0007E0000F800F800007E03 -F000001FFFC0000003FE000025277EA52A>I<03F01FE000FFF07FF800FFF1E07E00FFF3 -801F8007F7000FC003FE0007E003FC0003F003F80003F803F00001F803F00001FC03F000 -00FC03F00000FE03F00000FE03F00000FE03F000007F03F000007F03F000007F03F00000 -7F03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F03F00000FE -03F00000FE03F00000FE03F00001FC03F00001FC03F80003F803F80003F003FC0007F003 -FE000FE003F6000FC003F7803F0003F1E07E0003F0FFF80003F01FC00003F000000003F0 -00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 -000003F000000003F000000007F8000000FFFFC00000FFFFC00000FFFFC0000028357EA4 -2E>I<0003F800C0001FFE01C0007E0781C000FC01C3C003F000E3C007F00077C00FE000 -37C00FC0003FC01FC0001FC03F80001FC03F80000FC07F00000FC07F00000FC07F00000F -C0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0 -FE00000FC0FE00000FC0FE00000FC07F00000FC07F00000FC07F00000FC03F00000FC03F -80001FC01F80001FC01FC0003FC00FC0003FC007E0007FC003F000EFC001F801CFC0007E -078FC0001FFE0FC00007F80FC00000000FC00000000FC00000000FC00000000FC0000000 -0FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000001F -E0000003FFFF000003FFFF000003FFFF28357DA42C>I<07E01F00FFE07FC0FFE1E3E0FF -E387F00FE707F003E607F003EE07F003EC03E003FC008003F8000003F8000003F8000003 -F8000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003 -F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003 -F0000003F0000003F0000007F80000FFFFF000FFFFF000FFFFF0001C257EA421>I<00FF -030003FFE7000F80FF001E003F003C001F0078000F0070000700F0000700F0000700F000 -0300F8000300F8000300FC000300FF0000007FE000007FFF00003FFFE0001FFFF8000FFF -FC0003FFFE0000FFFF000007FF8000007F8000001F80C0000FC0C00007C0C00007C0E000 -03C0E00003C0E00003C0F00003C0F0000380F8000780FC000780FC000F00FF001E00F3C0 -7C00E1FFF000C03F80001A277DA521>I<00180000001800000018000000180000001800 -0000380000003800000038000000780000007800000078000000F8000001F8000003F800 -0007F800001FFFFF00FFFFFF00FFFFFF0001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 -0001F8000001F8000001F8000001F8000001F800C001F800C001F800C001F800C001F800 -C001F800C001F800C001F800C001F800C000FC01C000FC0180007C0380007E0300003F07 -00000FFE000001F8001A347FB220>I<03F00007E000FFF001FFE000FFF001FFE000FFF0 -01FFE0000FF0001FE00003F00007E00003F00007E00003F00007E00003F00007E00003F0 -0007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F0 -0007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F0 -0007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F0 -000FE00003F0000FE00003F0000FE00003F0001FE00001F0001FE00001F8003FE00000F8 -0077F80000FC00E7FF80003F03C7FF80001FFF87FF800003FC07E00029267EA42E>I<FF -FF803FFEFFFF803FFEFFFF803FFE0FF8000FF007F00007E003F00003C003F800038001F8 -00030001F800030000FC00060000FC00060000FE000E00007E000C00007E000C00003F00 -1800003F001800003F803800001F803000001F803000000FC06000000FC06000000FE060 -000007E0C0000007E0C0000003F180000003F180000003F180000001FB00000001FB0000 -0001FF00000000FE00000000FE000000007C000000007C000000007C0000000038000000 -0038000027257EA32C>I<FFFF1FFFE03FFEFFFF1FFFE03FFEFFFF1FFFE03FFE0FF800FF -000FF807F0007E0003E007F0007E0003C003F0003E00018003F0003E00018001F8003F00 -030001F8003F00030001F8003F00030000FC003F80060000FC006F80060000FC006F8006 -00007E00EFC00C00007E00C7C00C00007E00C7C01C00003F01C7E01800003F0183E01800 -003F8183F03800001F8383F03000001F8301F03000001FC301F87000000FC600F8600000 -0FC600F860000007E600FCC0000007EC007CC0000007EC007CC0000003FC007F80000003 -F8003F80000003F8003F80000001F8003F00000001F0001F00000001F0001F00000000F0 -001E00000000E0000E0000000060000C000037257EA33C>I<FFFF807FFF00FFFF807FFF -00FFFF807FFF0003FE003FF00001FE001F800000FE001F0000007E001C0000003F001800 -00001F80300000001FC0700000000FC0E000000007E0C000000007F18000000003FB8000 -000001FF0000000000FE0000000000FE00000000007F00000000003F00000000007F8000 -0000007FC000000000CFC000000001C7E00000000383F00000000703F80000000601F800 -00000C00FC0000001C007E00000038007F00000078003F000000F0001F800001F8001FC0 -000FF8003FF000FFFE00FFFF80FFFE00FFFF80FFFE00FFFF8029247FA32C>I<FFFF803F -FEFFFF803FFEFFFF803FFE0FF8000FF007F00007C003F000038001F800038001F8000300 -01FC00030000FC00060000FC000600007E000C00007E000C00007F000C00003F00180000 -3F001800001F803000001F803000001FC07000000FC06000000FC060000007E0C0000007 -E0C0000007F1C0000003F180000003F180000001FB00000001FB00000001FF00000000FE -00000000FE000000007C000000007C000000007C00000000380000000038000000003000 -0000003000000000700000000060000000006000000000C000000000C000007C01C00000 -FE01800000FE03800000FE03000000FE06000000FC0E000000701C00000038380000001F -F00000000FC000000027357EA32C>I<3FFFFFFC3FFFFFFC3F8003FC3E0003F83C0007F0 -38000FE030000FE070001FC070003F8060007F8060007F006000FE006001FC006001FC00 -0003F8000007F0000007F000000FE000001FC000003F8000003F8000007F000600FE0006 -00FE000601FC000603F8000607F8000E07F0000E0FE0000C1FC0001C1FC0001C3F80003C -7F00007CFF0003FCFFFFFFFCFFFFFFFC1F247EA325>I<00003E0000000000FF80000000 -0180C0000000030060000000060030000000060030000000060030000000060030000000 -0600300000000300600000000180C000000000FF80000000003E00000000000000000000 -000000000000000000000000000000000000000000000003F00007E000FFF001FFE000FF -F001FFE000FFF001FFE0000FF0001FE00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 -F00007E00003F0000FE00003F0000FE00003F0000FE00003F0001FE00001F0001FE00001 -F8003FE00000F80077F80000FC00E7FF80003F03C7FF80001FFF87FF800003FC07E00029 -387EB62E>183 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fr ecss1440 14.4 31 -/Fr 31 122 df<FFFFFFFFFFFFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFFFFFFFFFFFF -80FFFFFFFFFFFFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFFFFFFFFFFFF80FFFFFFFFFF -FFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFFFFFFFFFFFF80710680A272>22 -D<FFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC1E067F9C26>45 -D<000006000000000E000000003E000000007E00000001FE00000007FE0000003FFE0000 -07FFFE0000FFFFFE0000FFFFFE0000FFFFFE0000FFF9FE0000FFC1FE0000F801FE000000 -01FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001 -FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE -00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00 -000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000 -0001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE000000 -01FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001 -FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE -00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00 -000001FE00000001FE00007FFFFFFFF87FFFFFFFF87FFFFFFFF87FFFFFFFF87FFFFFFFF8 -7FFFFFFFF8255076CF39>49 D<00007FE000000007FFFC0000001FFFFF0000003FFFFFC0 -00007FFFFFF00000FFFFFFF80001FFFFFFFC0003FF00FFFE0007F8001FFF000FF00007FF -000FC00001FF801FC00000FFC01F8000007FC03F0000003FE03F0000003FE07E0000001F -F07E0000000FF07C0000000FF0FC0000000FF0F800000007F87800000007F87800000007 -F83000000007F83000000007F81000000007F80000000007F80000000007F80000000007 -F80000000007F80000000007F0000000000FF0000000000FF0000000000FF0000000001F -E0000000001FE0000000001FC0000000003FC0000000003F80000000007F8000000000FF -0000000000FE0000000001FE0000000003FC0000000007F80000000007F0000000000FE0 -000000001FC0000000003F80000000007F8000000000FF0000000001FE0000000003FC00 -00000007F0000000000FE0000000001FC0000000003F80000000007F0000000000FE0000 -000001FC0000000003F80000000007F0000000000FE0000000001FC0000000003F800000 -00003F00000000007E0000000000FC0000000001F80000000003F00000000007E0000000 -000FC0000000001F80000000003F00000000007FFFFFFFFFF87FFFFFFFFFF87FFFFFFFFF -F87FFFFFFFFFF87FFFFFFFFFF87FFFFFFFFFF87FFFFFFFFFF82D507BCF39>I<00003FF0 -00000001FFFE0000000FFFFF8000003FFFFFE000007FFFFFF00000FFFFFFF80003FFFFFF -FC0007FFC01FFE000FFE0007FF000FF80001FF801FF00000FF803FC000007FC03F800000 -3FC07F0000003FC03E0000003FE03E0000001FE01C0000001FE0180000001FE008000000 -1FE0000000001FE0000000001FE0000000001FE0000000003FE0000000003FC000000000 -3FC0000000007FC0000000007F8000000000FF8000000000FF0000000001FF0000000003 -FE0000000007FC000000000FF8000000007FF00000000FFFE0000003FFFFC0000003FFFF -80000003FFFE00000003FFFE00000003FFFFC0000003FFFFF0000000003FF80000000007 -FC0000000001FE0000000000FF00000000007F80000000003FC0000000003FE000000000 -1FE0000000001FF0000000000FF0000000000FF8000000000FF80000000007F800000000 -07FC0000000007FC0000000007FC0000000007FC0000000007FC0000000007FC00000000 -07FC0000000007FC4000000007FC600000000FF8600000000FF8700000000FF8F8000000 -1FF0F80000001FF0FC0000003FF07F0000003FE07F8000007FE03FC00000FFC01FF00001 -FF800FFE0007FF0007FFC03FFE0003FFFFFFFE0001FFFFFFF80000FFFFFFF000003FFFFF -E000000FFFFF80000003FFFE000000003FF000002E527BCF39>I<00000007FC00000000 -000FFC00000000000FFC00000000001FFC00000000001FFC00000000003DFC0000000000 -7DFC00000000007DFC0000000000F9FC0000000000F9FC0000000001F1FC0000000003F1 -FC0000000003F1FC0000000007E1FC0000000007E1FC000000000FC1FC000000000FC1FC -000000001F81FC000000003F81FC000000003F01FC000000007F01FC000000007E01FC00 -000000FE01FC00000001FC01FC00000001FC01FC00000003F801FC00000003F801FC0000 -0007F001FC00000007F001FC0000000FE001FC0000001FE001FC0000001FC001FC000000 -3F8001FC0000003F8001FC0000007F0001FC000000FF0001FC000000FE0001FC000001FE -0001FC000001FC0001FC000003FC0001FC000003F80001FC000007F00001FC00000FF000 -01FC00000FE00001FC00001FE00001FC00001FC00001FC00003F800001FC00007F800001 -FC00007F000001FC0000FF000001FC0000FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFF -FFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC000000001FC000000000001FC00 -0000000001FC000000000001FC000000000001FC000000000001FC000000000001FC0000 -00000001FC000000000001FC000000000001FC000000000001FC000000000001FC000000 -000001FC000000000001FC000000000001FC000000000001FC000000000001FC00000000 -0001FC000000000001FC000000000001FC000000000001FC000000000001FC0000324E7D -CD39>I<FFFFFFFF80000000FFFFFFFFF8000000FFFFFFFFFF000000FFFFFFFFFFC00000 -FFFFFFFFFFF00000FFFFFFFFFFFC0000FF800003FFFE0000FF8000003FFF0000FF800000 -07FFC000FF80000001FFC000FF80000000FFE000FF800000003FF000FF800000001FF800 -FF800000000FF800FF8000000007FC00FF8000000007FC00FF8000000003FC00FF800000 -0003FE00FF8000000001FE00FF8000000001FE00FF8000000001FE00FF8000000001FE00 -FF8000000001FE00FF8000000001FE00FF8000000003FC00FF8000000003FC00FF800000 -0007FC00FF8000000007F800FF800000000FF800FF800000001FF000FF800000003FE000 -FF80000000FFC000FF80000001FF8000FF80000007FF0000FF8000001FFE0000FF800001 -FFF80000FFFFFFFFFFF00000FFFFFFFFFFC00000FFFFFFFFFE000000FFFFFFFFFE000000 -FFFFFFFFFFC00000FFFFFFFFFFF80000FF80000FFFFE0000FF8000003FFF0000FF800000 -07FFC000FF80000001FFE000FF800000007FF000FF800000001FF800FF800000000FFC00 -FF8000000007FE00FF8000000003FE00FF8000000001FF00FF8000000001FF00FF800000 -0000FF80FF80000000007F80FF80000000007F80FF80000000007FC0FF80000000007FC0 -FF80000000003FC0FF80000000003FC0FF80000000003FC0FF80000000003FC0FF800000 -00007FC0FF80000000007FC0FF80000000007F80FF8000000000FF80FF8000000000FF80 -FF8000000001FF00FF8000000003FF00FF8000000007FE00FF800000000FFC00FF800000 -003FFC00FF800000007FF800FF80000001FFF000FF8000000FFFE000FF800000FFFFC000 -FFFFFFFFFFFF0000FFFFFFFFFFFE0000FFFFFFFFFFF80000FFFFFFFFFFE00000FFFFFFFF -FF000000FFFFFFFFF00000003A5275D14C>66 D<00000003FFF000000000001FFFFF8000 -000000FFFFFFF000000003FFFFFFFE0000000FFFFFFFFF8000003FFFFFFFFF8000007FFF -FFFFFF800000FFFE001FFF000001FFF00001FF000003FFC000003F000007FF0000000F00 -000FFE0000000300001FF80000000000003FF00000000000007FE0000000000000FFC000 -0000000000FFC0000000000001FF80000000000003FF00000000000003FE000000000000 -07FE00000000000007FC0000000000000FFC0000000000000FF80000000000001FF80000 -000000001FF00000000000001FF00000000000003FF00000000000003FE0000000000000 -3FE00000000000003FE00000000000007FC00000000000007FC00000000000007FC00000 -000000007FC00000000000007FC0000000000000FF80000000000000FF80000000000000 -FF80000000000000FF80000000000000FF80000000000000FF80000000000000FF800000 -00000000FF80000000000000FF80000000000000FF80000000000000FF80000000000000 -FF80000000000000FF80000000000000FF800000000000007FC00000000000007FC00000 -000000007FC00000000000007FC00000000000007FC00000000000003FE0000000000000 -3FE00000000000003FE00000000000003FF00000000000001FF00000000000001FF00000 -000000001FF80000000000000FF80000000000000FFC00000000000007FC000000000000 -07FE00000000000003FE00000000000003FF00000000000001FF80000000000000FFC000 -0000000000FFC00000000000007FE00000000000003FF00000000080001FF80000000380 -000FFE00000007800007FF0000001F800003FFC000003FC00001FFF00001FFC00000FFFE -001FFFC000007FFFFFFFFF8000003FFFFFFFFE0000000FFFFFFFFC00000003FFFFFFF000 -000000FFFFFFC0000000001FFFFF000000000003FFF000003A5678D349>I<FF80FF80FF -80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF -80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF -80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF -80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF80FF -80FF80FF80FF80FF80FF80FF80FF80095275D120>73 D<00000003FE00000003FE000000 -03FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003 -FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE -00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00 -000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE0000 -0003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE000000 -03FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003 -FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE -00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00 -000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE0000 -0003FE00000003FE00000007FE00000007FC00000007FC6000000FFC7000001FF87C0000 -3FF87F00007FF0FFC001FFF0FFFE1FFFE0FFFFFFFFC07FFFFFFF801FFFFFFF0003FFFFFC -00007FFFF0000007FF800027547BD136>I<FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 -FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8 -FFFFFFFFFFF82D5275D13E>76 D<00000003FF800000000000003FFFF8000000000000FF -FFFE000000000003FFFFFF80000000000FFFFFFFE0000000003FFFFFFFF8000000007FFE -00FFFC00000000FFF0001FFE00000003FFC00007FF80000007FF000001FFC000000FFC00 -00007FE000001FF80000003FF000001FF00000001FF000003FE00000000FF800007FC000 -000007FC0000FF8000000003FE0000FF0000000001FE0001FF0000000001FF0003FE0000 -000000FF8003FC00000000007F8007FC00000000007FC007F800000000003FC00FF80000 -0000003FE00FF000000000001FE01FF000000000001FF01FF000000000001FF01FE00000 -0000000FF03FE000000000000FF83FE000000000000FF83FC0000000000007F83FC00000 -00000007F87FC0000000000007FC7FC0000000000007FC7FC0000000000007FC7F800000 -00000003FC7F80000000000003FCFF80000000000003FEFF80000000000003FEFF800000 -00000003FEFF80000000000003FEFF80000000000003FEFF80000000000003FEFF800000 -00000003FEFF80000000000003FEFF80000000000003FEFF80000000000003FEFF800000 -00000003FEFF80000000000003FEFF80000000000003FEFFC0000000000007FE7FC00000 -00000007FC7FC0000000000007FC7FC0000000000007FC7FC0000000000007FC7FC00000 -00000007FC7FE000000000000FFC3FE000000000000FF83FE000000000000FF83FF00000 -0000001FF81FF000000000001FF01FF000000000001FF01FF800000000003FF00FF80000 -0000003FE00FFC00000000007FE007FC00000000007FC007FE0000000000FFC003FE0000 -000000FF8003FF0000000001FF8001FF0000000001FF0001FF8000000003FF0000FFC000 -000007FE00007FE00000000FFC00003FF00000001FF800003FF80000003FF800001FFC00 -00007FF000000FFE000000FFE0000007FF000001FFC0000003FFC00007FF80000001FFF0 -001FFF000000007FFE00FFFC000000003FFFFFFFF8000000000FFFFFFFE00000000007FF -FFFFC00000000000FFFFFE0000000000003FFFF800000000000003FF8000000047567AD3 -54>79 D<FFFFFFFFC00000FFFFFFFFFC0000FFFFFFFFFF0000FFFFFFFFFFC000FFFFFFFF -FFF000FFFFFFFFFFF800FF800001FFFE00FF8000001FFF00FF80000007FF80FF80000001 -FFC0FF80000000FFE0FF800000003FE0FF800000001FF0FF800000001FF0FF800000000F -F8FF8000000007F8FF8000000007FCFF8000000003FCFF8000000003FCFF8000000003FE -FF8000000003FEFF8000000001FEFF8000000001FEFF8000000001FEFF8000000001FEFF -8000000001FEFF8000000003FEFF8000000003FEFF8000000003FCFF8000000003FCFF80 -00000007FCFF8000000007F8FF800000000FF8FF800000001FF0FF800000001FF0FF8000 -00003FE0FF80000000FFE0FF80000001FFC0FF80000007FF80FF8000001FFF00FF800001 -FFFE00FFFFFFFFFFF800FFFFFFFFFFF000FFFFFFFFFFC000FFFFFFFFFF0000FFFFFFFFFC -0000FFFFFFFFC00000FF800000000000FF800000000000FF800000000000FF8000000000 -00FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000 -FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF -800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF80 -0000000000FF800000000000FF800000000000FF800000000000FF800000000000FF8000 -00000000FF800000000000FF800000000000FF800000000000FF800000000000FF800000 -000000FF800000000000FF800000000000FF800000000000FF800000000000FF80000000 -0000375275D149>I<000007FF80000000007FFFF800000001FFFFFF00000007FFFFFFC0 -00001FFFFFFFF000003FFFFFFFFC00007FFFFFFFFE0000FFF800FFFE0001FFC0000FFE00 -03FF000003FC0007FE000000FC000FF80000003C000FF80000001C001FF00000000C001F -E000000000003FC000000000003FC000000000003FC000000000007F8000000000007F80 -00000000007F8000000000007F8000000000007F8000000000007F8000000000007F8000 -000000007FC000000000007FC000000000003FC000000000003FE000000000003FF00000 -0000001FF800000000001FFC00000000000FFE00000000000FFF000000000007FFC00000 -000003FFFC0000000001FFFF8000000001FFFFF8000000007FFFFF800000003FFFFFF000 -00001FFFFFFC00000007FFFFFF00000003FFFFFF800000007FFFFFC00000000FFFFFE000 -000000FFFFF0000000000FFFF80000000001FFFC00000000003FFE00000000000FFE0000 -00000007FF000000000003FF800000000001FF800000000000FF8000000000007FC00000 -0000007FC000000000003FC000000000003FE000000000003FE000000000001FE0000000 -00001FE000000000001FE000000000001FE000000000001FE000000000001FE000000000 -001FE000000000001FE000000000003FC000000000003FC000000000003FC06000000000 -7F807000000000FF807800000000FF007E00000001FF007F80000003FE00FFC0000007FC -00FFF800001FFC00FFFF00007FF8007FFFF003FFF0001FFFFFFFFFE00007FFFFFFFFC000 -03FFFFFFFF0000007FFFFFFE0000001FFFFFF800000001FFFFE0000000001FFE00000033 -567BD33F>83 D<0003FF8000001FFFE00000FFFFF80003FFFFFC000FFFFFFF001FFFFFFF -801FFC00FFC01FE0007FC01F80003FE01E00001FF01800000FF01000000FF000000007F8 -00000007F800000007F800000003FC00000003FC00000003FC00000003FC00000003FC00 -000003FC00000003FC00000003FC00000003FC00000003FC000003FFFC0000FFFFFC0007 -FFFFFC003FFFFFFC00FFFFFFFC01FFFF83FC07FFE003FC0FFE0003FC1FF80003FC3FE000 -03FC3FC00003FC7F800003FC7F000003FCFE000003FCFE000003FCFE000003FCFE000003 -FCFE000003FCFE000007FCFF00000FFC7F80000FFC7FC0003FFC7FE0007FFC3FFC03FFFC -3FFFFFFFFC1FFFFFFBFC0FFFFFE3FC07FFFF83FC03FFFC03FC00FFC0000026377AB537> -97 D<00001FFC00000000FFFFC0000003FFFFF000000FFFFFFC00001FFFFFFF00003FFF -FFFF80007FF003FF8000FF80007F8001FE00001F0003FC0000070007F80000030007F000 -0000000FE0000000001FE0000000001FC0000000003FC0000000003F80000000003F8000 -0000007F00000000007F00000000007F00000000007F0000000000FE0000000000FE0000 -000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000 -000000FE0000000000FE0000000000FE0000000000FF00000000007F00000000007F0000 -0000007F00000000007F80000000003F80000000003F80000000001FC0000000001FE000 -0000000FE0000000400FF0000000C007F8000003C003FC000007C003FE00001FC001FF80 -00FFC000FFE007FFC0007FFFFFFF80001FFFFFFE00000FFFFFFC000003FFFFF0000000FF -FF800000001FF800002A377BB533>99 D<000000001FE0000000001FE0000000001FE000 -0000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE000 -0000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE000 -0000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE000 -0000001FE0000000001FE0000000001FE0000000001FE0000000001FE0000000001FE000 -0000001FE0000000001FE0000000001FE0000000001FE0000000001FE000007F801FE000 -03FFF01FE0000FFFFC1FE0001FFFFF1FE0007FFFFF9FE000FFFFFFDFE001FFF00FFFE003 -FF8003FFE003FF0001FFE007FC0000FFE00FF800007FE00FF000003FE01FE000001FE01F -E000001FE03FC000001FE03F8000001FE03F8000001FE07F8000001FE07F0000001FE07F -0000001FE07F0000001FE0FE0000001FE0FE0000001FE0FE0000001FE0FE0000001FE0FE -0000001FE0FE0000001FE0FE0000001FE0FE0000001FE0FE0000001FE0FE0000001FE0FE -0000001FE0FE0000001FE07F0000001FE07F0000001FE07F0000001FE07F0000001FE03F -8000001FE03F8000001FE03FC000001FE01FC000003FE01FE000003FE00FF000007FE00F -F80000FFE007FC0001FFE007FE0003FFE003FF8007FFE001FFE03FDFE000FFFFFF9FE000 -7FFFFF1FE0003FFFFE1FE0000FFFF81FE00007FFE01FE00000FF0000002B567BD43B>I< -00007FC000000001FFF800000007FFFE0000001FFFFF0000003FFFFF8000007FFFFFC000 -00FFC07FE00001FF000FF00003FC0007F80007F80003F80007F00001FC000FE00000FC00 -1FE000007E001FC000007E001F8000003E003F8000003F003F0000001F007F0000001F00 -7F0000001F007E0000001F007E0000000F807E0000000F80FFFFFFFFFF80FFFFFFFFFF80 -FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80FC0000000000FC0000000000 -FC0000000000FE0000000000FE00000000007E00000000007E00000000007E0000000000 -7F00000000003F00000000003F80000000003F80000000001FC0000000001FC000000000 -0FE0000000000FF00000008007F80000038003FC0000078003FE00001F8001FF8000FF80 -00FFF00FFF80007FFFFFFF00003FFFFFFC00000FFFFFF8000003FFFFE0000000FFFF0000 -00001FF0000029377BB533>I<000001FFC000000FFFF800001FFFF800007FFFF80000FF -FFF80001FFFFF80003FF00F80007FC00080007F00000000FE00000001FC00000001FC000 -00003F800000003F800000003F800000003F800000007F800000007F800000007F800000 -007F800000007F800000007F800000007F800000007F800000007F800000007F80000000 -7F800000007F800000007F800000007F800000007F800000007F800000007F800000007F -800000FFFFFFFC00FFFFFFFC00FFFFFFFC00FFFFFFFC00FFFFFFFC00FFFFFFFC00007F80 -0000007F800000007F800000007F800000007F800000007F800000007F800000007F8000 -00007F800000007F800000007F800000007F800000007F800000007F800000007F800000 -007F800000007F800000007F800000007F800000007F800000007F800000007F80000000 -7F800000007F800000007F800000007F800000007F800000007F800000007F800000007F -800000007F800000007F800000007F800000007F800000007F800000007F800000007F80 -0000007F800000007F800000007F800000007F800000007F800000007F800000007F8000 -00007F800000007F80000025567ED523>I<00003FC0001FC00000FFF001FFC00003FFFC -0FFFC0000FFFFF7FFFE0001FFFFFFFFFE0003FFFFFFFFFE0007FE07FFFF000007F000FF8 -000000FE0007F0000001FC0003F8000001F80001F8000003F80001FC000003F00000FC00 -0003F00000FC000007F00000FE000007E000007E000007E000007E000007E000007E0000 -07E000007E000007E000007E000007E000007E000007E000007E000007E000007E000007 -F00000FE000003F00000FC000003F00000FC000003F80001FC000001F80001F8000001FC -0003F8000000FE0007F00000007F000FE0000000FFE07FE0000001FFFFFFC0000001FFFF -FF80000003FFFFFF00000003E3FFFC00000003E0FFF000000007E03FC000000007E00000 -00000007E0000000000007E0000000000007E0000000000007E0000000000007F0000000 -000003F0000000000003FC000000000003FFFFFFC0000001FFFFFFFE000000FFFFFFFF80 -0000FFFFFFFFE00001FFFFFFFFF80007FFFFFFFFFC000FFFFFFFFFFE001FF800007FFE00 -1FE0000007FF003FC0000001FF807F800000007F807F000000003F807F000000003FC0FE -000000001FC0FE000000001FC0FE000000001FC0FE000000001FC0FE000000001FC0FE00 -0000001FC07F000000003F807F800000007F807FC0000000FF803FE0000001FF001FF800 -0007FE000FFE00001FFC0007FFE001FFF80003FFFFFFFFF00000FFFFFFFFC000007FFFFF -FF8000001FFFFFFE00000003FFFFF0000000001FFE000000334E7DB439>I<FF00000000 -FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF -00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 -000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000 -0000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000 -00FF00000000FF00000000FF000FF800FF007FFF00FF01FFFFC0FF07FFFFE0FF0FFFFFF0 -FF1FFFFFF8FF3F807FF8FF7E001FFCFFFC0007FCFFF80003FEFFF00003FEFFE00001FEFF -E00001FFFFC00000FFFFC00000FFFF800000FFFF800000FFFF800000FFFF800000FFFF00 -0000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF0000 -00FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000 -FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FF -FF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF -000000FFFF000000FFFF000000FFFF000000FFFF000000FF285577D43B>I<FF80FF80FF -80FF80FF80FF80FF80FF80FF800000000000000000000000000000000000000000000000 -000000000000000000000000007F807F807F807F807F807F807F807F807F807F807F807F -807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F -807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F807F -807F807F807F807F80094F78CE1B>I<FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF085577D41B> -108 D<00000FF800FF007FFF00FF01FFFFC0FF07FFFFE0FF0FFFFFF0FF1FFFFFF8FF3F80 -7FF8FF7E001FFCFFFC0007FCFFF80003FEFFF00003FEFFE00001FEFFE00001FFFFC00000 -FFFFC00000FFFF800000FFFF800000FFFF800000FFFF800000FFFF000000FFFF000000FF -FF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF -000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF00 -0000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF0000 -00FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000 -FFFF000000FFFF000000FFFF000000FF283577B43B>110 D<00000FF000000000FFFF00 -000003FFFFC000000FFFFFF000001FFFFFF800003FFFFFFC00007FF00FFE0000FF8001FF -0001FF0000FF8003FC00003FC007F800001FE007F000000FE00FE0000007F00FE0000007 -F01FC0000003F81F80000001F83F80000001FC3F80000001FC7F00000000FE7F00000000 -FE7F00000000FE7E000000007EFE000000007FFE000000007FFE000000007FFE00000000 -7FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE00000000 -7FFE000000007FFF00000000FF7F00000000FE7F00000000FE7F00000000FE7F80000001 -FE3F80000001FC3FC0000003FC1FC0000003F81FE0000007F80FF000000FF00FF000000F -F007F800001FE003FC00003FC003FF0000FFC001FFC003FF8000FFF00FFF00007FFFFFFE -00001FFFFFF800000FFFFFF0000003FFFFC0000000FFFF000000001FF8000030377CB539 ->I<00001FF00000FF00FFFC0000FF03FFFF0000FF0FFFFF8000FF1FFFFFC000FF7FFFFF -E000FFFF00FFF000FFFC003FF800FFF0000FFC00FFE00007FC00FFC00003FE00FF800001 -FF00FF800000FF00FF000000FF00FF0000007F80FF0000007F80FF0000003FC0FF000000 -3FC0FF0000001FC0FF0000001FC0FF0000001FC0FF0000001FE0FF0000000FE0FF000000 -0FE0FF0000000FE0FF0000000FE0FF0000000FE0FF0000000FE0FF0000000FE0FF000000 -0FE0FF0000000FE0FF0000000FE0FF0000001FE0FF0000001FC0FF0000001FC0FF000000 -1FC0FF0000003FC0FF0000003F80FF0000007F80FF0000007F80FF000000FF00FF800001 -FF00FF800001FE00FFC00003FE00FFE0000FFC00FFF0001FF800FFF8007FF000FFFE01FF -E000FF7FFFFFC000FF3FFFFF8000FF1FFFFF0000FF07FFFE0000FF01FFF80000FF003FC0 -0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000000 -0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000000 -0000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF000000 -0000FF0000000000FF0000000000FF0000000000FF00000000002B4C76B43B>I<000003 -E0FE001FE0FE007FE0FE01FFE0FE03FFE0FE0FFFE0FE1FFFE0FE3FFC00FE3FE000FE7F80 -00FEFF0000FFFE0000FFFC0000FFF80000FFF00000FFE00000FFE00000FFC00000FFC000 -00FF800000FF800000FF800000FF800000FF000000FF000000FF000000FF000000FF0000 -00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 -00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000 -00FF000000FF000000FF000000FF000000FF000000FF000000FF0000001B3577B427> -114 D<0007FF8000003FFFF80000FFFFFF0001FFFFFFC007FFFFFFE00FFFFFFFE00FFC00 -FFE01FE0000FC03FC00003C03F800000C03F800000007F000000007F000000007F000000 -007F000000007F000000007F000000007F800000007F800000003FC00000003FF0000000 -1FFC0000001FFFC000000FFFFE000007FFFFC00003FFFFF00001FFFFFC00007FFFFE0000 -3FFFFF000007FFFF8000007FFFC0000003FFE00000007FE00000001FF00000000FF00000 -0007F800000007F800000003F800000003F800000003F800000003F800000003F8000000 -03F840000007F070000007F07800000FF07E00000FE0FFC0003FE0FFFC01FFC0FFFFFFFF -807FFFFFFF001FFFFFFE0003FFFFFC00007FFFF0000007FF000025377DB52C>I<007F80 -0000007F800000007F800000007F800000007F800000007F800000007F800000007F8000 -00007F800000007F800000007F800000007F800000007F800000007F800000007F800000 -FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF80007F80000000 -7F800000007F800000007F800000007F800000007F800000007F800000007F800000007F -800000007F800000007F800000007F800000007F800000007F800000007F800000007F80 -0000007F800000007F800000007F800000007F800000007F800000007F800000007F8000 -00007F800000007F800000007F800000007F800000007F800000007F800000007F800000 -007F800000007F800000007F800000007F800000007F800000007F800000007F80000000 -7FC00040007FC001C0003FE003C0003FF01FE0003FFFFFE0001FFFFFE0000FFFFF80000F -FFFE000003FFF0000001FF000023447EC229>I<FF000000FFFF000000FFFF000000FFFF -000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF00 -0000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF0000 -00FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000 -FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FF -FF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000001FFFF -000001FFFF000003FFFF000003FFFF000007FFFF80000FFF7F80001FFF7FC0007FFF7FF8 -03FEFF3FFFFFFCFF3FFFFFF8FF1FFFFFE0FF0FFFFF80FF03FFFE00FF00FFE00000283577 -B33B>I<FE00000000FEFF00000000FE7F00000001FC7F00000001FC7F80000001FC3F80 -000003F83FC0000003F81FC0000007F81FC0000007F00FE0000007F00FE000000FE00FF0 -00000FE007F000000FE007F800001FC003F800001FC003F800003F8003FC00003F8001FC -00003F8001FE00007F0000FE00007F0000FE0000FE00007F0000FE00007F0000FE00007F -8001FC00003F8001FC00003F8001F800001FC003F800001FC003F800000FC003F000000F -E007F000000FE007E0000007F007E0000007F00FE0000003F00FC0000003F80FC0000003 -F81F80000001F81F80000001FC1F80000000FC3F00000000FC3F000000007E3F00000000 -7E7E000000007E7E000000003E7C000000003F7C000000001F7C000000001FF800000000 -0FF8000000000FF0000000000FF00000000007F00000000007E00000000007E000000000 -07C0000000000FC0000000000FC0000000000F80000000001F80000000001F0000000000 -3F00000000003F00000000003E00000000007E00000000007C0000000000FC0000000000 -FC0000000001F80000000001F80000003003F00000003E07F00000003FFFE00000003FFF -C00000003FFFC00000003FFF800000003FFF0000000007FC000000002F4C7EB334>121 -D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fs ecsi1200 12 9 -/Fs 9 116 df<3FC07F807F807F807F807F80FF00FF000A0877871B>46 -D<0000007F8000000003FFF00000000FFFFC0000003FFFFE0000007FFFFF000000FFFFFF -800003FF81FF800007FC007FC00007F8003FC0000FE0001FE0001FC0000FE0003F80000F -E0003F80000FE0007F000007F0007E000007F000FE000007F000FC000007F001FC000007 -F001F8000007F003F8000007F003F8000007F007F0000007F007F0000007F007F0000007 -F00FE0000007F00FE0000007E00FE0000007E00FC000000FE01FC000000FE01FC000000F -E01FC000000FE01FC000000FE03F8000001FC03F8000001FC03F8000001FC03F8000001F -C07F0000003F807F0000003F807F0000003F807F0000003F807F0000003F807F0000007F -00FE0000007F00FE0000007F00FE000000FE00FE000000FE00FE000000FE00FE000001FC -00FE000001FC00FE000001FC00FE000003F800FE000003F800FE000007F000FE000007F0 -00FE00000FE000FE00000FE000FF00001FC0007F00003F80007F00007F80007F8000FF00 -003FC001FE00003FE007FC00003FF81FF800001FFFFFF000000FFFFFE0000007FFFFC000 -0003FFFF00000000FFFC000000001FE00000002C4577C231>48 D<00000000C000000003 -C000000007C00000001F800000007F80000007FF80000FFFFF80000FFFFF80000FFFFF00 -000FFFFF00001FFEFF00001FF0FF00000000FF00000001FE00000001FE00000001FE0000 -0001FE00000001FE00000003FC00000003FC00000003FC00000003FC00000007F8000000 -07F800000007F800000007F800000007F80000000FF00000000FF00000000FF00000000F -F00000000FF00000001FE00000001FE00000001FE00000001FE00000003FC00000003FC0 -0000003FC00000003FC00000003FC00000007F800000007F800000007F800000007F8000 -00007F80000000FF00000000FF00000000FF00000000FF00000000FF00000001FE000000 -01FE00000001FE00000001FE00000003FC00000003FC00000003FC00000003FC00000003 -FC00000007F800007FFFFFFF807FFFFFFF807FFFFFFF807FFFFFFF80FFFFFFFF00FFFFFF -FF00224377C231>I<0000001FF000000000FFFE00000003FFFF8000000FFFFFE000001F -FFFFF000003FFFFFF800007FC07FF80000FE000FFC0001FC0007FE0003F80003FE0007F0 -0001FE0007E00001FF000FC00000FF001FC00000FF001F800000FF003F000000FF003F00 -0000FF003E000000FF001E000000FF001E000000FF000C000000FF0004000000FF000000 -0000FE0000000001FE0000000001FE0000000001FC0000000003FC0000000003F8000000 -0007F8000000000FF0000000000FE0000000001FE0000000003FC0000000007F80000000 -00FF0000000001FE0000000003FC0000000007F8000000000FF0000000001FE000000000 -3F80000000007F0000000000FE0000000003FC0000000007F0000000000FE0000000001F -C0000000007F8000000000FE0000000001FC0000000003F80000000007F0000000000FE0 -000000003F80000000007F0000000000FE0000000001FC0000000003F80000000007E000 -0000001FC0000000003F80000000007FFFFFFFFE007FFFFFFFFE007FFFFFFFFE007FFFFF -FFFE00FFFFFFFFFC00FFFFFFFFFC0030437BC231>I<0001FFFFFFF000000003FFFFFFFE -00000003FFFFFFFFC0000003FFFFFFFFF0000003FFFFFFFFF8000007FFFFFFFFFC000007 -F800007FFE000007F800000FFF000007F8000003FF800007F8000000FF80000FF0000000 -7FC0000FF00000007FC0000FF00000003FE0000FF00000003FE0000FF00000003FE0001F -E00000001FE0001FE00000001FE0001FE00000001FE0001FE00000003FE0001FE0000000 -3FC0003FC00000003FC0003FC00000007FC0003FC00000007F80003FC0000000FF80007F -80000001FF00007F80000003FE00007F80000007FE00007F8000000FFC00007F8000003F -F80000FF000000FFF00000FF00000FFFC00000FFFFFFFFFF800000FFFFFFFFFE000000FF -FFFFFFF8000001FFFFFFFFE0000001FFFFFFFF00000001FFFFFFFC00000001FE0001FC00 -000003FC0001FE00000003FC0001FE00000003FC0000FE00000003FC0000FF00000003FC -00007F00000007F800007F80000007F800007F80000007F800003F80000007F800003FC0 -000007F800003FC000000FF000001FC000000FF000001FE000000FF000001FE000000FF0 -00000FF000000FF000000FF000001FE000000FF000001FE0000007F800001FE0000007F8 -00001FE0000003F800003FC0000003FC00003FC0000003FC00003FC0000001FC00003FC0 -000001FE00003FC0000001FE00007F80000000FF00007F80000000FF00007F80000000FF -00007F800000007F80007F800000007F8000FF000000007F8000FF000000003FC0003B45 -77C43F>82 D<00000FFC000000FFFF800003FFFFC0001FFFFFF0003FFFFFF8003FFFFFF8 -007FE00FFC007F0003FE00780003FE00600001FE00000001FE00000001FF00000000FF00 -000000FF00000000FF00000001FE00000001FE00000001FE00000001FE00000001FE0000 -0003FC00000FFFFC0001FFFFFC000FFFFFFC003FFFFFFC00FFFFFFF803FFFC07F807FF80 -07F80FFC0007F81FF00007F83FC0000FF03F80000FF07F00000FF07F00000FF0FE00001F -E0FE00001FE0FE00003FE0FF00003FE0FF0000FFE0FF8003FFC07FF01FFFC07FFFFFFFC0 -7FFFFFFFC03FFFFF3FC01FFFFC7F800FFFE07F8003FE000000282F7AAD2F>97 -D<000007F80000003FFE000000FFFF800003FFFFC00007FFFFE0000FFFFFF0003FF81FF0 -007FC007F800FF8003F800FE0001F801FC0001F803F80000FC07F00000FC07F00000FC0F -E00000FC0FC000007C1FC000007C1F8000007C3FFFFFFFFC3FFFFFFFF83FFFFFFFF87FFF -FFFFF87FFFFFFFF87FFFFFFFF87E00000000FE00000000FE00000000FE00000000FE0000 -0000FE00000000FE00000000FE00000000FE000000007F000000007F000000007F000000 -007F800000403FC00001C03FE00007C01FF0003F800FFC01FF800FFFFFFF8007FFFFFF00 -03FFFFFC0000FFFFF000003FFF8000000FFC0000262F79AD2B>101 -D<0001FE0001FE0001FE0001FE0001FE0003FC0003FC0003FC0003FC0007F80007F80007 -F80007F80007F8000FF0000FF0000FF0000FF0000FF0001FE0001FE0001FE0001FE0001F -E0003FC0003FC0003FC0003FC0007F80007F80007F80007F80007F8000FF0000FF0000FF -0000FF0000FF0001FE0001FE0001FE0001FE0003FC0003FC0003FC0003FC0003FC0007F8 -0007F80007F80007F80007F8000FF0000FF0000FF0000FF0000FF0001FE0001FE0001FE0 -001FE0003FC0003FC0003FC0003FC0003FC0007F80007F80007F80007F80007F8000FF00 -00FF0000174979C817>108 D<00001FF8000000FFFF000003FFFFC0000FFFFFF0001FFF -FFF8003FFFFFF0007FC01FF000FF0003F000FE0000E001FC00006001FC00000003F80000 -0003F800000003F800000003F800000003FC00000003FC00000003FE00000003FFE00000 -01FFFE000001FFFFC00000FFFFF000007FFFF800003FFFFC00001FFFFE000007FFFF0000 -00FFFF00000007FF80000001FF800000007F800000007F800000003F800000003F800000 -003F800000007F000000007F002000007F00300000FE007C0001FE007F0003FC007FE01F -F800FFFFFFF000FFFFFFE0007FFFFFC0001FFFFF800007FFFE0000007FE00000252F7CAD -25>115 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Ft ecss2488 24.88 15 -/Ft 15 122 df[<FFE00000000000000000FFE00000000000000000FFE0000000000000 -0000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE00000 -000000000000FFE00000000000000000FFE00000000000000000FFE00000000000000000 -FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE000000000 -00000000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE0 -0000000000000000FFE00000000000000000FFE00000000000000000FFE0000000000000 -0000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE00000 -000000000000FFE00000000000000000FFE00000000000000000FFE00000000000000000 -FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE000000000 -00000000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE0 -0000000000000000FFE00000000000000000FFE00000000000000000FFE0000000000000 -0000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE00000 -000000000000FFE00000000000000000FFE00000000000000000FFE00000000000000000 -FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE000000000 -00000000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE0 -0000000000000000FFE00000000000000000FFE00000000000000000FFE0000000000000 -0000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE00000 -000000000000FFE00000000000000000FFE00000000000000000FFE00000000000000000 -FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE000000000 -00000000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE0 -0000000000000000FFE00000000000000000FFE00000000000000000FFE0000000000000 -0000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE00000 -000000000000FFE00000000000000000FFE00000000000000000FFE00000000000000000 -FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE000000000 -00000000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE0 -0000000000000000FFE00000000000000000FFE00000000000000000FFE0000000000000 -0000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE00000 -000000000000FFE00000000000000000FFE00000000000000000FFE00000000000000000 -FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE000000000 -00000000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE0 -0000000000000000FFE00000000000000000FFE00000000000000000FFE0000000000000 -0000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE00000 -000000000000FFE00000000000000000FFE00000000000000000FFE00000000000000000 -FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE000000000 -00000000FFE00000000000000000FFE00000000000000000FFE00000000000000000FFE0 -0000000000000000FFE00000000000000000FFE00000000000000000FFE0000000000000 -0000FFE00000000000000000FFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFF80FFFFFFFF -FFFFFFFFFF80FFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFF80 -FFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFF80FFFFFFFFFFFF -FFFFFF80>73 140 108 267 102 76 D[<FFFE00000000000000000000001FFFC0FFFF00 -000000000000000000003FFFC0FFFF00000000000000000000003FFFC0FFFF0000000000 -0000000000003FFFC0FFFF80000000000000000000007FFFC0FFFF800000000000000000 -00007FFFC0FFFF80000000000000000000007FFFC0FFFFC000000000000000000000FFFF -C0FFFFC000000000000000000000FFFFC0FFFFE000000000000000000001FFFFC0FFFFE0 -00000000000000000001FFFFC0FFDFE000000000000000000001FEFFC0FFDFF000000000 -000000000003FEFFC0FFCFF000000000000000000003FCFFC0FFCFF00000000000000000 -0003FCFFC0FFCFF800000000000000000007FCFFC0FFCFF800000000000000000007FCFF -C0FFC7FC0000000000000000000FF8FFC0FFC7FC0000000000000000000FF8FFC0FFC7FC -0000000000000000000FF8FFC0FFC3FE0000000000000000001FF0FFC0FFC3FE00000000 -00000000001FF0FFC0FFC3FE0000000000000000001FF0FFC0FFC1FF0000000000000000 -003FE0FFC0FFC1FF0000000000000000003FE0FFC0FFC1FF0000000000000000003FE0FF -C0FFC0FF8000000000000000007FC0FFC0FFC0FF8000000000000000007FC0FFC0FFC0FF -C00000000000000000FFC0FFC0FFC07FC00000000000000000FF80FFC0FFC07FC0000000 -0000000000FF80FFC0FFC07FE00000000000000001FF80FFC0FFC03FE000000000000000 -01FF00FFC0FFC03FE00000000000000001FF00FFC0FFC03FF00000000000000003FF00FF -C0FFC01FF00000000000000003FE00FFC0FFC01FF80000000000000007FE00FFC0FFC00F -F80000000000000007FC00FFC0FFC00FF80000000000000007FC00FFC0FFC00FFC000000 -000000000FFC00FFC0FFC007FC000000000000000FF800FFC0FFC007FC00000000000000 -0FF800FFC0FFC007FE000000000000001FF800FFC0FFC003FE000000000000001FF000FF -C0FFC003FF000000000000003FF000FFC0FFC003FF000000000000003FF000FFC0FFC001 -FF000000000000003FE000FFC0FFC001FF800000000000007FE000FFC0FFC001FF800000 -000000007FE000FFC0FFC000FF800000000000007FC000FFC0FFC000FFC0000000000000 -FFC000FFC0FFC0007FC0000000000000FF8000FFC0FFC0007FC0000000000000FF8000FF -C0FFC0007FE0000000000001FF8000FFC0FFC0003FE0000000000001FF0000FFC0FFC000 -3FF0000000000003FF0000FFC0FFC0003FF0000000000003FF0000FFC0FFC0001FF00000 -00000003FE0000FFC0FFC0001FF8000000000007FE0000FFC0FFC0001FF8000000000007 -FE0000FFC0FFC0000FF8000000000007FC0000FFC0FFC0000FFC00000000000FFC0000FF -C0FFC0000FFC00000000000FFC0000FFC0FFC00007FE00000000001FF80000FFC0FFC000 -07FE00000000001FF80000FFC0FFC00003FE00000000001FF00000FFC0FFC00003FF0000 -0000003FF00000FFC0FFC00003FF00000000003FF00000FFC0FFC00001FF00000000003F -E00000FFC0FFC00001FF80000000007FE00000FFC0FFC00001FF80000000007FE00000FF -C0FFC00000FF80000000007FC00000FFC0FFC00000FFC000000000FFC00000FFC0FFC000 -007FC000000000FF800000FFC0FFC000007FE000000001FF800000FFC0FFC000007FE000 -000001FF800000FFC0FFC000003FE000000001FF000000FFC0FFC000003FF000000003FF -000000FFC0FFC000003FF000000003FF000000FFC0FFC000001FF000000003FE000000FF -C0FFC000001FF800000007FE000000FFC0FFC000001FF800000007FE000000FFC0FFC000 -000FF800000007FC000000FFC0FFC000000FFC0000000FFC000000FFC0FFC0000007FC00 -00000FF8000000FFC0FFC0000007FE0000001FF8000000FFC0FFC0000007FE0000001FF8 -000000FFC0FFC0000003FE0000001FF0000000FFC0FFC0000003FF0000003FF0000000FF -C0FFC0000003FF0000003FF0000000FFC0FFC0000001FF0000003FE0000000FFC0FFC000 -0001FF8000007FE0000000FFC0FFC0000001FF8000007FE0000000FFC0FFC0000000FF80 -00007FC0000000FFC0FFC0000000FFC00000FFC0000000FFC0FFC00000007FC00000FF80 -000000FFC0FFC00000007FE00001FF80000000FFC0FFC00000007FE00001FF80000000FF -C0FFC00000003FE00001FF00000000FFC0FFC00000003FF00003FF00000000FFC0FFC000 -00003FF00003FF00000000FFC0FFC00000001FF00003FE00000000FFC0FFC00000001FF8 -0007FE00000000FFC0FFC00000000FF80007FC00000000FFC0FFC00000000FF80007FC00 -000000FFC0FFC00000000FFC000FFC00000000FFC0FFC000000007FC000FF800000000FF -C0FFC000000007FC000FF800000000FFC0FFC000000007FE001FF800000000FFC0FFC000 -000003FE001FF000000000FFC0FFC000000003FF003FF000000000FFC0FFC000000001FF -003FE000000000FFC0FFC000000001FF003FE000000000FFC0FFC000000001FF807FE000 -000000FFC0FFC000000000FF807FC000000000FFC0FFC000000000FF807FC000000000FF -C0FFC000000000FFC0FFC000000000FFC0FFC0000000007FC0FF8000000000FFC0FFC000 -0000007FC0FF8000000000FFC0FFC0000000007FE1FF8000000000FFC0FFC0000000003F -E1FF0000000000FFC0FFC0000000003FE1FF0000000000FFC0FFC0000000001FF3FE0000 -000000FFC0FFC0000000001FF3FE0000000000FFC0FFC0000000001FF3FE0000000000FF -C0FFC0000000000FF3FC0000000000FFC0FFC0000000000FFFFC0000000000FFC0FFC000 -0000000FFFFC0000000000FFC0FFC00000000007FFF80000000000FFC0FFC00000000007 -FFF80000000000FFC0FFC00000000003FFF00000000000FFC0FFC00000000003FFF00000 -000000FFC0FFC00000000003FFF00000000000FFC0FFC00000000001FFE00000000000FF -C0FFC00000000001FFE00000000000FFC0FFC00000000001FFE00000000000FFC0FFC000 -00000000FFC00000000000FFC0FFC0000000000000000000000000FFC0FFC00000000000 -00000000000000FFC0FFC0000000000000000000000000FFC0>122 -140 107 267 165 I[<0000000000000FFFC0000000000000000000000001FFFFFE0000 -0000000000000000000FFFFFFFC0000000000000000000007FFFFFFFF800000000000000 -000001FFFFFFFFFE00000000000000000007FFFFFFFFFF8000000000000000001FFFFFFF -FFFFE000000000000000007FFFFFFFFFFFF80000000000000001FFFFFFFFFFFFFE000000 -0000000003FFFFF8007FFFFF0000000000000007FFFF800007FFFF800000000000001FFF -FC000000FFFFE00000000000003FFFE00000001FFFF00000000000007FFF8000000007FF -F8000000000000FFFE0000000001FFFC000000000001FFFC0000000000FFFE0000000000 -03FFF000000000003FFF000000000007FFE000000000001FFF80000000000FFFC0000000 -00000FFFC0000000001FFF00000000000003FFE0000000003FFE00000000000001FFF000 -0000007FFC00000000000000FFF800000000FFF8000000000000007FFC00000000FFF000 -0000000000003FFC00000001FFE0000000000000001FFE00000003FFE000000000000000 -1FFF00000003FFC0000000000000000FFF00000007FF800000000000000007FF8000000F -FF000000000000000003FFC000000FFF000000000000000003FFC000001FFE0000000000 -00000001FFE000003FFC000000000000000000FFF000003FFC000000000000000000FFF0 -00007FF80000000000000000007FF800007FF80000000000000000007FF80000FFF00000 -000000000000003FFC0000FFE00000000000000000001FFC0001FFE00000000000000000 -001FFE0001FFE00000000000000000001FFE0001FFC00000000000000000000FFE0003FF -C00000000000000000000FFF0003FF8000000000000000000007FF0007FF800000000000 -0000000007FF8007FF0000000000000000000003FF8007FF0000000000000000000003FF -800FFF0000000000000000000003FFC00FFE0000000000000000000001FFC00FFE000000 -0000000000000001FFC01FFE0000000000000000000001FFE01FFE000000000000000000 -0001FFE01FFC0000000000000000000000FFE01FFC0000000000000000000000FFE03FFC -0000000000000000000000FFF03FFC0000000000000000000000FFF03FF8000000000000 -00000000007FF03FF800000000000000000000007FF03FF800000000000000000000007F -F07FF800000000000000000000007FF87FF800000000000000000000007FF87FF8000000 -00000000000000007FF87FF800000000000000000000007FF87FF0000000000000000000 -00003FF87FF000000000000000000000003FF87FF000000000000000000000003FF8FFF0 -00000000000000000000003FFCFFF000000000000000000000003FFCFFF0000000000000 -00000000003FFCFFF000000000000000000000003FFCFFF000000000000000000000003F -FCFFF000000000000000000000003FFCFFF000000000000000000000003FFCFFF0000000 -00000000000000003FFCFFF000000000000000000000003FFCFFF0000000000000000000 -00003FFCFFF000000000000000000000003FFCFFF000000000000000000000003FFCFFF0 -00000000000000000000003FFCFFF000000000000000000000003FFCFFF0000000000000 -00000000003FFCFFF000000000000000000000003FFCFFF800000000000000000000007F -FCFFF800000000000000000000007FFCFFF800000000000000000000007FFC7FF8000000 -00000000000000007FF87FF800000000000000000000007FF87FF8000000000000000000 -00007FF87FF800000000000000000000007FF87FF800000000000000000000007FF87FFC -0000000000000000000000FFF87FFC0000000000000000000000FFF83FFC000000000000 -0000000000FFF03FFC0000000000000000000000FFF03FFC0000000000000000000000FF -F03FFE0000000000000000000001FFF01FFE0000000000000000000001FFE01FFE000000 -0000000000000001FFE01FFF0000000000000000000003FFE01FFF000000000000000000 -0003FFE00FFF0000000000000000000003FFC00FFF0000000000000000000003FFC00FFF -8000000000000000000007FFC007FF8000000000000000000007FF8007FFC00000000000 -000000000FFF8007FFC00000000000000000000FFF8003FFC00000000000000000000FFF -0003FFE00000000000000000001FFF0003FFE00000000000000000001FFF0001FFF00000 -000000000000003FFE0001FFF00000000000000000003FFE0000FFF80000000000000000 -007FFC0000FFF80000000000000000007FFC00007FFC000000000000000000FFF800007F -FC000000000000000000FFF800003FFE000000000000000001FFF000003FFE0000000000 -00000001FFF000001FFF000000000000000003FFE000000FFF800000000000000007FFC0 -00000FFF800000000000000007FFC0000007FFC0000000000000000FFF80000007FFE000 -0000000000001FFF80000003FFF0000000000000003FFF00000001FFF800000000000000 -7FFE00000000FFF8000000000000007FFC00000000FFFC00000000000000FFFC00000000 -7FFE00000000000001FFF8000000003FFF00000000000003FFF0000000001FFF80000000 -000007FFE0000000000FFFE000000000001FFFC00000000007FFF000000000003FFF8000 -00000003FFF800000000007FFF000000000001FFFE0000000001FFFE000000000000FFFF -0000000003FFFC0000000000007FFFC00000000FFFF80000000000003FFFF00000003FFF -F00000000000001FFFFC000000FFFFE000000000000007FFFF800007FFFF800000000000 -0003FFFFF8007FFFFF0000000000000001FFFFFFFFFFFFFE00000000000000007FFFFFFF -FFFFF800000000000000001FFFFFFFFFFFE0000000000000000007FFFFFFFFFF80000000 -000000000001FFFFFFFFFE000000000000000000007FFFFFFFF800000000000000000000 -0FFFFFFFC00000000000000000000001FFFFFE0000000000000000000000000FFFC00000 -00000000>118 146 118 270 139 79 D[<FFFFFFFFFFFFE000000000FFFFFFFFFFFFFF -00000000FFFFFFFFFFFFFFE0000000FFFFFFFFFFFFFFFC000000FFFFFFFFFFFFFFFF0000 -00FFFFFFFFFFFFFFFFC00000FFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFC0000FFFF -FFFFFFFFFFFFFE0000FFE000000000FFFFFF8000FFE00000000007FFFFC000FFE0000000 -0000FFFFE000FFE000000000003FFFF000FFE000000000000FFFF800FFE0000000000003 -FFFC00FFE0000000000000FFFE00FFE00000000000007FFF00FFE00000000000003FFF00 -FFE00000000000000FFF80FFE000000000000007FFC0FFE000000000000003FFE0FFE000 -000000000003FFE0FFE000000000000001FFF0FFE000000000000000FFF0FFE000000000 -000000FFF8FFE0000000000000007FF8FFE0000000000000003FFCFFE000000000000000 -3FFCFFE0000000000000001FFCFFE0000000000000001FFEFFE0000000000000001FFEFF -E0000000000000000FFEFFE0000000000000000FFEFFE0000000000000000FFEFFE00000 -00000000000FFFFFE0000000000000000FFFFFE00000000000000007FFFFE00000000000 -000007FFFFE00000000000000007FFFFE00000000000000007FFFFE00000000000000007 -FFFFE00000000000000007FFFFE00000000000000007FFFFE0000000000000000FFFFFE0 -000000000000000FFFFFE0000000000000000FFEFFE0000000000000000FFEFFE0000000 -000000000FFEFFE0000000000000001FFEFFE0000000000000001FFEFFE0000000000000 -001FFCFFE0000000000000003FFCFFE0000000000000003FFCFFE0000000000000007FF8 -FFE000000000000000FFF8FFE000000000000000FFF0FFE000000000000001FFF0FFE000 -000000000003FFE0FFE000000000000003FFE0FFE000000000000007FFC0FFE000000000 -00000FFF80FFE00000000000003FFF00FFE00000000000007FFF00FFE0000000000000FF -FE00FFE0000000000003FFFC00FFE000000000000FFFF800FFE000000000003FFFF000FF -E00000000000FFFFE000FFE00000000007FFFFC000FFE000000000FFFFFF8000FFFFFFFF -FFFFFFFFFE0000FFFFFFFFFFFFFFFFFC0000FFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF -FFC00000FFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFC000000FFFFFFFFFFFFFFE00000 -00FFFFFFFFFFFFFF00000000FFFFFFFFFFFFE000000000FFE0000000000000000000FFE0 -000000000000000000FFE0000000000000000000FFE0000000000000000000FFE0000000 -000000000000FFE0000000000000000000FFE0000000000000000000FFE0000000000000 -000000FFE0000000000000000000FFE0000000000000000000FFE0000000000000000000 -FFE0000000000000000000FFE0000000000000000000FFE0000000000000000000FFE000 -0000000000000000FFE0000000000000000000FFE0000000000000000000FFE000000000 -0000000000FFE0000000000000000000FFE0000000000000000000FFE000000000000000 -0000FFE0000000000000000000FFE0000000000000000000FFE0000000000000000000FF -E0000000000000000000FFE0000000000000000000FFE0000000000000000000FFE00000 -00000000000000FFE0000000000000000000FFE0000000000000000000FFE00000000000 -00000000FFE0000000000000000000FFE0000000000000000000FFE00000000000000000 -00FFE0000000000000000000FFE0000000000000000000FFE0000000000000000000FFE0 -000000000000000000FFE0000000000000000000FFE0000000000000000000FFE0000000 -000000000000FFE0000000000000000000FFE0000000000000000000FFE0000000000000 -000000FFE0000000000000000000FFE0000000000000000000FFE0000000000000000000 -FFE0000000000000000000FFE0000000000000000000FFE0000000000000000000FFE000 -0000000000000000FFE0000000000000000000FFE0000000000000000000FFE000000000 -0000000000FFE0000000000000000000FFE0000000000000000000FFE000000000000000 -0000FFE0000000000000000000FFE0000000000000000000FFE0000000000000000000FF -E0000000000000000000>88 140 107 267 120 I[<0000000007FFF800000000000000 -00FFFFFFE000000000000007FFFFFFFE0000000000003FFFFFFFFFC00000000000FFFFFF -FFFFF00000000003FFFFFFFFFFFC000000000FFFFFFFFFFFFF000000001FFFFFFFFFFFFF -C00000007FFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFC000001FFFFFC0007FFFFFE0000 -03FFFFC000003FFFFE000007FFFE00000003FFFE00000FFFF000000000FFFC00001FFFE0 -000000001FFC00003FFF800000000007FC00007FFE000000000003FC00007FFC00000000 -0000FC0000FFF80000000000003C0001FFF0000000000000180001FFE000000000000000 -0003FFC0000000000000000003FFC0000000000000000007FF80000000000000000007FF -0000000000000000000FFF0000000000000000000FFE0000000000000000000FFE000000 -0000000000001FFC0000000000000000001FFC0000000000000000001FFC000000000000 -0000001FFC0000000000000000003FF80000000000000000003FF8000000000000000000 -3FF80000000000000000003FF80000000000000000003FF80000000000000000003FF800 -00000000000000003FF80000000000000000003FF80000000000000000003FF800000000 -00000000003FFC0000000000000000003FFC0000000000000000001FFC00000000000000 -00001FFC0000000000000000001FFE0000000000000000001FFE0000000000000000000F -FF0000000000000000000FFF0000000000000000000FFF80000000000000000007FFC000 -0000000000000007FFC0000000000000000003FFE0000000000000000003FFF000000000 -0000000001FFF8000000000000000001FFFE000000000000000000FFFF00000000000000 -00007FFF8000000000000000003FFFE000000000000000003FFFF800000000000000001F -FFFE00000000000000000FFFFFE00000000000000007FFFFFC0000000000000003FFFFFF -C000000000000001FFFFFFFC000000000000007FFFFFFF800000000000003FFFFFFFF800 -00000000001FFFFFFFFF80000000000007FFFFFFFFF0000000000001FFFFFFFFFC000000 -0000007FFFFFFFFF0000000000001FFFFFFFFFC0000000000003FFFFFFFFE00000000000 -007FFFFFFFF800000000000007FFFFFFFC000000000000007FFFFFFE0000000000000007 -FFFFFF8000000000000000FFFFFFC0000000000000000FFFFFE00000000000000001FFFF -F000000000000000003FFFF000000000000000000FFFF8000000000000000007FFFC0000 -00000000000001FFFE000000000000000000FFFF0000000000000000007FFF0000000000 -000000001FFF8000000000000000001FFF8000000000000000000FFFC000000000000000 -0007FFC0000000000000000003FFE0000000000000000001FFE0000000000000000001FF -F0000000000000000000FFF0000000000000000000FFF00000000000000000007FF80000 -000000000000007FF80000000000000000007FF80000000000000000003FF80000000000 -000000003FF80000000000000000003FFC0000000000000000001FFC0000000000000000 -001FFC0000000000000000001FFC0000000000000000001FFC0000000000000000001FFC -0000000000000000001FFC0000000000000000001FFC0000000000000000001FFC000000 -0000000000001FFC0000000000000000001FFC0000000000000000001FFC000000000000 -0000003FF80000000000000000003FF80000000000000000003FF8000000000000000000 -3FF80000000000000000007FF00000000000000000007FF0000000000000000000FFF000 -0000000000000000FFE0000000000000000001FFE0000000000000000001FFE030000000 -0000000003FFC0780000000000000003FFC07C0000000000000007FF807F000000000000 -000FFF807FC00000000000001FFF007FE00000000000003FFE007FF80000000000007FFE -00FFFE000000000000FFFC00FFFF800000000003FFF800FFFFF00000000007FFF0007FFF -FE000000001FFFE0001FFFFFC00000007FFFC0000FFFFFFC000003FFFF800003FFFFFFF0 -003FFFFF000000FFFFFFFFFFFFFFFE0000007FFFFFFFFFFFFFFC0000001FFFFFFFFFFFFF -F000000003FFFFFFFFFFFFE000000000FFFFFFFFFFFF80000000003FFFFFFFFFFE000000 -000007FFFFFFFFF80000000000007FFFFFFFE000000000000007FFFFFE00000000000000 -001FFFE000000000>86 146 120 270 105 83 D<0000007FFE00000000001FFFFFE000 -000000FFFFFFF800000007FFFFFFFE0000003FFFFFFFFF000000FFFFFFFFFFC00003FFFF -FFFFFFE0000FFFFFFFFFFFF0001FFFFFFFFFFFF8001FFFFF0003FFFC001FFFE000007FFE -001FFF0000003FFF000FF80000000FFF800FE000000007FF800F8000000003FFC00E0000 -000003FFC0080000000001FFE0000000000000FFE0000000000000FFF00000000000007F -F00000000000007FF00000000000003FF80000000000003FF80000000000003FF8000000 -0000003FF80000000000001FFC0000000000001FFC0000000000001FFC0000000000001F -FC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000 -0000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001F -FC0000000000001FFC0000000000001FFC00000000003FFFFC000000003FFFFFFC000000 -0FFFFFFFFC0000007FFFFFFFFC000007FFFFFFFFFC00001FFFFFFFFFFC0000FFFFFFFFFF -FC0003FFFFFFFFFFFC000FFFFFFC001FFC001FFFFF00001FFC003FFFF000001FFC00FFFF -8000001FFC01FFFC0000001FFC03FFF00000001FFC07FFC00000001FFC0FFF000000001F -FC0FFE000000001FFC1FFC000000001FFC3FF8000000001FFC3FF0000000001FFC7FE000 -0000001FFC7FC0000000001FFC7FC0000000001FFCFFC0000000001FFCFF80000000001F -FCFF80000000001FFCFF80000000001FFCFF80000000001FFCFF80000000003FFCFF8000 -0000003FFCFF80000000003FFCFFC0000000007FFCFFC000000000FFFC7FE000000000FF -FC7FE000000001FFFC7FF000000003FFFC7FF80000000FFFFC3FFE0000001FFFFC3FFF80 -00007FFFFC1FFFE00003FFFFFC1FFFFE003FFFDFFC0FFFFFFFFFFF9FFC07FFFFFFFFFE1F -FC07FFFFFFFFFC1FFC03FFFFFFFFF01FFC01FFFFFFFFC01FFC00FFFFFFFE001FFC003FFF -FFF0001FFC001FFFFF00001FFC0003FFC0000000003E5A75D85B>97 -D<00000003FF800000000000003FFFF8000000000000FFFFFE000000000003FFFFFF8000 -0000000FFFFFFFE0000000003FFFFFFFF8000000007FFFFFFFFC00000000FFFFFFFFFE00 -000001FFFFFFFFFF00000003FFFE00FFFF80000007FFE0001FFFC000000FFF800003FFE0 -00001FFF000001FFE000003FFC0000007FF000007FF80000003FF800007FF00000001FF8 -0000FFE00000000FFC0001FFC000000007FC0001FF8000000003FE0003FF0000000003FE -0003FE0000000001FE0007FE0000000000FF0007FC0000000000FF000FFC00000000007F -000FF800000000007F801FF800000000007F801FF000000000003F801FF000000000003F -803FE000000000003FC03FE000000000001FC03FE000000000001FC03FC000000000001F -C07FC000000000001FC07FC000000000001FC07F8000000000000FE07F8000000000000F -E07FFFFFFFFFFFFFFFE0FFFFFFFFFFFFFFFFE0FFFFFFFFFFFFFFFFE0FFFFFFFFFFFFFFFF -E0FFFFFFFFFFFFFFFFE0FFFFFFFFFFFFFFFFE0FFFFFFFFFFFFFFFFE0FFFFFFFFFFFFFFFF -E0FF0000000000000000FF0000000000000000FF0000000000000000FF00000000000000 -00FF0000000000000000FF8000000000000000FF8000000000000000FF80000000000000 -007F80000000000000007F80000000000000007F80000000000000007FC0000000000000 -007FC0000000000000007FC0000000000000003FC0000000000000003FE0000000000000 -003FE0000000000000001FF0000000000000001FF0000000000000001FF0000000000000 -000FF8000000000000000FFC0000000000000007FC0000000000000007FE000000000000 -0003FE0000000000000003FF0000000000000001FF8000000000002001FFC00000000000 -6000FFE00000000001E0007FF00000000003E0007FF8000000000FE0003FFC000000001F -F0001FFE000000007FF0000FFF80000001FFF00007FFE000000FFFF00007FFF800007FFF -E00001FFFF800FFFFFC00000FFFFFFFFFFFF0000007FFFFFFFFFFE0000003FFFFFFFFFF8 -0000000FFFFFFFFFE000000007FFFFFFFFC000000001FFFFFFFE00000000007FFFFFF800 -000000000FFFFF80000000000000FFF0000000445A77D854>101 -D[<FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0 -000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE000000000 -0000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0 -000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE000000000 -0000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0 -000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE000000000 -0000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0 -000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE000000000 -0000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0 -000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE000000000 -0000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0 -000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE000000000 -0000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0 -0000FFF00000FFE0000FFFFF0000FFE0007FFFFFE000FFE001FFFFFFF800FFE003FFFFFF -FC00FFE00FFFFFFFFF00FFE01FFFFFFFFF80FFE03FFFFFFFFFC0FFE0FFFFFFFFFFE0FFE1 -FFF003FFFFE0FFE3FF80003FFFF0FFE3FE000007FFF8FFE7F8000003FFF8FFEFF0000000 -FFF8FFFFE00000007FFCFFFFC00000007FFCFFFF800000003FFEFFFF800000001FFEFFFF -000000001FFEFFFE000000000FFEFFFE000000000FFEFFFC000000000FFFFFFC00000000 -0FFFFFFC0000000007FFFFF80000000007FFFFF80000000007FFFFF80000000007FFFFF0 -0000000007FFFFF00000000007FFFFF00000000007FFFFF00000000007FFFFE000000000 -07FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE0 -0000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000000000 -07FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE0 -0000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000000000 -07FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE0 -0000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000000000 -07FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE0 -0000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000000000 -07FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE0 -0000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000000000 -07FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE0 -0000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000000000 -07FFFFE00000000007FFFFE00000000007FF>64 146 112 273 97 -104 D[<FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0 -FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0 -FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0 -FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0 -FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0 -FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0 -FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0 -FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0 -FFE0FFE0FFE0FFE0>11 146 112 273 44 108 D<00000000FFF00000FFE0000FFFFF00 -00FFE0007FFFFFE000FFE001FFFFFFF800FFE003FFFFFFFC00FFE00FFFFFFFFF00FFE01F -FFFFFFFF80FFE03FFFFFFFFFC0FFE0FFFFFFFFFFE0FFE1FFF003FFFFE0FFE3FF80003FFF -F0FFE3FE000007FFF8FFE7F8000003FFF8FFEFF0000000FFF8FFFFE00000007FFCFFFFC0 -0000007FFCFFFF800000003FFEFFFF800000001FFEFFFF000000001FFEFFFE000000000F -FEFFFE000000000FFEFFFC000000000FFFFFFC000000000FFFFFFC0000000007FFFFF800 -00000007FFFFF80000000007FFFFF80000000007FFFFF00000000007FFFFF00000000007 -FFFFF00000000007FFFFF00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FF405870D761>110 D<000000007FF00000000000000007FFFF000000000000 -003FFFFFE0000000000000FFFFFFF8000000000003FFFFFFFE00000000000FFFFFFFFF80 -000000001FFFFFFFFFC0000000007FFFFFFFFFF000000000FFFFFFFFFFF800000001FFFF -800FFFFC00000003FFFC0001FFFE00000007FFE000003FFF0000000FFF8000000FFF8000 -001FFE00000003FFC000003FFC00000001FFE000003FF800000000FFE000007FF0000000 -007FF00000FFE0000000003FF80000FFC0000000001FF80001FF80000000000FFC0003FF -000000000007FE0003FE000000000003FE0007FE000000000003FF0007FC000000000001 -FF000FFC000000000001FF800FF8000000000000FF800FF8000000000000FF801FF00000 -000000007FC01FF00000000000007FC03FE00000000000003FE03FE00000000000003FE0 -3FE00000000000003FE03FC00000000000001FE07FC00000000000001FF07FC000000000 -00001FF07FC00000000000001FF07FC00000000000001FF07F800000000000000FF0FF80 -0000000000000FF8FF800000000000000FF8FF800000000000000FF8FF80000000000000 -0FF8FF800000000000000FF8FF800000000000000FF8FF800000000000000FF8FF800000 -000000000FF8FF800000000000000FF8FF800000000000000FF8FF800000000000000FF8 -FF800000000000000FF8FF800000000000000FF8FFC00000000000001FF8FFC000000000 -00001FF87FC00000000000001FF07FC00000000000001FF07FC00000000000001FF07FE0 -0000000000003FF07FE00000000000003FF03FE00000000000003FE03FE0000000000000 -3FE03FF00000000000007FE03FF00000000000007FE01FF8000000000000FFC01FF80000 -00000000FFC00FFC000000000001FF800FFC000000000001FF800FFE000000000003FF80 -07FE000000000003FF0007FF000000000007FF0003FF80000000000FFE0001FF80000000 -000FFC0001FFC0000000001FFC0000FFE0000000003FF800007FF0000000007FF000007F -F800000000FFF000003FFC00000001FFE000001FFF00000007FFC000000FFFC000001FFF -80000007FFE000003FFF00000003FFFC0001FFFE00000001FFFF800FFFFC00000000FFFF -FFFFFFF8000000007FFFFFFFFFF0000000003FFFFFFFFFE0000000000FFFFFFFFF800000 -000003FFFFFFFE000000000000FFFFFFF80000000000003FFFFFE000000000000007FFFF -00000000000000007FF0000000004D5A78D85E>I<000000003FF8000000FFE00007FFFF -000000FFE0003FFFFFC00000FFE000FFFFFFF00000FFE003FFFFFFF80000FFE00FFFFFFF -FC0000FFE03FFFFFFFFF0000FFE07FFFFFFFFF8000FFE0FFFFFFFFFFC000FFE3FFF003FF -FFC000FFE7FF80007FFFE000FFEFFE00000FFFF000FFFFF8000007FFF800FFFFE0000001 -FFFC00FFFFC0000000FFFC00FFFF800000007FFE00FFFF000000001FFE00FFFE00000000 -1FFF00FFFC000000000FFF00FFF80000000007FF80FFF80000000003FF80FFF000000000 -03FFC0FFF00000000001FFC0FFE00000000000FFE0FFE00000000000FFE0FFE000000000 -007FE0FFE000000000007FF0FFE000000000003FF0FFE000000000003FF0FFE000000000 -003FF0FFE000000000001FF8FFE000000000001FF8FFE000000000001FF8FFE000000000 -000FF8FFE000000000000FF8FFE000000000000FF8FFE000000000000FFCFFE000000000 -000FFCFFE0000000000007FCFFE0000000000007FCFFE0000000000007FCFFE000000000 -0007FCFFE0000000000007FCFFE0000000000007FCFFE0000000000007FCFFE000000000 -0007FCFFE0000000000007FCFFE0000000000007FCFFE0000000000007FCFFE000000000 -0007FCFFE0000000000007FCFFE000000000000FFCFFE000000000000FF8FFE000000000 -000FF8FFE000000000000FF8FFE000000000000FF8FFE000000000001FF8FFE000000000 -001FF8FFE000000000001FF0FFE000000000003FF0FFE000000000003FF0FFE000000000 -007FF0FFE000000000007FE0FFE00000000000FFE0FFE00000000000FFC0FFF000000000 -01FFC0FFF00000000001FFC0FFF80000000003FF80FFF80000000007FF80FFFC00000000 -0FFF00FFFC000000000FFF00FFFE000000001FFE00FFFF000000003FFE00FFFF80000000 -7FFC00FFFFC0000001FFF800FFFFE0000003FFF000FFFFF000000FFFF000FFEFFC00003F -FFE000FFE7FF0000FFFFC000FFE3FFE00FFFFF8000FFE1FFFFFFFFFF0000FFE0FFFFFFFF -FE0000FFE03FFFFFFFFC0000FFE01FFFFFFFF80000FFE007FFFFFFE00000FFE003FFFFFF -800000FFE000FFFFFF000000FFE0001FFFF8000000FFE00001FFC0000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000FFE000000000000000FFE000000000 -000000FFE000000000000000FFE000000000000000468070D761>I<00007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF00000000000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF00000000000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF000000000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00 -FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFF -FFFFFF00FFFFFFFFFFFFFF0000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF00000000000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF00000000000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF00000000000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF00000000000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF00000000000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF00000000000007FF0 -0000000000007FF00000000000007FF00000000000007FF00000000000007FF000000000 -00007FF00000000000007FF00000000000007FF00000000000007FF80000000000007FF8 -0000000000007FF80000000000003FF80000008000003FFC0000018000003FFC000007C0 -00003FFE00001FC000003FFE00007FC000001FFF8001FFC000001FFFC01FFFE000000FFF -FFFFFFE000000FFFFFFFFFE0000007FFFFFFFF80000007FFFFFFFE00000003FFFFFFF800 -000001FFFFFFE000000000FFFFFF00000000003FFFF000000000000FFE0000003B717DEF -44>116 D<FFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -00000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007 -FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE00000000007FFFFE000 -0000000FFFFFE0000000000FFFFFE0000000000FFFFFE0000000001FFFFFE0000000001F -FFFFE0000000003FFFFFE0000000003FFFFFE0000000007FFFFFF000000000FFFFFFF000 -000001FFFF7FF000000003FFFF7FF800000007FFFF7FF80000000FFFFF7FFC0000003FF7 -FF3FFF000000FFE7FF3FFFC00003FFC7FF1FFFF8003FFF87FF1FFFFFFFFFFF07FF0FFFFF -FFFFFE07FF07FFFFFFFFF807FF07FFFFFFFFE007FF03FFFFFFFF8007FF00FFFFFFFE0007 -FF007FFFFFF00007FF001FFFFF800007FF0001FFF000000000405870D661>I<FFC00000 -0000000003FFFFE000000000000003FF7FE000000000000007FE7FF000000000000007FE -3FF00000000000000FFE3FF80000000000000FFC3FF80000000000000FFC1FF800000000 -00001FF81FFC0000000000001FF80FFC0000000000003FF80FFE0000000000003FF007FE -0000000000003FF007FF0000000000007FE007FF0000000000007FE003FF000000000000 -FFE003FF800000000000FFC001FF800000000000FFC001FFC00000000001FF8000FFC000 -00000001FF8000FFE00000000003FF8000FFE00000000003FF00007FE00000000003FF00 -007FF00000000007FE00003FF00000000007FE00003FF8000000000FFE00001FF8000000 -000FFC00001FFC000000000FFC00001FFC000000001FF800000FFC000000001FF800000F -FE000000003FF8000007FE000000003FF0000007FF000000003FF0000003FF000000007F -E0000003FF800000007FE0000003FF800000007FE0000001FF80000000FFC0000001FFC0 -000000FFC0000000FFC0000001FF80000000FFE0000001FF800000007FE0000001FF8000 -00007FE0000003FF000000007FF0000003FF000000003FF0000007FF000000003FF80000 -07FE000000001FF8000007FE000000001FFC00000FFC000000000FFC00000FFC00000000 -0FFC00000FFC000000000FFE00001FF80000000007FE00001FF80000000007FF00003FF0 -0000000003FF00003FF00000000003FF00003FF00000000001FF80007FE00000000001FF -80007FE00000000001FFC0007FC00000000000FFC000FFC00000000000FFC000FFC00000 -0000007FE001FF8000000000007FE001FF8000000000003FF001FF0000000000003FF003 -FF0000000000001FF003FF0000000000001FF803FE0000000000001FF807FE0000000000 -000FFC07FC0000000000000FFC07FC00000000000007FC0FFC00000000000007FE0FF800 -000000000003FE0FF800000000000003FE1FF000000000000003FF1FF000000000000001 -FF1FF000000000000001FF3FE000000000000000FFBFE000000000000000FFBFC0000000 -000000007FFFC0000000000000007FFFC0000000000000007FFF80000000000000003FFF -80000000000000003FFF00000000000000001FFF00000000000000001FFF000000000000 -00000FFE00000000000000000FFE00000000000000000FFC000000000000000007FC0000 -00000000000007FC00000000000000000FF800000000000000000FF80000000000000000 -0FF000000000000000001FF000000000000000001FF000000000000000003FE000000000 -000000003FE000000000000000003FC000000000000000007FC000000000000000007FC0 -0000000000000000FF800000000000000000FF800000000000000000FF00000000000000 -0001FF000000000000000001FF000000000000000003FE000000000000000003FE000000 -000000000003FC000000000000000007FC000000000000000007FC00000000000000000F -F800000000000000000FF800000000000000001FF000000000000000001FF00000000000 -0000003FE000000000000000003FE000000000000000007FC000000000000000007FC000 -00000000000000FF8000000000001C0001FF8000000000001FE007FF0000000000001FFF -FFFF0000000000001FFFFFFE0000000000001FFFFFFC0000000000001FFFFFF800000000 -00000FFFFFF80000000000000FFFFFE00000000000000FFFFFC000000000000003FFFF80 -000000000000000FFC0000000000000050807DD657>121 D E -%EndDVIPSBitmapFont -end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 600dpi -TeXDict begin -%%BeginPaperSize: a4 -/setpagedevice where -{ pop << /PageSize [595 842] >> setpagedevice } -{ /a4 where { pop a4 } if } -ifelse -%%EndPaperSize - end -%%EndSetup -%%Page: 1 1 -TeXDict begin 1 0 bop 0 83 3901 9 v 1890 430 a Ft(Python)64 -b(Op)5 b(enSSL)64 b(Manual)3394 599 y Fs(Release)34 b(0.12)2927 -953 y Fr(Jean-P)m(aul)i(Calderone)3386 1307 y Fq(April)27 -b(11,)g(2011)3014 1454 y Fp(exa)n(rkun@t)n(wistedmatrix.com)1781 -1650 y Fo(Abstract)208 1779 y Fn(This)32 b(mo)r(dule)f(is)h(a)g(rather) -g(thin)f(wrapp)r(er)h(around)g(\(a)g(subset)f(of)6 b(\))32 -b(the)g(Op)r(enSSL)e(library)-6 b(.)52 b(With)32 b(thin)f(wrapp)r(er) -208 1870 y(I)d(mean)h(that)f(a)i(lot)f(of)h(the)f(ob)t(ject)h(metho)r -(ds)e(do)h(nothing)g(more)g(than)g(calling)h(a)g(corresp)r(onding)g -(function)f(in)g(the)208 1961 y(Op)r(enSSL)24 b(library)-6 -b(.)0 2231 y Fr(Contents)0 2414 y Fm(1)77 b(In)m(tro)s(duction)3201 -b(2)0 2596 y(2)77 b(Building)30 b(and)i(Installing)2765 -b(2)125 2696 y Fq(2.1)83 b(Building)28 b(the)g(Mo)r(dule)g(on)f(a)g -(Unix)h(System)87 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f -(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -134 b(2)125 2796 y(2.2)83 b(Building)28 b(the)g(Mo)r(dule)g(on)f(a)g -(Windo)n(ws)g(System)59 b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) -h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(3)0 2978 y Fm(3)77 b Fl(OpenSSL)28 b Fm(\026)33 b(Python)f(in)m -(terface)h(to)e(Op)s(enSSL)2030 b(3)125 3078 y Fq(3.1)83 -b Fl(crypto)26 b Fq(\026)h(Generic)g(cryptographic)f(mo)r(dule)79 -b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(3)315 -3178 y(X509Extension)27 b(ob)5 b(jects)102 b(.)41 b(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(5)315 3277 y(X509)27 b(ob)5 b(jects)73 b(.)42 b(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)134 b(5)315 3377 y(X509Name)27 b(ob)5 -b(jects)57 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(7)315 3476 -y(X509Req)27 b(ob)5 b(jects)60 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(8)315 3576 y(X509Store)26 b(ob)5 b(jects)78 b(.)41 -b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)134 b(8)315 3676 y(PKey)28 b(ob)5 -b(jects)58 b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(8)315 3775 y(PK)n(CS7)27 b(ob)5 b(jects)59 b(.)41 b(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)134 b(8)315 3875 y(PK)n(CS12)27 b(ob)5 -b(jects)81 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 b(9)315 -3975 y(X509Extension)27 b(ob)5 b(jects)102 b(.)41 b(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)134 -b(9)315 4074 y(Netscap)r(eSPKI)28 b(ob)5 b(jects)58 b(.)42 -b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) -f(.)h(.)f(.)h(.)93 b(10)315 4174 y(CRL)28 b(ob)5 b(jects)87 -b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(10)315 -4273 y(Rev)n(ok)n(ed)27 b(ob)5 b(jects)83 b(.)42 b(.)f(.)h(.)g(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f -(.)h(.)93 b(10)125 4373 y(3.2)83 b Fl(rand)26 b Fq(\026)i(An)g(in)n -(terface)f(to)g(the)h(Op)r(enSSL)g(pseudo)f(random)g(n)n(um)n(b)r(er)g -(generator)50 b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 -b(11)125 4473 y(3.3)83 b Fl(SSL)27 b Fq(\026)g(An)i(in)n(terface)d(to)i -(the)g(SSL-sp)r(eci\034c)f(parts)g(of)h(Op)r(enSSL)64 -b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) -h(.)f(.)h(.)93 b(11)315 4572 y(Con)n(text)28 b(ob)5 b(jects)98 -b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(13)315 4672 y(Connection)27 -b(ob)5 b(jects)108 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(15)0 -4855 y Fm(4)77 b(In)m(ternals)3310 b(17)125 4954 y Fq(4.1)83 -b(Exceptions)i(.)41 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 -b(17)125 5054 y(4.2)83 b(Callbac)n(ks)68 b(.)42 b(.)f(.)h(.)f(.)h(.)f -(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)93 b(18)125 5154 y(4.3)83 b(A)n(cessing)27 -b(So)r(c)n(k)n(et)g(Metho)r(ds)82 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)93 b(18)p -0 5300 V eop end -%%Page: 2 2 -TeXDict begin 2 1 bop 0 85 a Fr(1)114 b(Intro)s(duction)0 -314 y Fq(The)41 b(reason)e(p)n(yOp)r(enSSL)i(w)n(as)e(created)h(is)h -(that)g(the)g(SSL)g(supp)r(ort)g(in)g(the)g(so)r(c)n(k)n(et)f(mo)r -(dule)h(in)g(Python)g(2.1)f(\(the)0 414 y(con)n(temp)r(orary)d(v)n -(ersion)g(of)h(Python)h(when)g(the)g(p)n(yOp)r(enSSL)g(pro)5 -b(ject)37 b(w)n(as)h(b)r(egun\))h(w)n(as)f(sev)n(erely)f(limited.)71 -b(Other)0 514 y(Op)r(enSSL)40 b(wrapp)r(ers)e(for)h(Python)g(at)h(the)f -(time)h(w)n(ere)f(also)f(limited,)43 b(though)c(in)h(di\033eren)n(t)f -(w)n(a)n(ys.)71 b(Unfortunately)-7 b(,)0 613 y(Python's)31 -b(standard)f(library)g(SSL)h(supp)r(ort)g(has)g(remained)f(w)n(eak,)h -(although)g(other)f(pac)n(k)-5 b(ages)29 b(\(suc)n(h)i(as)g(M2Crypto) -3832 583 y Fk(1)3868 613 y Fq(\))0 713 y(ha)n(v)n(e)26 -b(made)i(great)e(adv)-5 b(ances)27 b(and)g(no)n(w)g(equal)g(or)g -(exceed)g(p)n(yOp)r(enSSL's)g(functionalit)n(y)-7 b(.)0 -860 y(The)22 b(reason)f(p)n(yOp)r(enSSL)h(con)n(tin)n(ues)g(to)g(b)r(e) -h(main)n(tained)f(is)g(that)h(there)f(is)g(a)g(signi\034can)n(t)g(user) -g(comm)n(unit)n(y)g(around)f(it,)j(as)0 959 y(w)n(ell)i(as)g(a)f(large) -g(amoun)n(t)h(of)g(soft)n(w)n(are)f(whic)n(h)h(dep)r(ends)g(on)g(it.)37 -b(It)27 b(is)f(a)g(great)f(b)r(ene\034t)i(to)f(man)n(y)f(p)r(eople)i -(for)e(p)n(yOp)r(enSSL)0 1059 y(to)i(con)n(tin)n(ue)g(to)h(exist)f(and) -h(adv)-5 b(ance.)0 1381 y Fr(2)114 b(Building)38 b(and)f(Installing)0 -1610 y Fq(These)27 b(instructions)g(can)g(also)g(b)r(e)h(found)g(in)g -(the)g(\034le)f Fl(INSTALL)p Fq(.)0 1757 y(I)j(ha)n(v)n(e)f(tested)h -(this)h(on)f(Debian)g(Lin)n(ux)g(systems)f(\(w)n(o)r(o)r(dy)h(and)g -(sid\),)h(Solaris)e(2.6)g(and)h(2.7.)43 b(Others)30 b(ha)n(v)n(e)f -(successfully)0 1856 y(compiled)e(it)h(on)g(Windo)n(ws)f(and)g(NT.)0 -2136 y Fj(2.1)97 b(Building)32 b(the)h(Mo)s(dule)f(on)g(a)h(Unix)f -(System)0 2336 y Fq(p)n(yOp)r(enSSL)27 b(uses)h(distutils,)g(so)f -(there)g(really)f(shouldn't)i(b)r(e)g(an)n(y)f(problems.)36 -b(T)-7 b(o)27 b(build)h(the)g(library:)236 2575 y Fi(python)41 -b(setup.py)g(build)0 2862 y Fq(If)30 b(y)n(our)f(Op)r(enSSL)h(header)f -(\034les)h(aren't)f(in)h Fl(/usr/include)p Fq(,)c(y)n(ou)j(ma)n(y)g -(need)h(to)g(supply)g(the)g Fl(-I)f Fq(\035ag)h(to)f(let)i(the)f(setup) -0 2962 y(script)25 b(kno)n(w)g(where)f(to)i(lo)r(ok.)35 -b(The)25 b(same)g(go)r(es)g(for)f(the)i(libraries)e(of)h(course,)g(use) -g(the)h Fl(-L)f Fq(\035ag.)35 b(Note)25 b(that)h Fl(build)d -Fq(w)n(on't)0 3061 y(accept)k(these)h(\035ags,)e(so)h(y)n(ou)g(ha)n(v)n -(e)f(to)i(run)f(\034rst)h Fl(build_ext)23 b Fq(and)28 -b(then)g Fl(build)p Fq(!)35 b(Example:)236 3300 y Fi(python)41 -b(setup.py)g(build_ext)g(-I/usr/local/ssl/include)j -(-L/usr/local/ssl/lib)236 3391 y(python)d(setup.py)g(build)0 -3678 y Fq(No)n(w)27 b(y)n(ou)f(should)h(ha)n(v)n(e)f(a)h(directory)f -(called)h Fl(OpenSSL)d Fq(that)k(con)n(tains)e(e.g.)36 -b Fl(SSL.so)25 b Fq(and)i Fl(__init__.py)c Fq(somewhere)j(in)0 -3778 y(the)i(build)g(dicrectory)-7 b(,)26 b(so)h(just:)236 -4016 y Fi(python)41 b(setup.py)g(install)0 4303 y Fq(If)32 -b(y)n(ou,)f(for)g(some)f(arcane)g(reason,)g(don't)i(w)n(an)n(t)e(the)i -(mo)r(dule)f(to)g(app)r(ear)f(in)i(the)f Fl(site-packages)26 -b Fq(directory)-7 b(,)31 b(use)g(the)0 4402 y Fl(--prefix)24 -b Fq(option.)0 4549 y(Y)-7 b(ou)28 b(can,)f(of)g(course,)g(do)236 -4787 y Fi(python)41 b(setup.py)g(--help)0 5075 y Fq(to)27 -b(\034nd)h(out)g(more)f(ab)r(out)g(ho)n(w)g(to)h(use)f(the)h(script.)p -0 5144 1560 4 v 92 5198 a Fh(1)127 5221 y Fg(See)c Fp(http://chandlerp) -n(roject.o)n(rg/Projects/MeT)-6 b(o)r(oCrypto)p 0 5549 -3901 4 v 0 5649 a Ff(2)2928 b(2)83 b(Building)27 b(and)g(Installing)p -eop end -%%Page: 3 3 -TeXDict begin 3 2 bop 0 83 a Fj(2.2)97 b(Building)32 -b(the)h(Mo)s(dule)f(on)g(a)h(Windo)m(ws)f(System)0 283 -y Fq(Big)26 b(thanks)g(to)h(Itamar)e(Sh)n(tull-T)-7 b(rauring)25 -b(and)i(Oleg)e(Orlo)n(v)g(for)h(their)g(help)h(with)g(Windo)n(ws)f -(build)h(instructions.)36 b(Same)0 383 y(as)27 b(for)g(Unix)h(systems,) -f(w)n(e)g(ha)n(v)n(e)f(to)i(separate)e(the)i Fl(build_ext)c -Fq(and)j(the)h Fl(build)p Fq(.)0 530 y(Building)f(the)h(library:)236 -768 y Fi(setup.py)41 b(build_ext)g(-I)f(...\\openssl\\inc32)j(-L)d -(...\\openssl\\out32dll)236 860 y(setup.py)h(build)0 -1147 y Fq(Where)27 b Fl(...\\openssl)c Fq(is)28 b(of)f(course)g(the)h -(lo)r(cation)e(of)i(y)n(our)e(Op)r(enSSL)i(installation.)0 -1294 y(Installation)f(is)g(the)h(same)f(as)g(for)g(Unix)h(systems:)236 -1532 y Fi(setup.py)41 b(install)0 1819 y Fq(And)28 b(similarily)-7 -b(,)27 b(y)n(ou)g(can)g(do)236 2057 y Fi(setup.py)41 -b(--help)0 2344 y Fq(to)27 b(get)h(more)f(information.)0 -2666 y Fr(3)114 b Fe(OpenSSL)36 b Fr(\026)h(Python)h(interface)f(to)h -(Op)s(enSSL)0 2895 y Fq(This)25 b(pac)n(k)-5 b(age)24 -b(pro)n(vides)g(a)h(high-lev)n(el)g(in)n(terface)f(to)i(the)g -(functions)f(in)h(the)g(Op)r(enSSL)f(library)-7 b(.)35 -b(The)26 b(follo)n(wing)e(mo)r(dules)0 2995 y(are)j(de\034ned:)0 -3142 y Fl(crypto)208 3241 y Fq(Generic)g(cryptographic)e(mo)r(dule.)37 -b(Note)28 b(that)g(if)g(an)n(ything)f(is)g(incomplete,)h(this)g(mo)r -(dule)f(is!)0 3388 y Fl(rand)208 3488 y Fq(An)h(in)n(terface)e(to)i -(the)g(Op)r(enSSL)g(pseudo)f(random)f(n)n(um)n(b)r(er)i(generator.)0 -3635 y Fl(SSL)208 3734 y Fq(An)g(in)n(terface)e(to)i(the)g(SSL-sp)r -(eci\034c)f(parts)g(of)h(Op)r(enSSL.)0 4014 y Fj(3.1)97 -b Fd(crypto)34 b Fj(\026)e(Generic)i(cryptographic)e(mo)s(dule)0 -4214 y Fl(X509Type)208 4314 y Fq(See)27 b Fl(X509)p Fq(.)0 -4461 y Fm(class)k Fl(X509\(\))208 4561 y Fq(A)c(class)g(represen)n -(ting)f(X.509)h(certi\034cates.)0 4707 y Fl(X509NameType)208 -4807 y Fq(See)g Fl(X509Name)p Fq(.)0 4954 y Fm(class)k -Fl(X509Name\()p Fc(x509name)6 b Fl(\))208 5054 y Fq(A)27 -b(class)g(represen)n(ting)f(X.509)h(Distinguished)g(Names.)208 -5186 y(This)g(constructor)f(creates)g(a)i(cop)n(y)e(of)34 -b Fc(x509name)h Fq(whic)n(h)28 b(should)f(b)r(e)h(an)f(instance)g(of)34 -b Fl(X509Name)p Fq(.)0 5333 y Fl(X509ReqType)p 0 5549 -3901 4 v 0 5649 a Ff(2.2)82 b(Building)27 b(the)g(Mo)r(dule)g(on)g(a)g -(Windo)n(ws)g(System)2164 b(3)p eop end -%%Page: 4 4 -TeXDict begin 4 3 bop 208 83 a Fq(See)27 b Fl(X509Req)p -Fq(.)0 230 y Fm(class)k Fl(X509Req\(\))208 330 y Fq(A)c(class)g -(represen)n(ting)f(X.509)h(certi\034cate)f(requests.)0 -476 y Fl(X509StoreType)208 576 y Fq(A)h(Python)h(t)n(yp)r(e)g(ob)5 -b(ject)28 b(represen)n(ting)d(the)j(X509Store)e(ob)5 -b(ject)27 b(t)n(yp)r(e.)0 723 y Fl(PKeyType)208 823 y -Fq(See)g Fl(PKey)p Fq(.)0 969 y Fm(class)k Fl(PKey\(\))208 -1069 y Fq(A)c(class)g(represen)n(ting)f(DSA)i(or)f(RSA)h(k)n(eys.)0 -1216 y Fl(PKCS7Type)208 1316 y Fq(A)f(Python)h(t)n(yp)r(e)g(ob)5 -b(ject)28 b(represen)n(ting)d(the)j(PK)n(CS7)f(ob)5 b(ject)28 -b(t)n(yp)r(e.)0 1462 y Fl(PKCS12Type)208 1562 y Fq(A)f(Python)h(t)n(yp) -r(e)g(ob)5 b(ject)28 b(represen)n(ting)d(the)j(PK)n(CS12)f(ob)5 -b(ject)27 b(t)n(yp)r(e.)0 1709 y Fl(X509ExtensionTyp)o(e)208 -1808 y Fq(See)g Fl(X509Extension)p Fq(.)0 1955 y Fm(class)k -Fl(X509Extension\()p Fc(typ)l(ename,)25 b(critic)l(al,)31 -b(value)6 b Fb([)p Fc(,)31 b(subje)l(ct)19 b Fb(][)p -Fc(,)30 b(issuer)21 b Fb(])p Fl(\))208 2055 y Fq(A)181 -b(class)g(represen)n(ting)e(an)j(X.509)e(v3)h(certi\034cate)f -(extensions.)498 b(See)208 2155 y Fp(http://op)r(enssl.o)n(rg/do)r -(cs/apps/x509v3_con\034g.html#ST)-6 b(AND)n(ARD_EXTENSIONS)65 -b Fq(for)60 b Fc(typ)l(ename)67 b Fq(strings)59 b(and)208 -2254 y(their)27 b(options.)36 b(Optional)27 b(parameters)f -Fc(subje)l(ct)35 b Fq(and)28 b Fc(issuer)36 b Fq(m)n(ust)28 -b(b)r(e)g(X509)e(ob)5 b(jects.)0 2401 y Fl(NetscapeSPKIType)208 -2501 y Fq(See)27 b Fl(NetscapeSPKI)p Fq(.)0 2664 y Fm(class)k -Fl(NetscapeSPKI\()p Fb([)p Fc(enc)11 b Fb(])p Fl(\))208 -2764 y Fq(A)27 b(class)g(represen)n(ting)f(Netscap)r(e)i(SPKI)f(ob)5 -b(jects.)208 2890 y(If)37 b(the)g Fc(enc)k Fq(argumen)n(t)35 -b(is)i(presen)n(t,)h(it)f(should)f(b)r(e)h(a)g(base64-enco)r(ded)d -(string)i(represen)n(ting)f(a)h(Netscap)r(eSPKI)208 2989 -y(ob)5 b(ject,)27 b(as)g(returned)g(b)n(y)g(the)h Fl(b64_encode)c -Fq(metho)r(d.)0 3136 y Fm(class)31 b Fl(CRL\(\))208 3236 -y Fq(A)c(class)g(represen)n(ting)f(Certifcate)h(Rev)n(o)r(cation)g -(List)g(ob)5 b(jects.)0 3383 y Fm(class)31 b Fl(Revoked\(\))208 -3482 y Fq(A)c(class)g(represen)n(ting)f(Rev)n(o)r(cation)g(ob)5 -b(jects)27 b(of)h(CRL.)0 3629 y Fl(FILETYPE_PEM)0 3729 -y(FILETYPE_ASN1)208 3828 y Fq(File)f(t)n(yp)r(e)h(constan)n(ts.)0 -3975 y Fl(TYPE_RSA)0 4075 y(TYPE_DSA)208 4174 y Fq(Key)e(t)n(yp)r(e)i -(constan)n(ts.)0 4321 y Fm(exception)k Fl(Error)208 4421 -y Fq(Generic)27 b(exception)g(used)g(in)h(the)g Fl(crypto)d -Fq(mo)r(dule.)0 4568 y Fl(dump_certificate)o(\()p Fc(t)o(yp)l(e,)g(c)l -(ert)8 b Fl(\))208 4667 y Fq(Dump)28 b(the)g(certi\034cate)f -Fc(c)l(ert)35 b Fq(in)n(to)27 b(a)h(bu\033er)f(string)g(enco)r(ded)h -(with)g(the)g(t)n(yp)r(e)f Fc(typ)l(e)6 b Fq(.)0 4814 -y Fl(dump_certificate)o(_r)o(equ)o(es)o(t\()o Fc(typ)l(e,)25 -b(r)l(e)l(q)7 b Fl(\))208 4914 y Fq(Dump)28 b(the)g(certi\034cate)f -(request)g Fc(r)l(e)l(q)35 b Fq(in)n(to)27 b(a)g(bu\033er)h(string)f -(enco)r(ded)g(with)h(the)g(t)n(yp)r(e)g Fc(typ)l(e)6 -b Fq(.)0 5075 y Fl(dump_privatekey\()o Fc(typ)l(e,)25 -b(pkey)7 b Fb([)p Fc(,)31 b(cipher,)h(p)l(assphr)l(ase)19 -b Fb(])p Fl(\))208 5175 y Fq(Dump)39 b(the)f(priv)-5 -b(ate)38 b(k)n(ey)h Fc(pkey)46 b Fq(in)n(to)38 b(a)g(bu\033er)g(string) -g(enco)r(ded)g(with)g(the)h(t)n(yp)r(e)f Fc(typ)l(e)6 -b Fq(,)42 b(optionally)37 b(\(if)45 b Fc(typ)l(e)g Fq(is)208 -5274 y Fl(FILETYPE_PEM)p Fq(\))22 b(encrypting)27 b(it)h(using)h -Fc(cipher)38 b Fq(and)27 b Fc(p)l(assphr)l(ase)6 b Fq(.)208 -5400 y Fc(p)l(assphr)l(ase)35 b Fq(m)n(ust)28 b(b)r(e)g(either)f(a)g -(string)g(or)g(a)g(callbac)n(k)f(for)h(pro)n(viding)f(the)i(pass)f -(phrase.)p 0 5549 3901 4 v 0 5649 a Ff(4)2239 b(3)83 -b Fl(OpenSSL)24 b Ff(\026)k(Python)f(interface)h(to)f(Op)r(enSSL)p -eop end -%%Page: 5 5 -TeXDict begin 5 4 bop 0 83 a Fl(load_certificate)o(\()p -Fc(t)o(yp)l(e,)25 b(bu\033er)9 b Fl(\))208 183 y Fq(Load)26 -b(a)h(certi\034cate)g(\(X509\))g(from)h(the)f(string)h -Fc(bu\033er)37 b Fq(enco)r(ded)27 b(with)h(the)g(t)n(yp)r(e)g -Fc(typ)l(e)6 b Fq(.)0 330 y Fl(load_certificate)o(_r)o(equ)o(es)o(t\()o -Fc(typ)l(e,)25 b(bu\033er)9 b Fl(\))208 429 y Fq(Load)26 -b(a)h(certi\034cate)g(request)g(\(X509Req\))g(from)g(the)h(string)g -Fc(bu\033er)37 b Fq(enco)r(ded)27 b(with)h(the)g(t)n(yp)r(e)g -Fc(typ)l(e)6 b Fq(.)0 595 y Fl(load_privatekey\()o Fc(typ)l(e,)25 -b(bu\033er)9 b Fb([)p Fc(,)29 b(p)l(assphr)l(ase)20 b -Fb(])p Fl(\))208 695 y Fq(Load)43 b(a)h(priv)-5 b(ate)44 -b(k)n(ey)f(\(PKey\))i(from)f(the)h(string)g Fc(bu\033er)53 -b Fq(enco)r(ded)44 b(with)h(the)f(t)n(yp)r(e)h Fc(typ)l(e)51 -b Fq(\(m)n(ust)45 b(b)r(e)f(one)g(of)208 794 y Fl(FILETYPE_PEM)22 -b Fq(and)28 b Fl(FILETYPE_ASN1)p Fq(\).)208 927 y Fc(p)l(assphr)l(ase) -35 b Fq(m)n(ust)28 b(b)r(e)g(either)f(a)g(string)g(or)g(a)g(callbac)n -(k)f(for)h(pro)n(viding)f(the)i(pass)f(phrase.)0 1074 -y Fl(load_crl\()p Fc(typ)l(e,)g(bu\033er)9 b Fl(\))208 -1174 y Fq(Load)25 b(Certi\034cate)i(Rev)n(o)r(cation)e(List)i(\(CRL\))h -(data)e(from)g(a)h(string)g Fc(bu\033er)9 b Fq(.)37 b -Fc(bu\033er)e Fq(enco)r(ded)27 b(with)g(the)g(t)n(yp)r(e)g -Fc(typ)l(e)6 b Fq(.)208 1273 y(The)27 b(t)n(yp)r(e)h -Fc(typ)l(e)34 b Fq(m)n(ust)28 b(either)f Fl(FILETYPE_PEM)c -Fq(or)j Fl(FILETYPE_ASN1)p Fq(\).)0 1420 y Fl(load_pkcs7_data\()o -Fc(typ)l(e,)f(bu\033er)9 b Fl(\))208 1520 y Fq(Load)26 -b(pk)n(cs7)h(data)g(from)g(the)h(string)g Fc(bu\033er)36 -b Fq(enco)r(ded)28 b(with)g(the)g(t)n(yp)r(e)g Fc(typ)l(e)6 -b Fq(.)0 1681 y Fl(load_pkcs12\()p Fc(bu\033er)j Fb([)p -Fc(,)24 b(p)l(assphr)l(ase)c Fb(])p Fl(\))208 1781 y -Fq(Load)30 b(pk)n(cs12)f(data)h(from)h(the)g(string)g -Fc(bu\033er)9 b Fq(.)47 b(If)31 b(the)h(pk)n(cs12)d(structure)h(is)h -(encrypted,)g(a)g Fc(p)l(assphr)l(ase)39 b Fq(m)n(ust)31 -b(b)r(e)208 1880 y(included.)37 b(The)27 b(MA)n(C)h(is)g(alw)n(a)n(ys)d -(c)n(hec)n(k)n(ed)i(and)g(th)n(us)h(required.)208 2013 -y(See)f(also)g(the)h(man)f(page)g(for)g(the)h(C)f(function)h -Fl(PKCS12_parse)p Fq(.)0 2160 y Fl(sign\()p Fc(key,)h(data,)i(digest)8 -b Fl(\))208 2260 y Fq(Sign)27 b(a)g(data)g(string)g(using)g(the)h(giv)n -(en)f(k)n(ey)g(and)g(message)f(digest.)208 2392 y Fc(key)31 -b Fq(is)23 b(a)g Fl(PKey)f Fq(instance.)35 b Fc(data)c -Fq(is)23 b(a)g Fl(str)g Fq(instance.)35 b Fc(digest)d -Fq(is)23 b(a)g Fl(str)g Fq(naming)g(a)g(supp)r(orted)g(message)f -(digest)h(t)n(yp)r(e,)208 2492 y(for)k(example)g Fl(\020sha1\021)p -Fq(.)71 b(New)28 b(in)g(v)n(ersion)e(0.11.)0 2639 y Fl(verify\()p -Fc(c)l(erti\034c)l(ate,)h(signatur)l(e,)j(data,)h(digest)8 -b Fl(\))208 2738 y Fq(V)-7 b(erify)27 b(the)h(signature)e(for)i(a)f -(data)g(string.)208 2871 y Fc(c)l(erti\034c)l(ate)i Fq(is)24 -b(a)f Fl(X509)f Fq(instance)h(corresp)r(onding)e(to)j(the)g(priv)-5 -b(ate)23 b(k)n(ey)f(whic)n(h)i(generated)e(the)i(signature.)34 -b Fc(signatur)l(e)208 2971 y Fq(is)22 b(a)g Fc(str)31 -b Fq(instance)23 b(giving)e(the)i(signature)f(itself.)35 -b Fc(data)30 b Fq(is)23 b(a)f Fc(str)31 b Fq(instance)23 -b(giving)e(the)i(data)f(to)h(whic)n(h)f(the)h(signature)208 -3071 y(applies.)36 b Fc(digest)f Fq(is)27 b(a)g Fc(str)35 -b Fq(instance)27 b(naming)g(the)g(message)e(digest)i(t)n(yp)r(e)g(of)g -(the)h(signature,)e(for)g(example)g Fl(\020sha1\021)p -Fq(.)208 3170 y(New)h(in)h(v)n(ersion)e(0.11.)0 3433 -y Ff(X509Extension)f(objects)0 3634 y Fq(X509Extension)h(ob)5 -b(jects)27 b(ha)n(v)n(e)g(the)h(follo)n(wing)e(metho)r(ds:)0 -3781 y Fl(get_short_name\(\))208 3880 y Fq(Retriev)n(e)g(the)i(short)f -(descriptiv)n(e)g(name)g(for)g(this)h(extension.)208 -4013 y(The)f(result)g(is)h(a)f(b)n(yte)h(string)e(lik)n(e)i -Fl(\020basicConstrain)o(ts)o(\021)p Fq(.)68 b(New)27 -b(in)h(v)n(ersion)e(0.12.)0 4160 y Fl(get_data\(\))208 -4260 y Fq(Retriev)n(e)g(the)i(data)f(for)g(this)h(extension.)208 -4392 y(The)f(result)g(is)h(the)g(ASN.1)g(enco)r(ded)f(form)g(of)h(the)g -(extension)f(data)g(as)g(a)g(b)n(yte)g(string.)74 b(New)27 -b(in)h(v)n(ersion)e(0.12.)0 4655 y Ff(X509)h(objects)0 -4856 y Fq(X509)f(ob)5 b(jects)27 b(ha)n(v)n(e)g(the)h(follo)n(wing)e -(metho)r(ds:)0 5003 y Fl(get_issuer\(\))208 5102 y Fq(Return)h(an)h -(X509Name)e(ob)5 b(ject)27 b(represen)n(ting)f(the)i(issuer)f(of)g(the) -h(certi\034cate.)0 5249 y Fl(get_pubkey\(\))208 5349 -y Fq(Return)f(a)g(PKey)h(ob)5 b(ject)27 b(represen)n(ting)f(the)i -(public)g(k)n(ey)f(of)g(the)h(certi\034cate.)p 0 5549 -3901 4 v 0 5649 a Ff(3.1)82 b Fl(crypto)25 b Ff(\026)j(Generic)g -(cryptographic)e(mo)r(dule)2234 b(5)p eop end -%%Page: 6 6 -TeXDict begin 6 5 bop 0 83 a Fl(get_serial_numbe)o(r\()o(\))208 -183 y Fq(Return)27 b(the)h(certi\034cate)f(serial)g(n)n(um)n(b)r(er.)0 -330 y Fl(get_subject\(\))208 429 y Fq(Return)g(an)h(X509Name)e(ob)5 -b(ject)27 b(represen)n(ting)f(the)i(sub)5 b(ject)28 b(of)f(the)h -(certi\034cate.)0 576 y Fl(get_version\(\))208 676 y -Fq(Return)f(the)h(certi\034cate)f(v)n(ersion.)0 823 y -Fl(get_notBefore\(\))208 922 y Fq(Return)f(a)h(string)f(giving)f(the)j -(time)f(b)r(efore)f(whic)n(h)h(the)g(certi\034cate)f(is)g(not)h(v)-5 -b(alid.)37 b(The)26 b(string)g(is)h(formatted)f(as)g(an)208 -1022 y(ASN1)h(GENERALIZEDTIME:)1110 1246 y Fi(YYYYMMDDhhmmssZ)1110 -1337 y(YYYYMMDDhhmmss+hhmm)1110 1429 y(YYYYMMDDhhmmss-hhmm)208 -1585 y Fq(If)h(no)f(v)-5 b(alue)27 b(exists)g(for)g(this)h(\034eld,)g -Fl(None)e Fq(is)i(returned.)0 1732 y Fl(get_notAfter\(\))208 -1832 y Fq(Return)h(a)g(string)g(giving)g(the)g(time)h(after)f(whic)n(h) -h(the)g(certi\034cate)e(is)i(not)f(v)-5 b(alid.)43 b(The)29 -b(string)g(is)g(formatted)h(as)e(an)208 1932 y(ASN1)f(GENERALIZEDTIME:) -1110 2156 y Fi(YYYYMMDDhhmmssZ)1110 2247 y(YYYYMMDDhhmmss+hhmm)1110 -2338 y(YYYYMMDDhhmmss-hhmm)208 2495 y Fq(If)h(no)f(v)-5 -b(alue)27 b(exists)g(for)g(this)h(\034eld,)g Fl(None)e -Fq(is)i(returned.)0 2642 y Fl(set_notBefore\()p Fc(when)6 -b Fl(\))208 2742 y Fq(Change)35 b(the)i(time)f(b)r(efore)g(whic)n(h)g -(the)h(certi\034cate)f(is)g(not)g(v)-5 b(alid.)63 b Fc(when)43 -b Fq(is)36 b(a)g(string)f(formatted)h(as)g(an)g(ASN1)208 -2841 y(GENERALIZEDTIME:)1110 3065 y Fi(YYYYMMDDhhmmssZ)1110 -3157 y(YYYYMMDDhhmmss+hhmm)1110 3248 y(YYYYMMDDhhmmss-hhmm)0 -3453 y Fl(set_notAfter\()p Fc(when)6 b Fl(\))208 3552 -y Fq(Change)38 b(the)h(time)h(after)e(whic)n(h)h(the)h(certi\034cate)e -(is)h(not)g(v)-5 b(alid.)71 b Fc(when)46 b Fq(is)39 b(a)g(string)f -(formatted)h(as)f(an)h(ASN1)208 3652 y(GENERALIZEDTIME:)1110 -3876 y Fi(YYYYMMDDhhmmssZ)1110 3967 y(YYYYMMDDhhmmss+hhmm)1110 -4059 y(YYYYMMDDhhmmss-hhmm)0 4263 y Fl(gmtime_adj_notBe)o(fo)o(re\()o -Fc(time)6 b Fl(\))208 4363 y Fq(A)n(djust)28 b(the)g(timestamp)g(\(in)g -(GMT\))g(when)g(the)f(certi\034cate)g(starts)g(b)r(eing)h(v)-5 -b(alid.)0 4510 y Fl(gmtime_adj_notAf)o(te)o(r\()p Fc(t)o(ime)6 -b Fl(\))208 4609 y Fq(A)n(djust)28 b(the)g(timestamp)g(\(in)g(GMT\))g -(when)g(the)f(certi\034cate)g(stops)g(b)r(eing)h(v)-5 -b(alid.)0 4756 y Fl(has_expired\(\))208 4856 y Fq(Chec)n(ks)32 -b(the)h(certi\034cate's)f(time)i(stamp)f(against)f(curren)n(t)g(time.) -54 b(Returns)33 b(true)g(if)g(the)h(certi\034cate)e(has)h(expired)208 -4955 y(and)27 b(false)g(otherwise.)0 5102 y Fl(set_issuer\()p -Fc(issuer)9 b Fl(\))208 5202 y Fq(Set)28 b(the)f(issuer)g(of)h(the)g -(certi\034cate)f(to)g Fc(issuer)9 b Fq(.)0 5349 y Fl(set_pubkey\()p -Fc(pkey)e Fl(\))p 0 5549 3901 4 v 0 5649 a Ff(6)2239 -b(3)83 b Fl(OpenSSL)24 b Ff(\026)k(Python)f(interface)h(to)f(Op)r -(enSSL)p eop end -%%Page: 7 7 -TeXDict begin 7 6 bop 208 83 a Fq(Set)28 b(the)f(public)h(k)n(ey)f(of)h -(the)g(certi\034cate)f(to)g Fc(pkey)7 b Fq(.)0 230 y -Fl(set_serial_numbe)o(r\()o Fc(serialno)e Fl(\))208 330 -y Fq(Set)28 b(the)f(serial)g(n)n(um)n(b)r(er)g(of)h(the)g -(certi\034cate)f(to)g Fc(serialno)5 b Fq(.)0 476 y Fl(set_subject\()p -Fc(subje)l(ct)j Fl(\))208 576 y Fq(Set)28 b(the)f(sub)5 -b(ject)28 b(of)g(the)g(certi\034cate)f(to)g Fc(subje)l(ct)8 -b Fq(.)0 723 y Fl(set_version\()p Fc(version)e Fl(\))208 -823 y Fq(Set)28 b(the)f(certi\034cate)g(v)n(ersion)f(to)i -Fc(version)6 b Fq(.)0 969 y Fl(sign\()p Fc(pkey,)29 b(digest)8 -b Fl(\))208 1069 y Fq(Sign)22 b(the)h(certi\034cate,)f(using)g(the)h(k) -n(ey)g Fc(pkey)31 b Fq(and)22 b(the)h(message)e(digest)h(algorithm)f -(iden)n(ti\034ed)i(b)n(y)f(the)h(string)f Fc(digest)8 -b Fq(.)0 1216 y Fl(subject_name_has)o(h\()o(\))208 1316 -y Fq(Return)27 b(the)h(hash)f(of)h(the)g(certi\034cate)f(sub)5 -b(ject.)0 1462 y Fl(digest\()p Fc(digest_name)h Fl(\))208 -1562 y Fq(Return)38 b(a)f(digest)h(of)g(the)g(certi\034cate,)i(using)e -(the)g Fc(digest_name)45 b Fq(metho)r(d.)69 b Fc(digest_name)45 -b Fq(m)n(ust)38 b(b)r(e)g(a)g(string)208 1662 y(describing)28 -b(a)i(digest)f(algorithm)f(supp)r(orted)i(b)n(y)f(Op)r(enSSL)h(\(b)n(y) -g(EVP_get_digestb)n(yname,)f(sp)r(eci\034cally\).)43 -b(F)-7 b(or)208 1761 y(example,)27 b Fl("md5")e Fq(or)i -Fl("sha1")p Fq(.)0 1908 y Fl(add_extensions\()p Fc(ex)o(tensions)7 -b Fl(\))208 2008 y Fq(A)n(dd)27 b(the)h(extensions)f(in)h(the)g -(sequence)f Fc(extensions)34 b Fq(to)27 b(the)h(certi\034cate.)0 -2155 y Fl(get_extension_co)o(un)o(t\(\))208 2254 y Fq(Return)f(the)h(n) -n(um)n(b)r(er)f(of)h(extensions)f(on)g(this)h(certi\034cate.)73 -b(New)28 b(in)g(v)n(ersion)e(0.12.)0 2401 y Fl(get_extension\()p -Fc(index)10 b Fl(\))208 2501 y Fq(Retriev)n(e)26 b(the)i(extension)f -(on)h(this)f(certi\034cate)g(at)h(the)g(giv)n(en)f(index.)208 -2634 y(Extensions)35 b(on)h(a)f(certi\034cate)g(are)g(k)n(ept)h(in)g -(order.)60 b(The)35 b(index)h(parameter)e(selects)i(whic)n(h)f -(extension)h(will)g(b)r(e)208 2733 y(returned.)g(The)28 -b(returned)f(ob)5 b(ject)27 b(will)h(b)r(e)g(an)f(X509Extension)f -(instance.)74 b(New)28 b(in)f(v)n(ersion)f(0.12.)0 2996 -y Ff(X509Name)g(objects)0 3197 y Fq(X509Name)g(ob)5 b(jects)27 -b(ha)n(v)n(e)g(the)h(follo)n(wing)e(metho)r(ds:)0 3344 -y Fl(hash\(\))208 3443 y Fq(Return)e(an)g(in)n(teger)f(giving)g(the)i -(\034rst)f(four)g(b)n(ytes)f(of)h(the)h(MD5)f(digest)g(of)g(the)h(DER)g -(represen)n(tation)e(of)h(the)g(name.)0 3590 y Fl(der\(\))208 -3690 y Fq(Return)j(a)g(string)g(giving)g(the)h(DER)h(represen)n(tation) -c(of)j(the)g(name.)0 3837 y Fl(get_components\(\))208 -3936 y Fq(Return)f(a)g(list)h(of)g(t)n(w)n(o-tuples)e(of)i(strings)e -(giving)h(the)h(comp)r(onen)n(ts)f(of)h(the)g(name.)0 -4083 y(X509Name)e(ob)5 b(jects)27 b(ha)n(v)n(e)g(the)h(follo)n(wing)e -(mem)n(b)r(ers:)0 4230 y Fl(countryName)208 4330 y Fq(The)h(coun)n(try) -g(of)g(the)h(en)n(tit)n(y)-7 b(.)37 b Fl(C)27 b Fq(ma)n(y)g(b)r(e)h -(used)g(as)f(an)g(alias)f(for)h Fl(countryName)p Fq(.)0 -4476 y Fl(stateOrProvinceN)o(am)o(e)208 4576 y Fq(The)g(state)h(or)e -(pro)n(vince)g(of)i(the)g(en)n(tit)n(y)-7 b(.)37 b Fl(ST)27 -b Fq(ma)n(y)f(b)r(e)i(used)g(as)f(an)g(alias)g(for)g -Fl(stateOrProvince)o(Na)o(me)p Fq(\267)0 4723 y Fl(localityName)208 -4823 y Fq(The)g(lo)r(calit)n(y)g(of)h(the)f(en)n(tit)n(y)-7 -b(.)37 b Fl(L)28 b Fq(ma)n(y)e(b)r(e)i(used)g(as)f(an)g(alias)g(for)g -Fl(localityName)p Fq(.)0 4969 y Fl(organizationName)208 -5069 y Fq(The)g(organization)e(name)j(of)f(the)h(en)n(tit)n(y)-7 -b(.)37 b Fl(O)27 b Fq(ma)n(y)g(b)r(e)h(used)g(as)e(an)i(alias)e(for)h -Fl(organizationName)p Fq(.)0 5216 y Fl(organizationalUn)o(it)o(Nam)o(e) -208 5316 y Fq(The)g(organizational)e(unit)j(of)g(the)g(en)n(tit)n(y)-7 -b(.)36 b Fl(OU)27 b Fq(ma)n(y)g(b)r(e)h(used)g(as)f(an)g(alias)f(for)h -Fl(organizationalUni)o(tN)o(am)o(e)p Fq(.)p 0 5549 3901 -4 v 0 5649 a Ff(3.1)82 b Fl(crypto)25 b Ff(\026)j(Generic)g -(cryptographic)e(mo)r(dule)2234 b(7)p eop end -%%Page: 8 8 -TeXDict begin 8 7 bop 0 83 a Fl(commonName)208 183 y -Fq(The)27 b(common)g(name)h(of)f(the)h(en)n(tit)n(y)-7 -b(.)37 b Fl(CN)27 b Fq(ma)n(y)f(b)r(e)i(used)g(as)f(an)g(alias)g(for)g -Fl(commonName)p Fq(.)0 330 y Fl(emailAddress)208 429 -y Fq(The)g(e-mail)g(address)f(of)i(the)g(en)n(tit)n(y)-7 -b(.)0 692 y Ff(X509Req)26 b(objects)0 893 y Fq(X509Req)g(ob)5 -b(jects)27 b(ha)n(v)n(e)g(the)h(follo)n(wing)e(metho)r(ds:)0 -1040 y Fl(get_pubkey\(\))208 1139 y Fq(Return)h(a)g(PKey)h(ob)5 -b(ject)27 b(represen)n(ting)f(the)i(public)g(k)n(ey)f(of)g(the)h -(certi\034cate)f(request.)0 1286 y Fl(get_subject\(\))208 -1386 y Fq(Return)g(an)h(X509Name)e(ob)5 b(ject)27 b(represen)n(ting)f -(the)i(sub)5 b(ject)28 b(of)f(the)h(certi\034cate.)0 -1532 y Fl(set_pubkey\()p Fc(pkey)7 b Fl(\))208 1632 y -Fq(Set)28 b(the)f(public)h(k)n(ey)f(of)h(the)g(certi\034cate)f(request) -g(to)g Fc(pkey)7 b Fq(.)0 1779 y Fl(sign\()p Fc(pkey,)29 -b(digest)8 b Fl(\))208 1879 y Fq(Sign)36 b(the)g(certi\034cate)g -(request,)h(using)f(the)g(k)n(ey)h Fc(pkey)45 b Fq(and)36 -b(the)g(message)f(digest)g(algorithm)g(iden)n(ti\034ed)i(b)n(y)f(the) -208 1978 y(string)28 b Fc(digest)8 b Fq(.)0 2125 y Fl(verify\()p -Fc(pkey)f Fl(\))208 2225 y Fq(V)-7 b(erify)27 b(a)g(certi\034cate)g -(request)g(using)g(the)h(public)g(k)n(ey)g Fc(pkey)7 -b Fq(.)0 2372 y Fl(set_version\()p Fc(version)f Fl(\))208 -2471 y Fq(Set)28 b(the)f(v)n(ersion)f(\(RF)n(C)i(2459,)e(4.1.2.1\))g -(of)i(the)g(certi\034cate)f(request)f(to)i Fc(version)6 -b Fq(.)0 2618 y Fl(get_version\(\))208 2718 y Fq(Get)28 -b(the)f(v)n(ersion)f(\(RF)n(C)i(2459,)e(4.1.2.1\))g(of)i(the)g -(certi\034cate)f(request.)0 2981 y Ff(X509Sto)n(re)f(objects)0 -3181 y Fq(The)i(X509Store)d(ob)5 b(ject)28 b(has)f(curren)n(tly)f(just) -i(one)g(metho)r(d:)0 3328 y Fl(add_cert\()p Fc(c)l(ert)8 -b Fl(\))208 3428 y Fq(A)n(dd)27 b(the)h(certi\034cate)f -Fc(c)l(ert)36 b Fq(to)27 b(the)h(certi\034cate)f(store.)0 -3691 y Ff(PKey)g(objects)0 3891 y Fq(The)h(PKey)f(ob)5 -b(ject)27 b(has)g(the)h(follo)n(wing)f(metho)r(ds:)0 -4038 y Fl(bits\(\))208 4138 y Fq(Return)g(the)h(n)n(um)n(b)r(er)f(of)h -(bits)g(of)f(the)h(k)n(ey)-7 b(.)0 4285 y Fl(generate_key\()p -Fc(typ)l(e,)25 b(bits)7 b Fl(\))208 4384 y Fq(Generate)22 -b(a)h(public/priv)-5 b(ate)23 b(k)n(ey)f(pair)h(of)g(the)h(t)n(yp)r(e)f -Fc(typ)l(e)30 b Fq(\(one)23 b(of)30 b Fl(TYPE_RSA)19 -b Fq(and)24 b Fl(TYPE_DSA)p Fq(\))c(with)j(the)h(size)f -Fc(bits)7 b Fq(.)0 4531 y Fl(type\(\))208 4631 y Fq(Return)27 -b(the)h(t)n(yp)r(e)g(of)f(the)h(k)n(ey)-7 b(.)0 4894 -y Ff(PK)n(CS7)27 b(objects)0 5094 y Fq(PK)n(CS7)g(ob)5 -b(jects)27 b(ha)n(v)n(e)f(the)i(follo)n(wing)f(metho)r(ds:)0 -5241 y Fl(type_is_signed\(\))208 5341 y Fq(FIXME)p 0 -5549 3901 4 v 0 5649 a Ff(8)2239 b(3)83 b Fl(OpenSSL)24 -b Ff(\026)k(Python)f(interface)h(to)f(Op)r(enSSL)p eop -end -%%Page: 9 9 -TeXDict begin 9 8 bop 0 83 a Fl(type_is_envelope)o(d\()o(\))208 -183 y Fq(FIXME)0 330 y Fl(type_is_signedAn)o(dE)o(nve)o(lo)o(pe)o -(d\(\))208 429 y Fq(FIXME)0 576 y Fl(type_is_data\(\))208 -676 y Fq(FIXME)0 823 y Fl(get_type_name\(\))208 922 y -Fq(Get)28 b(the)f(t)n(yp)r(e)h(name)g(of)f(the)h(PK)n(CS7.)0 -1185 y Ff(PK)n(CS12)e(objects)0 1386 y Fq(PK)n(CS12)g(ob)5 -b(jects)28 b(ha)n(v)n(e)e(the)i(follo)n(wing)e(metho)r(ds:)0 -1547 y Fl(export\()p Fb([)p Fc(p)l(assphr)l(ase=None)16 -b Fb(][)p Fc(,)29 b(iter=2048)c Fb(][)p Fc(,)k(maciter=1)24 -b Fb(])p Fl(\))208 1646 y Fq(Returns)j(a)g(PK)n(CS12)g(ob)5 -b(ject)27 b(as)g(a)g(string.)208 1779 y(The)g(optional)g -Fc(p)l(assphr)l(ase)35 b Fq(m)n(ust)28 b(b)r(e)g(a)f(string)g(not)h(a)f -(callbac)n(k.)208 1912 y(See)g(also)g(the)h(man)f(page)g(for)g(the)h(C) -f(function)h Fl(PKCS12_create)p Fq(.)0 2059 y Fl(get_ca_certifica)o(te) -o(s\(\))208 2159 y Fq(Return)i(CA)h(certi\034cates)f(within)h(the)g(PK) -n(CS12)f(ob)5 b(ject)30 b(as)g(a)h(tuple.)46 b(Returns)31 -b Fl(None)e Fq(if)i(no)f(CA)h(certi\034cates)f(are)208 -2258 y(presen)n(t.)0 2405 y Fl(get_certificate\()o(\))208 -2505 y Fq(Return)d(certi\034cate)g(p)r(ortion)g(of)h(the)g(PK)n(CS12)e -(structure.)0 2652 y Fl(get_friendlyname)o(\(\))208 2751 -y Fq(Return)h(friendlyName)h(p)r(ortion)f(of)g(the)h(PK)n(CS12)f -(structure.)0 2898 y Fl(get_privatekey\(\))208 2998 y -Fq(Return)g(priv)-5 b(ate)27 b(k)n(ey)g(p)r(ortion)g(of)h(the)g(PK)n -(CS12)e(structure)0 3145 y Fl(set_ca_certifica)o(te)o(s\()p -Fc(c)-5 b(ac)l(erts)7 b Fl(\))208 3244 y Fq(Replace)27 -b(or)f(set)i(the)g(CA)g(certi\034cates)e(within)j(the)f(PK)n(CS12)e(ob) -5 b(ject)27 b(with)h(the)g(sequence)f Fc(c)l(ac)l(erts)7 -b Fq(.)208 3377 y(Set)28 b Fc(c)l(ac)l(erts)34 b Fq(to)27 -b Fl(None)f Fq(to)i(remo)n(v)n(e)e(all)h(CA)h(certi\034cates.)0 -3524 y Fl(set_certificate\()o Fc(c)l(ert)8 b Fl(\))208 -3624 y Fq(Replace)27 b(or)f(set)i(the)g(certi\034cate)f(p)r(ortion)g -(of)g(the)h(PK)n(CS12)f(structure.)0 3770 y Fl(set_friendlyname)o(\()p -Fc(n)o(ame)6 b Fl(\))208 3870 y Fq(Replace)27 b(or)f(set)i(the)g -(friendlyName)f(p)r(ortion)g(of)h(the)g(PK)n(CS12)e(structure.)0 -4017 y Fl(set_privatekey\()p Fc(pkey)7 b Fl(\))208 4117 -y Fq(Replace)27 b(or)f(set)i(priv)-5 b(ate)27 b(k)n(ey)g(p)r(ortion)g -(of)h(the)g(PK)n(CS12)e(structure)0 4380 y Ff(X509Extension)f(objects)0 -4580 y Fq(X509Extension)h(ob)5 b(jects)27 b(ha)n(v)n(e)g(sev)n(eral)f -(metho)r(ds:)0 4727 y Fl(get_critical\(\))208 4827 y -Fq(Return)h(the)h(critical)f(\034eld)h(of)f(the)h(extension)f(ob)5 -b(ject.)0 4973 y Fl(get_short_name\(\))208 5073 y Fq(Return)27 -b(the)h(short)f(t)n(yp)r(e)h(name)f(of)h(the)g(extension)f(ob)5 -b(ject.)p 0 5549 3901 4 v 0 5649 a Ff(3.1)82 b Fl(crypto)25 -b Ff(\026)j(Generic)g(cryptographic)e(mo)r(dule)2234 -b(9)p eop end -%%Page: 10 10 -TeXDict begin 10 9 bop 0 83 a Ff(Netscap)r(eSPKI)27 b(objects)0 -283 y Fq(Netscap)r(eSPKI)h(ob)5 b(jects)27 b(ha)n(v)n(e)f(the)i(follo)n -(wing)e(metho)r(ds:)0 430 y Fl(b64_encode\(\))208 530 -y Fq(Return)h(a)g(base64-enco)r(ded)f(string)h(represen)n(tation)e(of)j -(the)g(ob)5 b(ject.)0 677 y Fl(get_pubkey\(\))208 776 -y Fq(Return)27 b(the)h(public)g(k)n(ey)f(of)h(ob)5 b(ject.)0 -923 y Fl(set_pubkey\()p Fc(key)i Fl(\))208 1023 y Fq(Set)28 -b(the)f(public)h(k)n(ey)f(of)h(the)g(ob)5 b(ject)27 b(to)h -Fc(key)7 b Fq(.)0 1170 y Fl(sign\()p Fc(key,)29 b(digest_name)6 -b Fl(\))208 1269 y Fq(Sign)30 b(the)h(Netscap)r(eSPKI)f(ob)5 -b(ject)30 b(using)g(the)h(giv)n(en)f Fc(key)38 b Fq(and)31 -b Fc(digest_name)6 b Fq(.)46 b Fc(digest_name)37 b Fq(m)n(ust)31 -b(b)r(e)g(a)f(string)208 1369 y(describing)e(a)i(digest)f(algorithm)f -(supp)r(orted)i(b)n(y)f(Op)r(enSSL)h(\(b)n(y)g(EVP_get_digestb)n -(yname,)f(sp)r(eci\034cally\).)43 b(F)-7 b(or)208 1469 -y(example,)27 b Fl("md5")e Fq(or)i Fl("sha1")p Fq(.)0 -1616 y Fl(verify\()p Fc(key)7 b Fl(\))208 1715 y Fq(V)-7 -b(erify)27 b(the)h(Netscap)r(eSPKI)g(ob)5 b(ject)27 b(using)g(the)h -(giv)n(en)f Fc(key)7 b Fq(.)0 1978 y Ff(CRL)27 b(objects)0 -2179 y Fq(CRL)h(ob)5 b(jects)27 b(ha)n(v)n(e)f(the)i(follo)n(wing)e -(metho)r(ds:)0 2326 y Fl(add_revoked\()p Fc(r)l(evoke)l(d)9 -b Fl(\))208 2425 y Fq(A)n(dd)27 b(a)h(Rev)n(ok)n(ed)e(ob)5 -b(ject)27 b(to)g(the)h(CRL,)g(b)n(y)f(v)-5 b(alue)28 -b(not)f(reference.)0 2586 y Fl(export\()p Fc(c)l(ert,)g(key)7 -b Fb([)p Fc(,)31 b(typ)l(e=FILETYPE_PEM)c Fb(][)p Fc(,)i(days=100)c -Fb(])p Fl(\))208 2686 y Fq(Use)i Fc(c)l(ert)36 b Fq(and)28 -b Fc(key)36 b Fq(to)27 b(sign)h(the)g(CRL)g(and)g(return)f(the)h(CRL)g -(as)g(a)f(string.)37 b Fc(days)f Fq(is)28 b(the)g(n)n(um)n(b)r(er)g(of) -g(da)n(ys)e(b)r(efore)208 2786 y(the)i(next)f(CRL)h(is)f(due.)0 -2933 y Fl(get_revoked\(\))208 3032 y Fq(Return)g(a)g(tuple)i(of)e(Rev)n -(ok)n(ed)f(ob)5 b(jects,)27 b(b)n(y)h(v)-5 b(alue)27 -b(not)h(reference.)0 3295 y Ff(Revok)n(ed)e(objects)0 -3496 y Fq(Rev)n(ok)n(ed)g(ob)5 b(jects)27 b(ha)n(v)n(e)g(the)h(follo)n -(wing)e(metho)r(ds:)0 3643 y Fl(all_reasons\(\))208 3742 -y Fq(Return)h(a)g(list)h(of)g(all)f(supp)r(orted)g(reasons.)0 -3889 y Fl(get_reason\(\))208 3989 y Fq(Return)g(the)h(rev)n(o)r(cation) -e(reason)g(as)h(a)g(str.)36 b(Can)28 b(b)r(e)g(None,)f(whic)n(h)h -(di\033ers)f(from)g("Unsp)r(eci\034ed".)0 4136 y Fl(get_rev_date\(\)) -208 4235 y Fq(Return)g(the)h(rev)n(o)r(cation)e(date)h(as)g(a)g(str.)37 -b(The)27 b(string)g(is)h(formatted)f(as)g(an)g(ASN1)h(GENERALIZEDTIME.) -0 4382 y Fl(get_serial\(\))208 4482 y Fq(Return)f(a)g(str)h(con)n -(taining)e(a)h(hex)h(n)n(um)n(b)r(er)f(of)h(the)f(serial)g(of)g(the)h -(rev)n(ok)n(ed)e(certi\034cate.)0 4629 y Fl(set_reason\()p -Fc(r)l(e)l(ason)6 b Fl(\))208 4728 y Fq(Set)32 b(the)g(rev)n(o)r -(cation)e(reason.)47 b Fc(r)l(e)l(ason)39 b Fq(m)n(ust)32 -b(b)r(e)g(None)f(or)g(a)g(string,)i(but)f(the)g(v)-5 -b(alues)31 b(are)g(limited.)50 b(Spaces)31 b(and)208 -4828 y(case)26 b(are)h(ignored.)35 b(See)28 b Fl(all_reasons)p -Fq(.)0 4975 y Fl(set_rev_date\()p Fc(date)6 b Fl(\))208 -5074 y Fq(Set)28 b(the)f(rev)n(o)r(cation)f(date.)37 -b(The)28 b(string)e(is)i(formatted)f(as)g(an)g(ASN1)h(GENERALIZEDTIME.) -0 5221 y Fl(set_serial\()p Fc(serial)9 b Fl(\))208 5321 -y Fc(serial)37 b Fq(is)27 b(a)h(string)f(con)n(taining)f(a)h(hex)h(n)n -(um)n(b)r(er)f(of)g(the)h(serial)f(of)g(the)h(rev)n(ok)n(ed)e -(certi\034cate.)p 0 5549 3901 4 v 0 5649 a Ff(10)2197 -b(3)83 b Fl(OpenSSL)24 b Ff(\026)k(Python)f(interface)h(to)f(Op)r -(enSSL)p eop end -%%Page: 11 11 -TeXDict begin 11 10 bop 0 83 a Fj(3.2)97 b Fd(rand)34 -b Fj(\026)e(An)h(interface)g(to)g(the)g(Op)s(enSSL)f(pseudo)h(random)g -(numb)s(er)g(generato)m(r)0 283 y Fq(This)28 b(mo)r(dule)f(handles)h -(the)f(Op)r(enSSL)h(pseudo)f(random)g(n)n(um)n(b)r(er)g(generator)f -(\(PRNG\))j(and)e(declares)f(the)i(follo)n(wing:)0 430 -y Fl(add\()p Fc(string,)g(entr)l(opy)7 b Fl(\))208 530 -y Fq(Mix)22 b(b)n(ytes)g(from)g Fc(string)30 b Fq(in)n(to)22 -b(the)h(PRNG)h(state.)35 b(The)22 b Fc(entr)l(opy)30 -b Fq(argumen)n(t)22 b(is)g(\(the)h(lo)n(w)n(er)e(b)r(ound)i(of)6 -b(\))23 b(an)f(estimate)208 630 y(of)f(ho)n(w)g(m)n(uc)n(h)h -(randomness)e(is)h(con)n(tained)g(in)h Fc(string)7 b -Fq(,)23 b(measured)e(in)h(b)n(ytes.)34 b(F)-7 b(or)21 -b(more)g(information,)h(see)g(e.g.)34 b(RF)n(C)208 729 -y(1750.)0 876 y Fl(bytes\()p Fc(num_bytes)7 b Fl(\))208 -976 y Fq(Get)28 b(some)e(random)h(b)n(ytes)g(from)g(the)h(PRNG)h(as)e -(a)g(string.)208 1109 y(This)g(is)h(a)f(wrapp)r(er)f(for)h(the)h(C)g -(function)g Fl(RAND_bytes)p Fq(.)0 1255 y Fl(cleanup\(\))208 -1355 y Fq(Erase)e(the)i(memory)f(used)h(b)n(y)f(the)h(PRNG.)208 -1488 y(This)f(is)h(a)f(wrapp)r(er)f(for)h(the)h(C)g(function)g -Fl(RAND_cleanup)p Fq(.)0 1651 y Fl(egd\()p Fc(p)l(ath)6 -b Fb([)p Fc(,)29 b(bytes)19 b Fb(])p Fl(\))208 1751 y -Fq(Query)29 b(the)j(En)n(trop)n(y)e(Gathering)g(Daemon)1629 -1721 y Fk(2)1697 1751 y Fq(on)h(so)r(c)n(k)n(et)f Fc(p)l(ath)38 -b Fq(for)30 b Fc(bytes)38 b Fq(b)n(ytes)31 b(of)g(random)f(data)g(and)h -(and)g(uses)208 1851 y Fl(add)26 b Fq(to)h(seed)h(the)g(PRNG.)g(The)g -(default)g(v)-5 b(alue)27 b(of)34 b Fc(bytes)h Fq(is)27 -b(255.)0 2012 y Fl(load_file\()p Fc(p)l(ath)6 b Fb([)p -Fc(,)26 b(bytes)19 b Fb(])p Fl(\))208 2112 y Fq(Read)29 -b Fc(bytes)38 b Fq(b)n(ytes)30 b(\(or)f(all)h(of)g(it,)i(if)37 -b Fc(bytes)g Fq(is)31 b(negativ)n(e\))e(of)h(data)g(from)g(the)g -(\034le)h Fc(p)l(ath)37 b Fq(to)30 b(seed)g(the)h(PRNG.)g(The)208 -2211 y(default)d(v)-5 b(alue)27 b(of)34 b Fc(bytes)h -Fq(is)27 b(-1.)0 2358 y Fl(screen\(\))208 2458 y Fq(A)n(dd)g(the)h -(curren)n(t)f(con)n(ten)n(ts)g(of)g(the)h(screen)f(to)g(the)h(PRNG)h -(state.)37 b(A)-9 b(v)k(ailabilit)n(y:)36 b(Windo)n(ws.)0 -2605 y Fl(seed\()p Fc(string)7 b Fl(\))208 2704 y Fq(This)27 -b(is)h(equiv)-5 b(alen)n(t)27 b(to)g(calling)h Fl(add)f -Fq(with)h Fc(entr)l(opy)35 b Fq(as)27 b(the)h(length)f(of)h(the)g -(string.)0 2851 y Fl(status\(\))208 2951 y Fq(Returns)f(true)g(if)i -(the)e(PRNG)i(has)e(b)r(een)h(seeded)f(with)h(enough)f(data,)g(and)h -(false)f(otherwise.)0 3098 y Fl(write_file\()p Fc(p)l(ath)6 -b Fl(\))208 3197 y Fq(W)-7 b(rite)34 b(a)g(n)n(um)n(b)r(er)g(of)h -(random)e(b)n(ytes)h(\(curren)n(tly)g(1024\))f(to)h(the)h(\034le)f -Fc(p)l(ath)6 b Fq(.)59 b(This)34 b(\034le)h(can)f(then)g(b)r(e)h(used)g -(with)208 3297 y Fl(load_file)23 b Fq(to)28 b(seed)f(the)h(PRNG)h -(again.)0 3444 y Fm(exception)j Fl(Error)208 3543 y Fq(If)i(the)g -(curren)n(t)f(RAND)i(metho)r(d)f(supp)r(orts)f(an)n(y)g(errors,)h(this) -g(is)f(raised)g(when)h(needed.)56 b(The)33 b(default)i(metho)r(d)208 -3643 y(do)r(es)27 b(not)g(raise)g(this)h(when)f(the)h(en)n(trop)n(y)e -(p)r(o)r(ol)i(is)f(depleted.)208 3776 y(Whenev)n(er)36 -b(this)h(exception)g(is)g(raised)f(directly)-7 b(,)40 -b(it)d(has)g(a)f(list)i(of)f(error)e(messages)g(from)i(the)h(Op)r -(enSSL)f(error)208 3875 y(queue,)k(where)d(eac)n(h)f(item)i(is)g(a)f -(tuple)h Fl(\()p Fc(lib)5 b Fl(,)44 b Fc(function)6 b -Fl(,)43 b Fc(r)l(e)l(ason)6 b Fl(\))p Fq(.)70 b(Here)38 -b Fc(lib)5 b Fq(,)43 b Fc(function)h Fq(and)39 b Fc(r)l(e)l(ason)45 -b Fq(are)37 b(all)208 3975 y(strings,)26 b(describing)h(where)g(and)g -(what)h(the)g(problem)f(is.)36 b(See)28 b Fc(err)p Fq(\(3\))g(for)f -(more)g(information.)0 4255 y Fj(3.3)97 b Fd(SSL)33 b -Fj(\026)f(An)h(interface)h(to)e(the)h(SSL-sp)s(eci\034c)h(pa)m(rts)f -(of)f(Op)s(enSSL)0 4455 y Fq(This)c(mo)r(dule)f(handles)h(things)f(sp)r -(eci\034c)h(to)f(SSL.)h(There)f(are)f(t)n(w)n(o)h(ob)5 -b(jects)27 b(de\034ned:)38 b(Con)n(text,)27 b(Connection.)0 -4602 y Fl(SSLv2_METHOD)0 4702 y(SSLv3_METHOD)0 4801 y(SSLv23_METHOD)0 -4901 y(TLSv1_METHOD)208 5001 y Fq(These)g(constan)n(ts)f(represen)n(t)h -(the)h(di\033eren)n(t)f(SSL)h(metho)r(ds)g(to)f(use)h(when)f(creating)g -(a)g(con)n(text)g(ob)5 b(ject.)0 5147 y Fl(VERIFY_NONE)0 -5247 y(VERIFY_PEER)p 0 5308 1560 4 v 92 5362 a Fh(2)127 -5385 y Fg(See)24 b Fp(http://www.lotha)n(r.com/tech/crypto/)p -0 5549 3901 4 v 0 5649 a Ff(3.2)82 b Fl(rand)26 b Ff(\026)i(An)g -(interface)f(to)g(the)h(Op)r(enSSL)g(pseudo)e(random)h(numb)r(er)h -(generato)n(r)1107 b(11)p eop end -%%Page: 12 12 -TeXDict begin 12 11 bop 0 83 a Fl(VERIFY_FAIL_IF_N)o(O_)o(PEE)o(R_)o -(CE)o(RT)208 183 y Fq(These)27 b(constan)n(ts)f(represen)n(t)h(the)h(v) -n(eri\034cation)e(mo)r(de)h(used)h(b)n(y)f(the)h(Con)n(text)f(ob)5 -b(ject's)27 b Fl(set_verify)d Fq(metho)r(d.)0 330 y Fl(FILETYPE_PEM)0 -429 y(FILETYPE_ASN1)208 529 y Fq(File)41 b(t)n(yp)r(e)g(constan)n(ts)f -(used)h(with)g(the)h Fl(use_certificate)o(_f)o(ile)34 -b Fq(and)41 b Fl(use_privatekey_f)o(il)o(e)35 b Fq(metho)r(ds)41 -b(of)208 628 y(Con)n(text)27 b(ob)5 b(jects.)0 775 y -Fl(OP_SINGLE_DH_USE)0 875 y(OP_EPHEMERAL_RSA)0 975 y(OP_NO_SSLv2)0 -1074 y(OP_NO_SSLv3)0 1174 y(OP_NO_TLSv1)208 1273 y Fq(Constan)n(ts)30 -b(used)i(with)g Fl(set_options)26 b Fq(of)32 b(Con)n(text)f(ob)5 -b(jects.)48 b Fl(OP_SINGLE_DH_USE)25 b Fq(means)31 b(to)g(alw)n(a)n(ys) -f(create)g(a)208 1373 y(new)19 b(k)n(ey)f(when)h(using)g(ephemeral)f -(Di\036e-Hellman.)34 b Fl(OP_EPHEMERAL_RSA)13 b Fq(means)18 -b(to)h(alw)n(a)n(ys)e(use)i(ephemeral)g(RSA)208 1473 -y(k)n(eys)f(when)h(doing)f(RSA)i(op)r(erations.)33 b -Fl(OP_NO_SSLv2)p Fq(,)16 b Fl(OP_NO_SSLv3)f Fq(and)k -Fl(OP_NO_TLSv1)14 b Fq(means)19 b(to)g(disable)f(those)208 -1572 y(sp)r(eci\034c)29 b(proto)r(cols.)39 b(This)29 -b(is)g(in)n(teresting)g(if)g(y)n(ou're)f(using)g(e.g.)41 -b Fl(SSLv23_METHOD)24 b Fq(to)29 b(get)g(an)f(SSLv2-compatible)208 -1672 y(handshak)n(e,)e(but)i(don't)g(w)n(an)n(t)f(to)g(use)h(SSLv2.)0 -1819 y Fl(ContextType)208 1918 y Fq(See)f Fl(Context)p -Fq(.)0 2065 y Fm(class)k Fl(Context\()p Fc(metho)l(d)9 -b Fl(\))208 2165 y Fq(A)27 b(class)g(represen)n(ting)f(SSL)i(con)n -(texts.)36 b(Con)n(texts)27 b(de\034ne)h(the)g(parameters)d(of)j(one)f -(or)g(more)f(SSL)i(connections.)208 2298 y Fc(metho)l(d)36 -b Fq(should)28 b(b)r(e)g Fl(SSLv2_METHOD)p Fq(,)22 b -Fl(SSLv3_METHOD)p Fq(,)h Fl(SSLv23_METHOD)f Fq(or)27 -b Fl(TLSv1_METHOD)p Fq(.)0 2445 y Fl(ConnectionType)208 -2544 y Fq(See)g Fl(Connection)p Fq(.)0 2691 y Fm(class)k -Fl(Connection\()p Fc(c)l(ontext,)25 b(so)l(cket)8 b Fl(\))208 -2791 y Fq(A)27 b(class)g(represen)n(ting)f(SSL)i(connections.)208 -2924 y Fc(c)l(ontext)44 b Fq(should)37 b(b)r(e)g(an)g(instance)g(of)44 -b Fl(Context)34 b Fq(and)j Fc(so)l(cket)46 b Fq(should)37 -b(b)r(e)g(a)g(so)r(c)n(k)n(et)2978 2893 y Fk(3)3053 2924 -y Fq(ob)5 b(ject.)66 b Fc(so)l(cket)45 b Fq(ma)n(y)37 -b(b)r(e)208 3023 y Fc(None)6 b Fq(;)27 b(in)h(this)g(case,)e(the)i -(Connection)f(is)g(created)g(with)h(a)f(memory)g(BIO:)f(see)h(the)h -Fl(bio_read)p Fq(,)c Fl(bio_write)p Fq(,)g(and)208 3123 -y Fl(bio_shutdown)e Fq(metho)r(ds.)0 3270 y Fm(exception)32 -b Fl(Error)208 3369 y Fq(This)i(exception)g(is)h(used)f(as)g(a)h(base)e -(class)h(for)g(the)h(other)f(SSL-related)g(exceptions,)i(but)f(ma)n(y)f -(also)f(b)r(e)i(raised)208 3469 y(directly)-7 b(.)208 -3602 y(Whenev)n(er)36 b(this)h(exception)g(is)g(raised)f(directly)-7 -b(,)40 b(it)d(has)g(a)f(list)i(of)f(error)e(messages)g(from)i(the)h(Op) -r(enSSL)f(error)208 3701 y(queue,)k(where)d(eac)n(h)f(item)i(is)g(a)f -(tuple)h Fl(\()p Fc(lib)5 b Fl(,)44 b Fc(function)6 b -Fl(,)43 b Fc(r)l(e)l(ason)6 b Fl(\))p Fq(.)70 b(Here)38 -b Fc(lib)5 b Fq(,)43 b Fc(function)h Fq(and)39 b Fc(r)l(e)l(ason)45 -b Fq(are)37 b(all)208 3801 y(strings,)26 b(describing)h(where)g(and)g -(what)h(the)g(problem)f(is.)36 b(See)28 b Fc(err)p Fq(\(3\))g(for)f -(more)g(information.)0 3948 y Fm(exception)32 b Fl(ZeroReturnError)208 -4048 y Fq(This)g(exception)g(matc)n(hes)g(the)h(error)d(return)i(co)r -(de)h Fl(SSL_ERROR_ZERO_)o(RE)o(TUR)o(N)p Fq(,)26 b(and)33 -b(is)f(raised)f(when)i(the)g(SSL)208 4147 y(Connection)c(has)g(b)r(een) -h(closed.)43 b(In)29 b(SSL)h(3.0)f(and)h(TLS)g(1.0,)f(this)h(only)f(o)r -(ccurs)g(if)h(a)g(closure)e(alert)h(has)g(o)r(ccurred)208 -4247 y(in)g(the)g(proto)r(col,)f(i.e.)41 b(the)29 b(connection)f(has)g -(b)r(een)i(closed)e(cleanly)-7 b(.)40 b(Note)29 b(that)g(this)g(do)r -(es)f(not)h(necessarily)e(mean)208 4346 y(that)g(the)h(transp)r(ort)f -(la)n(y)n(er)f(\(e.g.)36 b(a)28 b(so)r(c)n(k)n(et\))e(has)h(b)r(een)h -(closed.)208 4479 y(It)k(ma)n(y)f(seem)h(a)f(little)i(strange)e(that)h -(this)g(is)g(an)g(exception,)g(but)h(it)f(do)r(es)g(matc)n(h)g(an)f -Fl(SSL_ERROR)e Fq(co)r(de,)j(and)g(is)208 4579 y(v)n(ery)26 -b(con)n(v)n(enien)n(t.)0 4726 y Fm(exception)32 b Fl(WantReadError)208 -4825 y Fq(The)i(op)r(eration)e(did)j(not)f(complete;)j(the)d(same)g -(I/O)f(metho)r(d)h(should)g(b)r(e)g(called)g(again)f(later,)i(with)f -(the)h(same)208 4925 y(argumen)n(ts.)g(An)n(y)28 b(I/O)e(metho)r(d)i -(can)f(lead)h(to)f(this)h(since)f(new)h(handshak)n(es)e(can)h(o)r(ccur) -g(at)g(an)n(y)g(time.)208 5058 y(The)44 b(w)n(an)n(ted)h(read)f(is)g -(for)h Fc(dirty)g Fq(data)g(sen)n(t)f(o)n(v)n(er)f(the)j(net)n(w)n -(ork,)h(not)e(the)h Fc(cle)l(an)f Fq(data)f(inside)h(the)g(tunnel.)208 -5157 y(F)-7 b(or)39 b(a)i(so)r(c)n(k)n(et)e(based)h(SSL)h(connection,)i -Fc(r)l(e)l(ad)e Fq(means)f(data)g(coming)g(at)g(us)h(o)n(v)n(er)e(the)i -(net)n(w)n(ork.)74 b(Un)n(til)41 b(that)p 0 5227 1560 -4 v 92 5280 a Fh(3)127 5304 y Fg(A)n(ctually)-6 b(,)25 -b(all)e(that)j(is)d(required)j(is)e(an)g(ob)t(ject)h(that)h -Fa(b)l(ehaves)e Fg(lik)n(e)g(a)h(so)r(c)n(k)n(et,)g(y)n(ou)g(could)g -(ev)n(en)g(use)f(\034les,)g(ev)n(en)i(though)f(it'd)f(b)r(e)h(tric)n -(ky)g(to)0 5383 y(get)g(the)f(handshak)n(es)h(righ)n(t!)p -0 5549 3901 4 v 0 5649 a Ff(12)2197 b(3)83 b Fl(OpenSSL)24 -b Ff(\026)k(Python)f(interface)h(to)f(Op)r(enSSL)p eop -end -%%Page: 13 13 -TeXDict begin 13 12 bop 208 83 a Fq(read)38 b(succeeds,)k(the)d -(attempted)h Fl(OpenSSL.SSL.Conn)o(ect)o(io)o(n.)o(rec)o(v)p -Fq(,)c Fl(OpenSSL.SSL.Conn)o(ec)o(tio)o(n.)o(se)o(nd)p -Fq(,)g(or)208 183 y Fl(OpenSSL.SSL.Con)o(ne)o(ct)o(ion)o(.d)o(o_h)o(an) -o(ds)o(hak)o(e)15 b Fq(is)22 b(prev)n(en)n(ted)e(or)h(incomplete.)35 -b(Y)-7 b(ou)22 b(probably)e(w)n(an)n(t)h(to)g Fl(select\(\))208 -282 y Fq(on)27 b(the)h(so)r(c)n(k)n(et)e(b)r(efore)h(trying)g(again.)0 -429 y Fm(exception)32 b Fl(WantWriteError)208 529 y Fq(See)27 -b Fl(WantReadError)p Fq(.)32 b(The)27 b(so)r(c)n(k)n(et)g(send)g -(bu\033er)h(ma)n(y)f(b)r(e)h(to)r(o)f(full)h(to)g(write)f(more)g(data.) -0 676 y Fm(exception)32 b Fl(WantX509LookupE)o(rr)o(or)208 -775 y Fq(The)24 b(op)r(eration)g(did)h(not)g(complete)f(b)r(ecause)g -(an)h(application)f(callbac)n(k)f(has)h(ask)n(ed)g(to)g(b)r(e)h(called) -g(again.)34 b(The)25 b(I/O)208 875 y(metho)r(d)f(should)h(b)r(e)f -(called)g(again)g(later,)g(with)h(the)g(same)e(argumen)n(ts.)35 -b(Note:)g(This)24 b(w)n(on't)h(o)r(ccur)e(in)i(this)g(v)n(ersion,)208 -975 y(as)h(there)i(are)e(no)i(suc)n(h)f(callbac)n(ks)f(in)i(this)f(v)n -(ersion.)0 1121 y Fm(exception)32 b Fl(SysCallError)208 -1221 y Fq(The)25 b Fl(SysCallError)20 b Fq(o)r(ccurs)k(when)i(there's)e -(an)h(I/O)g(error)e(and)i(Op)r(enSSL's)g(error)e(queue)i(do)r(es)g(not) -g(con)n(tain)g(an)n(y)208 1321 y(information.)59 b(This)36 -b(can)f(mean)g(t)n(w)n(o)g(things:)52 b(An)36 b(error)d(in)j(the)g -(transp)r(ort)e(proto)r(col,)i(or)f(an)g(end)h(of)f(\034le)h(that)208 -1420 y(violates)26 b(the)i(proto)r(col.)36 b(The)27 b(parameter)f(to)i -(the)g(exception)f(is)g(alw)n(a)n(ys)f(a)h(pair)g Fl(\()p -Fc(errnum)6 b Fl(,)42 b Fc(errstr)9 b Fl(\))p Fq(.)0 -1683 y Ff(Context)27 b(objects)0 1884 y Fq(Con)n(text)g(ob)5 -b(jects)27 b(ha)n(v)n(e)g(the)h(follo)n(wing)e(metho)r(ds:)0 -2031 y Fl(check_privatekey)o(\(\))208 2147 y Fq(Chec)n(k)k(if)i(the)g -(priv)-5 b(ate)31 b(k)n(ey)f(\(loaded)h(with)h Fl(use_privatekey)p -Fb([)p Fl(_)o(fi)o(le)11 b Fb(])p Fq(\))26 b(matc)n(hes)k(the)i -(certi\034cate)f(\(loaded)g(with)208 2275 y Fl(use_certificate)o -Fb([)p Fl(_)o(fil)o(e)11 b Fb(])p Fq(\).)31 b(Returns)d -Fl(None)e Fq(if)i(they)f(matc)n(h,)h(raises)e Fl(Error)g -Fq(otherwise.)0 2421 y Fl(get_app_data\(\))208 2521 y -Fq(Retriev)n(e)g(application)h(data)g(as)g(set)h(b)n(y)g -Fl(set_app_data)p Fq(.)0 2668 y Fl(get_cert_store\(\))208 -2768 y Fq(Retriev)n(e)34 b(the)i(certi\034cate)f(store)f(\(a)h -(X509Store)f(ob)5 b(ject\))35 b(that)h(the)f(con)n(text)g(uses.)60 -b(This)35 b(can)g(b)r(e)h(used)f(to)g(add)208 2867 y("trusted")26 -b(certi\034cates)h(without)h(using)f(the.)37 b Fl(load_verify_loca)o -(tio)o(ns)o(\(\))21 b Fq(metho)r(d.)0 3014 y Fl(get_timeout\(\))208 -3114 y Fq(Retriev)n(e)26 b(session)h(timeout,)h(as)f(set)g(b)n(y)i -Fl(set_timeout)p Fq(.)j(The)c(default)g(is)f(300)f(seconds.)0 -3261 y Fl(get_verify_depth)o(\(\))208 3360 y Fq(Retriev)n(e)g(the)i -(Con)n(text)f(ob)5 b(ject's)28 b(v)n(erify)e(depth,)j(as)d(set)i(b)n(y) -g Fl(set_verify_depth)p Fq(.)0 3507 y Fl(get_verify_mode\()o(\))208 -3607 y Fq(Retriev)n(e)e(the)i(Con)n(text)f(ob)5 b(ject's)28 -b(v)n(erify)e(mo)r(de,)i(as)f(set)h(b)n(y)g Fl(set_verify)p -Fq(.)0 3754 y Fl(load_client_ca\()p Fc(p)l(em\034le)6 -b Fl(\))208 3853 y Fq(Read)33 b(a)g(\034le)h(with)g(PEM-formatted)g -(certi\034cates)f(that)h(will)g(b)r(e)g(sen)n(t)f(to)h(the)g(clien)n(t) -f(when)h(requesting)f(a)g(clien)n(t)208 3953 y(certi\034cate.)0 -4100 y Fl(set_client_ca_li)o(st)o(\()p Fc(c)l(erti\034c)l(ate_au)o -(thorities)7 b Fl(\))208 4199 y Fq(Replace)23 b(the)h(curren)n(t)g -(list)g(of)g(preferred)f(certi\034cate)g(signers)g(that)h(w)n(ould)f(b) -r(e)i(sen)n(t)f(to)g(the)g(clien)n(t)g(when)g(requesting)208 -4299 y(a)j(clien)n(t)g(certi\034cate)g(with)h(the)g Fc(c)l(erti\034c)l -(ate_authorities)35 b Fq(sequence)27 b(of)34 b Fl(OpenSSL.crypto.X5)o -(09)o(Na)o(me)p Fq(s)o(.)208 4432 y(New)27 b(in)h(v)n(ersion)e(0.10.)0 -4579 y Fl(add_client_ca\()p Fc(c)l(erti\034c)l(ate_aut)o(hority)7 -b Fl(\))208 4678 y Fq(Extract)22 b(a)g Fl(OpenSSL.crypto.X)o(50)o(9Na)o -(me)16 b Fq(from)22 b(the)h Fc(c)l(erti\034c)l(ate_authority)30 -b Fl(OpenSSL.crypto.X)o(509)16 b Fq(certi\034cate)208 -4778 y(and)k(add)g(it)h(to)f(the)h(list)f(of)h(preferred)e -(certi\034cate)h(signers)f(sen)n(t)h(to)g(the)h(clien)n(t)f(when)h -(requesting)e(a)h(clien)n(t)h(certi\034cate.)208 4911 -y(New)27 b(in)h(v)n(ersion)e(0.10.)0 5058 y Fl(load_verify_loca)o(ti)o -(ons)o(\()p Fc(p)l(em\034le,)e(c)l(ap)l(ath)6 b Fl(\))208 -5157 y Fq(Sp)r(ecify)24 b(where)f(CA)g(certi\034cates)g(for)g(v)n -(eri\034cation)f(purp)r(oses)h(are)f(lo)r(cated.)35 b(These)23 -b(are)g(trusted)g(certi\034cates.)35 b(Note)208 5257 -y(that)c(the)g(certi\034cates)f(ha)n(v)n(e)f(to)i(b)r(e)g(in)g(PEM)h -(format.)46 b(If)31 b(capath)f(is)h(passed,)f(it)i(m)n(ust)e(b)r(e)i(a) -e(directory)f(prepared)208 5356 y(using)i(the)h Fl(c_rehash)c -Fq(to)r(ol)j(included)h(with)g(Op)r(enSSL.)g(Either,)h(but)f(not)g(b)r -(oth,)h(of)38 b Fc(p)l(em\034le)g Fq(or)31 b Fc(c)l(ap)l(ath)39 -b Fq(ma)n(y)31 b(b)r(e)p 0 5549 3901 4 v 0 5649 a Ff(3.3)82 -b Fl(SSL)26 b Ff(\026)i(An)g(interface)g(to)f(the)g(SSL-sp)r(eci\034c)h -(pa)n(rts)f(of)h(Op)r(enSSL)1611 b(13)p eop end -%%Page: 14 14 -TeXDict begin 14 13 bop 208 83 a Fl(None)p Fq(.)0 230 -y Fl(set_default_veri)o(fy)o(_pa)o(th)o(s\()o(\))208 -330 y Fq(Sp)r(ecify)20 b(that)h(the)g(platform)f(pro)n(vided)f(CA)h -(certi\034cates)g(are)f(to)h(b)r(e)h(used)f(for)g(v)n(eri\034cation)f -(purp)r(oses.)33 b(This)21 b(metho)r(d)208 429 y(ma)n(y)26 -b(not)i(w)n(ork)e(prop)r(erly)h(on)g(OS)g(X.)0 576 y -Fl(load_tmp_dh\()p Fc(dh\034le)6 b Fl(\))208 676 y Fq(Load)26 -b(parameters)g(for)h(Ephemeral)g(Di\036e-Hellman)h(from)g -Fc(dh\034le)6 b Fq(.)0 823 y Fl(set_app_data\()p Fc(data)g -Fl(\))208 922 y Fq(Asso)r(ciate)25 b Fc(data)33 b Fq(with)27 -b(this)f(Con)n(text)f(ob)5 b(ject.)36 b Fc(data)e Fq(can)25 -b(b)r(e)i(retriev)n(ed)d(later)i(using)f(the)i Fl(get_app_data)21 -b Fq(metho)r(d.)0 1069 y Fl(set_cipher_list\()o Fc(ciphers)7 -b Fl(\))208 1169 y Fq(Set)28 b(the)g(list)h(of)f(ciphers)f(to)h(b)r(e)g -(used)g(in)g(this)h(con)n(text.)37 b(See)28 b(the)h(Op)r(enSSL)f(man)n -(ual)f(for)h(more)f(information)g(\(e.g.)208 1268 y(ciphers\(1\)\))0 -1415 y Fl(set_info_callbac)o(k\()o Fc(c)l(al)t(lb)l(ack)9 -b Fl(\))208 1515 y Fq(Set)33 b(the)f(information)g(callbac)n(k)f(to)i -Fc(c)l(al)t(lb)l(ack)9 b Fq(.)54 b(This)32 b(function)h(will)g(b)r(e)g -(called)f(from)g(time)h(to)g(time)g(during)f(SSL)208 -1614 y(handshak)n(es.)49 b Fc(c)l(al)t(lb)l(ack)43 b -Fq(should)32 b(tak)n(e)g(three)g(argumen)n(ts:)45 b(a)32 -b(Connection)g(ob)5 b(ject)32 b(and)g(t)n(w)n(o)g(in)n(tegers.)50 -b(The)32 b(\034rst)208 1714 y(in)n(teger)f(sp)r(eci\034es)g(where)h(in) -g(the)g(SSL)g(handshak)n(e)f(the)h(function)h(w)n(as)e(called,)h(and)g -(the)g(other)g(the)g(return)f(co)r(de)208 1814 y(from)c(a)g(\(p)r -(ossibly)g(failed\))h(in)n(ternal)f(function)h(call.)0 -1961 y Fl(set_options\()p Fc(options)7 b Fl(\))208 2060 -y Fq(A)n(dd)28 b(SSL)h(options.)38 b(Options)28 b(y)n(ou)f(ha)n(v)n(e)g -(set)i(b)r(efore)f(are)f(not)h(cleared!)38 b(This)28 -b(metho)r(d)h(should)f(b)r(e)h(used)f(with)h(the)208 -2160 y Fl(OP_*)d Fq(constan)n(ts.)0 2307 y Fl(set_passwd_cb\()p -Fc(c)l(al)t(lb)l(ack)9 b Fb([)p Fc(,)25 b(user)l(data)19 -b Fb(])p Fl(\))208 2406 y Fq(Set)42 b(the)g(passphrase)f(callbac)n(k)f -(to)i Fc(c)l(al)t(lb)l(ack)9 b Fq(.)82 b(This)42 b(function)h(will)f(b) -r(e)g(called)g(when)g(a)g(priv)-5 b(ate)42 b(k)n(ey)f(with)h(a)208 -2506 y(passphrase)32 b(is)i(loaded.)56 b Fc(c)l(al)t(lb)l(ack)45 -b Fq(m)n(ust)34 b(accept)g(three)g(p)r(ositional)f(argumen)n(ts.)56 -b(First,)35 b(an)f(in)n(teger)f(giving)h(the)208 2606 -y(maxim)n(um)e(length)i(of)f(the)g(passphrase)f(it)h(ma)n(y)g(return.) -53 b(If)33 b(the)h(returned)e(passphrase)g(is)h(longer)f(than)h(this,)i -(it)208 2705 y(will)29 b(b)r(e)h(truncated.)43 b(Second,)30 -b(a)f(b)r(o)r(olean)g(v)-5 b(alue)29 b(whic)n(h)h(will)g(b)r(e)g(true)f -(if)h(the)g(user)f(should)g(b)r(e)h(prompted)g(for)f(the)208 -2805 y(passphrase)k(t)n(wice)h(and)h(the)g(callbac)n(k)f(should)g(v)n -(erify)h(that)g(the)g(t)n(w)n(o)f(v)-5 b(alues)35 b(supplied)g(are)f -(equal.)58 b(Third,)37 b(the)208 2904 y(v)-5 b(alue)27 -b(giv)n(en)g(as)g(the)h Fc(user)l(data)35 b Fq(parameter)26 -b(to)h Fl(set_passwd_cb)p Fq(.)32 b(If)c(an)g(error)d(o)r(ccurs,)i -Fc(c)l(al)t(lb)l(ack)39 b Fq(should)27 b(return)g(a)208 -3004 y(false)g(v)-5 b(alue)27 b(\(e.g.)37 b(an)27 b(empt)n(y)h -(string\).)0 3151 y Fl(set_session_id\()p Fc(n)o(ame)6 -b Fl(\))208 3251 y Fq(Set)33 b(the)h(con)n(text)f Fc(name)39 -b Fq(within)34 b(whic)n(h)f(a)g(session)f(can)h(b)r(e)h(reused)e(for)h -(this)g(Con)n(text)g(ob)5 b(ject.)54 b(This)33 b(is)g(needed)208 -3350 y(when)e(doing)g(session)g(resumption,)h(b)r(ecause)g(there)f(is)h -(no)f(w)n(a)n(y)g(for)g(a)g(stored)g(session)f(to)i(kno)n(w)f(whic)n(h) -g(Con)n(text)208 3450 y(ob)5 b(ject)27 b(it)h(is)f(asso)r(ciated)g -(with.)37 b Fc(name)d Fq(ma)n(y)27 b(b)r(e)h(an)n(y)e(binary)h(data.)0 -3597 y Fl(set_timeout\()p Fc(time)l(out)8 b Fl(\))208 -3696 y Fq(Set)29 b(the)g(timeout)h(for)e(newly)h(created)f(sessions)g -(for)h(this)g(Con)n(text)g(ob)5 b(ject)28 b(to)h Fc(time)l(out)8 -b Fq(.)41 b Fc(time)l(out)36 b Fq(m)n(ust)29 b(b)r(e)h(giv)n(en)208 -3796 y(in)f(\(whole\))f(seconds.)40 b(The)29 b(default)g(v)-5 -b(alue)28 b(is)h(300)e(seconds.)40 b(See)29 b(the)g(Op)r(enSSL)g(man)n -(ual)f(for)g(more)g(information)208 3896 y(\(e.g.)36 -b(SSL_CTX_set_timeout\(3\)\).)0 4042 y Fl(set_verify\()p -Fc(mo)l(de,)26 b(c)l(al)t(lb)l(ack)9 b Fl(\))208 4142 -y Fq(Set)36 b(the)h(v)n(eri\034cation)e(\035ags)g(for)h(this)h(Con)n -(text)f(ob)5 b(ject)36 b(to)g Fc(mo)l(de)44 b Fq(and)36 -b(sp)r(ecify)g(that)h Fc(c)l(al)t(lb)l(ack)47 b Fq(should)36 -b(b)r(e)h(used)208 4242 y(for)30 b(v)n(eri\034cation)g(callbac)n(ks.)45 -b Fc(mo)l(de)38 b Fq(should)31 b(b)r(e)h(one)e(of)38 -b Fl(VERIFY_NONE)26 b Fq(and)31 b Fl(VERIFY_PEER)p Fq(.)c(If)38 -b Fl(VERIFY_PEER)26 b Fq(is)208 4341 y(used,)j Fc(mo)l(de)36 -b Fq(can)29 b(b)r(e)g(OR:ed)g(with)g Fl(VERIFY_FAIL_IF_NO)o(_P)o(EE)o -(R_C)o(ER)o(T)23 b Fq(and)29 b Fl(VERIFY_CLIENT_O)o(NCE)22 -b Fq(to)29 b(further)208 4441 y(con)n(trol)23 b(the)j(b)r(eha)n(viour.) -34 b Fc(c)l(al)t(lb)l(ack)i Fq(should)25 b(tak)n(e)f(\034v)n(e)h -(argumen)n(ts:)34 b(A)25 b(Connection)g(ob)5 b(ject,)25 -b(an)g(X509)f(ob)5 b(ject,)25 b(and)208 4541 y(three)e(in)n(teger)g(v) --5 b(ariables,)23 b(whic)n(h)h(are)f(in)h(turn)g(p)r(oten)n(tial)g -(error)d(n)n(um)n(b)r(er,)k(error)c(depth)k(and)f(return)f(co)r(de.)35 -b Fc(c)l(al)t(lb)l(ack)208 4640 y Fq(should)27 b(return)g(true)g(if)h -(v)n(eri\034cation)f(passes)f(and)h(false)h(otherwise.)0 -4787 y Fl(set_verify_depth)o(\()p Fc(depth)6 b Fl(\))208 -4887 y Fq(Set)36 b(the)g(maxim)n(um)f(depth)h(for)g(the)g -(certi\034cate)f(c)n(hain)g(v)n(eri\034cation)f(that)i(shall)f(b)r(e)h -(allo)n(w)n(ed)e(for)i(this)f(Con)n(text)208 4986 y(ob)5 -b(ject.)0 5133 y Fl(use_certificate\()o Fc(c)l(ert)j -Fl(\))208 5233 y Fq(Use)27 b(the)h(certi\034cate)f Fc(c)l(ert)35 -b Fq(whic)n(h)28 b(has)f(to)g(b)r(e)h(a)f(X509)g(ob)5 -b(ject.)0 5380 y Fl(add_extra_chain_)o(ce)o(rt\()o Fc(c)l(ert)j -Fl(\))p 0 5549 3901 4 v 0 5649 a Ff(14)2197 b(3)83 b -Fl(OpenSSL)24 b Ff(\026)k(Python)f(interface)h(to)f(Op)r(enSSL)p -eop end -%%Page: 15 15 -TeXDict begin 15 14 bop 208 83 a Fq(A)n(dds)32 b(the)h(certi\034cate)f -Fc(c)l(ert)8 b Fq(,)34 b(whic)n(h)f(has)f(to)g(b)r(e)i(a)e(X509)f(ob)5 -b(ject,)34 b(to)f(the)g(certi\034cate)f(c)n(hain)g(presen)n(ted)g -(together)208 183 y(with)c(the)g(certi\034cate.)0 330 -y Fl(use_certificate_)o(ch)o(ain)o(_f)o(il)o(e\()p Fc(\034)o(le)6 -b Fl(\))208 429 y Fq(Load)26 b(a)h(certi\034cate)g(c)n(hain)g(from)h -Fc(\034le)34 b Fq(whic)n(h)27 b(m)n(ust)h(b)r(e)g(PEM)g(enco)r(ded.)0 -576 y Fl(use_privatekey\()p Fc(pkey)7 b Fl(\))208 676 -y Fq(Use)27 b(the)h(priv)-5 b(ate)27 b(k)n(ey)h Fc(pkey)36 -b Fq(whic)n(h)28 b(has)f(to)g(b)r(e)h(a)f(PKey)h(ob)5 -b(ject.)0 837 y Fl(use_certificate_)o(fi)o(le\()o Fc(\034le)h -Fb([)p Fc(,)24 b(format)d Fb(])p Fl(\))208 937 y Fq(Load)i(the)h -(\034rst)g(certi\034cate)f(found)h(in)h Fc(\034le)6 b -Fq(.)36 b(The)24 b(certi\034cate)f(m)n(ust)h(b)r(e)h(in)f(the)g(format) -g(sp)r(eci\034ed)g(b)n(y)h Fc(format)8 b Fq(,)25 b(whic)n(h)208 -1036 y(is)i(either)g Fl(FILETYPE_PEM)c Fq(or)k Fl(FILETYPE_ASN1)p -Fq(.)k(The)d(default)g(is)f Fl(FILETYPE_PEM)p Fq(.)0 -1183 y Fl(use_privatekey_f)o(il)o(e\()p Fc(\034)o(le)6 -b Fb([)p Fc(,)25 b(format)20 b Fb(])p Fl(\))208 1283 -y Fq(Load)31 b(the)h(\034rst)g(priv)-5 b(ate)31 b(k)n(ey)g(found)i(in)f -Fc(\034le)6 b Fq(.)50 b(The)32 b(priv)-5 b(ate)32 b(k)n(ey)f(m)n(ust)h -(b)r(e)g(in)h(the)f(format)f(sp)r(eci\034ed)i(b)n(y)f -Fc(format)8 b Fq(,)208 1382 y(whic)n(h)27 b(is)g(either)h -Fl(FILETYPE_PEM)22 b Fq(or)27 b Fl(FILETYPE_ASN1)p Fq(.)32 -b(The)27 b(default)h(is)g Fl(FILETYPE_PEM)p Fq(.)0 1645 -y Ff(Connection)e(objects)0 1846 y Fq(Connection)h(ob)5 -b(jects)27 b(ha)n(v)n(e)f(the)i(follo)n(wing)f(metho)r(ds:)0 -1993 y Fl(accept\(\))208 2092 y Fq(Call)33 b(the)g Fl(accept)e -Fq(metho)r(d)j(of)f(the)h(underlying)f(so)r(c)n(k)n(et)f(and)h(set)h -(up)g(SSL)f(on)g(the)h(returned)f(so)r(c)n(k)n(et,)h(using)f(the)208 -2192 y(Con)n(text)22 b(ob)5 b(ject)22 b(supplied)h(to)f(this)h -(Connection)f(ob)5 b(ject)22 b(at)h(creation.)34 b(Returns)22 -b(a)g(pair)g Fl(\()p Fc(c)l(onn)6 b Fl(,)43 b Fc(addr)l(ess)7 -b Fl(\))p Fq(.)36 b(where)208 2292 y Fc(c)l(onn)d Fq(is)28 -b(the)g(new)f(Connection)g(ob)5 b(ject)28 b(created,)e(and)i -Fc(addr)l(ess)35 b Fq(is)28 b(as)f(returned)g(b)n(y)g(the)h(so)r(c)n(k) -n(et's)e Fl(accept)p Fq(.)0 2438 y Fl(bind\()p Fc(addr)l(ess)7 -b Fl(\))208 2538 y Fq(Call)27 b(the)h Fl(bind)e Fq(metho)r(d)i(of)f -(the)h(underlying)f(so)r(c)n(k)n(et.)0 2685 y Fl(close\(\))208 -2784 y Fq(Call)i(the)h Fl(close)e Fq(metho)r(d)i(of)g(the)g(underlying) -f(so)r(c)n(k)n(et.)43 b(Note:)e(If)31 b(y)n(ou)e(w)n(an)n(t)g(correct)f -(SSL)i(closure,)f(y)n(ou)g(need)h(to)208 2884 y(call)d(the)h -Fl(shutdown)c Fq(metho)r(d)k(\034rst.)0 3031 y Fl(connect\()p -Fc(addr)l(ess)7 b Fl(\))208 3131 y Fq(Call)31 b(the)h -Fl(connect)e Fq(metho)r(d)i(of)g(the)g(underlying)g(so)r(c)n(k)n(et)e -(and)i(set)g(up)g(SSL)h(on)e(the)i(so)r(c)n(k)n(et,)f(using)f(the)h -(Con)n(text)208 3230 y(ob)5 b(ject)27 b(supplied)h(to)f(this)h -(Connection)f(ob)5 b(ject)27 b(at)h(creation.)0 3377 -y Fl(connect_ex\()p Fc(addr)l(ess)7 b Fl(\))208 3477 -y Fq(Call)24 b(the)g Fl(connect_ex)c Fq(metho)r(d)25 -b(of)f(the)h(underlying)f(so)r(c)n(k)n(et)f(and)h(set)g(up)h(SSL)f(on)g -(the)h(so)r(c)n(k)n(et,)f(using)g(the)g(Con)n(text)208 -3576 y(ob)5 b(ject)35 b(supplied)g(to)h(this)f(Connection)g(ob)5 -b(ject)36 b(at)f(creation.)59 b(Note)36 b(that)f(if)h(the)g -Fl(connect_ex)31 b Fq(metho)r(d)36 b(of)g(the)208 3676 -y(so)r(c)n(k)n(et)26 b(do)r(esn't)i(return)f(0,)g(SSL)h(w)n(on't)f(b)r -(e)h(initialized.)0 3823 y Fl(do_handshake\(\))208 3922 -y Fq(P)n(erform)49 b(an)h(SSL)g(handshak)n(e)f(\(usually)h(called)g -(after)f Fl(renegotiate)d Fq(or)j(one)h(of)57 b Fl(set_accept_stat)o(e) -44 b Fq(or)208 4022 y Fl(set_accept_stat)o(e)p Fq(\).)31 -b(This)d(can)f(raise)f(the)i(same)f(exceptions)g(as)g -Fl(send)f Fq(and)h Fl(recv)p Fq(.)0 4169 y Fl(fileno\(\))208 -4269 y Fq(Retriev)n(e)f(the)i(\034le)g(descriptor)e(n)n(um)n(b)r(er)i -(for)f(the)h(underlying)e(so)r(c)n(k)n(et.)0 4415 y Fl(listen\()p -Fc(b)l(acklo)l(g)7 b Fl(\))208 4515 y Fq(Call)27 b(the)h -Fl(listen)d Fq(metho)r(d)j(of)f(the)h(underlying)f(so)r(c)n(k)n(et.)0 -4662 y Fl(get_app_data\(\))208 4762 y Fq(Retriev)n(e)f(application)h -(data)g(as)g(set)h(b)n(y)g Fl(set_app_data)p Fq(.)0 4908 -y Fl(get_cipher_list\()o(\))208 5008 y Fq(Retriev)n(e)23 -b(the)h(list)g(of)g(ciphers)g(used)g(b)n(y)f(the)i(Connection)e(ob)5 -b(ject.)36 b(W)-9 b(ARNING:)25 b(This)f(API)h(has)e(c)n(hanged.)35 -b(It)24 b(used)208 5108 y(to)j(tak)n(e)g(an)g(optional)g(parameter)f -(and)h(just)h(return)g(a)f(string,)g(but)h(not)f(it)h(returns)f(the)h -(en)n(tire)f(list)h(in)g(one)f(go.)0 5255 y Fl(get_client_ca_li)o(st)o -(\(\))208 5354 y Fq(Retriev)n(e)e(the)i(list)g(of)f(preferred)g(clien)n -(t)g(certi\034cate)g(issuers)g(sen)n(t)g(b)n(y)g(the)h(serv)n(er)e(as)h -Fl(OpenSSL.crypto.)o(X50)o(9N)o(am)o(e)p 0 5549 3901 -4 v 0 5649 a Ff(3.3)82 b Fl(SSL)26 b Ff(\026)i(An)g(interface)g(to)f -(the)g(SSL-sp)r(eci\034c)h(pa)n(rts)f(of)h(Op)r(enSSL)1611 -b(15)p eop end -%%Page: 16 16 -TeXDict begin 16 15 bop 208 83 a Fq(ob)5 b(jects.)208 -216 y(If)25 b(this)g(is)f(a)h(clien)n(t)f Fl(Connection)p -Fq(,)e(the)j(list)g(will)g(b)r(e)g(empt)n(y)f(un)n(til)h(the)h -(connection)e(with)h(the)g(serv)n(er)e(is)h(established.)208 -349 y(If)33 b(this)g(is)g(a)f(serv)n(er)g Fl(Connection)p -Fq(,)e(return)i(the)h(list)h(of)e(certi\034cate)h(authorities)f(that)h -(will)g(b)r(e)h(sen)n(t)e(or)g(has)h(b)r(een)208 448 -y(sen)n(t)27 b(to)g(the)h(clien)n(t,)g(as)f(con)n(trolled)f(b)n(y)h -(this)h Fl(Connection)p Fq('s)c Fl(Context)p Fq(.)208 -581 y(New)j(in)h(v)n(ersion)e(0.10.)0 728 y Fl(get_context\(\))208 -828 y Fq(Retriev)n(e)g(the)i(Con)n(text)f(ob)5 b(ject)28 -b(asso)r(ciated)e(with)i(this)g(Connection.)0 975 y Fl -(get_peer_certifi)o(ca)o(te\()o(\))208 1074 y Fq(Retriev)n(e)e(the)i -(other)f(side's)g(certi\034cate)g(\(if)i(an)n(y\))0 1221 -y Fl(getpeername\(\))208 1321 y Fq(Call)e(the)h Fl(getpeername)23 -b Fq(metho)r(d)28 b(of)f(the)h(underlying)f(so)r(c)n(k)n(et.)0 -1468 y Fl(getsockname\(\))208 1567 y Fq(Call)g(the)h -Fl(getsockname)23 b Fq(metho)r(d)28 b(of)f(the)h(underlying)f(so)r(c)n -(k)n(et.)0 1731 y Fl(getsockopt\()p Fc(level,)f(optname)6 -b Fb([)p Fc(,)31 b(bu\035en)18 b Fb(])p Fl(\))208 1830 -y Fq(Call)27 b(the)h Fl(getsockopt)23 b Fq(metho)r(d)28 -b(of)g(the)g(underlying)f(so)r(c)n(k)n(et.)0 1977 y Fl(pending\(\))208 -2077 y Fq(Retriev)n(e)22 b(the)h(n)n(um)n(b)r(er)g(of)g(b)n(ytes)g -(that)h(can)e(b)r(e)i(safely)f(read)f(from)h(the)g(SSL)h(bu\033er)f(\() -p Fc(not)g Fq(the)h(underlying)e(transp)r(ort)208 2176 -y(bu\033er\).)0 2323 y Fl(recv\()p Fc(bufsize)6 b Fl(\))208 -2423 y Fq(Receiv)n(e)30 b(data)h(from)g(the)h(Connection.)47 -b(The)31 b(return)g(v)-5 b(alue)31 b(is)h(a)e(string)h(represen)n(ting) -f(the)h(data)g(receiv)n(ed.)47 b(The)208 2523 y(maxim)n(um)27 -b(amoun)n(t)g(of)g(data)h(to)f(b)r(e)h(receiv)n(ed)e(at)i(once,)f(is)g -(sp)r(eci\034ed)h(b)n(y)h Fc(bufsize)6 b Fq(.)0 2669 -y Fl(bio_write\()p Fc(bytes)h Fl(\))208 2769 y Fq(If)27 -b(the)h(Connection)f(w)n(as)f(created)h(with)g(a)g(memory)g(BIO,)g -(this)g(metho)r(d)h(can)f(b)r(e)h(used)f(to)g(add)g(b)n(ytes)g(to)g -(the)h(read)208 2869 y(end)g(of)g(that)g(memory)f(BIO.)g(The)h -(Connection)g(can)f(then)i(read)e(the)h(b)n(ytes)g(\(for)f(example,)h -(in)g(resp)r(onse)f(to)h(a)f(call)208 2968 y(to)g Fl(recv)p -Fq(\).)0 3115 y Fl(renegotiate\(\))208 3215 y Fq(Renegotiate)f(the)i -(SSL)g(session.)36 b(Call)27 b(this)h(if)g(y)n(ou)f(wish)g(to)h(c)n -(hange)e(cipher)h(suites)h(or)e(an)n(ything)h(lik)n(e)g(that.)0 -3362 y Fl(send\()p Fc(string)7 b Fl(\))208 3461 y Fq(Send)27 -b(the)h Fc(string)35 b Fq(data)27 b(to)h(the)g(Connection.)0 -3608 y Fl(bio_read\()p Fc(bufsize)6 b Fl(\))208 3708 -y Fq(If)31 b(the)g(Connection)g(w)n(as)f(created)g(with)i(a)e(memory)g -(BIO,)h(this)g(metho)r(d)g(can)g(b)r(e)h(used)e(to)h(read)f(b)n(ytes)h -(from)g(the)208 3807 y(write)d(end)g(of)g(that)h(memory)e(BIO.)h(Man)n -(y)f(Connection)h(metho)r(ds)h(will)f(add)g(b)n(ytes)g(whic)n(h)g(m)n -(ust)g(b)r(e)h(read)e(in)i(this)208 3907 y(manner)c(or)h(the)g -(bu\033er)h(will)f(ev)n(en)n(tually)f(\034ll)i(up)g(and)f(the)g -(Connection)g(will)g(b)r(e)h(able)f(to)g(tak)n(e)g(no)g(further)g -(actions.)0 4054 y Fl(sendall\()p Fc(string)7 b Fl(\))208 -4154 y Fq(Send)30 b(all)f(of)h(the)g Fc(string)37 b Fq(data)29 -b(to)g(the)h(Connection.)43 b(This)30 b(calls)f Fl(send)f -Fq(rep)r(eatedly)h(un)n(til)h(all)f(data)h(is)f(sen)n(t.)43 -b(If)30 b(an)208 4253 y(error)25 b(o)r(ccurs,)i(it's)h(imp)r(ossible)f -(to)g(tell)h(ho)n(w)f(m)n(uc)n(h)h(data)f(has)g(b)r(een)h(sen)n(t.)0 -4400 y Fl(set_accept_state)o(\(\))208 4500 y Fq(Set)20 -b(the)g(connection)f(to)h(w)n(ork)e(in)i(serv)n(er)e(mo)r(de.)34 -b(The)20 b(handshak)n(e)f(will)h(b)r(e)g(handled)g(automatically)e(b)n -(y)i(read/write.)0 4647 y Fl(set_app_data\()p Fc(data)6 -b Fl(\))208 4746 y Fq(Asso)r(ciate)39 b Fc(data)47 b -Fq(with)40 b(this)g(Connection)g(ob)5 b(ject.)73 b Fc(data)47 -b Fq(can)39 b(b)r(e)i(retriev)n(ed)d(later)h(using)h(the)g -Fl(get_app_data)208 4846 y Fq(metho)r(d.)0 4993 y Fl(set_connect_stat)o -(e\()o(\))208 5092 y Fq(Set)21 b(the)g(connection)g(to)g(w)n(ork)e(in)i -(clien)n(t)g(mo)r(de.)35 b(The)21 b(handshak)n(e)f(will)h(b)r(e)g -(handled)g(automatically)f(b)n(y)h(read/write.)0 5239 -y Fl(setblocking\()p Fc(\035ag)7 b Fl(\))208 5339 y Fq(Call)27 -b(the)h Fl(setblocking)23 b Fq(metho)r(d)28 b(of)f(the)h(underlying)f -(so)r(c)n(k)n(et.)p 0 5549 3901 4 v 0 5649 a Ff(16)2197 -b(3)83 b Fl(OpenSSL)24 b Ff(\026)k(Python)f(interface)h(to)f(Op)r -(enSSL)p eop end -%%Page: 17 17 -TeXDict begin 17 16 bop 0 83 a Fl(setsockopt\()p Fc(level,)26 -b(optname,)31 b(value)6 b Fl(\))208 183 y Fq(Call)27 -b(the)h Fl(setsockopt)23 b Fq(metho)r(d)28 b(of)g(the)g(underlying)f -(so)r(c)n(k)n(et.)0 330 y Fl(shutdown\(\))208 429 y Fq(Send)35 -b(the)h(sh)n(utdo)n(wn)f(message)f(to)h(the)h(Connection.)60 -b(Returns)35 b(true)g(if)h(the)g(sh)n(utdo)n(wn)e(message)g(exc)n -(hange)g(is)208 529 y(completed)25 b(and)g(false)h(otherwise)e(\(in)i -(whic)n(h)g(case)e(y)n(ou)h(call)g Fl(recv\(\))e Fq(or)i -Fl(send\(\))e Fq(when)j(the)g(connection)f(b)r(ecomes)208 -628 y(readable/writeable.)0 775 y Fl(get_shutdown\(\))208 -875 y Fq(Get)70 b(the)g(sh)n(utdo)n(wn)f(state)g(of)h(the)g -(Connection.)162 b(Returns)69 b(a)h(bitv)n(ector)e(of)i(either)f(or)g -(b)r(oth)h(of)208 975 y Fc(SENT_SHUTDO)n(WN)39 b Fq(and)27 -b Fc(RECEIVED_SHUTDO)n(WN)14 b Fq(.)0 1121 y Fl(set_shutdown\()p -Fc(state)6 b Fl(\))208 1221 y Fq(Set)21 b(the)g(sh)n(utdo)n(wn)g(state) -g(of)g(the)g(Connection.)34 b Fc(state)27 b Fq(is)21 -b(a)g(bitv)n(ector)f(of)h(either)g(or)f(b)r(oth)i(of)27 -b Fc(SENT_SHUTDO)n(WN)208 1321 y Fq(and)g Fc(RECEIVED_SHUTDO)n(WN)14 -b Fq(.)0 1468 y Fl(sock_shutdown\()p Fc(how)9 b Fl(\))208 -1567 y Fq(Call)27 b(the)h Fl(shutdown)c Fq(metho)r(d)k(of)g(the)g -(underlying)e(so)r(c)n(k)n(et.)0 1714 y Fl(bio_shutdown\(\))208 -1814 y Fq(If)j(the)h(Connection)f(w)n(as)f(created)g(with)i(a)f(memory) -f(BIO,)h(this)h(metho)r(d)f(can)g(b)r(e)h(used)f(to)g(indicate)g(that)h -(\020end)f(of)208 1913 y(\034le\021)34 b(has)27 b(b)r(een)h(reac)n(hed) -e(on)h(the)h(read)f(end)h(of)f(that)h(memory)f(BIO.)0 -2060 y Fl(state_string\(\))208 2160 y Fq(Retriev)n(e)f(a)i(v)n(erb)r -(ose)e(string)g(detailing)i(the)g(state)f(of)h(the)f(Connection.)0 -2307 y Fl(client_random\(\))208 2406 y Fq(Retriev)n(e)f(the)i(random)f -(v)-5 b(alue)27 b(used)h(with)g(the)g(clien)n(t)f(hello)h(message.)0 -2553 y Fl(server_random\(\))208 2653 y Fq(Retriev)n(e)e(the)i(random)f -(v)-5 b(alue)27 b(used)h(with)g(the)g(serv)n(er)e(hello)h(message.)0 -2800 y Fl(master_key\(\))208 2899 y Fq(Retriev)n(e)f(the)i(v)-5 -b(alue)28 b(of)f(the)h(master)f(k)n(ey)g(for)g(this)h(session.)0 -3046 y Fl(want_read\(\))208 3146 y Fq(Chec)n(ks)e(if)i(more)f(data)g -(has)g(to)h(b)r(e)g(read)e(from)i(the)f(transp)r(ort)g(la)n(y)n(er)f -(to)h(complete)h(an)f(op)r(eration.)0 3293 y Fl(want_write\(\))208 -3392 y Fq(Chec)n(ks)f(if)i(there)g(is)f(data)g(to)h(write)f(to)g(the)h -(transp)r(ort)f(la)n(y)n(er)f(to)h(complete)h(an)f(op)r(eration.)0 -3714 y Fr(4)114 b(Internals)0 3943 y Fq(W)-7 b(e)25 b(ran)g(in)n(to)f -(three)h(main)g(problems)f(dev)n(eloping)g(this:)36 b(Exceptions,)25 -b(callbac)n(ks)f(and)h(accessing)e(so)r(c)n(k)n(et)h(metho)r(ds.)36 -b(This)0 4043 y(is)27 b(what)h(this)g(c)n(hapter)e(is)i(ab)r(out.)0 -4322 y Fj(4.1)97 b(Exceptions)0 4523 y Fq(W)-7 b(e)52 -b(realized)f(early)g(that)h(most)g(of)g(the)g(exceptions)f(w)n(ould)h -(b)r(e)g(raised)f(b)n(y)h(the)g(I/O)f(functions)h(of)g(Op)r(enSSL,)0 -4622 y(so)d(it)i(felt)f(natural)f(to)h(mimic)g(Op)r(enSSL's)g(error)e -(co)r(de)i(system,)55 b(translating)48 b(them)j(in)n(to)e(Python)i -(exceptions.)0 4722 y(This)30 b(naturally)e(giv)n(es)h(us)h(the)g -(exceptions)f Fl(SSL.ZeroReturnEr)o(ro)o(r)p Fq(,)24 -b Fl(SSL.WantReadError)o Fq(,)h Fl(SSL.WantWriteEr)o(ro)o(r)p -Fq(,)0 4822 y Fl(SSL.WantX509Look)o(up)o(Err)o(or)c Fq(and)27 -b Fl(SSL.SysCallError)p Fq(.)0 4969 y(F)-7 b(or)27 b(more)g -(information)g(ab)r(out)g(this,)h(see)f(section)g(3.3.)p -0 5549 3901 4 v 3817 5649 a Ff(17)p eop end -%%Page: 18 18 -TeXDict begin 18 17 bop 0 83 a Fj(4.2)97 b(Callbacks)0 -283 y Fq(There)34 b(are)f(a)h(n)n(um)n(b)r(er)g(of)h(problems)e(with)i -(callbac)n(ks.)56 b(First)34 b(of)g(all,)i(Op)r(enSSL)f(is)f(written)h -(as)e(a)h(C)h(library)-7 b(,)34 b(it's)h(not)0 383 y(mean)n(t)26 -b(to)g(ha)n(v)n(e)e(Python)j(callbac)n(ks,)d(so)i(a)f(w)n(a)n(y)g -(around)g(that)h(is)g(needed.)36 b(Another)26 b(problem)f(is)h(thread)g -(supp)r(ort.)36 b(A)26 b(lot)0 483 y(of)h(the)g(Op)r(enSSL)g(I/O)e -(functions)i(can)g(blo)r(c)n(k)f(if)h(the)g(so)r(c)n(k)n(et)f(is)g(in)h -(blo)r(c)n(king)f(mo)r(de,)h(and)g(then)g(y)n(ou)f(w)n(an)n(t)g(other)g -(Python)0 582 y(threads)i(to)g(b)r(e)h(able)g(to)f(do)h(other)f -(things.)40 b(The)28 b(real)g(trouble)g(is)h(if)g(y)n(ou'v)n(e)e -(released)h(the)h(global)e(CPython)i(in)n(terpreter)0 -682 y(lo)r(c)n(k)e(to)h(do)f(a)h(p)r(oten)n(tially)f(blo)r(c)n(king)g -(op)r(eration,)g(and)h(the)g(op)r(eration)f(calls)g(a)g(callbac)n(k.)36 -b(Then)28 b(w)n(e)g(m)n(ust)g(tak)n(e)f(the)h(GIL)0 782 -y(bac)n(k,)f(since)g(calling)g(Python)h(APIs)g(without)g(holding)f(it)h -(is)g(not)f(allo)n(w)n(ed.)0 929 y(There)d(are)f(t)n(w)n(o)g(solutions) -h(to)g(the)h(\034rst)f(problem,)g(b)r(oth)h(of)f(whic)n(h)g(are)f -(necessary)-7 b(.)34 b(The)25 b(\034rst)f(solution)f(to)h(use)h(is)f -(if)g(the)h(C)0 1028 y(callbac)n(k)i(allo)n(ws)f(\021userdata\021)33 -b(to)28 b(b)r(e)h(passed)e(to)h(it)g(\(an)g(arbitrary)e(p)r(oin)n(ter)i -(normally\).)37 b(This)28 b(is)g(great!)37 b(W)-7 b(e)28 -b(can)g(set)g(our)0 1128 y(Python)i(function)g(ob)5 b(ject)29 -b(as)f(the)i(real)f(userdata)f(and)h(em)n(ulate)g(userdata)f(for)h(the) -h(Python)f(function)h(in)g(another)e(w)n(a)n(y)-7 b(.)0 -1227 y(The)24 b(other)g(solution)g(can)g(b)r(e)h(used)g(if)g(an)f(ob)5 -b(ject)24 b(with)h(an)f(\021app_data\021)29 b(system)c(alw)n(a)n(ys)d -(is)j(passed)e(to)h(the)h(callbac)n(k.)35 b(F)-7 b(or)0 -1327 y(example,)26 b(the)h(SSL)f(ob)5 b(ject)26 b(in)h(Op)r(enSSL)f -(has)g(app_data)f(functions)i(and)f(in)h(e.g.)36 b(the)26 -b(v)n(eri\034cation)f(callbac)n(ks,)g(y)n(ou)g(can)0 -1427 y(retriev)n(e)i(the)i(related)f(SSL)h(ob)5 b(ject.)39 -b(What)29 b(w)n(e)g(do)f(is)g(to)h(set)f(our)g(wrapp)r(er)g -Fl(Connection)c Fq(ob)5 b(ject)28 b(as)g(app_data)g(for)g(the)0 -1526 y(SSL)g(ob)5 b(ject,)27 b(and)h(w)n(e)f(can)g(easily)g(\034nd)h -(the)g(Python)g(callbac)n(k.)0 1673 y(The)23 b(other)g(problem)g(is)g -(solv)n(ed)f(using)h(thread)g(lo)r(cal)g(v)-5 b(ariables.)34 -b(Whenev)n(er)22 b(the)i(GIL)g(is)f(released)f(b)r(efore)h(calling)f -(in)n(to)h(an)0 1773 y(Op)r(enSSL)j(API,)g(the)g(PyThreadState)f(p)r -(oin)n(ter)g(returned)g(b)n(y)h Fl(PyEval_SaveState)19 -b Fq(is)25 b(stored)g(in)g(a)g(global)g(thread)g(lo)r(cal)0 -1872 y(v)-5 b(ariable)27 b(\(using)g(Python's)h(o)n(wn)f(TLS)h(API,)g -Fl(PyThread_set_key_)o(va)o(lue)o Fq(\).)k(When)c(it)g(is)g(necessary)e -(to)h(re-acquire)f(the)0 1972 y(GIL,)c(either)g(after)g(the)h(Op)r -(enSSL)f(API)h(returns)e(or)h(in)g(a)g(C)g(callbac)n(k)f(in)n(v)n(ok)n -(ed)f(b)n(y)i(that)h(Op)r(enSSL)f(API,)h(the)g(v)-5 b(alue)22 -b(of)g(the)0 2072 y(thread)32 b(lo)r(cal)f(v)-5 b(ariable)32 -b(is)g(retriev)n(ed)f(\()p Fl(PyThread_get_key)o(_va)o(lu)o(e)p -Fq(\))26 b(and)33 b(used)f(to)g(re-acquire)e(the)j(GIL.)f(This)h(allo)n -(ws)0 2171 y(Python)f(threads)e(to)h(execute)h(while)f(Op)r(enSSL)g -(APIs)h(are)f(running)f(and)i(allo)n(ws)e(use)h(of)g(an)n(y)f -(particular)g(p)n(yOp)r(enSSL)0 2271 y(ob)5 b(ject)29 -b(from)f(an)n(y)g(Python)i(thread,)e(since)h(there)g(is)g(no)f(p)r -(er-thread)g(state)h(asso)r(ciated)f(with)h(an)n(y)f(of)h(these)g(ob)5 -b(jects)28 b(and)0 2371 y(since)f(Op)r(enSSL)h(is)g(threadsafe)e(\(as)h -(long)g(as)g(prop)r(erly)g(initialized,)g(as)g(p)n(yOp)r(enSSL)h -(initializes)f(it\).)0 2650 y Fj(4.3)97 b(A)m(cessing)35 -b(So)s(ck)m(et)e(Metho)s(ds)0 2851 y Fq(W)-7 b(e)27 b(quic)n(kly)e(sa)n -(w)h(the)g(b)r(ene\034t)h(of)g(wrapping)e(so)r(c)n(k)n(et)g(metho)r(ds) -h(in)h(the)g Fl(SSL.Connection)20 b Fq(class,)26 b(for)g(an)g(easy)f -(transition)0 2950 y(in)n(to)e(using)f(SSL.)h(The)g(problem)f(here)h -(is)f(that)h(the)h Fl(socket)c Fq(mo)r(dule)j(lac)n(ks)f(a)g(C)h(API,)h -(and)e(all)h(the)g(metho)r(ds)g(are)f(declared)0 3050 -y(static.)36 b(One)27 b(approac)n(h)d(w)n(ould)i(b)r(e)h(to)f(ha)n(v)n -(e)g Fl(OpenSSL)d Fq(as)j(a)g(submo)r(dule)h(to)f(the)h -Fl(socket)d Fq(mo)r(dule,)j(placing)f(all)g(the)h(co)r(de)0 -3149 y(in)j(`)p Fp(so)r(ck)n(etmo)r(dule.c)p Fq(',)h(but)f(this)g(is)g -(ob)n(viously)e(not)i(a)f(go)r(o)r(d)g(solution,)h(since)g(y)n(ou)f -(migh)n(t)g(not)h(w)n(an)n(t)f(to)h(imp)r(ort)g(tonnes)f(of)0 -3249 y(extra)f(stu\033)h(y)n(ou're)e(not)i(going)e(to)i(use)f(when)h -(imp)r(orting)f(the)i Fl(socket)c Fq(mo)r(dule.)40 b(The)29 -b(other)f(approac)n(h)e(is)j(to)f(someho)n(w)0 3349 y(get)33 -b(a)g(p)r(oin)n(ter)g(to)h(the)f(metho)r(d)h(to)g(b)r(e)f(called,)i -(either)e(the)h(C)g(function,)h(or)e(a)g(callable)f(Python)i(ob)5 -b(ject.)54 b(This)34 b(is)f(not)0 3448 y(really)26 b(a)i(go)r(o)r(d)f -(solution)g(either,)g(since)g(there's)h(a)f(lot)g(of)h(lo)r(okups)f(in) -n(v)n(olv)n(ed.)0 3595 y(The)h(w)n(a)n(y)f(it)h(w)n(orks)e(is)i(that)h -(y)n(ou)e(ha)n(v)n(e)g(to)g(supply)h(a)g(\020)7 b Fl(socket)p -Fq(-lik)n(e\021)31 b(transp)r(ort)c(ob)5 b(ject)28 b(to)f(the)i -Fl(SSL.Connection)p Fq(.)j(The)0 3695 y(only)24 b(requiremen)n(t)f(of)i -(this)f(ob)5 b(ject)24 b(is)h(that)f(it)h(has)f(a)g Fl(fileno\(\))d -Fq(metho)r(d)k(that)f(returns)g(a)g(\034le)g(descriptor)f(that's)i(v)-5 -b(alid)24 b(at)0 3794 y(the)g(C)g(lev)n(el)f(\(i.e.)36 -b(y)n(ou)23 b(can)h(use)f(the)i(system)e(calls)g(read)g(and)h(write\).) -35 b(If)25 b(y)n(ou)e(w)n(an)n(t)g(to)h(use)f(the)h Fl(connect\(\))c -Fq(or)j Fl(accept\(\))0 3894 y Fq(metho)r(ds)29 b(of)h(the)f -Fl(SSL.Connection)24 b Fq(ob)5 b(ject,)29 b(the)h(transp)r(ort)e(ob)5 -b(ject)29 b(has)f(to)h(supply)h(suc)n(h)f(metho)r(ds)g(to)r(o.)41 -b(Apart)29 b(from)0 3994 y(them,)c(an)n(y)e(metho)r(d)h(lo)r(okups)f -(in)h(the)f Fl(SSL.Connection)18 b Fq(ob)5 b(ject)24 -b(that)f(fail)h(are)f(passed)f(on)i(to)f(the)h(underlying)f(transp)r -(ort)0 4093 y(ob)5 b(ject.)0 4240 y(F)-7 b(uture)25 b(c)n(hanges)f -(migh)n(t)h(b)r(e)g(to)g(allo)n(w)f(Python-lev)n(el)g(transp)r(ort)g -(ob)5 b(jects,)25 b(that)g(instead)g(of)g(ha)n(ving)g -Fl(fileno\(\))d Fq(metho)r(ds,)0 4340 y(ha)n(v)n(e)h -Fl(read\(\))g Fq(and)h Fl(write\(\))e Fq(metho)r(ds,)k(so)e(more)f(adv) --5 b(anced)24 b(features)h(of)f(Python)h(can)g(b)r(e)g(used.)35 -b(This)25 b(w)n(ould)f(probably)0 4439 y(en)n(tail)36 -b(some)g(sort)g(of)g(Op)r(enSSL)h(\020BIOs\021,)g(but)g(con)n(v)n -(erting)e(Python)i(strings)e(bac)n(k)h(and)g(forth)g(is)h(exp)r(ensiv)n -(e,)h(so)e(this)0 4539 y(shouldn't)f(b)r(e)h(used)f(unless)g(necessary) --7 b(.)57 b(Other)35 b(nice)g(things)g(w)n(ould)g(b)r(e)g(to)g(b)r(e)h -(able)e(to)h(pass)g(in)g(di\033eren)n(t)g(transp)r(ort)0 -4639 y(ob)5 b(jects)41 b(for)g(reading)f(and)h(writing,)j(but)e(then)g -(the)g Fl(fileno\(\))c Fq(metho)r(d)k(of)47 b Fl(SSL.Connection)36 -b Fq(b)r(ecomes)41 b(virtually)0 4738 y(useless.)36 b(Also,)27 -b(should)h(the)g(metho)r(d)g(resolution)e(b)r(e)i(used)g(on)f(the)h -(read-transp)r(ort)d(or)i(the)h(write-transp)r(ort?)p -0 5549 3901 4 v 0 5649 a Ff(18)3368 b(4)83 b(Internals)p -eop end -%%Trailer - -userdict /end-hook known{end-hook}if -%%EOF diff --git a/doc/pyOpenSSL.tex b/doc/pyOpenSSL.tex deleted file mode 100644 index 6a49748..0000000 --- a/doc/pyOpenSSL.tex +++ /dev/null @@ -1,1451 +0,0 @@ -\documentclass{howto} - -\title{Python OpenSSL Manual} - -\release{0.12} - -\author{Jean-Paul Calderone} -\authoraddress{\email{exarkun@twistedmatrix.com}} - -\usepackage[english]{babel} -\usepackage[T1]{fontenc} - -\begin{document} - -\maketitle - -\begin{abstract} -\noindent -This module is a rather thin wrapper around (a subset of) the OpenSSL library. -With thin wrapper I mean that a lot of the object methods do nothing more than -calling a corresponding function in the OpenSSL library. -\end{abstract} - -\tableofcontents - - -\section{Introduction \label{intro}} - -The reason pyOpenSSL was created is that the SSL support in the socket module -in Python 2.1 (the contemporary version of Python when the pyOpenSSL project -was begun) was severely limited. Other OpenSSL wrappers for Python at the time -were also limited, though in different ways. Unfortunately, Python's standard -library SSL support has remained weak, although other packages (such as -M2Crypto\footnote{See \url{http://chandlerproject.org/Projects/MeTooCrypto}}) -have made great advances and now equal or exceed pyOpenSSL's functionality. - -The reason pyOpenSSL continues to be maintained is that there is a significant -user community around it, as well as a large amount of software which depends -on it. It is a great benefit to many people for pyOpenSSL to continue to exist -and advance. - -\section{Building and Installing \label{building}} - -These instructions can also be found in the file \verb|INSTALL|. - -I have tested this on Debian Linux systems (woody and sid), Solaris 2.6 and -2.7. Others have successfully compiled it on Windows and NT. - -\subsection{Building the Module on a Unix System \label{building-unix}} - -pyOpenSSL uses distutils, so there really shouldn't be any problems. To build -the library: -\begin{verbatim} -python setup.py build -\end{verbatim} - -If your OpenSSL header files aren't in \verb|/usr/include|, you may need to -supply the \verb|-I| flag to let the setup script know where to look. The same -goes for the libraries of course, use the \verb|-L| flag. Note that -\verb|build| won't accept these flags, so you have to run first -\verb|build_ext| and then \verb|build|! Example: -\begin{verbatim} -python setup.py build_ext -I/usr/local/ssl/include -L/usr/local/ssl/lib -python setup.py build -\end{verbatim} - -Now you should have a directory called \verb|OpenSSL| that contains e.g. -\verb|SSL.so| and \verb|__init__.py| somewhere in the build dicrectory, -so just: -\begin{verbatim} -python setup.py install -\end{verbatim} - -If you, for some arcane reason, don't want the module to appear in the -\verb|site-packages| directory, use the \verb|--prefix| option. - -You can, of course, do -\begin{verbatim} -python setup.py --help -\end{verbatim} - -to find out more about how to use the script. - -\subsection{Building the Module on a Windows System \label{building-windows}} - -Big thanks to Itamar Shtull-Trauring and Oleg Orlov for their help with -Windows build instructions. Same as for Unix systems, we have to separate -the \verb|build_ext| and the \verb|build|. - -Building the library: - -\begin{verbatim} -setup.py build_ext -I ...\openssl\inc32 -L ...\openssl\out32dll -setup.py build -\end{verbatim} - -Where \verb|...\openssl| is of course the location of your OpenSSL installation. - -Installation is the same as for Unix systems: -\begin{verbatim} -setup.py install -\end{verbatim} - -And similarily, you can do -\begin{verbatim} -setup.py --help -\end{verbatim} - -to get more information. - - -\section{\module{OpenSSL} --- Python interface to OpenSSL \label{openssl}} - -\declaremodule{extension}{OpenSSL} -\modulesynopsis{Python interface to OpenSSL} - -This package provides a high-level interface to the functions in the -OpenSSL library. The following modules are defined: - -\begin{datadesc}{crypto} -Generic cryptographic module. Note that if anything is incomplete, this module is! -\end{datadesc} - -\begin{datadesc}{rand} -An interface to the OpenSSL pseudo random number generator. -\end{datadesc} - -\begin{datadesc}{SSL} -An interface to the SSL-specific parts of OpenSSL. -\end{datadesc} - - -% % % crypto moduleOpenSSL - -\subsection{\module{crypto} --- Generic cryptographic module \label{openssl-crypto}} - -\declaremodule{extension}{crypto} -\modulesynopsis{Generic cryptographic module} - -\begin{datadesc}{X509Type} -See \class{X509}. -\end{datadesc} - -\begin{classdesc}{X509}{} -A class representing X.509 certificates. -\end{classdesc} - -\begin{datadesc}{X509NameType} -See \class{X509Name}. -\end{datadesc} - -\begin{classdesc}{X509Name}{x509name} -A class representing X.509 Distinguished Names. - -This constructor creates a copy of \var{x509name} which should be an -instance of \class{X509Name}. -\end{classdesc} - -\begin{datadesc}{X509ReqType} -See \class{X509Req}. -\end{datadesc} - -\begin{classdesc}{X509Req}{} -A class representing X.509 certificate requests. -\end{classdesc} - -\begin{datadesc}{X509StoreType} -A Python type object representing the X509Store object type. -\end{datadesc} - -\begin{datadesc}{PKeyType} -See \class{PKey}. -\end{datadesc} - -\begin{classdesc}{PKey}{} -A class representing DSA or RSA keys. -\end{classdesc} - -\begin{datadesc}{PKCS7Type} -A Python type object representing the PKCS7 object type. -\end{datadesc} - -\begin{datadesc}{PKCS12Type} -A Python type object representing the PKCS12 object type. -\end{datadesc} - -\begin{datadesc}{X509ExtensionType} -See \class{X509Extension}. -\end{datadesc} - -\begin{classdesc}{X509Extension}{typename, critical, value\optional{, subject}\optional{, issuer}} -A class representing an X.509 v3 certificate extensions. -See \url{http://openssl.org/docs/apps/x509v3_config.html\#STANDARD_EXTENSIONS} -for \var{typename} strings and their options. -Optional parameters \var{subject} and \var{issuer} must be X509 objects. -\end{classdesc} - -\begin{datadesc}{NetscapeSPKIType} -See \class{NetscapeSPKI}. -\end{datadesc} - -\begin{classdesc}{NetscapeSPKI}{\optional{enc}} -A class representing Netscape SPKI objects. - -If the \var{enc} argument is present, it should be a base64-encoded string -representing a NetscapeSPKI object, as returned by the \method{b64_encode} -method. -\end{classdesc} - -\begin{classdesc}{CRL}{} -A class representing Certifcate Revocation List objects. -\end{classdesc} - -\begin{classdesc}{Revoked}{} -A class representing Revocation objects of CRL. -\end{classdesc} - -\begin{datadesc}{FILETYPE_PEM} -\dataline{FILETYPE_ASN1} -File type constants. -\end{datadesc} - -\begin{datadesc}{TYPE_RSA} -\dataline{TYPE_DSA} -Key type constants. -\end{datadesc} - -\begin{excdesc}{Error} -Generic exception used in the \module{crypto} module. -\end{excdesc} - -\begin{funcdesc}{dump_certificate}{type, cert} -Dump the certificate \var{cert} into a buffer string encoded with the type -\var{type}. -\end{funcdesc} - -\begin{funcdesc}{dump_certificate_request}{type, req} -Dump the certificate request \var{req} into a buffer string encoded with the -type \var{type}. -\end{funcdesc} - -\begin{funcdesc}{dump_privatekey}{type, pkey\optional{, cipher, passphrase}} -Dump the private key \var{pkey} into a buffer string encoded with the type -\var{type}, optionally (if \var{type} is \constant{FILETYPE_PEM}) encrypting it -using \var{cipher} and \var{passphrase}. - -\var{passphrase} must be either a string or a callback for providing the -pass phrase. -\end{funcdesc} - -\begin{funcdesc}{load_certificate}{type, buffer} -Load a certificate (X509) from the string \var{buffer} encoded with the -type \var{type}. -\end{funcdesc} - -\begin{funcdesc}{load_certificate_request}{type, buffer} -Load a certificate request (X509Req) from the string \var{buffer} encoded with -the type \var{type}. -\end{funcdesc} - -\begin{funcdesc}{load_privatekey}{type, buffer\optional{, passphrase}} -Load a private key (PKey) from the string \var{buffer} encoded with -the type \var{type} (must be one of \constant{FILETYPE_PEM} and -\constant{FILETYPE_ASN1}). - -\var{passphrase} must be either a string or a callback for providing the -pass phrase. -\end{funcdesc} - -\begin{funcdesc}{load_crl}{type, buffer} -Load Certificate Revocation List (CRL) data from a string \var{buffer}. -\var{buffer} encoded with the type \var{type}. The type \var{type} -must either \constant{FILETYPE_PEM} or \constant{FILETYPE_ASN1}). -\end{funcdesc} - -\begin{funcdesc}{load_pkcs7_data}{type, buffer} -Load pkcs7 data from the string \var{buffer} encoded with the type \var{type}. -\end{funcdesc} - -\begin{funcdesc}{load_pkcs12}{buffer\optional{, passphrase}} -Load pkcs12 data from the string \var{buffer}. If the pkcs12 structure is -encrypted, a \var{passphrase} must be included. The MAC is always -checked and thus required. - -See also the man page for the C function \function{PKCS12_parse}. -\end{funcdesc} - -\begin{funcdesc}{sign}{key, data, digest} -Sign a data string using the given key and message digest. - -\var{key} is a \code{PKey} instance. \var{data} is a \code{str} instance. -\var{digest} is a \code{str} naming a supported message digest type, for example -\code{``sha1''}. -\versionadded{0.11} -\end{funcdesc} - -\begin{funcdesc}{verify}{certificate, signature, data, digest} -Verify the signature for a data string. - -\var{certificate} is a \code{X509} instance corresponding to the private key -which generated the signature. \var{signature} is a \var{str} instance giving -the signature itself. \var{data} is a \var{str} instance giving the data to -which the signature applies. \var{digest} is a \var{str} instance naming the -message digest type of the signature, for example \code{``sha1''}. -\versionadded{0.11} -\end{funcdesc} - -\subsubsection{X509 objects \label{openssl-x509}} - -X509 objects have the following methods: - -\begin{methoddesc}[X509]{get_issuer}{} -Return an X509Name object representing the issuer of the certificate. -\end{methoddesc} - -\begin{methoddesc}[X509]{get_pubkey}{} -Return a PKey object representing the public key of the certificate. -\end{methoddesc} - -\begin{methoddesc}[X509]{get_serial_number}{} -Return the certificate serial number. -\end{methoddesc} - -\begin{methoddesc}[X509]{get_signature_algorithm}{} -Return the signature algorithm used in the certificate. If the algorithm is -undefined, raise \code{ValueError}. -\end{methoddesc} - -\begin{methoddesc}[X509]{get_subject}{} -Return an X509Name object representing the subject of the certificate. -\end{methoddesc} - -\begin{methoddesc}[X509]{get_version}{} -Return the certificate version. -\end{methoddesc} - -\begin{methoddesc}[X509]{get_notBefore}{} -Return a string giving the time before which the certificate is not valid. The -string is formatted as an ASN1 GENERALIZEDTIME: -\begin{verbatim} - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm -\end{verbatim} -If no value exists for this field, \code{None} is returned. -\end{methoddesc} - -\begin{methoddesc}[X509]{get_notAfter}{} -Return a string giving the time after which the certificate is not valid. The -string is formatted as an ASN1 GENERALIZEDTIME: -\begin{verbatim} - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm -\end{verbatim} -If no value exists for this field, \code{None} is returned. -\end{methoddesc} - -\begin{methoddesc}[X509]{set_notBefore}{when} -Change the time before which the certificate is not valid. \var{when} is a -string formatted as an ASN1 GENERALIZEDTIME: -\begin{verbatim} - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm -\end{verbatim} -\end{methoddesc} - -\begin{methoddesc}[X509]{set_notAfter}{when} -Change the time after which the certificate is not valid. \var{when} is a -string formatted as an ASN1 GENERALIZEDTIME: -\begin{verbatim} - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm -\end{verbatim} -\end{methoddesc} - -\begin{methoddesc}[X509]{gmtime_adj_notBefore}{time} -Adjust the timestamp (in GMT) when the certificate starts being valid. -\end{methoddesc} - -\begin{methoddesc}[X509]{gmtime_adj_notAfter}{time} -Adjust the timestamp (in GMT) when the certificate stops being valid. -\end{methoddesc} - -\begin{methoddesc}[X509]{has_expired}{} -Checks the certificate's time stamp against current time. Returns true if the -certificate has expired and false otherwise. -\end{methoddesc} - -\begin{methoddesc}[X509]{set_issuer}{issuer} -Set the issuer of the certificate to \var{issuer}. -\end{methoddesc} - -\begin{methoddesc}[X509]{set_pubkey}{pkey} -Set the public key of the certificate to \var{pkey}. -\end{methoddesc} - -\begin{methoddesc}[X509]{set_serial_number}{serialno} -Set the serial number of the certificate to \var{serialno}. -\end{methoddesc} - -\begin{methoddesc}[X509]{set_subject}{subject} -Set the subject of the certificate to \var{subject}. -\end{methoddesc} - -\begin{methoddesc}[X509]{set_version}{version} -Set the certificate version to \var{version}. -\end{methoddesc} - -\begin{methoddesc}[X509]{sign}{pkey, digest} -Sign the certificate, using the key \var{pkey} and the message digest algorithm -identified by the string \var{digest}. -\end{methoddesc} - -\begin{methoddesc}[X509]{subject_name_hash}{} -Return the hash of the certificate subject. -\end{methoddesc} - -\begin{methoddesc}[X509]{digest}{digest_name} -Return a digest of the certificate, using the \var{digest_name} method. -\var{digest_name} must be a string describing a digest algorithm supported -by OpenSSL (by EVP_get_digestbyname, specifically). For example, -\constant{"md5"} or \constant{"sha1"}. -\end{methoddesc} - -\begin{methoddesc}[X509]{add_extensions}{extensions} -Add the extensions in the sequence \var{extensions} to the certificate. -\end{methoddesc} - -\begin{methoddesc}[X509]{get_extension_count}{} -Return the number of extensions on this certificate. -\versionadded{0.12} -\end{methoddesc} - -\begin{methoddesc}[X509]{get_extension}{index} -Retrieve the extension on this certificate at the given index. - -Extensions on a certificate are kept in order. The index parameter selects -which extension will be returned. The returned object will be an X509Extension -instance. -\versionadded{0.12} -\end{methoddesc} - -\subsubsection{X509Name objects \label{openssl-x509name}} - -X509Name objects have the following methods: - -\begin{methoddesc}[X509Name]{hash}{} -Return an integer giving the first four bytes of the MD5 digest of the DER -representation of the name. -\end{methoddesc} - -\begin{methoddesc}[X509Name]{der}{} -Return a string giving the DER representation of the name. -\end{methoddesc} - -\begin{methoddesc}[X509Name]{get_components}{} -Return a list of two-tuples of strings giving the components of the name. -\end{methoddesc} - -X509Name objects have the following members: - -\begin{memberdesc}[X509Name]{countryName} -The country of the entity. \code{C} may be used as an alias for -\code{countryName}. -\end{memberdesc} - -\begin{memberdesc}[X509Name]{stateOrProvinceName} -The state or province of the entity. \code{ST} may be used as an alias for -\code{stateOrProvinceName}· -\end{memberdesc} - -\begin{memberdesc}[X509Name]{localityName} -The locality of the entity. \code{L} may be used as an alias for -\code{localityName}. -\end{memberdesc} - -\begin{memberdesc}[X509Name]{organizationName} -The organization name of the entity. \code{O} may be used as an alias for -\code{organizationName}. -\end{memberdesc} - -\begin{memberdesc}[X509Name]{organizationalUnitName} -The organizational unit of the entity. \code{OU} may be used as an alias for -\code{organizationalUnitName}. -\end{memberdesc} - -\begin{memberdesc}[X509Name]{commonName} -The common name of the entity. \code{CN} may be used as an alias for -\code{commonName}. -\end{memberdesc} - -\begin{memberdesc}[X509Name]{emailAddress} -The e-mail address of the entity. -\end{memberdesc} - -\subsubsection{X509Req objects \label{openssl-x509req}} - -X509Req objects have the following methods: - -\begin{methoddesc}[X509Req]{get_pubkey}{} -Return a PKey object representing the public key of the certificate request. -\end{methoddesc} - -\begin{methoddesc}[X509Req]{get_subject}{} -Return an X509Name object representing the subject of the certificate. -\end{methoddesc} - -\begin{methoddesc}[X509Req]{set_pubkey}{pkey} -Set the public key of the certificate request to \var{pkey}. -\end{methoddesc} - -\begin{methoddesc}[X509Req]{sign}{pkey, digest} -Sign the certificate request, using the key \var{pkey} and the message digest -algorithm identified by the string \var{digest}. -\end{methoddesc} - -\begin{methoddesc}[X509Req]{verify}{pkey} -Verify a certificate request using the public key \var{pkey}. -\end{methoddesc} - -\begin{methoddesc}[X509Req]{set_version}{version} -Set the version (RFC 2459, 4.1.2.1) of the certificate request to -\var{version}. -\end{methoddesc} - -\begin{methoddesc}[X509Req]{get_version}{} -Get the version (RFC 2459, 4.1.2.1) of the certificate request. -\end{methoddesc} - -\subsubsection{X509Store objects \label{openssl-x509store}} - -The X509Store object has currently just one method: - -\begin{methoddesc}[X509Store]{add_cert}{cert} -Add the certificate \var{cert} to the certificate store. -\end{methoddesc} - -\subsubsection{PKey objects \label{openssl-pkey}} - -The PKey object has the following methods: - -\begin{methoddesc}[PKey]{bits}{} -Return the number of bits of the key. -\end{methoddesc} - -\begin{methoddesc}[PKey]{generate_key}{type, bits} -Generate a public/private key pair of the type \var{type} (one of -\constant{TYPE_RSA} and \constant{TYPE_DSA}) with the size \var{bits}. -\end{methoddesc} - -\begin{methoddesc}[PKey]{type}{} -Return the type of the key. -\end{methoddesc} - -\begin{methoddesc}[PKey]{check}{} -Check the consistency of this key, returning True if it is consistent and -raising an exception otherwise. This is only valid for RSA keys. See the -OpenSSL RSA_check_key man page for further limitations. -\end{methoddesc} - -\subsubsection{PKCS7 objects \label{openssl-pkcs7}} - -PKCS7 objects have the following methods: - -\begin{methoddesc}[PKCS7]{type_is_signed}{} -FIXME -\end{methoddesc} - -\begin{methoddesc}[PKCS7]{type_is_enveloped}{} -FIXME -\end{methoddesc} - -\begin{methoddesc}[PKCS7]{type_is_signedAndEnveloped}{} -FIXME -\end{methoddesc} - -\begin{methoddesc}[PKCS7]{type_is_data}{} -FIXME -\end{methoddesc} - -\begin{methoddesc}[PKCS7]{get_type_name}{} -Get the type name of the PKCS7. -\end{methoddesc} - -\subsubsection{PKCS12 objects \label{openssl-pkcs12}} - -PKCS12 objects have the following methods: - -\begin{methoddesc}[PKCS12]{export}{\optional{passphrase=None}\optional{, iter=2048}\optional{, maciter=1}} -Returns a PKCS12 object as a string. - -The optional \var{passphrase} must be a string not a callback. - -See also the man page for the C function \function{PKCS12_create}. -\end{methoddesc} - -\begin{methoddesc}[PKCS12]{get_ca_certificates}{} -Return CA certificates within the PKCS12 object as a tuple. Returns -\constant{None} if no CA certificates are present. -\end{methoddesc} - -\begin{methoddesc}[PKCS12]{get_certificate}{} -Return certificate portion of the PKCS12 structure. -\end{methoddesc} - -\begin{methoddesc}[PKCS12]{get_friendlyname}{} -Return friendlyName portion of the PKCS12 structure. -\end{methoddesc} - -\begin{methoddesc}[PKCS12]{get_privatekey}{} -Return private key portion of the PKCS12 structure -\end{methoddesc} - -\begin{methoddesc}[PKCS12]{set_ca_certificates}{cacerts} -Replace or set the CA certificates within the PKCS12 object with the sequence \var{cacerts}. - -Set \var{cacerts} to \constant{None} to remove all CA certificates. -\end{methoddesc} - -\begin{methoddesc}[PKCS12]{set_certificate}{cert} -Replace or set the certificate portion of the PKCS12 structure. -\end{methoddesc} - -\begin{methoddesc}[PKCS12]{set_friendlyname}{name} -Replace or set the friendlyName portion of the PKCS12 structure. -\end{methoddesc} - -\begin{methoddesc}[PKCS12]{set_privatekey}{pkey} -Replace or set private key portion of the PKCS12 structure -\end{methoddesc} - -\subsubsection{X509Extension objects \label{openssl-509ext}} - -X509Extension objects have several methods: - -\begin{methoddesc}[X509Extension]{get_critical}{} -Return the critical field of the extension object. -\end{methoddesc} - -\begin{methoddesc}[X509Extension]{get_short_name}{} -Retrieve the short descriptive name for this extension. - -The result is a byte string like \code{``basicConstraints''}. -\versionadded{0.12} -\end{methoddesc} - -\begin{methoddesc}[X509Extension]{get_data}{} -Retrieve the data for this extension. - -The result is the ASN.1 encoded form of the extension data as a byte string. -\versionadded{0.12} -\end{methoddesc} - -\subsubsection{NetscapeSPKI objects \label{openssl-netscape-spki}} - -NetscapeSPKI objects have the following methods: - -\begin{methoddesc}[NetscapeSPKI]{b64_encode}{} -Return a base64-encoded string representation of the object. -\end{methoddesc} - -\begin{methoddesc}[NetscapeSPKI]{get_pubkey}{} -Return the public key of object. -\end{methoddesc} - -\begin{methoddesc}[NetscapeSPKI]{set_pubkey}{key} -Set the public key of the object to \var{key}. -\end{methoddesc} - -\begin{methoddesc}[NetscapeSPKI]{sign}{key, digest_name} -Sign the NetscapeSPKI object using the given \var{key} and -\var{digest_name}. \var{digest_name} must be a string describing a digest -algorithm supported by OpenSSL (by EVP_get_digestbyname, specifically). For -example, \constant{"md5"} or \constant{"sha1"}. -\end{methoddesc} - -\begin{methoddesc}[NetscapeSPKI]{verify}{key} -Verify the NetscapeSPKI object using the given \var{key}. -\end{methoddesc} - -\subsubsection{CRL objects \label{crl}} - -CRL objects have the following methods: - -\begin{methoddesc}[CRL]{add_revoked}{revoked} -Add a Revoked object to the CRL, by value not reference. -\end{methoddesc} - -\begin{methoddesc}[CRL]{export}{cert, key\optional{, type=FILETYPE_PEM}\optional{, days=100}} -Use \var{cert} and \var{key} to sign the CRL and return the CRL as a string. -\var{days} is the number of days before the next CRL is due. -\end{methoddesc} - -\begin{methoddesc}[CRL]{get_revoked}{} -Return a tuple of Revoked objects, by value not reference. -\end{methoddesc} - -\subsubsection{Revoked objects \label{revoked}} - -Revoked objects have the following methods: - -\begin{methoddesc}[Revoked]{all_reasons}{} -Return a list of all supported reasons. -\end{methoddesc} - -\begin{methoddesc}[Revoked]{get_reason}{} -Return the revocation reason as a str. Can be -None, which differs from "Unspecified". -\end{methoddesc} - -\begin{methoddesc}[Revoked]{get_rev_date}{} -Return the revocation date as a str. -The string is formatted as an ASN1 GENERALIZEDTIME. -\end{methoddesc} - -\begin{methoddesc}[Revoked]{get_serial}{} -Return a str containing a hex number of the serial of the revoked certificate. -\end{methoddesc} - -\begin{methoddesc}[Revoked]{set_reason}{reason} -Set the revocation reason. \var{reason} must -be None or a string, but the values are limited. -Spaces and case are ignored. See \method{all_reasons}. -\end{methoddesc} - -\begin{methoddesc}[Revoked]{set_rev_date}{date} -Set the revocation date. -The string is formatted as an ASN1 GENERALIZEDTIME. -\end{methoddesc} - -\begin{methoddesc}[Revoked]{set_serial}{serial} -\var{serial} is a string containing a hex number of the serial of the revoked certificate. -\end{methoddesc} - - -% % % rand module - -\subsection{\module{rand} --- An interface to the OpenSSL pseudo random number generator \label{openssl-rand}} - -\declaremodule{extension}{rand} -\modulesynopsis{An interface to the OpenSSL pseudo random number generator} - -This module handles the OpenSSL pseudo random number generator (PRNG) and -declares the following: - -\begin{funcdesc}{add}{string, entropy} -Mix bytes from \var{string} into the PRNG state. The \var{entropy} argument is -(the lower bound of) an estimate of how much randomness is contained in -\var{string}, measured in bytes. For more information, see e.g. \rfc{1750}. -\end{funcdesc} - -\begin{funcdesc}{bytes}{num_bytes} -Get some random bytes from the PRNG as a string. - -This is a wrapper for the C function \function{RAND_bytes}. -\end{funcdesc} - -\begin{funcdesc}{cleanup}{} -Erase the memory used by the PRNG. - -This is a wrapper for the C function \function{RAND_cleanup}. -\end{funcdesc} - -\begin{funcdesc}{egd}{path\optional{, bytes}} -Query the Entropy Gathering Daemon\footnote{See -\url{http://www.lothar.com/tech/crypto/}} on socket \var{path} for \var{bytes} -bytes of random data and and uses \function{add} to seed the PRNG. The default -value of \var{bytes} is 255. -\end{funcdesc} - -\begin{funcdesc}{load_file}{path\optional{, bytes}} -Read \var{bytes} bytes (or all of it, if \var{bytes} is negative) of data from -the file \var{path} to seed the PRNG. The default value of \var{bytes} is -1. -\end{funcdesc} - -\begin{funcdesc}{screen}{} -Add the current contents of the screen to the PRNG state. -Availability: Windows. -\end{funcdesc} - -\begin{funcdesc}{seed}{string} -This is equivalent to calling \function{add} with \var{entropy} as the length -of the string. -\end{funcdesc} - -\begin{funcdesc}{status}{} -Returns true if the PRNG has been seeded with enough data, and false otherwise. -\end{funcdesc} - -\begin{funcdesc}{write_file}{path} -Write a number of random bytes (currently 1024) to the file \var{path}. This -file can then be used with \function{load_file} to seed the PRNG again. -\end{funcdesc} - -\begin{excdesc}{Error} -If the current RAND method supports any errors, this is raised when needed. -The default method does not raise this when the entropy pool is depleted. - -Whenever this exception is raised directly, it has a list of error messages -from the OpenSSL error queue, where each item is a tuple \code{(\var{lib}, -\var{function}, \var{reason})}. Here \var{lib}, \var{function} and \var{reason} -are all strings, describing where and what the problem is. See \manpage{err}{3} -for more information. -\end{excdesc} - - -% % % SSL module - -\subsection{\module{SSL} --- An interface to the SSL-specific parts of OpenSSL \label{openssl-ssl}} - -\declaremodule{extension}{SSL} -\modulesynopsis{An interface to the SSL-specific parts of OpenSSL} - -This module handles things specific to SSL. There are two objects defined: -Context, Connection. - -\begin{datadesc}{SSLv2_METHOD} -\dataline{SSLv3_METHOD} -\dataline{SSLv23_METHOD} -\dataline{TLSv1_METHOD} -These constants represent the different SSL methods to use when creating a -context object. -\end{datadesc} - -\begin{datadesc}{VERIFY_NONE} -\dataline{VERIFY_PEER} -\dataline{VERIFY_FAIL_IF_NO_PEER_CERT} -These constants represent the verification mode used by the Context -object's \method{set_verify} method. -\end{datadesc} - -\begin{datadesc}{FILETYPE_PEM} -\dataline{FILETYPE_ASN1} -File type constants used with the \method{use_certificate_file} and -\method{use_privatekey_file} methods of Context objects. -\end{datadesc} - -\begin{datadesc}{OP_SINGLE_DH_USE} -\dataline{OP_EPHEMERAL_RSA} -\dataline{OP_NO_SSLv2} -\dataline{OP_NO_SSLv3} -\dataline{OP_NO_TLSv1} -Constants used with \method{set_options} of Context objects. -\constant{OP_SINGLE_DH_USE} means to always create a new key when using ephemeral -Diffie-Hellman. \constant{OP_EPHEMERAL_RSA} means to always use ephemeral RSA keys -when doing RSA operations. \constant{OP_NO_SSLv2}, \constant{OP_NO_SSLv3} and -\constant{OP_NO_TLSv1} means to disable those specific protocols. This is -interesting if you're using e.g. \constant{SSLv23_METHOD} to get an SSLv2-compatible -handshake, but don't want to use SSLv2. -\end{datadesc} - -\begin{datadesc}{SSLEAY_VERSION} -\dataline{SSLEAY_CFLAGS} -\dataline{SSLEAY_BUILT_ON} -\dataline{SSLEAY_PLATFORM} -\dataline{SSLEAY_DIR} -Constants used with \method{SSLeay_version} to specify what OpenSSL version -information to retrieve. See the man page for the \function{SSLeay_version} C -API for details. -\end{datadesc} - -\begin{datadesc}{OPENSSL_VERSION_NUMBER} -An integer giving the version number of the OpenSSL library used to build this -version of pyOpenSSL. See the man page for the \function{SSLeay_version} C API -for details. -\end{datadesc} - -\begin{funcdesc}{SSLeay_version}{type} -Retrieve a string describing some aspect of the underlying OpenSSL version. The -type passed in should be one of the \constant{SSLEAY_*} constants defined in -this module. -\end{funcdesc} - -\begin{datadesc}{ContextType} -See \class{Context}. -\end{datadesc} - -\begin{classdesc}{Context}{method} -A class representing SSL contexts. Contexts define the parameters of one or -more SSL connections. - -\var{method} should be \constant{SSLv2_METHOD}, \constant{SSLv3_METHOD}, -\constant{SSLv23_METHOD} or \constant{TLSv1_METHOD}. -\end{classdesc} - -\begin{datadesc}{ConnectionType} -See \class{Connection}. -\end{datadesc} - -\begin{classdesc}{Connection}{context, socket} -A class representing SSL connections. - -\var{context} should be an instance of \class{Context} and \var{socket} -should be a socket \footnote{Actually, all that is required is an object -that \emph{behaves} like a socket, you could even use files, even though -it'd be tricky to get the handshakes right!} object. \var{socket} may be -\var{None}; in this case, the Connection is created with a memory BIO: see -the \method{bio_read}, \method{bio_write}, and \method{bio_shutdown} -methods. -\end{classdesc} - -\begin{excdesc}{Error} -This exception is used as a base class for the other SSL-related -exceptions, but may also be raised directly. - -Whenever this exception is raised directly, it has a list of error messages -from the OpenSSL error queue, where each item is a tuple \code{(\var{lib}, -\var{function}, \var{reason})}. Here \var{lib}, \var{function} and \var{reason} -are all strings, describing where and what the problem is. See \manpage{err}{3} -for more information. -\end{excdesc} - -\begin{excdesc}{ZeroReturnError} -This exception matches the error return code \code{SSL_ERROR_ZERO_RETURN}, and -is raised when the SSL Connection has been closed. In SSL 3.0 and TLS 1.0, this -only occurs if a closure alert has occurred in the protocol, i.e. the -connection has been closed cleanly. Note that this does not necessarily -mean that the transport layer (e.g. a socket) has been closed. - -It may seem a little strange that this is an exception, but it does match an -\code{SSL_ERROR} code, and is very convenient. -\end{excdesc} - -\begin{excdesc}{WantReadError} -The operation did not complete; the same I/O method should be called again -later, with the same arguments. Any I/O method can lead to this since new -handshakes can occur at any time. - -The wanted read is for \emph{dirty} data sent over the network, not the -\emph{clean} data inside the tunnel. For a socket based SSL connection, -\emph{read} means data coming at us over the network. Until that read -succeeds, the attempted \method{OpenSSL.SSL.Connection.recv}, -\method{OpenSSL.SSL.Connection.send}, or -\method{OpenSSL.SSL.Connection.do_handshake} is prevented or incomplete. You -probably want to \method{select()} on the socket before trying again. -\end{excdesc} - -\begin{excdesc}{WantWriteError} -See \exception{WantReadError}. The socket send buffer may be too full to -write more data. -\end{excdesc} - -\begin{excdesc}{WantX509LookupError} -The operation did not complete because an application callback has asked to be -called again. The I/O method should be called again later, with the same -arguments. Note: This won't occur in this version, as there are no such -callbacks in this version. -\end{excdesc} - -\begin{excdesc}{SysCallError} -The \exception{SysCallError} occurs when there's an I/O error and OpenSSL's -error queue does not contain any information. This can mean two things: An -error in the transport protocol, or an end of file that violates the protocol. -The parameter to the exception is always a pair \code{(\var{errnum}, -\var{errstr})}. -\end{excdesc} - - -\subsubsection{Context objects \label{openssl-context}} - -Context objects have the following methods: - -\begin{methoddesc}[Context]{check_privatekey}{} -Check if the private key (loaded with \method{use_privatekey\optional{_file}}) -matches the certificate (loaded with \method{use_certificate\optional{_file}}). -Returns \code{None} if they match, raises \exception{Error} otherwise. -\end{methoddesc} - -\begin{methoddesc}[Context]{get_app_data}{} -Retrieve application data as set by \method{set_app_data}. -\end{methoddesc} - -\begin{methoddesc}[Context]{get_cert_store}{} -Retrieve the certificate store (a X509Store object) that the context uses. -This can be used to add "trusted" certificates without using the. -\method{load_verify_locations()} method. -\end{methoddesc} - -\begin{methoddesc}[Context]{get_timeout}{} -Retrieve session timeout, as set by \method{set_timeout}. The default is 300 -seconds. -\end{methoddesc} - -\begin{methoddesc}[Context]{get_verify_depth}{} -Retrieve the Context object's verify depth, as set by -\method{set_verify_depth}. -\end{methoddesc} - -\begin{methoddesc}[Context]{get_verify_mode}{} -Retrieve the Context object's verify mode, as set by \method{set_verify}. -\end{methoddesc} - -\begin{methoddesc}[Context]{load_client_ca}{pemfile} -Read a file with PEM-formatted certificates that will be sent to the client -when requesting a client certificate. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_client_ca_list}{certificate_authorities} -Replace the current list of preferred certificate signers that would be -sent to the client when requesting a client certificate with the -\var{certificate_authorities} sequence of \class{OpenSSL.crypto.X509Name}s. - -\versionadded{0.10} -\end{methoddesc} - -\begin{methoddesc}[Context]{add_client_ca}{certificate_authority} -Extract a \class{OpenSSL.crypto.X509Name} from the \var{certificate_authority} -\class{OpenSSL.crypto.X509} certificate and add it to the list of preferred -certificate signers sent to the client when requesting a client certificate. - -\versionadded{0.10} -\end{methoddesc} - -\begin{methoddesc}[Context]{load_verify_locations}{pemfile, capath} -Specify where CA certificates for verification purposes are located. These -are trusted certificates. Note that the certificates have to be in PEM -format. If capath is passed, it must be a directory prepared using the -\code{c_rehash} tool included with OpenSSL. Either, but not both, of -\var{pemfile} or \var{capath} may be \code{None}. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_default_verify_paths}{} -Specify that the platform provided CA certificates are to be used for -verification purposes. This method may not work properly on OS X. -\end{methoddesc} - -\begin{methoddesc}[Context]{load_tmp_dh}{dhfile} -Load parameters for Ephemeral Diffie-Hellman from \var{dhfile}. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_app_data}{data} -Associate \var{data} with this Context object. \var{data} can be retrieved -later using the \method{get_app_data} method. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_cipher_list}{ciphers} -Set the list of ciphers to be used in this context. See the OpenSSL manual for -more information (e.g. ciphers(1)) -\end{methoddesc} - -\begin{methoddesc}[Context]{set_info_callback}{callback} -Set the information callback to \var{callback}. This function will be called -from time to time during SSL handshakes. -\var{callback} should take three arguments: a Connection object and two -integers. The first integer specifies where in the SSL handshake the function -was called, and the other the return code from a (possibly failed) internal -function call. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_options}{options} -Add SSL options. Options you have set before are not cleared! -This method should be used with the \constant{OP_*} constants. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_passwd_cb}{callback\optional{, userdata}} -Set the passphrase callback to \var{callback}. This function will be called -when a private key with a passphrase is loaded. \var{callback} must accept -three positional arguments. First, an integer giving the maximum length of -the passphrase it may return. If the returned passphrase is longer than -this, it will be truncated. Second, a boolean value which will be true if -the user should be prompted for the passphrase twice and the callback should -verify that the two values supplied are equal. Third, the value given as the -\var{userdata} parameter to \method{set_passwd_cb}. If an error occurs, -\var{callback} should return a false value (e.g. an empty string). -\end{methoddesc} - -\begin{methoddesc}[Context]{set_session_id}{name} -Set the context \var{name} within which a session can be reused for this -Context object. This is needed when doing session resumption, because there is -no way for a stored session to know which Context object it is associated with. -\var{name} may be any binary data. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_timeout}{timeout} -Set the timeout for newly created sessions for this Context object to -\var{timeout}. \var{timeout} must be given in (whole) seconds. The default -value is 300 seconds. See the OpenSSL manual for more information (e.g. -SSL_CTX_set_timeout(3)). -\end{methoddesc} - -\begin{methoddesc}[Context]{set_verify}{mode, callback} -Set the verification flags for this Context object to \var{mode} and specify -that \var{callback} should be used for verification callbacks. \var{mode} -should be one of \constant{VERIFY_NONE} and \constant{VERIFY_PEER}. If -\constant{VERIFY_PEER} is used, \var{mode} can be OR:ed with -\constant{VERIFY_FAIL_IF_NO_PEER_CERT} and \constant{VERIFY_CLIENT_ONCE} to -further control the behaviour. -\var{callback} should take five arguments: A Connection object, an X509 object, -and three integer variables, which are in turn potential error number, error -depth and return code. \var{callback} should return true if verification passes -and false otherwise. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_verify_depth}{depth} -Set the maximum depth for the certificate chain verification that shall be -allowed for this Context object. -\end{methoddesc} - -\begin{methoddesc}[Context]{use_certificate}{cert} -Use the certificate \var{cert} which has to be a X509 object. -\end{methoddesc} - -\begin{methoddesc}[Context]{add_extra_chain_cert}{cert} -Adds the certificate \var{cert}, which has to be a X509 object, to the -certificate chain presented together with the certificate. -\end{methoddesc} - -\begin{methoddesc}[Context]{use_certificate_chain_file}{file} -Load a certificate chain from \var{file} which must be PEM encoded. -\end{methoddesc} - -\begin{methoddesc}[Context]{use_privatekey}{pkey} -Use the private key \var{pkey} which has to be a PKey object. -\end{methoddesc} - -\begin{methoddesc}[Context]{use_certificate_file}{file\optional{, format}} -Load the first certificate found in \var{file}. The certificate must be in the -format specified by \var{format}, which is either \constant{FILETYPE_PEM} or -\constant{FILETYPE_ASN1}. The default is \constant{FILETYPE_PEM}. -\end{methoddesc} - -\begin{methoddesc}[Context]{use_privatekey_file}{file\optional{, format}} -Load the first private key found in \var{file}. The private key must be in the -format specified by \var{format}, which is either \constant{FILETYPE_PEM} or -\constant{FILETYPE_ASN1}. The default is \constant{FILETYPE_PEM}. -\end{methoddesc} - -\begin{methoddesc}[Context]{set_tlsext_servername_callback}{callback} -Specify a one-argument callable to use as the TLS extension server name -callback. When a connection using the server name extension is made using this -context, the callback will be invoked with the \code{Connection} instance. -\versionadded{0.13} -\end{methoddesc} - -\subsubsection{Connection objects \label{openssl-connection}} - -Connection objects have the following methods: - -\begin{methoddesc}[Connection]{accept}{} -Call the \method{accept} method of the underlying socket and set up SSL on the -returned socket, using the Context object supplied to this Connection object at -creation. Returns a pair \code{(\var{conn}, \var{address})}. where \var{conn} -is the new Connection object created, and \var{address} is as returned by the -socket's \method{accept}. -\end{methoddesc} - -\begin{methoddesc}[Connection]{bind}{address} -Call the \method{bind} method of the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{close}{} -Call the \method{close} method of the underlying socket. Note: If you want -correct SSL closure, you need to call the \method{shutdown} method first. -\end{methoddesc} - -\begin{methoddesc}[Connection]{connect}{address} -Call the \method{connect} method of the underlying socket and set up SSL on the -socket, using the Context object supplied to this Connection object at -creation. -\end{methoddesc} - -\begin{methoddesc}[Connection]{connect_ex}{address} -Call the \method{connect_ex} method of the underlying socket and set up SSL on -the socket, using the Context object supplied to this Connection object at -creation. Note that if the \method{connect_ex} method of the socket doesn't -return 0, SSL won't be initialized. -\end{methoddesc} - -\begin{methoddesc}[Connection]{do_handshake}{} -Perform an SSL handshake (usually called after \method{renegotiate} or one of -\method{set_accept_state} or \method{set_accept_state}). This can raise the -same exceptions as \method{send} and \method{recv}. -\end{methoddesc} - -\begin{methoddesc}[Connection]{fileno}{} -Retrieve the file descriptor number for the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{listen}{backlog} -Call the \method{listen} method of the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{get_app_data}{} -Retrieve application data as set by \method{set_app_data}. -\end{methoddesc} - -\begin{methoddesc}[Connection]{get_cipher_list}{} -Retrieve the list of ciphers used by the Connection object. WARNING: This API -has changed. It used to take an optional parameter and just return a string, -but not it returns the entire list in one go. -\end{methoddesc} - -\begin{methoddesc}[Connection]{get_client_ca_list}{} -Retrieve the list of preferred client certificate issuers sent by the server -as \class{OpenSSL.crypto.X509Name} objects. - -If this is a client \class{Connection}, the list will be empty until the -connection with the server is established. - -If this is a server \class{Connection}, return the list of certificate -authorities that will be sent or has been sent to the client, as controlled -by this \class{Connection}'s \class{Context}. - -\versionadded{0.10} -\end{methoddesc} - -\begin{methoddesc}[Connection]{get_context}{} -Retrieve the Context object associated with this Connection. -\end{methoddesc} - -\begin{methoddesc}[Connection]{set_context}{context} -Specify a replacement Context object for this Connection. -\end{methoddesc} - -\begin{methoddesc}[Connection]{get_peer_certificate}{} -Retrieve the other side's certificate (if any) -\end{methoddesc} - -\begin{methoddesc}[Connection]{get_peer_cert_chain}{} -Retrieve the tuple of the other side's certificate chain (if any) -\end{methoddesc} - -\begin{methoddesc}[Connection]{getpeername}{} -Call the \method{getpeername} method of the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{getsockname}{} -Call the \method{getsockname} method of the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{getsockopt}{level, optname\optional{, buflen}} -Call the \method{getsockopt} method of the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{pending}{} -Retrieve the number of bytes that can be safely read from the SSL buffer -(\emph{not} the underlying transport buffer). -\end{methoddesc} - -\begin{methoddesc}[Connection]{recv}{bufsize} -Receive data from the Connection. The return value is a string representing the -data received. The maximum amount of data to be received at once, is specified -by \var{bufsize}. -\end{methoddesc} - -\begin{methoddesc}[Connection]{bio_write}{bytes} -If the Connection was created with a memory BIO, this method can be used to add -bytes to the read end of that memory BIO. The Connection can then read the -bytes (for example, in response to a call to \method{recv}). -\end{methoddesc} - -\begin{methoddesc}[Connection]{renegotiate}{} -Renegotiate the SSL session. Call this if you wish to change cipher suites or -anything like that. -\end{methoddesc} - -\begin{methoddesc}[Connection]{send}{string} -Send the \var{string} data to the Connection. -\end{methoddesc} - -\begin{methoddesc}[Connection]{bio_read}{bufsize} -If the Connection was created with a memory BIO, this method can be used to -read bytes from the write end of that memory BIO. Many Connection methods will -add bytes which must be read in this manner or the buffer will eventually fill -up and the Connection will be able to take no further actions. -\end{methoddesc} - -\begin{methoddesc}[Connection]{sendall}{string} -Send all of the \var{string} data to the Connection. This calls \method{send} -repeatedly until all data is sent. If an error occurs, it's impossible to tell -how much data has been sent. -\end{methoddesc} - -\begin{methoddesc}[Connection]{set_accept_state}{} -Set the connection to work in server mode. The handshake will be handled -automatically by read/write. -\end{methoddesc} - -\begin{methoddesc}[Connection]{set_app_data}{data} -Associate \var{data} with this Connection object. \var{data} can be retrieved -later using the \method{get_app_data} method. -\end{methoddesc} - -\begin{methoddesc}[Connection]{set_connect_state}{} -Set the connection to work in client mode. The handshake will be handled -automatically by read/write. -\end{methoddesc} - -\begin{methoddesc}[Connection]{setblocking}{flag} -Call the \method{setblocking} method of the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{setsockopt}{level, optname, value} -Call the \method{setsockopt} method of the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{shutdown}{} -Send the shutdown message to the Connection. Returns true if the shutdown -message exchange is completed and false otherwise (in which case you call -\method{recv()} or \method{send()} when the connection becomes -readable/writeable. -\end{methoddesc} - -\begin{methoddesc}[Connection]{get_shutdown}{} -Get the shutdown state of the Connection. Returns a bitvector of either or -both of \var{SENT_SHUTDOWN} and \var{RECEIVED_SHUTDOWN}. -\end{methoddesc} - -\begin{methoddesc}[Connection]{set_shutdown}{state} -Set the shutdown state of the Connection. \var{state} is a bitvector of -either or both of \var{SENT_SHUTDOWN} and \var{RECEIVED_SHUTDOWN}. -\end{methoddesc} - -\begin{methoddesc}[Connection]{sock_shutdown}{how} -Call the \method{shutdown} method of the underlying socket. -\end{methoddesc} - -\begin{methoddesc}[Connection]{bio_shutdown}{} -If the Connection was created with a memory BIO, this method can be used to -indicate that ``end of file'' has been reached on the read end of that memory -BIO. -\end{methoddesc} - -\begin{methoddesc}[Connection]{state_string}{} -Retrieve a verbose string detailing the state of the Connection. -\end{methoddesc} - -\begin{methoddesc}[Connection]{client_random}{} -Retrieve the random value used with the client hello message. -\end{methoddesc} - -\begin{methoddesc}[Connection]{server_random}{} -Retrieve the random value used with the server hello message. -\end{methoddesc} - -\begin{methoddesc}[Connection]{master_key}{} -Retrieve the value of the master key for this session. -\end{methoddesc} - -\begin{methoddesc}[Connection]{want_read}{} -Checks if more data has to be read from the transport layer to complete an -operation. -\end{methoddesc} - -\begin{methoddesc}[Connection]{want_write}{} -Checks if there is data to write to the transport layer to complete an -operation. -\end{methoddesc} - -\begin{methoddesc}[Connection]{set_tlsext_host_name}{name} -Specify the byte string to send as the server name in the client hello message. -\versionadded{0.13} -\end{methoddesc} - -\begin{methoddesc}[Connection]{get_servername}{} -Get the value of the server name received in the client hello message. -\versionadded{0.13} -\end{methoddesc} - - - -\section{Internals \label{internals}} - -We ran into three main problems developing this: Exceptions, callbacks and -accessing socket methods. This is what this chapter is about. - -\subsection{Exceptions \label{exceptions}} - -We realized early that most of the exceptions would be raised by the I/O -functions of OpenSSL, so it felt natural to mimic OpenSSL's error code system, -translating them into Python exceptions. This naturally gives us the exceptions -\exception{SSL.ZeroReturnError}, \exception{SSL.WantReadError}, -\exception{SSL.WantWriteError}, \exception{SSL.WantX509LookupError} and -\exception{SSL.SysCallError}. - -For more information about this, see section \ref{openssl-ssl}. - - -\subsection{Callbacks \label{callbacks}} - -There are a number of problems with callbacks. First of all, OpenSSL is written -as a C library, it's not meant to have Python callbacks, so a way around that -is needed. Another problem is thread support. A lot of the OpenSSL I/O -functions can block if the socket is in blocking mode, and then you want other -Python threads to be able to do other things. The real trouble is if you've -released the global CPython interpreter lock to do a potentially blocking -operation, and the operation calls a callback. Then we must take the GIL back, -since calling Python APIs without holding it is not allowed. - -There are two solutions to the first problem, both of which are necessary. The -first solution to use is if the C callback allows ''userdata'' to be passed to -it (an arbitrary pointer normally). This is great! We can set our Python -function object as the real userdata and emulate userdata for the Python -function in another way. The other solution can be used if an object with an -''app_data'' system always is passed to the callback. For example, the SSL -object in OpenSSL has app_data functions and in e.g. the verification -callbacks, you can retrieve the related SSL object. What we do is to set our -wrapper \class{Connection} object as app_data for the SSL object, and we can -easily find the Python callback. - -The other problem is solved using thread local variables. Whenever the GIL is -released before calling into an OpenSSL API, the PyThreadState pointer returned -by \cfunction{PyEval_SaveState} is stored in a global thread local variable -(using Python's own TLS API, \cfunction{PyThread_set_key_value}). When it is -necessary to re-acquire the GIL, either after the OpenSSL API returns or in a C -callback invoked by that OpenSSL API, the value of the thread local variable is -retrieved (\cfunction{PyThread_get_key_value}) and used to re-acquire the GIL. -This allows Python threads to execute while OpenSSL APIs are running and allows -use of any particular pyOpenSSL object from any Python thread, since there is -no per-thread state associated with any of these objects and since OpenSSL is -threadsafe (as long as properly initialized, as pyOpenSSL initializes it). - - -\subsection{Acessing Socket Methods \label{socket-methods}} - -We quickly saw the benefit of wrapping socket methods in the -\class{SSL.Connection} class, for an easy transition into using SSL. The -problem here is that the \module{socket} module lacks a C API, and all the -methods are declared static. One approach would be to have \module{OpenSSL} as -a submodule to the \module{socket} module, placing all the code in -\file{socketmodule.c}, but this is obviously not a good solution, since you -might not want to import tonnes of extra stuff you're not going to use when -importing the \module{socket} module. The other approach is to somehow get a -pointer to the method to be called, either the C function, or a callable Python -object. This is not really a good solution either, since there's a lot of -lookups involved. - -The way it works is that you have to supply a ``\class{socket}-like'' transport -object to the \class{SSL.Connection}. The only requirement of this object is -that it has a \method{fileno()} method that returns a file descriptor that's -valid at the C level (i.e. you can use the system calls read and write). If you -want to use the \method{connect()} or \method{accept()} methods of the -\class{SSL.Connection} object, the transport object has to supply such -methods too. Apart from them, any method lookups in the \class{SSL.Connection} -object that fail are passed on to the underlying transport object. - -Future changes might be to allow Python-level transport objects, that instead -of having \method{fileno()} methods, have \method{read()} and \method{write()} -methods, so more advanced features of Python can be used. This would probably -entail some sort of OpenSSL ``BIOs'', but converting Python strings back and -forth is expensive, so this shouldn't be used unless necessary. Other nice -things would be to be able to pass in different transport objects for reading -and writing, but then the \method{fileno()} method of \class{SSL.Connection} -becomes virtually useless. Also, should the method resolution be used on the -read-transport or the write-transport? - - -\end{document} diff --git a/doc/pyOpenSSL.txt b/doc/pyOpenSSL.txt deleted file mode 100644 index 6e5acee..0000000 --- a/doc/pyOpenSSL.txt +++ /dev/null @@ -1,1265 +0,0 @@ - Python OpenSSL Manual - __________________________________________________________________ - - Python OpenSSL Manual - - Jean-Paul Calderone - - exarkun@twistedmatrix.com - - Abstract: - - This module is a rather thin wrapper around (a subset of) the OpenSSL - library. With thin wrapper I mean that a lot of the object methods do - nothing more than calling a corresponding function in the OpenSSL - library. - -Contents - - * 1 Introduction - * 2 Building and Installing - + 2.1 Building the Module on a Unix System - + 2.2 Building the Module on a Windows System - * 3 OpenSSL -- Python interface to OpenSSL - + 3.1 crypto -- Generic cryptographic module - + 3.2 rand -- An interface to the OpenSSL pseudo random number - generator - + 3.3 SSL -- An interface to the SSL-specific parts of OpenSSL - * 4 Internals - + 4.1 Exceptions - + 4.2 Callbacks - + 4.3 Acessing Socket Methods - - - 1 Introduction - - The reason pyOpenSSL was created is that the SSL support in the socket - module in Python 2.1 (the contemporary version of Python when the - pyOpenSSL project was begun) was severely limited. Other OpenSSL - wrappers for Python at the time were also limited, though in different - ways. Unfortunately, Python's standard library SSL support has remained - weak, although other packages (such as M2Crypto^1) have made great - advances and now equal or exceed pyOpenSSL's functionality. - - The reason pyOpenSSL continues to be maintained is that there is a - significant user community around it, as well as a large amount of - software which depends on it. It is a great benefit to many people for - pyOpenSSL to continue to exist and advance. - - - 2 Building and Installing - - These instructions can also be found in the file INSTALL. - - I have tested this on Debian Linux systems (woody and sid), Solaris 2.6 - and 2.7. Others have successfully compiled it on Windows and NT. - - -2.1 Building the Module on a Unix System - - pyOpenSSL uses distutils, so there really shouldn't be any problems. To - build the library: - -python setup.py build - - If your OpenSSL header files aren't in /usr/include, you may need to - supply the -I flag to let the setup script know where to look. The same - goes for the libraries of course, use the -L flag. Note that build - won't accept these flags, so you have to run first build_ext and then - build! Example: - -python setup.py build_ext -I/usr/local/ssl/include -L/usr/local/ssl/lib -python setup.py build - - Now you should have a directory called OpenSSL that contains e.g. - SSL.so and __init__.py somewhere in the build dicrectory, so just: - -python setup.py install - - If you, for some arcane reason, don't want the module to appear in the - site-packages directory, use the --prefix option. - - You can, of course, do - -python setup.py --help - - to find out more about how to use the script. - - -2.2 Building the Module on a Windows System - - Big thanks to Itamar Shtull-Trauring and Oleg Orlov for their help with - Windows build instructions. Same as for Unix systems, we have to - separate the build_ext and the build. - - Building the library: - -setup.py build_ext -I ...\openssl\inc32 -L ...\openssl\out32dll -setup.py build - - Where ...\openssl is of course the location of your OpenSSL - installation. - - Installation is the same as for Unix systems: - -setup.py install - - And similarily, you can do - -setup.py --help - - to get more information. - - - 3 OpenSSL -- Python interface to OpenSSL - - This package provides a high-level interface to the functions in the - OpenSSL library. The following modules are defined: - - crypto - Generic cryptographic module. Note that if anything is - incomplete, this module is! - - rand - An interface to the OpenSSL pseudo random number generator. - - SSL - An interface to the SSL-specific parts of OpenSSL. - - -3.1 crypto -- Generic cryptographic module - - X509Type - See X509. - - class X509() - A class representing X.509 certificates. - - X509NameType - See X509Name. - - class X509Name(x509name) - A class representing X.509 Distinguished Names. - - This constructor creates a copy of x509name which should be an - instance of X509Name. - - X509ReqType - See X509Req. - - class X509Req() - A class representing X.509 certificate requests. - - X509StoreType - A Python type object representing the X509Store object type. - - PKeyType - See PKey. - - class PKey() - A class representing DSA or RSA keys. - - PKCS7Type - A Python type object representing the PKCS7 object type. - - PKCS12Type - A Python type object representing the PKCS12 object type. - - X509ExtensionType - See X509Extension. - - class X509Extension(typename, critical, value[, subject][, issuer]) - A class representing an X.509 v3 certificate extensions. See - http://openssl.org/docs/apps/x509v3_config.html#STANDARD_EXTENSI - ONSfor typename strings and their options. Optional parameters - subject and issuer must be X509 objects. - - NetscapeSPKIType - See NetscapeSPKI. - - class NetscapeSPKI([enc]) - A class representing Netscape SPKI objects. - - If the enc argument is present, it should be a base64-encoded - string representing a NetscapeSPKI object, as returned by the - b64_encode method. - - class CRL() - A class representing Certifcate Revocation List objects. - - class Revoked() - A class representing Revocation objects of CRL. - - FILETYPE_PEM - - FILETYPE_ASN1 - File type constants. - - TYPE_RSA - - TYPE_DSA - Key type constants. - - exception Error - Generic exception used in the crypto module. - - dump_certificate(type, cert) - Dump the certificate cert into a buffer string encoded with the - type type. - - dump_certificate_request(type, req) - Dump the certificate request req into a buffer string encoded - with the type type. - - dump_privatekey(type, pkey[, cipher, passphrase]) - Dump the private key pkey into a buffer string encoded with the - type type, optionally (if type is FILETYPE_PEM) encrypting it - using cipher and passphrase. - - passphrase must be either a string or a callback for providing - the pass phrase. - - load_certificate(type, buffer) - Load a certificate (X509) from the string buffer encoded with - the type type. - - load_certificate_request(type, buffer) - Load a certificate request (X509Req) from the string buffer - encoded with the type type. - - load_privatekey(type, buffer[, passphrase]) - Load a private key (PKey) from the string buffer encoded with - the type type (must be one of FILETYPE_PEM and FILETYPE_ASN1). - - passphrase must be either a string or a callback for providing - the pass phrase. - - load_crl(type, buffer) - Load Certificate Revocation List (CRL) data from a string - buffer. buffer encoded with the type type. The type type must - either FILETYPE_PEM or FILETYPE_ASN1). - - load_pkcs7_data(type, buffer) - Load pkcs7 data from the string buffer encoded with the type - type. - - load_pkcs12(buffer[, passphrase]) - Load pkcs12 data from the string buffer. If the pkcs12 structure - is encrypted, a passphrase must be included. The MAC is always - checked and thus required. - - See also the man page for the C function PKCS12_parse. - - sign(key, data, digest) - Sign a data string using the given key and message digest. - - key is a PKey instance. data is a str instance. digest is a str - naming a supported message digest type, for example ``sha1''. - New in version 0.11. - - verify(certificate, signature, data, digest) - Verify the signature for a data string. - - certificate is a X509 instance corresponding to the private key - which generated the signature. signature is a str instance - giving the signature itself. data is a str instance giving the - data to which the signature applies. digest is a str instance - naming the message digest type of the signature, for example - ``sha1''. New in version 0.11. - - - 3.1.1 X509Extension objects - - X509Extension objects have the following methods: - - get_short_name() - Retrieve the short descriptive name for this extension. - - The result is a byte string like ``basicConstraints''. New in - version 0.12. - - get_data() - Retrieve the data for this extension. - - The result is the ASN.1 encoded form of the extension data as a - byte string. New in version 0.12. - - - 3.1.2 X509 objects - - X509 objects have the following methods: - - get_issuer() - Return an X509Name object representing the issuer of the - certificate. - - get_pubkey() - Return a PKey object representing the public key of the - certificate. - - get_serial_number() - Return the certificate serial number. - - get_subject() - Return an X509Name object representing the subject of the - certificate. - - get_version() - Return the certificate version. - - get_notBefore() - Return a string giving the time before which the certificate is - not valid. The string is formatted as an ASN1 GENERALIZEDTIME: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - - If no value exists for this field, None is returned. - - get_notAfter() - Return a string giving the time after which the certificate is - not valid. The string is formatted as an ASN1 GENERALIZEDTIME: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - - If no value exists for this field, None is returned. - - set_notBefore(when) - Change the time before which the certificate is not valid. when - is a string formatted as an ASN1 GENERALIZEDTIME: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - - set_notAfter(when) - Change the time after which the certificate is not valid. when - is a string formatted as an ASN1 GENERALIZEDTIME: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - - gmtime_adj_notBefore(time) - Adjust the timestamp (in GMT) when the certificate starts being - valid. - - gmtime_adj_notAfter(time) - Adjust the timestamp (in GMT) when the certificate stops being - valid. - - has_expired() - Checks the certificate's time stamp against current time. - Returns true if the certificate has expired and false otherwise. - - set_issuer(issuer) - Set the issuer of the certificate to issuer. - - set_pubkey(pkey) - Set the public key of the certificate to pkey. - - set_serial_number(serialno) - Set the serial number of the certificate to serialno. - - set_subject(subject) - Set the subject of the certificate to subject. - - set_version(version) - Set the certificate version to version. - - sign(pkey, digest) - Sign the certificate, using the key pkey and the message digest - algorithm identified by the string digest. - - subject_name_hash() - Return the hash of the certificate subject. - - digest(digest_name) - Return a digest of the certificate, using the digest_name - method. digest_name must be a string describing a digest - algorithm supported by OpenSSL (by EVP_get_digestbyname, - specifically). For example, "md5" or "sha1". - - add_extensions(extensions) - Add the extensions in the sequence extensions to the - certificate. - - get_extension_count() - Return the number of extensions on this certificate. New in - version 0.12. - - get_extension(index) - Retrieve the extension on this certificate at the given index. - - Extensions on a certificate are kept in order. The index - parameter selects which extension will be returned. The returned - object will be an X509Extension instance. New in version 0.12. - - - 3.1.3 X509Name objects - - X509Name objects have the following methods: - - hash() - Return an integer giving the first four bytes of the MD5 digest - of the DER representation of the name. - - der() - Return a string giving the DER representation of the name. - - get_components() - Return a list of two-tuples of strings giving the components of - the name. - - X509Name objects have the following members: - - countryName - The country of the entity. C may be used as an alias for - countryName. - - stateOrProvinceName - The state or province of the entity. ST may be used as an alias - for stateOrProvinceName· - - localityName - The locality of the entity. L may be used as an alias for - localityName. - - organizationName - The organization name of the entity. O may be used as an alias - for organizationName. - - organizationalUnitName - The organizational unit of the entity. OU may be used as an - alias for organizationalUnitName. - - commonName - The common name of the entity. CN may be used as an alias for - commonName. - - emailAddress - The e-mail address of the entity. - - - 3.1.4 X509Req objects - - X509Req objects have the following methods: - - get_pubkey() - Return a PKey object representing the public key of the - certificate request. - - get_subject() - Return an X509Name object representing the subject of the - certificate. - - set_pubkey(pkey) - Set the public key of the certificate request to pkey. - - sign(pkey, digest) - Sign the certificate request, using the key pkey and the message - digest algorithm identified by the string digest. - - verify(pkey) - Verify a certificate request using the public key pkey. - - set_version(version) - Set the version (RFC 2459, 4.1.2.1) of the certificate request - to version. - - get_version() - Get the version (RFC 2459, 4.1.2.1) of the certificate request. - - - 3.1.5 X509Store objects - - The X509Store object has currently just one method: - - add_cert(cert) - Add the certificate cert to the certificate store. - - - 3.1.6 PKey objects - - The PKey object has the following methods: - - bits() - Return the number of bits of the key. - - generate_key(type, bits) - Generate a public/private key pair of the type type (one of - TYPE_RSA and TYPE_DSA) with the size bits. - - type() - Return the type of the key. - - - 3.1.7 PKCS7 objects - - PKCS7 objects have the following methods: - - type_is_signed() - FIXME - - type_is_enveloped() - FIXME - - type_is_signedAndEnveloped() - FIXME - - type_is_data() - FIXME - - get_type_name() - Get the type name of the PKCS7. - - - 3.1.8 PKCS12 objects - - PKCS12 objects have the following methods: - - export([passphrase=None][, iter=2048][, maciter=1]) - Returns a PKCS12 object as a string. - - The optional passphrase must be a string not a callback. - - See also the man page for the C function PKCS12_create. - - get_ca_certificates() - Return CA certificates within the PKCS12 object as a tuple. - Returns None if no CA certificates are present. - - get_certificate() - Return certificate portion of the PKCS12 structure. - - get_friendlyname() - Return friendlyName portion of the PKCS12 structure. - - get_privatekey() - Return private key portion of the PKCS12 structure - - set_ca_certificates(cacerts) - Replace or set the CA certificates within the PKCS12 object with - the sequence cacerts. - - Set cacerts to None to remove all CA certificates. - - set_certificate(cert) - Replace or set the certificate portion of the PKCS12 structure. - - set_friendlyname(name) - Replace or set the friendlyName portion of the PKCS12 structure. - - set_privatekey(pkey) - Replace or set private key portion of the PKCS12 structure - - - 3.1.9 X509Extension objects - - X509Extension objects have several methods: - - get_critical() - Return the critical field of the extension object. - - get_short_name() - Return the short type name of the extension object. - - - 3.1.10 NetscapeSPKI objects - - NetscapeSPKI objects have the following methods: - - b64_encode() - Return a base64-encoded string representation of the object. - - get_pubkey() - Return the public key of object. - - set_pubkey(key) - Set the public key of the object to key. - - sign(key, digest_name) - Sign the NetscapeSPKI object using the given key and - digest_name. digest_name must be a string describing a digest - algorithm supported by OpenSSL (by EVP_get_digestbyname, - specifically). For example, "md5" or "sha1". - - verify(key) - Verify the NetscapeSPKI object using the given key. - - - 3.1.11 CRL objects - - CRL objects have the following methods: - - add_revoked(revoked) - Add a Revoked object to the CRL, by value not reference. - - export(cert, key[, type=FILETYPE_PEM][, days=100]) - Use cert and key to sign the CRL and return the CRL as a string. - days is the number of days before the next CRL is due. - - get_revoked() - Return a tuple of Revoked objects, by value not reference. - - - 3.1.12 Revoked objects - - Revoked objects have the following methods: - - all_reasons() - Return a list of all supported reasons. - - get_reason() - Return the revocation reason as a str. Can be None, which - differs from "Unspecified". - - get_rev_date() - Return the revocation date as a str. The string is formatted as - an ASN1 GENERALIZEDTIME. - - get_serial() - Return a str containing a hex number of the serial of the - revoked certificate. - - set_reason(reason) - Set the revocation reason. reason must be None or a string, but - the values are limited. Spaces and case are ignored. See - all_reasons. - - set_rev_date(date) - Set the revocation date. The string is formatted as an ASN1 - GENERALIZEDTIME. - - set_serial(serial) - serial is a string containing a hex number of the serial of the - revoked certificate. - - -3.2 rand -- An interface to the OpenSSL pseudo random number generator - - This module handles the OpenSSL pseudo random number generator (PRNG) - and declares the following: - - add(string, entropy) - Mix bytes from string into the PRNG state. The entropy argument - is (the lower bound of) an estimate of how much randomness is - contained in string, measured in bytes. For more information, - see e.g. RFC 1750. - - bytes(num_bytes) - Get some random bytes from the PRNG as a string. - - This is a wrapper for the C function RAND_bytes. - - cleanup() - Erase the memory used by the PRNG. - - This is a wrapper for the C function RAND_cleanup. - - egd(path[, bytes]) - Query the Entropy Gathering Daemon^2 on socket path for bytes - bytes of random data and and uses add to seed the PRNG. The - default value of bytes is 255. - - load_file(path[, bytes]) - Read bytes bytes (or all of it, if bytes is negative) of data - from the file path to seed the PRNG. The default value of bytes - is -1. - - screen() - Add the current contents of the screen to the PRNG state. - Availability: Windows. - - seed(string) - This is equivalent to calling add with entropy as the length of - the string. - - status() - Returns true if the PRNG has been seeded with enough data, and - false otherwise. - - write_file(path) - Write a number of random bytes (currently 1024) to the file - path. This file can then be used with load_file to seed the PRNG - again. - - exception Error - If the current RAND method supports any errors, this is raised - when needed. The default method does not raise this when the - entropy pool is depleted. - - Whenever this exception is raised directly, it has a list of - error messages from the OpenSSL error queue, where each item is - a tuple (lib, function, reason). Here lib, function and reason - are all strings, describing where and what the problem is. See - err(3) for more information. - - -3.3 SSL -- An interface to the SSL-specific parts of OpenSSL - - This module handles things specific to SSL. There are two objects - defined: Context, Connection. - - SSLv2_METHOD - - SSLv3_METHOD - - SSLv23_METHOD - - TLSv1_METHOD - These constants represent the different SSL methods to use when - creating a context object. - - VERIFY_NONE - - VERIFY_PEER - - VERIFY_FAIL_IF_NO_PEER_CERT - These constants represent the verification mode used by the - Context object's set_verify method. - - FILETYPE_PEM - - FILETYPE_ASN1 - File type constants used with the use_certificate_file and - use_privatekey_file methods of Context objects. - - OP_SINGLE_DH_USE - - OP_EPHEMERAL_RSA - - OP_NO_SSLv2 - - OP_NO_SSLv3 - - OP_NO_TLSv1 - Constants used with set_options of Context objects. - OP_SINGLE_DH_USE means to always create a new key when using - ephemeral Diffie-Hellman. OP_EPHEMERAL_RSA means to always use - ephemeral RSA keys when doing RSA operations. OP_NO_SSLv2, - OP_NO_SSLv3 and OP_NO_TLSv1 means to disable those specific - protocols. This is interesting if you're using e.g. - SSLv23_METHOD to get an SSLv2-compatible handshake, but don't - want to use SSLv2. - - ContextType - See Context. - - class Context(method) - A class representing SSL contexts. Contexts define the - parameters of one or more SSL connections. - - method should be SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD or - TLSv1_METHOD. - - ConnectionType - See Connection. - - class Connection(context, socket) - A class representing SSL connections. - - context should be an instance of Context and socket should be a - socket ^3 object. socket may be None; in this case, the - Connection is created with a memory BIO: see the bio_read, - bio_write, and bio_shutdown methods. - - exception Error - This exception is used as a base class for the other SSL-related - exceptions, but may also be raised directly. - - Whenever this exception is raised directly, it has a list of - error messages from the OpenSSL error queue, where each item is - a tuple (lib, function, reason). Here lib, function and reason - are all strings, describing where and what the problem is. See - err(3) for more information. - - exception ZeroReturnError - This exception matches the error return code - SSL_ERROR_ZERO_RETURN, and is raised when the SSL Connection has - been closed. In SSL 3.0 and TLS 1.0, this only occurs if a - closure alert has occurred in the protocol, i.e. the connection - has been closed cleanly. Note that this does not necessarily - mean that the transport layer (e.g. a socket) has been closed. - - It may seem a little strange that this is an exception, but it - does match an SSL_ERROR code, and is very convenient. - - exception WantReadError - The operation did not complete; the same I/O method should be - called again later, with the same arguments. Any I/O method can - lead to this since new handshakes can occur at any time. - - The wanted read is for dirty data sent over the network, not the - clean data inside the tunnel. For a socket based SSL connection, - read means data coming at us over the network. Until that read - succeeds, the attempted OpenSSL.SSL.Connection.recv, - OpenSSL.SSL.Connection.send, or - OpenSSL.SSL.Connection.do_handshake is prevented or incomplete. - You probably want to select() on the socket before trying again. - - exception WantWriteError - See WantReadError. The socket send buffer may be too full to - write more data. - - exception WantX509LookupError - The operation did not complete because an application callback - has asked to be called again. The I/O method should be called - again later, with the same arguments. Note: This won't occur in - this version, as there are no such callbacks in this version. - - exception SysCallError - The SysCallError occurs when there's an I/O error and OpenSSL's - error queue does not contain any information. This can mean two - things: An error in the transport protocol, or an end of file - that violates the protocol. The parameter to the exception is - always a pair (errnum, errstr). - - - 3.3.1 Context objects - - Context objects have the following methods: - - check_privatekey() - Check if the private key (loaded with use_privatekey[_file]) - matches the certificate (loaded with use_certificate[_file]). - Returns None if they match, raises Error otherwise. - - get_app_data() - Retrieve application data as set by set_app_data. - - get_cert_store() - Retrieve the certificate store (a X509Store object) that the - context uses. This can be used to add "trusted" certificates - without using the. load_verify_locations() method. - - get_timeout() - Retrieve session timeout, as set by set_timeout. The default is - 300 seconds. - - get_verify_depth() - Retrieve the Context object's verify depth, as set by - set_verify_depth. - - get_verify_mode() - Retrieve the Context object's verify mode, as set by set_verify. - - load_client_ca(pemfile) - Read a file with PEM-formatted certificates that will be sent to - the client when requesting a client certificate. - - set_client_ca_list(certificate_authorities) - Replace the current list of preferred certificate signers that - would be sent to the client when requesting a client certificate - with the certificate_authorities sequence of - OpenSSL.crypto.X509Names. - - New in version 0.10. - - add_client_ca(certificate_authority) - Extract a OpenSSL.crypto.X509Name from the certificate_authority - OpenSSL.crypto.X509 certificate and add it to the list of - preferred certificate signers sent to the client when requesting - a client certificate. - - New in version 0.10. - - load_verify_locations(pemfile, capath) - Specify where CA certificates for verification purposes are - located. These are trusted certificates. Note that the - certificates have to be in PEM format. If capath is passed, it - must be a directory prepared using the c_rehash tool included - with OpenSSL. Either, but not both, of pemfile or capath may be - None. - - set_default_verify_paths() - Specify that the platform provided CA certificates are to be - used for verification purposes. This method may not work - properly on OS X. - - load_tmp_dh(dhfile) - Load parameters for Ephemeral Diffie-Hellman from dhfile. - - set_app_data(data) - Associate data with this Context object. data can be retrieved - later using the get_app_data method. - - set_cipher_list(ciphers) - Set the list of ciphers to be used in this context. See the - OpenSSL manual for more information (e.g. ciphers(1)) - - set_info_callback(callback) - Set the information callback to callback. This function will be - called from time to time during SSL handshakes. callback should - take three arguments: a Connection object and two integers. The - first integer specifies where in the SSL handshake the function - was called, and the other the return code from a (possibly - failed) internal function call. - - set_options(options) - Add SSL options. Options you have set before are not cleared! - This method should be used with the OP_* constants. - - set_passwd_cb(callback[, userdata]) - Set the passphrase callback to callback. This function will be - called when a private key with a passphrase is loaded. callback - must accept three positional arguments. First, an integer giving - the maximum length of the passphrase it may return. If the - returned passphrase is longer than this, it will be truncated. - Second, a boolean value which will be true if the user should be - prompted for the passphrase twice and the callback should verify - that the two values supplied are equal. Third, the value given - as the userdata parameter to set_passwd_cb. If an error occurs, - callback should return a false value (e.g. an empty string). - - set_session_id(name) - Set the context name within which a session can be reused for - this Context object. This is needed when doing session - resumption, because there is no way for a stored session to know - which Context object it is associated with. name may be any - binary data. - - set_timeout(timeout) - Set the timeout for newly created sessions for this Context - object to timeout. timeout must be given in (whole) seconds. The - default value is 300 seconds. See the OpenSSL manual for more - information (e.g. SSL_CTX_set_timeout(3)). - - set_verify(mode, callback) - Set the verification flags for this Context object to mode and - specify that callback should be used for verification callbacks. - mode should be one of VERIFY_NONE and VERIFY_PEER. If - VERIFY_PEER is used, mode can be OR:ed with - VERIFY_FAIL_IF_NO_PEER_CERT and VERIFY_CLIENT_ONCE to further - control the behaviour. callback should take five arguments: A - Connection object, an X509 object, and three integer variables, - which are in turn potential error number, error depth and return - code. callback should return true if verification passes and - false otherwise. - - set_verify_depth(depth) - Set the maximum depth for the certificate chain verification - that shall be allowed for this Context object. - - use_certificate(cert) - Use the certificate cert which has to be a X509 object. - - add_extra_chain_cert(cert) - Adds the certificate cert, which has to be a X509 object, to the - certificate chain presented together with the certificate. - - use_certificate_chain_file(file) - Load a certificate chain from file which must be PEM encoded. - - use_privatekey(pkey) - Use the private key pkey which has to be a PKey object. - - use_certificate_file(file[, format]) - Load the first certificate found in file. The certificate must - be in the format specified by format, which is either - FILETYPE_PEM or FILETYPE_ASN1. The default is FILETYPE_PEM. - - use_privatekey_file(file[, format]) - Load the first private key found in file. The private key must - be in the format specified by format, which is either - FILETYPE_PEM or FILETYPE_ASN1. The default is FILETYPE_PEM. - - - 3.3.2 Connection objects - - Connection objects have the following methods: - - accept() - Call the accept method of the underlying socket and set up SSL - on the returned socket, using the Context object supplied to - this Connection object at creation. Returns a pair (conn, - address). where conn is the new Connection object created, and - address is as returned by the socket's accept. - - bind(address) - Call the bind method of the underlying socket. - - close() - Call the close method of the underlying socket. Note: If you - want correct SSL closure, you need to call the shutdown method - first. - - connect(address) - Call the connect method of the underlying socket and set up SSL - on the socket, using the Context object supplied to this - Connection object at creation. - - connect_ex(address) - Call the connect_ex method of the underlying socket and set up - SSL on the socket, using the Context object supplied to this - Connection object at creation. Note that if the connect_ex - method of the socket doesn't return 0, SSL won't be initialized. - - do_handshake() - Perform an SSL handshake (usually called after renegotiate or - one of set_accept_state or set_accept_state). This can raise the - same exceptions as send and recv. - - fileno() - Retrieve the file descriptor number for the underlying socket. - - listen(backlog) - Call the listen method of the underlying socket. - - get_app_data() - Retrieve application data as set by set_app_data. - - get_cipher_list() - Retrieve the list of ciphers used by the Connection object. - WARNING: This API has changed. It used to take an optional - parameter and just return a string, but not it returns the - entire list in one go. - - get_client_ca_list() - Retrieve the list of preferred client certificate issuers sent - by the server as OpenSSL.crypto.X509Name objects. - - If this is a client Connection, the list will be empty until the - connection with the server is established. - - If this is a server Connection, return the list of certificate - authorities that will be sent or has been sent to the client, as - controlled by this Connection's Context. - - New in version 0.10. - - get_context() - Retrieve the Context object associated with this Connection. - - get_peer_certificate() - Retrieve the other side's certificate (if any) - - getpeername() - Call the getpeername method of the underlying socket. - - getsockname() - Call the getsockname method of the underlying socket. - - getsockopt(level, optname[, buflen]) - Call the getsockopt method of the underlying socket. - - pending() - Retrieve the number of bytes that can be safely read from the - SSL buffer (not the underlying transport buffer). - - recv(bufsize) - Receive data from the Connection. The return value is a string - representing the data received. The maximum amount of data to be - received at once, is specified by bufsize. - - bio_write(bytes) - If the Connection was created with a memory BIO, this method can - be used to add bytes to the read end of that memory BIO. The - Connection can then read the bytes (for example, in response to - a call to recv). - - renegotiate() - Renegotiate the SSL session. Call this if you wish to change - cipher suites or anything like that. - - send(string) - Send the string data to the Connection. - - bio_read(bufsize) - If the Connection was created with a memory BIO, this method can - be used to read bytes from the write end of that memory BIO. - Many Connection methods will add bytes which must be read in - this manner or the buffer will eventually fill up and the - Connection will be able to take no further actions. - - sendall(string) - Send all of the string data to the Connection. This calls send - repeatedly until all data is sent. If an error occurs, it's - impossible to tell how much data has been sent. - - set_accept_state() - Set the connection to work in server mode. The handshake will be - handled automatically by read/write. - - set_app_data(data) - Associate data with this Connection object. data can be - retrieved later using the get_app_data method. - - set_connect_state() - Set the connection to work in client mode. The handshake will be - handled automatically by read/write. - - setblocking(flag) - Call the setblocking method of the underlying socket. - - setsockopt(level, optname, value) - Call the setsockopt method of the underlying socket. - - shutdown() - Send the shutdown message to the Connection. Returns true if the - shutdown message exchange is completed and false otherwise (in - which case you call recv() or send() when the connection becomes - readable/writeable. - - get_shutdown() - Get the shutdown state of the Connection. Returns a bitvector of - either or both of SENT_SHUTDOWN and RECEIVED_SHUTDOWN. - - set_shutdown(state) - Set the shutdown state of the Connection. state is a bitvector - of either or both of SENT_SHUTDOWN and RECEIVED_SHUTDOWN. - - sock_shutdown(how) - Call the shutdown method of the underlying socket. - - bio_shutdown() - If the Connection was created with a memory BIO, this method can - be used to indicate that ``end of file'' has been reached on the - read end of that memory BIO. - - state_string() - Retrieve a verbose string detailing the state of the Connection. - - client_random() - Retrieve the random value used with the client hello message. - - server_random() - Retrieve the random value used with the server hello message. - - master_key() - Retrieve the value of the master key for this session. - - want_read() - Checks if more data has to be read from the transport layer to - complete an operation. - - want_write() - Checks if there is data to write to the transport layer to - complete an operation. - - - 4 Internals - - We ran into three main problems developing this: Exceptions, callbacks - and accessing socket methods. This is what this chapter is about. - - -4.1 Exceptions - - We realized early that most of the exceptions would be raised by the - I/O functions of OpenSSL, so it felt natural to mimic OpenSSL's error - code system, translating them into Python exceptions. This naturally - gives us the exceptions SSL.ZeroReturnError, SSL.WantReadError, - SSL.WantWriteError, SSL.WantX509LookupError and SSL.SysCallError. - - For more information about this, see section 3.3. - - -4.2 Callbacks - - There are a number of problems with callbacks. First of all, OpenSSL is - written as a C library, it's not meant to have Python callbacks, so a - way around that is needed. Another problem is thread support. A lot of - the OpenSSL I/O functions can block if the socket is in blocking mode, - and then you want other Python threads to be able to do other things. - The real trouble is if you've released the global CPython interpreter - lock to do a potentially blocking operation, and the operation calls a - callback. Then we must take the GIL back, since calling Python APIs - without holding it is not allowed. - - There are two solutions to the first problem, both of which are - necessary. The first solution to use is if the C callback allows - ''userdata'' to be passed to it (an arbitrary pointer normally). This - is great! We can set our Python function object as the real userdata - and emulate userdata for the Python function in another way. The other - solution can be used if an object with an ''app_data'' system always is - passed to the callback. For example, the SSL object in OpenSSL has - app_data functions and in e.g. the verification callbacks, you can - retrieve the related SSL object. What we do is to set our wrapper - Connection object as app_data for the SSL object, and we can easily - find the Python callback. - - The other problem is solved using thread local variables. Whenever the - GIL is released before calling into an OpenSSL API, the PyThreadState - pointer returned by PyEval_SaveState is stored in a global thread local - variable (using Python's own TLS API, PyThread_set_key_value). When it - is necessary to re-acquire the GIL, either after the OpenSSL API - returns or in a C callback invoked by that OpenSSL API, the value of - the thread local variable is retrieved (PyThread_get_key_value) and - used to re-acquire the GIL. This allows Python threads to execute while - OpenSSL APIs are running and allows use of any particular pyOpenSSL - object from any Python thread, since there is no per-thread state - associated with any of these objects and since OpenSSL is threadsafe - (as long as properly initialized, as pyOpenSSL initializes it). - - -4.3 Acessing Socket Methods - - We quickly saw the benefit of wrapping socket methods in the - SSL.Connection class, for an easy transition into using SSL. The - problem here is that the socket module lacks a C API, and all the - methods are declared static. One approach would be to have OpenSSL as a - submodule to the socket module, placing all the code in socketmodule.c, - but this is obviously not a good solution, since you might not want to - import tonnes of extra stuff you're not going to use when importing the - socket module. The other approach is to somehow get a pointer to the - method to be called, either the C function, or a callable Python - object. This is not really a good solution either, since there's a lot - of lookups involved. - - The way it works is that you have to supply a ``socket-like'' transport - object to the SSL.Connection. The only requirement of this object is - that it has a fileno() method that returns a file descriptor that's - valid at the C level (i.e. you can use the system calls read and - write). If you want to use the connect() or accept() methods of the - SSL.Connection object, the transport object has to supply such methods - too. Apart from them, any method lookups in the SSL.Connection object - that fail are passed on to the underlying transport object. - - Future changes might be to allow Python-level transport objects, that - instead of having fileno() methods, have read() and write() methods, so - more advanced features of Python can be used. This would probably - entail some sort of OpenSSL ``BIOs'', but converting Python strings - back and forth is expensive, so this shouldn't be used unless - necessary. Other nice things would be to be able to pass in different - transport objects for reading and writing, but then the fileno() method - of SSL.Connection becomes virtually useless. Also, should the method - resolution be used on the read-transport or the write-transport? - - About this document ... - - Python OpenSSL Manual - - This document was generated using the LaTeX2HTML translator. - - LaTeX2HTML is Copyright © 1993, 1994, 1995, 1996, 1997, Nikos Drakos, - Computer Based Learning Unit, University of Leeds, and Copyright © - 1997, 1998, Ross Moore, Mathematics Department, Macquarie University, - Sydney. - - The application of LaTeX2HTML to the Python documentation has been - heavily tailored by Fred L. Drake, Jr. Original navigation icons were - contributed by Christopher Petrilli. - __________________________________________________________________ - - Footnotes - - ... M2Crypto^1 - See http://chandlerproject.org/Projects/MeTooCrypto - - ... Daemon^2 - See http://www.lothar.com/tech/crypto/ - - ... socket^3 - Actually, all that is required is an object that behaves like a - socket, you could even use files, even though it'd be tricky to - get the handshakes right! - __________________________________________________________________ - - Python OpenSSL Manual - __________________________________________________________________ - - Release 0.12. diff --git a/doc/tools/anno-api.py b/doc/tools/anno-api.py deleted file mode 100755 index 0d355d2..0000000 --- a/doc/tools/anno-api.py +++ /dev/null @@ -1,71 +0,0 @@ -#! /usr/bin/env python -"""Add reference count annotations to the Python/C API Reference.""" -__version__ = '$Revision: 1.1.1.1 $' - -import getopt -import os -import sys - -import refcounts - - -PREFIX_1 = r"\begin{cfuncdesc}{PyObject*}{" -PREFIX_2 = r"\begin{cfuncdesc}{PyVarObject*}{" - - -def main(): - rcfile = os.path.join(os.path.dirname(refcounts.__file__), os.pardir, - "api", "refcounts.dat") - outfile = "-" - opts, args = getopt.getopt(sys.argv[1:], "o:r:", ["output=", "refcounts="]) - for opt, arg in opts: - if opt in ("-o", "--output"): - outfile = arg - elif opt in ("-r", "--refcounts"): - rcfile = arg - rcdict = refcounts.load(rcfile) - if outfile == "-": - output = sys.stdout - else: - output = open(outfile, "w") - if not args: - args = ["-"] - for infile in args: - if infile == "-": - input = sys.stdin - else: - input = open(infile) - while 1: - line = input.readline() - if not line: - break - prefix = None - if line.startswith(PREFIX_1): - prefix = PREFIX_1 - elif line.startswith(PREFIX_2): - prefix = PREFIX_2 - if prefix: - s = line[len(prefix):].split('}', 1)[0] - try: - info = rcdict[s] - except KeyError: - sys.stderr.write("No refcount data for %s\n" % s) - else: - if info.result_type in ("PyObject*", "PyVarObject*"): - if info.result_refs is None: - rc = "Always \NULL{}" - else: - rc = info.result_refs and "New" or "Borrowed" - rc = rc + " reference" - line = (r"\begin{cfuncdesc}[%s]{%s}{" - % (rc, info.result_type)) \ - + line[len(prefix):] - output.write(line) - if infile != "-": - input.close() - if outfile != "-": - output.close() - - -if __name__ == "__main__": - main() diff --git a/doc/tools/buildindex.py b/doc/tools/buildindex.py deleted file mode 100755 index 5a41c0e..0000000 --- a/doc/tools/buildindex.py +++ /dev/null @@ -1,353 +0,0 @@ -#! /usr/bin/env python - -__version__ = '$Revision: 1.1.1.1 $' - -import os -import re -import string -import sys - - -class Node: - __rmjunk = re.compile("<#\d+#>") - - continuation = 0 - - def __init__(self, link, str, seqno): - self.links = [link] - self.seqno = seqno - # remove <#\d+#> left in by moving the data out of LaTeX2HTML - str = self.__rmjunk.sub('', str) - # build up the text - self.text = split_entry_text(str) - self.key = split_entry_key(str) - - def __cmp__(self, other): - """Comparison operator includes sequence number, for use with - list.sort().""" - return self.cmp_entry(other) or cmp(self.seqno, other.seqno) - - def cmp_entry(self, other): - """Comparison 'operator' that ignores sequence number.""" - c = 0 - for i in range(min(len(self.key), len(other.key))): - c = (cmp_part(self.key[i], other.key[i]) - or cmp_part(self.text[i], other.text[i])) - if c: - break - return c or cmp(self.key, other.key) or cmp(self.text, other.text) - - def __repr__(self): - return "<Node for %s (%s)>" % (string.join(self.text, '!'), self.seqno) - - def __str__(self): - return string.join(self.key, '!') - - def dump(self): - return "%s\1%s###%s\n" \ - % (string.join(self.links, "\1"), - string.join(self.text, '!'), - self.seqno) - - -def cmp_part(s1, s2): - result = cmp(s1, s2) - if result == 0: - return 0 - l1 = string.lower(s1) - l2 = string.lower(s2) - minlen = min(len(s1), len(s2)) - if len(s1) < len(s2) and l1 == l2[:len(s1)]: - result = -1 - elif len(s2) < len(s1) and l2 == l1[:len(s2)]: - result = 1 - else: - result = cmp(l1, l2) or cmp(s1, s2) - return result - - -def split_entry(str, which): - stuff = [] - parts = string.split(str, '!') - parts = map(string.split, parts, ['@'] * len(parts)) - for entry in parts: - if len(entry) != 1: - key = entry[which] - else: - key = entry[0] - stuff.append(key) - return stuff - - -_rmtt = re.compile(r"""(.*)<tt(?: class=['"][a-z0-9]+["'])?>(.*)</tt>(.*)$""", - re.IGNORECASE) -_rmparens = re.compile(r"\(\)") - -def split_entry_key(str): - parts = split_entry(str, 1) - for i in range(len(parts)): - m = _rmtt.match(parts[i]) - if m: - parts[i] = string.join(m.group(1, 2, 3), '') - else: - parts[i] = string.lower(parts[i]) - # remove '()' from the key: - parts[i] = _rmparens.sub('', parts[i]) - return map(trim_ignored_letters, parts) - - -def split_entry_text(str): - if '<' in str: - m = _rmtt.match(str) - if m: - str = string.join(m.group(1, 2, 3), '') - return split_entry(str, 1) - - -def load(fp): - nodes = [] - rx = re.compile("(.*)\1(.*)###(.*)$") - while 1: - line = fp.readline() - if not line: - break - m = rx.match(line) - if m: - link, str, seqno = m.group(1, 2, 3) - nodes.append(Node(link, str, seqno)) - return nodes - - -def trim_ignored_letters(s): - # ignore $ to keep environment variables with the - # leading letter from the name - s = string.lower(s) - if s[0] == "$": - return s[1:] - else: - return s - -def get_first_letter(s): - return string.lower(trim_ignored_letters(s)[0]) - - -def split_letters(nodes): - letter_groups = [] - if nodes: - group = [] - append = group.append - letter = get_first_letter(nodes[0].text[0]) - letter_groups.append((letter, group)) - for node in nodes: - nletter = get_first_letter(node.text[0]) - if letter != nletter: - letter = nletter - group = [] - letter_groups.append((letter, group)) - append = group.append - append(node) - return letter_groups - - -# need a function to separate the nodes into columns... -def split_columns(nodes, columns=1): - if columns <= 1: - return [nodes] - # This is a rough height; we may have to increase to avoid breaks before - # a subitem. - colheight = len(nodes) / columns - numlong = len(nodes) % columns - if numlong: - colheight = colheight + 1 - else: - numlong = columns - cols = [] - for i in range(numlong): - start = i * colheight - end = start + colheight - cols.append(nodes[start:end]) - del nodes[:end] - colheight = colheight - 1 - try: - numshort = len(nodes) / colheight - except ZeroDivisionError: - cols = cols + (columns - len(cols)) * [[]] - else: - for i in range(numshort): - start = i * colheight - end = start + colheight - cols.append(nodes[start:end]) - # - # If items continue across columns, make sure they are marked - # as continuations so the user knows to look at the previous column. - # - for i in range(len(cols) - 1): - try: - prev = cols[i][-1] - next = cols[i + 1][0] - except IndexError: - return cols - else: - n = min(len(prev.key), len(next.key)) - for j in range(n): - if prev.key[j] != next.key[j]: - break - next.continuation = j + 1 - return cols - - -DL_LEVEL_INDENT = " " - -def format_column(nodes): - strings = ["<dl compact>"] - append = strings.append - level = 0 - previous = [] - for node in nodes: - current = node.text - count = 0 - for i in range(min(len(current), len(previous))): - if previous[i] != current[i]: - break - count = i + 1 - if count > level: - append("<dl compact>" * (count - level) + "\n") - level = count - elif level > count: - append("\n") - append(level * DL_LEVEL_INDENT) - append("</dl>" * (level - count)) - level = count - # else: level == count - for i in range(count, len(current) - 1): - term = node.text[i] - level = level + 1 - if node.continuation > i: - extra = " (continued)" - else: - extra = "" - append("\n<dt>%s%s\n<dd>\n%s<dl compact>" - % (term, extra, level * DL_LEVEL_INDENT)) - append("\n%s<dt>%s%s</a>" - % (level * DL_LEVEL_INDENT, node.links[0], node.text[-1])) - for link in node.links[1:]: - append(",\n%s %s[Link]</a>" % (level * DL_LEVEL_INDENT, link)) - previous = current - append("\n") - append("</dl>" * (level + 1)) - return string.join(strings, '') - - -def format_nodes(nodes, columns=1): - strings = [] - append = strings.append - if columns > 1: - colnos = range(columns) - colheight = len(nodes) / columns - if len(nodes) % columns: - colheight = colheight + 1 - colwidth = 100 / columns - append('<table width="100%"><tr valign="top">') - for col in split_columns(nodes, columns): - append('<td width="%d%%">\n' % colwidth) - append(format_column(col)) - append("\n</td>") - append("\n</tr></table>") - else: - append(format_column(nodes)) - append("\n<p>\n") - return string.join(strings, '') - - -def format_letter(letter): - if letter == '.': - lettername = ". (dot)" - elif letter == '_': - lettername = "_ (underscore)" - else: - lettername = string.upper(letter) - return "\n<hr>\n<h2><a name=\"letter-%s\">%s</a></h2>\n\n" \ - % (letter, lettername) - - -def format_html_letters(nodes, columns=1): - letter_groups = split_letters(nodes) - items = [] - for letter, nodes in letter_groups: - s = "<b><a href=\"#letter-%s\">%s</a></b>" % (letter, letter) - items.append(s) - s = ["<hr><center>\n%s</center>\n" % string.join(items, " |\n")] - for letter, nodes in letter_groups: - s.append(format_letter(letter)) - s.append(format_nodes(nodes, columns)) - return string.join(s, '') - -def format_html(nodes, columns): - return format_nodes(nodes, columns) - - -def collapse(nodes): - """Collapse sequences of nodes with matching keys into a single node. - Destructive.""" - if len(nodes) < 2: - return - prev = nodes[0] - i = 1 - while i < len(nodes): - node = nodes[i] - if not node.cmp_entry(prev): - prev.links.append(node.links[0]) - del nodes[i] - else: - i = i + 1 - prev = node - - -def dump(nodes, fp): - for node in nodes: - fp.write(node.dump()) - - -def process_nodes(nodes, columns, letters): - nodes.sort() - collapse(nodes) - if letters: - return format_html_letters(nodes, columns) - else: - return format_html(nodes, columns) - - -def main(): - import getopt - ifn = "-" - ofn = "-" - columns = 1 - letters = 0 - opts, args = getopt.getopt(sys.argv[1:], "c:lo:", - ["columns=", "letters", "output="]) - for opt, val in opts: - if opt in ("-o", "--output"): - ofn = val - elif opt in ("-c", "--columns"): - columns = string.atoi(val) - elif opt in ("-l", "--letters"): - letters = 1 - if not args: - args = [ifn] - nodes = [] - for fn in args: - nodes = nodes + load(open(fn)) - num_nodes = len(nodes) - html = process_nodes(nodes, columns, letters) - program = os.path.basename(sys.argv[0]) - if ofn == "-": - sys.stdout.write(html) - sys.stderr.write("\n%s: %d index nodes" % (program, num_nodes)) - else: - open(ofn, "w").write(html) - print - print "%s: %d index nodes" % (program, num_nodes) - - -if __name__ == "__main__": - main() diff --git a/doc/tools/checkargs.pm b/doc/tools/checkargs.pm deleted file mode 100644 index de52f69..0000000 --- a/doc/tools/checkargs.pm +++ /dev/null @@ -1,112 +0,0 @@ -#!/uns/bin/perl - -package checkargs; -require 5.004; # uses "for my $var" -require Exporter; -@ISA = qw(Exporter); -@EXPORT = qw(check_args check_args_range check_args_at_least); -use strict; -use Carp; - -=head1 NAME - -checkargs -- Provide rudimentary argument checking for perl5 functions - -=head1 SYNOPSIS - - check_args(cArgsExpected, @_) - check_args_range(cArgsMin, cArgsMax, @_) - check_args_at_least(cArgsMin, @_) -where "@_" should be supplied literally. - -=head1 DESCRIPTION - -As the first line of user-written subroutine foo, do one of the following: - - my ($arg1, $arg2) = check_args(2, @_); - my ($arg1, @rest) = check_args_range(1, 4, @_); - my ($arg1, @rest) = check_args_at_least(1, @_); - my @args = check_args_at_least(0, @_); - -These functions may also be called for side effect (put a call to one -of the functions near the beginning of the subroutine), but using the -argument checkers to set the argument list is the recommended usage. - -The number of arguments and their definedness are checked; if the wrong -number are received, the program exits with an error message. - -=head1 AUTHOR - -Michael D. Ernst <F<mernst@cs.washington.edu>> - -=cut - -## Need to check that use of caller(1) really gives desired results. -## Need to give input chunk information. -## Is this obviated by Perl 5.003's declarations? Not entirely, I think. - -sub check_args ( $@ ) -{ - my ($num_formals, @args) = @_; - my ($pack, $file_arg, $line_arg, $subname, $hasargs, $wantarr) = caller(1); - if (@_ < 1) { croak "check_args needs at least 7 args, got ", scalar(@_), ": @_\n "; } - if ((!wantarray) && ($num_formals != 0)) - { croak "check_args called in scalar context"; } - # Can't use croak below here: it would only go out to caller, not its caller - my $num_actuals = @args; - if ($num_actuals != $num_formals) - { die "$file_arg:$line_arg: function $subname expected $num_formals argument", - (($num_formals == 1) ? "" : "s"), - ", got $num_actuals", - (($num_actuals == 0) ? "" : ": @args"), - "\n"; } - for my $index (0..$#args) - { if (!defined($args[$index])) - { die "$file_arg:$line_arg: function $subname undefined argument ", $index+1, ": @args[0..$index-1]\n"; } } - return @args; -} - -sub check_args_range ( $$@ ) -{ - my ($min_formals, $max_formals, @args) = @_; - my ($pack, $file_arg, $line_arg, $subname, $hasargs, $wantarr) = caller(1); - if (@_ < 2) { croak "check_args_range needs at least 8 args, got ", scalar(@_), ": @_"; } - if ((!wantarray) && ($max_formals != 0) && ($min_formals !=0) ) - { croak "check_args_range called in scalar context"; } - # Can't use croak below here: it would only go out to caller, not its caller - my $num_actuals = @args; - if (($num_actuals < $min_formals) || ($num_actuals > $max_formals)) - { die "$file_arg:$line_arg: function $subname expected $min_formals-$max_formals arguments, got $num_actuals", - ($num_actuals == 0) ? "" : ": @args", "\n"; } - for my $index (0..$#args) - { if (!defined($args[$index])) - { die "$file_arg:$line_arg: function $subname undefined argument ", $index+1, ": @args[0..$index-1]\n"; } } - return @args; -} - -sub check_args_at_least ( $@ ) -{ - my ($min_formals, @args) = @_; - my ($pack, $file_arg, $line_arg, $subname, $hasargs, $wantarr) = caller(1); - # Don't do this, because we want every sub to start with a call to check_args* - # if ($min_formals == 0) - # { die "Isn't it pointless to check for at least zero args to $subname?\n"; } - if (scalar(@_) < 1) - { croak "check_args_at_least needs at least 1 arg, got ", scalar(@_), ": @_"; } - if ((!wantarray) && ($min_formals != 0)) - { croak "check_args_at_least called in scalar context"; } - # Can't use croak below here: it would only go out to caller, not its caller - my $num_actuals = @args; - if ($num_actuals < $min_formals) - { die "$file_arg:$line_arg: function $subname expected at least $min_formals argument", - ($min_formals == 1) ? "" : "s", - ", got $num_actuals", - ($num_actuals == 0) ? "" : ": @args", "\n"; } - for my $index (0..$#args) - { if (!defined($args[$index])) - { warn "$file_arg:$line_arg: function $subname undefined argument ", $index+1, ": @args[0..$index-1]\n"; last; } } - return @args; -} - -1; # successful import -__END__ diff --git a/doc/tools/cklatex b/doc/tools/cklatex deleted file mode 100755 index 396e914..0000000 --- a/doc/tools/cklatex +++ /dev/null @@ -1,26 +0,0 @@ -#! /bin/sh -# -*- ksh -*- - -# This script *helps* locate lines of normal content that end in '}'; -# this is useful since LaTeX2HTML (at least the old version that we -# use) breaks on many lines that end that way. -# -# Usage: cklatex files... | less -# -# *Read* the output looking for suspicious lines! - -grep -n "[^ ]}\$" $@ | \ - grep -v '\\begin{' | \ - grep -v '\\end{' | \ - grep -v '\\input{' | \ - grep -v '\\documentclass{' | \ - grep -v '\\title{' | \ - grep -v '\\chapter{' | \ - grep -v '\\chapter\*{' | \ - grep -v '\\section{' | \ - grep -v '\\subsection{' | \ - grep -v '\\subsubsection{' | \ - grep -v '\\sectionauthor{' | \ - grep -v '\\moduleauthor{' - -exit $? diff --git a/doc/tools/custlib.py b/doc/tools/custlib.py deleted file mode 100644 index 9958451..0000000 --- a/doc/tools/custlib.py +++ /dev/null @@ -1,73 +0,0 @@ -# Generate custlib.tex, which is a site-specific library document. - -# Phase I: list all the things that can be imported - -import glob, os, sys, string -modules={} - -for modname in sys.builtin_module_names: - modules[modname]=modname - -for dir in sys.path: - # Look for *.py files - filelist=glob.glob(os.path.join(dir, '*.py')) - for file in filelist: - path, file = os.path.split(file) - base, ext=os.path.splitext(file) - modules[string.lower(base)]=base - - # Look for shared library files - filelist=(glob.glob(os.path.join(dir, '*.so')) + - glob.glob(os.path.join(dir, '*.sl')) + - glob.glob(os.path.join(dir, '*.o')) ) - for file in filelist: - path, file = os.path.split(file) - base, ext=os.path.splitext(file) - if base[-6:]=='module': base=base[:-6] - modules[string.lower(base)]=base - -# Minor oddity: the types module is documented in libtypes2.tex -if modules.has_key('types'): - del modules['types'] ; modules['types2']=None - -# Phase II: find all documentation files (lib*.tex) -# and eliminate modules that don't have one. - -docs={} -filelist=glob.glob('lib*.tex') -for file in filelist: - modname=file[3:-4] - docs[modname]=modname - -mlist=modules.keys() -mlist=filter(lambda x, docs=docs: docs.has_key(x), mlist) -mlist.sort() -mlist=map(lambda x, docs=docs: docs[x], mlist) - -modules=mlist - -# Phase III: write custlib.tex - -# Write the boilerplate -# XXX should be fancied up. -print """\documentstyle[twoside,11pt,myformat]{report} -\\title{Python Library Reference} -\\input{boilerplate} -\\makeindex % tell \\index to actually write the .idx file -\\begin{document} -\\pagenumbering{roman} -\\maketitle -\\input{copyright} -\\begin{abstract} -\\noindent This is a customized version of the Python Library Reference. -\\end{abstract} -\\pagebreak -{\\parskip = 0mm \\tableofcontents} -\\pagebreak\\pagenumbering{arabic}""" - -for modname in mlist: - print "\\input{lib%s}" % (modname,) - -# Write the end -print """\\input{custlib.ind} % Index -\\end{document}""" diff --git a/doc/tools/cvsinfo.py b/doc/tools/cvsinfo.py deleted file mode 100644 index 58a32c2..0000000 --- a/doc/tools/cvsinfo.py +++ /dev/null @@ -1,81 +0,0 @@ -"""Utility class and function to get information about the CVS repository -based on checked-out files. -""" - -import os - - -def get_repository_list(paths): - d = {} - for name in paths: - if os.path.isfile(name): - dir = os.path.dirname(name) - else: - dir = name - rootfile = os.path.join(name, "CVS", "Root") - root = open(rootfile).readline().strip() - if not d.has_key(root): - d[root] = RepositoryInfo(dir), [name] - else: - d[root][1].append(name) - return d.values() - - -class RepositoryInfo: - """Record holding information about the repository we want to talk to.""" - cvsroot_path = None - branch = None - - # type is '', ':ext', or ':pserver:' - type = "" - - def __init__(self, dir=None): - if dir is None: - dir = os.getcwd() - dir = os.path.join(dir, "CVS") - root = open(os.path.join(dir, "Root")).readline().strip() - if root.startswith(":pserver:"): - self.type = ":pserver:" - root = root[len(":pserver:"):] - elif ":" in root: - if root.startswith(":ext:"): - root = root[len(":ext:"):] - self.type = ":ext:" - self.repository = root - if ":" in root: - host, path = root.split(":", 1) - self.cvsroot_path = path - else: - self.cvsroot_path = root - fn = os.path.join(dir, "Tag") - if os.path.isfile(fn): - self.branch = open(fn).readline().strip()[1:] - - def get_cvsroot(self): - return self.type + self.repository - - _repository_dir_cache = {} - - def get_repository_file(self, path): - filename = os.path.abspath(path) - if os.path.isdir(path): - dir = path - join = 0 - else: - dir = os.path.dirname(path) - join = 1 - try: - repodir = self._repository_dir_cache[dir] - except KeyError: - repofn = os.path.join(dir, "CVS", "Repository") - repodir = open(repofn).readline().strip() - repodir = os.path.join(self.cvsroot_path, repodir) - self._repository_dir_cache[dir] = repodir - if join: - fn = os.path.join(repodir, os.path.basename(path)) - else: - fn = repodir - return fn[len(self.cvsroot_path)+1:] - - def __repr__(self): - return "<RepositoryInfo for %s>" % `self.get_cvsroot()` diff --git a/doc/tools/findacks b/doc/tools/findacks deleted file mode 100755 index c13b00f..0000000 --- a/doc/tools/findacks +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/env python -"""Script to locate email addresses in the CVS logs.""" -__version__ = '$Revision: 1.1.1.1 $' - -import os -import re -import sys -import UserDict - -import cvsinfo - - -class Acknowledgements(UserDict.UserDict): - def add(self, email, name, path): - d = self.data - d.setdefault(email, {})[path] = name - - -def open_cvs_log(info, paths=None): - cvsroot = info.get_cvsroot() - cmd = "cvs -q -d%s log " % cvsroot - if paths: - cmd += " ".join(paths) - return os.popen(cmd, "r") - - -email_rx = re.compile("<([a-z][-a-z0-9._]*@[-a-z0-9.]+)>", re.IGNORECASE) - -def find_acks(f, acks): - prev = '' - filename = None - MAGIC_WORDS = ('van', 'von') - while 1: - line = f.readline() - if not line: - break - if line.startswith("Working file: "): - filename = line.split(None, 2)[2].strip() - prev = line - continue - m = email_rx.search(line) - if m: - words = prev.split() + line[:m.start()].split() - L = [] - while words \ - and (words[-1][0].isupper() or words[-1] in MAGIC_WORDS): - L.insert(0, words.pop()) - name = " ".join(L) - email = m.group(1).lower() - acks.add(email, name, filename) - prev = line - - -def load_cvs_log_acks(acks, args): - repolist = cvsinfo.get_repository_list(args or [""]) - for info, paths in repolist: - print >>sys.stderr, "Repository:", info.get_cvsroot() - f = open_cvs_log(info, paths) - find_acks(f, acks) - f.close() - - -def load_tex_source_acks(acks, args): - for path in args: - path = path or os.curdir - if os.path.isfile(path): - read_acks_from_tex_file(acks, path) - else: - read_acks_from_tex_dir(acks, path) - - -def read_acks_from_tex_file(acks, path): - f = open(path) - while 1: - line = f.readline() - if not line: - break - if line.startswith(r"\sectionauthor{"): - line = line[len(r"\sectionauthor"):] - name, line = extract_tex_group(line) - email, line = extract_tex_group(line) - acks.add(email, name, path) - - -def read_acks_from_tex_dir(acks, path): - stack = [path] - while stack: - p = stack.pop() - for n in os.listdir(p): - n = os.path.join(p, n) - if os.path.isdir(n): - stack.insert(0, n) - elif os.path.normpath(n).endswith(".tex"): - read_acks_from_tex_file(acks, n) - - -def extract_tex_group(s): - c = 0 - for i in range(len(s)): - if s[i] == '{': - c += 1 - elif s[i] == '}': - c -= 1 - if c == 0: - return s[1:i], s[i+1:] - - -def print_acks(acks): - first = 1 - for email, D in acks.items(): - if first: - first = 0 - else: - print - L = D.items() - L.sort() - prefname = L[0][1] - for file, name in L[1:]: - if name != prefname: - prefname = "" - break - if prefname: - print prefname, "<%s>:" % email - else: - print email + ":" - for file, name in L: - if name == prefname: - print " " + file - else: - print " %s (as %s)" % (file, name) - - -def print_ack_names(acks): - names = [] - for email, D in acks.items(): - L = D.items() - L.sort() - prefname = L[0][1] - for file, name in L[1:]: - prefname = prefname or name - names.append(prefname or email) - def f(s1, s2): - s1 = s1.lower() - s2 = s2.lower() - return cmp((s1.split()[-1], s1), - (s2.split()[-1], s2)) - names.sort(f) - for name in names: - print name - - -def main(): - args = sys.argv[1:] - acks = Acknowledgements() - load_cvs_log_acks(acks, args) - load_tex_source_acks(acks, args) - print_ack_names(acks) - - -if __name__ == "__main__": - main() diff --git a/doc/tools/findmodrefs b/doc/tools/findmodrefs deleted file mode 100755 index 8c5f93f..0000000 --- a/doc/tools/findmodrefs +++ /dev/null @@ -1,63 +0,0 @@ -#! /usr/bin/env python -# -*- Python -*- - -import fileinput -import getopt -import glob -import os -import re -import sys - - -declare_rx = re.compile( - r"\\declaremodule(?:\[[a-zA-Z0-9]*\]*)?{[a-zA-Z_0-9]+}{([a-zA-Z_0-9]+)}") - -module_rx = re.compile(r"\\module{([a-zA-Z_0-9]+)}") - -def main(): - try: - just_list = 0 - print_lineno = 0 - opts, args = getopt.getopt(sys.argv[1:], "ln", ["list", "number"]) - for opt, arg in opts: - if opt in ("-l", "--list"): - just_list = 1 - elif opt in ("-n", "--number"): - print_lineno = 1 - files = args - if not files: - files = glob.glob("*.tex") - files.sort() - modulename = None - for line in fileinput.input(files): - if line[:9] == r"\section{": - modulename = None - continue - if line[:16] == r"\modulesynopsys{": - continue - m = declare_rx.match(line) - if m: - modulename = m.group(1) - continue - if not modulename: - continue - m = module_rx.search(line) - if m: - name = m.group(1) - if name != modulename: - filename = fileinput.filename() - if just_list: - print filename - fileinput.nextfile() - modulename = None - elif print_lineno: - print "%s(%d):%s" \ - % (filename, fileinput.filelineno(), line[:-1]) - else: - print "%s:%s" % (filename, line[:-1]) - except KeyboardInterrupt: - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/doc/tools/fix_hack b/doc/tools/fix_hack deleted file mode 100755 index 8dad111..0000000 --- a/doc/tools/fix_hack +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -sed -e 's/{\\ptt[ ]*\\char[ ]*'"'"'137}/_/g' <"$1" > "@$1" && mv "@$1" $1 diff --git a/doc/tools/fix_libaux.sed b/doc/tools/fix_libaux.sed deleted file mode 100755 index fb33cc5..0000000 --- a/doc/tools/fix_libaux.sed +++ /dev/null @@ -1,3 +0,0 @@ -#! /bin/sed -f -s/{\\tt \\hackscore {}\\hackscore {}/\\sectcode{__/ -s/\\hackscore {}\\hackscore {}/__/ diff --git a/doc/tools/fixinfo.el b/doc/tools/fixinfo.el deleted file mode 100644 index 267a7e3..0000000 --- a/doc/tools/fixinfo.el +++ /dev/null @@ -1,15 +0,0 @@ -(defun fix-python-texinfo () - (goto-char (point-min)) - (replace-regexp "\\(@setfilename \\)\\([-a-z]*\\)$" - "\\1python-\\2.info") - (replace-string "@node Front Matter\n@chapter Abstract\n" - "@node Abstract\n@section Abstract\n") - (mark-whole-buffer) - (texinfo-master-menu 'update-all-nodes) - (save-buffer) - ) ;; fix-python-texinfo - -;; now really do it: -(find-file (car command-line-args-left)) -(fix-python-texinfo) -(kill-emacs) diff --git a/doc/tools/getpagecounts b/doc/tools/getpagecounts deleted file mode 100755 index 179ced1..0000000 --- a/doc/tools/getpagecounts +++ /dev/null @@ -1,88 +0,0 @@ -#! /usr/bin/env python -# -*- Python -*- - -"""Generate a page count report of the PostScript version of the manuals.""" - -__version__ = '$Revision: 1.1.1.1 $' - - -class PageCounter: - def __init__(self): - self.doclist = [] - self.total = 0 - self.title_width = 0 - - def add_document(self, prefix, title): - count = count_pages(prefix + ".ps") - self.doclist.append((title, prefix, count)) - self.title_width = max(self.title_width, len(title)) - self.total = self.total + count - - def dump(self): - fmt = "%%-%ds (%%s.ps, %%d pages)" % self.title_width - for item in self.doclist: - print fmt % item - print - print " Total page count: %d" % self.total - - def run(self): - for prefix, title in [ - ("api", "Python/C API"), - ("ext", "Extending and Embedding the Python Interpreter"), - ("lib", "Python Library Reference"), - ("mac", "Macintosh Module Reference"), - ("ref", "Python Reference Manual"), - ("tut", "Python Tutorial"), - ("doc", "Documenting Python"), - ("inst", "Installing Python Modules"), - ("dist", "Distributing Python Modules"), - ]: - self.add_document(prefix, title) - print self.PREFIX - self.dump() - print self.SUFFIX - - PREFIX = """\ -This is the PostScript version of the standard Python documentation. -If you plan to print this, be aware that some of the documents are -long. It is formatted for printing on two-sided paper; if you do plan -to print this, *please* print two-sided if you have a printer capable -of it! To locate published copies of the larger manuals, or other -Python reference material, consult the PSA Online Bookstore at: - - http://www.python.org/psa/bookstore/ - -The following manuals are included: -""" - SUFFIX = """\ - - -If you have any questions, comments, or suggestions regarding these -documents, please send them via email to python-docs@python.org. - -If you would like to support the development and maintenance of -documentation for Python, please consider joining the Python Software -Activity (PSA; see http://www.python.org/psa/), or urging your -organization to join the PSA or the Python Consortium (see -http://www.python.org/consortium/). -""" - -def count_pages(filename): - fp = open(filename) - count = 0 - while 1: - lines = fp.readlines(1024*40) - if not lines: - break - for line in lines: - if line[:7] == "%%Page:": - count = count + 1 - fp.close() - return count - - -def main(): - PageCounter().run() - -if __name__ == "__main__": - main() diff --git a/doc/tools/html/about.dat b/doc/tools/html/about.dat deleted file mode 100644 index e6f8b55..0000000 --- a/doc/tools/html/about.dat +++ /dev/null @@ -1,24 +0,0 @@ -<p> This document was generated using the <a - href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> translator. -</p> - -<p> <a - href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> is Copyright © - 1993, 1994, 1995, 1996, 1997, <a - href="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos - Drakos</a>, Computer Based Learning Unit, University of - Leeds, and Copyright © 1997, 1998, <a - href="http://www.maths.mq.edu.au/;SPMtilde;ross/">Ross - Moore</a>, Mathematics Department, Macquarie University, - Sydney. -</p> - -<p> The application of <a - href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> to the Python - documentation has been heavily tailored by Fred L. Drake, - Jr. Original navigation icons were contributed by Christopher - Petrilli. -</p> diff --git a/doc/tools/html/about.html b/doc/tools/html/about.html deleted file mode 100644 index 3203faf..0000000 --- a/doc/tools/html/about.html +++ /dev/null @@ -1,74 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> - <head> - <title>About the Python Documentation</title> - <meta name="description" - content="Overview information about the Python documentation"> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <link rel="STYLESHEET" href="lib/lib.css"> - </head> - <body> - <div class="navigation"> - <table width="100%" cellpadding="0" cellspacing="2"> - <tr> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - <td><a href="./" - title="Python Documentation Index"><img width="32" height="32" - align="bottom" border="0" alt="up" - src="icons/up.gif"></a></td> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - <td align="center" width="100%">About the Python Documentation</td> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - </tr> - </table> - <b class="navlabel">Up:</b> - <span class="sectref"> - <a href="./" title="Python Documentation Index"> - Python Documentation Index</A></span> - <br> - </div> - <hr> - - <h2>About the Python Documentation</h2> - - <p>The Python documentation was originally written by Guido van - Rossum, but has increasingly become a community effort over the - past several years. This growing collection of documents is - available in several formats, including typeset versions in PDF - and PostScript for printing, from the <a - href="http://www.python.org/">Python Web site</a>. - - <p>A <a href="acks.html">list of contributors</a> is available. - - <h2>Comments and Questions</h2> - - <p> General comments and questions regarding this document should - be sent by email to <a href="mailto:python-docs@python.org" - >python-docs@python.org</a>. If you find specific errors in - this document, please report the bug at the <a - href="http://sourceforge.net/bugs/?group_id=5470">Python Bug - Tracker</a> at <a href="http://sourceforge.net/">SourceForge</a>. - </p> - - <p> Questions regarding how to use the information in this - document should be sent to the Python news group, <a - href="news:comp.lang.python">comp.lang.python</a>, or the <a - href="http://www.python.org/mailman/listinfo/python-list" - >Python mailing list</a> (which is gated to the newsgroup and - carries the same content). - </p> - - <p> For any of these channels, please be sure not to send HTML email. - Thanks. - </p> - - <hr> - </body> -</html> diff --git a/doc/tools/html/icons/blank.gif b/doc/tools/html/icons/blank.gif Binary files differdeleted file mode 100644 index 2e31f4e..0000000 --- a/doc/tools/html/icons/blank.gif +++ /dev/null diff --git a/doc/tools/html/icons/blank.png b/doc/tools/html/icons/blank.png Binary files differdeleted file mode 100644 index 2af5639..0000000 --- a/doc/tools/html/icons/blank.png +++ /dev/null diff --git a/doc/tools/html/icons/contents.gif b/doc/tools/html/icons/contents.gif Binary files differdeleted file mode 100644 index 6d299c4..0000000 --- a/doc/tools/html/icons/contents.gif +++ /dev/null diff --git a/doc/tools/html/icons/contents.png b/doc/tools/html/icons/contents.png Binary files differdeleted file mode 100644 index 3429be0..0000000 --- a/doc/tools/html/icons/contents.png +++ /dev/null diff --git a/doc/tools/html/icons/index.gif b/doc/tools/html/icons/index.gif Binary files differdeleted file mode 100644 index 32eecfb..0000000 --- a/doc/tools/html/icons/index.gif +++ /dev/null diff --git a/doc/tools/html/icons/index.png b/doc/tools/html/icons/index.png Binary files differdeleted file mode 100644 index cd918af..0000000 --- a/doc/tools/html/icons/index.png +++ /dev/null diff --git a/doc/tools/html/icons/modules.gif b/doc/tools/html/icons/modules.gif Binary files differdeleted file mode 100644 index f5860b6..0000000 --- a/doc/tools/html/icons/modules.gif +++ /dev/null diff --git a/doc/tools/html/icons/modules.png b/doc/tools/html/icons/modules.png Binary files differdeleted file mode 100644 index 8fa8b75..0000000 --- a/doc/tools/html/icons/modules.png +++ /dev/null diff --git a/doc/tools/html/icons/next.gif b/doc/tools/html/icons/next.gif Binary files differdeleted file mode 100644 index 5dcaff8..0000000 --- a/doc/tools/html/icons/next.gif +++ /dev/null diff --git a/doc/tools/html/icons/next.png b/doc/tools/html/icons/next.png Binary files differdeleted file mode 100644 index cfe5e51..0000000 --- a/doc/tools/html/icons/next.png +++ /dev/null diff --git a/doc/tools/html/icons/previous.gif b/doc/tools/html/icons/previous.gif Binary files differdeleted file mode 100644 index de1da16..0000000 --- a/doc/tools/html/icons/previous.gif +++ /dev/null diff --git a/doc/tools/html/icons/previous.png b/doc/tools/html/icons/previous.png Binary files differdeleted file mode 100644 index 497def4..0000000 --- a/doc/tools/html/icons/previous.png +++ /dev/null diff --git a/doc/tools/html/icons/up.gif b/doc/tools/html/icons/up.gif Binary files differdeleted file mode 100644 index a9d3e13..0000000 --- a/doc/tools/html/icons/up.gif +++ /dev/null diff --git a/doc/tools/html/icons/up.png b/doc/tools/html/icons/up.png Binary files differdeleted file mode 100644 index a90e028..0000000 --- a/doc/tools/html/icons/up.png +++ /dev/null diff --git a/doc/tools/html/index.html.in b/doc/tools/html/index.html.in deleted file mode 100644 index 86b28cc..0000000 --- a/doc/tools/html/index.html.in +++ /dev/null @@ -1,117 +0,0 @@ -<html> - <head> - <title>Python @RELEASE@ Documentation - @DATE@</title> - <link rel="STYLESHEET" href="lib/lib.css" type="text/css"> - <meta name="description" - content="Top-level index to the standard documentation for - Python @RELEASE@."> - <style type="text/css"> - a.title { font-weight: bold; font-size: 110%; } - ul { margin-left: 1em; padding: 0pt; border: 0pt; } - </style> - </head> - <body> - <div class="navigation"> - <table align="center" width="100%" cellpadding="0" cellspacing="2"> - <tr> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - <td align="center" width="100%"> - <b class="title">Python Documentation</b></td> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></td> - <td><a href="modindex.html"><img width="32" height="32" - align="bottom" border="0" alt="Module Index" - src="icons/modules.gif"></a></td> - <td><img width="32" height="32" align="bottom" border="0" alt="" - src="icons/blank.gif"></A></td> - </tr> - </table> - <hr> - </div> - <div align="center" class="titlepage"> - <h1>Python Documentation</h1> - - <p> - <strong>Release @RELEASE@</strong> - <br> - <strong>@DATE@</strong> - </p> - </div> - - <table align="center"> - <tbody> - <tr><td> - <ul> - <li> <a href="tut/tut.html" class="title">Tutorial</a> - <br>(start here) - - <li> <a href="modindex.html" class="title">Global Module Index</a> - <br>(for quick access to all documentation) - - <li> <a href="lib/lib.html" class="title">Library Reference</a> - <br>(keep this under your pillow) - - <li> <a href="mac/mac.html" class="title">Macintosh Module - Reference</a> - <br>(this too, if you use a Macintosh) - - <li> <a href="inst/inst.html" class="title">Installing - Python Modules</a> - <br>(for administrators) - </ul> - </td> - <td> - <ul> - <li> <a href="ref/ref.html" class="title">Language Reference</a> - <br>(for language lawyers) - - <li> <a href="ext/ext.html" class="title">Extending and - Embedding</a> - <br>(tutorial for C/C++ programmers) - - <li> <a href="api/api.html" class="title">Python/C API</a> - <br>(reference for C/C++ programmers) - - <li> <a href="doc/doc.html" class="title">Documenting Python</a> - <br>(information for documentation authors) - - <li> <a href="dist/dist.html" class="title">Distributing - Python Modules</a> - <br>(for developers and packagers) - </ul> - </td> - </tr> - <tr> - <td> - - <ul> - <li> <a href="http://www.python.org/doc/" class="title" - >Documentation Central</a> - <br>(for everyone) - </ul> - </td> - <td> - - <ul> - <li> <a href="http://www.python.org/doc/howto/" class="title" - >Python How-To Guides</a> - <br>(special topics) - </ul> - </td> - </tr> - </tbody> - </table> - <p> - - <address> - <hr> - See <i><a href="about.html">About the Python Documentation</a></i> - for information on suggesting changes. - </address> - </body> -</html> diff --git a/doc/tools/html/stdabout.dat b/doc/tools/html/stdabout.dat deleted file mode 100644 index a9b2718..0000000 --- a/doc/tools/html/stdabout.dat +++ /dev/null @@ -1,48 +0,0 @@ -<p> This document was generated using the <a - href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> translator. -</p> - -<p> <a - href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> is Copyright © - 1993, 1994, 1995, 1996, 1997, <a - href="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos - Drakos</a>, Computer Based Learning Unit, University of - Leeds, and Copyright © 1997, 1998, <a - href="http://www.maths.mq.edu.au/;SPMtilde;ross/">Ross - Moore</a>, Mathematics Department, Macquarie University, - Sydney. -</p> - -<p> The application of <a - href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/"> - <strong>LaTeX</strong>2<tt>HTML</tt></a> to the Python - documentation has been heavily tailored by Fred L. Drake, - Jr. Original navigation icons were contributed by Christopher - Petrilli. -</p> - -<hr> - -<h2>Comments and Questions</h2> - -<p> General comments and questions regarding this document should - be sent by email to <a href="mailto:python-docs@python.org" - >python-docs@python.org</a>. If you find specific errors in - this document, please report the bug at the <a - href="http://sourceforge.net/bugs/?group_id=5470">Python Bug - Tracker</a> at <a href="http://sourceforge.net/">SourceForge</a>. -</p> - -<p> Questions regarding how to use the information in this - document should be sent to the Python news group, <a - href="news:comp.lang.python">comp.lang.python</a>, or the <a - href="http://www.python.org/mailman/listinfo/python-list" - >Python mailing list</a> (which is gated to the newsgroup and - carries the same content). -</p> - -<p> For any of these channels, please be sure not to send HTML email. - Thanks. -</p> diff --git a/doc/tools/html/style.css b/doc/tools/html/style.css deleted file mode 100644 index 767cf74..0000000 --- a/doc/tools/html/style.css +++ /dev/null @@ -1,88 +0,0 @@ -/* - * The first part of this is the standard CSS generated by LaTeX2HTML, - * with the "empty" declarations removed. - */ - -/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ -.math { font-family: "Century Schoolbook", serif; } -.math i { font-family: "Century Schoolbook", serif; - font-weight: bold } -.boldmath { font-family: "Century Schoolbook", serif; - font-weight: bold } - -/* Implement both fixed-size and relative sizes: */ -small.xtiny { font-size : xx-small } -small.tiny { font-size : x-small } -small.scriptsize { font-size : smaller } -small.footnotesize { font-size : small } -big.xlarge { font-size : large } -big.xxlarge { font-size : x-large } -big.huge { font-size : larger } -big.xhuge { font-size : xx-large } - -/* - * Document-specific styles come next; - * these are added for the Python documentation. - * - * Note that the size specifications for the H* elements are because - * Netscape on Solaris otherwise doesn't get it right; they all end up - * the normal text size. - */ - -body { color: #000000; - background-color: #ffffff; } - -a:active { color: #ff0000; } -a:visited { color: #551a8b; } -a:link { color: #0000bb; } - -h1, h2, h3, h4, h5, h6 { font-family: avantgarde, sans-serif; - font-weight: bold } -h1 { font-size: 180% } -h2 { font-size: 150% } -h3, h4 { font-size: 120% } -code, tt { font-family: monospace } -var { font-family: times, serif; - font-style: italic; - font-weight: normal } - -.navigation td { background-color: #99ccff; - font-weight: bold; - font-family: avantgarde, sans-serif; - font-size: 110% } - -.release-info { font-style: italic; } - -.titlegraphic { vertical-align: top; } - -.verbatim { color: #00008b } - -.email { font-family: avantgarde, sans-serif } -.mimetype { font-family: avantgarde, sans-serif } -.newsgroup { font-family: avantgarde, sans-serif } -.url { font-family: avantgarde, sans-serif } -.file { font-family: avantgarde, sans-serif } - -.tableheader { background-color: #99ccff; - font-family: avantgarde, sans-serif; } - -.refcount-info { font-style: italic } -.refcount-info .value { font-weight: bold; - color: #006600 } - -/* - * Some decoration for the "See also:" blocks, in part inspired by some of - * the styling on Lars Marius Garshol's XSA pages. - * (The blue in the navigation bars is #99CCFF.) - */ -.seealso { background-color: #fffaf0; - border: thin solid black; - padding: 4pt } - -.seealso .heading { font-size: 110% } - -/* - * Class 'availability' is used for module availability statements at - * the top of modules. - */ -.availability .platform { font-weight: bold } diff --git a/doc/tools/html2texi.pl b/doc/tools/html2texi.pl deleted file mode 100755 index be050b1..0000000 --- a/doc/tools/html2texi.pl +++ /dev/null @@ -1,1750 +0,0 @@ -#! /usr/bin/env perl -# html2texi.pl -- Convert HTML documentation to Texinfo format -# Michael Ernst <mernst@cs.washington.edu> -# Time-stamp: <1999-01-12 21:34:27 mernst> - -# This program converts HTML documentation trees into Texinfo format. -# Given the name of a main (or contents) HTML file, it processes that file, -# and other files (transitively) referenced by it, into a Texinfo file -# (whose name is chosen from the file or directory name of the argument). -# For instance: -# html2texi.pl api/index.html -# produces file "api.texi". - -# Texinfo format can be easily converted to Info format (for browsing in -# Emacs or the standalone Info browser), to a printed manual, or to HTML. -# Thus, html2texi.pl permits conversion of HTML files to Info format, and -# secondarily enables producing printed versions of Web page hierarchies. - -# Unlike HTML, Info format is searchable. Since Info is integrated into -# Emacs, one can read documentation without starting a separate Web -# browser. Additionally, Info browsers (including Emacs) contain -# convenient features missing from Web browsers, such as easy index lookup -# and mouse-free browsing. - -# Limitations: -# html2texi.pl is currently tuned to latex2html output (and it corrects -# several latex2html bugs), but should be extensible to arbitrary HTML -# documents. It will be most useful for HTML with a hierarchical structure -# and an index, and it recognizes those features as created by latex2html -# (and possibly by some other tools). The HTML tree to be traversed must -# be on local disk, rather than being accessed via HTTP. -# This script requires the use of "checkargs.pm". To eliminate that -# dependence, replace calls to check_args* by @_ (which is always the last -# argument to those functions). -# Also see the "to do" section, below. -# Comments, suggestions, bug fixes, and enhancements are welcome. - -# Troubleshooting: -# Malformed HTML can cause this program to abort, so -# you should check your HTML files to make sure they are legal. - - -### -### Typical usage for the Python documentation: -### - -# (Actually, most of this is in a Makefile instead.) -# The resulting Info format Python documentation is currently available at -# ftp://ftp.cs.washington.edu/homes/mernst/python-info.tar.gz - -# Fix up HTML problems, eg <DT><DL COMPACT><DD> should be <DT><DL COMPACT><DD>. - -# html2texi.pl /homes/fish/mernst/tmp/python-doc/html/api/index.html -# html2texi.pl /homes/fish/mernst/tmp/python-doc/html/ext/index.html -# html2texi.pl /homes/fish/mernst/tmp/python-doc/html/lib/index.html -# html2texi.pl /homes/fish/mernst/tmp/python-doc/html/mac/index.html -# html2texi.pl /homes/fish/mernst/tmp/python-doc/html/ref/index.html -# html2texi.pl /homes/fish/mernst/tmp/python-doc/html/tut/index.html - -# Edit the generated .texi files: -# * change @setfilename to prefix "python-" -# * fix up any sectioning, such as for Abstract -# * make Texinfo menus -# * perhaps remove the @detailmenu ... @end detailmenu -# In Emacs, to do all this: -# (progn (goto-char (point-min)) (replace-regexp "\\(@setfilename \\)\\([-a-z]*\\)$" "\\1python-\\2.info") (replace-string "@node Front Matter\n@chapter Abstract\n" "@node Abstract\n@section Abstract\n") (progn (mark-whole-buffer) (texinfo-master-menu 'update-all-nodes)) (save-buffer)) - -# makeinfo api.texi -# makeinfo ext.texi -# makeinfo lib.texi -# makeinfo mac.texi -# makeinfo ref.texi -# makeinfo tut.texi - - -### -### Structure of the code -### - -# To be written... - - -### -### Design decisions -### - -# Source and destination languages -# -------------------------------- -# -# The goal is Info files; I create Texinfo, so I don't have to worry about -# the finer details of Info file creation. (I'm not even sure of its exact -# format.) -# -# Why not start from LaTeX rather than HTML? -# I could hack latex2html itself to produce Texinfo instead, or fix up -# partparse.py (which already translates LaTeX to Teinfo). -# Pros: -# * has high-level information such as index entries, original formatting -# Cons: -# * those programs are complicated to read and understand -# * those programs try to handle arbitrary LaTeX input, track catcodes, -# and more: I don't want to go to that effort. HTML isn't as powerful -# as LaTeX, so there are fewer subtleties. -# * the result wouldn't work for arbitrary HTML documents; it would be -# nice to eventually extend this program to HTML produced from Docbook, -# Frame, and more. - -# Parsing -# ------- -# -# I don't want to view the text as a linear stream; I'd rather parse the -# whole thing and then do pattern matching over the parsed representation (to -# find idioms such as indices, lists of child nodes, etc.). -# * Perl provides HTML::TreeBuilder, which does just what I want. -# * libwww-perl: http://www.linpro.no/lwp/ -# * TreeBuilder: HTML-Tree-0.51.tar.gz -# * Python Parsers, Formatters, and Writers don't really provide the right -# interface (and the version in Grail doesn't correspond to another -# distributed version, so I'm confused about which to be using). I could -# write something in Python that creates a parse tree, but why bother? - -# Other implementation language issues: -# * Python lacks variable declarations, reasonable scoping, and static -# checking tools. I've written some of the latter for myself that make -# my Perl programming a lot safer than my Python programming will be until -# I have a similar suite for that language. - - -########################################################################### -### To do -### - -# Section names: -# Fix the problem with multiple sections in a single file (eg, Abstract in -# Front Matter section). -# Deal with cross-references, as in /homes/fish/mernst/tmp/python-doc/html/ref/types.html:310 -# Index: -# Perhaps double-check that every tag mentioned in the index is found -# in the text. -# Python: email to python-docs@python.org, to get their feedback. -# Compare to existing lib/ Info manual -# Write the hooks into info-look; replace pyliblookup1-1.tar.gz. -# Postpass to remove extra quotation marks around typography already in -# a different font (to avoid double delimiters as in "`code'"); or -# perhaps consider using only font-based markup so that we don't get -# the extra *bold* and `code' markup in Info. - -## Perhaps don't rely on automatic means for adding up, next, prev; I have -## all that info available to me already, so it's not so much trouble to -## add it. (Right?) But it is *so* easy to use Emacs instead... - - -########################################################################### -### Strictures -### - -# man HTML::TreeBuilder -# man HTML::Parser -# man HTML::Element - -# require HTML::ParserWComment; -require HTML::Parser; -require HTML::TreeBuilder; -require HTML::Element; - -use File::Basename; - -use strict; -# use Carp; - -use checkargs; - - -########################################################################### -### Variables -### - -my @section_stack = (); # elements are chapter/section/subsec nodetitles (I think) -my $current_ref_tdf; # for the file currently being processed; - # used in error messages -my $html_directory; -my %footnotes; - -# First element should not be used. -my @sectionmarker = ("manual", "chapter", "section", "subsection", "subsubsection"); - -my %inline_markup = ("b" => "strong", - "code" => "code", - "i" => "emph", - "kbd" => "kbd", - "samp" => "samp", - "strong" => "strong", - "tt" => "code", - "var" => "var"); - -my @deferred_index_entries = (); - -my @index_titles = (); # list of (filename, type) lists -my %index_info = ("Index" => ["\@blindex", "bl"], - "Concept Index" => ["\@cindex", "cp"], - "Module Index" => ["\@mdindex", "md"]); - - -########################################################################### -### Main/contents page -### - -# Process first-level page on its own, or just a contents page? Well, I do -# want the title, author, etc., and the front matter... For now, just add -# that by hand at the end. - - -# data structure possibilities: -# * tree-like (need some kind of stack when processing (or parent pointers)) -# * list of name and depth; remember old and new depths. - -# Each element is a reference to a list of (nodetitle, depth, filename). -my @contents_list = (); - -# The problem with doing fixups on the fly is that some sections may have -# already been processed (and no longer available) by the time we notice -# others with the same name. It's probably better to fully construct the -# contents list (reading in all files of interest) upfront; that will also -# let me do a better job with cross-references, because again, all files -# will already be read in. -my %contents_hash = (); -my %contents_fixups = (); - -my @current_contents_list = (); - -# Merge @current_contents_list into @contents_list, -# and set @current_contents_list to be empty. -sub merge_contents_lists ( ) -{ check_args(0, @_); - - # Three possibilities: - # * @contents_list is empty: replace it by @current_contents_list. - # * prefixes of the two lists are identical: do nothing - # * @current_contents_list is all at lower level than $contents_list[0]; - # prefix @contents_list by @current_contents_list - - if (scalar(@current_contents_list) == 0) - { die "empty current_contents_list"; } - - # if (scalar(@contents_list) == 0) - # { @contents_list = @current_contents_list; - # @current_contents_list = (); - # return; } - - # if (($ {$contents_list[0]}[1]) < ($ {$current_contents_list[0]}[1])) - # { unshift @contents_list, @current_contents_list; - # @current_contents_list = (); - # return; } - - for (my $i=0; $i<scalar(@current_contents_list); $i++) - { my $ref_c_tdf = $current_contents_list[$i]; - if ($i >= scalar(@contents_list)) - { push @contents_list, $ref_c_tdf; - my $title = $ {$ref_c_tdf}[0]; - if (defined $contents_hash{$title}) - { $contents_fixups{$title} = 1; } - else - { $contents_hash{$title} = 1; } - next; } - my $ref_tdf = $contents_list[$i]; - my ($title, $depth, $file) = @{$ref_tdf}; - my ($c_title, $c_depth, $c_file) = @{$ref_c_tdf}; - - if (($title ne $c_title) - && ($depth < $c_depth) - && ($file ne $c_file)) - { splice @contents_list, $i, 0, $ref_c_tdf; - if (defined $contents_hash{$c_title}) - { $contents_fixups{$c_title} = 1; } - else - { $contents_hash{$c_title} = 1; } - next; } - - if (($title ne $c_title) - || ($depth != $c_depth) - || ($file ne $c_file)) - { die ("while processing $ {$current_ref_tdf}[2] at depth $ {$current_ref_tdf}[1], mismatch at index $i:", - "\n main: <<<$title>>> $depth $file", - "\n curr: <<<$c_title>>> $c_depth $c_file"); } - } - @current_contents_list = (); -} - - - -# Set @current_contents_list to a list of (title, href, sectionlevel); -# then merge that list into @contents_list. -# Maybe this function should also produce a map -# from title (or href) to sectionlevel (eg "chapter"?). -sub process_child_links ( $ ) -{ my ($he) = check_args(1, @_); - - # $he->dump(); - if (scalar(@current_contents_list) != 0) - { die "current_contents_list nonempty: @current_contents_list"; } - $he->traverse(\&increment_current_contents_list, 'ignore text'); - - # Normalize the depths; for instance, convert 1,3,5 into 0,1,2. - my %depths = (); - for my $ref_tdf (@current_contents_list) - { $depths{$ {$ref_tdf}[1]} = 1; } - my @sorted_depths = sort keys %depths; - my $current_depth = scalar(@section_stack)-1; - my $current_depth_2 = $ {$current_ref_tdf}[1]; - if ($current_depth != $current_depth_2) - { die "mismatch in current depths: $current_depth $current_depth_2; ", join(", ", @section_stack); } - for (my $i=0; $i<scalar(@sorted_depths); $i++) - { $depths{$sorted_depths[$i]} = $i + $current_depth+1; } - for my $ref_tdf (@current_contents_list) - { $ {$ref_tdf}[1] = $depths{$ {$ref_tdf}[1]}; } - - # Eliminate uninteresting sections. Hard-coded hack for now. - if ($ {$current_contents_list[-1]}[0] eq "About this document ...") - { pop @current_contents_list; } - if ((scalar(@current_contents_list) > 1) - && ($ {$current_contents_list[1]}[0] eq "Contents")) - { my $ref_first_tdf = shift @current_contents_list; - $current_contents_list[0] = $ref_first_tdf; } - - for (my $i=0; $i<scalar(@current_contents_list); $i++) - { my $ref_tdf = $current_contents_list[$i]; - my $title = $ {$ref_tdf}[0]; - if (exists $index_info{$title}) - { my $index_file = $ {$ref_tdf}[2]; - my ($indexing_command, $suffix) = @{$index_info{$title}}; - process_index_file($index_file, $indexing_command); - print TEXI "\n\@defindex $suffix\n"; - push @index_titles, $title; - splice @current_contents_list, $i, 1; - $i--; } - elsif ($title =~ /\bIndex$/) - { print STDERR "Warning: \"$title\" might be an index; if so, edit \%index_info.\n"; } } - - merge_contents_lists(); - - # print_contents_list(); - # print_index_info(); -} - - -sub increment_current_contents_list ( $$$ ) -{ my ($he, $startflag, $depth) = check_args(3, @_); - if (!$startflag) - { return; } - - if ($he->tag eq "li") - { my @li_content = @{$he->content}; - if ($li_content[0]->tag ne "a") - { die "first element of <LI> should be <A>"; } - my ($name, $href, @content) = anchor_info($li_content[0]); - # unused $name - my $title = join("", collect_texts($li_content[0])); - $title = texi_remove_punctuation($title); - # The problem with these is that they are formatted differently in - # @menu and @node! - $title =~ s/``/\"/g; - $title =~ s/''/\"/g; - $title =~ s/ -- / /g; - push @current_contents_list, [ $title, $depth, $href ]; } - return 1; -} - -# Simple version for section titles -sub html_to_texi ( $ ) -{ my ($he) = check_args(1, @_); - if (!ref $he) - { return $he; } - - my $tag = $he->tag; - if (exists $inline_markup{$tag}) - { my $result = "\@$inline_markup{$tag}\{"; - for my $elt (@{$he->content}) - { $result .= html_to_texi($elt); } - $result .= "\}"; - return $result; } - else - { $he->dump(); - die "html_to_texi confused by <$tag>"; } -} - - - -sub print_contents_list () -{ check_args(0, @_); - print STDERR "Contents list:\n"; - for my $ref_tdf (@contents_list) - { my ($title, $depth, $file) = @{$ref_tdf}; - print STDERR "$title $depth $file\n"; } -} - - - -########################################################################### -### Index -### - -my $l2h_broken_link_name = "l2h-"; - - -# map from file to (map from anchor name to (list of index texts)) -# (The list is needed when a single LaTeX command like \envvar -# expands to multiple \index commands.) -my %file_index_entries = (); -my %this_index_entries; # map from anchor name to (list of index texts) - -my %file_index_entries_broken = (); # map from file to (list of index texts) -my @this_index_entries_broken; - -my $index_prefix = ""; -my @index_prefixes = (); - -my $this_indexing_command; - -sub print_index_info () -{ check_args(0, @_); - my ($key, $val); - for my $file (sort keys %file_index_entries) - { my %index_entries = %{$file_index_entries{$file}}; - print STDERR "file: $file\n"; - for my $aname (sort keys %index_entries) - { my @entries = @{$index_entries{$aname}}; - if (scalar(@entries) == 1) - { print STDERR " $aname : $entries[0]\n"; } - else - { print STDERR " $aname : ", join("\n " . (" " x length($aname)), @entries), "\n"; } } } - for my $file (sort keys %file_index_entries_broken) - { my @entries = @{$file_index_entries_broken{$file}}; - print STDERR "file: $file\n"; - for my $entry (@entries) - { print STDERR " $entry\n"; } - } -} - - -sub process_index_file ( $$ ) -{ my ($file, $indexing_command) = check_args(2, @_); - # print "process_index_file $file $indexing_command\n"; - - my $he = file_to_tree($html_directory . $file); - # $he->dump(); - - $this_indexing_command = $indexing_command; - $he->traverse(\&process_if_index_dl_compact, 'ignore text'); - undef $this_indexing_command; - # print "process_index_file done\n"; -} - - -sub process_if_index_dl_compact ( $$$ ) -{ my ($he, $startflag) = (check_args(3, @_))[0,1]; # ignore depth argument - if (!$startflag) - { return; } - - if (($he->tag() eq "dl") && (defined $he->attr('compact'))) - { process_index_dl_compact($he); - return 0; } - else - { return 1; } -} - - -# The elements of a <DL COMPACT> list from a LaTeX2HTML index: -# * a single space: text to be ignored -# * <DT> elements with an optional <DD> element following each one -# Two types of <DT> elements: -# * Followed by a <DD> element: the <DT> contains a single -# string, and the <DD> contains a whitespace string to be ignored, a -# <DL COMPACT> to be recursively processed (with the <DT> string as a -# prefix), and a whitespace string to be ignored. -# * Not followed by a <DD> element: contains a list of anchors -# and texts (ignore the texts, which are only whitespace and commas). -# Optionally contains a <DL COMPACT> to be recursively processed (with -# the <DT> string as a prefix) -sub process_index_dl_compact ( $ ) -{ my ($h) = check_args(1, @_); - my @content = @{$h->content()}; - for (my $i = 0; $i < scalar(@content); $i++) - { my $this_he = $content[$i]; - if ($this_he->tag ne "dt") - { $this_he->dump(); - die "Expected <DT> tag: " . $this_he->tag; } - if (($i < scalar(@content) - 1) && ($content[$i+1]->tag eq "dd")) - { process_index_dt_and_dd($this_he, $content[$i+1]); - $i++; } - else - { process_index_lone_dt($this_he); } } } - - - -# Argument is a <DT> element. If it contains more than one anchor, then -# the texts of all subsequent ones are "[Link]". Example: -# <DT> -# <A HREF="embedding.html#l2h-201"> -# "$PATH" -# ", " -# <A HREF="embedding.html#l2h-205"> -# "[Link]" -# Optionally contains a <DL COMPACT> as well. Example: -# <DT> -# <A HREF="types.html#l2h-616"> -# "attribute" -# <DL COMPACT> -# <DT> -# <A HREF="assignment.html#l2h-3074"> -# "assignment" -# ", " -# <A HREF="assignment.html#l2h-3099"> -# "[Link]" -# <DT> -# <A HREF="types.html#l2h-"> -# "assignment, class" - -sub process_index_lone_dt ( $ ) -{ my ($dt) = check_args(1, @_); - my @dtcontent = @{$dt->content()}; - my $acontent; - my $acontent_suffix; - for my $a (@dtcontent) - { if ($a eq ", ") - { next; } - if (!ref $a) - { $dt->dump; - die "Unexpected <DT> string element: $a"; } - - if ($a->tag eq "dl") - { push @index_prefixes, $index_prefix; - if (!defined $acontent_suffix) - { die "acontent_suffix not yet defined"; } - $index_prefix .= $acontent_suffix . ", "; - process_index_dl_compact($a); - $index_prefix = pop(@index_prefixes); - return; } - - if ($a->tag ne "a") - { $dt->dump; - $a->dump; - die "Expected anchor in lone <DT>"; } - - my ($aname, $ahref, @acontent) = anchor_info($a); - # unused $aname - if (scalar(@acontent) != 1) - { die "Expected just one content of <A> in <DT>: @acontent"; } - if (ref $acontent[0]) - { $acontent[0]->dump; - die "Expected string content of <A> in <DT>: $acontent[0]"; } - if (!defined($acontent)) - { $acontent = $index_prefix . $acontent[0]; - $acontent_suffix = $acontent[0]; } - elsif (($acontent[0] ne "[Link]") && ($acontent ne ($index_prefix . $acontent[0]))) - { die "Differing content: <<<$acontent>>>, <<<$acontent[0]>>>"; } - - if (!defined $ahref) - { $dt->dump; - die "no HREF in nachor in <DT>"; } - my ($ahref_file, $ahref_name) = split(/\#/, $ahref); - if (!defined $ahref_name) - { # Reference to entire file - $ahref_name = ""; } - - if ($ahref_name eq $l2h_broken_link_name) - { if (!exists $file_index_entries_broken{$ahref_file}) - { $file_index_entries_broken{$ahref_file} = []; } - push @{$file_index_entries_broken{$ahref_file}}, "$this_indexing_command $acontent"; - next; } - - if (!exists $file_index_entries{$ahref_file}) - { $file_index_entries{$ahref_file} = {}; } - # Don't do this! It appears to make a copy, which is not desired. - # my %index_entries = %{$file_index_entries{$ahref_file}}; - if (!exists $ {$file_index_entries{$ahref_file}}{$ahref_name}) - { $ {$file_index_entries{$ahref_file}}{$ahref_name} = []; } - # { my $oldcontent = $ {$file_index_entries{$ahref_file}}{$ahref_name}; - # if ($acontent eq $oldcontent) - # { die "Multiple identical index entries?"; } - # die "Trying to add $acontent, but already have index entry pointing at $ahref_file\#$ahref_name: ${$file_index_entries{$ahref_file}}{$ahref_name}"; } - - push @{$ {$file_index_entries{$ahref_file}}{$ahref_name}}, "$this_indexing_command $acontent"; - # print STDERR "keys: ", keys %{$file_index_entries{$ahref_file}}, "\n"; - } -} - -sub process_index_dt_and_dd ( $$ ) -{ my ($dt, $dd) = check_args(2, @_); - my $dtcontent; - { my @dtcontent = @{$dt->content()}; - if ((scalar(@dtcontent) != 1) || (ref $dtcontent[0])) - { $dd->dump; - $dt->dump; - die "Expected single string (actual size = " . scalar(@dtcontent) . ") in content of <DT>: @dtcontent"; } - $dtcontent = $dtcontent[0]; - $dtcontent =~ s/ +$//; } - my $ddcontent; - { my @ddcontent = @{$dd->content()}; - if (scalar(@ddcontent) != 1) - { die "Expected single <DD> content, got ", scalar(@ddcontent), " elements:\n", join("\n", @ddcontent), "\n "; } - $ddcontent = $ddcontent[0]; } - if ($ddcontent->tag ne "dl") - { die "Expected <DL> as content of <DD>, but saw: $ddcontent"; } - - push @index_prefixes, $index_prefix; - $index_prefix .= $dtcontent . ", "; - process_index_dl_compact($ddcontent); - $index_prefix = pop(@index_prefixes); -} - - -########################################################################### -### Ordinary sections -### - -sub process_section_file ( $$$ ) -{ my ($file, $depth, $nodetitle) = check_args(3, @_); - my $he = file_to_tree(($file =~ /^\//) ? $file : $html_directory . $file); - - # print STDERR "process_section_file: $file $depth $nodetitle\n"; - - # Equivalently: - # while ($depth >= scalar(@section_stack)) { pop(@section_stack); } - @section_stack = @section_stack[0..$depth-1]; - - # Not a great nodename fixup scheme; need a more global view - if ((defined $contents_fixups{$nodetitle}) - && (scalar(@section_stack) > 0)) - { my $up_title = $section_stack[$#section_stack]; - # hack for Python Standard Library - $up_title =~ s/^(Built-in|Standard) Module //g; - my ($up_first_word) = split(/ /, $up_title); - $nodetitle = "$up_first_word $nodetitle"; - } - - push @section_stack, $nodetitle; - # print STDERR "new section_stack: ", join(", ", @section_stack), "\n"; - - $he->traverse(\&process_if_child_links, 'ignore text'); - %footnotes = (); - # $he->dump; - $he->traverse(\&process_if_footnotes, 'ignore text'); - - # $he->dump; - - if (exists $file_index_entries{$file}) - { %this_index_entries = %{$file_index_entries{$file}}; - # print STDERR "this_index_entries:\n ", join("\n ", keys %this_index_entries), "\n"; - } - else - { # print STDERR "Warning: no index entries for file $file\n"; - %this_index_entries = (); } - - if (exists $file_index_entries_broken{$file}) - { @this_index_entries_broken = @{$file_index_entries_broken{$file}}; } - else - { # print STDERR "Warning: no index entries for file $file\n"; - @this_index_entries_broken = (); } - - - if ($he->tag() ne "html") - { die "Expected <HTML> at top level"; } - my @content = @{$he->content()}; - if ((!ref $content[0]) or ($content[0]->tag ne "head")) - { $he->dump; - die "<HEAD> not first element of <HTML>"; } - if ((!ref $content[1]) or ($content[1]->tag ne "body")) - { $he->dump; - die "<BODY> not second element of <HTML>"; } - - $content[1]->traverse(\&output_body); -} - -# stack of things we're inside that are preventing indexing from occurring now. -# These are "h1", "h2", "h3", "h4", "h5", "h6", "dt" (and possibly others?) -my @index_deferrers = (); - -sub push_or_pop_index_deferrers ( $$ ) -{ my ($tag, $startflag) = check_args(2, @_); - if ($startflag) - { push @index_deferrers, $tag; } - else - { my $old_deferrer = pop @index_deferrers; - if ($tag ne $old_deferrer) - { die "Expected $tag at top of index_deferrers but saw $old_deferrer; remainder = ", join(" ", @index_deferrers); } - do_deferred_index_entries(); } -} - - -sub label_add_index_entries ( $;$ ) -{ my ($label, $he) = check_args_range(1, 2, @_); - # print ((exists $this_index_entries{$label}) ? "*" : " "), " label_add_index_entries $label\n"; - # $he is the anchor element - if (exists $this_index_entries{$label}) - { push @deferred_index_entries, @{$this_index_entries{$label}}; - return; } - - if ($label eq $l2h_broken_link_name) - { # Try to find some text to use in guessing which links should point here - # I should probably only look at the previous element, or if that is - # all punctuation, the one before it; collecting all the previous texts - # is a bit of overkill. - my @anchor_texts = collect_texts($he); - my @previous_texts = collect_texts($he->parent, $he); - # 4 elements is arbitrary; ought to filter out punctuation and small words - # first, then perhaps keep fewer. Perhaps also filter out formatting so - # that we can see a larger chunk of text? (Probably not.) - # Also perhaps should do further chunking into words, in case the - # index term isn't a chunk of its own (eg, was in <tt>...</tt>. - my @candidate_texts = (@anchor_texts, (reverse(@previous_texts))[0..min(3,$#previous_texts)]); - - my $guessed = 0; - for my $text (@candidate_texts) - { # my $orig_text = $text; - if ($text =~ /^[\"\`\'().?! ]*$/) - { next; } - if (length($text) <= 2) - { next; } - # hack for Python manual; maybe defer until failure first time around? - $text =~ s/^sys\.//g; - for my $iterm (@this_index_entries_broken) - { # I could test for zero: LaTeX2HTML's failures in the Python - # documentation are only for items of the form "... (built-in...)" - if (index($iterm, $text) != -1) - { push @deferred_index_entries, $iterm; - # print STDERR "Guessing index term `$iterm' for text `$orig_text'\n"; - $guessed = 1; - } } } - if (!$guessed) - { # print STDERR "No guess in `", join("'; `", @this_index_entries_broken), "' for texts:\n `", join("'\n `", @candidate_texts), "'\n"; - } - } -} - - -# Need to add calls to this at various places. -# Perhaps add HTML::Element argument and do the check for appropriateness -# here (ie, no action if inside <H1>, etc.). -sub do_deferred_index_entries () -{ check_args(0, @_); - if ((scalar(@deferred_index_entries) > 0) - && (scalar(@index_deferrers) == 0)) - { print TEXI "\n", join("\n", @deferred_index_entries), "\n"; - @deferred_index_entries = (); } -} - -my $table_columns; # undefined if not in a table -my $table_first_column; # boolean - -sub output_body ( $$$ ) -{ my ($he, $startflag) = (check_args(3, @_))[0,1]; # ignore depth argument - - if (!ref $he) - { my $space_index = index($he, " "); - if ($space_index != -1) - { # Why does - # print TEXI texi_quote(substr($he, 0, $space_index+1)); - # give: Can't locate object method "TEXI" via package "texi_quote" - # (Because the definition texi_quote hasn't been seen yet.) - print TEXI &texi_quote(substr($he, 0, $space_index+1)); - do_deferred_index_entries(); - print TEXI &texi_quote(substr($he, $space_index+1)); } - else - { print TEXI &texi_quote($he); } - return; } - - my $tag = $he->tag(); - - # Ordinary text markup first - if (exists $inline_markup{$tag}) - { if ($startflag) - { print TEXI "\@$inline_markup{$tag}\{"; } - else - { print TEXI "\}"; } } - elsif ($tag eq "a") - { my ($name, $href, @content) = anchor_info($he); - if (!$href) - { # This anchor is only here for indexing/cross referencing purposes. - if ($startflag) - { label_add_index_entries($name, $he); } - } - elsif ($href =~ "^(ftp|http|news):") - { if ($startflag) - { # Should avoid second argument if it's identical to the URL. - print TEXI "\@uref\{$href, "; } - else - { print TEXI "\}"; } - } - elsif ($href =~ /^\#(foot[0-9]+)$/) - { # Footnote - if ($startflag) - { # Could double-check name and content, but I'm not - # currently storing that information. - print TEXI "\@footnote\{"; - $footnotes{$1}->traverse(\&output_body); - print TEXI "\}"; - return 0; } } - else - { if ($startflag) - { # cross-references are not active Info links, but no text is lost - print STDERR "Can't deal with internal HREF anchors yet:\n"; - $he->dump; } - } - } - elsif ($tag eq "br") - { print TEXI "\@\n"; } - elsif ($tag eq "body") - { } - elsif ($tag eq "center") - { if (has_single_content_string($he) - && ($ {$he->content}[0] =~ /^ *$/)) - { return 0; } - if ($startflag) - { print TEXI "\n\@center\n"; } - else - { print TEXI "\n\@end center\n"; } - } - elsif ($tag eq "div") - { my $align = $he->attr('align'); - if (defined($align) && ($align eq "center")) - { if (has_single_content_string($he) - && ($ {$he->content}[0] =~ /^ *$/)) - { return 0; } - if ($startflag) - { print TEXI "\n\@center\n"; } - else - { print TEXI "\n\@end center\n"; } } - } - elsif ($tag eq "dl") - { # Recognize "<dl><dd><pre> ... </pre></dl>" paradigm for "@example" - if (has_single_content_with_tag($he, "dd")) - { my $he_dd = $ {$he->content}[0]; - if (has_single_content_with_tag($he_dd, "pre")) - { my $he_pre = $ {$he_dd->content}[0]; - print_pre($he_pre); - return 0; } } - if ($startflag) - { # Could examine the elements, to be cleverer about formatting. - # (Also to use ftable, vtable...) - print TEXI "\n\@table \@asis\n"; } - else - { print TEXI "\n\@end table\n"; } - } - elsif ($tag eq "dt") - { push_or_pop_index_deferrers($tag, $startflag); - if ($startflag) - { print TEXI "\n\@item "; } - else - { } } - elsif ($tag eq "dd") - { if ($startflag) - { print TEXI "\n"; } - else - { } - if (scalar(@index_deferrers) != 0) - { $he->dump; - die "Unexpected <$tag> while inside: (" . join(" ", @index_deferrers) . "); bad HTML?"; } - do_deferred_index_entries(); - } - elsif ($tag =~ /^(font|big|small)$/) - { # Do nothing for now. - } - elsif ($tag =~ /^h[1-6]$/) - { # We don't need this because we never recursively enter the heading content. - # push_or_pop_index_deferrers($tag, $startflag); - my $secname = ""; - my @seclabels = (); - for my $elt (@{$he->content}) - { if (!ref $elt) - { $secname .= $elt; } - elsif ($elt->tag eq "br") - { } - elsif ($elt->tag eq "a") - { my ($name, $href, @acontent) = anchor_info($elt); - if ($href) - { $he->dump; - $elt->dump; - die "Nonsimple anchor in <$tag>"; } - if (!defined $name) - { die "No NAME for anchor in $tag"; } - push @seclabels, $name; - for my $subelt (@acontent) - { $secname .= html_to_texi($subelt); } } - else - { $secname .= html_to_texi($elt); } } - if ($secname eq "") - { die "No section name in <$tag>"; } - if (scalar(@section_stack) == 1) - { if ($section_stack[-1] ne "Top") - { die "Not top? $section_stack[-1]"; } - print TEXI "\@settitle $secname\n"; - print TEXI "\@c %**end of header\n"; - print TEXI "\n"; - print TEXI "\@node Top\n"; - print TEXI "\n"; } - else - { print TEXI "\n\@node $section_stack[-1]\n"; - print TEXI "\@$sectionmarker[scalar(@section_stack)-1] ", texi_remove_punctuation($secname), "\n"; } - for my $seclabel (@seclabels) - { label_add_index_entries($seclabel); } - # This should only happen once per file. - label_add_index_entries(""); - if (scalar(@index_deferrers) != 0) - { $he->dump; - die "Unexpected <$tag> while inside: (" . join(" ", @index_deferrers) . "); bad HTML?"; } - do_deferred_index_entries(); - return 0; - } - elsif ($tag eq "hr") - { } - elsif ($tag eq "ignore") - { # Hack for ignored elements - return 0; - } - elsif ($tag eq "li") - { if ($startflag) - { print TEXI "\n\n\@item\n"; - do_deferred_index_entries(); } } - elsif ($tag eq "ol") - { if ($startflag) - { print TEXI "\n\@enumerate \@bullet\n"; } - else - { print TEXI "\n\@end enumerate\n"; } } - elsif ($tag eq "p") - { if ($startflag) - { print TEXI "\n\n"; } - if (scalar(@index_deferrers) != 0) - { $he->dump; - die "Unexpected <$tag> while inside: (" . join(" ", @index_deferrers) . "); bad HTML?"; } - do_deferred_index_entries(); } - elsif ($tag eq "pre") - { print_pre($he); - return 0; } - elsif ($tag eq "table") - { # Could also indicate common formatting for first column, or - # determine relative widths for columns (or determine a prototype row) - if ($startflag) - { if (defined $table_columns) - { $he->dump; - die "Can't deal with table nested inside $table_columns-column table"; } - $table_columns = table_columns($he); - if ($table_columns < 2) - { $he->dump; - die "Column with $table_columns columns?"; } - elsif ($table_columns == 2) - { print TEXI "\n\@table \@asis\n"; } - else - { print TEXI "\n\@multitable \@columnfractions"; - for (my $i=0; $i<$table_columns; $i++) - { print TEXI " ", 1.0/$table_columns; } - print TEXI "\n"; } } - else - { if ($table_columns == 2) - { print TEXI "\n\@end table\n"; } - else - { print TEXI "\n\@end multitable\n"; } - undef $table_columns; } } - elsif (($tag eq "td") || ($tag eq "th")) - { if ($startflag) - { if ($table_first_column) - { print TEXI "\n\@item "; - $table_first_column = 0; } - elsif ($table_columns > 2) - { print TEXI "\n\@tab "; } } - else - { print TEXI "\n"; } } - elsif ($tag eq "tr") - { if ($startflag) - { $table_first_column = 1; } } - elsif ($tag eq "ul") - { if ($startflag) - { print TEXI "\n\@itemize \@bullet\n"; } - else - { print TEXI "\n\@end itemize\n"; } } - else - { # I used to have a newline before "output_body" here. - print STDERR "output_body: ignoring <$tag> tag\n"; - $he->dump; - return 0; } - - return 1; -} - -sub print_pre ( $ ) -{ my ($he_pre) = check_args(1, @_); - if (!has_single_content_string($he_pre)) - { die "Multiple or non-string content for <PRE>: ", @{$he_pre->content}; } - my $pre_content = $ {$he_pre->content}[0]; - print TEXI "\n\@example"; - print TEXI &texi_quote($pre_content); - print TEXI "\@end example\n"; -} - -sub table_columns ( $ ) -{ my ($table) = check_args(1, @_); - my $result = 0; - for my $row (@{$table->content}) - { if ($row->tag ne "tr") - { $table->dump; - $row->dump; - die "Expected <TR> as table row."; } - $result = max($result, scalar(@{$row->content})); } - return $result; -} - - -########################################################################### -### Utilities -### - -sub min ( $$ ) -{ my ($x, $y) = check_args(2, @_); - return ($x < $y) ? $x : $y; -} - -sub max ( $$ ) -{ my ($x, $y) = check_args(2, @_); - return ($x > $y) ? $x : $y; -} - -sub file_to_tree ( $ ) -{ my ($file) = check_args(1, @_); - - my $tree = new HTML::TreeBuilder; - $tree->ignore_unknown(1); - # $tree->warn(1); - $tree->parse_file($file); - cleanup_parse_tree($tree); - return $tree -} - - -sub has_single_content ( $ ) -{ my ($he) = check_args(1, @_); - if (!ref $he) - { # return 0; - die "Non-reference argument: $he"; } - my $ref_content = $he->content; - if (!defined $ref_content) - { return 0; } - my @content = @{$ref_content}; - if (scalar(@content) != 1) - { return 0; } - return 1; -} - - -# Return true if the content of the element contains only one element itself, -# and that inner element has the specified tag. -sub has_single_content_with_tag ( $$ ) -{ my ($he, $tag) = check_args(2, @_); - if (!has_single_content($he)) - { return 0; } - my $content = $ {$he->content}[0]; - if (!ref $content) - { return 0; } - my $content_tag = $content->tag; - if (!defined $content_tag) - { return 0; } - return $content_tag eq $tag; -} - -sub has_single_content_string ( $ ) -{ my ($he) = check_args(1, @_); - if (!has_single_content($he)) - { return 0; } - my $content = $ {$he->content}[0]; - if (ref $content) - { return 0; } - return 1; -} - - -# Return name, href, content. First two may be undefined; third is an array. -# I don't see how to determine if there are more attributes. -sub anchor_info ( $ ) -{ my ($he) = check_args(1, @_); - if ($he->tag ne "a") - { $he->dump; - die "passed non-anchor to anchor_info"; } - my $name = $he->attr('name'); - my $href = $he->attr('href'); - my @content = (); - { my $ref_content = $he->content; - if (defined $ref_content) - { @content = @{$ref_content}; } } - return ($name, $href, @content); -} - - -sub texi_quote ( $ ) -{ my ($text) = check_args(1, @_); - $text =~ s/([\@\{\}])/\@$1/g; - $text =~ s/ -- / --- /g; - return $text; -} - -# Eliminate bad punctuation (that confuses Makeinfo or Info) for section titles. -sub texi_remove_punctuation ( $ ) -{ my ($text) = check_args(1, @_); - - $text =~ s/^ +//g; - $text =~ s/[ :]+$//g; - $text =~ s/^[1-9][0-9.]* +//g; - $text =~ s/,//g; - # Both embedded colons and " -- " confuse makeinfo. (Perhaps " -- " - # gets converted into " - ", just as "---" would be converted into " -- ", - # so the names end up differing.) - # $text =~ s/:/ -- /g; - $text =~ s/://g; - return $text; -} - - -## Do not use this inside `traverse': it throws off the traversal. Use -## html_replace_by_ignore or html_replace_by_meta instead. -# Returns 1 if success, 0 if failure. -sub html_remove ( $;$ ) -{ my ($he, $parent) = check_args_range(1, 2, @_); - if (!defined $parent) - { $parent = $he->parent; } - my $ref_pcontent = $parent->content; - my @pcontent = @{$ref_pcontent}; - for (my $i=0; $i<scalar(@pcontent); $i++) - { if ($pcontent[$i] eq $he) - { splice @{$ref_pcontent}, $i, 1; - $he->parent(undef); - return 1; } } - die "Didn't find $he in $parent"; -} - - -sub html_replace ( $$;$ ) -{ my ($orig, $new, $parent) = check_args_range(2, 3, @_); - if (!defined $parent) - { $parent = $orig->parent; } - my $ref_pcontent = $parent->content; - my @pcontent = @{$ref_pcontent}; - for (my $i=0; $i<scalar(@pcontent); $i++) - { if ($pcontent[$i] eq $orig) - { $ {$ref_pcontent}[$i] = $new; - $new->parent($parent); - $orig->parent(undef); - return 1; } } - die "Didn't find $orig in $parent"; -} - -sub html_replace_by_meta ( $;$ ) -{ my ($orig, $parent) = check_args_range(1, 2, @_); - my $meta = new HTML::Element "meta"; - if (!defined $parent) - { $parent = $orig->parent; } - return html_replace($orig, $meta, $parent); -} - -sub html_replace_by_ignore ( $;$ ) -{ my ($orig, $parent) = check_args_range(1, 2, @_); - my $ignore = new HTML::Element "ignore"; - if (!defined $parent) - { $parent = $orig->parent; } - return html_replace($orig, $ignore, $parent); -} - - - -### -### Collect text elements -### - -my @collected_texts; -my $collect_texts_stoppoint; -my $done_collecting; - -sub collect_texts ( $;$ ) -{ my ($root, $stop) = check_args_range(1, 2, @_); - # print STDERR "collect_texts: $root $stop\n"; - $collect_texts_stoppoint = $stop; - $done_collecting = 0; - @collected_texts = (); - $root->traverse(\&collect_if_text); # process texts - # print STDERR "collect_texts => ", join(";;;", @collected_texts), "\n"; - return @collected_texts; -} - -sub collect_if_text ( $$$ ) -{ my $he = (check_args(3, @_))[0]; # ignore depth and startflag arguments - if ($done_collecting) - { return 0; } - if (!defined $he) - { return 0; } - if (!ref $he) - { push @collected_texts, $he; - return 0; } - if ((defined $collect_texts_stoppoint) && ($he eq $collect_texts_stoppoint)) - { $done_collecting = 1; - return 0; } - return 1; -} - - -########################################################################### -### Clean up parse tree -### - -sub cleanup_parse_tree ( $ ) -{ my ($he) = check_args(1, @_); - $he->traverse(\&delete_if_navigation, 'ignore text'); - $he->traverse(\&delete_extra_spaces, 'ignore text'); - $he->traverse(\&merge_dl, 'ignore text'); - $he->traverse(\&reorder_dt_and_dl, 'ignore text'); - return $he; -} - - -## Simpler version that deletes contents but not the element itself. -# sub delete_if_navigation ( $$$ ) -# { my $he = (check_args(3, @_))[0]; # ignore startflag and depth -# if (($he->tag() eq "div") && ($he->attr('class') eq 'navigation')) -# { $he->delete(); -# return 0; } -# else -# { return 1; } -# } - -sub delete_if_navigation ( $$$ ) -{ my ($he, $startflag) = (check_args(3, @_))[0,1]; # ignore depth argument - if (!$startflag) - { return; } - - if (($he->tag() eq "div") && (defined $he->attr('class')) && ($he->attr('class') eq 'navigation')) - { my $ref_pcontent = $he->parent()->content(); - # Don't try to modify @pcontent, which appears to be a COPY. - # my @pcontent = @{$ref_pcontent}; - for (my $i = 0; $i<scalar(@{$ref_pcontent}); $i++) - { if (${$ref_pcontent}[$i] eq $he) - { splice(@{$ref_pcontent}, $i, 1); - last; } } - $he->delete(); - return 0; } - else - { return 1; } -} - -sub delete_extra_spaces ( $$$ ) -{ my ($he, $startflag) = (check_args(3, @_))[0,1]; # ignore depth argument - if (!$startflag) - { return; } - - my $tag = $he->tag; - if ($tag =~ /^(head|html|table|tr|ul)$/) - { delete_child_spaces($he); } - delete_trailing_spaces($he); - return 1; -} - - -sub delete_child_spaces ( $ ) -{ my ($he) = check_args(1, @_); - my $ref_content = $he->content(); - for (my $i = 0; $i<scalar(@{$ref_content}); $i++) - { if ($ {$ref_content}[$i] =~ /^ *$/) - { splice(@{$ref_content}, $i, 1); - $i--; } } -} - -sub delete_trailing_spaces ( $ ) -{ my ($he) = check_args(1, @_); - my $ref_content = $he->content(); - if (! defined $ref_content) - { return; } - # Could also check for previous element = /^h[1-6]$/. - for (my $i = 0; $i<scalar(@{$ref_content})-1; $i++) - { if ($ {$ref_content}[$i] =~ /^ *$/) - { my $next_elt = $ {$ref_content}[$i+1]; - if ((ref $next_elt) && ($next_elt->tag =~ /^(br|dd|dl|dt|hr|p|ul)$/)) - { splice(@{$ref_content}, $i, 1); - $i--; } } } - if ($he->tag =~ /^(dd|dt|^h[1-6]|li|p)$/) - { my $last_elt = $ {$ref_content}[$#{$ref_content}]; - if ((defined $last_elt) && ($last_elt =~ /^ *$/)) - { pop @{$ref_content}; } } -} - - -# LaTeX2HTML sometimes creates -# <DT>text -# <DL COMPACT><DD>text -# which should actually be: -# <DL COMPACT> -# <DT>text -# <DD>text -# Since a <DL> gets added, this ends up looking like -# <P> -# <DL> -# <DT> -# text1... -# <DL COMPACT> -# <DD> -# text2... -# dt_or_dd1... -# dt_or_dd2... -# which should become -# <P> -# <DL COMPACT> -# <DT> -# text1... -# <DD> -# text2... -# dt_or_dd1... -# dt_or_dd2... - -sub reorder_dt_and_dl ( $$$ ) -{ my ($he, $startflag) = (check_args(3, @_))[0,1]; # ignore depth argument - if (!$startflag) - { return; } - - if ($he->tag() eq "p") - { my $ref_pcontent = $he->content(); - if (defined $ref_pcontent) - { my @pcontent = @{$ref_pcontent}; - # print "reorder_dt_and_dl found a <p>\n"; $he->dump(); - if ((scalar(@pcontent) >= 1) - && (ref $pcontent[0]) && ($pcontent[0]->tag() eq "dl") - && $pcontent[0]->implicit()) - { my $ref_dlcontent = $pcontent[0]->content(); - # print "reorder_dt_and_dl found a <p> and implicit <dl>\n"; - if (defined $ref_dlcontent) - { my @dlcontent = @{$ref_dlcontent}; - if ((scalar(@dlcontent) >= 1) - && (ref $dlcontent[0]) && ($dlcontent[0]->tag() eq "dt")) - { my $ref_dtcontent = $dlcontent[0]->content(); - # print "reorder_dt_and_dl found a <p>, implicit <dl>, and <dt>\n"; - if (defined $ref_dtcontent) - { my @dtcontent = @{$ref_dtcontent}; - if ((scalar(@dtcontent) > 0) - && (ref $dtcontent[$#dtcontent]) - && ($dtcontent[$#dtcontent]->tag() eq "dl")) - { my $ref_dl2content = $dtcontent[$#dtcontent]->content(); - # print "reorder_dt_and_dl found a <p>, implicit <dl>, <dt>, and <dl>\n"; - if (defined $ref_dl2content) - { my @dl2content = @{$ref_dl2content}; - if ((scalar(@dl2content) > 0) - && (ref ($dl2content[0])) - && ($dl2content[0]->tag() eq "dd")) - { - # print "reorder_dt_and_dl found a <p>, implicit <dl>, <dt>, <dl>, and <dd>\n"; - # print STDERR "CHANGING\n"; $he->dump(); - html_replace_by_ignore($dtcontent[$#dtcontent]); - splice(@{$ref_dlcontent}, 1, 0, @dl2content); - # print STDERR "CHANGED TO:\n"; $he->dump(); - return 0; # don't traverse children - } } } } } } } } } - return 1; -} - - -# If we find a paragraph that looks like -# <P> -# <HR> -# <UL> -# then accumulate its links into a contents_list and delete the paragraph. -sub process_if_child_links ( $$$ ) -{ my ($he, $startflag) = (check_args(3, @_))[0,1]; # ignore depth argument - if (!$startflag) - { return; } - - if ($he->tag() eq "p") - { my $ref_content = $he->content(); - if (defined $ref_content) - { my @content = @{$ref_content}; - if ((scalar(@content) == 2) - && (ref $content[0]) && $content[0]->tag() eq "hr" - && (ref $content[1]) && $content[1]->tag() eq "ul") - { process_child_links($he); - $he->delete(); - return 0; } } } - return 1; -} - - -# If we find -# <H4> -# "Footnotes" -# <DL> -# <DT> -# <A NAME="foot560"> -# "...borrow" -# <A HREF="refcountsInPython.html#tex2html2" NAME="foot560"> -# "1.2" -# <DD> -# "The metaphor of ``borrowing'' a reference is not completely correct: the owner still has a copy of the reference. " -# ... -# then record the footnote information and delete the section and list. - -my $process_if_footnotes_expect_dl_next = 0; - -sub process_if_footnotes ( $$$ ) -{ my ($he, $startflag) = (check_args(3, @_))[0,1]; # ignore depth argument - if (!$startflag) - { return; } - - if (($he->tag() eq "h4") - && has_single_content_string($he) - && ($ {$he->content}[0] eq "Footnotes")) - { html_replace_by_ignore($he); - $process_if_footnotes_expect_dl_next = 1; - return 0; } - - if ($process_if_footnotes_expect_dl_next && ($he->tag() eq "dl")) - { my $ref_content = $he->content(); - if (defined $ref_content) - { $process_if_footnotes_expect_dl_next = 0; - my @content = @{$ref_content}; - for (my $i=0; $i<$#content; $i+=2) - { my $he_dt = $content[$i]; - my $he_dd = $content[$i+1]; - if (($he_dt->tag ne "dt") || ($he_dd->tag ne "dd")) - { $he->dump; - die "expected <DT> and <DD> at positions $i and ", $i+1; } - my @dt_content = @{$he_dt->content()}; - if ((scalar(@dt_content) != 2) - || ($dt_content[0]->tag ne "a") - || ($dt_content[1]->tag ne "a")) - { $he_dt->dump; - die "Expected 2 anchors as content of <DT>"; } - my ($dt1_name, $dt1_href, $dt1_content) = anchor_info($dt_content[0]); - my ($dt2_name, $dt2_href, $dt2_content) = anchor_info($dt_content[0]); - # unused: $dt1_href, $dt1_content, $dt2_href, $dt2_content - if ($dt1_name ne $dt2_name) - { $he_dt->dump; - die "Expected identical names for anchors"; } - html_replace_by_ignore($he_dd); - $he_dd->tag("div"); # has no effect - $footnotes{$dt1_name} = $he_dd; } - html_replace_by_ignore($he); - return 0; } } - - if ($process_if_footnotes_expect_dl_next) - { $he->dump; - die "Expected <DL> for footnotes next"; } - - return 1; -} - - - -## Merge two adjacent paragraphs containing <DL> items, such as: -# <P> -# <DL> -# <DT> -# ... -# <DD> -# ... -# <P> -# <DL> -# <DT> -# ... -# <DD> -# ... - -sub merge_dl ( $$$ ) -{ my ($he, $startflag) = (check_args(3, @_))[0,1]; # ignore depth argument - if (!$startflag) - { return; } - - my $ref_content = $he->content; - if (!defined $ref_content) - { return; } - my $i = 0; - while ($i < scalar(@{$ref_content})-1) - { my $p1 = $ {$ref_content}[$i]; - if ((ref $p1) && ($p1->tag eq "p") - && has_single_content_with_tag($p1, "dl")) - { my $dl1 = $ {$p1->content}[0]; - # In this loop, rhs, not lhs, of < comparison changes, - # because we are removing elements from the content of $he. - while ($i < scalar(@{$ref_content})-1) - { my $p2 = $ {$ref_content}[$i+1]; - if (!((ref $p2) && ($p2->tag eq "p") - && has_single_content_with_tag($p2, "dl"))) - { last; } - # Merge these two elements. - splice(@{$ref_content}, $i+1, 1); # remove $p2 - my $dl2 = $ {$p2->content}[0]; - $dl1->push_content(@{$dl2->content}); # put $dl2's content in $dl1 - } - # extra increment because next element isn't a candidate for $p1 - $i++; } - $i++; } - return 1; -} - - - -########################################################################### -### Testing -### - -sub test ( $$ ) -{ my ($action, $file) = check_args(2, @_); - - # General testing - if (($action eq "view") || ($action eq "")) - { # # $file = "/homes/gws/mernst/www/links.html"; - # # $file = "/homes/gws/mernst/www/index.html"; - # # $file = "/homes/fish/mernst/java/gud/doc/manual.html"; - # # $file = "/projects/cecil/cecil/doc/manuals/stdlib-man/stdlib/stdlib.html"; - # # $file = "/homes/fish/mernst/tmp/python-doc/html/index.html"; - # $file = "/homes/fish/mernst/tmp/python-doc/html/api/complexObjects.html"; - my $tree = file_to_tree($file); - - ## Testing - # print STDERR $tree->as_HTML; - $tree->dump(); - - # print STDERR $tree->tag(), "\n"; - # print STDERR @{$tree->content()}, "\n"; - # - # for (@{ $tree->extract_links(qw(a img)) }) { - # my ($link, $linkelem) = @$_; - # print STDERR "$link ", $linkelem->as_HTML; - # } - # - # print STDERR @{$tree->extract_links()}, "\n"; - - # my @top_level_elts = @{$tree->content()}; - - # if scalar(@{$tree->content()}) - return; - } - - elsif ($action eq "raw") - { my $tree = new HTML::TreeBuilder; - $tree->ignore_unknown(1); - # $tree->warn(1); - $tree->parse_file($file); - - $tree->dump(); - - # cleanup_parse_tree($tree); - # $tree->dump(); - return; - } - - # Test dealing with a section. - elsif ($action eq "section") - { # my $file; - # $file = "/homes/fish/mernst/tmp/python-doc/html/api/intro.html"; - # $file = "/homes/fish/mernst/tmp/python-doc/html/api/includes.html"; - # $file = "/homes/fish/mernst/tmp/python-doc/html/api/complexObjects.html"; - process_section_file($file, 0, "Title"); - } - - # Test dealing with many sections - elsif (0) - { my @files = ("/homes/fish/mernst/tmp/python-doc/html/api/about.html", - "/homes/fish/mernst/tmp/python-doc/html/api/abstract.html", - "/homes/fish/mernst/tmp/python-doc/html/api/api.html", - "/homes/fish/mernst/tmp/python-doc/html/api/cObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/complexObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/concrete.html", - # "/homes/fish/mernst/tmp/python-doc/html/api/contents.html", - "/homes/fish/mernst/tmp/python-doc/html/api/countingRefs.html", - "/homes/fish/mernst/tmp/python-doc/html/api/debugging.html", - "/homes/fish/mernst/tmp/python-doc/html/api/dictObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/embedding.html", - "/homes/fish/mernst/tmp/python-doc/html/api/exceptionHandling.html", - "/homes/fish/mernst/tmp/python-doc/html/api/exceptions.html", - "/homes/fish/mernst/tmp/python-doc/html/api/fileObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/floatObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/front.html", - "/homes/fish/mernst/tmp/python-doc/html/api/fundamental.html", - # "/homes/fish/mernst/tmp/python-doc/html/api/genindex.html", - "/homes/fish/mernst/tmp/python-doc/html/api/importing.html", - "/homes/fish/mernst/tmp/python-doc/html/api/includes.html", - "/homes/fish/mernst/tmp/python-doc/html/api/index.html", - "/homes/fish/mernst/tmp/python-doc/html/api/initialization.html", - "/homes/fish/mernst/tmp/python-doc/html/api/intObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/intro.html", - "/homes/fish/mernst/tmp/python-doc/html/api/listObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/longObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/mapObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/mapping.html", - "/homes/fish/mernst/tmp/python-doc/html/api/newTypes.html", - "/homes/fish/mernst/tmp/python-doc/html/api/node24.html", - "/homes/fish/mernst/tmp/python-doc/html/api/noneObject.html", - "/homes/fish/mernst/tmp/python-doc/html/api/number.html", - "/homes/fish/mernst/tmp/python-doc/html/api/numericObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/object.html", - "/homes/fish/mernst/tmp/python-doc/html/api/objects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/os.html", - "/homes/fish/mernst/tmp/python-doc/html/api/otherObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/processControl.html", - "/homes/fish/mernst/tmp/python-doc/html/api/refcountDetails.html", - "/homes/fish/mernst/tmp/python-doc/html/api/refcounts.html", - "/homes/fish/mernst/tmp/python-doc/html/api/sequence.html", - "/homes/fish/mernst/tmp/python-doc/html/api/sequenceObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/standardExceptions.html", - "/homes/fish/mernst/tmp/python-doc/html/api/stringObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/threads.html", - "/homes/fish/mernst/tmp/python-doc/html/api/tupleObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/typeObjects.html", - "/homes/fish/mernst/tmp/python-doc/html/api/types.html", - "/homes/fish/mernst/tmp/python-doc/html/api/utilities.html", - "/homes/fish/mernst/tmp/python-doc/html/api/veryhigh.html"); - for my $file (@files) - { print STDERR "\n", "=" x 75, "\n", "$file:\n"; - process_section_file($file, 0, "Title"); - } - } - - # Test dealing with index. - elsif ($action eq "index") - { # my $file; - # $file = "/homes/fish/mernst/tmp/python-doc/html/api/genindex.html"; - - process_index_file($file, "\@cindex"); - print_index_info(); - } - - else - { die "Unrecognized action `$action'"; } -} - - -########################################################################### -### Main loop -### - -sub process_contents_file ( $ ) -{ my ($file) = check_args(1, @_); - - # could also use File::Basename - my $info_file = $file; - $info_file =~ s/(\/?index)?\.html$//; - if ($info_file eq "") - { chomp($info_file = `pwd`); } - $info_file =~ s/^.*\///; # not the most efficient way to remove dirs - - $html_directory = $file; - $html_directory =~ s/(\/|^)[^\/]+$/$1/; - - my $texi_file = "$info_file.texi"; - open(TEXI, ">$texi_file"); - - print TEXI "\\input texinfo \@c -*-texinfo-*-\n"; - print TEXI "\@c %**start of header\n"; - print TEXI "\@setfilename $info_file\n"; - - # 2. Summary Description and Copyright - # The "Summary Description and Copyright" segment describes the - # document and contains the copyright notice and copying permissions - # for the Info file. The segment must be enclosed between `@ifinfo' - # and `@end ifinfo' commands so that the formatters place it only in - # the Info file. - # - # The summary description and copyright segment does not appear in the - # printed document. - # - # @ifinfo - # This is a short example of a complete Texinfo file. - # - # Copyright @copyright{} 1990 Free Software Foundation, Inc. - # @end ifinfo - - - # 3. Title and Copyright - # The "Title and Copyright" segment contains the title and copyright - # pages and copying permissions for the printed manual. The segment - # must be enclosed between `@titlepage' and `@end titlepage' - # commands. The title and copyright page appear only in the printed - # manual. - # - # The titlepage segment does not appear in the Info file. - # - # @titlepage - # @sp 10 - # @comment The title is printed in a large font. - # @center @titlefont{Sample Title} - # - # @c The following two commands start the copyright page. - # @page - # @vskip 0pt plus 1filll - # Copyright @copyright{} 1990 Free Software Foundation, Inc. - # @end titlepage - - - # 4. `Top' Node and Master Menu - # The "Master Menu" contains a complete menu of all the nodes in the - # whole Info file. It appears only in the Info file, in the `Top' - # node. - # - # The `Top' node contains the master menu for the Info file. Since a - # printed manual uses a table of contents rather than a menu, the master - # menu appears only in the Info file. - # - # @node Top, First Chapter, , (dir) - # @comment node-name, next, previous, up - # - # @menu - # * First Chapter:: The first chapter is the - # only chapter in this sample. - # * Concept Index:: This index has two entries. - # @end menu - - - - $current_ref_tdf = [ "Top", 0, $ARGV[0] ]; - process_section_file($file, 0, "Top"); - while (scalar(@contents_list)) - { $current_ref_tdf = shift @contents_list; - process_section_file($ {$current_ref_tdf}[2], $ {$current_ref_tdf}[1], $ {$current_ref_tdf}[0]); - } - - print TEXI "\n"; - for my $indextitle (@index_titles) - { print TEXI "\@node $indextitle\n"; - print TEXI "\@unnumbered $indextitle\n"; - print TEXI "\@printindex $ {$index_info{$indextitle}}[1]\n"; - print TEXI "\n"; } - - print TEXI "\@contents\n"; - print TEXI "\@bye\n"; - close(TEXI); -} - -# This needs to be last so global variable initializations are reached. - -if (scalar(@ARGV) == 0) -{ die "No arguments supplied to html2texi.pl"; } - -if ($ARGV[0] eq "-test") -{ my @test_args = @ARGV[1..$#ARGV]; - if (scalar(@test_args) == 0) - { test("", "index.html"); } - elsif (scalar(@test_args) == 1) - { test("", $test_args[0]); } - elsif (scalar(@test_args) == 2) - { test($test_args[0], $test_args[1]); } - else - { die "Too many test arguments passed to html2texi: ", join(" ", @ARGV); } - exit(); -} - -if (scalar(@ARGV) != 1) -{ die "Pass one argument, the main/contents page"; } - -process_contents_file($ARGV[0]); - -# end of html2texi.pl diff --git a/doc/tools/indfix.py b/doc/tools/indfix.py deleted file mode 100755 index 38f95bc..0000000 --- a/doc/tools/indfix.py +++ /dev/null @@ -1,101 +0,0 @@ -#! /usr/bin/env python - -"""Combine similar index entries into an entry and subentries. - -For example: - - \item {foobar} (in module flotz), 23 - \item {foobar} (in module whackit), 4323 - -becomes - - \item {foobar} - \subitem in module flotz, 23 - \subitem in module whackit, 4323 - -Note that an item which matches the format of a collapsable item but which -isn't part of a group of similar items is not modified. -""" -__version__ = '$Revision: 1.1.1.1 $' - -import re -import string -import StringIO -import sys - - -def cmp_entries(e1, e2, lower=string.lower): - return cmp(lower(e1[1]), lower(e2[1])) or cmp(e1, e2) - - -def dump_entries(write, entries): - if len(entries) == 1: - write(" \\item %s (%s)%s\n" % entries[0]) - return - write(" \item %s\n" % entries[0][0]) - # now sort these in a case insensitive manner: - if len(entries) > 0: - entries.sort(cmp_entries) - for xxx, subitem, pages in entries: - write(" \subitem %s%s\n" % (subitem, pages)) - - -breakable_re = re.compile( - r" \\item (.*) [(](.*)[)]((?:(?:, \d+)|(?:, \\[a-z]*\{\d+\}))+)") - - -def process(ifn, ofn=None): - if ifn == "-": - ifp = sys.stdin - else: - ifp = open(ifn) - if ofn is None: - ofn = ifn - ofp = StringIO.StringIO() - entries = [] - match = breakable_re.match - write = ofp.write - while 1: - line = ifp.readline() - if not line: - break - m = match(line) - if m: - entry = m.group(1, 2, 3) - if entries and entries[-1][0] != entry[0]: - dump_entries(write, entries) - entries = [] - entries.append(entry) - elif entries: - dump_entries(write, entries) - entries = [] - write(line) - else: - write(line) - del write - del match - ifp.close() - data = ofp.getvalue() - ofp.close() - if ofn == "-": - ofp = sys.stdout - else: - ofp = open(ofn, "w") - ofp.write(data) - ofp.close() - - -def main(): - import getopt - outfile = None - opts, args = getopt.getopt(sys.argv[1:], "o:") - for opt, val in opts: - if opt in ("-o", "--output"): - outfile = val - filename = args[0] - outfile = outfile or filename - process(filename, outfile) - - -if __name__ == "__main__": - main() diff --git a/doc/tools/info/Makefile b/doc/tools/info/Makefile deleted file mode 100644 index 24d6057..0000000 --- a/doc/tools/info/Makefile +++ /dev/null @@ -1,73 +0,0 @@ -# Generate the Python "info" documentation. - -TOPDIR=.. -TOOLSDIR=$(TOPDIR)/tools -HTMLDIR=$(TOPDIR)/html - -MKINFO=$(TOOLSDIR)/mkinfo -SCRIPTS=$(TOOLSDIR)/html2texi.pl $(TOOLSDIR)/checkargs.pm $(TOOLSDIR)/mkinfo \ - $(TOOLSDIR)/fixinfo.el - -all: python-api.info python-ext.info python-lib.info \ - python-ref.info python-tut.info \ - python-dist.info python-inst.info - - -python-api.info: $(HTMLDIR)/api/api.html $(SCRIPTS) - $(MKINFO) $< - -python-ext.info: $(HTMLDIR)/ext/ext.html $(SCRIPTS) - $(MKINFO) $< - -python-lib.info: $(HTMLDIR)/lib/lib.html $(SCRIPTS) - $(MKINFO) $< - -# Not built by default; the conversion doesn't really handle it well. -python-mac.info: $(HTMLDIR)/mac/mac.html $(SCRIPTS) - $(MKINFO) $< - -python-ref.info: $(HTMLDIR)/ref/ref.html $(SCRIPTS) - $(MKINFO) $< - -python-tut.info: $(HTMLDIR)/tut/tut.html $(SCRIPTS) - $(MKINFO) $< - -python-dist.info: $(HTMLDIR)/dist/dist.html $(SCRIPTS) - $(MKINFO) $< - -python-inst.info: $(HTMLDIR)/inst/inst.html $(SCRIPTS) - $(MKINFO) $< - -clean: - rm -f *.texi~ *.texi - -clobber: clean - rm -f *.texi python-*.info python-*.info-[0-9]* - - -# This makes sure we can build info files from a "clean" tree, -# in case we haven't already built the HTML: - -$(HTMLDIR)/api/api.html: - (cd $(HTMLDIR); $(MAKE) api) - -$(HTMLDIR)/ext/ext.html: - (cd $(HTMLDIR); $(MAKE) ext) - -$(HTMLDIR)/lib/lib.html: - (cd $(HTMLDIR); $(MAKE) lib) - -$(HTMLDIR)/mac/mac.html: - (cd $(HTMLDIR); $(MAKE) mac) - -$(HTMLDIR)/ref/ref.html: - (cd $(HTMLDIR); $(MAKE) ref) - -$(HTMLDIR)/tut/tut.html: - (cd $(HTMLDIR); $(MAKE) tut) - -$(HTMLDIR)/dist/dist.html: - (cd $(HTMLDIR); $(MAKE) dist) - -$(HTMLDIR)/inst/inst.html: - (cd $(HTMLDIR); $(MAKE) inst) diff --git a/doc/tools/info/README b/doc/tools/info/README deleted file mode 100644 index 8e49a99..0000000 --- a/doc/tools/info/README +++ /dev/null @@ -1,21 +0,0 @@ -This archive contains the standard Python documentation in GNU info -format. Five manuals are included: - - python-ref.info* Python Reference Manual - python-mac.info* Python Macintosh Modules - python-lib.info* Python Library Reference - python-ext.info* Extending and Embedding the Python Interpreter - python-api.info* Python/C API Reference - python-tut.info* Python Tutorial - -The file python.dir is a fragment of a "dir" file that can be used to -incorporate these documents into an existing GNU info installation: -insert the contents of this file into the "dir" or "localdir" file at -an appropriate point and copy the python-*.info* files to the same -directory. - -Thanks go to Milan Zamazal <pdm@freesoft.cz> for providing this -conversion to the info format. - -Questions and comments on these documents should be directed to -python-docs@python.org. diff --git a/doc/tools/info/python.dir b/doc/tools/info/python.dir deleted file mode 100644 index 60e3e3a..0000000 --- a/doc/tools/info/python.dir +++ /dev/null @@ -1,9 +0,0 @@ - -Python Standard Documentation - -* Python Library: (python-lib). Python Library Reference -* Python Mac Modules: (python-mac). Python Macintosh Modules -* Python Reference: (python-ref). Python Reference Manual -* Python API: (python-api). Python/C API Reference Manual -* Python Extending: (python-ext). Extending & Embedding Python -* Python Tutorial: (python-tut). Python Tutorial diff --git a/doc/tools/keywords.py b/doc/tools/keywords.py deleted file mode 100644 index 6da352a..0000000 --- a/doc/tools/keywords.py +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env python - -# This Python program sorts and reformats the table of keywords in ref2.tex - -import string -l = [] -try: - while 1: - l = l + string.split(raw_input()) -except EOFError: - pass -l.sort() -for x in l[:]: - while l.count(x) > 1: l.remove(x) -ncols = 5 -nrows = (len(l)+ncols-1)/ncols -for i in range(nrows): - for j in range(i, len(l), nrows): - print string.ljust(l[j], 10), - print diff --git a/doc/tools/listmodules b/doc/tools/listmodules deleted file mode 100755 index 7ac90a8..0000000 --- a/doc/tools/listmodules +++ /dev/null @@ -1,183 +0,0 @@ -#! /usr/bin/env python -# -*- Python -*- -# -# This script can be used to identify undocumented modules in the Python -# standard library. Use it like this: -# -# .../Doc/tools/listmodules --ignore-from .../Doc/paper-<paper>/modlib.idx - -"""%(program)s - list modules in the Python standard library - --a, --annotate Annotate the module names with the subdirectory they - live in --c, --categorize Group the modules by subdirectory --i <file>, - ---ignore-from <file> Ignore the modules listed in <file>. <file> may - contain a list of module names or a module index file - as produced when formatting the Python documentation - (.idx or .html flavor). - -If neither -a nor -c are given, the modules are listed in alphabetical -order. - -Note that -a and -c are mutually exclusive. - -Limitation: Modules loadable as shared objects may not be listed, -though this script attempts to locate such modules. - -""" - -__version__ = '$Revision: 1.1.1.1 $' - -import getopt -import glob -import os -import re -import string -import sys - - -REMOVE_DIRS = ["dos-8x3", "encodings", "distutils", - "lib-old", "lib-stdwin", "test"] - - -def main(): - args = sys.argv[1:] - annotate = 0 - builtin = 0 - categorize = 0 - ignore_dict = {} - ignore = ignore_dict.has_key - try: - opts, args = getopt.getopt( - args, "abchi:", - ["annotate", "built-in", "categorize", "help", "ignore-from="]) - except getopt.error, msg: - sys.stdout = sys.stderr - print msg - print - usage() - sys.exit(2) - for opt, arg in opts: - if opt in ("-a", "--annotate"): - annotate = 1 - elif opt in ("-b", "--built-in"): - builtin = 1 - elif opt in ("-c", "--categorize"): - categorize = 1 - elif opt in ("-h", "--help"): - usage() - sys.exit() - elif opt in ("-i", "--ignore-from"): - data = open(arg).read() - if data[:1] == "\\": - ignore_from_idx(data, ignore_dict) - else: - ignore_from_modulelist(data, ignore_dict) - if args or (annotate and categorize): - usage() - sys.exit(2) - # - # Populate the database: - # - srcdir = os.path.normpath(os.path.join( - os.path.dirname(sys.argv[0]), os.pardir, os.pardir)) - os.chdir(srcdir) - modules_by_name = {} - modules_by_dir = {} - if builtin: - l = [] - modules_by_dir["<builtin>"] = l - for name in sys.builtin_module_names: - if not ignore(name): - modules_by_name[name] = "<built-in>" - l.append(name) - rx = re.compile("Lib/plat-[a-zA-Z0-9]*/") - fp = os.popen("find Lib -name \*.py -print", "r") - while 1: - line = fp.readline() - if not line: - break - m = rx.match(line) - if m: - line = "Lib/plat-*/" + line[m.end():] - line = line[4:-4] # strip off 'Lib/' and '.py\n' - dir, name = os.path.split(line) - dir = dir or "<standard>" - if ignore(name): - continue - if dir not in REMOVE_DIRS: - modules_by_name[name] = dir - l = modules_by_dir.get(dir, []) - modules_by_dir[dir] = l - if name not in l: - l.append(name) - # load up extension modules: - pwd = os.getcwd() - try: - os.chdir("Modules") - dir = "<extension>" - for line in glob.glob("*module.c"): - name = line[:-8] - if ignore(name) or modules_by_name.has_key(name) or name == "xx": - continue - modules_by_name[name] = dir - l = modules_by_dir.get(dir, []) - modules_by_dir[dir] = l - if name not in l: - l.append(name) - finally: - os.chdir(pwd) - # - # Dump the results: - # - if annotate: - modules = modules_by_name.items() - modules.sort() - width = max(map(len, modules_by_name.keys())) - format = "%%-%ds %%s" % width - for name, dir in modules: - if dir and dir[0] != "<": - print format % (name, dir) - else: - print name - elif categorize: - modules = modules_by_dir.items() - modules.sort() - width = max(map(len, modules_by_dir.keys())) - format = "%%-%ds %%s" % width - for dir, names in modules: - names.sort() - print format % (dir, names[0]) - for name in names[1:]: - print format % ('', name) - print - else: - modules = modules_by_name.keys() - modules.sort() - print string.join(modules, "\n") - - -def ignore_from_modulelist(data, ignore_dict): - for name in string.split(data): - ignore_dict[name] = name - -def ignore_from_idx(data, ignore_dict): - data = string.replace(data, r"\hackscore {}", "_") - rx = re.compile(r"\\indexentry\s*{([^@]*)@") - for line in string.split(data, "\n"): - m = rx.match(line) - if m: - name = m.group(1) - ignore_dict[name] = name - - -def usage(): - vars = {} - vars["program"] = os.path.basename(sys.argv[0]) - print __doc__ % vars - - -if __name__ == "__main__": - main() diff --git a/doc/tools/mkackshtml b/doc/tools/mkackshtml deleted file mode 100755 index 917b303..0000000 --- a/doc/tools/mkackshtml +++ /dev/null @@ -1,65 +0,0 @@ -#! /usr/bin/env python -# -*- Python -*- - -import string -import support -import sys - - -def collect(fp): - names = [] - while 1: - line = fp.readline() - if not line: - break - line = string.strip(line) - if line: - names.append(line) - else: - names = [] - return names - - -def main(): - options = support.Options() - options.columns = 4 - options.variables["title"] = "Acknowledgements" - options.parse(sys.argv[1:]) - names = collect(sys.stdin) - percol = (len(names) + options.columns - 1) / options.columns - colnums = [] - for i in range(options.columns): - colnums.append(percol*i) - fp = options.get_output_file() - fp.write(string.rstrip(options.get_header()) + "\n") - fp.write(THANKS + "\n") - fp.write('<table width="100%" align="center">\n') - for i in range(percol): - fp.write(" <tr>\n") - for j in colnums: - try: - fp.write(" <td>%s</td>\n" % names[i + j]) - except IndexError: - pass - fp.write(" </tr>\n") - fp.write("</table>\n") - fp.write(string.rstrip(options.get_footer()) + "\n") - fp.close() - -THANKS = '''\ - -<p>These people have contributed in some way to the Python -documentation. This list is probably not complete -- if you feel that -you or anyone else should be on this list, please let us know (send -email to <a -href="mailto:python-docs@python.org">python-docs@python.org</a>), and -we will be glad to correct the problem.</p> - -<p>It is only with the input and contributions of the Python community -that Python has such wonderful documentation -- <b>Thank You!</b></p> - -''' - - -if __name__ == "__main__": - main() diff --git a/doc/tools/mkhowto b/doc/tools/mkhowto deleted file mode 100755 index feeb093..0000000 --- a/doc/tools/mkhowto +++ /dev/null @@ -1,597 +0,0 @@ -#! /usr/bin/env python -# -*- Python -*- -"""usage: %(program)s [options...] file ... - -Options specifying formats to build: - --html HyperText Markup Language (default) - --pdf Portable Document Format - --ps PostScript - --dvi 'DeVice Indepentent' format from TeX - --text ASCII text (requires lynx) - - More than one output format may be specified, or --all. - -HTML options: - --address, -a Specify an address for page footers. - --link Specify the number of levels to include on each page. - --split, -s Specify a section level for page splitting, default: %(max_split_depth)s. - --iconserver, -i Specify location of icons (default: ../). - --image-type Specify the image type to use in HTML output; - values: gif (default), png. - --numeric Don't rename the HTML files; just keep node#.html for - the filenames. - --style Specify the CSS file to use for the output (filename, - not a URL). - --up-link URL to a parent document. - --up-title Title of a parent document. - -Other options: - --a4 Format for A4 paper. - --letter Format for US letter paper (the default). - --help, -H Show this text. - --logging, -l Log stdout and stderr to a file (*.how). - --debugging, -D Echo commands as they are executed. - --keep, -k Keep temporary files around. - --quiet, -q Do not print command output to stdout. - (stderr is also lost, sorry; see *.how for errors) -""" - -import getopt -import glob -import os -import re -import shutil -import string -import sys -import tempfile - - -MYDIR = os.path.abspath(sys.path[0]) - -ISTFILE = os.path.join(MYDIR, "texinputs", "python.ist") -NODE2LABEL_SCRIPT = os.path.join(MYDIR, "node2label.pl") -L2H_INIT_FILE = os.path.join(MYDIR, "perl", "l2hinit.perl") - -BIBTEX_BINARY = "bibtex" -DVIPS_BINARY = "dvips" -LATEX_BINARY = "latex" -LATEX2HTML_BINARY = "latex2html" -LYNX_BINARY = "lynx" -MAKEINDEX_BINARY = "makeindex" -PDFLATEX_BINARY = "pdflatex" -PERL_BINARY = "perl" -PYTHON_BINARY = "python" - - -def usage(options): - print __doc__ % options - -def error(options, message, err=2): - sys.stdout = sys.stderr - print message - print - usage(options) - sys.exit(2) - - -class Options: - program = os.path.basename(sys.argv[0]) - # - address = '' - builddir = None - debugging = 0 - discard_temps = 1 - have_temps = 0 - icon_server = None - image_type = "gif" - logging = 0 - max_link_depth = 3 - max_split_depth = 6 - paper = "letter" - quiet = 0 - runs = 0 - numeric = 0 - global_module_index = None - style_file = os.path.join(MYDIR, "html", "style.css") - about_file = os.path.join(MYDIR, "html", "about.dat") - up_link = None - up_title = None - # - DEFAULT_FORMATS = ("html",) - ALL_FORMATS = ("dvi", "html", "pdf", "ps", "text") - - def __init__(self): - self.formats = [] - self.l2h_init_files = [] - - def __getitem__(self, key): - # This is used when formatting the usage message. - try: - return getattr(self, key) - except AttributeError: - raise KeyError, key - - def parse(self, args): - opts, args = getopt.getopt(args, "Hi:a:s:lDkqr:", - ["all", "postscript", "help", "iconserver=", - "address=", "a4", "letter", "l2h-init=", - "link=", "split=", "logging", "debugging", - "keep", "quiet", "runs=", "image-type=", - "about=", "numeric", "style=", "paper=", - "up-link=", "up-title=", "dir=", - "global-module-index="] - + list(self.ALL_FORMATS)) - for opt, arg in opts: - if opt == "--all": - self.formats = list(self.ALL_FORMATS) - elif opt in ("-H", "--help"): - usage(self) - sys.exit() - elif opt == "--iconserver": - self.icon_server = arg - elif opt in ("-a", "--address"): - self.address = arg - elif opt == "--a4": - self.paper = "a4" - elif opt == "--letter": - self.paper = "letter" - elif opt == "--link": - self.max_link_depth = int(arg) - elif opt in ("-s", "--split"): - self.max_split_depth = int(arg) - elif opt in ("-l", "--logging"): - self.logging = self.logging + 1 - elif opt in ("-D", "--debugging"): - self.debugging = self.debugging + 1 - elif opt in ("-k", "--keep"): - self.discard_temps = 0 - elif opt in ("-q", "--quiet"): - self.quiet = 1 - elif opt in ("-r", "--runs"): - self.runs = int(arg) - elif opt == "--image-type": - self.image_type = arg - elif opt == "--about": - # always make this absolute: - self.about_file = os.path.normpath( - os.path.abspath(arg)) - elif opt == "--numeric": - self.numeric = 1 - elif opt == "--style": - self.style_file = os.path.abspath(arg) - elif opt == "--l2h-init": - self.l2h_init_files.append(os.path.abspath(arg)) - elif opt == "--up-link": - self.up_link = arg - elif opt == "--up-title": - self.up_title = arg - elif opt == "--global-module-index": - self.global_module_index = arg - elif opt == "--dir": - self.builddir = arg - elif opt == "--paper": - self.paper = arg - # - # Format specifiers: - # - elif opt[2:] in self.ALL_FORMATS: - self.add_format(opt[2:]) - elif opt == "--postscript": - # synonym for --ps - self.add_format("ps") - self.initialize() - # - # return the args to allow the caller access: - # - return args - - def add_format(self, format): - """Add a format to the formats list if not present.""" - if not format in self.formats: - self.formats.append(format) - - def initialize(self): - """Complete initialization. This is needed if parse() isn't used.""" - # add the default format if no formats were specified: - if not self.formats: - self.formats = self.DEFAULT_FORMATS - # determine the base set of texinputs directories: - texinputs = string.split(os.environ.get("TEXINPUTS", ""), os.pathsep) - if not texinputs: - texinputs = [''] - self.base_texinputs = [ - os.path.join(MYDIR, "paper-" + self.paper), - os.path.join(MYDIR, "texinputs"), - ] + texinputs - - -class Job: - latex_runs = 0 - - def __init__(self, options, path): - self.options = options - self.doctype = get_doctype(path) - self.filedir, self.doc = split_pathname(path) - self.log_filename = self.doc + ".how" - if os.path.exists(self.log_filename): - os.unlink(self.log_filename) - if os.path.exists(self.doc + ".l2h"): - self.l2h_aux_init_file = tempfile.mktemp() - else: - self.l2h_aux_init_file = self.doc + ".l2h" - self.write_l2h_aux_init_file() - - def build(self): - self.setup_texinputs() - formats = self.options.formats - if "dvi" in formats or "ps" in formats: - self.build_dvi() - if "pdf" in formats: - self.build_pdf() - if "ps" in formats: - self.build_ps() - if "html" in formats: - self.require_temps() - self.build_html(self.options.builddir or self.doc) - if self.options.icon_server == ".": - pattern = os.path.join(MYDIR, "html", "icons", - "*." + self.options.image_type) - imgs = glob.glob(pattern) - if not imgs: - self.warning( - "Could not locate support images of type %s." - % `self.options.image_type`) - for fn in imgs: - new_fn = os.path.join(self.doc, os.path.basename(fn)) - shutil.copyfile(fn, new_fn) - if "text" in formats: - self.require_temps() - tempdir = self.doc - need_html = "html" not in formats - if self.options.max_split_depth != 1: - fp = open(self.l2h_aux_init_file, "a") - fp.write("# re-hack this file for --text:\n") - l2hoption(fp, "MAX_SPLIT_DEPTH", "1") - fp.write("1;\n") - fp.close() - tempdir = self.doc + "-temp-html" - need_html = 1 - if need_html: - self.build_html(tempdir, max_split_depth=1) - self.build_text(tempdir) - if self.options.discard_temps: - self.cleanup() - - def setup_texinputs(self): - texinputs = [self.filedir] + list(self.options.base_texinputs) - os.environ["TEXINPUTS"] = string.join(['.']+texinputs, os.pathsep) - self.message("TEXINPUTS=" + os.environ["TEXINPUTS"]) - - def build_aux(self, binary=None): - if binary is None: - binary = LATEX_BINARY - new_index( "%s.ind" % self.doc, "genindex") - new_index("mod%s.ind" % self.doc, "modindex") - self.run("%s %s" % (binary, self.doc)) - self.use_bibtex = check_for_bibtex(self.doc + ".aux") - self.latex_runs = 1 - - def build_dvi(self): - self.use_latex(LATEX_BINARY) - - def build_pdf(self): - self.use_latex(PDFLATEX_BINARY) - - def use_latex(self, binary): - self.require_temps(binary=binary) - if self.latex_runs < 2: - if os.path.isfile("mod%s.idx" % self.doc): - self.run("%s mod%s.idx" % (MAKEINDEX_BINARY, self.doc)) - use_indfix = 0 - if os.path.isfile(self.doc + ".idx"): - use_indfix = 1 - # call to Doc/tools/fix_hack omitted; doesn't appear necessary - self.run("%s %s.idx" % (MAKEINDEX_BINARY, self.doc)) - import indfix - indfix.process(self.doc + ".ind") - if self.use_bibtex: - self.run("%s %s" % (BIBTEX_BINARY, self.doc)) - self.process_synopsis_files() - # - # let the doctype-specific handler do some intermediate work: - # - self.run("%s %s" % (binary, self.doc)) - self.latex_runs = self.latex_runs + 1 - if os.path.isfile("mod%s.idx" % self.doc): - self.run("%s -s %s mod%s.idx" - % (MAKEINDEX_BINARY, ISTFILE, self.doc)) - if use_indfix: - self.run("%s -s %s %s.idx" - % (MAKEINDEX_BINARY, ISTFILE, self.doc)) - indfix.process(self.doc + ".ind") - self.process_synopsis_files() - # - # and now finish it off: - # - if os.path.isfile(self.doc + ".toc") and binary == PDFLATEX_BINARY: - import toc2bkm - if self.doctype == "manual": - bigpart = "chapter" - else: - bigpart = "section" - toc2bkm.process(self.doc + ".toc", self.doc + ".bkm", bigpart) - if self.use_bibtex: - self.run("%s %s" % (BIBTEX_BINARY, self.doc)) - self.run("%s %s" % (binary, self.doc)) - self.latex_runs = self.latex_runs + 1 - - def process_synopsis_files(self): - synopsis_files = glob.glob(self.doc + "*.syn") - for path in synopsis_files: - uniqify_module_table(path) - - def build_ps(self): - self.run("%s -N0 -o %s.ps %s" % (DVIPS_BINARY, self.doc, self.doc)) - - def build_html(self, builddir=None, max_split_depth=None): - if builddir is None: - builddir = self.doc - if max_split_depth is None: - max_split_depth = self.options.max_split_depth - texfile = None - for p in string.split(os.environ["TEXINPUTS"], os.pathsep): - fn = os.path.join(p, self.doc + ".tex") - if os.path.isfile(fn): - texfile = fn - break - if not texfile: - self.warning("Could not locate %s.tex; aborting." % self.doc) - sys.exit(1) - # remove leading ./ (or equiv.); might avoid problems w/ dvips - if texfile[:2] == os.curdir + os.sep: - texfile = texfile[2:] - # build the command line and run LaTeX2HTML: - if not os.path.isdir(builddir): - os.mkdir(builddir) - else: - for fname in glob.glob(os.path.join(builddir, "*.html")): - os.unlink(fname) - args = [LATEX2HTML_BINARY, - "-init_file", self.l2h_aux_init_file, - "-dir", builddir, - texfile - ] - self.run(string.join(args)) # XXX need quoting! - # ... postprocess - shutil.copyfile(self.options.style_file, - os.path.join(builddir, self.doc + ".css")) - shutil.copyfile(os.path.join(builddir, self.doc + ".html"), - os.path.join(builddir, "index.html")) - if max_split_depth != 1: - if self.options.numeric: - label_file = os.path.join(builddir, "labels.pl") - fp = open(label_file) - about_node = None - target = " = q/about/;\n" - x = len(target) - while 1: - line = fp.readline() - if not line: - break - if line[-x:] == target: - line = fp.readline() - m = re.search(r"\|(node\d+\.[a-z]+)\|", line) - about_node = m.group(1) - shutil.copyfile(os.path.join(builddir, about_node), - os.path.join(builddir, "about.html")) - break - else: - pwd = os.getcwd() - try: - os.chdir(builddir) - self.run("%s %s *.html" % (PERL_BINARY, NODE2LABEL_SCRIPT)) - finally: - os.chdir(pwd) - - def build_text(self, tempdir=None): - if tempdir is None: - tempdir = self.doc - indexfile = os.path.join(tempdir, "index.html") - self.run("%s -nolist -dump %s >%s.txt" - % (LYNX_BINARY, indexfile, self.doc)) - - def require_temps(self, binary=None): - if not self.latex_runs: - self.build_aux(binary=binary) - - def write_l2h_aux_init_file(self): - options = self.options - fp = open(self.l2h_aux_init_file, "w") - d = string_to_perl(os.path.dirname(L2H_INIT_FILE)) - fp.write("package main;\n" - "push (@INC, '%s');\n" - "$mydir = '%s';\n" - % (d, d)) - fp.write(open(L2H_INIT_FILE).read()) - for filename in options.l2h_init_files: - fp.write("\n# initialization code incorporated from:\n# ") - fp.write(filename) - fp.write("\n") - fp.write(open(filename).read()) - fp.write("\n" - "# auxillary init file for latex2html\n" - "# generated by mkhowto\n" - "$NO_AUTO_LINK = 1;\n" - ) - l2hoption(fp, "ABOUT_FILE", options.about_file) - l2hoption(fp, "ICONSERVER", options.icon_server) - l2hoption(fp, "IMAGE_TYPE", options.image_type) - l2hoption(fp, "ADDRESS", options.address) - l2hoption(fp, "MAX_LINK_DEPTH", options.max_link_depth) - l2hoption(fp, "MAX_SPLIT_DEPTH", options.max_split_depth) - l2hoption(fp, "EXTERNAL_UP_LINK", options.up_link) - l2hoption(fp, "EXTERNAL_UP_TITLE", options.up_title) - l2hoption(fp, "GLOBAL_MODULE_INDEX", options.global_module_index) - fp.write("1;\n") - fp.close() - - def cleanup(self): - self.__have_temps = 0 - for pattern in ("%s.aux", "%s.log", "%s.out", "%s.toc", "%s.bkm", - "%s.idx", "%s.ilg", "%s.ind", "%s.pla", - "%s.bbl", "%s.blg", - "mod%s.idx", "mod%s.ind", "mod%s.ilg", - ): - safe_unlink(pattern % self.doc) - map(safe_unlink, glob.glob(self.doc + "*.syn")) - for spec in ("IMG*", "*.pl", "WARNINGS", "index.dat", "modindex.dat"): - pattern = os.path.join(self.doc, spec) - map(safe_unlink, glob.glob(pattern)) - if "dvi" not in self.options.formats: - safe_unlink(self.doc + ".dvi") - if os.path.isdir(self.doc + "-temp-html"): - shutil.rmtree(self.doc + "-temp-html", ignore_errors=1) - if not self.options.logging: - os.unlink(self.log_filename) - if not self.options.debugging: - os.unlink(self.l2h_aux_init_file) - - def run(self, command): - self.message(command) - rc = os.system("(%s) </dev/null >>%s 2>&1" - % (command, self.log_filename)) - if rc: - self.warning( - "Session transcript and error messages are in %s." - % self.log_filename) - sys.stderr.write("The relevant lines from the transcript are:\n") - sys.stderr.write("-" * 72 + "\n") - sys.stderr.writelines(get_run_transcript(self.log_filename)) - sys.exit(rc) - - def message(self, msg): - msg = "+++ " + msg - if not self.options.quiet: - print msg - self.log(msg + "\n") - - def warning(self, msg): - msg = "*** %s\n" % msg - sys.stderr.write(msg) - self.log(msg) - - def log(self, msg): - fp = open(self.log_filename, "a") - fp.write(msg) - fp.close() - - -def get_run_transcript(filename): - """Return lines from the transcript file for the most recent run() call.""" - fp = open(filename) - lines = fp.readlines() - fp.close() - lines.reverse() - L = [] - for line in lines: - L.append(line) - if line[:4] == "+++ ": - break - L.reverse() - return L - - -def safe_unlink(path): - """Unlink a file without raising an error if it doesn't exist.""" - try: - os.unlink(path) - except os.error: - pass - - -def split_pathname(path): - path = os.path.normpath(os.path.join(os.getcwd(), path)) - dirname, basename = os.path.split(path) - if basename[-4:] == ".tex": - basename = basename[:-4] - return dirname, basename - - -_doctype_rx = re.compile(r"\\documentclass(?:\[[^]]*\])?{([a-zA-Z]*)}") -def get_doctype(path): - fp = open(path) - doctype = None - while 1: - line = fp.readline() - if not line: - break - m = _doctype_rx.match(line) - if m: - doctype = m.group(1) - break - fp.close() - return doctype - - -def main(): - options = Options() - try: - args = options.parse(sys.argv[1:]) - except getopt.error, msg: - error(options, msg) - if not args: - # attempt to locate single .tex file in current directory: - args = glob.glob("*.tex") - if not args: - error(options, "No file to process.") - if len(args) > 1: - error(options, "Could not deduce which files should be processed.") - # - # parameters are processed, let's go! - # - for path in args: - Job(options, path).build() - - -def l2hoption(fp, option, value): - if value: - fp.write('$%s = "%s";\n' % (option, string_to_perl(str(value)))) - - -_to_perl = {} -for c in map(chr, range(1, 256)): - _to_perl[c] = c -_to_perl["@"] = "\\@" -_to_perl["$"] = "\\$" -_to_perl['"'] = '\\"' - -def string_to_perl(s): - return string.join(map(_to_perl.get, s), '') - - -def check_for_bibtex(filename): - fp = open(filename) - pos = string.find(fp.read(), r"\bibdata{") - fp.close() - return pos >= 0 - -def uniqify_module_table(filename): - lines = open(filename).readlines() - if len(lines) > 1: - if lines[-1] == lines[-2]: - del lines[-1] - open(filename, "w").writelines(lines) - - -def new_index(filename, label="genindex"): - fp = open(filename, "w") - fp.write(r"""\ -\begin{theindex} -\label{%s} -\end{theindex} -""" % label) - fp.close() - - -if __name__ == "__main__": - main() diff --git a/doc/tools/mkinfo b/doc/tools/mkinfo deleted file mode 100755 index edba1db..0000000 --- a/doc/tools/mkinfo +++ /dev/null @@ -1,48 +0,0 @@ -#! /bin/sh -# -*- Ksh -*- - -# Script to drive the HTML-info conversion process. -# Pass in a single parameter: the name of the top-level HTML file -# generated by LaTeX2HTML. -# -# Written by Fred L. Drake, Jr. <fdrake@acm.org> - -PERL=${PERL:-perl} -EMACS=${EMACS:-emacs} -MAKEINFO=${MAKEINFO:-makeinfo} - - -# Normalize file name since something called by html2texi.pl seems to -# screw up with relative path names. -FILENAME="$1" -DOCDIR=`dirname "$FILENAME"` -DOCFILE=`basename "$FILENAME"` -DOCNAME=`basename "$FILENAME" .html` - -# Now build the real directory names, and locate our support stuff: -WORKDIR=`pwd` -cd `dirname $0` -TOOLSDIR=`pwd` -cd $DOCDIR -DOCDIR=`pwd` -cd $WORKDIR - - -run() { - # show what we're doing, like make does: - echo "$*" - $* || exit $? -} - - -# generate the Texinfo file: - -run $PERL -I$TOOLSDIR $TOOLSDIR/html2texi.pl $DOCDIR/$DOCFILE -run $EMACS -batch -l $TOOLSDIR/fixinfo.el $DOCNAME.texi -rm -f $DOCNAME.texi~ - - -# generate the .info files: - -run $MAKEINFO --footnote-style end --fill-column 72 \ - --paragraph-indent 0 $DOCNAME.texi diff --git a/doc/tools/mkmodindex b/doc/tools/mkmodindex deleted file mode 100755 index 5f2da0e..0000000 --- a/doc/tools/mkmodindex +++ /dev/null @@ -1,136 +0,0 @@ -#! /usr/bin/env python -# -*- Python -*- - -"""usage: %(program)s [options] file... - -Supported options: - - --address addr - -a addr Set the address text to include at the end of the generated - HTML; this should be used for contact information. - --columns cols - -c cols Set the number of columns each index section should be - displayed in. The default is 1. - --help - -h Display this help message. - --letters - -l Split the output into sections by letter. - --output file - -o file Write output to 'file' instead of standard out. - --iconserver is Use 'is' as the directory containing icons for the - navigation bar. The default is 'icons'. - --title str Set the page title to 'str'. The default is 'Global - Module Index'. - --uplink url Set the upward link URL. The default is './'. - --uptitle str Set the upward link title. The default is 'Python - Documentation Index'. -""" -import buildindex -import os -import re -import string -import support -import sys - - -class IndexOptions(support.Options): - def __init__(self): - support.Options.__init__(self) - self.add_args("l", ["letters"]) - self.letters = 0 - - def handle_option(self, opt, val): - if opt in ("-l", "--letters"): - self.letters = 1 - - def usage(self): - program = os.path.basename(sys.argv[0]) - print __doc__ % {"program": program} - - -class Node(buildindex.Node): - annotation = "" - - def __init__(self, link, str, seqno): - parts = string.split(str, None, 1) - if parts[0][-5:] == "</tt>": - self.modname = parts[0][:-5] - else: - self.modname = parts[0] - if len(parts) == 2: - self.annotation = parts[1] - buildindex.Node.__init__(self, link, self.modname, seqno) - - def __str__(self): - return '<tt class="module">%s</tt> %s' \ - % (self.modname, self.annotation) - -_rx = re.compile( - "<dt><a href='(module-.*\.html)#l2h-\d+'><tt class='module'>" - "([a-zA-Z_][a-zA-Z0-9_.]*</tt>(\s*<em>" - "\(<span class='platform'>.*</span>\)</em>)?)</a>") - -def main(): - options = IndexOptions() - options.variables["title"] = "Global Module Index" - options.parse(sys.argv[1:]) - args = options.args - if not args: - args = ["-"] - # - # Collect the input data: - # - nodes = [] - seqno = 0 - has_plat_flag = 0 - for ifn in args: - if ifn == "-": - ifp = sys.stdin - dirname = '' - else: - ifp = open(ifn) - dirname = os.path.dirname(ifn) - while 1: - line = ifp.readline() - if not line: - break - m = _rx.match(line) - if m: - # This line specifies a module! - basename, modname = m.group(1, 2) - has_plat_flag = has_plat_flag or m.group(3) - linkfile = os.path.join(dirname, basename) - nodes.append(Node('<a href="%s">' % linkfile, modname, seqno)) - seqno = seqno + 1 - ifp.close() - # - # Generate all output: - # - num_nodes = len(nodes) - # Here's the HTML generation: - parts = [options.get_header(), - buildindex.process_nodes(nodes, options.columns, options.letters), - options.get_footer(), - ] - if has_plat_flag: - parts.insert(1, PLAT_DISCUSS) - html = string.join(parts, '') - program = os.path.basename(sys.argv[0]) - fp = options.get_output_file() - fp.write(string.rstrip(html) + "\n") - if options.outputfile == "-": - sys.stderr.write("%s: %d index nodes\n" % (program, num_nodes)) - else: - print - print "%s: %d index nodes" % (program, num_nodes) - - -PLAT_DISCUSS = """ -<p> Some module names are followed by an annotation indicating what -platform they are available on.</p> - -""" - - -if __name__ == "__main__": - main() diff --git a/doc/tools/mksourcepkg b/doc/tools/mksourcepkg deleted file mode 100755 index c3ea863..0000000 --- a/doc/tools/mksourcepkg +++ /dev/null @@ -1,163 +0,0 @@ -#! /usr/bin/env python -# -*- Python -*- - -"""%(program)s - script to create the latex source distribution - -usage: - %(program)s [-t|--tools] release [tag] - -with -t|--tools: doesn't include the documents, only the framework - -without [tag]: generate from the current version that's checked in - (*NOT* what's in the current directory!) - -with [tag]: generate from the named tag -""" -#* should be modified to get the Python version number automatically -# from the Makefile or someplace. - -import getopt -import glob -import os -import re -import shutil -import sys -import tempfile - -import cvsinfo - - -quiet = 0 -rx = re.compile(r":ext:(?:[a-zA-Z0-9]+)@cvs\.([a-zA-Z0-9]+).sourceforge.net:" - r"/cvsroot/\1") - - -def main(): - global quiet - try: - opts, args = getopt.getopt(sys.argv[1:], "abgtzq", - ["all", "bzip2", "gzip", "tools", "zip", - "quiet"]) - except getopt.error, e: - usage(warning=str(e)) - sys.exit(2) - if len(args) not in (1, 2): - usage(warning="wrong number of parameters") - sys.exit(2) - tools = 0 - formats = {} - for opt, arg in opts: - if opt in ("-t", "--tools"): - tools = 1 - elif opt in ("-q", "--quiet"): - quiet = quiet + 1 - elif opt in ("-b", "--bzip2"): - formats["bzip2"] = 1 - elif opt in ("-g", "--gzip"): - formats["gzip"] = 1 - elif opt in ("-z", "--zip"): - formats["zip"] = 1 - elif opt in ("-a", "--all"): - formats["bzip2"] = 1 - formats["gzip"] = 1 - formats["zip"] = 1 - if formats: - # make order human-predictable - formats = formats.keys() - formats.sort() - else: - formats = ["gzip"] - release = args[0] - cvstag = None - if len(args) > 1: - cvstag = args[1] - tempdir = tempfile.mktemp() - os.mkdir(tempdir) - pkgdir = os.path.join(tempdir, "Python-" + release) - os.mkdir(pkgdir) - pwd = os.getcwd() - mydir = os.path.abspath(os.path.dirname(sys.argv[0])) - info = cvsinfo.RepositoryInfo(mydir) - cvsroot = info.get_cvsroot() - m = rx.match(cvsroot) - if m: - # If this is an authenticated SourceForge repository, convert to - # anonymous usage for the export/checkout, since that avoids the - # SSH overhead. - group = m.group(1) - cvsroot = ":pserver:anonymous@cvs.%s.sourceforge.net:/cvsroot/%s" \ - % (group, group) - # For some reason, SourceForge/CVS doesn't seem to care that we - # might not have done a "cvs login" to the anonymous server. - # That avoids a lot of painful gunk here. - os.chdir(pkgdir) - if not quiet: - print "--- current directory is:", pkgdir - if cvstag: - run("cvs -d%s export -r %s -d Doc python/dist/src/Doc" - % (cvsroot, cvstag)) - else: - run("cvs -Q -d%s checkout -d Doc python/dist/src/Doc" % cvsroot) - # remove CVS directories - for p in ('*/CVS', '*/*/CVS', '*/*/*/CVS'): - map(shutil.rmtree, glob.glob(p)) - for f in ('.cvsignore', '*/.cvsignore'): - map(os.unlink, glob.glob(f)) - LICENSE = os.path.normpath( - os.path.join(mydir, os.pardir, os.pardir, "LICENSE")) - shutil.copyfile(LICENSE, "Doc/LICENSE") - if tools: - archive = "doctools-" + release - # we don't want the actual documents in this case: - for d in ("api", "dist", "doc", "ext", "inst", - "lib", "mac", "ref", "tut"): - shutil.rmtree(os.path.join(os.path.join(pkgdir, "Doc"), d)) - else: - archive = "latex-" + release - - # XXX should also remove the .cvsignore files at this point - - os.chdir(tempdir) - archive = os.path.join(pwd, archive) - for format in formats: - if format == "bzip2": - run("tar cf - Python-%s | bzip2 -9 >%s.tar.bz2" - % (release, archive)) - elif format == "gzip": - run("tar cf - Python-%s | gzip -9 >%s.tgz" - % (release, archive)) - elif format == "zip": - if os.path.exists(archive + ".zip"): - os.unlink(archive + ".zip") - run("zip -q -r9 %s.zip Python-%s" - % (archive, release)) - - # clean up the work area: - os.chdir(pwd) - shutil.rmtree(tempdir) - - -def run(cmd): - if quiet < 2: - print "+++", cmd - if quiet: - cmd = "%s >/dev/null" % cmd - rc = os.system(cmd) - if rc: - sys.exit(rc) - - -def usage(warning=None): - stdout = sys.stdout - sys.stdout = sys.stderr - program = os.path.basename(sys.argv[0]) - try: - if warning: - print "%s: %s\n" % (program, warning) - print __doc__ % {"program": program} - finally: - sys.stdout = stdout - - -if __name__ == "__main__": - main() diff --git a/doc/tools/node2label.pl b/doc/tools/node2label.pl deleted file mode 100755 index f3e6bd8..0000000 --- a/doc/tools/node2label.pl +++ /dev/null @@ -1,55 +0,0 @@ -#! /usr/bin/env perl - -use English; -$INPLACE_EDIT = ''; - -# read the labels, then reverse the mappings -require "labels.pl"; - -%nodes = (); -my $key; -# sort so that we get a consistent assignment for nodes with multiple labels -foreach $label (sort keys %external_labels) { - $key = $external_labels{$label}; - $key =~ s|^/||; - $nodes{$key} = $label; -} - -# This adds the "internal" labels added for indexing. These labels will not -# be used for file names. -require "internals.pl"; -foreach $label (keys %internal_labels) { - $key = $internal_labels{$label}; - $key =~ s|^/||; - if (defined($nodes{$key})) { - $nodes{$label} = $nodes{$key}; - } -} - -# collect labels that have been used -%newnames = (); - -while (<>) { - # don't want to do one s/// per line per node - # so look for lines with hrefs, then do s/// on nodes present - if (/(HREF|href)=[\"\']([^\#\"\']*)html[\#\"\']/) { - @parts = split(/(HREF|href)\=[\"\']/); - shift @parts; - for $node (@parts) { - $node =~ s/[\#\"\'].*$//g; - chop($node); - if (defined($nodes{$node})) { - $label = $nodes{$node}; - if (s/(HREF|href)=([\"\'])$node([\#\"\'])/href=$2$label.html$3/g) { - s/(HREF|href)=([\"\'])$label.html/href=$2$label.html/g; - $newnames{$node} = "$label.html"; - } - } - } - } - print; -} - -foreach $oldname (keys %newnames) { - rename($oldname, $newnames{$oldname}); -} diff --git a/doc/tools/paper-a4/pypaper.sty b/doc/tools/paper-a4/pypaper.sty deleted file mode 100644 index 10b22f8..0000000 --- a/doc/tools/paper-a4/pypaper.sty +++ /dev/null @@ -1,5 +0,0 @@ -% -% Change this to say a4paper instead of letterpaper if you want A4. -% -\newcommand{\py@paper}{a4paper} -\newcommand{\py@ptsize}{10pt} diff --git a/doc/tools/perl/SynopsisTable.pm b/doc/tools/perl/SynopsisTable.pm deleted file mode 100644 index 6a03dd2..0000000 --- a/doc/tools/perl/SynopsisTable.pm +++ /dev/null @@ -1,89 +0,0 @@ -package SynopsisTable; - -sub new{ - return bless {names=>'', info=>{}, file=>''}; -} - -sub declare{ - my($self,$name,$key,$type) = @_; - if ($self->{names}) { - $self->{names} .= ",$name"; - } - else { - $self->{names} .= "$name"; - } - $self->{info}{$name} = "$key,$type,"; -} - -# The 'file' attribute is used to store the filename of the node in which -# the table will be presented; this assumes that each table will be presented -# only once, which works for the current use of this object. - -sub set_file{ - my($self, $filename) = @_; - $self->{file} = "$filename"; -} - -sub get_file{ - my $self = shift; - return $self->{file}; -} - -sub set_synopsis{ - my($self,$name,$synopsis) = @_; - my($key,$type,$unused) = split ',', $self->{info}{$name}, 3; - $self->{info}{$name} = "$key,$type,$synopsis"; -} - -sub get{ - my($self,$name) = @_; - return split /,/, $self->{info}{$name}, 3; -} - -sub show{ - my $self = shift; - my $name; - print "names: ", $self->{names}, "\n\n"; - foreach $name (split /,/, $self->{names}) { - my($key,$type,$synopsis) = $self->get($name); - print "$name($key) is $type: $synopsis\n"; - } -} - -sub tohtml{ - my $self = shift; - my $data = "<table class='synopsistable'>\n"; - my $name; - foreach $name (split /,/, $self->{names}) { - my($key,$type,$synopsis) = $self->get($name); - my $link = "<a href='module-$key.html'>"; - $data .= (' <tr>' - . "<td><b><tt class='module'>$link$name</a></tt></b></td>\n" - . " <td class='synopsis'>$synopsis</td></tr>\n"); - } - $data .= "</table>\n"; - $data; -} - - -package testSynopsisTable; - -sub test{ - # this little test is mostly to debug the stuff above, since this is - # my first Perl "object". - my $st = SynopsisTable->new(); - $st->declare("sample", "sample", "standard"); - $st->set_synopsis("sample", "This is a little synopsis...."); - $st->declare("copy_reg", "copyreg", "standard"); - $st->set_synopsis("copy_reg", "pickle support stuff"); - $st->show(); - - print "\n\n"; - - my $st2 = SynopsisTable->new(); - $st2->declare("st2module", "st2module", "built-in"); - $st2->set_synopsis("st2module", "silly little synopsis"); - $st2->show(); -} - -1; # This must be the last line -- Perl is bogus! diff --git a/doc/tools/perl/distutils.perl b/doc/tools/perl/distutils.perl deleted file mode 100644 index ab524bb..0000000 --- a/doc/tools/perl/distutils.perl +++ /dev/null @@ -1,21 +0,0 @@ -# LaTeX2HTML support for distutils.sty. - -package main; - -sub do_cmd_command { - return use_wrappers(@_[0], '<code>', '</code>'); -} - -sub do_cmd_option { - return use_wrappers(@_[0], '<font face="sans-serif">', '</font>'); -} - -sub do_cmd_filevar { - return use_wrappers(@_[0], '<font face="sans-serif"></i>', '</i></font>'); -} - -sub do_cmd_XXX { - return use_wrappers(@_[0], '<b>** ', ' **</b>'); -} - -1; diff --git a/doc/tools/perl/howto.perl b/doc/tools/perl/howto.perl deleted file mode 100644 index 76791eb..0000000 --- a/doc/tools/perl/howto.perl +++ /dev/null @@ -1,12 +0,0 @@ -# -*- perl -*- -# -# This implements the Python howto class. All it really needs to do it -# load the "python" style. - -package main; - -do_require_package("article"); -do_require_package("alltt"); -do_require_package("python"); - -1; # sheesh.... diff --git a/doc/tools/perl/l2hinit.perl b/doc/tools/perl/l2hinit.perl deleted file mode 100644 index d3720d9..0000000 --- a/doc/tools/perl/l2hinit.perl +++ /dev/null @@ -1,594 +0,0 @@ -# LaTeX2HTML support base for use with Python documentation. - -package main; - -use L2hos; - -$HTML_VERSION = 4.0; - -$MAX_LINK_DEPTH = 2; -$ADDRESS = ''; - -$NO_FOOTNODE = 1; -$NUMBERED_FOOTNOTES = 1; - -# Python documentation uses section numbers to support references to match -# in the printed and online versions. -# -$SHOW_SECTION_NUMBERS = 1; - -$ICONSERVER = '../icons'; -$IMAGE_TYPE = 'gif'; - -# Control where the navigation bars should show up: -$TOP_NAVIGATION = 1; -$BOTTOM_NAVIGATION = 1; -$AUTO_NAVIGATION = 0; - -$BODYTEXT = ''; -$CHILDLINE = "\n<p><hr>\n"; -$VERBOSITY = 0; - -# default # of columns for the indexes -$INDEX_COLUMNS = 2; -$MODULE_INDEX_COLUMNS = 4; - - -# A little painful, but lets us clean up the top level directory a little, -# and not be tied to the current directory (as far as I can tell). Testing -# an existing definition of $mydir is needed since it cannot be computed when -# run under mkhowto with recent versions of LaTeX2HTML, since this file is -# not read directly by LaTeX2HTML any more. mkhowto is required to prepend -# the required definition at the top of the actual input file. -# -if (!defined $mydir) { - use Cwd; - use File::Basename; - ($myname, $mydir, $myext) = fileparse(__FILE__, '\..*'); - chop $mydir; # remove trailing '/' - $mydir = getcwd() . "$dd$mydir" - unless $mydir =~ s|^/|/|; -} -$LATEX2HTMLSTYLES = "$mydir$envkey$LATEX2HTMLSTYLES"; -push (@INC, $mydir); - -($myrootname, $myrootdir, $myext) = fileparse($mydir, '\..*'); -chop $myrootdir; - - -# Hackish way to get the appropriate paper-*/ directory into $TEXINPUTS; -# pass in the paper size (a4 or letter) as the environment variable PAPER -# to add the right directory. If not given, the current directory is -# added instead for use with HOWTO processing. -# -if (defined $ENV{'PAPER'}) { - $mytexinputs = "$myrootdir${dd}paper-$ENV{'PAPER'}$envkey"; -} -else { - $mytexinputs = getcwd() . $envkey; -} -$mytexinputs .= "$myrootdir${dd}texinputs"; - - -# Change this variable to change the text added in "About this document..."; -# this should be an absolute pathname to get it right. -# -$ABOUT_FILE = "$myrootdir${dd}html${dd}stdabout.dat"; - - -sub custom_driver_hook { - # - # This adds the directory of the main input file to $TEXINPUTS; it - # seems to be sufficiently general that it should be fine for HOWTO - # processing. - # - my $file = @_[0]; - my($jobname, $dir, $ext) = fileparse($file, '\..*'); - $dir = L2hos->Make_directory_absolute($dir); - $dir =~ s/$dd$//; - $TEXINPUTS = "$dir$envkey$mytexinputs"; - print "\nAdding $dir to \$TEXINPUTS\n"; -} - - -$CUSTOM_BUTTONS = ''; - -sub make_nav_sectref { - my($label,$title) = @_; - if ($title) { - if ($title =~ /\<[aA] /) { - $title =~ s/\<[aA] /<a class="sectref" /; - } - else { - $title = "<span class=\"sectref\">$title</span>"; - } - return "<b class=\"navlabel\">$label:</b> $title\n"; - } - return ''; -} - -@my_icon_tags = (); -$my_icon_tags{'next'} = 'Next Page'; -$my_icon_tags{'next_page'} = 'Next Page'; -$my_icon_tags{'previous'} = 'Previous Page'; -$my_icon_tags{'previous_page'} = 'Previous Page'; -$my_icon_tags{'up'} = 'Up One Level'; -$my_icon_tags{'contents'} = 'Contents'; -$my_icon_tags{'index'} = 'Index'; -$my_icon_tags{'modules'} = 'Module Index'; - -@my_icon_names = (); -$my_icon_names{'previous_page'} = 'previous'; -$my_icon_names{'next_page'} = 'next'; - -sub get_my_icon { - my $name = @_[0]; - my $text = $my_icon_tags{$name}; - if ($my_icon_names{$name}) { - $name = $my_icon_names{$name}; - } - if ($text eq '') { - $name = 'blank'; - } - my $iconserver = ($ICONSERVER eq '.') ? '' : "$ICONSERVER/"; - return "<img src=\"$iconserver$name.$IMAGE_TYPE\"\n border=\"0\"" - . " height=\"32\"\n alt=\"$text\" width=\"32\">"; -} - -sub use_my_icon { - my $s = @_[0]; - if ($s =~ /\<tex2html_([a-z_]+)_visible_mark\>/) { - my $r = get_my_icon($1); - $s =~ s/\<tex2html_[a-z_]+_visible_mark\>/$r/; - } - return $s; -} - -sub make_nav_panel { - my $s; - my $BLANK_ICON = get_my_icon('blank'); - $NEXT = $NEXT_TITLE ? use_my_icon("$NEXT") : $BLANK_ICON; - $UP = $UP_TITLE ? use_my_icon("$UP") : $BLANK_ICON; - $PREVIOUS = $PREVIOUS_TITLE ? use_my_icon("$PREVIOUS") : $BLANK_ICON; - $CONTENTS = use_my_icon("$CONTENTS"); - $INDEX = $INDEX ? use_my_icon("$INDEX") : $BLANK_ICON; - if (!$CUSTOM_BUTTONS) { - $CUSTOM_BUTTONS = $BLANK_ICON; - } - $s = ('<table align="center" width="100%" cellpadding="0" cellspacing="2">' - . "\n<tr>" - # left-hand side - . "\n<td>$PREVIOUS</td>" - . "\n<td>$UP</td>" - . "\n<td>$NEXT</td>" - # title box - . "\n<td align=\"center\" width=\"100%\">$t_title</td>" - # right-hand side - . "\n<td>$CONTENTS</td>" - . "\n<td>$CUSTOM_BUTTONS</td>" # module index - . "\n<td>$INDEX</td>" - . "\n</tr></table>\n" - # textual navigation - . make_nav_sectref("Previous", $PREVIOUS_TITLE) - . make_nav_sectref("Up", $UP_TITLE) - . make_nav_sectref("Next", $NEXT_TITLE) - ); - # remove these; they are unnecessary and cause errors from validation - $s =~ s/ NAME="tex2html\d+"\n */ /g; - return $s; -} - -sub get_version_text { - if ($PACKAGE_VERSION ne '' && $t_date) { - return ("<span class=\"release-info\">" - . "Release $PACKAGE_VERSION," - . " documentation updated on $t_date.</span>"); - } - if ($PACKAGE_VERSION ne '') { - return ("<span class=\"release-info\">" - . "Release $PACKAGE_VERSION.</span>"); - } - if ($t_date) { - return ("<span class=\"release-info\">Documentation released on " - . "$t_date.</span>"); - } - return ''; -} - - -sub top_navigation_panel { - return "\n" - . make_nav_panel() - . "<br><hr>\n"; -} - -sub bot_navigation_panel { - return "\n<p><hr>\n" - . make_nav_panel() - . "<hr>\n" - . get_version_text() - . "\n"; -} - -sub add_link { - # Returns a pair (iconic link, textual link) - my($icon, $current_file, @link) = @_; - my($dummy, $file, $title) = split($delim, - $section_info{join(' ',@link)}); - if ($icon =~ /\<tex2html_([_a-z]+)_visible_mark\>/) { - my $r = get_my_icon($1); - $icon =~ s/\<tex2html_[_a-z]+_visible_mark\>/$r/; - } - if ($title && ($file ne $current_file)) { - $title = purify($title); - $title = get_first_words($title, $WORDS_IN_NAVIGATION_PANEL_TITLES); - return (make_href($file, $icon), make_href($file, "$title")) - } - elsif ($icon eq get_my_icon('up') && $EXTERNAL_UP_LINK) { - return (make_href($EXTERNAL_UP_LINK, $icon), - make_href($EXTERNAL_UP_LINK, "$EXTERNAL_UP_TITLE")) - } - elsif ($icon eq get_my_icon('previous') - && $EXTERNAL_PREV_LINK && $EXTERNAL_PREV_TITLE) { - return (make_href($EXTERNAL_PREV_LINK, $icon), - make_href($EXTERNAL_PREV_LINK, "$EXTERNAL_PREV_TITLE")) - } - elsif ($icon eq get_my_icon('next') - && $EXTERNAL_DOWN_LINK && $EXTERNAL_DOWN_TITLE) { - return (make_href($EXTERNAL_DOWN_LINK, $icon), - make_href($EXTERNAL_DOWN_LINK, "$EXTERNAL_DOWN_TITLE")) - } - return (&inactive_img($icon), ""); -} - -sub add_special_link { - my($icon, $file, $current_file) = @_; - if ($icon =~ /\<tex2html_([_a-z]+)_visible_mark\>/) { - my $r = get_my_icon($1); - $icon =~ s/\<tex2html_[_a-z]+_visible_mark\>/$r/; - } - return (($file && ($file ne $current_file)) - ? make_href($file, $icon) - : undef) -} - -# The img_tag() function seems only to be called with the parameter -# 'anchor_invisible_mark', which we want to turn into ''. Since -# replace_icon_marks() is the only interesting caller, and all it really -# does is call img_tag(), we can just define the hook alternative to be -# a no-op instead. -# -sub replace_icons_hook {} - -sub do_cmd_arabic { - # get rid of that nasty <SPAN CLASS="arabic">...</SPAN> - my($ctr, $val, $id, $text) = &read_counter_value(@_[0]); - return ($val ? farabic($val) : "0") . $text; -} - - -sub gen_index_id { - # this is used to ensure common index key generation and a stable sort - my($str,$extra) = @_; - sprintf('%s###%s%010d', $str, $extra, ++$global{'max_id'}); -} - -sub insert_index { - my($mark,$datafile,$columns,$letters,$prefix) = @_; - my $prog = "$myrootdir/tools/buildindex.py"; - my $index; - if ($letters) { - $index = `$prog --columns $columns --letters $datafile`; - } - else { - $index = `$prog --columns $columns $datafile`; - } - if (!s/$mark/$prefix$index/) { - print "\nCould not locate index mark: $mark"; - } -} - -sub add_idx { - print "\nBuilding HTML for the index ..."; - close(IDXFILE); - insert_index($idx_mark, 'index.dat', $INDEX_COLUMNS, 1, ''); -} - - -$idx_module_mark = '<tex2html_idx_module_mark>'; -$idx_module_title = 'Module Index'; - -sub add_module_idx { - print "\nBuilding HTML for the module index ..."; - my $key; - my $first = 1; - my $prevplat = ''; - my $allthesame = 1; - my $prefix = ''; - foreach $key (keys %Modules) { - $key =~ s/<tt>([a-zA-Z0-9._]*)<\/tt>/\1/; - my $plat = "$ModulePlatforms{$key}"; - $plat = '' - if ($plat eq $IGNORE_PLATFORM_ANNOTATION); - if (!$first) { - $allthesame = 0 - if ($prevplat ne $plat); - } - else { $first = 0; } - $prevplat = $plat; - } - open(MODIDXFILE, '>modindex.dat') || die "\n$!\n"; - foreach $key (keys %Modules) { - # dump the line in the data file; just use a dummy seqno field - my $nkey = $1; - my $moditem = "$Modules{$key}"; - my $plat = ''; - $key =~ s/<tt>([a-zA-Z0-9._]*)<\/tt>/\1/; - if ($ModulePlatforms{$key} && !$allthesame) { - $plat = (" <em>(<span class='platform'>$ModulePlatforms{$key}" - . '</span>)</em>'); - } - print MODIDXFILE $moditem . $IDXFILE_FIELD_SEP - . "<tt class='module'>$key</tt>$plat###\n"; - } - close(MODIDXFILE); - - if ($GLOBAL_MODULE_INDEX) { - $prefix = <<MODULE_INDEX_PREFIX; - -<p> This index only lists modules documented in this manual. - The <em class="citetitle"><a href="$GLOBAL_MODULE_INDEX">Global Module - Index</a></em> lists all modules that are documented in this set - of manuals.</p> -MODULE_INDEX_PREFIX - } - if (!$allthesame) { - $prefix .= <<PLAT_DISCUSS; - -<p> Some module names are followed by an annotation indicating what -platform they are available on.</p> - -PLAT_DISCUSS - } - insert_index($idx_module_mark, 'modindex.dat', $MODULE_INDEX_COLUMNS, 0, - $prefix); -} - -# replace both indexes as needed: -sub add_idx_hook { - add_idx() if (/$idx_mark/); - process_python_state(); - if ($MODULE_INDEX_FILE) { - local ($_); - open(MYFILE, "<$MODULE_INDEX_FILE"); - sysread(MYFILE, $_, 1024*1024); - close(MYFILE); - add_module_idx(); - open(MYFILE,">$MODULE_INDEX_FILE"); - print MYFILE $_; - close(MYFILE); - } -} - - -# In addition to the standard stuff, add label to allow named node files and -# support suppression of the page complete (for HTML Help use). -sub do_cmd_tableofcontents { - local($_) = @_; - $TITLE = $toc_title; - $tocfile = $CURRENT_FILE; - my($closures,$reopens) = preserve_open_tags(); - anchor_label('contents', $CURRENT_FILE, $_); # this is added - join('', "<BR>\n\\tableofchildlinks[off]", $closures - , make_section_heading($toc_title, 'H2'), $toc_mark - , $reopens, $_); -} -# In addition to the standard stuff, add label to allow named node files. -sub do_cmd_listoffigures { - local($_) = @_; - $TITLE = $lof_title; - $loffile = $CURRENT_FILE; - my($closures,$reopens) = preserve_open_tags(); - anchor_label('lof', $CURRENT_FILE, $_); # this is added - join('', "<BR>\n", $closures - , make_section_heading($lof_title, 'H2'), $lof_mark - , $reopens, $_); -} -# In addition to the standard stuff, add label to allow named node files. -sub do_cmd_listoftables { - local($_) = @_; - $TITLE = $lot_title; - $lotfile = $CURRENT_FILE; - my($closures,$reopens) = preserve_open_tags(); - anchor_label('lot', $CURRENT_FILE, $_); # this is added - join('', "<BR>\n", $closures - , make_section_heading($lot_title, 'H2'), $lot_mark - , $reopens, $_); -} -# In addition to the standard stuff, add label to allow named node files. -sub do_cmd_textohtmlinfopage { - local($_) = @_; - if ($INFO) { # - anchor_label("about",$CURRENT_FILE,$_); # this is added - } # - my $the_version = ''; # and the rest is - if ($t_date) { # mostly ours - $the_version = ",\n$t_date"; - if ($PACKAGE_VERSION) { - $the_version .= ", Release $PACKAGE_VERSION"; - } - } - $_ = (($INFO == 1) - ? join('', - $close_all, - "<strong>$t_title</strong>$the_version\n", - `cat $ABOUT_FILE`, - $open_all, $_) - : join('', $close_all, $INFO,"\n", $open_all, $_)); - $_; -} - -# $idx_mark will be replaced with the real index at the end -sub do_cmd_textohtmlindex { - local($_) = @_; - $TITLE = $idx_title; - $idxfile = $CURRENT_FILE; - if (%index_labels) { make_index_labels(); } - if (($SHORT_INDEX) && (%index_segment)) { make_preindex(); } - else { $preindex = ''; } - my $heading = make_section_heading($idx_title, 'h2') . $idx_mark; - my($pre,$post) = minimize_open_tags($heading); - anchor_label('genindex',$CURRENT_FILE,$_); # this is added - return "<br>\n" . $pre . $_; -} - -$MODULE_INDEX_FILE = ''; - -# $idx_module_mark will be replaced with the real index at the end -sub do_cmd_textohtmlmoduleindex { - local($_) = @_; - $TITLE = $idx_module_title; - anchor_label('modindex', $CURRENT_FILE, $_); - $MODULE_INDEX_FILE = "$CURRENT_FILE"; - $_ = ('<p>' . make_section_heading($idx_module_title, 'h2') - . $idx_module_mark . $_); - return $_; -} - -# The bibliography and the index should be treated as separate -# sections in their own HTML files. The \bibliography{} command acts -# as a sectioning command that has the desired effect. But when the -# bibliography is constructed manually using the thebibliography -# environment, or when using the theindex environment it is not -# possible to use the normal sectioning mechanism. This subroutine -# inserts a \bibliography{} or a dummy \textohtmlindex command just -# before the appropriate environments to force sectioning. - -# XXX This *assumes* that if there are two {theindex} environments, -# the first is the module index and the second is the standard -# index. This is sufficient for the current Python documentation, -# but that's about it. - -sub add_bbl_and_idx_dummy_commands { - my $id = $global{'max_id'}; - - s/([\\]begin\s*$O\d+$C\s*thebibliography)/$bbl_cnt++; $1/eg; - s/([\\]begin\s*$O\d+$C\s*thebibliography)/$id++; "\\bibliography$O$id$C$O$id$C $1"/geo; - my(@parts) = split(/\\begin\s*$O\d+$C\s*theindex/); - if (scalar(@parts) == 3) { - # Be careful to re-write the string in place, since $_ is *not* - # returned explicity; *** nasty side-effect dependency! *** - print "\nadd_bbl_and_idx_dummy_commands ==> adding module index"; - my $rx = "([\\\\]begin\\s*$O\\d+$C\\s*theindex[\\s\\S]*)" - . "([\\\\]begin\\s*$O\\d+$C\\s*theindex)"; - s/$rx/\\textohtmlmoduleindex \1 \\textohtmlindex \2/o; - # Add a button to the navigation areas: - $CUSTOM_BUTTONS .= ('<a href="modindex.html" title="Module Index">' - . get_my_icon('modules') - . '</a>'); - } - else { - $CUSTOM_BUTTONS .= get_my_icon('blank'); - $global{'max_id'} = $id; # not sure why.... - s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlindex $1/o; - s/[\\]printindex/\\textohtmlindex /o; - } - #---------------------------------------------------------------------- - lib_add_bbl_and_idx_dummy_commands() - if defined(&lib_add_bbl_and_idx_dummy_commands); -} - -# The bibliographic references, the appendices, the lists of figures -# and tables etc. must appear in the contents table at the same level -# as the outermost sectioning command. This subroutine finds what is -# the outermost level and sets the above to the same level; - -sub set_depth_levels { - # Sets $outermost_level - my $level; - #RRM: do not alter user-set value for $MAX_SPLIT_DEPTH - foreach $level ("part", "chapter", "section", "subsection", - "subsubsection", "paragraph") { - last if (($outermost_level) = /\\($level)$delimiter_rx/); - } - $level = ($outermost_level ? $section_commands{$outermost_level} : - do {$outermost_level = 'section'; 3;}); - - #RRM: but calculate value for $MAX_SPLIT_DEPTH when a $REL_DEPTH was given - if ($REL_DEPTH && $MAX_SPLIT_DEPTH) { - $MAX_SPLIT_DEPTH = $level + $MAX_SPLIT_DEPTH; - } elsif (!($MAX_SPLIT_DEPTH)) { $MAX_SPLIT_DEPTH = 1 }; - - %unnumbered_section_commands = ('tableofcontents' => $level, - 'listoffigures' => $level, - 'listoftables' => $level, - 'bibliography' => $level, - 'textohtmlindex' => $level, - 'textohtmlmoduleindex' => $level); - $section_headings{'textohtmlmoduleindex'} = 'h1'; - - %section_commands = (%unnumbered_section_commands, - %section_commands); - - make_sections_rx(); -} - - -# This changes the markup used for {verbatim} environments, and is the -# best way I've found that ensures the <dl> goes on the outside of the -# <pre>...</pre>. -# -# Note that this *must* be done in the init file, not the python.perl -# style support file. The %declarations must be set before -# initialize() is called in the main LaTeX2HTML script (which happens -# before style files are loaded). -# -%declarations = ('preform' => '<dl><dd><pre class="verbatim"></pre></dl>', - %declarations); - - -# This is added to get rid of the long comment that follows the -# doctype declaration; MSIE5 on NT4 SP4 barfs on it and drops the -# content of the page. -sub make_head_and_body { - my($title, $body) = @_; - $body = " $body" unless ($body eq ''); - my $DTDcomment = ''; - my($version, $isolanguage) = ($HTML_VERSION, 'EN'); - my %isolanguages = ( 'english', 'EN' , 'USenglish', 'EN.US' - , 'original', 'EN' , 'german' , 'DE' - , 'austrian', 'DE.AT', 'french' , 'FR' - , 'spanish', 'ES'); - $isolanguage = $isolanguages{$default_language}; - $isolanguage = 'EN' unless $isolanguage; - $title = &purify($title,1); - eval("\$title = ". $default_title ) unless ($title); - - # allow user-modification of the <TITLE> tag; thanks Dan Young - if (defined &custom_TITLE_hook) { - $title = &custom_TITLE_hook($title, $toc_sec_title); - } - - if ($DOCTYPE =~ /\/\/[\w\.]+\s*$/) { # language spec included - $DTDcomment = "<!DOCTYPE html PUBLIC \"$DOCTYPE\">\n"; - } else { - $DTDcomment = "<!DOCTYPE html PUBLIC \"$DOCTYPE//" - . ($ISO_LANGUAGE ? $ISO_LANGUAGE : $isolanguage) . "\">\n"; - } - - $STYLESHEET = $FILE.".css" unless $STYLESHEET; - if (!$charset && $CHARSET) { $charset = $CHARSET; $charset =~ s/_/\-/go; } - - join('', ($DOCTYPE ? $DTDcomment : '' ) - ,"<html>\n<head>\n<title>", $title, "</title>\n" - , &meta_information($title) - , ($CHARSET && $HTML_VERSION ge "2.1" ? - "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=$charset\">\n" - : "" ) - , ($BASE ? "<base href=\"$BASE\">\n" : "" ) - , "<link rel=\"STYLESHEET\" href=\"$STYLESHEET\">" - , $more_links_mark - , "\n</head>\n<body$body>"); -} - -1; # This must be the last line diff --git a/doc/tools/perl/ltxmarkup.perl b/doc/tools/perl/ltxmarkup.perl deleted file mode 100644 index 290e79b..0000000 --- a/doc/tools/perl/ltxmarkup.perl +++ /dev/null @@ -1,67 +0,0 @@ -# LaTeX2HTML support for the ltxmarkup package. Doesn't do indexing. - -package main; - - -sub ltx_next_argument{ - my $param; - $param = missing_braces() - unless ((s/$next_pair_pr_rx/$param=$2;''/eo) - ||(s/$next_pair_rx/$param=$2;''/eo)); - return $param; -} - - -sub do_cmd_macro{ - local($_) = @_; - my $macro = ltx_next_argument(); - return "<tt class='macro'>\$macro</tt>" . $_; -} - -sub do_cmd_env{ - local($_) = @_; - my $env = ltx_next_argument(); - return "<tt class='environment'>\$env</tt>" . $_; -} - -sub ltx_process_params{ - # Handle processing of \p and \op for parameter specifications for - # envdesc and macrodesc. It's done this way to avoid defining do_cmd_p() - # and do_cmd_op() functions, which would be interpreted outside the context - # in which these commands are legal, and cause LaTeX2HTML to think they're - # defined. This way, other uses of \p and \op are properly flagged as - # unknown macros. - my $s = @_[0]; - $s =~ s%\\op<<(\d+)>>(.+)<<\1>>%<tt>[</tt><var>$2</var><tt>]</tt>%; - while ($s =~ /\\p<<(\d+)>>(.+)<<\1>>/) { - $s =~ s%\\p<<(\d+)>>(.+)<<\1>>%<tt>{</tt><var>$2</var><tt>}</tt>%; - } - return $s; -} - -sub do_env_macrodesc{ - local($_) = @_; - my $macro = ltx_next_argument(); - my $params = ltx_process_params(ltx_next_argument()); - return "\n<dl class='macrodesc'>" - . "\n<dt><b><tt class='macro'>\$macro</tt></b>" - . "\n $params" - . "\n<dd>" - . $_ - . "</dl>"; -} - -sub do_env_envdesc{ - local($_) = @_; - my $env = ltx_next_argument(); - my $params = ltx_process_params(ltx_next_argument()); - return "\n<dl class='envdesc'>" - . "\n<dt><tt>\begin{<b class='environment'>$env</b>}</tt>" - . "\n $params" - . "\n<br /><tt>\end{<b class='environment'>$env</b>}</tt>" - . "\n<dd>" - . $_ - . "</dl>"; -} - -1; # Must end with this, because Perl is bogus. diff --git a/doc/tools/perl/manual.perl b/doc/tools/perl/manual.perl deleted file mode 100644 index ea65b36..0000000 --- a/doc/tools/perl/manual.perl +++ /dev/null @@ -1,15 +0,0 @@ -# -*- perl -*- -# -# This implements the Python manual class. All it really needs to do it -# load the "python" style. The style code is not moved into the class code -# at this time, since we expect additional document class to be developed -# for the Python documentation in the future. Appropriate relocations will -# be made at that time. - -package main; - -do_require_package("report"); -do_require_package("alltt"); -do_require_package("python"); - -1; # sheesh.... diff --git a/doc/tools/perl/python.perl b/doc/tools/perl/python.perl deleted file mode 100644 index 20615cc..0000000 --- a/doc/tools/perl/python.perl +++ /dev/null @@ -1,1651 +0,0 @@ -# python.perl by Fred L. Drake, Jr. <fdrake@acm.org> -*- perl -*- -# -# Heavily based on Guido van Rossum's myformat.perl (now obsolete). -# -# Extension to LaTeX2HTML for documents using myformat.sty. -# Subroutines of the form do_cmd_<name> here define translations -# for LaTeX commands \<name> defined in the corresponding .sty file. - -package main; - -use File::Basename; - - -sub next_argument{ - my $param; - $param = missing_braces() - unless ((s/$next_pair_pr_rx/$param=$2;''/eo) - ||(s/$next_pair_rx/$param=$2;''/eo)); - return $param; -} - -sub next_optional_argument{ - my($param,$rx) = ('', "^\\s*(\\[([^]]*)\\])?"); - s/$rx/$param=$2;''/eo; - return $param; -} - -sub make_icon_filename($){ - my($myname, $mydir, $myext) = fileparse(@_[0], '\..*'); - chop $mydir; - if ($mydir eq '.') { - $mydir = $ICONSERVER; - } - $myext = ".$IMAGE_TYPE" - unless $myext; - return "$mydir$dd$myname$myext"; -} - -sub get_link_icon($){ - my $url = @_[0]; - if ($OFF_SITE_LINK_ICON && ($url =~ /^[-a-zA-Z0-9.]+:/)) { - # absolute URL; assume it points off-site - my $icon = make_icon_filename($OFF_SITE_LINK_ICON); - return (" <img src='$icon'\n" - . " border='0' class='offsitelink'" - . ($OFF_SITE_LINK_ICON_HEIGHT - ? " height='$OFF_SITE_LINK_ICON_HEIGHT'" - : '') - . ($OFF_SITE_LINK_ICON_WIDTH - ? " width='$OFF_SITE_LINK_ICON_WIDTH'" - : '') - . " alt='[off-site link]'\n" - . " >"); - } - return ''; -} - -# This is a fairly simple hack; it supports \let when it is used to create -# (or redefine) a macro to exactly be some other macro: \let\newname=\oldname. -# Many possible uses of \let aren't supported or aren't supported correctly. -# -sub do_cmd_let{ - local($_) = @_; - my $matched = 0; - s/[\\]([a-zA-Z]+)\s*(=\s*)?[\\]([a-zA-Z]*)/$matched=1; ''/e; - if ($matched) { - my($new, $old) = ($1, $3); - eval "sub do_cmd_$new { do_cmd_$old" . '(@_); }'; - print "\ndefining handler for \\$new using \\$old\n"; - } - else { - s/[\\]([a-zA-Z]+)\s*(=\s*)?([^\\])/$matched=1; ''/es; - if ($matched) { - my($new, $char) = ($1, $3); - eval "sub do_cmd_$new { \"\\$char\" . \@_[0]; }"; - print "\ndefining handler for \\$new to insert '$char'\n"; - } - else { - write_warnings("Could not interpret \\let construct..."); - } - } - return $_; -} - - -# the older version of LaTeX2HTML we use doesn't support this, but we use it: - -sub do_cmd_textasciitilde{ '~' . @_[0]; } - - -# words typeset in a special way (not in HTML though) - -sub do_cmd_ABC{ 'ABC' . @_[0]; } -sub do_cmd_UNIX{ 'Unix'. @_[0]; } -sub do_cmd_ASCII{ 'ASCII' . @_[0]; } -sub do_cmd_POSIX{ 'POSIX' . @_[0]; } -sub do_cmd_C{ 'C' . @_[0]; } -sub do_cmd_Cpp{ 'C++' . @_[0]; } -sub do_cmd_EOF{ 'EOF' . @_[0]; } -sub do_cmd_NULL{ '<tt class="constant">NULL</tt>' . @_[0]; } - -sub do_cmd_e{ '\' . @_[0]; } - -$DEVELOPER_ADDRESS = ''; -$SHORT_VERSION = ''; -$PACKAGE_VERSION = ''; - -sub do_cmd_version{ $PACKAGE_VERSION . @_[0]; } -sub do_cmd_shortversion{ $SHORT_VERSION . @_[0]; } -sub do_cmd_release{ - local($_) = @_; - $PACKAGE_VERSION = next_argument(); - return $_; -} - -sub do_cmd_setshortversion{ - local($_) = @_; - $SHORT_VERSION = next_argument(); - return $_; -} - -sub do_cmd_authoraddress{ - local($_) = @_; - $DEVELOPER_ADDRESS = next_argument(); - return $_; -} - -#sub do_cmd_developer{ do_cmd_author(@_[0]); } -#sub do_cmd_developers{ do_cmd_author(@_[0]); } -#sub do_cmd_developersaddress{ do_cmd_authoraddress(@_[0]); } - -sub do_cmd_hackscore{ - local($_) = @_; - next_argument(); - return '_' . $_; -} - -sub use_wrappers{ - local($_,$before,$after) = @_; - my $stuff = next_argument(); - return $before . $stuff . $after . $_; -} - -$IN_DESC_HANDLER = 0; -sub do_cmd_optional{ - if ($IN_DESC_HANDLER) { - return use_wrappers(@_[0], "</var><big>\[</big><var>", - "</var><big>\]</big><var>"); - } - else { - return use_wrappers(@_[0], "<big>\[</big>", "<big>\]</big>"); - } -} - -# Logical formatting (some based on texinfo), needs to be converted to -# minimalist HTML. The "minimalist" is primarily to reduce the size of -# output files for users that read them over the network rather than -# from local repositories. - -# \file and \samp are at the end of this file since they screw up fontlock. - -sub do_cmd_pytype{ return @_[0]; } -sub do_cmd_makevar{ - return use_wrappers(@_[0], '<span class="makevar">', '</span>'); } -sub do_cmd_code{ - return use_wrappers(@_[0], '<code>', '</code>'); } -sub do_cmd_module{ - return use_wrappers(@_[0], '<tt class="module">', '</tt>'); } -sub do_cmd_keyword{ - return use_wrappers(@_[0], '<tt class="keyword">', '</tt>'); } -sub do_cmd_exception{ - return use_wrappers(@_[0], '<tt class="exception">', '</tt>'); } -sub do_cmd_class{ - return use_wrappers(@_[0], '<tt class="class">', '</tt>'); } -sub do_cmd_function{ - return use_wrappers(@_[0], '<tt class="function">', '</tt>'); } -sub do_cmd_constant{ - return use_wrappers(@_[0], '<tt class="constant">', '</tt>'); } -sub do_cmd_member{ - return use_wrappers(@_[0], '<tt class="member">', '</tt>'); } -sub do_cmd_method{ - return use_wrappers(@_[0], '<tt class="method">', '</tt>'); } -sub do_cmd_cfunction{ - return use_wrappers(@_[0], '<tt class="cfunction">', '</tt>'); } -sub do_cmd_cdata{ - return use_wrappers(@_[0], '<tt class="cdata">', '</tt>'); } -sub do_cmd_ctype{ - return use_wrappers(@_[0], '<tt class="ctype">', '</tt>'); } -sub do_cmd_regexp{ - return use_wrappers(@_[0], '<tt class="regexp">', '</tt>'); } -sub do_cmd_character{ - return use_wrappers(@_[0], '"<tt class="character">', '</tt>"'); } -sub do_cmd_program{ - return use_wrappers(@_[0], '<b class="program">', '</b>'); } -sub do_cmd_programopt{ - return use_wrappers(@_[0], '<b class="programopt">', '</b>'); } -sub do_cmd_longprogramopt{ - # note that the --- will be later converted to -- by LaTeX2HTML - return use_wrappers(@_[0], '<b class="programopt">---', '</b>'); } -sub do_cmd_email{ - return use_wrappers(@_[0], '<span class="email">', '</span>'); } -sub do_cmd_mimetype{ - return use_wrappers(@_[0], '<span class="mimetype">', '</span>'); } -sub do_cmd_var{ - return use_wrappers(@_[0], "<var>", "</var>"); } -sub do_cmd_dfn{ - return use_wrappers(@_[0], '<i class="dfn">', '</i>'); } -sub do_cmd_emph{ - return use_wrappers(@_[0], '<i>', '</i>'); } -sub do_cmd_file{ - return use_wrappers(@_[0], '<span class="file">', '</span>'); } -sub do_cmd_filenq{ - return do_cmd_file(@_[0]); } -sub do_cmd_samp{ - return use_wrappers(@_[0], '"<tt class="samp">', '</tt>"'); } -sub do_cmd_kbd{ - return use_wrappers(@_[0], '<kbd>', '</kbd>'); } -sub do_cmd_strong{ - return use_wrappers(@_[0], '<b>', '</b>'); } -sub do_cmd_textbf{ - return use_wrappers(@_[0], '<b>', '</b>'); } -sub do_cmd_textit{ - return use_wrappers(@_[0], '<i>', '</i>'); } - -sub do_cmd_moreargs{ - return '...' . @_[0]; } -sub do_cmd_unspecified{ - return '...' . @_[0]; } - - -sub do_cmd_refmodule{ - # Insert the right magic to jump to the module definition. - local($_) = @_; - my $key = next_optional_argument(); - my $module = next_argument(); - $key = $module - unless $key; - return "<tt class='module'><a href='module-$key.html'>$module</a></tt>" - . $_; -} - -sub do_cmd_newsgroup{ - local($_) = @_; - my $newsgroup = next_argument(); - my $icon = get_link_icon("news:$newsgroup"); - my $stuff = "<a class='newsgroup' href='news:$newsgroup'>" - . "$newsgroup$icon</a>"; - return $stuff . $_; -} - -sub do_cmd_envvar{ - local($_) = @_; - my $envvar = next_argument(); - my($name,$aname,$ahref) = new_link_info(); - # The <tt> here is really to keep buildindex.py from making - # the variable name case-insensitive. - add_index_entry("environment variables!$envvar@<tt>$envvar</tt>", - $ahref); - add_index_entry("$envvar (environment variable)", $ahref); - $aname =~ s/<a/<a class="envvar"/; - return "$aname$envvar</a>" . $_; -} - -sub do_cmd_url{ - # use the URL as both text and hyperlink - local($_) = @_; - my $url = next_argument(); - my $icon = get_link_icon($url); - $url =~ s/~/~/g; - return "<a class=\"url\" href=\"$url\">$url$icon</a>" . $_; -} - -sub do_cmd_manpage{ - # two parameters: \manpage{name}{section} - local($_) = @_; - my $page = next_argument(); - my $section = next_argument(); - return "<span class='manpage'><i>$page</i>($section)</span>" . $_; -} - -$PEP_FORMAT = "http://python.sourceforge.net/peps/pep-XXXX.html"; -$RFC_FORMAT = "http://www.ietf.org/rfc/rfcXXXX.txt"; - -sub get_rfc_url($$){ - my($rfcnum, $format) = @_; - $rfcnum = sprintf("%04d", $rfcnum); - $format = "$format"; - $format =~ s/XXXX/$rfcnum/; - return $format; -} - -sub do_cmd_pep{ - local($_) = @_; - my $rfcnumber = next_argument(); - my $id = "rfcref-" . ++$global{'max_id'}; - my $href = get_rfc_url($rfcnumber, $PEP_FORMAT); - my $icon = get_link_icon($href); - # Save the reference - my $nstr = gen_index_id("Python Enhancement Proposals!PEP $rfcnumber", ''); - $index{$nstr} .= make_half_href("$CURRENT_FILE#$id"); - return ("<a class=\"rfc\" name=\"$id\"\nhref=\"$href\">PEP $rfcnumber" - . "$icon</a>" . $_); -} - -sub do_cmd_rfc{ - local($_) = @_; - my $rfcnumber = next_argument(); - my $id = "rfcref-" . ++$global{'max_id'}; - my $href = get_rfc_url($rfcnumber, $RFC_FORMAT); - my $icon = get_link_icon($href); - # Save the reference - my $nstr = gen_index_id("RFC!RFC $rfcnumber", ''); - $index{$nstr} .= make_half_href("$CURRENT_FILE#$id"); - return ("<a class=\"rfc\" name=\"$id\"\nhref=\"$href\">RFC $rfcnumber" - . "$icon</a>" . $_); -} - -sub do_cmd_citetitle{ - local($_) = @_; - my $url = next_optional_argument(); - my $title = next_argument(); - my $icon = get_link_icon($url); - my $repl = ''; - if ($url) { - $repl = ("<em class='citetitle'><a\n" - . " href='$url'\n" - . " title='$title'\n" - . " >$title$icon</a></em>"); - } - else { - $repl = "<em class='citetitle'\n >$title</em>"; - } - return $repl . $_; -} - -sub do_cmd_deprecated{ - # two parameters: \deprecated{version}{whattodo} - local($_) = @_; - my $release = next_argument(); - my $reason = next_argument(); - return ('<div class="versionnote">' - . "<b>Deprecated since release $release.</b>" - . "\n$reason</div><p>" - . $_); -} - -sub do_cmd_versionadded{ - # one parameter: \versionadded{version} - local($_) = @_; - my $release = next_argument(); - return ("\n<span class='versionnote'>New in version $release.</span>\n" - . $_); -} - -sub do_cmd_versionchanged{ - # one parameter: \versionchanged{version} - local($_) = @_; - my $explanation = next_optional_argument(); - my $release = next_argument(); - my $text = "Changed in version $release."; - if ($explanation) { - $text = "Changed in version $release:\n$explanation."; - } - return "\n<span class='versionnote'>$text</span>\n" . $_; -} - -# -# These function handle platform dependency tracking. -# -sub do_cmd_platform{ - local($_) = @_; - my $platform = next_argument(); - $ModulePlatforms{"<tt class='module'>$THIS_MODULE</tt>"} = $platform; - $platform = "Macintosh" - if $platform eq 'Mac'; - return "\n<p class='availability'>Availability: <span" - . "\n class='platform'>$platform</span>.</p>\n" . $_; -} - -$IGNORE_PLATFORM_ANNOTATION = ''; -sub do_cmd_ignorePlatformAnnotation{ - local($_) = @_; - $IGNORE_PLATFORM_ANNOTATION = next_argument(); - return $_; -} - - -# index commands - -$INDEX_SUBITEM = ""; - -sub get_indexsubitem{ - return $INDEX_SUBITEM ? " $INDEX_SUBITEM" : ''; -} - -sub do_cmd_setindexsubitem{ - local($_) = @_; - $INDEX_SUBITEM = next_argument(); - return $_; -} - -sub do_cmd_withsubitem{ - # We can't really do the right thing, because LaTeX2HTML doesn't - # do things in the right order, but we need to at least strip this stuff - # out, and leave anything that the second argument expanded out to. - # - local($_) = @_; - my $oldsubitem = $INDEX_SUBITEM; - $INDEX_SUBITEM = next_argument(); - my $stuff = next_argument(); - my $br_id = ++$globals{'max_id'}; - my $marker = "$O$br_id$C"; - return - $stuff - . "\\setindexsubitem$marker$oldsubitem$marker" - . $_; -} - -# This is the prologue macro which is required to start writing the -# mod\jobname.idx file; we can just ignore it. (Defining this suppresses -# a warning that \makemodindex is unknown.) -# -sub do_cmd_makemodindex{ return @_[0]; } - -# We're in the document subdirectory when this happens! -# -open(IDXFILE, '>index.dat') || die "\n$!\n"; -open(INTLABELS, '>intlabels.pl') || die "\n$!\n"; -print INTLABELS "%internal_labels = ();\n"; -print INTLABELS "1; # hack in case there are no entries\n\n"; - -# Using \0 for this is bad because we can't use common tools to work with the -# resulting files. Things like grep can be useful with this stuff! -# -$IDXFILE_FIELD_SEP = "\1"; - -sub write_idxfile{ - my ($ahref, $str) = @_; - print IDXFILE $ahref, $IDXFILE_FIELD_SEP, $str, "\n"; -} - - -sub gen_link{ - my($node,$target) = @_; - print INTLABELS "\$internal_labels{\"$target\"} = \"$URL/$node\";\n"; - return "<a href='$node#$target'>"; -} - -sub add_index_entry{ - # add an entry to the index structures; ignore the return value - my($str,$ahref) = @_; - $str = gen_index_id($str, ''); - $index{$str} .= $ahref; - write_idxfile($ahref, $str); -} - -sub new_link_info{ - my $name = "l2h-" . ++$globals{'max_id'}; - my $aname = "<a name='$name'>"; - my $ahref = gen_link($CURRENT_FILE, $name); - return ($name, $aname, $ahref); -} - -$IndexMacroPattern = ''; -sub define_indexing_macro{ - my $count = @_; - my $i = 0; - for (; $i < $count; ++$i) { - my $name = @_[$i]; - my $cmd = "idx_cmd_$name"; - die "\nNo function $cmd() defined!\n" - if (!defined &$cmd); - eval ("sub do_cmd_$name { return process_index_macros(" - . "\@_[0], '$name'); }"); - if (length($IndexMacroPattern) == 0) { - $IndexMacroPattern = "$name"; - } - else { - $IndexMacroPattern .= "|$name"; - } - } -} - -$DEBUG_INDEXING = 0; -sub process_index_macros{ - local($_) = @_; - my $cmdname = @_[1]; # This is what triggered us in the first place; - # we know it's real, so just process it. - my($name,$aname,$ahref) = new_link_info(); - my $cmd = "idx_cmd_$cmdname"; - print "\nIndexing: \\$cmdname" - if $DEBUG_INDEXING; - &$cmd($ahref); # modifies $_ and adds index entries - while (/^[\s\n]*\\($IndexMacroPattern)</) { - $cmdname = "$1"; - print " \\$cmdname" - if $DEBUG_INDEXING; - $cmd = "idx_cmd_$cmdname"; - if (!defined &$cmd) { - last; - } - else { - s/^[\s\n]*\\$cmdname//; - &$cmd($ahref); - } - } - if (/^[ \t\r\n]/) { - $_ = substr($_, 1); - } - return "$aname$anchor_invisible_mark</a>" . $_; -} - -define_indexing_macro('index'); -sub idx_cmd_index{ - my $str = next_argument(); - add_index_entry("$str", @_[0]); -} - -define_indexing_macro('kwindex'); -sub idx_cmd_kwindex{ - my $str = next_argument(); - add_index_entry("<tt>$str</tt>!keyword", @_[0]); - add_index_entry("keyword!<tt>$str</tt>", @_[0]); -} - -define_indexing_macro('indexii'); -sub idx_cmd_indexii{ - my $str1 = next_argument(); - my $str2 = next_argument(); - add_index_entry("$str1!$str2", @_[0]); - add_index_entry("$str2!$str1", @_[0]); -} - -define_indexing_macro('indexiii'); -sub idx_cmd_indexiii{ - my $str1 = next_argument(); - my $str2 = next_argument(); - my $str3 = next_argument(); - add_index_entry("$str1!$str2 $str3", @_[0]); - add_index_entry("$str2!$str3, $str1", @_[0]); - add_index_entry("$str3!$str1 $str2", @_[0]); -} - -define_indexing_macro('indexiv'); -sub idx_cmd_indexiv{ - my $str1 = next_argument(); - my $str2 = next_argument(); - my $str3 = next_argument(); - my $str4 = next_argument(); - add_index_entry("$str1!$str2 $str3 $str4", @_[0]); - add_index_entry("$str2!$str3 $str4, $str1", @_[0]); - add_index_entry("$str3!$str4, $str1 $str2", @_[0]); - add_index_entry("$str4!$$str1 $str2 $str3", @_[0]); -} - -define_indexing_macro('ttindex'); -sub idx_cmd_ttindex{ - my $str = next_argument(); - my $entry = $str . get_indexsubitem(); - add_index_entry($entry, @_[0]); -} - -sub my_typed_index_helper{ - my($word,$ahref) = @_; - my $str = next_argument(); - add_index_entry("$str $word", $ahref); - add_index_entry("$word!$str", $ahref); -} - -define_indexing_macro('stindex', 'opindex', 'exindex', 'obindex'); -sub idx_cmd_stindex{ my_typed_index_helper('statement', @_[0]); } -sub idx_cmd_opindex{ my_typed_index_helper('operator', @_[0]); } -sub idx_cmd_exindex{ my_typed_index_helper('exception', @_[0]); } -sub idx_cmd_obindex{ my_typed_index_helper('object', @_[0]); } - -define_indexing_macro('bifuncindex'); -sub idx_cmd_bifuncindex{ - my $str = next_argument(); - add_index_entry("<tt class='function'>$str()</tt> (built-in function)", - @_[0]); -} - - -sub make_mod_index_entry{ - my($str,$define) = @_; - my($name,$aname,$ahref) = new_link_info(); - # equivalent of add_index_entry() using $define instead of '' - $ahref =~ s/\#[-_a-zA-Z0-9]*\"/\"/ - if ($define eq 'DEF'); - $str = gen_index_id($str, $define); - $index{$str} .= $ahref; - write_idxfile($ahref, $str); - - if ($define eq 'DEF') { - # add to the module index - $str =~ /(<tt.*<\/tt>)/; - my $nstr = $1; - $Modules{$nstr} .= $ahref; - } - return "$aname$anchor_invisible_mark2</a>"; -} - - -$THIS_MODULE = ''; -$THIS_CLASS = ''; - -sub define_module{ - my($word,$name) = @_; - my $section_tag = join('', @curr_sec_id); - if ($word ne "built-in" && $word ne "extension" - && $word ne "standard" && $word ne "") { - write_warnings("Bad module type '$word'" - . " for \\declaremodule (module $name)"); - $word = ""; - } - $word = "$word " if $word; - $THIS_MODULE = "$name"; - $INDEX_SUBITEM = "(in module $name)"; - print "[$name]"; - return make_mod_index_entry( - "<tt class='module'>$name</tt> (${word}module)", 'DEF'); -} - -sub my_module_index_helper{ - local($word, $_) = @_; - my $name = next_argument(); - return define_module($word, $name) . $_; -} - -sub do_cmd_modindex{ return my_module_index_helper('', @_); } -sub do_cmd_bimodindex{ return my_module_index_helper('built-in', @_); } -sub do_cmd_exmodindex{ return my_module_index_helper('extension', @_); } -sub do_cmd_stmodindex{ return my_module_index_helper('standard', @_); } - -sub ref_module_index_helper{ - my($word, $ahref) = @_; - my $str = next_argument(); - $word = "$word " if $word; - $str = "<tt class='module'>$str</tt> (${word}module)"; - # can't use add_index_entry() since the 2nd arg to gen_index_id() is used; - # just inline it all here - $str = gen_index_id($str, 'REF'); - $index{$str} .= $ahref; - write_idxfile($ahref, $str); -} - -# these should be adjusted a bit.... -define_indexing_macro('refmodindex', 'refbimodindex', - 'refexmodindex', 'refstmodindex'); -sub idx_cmd_refmodindex{ return ref_module_index_helper('', @_); } -sub idx_cmd_refbimodindex{ return ref_module_index_helper('built-in', @_); } -sub idx_cmd_refexmodindex{ return ref_module_index_helper('extension', @_); } -sub idx_cmd_refstmodindex{ return ref_module_index_helper('standard', @_); } - -sub do_cmd_nodename{ return do_cmd_label(@_); } - -sub init_myformat{ - $anchor_invisible_mark = ' '; - $anchor_invisible_mark2 = ''; - $anchor_mark = ''; - $icons{'anchor_mark'} = ''; -} -init_myformat(); - -# Create an index entry, but include the string in the target anchor -# instead of the dummy filler. -# -sub make_str_index_entry{ - my($str) = @_; - my($name,$aname,$ahref) = new_link_info(); - add_index_entry($str, $ahref); - return "$aname$str</a>"; -} - -$REFCOUNTS_LOADED = 0; - -sub load_refcounts{ - $REFCOUNTS_LOADED = 1; - - my $myname, $mydir, $myext; - ($myname, $mydir, $myext) = fileparse(__FILE__, '\..*'); - chop $mydir; # remove trailing '/' - ($myname, $mydir, $myext) = fileparse($mydir, '\..*'); - chop $mydir; # remove trailing '/' - $mydir = getcwd() . "$dd$mydir" - unless $mydir =~ s|^/|/|; - local $_; - my $filename = "$mydir${dd}api${dd}refcounts.dat"; - open(REFCOUNT_FILE, "<$filename") || die "\n$!\n"; - print "[loading API refcount data]"; - while (<REFCOUNT_FILE>) { - if (/([a-zA-Z0-9_]+):PyObject\*:([a-zA-Z0-9_]*):(0|[-+]1|null):(.*)$/) { - my($func, $param, $count, $comment) = ($1, $2, $3, $4); - #print "\n$func($param) --> $count"; - $REFCOUNTS{"$func:$param"} = $count; - } - } -} - -sub get_refcount{ - my ($func, $param) = @_; - load_refcounts() - unless $REFCOUNTS_LOADED; - return $REFCOUNTS{"$func:$param"}; -} - -sub do_env_cfuncdesc{ - local($_) = @_; - my $return_type = next_argument(); - my $function_name = next_argument(); - my $arg_list = next_argument(); - my $idx = make_str_index_entry( - "<tt class='cfunction'>$function_name()</tt>" . get_indexsubitem()); - $idx =~ s/ \(.*\)//; - $idx =~ s/\(\)//; # ???? - why both of these? - my $result_rc = get_refcount($function_name, ''); - my $rcinfo = ''; - if ($result_rc eq '+1') { - $rcinfo = 'New reference'; - } - elsif ($result_rc eq '0') { - $rcinfo = 'Borrowed reference'; - } - elsif ($result_rc eq 'null') { - $rcinfo = 'Always <tt class="constant">NULL</tt>'; - } - if ($rcinfo ne '') { - $rcinfo = ( "\n<div class=\"refcount-info\">" - . "\n <span class=\"label\">Return value:</span>" - . "\n <span class=\"value\">$rcinfo.</span>" - . "\n</div>"); - } - return "<dl><dt>$return_type <b>$idx</b>(<var>$arg_list</var>)\n<dd>" - . $rcinfo - . $_ - . '</dl>'; -} - -sub do_env_csimplemacrodesc{ - local($_) = @_; - my $name = next_argument(); - my $idx = make_str_index_entry("<tt class='macro'>$name</tt>"); - return "<dl><dt><b>$idx</b>\n<dd>" - . $_ - . '</dl>' -} - -sub do_env_ctypedesc{ - local($_) = @_; - my $index_name = next_optional_argument(); - my $type_name = next_argument(); - $index_name = $type_name - unless $index_name; - my($name,$aname,$ahref) = new_link_info(); - add_index_entry("<tt class='ctype'>$index_name</tt> (C type)", $ahref); - return "<dl><dt><b><tt class='ctype'>$aname$type_name</a></tt></b>\n<dd>" - . $_ - . '</dl>' -} - -sub do_env_cvardesc{ - local($_) = @_; - my $var_type = next_argument(); - my $var_name = next_argument(); - my $idx = make_str_index_entry("<tt class='cdata'>$var_name</tt>" - . get_indexsubitem()); - $idx =~ s/ \(.*\)//; - return "<dl><dt>$var_type <b>$idx</b>\n" - . '<dd>' - . $_ - . '</dl>'; -} - -sub convert_args($){ - local($IN_DESC_HANDLER) = 1; - local($_) = @_; - return translate_commands($_); -} - -sub do_env_funcdesc{ - local($_) = @_; - my $function_name = next_argument(); - my $arg_list = convert_args(next_argument()); - my $idx = make_str_index_entry("<tt class='function'>$function_name()</tt>" - . get_indexsubitem()); - $idx =~ s/ \(.*\)//; - $idx =~ s/\(\)<\/tt>/<\/tt>/; - return "<dl><dt><b>$idx</b>(<var>$arg_list</var>)\n<dd>" . $_ . '</dl>'; -} - -sub do_env_funcdescni{ - local($_) = @_; - my $function_name = next_argument(); - my $arg_list = convert_args(next_argument()); - return "<dl><dt><b><tt class='function'>$function_name</tt></b>" - . "(<var>$arg_list</var>)\n" - . '<dd>' - . $_ - . '</dl>'; -} - -sub do_cmd_funcline{ - local($_) = @_; - my $function_name = next_argument(); - my $arg_list = convert_args(next_argument()); - my $prefix = "<tt class='function'>$function_name()</tt>"; - my $idx = make_str_index_entry($prefix . get_indexsubitem()); - $prefix =~ s/\(\)//; - - return "<dt><b>$prefix</b>(<var>$arg_list</var>)\n<dd>" . $_; -} - -sub do_cmd_funclineni{ - local($_) = @_; - my $function_name = next_argument(); - my $arg_list = convert_args(next_argument()); - my $prefix = "<tt class='function'>$function_name</tt>"; - - return "<dt><b>$prefix</b>(<var>$arg_list</var>)\n<dd>" . $_; -} - -# Change this flag to index the opcode entries. I don't think it's very -# useful to index them, since they're only presented to describe the dis -# module. -# -$INDEX_OPCODES = 0; - -sub do_env_opcodedesc{ - local($_) = @_; - my $opcode_name = next_argument(); - my $arg_list = next_argument(); - my $idx; - if ($INDEX_OPCODES) { - $idx = make_str_index_entry("<tt class='opcode'>$opcode_name</tt>" - . " (byte code instruction)"); - $idx =~ s/ \(byte code instruction\)//; - } - else { - $idx = "<tt class='opcode'>$opcode_name</tt>"; - } - my $stuff = "<dl><dt><b>$idx</b>"; - if ($arg_list) { - $stuff .= " <var>$arg_list</var>"; - } - return $stuff . "\n<dd>" . $_ . '</dl>'; -} - -sub do_env_datadesc{ - local($_) = @_; - my $dataname = next_argument(); - my $idx = make_str_index_entry("<tt>$dataname</tt>" . get_indexsubitem()); - $idx =~ s/ \(.*\)//; - return "<dl><dt><b>$idx</b>\n<dd>" - . $_ - . '</dl>'; -} - -sub do_env_datadescni{ - local($_) = @_; - my $idx = next_argument(); - if (! $STRING_INDEX_TT) { - $idx = "<tt>$idx</tt>"; - } - return "<dl><dt><b>$idx</b>\n<dd>" . $_ . '</dl>'; -} - -sub do_cmd_dataline{ - local($_) = @_; - my $data_name = next_argument(); - my $idx = make_str_index_entry("<tt>$data_name</tt>" . get_indexsubitem()); - $idx =~ s/ \(.*\)//; - return "<dt><b>$idx</b><dd>" . $_; -} - -sub do_cmd_datalineni{ - local($_) = @_; - my $data_name = next_argument(); - return "<dt><b><tt>$data_name</tt></b><dd>" . $_; -} - -sub do_env_excdesc{ - local($_) = @_; - my $excname = next_argument(); - my $idx = make_str_index_entry("<tt class='exception'>$excname</tt>"); - return "<dl><dt><b>exception $idx</b>\n<dd>" . $_ . '</dl>' -} - -sub do_env_fulllineitems{ return do_env_itemize(@_); } - - -sub handle_classlike_descriptor{ - local($_, $what) = @_; - $THIS_CLASS = next_argument(); - my $arg_list = convert_args(next_argument()); - $idx = make_str_index_entry( - "<tt class='$what'>$THIS_CLASS</tt> ($what in $THIS_MODULE)" ); - $idx =~ s/ \(.*\)//; - return ("<dl><dt><b>$what $idx</b>(<var>$arg_list</var>)\n<dd>" - . $_ - . '</dl>'); -} - -sub do_env_classdesc{ - return handle_classlike_descriptor(@_[0], "class"); -} - -sub do_env_excclassdesc{ - return handle_classlike_descriptor(@_[0], "exception"); -} - - -sub do_env_methoddesc{ - local($_) = @_; - my $class_name = next_optional_argument(); - $class_name = $THIS_CLASS - unless $class_name; - my $method = next_argument(); - my $arg_list = convert_args(next_argument()); - my $extra = ''; - if ($class_name) { - $extra = " ($class_name method)"; - } - my $idx = make_str_index_entry("<tt class='method'>$method()</tt>$extra"); - $idx =~ s/ \(.*\)//; - $idx =~ s/\(\)//; - return "<dl><dt><b>$idx</b>(<var>$arg_list</var>)\n<dd>" . $_ . '</dl>'; -} - - -sub do_cmd_methodline{ - local($_) = @_; - my $class_name = next_optional_argument(); - $class_name = $THIS_CLASS - unless $class_name; - my $method = next_argument(); - my $arg_list = convert_args(next_argument()); - my $extra = ''; - if ($class_name) { - $extra = " ($class_name method)"; - } - my $idx = make_str_index_entry("<tt class='method'>$method()</tt>$extra"); - $idx =~ s/ \(.*\)//; - $idx =~ s/\(\)//; - return "<dt><b>$idx</b>(<var>$arg_list</var>)\n<dd>" - . $_; -} - - -sub do_cmd_methodlineni{ - local($_) = @_; - next_optional_argument(); - my $method = next_argument(); - my $arg_list = convert_args(next_argument()); - return "<dt><b>$method</b>(<var>$arg_list</var>)\n<dd>" - . $_; -} - -sub do_env_methoddescni{ - local($_) = @_; - next_optional_argument(); - my $method = next_argument(); - my $arg_list = convert_args(next_argument()); - return "<dl><dt><b>$method</b>(<var>$arg_list</var>)\n<dd>" - . $_ - . '</dl>'; -} - - -sub do_env_memberdesc{ - local($_) = @_; - my $class = next_optional_argument(); - my $member = next_argument(); - $class = $THIS_CLASS - unless $class; - my $extra = ''; - $extra = " ($class attribute)" - if ($class ne ''); - my $idx = make_str_index_entry("<tt class='member'>$member</tt>$extra"); - $idx =~ s/ \(.*\)//; - $idx =~ s/\(\)//; - return "<dl><dt><b>$idx</b>\n<dd>" . $_ . '</dl>'; -} - - -sub do_cmd_memberline{ - local($_) = @_; - my $class = next_optional_argument(); - my $member = next_argument(); - $class = $THIS_CLASS - unless $class; - my $extra = ''; - $extra = " ($class attribute)" - if ($class ne ''); - my $idx = make_str_index_entry("<tt class='member'>$member</tt>$extra"); - $idx =~ s/ \(.*\)//; - $idx =~ s/\(\)//; - return "<dt><b>$idx</b><dd>" . $_; -} - -sub do_env_memberdescni{ - local($_) = @_; - next_optional_argument(); - my $member = next_argument(); - return "<dl><dt><b><tt class='member'>$member</tt></b>\n<dd>" - . $_ - . '</dl>'; -} - - -sub do_cmd_memberlineni{ - local($_) = @_; - next_optional_argument(); - my $member = next_argument(); - return "<dt><b><tt class='member'>$member</tt></b><dd>" . $_; -} - -@col_aligns = ('<td>', '<td>', '<td>', '<td>'); - -sub fix_font{ - # do a little magic on a font name to get the right behavior in the first - # column of the output table - my $font = @_[0]; - if ($font eq 'textrm') { - $font = ''; - } - elsif ($font eq 'file' || $font eq 'filenq') { - $font = 'tt class="file"'; - } - elsif ($font eq 'member') { - $font = 'tt class="member"'; - } - elsif ($font eq 'class') { - $font = 'tt class="class"'; - } - elsif ($font eq 'constant') { - $font = 'tt class="constant"'; - } - elsif ($font eq 'kbd') { - $font = 'kbd'; - } - elsif ($font eq 'programopt') { - $font = 'b'; - } - elsif ($font eq 'exception') { - $font = 'tt class="exception"'; - } - return $font; -} - -sub figure_column_alignment{ - my $a = @_[0]; - my $mark = substr($a, 0, 1); - my $r = ''; - if ($mark eq 'c') - { $r = ' align="center"'; } - elsif ($mark eq 'r') - { $r = ' align="right"'; } - elsif ($mark eq 'l') - { $r = ' align="left"'; } - elsif ($mark eq 'p') - { $r = ' align="left"'; } - return $r; -} - -sub setup_column_alignments{ - local($_) = @_; - my($s1,$s2,$s3,$s4) = split(/[|]/,$_); - my $a1 = figure_column_alignment($s1); - my $a2 = figure_column_alignment($s2); - my $a3 = figure_column_alignment($s3); - my $a4 = figure_column_alignment($s4); - $col_aligns[0] = "<td$a1 valign=\"baseline\">"; - $col_aligns[1] = "<td$a2>"; - $col_aligns[2] = "<td$a3>"; - $col_aligns[3] = "<td$a4>"; - # return the aligned header start tags - return ("<th$a1>", "<th$a2>", "<th$a3>", "<th$a4>"); -} - -sub get_table_col1_fonts{ - my $font = $globals{'lineifont'}; - my ($sfont,$efont) = ('', ''); - if ($font) { - $sfont = "<$font>"; - $efont = "</$font>"; - $efont =~ s/ .*>/>/; - } - return ($sfont, $efont); -} - -sub do_env_tableii{ - local($_) = @_; - my($th1,$th2,$th3,$th4) = setup_column_alignments(next_argument()); - my $font = fix_font(next_argument()); - my $h1 = next_argument(); - my $h2 = next_argument(); - s/[\s\n]+//; - $globals{'lineifont'} = $font; - my $a1 = $col_aligns[0]; - my $a2 = $col_aligns[1]; - s/\\lineii</\\lineii[$a1|$a2]</g; - return '<table border align="center" style="border-collapse: collapse">' - . "\n <thead>" - . "\n <tr class=\"tableheader\">" - . "\n $th1<b>$h1</b>\ </th>" - . "\n $th2<b>$h2</b>\ </th>" - . "\n </tr>" - . "\n </thead>" - . "\n <tbody valign='baseline'>" - . $_ - . "\n </tbody>" - . "\n</table>"; -} - -sub do_env_longtableii{ - return do_env_tableii(@_); -} - -sub do_cmd_lineii{ - local($_) = @_; - my $aligns = next_optional_argument(); - my $c1 = next_argument(); - my $c2 = next_argument(); - s/[\s\n]+//; - my($sfont,$efont) = get_table_col1_fonts(); - $c2 = ' ' if ($c2 eq ''); - my($c1align,$c2align) = split('\|', $aligns); - my $padding = ''; - if ($c1align =~ /align="right"/ || $c1 eq '') { - $padding = ' '; - } - return "\n <tr>$c1align$sfont$c1$efont$padding</td>\n" - . " $c2align$c2</td>" - . $_; -} - -sub do_env_tableiii{ - local($_) = @_; - my($th1,$th2,$th3,$th4) = setup_column_alignments(next_argument()); - my $font = fix_font(next_argument()); - my $h1 = next_argument(); - my $h2 = next_argument(); - my $h3 = next_argument(); - s/[\s\n]+//; - $globals{'lineifont'} = $font; - my $a1 = $col_aligns[0]; - my $a2 = $col_aligns[1]; - my $a3 = $col_aligns[2]; - s/\\lineiii</\\lineiii[$a1|$a2|$a3]</g; - return '<table border align="center" style="border-collapse: collapse">' - . "\n <thead>" - . "\n <tr class=\"tableheader\">" - . "\n $th1<b>$h1</b>\ </th>" - . "\n $th2<b>$h2</b>\ </th>" - . "\n $th3<b>$h3</b>\ </th>" - . "\n </tr>" - . "\n </thead>" - . "\n <tbody valign='baseline'>" - . $_ - . "\n </tbody>" - . "\n</table>"; -} - -sub do_env_longtableiii{ - return do_env_tableiii(@_); -} - -sub do_cmd_lineiii{ - local($_) = @_; - my $aligns = next_optional_argument(); - my $c1 = next_argument(); - my $c2 = next_argument(); - my $c3 = next_argument(); - s/[\s\n]+//; - my($sfont,$efont) = get_table_col1_fonts(); - $c3 = ' ' if ($c3 eq ''); - my($c1align,$c2align,$c3align) = split('\|', $aligns); - my $padding = ''; - if ($c1align =~ /align="right"/ || $c1 eq '') { - $padding = ' '; - } - return "\n <tr>$c1align$sfont$c1$efont$padding</td>\n" - . " $c2align$c2</td>\n" - . " $c3align$c3</td>" - . $_; -} - -sub do_env_tableiv{ - local($_) = @_; - my($th1,$th2,$th3,$th4) = setup_column_alignments(next_argument()); - my $font = fix_font(next_argument()); - my $h1 = next_argument(); - my $h2 = next_argument(); - my $h3 = next_argument(); - my $h4 = next_argument(); - s/[\s\n]+//; - $globals{'lineifont'} = $font; - my $a1 = $col_aligns[0]; - my $a2 = $col_aligns[1]; - my $a3 = $col_aligns[2]; - my $a4 = $col_aligns[3]; - s/\\lineiv</\\lineiv[$a1|$a2|$a3|$a4]</g; - return '<table border align="center" style="border-collapse: collapse">' - . "\n <thead>" - . "\n <tr class=\"tableheader\">" - . "\n $th1<b>$h1</b>\ </th>" - . "\n $th2<b>$h2</b>\ </th>" - . "\n $th3<b>$h3</b>\ </th>" - . "\n $th4<b>$h4</b>\ </th>" - . "\n </tr>" - . "\n </thead>" - . "\n <tbody valign='baseline'>" - . $_ - . "\n </tbody>" - . "\n</table>"; -} - -sub do_env_longtableiv{ - return do_env_tableiv(@_); -} - -sub do_cmd_lineiv{ - local($_) = @_; - my $aligns = next_optional_argument(); - my $c1 = next_argument(); - my $c2 = next_argument(); - my $c3 = next_argument(); - my $c4 = next_argument(); - s/[\s\n]+//; - my($sfont,$efont) = get_table_col1_fonts(); - $c4 = ' ' if ($c4 eq ''); - my($c1align,$c2align,$c3align,$c4align) = split('\|', $aligns); - my $padding = ''; - if ($c1align =~ /align="right"/ || $c1 eq '') { - $padding = ' '; - } - return "\n <tr>$c1align$sfont$c1$efont$padding</td>\n" - . " $c2align$c2</td>\n" - . " $c3align$c3</td>\n" - . " $c4align$c4</td>" - . $_; -} - - -# These can be used to control the title page appearance; -# they need a little bit of documentation. -# -# If $TITLE_PAGE_GRAPHIC is set, it should be the name of a file in the -# $ICONSERVER directory, or include path information (other than "./"). The -# default image type will be assumed if an extension is not provided. -# -# If specified, the "title page" will contain two colums: one containing the -# title/author/etc., and the other containing the graphic. Use the other -# four variables listed here to control specific details of the layout; all -# are optional. -# -# $TITLE_PAGE_GRAPHIC = "my-company-logo"; -# $TITLE_PAGE_GRAPHIC_COLWIDTH = "30%"; -# $TITLE_PAGE_GRAPHIC_WIDTH = 150; -# $TITLE_PAGE_GRAPHIC_HEIGHT = 150; -# $TITLE_PAGE_GRAPHIC_ON_RIGHT = 0; - -sub make_my_titlepage() { - my $the_title = ""; - if ($t_title) { - $the_title .= "\n<h1>$t_title</h1>"; - } - else { - write_warnings("\nThis document has no title."); - } - if ($t_author) { - if ($t_authorURL) { - my $href = translate_commands($t_authorURL); - $href = make_named_href('author', $href, - "<b><font size='+2'>$t_author</font></b>"); - $the_title .= "\n<p>$href</p>"; - } - else { - $the_title .= ("\n<p><b><font size='+2'>$t_author</font></b></p>"); - } - } - else { - write_warnings("\nThere is no author for this document."); - } - if ($t_institute) { - $the_title .= "\n<p>$t_institute</p>"; - } - if ($DEVELOPER_ADDRESS) { - $the_title .= "\n<p>$DEVELOPER_ADDRESS</p>"; - } - if ($t_affil) { - $the_title .= "\n<p><i>$t_affil</i></p>"; - } - if ($t_date) { - $the_title .= "\n<p>"; - if ($PACKAGE_VERSION) { - $the_title .= "<strong>Release $PACKAGE_VERSION</strong><br>\n"; - } - $the_title .= "<strong>$t_date</strong></p>" - } - if ($t_address) { - $the_title .= "\n<p>$t_address</p>"; - } - else { - $the_title .= "\n<p>"; - } - if ($t_email) { - $the_title .= "\n<p>$t_email</p>"; - } - return $the_title; -} - -sub make_my_titlegraphic() { - my $filename = make_icon_filename($TITLE_PAGE_GRAPHIC); - my $graphic = "<td class=\"titlegraphic\""; - $graphic .= " width=\"$TITLE_PAGE_GRAPHIC_COLWIDTH\"" - if ($TITLE_PAGE_GRAPHIC_COLWIDTH); - $graphic .= "><img"; - $graphic .= " width=\"$TITLE_PAGE_GRAPHIC_WIDTH\"" - if ($TITLE_PAGE_GRAPHIC_WIDTH); - $graphic .= " height=\"$TITLE_PAGE_GRAPHIC_HEIGHT\"" - if ($TITLE_PAGE_GRAPHIC_HEIGHT); - $graphic .= "\n src=\"$filename\"></td>\n"; - return $graphic; -} - -sub do_cmd_maketitle { - local($_) = @_; - my $the_title = "\n<div class=\"titlepage\">"; - if ($TITLE_PAGE_GRAPHIC) { - if ($TITLE_PAGE_GRAPHIC_ON_RIGHT) { - $the_title .= ("\n<table border=\"0\" width=\"100%\">" - . "<tr align=\"right\">\n<td>" - . make_my_titlepage() - . "</td>\n" - . make_my_titlegraphic() - . "</tr>\n</table>"); - } - else { - $the_title .= ("\n<table border=\"0\" width=\"100%\"><tr>\n" - . make_my_titlegraphic() - . "<td>" - . make_my_titlepage() - . "</td></tr>\n</table>"); - } - } - else { - $the_title .= ("\n<center>" - . make_my_titlepage() - . "\n</center>"); - } - $the_title .= "\n</div>"; - return $the_title . $_; - $the_title .= "\n</center></div>"; - return $the_title . $_ ; -} - - -# -# Module synopsis support -# - -require SynopsisTable; - -sub get_chapter_id(){ - my $id = do_cmd_thechapter(''); - $id =~ s/<SPAN CLASS="arabic">(\d+)<\/SPAN>/\1/; - $id =~ s/\.//; - return $id; -} - -# 'chapter' => 'SynopsisTable instance' -%ModuleSynopses = (); - -sub get_synopsis_table($){ - my($chap) = @_; - my $key; - foreach $key (keys %ModuleSynopses) { - if ($key eq $chap) { - return $ModuleSynopses{$chap}; - } - } - my $st = SynopsisTable->new(); - $ModuleSynopses{$chap} = $st; - return $st; -} - -sub do_cmd_moduleauthor{ - local($_) = @_; - next_argument(); - next_argument(); - return $_; -} - -sub do_cmd_sectionauthor{ - local($_) = @_; - next_argument(); - next_argument(); - return $_; -} - -sub do_cmd_declaremodule{ - local($_) = @_; - my $key = next_optional_argument(); - my $type = next_argument(); - my $name = next_argument(); - my $st = get_synopsis_table(get_chapter_id()); - # - $key = $name unless $key; - $type = 'built-in' if $type eq 'builtin'; - $st->declare($name, $key, $type); - define_module($type, $name); - return anchor_label("module-$key",$CURRENT_FILE,$_) -} - -sub do_cmd_modulesynopsis{ - local($_) = @_; - my $st = get_synopsis_table(get_chapter_id()); - $st->set_synopsis($THIS_MODULE, translate_commands(next_argument())); - return $_; -} - -sub do_cmd_localmoduletable{ - local($_) = @_; - my $chap = get_chapter_id(); - my $st = get_synopsis_table($chap); - $st->set_file("$CURRENT_FILE"); - return "<tex2html-localmoduletable><$chap>\\tableofchildlinks[off]" . $_; -} - -sub process_all_localmoduletables{ - my $key; - my $st, $file; - foreach $key (keys %ModuleSynopses) { - $st = $ModuleSynopses{$key}; - $file = $st->get_file(); - if ($file) { - process_localmoduletables_in_file($file); - } - else { - print "\nsynopsis table $key has no file association"; - } - } -} - -sub process_localmoduletables_in_file{ - my $file = @_[0]; - open(MYFILE, "<$file"); - local($_); - sysread(MYFILE, $_, 1024*1024); - close(MYFILE); - # need to get contents of file in $_ - while (/<tex2html-localmoduletable><(\d+)>/) { - my $match = $&; - my $chap = $1; - my $st = get_synopsis_table($chap); - my $data = $st->tohtml(); - s/$match/$data/; - } - open(MYFILE,">$file"); - print MYFILE $_; - close(MYFILE); -} -sub process_python_state{ - process_all_localmoduletables(); -} - - -# -# "See also:" -- references placed at the end of a \section -# - -sub do_env_seealso{ - return "<div class='seealso'>\n " - . "<p class='heading'><b>See Also:</b></p>\n" - . @_[0] - . '</div>'; -} - -sub do_cmd_seemodule{ - # Insert the right magic to jump to the module definition. This should - # work most of the time, at least for repeat builds.... - local($_) = @_; - my $key = next_optional_argument(); - my $module = next_argument(); - my $text = next_argument(); - my $period = '.'; - $key = $module - unless $key; - if ($text =~ /\.$/) { - $period = ''; - } - return '<dl compact class="seemodule">' - . "\n <dt>Module <b><tt class='module'><a href='module-$key.html'>" - . "$module</a></tt>:</b>" - . "\n <dd>$text$period\n </dl>" - . $_; -} - -sub strip_html_markup($){ - my $str = @_[0]; - my $s = "$str"; - $s =~ s/<[a-zA-Z0-9]+(\s+[a-zA-Z0-9]+(\s*=\s*(\'[^\']*\'|\"[^\"]*\"|[a-zA-Z0-9]+))?)*\s*>//g; - $s =~ s/<\/[a-zA-Z0-9]+>//g; - return $s; -} - -sub handle_rfclike_reference{ - local($_, $what, $format) = @_; - my $rfcnum = next_argument(); - my $title = next_argument(); - my $text = next_argument(); - my $url = get_rfc_url($rfcnum, $format); - my $icon = get_link_icon($url); - my $attrtitle = strip_html_markup($title); - return '<dl compact class="seerfc">' - . "\n <dt><a href=\"$url\"" - . "\n title=\"$attrtitle\"" - . "\n >$what $rfcnum, <em>$title</em>$icon</a>" - . "\n <dd>$text\n </dl>" - . $_; -} - -sub do_cmd_seepep{ - return handle_rfclike_reference(@_[0], "PEP", $PEP_FORMAT); -} - -sub do_cmd_seerfc{ - return handle_rfclike_reference(@_[0], "RFC", $RFC_FORMAT); -} - -sub do_cmd_seetitle{ - local($_) = @_; - my $url = next_optional_argument(); - my $title = next_argument(); - my $text = next_argument(); - if ($url) { - my $icon = get_link_icon($url); - return '<dl compact class="seetitle">' - . "\n <dt><em class=\"citetitle\"><a href=\"$url\"" - . "\n >$title$icon</a></em>" - . "\n <dd>$text\n </dl>" - . $_; - } - return '<dl compact class="seetitle">' - . "\n <dt><em class=\"citetitle\"" - . "\n >$title</em>" - . "\n <dd>$text\n </dl>" - . $_; -} - -sub do_cmd_seeurl{ - local($_) = @_; - my $url = next_argument(); - my $text = next_argument(); - my $icon = get_link_icon($url); - return '<dl compact class="seeurl">' - . "\n <dt><a href=\"$url\"" - . "\n class=\"url\">$url$icon</a>" - . "\n <dd>$text\n </dl>" - . $_; -} - -sub do_cmd_seetext{ - local($_) = @_; - my $content = next_argument(); - return '<div class="seetext"><p>' . $content . '</div>' . $_; -} - - -# -# Definition list support. -# - -sub do_env_definitions{ - return "<dl class='definitions'>" . @_[0] . "</dl>\n"; -} - -sub do_cmd_term{ - local($_) = @_; - my $term = next_argument(); - my($name,$aname,$ahref) = new_link_info(); - # could easily add an index entry here... - return "<dt><b>$aname" . $term . "</a></b>\n<dd>" . $_; -} - - -# I don't recall exactly why this was needed, but it was very much needed. -# We'll see if anything breaks when I move the "code" line out -- some -# things broke with it in. - -#code # {} -process_commands_wrap_deferred(<<_RAW_ARG_DEFERRED_CMDS_); -declaremodule # [] # {} # {} -memberline # [] # {} -methodline # [] # {} # {} -modulesynopsis # {} -platform # {} -samp # {} -setindexsubitem # {} -withsubitem # {} # {} -_RAW_ARG_DEFERRED_CMDS_ - - -$alltt_start = '<dl><dd><pre class="verbatim">'; -$alltt_end = '</pre></dl>'; - -sub do_env_alltt { - local ($_) = @_; - local($closures,$reopens,@open_block_tags); - - # get the tag-strings for all open tags - local(@keep_open_tags) = @$open_tags_R; - ($closures,$reopens) = &preserve_open_tags() if (@$open_tags_R); - - # get the tags for text-level tags only - $open_tags_R = [ @keep_open_tags ]; - local($local_closures, $local_reopens); - ($local_closures, $local_reopens,@open_block_tags) - = &preserve_open_block_tags - if (@$open_tags_R); - - $open_tags_R = [ @open_block_tags ]; - - do { - local($open_tags_R) = [ @open_block_tags ]; - local(@save_open_tags) = (); - - local($cnt) = ++$global{'max_id'}; - $_ = join('',"$O$cnt$C\\tt$O", ++$global{'max_id'}, $C - , $_ , $O, $global{'max_id'}, "$C$O$cnt$C"); - - $_ = &translate_environments($_); - $_ = &translate_commands($_) if (/\\/); - - # preserve space-runs, using - while (s/(\S) ( +)/$1$2;SPMnbsp;/g){}; - s/(<BR>) /$1;SPMnbsp;/g; - - $_ = join('', $closures, $alltt_start, $local_reopens - , $_ - , &balance_tags() #, $local_closures - , $alltt_end, $reopens); - undef $open_tags_R; undef @save_open_tags; - }; - $open_tags_R = [ @keep_open_tags ]; - $_; -} - - -1; # This must be the last line diff --git a/doc/tools/push-docs.sh b/doc/tools/push-docs.sh deleted file mode 100755 index c227bcf..0000000 --- a/doc/tools/push-docs.sh +++ /dev/null @@ -1,42 +0,0 @@ -#! /bin/sh - -# Script to push docs from my development area to SourceForge, where the -# update-docs.sh script unpacks them into their final destination. - -TARGET=python.sourceforge.net:/home/users/fdrake/tmp - -ADDRESSES='python-dev@python.org doc-sig@python.org python-list@python.org' - -EXPLANATION='' - -if [ "$1" = '-m' ] ; then - EXPLANATION="$2" - shift 2 -elif [ "$1" ] ; then - EXPLANATION="`cat $1`" - shift 1 -fi - -START="`pwd`" -MYDIR="`dirname $0`" -cd "$MYDIR" -MYDIR="`pwd`" - -cd .. - -# now in .../Doc/ -make --no-print-directory || exit $? -make --no-print-directory bziphtml || exit $? -RELEASE=`grep '^RELEASE=' Makefile | sed 's|RELEASE=||'` -PACKAGE="html-$RELEASE.tar.bz2" -scp "$PACKAGE" tools/update-docs.sh $TARGET/ || exit $? -ssh python.sourceforge.net tmp/update-docs.sh $PACKAGE '&&' rm tmp/update-docs.sh || exit $? - -Mail -s '[development doc updates]' $ADDRESSES <<EOF -The development version of the documentation has been updated: - - http://python.sourceforge.net/devel-docs/ - -$EXPLANATION -EOF -exit $? diff --git a/doc/tools/refcounts.py b/doc/tools/refcounts.py deleted file mode 100644 index d1c9007..0000000 --- a/doc/tools/refcounts.py +++ /dev/null @@ -1,97 +0,0 @@ -"""Support functions for loading the reference count data file.""" -__version__ = '$Revision: 1.1.1.1 $' - -import os -import string -import sys - - -# Determine the expected location of the reference count file: -try: - p = os.path.dirname(__file__) -except NameError: - p = sys.path[0] -p = os.path.normpath(os.path.join(os.getcwd(), p, os.pardir, - "api", "refcounts.dat")) -DEFAULT_PATH = p -del p - - -def load(path=DEFAULT_PATH): - return loadfile(open(path)) - - -def loadfile(fp): - d = {} - while 1: - line = fp.readline() - if not line: - break - line = string.strip(line) - if line[:1] in ("", "#"): - # blank lines and comments - continue - parts = string.split(line, ":", 4) - function, type, arg, refcount, comment = parts - if refcount == "null": - refcount = None - elif refcount: - refcount = int(refcount) - else: - refcount = None - # - # Get the entry, creating it if needed: - # - try: - entry = d[function] - except KeyError: - entry = d[function] = Entry(function) - # - # Update the entry with the new parameter or the result information. - # - if arg: - entry.args.append((arg, type, refcount)) - else: - entry.result_type = type - entry.result_refs = refcount - return d - - -class Entry: - def __init__(self, name): - self.name = name - self.args = [] - self.result_type = '' - self.result_refs = None - - -def dump(d): - """Dump the data in the 'canonical' format, with functions in - sorted order.""" - items = d.items() - items.sort() - first = 1 - for k, entry in items: - if first: - first = 0 - else: - print - s = entry.name + ":%s:%s:%s:" - if entry.result_refs is None: - r = "" - else: - r = entry.result_refs - print s % (entry.result_type, "", r) - for t, n, r in entry.args: - if r is None: - r = "" - print s % (t, n, r) - - -def main(): - d = load() - dump(d) - - -if __name__ == "__main__": - main() diff --git a/doc/tools/sgmlconv/Makefile b/doc/tools/sgmlconv/Makefile deleted file mode 100644 index 30a846e..0000000 --- a/doc/tools/sgmlconv/Makefile +++ /dev/null @@ -1,67 +0,0 @@ -# Simple makefile to control XML generation for the entire document tree. -# This should be used from the top-level directory (Doc/), not the directory -# that actually contains this file: -# -# $ pwd -# .../Doc -# $ make -f tools/sgmlconv/Makefile - -TOPDIR=. -TOOLSDIR=tools - -SGMLRULES=../$(TOOLSDIR)/sgmlconv/make.rules -# The 'inst' directory breaks the conversion, so skip it for now. -SUBDIRS=api dist ext lib mac ref tut -SUBMAKE=$(MAKE) -f $(SGMLRULES) TOOLSDIR=../$(TOOLSDIR) - -all: xml - -.PHONY: esis xml -.PHONY: $(SUBDIRS) - -xml: - for DIR in $(SUBDIRS) ; do \ - (cd $$DIR; $(SUBMAKE) xml) || exit $$? ; done - -esis: - for DIR in $(SUBDIRS) ; do \ - (cd $$DIR; $(SUBMAKE) esis) || exit $$? ; done - -esis1: - for DIR in $(SUBDIRS) ; do \ - (cd $$DIR; $(SUBMAKE) esis1) || exit $$? ; done - -tarball: xml - tar cf - tools/sgmlconv */*.xml | gzip -9 >xml-1.5.2b2.tgz - -api: - cd api; $(SUBMAKE) - -dist: - cd dist; $(SUBMAKE) - -ext: - cd ext; $(SUBMAKE) - -inst: - cd inst; $(SUBMAKE) - -lib: - cd lib; $(SUBMAKE) - -mac: - cd mac; $(SUBMAKE) - -ref: - cd ref; $(SUBMAKE) - -tut: - cd tut; $(SUBMAKE) - -clean: - for DIR in $(SUBDIRS) ; do \ - (cd $$DIR; $(SUBMAKE) clean) ; done - -clobber: - for DIR in $(SUBDIRS) ; do \ - (cd $$DIR; $(SUBMAKE) clobber) ; done diff --git a/doc/tools/sgmlconv/README b/doc/tools/sgmlconv/README deleted file mode 100644 index 1546293..0000000 --- a/doc/tools/sgmlconv/README +++ /dev/null @@ -1,58 +0,0 @@ -These scripts and Makefile fragment are used to convert the Python -documentation in LaTeX format to XML. - -This material is preliminary and incomplete. Python 2.0 is required. - -To convert all documents to XML: - - cd Doc/ - make -f tools/sgmlconv/Makefile - -To convert one document to XML: - - cd Doc/<document-dir> - make -f ../tools/sgmlconv/make.rules TOOLSDIR=../tools - -Please send comments and bug reports to python-docs@python.org. - - -What do the tools do? ---------------------- - -latex2esis.py - Reads in a conversion specification written in XML - (conversion.xml), reads a LaTeX document fragment, and interprets - the markup according to the specification. The output is a stream - of ESIS events like those created by the nsgmls SGML parser, but - is *not* guaranteed to represent a single tree! This is done to - allow conversion per entity rather than per document. Since many - of the LaTeX files for the Python documentation contain two - sections on closely related modules, it is important to allow both - of the resulting <section> elements to exist in the same output - stream. Additionally, since comments are not supported in ESIS, - comments are converted to <COMMENT> elements, which might exist at - the same level as the top-level content elements. - - The output of latex2esis.py gets saved as <filename>.esis1. - -docfixer.py - This is the really painful part of the conversion. Well, it's the - second really painful part, but more of the pain is specific to - the structure of the Python documentation and desired output - rather than to the parsing of LaTeX markup. - - This script loads the ESIS data created by latex2esis.py into a - DOM document *fragment* (remember, the latex2esis.py output may - not be well-formed). Once loaded, it walks over the tree many - times looking for a variety of possible specific - micro-conversions. Most of the code is not in any way "general". - After processing the fragment, a new ESIS data stream is written - out. Like the input, it may not represent a well-formed - document, but does represent a parsed entity. - - The output of docfixer.py is what gets saved in <filename>.esis. - -esis2sgml.py - Reads an ESIS stream and convert to SGML or XML. This also - converts <COMMENT> elements to real comments. This works quickly - because there's not much to actually do. diff --git a/doc/tools/sgmlconv/conversion.xml b/doc/tools/sgmlconv/conversion.xml deleted file mode 100644 index 7759bad..0000000 --- a/doc/tools/sgmlconv/conversion.xml +++ /dev/null @@ -1,757 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<conversion> - <!-- Miscellaneous. --> - <macro name="declaremodule"> - <attribute name="id" optional="yes"/> - <attribute name="type"/> - <attribute name="name"/> - </macro> - <macro name="modulesynopsis"> - <content/> - </macro> - <macro name="platform"> - <content/> - </macro> - <macro name="deprecated"> - <attribute name="version"/> - <content/> - </macro> - <macro name="label"> - <attribute name="id"/> - </macro> - <macro name="nodename" outputname="label"> - <attribute name="id"/> - </macro> - <macro name="localmoduletable"/> - <macro name="manpage"> - <attribute name="name"/> - <attribute name="section"/> - </macro> - <macro name="module"> - <content/> - </macro> - <macro name="moduleauthor"> - <attribute name="name"/> - <attribute name="email"/> - </macro> - <macro name="citetitle"> - <attribute name="href" optional="yes"/> - <content/> - </macro> - <macro name="rfc"> - <attribute name="num"/> - </macro> - <macro name="sectionauthor" outputname="author"> - <attribute name="name"/> - <attribute name="email"/> - </macro> - <macro name="author"> - <attribute name="name"/> - </macro> - <macro name="authoraddress"> - <content/> - </macro> - <macro name="shortversion"/> - <macro name="versionadded"> - <attribute name="version"/> - </macro> - <!-- This is broken: we need to re-order the optional and required - parameters, making the optional parameter the content for the - element. The processor is not powerful enough to handle this. - --> - <macro name="versionchanged"> - <attribute name="how" optional="yes"/> - <attribute name="version"/> - </macro> - - <!-- Module referencing. --> - <macro name="refmodule" outputname="module"> - <attribute name="" optional="yes"/> - <attribute name="link">yes</attribute> - <content/> - </macro> - - <!-- Information units. --> - <!-- C things. --> - <environment name="cfuncdesc"> - <attribute name="type"/> - <attribute name="name"/> - <child name="args"/> - </environment> - <environment name="ctypedesc"> - <attribute name="tag" optional="yes"/> - <attribute name="name"/> - </environment> - <environment name="cvardesc"> - <attribute name="type"/> - <attribute name="name"/> - </environment> - - <!-- Python things. --> - <macro name="optional"> - <content/> - </macro> - <macro name="unspecified"/> - <macro name="moreargs"/> - <environment name="classdesc"> - <attribute name="name"/> - <child name="args"/> - </environment> - <environment name="datadesc"> - <attribute name="name"/> - </environment> - <macro name="dataline"> - <attribute name="name"/> - </macro> - <environment name="excdesc"> - <attribute name="name"/> - </environment> - - <environment name="funcdesc"> - <attribute name="name"/> - <child name="args"/> - </environment> - <macro name="funcline"> - <attribute name="name"/> - <child name="args"/> - </macro> - <environment name="funcdescni" outputname="funcdesc"> - <attribute name="index">no</attribute> - <attribute name="name"/> - <child name="args"/> - </environment> - <macro name="funclineni" outputname="funcline"> - <attribute name="index">no</attribute> - <attribute name="name"/> - <child name="args"/> - </macro> - - <environment name="memberdesc"> - <attribute name="class" optional="yes"/> - <attribute name="name"/> - </environment> - <environment name="memberdescni" outputname="memberdesc"> - <attribute name="index">no</attribute> - <attribute name="class" optional="yes"/> - <attribute name="name"/> - </environment> - - <environment name="methoddesc"> - <attribute name="class" optional="yes"/> - <attribute name="name"/> - <child name="args"/> - </environment> - <macro name="methodline"> - <attribute name="class" optional="yes"/> - <attribute name="name"/> - <child name="args"/> - </macro> - <environment name="methoddescni"> - <attribute name="index">no</attribute> - <attribute name="class" optional="yes"/> - <attribute name="name"/> - <child name="args"/> - </environment> - <macro name="methodlineni" outputname="methodline"> - <attribute name="index">no</attribute> - <attribute name="class" optional="yes"/> - <attribute name="name"/> - <child name="args"/> - </macro> - - <environment name="opcodedesc"> - <attribute name="name"/> - <attribute name="var"/> - </environment> - - <!-- "See also:" sections. --> - <macro name="seemodule"> - <attribute name="ref" optional="yes"/> - <attribute name="name"/> - <child name="description"/> - </macro> - <macro name="seepep"> - <attribute name="number"/> - <child name="title"/> - <child name="description"/> - </macro> - <macro name="seerfc"> - <attribute name="number"/> - <child name="title"/> - <child name="description"/> - </macro> - <macro name="seetext"> - <child name="description"/> - </macro> - <macro name="seetitle"> - <attribute name="href" optional="yes"/> - <child name="title"/> - <child name="description"/> - </macro> - <macro name="seeurl"> - <attribute name="href"/> - <child name="description"/> - </macro> - - <!-- Index-generating markup. --> - <macro name="index" outputname="indexterm"> - <attribute name="term1"/> - </macro> - <macro name="indexii" outputname="indexterm"> - <attribute name="term1"/> - <attribute name="term2"/> - </macro> - <macro name="indexiii" outputname="indexterm"> - <attribute name="term1"/> - <attribute name="term2"/> - <attribute name="term3"/> - </macro> - <macro name="indexiv" outputname="indexterm"> - <attribute name="term1"/> - <attribute name="term2"/> - <attribute name="term3"/> - <attribute name="term4"/> - </macro> - - <macro name="ttindex" outputname="indexterm"> - <attribute name="style">tt</attribute> - <attribute name="term1"/> - </macro> - - <macro name="refmodindex"> - <attribute name="module"/> - </macro> - <macro name="stmodindex"> - <attribute name="module"/> - </macro> - <macro name="refbimodindex" outputname="refmodindex"> - <attribute name="module"/> - </macro> - <macro name="refexmodindex" outputname="refmodindex"> - <attribute name="module"/> - </macro> - <macro name="refstmodindex" outputname="refmodindex"> - <attribute name="module"/> - </macro> - - <macro name="bifuncindex"> - <attribute name="name"/> - </macro> - <macro name="exindex"> - <attribute name="name"/> - </macro> - <macro name="obindex"> - <attribute name="name"/> - </macro> - <macro name="kwindex"> - <attribute name="name"/> - </macro> - <macro name="opindex"> - <attribute name="type"/> - </macro> - <macro name="stindex"> - <attribute name="type"/> - </macro> - <macro name="withsubitem"> - <attribute name="text"/> - <content/> - </macro> - <macro name="setindexsubitem"> - <attribute name="text"/> - </macro> - - <!-- Entity management. --> - <macro name="include"> - <attribute name="source"/> - </macro> - <macro name="input"> - <attribute name="source"/> - </macro> - - <!-- Large-scale document structure. --> - <macro name="documentclass"> - <attribute name="classname"/> - </macro> - - <macro name="usepackage"> - <attribute name="options" optional="yes"/> - <attribute name="pkg"/> - </macro> - - <environment name="document" - endcloses="chapter chapter* section section* - subsection subsection* - subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"/> - - <macro name="chapter" - closes="chapter chapter* section section* subsection subsection* - subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - <macro name="chapter*" outputname="chapter" - closes="chapter chapter* section section* subsection subsection* - subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"> - <attribute name="numbered">no</attribute> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - - <macro name="section" - closes="section section* subsection subsection* - subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - <macro name="section*" outputname="section" - closes="section section* subsection subsection* - subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"> - <attribute name="numbered">no</attribute> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - - <macro name="subsection" - closes="subsection subsection* subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - <macro name="subsection*" outputname="subsection" - closes="subsection subsection* subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"> - <attribute name="numbered">no</attribute> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - - <macro name="subsubsection" - closes="subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - <macro name="subsubsection*" outputname="subsubsection" - closes="subsubsection subsubsection* - paragraph paragraph* subparagraph subparagraph*"> - <attribute name="numbered">no</attribute> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - - <macro name="paragraph" - closes="paragraph paragraph* subparagraph subparagraph*"> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - <macro name="paragraph*" outputname="paragraph" - closes="paragraph paragraph* subparagraph subparagraph*"> - <attribute name="numbered">no</attribute> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - - <macro name="subparagraph" - closes="subparagraph subparagraph*"> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - <macro name="subparagraph*" outputname="subparagraph" - closes="subparagraph subparagraph*"> - <attribute name="numbered">no</attribute> - <text> -</text> - <child name="title"/> - <content implied="yes"/> - </macro> - <macro name="title"> - <content/> - </macro> - - <macro name="appendix" outputname="back-matter" - closes="chapter chapter* section subsection subsubsection - paragraph subparagraph"/> - - <environment name="list" - endcloses="item"> - <attribute name="bullet"/> - <attribute name="init"/> - </environment> - <macro name="item" closes="item"> - <child name="leader" optional="yes"/> - <content implied="yes"/> - </macro> - - <macro name="ref"> - <attribute name="ref"/> - </macro> - - <environment name="description" outputname="descriptionlist" - endcloses="item"/> - - <environment name="enumerate" outputname="enumeration" - endcloses="item"/> - - <environment name="fulllineitems" - endcloses="item"/> - - <environment name="itemize" - endcloses="item"/> - - <environment name="definitions" outputname="definitionlist" - encloses="term"/> - <macro name="term" closes="definition"> - <!-- not really optional, but uses the [] syntax --> - <child name="term" optional="yes"/> - <child name="definition" implied="yes"/> - </macro> - - <environment name="alltt" outputname="verbatim"/> - <environment name="comment" verbatim="yes"/> - <environment name="verbatim" verbatim="yes"/> - <environment name="verbatim*" verbatim="yes"> - <!-- not used anywhere, but it's a standard LaTeXism --> - <attribute name="spaces">visible</attribute> - </environment> - - <!-- Table markup. --> - <macro name="hline"/> - <environment name="tableii" outputname="table"> - <attribute name="cols">2</attribute> - <attribute name="colspec"/> - <attribute name="style"/> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </environment> - <environment name="longtableii" outputname="table"> - <attribute name="cols">2</attribute> - <attribute name="colspec"/> - <attribute name="style"/> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </environment> - <macro name="lineii" outputname="row"> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </macro> - - <environment name="tableiii" outputname="table"> - <attribute name="cols">3</attribute> - <attribute name="colspec"/> - <attribute name="style"/> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </environment> - <environment name="longtableiii" outputname="table"> - <attribute name="cols">3</attribute> - <attribute name="colspec"/> - <attribute name="style"/> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </environment> - <macro name="lineiii" outputname="row"> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </macro> - - <environment name="tableiv" outputname="table"> - <attribute name="cols">4</attribute> - <attribute name="colspec"/> - <attribute name="style"/> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </environment> - <environment name="longtableiv" outputname="table"> - <attribute name="cols">4</attribute> - <attribute name="colspec"/> - <attribute name="style"/> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </environment> - <macro name="lineiv" outputname="row"> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - <text> - </text> - <child name="entry"/> - </macro> - - <!-- These are handled at a later translation stage, at least for now. --> - <macro name="Cpp" outputname=""> - <text>C++</text> - </macro> - <macro name="geq" outputname=""> - <entityref name="geq"/> - </macro> - <macro name="LaTeX" outputname=""> - <text>LaTeX</text> - </macro> - <macro name="ldots" outputname=""> - <text>...</text> - </macro> - <macro name="leq" outputname=""> - <entityref name="leq"/> - </macro> - <macro name="TeX" outputname=""> - <text>TeX</text> - </macro> - <macro name="version"/> - - <!-- Distutils things. --> - <macro name="command"> - <content/> - </macro> - <macro name="option"> - <content/> - </macro> - <macro name="filevar" outputname="var"> - <content/> - </macro> - <macro name="XXX" outputname="editorial-comment"> - <content/> - </macro> - - <!-- Misc. --> - <macro name="emph"> - <content/> - </macro> - <macro name="strong"> - <content/> - </macro> - <macro name="textrm"> - <content/> - </macro> - <macro name="texttt"> - <content/> - </macro> - <macro name="code"> - <content/> - </macro> - <macro name="exception"> - <content/> - </macro> - <macro name="keyword"> - <content/> - </macro> - <macro name="samp"> - <content/> - </macro> - <macro name="class"> - <content/> - </macro> - <macro name="cdata"> - <content/> - </macro> - <macro name="cfunction"> - <content/> - </macro> - <macro name="ctype"> - <content/> - </macro> - <macro name="pytype"> - <content/> - </macro> - <macro name="character"> - <content/> - </macro> - <macro name="constant"> - <content/> - </macro> - <macro name="envvar" outputname="envar"> - <content/> - </macro> - <macro name="file" outputname="filename"> - <content/> - </macro> - <macro name="filenq" outputname="filename"> - <attribute name="quote">no</attribute> - <content/> - </macro> - <macro name="function"> - <content/> - </macro> - <macro name="kbd"> - <content/> - </macro> - <macro name="makevar"> - <content/> - </macro> - <macro name="method"> - <content/> - </macro> - <macro name="member"> - <content/> - </macro> - <macro name="mimetype"> - <content/> - </macro> - <macro name="newsgroup"> - <content/> - </macro> - <macro name="program" outputname="command"> - <content/> - </macro> - <macro name="programopt" outputname="option"> - <content/> - </macro> - <macro name="longprogramopt" outputname="longoption"> - <content/> - </macro> - <macro name="regexp"> - <content/> - </macro> - <macro name="var"> - <content/> - </macro> - <macro name="email"> - <content/> - </macro> - <macro name="url"> - <content/> - </macro> - <macro name="footnote"> - <content/> - </macro> - <macro name="dfn" outputname="definedterm"> - <content/> - </macro> - - <macro name="mbox"> - <content/> - </macro> - - <!-- minimal math stuff to get by --> - <macro name="pi"/> - <macro name="sqrt"> - <content/> - </macro> - <macro name="frac" outputname="fraction"> - <child name="numerator"/> - <child name="denominator"/> - </macro> - <macro name="sum"> - <content/> - </macro> - - <!-- Conversions to text; perhaps could be different? There's --> - <!-- no way for a style sheet to work with these this way. --> - <macro name="ABC" outputname=""> - <text>ABC</text> - </macro> - <macro name="ASCII" outputname=""> - <text>ASCII</text> - </macro> - <macro name="C" outputname=""> - <text>C</text> - </macro> - <macro name="EOF" outputname=""> - <text>EOF</text> - </macro> - <macro name="e" outputname=""> - <text>\</text> - </macro> - <macro name="NULL" outputname="constant"> - <text>NULL</text> - </macro> - <macro name="POSIX" outputname=""> - <text>POSIX</text> - </macro> - <macro name="UNIX" outputname=""> - <text>Unix</text> - </macro> - <macro name="textasciitilde" outputname=""> - <text>~</text> - </macro> - - <!-- These will end up disappearing as well! --> - <macro name="catcode" outputname=""/> - <macro name="fi" outputname=""/> - <macro name="ifhtml" outputname=""/> - <macro name="indexname" outputname=""/> - <macro name="labelwidth" outputname=""/> - <macro name="large" outputname=""/> - <macro name="leftmargin" outputname=""/> - <macro name="makeindex" outputname=""/> - <macro name="makemodindex" outputname=""/> - <macro name="maketitle" outputname=""/> - <macro name="noindent" outputname=""/> - <macro name="protect" outputname=""/> - <macro name="renewcommand"> - <attribute name="macro"/> - <attribute name="nargs" optional="yes"/> - <content/> - </macro> - <macro name="tableofcontents" outputname=""/> - <macro name="vspace"> - <attribute name="size"/> - </macro> -</conversion> diff --git a/doc/tools/sgmlconv/docfixer.py b/doc/tools/sgmlconv/docfixer.py deleted file mode 100755 index 463276b..0000000 --- a/doc/tools/sgmlconv/docfixer.py +++ /dev/null @@ -1,1033 +0,0 @@ -#! /usr/bin/env python - -"""Perform massive transformations on a document tree created from the LaTeX -of the Python documentation, and dump the ESIS data for the transformed tree. -""" - - -import errno -import esistools -import re -import string -import sys -import xml.dom -import xml.dom.minidom - -ELEMENT = xml.dom.Node.ELEMENT_NODE -ENTITY_REFERENCE = xml.dom.Node.ENTITY_REFERENCE_NODE -TEXT = xml.dom.Node.TEXT_NODE - - -class ConversionError(Exception): - pass - - -ewrite = sys.stderr.write -try: - # We can only do this trick on Unix (if tput is on $PATH)! - if sys.platform != "posix" or not sys.stderr.isatty(): - raise ImportError - import commands -except ImportError: - bwrite = ewrite -else: - def bwrite(s, BOLDON=commands.getoutput("tput bold"), - BOLDOFF=commands.getoutput("tput sgr0")): - ewrite("%s%s%s" % (BOLDON, s, BOLDOFF)) - - -PARA_ELEMENT = "para" - -DEBUG_PARA_FIXER = 0 - -if DEBUG_PARA_FIXER: - def para_msg(s): - ewrite("*** %s\n" % s) -else: - def para_msg(s): - pass - - -def get_first_element(doc, gi): - for n in doc.childNodes: - if n.nodeName == gi: - return n - -def extract_first_element(doc, gi): - node = get_first_element(doc, gi) - if node is not None: - doc.removeChild(node) - return node - - -def get_documentElement(node): - result = None - for child in node.childNodes: - if child.nodeType == ELEMENT: - result = child - return result - - -def set_tagName(elem, gi): - elem.nodeName = elem.tagName = gi - - -def find_all_elements(doc, gi): - nodes = [] - if doc.nodeName == gi: - nodes.append(doc) - for child in doc.childNodes: - if child.nodeType == ELEMENT: - if child.tagName == gi: - nodes.append(child) - for node in child.getElementsByTagName(gi): - nodes.append(node) - return nodes - -def find_all_child_elements(doc, gi): - nodes = [] - for child in doc.childNodes: - if child.nodeName == gi: - nodes.append(child) - return nodes - - -def find_all_elements_from_set(doc, gi_set): - return __find_all_elements_from_set(doc, gi_set, []) - -def __find_all_elements_from_set(doc, gi_set, nodes): - if doc.nodeName in gi_set: - nodes.append(doc) - for child in doc.childNodes: - if child.nodeType == ELEMENT: - __find_all_elements_from_set(child, gi_set, nodes) - return nodes - - -def simplify(doc, fragment): - # Try to rationalize the document a bit, since these things are simply - # not valid SGML/XML documents as they stand, and need a little work. - documentclass = "document" - inputs = [] - node = extract_first_element(fragment, "documentclass") - if node is not None: - documentclass = node.getAttribute("classname") - node = extract_first_element(fragment, "title") - if node is not None: - inputs.append(node) - # update the name of the root element - node = get_first_element(fragment, "document") - if node is not None: - set_tagName(node, documentclass) - while 1: - node = extract_first_element(fragment, "input") - if node is None: - break - inputs.append(node) - if inputs: - docelem = get_documentElement(fragment) - inputs.reverse() - for node in inputs: - text = doc.createTextNode("\n") - docelem.insertBefore(text, docelem.firstChild) - docelem.insertBefore(node, text) - docelem.insertBefore(doc.createTextNode("\n"), docelem.firstChild) - while fragment.firstChild and fragment.firstChild.nodeType == TEXT: - fragment.removeChild(fragment.firstChild) - - -def cleanup_root_text(doc): - discards = [] - skip = 0 - for n in doc.childNodes: - prevskip = skip - skip = 0 - if n.nodeType == TEXT and not prevskip: - discards.append(n) - elif n.nodeName == "COMMENT": - skip = 1 - for node in discards: - doc.removeChild(node) - - -DESCRIPTOR_ELEMENTS = ( - "cfuncdesc", "cvardesc", "ctypedesc", - "classdesc", "memberdesc", "memberdescni", "methoddesc", "methoddescni", - "excdesc", "funcdesc", "funcdescni", "opcodedesc", - "datadesc", "datadescni", - ) - -def fixup_descriptors(doc, fragment): - sections = find_all_elements(fragment, "section") - for section in sections: - find_and_fix_descriptors(doc, section) - - -def find_and_fix_descriptors(doc, container): - children = container.childNodes - for child in children: - if child.nodeType == ELEMENT: - tagName = child.tagName - if tagName in DESCRIPTOR_ELEMENTS: - rewrite_descriptor(doc, child) - elif tagName == "subsection": - find_and_fix_descriptors(doc, child) - - -def rewrite_descriptor(doc, descriptor): - # - # Do these things: - # 1. Add an "index='no'" attribute to the element if the tagName - # ends in 'ni', removing the 'ni' from the name. - # 2. Create a <signature> from the name attribute - # 2a.Create an <args> if it appears to be available. - # 3. Create additional <signature>s from <*line{,ni}> elements, - # if found. - # 4. If a <versionadded> is found, move it to an attribute on the - # descriptor. - # 5. Move remaining child nodes to a <description> element. - # 6. Put it back together. - # - # 1. - descname = descriptor.tagName - index = 1 - if descname[-2:] == "ni": - descname = descname[:-2] - descriptor.setAttribute("index", "no") - set_tagName(descriptor, descname) - index = 0 - desctype = descname[:-4] # remove 'desc' - linename = desctype + "line" - if not index: - linename = linename + "ni" - # 2. - signature = doc.createElement("signature") - name = doc.createElement("name") - signature.appendChild(doc.createTextNode("\n ")) - signature.appendChild(name) - name.appendChild(doc.createTextNode(descriptor.getAttribute("name"))) - descriptor.removeAttribute("name") - # 2a. - if descriptor.hasAttribute("var"): - if descname != "opcodedesc": - raise RuntimeError, \ - "got 'var' attribute on descriptor other than opcodedesc" - variable = descriptor.getAttribute("var") - if variable: - args = doc.createElement("args") - args.appendChild(doc.createTextNode(variable)) - signature.appendChild(doc.createTextNode("\n ")) - signature.appendChild(args) - descriptor.removeAttribute("var") - newchildren = [signature] - children = descriptor.childNodes - pos = skip_leading_nodes(children) - if pos < len(children): - child = children[pos] - if child.nodeName == "args": - # move <args> to <signature>, or remove if empty: - child.parentNode.removeChild(child) - if len(child.childNodes): - signature.appendChild(doc.createTextNode("\n ")) - signature.appendChild(child) - signature.appendChild(doc.createTextNode("\n ")) - # 3, 4. - pos = skip_leading_nodes(children, pos) - while pos < len(children) \ - and children[pos].nodeName in (linename, "versionadded"): - if children[pos].tagName == linename: - # this is really a supplemental signature, create <signature> - oldchild = children[pos].cloneNode(1) - try: - sig = methodline_to_signature(doc, children[pos]) - except KeyError: - print oldchild.toxml() - raise - newchildren.append(sig) - else: - # <versionadded added=...> - descriptor.setAttribute( - "added", children[pos].getAttribute("version")) - pos = skip_leading_nodes(children, pos + 1) - # 5. - description = doc.createElement("description") - description.appendChild(doc.createTextNode("\n")) - newchildren.append(description) - move_children(descriptor, description, pos) - last = description.childNodes[-1] - if last.nodeType == TEXT: - last.data = string.rstrip(last.data) + "\n " - # 6. - # should have nothing but whitespace and signature lines in <descriptor>; - # discard them - while descriptor.childNodes: - descriptor.removeChild(descriptor.childNodes[0]) - for node in newchildren: - descriptor.appendChild(doc.createTextNode("\n ")) - descriptor.appendChild(node) - descriptor.appendChild(doc.createTextNode("\n")) - - -def methodline_to_signature(doc, methodline): - signature = doc.createElement("signature") - signature.appendChild(doc.createTextNode("\n ")) - name = doc.createElement("name") - name.appendChild(doc.createTextNode(methodline.getAttribute("name"))) - methodline.removeAttribute("name") - signature.appendChild(name) - if len(methodline.childNodes): - args = doc.createElement("args") - signature.appendChild(doc.createTextNode("\n ")) - signature.appendChild(args) - move_children(methodline, args) - signature.appendChild(doc.createTextNode("\n ")) - return signature - - -def move_children(origin, dest, start=0): - children = origin.childNodes - while start < len(children): - node = children[start] - origin.removeChild(node) - dest.appendChild(node) - - -def handle_appendix(doc, fragment): - # must be called after simplfy() if document is multi-rooted to begin with - docelem = get_documentElement(fragment) - toplevel = docelem.tagName == "manual" and "chapter" or "section" - appendices = 0 - nodes = [] - for node in docelem.childNodes: - if appendices: - nodes.append(node) - elif node.nodeType == ELEMENT: - appnodes = node.getElementsByTagName("appendix") - if appnodes: - appendices = 1 - parent = appnodes[0].parentNode - parent.removeChild(appnodes[0]) - parent.normalize() - if nodes: - map(docelem.removeChild, nodes) - docelem.appendChild(doc.createTextNode("\n\n\n")) - back = doc.createElement("back-matter") - docelem.appendChild(back) - back.appendChild(doc.createTextNode("\n")) - while nodes and nodes[0].nodeType == TEXT \ - and not string.strip(nodes[0].data): - del nodes[0] - map(back.appendChild, nodes) - docelem.appendChild(doc.createTextNode("\n")) - - -def handle_labels(doc, fragment): - for label in find_all_elements(fragment, "label"): - id = label.getAttribute("id") - if not id: - continue - parent = label.parentNode - parentTagName = parent.tagName - if parentTagName == "title": - parent.parentNode.setAttribute("id", id) - else: - parent.setAttribute("id", id) - # now, remove <label id="..."/> from parent: - parent.removeChild(label) - if parentTagName == "title": - parent.normalize() - children = parent.childNodes - if children[-1].nodeType == TEXT: - children[-1].data = string.rstrip(children[-1].data) - - -def fixup_trailing_whitespace(doc, wsmap): - queue = [doc] - while queue: - node = queue[0] - del queue[0] - if wsmap.has_key(node.nodeName): - ws = wsmap[node.tagName] - children = node.childNodes - children.reverse() - if children[0].nodeType == TEXT: - data = string.rstrip(children[0].data) + ws - children[0].data = data - children.reverse() - # hack to get the title in place: - if node.tagName == "title" \ - and node.parentNode.firstChild.nodeType == ELEMENT: - node.parentNode.insertBefore(doc.createText("\n "), - node.parentNode.firstChild) - for child in node.childNodes: - if child.nodeType == ELEMENT: - queue.append(child) - - -def normalize(doc): - for node in doc.childNodes: - if node.nodeType == ELEMENT: - node.normalize() - - -def cleanup_trailing_parens(doc, element_names): - d = {} - for gi in element_names: - d[gi] = gi - rewrite_element = d.has_key - queue = [] - for node in doc.childNodes: - if node.nodeType == ELEMENT: - queue.append(node) - while queue: - node = queue[0] - del queue[0] - if rewrite_element(node.tagName): - children = node.childNodes - if len(children) == 1 \ - and children[0].nodeType == TEXT: - data = children[0].data - if data[-2:] == "()": - children[0].data = data[:-2] - else: - for child in node.childNodes: - if child.nodeType == ELEMENT: - queue.append(child) - - -def contents_match(left, right): - left_children = left.childNodes - right_children = right.childNodes - if len(left_children) != len(right_children): - return 0 - for l, r in map(None, left_children, right_children): - nodeType = l.nodeType - if nodeType != r.nodeType: - return 0 - if nodeType == ELEMENT: - if l.tagName != r.tagName: - return 0 - # should check attributes, but that's not a problem here - if not contents_match(l, r): - return 0 - elif nodeType == TEXT: - if l.data != r.data: - return 0 - else: - # not quite right, but good enough - return 0 - return 1 - - -def create_module_info(doc, section): - # Heavy. - node = extract_first_element(section, "modulesynopsis") - if node is None: - return - set_tagName(node, "synopsis") - lastchild = node.childNodes[-1] - if lastchild.nodeType == TEXT \ - and lastchild.data[-1:] == ".": - lastchild.data = lastchild.data[:-1] - modauthor = extract_first_element(section, "moduleauthor") - if modauthor: - set_tagName(modauthor, "author") - modauthor.appendChild(doc.createTextNode( - modauthor.getAttribute("name"))) - modauthor.removeAttribute("name") - platform = extract_first_element(section, "platform") - if section.tagName == "section": - modinfo_pos = 2 - modinfo = doc.createElement("moduleinfo") - moddecl = extract_first_element(section, "declaremodule") - name = None - if moddecl: - modinfo.appendChild(doc.createTextNode("\n ")) - name = moddecl.attributes["name"].value - namenode = doc.createElement("name") - namenode.appendChild(doc.createTextNode(name)) - modinfo.appendChild(namenode) - type = moddecl.attributes.get("type") - if type: - type = type.value - modinfo.appendChild(doc.createTextNode("\n ")) - typenode = doc.createElement("type") - typenode.appendChild(doc.createTextNode(type)) - modinfo.appendChild(typenode) - versionadded = extract_first_element(section, "versionadded") - if versionadded: - modinfo.setAttribute("added", versionadded.getAttribute("version")) - title = get_first_element(section, "title") - if title: - children = title.childNodes - if len(children) >= 2 \ - and children[0].nodeName == "module" \ - and children[0].childNodes[0].data == name: - # this is it; morph the <title> into <short-synopsis> - first_data = children[1] - if first_data.data[:4] == " ---": - first_data.data = string.lstrip(first_data.data[4:]) - set_tagName(title, "short-synopsis") - if children[-1].nodeType == TEXT \ - and children[-1].data[-1:] == ".": - children[-1].data = children[-1].data[:-1] - section.removeChild(title) - section.removeChild(section.childNodes[0]) - title.removeChild(children[0]) - modinfo_pos = 0 - else: - ewrite("module name in title doesn't match" - " <declaremodule/>; no <short-synopsis/>\n") - else: - ewrite("Unexpected condition: <section/> without <title/>\n") - modinfo.appendChild(doc.createTextNode("\n ")) - modinfo.appendChild(node) - if title and not contents_match(title, node): - # The short synopsis is actually different, - # and needs to be stored: - modinfo.appendChild(doc.createTextNode("\n ")) - modinfo.appendChild(title) - if modauthor: - modinfo.appendChild(doc.createTextNode("\n ")) - modinfo.appendChild(modauthor) - if platform: - modinfo.appendChild(doc.createTextNode("\n ")) - modinfo.appendChild(platform) - modinfo.appendChild(doc.createTextNode("\n ")) - section.insertBefore(modinfo, section.childNodes[modinfo_pos]) - section.insertBefore(doc.createTextNode("\n "), modinfo) - # - # The rest of this removes extra newlines from where we cut out - # a lot of elements. A lot of code for minimal value, but keeps - # keeps the generated *ML from being too funny looking. - # - section.normalize() - children = section.childNodes - for i in range(len(children)): - node = children[i] - if node.nodeName == "moduleinfo": - nextnode = children[i+1] - if nextnode.nodeType == TEXT: - data = nextnode.data - if len(string.lstrip(data)) < (len(data) - 4): - nextnode.data = "\n\n\n" + string.lstrip(data) - - -def cleanup_synopses(doc, fragment): - for node in find_all_elements(fragment, "section"): - create_module_info(doc, node) - - -def fixup_table_structures(doc, fragment): - for table in find_all_elements(fragment, "table"): - fixup_table(doc, table) - - -def fixup_table(doc, table): - # create the table head - thead = doc.createElement("thead") - row = doc.createElement("row") - move_elements_by_name(doc, table, row, "entry") - thead.appendChild(doc.createTextNode("\n ")) - thead.appendChild(row) - thead.appendChild(doc.createTextNode("\n ")) - # create the table body - tbody = doc.createElement("tbody") - prev_row = None - last_was_hline = 0 - children = table.childNodes - for child in children: - if child.nodeType == ELEMENT: - tagName = child.tagName - if tagName == "hline" and prev_row is not None: - prev_row.setAttribute("rowsep", "1") - elif tagName == "row": - prev_row = child - # save the rows: - tbody.appendChild(doc.createTextNode("\n ")) - move_elements_by_name(doc, table, tbody, "row", sep="\n ") - # and toss the rest: - while children: - child = children[0] - nodeType = child.nodeType - if nodeType == TEXT: - if string.strip(child.data): - raise ConversionError("unexpected free data in <%s>: %r" - % (table.tagName, child.data)) - table.removeChild(child) - continue - if nodeType == ELEMENT: - if child.tagName != "hline": - raise ConversionError( - "unexpected <%s> in table" % child.tagName) - table.removeChild(child) - continue - raise ConversionError( - "unexpected %s node in table" % child.__class__.__name__) - # nothing left in the <table>; add the <thead> and <tbody> - tgroup = doc.createElement("tgroup") - tgroup.appendChild(doc.createTextNode("\n ")) - tgroup.appendChild(thead) - tgroup.appendChild(doc.createTextNode("\n ")) - tgroup.appendChild(tbody) - tgroup.appendChild(doc.createTextNode("\n ")) - table.appendChild(tgroup) - # now make the <entry>s look nice: - for row in table.getElementsByTagName("row"): - fixup_row(doc, row) - - -def fixup_row(doc, row): - entries = [] - map(entries.append, row.childNodes[1:]) - for entry in entries: - row.insertBefore(doc.createTextNode("\n "), entry) -# row.appendChild(doc.createTextNode("\n ")) - - -def move_elements_by_name(doc, source, dest, name, sep=None): - nodes = [] - for child in source.childNodes: - if child.nodeName == name: - nodes.append(child) - for node in nodes: - source.removeChild(node) - dest.appendChild(node) - if sep: - dest.appendChild(doc.createTextNode(sep)) - - -RECURSE_INTO_PARA_CONTAINERS = ( - "chapter", "abstract", "enumerate", - "section", "subsection", "subsubsection", - "paragraph", "subparagraph", "back-matter", - "howto", "manual", - "item", "itemize", "fulllineitems", "enumeration", "descriptionlist", - "definitionlist", "definition", - ) - -PARA_LEVEL_ELEMENTS = ( - "moduleinfo", "title", "verbatim", "enumerate", "item", - "interpreter-session", "back-matter", "interactive-session", - "opcodedesc", "classdesc", "datadesc", - "funcdesc", "methoddesc", "excdesc", "memberdesc", "membderdescni", - "funcdescni", "methoddescni", "excdescni", - "tableii", "tableiii", "tableiv", "localmoduletable", - "sectionauthor", "seealso", "itemize", - # include <para>, so we can just do it again to get subsequent paras: - PARA_ELEMENT, - ) - -PARA_LEVEL_PRECEEDERS = ( - "setindexsubitem", "author", - "stindex", "obindex", "COMMENT", "label", "input", "title", - "versionadded", "versionchanged", "declaremodule", "modulesynopsis", - "moduleauthor", "indexterm", "leader", - ) - - -def fixup_paras(doc, fragment): - for child in fragment.childNodes: - if child.nodeName in RECURSE_INTO_PARA_CONTAINERS: - fixup_paras_helper(doc, child) - descriptions = find_all_elements(fragment, "description") - for description in descriptions: - fixup_paras_helper(doc, description) - - -def fixup_paras_helper(doc, container, depth=0): - # document is already normalized - children = container.childNodes - start = skip_leading_nodes(children) - while len(children) > start: - if children[start].nodeName in RECURSE_INTO_PARA_CONTAINERS: - # Something to recurse into: - fixup_paras_helper(doc, children[start]) - else: - # Paragraph material: - build_para(doc, container, start, len(children)) - if DEBUG_PARA_FIXER and depth == 10: - sys.exit(1) - start = skip_leading_nodes(children, start + 1) - - -def build_para(doc, parent, start, i): - children = parent.childNodes - after = start + 1 - have_last = 0 - BREAK_ELEMENTS = PARA_LEVEL_ELEMENTS + RECURSE_INTO_PARA_CONTAINERS - # Collect all children until \n\n+ is found in a text node or a - # member of BREAK_ELEMENTS is found. - for j in range(start, i): - after = j + 1 - child = children[j] - nodeType = child.nodeType - if nodeType == ELEMENT: - if child.tagName in BREAK_ELEMENTS: - after = j - break - elif nodeType == TEXT: - pos = string.find(child.data, "\n\n") - if pos == 0: - after = j - break - if pos >= 1: - child.splitText(pos) - break - else: - have_last = 1 - if (start + 1) > after: - raise ConversionError( - "build_para() could not identify content to turn into a paragraph") - if children[after - 1].nodeType == TEXT: - # we may need to split off trailing white space: - child = children[after - 1] - data = child.data - if string.rstrip(data) != data: - have_last = 0 - child.splitText(len(string.rstrip(data))) - para = doc.createElement(PARA_ELEMENT) - prev = None - indexes = range(start, after) - indexes.reverse() - for j in indexes: - node = parent.childNodes[j] - parent.removeChild(node) - para.insertBefore(node, prev) - prev = node - if have_last: - parent.appendChild(para) - parent.appendChild(doc.createTextNode("\n\n")) - return len(parent.childNodes) - else: - nextnode = parent.childNodes[start] - if nextnode.nodeType == TEXT: - if nextnode.data and nextnode.data[0] != "\n": - nextnode.data = "\n" + nextnode.data - else: - newnode = doc.createTextNode("\n") - parent.insertBefore(newnode, nextnode) - nextnode = newnode - start = start + 1 - parent.insertBefore(para, nextnode) - return start + 1 - - -def skip_leading_nodes(children, start=0): - """Return index into children of a node at which paragraph building should - begin or a recursive call to fixup_paras_helper() should be made (for - subsections, etc.). - - When the return value >= len(children), we've built all the paras we can - from this list of children. - """ - i = len(children) - while i > start: - # skip over leading comments and whitespace: - child = children[start] - nodeType = child.nodeType - if nodeType == TEXT: - data = child.data - shortened = string.lstrip(data) - if shortened: - if data != shortened: - # break into two nodes: whitespace and non-whitespace - child.splitText(len(data) - len(shortened)) - return start + 1 - return start - # all whitespace, just skip - elif nodeType == ELEMENT: - tagName = child.tagName - if tagName in RECURSE_INTO_PARA_CONTAINERS: - return start - if tagName not in PARA_LEVEL_ELEMENTS + PARA_LEVEL_PRECEEDERS: - return start - start = start + 1 - return start - - -def fixup_rfc_references(doc, fragment): - for rfcnode in find_all_elements(fragment, "rfc"): - rfcnode.appendChild(doc.createTextNode( - "RFC " + rfcnode.getAttribute("num"))) - - -def fixup_signatures(doc, fragment): - for child in fragment.childNodes: - if child.nodeType == ELEMENT: - args = child.getElementsByTagName("args") - for arg in args: - fixup_args(doc, arg) - arg.normalize() - args = child.getElementsByTagName("constructor-args") - for arg in args: - fixup_args(doc, arg) - arg.normalize() - - -def fixup_args(doc, arglist): - for child in arglist.childNodes: - if child.nodeName == "optional": - # found it; fix and return - arglist.insertBefore(doc.createTextNode("["), child) - optkids = child.childNodes - while optkids: - k = optkids[0] - child.removeChild(k) - arglist.insertBefore(k, child) - arglist.insertBefore(doc.createTextNode("]"), child) - arglist.removeChild(child) - return fixup_args(doc, arglist) - - -def fixup_sectionauthors(doc, fragment): - for sectauth in find_all_elements(fragment, "sectionauthor"): - section = sectauth.parentNode - section.removeChild(sectauth) - set_tagName(sectauth, "author") - sectauth.appendChild(doc.createTextNode( - sectauth.getAttribute("name"))) - sectauth.removeAttribute("name") - after = section.childNodes[2] - title = section.childNodes[1] - if title.nodeName != "title": - after = section.childNodes[0] - section.insertBefore(doc.createTextNode("\n "), after) - section.insertBefore(sectauth, after) - - -def fixup_verbatims(doc): - for verbatim in find_all_elements(doc, "verbatim"): - child = verbatim.childNodes[0] - if child.nodeType == TEXT \ - and string.lstrip(child.data)[:3] == ">>>": - set_tagName(verbatim, "interactive-session") - - -def add_node_ids(fragment, counter=0): - fragment.node_id = counter - for node in fragment.childNodes: - counter = counter + 1 - if node.nodeType == ELEMENT: - counter = add_node_ids(node, counter) - else: - node.node_id = counter - return counter + 1 - - -REFMODINDEX_ELEMENTS = ('refmodindex', 'refbimodindex', - 'refexmodindex', 'refstmodindex') - -def fixup_refmodindexes(fragment): - # Locate <ref*modindex>...</> co-located with <module>...</>, and - # remove the <ref*modindex>, replacing it with index=index on the - # <module> element. - nodes = find_all_elements_from_set(fragment, REFMODINDEX_ELEMENTS) - d = {} - for node in nodes: - parent = node.parentNode - d[parent.node_id] = parent - del nodes - map(fixup_refmodindexes_chunk, d.values()) - - -def fixup_refmodindexes_chunk(container): - # node is probably a <para>; let's see how often it isn't: - if container.tagName != PARA_ELEMENT: - bwrite("--- fixup_refmodindexes_chunk(%s)\n" % container) - module_entries = find_all_elements(container, "module") - if not module_entries: - return - index_entries = find_all_elements_from_set(container, REFMODINDEX_ELEMENTS) - removes = [] - for entry in index_entries: - children = entry.childNodes - if len(children) != 0: - bwrite("--- unexpected number of children for %s node:\n" - % entry.tagName) - ewrite(entry.toxml() + "\n") - continue - found = 0 - module_name = entry.getAttribute("module") - for node in module_entries: - if len(node.childNodes) != 1: - continue - this_name = node.childNodes[0].data - if this_name == module_name: - found = 1 - node.setAttribute("index", "yes") - if found: - removes.append(entry) - for node in removes: - container.removeChild(node) - - -def fixup_bifuncindexes(fragment): - nodes = find_all_elements(fragment, 'bifuncindex') - d = {} - # make sure that each parent is only processed once: - for node in nodes: - parent = node.parentNode - d[parent.node_id] = parent - del nodes - map(fixup_bifuncindexes_chunk, d.values()) - - -def fixup_bifuncindexes_chunk(container): - removes = [] - entries = find_all_child_elements(container, "bifuncindex") - function_entries = find_all_child_elements(container, "function") - for entry in entries: - function_name = entry.getAttribute("name") - found = 0 - for func_entry in function_entries: - t2 = func_entry.childNodes[0].data - if t2[-2:] != "()": - continue - t2 = t2[:-2] - if t2 == function_name: - func_entry.setAttribute("index", "yes") - func_entry.setAttribute("module", "__builtin__") - if not found: - found = 1 - removes.append(entry) - for entry in removes: - container.removeChild(entry) - - -def join_adjacent_elements(container, gi): - queue = [container] - while queue: - parent = queue.pop() - i = 0 - children = parent.childNodes - nchildren = len(children) - while i < (nchildren - 1): - child = children[i] - if child.nodeName == gi: - if children[i+1].nodeName == gi: - ewrite("--- merging two <%s/> elements\n" % gi) - child = children[i] - nextchild = children[i+1] - nextchildren = nextchild.childNodes - while len(nextchildren): - node = nextchildren[0] - nextchild.removeChild(node) - child.appendChild(node) - parent.removeChild(nextchild) - continue - if child.nodeType == ELEMENT: - queue.append(child) - i = i + 1 - - -_token_rx = re.compile(r"[a-zA-Z][a-zA-Z0-9.-]*$") - -def write_esis(doc, ofp, knownempty): - for node in doc.childNodes: - nodeType = node.nodeType - if nodeType == ELEMENT: - gi = node.tagName - if knownempty(gi): - if node.hasChildNodes(): - raise ValueError, \ - "declared-empty node <%s> has children" % gi - ofp.write("e\n") - for k, value in node.attributes.items(): - if _token_rx.match(value): - dtype = "TOKEN" - else: - dtype = "CDATA" - ofp.write("A%s %s %s\n" % (k, dtype, esistools.encode(value))) - ofp.write("(%s\n" % gi) - write_esis(node, ofp, knownempty) - ofp.write(")%s\n" % gi) - elif nodeType == TEXT: - ofp.write("-%s\n" % esistools.encode(node.data)) - elif nodeType == ENTITY_REFERENCE: - ofp.write("&%s\n" % node.nodeName) - else: - raise RuntimeError, "unsupported node type: %s" % nodeType - - -def convert(ifp, ofp): - events = esistools.parse(ifp) - toktype, doc = events.getEvent() - fragment = doc.createDocumentFragment() - events.expandNode(fragment) - - normalize(fragment) - simplify(doc, fragment) - handle_labels(doc, fragment) - handle_appendix(doc, fragment) - fixup_trailing_whitespace(doc, { - "abstract": "\n", - "title": "", - "chapter": "\n\n", - "section": "\n\n", - "subsection": "\n\n", - "subsubsection": "\n\n", - "paragraph": "\n\n", - "subparagraph": "\n\n", - }) - cleanup_root_text(doc) - cleanup_trailing_parens(fragment, ["function", "method", "cfunction"]) - cleanup_synopses(doc, fragment) - fixup_descriptors(doc, fragment) - fixup_verbatims(fragment) - normalize(fragment) - fixup_paras(doc, fragment) - fixup_sectionauthors(doc, fragment) - fixup_table_structures(doc, fragment) - fixup_rfc_references(doc, fragment) - fixup_signatures(doc, fragment) - add_node_ids(fragment) - fixup_refmodindexes(fragment) - fixup_bifuncindexes(fragment) - # Take care of ugly hacks in the LaTeX markup to avoid LaTeX and - # LaTeX2HTML screwing with GNU-style long options (the '--' problem). - join_adjacent_elements(fragment, "option") - # - d = {} - for gi in events.parser.get_empties(): - d[gi] = gi - if d.has_key("author"): - del d["author"] - if d.has_key("rfc"): - del d["rfc"] - knownempty = d.has_key - # - try: - write_esis(fragment, ofp, knownempty) - except IOError, (err, msg): - # Ignore EPIPE; it just means that whoever we're writing to stopped - # reading. The rest of the output would be ignored. All other errors - # should still be reported, - if err != errno.EPIPE: - raise - - -def main(): - if len(sys.argv) == 1: - ifp = sys.stdin - ofp = sys.stdout - elif len(sys.argv) == 2: - ifp = open(sys.argv[1]) - ofp = sys.stdout - elif len(sys.argv) == 3: - ifp = open(sys.argv[1]) - import StringIO - ofp = StringIO.StringIO() - else: - usage() - sys.exit(2) - convert(ifp, ofp) - if len(sys.argv) == 3: - fp = open(sys.argv[2], "w") - fp.write(ofp.getvalue()) - fp.close() - ofp.close() - - -if __name__ == "__main__": - main() diff --git a/doc/tools/sgmlconv/esis2sgml.py b/doc/tools/sgmlconv/esis2sgml.py deleted file mode 100755 index 7bda929..0000000 --- a/doc/tools/sgmlconv/esis2sgml.py +++ /dev/null @@ -1,263 +0,0 @@ -#! /usr/bin/env python - -"""Convert ESIS events to SGML or XML markup. - -This is limited, but seems sufficient for the ESIS generated by the -latex2esis.py script when run over the Python documentation. -""" - -# This should have an explicit option to indicate whether the *INPUT* was -# generated from an SGML or an XML application. - -import errno -import esistools -import os -import re -import string - -from xml.sax.saxutils import escape - - -AUTOCLOSE = () - -EMPTIES_FILENAME = "../sgml/empties.dat" -LIST_EMPTIES = 0 - - -_elem_map = {} -_attr_map = {} -_token_map = {} - -_normalize_case = str - -def map_gi(sgmlgi, map): - uncased = _normalize_case(sgmlgi) - try: - return map[uncased] - except IndexError: - map[uncased] = sgmlgi - return sgmlgi - -def null_map_gi(sgmlgi, map): - return sgmlgi - - -def format_attrs(attrs, xml=0): - attrs = attrs.items() - attrs.sort() - parts = [] - append = parts.append - for name, value in attrs: - if xml: - append('%s="%s"' % (name, escape(value))) - else: - # this is a little bogus, but should do for now - if name == value and isnmtoken(value): - append(value) - elif istoken(value): - if value == "no" + name: - append(value) - else: - append("%s=%s" % (name, value)) - else: - append('%s="%s"' % (name, escape(value))) - if parts: - parts.insert(0, '') - return string.join(parts) - - -_nmtoken_rx = re.compile("[a-z][-._a-z0-9]*$", re.IGNORECASE) -def isnmtoken(s): - return _nmtoken_rx.match(s) is not None - -_token_rx = re.compile("[a-z0-9][-._a-z0-9]*$", re.IGNORECASE) -def istoken(s): - return _token_rx.match(s) is not None - - -def convert(ifp, ofp, xml=0, autoclose=(), verbatims=()): - if xml: - autoclose = () - attrs = {} - lastopened = None - knownempties = [] - knownempty = 0 - lastempty = 0 - inverbatim = 0 - while 1: - line = ifp.readline() - if not line: - break - - type = line[0] - data = line[1:] - if data and data[-1] == "\n": - data = data[:-1] - if type == "-": - data = esistools.decode(data) - data = escape(data) - if not inverbatim: - data = string.replace(data, "---", "—") - ofp.write(data) - if "\n" in data: - lastopened = None - knownempty = 0 - lastempty = 0 - elif type == "(": - if data == "COMMENT": - ofp.write("<!--") - continue - data = map_gi(data, _elem_map) - if knownempty and xml: - ofp.write("<%s%s/>" % (data, format_attrs(attrs, xml))) - else: - ofp.write("<%s%s>" % (data, format_attrs(attrs, xml))) - if knownempty and data not in knownempties: - # accumulate knowledge! - knownempties.append(data) - attrs = {} - lastopened = data - lastempty = knownempty - knownempty = 0 - inverbatim = data in verbatims - elif type == ")": - if data == "COMMENT": - ofp.write("-->") - continue - data = map_gi(data, _elem_map) - if xml: - if not lastempty: - ofp.write("</%s>" % data) - elif data not in knownempties: - if data in autoclose: - pass - elif lastopened == data: - ofp.write("</>") - else: - ofp.write("</%s>" % data) - lastopened = None - lastempty = 0 - inverbatim = 0 - elif type == "A": - name, type, value = string.split(data, " ", 2) - name = map_gi(name, _attr_map) - attrs[name] = esistools.decode(value) - elif type == "e": - knownempty = 1 - elif type == "&": - ofp.write("&%s;" % data) - knownempty = 0 - else: - raise RuntimeError, "unrecognized ESIS event type: '%s'" % type - - if LIST_EMPTIES: - dump_empty_element_names(knownempties) - - -def dump_empty_element_names(knownempties): - d = {} - for gi in knownempties: - d[gi] = gi - knownempties.append("") - if os.path.isfile(EMPTIES_FILENAME): - fp = open(EMPTIES_FILENAME) - while 1: - line = fp.readline() - if not line: - break - gi = string.strip(line) - if gi: - d[gi] = gi - fp = open(EMPTIES_FILENAME, "w") - gilist = d.keys() - gilist.sort() - fp.write(string.join(gilist, "\n")) - fp.write("\n") - fp.close() - - -def update_gi_map(map, names, fromsgml=1): - for name in string.split(names, ","): - if fromsgml: - uncased = string.lower(name) - else: - uncased = name - map[uncased] = name - - -def main(): - import getopt - import sys - # - autoclose = AUTOCLOSE - xml = 1 - xmldecl = 0 - elem_names = '' - attr_names = '' - value_names = '' - verbatims = ('verbatim', 'interactive-session') - opts, args = getopt.getopt(sys.argv[1:], "adesx", - ["autoclose=", "declare", "sgml", "xml", - "elements-map=", "attributes-map", - "values-map="]) - for opt, arg in opts: - if opt in ("-d", "--declare"): - xmldecl = 1 - elif opt == "-e": - global LIST_EMPTIES - LIST_EMPTIES = 1 - elif opt in ("-s", "--sgml"): - xml = 0 - elif opt in ("-x", "--xml"): - xml = 1 - elif opt in ("-a", "--autoclose"): - autoclose = string.split(arg, ",") - elif opt == "--elements-map": - elem_names = ("%s,%s" % (elem_names, arg))[1:] - elif opt == "--attributes-map": - attr_names = ("%s,%s" % (attr_names, arg))[1:] - elif opt == "--values-map": - value_names = ("%s,%s" % (value_names, arg))[1:] - # - # open input streams: - # - if len(args) == 0: - ifp = sys.stdin - ofp = sys.stdout - elif len(args) == 1: - ifp = open(args[0]) - ofp = sys.stdout - elif len(args) == 2: - ifp = open(args[0]) - ofp = open(args[1], "w") - else: - usage() - sys.exit(2) - # - # setup the name maps: - # - if elem_names or attr_names or value_names: - # assume the origin was SGML; ignore case of the names from the ESIS - # stream but set up conversion tables to get the case right on output - global _normalize_case - _normalize_case = string.lower - update_gi_map(_elem_map, string.split(elem_names, ",")) - update_gi_map(_attr_map, string.split(attr_names, ",")) - update_gi_map(_values_map, string.split(value_names, ",")) - else: - global map_gi - map_gi = null_map_gi - # - # run the conversion: - # - try: - if xml and xmldecl: - opf.write('<?xml version="1.0" encoding="iso8859-1"?>\n') - convert(ifp, ofp, xml=xml, autoclose=autoclose, verbatims=verbatims) - except IOError, (err, msg): - if err != errno.EPIPE: - raise - - -if __name__ == "__main__": - main() diff --git a/doc/tools/sgmlconv/esistools.py b/doc/tools/sgmlconv/esistools.py deleted file mode 100644 index 893af76..0000000 --- a/doc/tools/sgmlconv/esistools.py +++ /dev/null @@ -1,309 +0,0 @@ -"""Miscellaneous utility functions useful for dealing with ESIS streams.""" - -import re -import string - -import xml.dom.pulldom - -import xml.sax -import xml.sax.handler -import xml.sax.xmlreader - - -_data_match = re.compile(r"[^\\][^\\]*").match - -def decode(s): - r = '' - while s: - m = _data_match(s) - if m: - r = r + m.group() - s = s[m.end():] - elif s[1] == "\\": - r = r + "\\" - s = s[2:] - elif s[1] == "n": - r = r + "\n" - s = s[2:] - elif s[1] == "%": - s = s[2:] - n, s = s.split(";", 1) - r = r + unichr(int(n)) - else: - raise ValueError, "can't handle " + `s` - return r - - -_charmap = {} -for c in map(chr, range(256)): - _charmap[c] = c -_charmap["\n"] = r"\n" -_charmap["\\"] = r"\\" -del c - -_null_join = ''.join -def encode(s): - return _null_join(map(_charmap.get, s)) - - -class ESISReader(xml.sax.xmlreader.XMLReader): - """SAX Reader which reads from an ESIS stream. - - No verification of the document structure is performed by the - reader; a general verifier could be used as the target - ContentHandler instance. - - """ - _decl_handler = None - _lexical_handler = None - - _public_id = None - _system_id = None - - _buffer = "" - _is_empty = 0 - _lineno = 0 - _started = 0 - - def __init__(self, contentHandler=None, errorHandler=None): - xml.sax.xmlreader.XMLReader.__init__(self) - self._attrs = {} - self._attributes = Attributes(self._attrs) - self._locator = Locator() - self._empties = {} - if contentHandler: - self.setContentHandler(contentHandler) - if errorHandler: - self.setErrorHandler(errorHandler) - - def get_empties(self): - return self._empties.keys() - - # - # XMLReader interface - # - - def parse(self, source): - raise RuntimeError - self._locator._public_id = source.getPublicId() - self._locator._system_id = source.getSystemId() - fp = source.getByteStream() - handler = self.getContentHandler() - if handler: - handler.startDocument() - lineno = 0 - while 1: - token, data = self._get_token(fp) - if token is None: - break - lineno = lineno + 1 - self._locator._lineno = lineno - self._handle_token(token, data) - handler = self.getContentHandler() - if handler: - handler.startDocument() - - def feed(self, data): - if not self._started: - handler = self.getContentHandler() - if handler: - handler.startDocument() - self._started = 1 - data = self._buffer + data - self._buffer = None - lines = data.split("\n") - if lines: - for line in lines[:-1]: - self._lineno = self._lineno + 1 - self._locator._lineno = self._lineno - if not line: - e = xml.sax.SAXParseException( - "ESIS input line contains no token type mark", - None, self._locator) - self.getErrorHandler().error(e) - else: - self._handle_token(line[0], line[1:]) - self._buffer = lines[-1] - else: - self._buffer = "" - - def close(self): - handler = self.getContentHandler() - if handler: - handler.endDocument() - self._buffer = "" - - def _get_token(self, fp): - try: - line = fp.readline() - except IOError, e: - e = SAXException("I/O error reading input stream", e) - self.getErrorHandler().fatalError(e) - return - if not line: - return None, None - if line[-1] == "\n": - line = line[:-1] - if not line: - e = xml.sax.SAXParseException( - "ESIS input line contains no token type mark", - None, self._locator) - self.getErrorHandler().error(e) - return - return line[0], line[1:] - - def _handle_token(self, token, data): - handler = self.getContentHandler() - if token == '-': - if data and handler: - handler.characters(decode(data)) - elif token == ')': - if handler: - handler.endElement(decode(data)) - elif token == '(': - if self._is_empty: - self._empties[data] = 1 - if handler: - handler.startElement(data, self._attributes) - self._attrs.clear() - self._is_empty = 0 - elif token == 'A': - name, value = data.split(' ', 1) - if value != "IMPLIED": - type, value = value.split(' ', 1) - self._attrs[name] = (decode(value), type) - elif token == '&': - # entity reference in SAX? - pass - elif token == '?': - if handler: - if ' ' in data: - target, data = string.split(data, None, 1) - else: - target, data = data, "" - handler.processingInstruction(target, decode(data)) - elif token == 'N': - handler = self.getDTDHandler() - if handler: - handler.notationDecl(data, self._public_id, self._system_id) - self._public_id = None - self._system_id = None - elif token == 'p': - self._public_id = decode(data) - elif token == 's': - self._system_id = decode(data) - elif token == 'e': - self._is_empty = 1 - elif token == 'C': - pass - else: - e = SAXParseException("unknown ESIS token in event stream", - None, self._locator) - self.getErrorHandler().error(e) - - def setContentHandler(self, handler): - old = self.getContentHandler() - if old: - old.setDocumentLocator(None) - if handler: - handler.setDocumentLocator(self._locator) - xml.sax.xmlreader.XMLReader.setContentHandler(self, handler) - - def getProperty(self, property): - if property == xml.sax.handler.property_lexical_handler: - return self._lexical_handler - - elif property == xml.sax.handler.property_declaration_handler: - return self._decl_handler - - else: - raise xml.sax.SAXNotRecognizedException("unknown property %s" - % `property`) - - def setProperty(self, property, value): - if property == xml.sax.handler.property_lexical_handler: - if self._lexical_handler: - self._lexical_handler.setDocumentLocator(None) - if value: - value.setDocumentLocator(self._locator) - self._lexical_handler = value - - elif property == xml.sax.handler.property_declaration_handler: - if self._decl_handler: - self._decl_handler.setDocumentLocator(None) - if value: - value.setDocumentLocator(self._locator) - self._decl_handler = value - - else: - raise xml.sax.SAXNotRecognizedException() - - def getFeature(self, feature): - if feature == xml.sax.handler.feature_namespaces: - return 1 - else: - return xml.sax.xmlreader.XMLReader.getFeature(self, feature) - - def setFeature(self, feature, enabled): - if feature == xml.sax.handler.feature_namespaces: - pass - else: - xml.sax.xmlreader.XMLReader.setFeature(self, feature, enabled) - - -class Attributes(xml.sax.xmlreader.AttributesImpl): - # self._attrs has the form {name: (value, type)} - - def getType(self, name): - return self._attrs[name][1] - - def getValue(self, name): - return self._attrs[name][0] - - def getValueByQName(self, name): - return self._attrs[name][0] - - def __getitem__(self, name): - return self._attrs[name][0] - - def get(self, name, default=None): - if self._attrs.has_key(name): - return self._attrs[name][0] - return default - - def items(self): - L = [] - for name, (value, type) in self._attrs.items(): - L.append((name, value)) - return L - - def values(self): - L = [] - for value, type in self._attrs.values(): - L.append(value) - return L - - -class Locator(xml.sax.xmlreader.Locator): - _lineno = -1 - _public_id = None - _system_id = None - - def getLineNumber(self): - return self._lineno - - def getPublicId(self): - return self._public_id - - def getSystemId(self): - return self._system_id - - -def parse(stream_or_string, parser=None): - if type(stream_or_string) in [type(""), type(u"")]: - stream = open(stream_or_string) - else: - stream = stream_or_string - if not parser: - parser = ESISReader() - return xml.dom.pulldom.DOMEventStream(stream, parser, (2 ** 14) - 20) diff --git a/doc/tools/sgmlconv/latex2esis.py b/doc/tools/sgmlconv/latex2esis.py deleted file mode 100755 index 74e1dc7..0000000 --- a/doc/tools/sgmlconv/latex2esis.py +++ /dev/null @@ -1,555 +0,0 @@ -#! /usr/bin/env python - -"""Generate ESIS events based on a LaTeX source document and -configuration data. - -The conversion is not strong enough to work with arbitrary LaTeX -documents; it has only been designed to work with the highly stylized -markup used in the standard Python documentation. A lot of -information about specific markup is encoded in the control table -passed to the convert() function; changing this table can allow this -tool to support additional LaTeX markups. - -The format of the table is largely undocumented; see the commented -headers where the table is specified in main(). There is no provision -to load an alternate table from an external file. -""" - -import errno -import getopt -import os -import re -import string -import sys -import UserList -import xml.sax.saxutils - -from types import ListType, StringType, TupleType - -try: - from xml.parsers.xmllib import XMLParser -except ImportError: - from xmllib import XMLParser - - -from esistools import encode - - -DEBUG = 0 - - -class LaTeXFormatError(Exception): - pass - - -class LaTeXStackError(LaTeXFormatError): - def __init__(self, found, stack): - msg = "environment close for %s doesn't match;\n stack = %s" \ - % (found, stack) - self.found = found - self.stack = stack[:] - LaTeXFormatError.__init__(self, msg) - - -_begin_env_rx = re.compile(r"[\\]begin{([^}]*)}") -_end_env_rx = re.compile(r"[\\]end{([^}]*)}") -_begin_macro_rx = re.compile(r"[\\]([a-zA-Z]+[*]?) ?({|\s*\n?)") -_comment_rx = re.compile("%+ ?(.*)\n[ \t]*") -_text_rx = re.compile(r"[^]~%\\{}]+") -_optional_rx = re.compile(r"\s*[[]([^]]*)[]]") -# _parameter_rx is this complicated to allow {...} inside a parameter; -# this is useful to match tabular layout specifications like {c|p{24pt}} -_parameter_rx = re.compile("[ \n]*{(([^{}}]|{[^}]*})*)}") -_token_rx = re.compile(r"[a-zA-Z][a-zA-Z0-9.-]*$") -_start_group_rx = re.compile("[ \n]*{") -_start_optional_rx = re.compile("[ \n]*[[]") - - -ESCAPED_CHARS = "$%#^ {}&~" - - -def dbgmsg(msg): - if DEBUG: - sys.stderr.write(msg + "\n") - -def pushing(name, point, depth): - dbgmsg("pushing <%s> at %s" % (name, point)) - -def popping(name, point, depth): - dbgmsg("popping </%s> at %s" % (name, point)) - - -class _Stack(UserList.UserList): - def append(self, entry): - if type(entry) is not StringType: - raise LaTeXFormatError("cannot push non-string on stack: " - + `entry`) - #dbgmsg("%s<%s>" % (" "*len(self.data), entry)) - self.data.append(entry) - - def pop(self, index=-1): - entry = self.data[index] - del self.data[index] - #dbgmsg("%s</%s>" % (" "*len(self.data), entry)) - - def __delitem__(self, index): - entry = self.data[index] - del self.data[index] - #dbgmsg("%s</%s>" % (" "*len(self.data), entry)) - - -def new_stack(): - if DEBUG: - return _Stack() - return [] - - -class Conversion: - def __init__(self, ifp, ofp, table): - self.write = ofp.write - self.ofp = ofp - self.table = table - self.line = string.join(map(string.rstrip, ifp.readlines()), "\n") - self.preamble = 1 - - def convert(self): - self.subconvert() - - def subconvert(self, endchar=None, depth=0): - # - # Parses content, including sub-structures, until the character - # 'endchar' is found (with no open structures), or until the end - # of the input data is endchar is None. - # - stack = new_stack() - line = self.line - while line: - if line[0] == endchar and not stack: - self.line = line - return line - m = _comment_rx.match(line) - if m: - text = m.group(1) - if text: - self.write("(COMMENT\n- %s \n)COMMENT\n-\\n\n" - % encode(text)) - line = line[m.end():] - continue - m = _begin_env_rx.match(line) - if m: - name = m.group(1) - entry = self.get_env_entry(name) - # re-write to use the macro handler - line = r"\%s %s" % (name, line[m.end():]) - continue - m = _end_env_rx.match(line) - if m: - # end of environment - envname = m.group(1) - entry = self.get_entry(envname) - while stack and envname != stack[-1] \ - and stack[-1] in entry.endcloses: - self.write(")%s\n" % stack.pop()) - if stack and envname == stack[-1]: - self.write(")%s\n" % entry.outputname) - del stack[-1] - else: - raise LaTeXStackError(envname, stack) - line = line[m.end():] - continue - m = _begin_macro_rx.match(line) - if m: - # start of macro - macroname = m.group(1) - if macroname == "c": - # Ugh! This is a combining character... - endpos = m.end() - self.combining_char("c", line[endpos]) - line = line[endpos + 1:] - continue - entry = self.get_entry(macroname) - if entry.verbatim: - # magic case! - pos = string.find(line, "\\end{%s}" % macroname) - text = line[m.end(1):pos] - stack.append(entry.name) - self.write("(%s\n" % entry.outputname) - self.write("-%s\n" % encode(text)) - self.write(")%s\n" % entry.outputname) - stack.pop() - line = line[pos + len("\\end{%s}" % macroname):] - continue - while stack and stack[-1] in entry.closes: - top = stack.pop() - topentry = self.get_entry(top) - if topentry.outputname: - self.write(")%s\n-\\n\n" % topentry.outputname) - # - if entry.outputname: - if entry.empty: - self.write("e\n") - # - params, optional, empty, environ = self.start_macro(macroname) - # rip off the macroname - if params: - line = line[m.end(1):] - elif empty: - line = line[m.end(1):] - else: - line = line[m.end():] - opened = 0 - implied_content = 0 - - # handle attribute mappings here: - for pentry in params: - if pentry.type == "attribute": - if pentry.optional: - m = _optional_rx.match(line) - if m and entry.outputname: - line = line[m.end():] - self.dump_attr(pentry, m.group(1)) - elif pentry.text and entry.outputname: - # value supplied by conversion spec: - self.dump_attr(pentry, pentry.text) - else: - m = _parameter_rx.match(line) - if not m: - raise LaTeXFormatError( - "could not extract parameter %s for %s: %s" - % (pentry.name, macroname, `line[:100]`)) - if entry.outputname: - self.dump_attr(pentry, m.group(1)) - line = line[m.end():] - elif pentry.type == "child": - if pentry.optional: - m = _optional_rx.match(line) - if m: - line = line[m.end():] - if entry.outputname and not opened: - opened = 1 - self.write("(%s\n" % entry.outputname) - stack.append(macroname) - stack.append(pentry.name) - self.write("(%s\n" % pentry.name) - self.write("-%s\n" % encode(m.group(1))) - self.write(")%s\n" % pentry.name) - stack.pop() - else: - if entry.outputname and not opened: - opened = 1 - self.write("(%s\n" % entry.outputname) - stack.append(entry.name) - self.write("(%s\n" % pentry.name) - stack.append(pentry.name) - self.line = skip_white(line)[1:] - line = self.subconvert( - "}", len(stack) + depth + 1)[1:] - self.write(")%s\n" % stack.pop()) - elif pentry.type == "content": - if pentry.implied: - implied_content = 1 - else: - if entry.outputname and not opened: - opened = 1 - self.write("(%s\n" % entry.outputname) - stack.append(entry.name) - line = skip_white(line) - if line[0] != "{": - raise LaTeXFormatError( - "missing content for " + macroname) - self.line = line[1:] - line = self.subconvert("}", len(stack) + depth + 1) - if line and line[0] == "}": - line = line[1:] - elif pentry.type == "text" and pentry.text: - if entry.outputname and not opened: - opened = 1 - stack.append(entry.name) - self.write("(%s\n" % entry.outputname) - #dbgmsg("--- text: %s" % `pentry.text`) - self.write("-%s\n" % encode(pentry.text)) - elif pentry.type == "entityref": - self.write("&%s\n" % pentry.name) - if entry.outputname: - if not opened: - self.write("(%s\n" % entry.outputname) - stack.append(entry.name) - if not implied_content: - self.write(")%s\n" % entry.outputname) - stack.pop() - continue - if line[0] == endchar and not stack: - self.line = line[1:] - return self.line - if line[0] == "}": - # end of macro or group - macroname = stack[-1] - if macroname: - conversion = self.table[macroname] - if conversion.outputname: - # otherwise, it was just a bare group - self.write(")%s\n" % conversion.outputname) - del stack[-1] - line = line[1:] - continue - if line[0] == "~": - # don't worry about the "tie" aspect of this command - line = line[1:] - self.write("- \n") - continue - if line[0] == "{": - stack.append("") - line = line[1:] - continue - if line[0] == "\\" and line[1] in ESCAPED_CHARS: - self.write("-%s\n" % encode(line[1])) - line = line[2:] - continue - if line[:2] == r"\\": - self.write("(BREAK\n)BREAK\n") - line = line[2:] - continue - if line[:2] == r"\_": - line = "_" + line[2:] - continue - if line[:2] in (r"\'", r'\"'): - # combining characters... - self.combining_char(line[1], line[2]) - line = line[3:] - continue - m = _text_rx.match(line) - if m: - text = encode(m.group()) - self.write("-%s\n" % text) - line = line[m.end():] - continue - # special case because of \item[] - # XXX can we axe this??? - if line[0] == "]": - self.write("-]\n") - line = line[1:] - continue - # avoid infinite loops - extra = "" - if len(line) > 100: - extra = "..." - raise LaTeXFormatError("could not identify markup: %s%s" - % (`line[:100]`, extra)) - while stack: - entry = self.get_entry(stack[-1]) - if entry.closes: - self.write(")%s\n-%s\n" % (entry.outputname, encode("\n"))) - del stack[-1] - else: - break - if stack: - raise LaTeXFormatError("elements remain on stack: " - + string.join(stack, ", ")) - # otherwise we just ran out of input here... - - # This is a really limited table of combinations, but it will have - # to do for now. - _combinations = { - ("c", "c"): 0x00E7, - ("'", "e"): 0x00E9, - ('"', "o"): 0x00F6, - } - - def combining_char(self, prefix, char): - ordinal = self._combinations[(prefix, char)] - self.write("-\\%%%d;\n" % ordinal) - - def start_macro(self, name): - conversion = self.get_entry(name) - parameters = conversion.parameters - optional = parameters and parameters[0].optional - return parameters, optional, conversion.empty, conversion.environment - - def get_entry(self, name): - entry = self.table.get(name) - if entry is None: - dbgmsg("get_entry(%s) failing; building default entry!" % `name`) - # not defined; build a default entry: - entry = TableEntry(name) - entry.has_content = 1 - entry.parameters.append(Parameter("content")) - self.table[name] = entry - return entry - - def get_env_entry(self, name): - entry = self.table.get(name) - if entry is None: - # not defined; build a default entry: - entry = TableEntry(name, 1) - entry.has_content = 1 - entry.parameters.append(Parameter("content")) - entry.parameters[-1].implied = 1 - self.table[name] = entry - elif not entry.environment: - raise LaTeXFormatError( - name + " is defined as a macro; expected environment") - return entry - - def dump_attr(self, pentry, value): - if not (pentry.name and value): - return - if _token_rx.match(value): - dtype = "TOKEN" - else: - dtype = "CDATA" - self.write("A%s %s %s\n" % (pentry.name, dtype, encode(value))) - - -def convert(ifp, ofp, table): - c = Conversion(ifp, ofp, table) - try: - c.convert() - except IOError, (err, msg): - if err != errno.EPIPE: - raise - - -def skip_white(line): - while line and line[0] in " %\n\t\r": - line = string.lstrip(line[1:]) - return line - - - -class TableEntry: - def __init__(self, name, environment=0): - self.name = name - self.outputname = name - self.environment = environment - self.empty = not environment - self.has_content = 0 - self.verbatim = 0 - self.auto_close = 0 - self.parameters = [] - self.closes = [] - self.endcloses = [] - -class Parameter: - def __init__(self, type, name=None, optional=0): - self.type = type - self.name = name - self.optional = optional - self.text = '' - self.implied = 0 - - -class TableParser(XMLParser): - def __init__(self, table=None): - if table is None: - table = {} - self.__table = table - self.__current = None - self.__buffer = '' - XMLParser.__init__(self) - - def get_table(self): - for entry in self.__table.values(): - if entry.environment and not entry.has_content: - p = Parameter("content") - p.implied = 1 - entry.parameters.append(p) - entry.has_content = 1 - return self.__table - - def start_environment(self, attrs): - name = attrs["name"] - self.__current = TableEntry(name, environment=1) - self.__current.verbatim = attrs.get("verbatim") == "yes" - if attrs.has_key("outputname"): - self.__current.outputname = attrs.get("outputname") - self.__current.endcloses = string.split(attrs.get("endcloses", "")) - def end_environment(self): - self.end_macro() - - def start_macro(self, attrs): - name = attrs["name"] - self.__current = TableEntry(name) - self.__current.closes = string.split(attrs.get("closes", "")) - if attrs.has_key("outputname"): - self.__current.outputname = attrs.get("outputname") - def end_macro(self): - self.__table[self.__current.name] = self.__current - self.__current = None - - def start_attribute(self, attrs): - name = attrs.get("name") - optional = attrs.get("optional") == "yes" - if name: - p = Parameter("attribute", name, optional=optional) - else: - p = Parameter("attribute", optional=optional) - self.__current.parameters.append(p) - self.__buffer = '' - def end_attribute(self): - self.__current.parameters[-1].text = self.__buffer - - def start_entityref(self, attrs): - name = attrs["name"] - p = Parameter("entityref", name) - self.__current.parameters.append(p) - - def start_child(self, attrs): - name = attrs["name"] - p = Parameter("child", name, attrs.get("optional") == "yes") - self.__current.parameters.append(p) - self.__current.empty = 0 - - def start_content(self, attrs): - p = Parameter("content") - p.implied = attrs.get("implied") == "yes" - if self.__current.environment: - p.implied = 1 - self.__current.parameters.append(p) - self.__current.has_content = 1 - self.__current.empty = 0 - - def start_text(self, attrs): - self.__current.empty = 0 - self.__buffer = '' - def end_text(self): - p = Parameter("text") - p.text = self.__buffer - self.__current.parameters.append(p) - - def handle_data(self, data): - self.__buffer = self.__buffer + data - - -def load_table(fp, table=None): - parser = TableParser(table=table) - parser.feed(fp.read()) - parser.close() - return parser.get_table() - - -def main(): - global DEBUG - # - opts, args = getopt.getopt(sys.argv[1:], "D", ["debug"]) - for opt, arg in opts: - if opt in ("-D", "--debug"): - DEBUG = DEBUG + 1 - if len(args) == 0: - ifp = sys.stdin - ofp = sys.stdout - elif len(args) == 1: - ifp = open(args) - ofp = sys.stdout - elif len(args) == 2: - ifp = open(args[0]) - ofp = open(args[1], "w") - else: - usage() - sys.exit(2) - - table = load_table(open(os.path.join(sys.path[0], 'conversion.xml'))) - convert(ifp, ofp, table) - - -if __name__ == "__main__": - main() diff --git a/doc/tools/sgmlconv/make.rules b/doc/tools/sgmlconv/make.rules deleted file mode 100644 index 93579c5..0000000 --- a/doc/tools/sgmlconv/make.rules +++ /dev/null @@ -1,48 +0,0 @@ -# -*- makefile -*- -# -# Extra magic needed by the LaTeX->XML conversion process. This requires -# $(TOOLSDIR) to be properly defined. - -DOCFIXER= $(TOOLSDIR)/sgmlconv/docfixer.py -ESIS2ML= $(TOOLSDIR)/sgmlconv/esis2sgml.py -LATEX2ESIS= $(TOOLSDIR)/sgmlconv/latex2esis.py -CONVERSION= $(TOOLSDIR)/sgmlconv/conversion.xml - -ESISTARGETS= $(patsubst %.tex,%.esis,$(wildcard *.tex)) -ESIS1TARGETS= $(patsubst %.tex,%.esis1,$(wildcard *.tex)) -XMLTARGETS= $(patsubst %.tex,%.xml,$(wildcard *.tex)) - -L2EFLAGS= - -all: xml - -esis: $(ESISTARGETS) -esis1: $(ESIS1TARGETS) -xml: $(XMLTARGETS) - -ESISTOOLS= $(TOOLSDIR)/sgmlconv/esistools.py - -$(ESISTARGETS): $(LATEX2ESIS) $(DOCFIXER) $(ESISTOOLS) $(CONVERSION) -$(ESIS1TARGETS): $(LATEX2ESIS) $(CONVERSION) -# This variant is easier to work with while debugging the conversion spec: -#$(ESISTARGETS): $(LATEX2ESIS) $(DOCFIXER) $(ESISTOOLS) -$(XMLTARGETS): $(ESIS2ML) - - -.SUFFIXES: .esis .esis1 .tex .xml - -.tex.esis1: - $(LATEX2ESIS) $(L2EFLAGS) $< $@ - -.esis1.esis: - $(DOCFIXER) $< $@ - -.esis.xml: - $(ESIS2ML) --xml $< $@ - - -clean: - rm -f *.esis *.esis1 - -clobber: clean - rm -f *.xml diff --git a/doc/tools/support.py b/doc/tools/support.py deleted file mode 100644 index 8df04a3..0000000 --- a/doc/tools/support.py +++ /dev/null @@ -1,149 +0,0 @@ -"""Miscellaneous support code shared by some of the tool scripts. - -This includes option parsing code, HTML formatting code, and a couple of -useful helpers. - -""" -__version__ = '$Revision: 1.1.1.1 $' - - -import getopt -import string -import sys - - -class Options: - __short_args = "a:c:ho:" - __long_args = [ - # script controls - "columns=", "help", "output=", - - # content components - "address=", "iconserver=", - "title=", "uplink=", "uptitle="] - - outputfile = "-" - columns = 1 - letters = 0 - uplink = "./" - uptitle = "Python Documentation Index" - - def __init__(self): - self.args = [] - self.variables = {"address": "", - "iconserver": "icons", - "imgtype": "gif", - "title": "Global Module Index", - } - - def add_args(self, short=None, long=None): - if short: - self.__short_args = self.__short_args + short - if long: - self.__long_args = self.__long_args + long - - def parse(self, args): - try: - opts, args = getopt.getopt(args, self.__short_args, - self.__long_args) - except getopt.error: - sys.stdout = sys.stderr - self.usage() - sys.exit(2) - self.args = self.args + args - for opt, val in opts: - if opt in ("-a", "--address"): - val = string.strip(val) - if val: - val = "<address>\n%s\n</address>\n" % val - self.variables["address"] = val - elif opt in ("-h", "--help"): - self.usage() - sys.exit() - elif opt in ("-o", "--output"): - self.outputfile = val - elif opt in ("-c", "--columns"): - self.columns = int(val) - elif opt == "--title": - self.variables["title"] = val.strip() - elif opt == "--uplink": - self.uplink = val.strip() - elif opt == "--uptitle": - self.uptitle = val.strip() - elif opt == "--iconserver": - self.variables["iconserver"] = val.strip() or "." - else: - self.handle_option(opt, val) - if self.uplink and self.uptitle: - self.variables["uplinkalt"] = "up" - self.variables["uplinkicon"] = "up" - else: - self.variables["uplinkalt"] = "" - self.variables["uplinkicon"] = "blank" - self.variables["uplink"] = self.uplink - self.variables["uptitle"] = self.uptitle - - def handle_option(self, opt, val): - raise getopt.error("option %s not recognized" % opt) - - def get_header(self): - return HEAD % self.variables - - def get_footer(self): - return TAIL % self.variables - - def get_output_file(self, filename=None): - if filename is None: - filename = self.outputfile - if filename == "-": - return sys.stdout - else: - return open(filename, "w") - - -NAVIGATION = '''\ -<div class="navigation"> -<table width="100%%" cellpadding="0" cellspacing="2"> -<tr> -<td><img width="32" height="32" align="bottom" border="0" alt="" - src="%(iconserver)s/blank.%(imgtype)s"></td> -<td><a href="%(uplink)s" - title="%(uptitle)s"><img width="32" height="32" align="bottom" border="0" - alt="%(uplinkalt)s" - src="%(iconserver)s/%(uplinkicon)s.%(imgtype)s"></a></td> -<td><img width="32" height="32" align="bottom" border="0" alt="" - src="%(iconserver)s/blank.%(imgtype)s"></td> -<td align="center" width="100%%">%(title)s</td> -<td><img width="32" height="32" align="bottom" border="0" alt="" - src="%(iconserver)s/blank.%(imgtype)s"></td> -<td><img width="32" height="32" align="bottom" border="0" alt="" - src="%(iconserver)s/blank.%(imgtype)s"></td> -<td><img width="32" height="32" align="bottom" border="0" alt="" - src="%(iconserver)s/blank.%(imgtype)s"></td> -</tr></table> -<b class="navlabel">Up:</b> <span class="sectref"><a href="%(uplink)s" - title="%(uptitle)s">%(uptitle)s</A></span> -<br></div> -''' - -HEAD = '''\ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> - <title>%(title)s</title> - <meta name="description" content="%(title)s"> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <link rel="STYLESHEET" href="lib/lib.css"> -</head> -<body> -''' + NAVIGATION + '''\ -<hr> - -<h2>%(title)s</h2> - -''' - -TAIL = "<hr>\n" + NAVIGATION + '''\ -%(address)s</body> -</html> -''' diff --git a/doc/tools/templates/howto.tex b/doc/tools/templates/howto.tex deleted file mode 100644 index fcb213a..0000000 --- a/doc/tools/templates/howto.tex +++ /dev/null @@ -1,105 +0,0 @@ -\documentclass{howto} - -% This is a template for short or medium-size Python-related documents, -% mostly notably the series of HOWTOs, but it can be used for any -% document you like. - -% The title should be descriptive enough for people to be able to find -% the relevant document. -\title{Spammifying Sprockets in Python} - -% Increment the release number whenever significant changes are made. -% The author and/or editor can define 'significant' however they like. -\release{0.00} - -% At minimum, give your name and an e-mail address. You can include a -% snail-mail address if you like. -\author{Me, 'cause I wrote it} -\authoraddress{Me, 'cause I'm self-employed.} - -\begin{document} -\maketitle - -% This makes the Abstract go on a separate page in the HTML version; -% if a copyright notice is used, it should go immediately after this. -% -\ifhtml -\chapter*{Front Matter\label{front}} -\fi - -% Copyright statement should go here, if needed. -% ... - -% The abstract should be a paragraph or two long, and describe the -% scope of the document. -\begin{abstract} -\noindent -This document describes how to spammify sprockets. It is a useful -example of a Python HOWTO document. It is not dependent on any -particular sprocket implementation, and includes a Python-based -implementation in the \module{sprunkit} module. -\end{abstract} - -\tableofcontents - -Spammifying sprockets from Python is both fun and entertaining. -Applying the techniques described here, you can also fill your hard -disk quite effectively. - -\section{What is Sprocket Spammification?} - -You have to ask? It's the only thing to do to your sprockets! - - -\section{Why Use Python?} - -Python is an excellent language from which to spammify your sprockets -since you can do it on any platform. - - -\section{Software Requirements} - -You need to have the following software installed: - -% The {itemize} environment uses a bullet for each \item. If you want the -% \item's numbered, use the {enumerate} environment instead. -\begin{itemize} - \item Python 1.9. - \item Some sprocket definition files. - \item At least one sprocket system implementation. -\end{itemize} - -Note that the \module{sprunkit} is provided with this package and -implements ActiveSprockets in Python. - - -% The preceding sections will have been written in a gentler, -% introductory style. You may also wish to include a reference -% section, documenting all the functions/exceptions/constants. -% Often, these will be placed in separate files and input like this: - -\input{module} - - -\appendix - -\section{This is an Appendix} - -To create an appendix in a Python HOWTO document, use markup like -this: - -\begin{verbatim} -\appendix - -\section{This is an Appendix} - -To create an appendix in a Python HOWTO document, .... - - -\section{This is another} - -Just add another \section{}, but don't say \appendix again. -\end{verbatim} - - -\end{document} diff --git a/doc/tools/templates/manual.tex b/doc/tools/templates/manual.tex deleted file mode 100644 index a8c8ec2..0000000 --- a/doc/tools/templates/manual.tex +++ /dev/null @@ -1,82 +0,0 @@ -\documentclass{manual} - -\title{Big Python Manual} - -\author{Your Name Here} - -% Please at least include a long-lived email address; -% the rest is at your discretion. -\authoraddress{ - Organization name, if applicable \\ - Street address, if you want to use it \\ - E-mail: \email{your-email@your.domain} -} - -\date{April 30, 1999} % update before release! - % Use an explicit date so that reformatting - % doesn't cause a new date to be used. Setting - % the date to \today can be used during draft - % stages to make it easier to handle versions. - -\release{x.y} % release version; this is used to define the - % \version macro - -\makeindex % tell \index to actually write the .idx file -\makemodindex % If this contains a lot of module sections. - - -\begin{document} - -\maketitle - -% This makes the contents more accessible from the front page of the HTML. -\ifhtml -\chapter*{Front Matter\label{front}} -\fi - -%\input{copyright} - -\begin{abstract} - -\noindent -Big Python is a special version of Python for users who require larger -keys on their keyboards. It accomodates their special needs by ... - -\end{abstract} - -\tableofcontents - - -\chapter{...} - -My chapter. - - -\appendix -\chapter{...} - -My appendix. - -The \code{\e appendix} markup need not be repeated for additional -appendices. - - -% -% The ugly "%begin{latexonly}" pseudo-environments are really just to -% keep LaTeX2HTML quiet during the \renewcommand{} macros; they're -% not really valuable. -% -% If you don't want the Module Index, you can remove all of this up -% until the second \input line. -% -%begin{latexonly} -\renewcommand{\indexname}{Module Index} -%end{latexonly} -\input{mod\jobname.ind} % Module Index - -%begin{latexonly} -\renewcommand{\indexname}{Index} -%end{latexonly} -\input{\jobname.ind} % Index - -\end{document} diff --git a/doc/tools/templates/module.tex b/doc/tools/templates/module.tex deleted file mode 100644 index 33d769d..0000000 --- a/doc/tools/templates/module.tex +++ /dev/null @@ -1,163 +0,0 @@ -% Template for a library manual section. -% PLEASE REMOVE THE COMMENTS AFTER USING THE TEMPLATE - -% ==== 0. ==== -% Copy this file to <mydir>/lib<mymodule>.tex, and edit that file -% according to the instructions below. - - -% ==== 1. ==== -% The section prologue. Give the section a title and provide some -% meta-information. References to the module should use -% \refbimodindex, \refstmodindex, \refexmodindex or \refmodindex, as -% appropriate. - -\section{\module{spam} --- - Short descrition, for section title} - -% Choose one of these to specify the module module name. If there's -% an underscore in the name, use -% \declaremodule[modname]{...}{mod_name} instead. -% -\declaremodule{builtin}{spam} % standard library, in C -\declaremodule{standard}{spam} % standard library, in Python -\declaremodule{extension}{spam} % not standard, in C -\declaremodule{}{spam} % not standard, in Python - -% Portability statement: Uncomment and fill in the parameter to specify the -% availability of the module. The parameter can be Unix, IRIX, SunOS, Mac, -% Windows, or lots of other stuff. When ``Mac'' is specified, the availability -% statement will say ``Macintosh'' and the Module Index may say ``Mac''. -% Please use a name that has already been used whenever applicable. If this -% is omitted, no availability statement is produced or implied. -% -% \platform{UNIX} - -% These apply to all modules: - -\moduleauthor{name}{email} % Author of the module code; - % omit if not known. -\sectionauthor{name}{email} % Author of the documentation, - % even if not a module section. - - -% Leave at least one blank line after this, to simplify ad-hoc tools -% that are sometimes used to massage these files. -\modulesynopsis{This is a one-line descrition, for the chapter header.} - - -% ==== 2. ==== -% Give a short overview of what the module does. -% If it is platform specific, mention this. -% Mention other important restrictions or general operating principles. -% For example: - -The \module{spam} module defines operations for handling cans of Spam. -It knows the four generally available Spam varieties and understands -both can sizes. - -Because spamification requires \UNIX{} process management, the module -is only available on genuine \UNIX{} systems. - - -% ==== 3. ==== -% List the public functions defined by the module. Begin with a -% standard phrase. You may also list the exceptions and other data -% items defined in the module, insofar as they are important for the -% user. - -The \module{spam} module defines the following functions: - -% ---- 3.1. ---- -% For each function, use a ``funcdesc'' block. This has exactly two -% parameters (each parameters is contained in a set of curly braces): -% the first parameter is the function name (this automatically -% generates an index entry); the second parameter is the function's -% argument list. If there are no arguments, use an empty pair of -% curly braces. If there is more than one argument, separate the -% arguments with backslash-comma. Optional parts of the parameter -% list are contained in \optional{...} (this generates a set of square -% brackets around its parameter). Arguments are automatically set in -% italics in the parameter list. Each argument should be mentioned at -% least once in the description; each usage (even inside \code{...}) -% should be enclosed in \var{...}. - -\begin{funcdesc}{open}{filename\optional{, mode\optional{, buffersize}}} -Open the file \var{filename} as a can of Spam. The optional -\var{mode} and \var{buffersize} arguments specify the read/write mode -(\code{'r'} (default) or \code{'w'}) and the buffer size (default: -system dependent). -\end{funcdesc} - -% ---- 3.2. ---- -% Data items are described using a ``datadesc'' block. This has only -% one parameter: the item's name. - -\begin{datadesc}{cansize} -The default can size, in ounces. Legal values are 7 and 12. The -default varies per supermarket. This variable should not be changed -once the \function{open()} function has been called. -\end{datadesc} - -% --- 3.3. --- -% Exceptions are described using a ``excdesc'' block. This has only -% one parameter: the exception name. Exceptions defined as classes in -% the source code should be documented using this environment, but -% constructor parameters must be ommitted. - -\begin{excdesc}{error} -Exception raised when an operation fails for a Spam specific reason. -The exception argument is a string describing the reason of the -failure. -\end{excdesc} - -% ---- 3.4. ---- -% Other standard environments: -% -% classdesc - Python classes; same arguments are funcdesc -% methoddesc - methods, like funcdesc but has an optional parameter -% to give the type name: \begin{methoddesc}[mytype]{name}{args} -% By default, the type name will be the name of the -% last class defined using classdesc. The type name -% is required if the type is implemented in C (because -% there's no classdesc) or if the class isn't directly -% documented (if it's private). -% memberdesc - data members, like datadesc, but with an optional -% type name like methoddesc. - - -% ==== 4. ==== -% Now is probably a good time for a complete example. (Alternatively, -% an example giving the flavor of the module may be given before the -% detailed list of functions.) - -\subsection{Example \label{spam-example}} - -The following example demonstrates how to open a can of spam using the -\module{spam} module. - -\begin{verbatim} ->>> import spam ->>> can = spam.open('/etc/passwd') ->>> can.empty() ->>> can.close() -\end{verbatim} -% Note that there is no trailing ">>> " prompt shown. - -% ==== 5. ==== -% If your module defines new object types (for a built-in module) or -% classes (for a module written in Python), you should list the -% methods and instance variables (if any) of each type or class in a -% separate subsection. - -\subsection{Spam Objects} -\label{spam-objects} -% This label is generally useful for referencing this section, but is -% also used to give a filename when generating HTML. - -Spam objects, as returned by \function{open()} above, have the -following methods: - -\begin{methoddesc}[spam]{empty}{} -Empty the can into the trash. -\end{methoddesc} diff --git a/doc/tools/texinputs/boilerplate.tex b/doc/tools/texinputs/boilerplate.tex deleted file mode 100644 index e296dbd..0000000 --- a/doc/tools/texinputs/boilerplate.tex +++ /dev/null @@ -1,10 +0,0 @@ -\author{Guido van Rossum\\ - Fred L. Drake, Jr., editor} -\authoraddress{ - \strong{PythonLabs}\\ - E-mail: \email{python-docs@python.org} -} - -\date{April 15, 2001} % XXX update before release! -\release{2.1} % software release, not documentation -\setshortversion{2.1} % major.minor only for software diff --git a/doc/tools/texinputs/copyright.tex b/doc/tools/texinputs/copyright.tex deleted file mode 100644 index 7b45dce..0000000 --- a/doc/tools/texinputs/copyright.tex +++ /dev/null @@ -1,108 +0,0 @@ -\begin{small} -Copyright \copyright{} 2001 Python Software Foundation. -All rights reserved. - -Copyright \copyright{} 2000 BeOpen.com. -All rights reserved. - -Copyright \copyright{} 1995-2000 Corporation for National Research Initiatives. -All rights reserved. - -Copyright \copyright{} 1991-1995 Stichting Mathematisch Centrum. -All rights reserved. - -%%begin{latexonly} -\vskip 4mm -%%end{latexonly} - -\centerline{\strong{BEOPEN.COM TERMS AND CONDITIONS FOR PYTHON 2.0}} - -\centerline{\strong{BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1}} - -\begin{enumerate} - -\item -This LICENSE AGREEMENT is between BeOpen.com (``BeOpen''), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization (``Licensee'') accessing and otherwise -using this software in source or binary form and its associated -documentation (``the Software''). - -\item -Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -\item -BeOpen is making the Software available to Licensee on an ``AS IS'' -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -\item -BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -\item -This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -\item -This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the ``BeOpen Python'' logos available -at http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -\item -By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. -\end{enumerate} - - -\centerline{\strong{CNRI OPEN SOURCE GPL-COMPATIBLE LICENSE AGREEMENT}} - -Python 1.6.1 is made available subject to the terms and conditions in -CNRI's License Agreement. This Agreement together with Python 1.6.1 may -be located on the Internet using the following unique, persistent -identifier (known as a handle): 1895.22/1013. This Agreement may also -be obtained from a proxy server on the Internet using the following -URL: \url{http://hdl.handle.net/1895.22/1013}. - - -\centerline{\strong{CWI PERMISSIONS STATEMENT AND DISCLAIMER}} - -Copyright \copyright{} 1991 - 1995, Stichting Mathematisch Centrum -Amsterdam, The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -\end{small} diff --git a/doc/tools/texinputs/distutils.sty b/doc/tools/texinputs/distutils.sty deleted file mode 100644 index 20980cf..0000000 --- a/doc/tools/texinputs/distutils.sty +++ /dev/null @@ -1,33 +0,0 @@ -% -% LaTeX commands and macros needed for the two Distutils manuals, -% inst.tex and dist.tex. -% -% $Id: distutils.sty,v 1.1.1.1 2001/07/16 11:53:03 msjogren Exp $ -% - -% My gripe list about the Python style files: -% * I want italics in verbatim environments for variable -% text (verbatim.sty?) -% * I hate escaping underscores (url.sty fixes this) - -% '\command' is for Distutils commands which, depending on your -% perspective, are just arguments to the setup script, or sub- -% commands of the setup script, or the classes that implement -% each "command". -\newcommand{\command}[1]{\code{#1}} - -% '\option' is for Distutils options *in* the setup script. Command- -% line options *to* the setup script are marked up in the usual -% way, ie. with '\programopt' or '\longprogramopt' -\newcommand{\option}[1]{\textsf{\small{#1}}} - -% '\filevar' is for variable components of file/path names -- eg. -% when you put 'prefix' in a pathname, you mark it up with -% '\filevar' so that it still looks pathname-ish, but is -% distinguished from the literal part of the path. Fred says -% this can be accomplished just fine with '\var', but I violently -% disagree. Pistols at dawn will sort this one out. -\newcommand{\filevar}[1]{{\textsl{\filenq{#1}}}} - -% Just while the code and docs are still under development. -\newcommand{\XXX}[1]{\textbf{**#1**}} diff --git a/doc/tools/texinputs/fncychap.sty b/doc/tools/texinputs/fncychap.sty deleted file mode 100644 index b0d7b76..0000000 --- a/doc/tools/texinputs/fncychap.sty +++ /dev/null @@ -1,433 +0,0 @@ -%%% Derived from the original fncychap.sty, -%%% but changed ``TWELV'' to ``TWELVE''. - -%%% Copyright Ulf A. Lindgren -%%% Department of Applied Electronics -%%% Chalmers University of Technology -%%% S-412 96 Gothenburg, Sweden -%%% E-mail lindgren@ae.chalmers.se -%%% -%%% Note Permission is granted to modify this file under -%%% the condition that it is saved using another -%%% file and package name. -%%% -%%% Revision 1.1 -%%% -%%% Jan. 8th Modified package name base date option -%%% Jan. 22th Modified FmN and FmTi for error in book.cls -%%% \MakeUppercase{#}->{\MakeUppercase#} -%%% Apr. 6th Modified Lenny option to prevent undesired -%%% skip of line. -%%% Nov. 8th Fixed \@chapapp for AMS -%%% Feb. 11th Fixed appendix problem related to Bjarne -%%% Last modified Feb. 11th 1998 - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{fncychap} - [1997/04/06 v1.11 - LaTeX package (Revised chapters)] - -%%%% DEFINITION OF Chapapp variables -\newcommand{\CNV}{\huge\bfseries} -\newcommand{\ChNameVar}[1]{\renewcommand{\CNV}{#1}} - - -%%%% DEFINITION OF TheChapter variables -\newcommand{\CNoV}{\huge\bfseries} -\newcommand{\ChNumVar}[1]{\renewcommand{\CNoV}{#1}} - -\newif\ifUCN -\UCNfalse -\newif\ifLCN -\LCNfalse -\def\ChNameLowerCase{\LCNtrue\UCNfalse} -\def\ChNameUpperCase{\UCNtrue\LCNfalse} -\def\ChNameAsIs{\UCNfalse\LCNfalse} - -%%%%% Fix for AMSBook 971008 - -\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{} - - -%%%%% Fix for Bjarne and appendix 980211 - -\newif\ifinapp -\inappfalse -\renewcommand\appendix{\par - \setcounter{chapter}{0}% - \setcounter{section}{0}% - \inapptrue% - \renewcommand\@chapapp{\appendixname}% - \renewcommand\thechapter{\@Alph\c@chapter}} - -%%%%% - -\newcommand{\FmN}[1]{% -\ifUCN - {\MakeUppercase#1}\LCNfalse -\else - \ifLCN - {\MakeLowercase#1}\UCNfalse - \else #1 - \fi -\fi} - - -%%%% DEFINITION OF Title variables -\newcommand{\CTV}{\Huge\bfseries} -\newcommand{\ChTitleVar}[1]{\renewcommand{\CTV}{#1}} - -%%%% DEFINITION OF the basic rule width -\newlength{\RW} -\setlength{\RW}{1pt} -\newcommand{\ChRuleWidth}[1]{\setlength{\RW}{#1}} - -\newif\ifUCT -\UCTfalse -\newif\ifLCT -\LCTfalse -\def\ChTitleLowerCase{\LCTtrue\UCTfalse} -\def\ChTitleUpperCase{\UCTtrue\LCTfalse} -\def\ChTitleAsIs{\UCTfalse\LCTfalse} -\newcommand{\FmTi}[1]{% -\ifUCT - - {\MakeUppercase#1}\LCTfalse -\else - \ifLCT - {\MakeLowercase#1}\UCTfalse - \else #1 - \fi -\fi} - - - -\newlength{\mylen} -\newlength{\myhi} -\newlength{\px} -\newlength{\py} -\newlength{\pyy} -\newlength{\pxx} - - -\def\mghrulefill#1{\leavevmode\leaders\hrule\@height #1\hfill\kern\z@} - -\newcommand{\DOCH}{% - \CNV\FmN{\@chapapp}\space \CNoV\thechapter - \par\nobreak - \vskip 20\p@ - } -\newcommand{\DOTI}[1]{% - \CTV\FmTi{#1}\par\nobreak - \vskip 40\p@ - } -\newcommand{\DOTIS}[1]{% - \CTV\FmTi{#1}\par\nobreak - \vskip 40\p@ - } - -%%%%%% SONNY DEF - -\DeclareOption{Sonny}{% - \ChNameVar{\Large\sf} - \ChNumVar{\Huge} - \ChTitleVar{\Large\sf} - \ChRuleWidth{0.5pt} - \ChNameUpperCase - \renewcommand{\DOCH}{% - \raggedleft - \CNV\FmN{\@chapapp}\space \CNoV\thechapter - \par\nobreak - \vskip 40\p@} - \renewcommand{\DOTI}[1]{% - \CTV\raggedleft\mghrulefill{\RW}\par\nobreak - \vskip 5\p@ - \CTV\FmTi{#1}\par\nobreak - \mghrulefill{\RW}\par\nobreak - \vskip 40\p@} - \renewcommand{\DOTIS}[1]{% - \CTV\raggedleft\mghrulefill{\RW}\par\nobreak - \vskip 5\p@ - \CTV\FmTi{#1}\par\nobreak - \mghrulefill{\RW}\par\nobreak - \vskip 40\p@} -} - -%%%%%% LENNY DEF - -\DeclareOption{Lenny}{% - - \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont} - \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont} - \ChTitleVar{\Huge\bfseries\rm} - \ChRuleWidth{1pt} - \renewcommand{\DOCH}{% - \settowidth{\px}{\CNV\FmN{\@chapapp}} - \addtolength{\px}{2pt} - \settoheight{\py}{\CNV\FmN{\@chapapp}} - \addtolength{\py}{1pt} - - \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter} - \addtolength{\mylen}{1pt} - \settowidth{\pxx}{\CNoV\thechapter} - \addtolength{\pxx}{-1pt} - - \settoheight{\pyy}{\CNoV\thechapter} - \addtolength{\pyy}{-2pt} - \setlength{\myhi}{\pyy} - \addtolength{\myhi}{-1\py} - \par - \parbox[b]{\textwidth}{% - \rule[\py]{\RW}{\myhi}% - \hskip -\RW% - \rule[\pyy]{\px}{\RW}% - \hskip -\px% - \raggedright% - \CNV\FmN{\@chapapp}\space\CNoV\thechapter% - \hskip1pt% - \mghrulefill{\RW}% - \rule{\RW}{\pyy}\par\nobreak% - \vskip -\baselineskip% - \vskip -\pyy% - \hskip \mylen% - \mghrulefill{\RW}\par\nobreak% - \vskip \pyy}% - \vskip 20\p@} - - - \renewcommand{\DOTI}[1]{% - \raggedright - \CTV\FmTi{#1}\par\nobreak - \vskip 40\p@} - - \renewcommand{\DOTIS}[1]{% - \raggedright - \CTV\FmTi{#1}\par\nobreak - \vskip 40\p@} - } - - -%%%%%%% GLENN DEF - - -\DeclareOption{Glenn}{% - \ChNameVar{\bfseries\Large\sf} - \ChNumVar{\Huge} - \ChTitleVar{\bfseries\Large\rm} - \ChRuleWidth{1pt} - \ChNameUpperCase - \ChTitleUpperCase - \renewcommand{\DOCH}{% - \settoheight{\myhi}{\CTV\FmTi{Test}} - \setlength{\py}{\baselineskip} - \addtolength{\py}{\RW} - \addtolength{\py}{\myhi} - \setlength{\pyy}{\py} - \addtolength{\pyy}{-1\RW} - - \raggedright - \CNV\FmN{\@chapapp}\space\CNoV\thechapter - \hskip 3pt\mghrulefill{\RW}\rule[-1\pyy]{2\RW}{\py}\par\nobreak} - - \renewcommand{\DOTI}[1]{% - \addtolength{\pyy}{-4pt} - \settoheight{\myhi}{\CTV\FmTi{#1}} - \addtolength{\myhi}{\py} - \addtolength{\myhi}{-1\RW} - \vskip -1\pyy - \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt - \raggedleft\CTV\FmTi{#1}\par\nobreak - \vskip 80\p@} - - \renewcommand{\DOTIS}[1]{% - \setlength{\py}{10pt} - \setlength{\pyy}{\py} - \addtolength{\pyy}{\RW} - \setlength{\myhi}{\baselineskip} - \addtolength{\myhi}{\pyy} - \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak -% \addtolength{}{} -\vskip -1\baselineskip - \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt - \raggedleft\CTV\FmTi{#1}\par\nobreak - \vskip 60\p@} - } - -%%%%%%% CONNY DEF - -\DeclareOption{Conny}{% - \ChNameUpperCase - \ChTitleUpperCase - \ChNameVar{\centering\Huge\rm\bfseries} - \ChNumVar{\Huge} - \ChTitleVar{\centering\Huge\rm} - \ChRuleWidth{2pt} - - \renewcommand{\DOCH}{% - \mghrulefill{3\RW}\par\nobreak - \vskip -0.5\baselineskip - \mghrulefill{\RW}\par\nobreak - \CNV\FmN{\@chapapp}\space \CNoV\thechapter - \par\nobreak - \vskip -0.5\baselineskip - } - \renewcommand{\DOTI}[1]{% - \mghrulefill{\RW}\par\nobreak - \CTV\FmTi{#1}\par\nobreak - \vskip 60\p@ - } - \renewcommand{\DOTIS}[1]{% - \mghrulefill{\RW}\par\nobreak - \CTV\FmTi{#1}\par\nobreak - \vskip 60\p@ - } - } - -%%%%%%% REJNE DEF - -\DeclareOption{Rejne}{% - - \ChNameUpperCase - \ChTitleUpperCase - \ChNameVar{\centering\Large\rm} - \ChNumVar{\Huge} - \ChTitleVar{\centering\Huge\rm} - \ChRuleWidth{1pt} - \renewcommand{\DOCH}{% - \settoheight{\py}{\CNoV\thechapter} - \addtolength{\py}{-1pt} - \CNV\FmN{\@chapapp}\par\nobreak - \vskip 20\p@ - \setlength{\myhi}{2\baselineskip} - \setlength{\px}{\myhi} - \addtolength{\px}{-1\RW} - \rule[-1\px]{\RW}{\myhi}\mghrulefill{\RW}\hskip - 10pt\raisebox{-0.5\py}{\CNoV\thechapter}\hskip -10pt\mghrulefill{\RW}\rule[-1\px]{\RW}{\myhi}\par\nobreak - \vskip -1\p@ - } - \renewcommand{\DOTI}[1]{% - \setlength{\mylen}{\textwidth} - \addtolength{\mylen}{-2\RW} - {\vrule width\RW}\parbox{\mylen}{\CTV\FmTi{#1}}{\vrule -width\RW}\par\nobreak - \vskip --1pt\rule{\RW}{2\baselineskip}\mghrulefill{\RW}\rule{\RW}{2\baselineskip} - \vskip 60\p@ - } - \renewcommand{\DOTIS}[1]{% - \setlength{\py}{\fboxrule} - \setlength{\fboxrule}{\RW} - \setlength{\mylen}{\textwidth} - \addtolength{\mylen}{-2\RW} - \fbox{\parbox{\mylen}{\vskip -2\baselineskip\CTV\FmTi{#1}\par\nobreak\vskip \baselineskip}} - \setlength{\fboxrule}{\py} - \vskip 60\p@ - } - } - - -%%%%%%% BJARNE DEF - -\DeclareOption{Bjarne}{% - \ChNameUpperCase - \ChTitleUpperCase - \ChNameVar{\raggedleft\normalsize\rm} - \ChNumVar{\raggedleft \bfseries\Large} - \ChTitleVar{\raggedleft \Large\rm} - \ChRuleWidth{1pt} - - -%% Note thechapter -> c@chapter fix appendix bug - - \newcounter{AlphaCnt} - \newcounter{AlphaDecCnt} - \newcommand{\AlphaNo}{% - \ifcase\number\theAlphaCnt - \ifnum\c@chapter=0 - ZERO\else{}\fi - \or ONE\or TWO\or THREE\or FOUR\or FIVE - \or SIX\or SEVEN\or EIGHT\or NINE\or TEN - \or ELEVEN\or TWELVE\or THIRTEEN\or FOURTEEN\or FIFTEEN - \or SIXTEEN\or SEVENTEEN\or EIGHTEEN\or NINETEEN\fi -} - - \newcommand{\AlphaDecNo}{% - \setcounter{AlphaDecCnt}{0} - \@whilenum\number\theAlphaCnt>0\do - {\addtocounter{AlphaCnt}{-10} - \addtocounter{AlphaDecCnt}{1}} - \ifnum\number\theAlphaCnt=0 - \else - \addtocounter{AlphaDecCnt}{-1} - \addtocounter{AlphaCnt}{10} - \fi - - - \ifcase\number\theAlphaDecCnt\or TEN\or TWENTY\or THIRTY\or - FORTY\or FIFTY\or SIXTY\or SEVENTY\or EIGHTY\or NINETY\fi - } - \newcommand{\TheAlphaChapter}{% - - \ifinapp - \thechapter - \else - \setcounter{AlphaCnt}{\c@chapter} - \ifnum\c@chapter<20 - \AlphaNo - \else - \AlphaDecNo\AlphaNo - \fi - \fi - } - \renewcommand{\DOCH}{% - \mghrulefill{\RW}\par\nobreak - \CNV\FmN{\@chapapp}\par\nobreak - \CNoV\TheAlphaChapter\par\nobreak - \vskip -1\baselineskip\vskip 5pt\mghrulefill{\RW}\par\nobreak - \vskip 20\p@ - } - \renewcommand{\DOTI}[1]{% - \CTV\FmTi{#1}\par\nobreak - \vskip 40\p@ - } - \renewcommand{\DOTIS}[1]{% - \CTV\FmTi{#1}\par\nobreak - \vskip 40\p@ - } -} - -\DeclareOption*{% - \PackageWarning{fancychapter}{unknown style option} - } - -\ProcessOptions* \relax - -\def\@makechapterhead#1{% - \vspace*{50\p@}% - {\parindent \z@ \raggedright \normalfont - \ifnum \c@secnumdepth >\m@ne - \DOCH - \fi - \interlinepenalty\@M - \DOTI{#1} - }} -\def\@schapter#1{\if@twocolumn - \@topnewpage[\@makeschapterhead{#1}]% - \else - \@makeschapterhead{#1}% - \@afterheading - \fi} -\def\@makeschapterhead#1{% - \vspace*{50\p@}% - {\parindent \z@ \raggedright - \normalfont - \interlinepenalty\@M - \DOTIS{#1} - \vskip 40\p@ - }} - -\endinput - - diff --git a/doc/tools/texinputs/howto.cls b/doc/tools/texinputs/howto.cls deleted file mode 100644 index 899b4ae..0000000 --- a/doc/tools/texinputs/howto.cls +++ /dev/null @@ -1,106 +0,0 @@ -% -% howto.cls for the Python documentation -% - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{howto} - [1998/02/25 Document class (Python HOWTO)] - -\RequirePackage{pypaper} - -% Change the options here to get a different set of basic options, This -% is where to add things like "a4paper" or "10pt". -% -\LoadClass[twoside]{article} - -\setcounter{secnumdepth}{1} - -% Optional packages: -% -% If processing of these documents fails at your TeX installation, -% these may be commented out (independently) to make things work. -% These are both supplied with the current version of the teTeX -% distribution. -% -% The "fancyhdr" package makes nicer page footers reasonable to -% implement, and is used to put the chapter and section information in -% the footers. -% -\RequirePackage{fancyhdr}\typeout{Using fancier footers than usual.} - - -% Required package: -% -% This gives us all the Python-specific markup that we really want. -% This should come last. Do not change this. -% -\RequirePackage{python} - -% support for module synopsis sections: -\newcommand{\py@ModSynopsisFilename}{\jobname.syn} - - -% need to do one of these.... -\newcommand{\py@doHorizontalRule}{\rule{\textwidth}{1pt}} - - -% Change the title page to look a bit better, and fit in with the -% fncychap ``Bjarne'' style a bit better. -% -\renewcommand{\maketitle}{ - \py@doHorizontalRule - \@ifundefined{pdfinfo}{}{{ - % This \def is required to deal with multi-line authors; it - % changes \\ to ', ' (comma-space), making it pass muster for - % generating document info in the PDF file. - \def\\{, } - \pdfinfo{ - /Author (\@author) - /Title (\@title) - } - }} - \begin{flushright} - {\rm\Huge\py@HeaderFamily \@title} \par - {\em\large\py@HeaderFamily \py@release} \par - \vspace{25pt} - {\Large\py@HeaderFamily \@author} \par - \vspace{25pt} - \@date \par - \py@authoraddress \par - \end{flushright} - \@thanks - \setcounter{footnote}{0} - \let\thanks\relax\let\maketitle\relax - \gdef\@thanks{}\gdef\@author{}\gdef\@title{} -} - - -\let\py@OldTableofcontents=\tableofcontents -\renewcommand{\tableofcontents}{ - \begingroup - \parskip = 0mm - \py@OldTableofcontents - \endgroup - \py@doHorizontalRule - \vspace{12pt} - \py@doing@page@targetstrue -} - -% Fix the theindex environment to add an entry to the Table of -% Contents; this is much nicer than just having to jump to the end of -% the book and flip around, especially with multiple indexes. -% -\let\py@OldTheindex=\theindex -\renewcommand{\theindex}{ - \clearpage - \py@OldTheindex - \addcontentsline{toc}{section}{\indexname} -} - -\@ifundefined{fancyhf}{ - \pagestyle{plain}}{ - \pagestyle{normal}} % start this way; change for -\pagenumbering{arabic} % ToC & chapters -\setcounter{secnumdepth}{2} - -\thispagestyle{empty} diff --git a/doc/tools/texinputs/ltxmarkup.sty b/doc/tools/texinputs/ltxmarkup.sty deleted file mode 100644 index d461d70..0000000 --- a/doc/tools/texinputs/ltxmarkup.sty +++ /dev/null @@ -1,40 +0,0 @@ -% Created by Fred L. Drake, Jr. <fdrake@acm.org>, as part of the -% Python Documentation Project. -% -% Define some simple markup for the LaTeX command documentation: - -\ProvidesPackage{ltxmarkup} -\RequirePackage{python} % fulllineitems environment - -% These two macros are used in constructing the last parameter to the -% envdesc and macrodesc environments. - -\newcommand{\py@ltx@optparam}[1]{{[}\var{#1}{]}} -\newcommand{\py@ltx@param}[1]{\{\var{#1}\}} - -\newenvironment{envdesc}[2]{ - \begin{fulllineitems} - \item[\code{\e begin\{{\bfseries #1}\}{% - \let\op=\py@ltx@optparam% - \let\p=\py@ltx@param% - \let\unspecified=\py@unspecified% - \let\moreargs=\py@moreargs% - #2}}] - \item[\code{\e end\{{\bfseries #1}\}}] - \index{#1 environment@\idxcode{#1} environment} - \index{environments!#1@\idxcode{#1}} -}{\end{fulllineitems}} - -\newenvironment{macrodesc}[2]{ - \begin{fulllineitems} - \item[\code{{\e\bfseries#1}{% - \let\op=\py@ltx@optparam% - \let\p=\py@ltx@param% - \let\unspecified=\py@unspecified% - \let\moreargs=\py@moreargs% - #2}}] - \index{#1@\idxcode{\e #1}} -}{\end{fulllineitems}} - -\newcommand{\env}[1]{\code{#1}} -\newcommand{\macro}[1]{\code{\e#1}} diff --git a/doc/tools/texinputs/manual.cls b/doc/tools/texinputs/manual.cls deleted file mode 100644 index 789cae1..0000000 --- a/doc/tools/texinputs/manual.cls +++ /dev/null @@ -1,152 +0,0 @@ -% -% manual.cls for the Python documentation -% - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesClass{manual} - [1998/03/03 Document class (Python manual)] - -\RequirePackage{pypaper} - -% Change the options here to get a different set of basic options, but only -% if you have to. Paper and font size should be adjusted in pypaper.sty. -% -\LoadClass[\py@paper,\py@ptsize,twoside,openright]{report} - -\setcounter{secnumdepth}{2} - -% Optional packages: -% -% If processing of these documents fails at your TeX installation, -% these may be commented out (independently) to make things work. -% These are both supplied with the current version of the teTeX -% distribution. -% -% The "fancyhdr" package makes nicer page footers reasonable to -% implement, and is used to put the chapter and section information in -% the footers. -% -\RequirePackage{fancyhdr}\typeout{Using fancier footers than usual.} - - -% Required packages: -% -% The "fncychap" package is used to get the nice chapter headers. The -% .sty file is distributed with Python, so you should not need to disable -% it. You'd also end up with a mixed page style; uglier than stock LaTeX! -% -\RequirePackage[Bjarne]{fncychap}\typeout{Using fancy chapter headings.} -% Do horizontal rules it this way to match: -\newcommand{\py@doHorizontalRule}{\mghrulefill{\RW}} -% -% -% This gives us all the Python-specific markup that we really want. -% This should come last. Do not change this. -% -\RequirePackage{python} - -% support for module synopsis sections: -\newcommand{\py@ModSynopsisFilename}{\jobname\thechapter.syn} -\let\py@OldChapter=\chapter -\renewcommand{\chapter}{ - \py@ProcessModSynopsis - \py@closeModSynopsisFile - \py@OldChapter -} - - -% Change the title page to look a bit better, and fit in with the -% fncychap ``Bjarne'' style a bit better. -% -\renewcommand{\maketitle}{% - \begin{titlepage}% - \let\footnotesize\small - \let\footnoterule\relax - \py@doHorizontalRule% - \@ifundefined{pdfinfo}{}{{ - % This \def is required to deal with multi-line authors; it - % changes \\ to ', ' (comma-space), making it pass muster for - % generating document info in the PDF file. - \def\\{, } - \pdfinfo{ - /Author (\@author) - /Title (\@title) - } - }} - \begin{flushright}% - {\rm\Huge\py@HeaderFamily \@title \par}% - {\em\LARGE\py@HeaderFamily \py@release \par} - \vfill - {\LARGE\py@HeaderFamily \@author \par} - \vfill\vfill - {\large - \@date \par - \vfill - \py@authoraddress \par - }% - \end{flushright}%\par - \@thanks - \end{titlepage}% - \setcounter{footnote}{0}% - \let\thanks\relax\let\maketitle\relax - \gdef\@thanks{}\gdef\@author{}\gdef\@title{} -} - - -% Catch the end of the {abstract} environment, but here make sure the -% abstract is followed by a blank page if the 'openright' option is used. -% -\let\py@OldEndAbstract=\endabstract -\renewcommand{\endabstract}{ - \if@openright - \ifodd\value{page} - \typeout{Adding blank page after the abstract.} - \vfil\pagebreak - \fi - \fi - \py@OldEndAbstract -} - -% This wraps the \tableofcontents macro with all the magic to get the -% spacing right and have the right number of pages if the 'openright' -% option has been used. This eliminates a fair amount of crud in the -% individual document files. -% -\let\py@OldTableofcontents=\tableofcontents -\renewcommand{\tableofcontents}{% - \setcounter{page}{1}% - \pagebreak% - \pagestyle{plain}% - {% - \parskip = 0mm% - \py@OldTableofcontents% - \if@openright% - \ifodd\value{page}% - \typeout{Adding blank page after the table of contents.}% - \pagebreak\hspace{0pt}% - \fi% - \fi% - \cleardoublepage% - }% - \pagenumbering{arabic}% - \@ifundefined{fancyhf}{}{\pagestyle{normal}}% - \py@doing@page@targetstrue% -} -% This is needed to get the width of the section # area wide enough in the -% library reference. Doing it here keeps it the same for all the manuals. -% -\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}} -\renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}} -\setcounter{tocdepth}{1} - - -% Fix the theindex environment to add an entry to the Table of -% Contents; this is much nicer than just having to jump to the end of -% the book and flip around, especially with multiple indexes. -% -\let\py@OldTheindex=\theindex -\renewcommand{\theindex}{ - \cleardoublepage - \py@OldTheindex - \addcontentsline{toc}{chapter}{\indexname} -} diff --git a/doc/tools/texinputs/pypaper.sty b/doc/tools/texinputs/pypaper.sty deleted file mode 100644 index 3959637..0000000 --- a/doc/tools/texinputs/pypaper.sty +++ /dev/null @@ -1,18 +0,0 @@ -% -% Change this to say a4paper instead of letterpaper if you want A4. These -% are the latex defaults. -% -\newcommand{\py@paper}{letterpaper} -\newcommand{\py@ptsize}{10pt} - -% These set up the fonts for the documents. -% -% The "times" package makes the default font the PostScript Times -% font, which makes for smaller PostScript and a font that more people -% like. -% -% The "avant" package causes the AvantGarde font to be used for -% sans-serif text, instead of the uglier Helvetica set up by the "times" -% package. -% -\RequirePackage{times}\typeout{Using Times instead of Computer Modern.} diff --git a/doc/tools/texinputs/python.ist b/doc/tools/texinputs/python.ist deleted file mode 100644 index 9ffa0f9..0000000 --- a/doc/tools/texinputs/python.ist +++ /dev/null @@ -1,11 +0,0 @@ -line_max 100 -headings_flag 1 -heading_prefix " \\bigletter " - -preamble "\\begin{theindex} -\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}} - -" - -symhead_positive "{Symbols}" -numhead_positive "{Numbers}" diff --git a/doc/tools/texinputs/python.sty b/doc/tools/texinputs/python.sty deleted file mode 100644 index 8a61d87..0000000 --- a/doc/tools/texinputs/python.sty +++ /dev/null @@ -1,1082 +0,0 @@ -% -% python.sty for the Python docummentation [works only with with Latex2e] -% - -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{python} - [1998/01/11 LaTeX package (Python markup)] - -\RequirePackage{longtable} - -% Uncomment these two lines to ignore the paper size and make the page -% size more like a typical published manual. -%\renewcommand{\paperheight}{9in} -%\renewcommand{\paperwidth}{8.5in} % typical squarish manual -%\renewcommand{\paperwidth}{7in} % O'Reilly ``Programmming Python'' - -% These packages can be used to add marginal annotations which indicate -% index entries and labels; useful for reviewing this messy documentation! -% -%\RequirePackage{showkeys} -%\RequirePackage{showidx} - -% for PDF output, use maximal compression & a lot of other stuff -% (test for PDF recommended by Tanmoy Bhattacharya <tanmoy@qcd.lanl.gov>) -% -\newif\ifpy@doing@page@targets -\py@doing@page@targetsfalse - -\ifx\pdfoutput\undefined\else\ifcase\pdfoutput -\else - \input{pdfcolor} - \let\py@LinkColor=\NavyBlue - \let\py@NormalColor=\Black - \pdfcompresslevel=9 - \pdfpagewidth=\paperwidth % page width of PDF output - \pdfpageheight=\paperheight % page height of PDF output - % - % Pad the number with '0' to 3 digits wide so no page name is a prefix - % of any other. - % - \newcommand{\py@targetno}[1]{\ifnum#1<100 0\fi\ifnum#1<10 0\fi#1} - \newcommand{\py@pageno}{\py@targetno\thepage} - % - % This definition allows the entries in the page-view of the ToC to be - % active links. Some work, some don't. - % - \let\py@OldContentsline=\contentsline - % - % Macro that takes two args: the name to link to and the content of - % the link. This takes care of the PDF magic, getting the colors - % the same for each link, and avoids having lots of garbage all over - % this style file. - \newcommand{\py@linkToName}[2]{% - \pdfannotlink attr{/Border [0 0 0]} goto name{#1}% - \py@LinkColor#2\py@NormalColor% - \pdfendlink% - } - % Compute the padded page number separately since we end up with a pair of - % \relax tokens; this gets the right string computed and works. - \renewcommand{\contentsline}[3]{% - \def\my@pageno{\py@targetno{#3}}% - \py@OldContentsline{#1}{\py@linkToName{page\my@pageno}{#2}}{#3}% - } - \AtEndDocument{ - \InputIfFileExists{\jobname.bkm}{\pdfcatalog{/PageMode /UseOutlines}}{} - } - \newcommand{\py@target}[1]{% - \ifpy@doing@page@targets% - {\pdfdest name{#1} xyz}% - \fi% - } - \let\py@OldLabel=\label - \renewcommand{\label}[1]{% - \py@OldLabel{#1}% - \py@target{label-#1}% - } - % This stuff adds a page# destination to every PDF page, where # is three - % digits wide, padded with leading zeros. This doesn't really help with - % the frontmatter, but does fine with the body. - % - % This is *heavily* based on the hyperref package. - % - \def\@begindvi{% - \unvbox \@begindvibox - \@hyperfixhead - } - \def\@hyperfixhead{% - \let\H@old@thehead\@thehead - \global\def\@foo{\py@target{page\py@pageno}}% - \expandafter\ifx\expandafter\@empty\H@old@thehead - \def\H@old@thehead{\hfil}\fi - \def\@thehead{\@foo\relax\H@old@thehead}% - } -\fi\fi - -% Increase printable page size (copied from fullpage.sty) -\topmargin 0pt -\advance \topmargin by -\headheight -\advance \topmargin by -\headsep - -% attempt to work a little better for A4 users -\textheight \paperheight -\advance\textheight by -2in - -\oddsidemargin 0pt -\evensidemargin 0pt -%\evensidemargin -.25in % for ``manual size'' documents -\marginparwidth 0.5in - -\textwidth \paperwidth -\advance\textwidth by -2in - - -% Style parameters and macros used by most documents here -\raggedbottom -\sloppy -\parindent = 0mm -\parskip = 2mm -\hbadness = 5000 % don't print trivial gripes - -\pagestyle{empty} % start this way; change for -\pagenumbering{roman} % ToC & chapters - -% Use this to set the font family for headers and other decor: -\newcommand{\py@HeaderFamily}{\sffamily} - -% Redefine the 'normal' header/footer style when using "fancyhdr" package: -\@ifundefined{fancyhf}{}{ - % Use \pagestyle{normal} as the primary pagestyle for text. - \fancypagestyle{normal}{ - \fancyhf{} - \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} - \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} - \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0.4pt} - } - % Update the plain style so we get the page number & footer line, - % but not a chapter or section title. This is to keep the first - % page of a chapter and the blank page between chapters `clean.' - \fancypagestyle{plain}{ - \fancyhf{} - \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0.4pt} - } - % Redefine \cleardoublepage so that the blank page between chapters - % gets the plain style and not the fancy style. This is described - % in the documentation for the fancyhdr package by Piet von Oostrum. - \@ifundefined{chapter}{}{ - \renewcommand{\cleardoublepage}{ - \clearpage\if@openright \ifodd\c@page\else - \hbox{} - \thispagestyle{plain} - \newpage - \if@twocolumn\hbox{}\newpage\fi\fi\fi - } - } -} - -% This sets up the {verbatim} environment to be indented and a minipage, -% and to have all the other mostly nice properties that we want for -% code samples. - -\let\py@OldVerbatim=\verbatim -\let\py@OldEndVerbatim=\endverbatim -\RequirePackage{verbatim} - -% Variable used by begin code command -\newlength{\py@codewidth} - -\renewcommand{\verbatim}{% - \setlength{\parindent}{1cm}% - % Calculate the text width for the minipage: - \setlength{\py@codewidth}{\linewidth}% - \addtolength{\py@codewidth}{-\parindent}% - % - \par\indent% - \begin{minipage}[t]{\py@codewidth}% - \small% - \py@OldVerbatim% -} -\renewcommand{\endverbatim}{% - \py@OldEndVerbatim% - \end{minipage}% -} - -% This does a similar thing for the {alltt} environment: -\RequirePackage{alltt} -\let\py@OldAllTT=\alltt -\let\py@OldEndAllTT=\endalltt - -\renewcommand{\alltt}{% - \setlength{\parindent}{1cm}% - % Calculate the text width for the minipage: - \setlength{\py@codewidth}{\linewidth}% - \addtolength{\py@codewidth}{-\parindent}% - % - \par\indent% - \begin{minipage}[t]{\py@codewidth}% - \small% - \py@OldAllTT% -} -\renewcommand{\endalltt}{% - \py@OldEndAllTT% - \end{minipage}% -} - - -\newcommand{\py@modulebadkey}{{--just-some-junk--}} - - -%% Lots of index-entry generation support. - -% Command to wrap around stuff that refers to function / module / -% attribute names in the index. Default behavior: like \code{}. To -% just keep the index entries in the roman font, uncomment the second -% definition; it matches O'Reilly style more. -% -\newcommand{\py@idxcode}[1]{\texttt{#1}} -%\renewcommand{\py@idxcode}[1]{#1} - -% Command to generate two index entries (using subentries) -\newcommand{\indexii}[2]{\index{#1!#2}\index{#2!#1}} - -% And three entries (using only one level of subentries) -\newcommand{\indexiii}[3]{\index{#1!#2 #3}\index{#2!#3, #1}\index{#3!#1 #2}} - -% And four (again, using only one level of subentries) -\newcommand{\indexiv}[4]{ -\index{#1!#2 #3 #4} -\index{#2!#3 #4, #1} -\index{#3!#4, #1 #2} -\index{#4!#1 #2 #3} -} - -% Command to generate a reference to a function, statement, keyword, -% operator. -\newcommand{\kwindex}[1]{\indexii{keyword}{#1@{\py@idxcode{#1}}}} -\newcommand{\stindex}[1]{\indexii{statement}{#1@{\py@idxcode{#1}}}} -\newcommand{\opindex}[1]{\indexii{operator}{#1@{\py@idxcode{#1}}}} -\newcommand{\exindex}[1]{\indexii{exception}{#1@{\py@idxcode{#1}}}} -\newcommand{\obindex}[1]{\indexii{object}{#1}} -\newcommand{\bifuncindex}[1]{% - \index{#1@{\py@idxcode{#1()}} (built-in function)}} - -% Add an index entry for a module -\newcommand{\py@refmodule}[2]{\index{#1@{\py@idxcode{#1}} (#2module)}} -\newcommand{\refmodindex}[1]{\py@refmodule{#1}{}} -\newcommand{\refbimodindex}[1]{\py@refmodule{#1}{built-in }} -\newcommand{\refexmodindex}[1]{\py@refmodule{#1}{extension }} -\newcommand{\refstmodindex}[1]{\py@refmodule{#1}{standard }} - -% Refer to a module's documentation using a hyperlink of the module's -% name, at least if we're building PDF: -\@ifundefined{pdfannotlink}{% - \newcommand{\refmodule}[2][\py@modulebadkey]{\module{#2}} -}{% - \newcommand{\refmodule}[2][\py@modulebadkey]{% - \ifx\py@modulebadkey#1\def\py@modulekey{#2}\else\def\py@modulekey{#1}\fi% - \py@linkToName{label-module-\py@modulekey}{\module{#2}}% - } -} - -% support for the module index -\newif\ifpy@UseModuleIndex -\py@UseModuleIndexfalse - -\newcommand{\makemodindex}{ - \newwrite\modindexfile - \openout\modindexfile=mod\jobname.idx - \py@UseModuleIndextrue -} - -% Add the defining entry for a module -\newcommand{\py@modindex}[2]{% - \renewcommand{\py@thismodule}{#1} - \setindexsubitem{(in module #1)}% - \index{#1@{\py@idxcode{#1}} (#2module)|textbf}% - \ifpy@UseModuleIndex% - \@ifundefined{py@modplat@\py@thismodulekey}{ - \write\modindexfile{\protect\indexentry{#1@{\texttt{#1}}}{\thepage}}% - }{\write\modindexfile{\protect\indexentry{#1@{\texttt{#1} % - \emph{(\py@platformof[\py@thismodulekey]{})}}}{\thepage}}% - } - \fi% -} - -% *** XXX *** THE NEXT FOUR MACROS ARE NOW OBSOLETE !!! *** - -% built-in & Python modules in the main distribution -\newcommand{\bimodindex}[1]{\py@modindex{#1}{built-in }% - \typeout{*** MACRO bimodindex IS OBSOLETE -- USE declaremodule INSTEAD!}} -\newcommand{\stmodindex}[1]{\py@modindex{#1}{standard }% - \typeout{*** MACRO stmodindex IS OBSOLETE -- USE declaremodule INSTEAD!}} - -% Python & extension modules outside the main distribution -\newcommand{\modindex}[1]{\py@modindex{#1}{}% - \typeout{*** MACRO modindex IS OBSOLETE -- USE declaremodule INSTEAD!}} -\newcommand{\exmodindex}[1]{\py@modindex{#1}{extension }% - \typeout{*** MACRO exmodindex IS OBSOLETE -- USE declaremodule INSTEAD!}} - -% Additional string for an index entry -\newif\ifpy@usingsubitem\py@usingsubitemfalse -\newcommand{\py@indexsubitem}{} -\newcommand{\setindexsubitem}[1]{\renewcommand{\py@indexsubitem}{ #1}% - \py@usingsubitemtrue} -\newcommand{\ttindex}[1]{% - \ifpy@usingsubitem - \index{#1@{\py@idxcode{#1}}\py@indexsubitem}% - \else% - \index{#1@{\py@idxcode{#1}}}% - \fi% -} -\newcommand{\withsubitem}[2]{% - \begingroup% - \def\ttindex##1{\index{##1@{\py@idxcode{##1}} #1}}% - #2% - \endgroup% -} - - -% Module synopsis processing ----------------------------------------------- -% -\newcommand{\py@thisclass}{} -\newcommand{\py@thismodule}{} -\newcommand{\py@thismodulekey}{} -\newcommand{\py@thismoduletype}{} - -\newcommand{\py@standardIndexModule}[1]{\py@modindex{#1}{standard }} -\newcommand{\py@builtinIndexModule}[1]{\py@modindex{#1}{built-in }} -\newcommand{\py@extensionIndexModule}[1]{\py@modindex{#1}{extension }} -\newcommand{\py@IndexModule}[1]{\py@modindex{#1}{}} - -\newif\ifpy@HaveModSynopsis \py@HaveModSynopsisfalse -\newif\ifpy@ModSynopsisFileIsOpen \py@ModSynopsisFileIsOpenfalse -\newif\ifpy@HaveModPlatform \py@HaveModPlatformfalse - -% \declaremodule[key]{type}{name} -\newcommand{\declaremodule}[3][\py@modulebadkey]{ - \py@openModSynopsisFile - \renewcommand{\py@thismoduletype}{#2} - \ifx\py@modulebadkey#1 - \renewcommand{\py@thismodulekey}{#3} - \else - \renewcommand{\py@thismodulekey}{#1} - \fi - \@ifundefined{py@#2IndexModule}{% - \typeout{*** MACRO declaremodule called with unknown module type: `#2'} - \py@IndexModule{#3}% - }{% - \csname py@#2IndexModule\endcsname{#3}% - } - \label{module-\py@thismodulekey} -} -\newif\ifpy@ModPlatformFileIsOpen \py@ModPlatformFileIsOpenfalse -\newcommand{\py@ModPlatformFilename}{\jobname.pla} -\newcommand{\platform}[1]{ - \ifpy@ModPlatformFileIsOpen\else - \newwrite\py@ModPlatformFile - \openout\py@ModPlatformFile=\py@ModPlatformFilename - \py@ModPlatformFileIsOpentrue - \fi -} -\InputIfFileExists{\jobname.pla}{}{} -\newcommand{\py@platformof}[2][\py@modulebadkey]{% - \ifx\py@modulebadkey#1 \def\py@key{#2}% - \else \def\py@key{#1}% - \fi% - \csname py@modplat@\py@key\endcsname% -} -\newcommand{\ignorePlatformAnnotation}[1]{} - -% \moduleauthor{name}{email} -\newcommand{\moduleauthor}[2]{} - -% \sectionauthor{name}{email} -\newcommand{\sectionauthor}[2]{} - - -\newcommand{\py@defsynopsis}{Module has no synopsis.} -\newcommand{\py@modulesynopsis}{\py@defsynopsis} -\newcommand{\modulesynopsis}[1]{ - \py@HaveModSynopsistrue - \renewcommand{\py@modulesynopsis}{#1} -} - -% define the file -\newwrite\py@ModSynopsisFile - -% hacked from \addtocontents from latex.ltx: -\long\def\py@writeModSynopsisFile#1{% - \protected@write\py@ModSynopsisFile% - {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}% - {\string#1}% -} -\newcommand{\py@closeModSynopsisFile}{ - \ifpy@ModSynopsisFileIsOpen - \closeout\py@ModSynopsisFile - \py@ModSynopsisFileIsOpenfalse - \fi -} -\newcommand{\py@openModSynopsisFile}{ - \ifpy@ModSynopsisFileIsOpen\else - \openout\py@ModSynopsisFile=\py@ModSynopsisFilename - \py@ModSynopsisFileIsOpentrue - \fi -} - -\newcommand{\py@ProcessModSynopsis}{ - \ifpy@HaveModSynopsis - \py@writeModSynopsisFile{\modulesynopsis% - {\py@thismodulekey}{\py@thismodule}% - {\py@thismoduletype}{\py@modulesynopsis}}% - \py@HaveModSynopsisfalse - \fi - \renewcommand{\py@modulesynopsis}{\py@defsynopsis} -} -\AtEndDocument{\py@ProcessModSynopsis\py@closeModSynopsisFile} - - -\long\def\py@writeModPlatformFile#1{% - \protected@write\py@ModPlatformFile% - {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}% - {\string#1}% -} - - -\newcommand{\localmoduletable}{ - \IfFileExists{\py@ModSynopsisFilename}{ - \begin{synopsistable} - \input{\py@ModSynopsisFilename} - \end{synopsistable} - }{} -} - -\@ifundefined{pdfoutput}{ - \newcommand{\py@ModSynopsisSummary}[4]{\bfcode{#2} & #4\\} -}{ - \newcommand{\py@ModSynopsisSummary}[4]{% - \py@linkToName{label-module-#1}{\bfcode{#2}} & #4\\ - } -} -\newenvironment{synopsistable}{ - % key, name, type, synopsis - \let\modulesynopsis=\py@ModSynopsisSummary - \begin{tabular}{ll} -}{ - \end{tabular} -} -% -% -------------------------------------------------------------------------- - - -\newcommand{\py@reset}{ - \py@usingsubitemfalse - \py@ProcessModSynopsis - \renewcommand{\py@thisclass}{} - \renewcommand{\py@thismodule}{} - \renewcommand{\py@thismodulekey}{} - \renewcommand{\py@thismoduletype}{} -} - -% Augment the sectioning commands used to get our own font family in place, -% and reset some internal data items: -\renewcommand{\section}{\py@reset% - \@startsection{section}{1}{\z@}% - {-3.5ex \@plus -1ex \@minus -.2ex}% - {2.3ex \@plus.2ex}% - {\reset@font\Large\py@HeaderFamily}} -\renewcommand{\subsection}{\@startsection{subsection}{2}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\reset@font\large\py@HeaderFamily}} -\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\reset@font\normalsize\py@HeaderFamily}} -\renewcommand{\paragraph}{\@startsection{paragraph}{4}{\z@}% - {3.25ex \@plus1ex \@minus.2ex}% - {-1em}% - {\reset@font\normalsize\py@HeaderFamily}} -\renewcommand{\subparagraph}{\@startsection{subparagraph}{5}{\parindent}% - {3.25ex \@plus1ex \@minus .2ex}% - {-1em}% - {\reset@font\normalsize\py@HeaderFamily}} - - -% This gets the underscores closer to the right width; the only change -% from standard LaTeX is the width specified. - -\DeclareTextCommandDefault{\textunderscore}{% - \leavevmode \kern.06em\vbox{\hrule\@width.55em}} - -% Underscore hack (only act like subscript operator if in math mode) -% -% The following is due to Mark Wooding (the old version didn't work with -% Latex 2e. - -\DeclareRobustCommand\hackscore{% - \ifmmode_\else\textunderscore\fi% -} -\begingroup -\catcode`\_\active -\def\next{% - \AtBeginDocument{\catcode`\_\active\def_{\hackscore{}}}% -} -\expandafter\endgroup\next - - -% Now for a lot of semantically-loaded environments that do a ton of magical -% things to get the right formatting and index entries for the stuff in -% Python modules and C API. - - -% {fulllineitems} is used in one place in libregex.tex, but is really for -% internal use in this file. -% -\newcommand{\py@itemnewline}[1]{% - \@tempdima\linewidth% - \advance\@tempdima \leftmargin\makebox[\@tempdima][l]{#1}% -} - -\newenvironment{fulllineitems}{ - \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt - \rightmargin 0pt \topsep -\parskip \partopsep \parskip - \itemsep -\parsep - \let\makelabel=\py@itemnewline} -}{\end{list}} - -% \optional is mostly for use in the arguments parameters to the various -% {*desc} environments defined below, but may be used elsewhere. Known to -% be used in the debugger chapter. -% -% Typical usage: -% -% \begin{funcdesc}{myfunc}{reqparm\optional{, optparm}} -% ^^^ ^^^ -% No space here No space here -% -% When a function has multiple optional parameters, \optional should be -% nested, not chained. This is right: -% -% \begin{funcdesc}{myfunc}{\optional{parm1\optional{, parm2}}} -% -\let\py@badkey=\@undefined - -\newcommand{\optional}[1]{% - {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}} - -% This can be used when a function or method accepts an varying number -% of arguments, such as by using the *args syntax in the parameter list. -\newcommand{\py@moreargs}{...} - -% This can be used when you don't want to document the parameters to a -% function or method, but simply state that it's an alias for -% something else. -\newcommand{\py@unspecified}{...} - -% C functions ------------------------------------------------------------ -% \begin{cfuncdesc}[refcount]{type}{name}{arglist} -% Note that the [refcount] slot should only be filled in by -% tools/anno-api.py; it pulls the value from the refcounts database. -\newenvironment{cfuncdesc}[4][\py@badkey]{ - \begin{fulllineitems} - \item[\code{#2 \bfcode{#3}(\py@varvars{#4})}\index{#3@{\py@idxcode{#3()}}}] - \ifx#1\@undefined\else% - \emph{Return value: \textbf{#1}.}\\ - \fi -}{\end{fulllineitems}} - -% C variables ------------------------------------------------------------ -% \begin{cvardesc}{type}{name} -\newenvironment{cvardesc}[2]{ - \begin{fulllineitems} - \item[\code{#1 \bfcode{#2}}\index{#2@{\py@idxcode{#2}}}] -}{\end{fulllineitems}} - -% C data types ----------------------------------------------------------- -% \begin{ctypedesc}[index name]{typedef name} -\newenvironment{ctypedesc}[2][\py@badkey]{ - \begin{fulllineitems} - \item[\bfcode{#2}% - \ifx#1\@undefined% - \index{#2@{\py@idxcode{#2}} (C type)} - \else% - \index{#2@{\py@idxcode{#1}} (C type)} - \fi] -}{\end{fulllineitems}} - -% Funky macros ----------------------------------------------------------- -% \begin{csimplemacro}{name} -% -- "simple" because it has no args; NOT for constant definitions! -\newenvironment{csimplemacrodesc}[1]{ - \begin{fulllineitems} - \item[\bfcode{#1}\index{#1@{\py@idxcode{#1}} (macro)}] -}{\end{fulllineitems}} - -% simple functions (not methods) ----------------------------------------- -% \begin{funcdesc}{name}{args} -\newcommand{\funcline}[2]{% - \funclineni{#1}{#2}% - \index{#1@{\py@idxcode{#1()}} (in module \py@thismodule)}} -\newenvironment{funcdesc}[2]{ - \begin{fulllineitems} - \funcline{#1}{#2} -}{\end{fulllineitems}} - -% similar to {funcdesc}, but doesn't add to the index -\newcommand{\funclineni}[2]{\item[\code{\bfcode{#1}(\py@varvars{#2})}]} -\newenvironment{funcdescni}[2]{ - \begin{fulllineitems} - \funclineni{#1}{#2} -}{\end{fulllineitems}} - -% classes ---------------------------------------------------------------- -% \begin{classdesc}{name}{constructor args} -\newenvironment{classdesc}[2]{ - % Using \renewcommand doesn't work for this, for unknown reasons: - \global\def\py@thisclass{#1} - \begin{fulllineitems} - \item[\strong{class }\code{\bfcode{#1}(\py@varvars{#2})}% - \index{#1@{\py@idxcode{#1}} (class in \py@thismodule)}] -}{\end{fulllineitems}} - -% \begin{excclassdesc}{name}{constructor args} -% but indexes as an exception -\newenvironment{excclassdesc}[2]{ - % Using \renewcommand doesn't work for this, for unknown reasons: - \global\def\py@thisclass{#1} - \begin{fulllineitems} - \item[\strong{exception }\code{\bfcode{#1}(\py@varvars{#2})}% - \index{#1@{\py@idxcode{#1}} (exception in \py@thismodule)}] -}{\end{fulllineitems}} - - -\let\py@classbadkey=\@undefined - -% object method ---------------------------------------------------------- -% \begin{methoddesc}[classname]{methodname}{args} -\newcommand{\methodline}[3][\@undefined]{ - \methodlineni{#2}{#3} - \ifx#1\@undefined - \index{#2@{\py@idxcode{#2()}} (\py@thisclass\ method)} - \else - \index{#2@{\py@idxcode{#2()}} (#1 method)} - \fi -} -\newenvironment{methoddesc}[3][\@undefined]{ - \begin{fulllineitems} - \ifx#1\@undefined - \methodline{#2}{#3} - \else - \def\py@thisclass{#1} - \methodline{#2}{#3} - \fi -}{\end{fulllineitems}} - -% similar to {methoddesc}, but doesn't add to the index -% (never actually uses the optional argument) -\newcommand{\methodlineni}[3][\py@classbadkey]{% - \item[\code{\bfcode{#2}(\py@varvars{#3})}]} -\newenvironment{methoddescni}[3][\py@classbadkey]{ - \begin{fulllineitems} - \methodlineni{#2}{#3} -}{\end{fulllineitems}} - -% object data attribute -------------------------------------------------- -% \begin{memberdesc}[classname]{membername} -\newcommand{\memberline}[2][\py@classbadkey]{% - \ifx#1\@undefined - \memberlineni{#2} - \index{#2@{\py@idxcode{#2}} (\py@thisclass\ attribute)} - \else - \memberlineni{#2} - \index{#2@{\py@idxcode{#2}} (#1 attribute)} - \fi -} -\newenvironment{memberdesc}[2][\py@classbadkey]{ - \begin{fulllineitems} - \ifx#1\@undefined - \memberline{#2} - \else - \def\py@thisclass{#1} - \memberline{#2} - \fi -}{\end{fulllineitems}} - -% similar to {memberdesc}, but doesn't add to the index -% (never actually uses the optional argument) -\newcommand{\memberlineni}[2][\py@classbadkey]{\item[\bfcode{#2}]} -\newenvironment{memberdescni}[2][\py@classbadkey]{ - \begin{fulllineitems} - \memberlineni{#2} -}{\end{fulllineitems}} - -% For exceptions: -------------------------------------------------------- -% \begin{excdesc}{name} -% -- for constructor information, use excclassdesc instead -\newenvironment{excdesc}[1]{ - \begin{fulllineitems} - \item[\strong{exception }\bfcode{#1}% - \index{#1@{\py@idxcode{#1}} (exception in \py@thismodule)}] -}{\end{fulllineitems}} - -% Module data or constants: ---------------------------------------------- -% \begin{datadesc}{name} -\newcommand{\dataline}[1]{% - \datalineni{#1}\index{#1@{\py@idxcode{#1}} (data in \py@thismodule)}} -\newenvironment{datadesc}[1]{ - \begin{fulllineitems} - \dataline{#1} -}{\end{fulllineitems}} - -% similar to {datadesc}, but doesn't add to the index -\newcommand{\datalineni}[1]{\item[\bfcode{#1}]\nopagebreak} -\newenvironment{datadescni}[1]{ - \begin{fulllineitems} - \datalineni{#1} -}{\end{fulllineitems}} - -% bytecode instruction --------------------------------------------------- -% \begin{opcodedesc}{name}{var} -% -- {var} may be {} -\newenvironment{opcodedesc}[2]{ - \begin{fulllineitems} - \item[\bfcode{#1}\quad\var{#2}] -}{\end{fulllineitems}} - - -\newcommand{\nodename}[1]{\label{#1}} - -% For these commands, use \command{} to get the typography right, not -% {\command}. This works better with the texinfo translation. -\newcommand{\ABC}{{\sc abc}} -\newcommand{\UNIX}{{\sc Unix}} -\newcommand{\POSIX}{POSIX} -\newcommand{\ASCII}{{\sc ascii}} -\newcommand{\Cpp}{C\protect\raisebox{.18ex}{++}} -\newcommand{\C}{C} -\newcommand{\EOF}{{\sc eof}} -\newcommand{\NULL}{\constant{NULL}} - -% Also for consistency: spell Python "Python", not "python"! - -% code is the most difficult one... -\newcommand{\code}[1]{\textrm{\@vobeyspaces\@noligs\def\{{\char`\{}\def\}{\char`\}}\def\~{\char`\~}\def\^{\char`\^}\def\e{\char`\\}\def\${\char`\$}\def\#{\char`\#}\def\&{\char`\&}\def\%{\char`\%}% -\texttt{#1}}} - -\newcommand{\bfcode}[1]{\code{\bfseries#1}} % bold-faced code font -\newcommand{\kbd}[1]{\code{#1}} -\newcommand{\samp}[1]{`\code{#1}'} -% This weird definition of \var{} allows it to always appear in roman -% italics, and won't get funky in code fragments when we play around -% with fonts. This also works directly in math mode. -\newcommand{\var}[1]{% - \ifmmode% - \hbox{\normalsize\textrm{\textit{#1\/}}}% - \else% - \normalsize\textrm{\textit{#1\/}}% - \fi% -} -\renewcommand{\emph}[1]{{\em #1}} -\newcommand{\dfn}[1]{\emph{#1}} -\newcommand{\strong}[1]{{\bf #1}} -% let's experiment with a new font: -\newcommand{\file}[1]{`{\small\textsf{#1}}'} -\newcommand{\filenq}[1]{{\small\textsf{#1}}} - -% Use this def/redef approach for \url{} since hyperref defined this already, -% but only if we actually used hyperref: -\@ifundefined{pdfannotlink}{ - \newcommand{\py@url}[1]{\mbox{\small\textsf{#1}}} -}{ - \newcommand{\py@url}[1]{{% - \pdfannotlink attr{/Border [0 0 0]} user{/S /URI /URI (#1)}% - \py@LinkColor% color of the link text - \mbox{\small\textsf{#1}}% - \py@NormalColor% Turn it back off; these are declarative - \pdfendlink}% and don't appear bound to the current - }% formatting "box". -} -\let\url=\py@url -\newcommand{\email}[1]{{\small\textsf{#1}}} -\newcommand{\newsgroup}[1]{{\small\textsf{#1}}} - -\newcommand{\py@varvars}[1]{{% - {\let\unspecified=\py@unspecified% - \let\moreargs=\py@moreargs% - \var{#1}}}} - -% I'd really like to get rid of this! -\newif\iftexi\texifalse - -% This is used to get l2h to put the copyright and abstract on -% a separate HTML page. -\newif\ifhtml\htmlfalse - - -% These should be used for all references to identifiers which are -% used to refer to instances of specific language constructs. See the -% names for specific semantic assignments. -% -% For now, don't do anything really fancy with them; just use them as -% logical markup. This might change in the future. -% -\newcommand{\module}[1]{\texttt{#1}} -\newcommand{\keyword}[1]{\texttt{#1}} -\newcommand{\exception}[1]{\texttt{#1}} -\newcommand{\class}[1]{\texttt{#1}} -\newcommand{\function}[1]{\texttt{#1}} -\newcommand{\member}[1]{\texttt{#1}} -\newcommand{\method}[1]{\texttt{#1}} - -\newcommand{\pytype}[1]{#1} % built-in Python type - -\newcommand{\cfunction}[1]{\texttt{#1}} -\newcommand{\ctype}[1]{\texttt{#1}} % C struct or typedef name -\newcommand{\cdata}[1]{\texttt{#1}} % C variable, typically global - -\newcommand{\mimetype}[1]{{\small\textsf{#1}}} -% The \! is a "negative thin space" in math mode. -\newcommand{\regexp}[1]{% - {\tiny$^{^\lceil}\!\!$% - {\normalsize\code{#1}}% - $\!\rfloor\!$% - }} -\newcommand{\envvar}[1]{% - #1% - \index{#1@{#1}}% - \index{environment variables!{#1}}% -} -\newcommand{\makevar}[1]{#1} % variable in a Makefile -\newcommand{\character}[1]{\samp{#1}} - -% constants defined in Python modules or C headers, not language constants: -\newcommand{\constant}[1]{\code{#1}} % manifest constant, not syntactic - -\newcommand{\manpage}[2]{{\emph{#1}(#2)}} -\newcommand{\pep}[1]{PEP #1\index{Python Enhancement Proposals!PEP #1}} -\newcommand{\rfc}[1]{RFC #1\index{RFC!RFC #1}} -\newcommand{\program}[1]{\strong{#1}} -\newcommand{\programopt}[1]{\strong{#1}} -% Note that \longprogramopt provides the '--'! -\newcommand{\longprogramopt}[1]{\strong{-{}-#1}} - -% cited titles: \citetitle{Title of Work} -% online: \citetitle[url-to-resource]{Title of Work} -\newcommand{\citetitle}[2][URL]{\emph{#2}} - - -% Deprecation stuff. -% Should be extended to allow an index / list of deprecated stuff. But -% there's a lot of stuff that needs to be done to make that automatable. -% -% First parameter is the release number that deprecates the feature, the -% second is the action the should be taken by users of the feature. -% -% Example: -% \deprecated{1.5.1}{Use \method{frobnicate()} instead.} -% -\newcommand{\deprecated}[2]{% - \strong{Deprecated since release #1.} #2\par} - -% New stuff. -% This should be used to mark things which have been added to the -% development tree but that aren't in the release, but are documented. -% This allows release of documentation that already includes updated -% descriptions. Place at end of descriptor environment. -% -% Example: -% \versionadded{1.5.2} -% \versionchanged[short explanation]{2.0} -% -\newcommand{\versionadded}[1]{% - { New in version #1. }} -\newcommand{\versionchanged}[2][\py@badkey]{% - \ifx#1\@undefined% - { Changed in version #2. }% - \else% - { Changed in version #2:\ #1. }% - \fi% -} - - -% Tables. -% -\newenvironment{tableii}[4]{% - \begin{center}% - \def\lineii##1##2{\csname#2\endcsname{##1}&##2\\}% - \begin{tabular}{#1}\strong{#3}&\strong{#4} \\* \hline% -}{% - \end{tabular}% - \end{center}% -} - -\newenvironment{longtableii}[4]{% - \begin{center}% - \def\lineii##1##2{\csname#2\endcsname{##1}&##2\\}% - \begin{longtable}[c]{#1}\strong{#3}&\strong{#4} \\* \hline\endhead% -}{% - \end{longtable}% - \end{center}% -} - -\newenvironment{tableiii}[5]{% - \begin{center}% - \def\lineiii##1##2##3{\csname#2\endcsname{##1}&##2&##3\\}% - \begin{tabular}{#1}\strong{#3}&\strong{#4}&\strong{#5} \\% - \hline% -}{% - \end{tabular}% - \end{center}% -} - -\newenvironment{longtableiii}[5]{% - \begin{center}% - \def\lineiii##1##2##3{\csname#2\endcsname{##1}&##2&##3\\}% - \begin{longtable}[c]{#1}\strong{#3}&\strong{#4}&\strong{#5} \\% - \hline\endhead% -}{% - \end{longtable}% - \end{center}% -} - -\newenvironment{tableiv}[6]{% - \begin{center}% - \def\lineiv##1##2##3##4{\csname#2\endcsname{##1}&##2&##3&##4\\}% - \begin{tabular}{#1}\strong{#3}&\strong{#4}&\strong{#5}&\strong{#6} \\% - \hline% -}{% - \end{tabular}% - \end{center}% -} - -\newenvironment{longtableiv}[6]{% - \begin{center}% - \def\lineiv##1##2##3##4{\csname#2\endcsname{##1}&##2&##3&##4\\}% - \begin{longtable}[c]{#1}\strong{#3}&\strong{#4}&\strong{#5}&\strong{#6}% - \\% - \hline\endhead% -}{% - \end{longtable}% - \end{center}% -} - -% Cross-referencing (AMK, new impl. FLD) -% Sample usage: -% \begin{seealso} -% \seemodule{rand}{Uniform random number generator.}; % Module xref -% \seetext{\emph{Encyclopedia Britannica}}. % Ref to a book -% -% % A funky case: module name contains '_'; have to supply an optional key -% \seemodule[copyreg]{copy_reg}{Interface constructor registration for -% \module{pickle}.} -% \end{seealso} -% -% Note that the last parameter for \seemodule and \seetext should be complete -% sentences and be terminated with the proper punctuation. - -\@ifundefined{pdfannotlink}{% - \newcommand{\py@seemodule}[3][\py@modulebadkey]{% - \par% - \ifx\py@modulebadkey#1\def\py@modulekey{#2}\else\def\py@modulekey{#1}\fi% - \begin{fulllineitems} - \item[Module \module{#2} (section \ref{module-\py@modulekey}):] - #3 - \end{fulllineitems} - } -}{\newcommand{\py@seemodule}[3][\py@modulebadkey]{% - \par% - \ifx\py@modulebadkey#1\def\py@modulekey{#2}\else\def\py@modulekey{#1}\fi% - \begin{fulllineitems} - \item[\py@linkToName{label-module-\py@modulekey}{Module \module{#2}} - (section \ref{module-\py@modulekey}):] - #3 - \end{fulllineitems} - } -} -% \seetitle[url]{title}{why it's interesting} -\newcommand{\py@seetitle}[3][\py@modulebadkey]{% - \par - \begin{fulllineitems} - \item[\citetitle{#2}] - \ifx\py@modulebadkey#1\else - \item[{\small{(\url{#1})}}] - \fi - #3 - \end{fulllineitems} -} -% \seepep{number}{title}{why it's interesting} -\newcommand{\py@seepep}[3]{% - \par% - \begin{fulllineitems} - \item[\pep{#1}, ``\emph{#2}''] - #3 - \end{fulllineitems} -} -% \seerfc{number}{title}{why it's interesting} -\newcommand{\py@seerfc}[3]{% - \par% - \begin{fulllineitems} - \item[\rfc{#1}, ``\emph{#2}''] - #3 - \end{fulllineitems} -} -% \seeurl{url}{why it's interesting} -\newcommand{\py@seeurl}[2]{% - \par% - \begin{fulllineitems} - \item[\url{#1}] - #2 - \end{fulllineitems} -} -\newenvironment{seealso}[0]{ - \par - \strong{See Also:}\par - \def\seetext##1{\par{##1}} - \let\seemodule=\py@seemodule - \let\seepep=\py@seepep - \let\seerfc=\py@seerfc - \let\seetitle=\py@seetitle - \let\seeurl=\py@seeurl -}{\par} - - -% Allow the Python release number to be specified independently of the -% \date{}. This allows the date to reflect the document's date and -% release to specify the Python release that is documented. -% -\newcommand{\py@release}{} -\newcommand{\version}{} -\newcommand{\shortversion}{} -\newcommand{\releasename}{Release} -\newcommand{\release}[1]{% - \renewcommand{\py@release}{\releasename\space\version}% - \renewcommand{\version}{#1}} -\newcommand{\setshortversion}[1]{% - \renewcommand{\shortversion}{#1}} - -% Allow specification of the author's address separately from the -% author's name. This can be used to format them differently, which -% is a good thing. -% -\newcommand{\py@authoraddress}{} -\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}} -\let\developersaddress=\authoraddress -\let\developer=\author -\let\developers=\author - -% This sets up the fancy chapter headings that make the documents look -% at least a little better than the usual LaTeX output. -% -\@ifundefined{ChTitleVar}{}{ - \ChNameVar{\raggedleft\normalsize\py@HeaderFamily} - \ChNumVar{\raggedleft \bfseries\Large\py@HeaderFamily} - \ChTitleVar{\raggedleft \rm\Huge\py@HeaderFamily} - % This creates chapter heads without the leading \vspace*{}: - \def\@makechapterhead#1{% - {\parindent \z@ \raggedright \normalfont - \ifnum \c@secnumdepth >\m@ne - \DOCH - \fi - \interlinepenalty\@M - \DOTI{#1} - } - } -} - - -% Definition lists; requested by AMK for HOWTO documents. Probably useful -% elsewhere as well, so keep in in the general style support. -% -\newenvironment{definitions}{% - \begin{description}% - \def\term##1{\item[##1]\mbox{}\\*[0mm]} -}{% - \end{description}% -} - -% Tell TeX about pathological hyphenation cases: -\hyphenation{Base-HTTP-Re-quest-Hand-ler} diff --git a/doc/tools/texinputs/reportingbugs.tex b/doc/tools/texinputs/reportingbugs.tex deleted file mode 100644 index c06470a..0000000 --- a/doc/tools/texinputs/reportingbugs.tex +++ /dev/null @@ -1,65 +0,0 @@ -\label{reporting-bugs} - -Python is a mature programming language which has established a -reputation for stability. In order to maintain this reputation, the -developers would like to know of any deficiencies you find in Python -or its documentation. - -All bug reports should be submitted via the Python Bug Tracker on -SourceForge (\url{http://sourceforge.net/bugs/?group_id=5470}). The -bug tracker offers a Web form which allows pertinent information to be -entered and submitted to the developers. - -Before submitting a report, please log into SourceForge if you are a -member; this will make it possible for the developers to contact you -for additional information if needed. If you are not a SourceForge -member but would not mind the developers contacting you, you may -include your email address in your bug description. In this case, -please realize that the information is publically available and cannot -be protected. - -The first step in filing a report is to determine whether the problem -has already been reported. The advantage in doing so, aside from -saving the developers time, is that you learn what has been done to -fix it; it may be that the problem has already been fixed for the next -release, or additional information is needed (in which case you are -welcome to provide it if you can!). To do this, search the bug -database using the search box near the bottom of the page. - -If the problem you're reporting is not already in the bug tracker, go -back to the Python Bug Tracker -(\url{http://sourceforge.net/bugs/?group_id=5470}). Select the -``Submit a Bug'' link at the top of the page to open the bug reporting -form. - -The submission form has a number of fields. The only fields that are -required are the ``Summary'' and ``Details'' fields. For the summary, -enter a \emph{very} short description of the problem; less than ten -words is good. In the Details field, describe the problem in detail, -including what you expected to happen and what did happen. Be sure to -include the version of Python you used, whether any extension modules -were involved, and what hardware and software platform you were using -(including version information as appropriate). - -The only other field that you may want to set is the ``Category'' -field, which allows you to place the bug report into a broad category -(such as ``Documentation'' or ``Library''). - -Each bug report will be assigned to a developer who will determine -what needs to be done to correct the problem. If you have a -SourceForge account and logged in to report the problem, you will -receive an update each time action is taken on the bug. - - -\begin{seealso} - \seetitle[http://www-mice.cs.ucl.ac.uk/multimedia/software/documentation/ReportingBugs.html]{How - to Report Bugs Effectively}{Article which goes into some - detail about how to create a useful bug report. This - describes what kind of information is useful and why it is - useful.} - - \seetitle[http://www.mozilla.org/quality/bug-writing-guidelines.html]{Bug - Writing Guidelines}{Information about writing a good bug - report. Some of this is specific to the Mozilla project, but - describes general good practices.} -\end{seealso} diff --git a/doc/tools/toc2bkm.py b/doc/tools/toc2bkm.py deleted file mode 100755 index 45c7ef8..0000000 --- a/doc/tools/toc2bkm.py +++ /dev/null @@ -1,143 +0,0 @@ -#! /usr/bin/env python - -"""Convert a LaTeX .toc file to some PDFTeX magic to create that neat outline. - -The output file has an extension of '.bkm' instead of '.out', since hyperref -already uses that extension. -""" - -import getopt -import os -import re -import string -import sys - - -# Ench item in an entry is a tuple of: -# -# Section #, Title String, Page #, List of Sub-entries -# -# The return value of parse_toc() is such a tuple. - -cline_re = r"""^ -\\contentsline\ \{([a-z]*)} # type of section in $1 -\{(?:\\numberline\ \{([0-9.A-Z]+)})? # section number -(.*)} # title string -\{(\d+)}$""" # page number - -cline_rx = re.compile(cline_re, re.VERBOSE) - -OUTER_TO_INNER = -1 - -_transition_map = { - ('chapter', 'section'): OUTER_TO_INNER, - ('section', 'subsection'): OUTER_TO_INNER, - ('subsection', 'subsubsection'): OUTER_TO_INNER, - ('subsubsection', 'subsection'): 1, - ('subsection', 'section'): 1, - ('section', 'chapter'): 1, - ('subsection', 'chapter'): 2, - ('subsubsection', 'section'): 2, - ('subsubsection', 'chapter'): 3, - } - -INCLUDED_LEVELS = ("chapter", "section", "subsection", "subsubsection") - - -def parse_toc(fp, bigpart=None): - toc = top = [] - stack = [toc] - level = bigpart or 'chapter' - lineno = 0 - while 1: - line = fp.readline() - if not line: - break - lineno = lineno + 1 - m = cline_rx.match(line) - if m: - stype, snum, title, pageno = m.group(1, 2, 3, 4) - title = clean_title(title) - entry = (stype, snum, title, string.atoi(pageno), []) - if stype == level: - toc.append(entry) - else: - if stype not in INCLUDED_LEVELS: - # we don't want paragraphs & subparagraphs - continue - direction = _transition_map[(level, stype)] - if direction == OUTER_TO_INNER: - toc = toc[-1][-1] - stack.insert(0, toc) - toc.append(entry) - else: - for i in range(direction): - del stack[0] - toc = stack[0] - toc.append(entry) - level = stype - else: - sys.stderr.write("l.%s: " + line) - return top - - -hackscore_rx = re.compile(r"\\hackscore\s*{[^}]*}") -raisebox_rx = re.compile(r"\\raisebox\s*{[^}]*}") -title_rx = re.compile(r"\\([a-zA-Z])+\s+") -title_trans = string.maketrans("", "") - -def clean_title(title): - title = raisebox_rx.sub("", title) - title = hackscore_rx.sub(r"\\_", title) - pos = 0 - while 1: - m = title_rx.search(title, pos) - if m: - start = m.start() - if title[start:start+15] != "\\textunderscore": - title = title[:start] + title[m.end():] - pos = start + 1 - else: - break - title = string.translate(title, title_trans, "{}") - return title - - -def write_toc(toc, fp): - for entry in toc: - write_toc_entry(entry, fp, 0) - -def write_toc_entry(entry, fp, layer): - stype, snum, title, pageno, toc = entry - s = "\\pdfoutline goto name{page%03d}" % pageno - if toc: - s = "%s count -%d" % (s, len(toc)) - if snum: - title = "%s %s" % (snum, title) - s = "%s {%s}\n" % (s, title) - fp.write(s) - for entry in toc: - write_toc_entry(entry, fp, layer + 1) - - -def process(ifn, ofn, bigpart=None): - toc = parse_toc(open(ifn), bigpart) - write_toc(toc, open(ofn, "w")) - - -def main(): - bigpart = None - opts, args = getopt.getopt(sys.argv[1:], "c:") - if opts: - bigpart = opts[0][1] - if not args: - usage() - sys.exit(2) - for filename in args: - base, ext = os.path.splitext(filename) - ext = ext or ".toc" - process(base + ext, base + ".bkm", bigpart) - - -if __name__ == "__main__": - main() diff --git a/doc/tools/update-docs.sh b/doc/tools/update-docs.sh deleted file mode 100755 index 79652ac..0000000 --- a/doc/tools/update-docs.sh +++ /dev/null @@ -1,21 +0,0 @@ -#! /bin/sh - -# Script which installs a development snapshot of the documentation -# into the "Python @ SourceForge" website. -# -# The push-docs.sh script pushes this to the SourceForge when needed -# and removes it when done. - -if [ -z "$HOME" ] ; then - HOME=`grep fdrake /etc/passwd | sed 's|^.*:\([^:]*\):[^:]*$|\1|'` - export HOME -fi - -UPDATES="$HOME/tmp/$1" - -cd /home/groups/python/htdocs || exit $? -rm -rf devel-docs || exit $? -mkdir devel-docs || exit $? -cd devel-docs || exit $? -(bzip2 -dc "$UPDATES" | tar xf -) || exit $? -rm "$UPDATES" || exit $? diff --git a/doc/tools/whichlibs b/doc/tools/whichlibs deleted file mode 100755 index 10d44ee..0000000 --- a/doc/tools/whichlibs +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -sed -n 's%^\\input{\(lib[a-zA-Z0-9_]*\)}.*%../lib/\1.tex%p' ../lib/lib.tex diff --git a/leakcheck/crypto.py b/leakcheck/crypto.py index 07b77e5..6a9af92 100644 --- a/leakcheck/crypto.py +++ b/leakcheck/crypto.py @@ -3,16 +3,21 @@ import sys -from OpenSSL.crypto import TYPE_DSA, Error, PKey, X509 +from OpenSSL.crypto import ( + FILETYPE_PEM, TYPE_DSA, Error, PKey, X509, load_privatekey) -class Checker_X509_get_pubkey(object): - """ - Leak checks for L{X509.get_pubkey}. - """ + + +class BaseChecker(object): def __init__(self, iterations): self.iterations = iterations + +class Checker_X509_get_pubkey(BaseChecker): + """ + Leak checks for L{X509.get_pubkey}. + """ def check_exception(self): """ Call the method repeatedly such that it will raise an exception. @@ -40,6 +45,62 @@ class Checker_X509_get_pubkey(object): cert.get_pubkey() + +class Checker_load_privatekey(BaseChecker): + """ + Leak checks for :py:obj:`load_privatekey`. + """ + ENCRYPTED_PEM = """\ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: BF-CBC,3763C340F9B5A1D0 + +a/DO10mLjHLCAOG8/Hc5Lbuh3pfjvcTZiCexShP+tupkp0VxW2YbZjML8uoXrpA6 +fSPUo7cEC+r96GjV03ZIVhjmsxxesdWMpfkzXRpG8rUbWEW2KcCJWdSX8bEkuNW3 +uvAXdXZwiOrm56ANDo/48gj27GcLwnlA8ld39+ylAzkUJ1tcMVzzTjfcyd6BMFpR +Yjg23ikseug6iWEsZQormdl0ITdYzmFpM+YYsG7kmmmi4UjCEYfb9zFaqJn+WZT2 +qXxmo2ZPFzmEVkuB46mf5GCqMwLRN2QTbIZX2+Dljj1Hfo5erf5jROewE/yzcTwO +FCB5K3c2kkTv2KjcCAimjxkE+SBKfHg35W0wB0AWkXpVFO5W/TbHg4tqtkpt/KMn +/MPnSxvYr/vEqYMfW4Y83c45iqK0Cyr2pwY60lcn8Kk= +-----END RSA PRIVATE KEY----- +""" + def check_load_privatekey_callback(self): + """ + Call the function with an encrypted PEM and a passphrase callback. + """ + for i in xrange(self.iterations * 10): + load_privatekey( + FILETYPE_PEM, self.ENCRYPTED_PEM, lambda *args: "hello, secret") + + + def check_load_privatekey_callback_incorrect(self): + """ + Call the function with an encrypted PEM and a passphrase callback which + returns the wrong passphrase. + """ + for i in xrange(self.iterations * 10): + try: + load_privatekey( + FILETYPE_PEM, self.ENCRYPTED_PEM, + lambda *args: "hello, public") + except Error: + pass + + + def check_load_privatekey_callback_wrong_type(self): + """ + Call the function with an encrypted PEM and a passphrase callback which + returns a non-string. + """ + for i in xrange(self.iterations * 10): + try: + load_privatekey( + FILETYPE_PEM, self.ENCRYPTED_PEM, + lambda *args: {}) + except ValueError: + pass + + def vmsize(): return [x for x in file('/proc/self/status').readlines() if 'VmSize' in x] @@ -4,7 +4,7 @@ force_manifest=1 # bdist_rpm settings contributed by Mihai Ibanescu <misa@redhat.com> [bdist_rpm] release = 1 -build-requires = lynx openssl-devel python-devel perl tetex-dvips tetex-latex +build-requires = lynx openssl-devel python-devel python-sphinx group = Development/Libraries build_script = rpm/build_script -doc-files = doc/pyOpenSSL.txt doc/pyOpenSSL.ps doc/html +doc-files = doc/_build/html @@ -15,7 +15,7 @@ from distutils.errors import DistutilsFileError from distutils.command.build_ext import build_ext # XXX Deduplicate this -__version__ = '0.12' +__version__ = '0.13' crypto_src = ['OpenSSL/crypto/crypto.c', 'OpenSSL/crypto/x509.c', 'OpenSSL/crypto/x509name.c', 'OpenSSL/crypto/pkey.c', @@ -34,9 +34,9 @@ crypto_dep = ['OpenSSL/crypto/crypto.h', 'OpenSSL/crypto/x509.h', rand_src = ['OpenSSL/rand/rand.c', 'OpenSSL/util.c'] rand_dep = ['OpenSSL/util.h'] ssl_src = ['OpenSSL/ssl/connection.c', 'OpenSSL/ssl/context.c', 'OpenSSL/ssl/ssl.c', - 'OpenSSL/util.c'] + 'OpenSSL/ssl/session.c', 'OpenSSL/util.c'] ssl_dep = ['OpenSSL/ssl/connection.h', 'OpenSSL/ssl/context.h', 'OpenSSL/ssl/ssl.h', - 'OpenSSL/util.h'] + 'OpenSSL/ssl/session.h', 'OpenSSL/util.h'] IncludeDirs = None LibraryDirs = None @@ -218,5 +218,23 @@ High-level wrapper around a subset of the OpenSSL library, includes sockets * Callbacks written in Python * Extensive error-handling mechanism, mirroring OpenSSL's error codes -... and much more ;)""" - ) +... and much more ;)""", + classifiers = [ + 'Development Status :: 6 - Mature', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: MacOS :: MacOS X', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX', + 'Programming Language :: C', + 'Programming Language :: Python :: 2.4', + 'Programming Language :: Python :: 2.5', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy', + 'Topic :: Security :: Cryptography', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: System :: Networking', + ]) |