From python-checkins at python.org Thu Dec 1 02:18:08 2005 From: python-checkins at python.org (phillip.eby) Date: Thu, 1 Dec 2005 02:18:08 +0100 (CET) Subject: [Python-checkins] commit of r41572 - sandbox/trunk/setuptools Message-ID: <20051201011808.AA11E1E4002@bag.python.org> Author: phillip.eby Date: Thu Dec 1 02:18:03 2005 New Revision: 41572 Modified: sandbox/trunk/setuptools/pkg_resources.txt sandbox/trunk/setuptools/setuptools.txt Log: Misc. doc enhancements Modified: sandbox/trunk/setuptools/pkg_resources.txt ============================================================================== --- sandbox/trunk/setuptools/pkg_resources.txt (original) +++ sandbox/trunk/setuptools/pkg_resources.txt Thu Dec 1 02:18:03 2005 @@ -136,7 +136,7 @@ corresponding package in all distributions on ``sys.path`` that contain a package of that name. (More precisely, if an importer's ``find_module(name)`` returns a loader, then it will also be searched for - the package's contents.) Whenever a Distribution's ``to_install()`` method + the package's contents.) Whenever a Distribution's ``activate()`` method is invoked, it checks for the presence of namespace packages and updates their ``__path__`` contents accordingly. @@ -209,7 +209,7 @@ For the syntax of requirement specifiers, see the section below on `Requirements Parsing`_. - Note: in general, it should not be necessary for you to call this method + In general, it should not be necessary for you to call this method directly. It's intended more for use in quick-and-dirty scripting and interactive interpreter hacking than for production use. If you're creating an actual library or application, it's strongly recommended that you create @@ -217,6 +217,16 @@ there. That way, tools like EasyInstall can automatically detect what requirements your package has, and deal with them accordingly. + Note that calling ``require('SomePackage')`` will not install + ``SomePackage`` if it isn't already present. If you need to do this, you + should use the ``resolve()`` method instead, which allows you to pass an + ``installer`` callback that will be invoked when a needed distribution + can't be found on the local machine. You can then have this callback + display a dialog, automatically download the needed distribution, or + whatever else is appropriate for your application. See the documentation + below on the ``resolve()`` method for more information, and also on the + ``obtain()`` method of ``Environment`` objects. + ``run_script(requires, script_name)`` Locate distribution specified by `requires` and run its `script_name` script. `requires` must be a string containing a requirement specifier. Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Thu Dec 1 02:18:03 2005 @@ -197,8 +197,8 @@ numerically, so releases ``2.1`` and ``2.1.0`` are different ways to spell the same release number, denoting the first subrelease of release 2. But ``2.10`` is the *tenth* subrelease of release 2, and so is a different and newer release -from ``2.1`` or ``2.1.0``. Leading zeros are also ignored, so ``2.01`` is the -same as ``2.1``. +from ``2.1`` or ``2.1.0``. Leading zeros within a series of digits are also +ignored, so ``2.01`` is the same as ``2.1``, and different from ``2.0.1``. Following a release number, you can have either a pre-release or post-release tag. Pre-release tags make a version be considered *older* than the version @@ -1349,11 +1349,12 @@ as described in this section, it's a good idea to run ``setup.py develop`` after each Subversion checkin or update, because your project's version number will be changing, and your script wrappers need to be updated accordingly. + Also, if the project's requirements have changed, the ``develop`` command will take care of fetching the updated dependencies, building changed extensions, -etc. You should also inform your users of the need to run this command, if -they are working from a Subversion checkout, rather than using EasyInstall to -periodically fetch the latest version. +etc. Be sure to also remind any of your users who check out your project +from Subversion that they need to run ``setup.py develop`` after every update +in order to keep their checkout completely in sync. Distributing Extensions compiled with Pyrex From python-checkins at python.org Thu Dec 1 02:45:43 2005 From: python-checkins at python.org (phillip.eby) Date: Thu, 1 Dec 2005 02:45:43 +0100 (CET) Subject: [Python-checkins] commit of r41573 - in sandbox/trunk/setuptools: . setuptools/command Message-ID: <20051201014543.4DC271E4019@bag.python.org> Author: phillip.eby Date: Thu Dec 1 02:45:39 2005 New Revision: 41573 Modified: sandbox/trunk/setuptools/setuptools.txt sandbox/trunk/setuptools/setuptools/command/develop.py sandbox/trunk/setuptools/setuptools/command/easy_install.py Log: Made all commands that use ``easy_install`` respect its configuration options, as this was causing some problems with ``setup.py install`` ignoring global site-dirs settings. Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Thu Dec 1 02:45:39 2005 @@ -2174,6 +2174,9 @@ requiring ``nose`` to run unit tests can make this dependency optional unless the ``test`` command is run. + * Made all commands that use ``easy_install`` respect its configuration + options, as this was causing some problems with ``setup.py install``. + 0.6a8 * Fixed some problems building extensions when Pyrex was installed, especially with Python 2.4 and/or packages using SWIG. Modified: sandbox/trunk/setuptools/setuptools/command/develop.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/develop.py (original) +++ sandbox/trunk/setuptools/setuptools/command/develop.py Thu Dec 1 02:45:39 2005 @@ -28,10 +28,10 @@ self.uninstall = None easy_install.initialize_options(self) - # Pull in any easy_install configuration options - self.distribution._set_command_options( - self, self.distribution.get_option_dict('easy_install') - ) + + + + Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Thu Dec 1 02:45:39 2005 @@ -100,6 +100,17 @@ self.site_dirs = None self.installed_projects = {} + # Always read easy_install options, even if we are subclassed, or have + # an independent instance created. This ensures that defaults will + # always come from the standard configuration file(s)' "easy_install" + # section, even if this is a "develop" or "install" command, or some + # other embedding. + self._dry_run = None + self.verbose = self.distribution.verbose + self.distribution._set_command_options( + self, self.distribution.get_option_dict('easy_install') + ) + def delete_blockers(self, blockers): for filename in blockers: if os.path.exists(filename) or os.path.islink(filename): @@ -110,17 +121,6 @@ else: os.unlink(filename) - - - - - - - - - - - def finalize_options(self): # If a non-default installation directory was specified, default the # script directory to match it. From python-checkins at python.org Thu Dec 1 03:25:17 2005 From: python-checkins at python.org (anthony.baxter) Date: Thu, 1 Dec 2005 03:25:17 +0100 (CET) Subject: [Python-checkins] commit of r41574 - python/trunk/Doc/whatsnew Message-ID: <20051201022517.628661E400B@bag.python.org> Author: anthony.baxter Date: Thu Dec 1 03:25:11 2005 New Revision: 41574 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: set expectations appropriately. ;) Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Thu Dec 1 03:25:11 2005 @@ -13,7 +13,7 @@ \tableofcontents This article explains the new features in Python 2.5. No release date -for Python 2.5 has been set; it will probably be released in late 2005. +for Python 2.5 has been set; it will probably be released in early 2006. % Compare with previous release in 2 - 3 sentences here. From python-checkins at python.org Thu Dec 1 07:25:47 2005 From: python-checkins at python.org (neal.norwitz) Date: Thu, 1 Dec 2005 07:25:47 +0100 (CET) Subject: [Python-checkins] commit of r41575 - in python/branches/ast-objects: Include Python Message-ID: <20051201062547.3B6B81E4002@bag.python.org> Author: neal.norwitz Date: Thu Dec 1 07:25:42 2005 New Revision: 41575 Modified: python/branches/ast-objects/Include/ast.h python/branches/ast-objects/Include/compile.h python/branches/ast-objects/Include/pythonrun.h python/branches/ast-objects/Include/symtable.h python/branches/ast-objects/Python/future.c python/branches/ast-objects/Python/import.c python/branches/ast-objects/Python/pythonrun.c python/branches/ast-objects/Python/symtable.c Log: Start using PyObjects (and PyTypeObjects) instead of _mod or mod_ty. gets a few more modules compiling Modified: python/branches/ast-objects/Include/ast.h ============================================================================== --- python/branches/ast-objects/Include/ast.h (original) +++ python/branches/ast-objects/Include/ast.h Thu Dec 1 07:25:42 2005 @@ -4,7 +4,7 @@ extern "C" { #endif -PyAPI_FUNC(mod_ty) PyAST_FromNode(const node *, PyCompilerFlags *flags, +PyAPI_FUNC(PyTypeObject*) PyAST_FromNode(const node *, PyCompilerFlags *flags, const char *); #ifdef __cplusplus Modified: python/branches/ast-objects/Include/compile.h ============================================================================== --- python/branches/ast-objects/Include/compile.h (original) +++ python/branches/ast-objects/Include/compile.h Thu Dec 1 07:25:42 2005 @@ -23,10 +23,9 @@ #define FUTURE_GENERATORS "generators" #define FUTURE_DIVISION "division" -struct _mod; /* Declare the existence of this type */ -PyAPI_FUNC(PyCodeObject *) PyAST_Compile(struct _mod *, const char *, +PyAPI_FUNC(PyCodeObject *) PyAST_Compile(PyTypeObject *, const char *, PyCompilerFlags *); -PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(PyTypeObject *, const char *); #define ERR_LATE_FUTURE \ "from __future__ imports must occur at the beginning of the file" Modified: python/branches/ast-objects/Include/pythonrun.h ============================================================================== --- python/branches/ast-objects/Include/pythonrun.h (original) +++ python/branches/ast-objects/Include/pythonrun.h Thu Dec 1 07:25:42 2005 @@ -36,9 +36,9 @@ PyAPI_FUNC(int) PyRun_InteractiveOneFlags(FILE *, const char *, PyCompilerFlags *); PyAPI_FUNC(int) PyRun_InteractiveLoopFlags(FILE *, const char *, PyCompilerFlags *); -PyAPI_FUNC(struct _mod *) PyParser_ASTFromString(const char *, const char *, +PyAPI_FUNC(PyTypeObject *) PyParser_ASTFromString(const char *, const char *, int, PyCompilerFlags *flags); -PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile(FILE *, const char *, int, +PyAPI_FUNC(PyTypeObject *) PyParser_ASTFromFile(FILE *, const char *, int, char *, char *, PyCompilerFlags *, int *); #define PyParser_SimpleParseString(S, B) \ Modified: python/branches/ast-objects/Include/symtable.h ============================================================================== --- python/branches/ast-objects/Include/symtable.h (original) +++ python/branches/ast-objects/Include/symtable.h Thu Dec 1 07:25:42 2005 @@ -49,10 +49,10 @@ #define PySTEntry_Check(op) ((op)->ob_type == &PySTEntry_Type) PyAPI_FUNC(PySTEntryObject *) \ - PySTEntry_New(struct symtable *, identifier, _Py_block_ty, void *, int); + PySTEntry_New(struct symtable *, PyObject *name, _Py_block_ty, void *, int); PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); -PyAPI_FUNC(struct symtable *) PySymtable_Build(mod_ty, const char *, +PyAPI_FUNC(struct symtable *) PySymtable_Build(PyTypeObject *, const char *, PyFutureFeatures *); PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); Modified: python/branches/ast-objects/Python/future.c ============================================================================== --- python/branches/ast-objects/Python/future.c (original) +++ python/branches/ast-objects/Python/future.c Thu Dec 1 07:25:42 2005 @@ -47,7 +47,7 @@ } static int -future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename) +future_parse(PyFutureFeatures *ff, PyTypeObject *mod, const char *filename) { int i, found_docstring = 0, done = 0, prev_line = 0; @@ -114,7 +114,7 @@ PyFutureFeatures * -PyFuture_FromAST(mod_ty mod, const char *filename) +PyFuture_FromAST(PyTypeObject *mod, const char *filename) { PyFutureFeatures *ff; Modified: python/branches/ast-objects/Python/import.c ============================================================================== --- python/branches/ast-objects/Python/import.c (original) +++ python/branches/ast-objects/Python/import.c Thu Dec 1 07:25:42 2005 @@ -772,13 +772,13 @@ parse_source_module(const char *pathname, FILE *fp) { PyCodeObject *co = NULL; - mod_ty mod; + PyTypeObject *mod; mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, 0, NULL); if (mod) { co = PyAST_Compile(mod, pathname, NULL); - free_mod(mod); + Py_DECREF(mod); } return co; } Modified: python/branches/ast-objects/Python/pythonrun.c ============================================================================== --- python/branches/ast-objects/Python/pythonrun.c (original) +++ python/branches/ast-objects/Python/pythonrun.c Thu Dec 1 07:25:42 2005 @@ -35,9 +35,9 @@ /* Forward */ static void initmain(void); static void initsite(void); -static PyObject *run_err_mod(mod_ty, const char *, PyObject *, PyObject *, +static PyObject *run_err_mod(PyTypeObject*, const char *, PyObject *, PyObject *, PyCompilerFlags *); -static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *, +static PyObject *run_mod(PyTypeObject*, const char *, PyObject *, PyObject *, PyCompilerFlags *); static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, PyCompilerFlags *); @@ -696,7 +696,7 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) { PyObject *m, *d, *v, *w; - mod_ty mod; + PyTypeObject *mod; char *ps1 = "", *ps2 = ""; int errcode = 0; @@ -734,7 +734,7 @@ return -1; d = PyModule_GetDict(m); v = run_mod(mod, filename, d, d, flags); - free_mod(mod); + Py_DECREF(mod); if (v == NULL) { PyErr_Print(); return -1; @@ -1155,9 +1155,9 @@ PyObject *locals, PyCompilerFlags *flags) { PyObject *ret; - mod_ty mod = PyParser_ASTFromString(str, "", start, flags); + PyTypeObject *mod = PyParser_ASTFromString(str, "", start, flags); ret = run_err_mod(mod, "", globals, locals, flags); - free_mod(mod); + Py_DECREF(mod); return ret; } @@ -1166,19 +1166,19 @@ PyObject *locals, int closeit, PyCompilerFlags *flags) { PyObject *ret; - mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, + PyTypeObject *mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, flags, NULL); if (mod == NULL) return NULL; if (closeit) fclose(fp); ret = run_err_mod(mod, filename, globals, locals, flags); - free_mod(mod); + Py_DECREF(mod); return ret; } static PyObject * -run_err_mod(mod_ty mod, const char *filename, PyObject *globals, +run_err_mod(PyTypeObject *mod, const char *filename, PyObject *globals, PyObject *locals, PyCompilerFlags *flags) { if (mod == NULL) @@ -1187,7 +1187,7 @@ } static PyObject * -run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals, +run_mod(PyTypeObject *mod, const char *filename, PyObject *globals, PyObject *locals, PyCompilerFlags *flags) { PyCodeObject *co; @@ -1236,37 +1236,37 @@ Py_CompileStringFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags) { - mod_ty mod; + PyTypeObject *mod; PyCodeObject *co; mod = PyParser_ASTFromString(str, filename, start, flags); if (mod == NULL) return NULL; co = PyAST_Compile(mod, filename, flags); - free_mod(mod); + Py_DECREF(mod); return (PyObject *)co; } struct symtable * Py_SymtableString(const char *str, const char *filename, int start) { - mod_ty mod; + PyTypeObject *mod; struct symtable *st; mod = PyParser_ASTFromString(str, filename, start, NULL); if (mod == NULL) return NULL; st = PySymtable_Build(mod, filename, 0); - free_mod(mod); + Py_DECREF(mod); return st; } /* Preferred access to parser is through AST. */ -mod_ty +PyTypeObject * PyParser_ASTFromString(const char *s, const char *filename, int start, PyCompilerFlags *flags) { node *n; - mod_ty mod; + PyTypeObject *mod; perrdetail err; n = PyParser_ParseStringFlagsFilename(s, filename, &_PyParser_Grammar, start, &err, @@ -1282,12 +1282,12 @@ } } -mod_ty +PyTypeObject * PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1, char *ps2, PyCompilerFlags *flags, int *errcode) { node *n; - mod_ty mod; + PyTypeObject *mod; perrdetail err; n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, ps1, ps2, &err, PARSER_FLAGS(flags)); Modified: python/branches/ast-objects/Python/symtable.c ============================================================================== --- python/branches/ast-objects/Python/symtable.c (original) +++ python/branches/ast-objects/Python/symtable.c Thu Dec 1 07:25:42 2005 @@ -12,7 +12,7 @@ "name '%.400s' is used prior to global declaration" PySTEntryObject * -PySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block, +PySTEntry_New(struct symtable *st, PyObject *name, _Py_block_ty block, void *key, int lineno) { PySTEntryObject *ste = NULL; @@ -204,7 +204,7 @@ } struct symtable * -PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) +PySymtable_Build(PyTypeObject *mod, const char *filename, PyFutureFeatures *future) { struct symtable *st = symtable_new(); asdl_seq *seq; From python-checkins at python.org Thu Dec 1 07:30:18 2005 From: python-checkins at python.org (neal.norwitz) Date: Thu, 1 Dec 2005 07:30:18 +0100 (CET) Subject: [Python-checkins] commit of r41576 - python/branches/ast-objects/Python Message-ID: <20051201063018.415081E4002@bag.python.org> Author: neal.norwitz Date: Thu Dec 1 07:30:13 2005 New Revision: 41576 Modified: python/branches/ast-objects/Python/ast.c python/branches/ast-objects/Python/compile.c Log: get rid of uses of bool Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Thu Dec 1 07:30:13 2005 @@ -2099,7 +2099,7 @@ */ expr_ty dest = NULL, expression; asdl_seq *seq; - bool nl; + int nl; int i, start = 1; REQ(n, print_stmt); Modified: python/branches/ast-objects/Python/compile.c ============================================================================== --- python/branches/ast-objects/Python/compile.c (original) +++ python/branches/ast-objects/Python/compile.c Thu Dec 1 07:30:13 2005 @@ -125,7 +125,7 @@ int u_firstlineno; /* the first lineno of the block */ int u_lineno; /* the lineno for the current stmt */ - bool u_lineno_set; /* boolean to indicate whether instr + int u_lineno_set; /* boolean to indicate whether instr has been generated with current lineno */ }; @@ -1089,7 +1089,7 @@ u->u_nfblocks = 0; u->u_firstlineno = lineno; u->u_lineno = 0; - u->u_lineno_set = false; + u->u_lineno_set = 0; u->u_consts = PyDict_New(); if (!u->u_consts) { compiler_unit_free(u); @@ -1247,7 +1247,7 @@ basicblock *b; if (c->u->u_lineno_set) return; - c->u->u_lineno_set = true; + c->u->u_lineno_set = 1; b = c->u->u_curblock; b->b_instr[off].i_lineno = c->u->u_lineno; } @@ -2043,14 +2043,14 @@ compiler_print(struct compiler *c, stmt_ty s) { int i, n; - bool dest; + int dest; assert(s->kind == Print_kind); n = asdl_seq_LEN(s->v.Print.values); - dest = false; + dest = 0; if (s->v.Print.dest) { VISIT(c, expr, s->v.Print.dest); - dest = true; + dest = 1; } for (i = 0; i < n; i++) { expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i); @@ -2532,7 +2532,7 @@ int i, n; c->u->u_lineno = s->lineno; - c->u->u_lineno_set = false; + c->u->u_lineno_set = 0; switch (s->kind) { case FunctionDef_kind: return compiler_function(c, s); @@ -3265,7 +3265,7 @@ if (e->lineno > c->u->u_lineno) { c->u->u_lineno = e->lineno; - c->u->u_lineno_set = false; + c->u->u_lineno_set = 0; } switch (e->kind) { case BoolOp_kind: From python-checkins at python.org Thu Dec 1 09:15:35 2005 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 1 Dec 2005 09:15:35 +0100 (CET) Subject: [Python-checkins] commit of r41577 - in python/branches/ast-objects: Include Python Message-ID: <20051201081535.AC1171E4002@bag.python.org> Author: martin.v.loewis Date: Thu Dec 1 09:15:34 2005 New Revision: 41577 Modified: python/branches/ast-objects/Include/ast.h python/branches/ast-objects/Python/ast.c Log: Fix compiler warnings up to line 337. Modified: python/branches/ast-objects/Include/ast.h ============================================================================== --- python/branches/ast-objects/Include/ast.h (original) +++ python/branches/ast-objects/Include/ast.h Thu Dec 1 09:15:34 2005 @@ -4,7 +4,7 @@ extern "C" { #endif -PyAPI_FUNC(PyTypeObject*) PyAST_FromNode(const node *, PyCompilerFlags *flags, +PyAPI_FUNC(PyObject*) PyAST_FromNode(const node *, PyCompilerFlags *flags, const char *); #ifdef __cplusplus Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Thu Dec 1 09:15:34 2005 @@ -67,16 +67,16 @@ char *c_encoding; /* source encoding */ }; -static asdl_seq *seq_for_testlist(struct compiling *, const node *); -static expr_ty ast_for_expr(struct compiling *, const node *); -static stmt_ty ast_for_stmt(struct compiling *, const node *); -static asdl_seq *ast_for_suite(struct compiling *, const node *); -static asdl_seq *ast_for_exprlist(struct compiling *, const node *, int); -static expr_ty ast_for_testlist(struct compiling *, const node *); -static expr_ty ast_for_testlist_gexp(struct compiling *, const node *); +static PyObject *seq_for_testlist(struct compiling *, const node *); +static PyObject *ast_for_expr(struct compiling *, const node *); +static PyObject *ast_for_stmt(struct compiling *, const node *); +static PyObject *ast_for_suite(struct compiling *, const node *); +static PyObject *ast_for_exprlist(struct compiling *, const node *, int); +static PyObject *ast_for_testlist(struct compiling *, const node *); +static PyObject *ast_for_testlist_gexp(struct compiling *, const node *); /* Note different signature for ast_for_call */ -static expr_ty ast_for_call(struct compiling *, const node *, expr_ty); +static PyObject *ast_for_call(struct compiling *, const node *, PyObject*); static PyObject *parsenumber(const char *); static PyObject *parsestr(const char *s, const char *encoding); @@ -90,62 +90,6 @@ #define NEW_IDENTIFIER(n) PyString_InternFromString(STR(n)) -static void -asdl_stmt_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_stmt(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_expr_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_expr(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_alias_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_alias(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_comprehension_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_comprehension(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - /* This routine provides an invalid object for the syntax error. The outermost routine must unpack this error and create the proper object. We do this so that we don't have to pass @@ -266,12 +210,14 @@ /* Transform the CST rooted at node * to the appropriate AST */ -mod_ty +PyObject* PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename) { - int i, j, num; - asdl_seq *stmts = NULL; - stmt_ty s; + PyObject *result = NULL; + int i, j, num, pos; + PyObject *stmts = NULL; + PyObject *s = NULL; + PyObject *testlist_ast = NULL; node *ch; struct compiling c; @@ -286,9 +232,10 @@ switch (TYPE(n)) { case file_input: - stmts = asdl_seq_new(num_stmts(n)); + stmts = PyList_New(num_stmts(n)); + pos = 0; if (!stmts) - return NULL; + goto error; for (i = 0; i < NCH(n) - 1; i++) { ch = CHILD(n, i); if (TYPE(ch) == NEWLINE) @@ -299,7 +246,7 @@ s = ast_for_stmt(&c, ch); if (!s) goto error; - asdl_seq_APPEND(stmts, s); + PyList_SET_ITEM(stmts, pos++, s); } else { ch = CHILD(ch, 0); @@ -308,62 +255,76 @@ s = ast_for_stmt(&c, CHILD(ch, j * 2)); if (!s) goto error; - asdl_seq_APPEND(stmts, s); + PyList_SET_ITEM(stmts, pos++, s); } } } - return Module(stmts); + assert(pos==PyList_GET_SIZE(stmts)); + result = Module(stmts); + goto success; case eval_input: { - expr_ty testlist_ast; - /* XXX Why not gen_for here? */ testlist_ast = ast_for_testlist(&c, CHILD(n, 0)); if (!testlist_ast) goto error; - return Expression(testlist_ast); + result = Expression(testlist_ast); + goto success; } case single_input: if (TYPE(CHILD(n, 0)) == NEWLINE) { - stmts = asdl_seq_new(1); + stmts = PyList_New(1); if (!stmts) goto error; - asdl_seq_SET(stmts, 0, Pass(n->n_lineno)); - return Interactive(stmts); + s = Pass(n->n_lineno); + if (!s) + goto error; + Py_INCREF(s); /* set_item will steal the ref */ + PyList_SET_ITEM(stmts, 0, s); + result = Interactive(stmts); + goto success; } else { n = CHILD(n, 0); num = num_stmts(n); - stmts = asdl_seq_new(num); + stmts = PyList_New(num); if (!stmts) goto error; if (num == 1) { - stmt_ty s = ast_for_stmt(&c, n); + s = ast_for_stmt(&c, n); if (!s) goto error; - asdl_seq_SET(stmts, 0, s); + Py_INCREF(s); + PyList_SET_ITEM(stmts, 0, s); } else { /* Only a simple_stmt can contain multiple statements. */ REQ(n, simple_stmt); for (i = 0; i < NCH(n); i += 2) { - stmt_ty s; if (TYPE(CHILD(n, i)) == NEWLINE) break; s = ast_for_stmt(&c, CHILD(n, i)); if (!s) goto error; - asdl_seq_SET(stmts, i / 2, s); + Py_INCREF(s); + PyList_SET_ITEM(stmts, i / 2, s); } } - return Interactive(stmts); + result = Interactive(stmts); + goto success; } default: goto error; } - error: - if (stmts) - asdl_stmt_seq_free(stmts); + success: + Py_XDECREF(stmts); + Py_XDECREF(s); + Py_XDECREF(testlist_ast); + return result; + error: + Py_XDECREF(stmts); + Py_XDECREF(s); + Py_XDECREF(testlist_ast); ast_error_finish(filename); return NULL; } @@ -574,12 +535,13 @@ return 0; } -static asdl_seq * +static PyObject * seq_for_testlist(struct compiling *c, const node *n) { /* testlist: test (',' test)* [','] */ - asdl_seq *seq; - expr_ty expression; + PyObject *result = NULL; + PyObject *seq = NULL; + PyObject *expression; int i; assert(TYPE(n) == testlist || TYPE(n) == listmaker @@ -587,7 +549,7 @@ || TYPE(n) == testlist_safe ); - seq = asdl_seq_new((NCH(n) + 1) / 2); + seq = PyList_New((NCH(n) + 1) / 2); if (!seq) return NULL; @@ -596,14 +558,18 @@ expression = ast_for_expr(c, CHILD(n, i)); if (!expression) { - asdl_expr_seq_free(seq); - return NULL; + goto error; } assert(i / 2 < seq->size); - asdl_seq_SET(seq, i / 2, expression); + PyList_SET_ITEM(seq, i / 2, expression); } - return seq; + result = seq; + Py_INCREF(result); + /* fall through */ + error: + Py_XDECREF(seq); + return result; } static expr_ty From python-checkins at python.org Fri Dec 2 08:29:36 2005 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 2 Dec 2005 08:29:36 +0100 (CET) Subject: [Python-checkins] commit of r41577 - in python/branches/ast-objects: Include/ast.h Python/ast.c Message-ID: <20051202072936.74E711E4009@bag.python.org> Author: martin.v.loewis Date: Thu Dec 1 09:15:34 2005 New Revision: 41577 Modified: python/branches/ast-objects/Include/ast.h python/branches/ast-objects/Python/ast.c Log: Fix compiler warnings up to line 337. Modified: python/branches/ast-objects/Include/ast.h ============================================================================== --- python/branches/ast-objects/Include/ast.h (original) +++ python/branches/ast-objects/Include/ast.h Thu Dec 1 09:15:34 2005 @@ -4,7 +4,7 @@ extern "C" { #endif -PyAPI_FUNC(PyTypeObject*) PyAST_FromNode(const node *, PyCompilerFlags *flags, +PyAPI_FUNC(PyObject*) PyAST_FromNode(const node *, PyCompilerFlags *flags, const char *); #ifdef __cplusplus Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Thu Dec 1 09:15:34 2005 @@ -67,16 +67,16 @@ char *c_encoding; /* source encoding */ }; -static asdl_seq *seq_for_testlist(struct compiling *, const node *); -static expr_ty ast_for_expr(struct compiling *, const node *); -static stmt_ty ast_for_stmt(struct compiling *, const node *); -static asdl_seq *ast_for_suite(struct compiling *, const node *); -static asdl_seq *ast_for_exprlist(struct compiling *, const node *, int); -static expr_ty ast_for_testlist(struct compiling *, const node *); -static expr_ty ast_for_testlist_gexp(struct compiling *, const node *); +static PyObject *seq_for_testlist(struct compiling *, const node *); +static PyObject *ast_for_expr(struct compiling *, const node *); +static PyObject *ast_for_stmt(struct compiling *, const node *); +static PyObject *ast_for_suite(struct compiling *, const node *); +static PyObject *ast_for_exprlist(struct compiling *, const node *, int); +static PyObject *ast_for_testlist(struct compiling *, const node *); +static PyObject *ast_for_testlist_gexp(struct compiling *, const node *); /* Note different signature for ast_for_call */ -static expr_ty ast_for_call(struct compiling *, const node *, expr_ty); +static PyObject *ast_for_call(struct compiling *, const node *, PyObject*); static PyObject *parsenumber(const char *); static PyObject *parsestr(const char *s, const char *encoding); @@ -90,62 +90,6 @@ #define NEW_IDENTIFIER(n) PyString_InternFromString(STR(n)) -static void -asdl_stmt_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_stmt(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_expr_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_expr(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_alias_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_alias(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_comprehension_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_comprehension(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - /* This routine provides an invalid object for the syntax error. The outermost routine must unpack this error and create the proper object. We do this so that we don't have to pass @@ -266,12 +210,14 @@ /* Transform the CST rooted at node * to the appropriate AST */ -mod_ty +PyObject* PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename) { - int i, j, num; - asdl_seq *stmts = NULL; - stmt_ty s; + PyObject *result = NULL; + int i, j, num, pos; + PyObject *stmts = NULL; + PyObject *s = NULL; + PyObject *testlist_ast = NULL; node *ch; struct compiling c; @@ -286,9 +232,10 @@ switch (TYPE(n)) { case file_input: - stmts = asdl_seq_new(num_stmts(n)); + stmts = PyList_New(num_stmts(n)); + pos = 0; if (!stmts) - return NULL; + goto error; for (i = 0; i < NCH(n) - 1; i++) { ch = CHILD(n, i); if (TYPE(ch) == NEWLINE) @@ -299,7 +246,7 @@ s = ast_for_stmt(&c, ch); if (!s) goto error; - asdl_seq_APPEND(stmts, s); + PyList_SET_ITEM(stmts, pos++, s); } else { ch = CHILD(ch, 0); @@ -308,62 +255,76 @@ s = ast_for_stmt(&c, CHILD(ch, j * 2)); if (!s) goto error; - asdl_seq_APPEND(stmts, s); + PyList_SET_ITEM(stmts, pos++, s); } } } - return Module(stmts); + assert(pos==PyList_GET_SIZE(stmts)); + result = Module(stmts); + goto success; case eval_input: { - expr_ty testlist_ast; - /* XXX Why not gen_for here? */ testlist_ast = ast_for_testlist(&c, CHILD(n, 0)); if (!testlist_ast) goto error; - return Expression(testlist_ast); + result = Expression(testlist_ast); + goto success; } case single_input: if (TYPE(CHILD(n, 0)) == NEWLINE) { - stmts = asdl_seq_new(1); + stmts = PyList_New(1); if (!stmts) goto error; - asdl_seq_SET(stmts, 0, Pass(n->n_lineno)); - return Interactive(stmts); + s = Pass(n->n_lineno); + if (!s) + goto error; + Py_INCREF(s); /* set_item will steal the ref */ + PyList_SET_ITEM(stmts, 0, s); + result = Interactive(stmts); + goto success; } else { n = CHILD(n, 0); num = num_stmts(n); - stmts = asdl_seq_new(num); + stmts = PyList_New(num); if (!stmts) goto error; if (num == 1) { - stmt_ty s = ast_for_stmt(&c, n); + s = ast_for_stmt(&c, n); if (!s) goto error; - asdl_seq_SET(stmts, 0, s); + Py_INCREF(s); + PyList_SET_ITEM(stmts, 0, s); } else { /* Only a simple_stmt can contain multiple statements. */ REQ(n, simple_stmt); for (i = 0; i < NCH(n); i += 2) { - stmt_ty s; if (TYPE(CHILD(n, i)) == NEWLINE) break; s = ast_for_stmt(&c, CHILD(n, i)); if (!s) goto error; - asdl_seq_SET(stmts, i / 2, s); + Py_INCREF(s); + PyList_SET_ITEM(stmts, i / 2, s); } } - return Interactive(stmts); + result = Interactive(stmts); + goto success; } default: goto error; } - error: - if (stmts) - asdl_stmt_seq_free(stmts); + success: + Py_XDECREF(stmts); + Py_XDECREF(s); + Py_XDECREF(testlist_ast); + return result; + error: + Py_XDECREF(stmts); + Py_XDECREF(s); + Py_XDECREF(testlist_ast); ast_error_finish(filename); return NULL; } @@ -574,12 +535,13 @@ return 0; } -static asdl_seq * +static PyObject * seq_for_testlist(struct compiling *c, const node *n) { /* testlist: test (',' test)* [','] */ - asdl_seq *seq; - expr_ty expression; + PyObject *result = NULL; + PyObject *seq = NULL; + PyObject *expression; int i; assert(TYPE(n) == testlist || TYPE(n) == listmaker @@ -587,7 +549,7 @@ || TYPE(n) == testlist_safe ); - seq = asdl_seq_new((NCH(n) + 1) / 2); + seq = PyList_New((NCH(n) + 1) / 2); if (!seq) return NULL; @@ -596,14 +558,18 @@ expression = ast_for_expr(c, CHILD(n, i)); if (!expression) { - asdl_expr_seq_free(seq); - return NULL; + goto error; } assert(i / 2 < seq->size); - asdl_seq_SET(seq, i / 2, expression); + PyList_SET_ITEM(seq, i / 2, expression); } - return seq; + result = seq; + Py_INCREF(result); + /* fall through */ + error: + Py_XDECREF(seq); + return result; } static expr_ty From python-checkins at python.org Fri Dec 2 13:16:17 2005 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 2 Dec 2005 13:16:17 +0100 (CET) Subject: [Python-checkins] commit of r41578 - in python/branches/ast-objects: Include/Python-ast.h Parser/asdl_c.py Python/Python-ast.c Message-ID: <20051202121617.15F701E4007@bag.python.org> Author: martin.v.loewis Date: Fri Dec 2 13:16:10 2005 New Revision: 41578 Modified: python/branches/ast-objects/Include/Python-ast.h python/branches/ast-objects/Parser/asdl_c.py python/branches/ast-objects/Python/Python-ast.c Log: Generate PyAST_validate. Modified: python/branches/ast-objects/Include/Python-ast.h ============================================================================== --- python/branches/ast-objects/Include/Python-ast.h (original) +++ python/branches/ast-objects/Include/Python-ast.h Fri Dec 2 13:16:10 2005 @@ -523,6 +523,69 @@ PyObject *Py_Tuple_New(PyObject*, PyObject*, int); #define Tuple Py_Tuple_New +PyAPI_DATA(PyTypeObject) Py_expr_context_Type; +#define expr_context_Check(op) PyObject_TypeCheck(op, &Py_expr_context_Type) + +struct _expr_context{ + PyObject_HEAD + enum {Load_kind, Store_kind, Del_kind, AugLoad_kind, AugStore_kind, + Param_kind} _kind; +}; + +PyAPI_DATA(PyTypeObject) Py_Load_Type; +#define Load_Check(op) PyObject_TypeCheck(op, &Py_Load_Type) + +struct _Load{ + struct _expr_context _base; +}; +PyObject *Py_Load_New(void); +#define Load Py_Load_New + +PyAPI_DATA(PyTypeObject) Py_Store_Type; +#define Store_Check(op) PyObject_TypeCheck(op, &Py_Store_Type) + +struct _Store{ + struct _expr_context _base; +}; +PyObject *Py_Store_New(void); +#define Store Py_Store_New + +PyAPI_DATA(PyTypeObject) Py_Del_Type; +#define Del_Check(op) PyObject_TypeCheck(op, &Py_Del_Type) + +struct _Del{ + struct _expr_context _base; +}; +PyObject *Py_Del_New(void); +#define Del Py_Del_New + +PyAPI_DATA(PyTypeObject) Py_AugLoad_Type; +#define AugLoad_Check(op) PyObject_TypeCheck(op, &Py_AugLoad_Type) + +struct _AugLoad{ + struct _expr_context _base; +}; +PyObject *Py_AugLoad_New(void); +#define AugLoad Py_AugLoad_New + +PyAPI_DATA(PyTypeObject) Py_AugStore_Type; +#define AugStore_Check(op) PyObject_TypeCheck(op, &Py_AugStore_Type) + +struct _AugStore{ + struct _expr_context _base; +}; +PyObject *Py_AugStore_New(void); +#define AugStore Py_AugStore_New + +PyAPI_DATA(PyTypeObject) Py_Param_Type; +#define Param_Check(op) PyObject_TypeCheck(op, &Py_Param_Type) + +struct _Param{ + struct _expr_context _base; +}; +PyObject *Py_Param_New(void); +#define Param Py_Param_New + PyAPI_DATA(PyTypeObject) Py_slice_Type; #define slice_Check(op) PyObject_TypeCheck(op, &Py_slice_Type) @@ -572,6 +635,293 @@ PyObject *Py_Index_New(PyObject*); #define Index Py_Index_New +PyAPI_DATA(PyTypeObject) Py_boolop_Type; +#define boolop_Check(op) PyObject_TypeCheck(op, &Py_boolop_Type) + +struct _boolop{ + PyObject_HEAD + enum {And_kind, Or_kind} _kind; +}; + +PyAPI_DATA(PyTypeObject) Py_And_Type; +#define And_Check(op) PyObject_TypeCheck(op, &Py_And_Type) + +struct _And{ + struct _boolop _base; +}; +PyObject *Py_And_New(void); +#define And Py_And_New + +PyAPI_DATA(PyTypeObject) Py_Or_Type; +#define Or_Check(op) PyObject_TypeCheck(op, &Py_Or_Type) + +struct _Or{ + struct _boolop _base; +}; +PyObject *Py_Or_New(void); +#define Or Py_Or_New + +PyAPI_DATA(PyTypeObject) Py_operator_Type; +#define operator_Check(op) PyObject_TypeCheck(op, &Py_operator_Type) + +struct _operator{ + PyObject_HEAD + enum {Add_kind, Sub_kind, Mult_kind, Div_kind, Mod_kind, Pow_kind, + LShift_kind, RShift_kind, BitOr_kind, BitXor_kind, BitAnd_kind, + FloorDiv_kind} _kind; +}; + +PyAPI_DATA(PyTypeObject) Py_Add_Type; +#define Add_Check(op) PyObject_TypeCheck(op, &Py_Add_Type) + +struct _Add{ + struct _operator _base; +}; +PyObject *Py_Add_New(void); +#define Add Py_Add_New + +PyAPI_DATA(PyTypeObject) Py_Sub_Type; +#define Sub_Check(op) PyObject_TypeCheck(op, &Py_Sub_Type) + +struct _Sub{ + struct _operator _base; +}; +PyObject *Py_Sub_New(void); +#define Sub Py_Sub_New + +PyAPI_DATA(PyTypeObject) Py_Mult_Type; +#define Mult_Check(op) PyObject_TypeCheck(op, &Py_Mult_Type) + +struct _Mult{ + struct _operator _base; +}; +PyObject *Py_Mult_New(void); +#define Mult Py_Mult_New + +PyAPI_DATA(PyTypeObject) Py_Div_Type; +#define Div_Check(op) PyObject_TypeCheck(op, &Py_Div_Type) + +struct _Div{ + struct _operator _base; +}; +PyObject *Py_Div_New(void); +#define Div Py_Div_New + +PyAPI_DATA(PyTypeObject) Py_Mod_Type; +#define Mod_Check(op) PyObject_TypeCheck(op, &Py_Mod_Type) + +struct _Mod{ + struct _operator _base; +}; +PyObject *Py_Mod_New(void); +#define Mod Py_Mod_New + +PyAPI_DATA(PyTypeObject) Py_Pow_Type; +#define Pow_Check(op) PyObject_TypeCheck(op, &Py_Pow_Type) + +struct _Pow{ + struct _operator _base; +}; +PyObject *Py_Pow_New(void); +#define Pow Py_Pow_New + +PyAPI_DATA(PyTypeObject) Py_LShift_Type; +#define LShift_Check(op) PyObject_TypeCheck(op, &Py_LShift_Type) + +struct _LShift{ + struct _operator _base; +}; +PyObject *Py_LShift_New(void); +#define LShift Py_LShift_New + +PyAPI_DATA(PyTypeObject) Py_RShift_Type; +#define RShift_Check(op) PyObject_TypeCheck(op, &Py_RShift_Type) + +struct _RShift{ + struct _operator _base; +}; +PyObject *Py_RShift_New(void); +#define RShift Py_RShift_New + +PyAPI_DATA(PyTypeObject) Py_BitOr_Type; +#define BitOr_Check(op) PyObject_TypeCheck(op, &Py_BitOr_Type) + +struct _BitOr{ + struct _operator _base; +}; +PyObject *Py_BitOr_New(void); +#define BitOr Py_BitOr_New + +PyAPI_DATA(PyTypeObject) Py_BitXor_Type; +#define BitXor_Check(op) PyObject_TypeCheck(op, &Py_BitXor_Type) + +struct _BitXor{ + struct _operator _base; +}; +PyObject *Py_BitXor_New(void); +#define BitXor Py_BitXor_New + +PyAPI_DATA(PyTypeObject) Py_BitAnd_Type; +#define BitAnd_Check(op) PyObject_TypeCheck(op, &Py_BitAnd_Type) + +struct _BitAnd{ + struct _operator _base; +}; +PyObject *Py_BitAnd_New(void); +#define BitAnd Py_BitAnd_New + +PyAPI_DATA(PyTypeObject) Py_FloorDiv_Type; +#define FloorDiv_Check(op) PyObject_TypeCheck(op, &Py_FloorDiv_Type) + +struct _FloorDiv{ + struct _operator _base; +}; +PyObject *Py_FloorDiv_New(void); +#define FloorDiv Py_FloorDiv_New + +PyAPI_DATA(PyTypeObject) Py_unaryop_Type; +#define unaryop_Check(op) PyObject_TypeCheck(op, &Py_unaryop_Type) + +struct _unaryop{ + PyObject_HEAD + enum {Invert_kind, Not_kind, UAdd_kind, USub_kind} _kind; +}; + +PyAPI_DATA(PyTypeObject) Py_Invert_Type; +#define Invert_Check(op) PyObject_TypeCheck(op, &Py_Invert_Type) + +struct _Invert{ + struct _unaryop _base; +}; +PyObject *Py_Invert_New(void); +#define Invert Py_Invert_New + +PyAPI_DATA(PyTypeObject) Py_Not_Type; +#define Not_Check(op) PyObject_TypeCheck(op, &Py_Not_Type) + +struct _Not{ + struct _unaryop _base; +}; +PyObject *Py_Not_New(void); +#define Not Py_Not_New + +PyAPI_DATA(PyTypeObject) Py_UAdd_Type; +#define UAdd_Check(op) PyObject_TypeCheck(op, &Py_UAdd_Type) + +struct _UAdd{ + struct _unaryop _base; +}; +PyObject *Py_UAdd_New(void); +#define UAdd Py_UAdd_New + +PyAPI_DATA(PyTypeObject) Py_USub_Type; +#define USub_Check(op) PyObject_TypeCheck(op, &Py_USub_Type) + +struct _USub{ + struct _unaryop _base; +}; +PyObject *Py_USub_New(void); +#define USub Py_USub_New + +PyAPI_DATA(PyTypeObject) Py_cmpop_Type; +#define cmpop_Check(op) PyObject_TypeCheck(op, &Py_cmpop_Type) + +struct _cmpop{ + PyObject_HEAD + enum {Eq_kind, NotEq_kind, Lt_kind, LtE_kind, Gt_kind, GtE_kind, + Is_kind, IsNot_kind, In_kind, NotIn_kind} _kind; +}; + +PyAPI_DATA(PyTypeObject) Py_Eq_Type; +#define Eq_Check(op) PyObject_TypeCheck(op, &Py_Eq_Type) + +struct _Eq{ + struct _cmpop _base; +}; +PyObject *Py_Eq_New(void); +#define Eq Py_Eq_New + +PyAPI_DATA(PyTypeObject) Py_NotEq_Type; +#define NotEq_Check(op) PyObject_TypeCheck(op, &Py_NotEq_Type) + +struct _NotEq{ + struct _cmpop _base; +}; +PyObject *Py_NotEq_New(void); +#define NotEq Py_NotEq_New + +PyAPI_DATA(PyTypeObject) Py_Lt_Type; +#define Lt_Check(op) PyObject_TypeCheck(op, &Py_Lt_Type) + +struct _Lt{ + struct _cmpop _base; +}; +PyObject *Py_Lt_New(void); +#define Lt Py_Lt_New + +PyAPI_DATA(PyTypeObject) Py_LtE_Type; +#define LtE_Check(op) PyObject_TypeCheck(op, &Py_LtE_Type) + +struct _LtE{ + struct _cmpop _base; +}; +PyObject *Py_LtE_New(void); +#define LtE Py_LtE_New + +PyAPI_DATA(PyTypeObject) Py_Gt_Type; +#define Gt_Check(op) PyObject_TypeCheck(op, &Py_Gt_Type) + +struct _Gt{ + struct _cmpop _base; +}; +PyObject *Py_Gt_New(void); +#define Gt Py_Gt_New + +PyAPI_DATA(PyTypeObject) Py_GtE_Type; +#define GtE_Check(op) PyObject_TypeCheck(op, &Py_GtE_Type) + +struct _GtE{ + struct _cmpop _base; +}; +PyObject *Py_GtE_New(void); +#define GtE Py_GtE_New + +PyAPI_DATA(PyTypeObject) Py_Is_Type; +#define Is_Check(op) PyObject_TypeCheck(op, &Py_Is_Type) + +struct _Is{ + struct _cmpop _base; +}; +PyObject *Py_Is_New(void); +#define Is Py_Is_New + +PyAPI_DATA(PyTypeObject) Py_IsNot_Type; +#define IsNot_Check(op) PyObject_TypeCheck(op, &Py_IsNot_Type) + +struct _IsNot{ + struct _cmpop _base; +}; +PyObject *Py_IsNot_New(void); +#define IsNot Py_IsNot_New + +PyAPI_DATA(PyTypeObject) Py_In_Type; +#define In_Check(op) PyObject_TypeCheck(op, &Py_In_Type) + +struct _In{ + struct _cmpop _base; +}; +PyObject *Py_In_New(void); +#define In Py_In_New + +PyAPI_DATA(PyTypeObject) Py_NotIn_Type; +#define NotIn_Check(op) PyObject_TypeCheck(op, &Py_NotIn_Type) + +struct _NotIn{ + struct _cmpop _base; +}; +PyObject *Py_NotIn_New(void); +#define NotIn Py_NotIn_New + PyAPI_DATA(PyTypeObject) Py_comprehension_Type; #define comprehension_Check(op) PyObject_TypeCheck(op, &Py_comprehension_Type) Modified: python/branches/ast-objects/Parser/asdl_c.py ============================================================================== --- python/branches/ast-objects/Parser/asdl_c.py (original) +++ python/branches/ast-objects/Parser/asdl_c.py Fri Dec 2 13:16:10 2005 @@ -4,7 +4,7 @@ # TO DO # handle fields that have a type but no name -import os, sys, traceback +import os, sys, traceback, operator import asdl @@ -104,11 +104,8 @@ self.visit(type.value, type.name) def visitSum(self, sum, name): - if is_simple(sum): - pass # XXX - else: - for t in sum.types: - self.visit(t, name, sum.attributes) + for t in sum.types: + self.visit(t, name, sum.attributes) def get_args(self, fields): """Return list of C argument into, one for each field. @@ -144,8 +141,7 @@ self.visit(type.value, type.name, depth) def visitSum(self, sum, name, depth): - if not is_simple(sum): - self.sum_with_constructors(sum, name, depth) + self.sum_with_constructors(sum, name, depth) def sum_with_constructors(self, sum, name, depth): def emit(s, depth=depth): @@ -197,9 +193,34 @@ self.emit("PyObject *Py_%s_New(%s);" % (name, ", ".join(field_types)), depth) self.emit("", depth) +class ForwardVisitor(TraversalVisitor): + def emit_validate(self, name): + self.emit("static int %s_validate(PyObject*);" % name, 0) + + def visitSum(self, sum, name): + self.emit_validate(name) + for t in sum.types: + self.visit(t, name, sum.attributes) + + def visitProduct(self, prod, name): + self.emit_validate(name) + + def visitConstructor(self, cons, name, attrs): + self.emit_validate(cons.name) + + class FunctionVisitor(TraversalVisitor): """Visitor to generate constructor functions for AST.""" + def check(self, t): + t = t.value + if t in ("identifier", "string"): + return "PyString_Check" + elif t == "bool": + return "PyBool_Check" + else: + return t+"_Check" + def emit_ctor(self, name, args, attrs): def emit(s, depth=0, reflow=1): self.emit(s, depth, reflow) @@ -241,9 +262,116 @@ emit("}") emit("") + def emit_seq_check(self, f): + depth = 1 + def emit(s): + self.emit(s, depth) + emit("if (!PyList_Check(obj->%s)) {" % f.name) + emit(' failed_check("%s", "list", obj->%s);' % (f.name, f.name)) + emit(' return -1;') + emit("}") + emit("for(i = 0; i < PyList_Size(obj->%s); i++) {" % f.name) + depth = 2 + check = self.check(f.type) + emit("if (!%s(PyList_GET_ITEM(obj->%s, i))) {" % (check, f.name)) + emit(' failed_check("%s", "%s", PyList_GET_ITEM(obj->%s, i));' % (f.name, f.type, f.name)) + emit(' return -1;') + emit("}") + if f.type.value not in ('identifier',): + emit("if (%s_validate(PyList_GET_ITEM(obj->%s, i)) < 0)" % (f.type, f.name)) + emit(" return -1;") + depth = 1 + emit("}") + + def emit_opt_check(self, f): + depth = 1 + def emit(s): + self.emit(s, depth) + emit("if (obj->%s != Py_None) /* empty */;" % f.name) + check = self.check(f.type) + emit("else if (!%s(obj->%s)) {" % (check, f.name)) + emit(' failed_check("%s", "%s", obj->%s);' % (f.name, f.type, f.name)) + emit(' return -1;') + emit("}") + if f.type.value not in ('identifier',): + emit("else if (%s_validate(obj->%s) < 0)" % (f.type, f.name)) + emit(" return -1;") + + def emit_field_check(self, f, inbase): + depth = 1 + def emit(s): + self.emit(s, depth) + base = "" + if inbase: + base = "_base." + type = f[0] + name = f[1] + else: + type = f.type + name = f.name + if type == "int": + return + check = self.check(type) + emit("if (!%s(obj->%s%s)) {" % (check, base, name)) + emit(' failed_check("%s", "%s", obj->%s%s);' % + (name, type, base, name)) + emit(' return -1;') + emit("}") + + def emit_validate(self, name, fields, attrs): + depth = 0 + def emit(s): + self.emit(s, depth) + has_seq = reduce(operator.or_, ([f.seq for f in fields]), False) + emit("static int") + emit("%s_validate(PyObject *_obj)" % name) + emit("{") + depth = 1 + if fields: + emit("struct _%s *obj = (struct _%s*)_obj;" % (name,name)) + if has_seq: + emit("int i;") + for f in fields: + if f.seq: + self.emit_seq_check(f) + elif f.opt: + self.emit_opt_check(f) + else: + self.emit_field_check(f, False) + for f in attrs: + self.emit_field_check(f, True) + emit("return 0;") + depth = 0 + emit("}") + emit("") + + def emit_sumvalidate(self, sum, name): + depth = 0 + def emit(s): + self.emit(s, depth) + emit("int") + emit("%s_validate(PyObject* _obj)" % name) + emit("{") + depth = 1 + emit("struct _%s *obj = (struct _%s*)_obj;" % (name,name)) + # caller should have verified that this is the correct type + emit("assert(%s_Check(_obj));" % (name)) + emit("switch(obj->_kind) {") + depth = 2 + for t in sum.types: + emit("case %s_kind:" % t.name) + emit(" return %s_validate(_obj);" % t.name) + depth = 1 + emit("}") + emit('PyErr_SetString(PyExc_TypeError, "invalid _kind in %s");' % name) + emit('return -1;') + depth = 0 + emit("}") + + def emit_type(self, name): depth = 0 - def emit(s=1): + def emit(s): self.emit(s, depth) def null(thing): emit("0,\t\t/* tp_%s */" % thing) @@ -275,19 +403,18 @@ emit("") def visitSum(self, sum, name): - if is_simple(sum): - pass # XXX - else: - self.emit("#define %s_dealloc 0" % name, 0) - self.emit_type(name) - for t in sum.types: - self.visit(t, name, sum.attributes) + self.emit("#define %s_dealloc 0" % name, 0) + self.emit_type(name) + self.emit_sumvalidate(sum, name) + for t in sum.types: + self.visit(t, name, sum.attributes) def visitProduct(self, prod, name): args = self.get_args(prod.fields) self.emit_ctor(str(name), args, []) self.emit_dealloc(str(name), args, []) self.emit_type(str(name)) + self.emit_validate(str(name), prod.fields, []) def visitConstructor(self, cons, name, attrs): args = self.get_args(cons.fields) @@ -295,6 +422,22 @@ self.emit_ctor(cons.name, args, attrs) self.emit_dealloc(cons.name, args, attrs) self.emit_type(cons.name) + self.emit_validate(cons.name, cons.fields, attrs) + +class PyAST_Validate(TraversalVisitor): + def visitModule(self, mod): + self.emit("int PyAST_Validate(PyObject *obj)", 0) + self.emit("{", 0) + for dfn in mod.dfns: + self.visit(dfn) + self.emit('PyErr_Format(PyExc_TypeError, "Not an AST node: %s", obj->ob_type->tp_name);', 1) + self.emit("return -1;", 1) + self.emit("}", 0) + self.emit("", 0) + + def visitType(self, t): + self.emit("if (%s_Check(obj))" % t.name, 1) + self.emit("return %s_validate(obj);" % t.name, 2) class InitVisitor(TraversalVisitor): def visitModule(self, mod): @@ -305,12 +448,9 @@ self.emit("}", 0) def visitSum(self, sum, name): - if is_simple(sum): - pass # XXX - else: - self.emit_init(name) - for t in sum.types: - self.visit(t, name, sum.attributes) + self.emit_init(name) + for t in sum.types: + self.visit(t, name, sum.attributes) def visitProduct(self, prod, name): self.emit_init(name) @@ -333,6 +473,17 @@ v.visit(object) v.emit("", 0) +static_code = """ +static void failed_check(const char* field, const char* expected, + PyObject *real) +{ + PyErr_Format(PyExc_TypeError, "invalid %s: excpected %s, found %s", + field, expected, real->ob_type->tp_name); +} +/* Convenience macro to simplify asdl_c.py */ +#define object_Check(x) 1 +""" + def main(srcfile): auto_gen_msg = '/* File automatically generated by %s */\n' % sys.argv[0] mod = asdl.parse(srcfile) @@ -361,9 +512,13 @@ print >> f, '#include "Python.h"' print >> f, '#include "%s-ast.h"' % mod.name print >> f - v = ChainOfVisitors(FunctionVisitor(f), - InitVisitor(f), - ) + print >> f, static_code + v = ChainOfVisitors( + ForwardVisitor(f), + FunctionVisitor(f), + PyAST_Validate(f), + InitVisitor(f), + ) v.visit(mod) f.close() Modified: python/branches/ast-objects/Python/Python-ast.c ============================================================================== --- python/branches/ast-objects/Python/Python-ast.c (original) +++ python/branches/ast-objects/Python/Python-ast.c Fri Dec 2 13:16:10 2005 @@ -3,6 +3,113 @@ #include "Python.h" #include "Python-ast.h" + +static void failed_check(const char* field, const char* expected, + PyObject *real) +{ + PyErr_Format(PyExc_TypeError, "invalid %s: excpected %s, found %s", + field, expected, real->ob_type->tp_name); +} +/* Convenience macro to simplify asdl_c.py */ +#define object_Check(x) 1 + +static int mod_validate(PyObject*); +static int Module_validate(PyObject*); +static int Interactive_validate(PyObject*); +static int Expression_validate(PyObject*); +static int Suite_validate(PyObject*); +static int stmt_validate(PyObject*); +static int FunctionDef_validate(PyObject*); +static int ClassDef_validate(PyObject*); +static int Return_validate(PyObject*); +static int Delete_validate(PyObject*); +static int Assign_validate(PyObject*); +static int AugAssign_validate(PyObject*); +static int Print_validate(PyObject*); +static int For_validate(PyObject*); +static int While_validate(PyObject*); +static int If_validate(PyObject*); +static int Raise_validate(PyObject*); +static int TryExcept_validate(PyObject*); +static int TryFinally_validate(PyObject*); +static int Assert_validate(PyObject*); +static int Import_validate(PyObject*); +static int ImportFrom_validate(PyObject*); +static int Exec_validate(PyObject*); +static int Global_validate(PyObject*); +static int Expr_validate(PyObject*); +static int Pass_validate(PyObject*); +static int Break_validate(PyObject*); +static int Continue_validate(PyObject*); +static int expr_validate(PyObject*); +static int BoolOp_validate(PyObject*); +static int BinOp_validate(PyObject*); +static int UnaryOp_validate(PyObject*); +static int Lambda_validate(PyObject*); +static int Dict_validate(PyObject*); +static int ListComp_validate(PyObject*); +static int GeneratorExp_validate(PyObject*); +static int Yield_validate(PyObject*); +static int Compare_validate(PyObject*); +static int Call_validate(PyObject*); +static int Repr_validate(PyObject*); +static int Num_validate(PyObject*); +static int Str_validate(PyObject*); +static int Attribute_validate(PyObject*); +static int Subscript_validate(PyObject*); +static int Name_validate(PyObject*); +static int List_validate(PyObject*); +static int Tuple_validate(PyObject*); +static int expr_context_validate(PyObject*); +static int Load_validate(PyObject*); +static int Store_validate(PyObject*); +static int Del_validate(PyObject*); +static int AugLoad_validate(PyObject*); +static int AugStore_validate(PyObject*); +static int Param_validate(PyObject*); +static int slice_validate(PyObject*); +static int Ellipsis_validate(PyObject*); +static int Slice_validate(PyObject*); +static int ExtSlice_validate(PyObject*); +static int Index_validate(PyObject*); +static int boolop_validate(PyObject*); +static int And_validate(PyObject*); +static int Or_validate(PyObject*); +static int operator_validate(PyObject*); +static int Add_validate(PyObject*); +static int Sub_validate(PyObject*); +static int Mult_validate(PyObject*); +static int Div_validate(PyObject*); +static int Mod_validate(PyObject*); +static int Pow_validate(PyObject*); +static int LShift_validate(PyObject*); +static int RShift_validate(PyObject*); +static int BitOr_validate(PyObject*); +static int BitXor_validate(PyObject*); +static int BitAnd_validate(PyObject*); +static int FloorDiv_validate(PyObject*); +static int unaryop_validate(PyObject*); +static int Invert_validate(PyObject*); +static int Not_validate(PyObject*); +static int UAdd_validate(PyObject*); +static int USub_validate(PyObject*); +static int cmpop_validate(PyObject*); +static int Eq_validate(PyObject*); +static int NotEq_validate(PyObject*); +static int Lt_validate(PyObject*); +static int LtE_validate(PyObject*); +static int Gt_validate(PyObject*); +static int GtE_validate(PyObject*); +static int Is_validate(PyObject*); +static int IsNot_validate(PyObject*); +static int In_validate(PyObject*); +static int NotIn_validate(PyObject*); +static int comprehension_validate(PyObject*); +static int excepthandler_validate(PyObject*); +static int arguments_validate(PyObject*); +static int keyword_validate(PyObject*); +static int alias_validate(PyObject*); + #define mod_dealloc 0 PyTypeObject Py_mod_Type = { PyObject_HEAD_INIT(NULL) @@ -48,6 +155,24 @@ 0, /* tp_is_gc */ }; +int +mod_validate(PyObject* _obj) +{ + struct _mod *obj = (struct _mod*)_obj; + assert(mod_Check(_obj)); + switch(obj->_kind) { + case Module_kind: + return Module_validate(_obj); + case Interactive_kind: + return Interactive_validate(_obj); + case Expression_kind: + return Expression_validate(_obj); + case Suite_kind: + return Suite_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in mod"); + return -1; +} PyObject* Py_Module_New(PyObject* body) { @@ -111,6 +236,26 @@ 0, /* tp_is_gc */ }; +static int +Module_validate(PyObject *_obj) +{ + struct _Module *obj = (struct _Module*)_obj; + int i; + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_Interactive_New(PyObject* body) { @@ -174,6 +319,26 @@ 0, /* tp_is_gc */ }; +static int +Interactive_validate(PyObject *_obj) +{ + struct _Interactive *obj = (struct _Interactive*)_obj; + int i; + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_Expression_New(PyObject* body) { @@ -237,6 +402,17 @@ 0, /* tp_is_gc */ }; +static int +Expression_validate(PyObject *_obj) +{ + struct _Expression *obj = (struct _Expression*)_obj; + if (!expr_Check(obj->body)) { + failed_check("body", "expr", obj->body); + return -1; + } + return 0; +} + PyObject* Py_Suite_New(PyObject* body) { @@ -300,6 +476,26 @@ 0, /* tp_is_gc */ }; +static int +Suite_validate(PyObject *_obj) +{ + struct _Suite *obj = (struct _Suite*)_obj; + int i; + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + return 0; +} + #define stmt_dealloc 0 PyTypeObject Py_stmt_Type = { PyObject_HEAD_INIT(NULL) @@ -345,6 +541,60 @@ 0, /* tp_is_gc */ }; +int +stmt_validate(PyObject* _obj) +{ + struct _stmt *obj = (struct _stmt*)_obj; + assert(stmt_Check(_obj)); + switch(obj->_kind) { + case FunctionDef_kind: + return FunctionDef_validate(_obj); + case ClassDef_kind: + return ClassDef_validate(_obj); + case Return_kind: + return Return_validate(_obj); + case Delete_kind: + return Delete_validate(_obj); + case Assign_kind: + return Assign_validate(_obj); + case AugAssign_kind: + return AugAssign_validate(_obj); + case Print_kind: + return Print_validate(_obj); + case For_kind: + return For_validate(_obj); + case While_kind: + return While_validate(_obj); + case If_kind: + return If_validate(_obj); + case Raise_kind: + return Raise_validate(_obj); + case TryExcept_kind: + return TryExcept_validate(_obj); + case TryFinally_kind: + return TryFinally_validate(_obj); + case Assert_kind: + return Assert_validate(_obj); + case Import_kind: + return Import_validate(_obj); + case ImportFrom_kind: + return ImportFrom_validate(_obj); + case Exec_kind: + return Exec_validate(_obj); + case Global_kind: + return Global_validate(_obj); + case Expr_kind: + return Expr_validate(_obj); + case Pass_kind: + return Pass_validate(_obj); + case Break_kind: + return Break_validate(_obj); + case Continue_kind: + return Continue_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in stmt"); + return -1; +} PyObject* Py_FunctionDef_New(PyObject* name, PyObject* args, PyObject* body, PyObject* decorators, int lineno) @@ -419,6 +669,47 @@ 0, /* tp_is_gc */ }; +static int +FunctionDef_validate(PyObject *_obj) +{ + struct _FunctionDef *obj = (struct _FunctionDef*)_obj; + int i; + if (!PyString_Check(obj->name)) { + failed_check("name", "identifier", obj->name); + return -1; + } + if (!arguments_Check(obj->args)) { + failed_check("args", "arguments", obj->args); + return -1; + } + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + if (!PyList_Check(obj->decorators)) { + failed_check("decorators", "list", obj->decorators); + return -1; + } + for(i = 0; i < PyList_Size(obj->decorators); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->decorators, i))) { + failed_check("decorators", "expr", + PyList_GET_ITEM(obj->decorators, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->decorators, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_ClassDef_New(PyObject* name, PyObject* bases, PyObject* body, int lineno) { @@ -489,6 +780,43 @@ 0, /* tp_is_gc */ }; +static int +ClassDef_validate(PyObject *_obj) +{ + struct _ClassDef *obj = (struct _ClassDef*)_obj; + int i; + if (!PyString_Check(obj->name)) { + failed_check("name", "identifier", obj->name); + return -1; + } + if (!PyList_Check(obj->bases)) { + failed_check("bases", "list", obj->bases); + return -1; + } + for(i = 0; i < PyList_Size(obj->bases); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->bases, i))) { + failed_check("bases", "expr", PyList_GET_ITEM(obj->bases, + i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->bases, i)) < 0) + return -1; + } + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_Return_New(PyObject* value, int lineno) { @@ -553,6 +881,20 @@ 0, /* tp_is_gc */ }; +static int +Return_validate(PyObject *_obj) +{ + struct _Return *obj = (struct _Return*)_obj; + if (obj->value != Py_None) /* empty */; + else if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + else if (expr_validate(obj->value) < 0) + return -1; + return 0; +} + PyObject* Py_Delete_New(PyObject* targets, int lineno) { @@ -617,6 +959,27 @@ 0, /* tp_is_gc */ }; +static int +Delete_validate(PyObject *_obj) +{ + struct _Delete *obj = (struct _Delete*)_obj; + int i; + if (!PyList_Check(obj->targets)) { + failed_check("targets", "list", obj->targets); + return -1; + } + for(i = 0; i < PyList_Size(obj->targets); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->targets, i))) { + failed_check("targets", "expr", + PyList_GET_ITEM(obj->targets, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->targets, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_Assign_New(PyObject* targets, PyObject* value, int lineno) { @@ -684,6 +1047,31 @@ 0, /* tp_is_gc */ }; +static int +Assign_validate(PyObject *_obj) +{ + struct _Assign *obj = (struct _Assign*)_obj; + int i; + if (!PyList_Check(obj->targets)) { + failed_check("targets", "list", obj->targets); + return -1; + } + for(i = 0; i < PyList_Size(obj->targets); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->targets, i))) { + failed_check("targets", "expr", + PyList_GET_ITEM(obj->targets, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->targets, i)) < 0) + return -1; + } + if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + return 0; +} + PyObject* Py_AugAssign_New(PyObject* target, PyObject* op, PyObject* value, int lineno) { @@ -754,6 +1142,25 @@ 0, /* tp_is_gc */ }; +static int +AugAssign_validate(PyObject *_obj) +{ + struct _AugAssign *obj = (struct _AugAssign*)_obj; + if (!expr_Check(obj->target)) { + failed_check("target", "expr", obj->target); + return -1; + } + if (!operator_Check(obj->op)) { + failed_check("op", "operator", obj->op); + return -1; + } + if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + return 0; +} + PyObject* Py_Print_New(PyObject* dest, PyObject* values, PyObject* nl, int lineno) { @@ -824,6 +1231,38 @@ 0, /* tp_is_gc */ }; +static int +Print_validate(PyObject *_obj) +{ + struct _Print *obj = (struct _Print*)_obj; + int i; + if (obj->dest != Py_None) /* empty */; + else if (!expr_Check(obj->dest)) { + failed_check("dest", "expr", obj->dest); + return -1; + } + else if (expr_validate(obj->dest) < 0) + return -1; + if (!PyList_Check(obj->values)) { + failed_check("values", "list", obj->values); + return -1; + } + for(i = 0; i < PyList_Size(obj->values); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->values, i))) { + failed_check("values", "expr", PyList_GET_ITEM(obj->values, + i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->values, i)) < 0) + return -1; + } + if (!PyBool_Check(obj->nl)) { + failed_check("nl", "bool", obj->nl); + return -1; + } + return 0; +} + PyObject* Py_For_New(PyObject* target, PyObject* iter, PyObject* body, PyObject* orelse, int lineno) @@ -898,6 +1337,47 @@ 0, /* tp_is_gc */ }; +static int +For_validate(PyObject *_obj) +{ + struct _For *obj = (struct _For*)_obj; + int i; + if (!expr_Check(obj->target)) { + failed_check("target", "expr", obj->target); + return -1; + } + if (!expr_Check(obj->iter)) { + failed_check("iter", "expr", obj->iter); + return -1; + } + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + if (!PyList_Check(obj->orelse)) { + failed_check("orelse", "list", obj->orelse); + return -1; + } + for(i = 0; i < PyList_Size(obj->orelse); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->orelse, i))) { + failed_check("orelse", "stmt", PyList_GET_ITEM(obj->orelse, + i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->orelse, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_While_New(PyObject* test, PyObject* body, PyObject* orelse, int lineno) { @@ -968,6 +1448,43 @@ 0, /* tp_is_gc */ }; +static int +While_validate(PyObject *_obj) +{ + struct _While *obj = (struct _While*)_obj; + int i; + if (!expr_Check(obj->test)) { + failed_check("test", "expr", obj->test); + return -1; + } + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + if (!PyList_Check(obj->orelse)) { + failed_check("orelse", "list", obj->orelse); + return -1; + } + for(i = 0; i < PyList_Size(obj->orelse); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->orelse, i))) { + failed_check("orelse", "stmt", PyList_GET_ITEM(obj->orelse, + i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->orelse, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_If_New(PyObject* test, PyObject* body, PyObject* orelse, int lineno) { @@ -1038,6 +1555,43 @@ 0, /* tp_is_gc */ }; +static int +If_validate(PyObject *_obj) +{ + struct _If *obj = (struct _If*)_obj; + int i; + if (!expr_Check(obj->test)) { + failed_check("test", "expr", obj->test); + return -1; + } + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + if (!PyList_Check(obj->orelse)) { + failed_check("orelse", "list", obj->orelse); + return -1; + } + for(i = 0; i < PyList_Size(obj->orelse); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->orelse, i))) { + failed_check("orelse", "stmt", PyList_GET_ITEM(obj->orelse, + i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->orelse, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_Raise_New(PyObject* type, PyObject* inst, PyObject* tback, int lineno) { @@ -1108,6 +1662,34 @@ 0, /* tp_is_gc */ }; +static int +Raise_validate(PyObject *_obj) +{ + struct _Raise *obj = (struct _Raise*)_obj; + if (obj->type != Py_None) /* empty */; + else if (!expr_Check(obj->type)) { + failed_check("type", "expr", obj->type); + return -1; + } + else if (expr_validate(obj->type) < 0) + return -1; + if (obj->inst != Py_None) /* empty */; + else if (!expr_Check(obj->inst)) { + failed_check("inst", "expr", obj->inst); + return -1; + } + else if (expr_validate(obj->inst) < 0) + return -1; + if (obj->tback != Py_None) /* empty */; + else if (!expr_Check(obj->tback)) { + failed_check("tback", "expr", obj->tback); + return -1; + } + else if (expr_validate(obj->tback) < 0) + return -1; + return 0; +} + PyObject* Py_TryExcept_New(PyObject* body, PyObject* handlers, PyObject* orelse, int lineno) @@ -1179,6 +1761,53 @@ 0, /* tp_is_gc */ }; +static int +TryExcept_validate(PyObject *_obj) +{ + struct _TryExcept *obj = (struct _TryExcept*)_obj; + int i; + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + if (!PyList_Check(obj->handlers)) { + failed_check("handlers", "list", obj->handlers); + return -1; + } + for(i = 0; i < PyList_Size(obj->handlers); i++) { + if (!excepthandler_Check(PyList_GET_ITEM(obj->handlers, i))) { + failed_check("handlers", "excepthandler", + PyList_GET_ITEM(obj->handlers, i)); + return -1; + } + if (excepthandler_validate(PyList_GET_ITEM(obj->handlers, i)) < + 0) + return -1; + } + if (!PyList_Check(obj->orelse)) { + failed_check("orelse", "list", obj->orelse); + return -1; + } + for(i = 0; i < PyList_Size(obj->orelse); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->orelse, i))) { + failed_check("orelse", "stmt", PyList_GET_ITEM(obj->orelse, + i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->orelse, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_TryFinally_New(PyObject* body, PyObject* finalbody, int lineno) { @@ -1246,6 +1875,39 @@ 0, /* tp_is_gc */ }; +static int +TryFinally_validate(PyObject *_obj) +{ + struct _TryFinally *obj = (struct _TryFinally*)_obj; + int i; + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + if (!PyList_Check(obj->finalbody)) { + failed_check("finalbody", "list", obj->finalbody); + return -1; + } + for(i = 0; i < PyList_Size(obj->finalbody); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->finalbody, i))) { + failed_check("finalbody", "stmt", + PyList_GET_ITEM(obj->finalbody, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->finalbody, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_Assert_New(PyObject* test, PyObject* msg, int lineno) { @@ -1313,6 +1975,24 @@ 0, /* tp_is_gc */ }; +static int +Assert_validate(PyObject *_obj) +{ + struct _Assert *obj = (struct _Assert*)_obj; + if (!expr_Check(obj->test)) { + failed_check("test", "expr", obj->test); + return -1; + } + if (obj->msg != Py_None) /* empty */; + else if (!expr_Check(obj->msg)) { + failed_check("msg", "expr", obj->msg); + return -1; + } + else if (expr_validate(obj->msg) < 0) + return -1; + return 0; +} + PyObject* Py_Import_New(PyObject* names, int lineno) { @@ -1377,6 +2057,27 @@ 0, /* tp_is_gc */ }; +static int +Import_validate(PyObject *_obj) +{ + struct _Import *obj = (struct _Import*)_obj; + int i; + if (!PyList_Check(obj->names)) { + failed_check("names", "list", obj->names); + return -1; + } + for(i = 0; i < PyList_Size(obj->names); i++) { + if (!alias_Check(PyList_GET_ITEM(obj->names, i))) { + failed_check("names", "alias", PyList_GET_ITEM(obj->names, + i)); + return -1; + } + if (alias_validate(PyList_GET_ITEM(obj->names, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_ImportFrom_New(PyObject* module, PyObject* names, int lineno) { @@ -1444,6 +2145,31 @@ 0, /* tp_is_gc */ }; +static int +ImportFrom_validate(PyObject *_obj) +{ + struct _ImportFrom *obj = (struct _ImportFrom*)_obj; + int i; + if (!PyString_Check(obj->module)) { + failed_check("module", "identifier", obj->module); + return -1; + } + if (!PyList_Check(obj->names)) { + failed_check("names", "list", obj->names); + return -1; + } + for(i = 0; i < PyList_Size(obj->names); i++) { + if (!alias_Check(PyList_GET_ITEM(obj->names, i))) { + failed_check("names", "alias", PyList_GET_ITEM(obj->names, + i)); + return -1; + } + if (alias_validate(PyList_GET_ITEM(obj->names, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_Exec_New(PyObject* body, PyObject* globals, PyObject* locals, int lineno) { @@ -1514,6 +2240,31 @@ 0, /* tp_is_gc */ }; +static int +Exec_validate(PyObject *_obj) +{ + struct _Exec *obj = (struct _Exec*)_obj; + if (!expr_Check(obj->body)) { + failed_check("body", "expr", obj->body); + return -1; + } + if (obj->globals != Py_None) /* empty */; + else if (!expr_Check(obj->globals)) { + failed_check("globals", "expr", obj->globals); + return -1; + } + else if (expr_validate(obj->globals) < 0) + return -1; + if (obj->locals != Py_None) /* empty */; + else if (!expr_Check(obj->locals)) { + failed_check("locals", "expr", obj->locals); + return -1; + } + else if (expr_validate(obj->locals) < 0) + return -1; + return 0; +} + PyObject* Py_Global_New(PyObject* names, int lineno) { @@ -1578,6 +2329,25 @@ 0, /* tp_is_gc */ }; +static int +Global_validate(PyObject *_obj) +{ + struct _Global *obj = (struct _Global*)_obj; + int i; + if (!PyList_Check(obj->names)) { + failed_check("names", "list", obj->names); + return -1; + } + for(i = 0; i < PyList_Size(obj->names); i++) { + if (!PyString_Check(PyList_GET_ITEM(obj->names, i))) { + failed_check("names", "identifier", + PyList_GET_ITEM(obj->names, i)); + return -1; + } + } + return 0; +} + PyObject* Py_Expr_New(PyObject* value, int lineno) { @@ -1642,6 +2412,17 @@ 0, /* tp_is_gc */ }; +static int +Expr_validate(PyObject *_obj) +{ + struct _Expr *obj = (struct _Expr*)_obj; + if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + return 0; +} + PyObject* Py_Pass_New(int lineno) { @@ -1703,6 +2484,12 @@ 0, /* tp_is_gc */ }; +static int +Pass_validate(PyObject *_obj) +{ + return 0; +} + PyObject* Py_Break_New(int lineno) { @@ -1764,6 +2551,12 @@ 0, /* tp_is_gc */ }; +static int +Break_validate(PyObject *_obj) +{ + return 0; +} + PyObject* Py_Continue_New(int lineno) { @@ -1825,6 +2618,12 @@ 0, /* tp_is_gc */ }; +static int +Continue_validate(PyObject *_obj) +{ + return 0; +} + #define expr_dealloc 0 PyTypeObject Py_expr_Type = { PyObject_HEAD_INIT(NULL) @@ -1870,6 +2669,52 @@ 0, /* tp_is_gc */ }; +int +expr_validate(PyObject* _obj) +{ + struct _expr *obj = (struct _expr*)_obj; + assert(expr_Check(_obj)); + switch(obj->_kind) { + case BoolOp_kind: + return BoolOp_validate(_obj); + case BinOp_kind: + return BinOp_validate(_obj); + case UnaryOp_kind: + return UnaryOp_validate(_obj); + case Lambda_kind: + return Lambda_validate(_obj); + case Dict_kind: + return Dict_validate(_obj); + case ListComp_kind: + return ListComp_validate(_obj); + case GeneratorExp_kind: + return GeneratorExp_validate(_obj); + case Yield_kind: + return Yield_validate(_obj); + case Compare_kind: + return Compare_validate(_obj); + case Call_kind: + return Call_validate(_obj); + case Repr_kind: + return Repr_validate(_obj); + case Num_kind: + return Num_validate(_obj); + case Str_kind: + return Str_validate(_obj); + case Attribute_kind: + return Attribute_validate(_obj); + case Subscript_kind: + return Subscript_validate(_obj); + case Name_kind: + return Name_validate(_obj); + case List_kind: + return List_validate(_obj); + case Tuple_kind: + return Tuple_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in expr"); + return -1; +} PyObject* Py_BoolOp_New(PyObject* op, PyObject* values, int lineno) { @@ -1937,6 +2782,31 @@ 0, /* tp_is_gc */ }; +static int +BoolOp_validate(PyObject *_obj) +{ + struct _BoolOp *obj = (struct _BoolOp*)_obj; + int i; + if (!boolop_Check(obj->op)) { + failed_check("op", "boolop", obj->op); + return -1; + } + if (!PyList_Check(obj->values)) { + failed_check("values", "list", obj->values); + return -1; + } + for(i = 0; i < PyList_Size(obj->values); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->values, i))) { + failed_check("values", "expr", PyList_GET_ITEM(obj->values, + i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->values, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_BinOp_New(PyObject* left, PyObject* op, PyObject* right, int lineno) { @@ -2007,6 +2877,25 @@ 0, /* tp_is_gc */ }; +static int +BinOp_validate(PyObject *_obj) +{ + struct _BinOp *obj = (struct _BinOp*)_obj; + if (!expr_Check(obj->left)) { + failed_check("left", "expr", obj->left); + return -1; + } + if (!operator_Check(obj->op)) { + failed_check("op", "operator", obj->op); + return -1; + } + if (!expr_Check(obj->right)) { + failed_check("right", "expr", obj->right); + return -1; + } + return 0; +} + PyObject* Py_UnaryOp_New(PyObject* op, PyObject* operand, int lineno) { @@ -2074,6 +2963,21 @@ 0, /* tp_is_gc */ }; +static int +UnaryOp_validate(PyObject *_obj) +{ + struct _UnaryOp *obj = (struct _UnaryOp*)_obj; + if (!unaryop_Check(obj->op)) { + failed_check("op", "unaryop", obj->op); + return -1; + } + if (!expr_Check(obj->operand)) { + failed_check("operand", "expr", obj->operand); + return -1; + } + return 0; +} + PyObject* Py_Lambda_New(PyObject* args, PyObject* body, int lineno) { @@ -2141,6 +3045,21 @@ 0, /* tp_is_gc */ }; +static int +Lambda_validate(PyObject *_obj) +{ + struct _Lambda *obj = (struct _Lambda*)_obj; + if (!arguments_Check(obj->args)) { + failed_check("args", "arguments", obj->args); + return -1; + } + if (!expr_Check(obj->body)) { + failed_check("body", "expr", obj->body); + return -1; + } + return 0; +} + PyObject* Py_Dict_New(PyObject* keys, PyObject* values, int lineno) { @@ -2208,6 +3127,39 @@ 0, /* tp_is_gc */ }; +static int +Dict_validate(PyObject *_obj) +{ + struct _Dict *obj = (struct _Dict*)_obj; + int i; + if (!PyList_Check(obj->keys)) { + failed_check("keys", "list", obj->keys); + return -1; + } + for(i = 0; i < PyList_Size(obj->keys); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->keys, i))) { + failed_check("keys", "expr", PyList_GET_ITEM(obj->keys, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->keys, i)) < 0) + return -1; + } + if (!PyList_Check(obj->values)) { + failed_check("values", "list", obj->values); + return -1; + } + for(i = 0; i < PyList_Size(obj->values); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->values, i))) { + failed_check("values", "expr", PyList_GET_ITEM(obj->values, + i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->values, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_ListComp_New(PyObject* elt, PyObject* generators, int lineno) { @@ -2275,6 +3227,32 @@ 0, /* tp_is_gc */ }; +static int +ListComp_validate(PyObject *_obj) +{ + struct _ListComp *obj = (struct _ListComp*)_obj; + int i; + if (!expr_Check(obj->elt)) { + failed_check("elt", "expr", obj->elt); + return -1; + } + if (!PyList_Check(obj->generators)) { + failed_check("generators", "list", obj->generators); + return -1; + } + for(i = 0; i < PyList_Size(obj->generators); i++) { + if (!comprehension_Check(PyList_GET_ITEM(obj->generators, i))) { + failed_check("generators", "comprehension", + PyList_GET_ITEM(obj->generators, i)); + return -1; + } + if (comprehension_validate(PyList_GET_ITEM(obj->generators, i)) + < 0) + return -1; + } + return 0; +} + PyObject* Py_GeneratorExp_New(PyObject* elt, PyObject* generators, int lineno) { @@ -2342,6 +3320,32 @@ 0, /* tp_is_gc */ }; +static int +GeneratorExp_validate(PyObject *_obj) +{ + struct _GeneratorExp *obj = (struct _GeneratorExp*)_obj; + int i; + if (!expr_Check(obj->elt)) { + failed_check("elt", "expr", obj->elt); + return -1; + } + if (!PyList_Check(obj->generators)) { + failed_check("generators", "list", obj->generators); + return -1; + } + for(i = 0; i < PyList_Size(obj->generators); i++) { + if (!comprehension_Check(PyList_GET_ITEM(obj->generators, i))) { + failed_check("generators", "comprehension", + PyList_GET_ITEM(obj->generators, i)); + return -1; + } + if (comprehension_validate(PyList_GET_ITEM(obj->generators, i)) + < 0) + return -1; + } + return 0; +} + PyObject* Py_Yield_New(PyObject* value, int lineno) { @@ -2406,6 +3410,20 @@ 0, /* tp_is_gc */ }; +static int +Yield_validate(PyObject *_obj) +{ + struct _Yield *obj = (struct _Yield*)_obj; + if (obj->value != Py_None) /* empty */; + else if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + else if (expr_validate(obj->value) < 0) + return -1; + return 0; +} + PyObject* Py_Compare_New(PyObject* left, PyObject* ops, PyObject* comparators, int lineno) { @@ -2476,6 +3494,43 @@ 0, /* tp_is_gc */ }; +static int +Compare_validate(PyObject *_obj) +{ + struct _Compare *obj = (struct _Compare*)_obj; + int i; + if (!expr_Check(obj->left)) { + failed_check("left", "expr", obj->left); + return -1; + } + if (!PyList_Check(obj->ops)) { + failed_check("ops", "list", obj->ops); + return -1; + } + for(i = 0; i < PyList_Size(obj->ops); i++) { + if (!cmpop_Check(PyList_GET_ITEM(obj->ops, i))) { + failed_check("ops", "cmpop", PyList_GET_ITEM(obj->ops, i)); + return -1; + } + if (cmpop_validate(PyList_GET_ITEM(obj->ops, i)) < 0) + return -1; + } + if (!PyList_Check(obj->comparators)) { + failed_check("comparators", "list", obj->comparators); + return -1; + } + for(i = 0; i < PyList_Size(obj->comparators); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->comparators, i))) { + failed_check("comparators", "expr", + PyList_GET_ITEM(obj->comparators, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->comparators, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_Call_New(PyObject* func, PyObject* args, PyObject* keywords, PyObject* starargs, PyObject* kwargs, int lineno) @@ -2553,6 +3608,57 @@ 0, /* tp_is_gc */ }; +static int +Call_validate(PyObject *_obj) +{ + struct _Call *obj = (struct _Call*)_obj; + int i; + if (!expr_Check(obj->func)) { + failed_check("func", "expr", obj->func); + return -1; + } + if (!PyList_Check(obj->args)) { + failed_check("args", "list", obj->args); + return -1; + } + for(i = 0; i < PyList_Size(obj->args); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->args, i))) { + failed_check("args", "expr", PyList_GET_ITEM(obj->args, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->args, i)) < 0) + return -1; + } + if (!PyList_Check(obj->keywords)) { + failed_check("keywords", "list", obj->keywords); + return -1; + } + for(i = 0; i < PyList_Size(obj->keywords); i++) { + if (!keyword_Check(PyList_GET_ITEM(obj->keywords, i))) { + failed_check("keywords", "keyword", + PyList_GET_ITEM(obj->keywords, i)); + return -1; + } + if (keyword_validate(PyList_GET_ITEM(obj->keywords, i)) < 0) + return -1; + } + if (obj->starargs != Py_None) /* empty */; + else if (!expr_Check(obj->starargs)) { + failed_check("starargs", "expr", obj->starargs); + return -1; + } + else if (expr_validate(obj->starargs) < 0) + return -1; + if (obj->kwargs != Py_None) /* empty */; + else if (!expr_Check(obj->kwargs)) { + failed_check("kwargs", "expr", obj->kwargs); + return -1; + } + else if (expr_validate(obj->kwargs) < 0) + return -1; + return 0; +} + PyObject* Py_Repr_New(PyObject* value, int lineno) { @@ -2617,6 +3723,17 @@ 0, /* tp_is_gc */ }; +static int +Repr_validate(PyObject *_obj) +{ + struct _Repr *obj = (struct _Repr*)_obj; + if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + return 0; +} + PyObject* Py_Num_New(PyObject* n, int lineno) { @@ -2681,6 +3798,17 @@ 0, /* tp_is_gc */ }; +static int +Num_validate(PyObject *_obj) +{ + struct _Num *obj = (struct _Num*)_obj; + if (!object_Check(obj->n)) { + failed_check("n", "object", obj->n); + return -1; + } + return 0; +} + PyObject* Py_Str_New(PyObject* s, int lineno) { @@ -2745,6 +3873,17 @@ 0, /* tp_is_gc */ }; +static int +Str_validate(PyObject *_obj) +{ + struct _Str *obj = (struct _Str*)_obj; + if (!PyString_Check(obj->s)) { + failed_check("s", "string", obj->s); + return -1; + } + return 0; +} + PyObject* Py_Attribute_New(PyObject* value, PyObject* attr, PyObject* ctx, int lineno) { @@ -2815,6 +3954,25 @@ 0, /* tp_is_gc */ }; +static int +Attribute_validate(PyObject *_obj) +{ + struct _Attribute *obj = (struct _Attribute*)_obj; + if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + if (!PyString_Check(obj->attr)) { + failed_check("attr", "identifier", obj->attr); + return -1; + } + if (!expr_context_Check(obj->ctx)) { + failed_check("ctx", "expr_context", obj->ctx); + return -1; + } + return 0; +} + PyObject* Py_Subscript_New(PyObject* value, PyObject* slice, PyObject* ctx, int lineno) { @@ -2885,6 +4043,25 @@ 0, /* tp_is_gc */ }; +static int +Subscript_validate(PyObject *_obj) +{ + struct _Subscript *obj = (struct _Subscript*)_obj; + if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + if (!slice_Check(obj->slice)) { + failed_check("slice", "slice", obj->slice); + return -1; + } + if (!expr_context_Check(obj->ctx)) { + failed_check("ctx", "expr_context", obj->ctx); + return -1; + } + return 0; +} + PyObject* Py_Name_New(PyObject* id, PyObject* ctx, int lineno) { @@ -2952,6 +4129,21 @@ 0, /* tp_is_gc */ }; +static int +Name_validate(PyObject *_obj) +{ + struct _Name *obj = (struct _Name*)_obj; + if (!PyString_Check(obj->id)) { + failed_check("id", "identifier", obj->id); + return -1; + } + if (!expr_context_Check(obj->ctx)) { + failed_check("ctx", "expr_context", obj->ctx); + return -1; + } + return 0; +} + PyObject* Py_List_New(PyObject* elts, PyObject* ctx, int lineno) { @@ -3019,6 +4211,30 @@ 0, /* tp_is_gc */ }; +static int +List_validate(PyObject *_obj) +{ + struct _List *obj = (struct _List*)_obj; + int i; + if (!PyList_Check(obj->elts)) { + failed_check("elts", "list", obj->elts); + return -1; + } + for(i = 0; i < PyList_Size(obj->elts); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->elts, i))) { + failed_check("elts", "expr", PyList_GET_ITEM(obj->elts, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->elts, i)) < 0) + return -1; + } + if (!expr_context_Check(obj->ctx)) { + failed_check("ctx", "expr_context", obj->ctx); + return -1; + } + return 0; +} + PyObject* Py_Tuple_New(PyObject* elts, PyObject* ctx, int lineno) { @@ -3086,14 +4302,38 @@ 0, /* tp_is_gc */ }; -#define slice_dealloc 0 -PyTypeObject Py_slice_Type = { +static int +Tuple_validate(PyObject *_obj) +{ + struct _Tuple *obj = (struct _Tuple*)_obj; + int i; + if (!PyList_Check(obj->elts)) { + failed_check("elts", "list", obj->elts); + return -1; + } + for(i = 0; i < PyList_Size(obj->elts); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->elts, i))) { + failed_check("elts", "expr", PyList_GET_ITEM(obj->elts, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->elts, i)) < 0) + return -1; + } + if (!expr_context_Check(obj->ctx)) { + failed_check("ctx", "expr_context", obj->ctx); + return -1; + } + return 0; +} + +#define expr_context_dealloc 0 +PyTypeObject Py_expr_context_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ - "slice", /*tp_name*/ - sizeof(struct _slice), /*tp_basicsize*/ + "expr_context", /*tp_name*/ + sizeof(struct _expr_context), /*tp_basicsize*/ 0, /* tp_itemsize */ - slice_dealloc, /*tp_dealloc*/ + expr_context_dealloc, /*tp_dealloc*/ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -3131,29 +4371,51 @@ 0, /* tp_is_gc */ }; +int +expr_context_validate(PyObject* _obj) +{ + struct _expr_context *obj = (struct _expr_context*)_obj; + assert(expr_context_Check(_obj)); + switch(obj->_kind) { + case Load_kind: + return Load_validate(_obj); + case Store_kind: + return Store_validate(_obj); + case Del_kind: + return Del_validate(_obj); + case AugLoad_kind: + return AugLoad_validate(_obj); + case AugStore_kind: + return AugStore_validate(_obj); + case Param_kind: + return Param_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in expr_context"); + return -1; +} PyObject* -Py_Ellipsis_New() +Py_Load_New() { - struct _Ellipsis *result = PyObject_New(struct _Ellipsis, &Py_Ellipsis_Type); + struct _Load *result = PyObject_New(struct _Load, &Py_Load_Type); if (result == NULL) return NULL; return (PyObject*)result; } static void -Ellipsis_dealloc(PyObject* _self) +Load_dealloc(PyObject* _self) { - struct _Ellipsis *self = (struct _Ellipsis*)_self; + struct _Load *self = (struct _Load*)_self; PyObject_Del(self); } -PyTypeObject Py_Ellipsis_Type = { +PyTypeObject Py_Load_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ - "Ellipsis", /*tp_name*/ - sizeof(struct _Ellipsis), /*tp_basicsize*/ + "Load", /*tp_name*/ + sizeof(struct _Load), /*tp_basicsize*/ 0, /* tp_itemsize */ - Ellipsis_dealloc, /*tp_dealloc*/ + Load_dealloc, /*tp_dealloc*/ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -3191,38 +4453,35 @@ 0, /* tp_is_gc */ }; +static int +Load_validate(PyObject *_obj) +{ + return 0; +} + PyObject* -Py_Slice_New(PyObject* lower, PyObject* upper, PyObject* step) +Py_Store_New() { - struct _Slice *result = PyObject_New(struct _Slice, &Py_Slice_Type); + struct _Store *result = PyObject_New(struct _Store, &Py_Store_Type); if (result == NULL) return NULL; - Py_INCREF(lower); - result->lower = lower; - Py_INCREF(upper); - result->upper = upper; - Py_INCREF(step); - result->step = step; return (PyObject*)result; } static void -Slice_dealloc(PyObject* _self) +Store_dealloc(PyObject* _self) { - struct _Slice *self = (struct _Slice*)_self; - Py_DECREF(self->lower); - Py_DECREF(self->upper); - Py_DECREF(self->step); + struct _Store *self = (struct _Store*)_self; PyObject_Del(self); } -PyTypeObject Py_Slice_Type = { +PyTypeObject Py_Store_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ - "Slice", /*tp_name*/ - sizeof(struct _Slice), /*tp_basicsize*/ + "Store", /*tp_name*/ + sizeof(struct _Store), /*tp_basicsize*/ 0, /* tp_itemsize */ - Slice_dealloc, /*tp_dealloc*/ + Store_dealloc, /*tp_dealloc*/ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -3260,32 +4519,35 @@ 0, /* tp_is_gc */ }; +static int +Store_validate(PyObject *_obj) +{ + return 0; +} + PyObject* -Py_ExtSlice_New(PyObject* dims) +Py_Del_New() { - struct _ExtSlice *result = PyObject_New(struct _ExtSlice, &Py_ExtSlice_Type); + struct _Del *result = PyObject_New(struct _Del, &Py_Del_Type); if (result == NULL) return NULL; - Py_INCREF(dims); - result->dims = dims; return (PyObject*)result; } static void -ExtSlice_dealloc(PyObject* _self) +Del_dealloc(PyObject* _self) { - struct _ExtSlice *self = (struct _ExtSlice*)_self; - Py_DECREF(self->dims); + struct _Del *self = (struct _Del*)_self; PyObject_Del(self); } -PyTypeObject Py_ExtSlice_Type = { +PyTypeObject Py_Del_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ - "ExtSlice", /*tp_name*/ - sizeof(struct _ExtSlice), /*tp_basicsize*/ + "Del", /*tp_name*/ + sizeof(struct _Del), /*tp_basicsize*/ 0, /* tp_itemsize */ - ExtSlice_dealloc, /*tp_dealloc*/ + Del_dealloc, /*tp_dealloc*/ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -3323,32 +4585,35 @@ 0, /* tp_is_gc */ }; +static int +Del_validate(PyObject *_obj) +{ + return 0; +} + PyObject* -Py_Index_New(PyObject* value) +Py_AugLoad_New() { - struct _Index *result = PyObject_New(struct _Index, &Py_Index_Type); + struct _AugLoad *result = PyObject_New(struct _AugLoad, &Py_AugLoad_Type); if (result == NULL) return NULL; - Py_INCREF(value); - result->value = value; return (PyObject*)result; } static void -Index_dealloc(PyObject* _self) +AugLoad_dealloc(PyObject* _self) { - struct _Index *self = (struct _Index*)_self; - Py_DECREF(self->value); + struct _AugLoad *self = (struct _AugLoad*)_self; PyObject_Del(self); } -PyTypeObject Py_Index_Type = { +PyTypeObject Py_AugLoad_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ - "Index", /*tp_name*/ - sizeof(struct _Index), /*tp_basicsize*/ + "AugLoad", /*tp_name*/ + sizeof(struct _AugLoad), /*tp_basicsize*/ 0, /* tp_itemsize */ - Index_dealloc, /*tp_dealloc*/ + AugLoad_dealloc, /*tp_dealloc*/ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -3386,38 +4651,35 @@ 0, /* tp_is_gc */ }; +static int +AugLoad_validate(PyObject *_obj) +{ + return 0; +} + PyObject* -Py_comprehension_New(PyObject* target, PyObject* iter, PyObject* ifs) +Py_AugStore_New() { - struct _comprehension *result = PyObject_New(struct _comprehension, &Py_comprehension_Type); + struct _AugStore *result = PyObject_New(struct _AugStore, &Py_AugStore_Type); if (result == NULL) return NULL; - Py_INCREF(target); - result->target = target; - Py_INCREF(iter); - result->iter = iter; - Py_INCREF(ifs); - result->ifs = ifs; return (PyObject*)result; } static void -comprehension_dealloc(PyObject* _self) +AugStore_dealloc(PyObject* _self) { - struct _comprehension *self = (struct _comprehension*)_self; - Py_DECREF(self->target); - Py_DECREF(self->iter); - Py_DECREF(self->ifs); + struct _AugStore *self = (struct _AugStore*)_self; PyObject_Del(self); } -PyTypeObject Py_comprehension_Type = { +PyTypeObject Py_AugStore_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ - "comprehension", /*tp_name*/ - sizeof(struct _comprehension), /*tp_basicsize*/ + "AugStore", /*tp_name*/ + sizeof(struct _AugStore), /*tp_basicsize*/ 0, /* tp_itemsize */ - comprehension_dealloc, /*tp_dealloc*/ + AugStore_dealloc, /*tp_dealloc*/ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -3455,38 +4717,35 @@ 0, /* tp_is_gc */ }; +static int +AugStore_validate(PyObject *_obj) +{ + return 0; +} + PyObject* -Py_excepthandler_New(PyObject* type, PyObject* name, PyObject* body) +Py_Param_New() { - struct _excepthandler *result = PyObject_New(struct _excepthandler, &Py_excepthandler_Type); + struct _Param *result = PyObject_New(struct _Param, &Py_Param_Type); if (result == NULL) return NULL; - Py_INCREF(type); - result->type = type; - Py_INCREF(name); - result->name = name; - Py_INCREF(body); - result->body = body; return (PyObject*)result; } static void -excepthandler_dealloc(PyObject* _self) +Param_dealloc(PyObject* _self) { - struct _excepthandler *self = (struct _excepthandler*)_self; - Py_DECREF(self->type); - Py_DECREF(self->name); - Py_DECREF(self->body); + struct _Param *self = (struct _Param*)_self; PyObject_Del(self); } -PyTypeObject Py_excepthandler_Type = { +PyTypeObject Py_Param_Type = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ - "excepthandler", /*tp_name*/ - sizeof(struct _excepthandler), /*tp_basicsize*/ + "Param", /*tp_name*/ + sizeof(struct _Param), /*tp_basicsize*/ 0, /* tp_itemsize */ - excepthandler_dealloc, /*tp_dealloc*/ + Param_dealloc, /*tp_dealloc*/ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -3524,17 +4783,2731 @@ 0, /* tp_is_gc */ }; -PyObject* -Py_arguments_New(PyObject* args, PyObject* vararg, PyObject* kwarg, PyObject* - defaults) +static int +Param_validate(PyObject *_obj) { - struct _arguments *result = PyObject_New(struct _arguments, &Py_arguments_Type); - if (result == NULL) - return NULL; - Py_INCREF(args); - result->args = args; - Py_INCREF(vararg); - result->vararg = vararg; + return 0; +} + +#define slice_dealloc 0 +PyTypeObject Py_slice_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "slice", /*tp_name*/ + sizeof(struct _slice), /*tp_basicsize*/ + 0, /* tp_itemsize */ + slice_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +int +slice_validate(PyObject* _obj) +{ + struct _slice *obj = (struct _slice*)_obj; + assert(slice_Check(_obj)); + switch(obj->_kind) { + case Ellipsis_kind: + return Ellipsis_validate(_obj); + case Slice_kind: + return Slice_validate(_obj); + case ExtSlice_kind: + return ExtSlice_validate(_obj); + case Index_kind: + return Index_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in slice"); + return -1; +} +PyObject* +Py_Ellipsis_New() +{ + struct _Ellipsis *result = PyObject_New(struct _Ellipsis, &Py_Ellipsis_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Ellipsis_dealloc(PyObject* _self) +{ + struct _Ellipsis *self = (struct _Ellipsis*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Ellipsis_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Ellipsis", /*tp_name*/ + sizeof(struct _Ellipsis), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Ellipsis_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Ellipsis_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Slice_New(PyObject* lower, PyObject* upper, PyObject* step) +{ + struct _Slice *result = PyObject_New(struct _Slice, &Py_Slice_Type); + if (result == NULL) + return NULL; + Py_INCREF(lower); + result->lower = lower; + Py_INCREF(upper); + result->upper = upper; + Py_INCREF(step); + result->step = step; + return (PyObject*)result; +} + +static void +Slice_dealloc(PyObject* _self) +{ + struct _Slice *self = (struct _Slice*)_self; + Py_DECREF(self->lower); + Py_DECREF(self->upper); + Py_DECREF(self->step); + PyObject_Del(self); +} + +PyTypeObject Py_Slice_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Slice", /*tp_name*/ + sizeof(struct _Slice), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Slice_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Slice_validate(PyObject *_obj) +{ + struct _Slice *obj = (struct _Slice*)_obj; + if (obj->lower != Py_None) /* empty */; + else if (!expr_Check(obj->lower)) { + failed_check("lower", "expr", obj->lower); + return -1; + } + else if (expr_validate(obj->lower) < 0) + return -1; + if (obj->upper != Py_None) /* empty */; + else if (!expr_Check(obj->upper)) { + failed_check("upper", "expr", obj->upper); + return -1; + } + else if (expr_validate(obj->upper) < 0) + return -1; + if (obj->step != Py_None) /* empty */; + else if (!expr_Check(obj->step)) { + failed_check("step", "expr", obj->step); + return -1; + } + else if (expr_validate(obj->step) < 0) + return -1; + return 0; +} + +PyObject* +Py_ExtSlice_New(PyObject* dims) +{ + struct _ExtSlice *result = PyObject_New(struct _ExtSlice, &Py_ExtSlice_Type); + if (result == NULL) + return NULL; + Py_INCREF(dims); + result->dims = dims; + return (PyObject*)result; +} + +static void +ExtSlice_dealloc(PyObject* _self) +{ + struct _ExtSlice *self = (struct _ExtSlice*)_self; + Py_DECREF(self->dims); + PyObject_Del(self); +} + +PyTypeObject Py_ExtSlice_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "ExtSlice", /*tp_name*/ + sizeof(struct _ExtSlice), /*tp_basicsize*/ + 0, /* tp_itemsize */ + ExtSlice_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +ExtSlice_validate(PyObject *_obj) +{ + struct _ExtSlice *obj = (struct _ExtSlice*)_obj; + int i; + if (!PyList_Check(obj->dims)) { + failed_check("dims", "list", obj->dims); + return -1; + } + for(i = 0; i < PyList_Size(obj->dims); i++) { + if (!slice_Check(PyList_GET_ITEM(obj->dims, i))) { + failed_check("dims", "slice", PyList_GET_ITEM(obj->dims, + i)); + return -1; + } + if (slice_validate(PyList_GET_ITEM(obj->dims, i)) < 0) + return -1; + } + return 0; +} + +PyObject* +Py_Index_New(PyObject* value) +{ + struct _Index *result = PyObject_New(struct _Index, &Py_Index_Type); + if (result == NULL) + return NULL; + Py_INCREF(value); + result->value = value; + return (PyObject*)result; +} + +static void +Index_dealloc(PyObject* _self) +{ + struct _Index *self = (struct _Index*)_self; + Py_DECREF(self->value); + PyObject_Del(self); +} + +PyTypeObject Py_Index_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Index", /*tp_name*/ + sizeof(struct _Index), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Index_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Index_validate(PyObject *_obj) +{ + struct _Index *obj = (struct _Index*)_obj; + if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + return 0; +} + +#define boolop_dealloc 0 +PyTypeObject Py_boolop_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "boolop", /*tp_name*/ + sizeof(struct _boolop), /*tp_basicsize*/ + 0, /* tp_itemsize */ + boolop_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +int +boolop_validate(PyObject* _obj) +{ + struct _boolop *obj = (struct _boolop*)_obj; + assert(boolop_Check(_obj)); + switch(obj->_kind) { + case And_kind: + return And_validate(_obj); + case Or_kind: + return Or_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in boolop"); + return -1; +} +PyObject* +Py_And_New() +{ + struct _And *result = PyObject_New(struct _And, &Py_And_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +And_dealloc(PyObject* _self) +{ + struct _And *self = (struct _And*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_And_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "And", /*tp_name*/ + sizeof(struct _And), /*tp_basicsize*/ + 0, /* tp_itemsize */ + And_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +And_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Or_New() +{ + struct _Or *result = PyObject_New(struct _Or, &Py_Or_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Or_dealloc(PyObject* _self) +{ + struct _Or *self = (struct _Or*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Or_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Or", /*tp_name*/ + sizeof(struct _Or), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Or_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Or_validate(PyObject *_obj) +{ + return 0; +} + +#define operator_dealloc 0 +PyTypeObject Py_operator_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "operator", /*tp_name*/ + sizeof(struct _operator), /*tp_basicsize*/ + 0, /* tp_itemsize */ + operator_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +int +operator_validate(PyObject* _obj) +{ + struct _operator *obj = (struct _operator*)_obj; + assert(operator_Check(_obj)); + switch(obj->_kind) { + case Add_kind: + return Add_validate(_obj); + case Sub_kind: + return Sub_validate(_obj); + case Mult_kind: + return Mult_validate(_obj); + case Div_kind: + return Div_validate(_obj); + case Mod_kind: + return Mod_validate(_obj); + case Pow_kind: + return Pow_validate(_obj); + case LShift_kind: + return LShift_validate(_obj); + case RShift_kind: + return RShift_validate(_obj); + case BitOr_kind: + return BitOr_validate(_obj); + case BitXor_kind: + return BitXor_validate(_obj); + case BitAnd_kind: + return BitAnd_validate(_obj); + case FloorDiv_kind: + return FloorDiv_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in operator"); + return -1; +} +PyObject* +Py_Add_New() +{ + struct _Add *result = PyObject_New(struct _Add, &Py_Add_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Add_dealloc(PyObject* _self) +{ + struct _Add *self = (struct _Add*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Add_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Add", /*tp_name*/ + sizeof(struct _Add), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Add_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Add_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Sub_New() +{ + struct _Sub *result = PyObject_New(struct _Sub, &Py_Sub_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Sub_dealloc(PyObject* _self) +{ + struct _Sub *self = (struct _Sub*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Sub_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Sub", /*tp_name*/ + sizeof(struct _Sub), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Sub_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Sub_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Mult_New() +{ + struct _Mult *result = PyObject_New(struct _Mult, &Py_Mult_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Mult_dealloc(PyObject* _self) +{ + struct _Mult *self = (struct _Mult*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Mult_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Mult", /*tp_name*/ + sizeof(struct _Mult), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Mult_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Mult_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Div_New() +{ + struct _Div *result = PyObject_New(struct _Div, &Py_Div_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Div_dealloc(PyObject* _self) +{ + struct _Div *self = (struct _Div*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Div_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Div", /*tp_name*/ + sizeof(struct _Div), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Div_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Div_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Mod_New() +{ + struct _Mod *result = PyObject_New(struct _Mod, &Py_Mod_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Mod_dealloc(PyObject* _self) +{ + struct _Mod *self = (struct _Mod*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Mod_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Mod", /*tp_name*/ + sizeof(struct _Mod), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Mod_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Mod_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Pow_New() +{ + struct _Pow *result = PyObject_New(struct _Pow, &Py_Pow_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Pow_dealloc(PyObject* _self) +{ + struct _Pow *self = (struct _Pow*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Pow_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Pow", /*tp_name*/ + sizeof(struct _Pow), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Pow_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Pow_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_LShift_New() +{ + struct _LShift *result = PyObject_New(struct _LShift, &Py_LShift_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +LShift_dealloc(PyObject* _self) +{ + struct _LShift *self = (struct _LShift*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_LShift_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "LShift", /*tp_name*/ + sizeof(struct _LShift), /*tp_basicsize*/ + 0, /* tp_itemsize */ + LShift_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +LShift_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_RShift_New() +{ + struct _RShift *result = PyObject_New(struct _RShift, &Py_RShift_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +RShift_dealloc(PyObject* _self) +{ + struct _RShift *self = (struct _RShift*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_RShift_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "RShift", /*tp_name*/ + sizeof(struct _RShift), /*tp_basicsize*/ + 0, /* tp_itemsize */ + RShift_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +RShift_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_BitOr_New() +{ + struct _BitOr *result = PyObject_New(struct _BitOr, &Py_BitOr_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +BitOr_dealloc(PyObject* _self) +{ + struct _BitOr *self = (struct _BitOr*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_BitOr_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "BitOr", /*tp_name*/ + sizeof(struct _BitOr), /*tp_basicsize*/ + 0, /* tp_itemsize */ + BitOr_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +BitOr_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_BitXor_New() +{ + struct _BitXor *result = PyObject_New(struct _BitXor, &Py_BitXor_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +BitXor_dealloc(PyObject* _self) +{ + struct _BitXor *self = (struct _BitXor*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_BitXor_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "BitXor", /*tp_name*/ + sizeof(struct _BitXor), /*tp_basicsize*/ + 0, /* tp_itemsize */ + BitXor_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +BitXor_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_BitAnd_New() +{ + struct _BitAnd *result = PyObject_New(struct _BitAnd, &Py_BitAnd_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +BitAnd_dealloc(PyObject* _self) +{ + struct _BitAnd *self = (struct _BitAnd*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_BitAnd_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "BitAnd", /*tp_name*/ + sizeof(struct _BitAnd), /*tp_basicsize*/ + 0, /* tp_itemsize */ + BitAnd_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +BitAnd_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_FloorDiv_New() +{ + struct _FloorDiv *result = PyObject_New(struct _FloorDiv, &Py_FloorDiv_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +FloorDiv_dealloc(PyObject* _self) +{ + struct _FloorDiv *self = (struct _FloorDiv*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_FloorDiv_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "FloorDiv", /*tp_name*/ + sizeof(struct _FloorDiv), /*tp_basicsize*/ + 0, /* tp_itemsize */ + FloorDiv_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +FloorDiv_validate(PyObject *_obj) +{ + return 0; +} + +#define unaryop_dealloc 0 +PyTypeObject Py_unaryop_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "unaryop", /*tp_name*/ + sizeof(struct _unaryop), /*tp_basicsize*/ + 0, /* tp_itemsize */ + unaryop_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +int +unaryop_validate(PyObject* _obj) +{ + struct _unaryop *obj = (struct _unaryop*)_obj; + assert(unaryop_Check(_obj)); + switch(obj->_kind) { + case Invert_kind: + return Invert_validate(_obj); + case Not_kind: + return Not_validate(_obj); + case UAdd_kind: + return UAdd_validate(_obj); + case USub_kind: + return USub_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in unaryop"); + return -1; +} +PyObject* +Py_Invert_New() +{ + struct _Invert *result = PyObject_New(struct _Invert, &Py_Invert_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Invert_dealloc(PyObject* _self) +{ + struct _Invert *self = (struct _Invert*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Invert_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Invert", /*tp_name*/ + sizeof(struct _Invert), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Invert_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Invert_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Not_New() +{ + struct _Not *result = PyObject_New(struct _Not, &Py_Not_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Not_dealloc(PyObject* _self) +{ + struct _Not *self = (struct _Not*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Not_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Not", /*tp_name*/ + sizeof(struct _Not), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Not_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Not_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_UAdd_New() +{ + struct _UAdd *result = PyObject_New(struct _UAdd, &Py_UAdd_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +UAdd_dealloc(PyObject* _self) +{ + struct _UAdd *self = (struct _UAdd*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_UAdd_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "UAdd", /*tp_name*/ + sizeof(struct _UAdd), /*tp_basicsize*/ + 0, /* tp_itemsize */ + UAdd_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +UAdd_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_USub_New() +{ + struct _USub *result = PyObject_New(struct _USub, &Py_USub_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +USub_dealloc(PyObject* _self) +{ + struct _USub *self = (struct _USub*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_USub_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "USub", /*tp_name*/ + sizeof(struct _USub), /*tp_basicsize*/ + 0, /* tp_itemsize */ + USub_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +USub_validate(PyObject *_obj) +{ + return 0; +} + +#define cmpop_dealloc 0 +PyTypeObject Py_cmpop_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "cmpop", /*tp_name*/ + sizeof(struct _cmpop), /*tp_basicsize*/ + 0, /* tp_itemsize */ + cmpop_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +int +cmpop_validate(PyObject* _obj) +{ + struct _cmpop *obj = (struct _cmpop*)_obj; + assert(cmpop_Check(_obj)); + switch(obj->_kind) { + case Eq_kind: + return Eq_validate(_obj); + case NotEq_kind: + return NotEq_validate(_obj); + case Lt_kind: + return Lt_validate(_obj); + case LtE_kind: + return LtE_validate(_obj); + case Gt_kind: + return Gt_validate(_obj); + case GtE_kind: + return GtE_validate(_obj); + case Is_kind: + return Is_validate(_obj); + case IsNot_kind: + return IsNot_validate(_obj); + case In_kind: + return In_validate(_obj); + case NotIn_kind: + return NotIn_validate(_obj); + } + PyErr_SetString(PyExc_TypeError, "invalid _kind in cmpop"); + return -1; +} +PyObject* +Py_Eq_New() +{ + struct _Eq *result = PyObject_New(struct _Eq, &Py_Eq_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Eq_dealloc(PyObject* _self) +{ + struct _Eq *self = (struct _Eq*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Eq_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Eq", /*tp_name*/ + sizeof(struct _Eq), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Eq_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Eq_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_NotEq_New() +{ + struct _NotEq *result = PyObject_New(struct _NotEq, &Py_NotEq_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +NotEq_dealloc(PyObject* _self) +{ + struct _NotEq *self = (struct _NotEq*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_NotEq_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "NotEq", /*tp_name*/ + sizeof(struct _NotEq), /*tp_basicsize*/ + 0, /* tp_itemsize */ + NotEq_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +NotEq_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Lt_New() +{ + struct _Lt *result = PyObject_New(struct _Lt, &Py_Lt_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Lt_dealloc(PyObject* _self) +{ + struct _Lt *self = (struct _Lt*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Lt_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Lt", /*tp_name*/ + sizeof(struct _Lt), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Lt_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Lt_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_LtE_New() +{ + struct _LtE *result = PyObject_New(struct _LtE, &Py_LtE_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +LtE_dealloc(PyObject* _self) +{ + struct _LtE *self = (struct _LtE*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_LtE_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "LtE", /*tp_name*/ + sizeof(struct _LtE), /*tp_basicsize*/ + 0, /* tp_itemsize */ + LtE_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +LtE_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Gt_New() +{ + struct _Gt *result = PyObject_New(struct _Gt, &Py_Gt_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Gt_dealloc(PyObject* _self) +{ + struct _Gt *self = (struct _Gt*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Gt_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Gt", /*tp_name*/ + sizeof(struct _Gt), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Gt_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Gt_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_GtE_New() +{ + struct _GtE *result = PyObject_New(struct _GtE, &Py_GtE_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +GtE_dealloc(PyObject* _self) +{ + struct _GtE *self = (struct _GtE*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_GtE_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "GtE", /*tp_name*/ + sizeof(struct _GtE), /*tp_basicsize*/ + 0, /* tp_itemsize */ + GtE_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +GtE_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_Is_New() +{ + struct _Is *result = PyObject_New(struct _Is, &Py_Is_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +Is_dealloc(PyObject* _self) +{ + struct _Is *self = (struct _Is*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_Is_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Is", /*tp_name*/ + sizeof(struct _Is), /*tp_basicsize*/ + 0, /* tp_itemsize */ + Is_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +Is_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_IsNot_New() +{ + struct _IsNot *result = PyObject_New(struct _IsNot, &Py_IsNot_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +IsNot_dealloc(PyObject* _self) +{ + struct _IsNot *self = (struct _IsNot*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_IsNot_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "IsNot", /*tp_name*/ + sizeof(struct _IsNot), /*tp_basicsize*/ + 0, /* tp_itemsize */ + IsNot_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +IsNot_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_In_New() +{ + struct _In *result = PyObject_New(struct _In, &Py_In_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +In_dealloc(PyObject* _self) +{ + struct _In *self = (struct _In*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_In_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "In", /*tp_name*/ + sizeof(struct _In), /*tp_basicsize*/ + 0, /* tp_itemsize */ + In_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +In_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_NotIn_New() +{ + struct _NotIn *result = PyObject_New(struct _NotIn, &Py_NotIn_Type); + if (result == NULL) + return NULL; + return (PyObject*)result; +} + +static void +NotIn_dealloc(PyObject* _self) +{ + struct _NotIn *self = (struct _NotIn*)_self; + PyObject_Del(self); +} + +PyTypeObject Py_NotIn_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "NotIn", /*tp_name*/ + sizeof(struct _NotIn), /*tp_basicsize*/ + 0, /* tp_itemsize */ + NotIn_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +NotIn_validate(PyObject *_obj) +{ + return 0; +} + +PyObject* +Py_comprehension_New(PyObject* target, PyObject* iter, PyObject* ifs) +{ + struct _comprehension *result = PyObject_New(struct _comprehension, &Py_comprehension_Type); + if (result == NULL) + return NULL; + Py_INCREF(target); + result->target = target; + Py_INCREF(iter); + result->iter = iter; + Py_INCREF(ifs); + result->ifs = ifs; + return (PyObject*)result; +} + +static void +comprehension_dealloc(PyObject* _self) +{ + struct _comprehension *self = (struct _comprehension*)_self; + Py_DECREF(self->target); + Py_DECREF(self->iter); + Py_DECREF(self->ifs); + PyObject_Del(self); +} + +PyTypeObject Py_comprehension_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "comprehension", /*tp_name*/ + sizeof(struct _comprehension), /*tp_basicsize*/ + 0, /* tp_itemsize */ + comprehension_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +comprehension_validate(PyObject *_obj) +{ + struct _comprehension *obj = (struct _comprehension*)_obj; + int i; + if (!expr_Check(obj->target)) { + failed_check("target", "expr", obj->target); + return -1; + } + if (!expr_Check(obj->iter)) { + failed_check("iter", "expr", obj->iter); + return -1; + } + if (!PyList_Check(obj->ifs)) { + failed_check("ifs", "list", obj->ifs); + return -1; + } + for(i = 0; i < PyList_Size(obj->ifs); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->ifs, i))) { + failed_check("ifs", "expr", PyList_GET_ITEM(obj->ifs, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->ifs, i)) < 0) + return -1; + } + return 0; +} + +PyObject* +Py_excepthandler_New(PyObject* type, PyObject* name, PyObject* body) +{ + struct _excepthandler *result = PyObject_New(struct _excepthandler, &Py_excepthandler_Type); + if (result == NULL) + return NULL; + Py_INCREF(type); + result->type = type; + Py_INCREF(name); + result->name = name; + Py_INCREF(body); + result->body = body; + return (PyObject*)result; +} + +static void +excepthandler_dealloc(PyObject* _self) +{ + struct _excepthandler *self = (struct _excepthandler*)_self; + Py_DECREF(self->type); + Py_DECREF(self->name); + Py_DECREF(self->body); + PyObject_Del(self); +} + +PyTypeObject Py_excepthandler_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "excepthandler", /*tp_name*/ + sizeof(struct _excepthandler), /*tp_basicsize*/ + 0, /* tp_itemsize */ + excepthandler_dealloc, /*tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ +}; + +static int +excepthandler_validate(PyObject *_obj) +{ + struct _excepthandler *obj = (struct _excepthandler*)_obj; + int i; + if (obj->type != Py_None) /* empty */; + else if (!expr_Check(obj->type)) { + failed_check("type", "expr", obj->type); + return -1; + } + else if (expr_validate(obj->type) < 0) + return -1; + if (obj->name != Py_None) /* empty */; + else if (!expr_Check(obj->name)) { + failed_check("name", "expr", obj->name); + return -1; + } + else if (expr_validate(obj->name) < 0) + return -1; + if (!PyList_Check(obj->body)) { + failed_check("body", "list", obj->body); + return -1; + } + for(i = 0; i < PyList_Size(obj->body); i++) { + if (!stmt_Check(PyList_GET_ITEM(obj->body, i))) { + failed_check("body", "stmt", PyList_GET_ITEM(obj->body, i)); + return -1; + } + if (stmt_validate(PyList_GET_ITEM(obj->body, i)) < 0) + return -1; + } + return 0; +} + +PyObject* +Py_arguments_New(PyObject* args, PyObject* vararg, PyObject* kwarg, PyObject* + defaults) +{ + struct _arguments *result = PyObject_New(struct _arguments, &Py_arguments_Type); + if (result == NULL) + return NULL; + Py_INCREF(args); + result->args = args; + Py_INCREF(vararg); + result->vararg = vararg; Py_INCREF(kwarg); result->kwarg = kwarg; Py_INCREF(defaults); @@ -3597,6 +7570,49 @@ 0, /* tp_is_gc */ }; +static int +arguments_validate(PyObject *_obj) +{ + struct _arguments *obj = (struct _arguments*)_obj; + int i; + if (!PyList_Check(obj->args)) { + failed_check("args", "list", obj->args); + return -1; + } + for(i = 0; i < PyList_Size(obj->args); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->args, i))) { + failed_check("args", "expr", PyList_GET_ITEM(obj->args, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->args, i)) < 0) + return -1; + } + if (obj->vararg != Py_None) /* empty */; + else if (!PyString_Check(obj->vararg)) { + failed_check("vararg", "identifier", obj->vararg); + return -1; + } + if (obj->kwarg != Py_None) /* empty */; + else if (!PyString_Check(obj->kwarg)) { + failed_check("kwarg", "identifier", obj->kwarg); + return -1; + } + if (!PyList_Check(obj->defaults)) { + failed_check("defaults", "list", obj->defaults); + return -1; + } + for(i = 0; i < PyList_Size(obj->defaults); i++) { + if (!expr_Check(PyList_GET_ITEM(obj->defaults, i))) { + failed_check("defaults", "expr", + PyList_GET_ITEM(obj->defaults, i)); + return -1; + } + if (expr_validate(PyList_GET_ITEM(obj->defaults, i)) < 0) + return -1; + } + return 0; +} + PyObject* Py_keyword_New(PyObject* arg, PyObject* value) { @@ -3663,6 +7679,21 @@ 0, /* tp_is_gc */ }; +static int +keyword_validate(PyObject *_obj) +{ + struct _keyword *obj = (struct _keyword*)_obj; + if (!PyString_Check(obj->arg)) { + failed_check("arg", "identifier", obj->arg); + return -1; + } + if (!expr_Check(obj->value)) { + failed_check("value", "expr", obj->value); + return -1; + } + return 0; +} + PyObject* Py_alias_New(PyObject* name, PyObject* asname) { @@ -3729,6 +7760,58 @@ 0, /* tp_is_gc */ }; +static int +alias_validate(PyObject *_obj) +{ + struct _alias *obj = (struct _alias*)_obj; + if (!PyString_Check(obj->name)) { + failed_check("name", "identifier", obj->name); + return -1; + } + if (obj->asname != Py_None) /* empty */; + else if (!PyString_Check(obj->asname)) { + failed_check("asname", "identifier", obj->asname); + return -1; + } + return 0; +} + + +int PyAST_Validate(PyObject *obj) +{ + if (mod_Check(obj)) + return mod_validate(obj); + if (stmt_Check(obj)) + return stmt_validate(obj); + if (expr_Check(obj)) + return expr_validate(obj); + if (expr_context_Check(obj)) + return expr_context_validate(obj); + if (slice_Check(obj)) + return slice_validate(obj); + if (boolop_Check(obj)) + return boolop_validate(obj); + if (operator_Check(obj)) + return operator_validate(obj); + if (unaryop_Check(obj)) + return unaryop_validate(obj); + if (cmpop_Check(obj)) + return cmpop_validate(obj); + if (comprehension_Check(obj)) + return comprehension_validate(obj); + if (excepthandler_Check(obj)) + return excepthandler_validate(obj); + if (arguments_Check(obj)) + return arguments_validate(obj); + if (keyword_Check(obj)) + return keyword_validate(obj); + if (alias_Check(obj)) + return alias_validate(obj); + PyErr_Format(PyExc_TypeError, "Not an AST node: %s", + obj->ob_type->tp_name); + return -1; +} + void init_ast(void) { @@ -3870,6 +7953,26 @@ Py_Tuple_Type.tp_base = &Py_expr_Type; if (PyType_Ready(&Py_Tuple_Type) < 0) return; + if (PyType_Ready(&Py_expr_context_Type) < 0) + return; + Py_Load_Type.tp_base = &Py_expr_context_Type; + if (PyType_Ready(&Py_Load_Type) < 0) + return; + Py_Store_Type.tp_base = &Py_expr_context_Type; + if (PyType_Ready(&Py_Store_Type) < 0) + return; + Py_Del_Type.tp_base = &Py_expr_context_Type; + if (PyType_Ready(&Py_Del_Type) < 0) + return; + Py_AugLoad_Type.tp_base = &Py_expr_context_Type; + if (PyType_Ready(&Py_AugLoad_Type) < 0) + return; + Py_AugStore_Type.tp_base = &Py_expr_context_Type; + if (PyType_Ready(&Py_AugStore_Type) < 0) + return; + Py_Param_Type.tp_base = &Py_expr_context_Type; + if (PyType_Ready(&Py_Param_Type) < 0) + return; if (PyType_Ready(&Py_slice_Type) < 0) return; Py_Ellipsis_Type.tp_base = &Py_slice_Type; @@ -3884,6 +7987,98 @@ Py_Index_Type.tp_base = &Py_slice_Type; if (PyType_Ready(&Py_Index_Type) < 0) return; + if (PyType_Ready(&Py_boolop_Type) < 0) + return; + Py_And_Type.tp_base = &Py_boolop_Type; + if (PyType_Ready(&Py_And_Type) < 0) + return; + Py_Or_Type.tp_base = &Py_boolop_Type; + if (PyType_Ready(&Py_Or_Type) < 0) + return; + if (PyType_Ready(&Py_operator_Type) < 0) + return; + Py_Add_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_Add_Type) < 0) + return; + Py_Sub_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_Sub_Type) < 0) + return; + Py_Mult_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_Mult_Type) < 0) + return; + Py_Div_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_Div_Type) < 0) + return; + Py_Mod_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_Mod_Type) < 0) + return; + Py_Pow_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_Pow_Type) < 0) + return; + Py_LShift_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_LShift_Type) < 0) + return; + Py_RShift_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_RShift_Type) < 0) + return; + Py_BitOr_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_BitOr_Type) < 0) + return; + Py_BitXor_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_BitXor_Type) < 0) + return; + Py_BitAnd_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_BitAnd_Type) < 0) + return; + Py_FloorDiv_Type.tp_base = &Py_operator_Type; + if (PyType_Ready(&Py_FloorDiv_Type) < 0) + return; + if (PyType_Ready(&Py_unaryop_Type) < 0) + return; + Py_Invert_Type.tp_base = &Py_unaryop_Type; + if (PyType_Ready(&Py_Invert_Type) < 0) + return; + Py_Not_Type.tp_base = &Py_unaryop_Type; + if (PyType_Ready(&Py_Not_Type) < 0) + return; + Py_UAdd_Type.tp_base = &Py_unaryop_Type; + if (PyType_Ready(&Py_UAdd_Type) < 0) + return; + Py_USub_Type.tp_base = &Py_unaryop_Type; + if (PyType_Ready(&Py_USub_Type) < 0) + return; + if (PyType_Ready(&Py_cmpop_Type) < 0) + return; + Py_Eq_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_Eq_Type) < 0) + return; + Py_NotEq_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_NotEq_Type) < 0) + return; + Py_Lt_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_Lt_Type) < 0) + return; + Py_LtE_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_LtE_Type) < 0) + return; + Py_Gt_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_Gt_Type) < 0) + return; + Py_GtE_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_GtE_Type) < 0) + return; + Py_Is_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_Is_Type) < 0) + return; + Py_IsNot_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_IsNot_Type) < 0) + return; + Py_In_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_In_Type) < 0) + return; + Py_NotIn_Type.tp_base = &Py_cmpop_Type; + if (PyType_Ready(&Py_NotIn_Type) < 0) + return; if (PyType_Ready(&Py_comprehension_Type) < 0) return; if (PyType_Ready(&Py_excepthandler_Type) < 0) From python-checkins at python.org Fri Dec 2 14:43:12 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Fri, 2 Dec 2005 14:43:12 +0100 (CET) Subject: [Python-checkins] commit of r41579 - python/trunk/Doc/info/python.dir Message-ID: <20051202134312.C24AA1E400A@bag.python.org> Author: reinhold.birkenfeld Date: Fri Dec 2 14:43:08 2005 New Revision: 41579 Modified: python/trunk/Doc/info/python.dir Log: Bug #1368481: python.dir refers to whatsnew23 Modified: python/trunk/Doc/info/python.dir ============================================================================== --- python/trunk/Doc/info/python.dir (original) +++ python/trunk/Doc/info/python.dir Fri Dec 2 14:43:08 2005 @@ -1,7 +1,7 @@ Python Standard Documentation -* What's New: (python-whatsnew23). What's New in Python 2.3? +* What's New: (python-whatsnew25). What's New in Python 2.5? * Python Library: (python-lib). Python Library Reference * Python Mac Modules: (python-mac). Python Macintosh Modules * Python Reference: (python-ref). Python Reference Manual From python-checkins at python.org Fri Dec 2 14:43:16 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Fri, 2 Dec 2005 14:43:16 +0100 (CET) Subject: [Python-checkins] commit of r41580 - python/branches/release24-maint/Doc/info/python.dir Message-ID: <20051202134316.226DC1E400A@bag.python.org> Author: reinhold.birkenfeld Date: Fri Dec 2 14:43:10 2005 New Revision: 41580 Modified: python/branches/release24-maint/Doc/info/python.dir Log: Bug #1368481: python.dir refers to whatsnew23 Modified: python/branches/release24-maint/Doc/info/python.dir ============================================================================== --- python/branches/release24-maint/Doc/info/python.dir (original) +++ python/branches/release24-maint/Doc/info/python.dir Fri Dec 2 14:43:10 2005 @@ -1,7 +1,7 @@ Python Standard Documentation -* What's New: (python-whatsnew23). What's New in Python 2.3? +* What's New: (python-whatsnew24). What's New in Python 2.4? * Python Library: (python-lib). Python Library Reference * Python Mac Modules: (python-mac). Python Macintosh Modules * Python Reference: (python-ref). Python Reference Manual From python-checkins at python.org Sat Dec 3 10:38:55 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 3 Dec 2005 10:38:55 +0100 (CET) Subject: [Python-checkins] commit of r41581 - in python/branches/ast-objects: Include/Python-ast.h Parser/asdl_c.py Python/Python-ast.c Message-ID: <20051203093855.34BC81E4009@bag.python.org> Author: martin.v.loewis Date: Sat Dec 3 10:38:50 2005 New Revision: 41581 Modified: python/branches/ast-objects/Include/Python-ast.h python/branches/ast-objects/Parser/asdl_c.py python/branches/ast-objects/Python/Python-ast.c Log: Add field accessor macros. Add create macros for products. Allow passing NULL for optional and list projections. Modified: python/branches/ast-objects/Include/Python-ast.h ============================================================================== --- python/branches/ast-objects/Include/Python-ast.h (original) +++ python/branches/ast-objects/Include/Python-ast.h Sat Dec 3 10:38:50 2005 @@ -11,6 +11,7 @@ PyObject_HEAD enum {Module_kind, Interactive_kind, Expression_kind, Suite_kind} _kind; }; +#define mod_kind(o) (((struct _mod*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_Module_Type; #define Module_Check(op) PyObject_TypeCheck(op, &Py_Module_Type) @@ -21,6 +22,7 @@ }; PyObject *Py_Module_New(PyObject*); #define Module Py_Module_New +#define Module_body(o) (((struct _Module*)o)->body) PyAPI_DATA(PyTypeObject) Py_Interactive_Type; #define Interactive_Check(op) PyObject_TypeCheck(op, &Py_Interactive_Type) @@ -31,6 +33,7 @@ }; PyObject *Py_Interactive_New(PyObject*); #define Interactive Py_Interactive_New +#define Interactive_body(o) (((struct _Interactive*)o)->body) PyAPI_DATA(PyTypeObject) Py_Expression_Type; #define Expression_Check(op) PyObject_TypeCheck(op, &Py_Expression_Type) @@ -41,6 +44,7 @@ }; PyObject *Py_Expression_New(PyObject*); #define Expression Py_Expression_New +#define Expression_body(o) (((struct _Expression*)o)->body) PyAPI_DATA(PyTypeObject) Py_Suite_Type; #define Suite_Check(op) PyObject_TypeCheck(op, &Py_Suite_Type) @@ -51,6 +55,7 @@ }; PyObject *Py_Suite_New(PyObject*); #define Suite Py_Suite_New +#define Suite_body(o) (((struct _Suite*)o)->body) PyAPI_DATA(PyTypeObject) Py_stmt_Type; #define stmt_Check(op) PyObject_TypeCheck(op, &Py_stmt_Type) @@ -65,6 +70,7 @@ _kind; int lineno; }; +#define stmt_kind(o) (((struct _stmt*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_FunctionDef_Type; #define FunctionDef_Check(op) PyObject_TypeCheck(op, &Py_FunctionDef_Type) @@ -78,6 +84,10 @@ }; PyObject *Py_FunctionDef_New(PyObject*, PyObject*, PyObject*, PyObject*, int); #define FunctionDef Py_FunctionDef_New +#define FunctionDef_name(o) (((struct _FunctionDef*)o)->name) +#define FunctionDef_args(o) (((struct _FunctionDef*)o)->args) +#define FunctionDef_body(o) (((struct _FunctionDef*)o)->body) +#define FunctionDef_decorators(o) (((struct _FunctionDef*)o)->decorators) PyAPI_DATA(PyTypeObject) Py_ClassDef_Type; #define ClassDef_Check(op) PyObject_TypeCheck(op, &Py_ClassDef_Type) @@ -90,6 +100,9 @@ }; PyObject *Py_ClassDef_New(PyObject*, PyObject*, PyObject*, int); #define ClassDef Py_ClassDef_New +#define ClassDef_name(o) (((struct _ClassDef*)o)->name) +#define ClassDef_bases(o) (((struct _ClassDef*)o)->bases) +#define ClassDef_body(o) (((struct _ClassDef*)o)->body) PyAPI_DATA(PyTypeObject) Py_Return_Type; #define Return_Check(op) PyObject_TypeCheck(op, &Py_Return_Type) @@ -100,6 +113,7 @@ }; PyObject *Py_Return_New(PyObject*, int); #define Return Py_Return_New +#define Return_value(o) (((struct _Return*)o)->value) PyAPI_DATA(PyTypeObject) Py_Delete_Type; #define Delete_Check(op) PyObject_TypeCheck(op, &Py_Delete_Type) @@ -110,6 +124,7 @@ }; PyObject *Py_Delete_New(PyObject*, int); #define Delete Py_Delete_New +#define Delete_targets(o) (((struct _Delete*)o)->targets) PyAPI_DATA(PyTypeObject) Py_Assign_Type; #define Assign_Check(op) PyObject_TypeCheck(op, &Py_Assign_Type) @@ -121,6 +136,8 @@ }; PyObject *Py_Assign_New(PyObject*, PyObject*, int); #define Assign Py_Assign_New +#define Assign_targets(o) (((struct _Assign*)o)->targets) +#define Assign_value(o) (((struct _Assign*)o)->value) PyAPI_DATA(PyTypeObject) Py_AugAssign_Type; #define AugAssign_Check(op) PyObject_TypeCheck(op, &Py_AugAssign_Type) @@ -133,6 +150,9 @@ }; PyObject *Py_AugAssign_New(PyObject*, PyObject*, PyObject*, int); #define AugAssign Py_AugAssign_New +#define AugAssign_target(o) (((struct _AugAssign*)o)->target) +#define AugAssign_op(o) (((struct _AugAssign*)o)->op) +#define AugAssign_value(o) (((struct _AugAssign*)o)->value) PyAPI_DATA(PyTypeObject) Py_Print_Type; #define Print_Check(op) PyObject_TypeCheck(op, &Py_Print_Type) @@ -145,6 +165,9 @@ }; PyObject *Py_Print_New(PyObject*, PyObject*, PyObject*, int); #define Print Py_Print_New +#define Print_dest(o) (((struct _Print*)o)->dest) +#define Print_values(o) (((struct _Print*)o)->values) +#define Print_nl(o) (((struct _Print*)o)->nl) PyAPI_DATA(PyTypeObject) Py_For_Type; #define For_Check(op) PyObject_TypeCheck(op, &Py_For_Type) @@ -158,6 +181,10 @@ }; PyObject *Py_For_New(PyObject*, PyObject*, PyObject*, PyObject*, int); #define For Py_For_New +#define For_target(o) (((struct _For*)o)->target) +#define For_iter(o) (((struct _For*)o)->iter) +#define For_body(o) (((struct _For*)o)->body) +#define For_orelse(o) (((struct _For*)o)->orelse) PyAPI_DATA(PyTypeObject) Py_While_Type; #define While_Check(op) PyObject_TypeCheck(op, &Py_While_Type) @@ -170,6 +197,9 @@ }; PyObject *Py_While_New(PyObject*, PyObject*, PyObject*, int); #define While Py_While_New +#define While_test(o) (((struct _While*)o)->test) +#define While_body(o) (((struct _While*)o)->body) +#define While_orelse(o) (((struct _While*)o)->orelse) PyAPI_DATA(PyTypeObject) Py_If_Type; #define If_Check(op) PyObject_TypeCheck(op, &Py_If_Type) @@ -182,6 +212,9 @@ }; PyObject *Py_If_New(PyObject*, PyObject*, PyObject*, int); #define If Py_If_New +#define If_test(o) (((struct _If*)o)->test) +#define If_body(o) (((struct _If*)o)->body) +#define If_orelse(o) (((struct _If*)o)->orelse) PyAPI_DATA(PyTypeObject) Py_Raise_Type; #define Raise_Check(op) PyObject_TypeCheck(op, &Py_Raise_Type) @@ -194,6 +227,9 @@ }; PyObject *Py_Raise_New(PyObject*, PyObject*, PyObject*, int); #define Raise Py_Raise_New +#define Raise_type(o) (((struct _Raise*)o)->type) +#define Raise_inst(o) (((struct _Raise*)o)->inst) +#define Raise_tback(o) (((struct _Raise*)o)->tback) PyAPI_DATA(PyTypeObject) Py_TryExcept_Type; #define TryExcept_Check(op) PyObject_TypeCheck(op, &Py_TryExcept_Type) @@ -206,6 +242,9 @@ }; PyObject *Py_TryExcept_New(PyObject*, PyObject*, PyObject*, int); #define TryExcept Py_TryExcept_New +#define TryExcept_body(o) (((struct _TryExcept*)o)->body) +#define TryExcept_handlers(o) (((struct _TryExcept*)o)->handlers) +#define TryExcept_orelse(o) (((struct _TryExcept*)o)->orelse) PyAPI_DATA(PyTypeObject) Py_TryFinally_Type; #define TryFinally_Check(op) PyObject_TypeCheck(op, &Py_TryFinally_Type) @@ -217,6 +256,8 @@ }; PyObject *Py_TryFinally_New(PyObject*, PyObject*, int); #define TryFinally Py_TryFinally_New +#define TryFinally_body(o) (((struct _TryFinally*)o)->body) +#define TryFinally_finalbody(o) (((struct _TryFinally*)o)->finalbody) PyAPI_DATA(PyTypeObject) Py_Assert_Type; #define Assert_Check(op) PyObject_TypeCheck(op, &Py_Assert_Type) @@ -228,6 +269,8 @@ }; PyObject *Py_Assert_New(PyObject*, PyObject*, int); #define Assert Py_Assert_New +#define Assert_test(o) (((struct _Assert*)o)->test) +#define Assert_msg(o) (((struct _Assert*)o)->msg) PyAPI_DATA(PyTypeObject) Py_Import_Type; #define Import_Check(op) PyObject_TypeCheck(op, &Py_Import_Type) @@ -238,6 +281,7 @@ }; PyObject *Py_Import_New(PyObject*, int); #define Import Py_Import_New +#define Import_names(o) (((struct _Import*)o)->names) PyAPI_DATA(PyTypeObject) Py_ImportFrom_Type; #define ImportFrom_Check(op) PyObject_TypeCheck(op, &Py_ImportFrom_Type) @@ -249,6 +293,8 @@ }; PyObject *Py_ImportFrom_New(PyObject*, PyObject*, int); #define ImportFrom Py_ImportFrom_New +#define ImportFrom_module(o) (((struct _ImportFrom*)o)->module) +#define ImportFrom_names(o) (((struct _ImportFrom*)o)->names) PyAPI_DATA(PyTypeObject) Py_Exec_Type; #define Exec_Check(op) PyObject_TypeCheck(op, &Py_Exec_Type) @@ -261,6 +307,9 @@ }; PyObject *Py_Exec_New(PyObject*, PyObject*, PyObject*, int); #define Exec Py_Exec_New +#define Exec_body(o) (((struct _Exec*)o)->body) +#define Exec_globals(o) (((struct _Exec*)o)->globals) +#define Exec_locals(o) (((struct _Exec*)o)->locals) PyAPI_DATA(PyTypeObject) Py_Global_Type; #define Global_Check(op) PyObject_TypeCheck(op, &Py_Global_Type) @@ -271,6 +320,7 @@ }; PyObject *Py_Global_New(PyObject*, int); #define Global Py_Global_New +#define Global_names(o) (((struct _Global*)o)->names) PyAPI_DATA(PyTypeObject) Py_Expr_Type; #define Expr_Check(op) PyObject_TypeCheck(op, &Py_Expr_Type) @@ -281,6 +331,7 @@ }; PyObject *Py_Expr_New(PyObject*, int); #define Expr Py_Expr_New +#define Expr_value(o) (((struct _Expr*)o)->value) PyAPI_DATA(PyTypeObject) Py_Pass_Type; #define Pass_Check(op) PyObject_TypeCheck(op, &Py_Pass_Type) @@ -320,6 +371,7 @@ Subscript_kind, Name_kind, List_kind, Tuple_kind} _kind; int lineno; }; +#define expr_kind(o) (((struct _expr*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_BoolOp_Type; #define BoolOp_Check(op) PyObject_TypeCheck(op, &Py_BoolOp_Type) @@ -331,6 +383,8 @@ }; PyObject *Py_BoolOp_New(PyObject*, PyObject*, int); #define BoolOp Py_BoolOp_New +#define BoolOp_op(o) (((struct _BoolOp*)o)->op) +#define BoolOp_values(o) (((struct _BoolOp*)o)->values) PyAPI_DATA(PyTypeObject) Py_BinOp_Type; #define BinOp_Check(op) PyObject_TypeCheck(op, &Py_BinOp_Type) @@ -343,6 +397,9 @@ }; PyObject *Py_BinOp_New(PyObject*, PyObject*, PyObject*, int); #define BinOp Py_BinOp_New +#define BinOp_left(o) (((struct _BinOp*)o)->left) +#define BinOp_op(o) (((struct _BinOp*)o)->op) +#define BinOp_right(o) (((struct _BinOp*)o)->right) PyAPI_DATA(PyTypeObject) Py_UnaryOp_Type; #define UnaryOp_Check(op) PyObject_TypeCheck(op, &Py_UnaryOp_Type) @@ -354,6 +411,8 @@ }; PyObject *Py_UnaryOp_New(PyObject*, PyObject*, int); #define UnaryOp Py_UnaryOp_New +#define UnaryOp_op(o) (((struct _UnaryOp*)o)->op) +#define UnaryOp_operand(o) (((struct _UnaryOp*)o)->operand) PyAPI_DATA(PyTypeObject) Py_Lambda_Type; #define Lambda_Check(op) PyObject_TypeCheck(op, &Py_Lambda_Type) @@ -365,6 +424,8 @@ }; PyObject *Py_Lambda_New(PyObject*, PyObject*, int); #define Lambda Py_Lambda_New +#define Lambda_args(o) (((struct _Lambda*)o)->args) +#define Lambda_body(o) (((struct _Lambda*)o)->body) PyAPI_DATA(PyTypeObject) Py_Dict_Type; #define Dict_Check(op) PyObject_TypeCheck(op, &Py_Dict_Type) @@ -376,6 +437,8 @@ }; PyObject *Py_Dict_New(PyObject*, PyObject*, int); #define Dict Py_Dict_New +#define Dict_keys(o) (((struct _Dict*)o)->keys) +#define Dict_values(o) (((struct _Dict*)o)->values) PyAPI_DATA(PyTypeObject) Py_ListComp_Type; #define ListComp_Check(op) PyObject_TypeCheck(op, &Py_ListComp_Type) @@ -387,6 +450,8 @@ }; PyObject *Py_ListComp_New(PyObject*, PyObject*, int); #define ListComp Py_ListComp_New +#define ListComp_elt(o) (((struct _ListComp*)o)->elt) +#define ListComp_generators(o) (((struct _ListComp*)o)->generators) PyAPI_DATA(PyTypeObject) Py_GeneratorExp_Type; #define GeneratorExp_Check(op) PyObject_TypeCheck(op, &Py_GeneratorExp_Type) @@ -398,6 +463,8 @@ }; PyObject *Py_GeneratorExp_New(PyObject*, PyObject*, int); #define GeneratorExp Py_GeneratorExp_New +#define GeneratorExp_elt(o) (((struct _GeneratorExp*)o)->elt) +#define GeneratorExp_generators(o) (((struct _GeneratorExp*)o)->generators) PyAPI_DATA(PyTypeObject) Py_Yield_Type; #define Yield_Check(op) PyObject_TypeCheck(op, &Py_Yield_Type) @@ -408,6 +475,7 @@ }; PyObject *Py_Yield_New(PyObject*, int); #define Yield Py_Yield_New +#define Yield_value(o) (((struct _Yield*)o)->value) PyAPI_DATA(PyTypeObject) Py_Compare_Type; #define Compare_Check(op) PyObject_TypeCheck(op, &Py_Compare_Type) @@ -420,6 +488,9 @@ }; PyObject *Py_Compare_New(PyObject*, PyObject*, PyObject*, int); #define Compare Py_Compare_New +#define Compare_left(o) (((struct _Compare*)o)->left) +#define Compare_ops(o) (((struct _Compare*)o)->ops) +#define Compare_comparators(o) (((struct _Compare*)o)->comparators) PyAPI_DATA(PyTypeObject) Py_Call_Type; #define Call_Check(op) PyObject_TypeCheck(op, &Py_Call_Type) @@ -435,6 +506,11 @@ PyObject *Py_Call_New(PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, int); #define Call Py_Call_New +#define Call_func(o) (((struct _Call*)o)->func) +#define Call_args(o) (((struct _Call*)o)->args) +#define Call_keywords(o) (((struct _Call*)o)->keywords) +#define Call_starargs(o) (((struct _Call*)o)->starargs) +#define Call_kwargs(o) (((struct _Call*)o)->kwargs) PyAPI_DATA(PyTypeObject) Py_Repr_Type; #define Repr_Check(op) PyObject_TypeCheck(op, &Py_Repr_Type) @@ -445,6 +521,7 @@ }; PyObject *Py_Repr_New(PyObject*, int); #define Repr Py_Repr_New +#define Repr_value(o) (((struct _Repr*)o)->value) PyAPI_DATA(PyTypeObject) Py_Num_Type; #define Num_Check(op) PyObject_TypeCheck(op, &Py_Num_Type) @@ -455,6 +532,7 @@ }; PyObject *Py_Num_New(PyObject*, int); #define Num Py_Num_New +#define Num_n(o) (((struct _Num*)o)->n) PyAPI_DATA(PyTypeObject) Py_Str_Type; #define Str_Check(op) PyObject_TypeCheck(op, &Py_Str_Type) @@ -465,6 +543,7 @@ }; PyObject *Py_Str_New(PyObject*, int); #define Str Py_Str_New +#define Str_s(o) (((struct _Str*)o)->s) PyAPI_DATA(PyTypeObject) Py_Attribute_Type; #define Attribute_Check(op) PyObject_TypeCheck(op, &Py_Attribute_Type) @@ -477,6 +556,9 @@ }; PyObject *Py_Attribute_New(PyObject*, PyObject*, PyObject*, int); #define Attribute Py_Attribute_New +#define Attribute_value(o) (((struct _Attribute*)o)->value) +#define Attribute_attr(o) (((struct _Attribute*)o)->attr) +#define Attribute_ctx(o) (((struct _Attribute*)o)->ctx) PyAPI_DATA(PyTypeObject) Py_Subscript_Type; #define Subscript_Check(op) PyObject_TypeCheck(op, &Py_Subscript_Type) @@ -489,6 +571,9 @@ }; PyObject *Py_Subscript_New(PyObject*, PyObject*, PyObject*, int); #define Subscript Py_Subscript_New +#define Subscript_value(o) (((struct _Subscript*)o)->value) +#define Subscript_slice(o) (((struct _Subscript*)o)->slice) +#define Subscript_ctx(o) (((struct _Subscript*)o)->ctx) PyAPI_DATA(PyTypeObject) Py_Name_Type; #define Name_Check(op) PyObject_TypeCheck(op, &Py_Name_Type) @@ -500,6 +585,8 @@ }; PyObject *Py_Name_New(PyObject*, PyObject*, int); #define Name Py_Name_New +#define Name_id(o) (((struct _Name*)o)->id) +#define Name_ctx(o) (((struct _Name*)o)->ctx) PyAPI_DATA(PyTypeObject) Py_List_Type; #define List_Check(op) PyObject_TypeCheck(op, &Py_List_Type) @@ -511,6 +598,8 @@ }; PyObject *Py_List_New(PyObject*, PyObject*, int); #define List Py_List_New +#define List_elts(o) (((struct _List*)o)->elts) +#define List_ctx(o) (((struct _List*)o)->ctx) PyAPI_DATA(PyTypeObject) Py_Tuple_Type; #define Tuple_Check(op) PyObject_TypeCheck(op, &Py_Tuple_Type) @@ -522,6 +611,8 @@ }; PyObject *Py_Tuple_New(PyObject*, PyObject*, int); #define Tuple Py_Tuple_New +#define Tuple_elts(o) (((struct _Tuple*)o)->elts) +#define Tuple_ctx(o) (((struct _Tuple*)o)->ctx) PyAPI_DATA(PyTypeObject) Py_expr_context_Type; #define expr_context_Check(op) PyObject_TypeCheck(op, &Py_expr_context_Type) @@ -531,6 +622,7 @@ enum {Load_kind, Store_kind, Del_kind, AugLoad_kind, AugStore_kind, Param_kind} _kind; }; +#define expr_context_kind(o) (((struct _expr_context*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_Load_Type; #define Load_Check(op) PyObject_TypeCheck(op, &Py_Load_Type) @@ -593,6 +685,7 @@ PyObject_HEAD enum {Ellipsis_kind, Slice_kind, ExtSlice_kind, Index_kind} _kind; }; +#define slice_kind(o) (((struct _slice*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_Ellipsis_Type; #define Ellipsis_Check(op) PyObject_TypeCheck(op, &Py_Ellipsis_Type) @@ -614,6 +707,9 @@ }; PyObject *Py_Slice_New(PyObject*, PyObject*, PyObject*); #define Slice Py_Slice_New +#define Slice_lower(o) (((struct _Slice*)o)->lower) +#define Slice_upper(o) (((struct _Slice*)o)->upper) +#define Slice_step(o) (((struct _Slice*)o)->step) PyAPI_DATA(PyTypeObject) Py_ExtSlice_Type; #define ExtSlice_Check(op) PyObject_TypeCheck(op, &Py_ExtSlice_Type) @@ -624,6 +720,7 @@ }; PyObject *Py_ExtSlice_New(PyObject*); #define ExtSlice Py_ExtSlice_New +#define ExtSlice_dims(o) (((struct _ExtSlice*)o)->dims) PyAPI_DATA(PyTypeObject) Py_Index_Type; #define Index_Check(op) PyObject_TypeCheck(op, &Py_Index_Type) @@ -634,6 +731,7 @@ }; PyObject *Py_Index_New(PyObject*); #define Index Py_Index_New +#define Index_value(o) (((struct _Index*)o)->value) PyAPI_DATA(PyTypeObject) Py_boolop_Type; #define boolop_Check(op) PyObject_TypeCheck(op, &Py_boolop_Type) @@ -642,6 +740,7 @@ PyObject_HEAD enum {And_kind, Or_kind} _kind; }; +#define boolop_kind(o) (((struct _boolop*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_And_Type; #define And_Check(op) PyObject_TypeCheck(op, &Py_And_Type) @@ -670,6 +769,7 @@ LShift_kind, RShift_kind, BitOr_kind, BitXor_kind, BitAnd_kind, FloorDiv_kind} _kind; }; +#define operator_kind(o) (((struct _operator*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_Add_Type; #define Add_Check(op) PyObject_TypeCheck(op, &Py_Add_Type) @@ -786,6 +886,7 @@ PyObject_HEAD enum {Invert_kind, Not_kind, UAdd_kind, USub_kind} _kind; }; +#define unaryop_kind(o) (((struct _unaryop*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_Invert_Type; #define Invert_Check(op) PyObject_TypeCheck(op, &Py_Invert_Type) @@ -831,6 +932,7 @@ enum {Eq_kind, NotEq_kind, Lt_kind, LtE_kind, Gt_kind, GtE_kind, Is_kind, IsNot_kind, In_kind, NotIn_kind} _kind; }; +#define cmpop_kind(o) (((struct _cmpop*)o)->_kind) PyAPI_DATA(PyTypeObject) Py_Eq_Type; #define Eq_Check(op) PyObject_TypeCheck(op, &Py_Eq_Type) @@ -932,6 +1034,7 @@ PyObject* ifs; /* expr */ }; PyObject *Py_comprehension_New(PyObject*, PyObject*, PyObject*); +#define comprehension Py_comprehension_New PyAPI_DATA(PyTypeObject) Py_excepthandler_Type; #define excepthandler_Check(op) PyObject_TypeCheck(op, &Py_excepthandler_Type) @@ -943,6 +1046,7 @@ PyObject* body; /* stmt */ }; PyObject *Py_excepthandler_New(PyObject*, PyObject*, PyObject*); +#define excepthandler Py_excepthandler_New PyAPI_DATA(PyTypeObject) Py_arguments_Type; #define arguments_Check(op) PyObject_TypeCheck(op, &Py_arguments_Type) @@ -955,6 +1059,7 @@ PyObject* defaults; /* expr */ }; PyObject *Py_arguments_New(PyObject*, PyObject*, PyObject*, PyObject*); +#define arguments Py_arguments_New PyAPI_DATA(PyTypeObject) Py_keyword_Type; #define keyword_Check(op) PyObject_TypeCheck(op, &Py_keyword_Type) @@ -965,6 +1070,7 @@ PyObject* value; /* expr */ }; PyObject *Py_keyword_New(PyObject*, PyObject*); +#define keyword Py_keyword_New PyAPI_DATA(PyTypeObject) Py_alias_Type; #define alias_Check(op) PyObject_TypeCheck(op, &Py_alias_Type) @@ -975,4 +1081,5 @@ PyObject* asname; /* identifier */ }; PyObject *Py_alias_New(PyObject*, PyObject*); +#define alias Py_alias_New Modified: python/branches/ast-objects/Parser/asdl_c.py ============================================================================== --- python/branches/ast-objects/Parser/asdl_c.py (original) +++ python/branches/ast-objects/Parser/asdl_c.py Sat Dec 3 10:38:50 2005 @@ -133,6 +133,12 @@ depth, reflow=False) self.emit("",depth) + + def emit_field_access(self, name, fields): + for f in fields: + self.emit("#define %s_%s(o) (((struct _%s*)o)->%s)" % + (name, f.name, name, f.name), 0) + def visitModule(self, mod): for dfn in mod.dfns: self.visit(dfn) @@ -156,6 +162,7 @@ assert type in asdl.builtin_types, type emit("%s %s;" % (type, field.name), depth + 1) emit("};") + emit("#define %s_kind(o) (((struct _%s*)o)->_kind)" % (name, name)) emit("") for t in sum.types: self.visitConstructor(name, t, sum.attributes, depth) @@ -175,6 +182,7 @@ self.emit("PyObject *Py_%s_New(%s);" % (cons.name, args), depth) # for convenience self.emit("#define %s Py_%s_New" % (cons.name, cons.name), depth) + self.emit_field_access(cons.name, cons.fields) self.emit("", depth) def visitField(self, field, depth): @@ -191,6 +199,7 @@ self.visit(f, depth + 1) self.emit("};", depth) self.emit("PyObject *Py_%s_New(%s);" % (name, ", ".join(field_types)), depth) + self.emit("#define %s Py_%s_New" % (name, name), depth) self.emit("", depth) class ForwardVisitor(TraversalVisitor): @@ -224,8 +233,10 @@ def emit_ctor(self, name, args, attrs): def emit(s, depth=0, reflow=1): self.emit(s, depth, reflow) - argstr = ", ".join(["%s %s" % (atype, aname) - for atype, aname, opt in args + attrs]) + argstr = ["%s %s" % (f.type, f.name) for f in args] + argstr += ["%s %s" % (argtype, argname) + for argtype, argname, opt in attrs] + argstr = ", ".join(argstr) emit("PyObject*") emit("Py_%s_New(%s)" % (name, argstr)) @@ -233,10 +244,19 @@ emit("struct _%s *result = PyObject_New(struct _%s, &Py_%s_Type);" % (name, name, name), 1, 0) emit("if (result == NULL)", 1) emit("return NULL;", 2) - for argtype, argname, opt in args: + for f in args: + argtype = get_c_type(f.type) if argtype == "PyObject*": - emit("Py_INCREF(%s);" % argname, 1) - emit("result->%s = %s;" % (argname, argname), 1) + if f.opt: + emit("if (%s == NULL) {" % f.name, 1) + emit("Py_INCREF(Py_None);", 2) + emit("%s = Py_None;" % f.name, 2) + emit("}", 1) + elif f.seq: + emit("if (%s == NULL)" % f.name, 1) + emit("%s = Py_List_New(0);" % f.name, 2) + emit("Py_INCREF(%s);" % f.name, 1) + emit("result->%s = %s;" % (f.name, f.name), 1) for argtype, argname, opt in attrs: if argtype == "PyObject*": emit("Py_INCREF(%s);" % argname, 1) @@ -411,7 +431,7 @@ def visitProduct(self, prod, name): args = self.get_args(prod.fields) - self.emit_ctor(str(name), args, []) + self.emit_ctor(str(name), prod.fields, []) self.emit_dealloc(str(name), args, []) self.emit_type(str(name)) self.emit_validate(str(name), prod.fields, []) @@ -419,7 +439,7 @@ def visitConstructor(self, cons, name, attrs): args = self.get_args(cons.fields) attrs = self.get_args(attrs) - self.emit_ctor(cons.name, args, attrs) + self.emit_ctor(cons.name, cons.fields, attrs) self.emit_dealloc(cons.name, args, attrs) self.emit_type(cons.name) self.emit_validate(cons.name, cons.fields, attrs) Modified: python/branches/ast-objects/Python/Python-ast.c ============================================================================== --- python/branches/ast-objects/Python/Python-ast.c (original) +++ python/branches/ast-objects/Python/Python-ast.c Sat Dec 3 10:38:50 2005 @@ -174,11 +174,13 @@ return -1; } PyObject* -Py_Module_New(PyObject* body) +Py_Module_New(stmt body) { struct _Module *result = PyObject_New(struct _Module, &Py_Module_Type); if (result == NULL) return NULL; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; return (PyObject*)result; @@ -257,11 +259,13 @@ } PyObject* -Py_Interactive_New(PyObject* body) +Py_Interactive_New(stmt body) { struct _Interactive *result = PyObject_New(struct _Interactive, &Py_Interactive_Type); if (result == NULL) return NULL; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; return (PyObject*)result; @@ -340,7 +344,7 @@ } PyObject* -Py_Expression_New(PyObject* body) +Py_Expression_New(expr body) { struct _Expression *result = PyObject_New(struct _Expression, &Py_Expression_Type); if (result == NULL) @@ -414,11 +418,13 @@ } PyObject* -Py_Suite_New(PyObject* body) +Py_Suite_New(stmt body) { struct _Suite *result = PyObject_New(struct _Suite, &Py_Suite_Type); if (result == NULL) return NULL; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; return (PyObject*)result; @@ -596,8 +602,8 @@ return -1; } PyObject* -Py_FunctionDef_New(PyObject* name, PyObject* args, PyObject* body, PyObject* - decorators, int lineno) +Py_FunctionDef_New(identifier name, arguments args, stmt body, expr decorators, + int lineno) { struct _FunctionDef *result = PyObject_New(struct _FunctionDef, &Py_FunctionDef_Type); if (result == NULL) @@ -606,8 +612,12 @@ result->name = name; Py_INCREF(args); result->args = args; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; + if (decorators == NULL) + decorators = Py_List_New(0); Py_INCREF(decorators); result->decorators = decorators; result->_base.lineno = lineno; @@ -711,15 +721,19 @@ } PyObject* -Py_ClassDef_New(PyObject* name, PyObject* bases, PyObject* body, int lineno) +Py_ClassDef_New(identifier name, expr bases, stmt body, int lineno) { struct _ClassDef *result = PyObject_New(struct _ClassDef, &Py_ClassDef_Type); if (result == NULL) return NULL; Py_INCREF(name); result->name = name; + if (bases == NULL) + bases = Py_List_New(0); Py_INCREF(bases); result->bases = bases; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; result->_base.lineno = lineno; @@ -818,11 +832,15 @@ } PyObject* -Py_Return_New(PyObject* value, int lineno) +Py_Return_New(expr value, int lineno) { struct _Return *result = PyObject_New(struct _Return, &Py_Return_Type); if (result == NULL) return NULL; + if (value == NULL) { + Py_INCREF(Py_None); + value = Py_None; + } Py_INCREF(value); result->value = value; result->_base.lineno = lineno; @@ -896,11 +914,13 @@ } PyObject* -Py_Delete_New(PyObject* targets, int lineno) +Py_Delete_New(expr targets, int lineno) { struct _Delete *result = PyObject_New(struct _Delete, &Py_Delete_Type); if (result == NULL) return NULL; + if (targets == NULL) + targets = Py_List_New(0); Py_INCREF(targets); result->targets = targets; result->_base.lineno = lineno; @@ -981,11 +1001,13 @@ } PyObject* -Py_Assign_New(PyObject* targets, PyObject* value, int lineno) +Py_Assign_New(expr targets, expr value, int lineno) { struct _Assign *result = PyObject_New(struct _Assign, &Py_Assign_Type); if (result == NULL) return NULL; + if (targets == NULL) + targets = Py_List_New(0); Py_INCREF(targets); result->targets = targets; Py_INCREF(value); @@ -1073,7 +1095,7 @@ } PyObject* -Py_AugAssign_New(PyObject* target, PyObject* op, PyObject* value, int lineno) +Py_AugAssign_New(expr target, operator op, expr value, int lineno) { struct _AugAssign *result = PyObject_New(struct _AugAssign, &Py_AugAssign_Type); if (result == NULL) @@ -1162,13 +1184,19 @@ } PyObject* -Py_Print_New(PyObject* dest, PyObject* values, PyObject* nl, int lineno) +Py_Print_New(expr dest, expr values, bool nl, int lineno) { struct _Print *result = PyObject_New(struct _Print, &Py_Print_Type); if (result == NULL) return NULL; + if (dest == NULL) { + Py_INCREF(Py_None); + dest = Py_None; + } Py_INCREF(dest); result->dest = dest; + if (values == NULL) + values = Py_List_New(0); Py_INCREF(values); result->values = values; Py_INCREF(nl); @@ -1264,8 +1292,7 @@ } PyObject* -Py_For_New(PyObject* target, PyObject* iter, PyObject* body, PyObject* orelse, - int lineno) +Py_For_New(expr target, expr iter, stmt body, stmt orelse, int lineno) { struct _For *result = PyObject_New(struct _For, &Py_For_Type); if (result == NULL) @@ -1274,8 +1301,12 @@ result->target = target; Py_INCREF(iter); result->iter = iter; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; + if (orelse == NULL) + orelse = Py_List_New(0); Py_INCREF(orelse); result->orelse = orelse; result->_base.lineno = lineno; @@ -1379,15 +1410,19 @@ } PyObject* -Py_While_New(PyObject* test, PyObject* body, PyObject* orelse, int lineno) +Py_While_New(expr test, stmt body, stmt orelse, int lineno) { struct _While *result = PyObject_New(struct _While, &Py_While_Type); if (result == NULL) return NULL; Py_INCREF(test); result->test = test; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; + if (orelse == NULL) + orelse = Py_List_New(0); Py_INCREF(orelse); result->orelse = orelse; result->_base.lineno = lineno; @@ -1486,15 +1521,19 @@ } PyObject* -Py_If_New(PyObject* test, PyObject* body, PyObject* orelse, int lineno) +Py_If_New(expr test, stmt body, stmt orelse, int lineno) { struct _If *result = PyObject_New(struct _If, &Py_If_Type); if (result == NULL) return NULL; Py_INCREF(test); result->test = test; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; + if (orelse == NULL) + orelse = Py_List_New(0); Py_INCREF(orelse); result->orelse = orelse; result->_base.lineno = lineno; @@ -1593,15 +1632,27 @@ } PyObject* -Py_Raise_New(PyObject* type, PyObject* inst, PyObject* tback, int lineno) +Py_Raise_New(expr type, expr inst, expr tback, int lineno) { struct _Raise *result = PyObject_New(struct _Raise, &Py_Raise_Type); if (result == NULL) return NULL; + if (type == NULL) { + Py_INCREF(Py_None); + type = Py_None; + } Py_INCREF(type); result->type = type; + if (inst == NULL) { + Py_INCREF(Py_None); + inst = Py_None; + } Py_INCREF(inst); result->inst = inst; + if (tback == NULL) { + Py_INCREF(Py_None); + tback = Py_None; + } Py_INCREF(tback); result->tback = tback; result->_base.lineno = lineno; @@ -1691,16 +1742,21 @@ } PyObject* -Py_TryExcept_New(PyObject* body, PyObject* handlers, PyObject* orelse, int - lineno) +Py_TryExcept_New(stmt body, excepthandler handlers, stmt orelse, int lineno) { struct _TryExcept *result = PyObject_New(struct _TryExcept, &Py_TryExcept_Type); if (result == NULL) return NULL; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; + if (handlers == NULL) + handlers = Py_List_New(0); Py_INCREF(handlers); result->handlers = handlers; + if (orelse == NULL) + orelse = Py_List_New(0); Py_INCREF(orelse); result->orelse = orelse; result->_base.lineno = lineno; @@ -1809,13 +1865,17 @@ } PyObject* -Py_TryFinally_New(PyObject* body, PyObject* finalbody, int lineno) +Py_TryFinally_New(stmt body, stmt finalbody, int lineno) { struct _TryFinally *result = PyObject_New(struct _TryFinally, &Py_TryFinally_Type); if (result == NULL) return NULL; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; + if (finalbody == NULL) + finalbody = Py_List_New(0); Py_INCREF(finalbody); result->finalbody = finalbody; result->_base.lineno = lineno; @@ -1909,13 +1969,17 @@ } PyObject* -Py_Assert_New(PyObject* test, PyObject* msg, int lineno) +Py_Assert_New(expr test, expr msg, int lineno) { struct _Assert *result = PyObject_New(struct _Assert, &Py_Assert_Type); if (result == NULL) return NULL; Py_INCREF(test); result->test = test; + if (msg == NULL) { + Py_INCREF(Py_None); + msg = Py_None; + } Py_INCREF(msg); result->msg = msg; result->_base.lineno = lineno; @@ -1994,11 +2058,13 @@ } PyObject* -Py_Import_New(PyObject* names, int lineno) +Py_Import_New(alias names, int lineno) { struct _Import *result = PyObject_New(struct _Import, &Py_Import_Type); if (result == NULL) return NULL; + if (names == NULL) + names = Py_List_New(0); Py_INCREF(names); result->names = names; result->_base.lineno = lineno; @@ -2079,13 +2145,15 @@ } PyObject* -Py_ImportFrom_New(PyObject* module, PyObject* names, int lineno) +Py_ImportFrom_New(identifier module, alias names, int lineno) { struct _ImportFrom *result = PyObject_New(struct _ImportFrom, &Py_ImportFrom_Type); if (result == NULL) return NULL; Py_INCREF(module); result->module = module; + if (names == NULL) + names = Py_List_New(0); Py_INCREF(names); result->names = names; result->_base.lineno = lineno; @@ -2171,15 +2239,23 @@ } PyObject* -Py_Exec_New(PyObject* body, PyObject* globals, PyObject* locals, int lineno) +Py_Exec_New(expr body, expr globals, expr locals, int lineno) { struct _Exec *result = PyObject_New(struct _Exec, &Py_Exec_Type); if (result == NULL) return NULL; Py_INCREF(body); result->body = body; + if (globals == NULL) { + Py_INCREF(Py_None); + globals = Py_None; + } Py_INCREF(globals); result->globals = globals; + if (locals == NULL) { + Py_INCREF(Py_None); + locals = Py_None; + } Py_INCREF(locals); result->locals = locals; result->_base.lineno = lineno; @@ -2266,11 +2342,13 @@ } PyObject* -Py_Global_New(PyObject* names, int lineno) +Py_Global_New(identifier names, int lineno) { struct _Global *result = PyObject_New(struct _Global, &Py_Global_Type); if (result == NULL) return NULL; + if (names == NULL) + names = Py_List_New(0); Py_INCREF(names); result->names = names; result->_base.lineno = lineno; @@ -2349,7 +2427,7 @@ } PyObject* -Py_Expr_New(PyObject* value, int lineno) +Py_Expr_New(expr value, int lineno) { struct _Expr *result = PyObject_New(struct _Expr, &Py_Expr_Type); if (result == NULL) @@ -2716,13 +2794,15 @@ return -1; } PyObject* -Py_BoolOp_New(PyObject* op, PyObject* values, int lineno) +Py_BoolOp_New(boolop op, expr values, int lineno) { struct _BoolOp *result = PyObject_New(struct _BoolOp, &Py_BoolOp_Type); if (result == NULL) return NULL; Py_INCREF(op); result->op = op; + if (values == NULL) + values = Py_List_New(0); Py_INCREF(values); result->values = values; result->_base.lineno = lineno; @@ -2808,7 +2888,7 @@ } PyObject* -Py_BinOp_New(PyObject* left, PyObject* op, PyObject* right, int lineno) +Py_BinOp_New(expr left, operator op, expr right, int lineno) { struct _BinOp *result = PyObject_New(struct _BinOp, &Py_BinOp_Type); if (result == NULL) @@ -2897,7 +2977,7 @@ } PyObject* -Py_UnaryOp_New(PyObject* op, PyObject* operand, int lineno) +Py_UnaryOp_New(unaryop op, expr operand, int lineno) { struct _UnaryOp *result = PyObject_New(struct _UnaryOp, &Py_UnaryOp_Type); if (result == NULL) @@ -2979,7 +3059,7 @@ } PyObject* -Py_Lambda_New(PyObject* args, PyObject* body, int lineno) +Py_Lambda_New(arguments args, expr body, int lineno) { struct _Lambda *result = PyObject_New(struct _Lambda, &Py_Lambda_Type); if (result == NULL) @@ -3061,13 +3141,17 @@ } PyObject* -Py_Dict_New(PyObject* keys, PyObject* values, int lineno) +Py_Dict_New(expr keys, expr values, int lineno) { struct _Dict *result = PyObject_New(struct _Dict, &Py_Dict_Type); if (result == NULL) return NULL; + if (keys == NULL) + keys = Py_List_New(0); Py_INCREF(keys); result->keys = keys; + if (values == NULL) + values = Py_List_New(0); Py_INCREF(values); result->values = values; result->_base.lineno = lineno; @@ -3161,13 +3245,15 @@ } PyObject* -Py_ListComp_New(PyObject* elt, PyObject* generators, int lineno) +Py_ListComp_New(expr elt, comprehension generators, int lineno) { struct _ListComp *result = PyObject_New(struct _ListComp, &Py_ListComp_Type); if (result == NULL) return NULL; Py_INCREF(elt); result->elt = elt; + if (generators == NULL) + generators = Py_List_New(0); Py_INCREF(generators); result->generators = generators; result->_base.lineno = lineno; @@ -3254,13 +3340,15 @@ } PyObject* -Py_GeneratorExp_New(PyObject* elt, PyObject* generators, int lineno) +Py_GeneratorExp_New(expr elt, comprehension generators, int lineno) { struct _GeneratorExp *result = PyObject_New(struct _GeneratorExp, &Py_GeneratorExp_Type); if (result == NULL) return NULL; Py_INCREF(elt); result->elt = elt; + if (generators == NULL) + generators = Py_List_New(0); Py_INCREF(generators); result->generators = generators; result->_base.lineno = lineno; @@ -3347,11 +3435,15 @@ } PyObject* -Py_Yield_New(PyObject* value, int lineno) +Py_Yield_New(expr value, int lineno) { struct _Yield *result = PyObject_New(struct _Yield, &Py_Yield_Type); if (result == NULL) return NULL; + if (value == NULL) { + Py_INCREF(Py_None); + value = Py_None; + } Py_INCREF(value); result->value = value; result->_base.lineno = lineno; @@ -3425,15 +3517,19 @@ } PyObject* -Py_Compare_New(PyObject* left, PyObject* ops, PyObject* comparators, int lineno) +Py_Compare_New(expr left, cmpop ops, expr comparators, int lineno) { struct _Compare *result = PyObject_New(struct _Compare, &Py_Compare_Type); if (result == NULL) return NULL; Py_INCREF(left); result->left = left; + if (ops == NULL) + ops = Py_List_New(0); Py_INCREF(ops); result->ops = ops; + if (comparators == NULL) + comparators = Py_List_New(0); Py_INCREF(comparators); result->comparators = comparators; result->_base.lineno = lineno; @@ -3532,20 +3628,32 @@ } PyObject* -Py_Call_New(PyObject* func, PyObject* args, PyObject* keywords, PyObject* - starargs, PyObject* kwargs, int lineno) +Py_Call_New(expr func, expr args, keyword keywords, expr starargs, expr kwargs, + int lineno) { struct _Call *result = PyObject_New(struct _Call, &Py_Call_Type); if (result == NULL) return NULL; Py_INCREF(func); result->func = func; + if (args == NULL) + args = Py_List_New(0); Py_INCREF(args); result->args = args; + if (keywords == NULL) + keywords = Py_List_New(0); Py_INCREF(keywords); result->keywords = keywords; + if (starargs == NULL) { + Py_INCREF(Py_None); + starargs = Py_None; + } Py_INCREF(starargs); result->starargs = starargs; + if (kwargs == NULL) { + Py_INCREF(Py_None); + kwargs = Py_None; + } Py_INCREF(kwargs); result->kwargs = kwargs; result->_base.lineno = lineno; @@ -3660,7 +3768,7 @@ } PyObject* -Py_Repr_New(PyObject* value, int lineno) +Py_Repr_New(expr value, int lineno) { struct _Repr *result = PyObject_New(struct _Repr, &Py_Repr_Type); if (result == NULL) @@ -3735,7 +3843,7 @@ } PyObject* -Py_Num_New(PyObject* n, int lineno) +Py_Num_New(object n, int lineno) { struct _Num *result = PyObject_New(struct _Num, &Py_Num_Type); if (result == NULL) @@ -3810,7 +3918,7 @@ } PyObject* -Py_Str_New(PyObject* s, int lineno) +Py_Str_New(string s, int lineno) { struct _Str *result = PyObject_New(struct _Str, &Py_Str_Type); if (result == NULL) @@ -3885,7 +3993,7 @@ } PyObject* -Py_Attribute_New(PyObject* value, PyObject* attr, PyObject* ctx, int lineno) +Py_Attribute_New(expr value, identifier attr, expr_context ctx, int lineno) { struct _Attribute *result = PyObject_New(struct _Attribute, &Py_Attribute_Type); if (result == NULL) @@ -3974,7 +4082,7 @@ } PyObject* -Py_Subscript_New(PyObject* value, PyObject* slice, PyObject* ctx, int lineno) +Py_Subscript_New(expr value, slice slice, expr_context ctx, int lineno) { struct _Subscript *result = PyObject_New(struct _Subscript, &Py_Subscript_Type); if (result == NULL) @@ -4063,7 +4171,7 @@ } PyObject* -Py_Name_New(PyObject* id, PyObject* ctx, int lineno) +Py_Name_New(identifier id, expr_context ctx, int lineno) { struct _Name *result = PyObject_New(struct _Name, &Py_Name_Type); if (result == NULL) @@ -4145,11 +4253,13 @@ } PyObject* -Py_List_New(PyObject* elts, PyObject* ctx, int lineno) +Py_List_New(expr elts, expr_context ctx, int lineno) { struct _List *result = PyObject_New(struct _List, &Py_List_Type); if (result == NULL) return NULL; + if (elts == NULL) + elts = Py_List_New(0); Py_INCREF(elts); result->elts = elts; Py_INCREF(ctx); @@ -4236,11 +4346,13 @@ } PyObject* -Py_Tuple_New(PyObject* elts, PyObject* ctx, int lineno) +Py_Tuple_New(expr elts, expr_context ctx, int lineno) { struct _Tuple *result = PyObject_New(struct _Tuple, &Py_Tuple_Type); if (result == NULL) return NULL; + if (elts == NULL) + elts = Py_List_New(0); Py_INCREF(elts); result->elts = elts; Py_INCREF(ctx); @@ -4919,15 +5031,27 @@ } PyObject* -Py_Slice_New(PyObject* lower, PyObject* upper, PyObject* step) +Py_Slice_New(expr lower, expr upper, expr step) { struct _Slice *result = PyObject_New(struct _Slice, &Py_Slice_Type); if (result == NULL) return NULL; + if (lower == NULL) { + Py_INCREF(Py_None); + lower = Py_None; + } Py_INCREF(lower); result->lower = lower; + if (upper == NULL) { + Py_INCREF(Py_None); + upper = Py_None; + } Py_INCREF(upper); result->upper = upper; + if (step == NULL) { + Py_INCREF(Py_None); + step = Py_None; + } Py_INCREF(step); result->step = step; return (PyObject*)result; @@ -5016,11 +5140,13 @@ } PyObject* -Py_ExtSlice_New(PyObject* dims) +Py_ExtSlice_New(slice dims) { struct _ExtSlice *result = PyObject_New(struct _ExtSlice, &Py_ExtSlice_Type); if (result == NULL) return NULL; + if (dims == NULL) + dims = Py_List_New(0); Py_INCREF(dims); result->dims = dims; return (PyObject*)result; @@ -5100,7 +5226,7 @@ } PyObject* -Py_Index_New(PyObject* value) +Py_Index_New(expr value) { struct _Index *result = PyObject_New(struct _Index, &Py_Index_Type); if (result == NULL) @@ -7298,7 +7424,7 @@ } PyObject* -Py_comprehension_New(PyObject* target, PyObject* iter, PyObject* ifs) +Py_comprehension_New(expr target, expr iter, expr ifs) { struct _comprehension *result = PyObject_New(struct _comprehension, &Py_comprehension_Type); if (result == NULL) @@ -7307,6 +7433,8 @@ result->target = target; Py_INCREF(iter); result->iter = iter; + if (ifs == NULL) + ifs = Py_List_New(0); Py_INCREF(ifs); result->ifs = ifs; return (PyObject*)result; @@ -7395,15 +7523,25 @@ } PyObject* -Py_excepthandler_New(PyObject* type, PyObject* name, PyObject* body) +Py_excepthandler_New(expr type, expr name, stmt body) { struct _excepthandler *result = PyObject_New(struct _excepthandler, &Py_excepthandler_Type); if (result == NULL) return NULL; + if (type == NULL) { + Py_INCREF(Py_None); + type = Py_None; + } Py_INCREF(type); result->type = type; + if (name == NULL) { + Py_INCREF(Py_None); + name = Py_None; + } Py_INCREF(name); result->name = name; + if (body == NULL) + body = Py_List_New(0); Py_INCREF(body); result->body = body; return (PyObject*)result; @@ -7498,18 +7636,29 @@ } PyObject* -Py_arguments_New(PyObject* args, PyObject* vararg, PyObject* kwarg, PyObject* - defaults) +Py_arguments_New(expr args, identifier vararg, identifier kwarg, expr defaults) { struct _arguments *result = PyObject_New(struct _arguments, &Py_arguments_Type); if (result == NULL) return NULL; + if (args == NULL) + args = Py_List_New(0); Py_INCREF(args); result->args = args; + if (vararg == NULL) { + Py_INCREF(Py_None); + vararg = Py_None; + } Py_INCREF(vararg); result->vararg = vararg; + if (kwarg == NULL) { + Py_INCREF(Py_None); + kwarg = Py_None; + } Py_INCREF(kwarg); result->kwarg = kwarg; + if (defaults == NULL) + defaults = Py_List_New(0); Py_INCREF(defaults); result->defaults = defaults; return (PyObject*)result; @@ -7614,7 +7763,7 @@ } PyObject* -Py_keyword_New(PyObject* arg, PyObject* value) +Py_keyword_New(identifier arg, expr value) { struct _keyword *result = PyObject_New(struct _keyword, &Py_keyword_Type); if (result == NULL) @@ -7695,13 +7844,17 @@ } PyObject* -Py_alias_New(PyObject* name, PyObject* asname) +Py_alias_New(identifier name, identifier asname) { struct _alias *result = PyObject_New(struct _alias, &Py_alias_Type); if (result == NULL) return NULL; Py_INCREF(name); result->name = name; + if (asname == NULL) { + Py_INCREF(Py_None); + asname = Py_None; + } Py_INCREF(asname); result->asname = asname; return (PyObject*)result; From python-checkins at python.org Sun Dec 4 03:44:37 2005 From: python-checkins at python.org (brett.cannon) Date: Sun, 4 Dec 2005 03:44:37 +0100 (CET) Subject: [Python-checkins] commit of r41582 - peps/trunk/pep-0000.txt Message-ID: <20051204024437.599961E400B@bag.python.org> Author: brett.cannon Date: Sun Dec 4 03:44:26 2005 New Revision: 41582 Modified: peps/trunk/pep-0000.txt Log: List Paul Moore as a co-author on PEP 302 as the PEP says. Modified: peps/trunk/pep-0000.txt ============================================================================== --- peps/trunk/pep-0000.txt (original) +++ peps/trunk/pep-0000.txt Sun Dec 4 03:44:26 2005 @@ -87,7 +87,7 @@ S 297 Support for System Upgrades Lemburg S 298 The Locked Buffer Interface Heller S 299 Special __main__() function in modules Epler - S 302 New Import Hooks JvR + S 302 New Import Hooks JvR, Moore S 304 Controlling Generation of Bytecode Files Montanaro S 314 Metadata for Python Software Packages v1.1 Kuchling, Jones S 315 Enhanced While Loop Carroll, Hettinger @@ -349,7 +349,7 @@ S 298 The Locked Buffer Interface Heller S 299 Special __main__() function in modules Epler SF 301 Package Index and Metadata for Distutils Jones - S 302 New Import Hooks JvR + S 302 New Import Hooks JvR, Moore SR 303 Extend divmod() for Multiple Divisors Bellman S 304 Controlling Generation of Bytecode Files Montanaro SF 305 CSV File API Montanaro, et al From python-checkins at python.org Sun Dec 4 09:54:05 2005 From: python-checkins at python.org (brett.cannon) Date: Sun, 4 Dec 2005 09:54:05 +0100 (CET) Subject: [Python-checkins] commit of r41583 - python/branches/ast-objects/Parser/asdl_c.py Message-ID: <20051204085405.97E821E400A@bag.python.org> Author: brett.cannon Date: Sun Dec 4 09:54:00 2005 New Revision: 41583 Modified: python/branches/ast-objects/Parser/asdl_c.py Log: Add typedefs for sum types and the builtin types of ASDL since their names are directly used as the type of argument to C functions. Modified: python/branches/ast-objects/Parser/asdl_c.py ============================================================================== --- python/branches/ast-objects/Parser/asdl_c.py (original) +++ python/branches/ast-objects/Parser/asdl_c.py Sun Dec 4 09:54:00 2005 @@ -162,6 +162,7 @@ assert type in asdl.builtin_types, type emit("%s %s;" % (type, field.name), depth + 1) emit("};") + emit("typedef PyObject * %s;" % name) emit("#define %s_kind(o) (((struct _%s*)o)->_kind)" % (name, name)) emit("") for t in sum.types: @@ -519,6 +520,13 @@ print >> f, " macro, type and constant names which are not Py_-prefixed." print >> f, " Therefore, the file should not be included in Python.h;" print >> f, " all symbols relevant to linkage are Py_-prefixed. */" + print >> f, "\n" + print >> f, "/* typedefs of ASDL's builtin types */" + print >> f, "typedef PyObject * identifier;" + print >> f, "typedef PyObject * string;" + print >> f, "typedef PyObject * bool;" + print >> f, "typedef PyObject * object;" + print >> f, "\n" c = HeaderVisitor(f) c.visit(mod) f.close() From python-checkins at python.org Sun Dec 4 10:29:28 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 4 Dec 2005 10:29:28 +0100 (CET) Subject: [Python-checkins] commit of r41584 - in python/branches/ast-objects: Include/Python-ast.h Parser/asdl_c.py Python/Python-ast.c Python/ast.c Message-ID: <20051204092928.645801E400A@bag.python.org> Author: martin.v.loewis Date: Sun Dec 4 10:29:19 2005 New Revision: 41584 Modified: python/branches/ast-objects/Include/Python-ast.h python/branches/ast-objects/Parser/asdl_c.py python/branches/ast-objects/Python/Python-ast.c python/branches/ast-objects/Python/ast.c Log: Change constructor functions to expect PyObject* again, remove typedefs. Modified: python/branches/ast-objects/Include/Python-ast.h ============================================================================== --- python/branches/ast-objects/Include/Python-ast.h (original) +++ python/branches/ast-objects/Include/Python-ast.h Sun Dec 4 10:29:19 2005 @@ -4,6 +4,8 @@ macro, type and constant names which are not Py_-prefixed. Therefore, the file should not be included in Python.h; all symbols relevant to linkage are Py_-prefixed. */ + + PyAPI_DATA(PyTypeObject) Py_mod_Type; #define mod_Check(op) PyObject_TypeCheck(op, &Py_mod_Type) Modified: python/branches/ast-objects/Parser/asdl_c.py ============================================================================== --- python/branches/ast-objects/Parser/asdl_c.py (original) +++ python/branches/ast-objects/Parser/asdl_c.py Sun Dec 4 10:29:19 2005 @@ -162,7 +162,6 @@ assert type in asdl.builtin_types, type emit("%s %s;" % (type, field.name), depth + 1) emit("};") - emit("typedef PyObject * %s;" % name) emit("#define %s_kind(o) (((struct _%s*)o)->_kind)" % (name, name)) emit("") for t in sum.types: @@ -234,7 +233,7 @@ def emit_ctor(self, name, args, attrs): def emit(s, depth=0, reflow=1): self.emit(s, depth, reflow) - argstr = ["%s %s" % (f.type, f.name) for f in args] + argstr = ["%s %s" % (get_c_type(f.type), f.name) for f in args] argstr += ["%s %s" % (argtype, argname) for argtype, argname, opt in attrs] argstr = ", ".join(argstr) @@ -255,7 +254,7 @@ emit("}", 1) elif f.seq: emit("if (%s == NULL)" % f.name, 1) - emit("%s = Py_List_New(0);" % f.name, 2) + emit("%s = PyList_New(0);" % f.name, 2) emit("Py_INCREF(%s);" % f.name, 1) emit("result->%s = %s;" % (f.name, f.name), 1) for argtype, argname, opt in attrs: @@ -521,12 +520,6 @@ print >> f, " Therefore, the file should not be included in Python.h;" print >> f, " all symbols relevant to linkage are Py_-prefixed. */" print >> f, "\n" - print >> f, "/* typedefs of ASDL's builtin types */" - print >> f, "typedef PyObject * identifier;" - print >> f, "typedef PyObject * string;" - print >> f, "typedef PyObject * bool;" - print >> f, "typedef PyObject * object;" - print >> f, "\n" c = HeaderVisitor(f) c.visit(mod) f.close() Modified: python/branches/ast-objects/Python/Python-ast.c ============================================================================== --- python/branches/ast-objects/Python/Python-ast.c (original) +++ python/branches/ast-objects/Python/Python-ast.c Sun Dec 4 10:29:19 2005 @@ -174,13 +174,13 @@ return -1; } PyObject* -Py_Module_New(stmt body) +Py_Module_New(PyObject* body) { struct _Module *result = PyObject_New(struct _Module, &Py_Module_Type); if (result == NULL) return NULL; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; return (PyObject*)result; @@ -259,13 +259,13 @@ } PyObject* -Py_Interactive_New(stmt body) +Py_Interactive_New(PyObject* body) { struct _Interactive *result = PyObject_New(struct _Interactive, &Py_Interactive_Type); if (result == NULL) return NULL; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; return (PyObject*)result; @@ -344,7 +344,7 @@ } PyObject* -Py_Expression_New(expr body) +Py_Expression_New(PyObject* body) { struct _Expression *result = PyObject_New(struct _Expression, &Py_Expression_Type); if (result == NULL) @@ -418,13 +418,13 @@ } PyObject* -Py_Suite_New(stmt body) +Py_Suite_New(PyObject* body) { struct _Suite *result = PyObject_New(struct _Suite, &Py_Suite_Type); if (result == NULL) return NULL; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; return (PyObject*)result; @@ -602,8 +602,8 @@ return -1; } PyObject* -Py_FunctionDef_New(identifier name, arguments args, stmt body, expr decorators, - int lineno) +Py_FunctionDef_New(PyObject* name, PyObject* args, PyObject* body, PyObject* + decorators, int lineno) { struct _FunctionDef *result = PyObject_New(struct _FunctionDef, &Py_FunctionDef_Type); if (result == NULL) @@ -613,11 +613,11 @@ Py_INCREF(args); result->args = args; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; if (decorators == NULL) - decorators = Py_List_New(0); + decorators = PyList_New(0); Py_INCREF(decorators); result->decorators = decorators; result->_base.lineno = lineno; @@ -721,7 +721,7 @@ } PyObject* -Py_ClassDef_New(identifier name, expr bases, stmt body, int lineno) +Py_ClassDef_New(PyObject* name, PyObject* bases, PyObject* body, int lineno) { struct _ClassDef *result = PyObject_New(struct _ClassDef, &Py_ClassDef_Type); if (result == NULL) @@ -729,11 +729,11 @@ Py_INCREF(name); result->name = name; if (bases == NULL) - bases = Py_List_New(0); + bases = PyList_New(0); Py_INCREF(bases); result->bases = bases; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; result->_base.lineno = lineno; @@ -832,7 +832,7 @@ } PyObject* -Py_Return_New(expr value, int lineno) +Py_Return_New(PyObject* value, int lineno) { struct _Return *result = PyObject_New(struct _Return, &Py_Return_Type); if (result == NULL) @@ -914,13 +914,13 @@ } PyObject* -Py_Delete_New(expr targets, int lineno) +Py_Delete_New(PyObject* targets, int lineno) { struct _Delete *result = PyObject_New(struct _Delete, &Py_Delete_Type); if (result == NULL) return NULL; if (targets == NULL) - targets = Py_List_New(0); + targets = PyList_New(0); Py_INCREF(targets); result->targets = targets; result->_base.lineno = lineno; @@ -1001,13 +1001,13 @@ } PyObject* -Py_Assign_New(expr targets, expr value, int lineno) +Py_Assign_New(PyObject* targets, PyObject* value, int lineno) { struct _Assign *result = PyObject_New(struct _Assign, &Py_Assign_Type); if (result == NULL) return NULL; if (targets == NULL) - targets = Py_List_New(0); + targets = PyList_New(0); Py_INCREF(targets); result->targets = targets; Py_INCREF(value); @@ -1095,7 +1095,7 @@ } PyObject* -Py_AugAssign_New(expr target, operator op, expr value, int lineno) +Py_AugAssign_New(PyObject* target, PyObject* op, PyObject* value, int lineno) { struct _AugAssign *result = PyObject_New(struct _AugAssign, &Py_AugAssign_Type); if (result == NULL) @@ -1184,7 +1184,7 @@ } PyObject* -Py_Print_New(expr dest, expr values, bool nl, int lineno) +Py_Print_New(PyObject* dest, PyObject* values, PyObject* nl, int lineno) { struct _Print *result = PyObject_New(struct _Print, &Py_Print_Type); if (result == NULL) @@ -1196,7 +1196,7 @@ Py_INCREF(dest); result->dest = dest; if (values == NULL) - values = Py_List_New(0); + values = PyList_New(0); Py_INCREF(values); result->values = values; Py_INCREF(nl); @@ -1292,7 +1292,8 @@ } PyObject* -Py_For_New(expr target, expr iter, stmt body, stmt orelse, int lineno) +Py_For_New(PyObject* target, PyObject* iter, PyObject* body, PyObject* orelse, + int lineno) { struct _For *result = PyObject_New(struct _For, &Py_For_Type); if (result == NULL) @@ -1302,11 +1303,11 @@ Py_INCREF(iter); result->iter = iter; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; if (orelse == NULL) - orelse = Py_List_New(0); + orelse = PyList_New(0); Py_INCREF(orelse); result->orelse = orelse; result->_base.lineno = lineno; @@ -1410,7 +1411,7 @@ } PyObject* -Py_While_New(expr test, stmt body, stmt orelse, int lineno) +Py_While_New(PyObject* test, PyObject* body, PyObject* orelse, int lineno) { struct _While *result = PyObject_New(struct _While, &Py_While_Type); if (result == NULL) @@ -1418,11 +1419,11 @@ Py_INCREF(test); result->test = test; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; if (orelse == NULL) - orelse = Py_List_New(0); + orelse = PyList_New(0); Py_INCREF(orelse); result->orelse = orelse; result->_base.lineno = lineno; @@ -1521,7 +1522,7 @@ } PyObject* -Py_If_New(expr test, stmt body, stmt orelse, int lineno) +Py_If_New(PyObject* test, PyObject* body, PyObject* orelse, int lineno) { struct _If *result = PyObject_New(struct _If, &Py_If_Type); if (result == NULL) @@ -1529,11 +1530,11 @@ Py_INCREF(test); result->test = test; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; if (orelse == NULL) - orelse = Py_List_New(0); + orelse = PyList_New(0); Py_INCREF(orelse); result->orelse = orelse; result->_base.lineno = lineno; @@ -1632,7 +1633,7 @@ } PyObject* -Py_Raise_New(expr type, expr inst, expr tback, int lineno) +Py_Raise_New(PyObject* type, PyObject* inst, PyObject* tback, int lineno) { struct _Raise *result = PyObject_New(struct _Raise, &Py_Raise_Type); if (result == NULL) @@ -1742,21 +1743,22 @@ } PyObject* -Py_TryExcept_New(stmt body, excepthandler handlers, stmt orelse, int lineno) +Py_TryExcept_New(PyObject* body, PyObject* handlers, PyObject* orelse, int + lineno) { struct _TryExcept *result = PyObject_New(struct _TryExcept, &Py_TryExcept_Type); if (result == NULL) return NULL; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; if (handlers == NULL) - handlers = Py_List_New(0); + handlers = PyList_New(0); Py_INCREF(handlers); result->handlers = handlers; if (orelse == NULL) - orelse = Py_List_New(0); + orelse = PyList_New(0); Py_INCREF(orelse); result->orelse = orelse; result->_base.lineno = lineno; @@ -1865,17 +1867,17 @@ } PyObject* -Py_TryFinally_New(stmt body, stmt finalbody, int lineno) +Py_TryFinally_New(PyObject* body, PyObject* finalbody, int lineno) { struct _TryFinally *result = PyObject_New(struct _TryFinally, &Py_TryFinally_Type); if (result == NULL) return NULL; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; if (finalbody == NULL) - finalbody = Py_List_New(0); + finalbody = PyList_New(0); Py_INCREF(finalbody); result->finalbody = finalbody; result->_base.lineno = lineno; @@ -1969,7 +1971,7 @@ } PyObject* -Py_Assert_New(expr test, expr msg, int lineno) +Py_Assert_New(PyObject* test, PyObject* msg, int lineno) { struct _Assert *result = PyObject_New(struct _Assert, &Py_Assert_Type); if (result == NULL) @@ -2058,13 +2060,13 @@ } PyObject* -Py_Import_New(alias names, int lineno) +Py_Import_New(PyObject* names, int lineno) { struct _Import *result = PyObject_New(struct _Import, &Py_Import_Type); if (result == NULL) return NULL; if (names == NULL) - names = Py_List_New(0); + names = PyList_New(0); Py_INCREF(names); result->names = names; result->_base.lineno = lineno; @@ -2145,7 +2147,7 @@ } PyObject* -Py_ImportFrom_New(identifier module, alias names, int lineno) +Py_ImportFrom_New(PyObject* module, PyObject* names, int lineno) { struct _ImportFrom *result = PyObject_New(struct _ImportFrom, &Py_ImportFrom_Type); if (result == NULL) @@ -2153,7 +2155,7 @@ Py_INCREF(module); result->module = module; if (names == NULL) - names = Py_List_New(0); + names = PyList_New(0); Py_INCREF(names); result->names = names; result->_base.lineno = lineno; @@ -2239,7 +2241,7 @@ } PyObject* -Py_Exec_New(expr body, expr globals, expr locals, int lineno) +Py_Exec_New(PyObject* body, PyObject* globals, PyObject* locals, int lineno) { struct _Exec *result = PyObject_New(struct _Exec, &Py_Exec_Type); if (result == NULL) @@ -2342,13 +2344,13 @@ } PyObject* -Py_Global_New(identifier names, int lineno) +Py_Global_New(PyObject* names, int lineno) { struct _Global *result = PyObject_New(struct _Global, &Py_Global_Type); if (result == NULL) return NULL; if (names == NULL) - names = Py_List_New(0); + names = PyList_New(0); Py_INCREF(names); result->names = names; result->_base.lineno = lineno; @@ -2427,7 +2429,7 @@ } PyObject* -Py_Expr_New(expr value, int lineno) +Py_Expr_New(PyObject* value, int lineno) { struct _Expr *result = PyObject_New(struct _Expr, &Py_Expr_Type); if (result == NULL) @@ -2794,7 +2796,7 @@ return -1; } PyObject* -Py_BoolOp_New(boolop op, expr values, int lineno) +Py_BoolOp_New(PyObject* op, PyObject* values, int lineno) { struct _BoolOp *result = PyObject_New(struct _BoolOp, &Py_BoolOp_Type); if (result == NULL) @@ -2802,7 +2804,7 @@ Py_INCREF(op); result->op = op; if (values == NULL) - values = Py_List_New(0); + values = PyList_New(0); Py_INCREF(values); result->values = values; result->_base.lineno = lineno; @@ -2888,7 +2890,7 @@ } PyObject* -Py_BinOp_New(expr left, operator op, expr right, int lineno) +Py_BinOp_New(PyObject* left, PyObject* op, PyObject* right, int lineno) { struct _BinOp *result = PyObject_New(struct _BinOp, &Py_BinOp_Type); if (result == NULL) @@ -2977,7 +2979,7 @@ } PyObject* -Py_UnaryOp_New(unaryop op, expr operand, int lineno) +Py_UnaryOp_New(PyObject* op, PyObject* operand, int lineno) { struct _UnaryOp *result = PyObject_New(struct _UnaryOp, &Py_UnaryOp_Type); if (result == NULL) @@ -3059,7 +3061,7 @@ } PyObject* -Py_Lambda_New(arguments args, expr body, int lineno) +Py_Lambda_New(PyObject* args, PyObject* body, int lineno) { struct _Lambda *result = PyObject_New(struct _Lambda, &Py_Lambda_Type); if (result == NULL) @@ -3141,17 +3143,17 @@ } PyObject* -Py_Dict_New(expr keys, expr values, int lineno) +Py_Dict_New(PyObject* keys, PyObject* values, int lineno) { struct _Dict *result = PyObject_New(struct _Dict, &Py_Dict_Type); if (result == NULL) return NULL; if (keys == NULL) - keys = Py_List_New(0); + keys = PyList_New(0); Py_INCREF(keys); result->keys = keys; if (values == NULL) - values = Py_List_New(0); + values = PyList_New(0); Py_INCREF(values); result->values = values; result->_base.lineno = lineno; @@ -3245,7 +3247,7 @@ } PyObject* -Py_ListComp_New(expr elt, comprehension generators, int lineno) +Py_ListComp_New(PyObject* elt, PyObject* generators, int lineno) { struct _ListComp *result = PyObject_New(struct _ListComp, &Py_ListComp_Type); if (result == NULL) @@ -3253,7 +3255,7 @@ Py_INCREF(elt); result->elt = elt; if (generators == NULL) - generators = Py_List_New(0); + generators = PyList_New(0); Py_INCREF(generators); result->generators = generators; result->_base.lineno = lineno; @@ -3340,7 +3342,7 @@ } PyObject* -Py_GeneratorExp_New(expr elt, comprehension generators, int lineno) +Py_GeneratorExp_New(PyObject* elt, PyObject* generators, int lineno) { struct _GeneratorExp *result = PyObject_New(struct _GeneratorExp, &Py_GeneratorExp_Type); if (result == NULL) @@ -3348,7 +3350,7 @@ Py_INCREF(elt); result->elt = elt; if (generators == NULL) - generators = Py_List_New(0); + generators = PyList_New(0); Py_INCREF(generators); result->generators = generators; result->_base.lineno = lineno; @@ -3435,7 +3437,7 @@ } PyObject* -Py_Yield_New(expr value, int lineno) +Py_Yield_New(PyObject* value, int lineno) { struct _Yield *result = PyObject_New(struct _Yield, &Py_Yield_Type); if (result == NULL) @@ -3517,7 +3519,7 @@ } PyObject* -Py_Compare_New(expr left, cmpop ops, expr comparators, int lineno) +Py_Compare_New(PyObject* left, PyObject* ops, PyObject* comparators, int lineno) { struct _Compare *result = PyObject_New(struct _Compare, &Py_Compare_Type); if (result == NULL) @@ -3525,11 +3527,11 @@ Py_INCREF(left); result->left = left; if (ops == NULL) - ops = Py_List_New(0); + ops = PyList_New(0); Py_INCREF(ops); result->ops = ops; if (comparators == NULL) - comparators = Py_List_New(0); + comparators = PyList_New(0); Py_INCREF(comparators); result->comparators = comparators; result->_base.lineno = lineno; @@ -3628,8 +3630,8 @@ } PyObject* -Py_Call_New(expr func, expr args, keyword keywords, expr starargs, expr kwargs, - int lineno) +Py_Call_New(PyObject* func, PyObject* args, PyObject* keywords, PyObject* + starargs, PyObject* kwargs, int lineno) { struct _Call *result = PyObject_New(struct _Call, &Py_Call_Type); if (result == NULL) @@ -3637,11 +3639,11 @@ Py_INCREF(func); result->func = func; if (args == NULL) - args = Py_List_New(0); + args = PyList_New(0); Py_INCREF(args); result->args = args; if (keywords == NULL) - keywords = Py_List_New(0); + keywords = PyList_New(0); Py_INCREF(keywords); result->keywords = keywords; if (starargs == NULL) { @@ -3768,7 +3770,7 @@ } PyObject* -Py_Repr_New(expr value, int lineno) +Py_Repr_New(PyObject* value, int lineno) { struct _Repr *result = PyObject_New(struct _Repr, &Py_Repr_Type); if (result == NULL) @@ -3843,7 +3845,7 @@ } PyObject* -Py_Num_New(object n, int lineno) +Py_Num_New(PyObject* n, int lineno) { struct _Num *result = PyObject_New(struct _Num, &Py_Num_Type); if (result == NULL) @@ -3918,7 +3920,7 @@ } PyObject* -Py_Str_New(string s, int lineno) +Py_Str_New(PyObject* s, int lineno) { struct _Str *result = PyObject_New(struct _Str, &Py_Str_Type); if (result == NULL) @@ -3993,7 +3995,7 @@ } PyObject* -Py_Attribute_New(expr value, identifier attr, expr_context ctx, int lineno) +Py_Attribute_New(PyObject* value, PyObject* attr, PyObject* ctx, int lineno) { struct _Attribute *result = PyObject_New(struct _Attribute, &Py_Attribute_Type); if (result == NULL) @@ -4082,7 +4084,7 @@ } PyObject* -Py_Subscript_New(expr value, slice slice, expr_context ctx, int lineno) +Py_Subscript_New(PyObject* value, PyObject* slice, PyObject* ctx, int lineno) { struct _Subscript *result = PyObject_New(struct _Subscript, &Py_Subscript_Type); if (result == NULL) @@ -4171,7 +4173,7 @@ } PyObject* -Py_Name_New(identifier id, expr_context ctx, int lineno) +Py_Name_New(PyObject* id, PyObject* ctx, int lineno) { struct _Name *result = PyObject_New(struct _Name, &Py_Name_Type); if (result == NULL) @@ -4253,13 +4255,13 @@ } PyObject* -Py_List_New(expr elts, expr_context ctx, int lineno) +Py_List_New(PyObject* elts, PyObject* ctx, int lineno) { struct _List *result = PyObject_New(struct _List, &Py_List_Type); if (result == NULL) return NULL; if (elts == NULL) - elts = Py_List_New(0); + elts = PyList_New(0); Py_INCREF(elts); result->elts = elts; Py_INCREF(ctx); @@ -4346,13 +4348,13 @@ } PyObject* -Py_Tuple_New(expr elts, expr_context ctx, int lineno) +Py_Tuple_New(PyObject* elts, PyObject* ctx, int lineno) { struct _Tuple *result = PyObject_New(struct _Tuple, &Py_Tuple_Type); if (result == NULL) return NULL; if (elts == NULL) - elts = Py_List_New(0); + elts = PyList_New(0); Py_INCREF(elts); result->elts = elts; Py_INCREF(ctx); @@ -5031,7 +5033,7 @@ } PyObject* -Py_Slice_New(expr lower, expr upper, expr step) +Py_Slice_New(PyObject* lower, PyObject* upper, PyObject* step) { struct _Slice *result = PyObject_New(struct _Slice, &Py_Slice_Type); if (result == NULL) @@ -5140,13 +5142,13 @@ } PyObject* -Py_ExtSlice_New(slice dims) +Py_ExtSlice_New(PyObject* dims) { struct _ExtSlice *result = PyObject_New(struct _ExtSlice, &Py_ExtSlice_Type); if (result == NULL) return NULL; if (dims == NULL) - dims = Py_List_New(0); + dims = PyList_New(0); Py_INCREF(dims); result->dims = dims; return (PyObject*)result; @@ -5226,7 +5228,7 @@ } PyObject* -Py_Index_New(expr value) +Py_Index_New(PyObject* value) { struct _Index *result = PyObject_New(struct _Index, &Py_Index_Type); if (result == NULL) @@ -7424,7 +7426,7 @@ } PyObject* -Py_comprehension_New(expr target, expr iter, expr ifs) +Py_comprehension_New(PyObject* target, PyObject* iter, PyObject* ifs) { struct _comprehension *result = PyObject_New(struct _comprehension, &Py_comprehension_Type); if (result == NULL) @@ -7434,7 +7436,7 @@ Py_INCREF(iter); result->iter = iter; if (ifs == NULL) - ifs = Py_List_New(0); + ifs = PyList_New(0); Py_INCREF(ifs); result->ifs = ifs; return (PyObject*)result; @@ -7523,7 +7525,7 @@ } PyObject* -Py_excepthandler_New(expr type, expr name, stmt body) +Py_excepthandler_New(PyObject* type, PyObject* name, PyObject* body) { struct _excepthandler *result = PyObject_New(struct _excepthandler, &Py_excepthandler_Type); if (result == NULL) @@ -7541,7 +7543,7 @@ Py_INCREF(name); result->name = name; if (body == NULL) - body = Py_List_New(0); + body = PyList_New(0); Py_INCREF(body); result->body = body; return (PyObject*)result; @@ -7636,13 +7638,14 @@ } PyObject* -Py_arguments_New(expr args, identifier vararg, identifier kwarg, expr defaults) +Py_arguments_New(PyObject* args, PyObject* vararg, PyObject* kwarg, PyObject* + defaults) { struct _arguments *result = PyObject_New(struct _arguments, &Py_arguments_Type); if (result == NULL) return NULL; if (args == NULL) - args = Py_List_New(0); + args = PyList_New(0); Py_INCREF(args); result->args = args; if (vararg == NULL) { @@ -7658,7 +7661,7 @@ Py_INCREF(kwarg); result->kwarg = kwarg; if (defaults == NULL) - defaults = Py_List_New(0); + defaults = PyList_New(0); Py_INCREF(defaults); result->defaults = defaults; return (PyObject*)result; @@ -7763,7 +7766,7 @@ } PyObject* -Py_keyword_New(identifier arg, expr value) +Py_keyword_New(PyObject* arg, PyObject* value) { struct _keyword *result = PyObject_New(struct _keyword, &Py_keyword_Type); if (result == NULL) @@ -7844,7 +7847,7 @@ } PyObject* -Py_alias_New(identifier name, identifier asname) +Py_alias_New(PyObject* name, PyObject* asname) { struct _alias *result = PyObject_New(struct _alias, &Py_alias_Type); if (result == NULL) Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Sun Dec 4 10:29:19 2005 @@ -90,6 +90,9 @@ #define NEW_IDENTIFIER(n) PyString_InternFromString(STR(n)) +#define Py_RELEASE(var) do{Py_DECREF(var);var=NULL;}while(0); +#define STEAL_ITEM(l,i,o) do{PyList_SET_ITEM(l,i,o);o=NULL;}while(0); + /* This routine provides an invalid object for the syntax error. The outermost routine must unpack this error and create the proper object. We do this so that we don't have to pass @@ -278,8 +281,7 @@ s = Pass(n->n_lineno); if (!s) goto error; - Py_INCREF(s); /* set_item will steal the ref */ - PyList_SET_ITEM(stmts, 0, s); + STEAL_ITEM(stmts, 0, s); result = Interactive(stmts); goto success; } @@ -293,8 +295,7 @@ s = ast_for_stmt(&c, n); if (!s) goto error; - Py_INCREF(s); - PyList_SET_ITEM(stmts, 0, s); + STEAL_ITEM(stmts, 0, s); } else { /* Only a simple_stmt can contain multiple statements. */ @@ -305,8 +306,7 @@ s = ast_for_stmt(&c, CHILD(n, i)); if (!s) goto error; - Py_INCREF(s); - PyList_SET_ITEM(stmts, i / 2, s); + STEAL_ITEM(stmts, i / 2, s); } } @@ -332,34 +332,35 @@ /* Return the AST repr. of the operator represented as syntax (|, ^, etc.) */ -static operator_ty +static PyObject* get_operator(const node *n) { switch (TYPE(n)) { case VBAR: - return BitOr; + return BitOr(); case CIRCUMFLEX: - return BitXor; + return BitXor(); case AMPER: - return BitAnd; + return BitAnd(); case LEFTSHIFT: - return LShift; + return LShift(); case RIGHTSHIFT: - return RShift; + return RShift(); case PLUS: - return Add; + return Add(); case MINUS: - return Sub; + return Sub(); case STAR: - return Mult; + return Mult(); case SLASH: - return Div; + return Div(); case DOUBLESLASH: - return FloorDiv; + return FloorDiv(); case PERCENT: - return Mod; + return Mod(); default: - return 0; + PyErr_BadInternalCall(); + return NULL; } } @@ -375,42 +376,44 @@ */ static int -set_context(expr_ty e, expr_context_ty ctx, const node *n) +set_context(PyObject* _e, PyObject* ctx, const node *n) { - asdl_seq *s = NULL; + struct _expr *e = (struct _expr*)_e; + PyObject *s = NULL; - switch (e->kind) { +#define SET_CTX(x) Py_DECREF(x); Py_INCREF(ctx); x = ctx + switch (e->_kind) { case Attribute_kind: - if (ctx == Store && - !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) { + if (Store_Check(ctx) && + !strcmp(PyString_AS_STRING(Attribute_attr(e)), "None")) { return ast_error(n, "assignment to None"); } - e->v.Attribute.ctx = ctx; + SET_CTX(Attribute_ctx(e)); break; case Subscript_kind: - e->v.Subscript.ctx = ctx; + SET_CTX(Subscript_ctx(e)); break; case Name_kind: - if (ctx == Store && - !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) { + if (Store_Check(ctx) && + !strcmp(PyString_AS_STRING(Name_id(e)), "None")) { return ast_error(n, "assignment to None"); } - e->v.Name.ctx = ctx; + SET_CTX(Name_ctx(e)); break; case List_kind: - e->v.List.ctx = ctx; - s = e->v.List.elts; + SET_CTX(List_ctx(e)); + s = List_elts(e); break; case Tuple_kind: - if (asdl_seq_LEN(e->v.Tuple.elts) == 0) + if (PyList_GET_SIZE(Tuple_elts(e)) == 0) return ast_error(n, "can't assign to ()"); - e->v.Tuple.ctx = ctx; - s = e->v.Tuple.elts; + SET_CTX(Tuple_ctx(e)); + s = Tuple_elts(e); break; case Call_kind: - if (ctx == Store) + if (Store_Check(ctx)) return ast_error(n, "can't assign to function call"); - else if (ctx == Del) + else if (Del_Check(ctx)) return ast_error(n, "can't delete function call"); else return ast_error(n, "unexpected operation on function call"); @@ -427,7 +430,7 @@ char buf[300]; PyOS_snprintf(buf, sizeof(buf), "unexpected expression in assignment %d (line %d)", - e->kind, e->lineno); + e->_kind, e->lineno); return ast_error(n, buf); } } @@ -437,53 +440,54 @@ if (s) { int i; - for (i = 0; i < asdl_seq_LEN(s); i++) { - if (!set_context(asdl_seq_GET(s, i), ctx, n)) + for (i = 0; i < PyList_GET_SIZE(s); i++) { + if (!set_context(PyList_GET_ITEM(s, i), ctx, n)) return 0; } } return 1; +#undef SET_CTX } -static operator_ty +static PyObject* ast_for_augassign(const node *n) { REQ(n, augassign); n = CHILD(n, 0); switch (STR(n)[0]) { case '+': - return Add; + return Add(); case '-': - return Sub; + return Sub(); case '/': if (STR(n)[1] == '/') - return FloorDiv; + return FloorDiv(); else - return Div; + return Div(); case '%': - return Mod; + return Mod(); case '<': - return LShift; + return LShift(); case '>': - return RShift; + return RShift(); case '&': - return BitAnd; + return BitAnd(); case '^': - return BitXor; + return BitXor(); case '|': - return BitOr; + return BitOr(); case '*': if (STR(n)[1] == '*') - return Pow; + return Pow(); else - return Mult; + return Mult(); default: PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n)); return 0; } } -static cmpop_ty +static PyObject* ast_for_comp_op(const node *n) { /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is' @@ -494,22 +498,22 @@ n = CHILD(n, 0); switch (TYPE(n)) { case LESS: - return Lt; + return Lt(); case GREATER: - return Gt; + return Gt(); case EQEQUAL: /* == */ - return Eq; + return Eq(); case LESSEQUAL: - return LtE; + return LtE(); case GREATEREQUAL: - return GtE; + return GtE(); case NOTEQUAL: - return NotEq; + return NotEq(); case NAME: if (strcmp(STR(n), "in") == 0) - return In; + return In(); if (strcmp(STR(n), "is") == 0) - return Is; + return Is(); default: PyErr_Format(PyExc_SystemError, "invalid comp_op: %s", STR(n)); @@ -521,9 +525,9 @@ switch (TYPE(CHILD(n, 0))) { case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0) - return NotIn; + return NotIn(); if (strcmp(STR(CHILD(n, 0)), "is") == 0) - return IsNot; + return IsNot(); default: PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s", STR(CHILD(n, 0)), STR(CHILD(n, 1))); @@ -572,35 +576,44 @@ return result; } -static expr_ty +static PyObject* compiler_complex_args(const node *n) { int i, len = (NCH(n) + 1) / 2; - expr_ty result; - asdl_seq *args = asdl_seq_new(len); + PyObject *result = NULL; + PyObject *args = PyList_New(len); + PyObject *store = NULL; + PyObject *arg = NULL; if (!args) - return NULL; + goto error; + store = Store(); + if (!store) + goto error; REQ(n, fplist); for (i = 0; i < len; i++) { const node *child = CHILD(CHILD(n, 2*i), 0); - expr_ty arg; if (TYPE(child) == NAME) { - if (!strcmp(STR(child), "None")) { - ast_error(child, "assignment to None"); - return NULL; - } - arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child)); + if (!strcmp(STR(child), "None")) { + ast_error(child, "assignment to None"); + goto error; + } + arg = Name(NEW_IDENTIFIER(child), store, LINENO(child)); } else arg = compiler_complex_args(CHILD(CHILD(n, 2*i), 1)); - set_context(arg, Store, n); - asdl_seq_SET(args, i, arg); + if (!set_context(arg, store, n)) + goto error; + PyList_SET_ITEM(args, i, arg); } - result = Tuple(args, Store, LINENO(n)); - set_context(result, Store, n); + result = Tuple(args, store, LINENO(n)); + set_context(result, store, n); + error: + Py_XDECREF(args); + Py_XDECREF(arg); + Py_XDECREF(store); return result; } @@ -610,7 +623,7 @@ - check for invalid argument lists like normal after default */ -static arguments_ty +static PyObject* ast_for_arguments(struct compiling *c, const node *n) { /* parameters: '(' [varargslist] ')' @@ -618,8 +631,15 @@ | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [','] */ int i, n_args = 0, n_defaults = 0, found_default = 0; - asdl_seq *args, *defaults; - identifier vararg = NULL, kwarg = NULL; + int defno = 0, argno = 0; + PyObject *result = NULL; + PyObject *args = NULL; + PyObject *defaults = NULL; + PyObject *vararg = NULL; + PyObject *kwarg = NULL; + PyObject *e = NULL; + PyObject *id = NULL; + PyObject *param = NULL; node *ch; if (TYPE(n) == parameters) { @@ -638,10 +658,10 @@ if (TYPE(ch) == EQUAL) n_defaults++; } - args = (n_args ? asdl_seq_new(n_args) : NULL); + args = (n_args ? PyList_New(n_args) : NULL); if (!args && n_args) - return NULL; /* Don't need to go to NULL; nothing allocated */ - defaults = (n_defaults ? asdl_seq_new(n_defaults) : NULL); + goto error; + defaults = (n_defaults ? PyList_New(n_defaults) : NULL); if (!defaults && n_defaults) goto error; @@ -657,8 +677,10 @@ anything other than EQUAL or a comma? */ /* XXX Should NCH(n) check be made a separate check? */ if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) { - asdl_seq_APPEND(defaults, - ast_for_expr(c, CHILD(n, i + 2))); + e = ast_for_expr(c, CHILD(n, i + 2)); + if (!e) + goto error; + STEAL_ITEM(defaults, defno++, e); i += 2; found_default = 1; } @@ -669,20 +691,24 @@ } if (NCH(ch) == 3) { - asdl_seq_APPEND(args, - compiler_complex_args(CHILD(ch, 1))); + e = compiler_complex_args(CHILD(ch, 1)); + if (!e) + goto error; + STEAL_ITEM(args, argno++, e); } else if (TYPE(CHILD(ch, 0)) == NAME) { - expr_ty name; if (!strcmp(STR(CHILD(ch, 0)), "None")) { ast_error(CHILD(ch, 0), "assignment to None"); goto error; } - name = Name(NEW_IDENTIFIER(CHILD(ch, 0)), - Param, LINENO(ch)); - if (!name) + id = NEW_IDENTIFIER(CHILD(ch, 0)); + if (!id) goto error; + if (!param) param = Param(); + if (!param) goto error; + e = Name(id, param, LINENO(ch)); + if (!e) goto error; - asdl_seq_APPEND(args, name); + STEAL_ITEM(args, argno++, e); } i += 2; /* the name and the comma */ @@ -693,6 +719,8 @@ goto error; } vararg = NEW_IDENTIFIER(CHILD(n, i+1)); + if (!vararg) + goto error; i += 3; break; case DOUBLESTAR: @@ -701,6 +729,8 @@ goto error; } kwarg = NEW_IDENTIFIER(CHILD(n, i+1)); + if (!kwarg) + goto error; i += 3; break; default: @@ -711,16 +741,16 @@ } } - return arguments(args, vararg, kwarg, defaults); - + result = arguments(args, vararg, kwarg, defaults); error: Py_XDECREF(vararg); Py_XDECREF(kwarg); - if (args) - asdl_expr_seq_free(args); - if (defaults) - asdl_expr_seq_free(defaults); - return NULL; + Py_XDECREF(args); + Py_XDECREF(defaults); + Py_XDECREF(e); + Py_XDECREF(id); + Py_XDECREF(param); + return result; } static expr_ty @@ -1846,7 +1876,7 @@ ast_error(CHILD(ch, 0), "keyword can't be an expression"); goto error; } - key = e->v.Name.id; + key = Name_id(e); free(e); /* XXX: is free correct here? */ e = ast_for_expr(c, CHILD(ch, 2)); if (!e) From python-checkins at python.org Sun Dec 4 16:07:51 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 16:07:51 +0100 (CET) Subject: [Python-checkins] commit of r41585 - in python/trunk: Lib/SimpleXMLRPCServer.py Misc/NEWS Message-ID: <20051204150751.C4A031E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 16:07:41 2005 New Revision: 41585 Modified: python/trunk/Lib/SimpleXMLRPCServer.py python/trunk/Misc/NEWS Log: [Bug #1222790] Set reuse-address and close-on-exec flags on the HTTP listening socket Modified: python/trunk/Lib/SimpleXMLRPCServer.py ============================================================================== --- python/trunk/Lib/SimpleXMLRPCServer.py (original) +++ python/trunk/Lib/SimpleXMLRPCServer.py Sun Dec 4 16:07:41 2005 @@ -104,7 +104,7 @@ import SocketServer import BaseHTTPServer import sys -import os +import os, fcntl def resolve_dotted_attribute(obj, attr, allow_dotted_names=True): """resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d @@ -465,6 +465,8 @@ from SimpleXMLRPCDispatcher to change this behavior. """ + allow_reuse_address = True + def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=1): self.logRequests = logRequests @@ -472,6 +474,14 @@ SimpleXMLRPCDispatcher.__init__(self) SocketServer.TCPServer.__init__(self, addr, requestHandler) + # [Bug #1222790] If possible, set close-on-exec flag; if a + # method spawns a subprocess, the subprocess shouldn't have + # the listening socket open. + if hasattr(fcntl, 'FD_CLOEXEC'): + flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD) + flags |= fcntl.FD_CLOEXEC + fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags) + class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): """Simple handler for XML-RPC data passed through CGI.""" Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Dec 4 16:07:41 2005 @@ -448,6 +448,9 @@ disables recursive traversal through instance attributes, which can be exploited in various ways. +- Bug #1222790: in SimpleXMLRPCServer, set the reuse-address and close-on-exec + flags on the HTTP listening socket. + - Bug #1110478: Revert os.environ.update to do putenv again. - Bug #1103844: fix distutils.install.dump_dirs() with negated options. From python-checkins at python.org Sun Dec 4 16:37:05 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 16:37:05 +0100 (CET) Subject: [Python-checkins] commit of r41586 - in python/trunk: Lib/SimpleXMLRPCServer.py Misc/NEWS Message-ID: <20051204153705.0D91F1E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 16:36:57 2005 New Revision: 41586 Modified: python/trunk/Lib/SimpleXMLRPCServer.py python/trunk/Misc/NEWS Log: [Bug #792570] Under Windows, socket.read() seems to run into trouble when asked to read tens of megabytes of data. On my Mac, it hits MemoryErrors when reading around 15Mb in one chunk. The fix is to read the body in several parts, not as one big piece. It would be nice to fix the underlying socket.read() problem, too. 2.4 bugfix candidate. Modified: python/trunk/Lib/SimpleXMLRPCServer.py ============================================================================== --- python/trunk/Lib/SimpleXMLRPCServer.py (original) +++ python/trunk/Lib/SimpleXMLRPCServer.py Sun Dec 4 16:36:57 2005 @@ -422,8 +422,19 @@ """ try: - # get arguments - data = self.rfile.read(int(self.headers["content-length"])) + # Get arguments by reading body of request. + # We read this in chunks to avoid straining + # socket.read(); around the 10 or 15Mb mark, some platforms + # begin to have problems (bug #792570). + max_chunk_size = 10*1024*1024 + size_remaining = int(self.headers["content-length"]) + L = [] + while size_remaining: + chunk_size = min(size_remaining, max_chunk_size) + L.append(self.rfile.read(chunk_size)) + size_remaining -= len(L[-1]) + data = ''.join(L) + # In previous versions of SimpleXMLRPCServer, _dispatch # could be overridden in this class, instead of in # SimpleXMLRPCDispatcher. To maintain backwards compatibility, Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Dec 4 16:36:57 2005 @@ -451,6 +451,9 @@ - Bug #1222790: in SimpleXMLRPCServer, set the reuse-address and close-on-exec flags on the HTTP listening socket. +- Bug #792570: SimpleXMLRPCServer had problems if the request grew too large. + Fixed by reading the HTTP body in chunks instead of one big socket.read(). + - Bug #1110478: Revert os.environ.update to do putenv again. - Bug #1103844: fix distutils.install.dump_dirs() with negated options. From python-checkins at python.org Sun Dec 4 17:07:20 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 17:07:20 +0100 (CET) Subject: [Python-checkins] commit of r41587 - python/trunk/Doc/ref/ref3.tex Message-ID: <20051204160720.75F5C1E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 17:07:15 2005 New Revision: 41587 Modified: python/trunk/Doc/ref/ref3.tex Log: Add placeholder section on old and new-style classes Modified: python/trunk/Doc/ref/ref3.tex ============================================================================== --- python/trunk/Doc/ref/ref3.tex (original) +++ python/trunk/Doc/ref/ref3.tex Sun Dec 4 17:07:15 2005 @@ -1031,7 +1031,20 @@ \end{description} % Types +%========================================================================= +\section{New-style and classic classes} +Classes and instances come in two flavours: old-style or classic, and new-style. + +Old-style classes were the only flavour of class available before Python 2.1. While they supported multiple inheritance, the rules for resolving names were chosen for ease of implementation. These rules turn out to make multiple inheritance hard to use in certain situations. + +New-style classes were introduced in Python 2.1, and change the method resolution order to make multiple inheritance more usable. + +The plan is to eventually drop old-style classes, leaving only the semantics of new-style classes. This change will probably only be feasible in Python 3.0. + + + +%========================================================================= \section{Special method names\label{specialnames}} A class can implement certain operations that are invoked by special From python-checkins at python.org Sun Dec 4 17:10:04 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 17:10:04 +0100 (CET) Subject: [Python-checkins] commit of r41588 - python/trunk/Lib/cookielib.py Message-ID: <20051204161004.6B83D1E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 17:09:54 2005 New Revision: 41588 Modified: python/trunk/Lib/cookielib.py Log: [Bug #1372836] Remove unused code Modified: python/trunk/Lib/cookielib.py ============================================================================== --- python/trunk/Lib/cookielib.py (original) +++ python/trunk/Lib/cookielib.py Sun Dec 4 17:09:54 2005 @@ -1304,10 +1304,6 @@ self._policy._now = self._now = int(time.time()) - req_host, erhn = eff_request_host(request) - strict_non_domain = ( - self._policy.strict_ns_domain & self._policy.DomainStrictNonDomain) - cookies = self._cookies_for_request(request) attrs = self._cookie_attrs(cookies) From python-checkins at python.org Sun Dec 4 17:34:48 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 17:34:48 +0100 (CET) Subject: [Python-checkins] commit of r41589 - in python/trunk: Doc/lib/libsimplexmlrpc.tex Lib/SimpleXMLRPCServer.py Misc/NEWS Message-ID: <20051204163448.254741E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 17:34:40 2005 New Revision: 41589 Modified: python/trunk/Doc/lib/libsimplexmlrpc.tex python/trunk/Lib/SimpleXMLRPCServer.py python/trunk/Misc/NEWS Log: [Patch #893642] Add optional allow_none argument to SimpleXMLRPCServer, CGIXMLRPCRequestHandler Modified: python/trunk/Doc/lib/libsimplexmlrpc.tex ============================================================================== --- python/trunk/Doc/lib/libsimplexmlrpc.tex (original) +++ python/trunk/Doc/lib/libsimplexmlrpc.tex Sun Dec 4 17:34:40 2005 @@ -13,7 +13,8 @@ CGI environment, using \class{CGIXMLRPCRequestHandler}. \begin{classdesc}{SimpleXMLRPCServer}{addr\optional{, - requestHandler\optional{, logRequests}}} + requestHandler\optional{, + logRequests\optional{allow_none}}}} Create a new server instance. The \var{requestHandler} parameter should be a factory for request handler instances; it defaults to @@ -24,11 +25,13 @@ setting this parameter to false will turn off logging. This class provides methods for registration of functions that can be called by the XML-RPC protocol. + \versionchanged[The \var{allow_none} parameter was added]{2.5} \end{classdesc} -\begin{classdesc}{CGIXMLRPCRequestHandler}{} +\begin{classdesc}{CGIXMLRPCRequestHandler}{\optional{allow_none}} Create a new instance to handle XML-RPC requests in a CGI environment. \versionadded{2.3} + \versionchanged[The \var{allow_none} parameter was added]{2.5} \end{classdesc} \begin{classdesc}{SimpleXMLRPCRequestHandler}{} Modified: python/trunk/Lib/SimpleXMLRPCServer.py ============================================================================== --- python/trunk/Lib/SimpleXMLRPCServer.py (original) +++ python/trunk/Lib/SimpleXMLRPCServer.py Sun Dec 4 17:34:40 2005 @@ -159,9 +159,10 @@ reason to instantiate this class directly. """ - def __init__(self): + def __init__(self, allow_none): self.funcs = {} self.instance = None + self.allow_none = allow_none def register_instance(self, instance, allow_dotted_names=False): """Registers an instance to respond to XML-RPC requests. @@ -251,7 +252,8 @@ response = self._dispatch(method, params) # wrap response in a singleton tuple response = (response,) - response = xmlrpclib.dumps(response, methodresponse=1) + response = xmlrpclib.dumps(response, methodresponse=1, + allow_none = self.allow_none) except Fault, fault: response = xmlrpclib.dumps(fault) except: @@ -479,10 +481,10 @@ allow_reuse_address = True def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler, - logRequests=1): + logRequests=1, allow_none=False): self.logRequests = logRequests - SimpleXMLRPCDispatcher.__init__(self) + SimpleXMLRPCDispatcher.__init__(self, allow_none) SocketServer.TCPServer.__init__(self, addr, requestHandler) # [Bug #1222790] If possible, set close-on-exec flag; if a @@ -496,8 +498,8 @@ class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): """Simple handler for XML-RPC data passed through CGI.""" - def __init__(self): - SimpleXMLRPCDispatcher.__init__(self) + def __init__(self, allow_none=False): + SimpleXMLRPCDispatcher.__init__(self, allow_none) def handle_xmlrpc(self, request_text): """Handle a single XML-RPC request""" Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Dec 4 17:34:40 2005 @@ -454,6 +454,9 @@ - Bug #792570: SimpleXMLRPCServer had problems if the request grew too large. Fixed by reading the HTTP body in chunks instead of one big socket.read(). +- Patch #893642: add allow_none argument to constructors of + SimpleXMLRPCServer and CGIXMLRPCRequestHandler. + - Bug #1110478: Revert os.environ.update to do putenv again. - Bug #1103844: fix distutils.install.dump_dirs() with negated options. From python-checkins at python.org Sun Dec 4 17:45:11 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 17:45:11 +0100 (CET) Subject: [Python-checkins] commit of r41590 - python/trunk/Lib/SimpleXMLRPCServer.py Message-ID: <20051204164511.0A09A1E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 17:45:05 2005 New Revision: 41590 Modified: python/trunk/Lib/SimpleXMLRPCServer.py Log: Use boolean name Modified: python/trunk/Lib/SimpleXMLRPCServer.py ============================================================================== --- python/trunk/Lib/SimpleXMLRPCServer.py (original) +++ python/trunk/Lib/SimpleXMLRPCServer.py Sun Dec 4 17:45:05 2005 @@ -481,7 +481,7 @@ allow_reuse_address = True def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler, - logRequests=1, allow_none=False): + logRequests=True, allow_none=False): self.logRequests = logRequests SimpleXMLRPCDispatcher.__init__(self, allow_none) From python-checkins at python.org Sun Dec 4 18:13:18 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 18:13:18 +0100 (CET) Subject: [Python-checkins] commit of r41591 - in python/trunk: Doc/lib/libsimplexmlrpc.tex Lib/SimpleXMLRPCServer.py Misc/NEWS Message-ID: <20051204171318.B092B1E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 18:13:12 2005 New Revision: 41591 Modified: python/trunk/Doc/lib/libsimplexmlrpc.tex python/trunk/Lib/SimpleXMLRPCServer.py python/trunk/Misc/NEWS Log: [Patch #1039083] Add 'encoding' parameter to SimpleXMLRPCServer Modified: python/trunk/Doc/lib/libsimplexmlrpc.tex ============================================================================== --- python/trunk/Doc/lib/libsimplexmlrpc.tex (original) +++ python/trunk/Doc/lib/libsimplexmlrpc.tex Sun Dec 4 18:13:12 2005 @@ -14,24 +14,31 @@ \begin{classdesc}{SimpleXMLRPCServer}{addr\optional{, requestHandler\optional{, - logRequests\optional{allow_none}}}} + logRequests\optional{allow_none\optional{, encoding}}}}} - Create a new server instance. The \var{requestHandler} parameter + Create a new server instance. This class + provides methods for registration of functions that can be called by + the XML-RPC protocol. The \var{requestHandler} parameter should be a factory for request handler instances; it defaults to \class{SimpleXMLRPCRequestHandler}. The \var{addr} and \var{requestHandler} parameters are passed to the \class{\refmodule{SocketServer}.TCPServer} constructor. If \var{logRequests} is true (the default), requests will be logged; - setting this parameter to false will turn off logging. This class - provides methods for registration of functions that can be called by - the XML-RPC protocol. - \versionchanged[The \var{allow_none} parameter was added]{2.5} + setting this parameter to false will turn off logging. + The \var{allow_none} and \var{encoding} parameters are passed on to + \module{xmlrpclib} and control the XML-RPC responses that will be returned + from the server. + \versionchanged[The \var{allow_none} and \var{encoding} parameters were added]{2.5} \end{classdesc} -\begin{classdesc}{CGIXMLRPCRequestHandler}{\optional{allow_none}} +\begin{classdesc}{CGIXMLRPCRequestHandler}{\optional{allow_none\optional{, encoding}}} Create a new instance to handle XML-RPC requests in a CGI - environment. \versionadded{2.3} - \versionchanged[The \var{allow_none} parameter was added]{2.5} + environment. + The \var{allow_none} and \var{encoding} parameters are passed on to + \module{xmlrpclib} and control the XML-RPC responses that will be returned + from the server. + \versionadded{2.3} + \versionchanged[The \var{allow_none} and \var{encoding} parameters were added]{2.5} \end{classdesc} \begin{classdesc}{SimpleXMLRPCRequestHandler}{} Modified: python/trunk/Lib/SimpleXMLRPCServer.py ============================================================================== --- python/trunk/Lib/SimpleXMLRPCServer.py (original) +++ python/trunk/Lib/SimpleXMLRPCServer.py Sun Dec 4 18:13:12 2005 @@ -159,10 +159,11 @@ reason to instantiate this class directly. """ - def __init__(self, allow_none): + def __init__(self, allow_none, encoding): self.funcs = {} self.instance = None self.allow_none = allow_none + self.encoding = encoding def register_instance(self, instance, allow_dotted_names=False): """Registers an instance to respond to XML-RPC requests. @@ -253,13 +254,15 @@ # wrap response in a singleton tuple response = (response,) response = xmlrpclib.dumps(response, methodresponse=1, - allow_none = self.allow_none) + allow_none=self.allow_none, encoding=self.encoding) except Fault, fault: - response = xmlrpclib.dumps(fault) + response = xmlrpclib.dumps(fault, allow_none=self.allow_none, + encoding=self.encoding) except: # report exception back to server response = xmlrpclib.dumps( - xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)) + xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)), + encoding=self.encoding, allow_none=self.allow_none, ) return response @@ -481,10 +484,10 @@ allow_reuse_address = True def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler, - logRequests=True, allow_none=False): + logRequests=True, allow_none=False, encoding=None): self.logRequests = logRequests - SimpleXMLRPCDispatcher.__init__(self, allow_none) + SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) SocketServer.TCPServer.__init__(self, addr, requestHandler) # [Bug #1222790] If possible, set close-on-exec flag; if a @@ -498,8 +501,8 @@ class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): """Simple handler for XML-RPC data passed through CGI.""" - def __init__(self, allow_none=False): - SimpleXMLRPCDispatcher.__init__(self, allow_none) + def __init__(self, allow_none=False, encoding=None): + SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) def handle_xmlrpc(self, request_text): """Handle a single XML-RPC request""" Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Dec 4 18:13:12 2005 @@ -454,7 +454,7 @@ - Bug #792570: SimpleXMLRPCServer had problems if the request grew too large. Fixed by reading the HTTP body in chunks instead of one big socket.read(). -- Patch #893642: add allow_none argument to constructors of +- Patches #893642, #1039083: add allow_none, encoding arguments to constructors of SimpleXMLRPCServer and CGIXMLRPCRequestHandler. - Bug #1110478: Revert os.environ.update to do putenv again. From python-checkins at python.org Sun Dec 4 18:17:50 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 18:17:50 +0100 (CET) Subject: [Python-checkins] commit of r41592 - python/trunk/Doc/lib/libsimplexmlrpc.tex Message-ID: <20051204171750.3CE0A1E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 18:17:46 2005 New Revision: 41592 Modified: python/trunk/Doc/lib/libsimplexmlrpc.tex Log: [Bug #1041501] Fix example Modified: python/trunk/Doc/lib/libsimplexmlrpc.tex ============================================================================== --- python/trunk/Doc/lib/libsimplexmlrpc.tex (original) +++ python/trunk/Doc/lib/libsimplexmlrpc.tex Sun Dec 4 18:17:46 2005 @@ -206,7 +206,7 @@ \begin{verbatim} class MyFuncs: - def div(self, x, y) : return div(x,y) + def div(self, x, y) : return x // y handler = CGIXMLRPCRequestHandler() From python-checkins at python.org Sun Dec 4 19:47:37 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 4 Dec 2005 19:47:37 +0100 (CET) Subject: [Python-checkins] commit of r41593 - python/branches/ast-objects/Python/ast.c Message-ID: <20051204184737.6504F1E400B@bag.python.org> Author: martin.v.loewis Date: Sun Dec 4 19:47:32 2005 New Revision: 41593 Modified: python/branches/ast-objects/Python/ast.c Log: Make it compile up to line 920. Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Sun Dec 4 19:47:32 2005 @@ -753,12 +753,14 @@ return result; } -static expr_ty +static PyObject* ast_for_dotted_name(struct compiling *c, const node *n) { - expr_ty e = NULL; - expr_ty attrib = NULL; - identifier id = NULL; + PyObject *result = NULL; + PyObject *e = NULL; + PyObject *attrib = NULL; + PyObject *id = NULL; + PyObject *load = NULL; int i; REQ(n, dotted_name); @@ -766,8 +768,11 @@ id = NEW_IDENTIFIER(CHILD(n, 0)); if (!id) goto error; - e = Name(id, Load, LINENO(n)); - if (!e) + load = Load(); + if (!load) + goto error; + e = Name(id, load, LINENO(n)); + if (!result) goto error; id = NULL; @@ -775,27 +780,30 @@ id = NEW_IDENTIFIER(CHILD(n, i)); if (!id) goto error; - attrib = Attribute(e, id, Load, LINENO(CHILD(n, i))); + attrib = Attribute(e, id, load, LINENO(CHILD(n, i))); if (!attrib) goto error; e = attrib; attrib = NULL; } - - return e; + result = e; + e = NULL; error: Py_XDECREF(id); - free_expr(e); + Py_XDECREF(e); + Py_XDECREF(attrib); + Py_XDECREF(load); return NULL; } -static expr_ty +static PyObject* ast_for_decorator(struct compiling *c, const node *n) { /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */ - expr_ty d = NULL; - expr_ty name_expr = NULL; + PyObject *result = NULL; + PyObject *d = NULL; + PyObject *name_expr = NULL; REQ(n, decorator); @@ -817,56 +825,59 @@ d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n)); if (!d) goto error; - name_expr = NULL; } else { d = ast_for_call(c, CHILD(n, 3), name_expr); if (!d) goto error; - name_expr = NULL; } - return d; + result = d; + d = NULL; error: - free_expr(name_expr); - free_expr(d); - return NULL; + Py_XDECREF(name_expr); + Py_XDECREF(d); + return result; } -static asdl_seq* +static PyObject* ast_for_decorators(struct compiling *c, const node *n) { - asdl_seq* decorator_seq = NULL; - expr_ty d; + PyObject *result = NULL; + PyObject *decorator_seq = NULL; + PyObject *d = NULL; int i; REQ(n, decorators); - decorator_seq = asdl_seq_new(NCH(n)); + decorator_seq = PyList_New(NCH(n)); if (!decorator_seq) - return NULL; + goto error; for (i = 0; i < NCH(n); i++) { d = ast_for_decorator(c, CHILD(n, i)); if (!d) goto error; - asdl_seq_APPEND(decorator_seq, d); + STEAL_ITEM(decorator_seq, i, d); } - return decorator_seq; + result = decorator_seq; + decorator_seq = NULL; error: - asdl_expr_seq_free(decorator_seq); - return NULL; + Py_XDECREF(decorator_seq); + Py_XDECREF(d); + return result; } -static stmt_ty +static PyObject* ast_for_funcdef(struct compiling *c, const node *n) { /* funcdef: 'def' [decorators] NAME parameters ':' suite */ - identifier name = NULL; - arguments_ty args = NULL; - asdl_seq *body = NULL; - asdl_seq *decorator_seq = NULL; + PyObject *result = NULL; + PyObject *name = NULL; + PyObject *args = NULL; + PyObject *body = NULL; + PyObject *decorator_seq = NULL; int name_i; REQ(n, funcdef); @@ -895,14 +906,14 @@ if (!body) goto error; - return FunctionDef(name, args, body, decorator_seq, LINENO(n)); + result = FunctionDef(name, args, body, decorator_seq, LINENO(n)); error: - asdl_stmt_seq_free(body); - asdl_expr_seq_free(decorator_seq); - free_arguments(args); + Py_XDECREF(body); + Py_XDECREF(decorator_seq); + Py_XDECREF(args); Py_XDECREF(name); - return NULL; + return result; } static expr_ty From python-checkins at python.org Sun Dec 4 20:11:22 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 20:11:22 +0100 (CET) Subject: [Python-checkins] commit of r41594 - in python/trunk/Lib: test/test_xmlrpc.py xmlrpclib.py Message-ID: <20051204191122.D6DF21E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 20:11:17 2005 New Revision: 41594 Modified: python/trunk/Lib/test/test_xmlrpc.py python/trunk/Lib/xmlrpclib.py Log: [Bug #1164912] Ensure Datetime wrapper class .value attribute is an 8-bit string, not a Unicode string Modified: python/trunk/Lib/test/test_xmlrpc.py ============================================================================== --- python/trunk/Lib/test/test_xmlrpc.py (original) +++ python/trunk/Lib/test/test_xmlrpc.py Sun Dec 4 20:11:17 2005 @@ -76,6 +76,16 @@ (newdt,), m = xmlrpclib.loads(s, use_datetime=0) self.assertEquals(newdt, xmlrpclib.DateTime('%sT11:41:23'%today)) + def test_bug_1164912 (self): + d = xmlrpclib.DateTime() + ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), + methodresponse=True)) + self.assert_(isinstance(new_d.value, str)) + + # Check that the output of dumps() is still an 8-bit string + s = xmlrpclib.dumps((new_d,), methodresponse=True) + self.assert_(isinstance(s, str)) + def test_dump_big_long(self): self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,)) Modified: python/trunk/Lib/xmlrpclib.py ============================================================================== --- python/trunk/Lib/xmlrpclib.py (original) +++ python/trunk/Lib/xmlrpclib.py Sun Dec 4 20:11:17 2005 @@ -388,6 +388,7 @@ return "" % (repr(self.value), id(self)) def decode(self, data): + data = str(data) self.value = string.strip(data) def encode(self, out): From python-checkins at python.org Sun Dec 4 20:12:10 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 4 Dec 2005 20:12:10 +0100 (CET) Subject: [Python-checkins] commit of r41595 - python/branches/ast-objects/Python/ast.c Message-ID: <20051204191210.9161E1E400B@bag.python.org> Author: martin.v.loewis Date: Sun Dec 4 20:12:04 2005 New Revision: 41595 Modified: python/branches/ast-objects/Python/ast.c Log: Perform a few schematic changes. Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Sun Dec 4 20:12:04 2005 @@ -916,12 +916,13 @@ return result; } -static expr_ty +static PyObject* ast_for_lambdef(struct compiling *c, const node *n) { /* lambdef: 'lambda' [varargslist] ':' test */ - arguments_ty args; - expr_ty expression; + PyObject *result = NULL; + PyObject *args = NULL; + PyObject *expression = NULL; if (NCH(n) == 3) { args = arguments(NULL, NULL, NULL, NULL); @@ -1008,7 +1009,7 @@ goto count_list_iter; } -static expr_ty +static PyObject* ast_for_listcomp(struct compiling *c, const node *n) { /* listmaker: test ( list_for | (',' test)* [','] ) @@ -1017,8 +1018,8 @@ list_if: 'if' test [list_iter] testlist_safe: test [(',' test)+ [',']] */ - expr_ty elt; - asdl_seq *listcomps; + PyObject *elt = NULL; + PyObject *listcomps = NULL; int i, n_fors; node *ch; @@ -1042,8 +1043,8 @@ ch = CHILD(n, 1); for (i = 0; i < n_fors; i++) { comprehension_ty lc; - asdl_seq *t; - expr_ty expression; + PyObject *t = NULL; + PyObject *expression = NULL; REQ(ch, list_for); @@ -1080,7 +1081,7 @@ if (NCH(ch) == 5) { int j, n_ifs; - asdl_seq *ifs; + PyObject *ifs = NULL; ch = CHILD(ch, 4); n_ifs = count_list_ifs(ch); @@ -1183,13 +1184,14 @@ } } -static expr_ty +static PyObject* ast_for_genexp(struct compiling *c, const node *n) { /* testlist_gexp: test ( gen_for | (',' test)* [','] ) argument: [test '='] test [gen_for] # Really [keyword '='] test */ - expr_ty elt; - asdl_seq *genexps; + PyObject *result = NULL; + PyObject *elt = NULL; + PyObject *genexps = NULL; int i, n_fors; node *ch; @@ -1213,8 +1215,8 @@ ch = CHILD(n, 1); for (i = 0; i < n_fors; i++) { comprehension_ty ge; - asdl_seq *t; - expr_ty expression; + PyObject *t = NULL; + PyObject *expression = NULL; REQ(ch, gen_for); @@ -1253,7 +1255,7 @@ if (NCH(ch) == 5) { int j, n_ifs; - asdl_seq *ifs; + PyObject *ifs = NULL; ch = CHILD(ch, 4); n_ifs = count_gen_ifs(ch); @@ -1273,7 +1275,7 @@ } for (j = 0; j < n_ifs; j++) { - expr_ty expression; + PyObject *expression = NULL; REQ(ch, gen_iter); ch = CHILD(ch, 0); REQ(ch, gen_if); @@ -1301,12 +1303,13 @@ return GeneratorExp(elt, genexps, LINENO(n)); } -static expr_ty +static PyObject* ast_for_atom(struct compiling *c, const node *n) { /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+ */ + PyObject *result = NULL; node *ch = CHILD(n, 0); switch (TYPE(ch)) { @@ -1363,7 +1366,7 @@ case LBRACE: { /* dictmaker: test ':' test (',' test ':' test)* [','] */ int i, size; - asdl_seq *keys, *values; + PyObject *keys = NULL; PyObject *values = NULL; ch = CHILD(n, 1); size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ @@ -1378,7 +1381,7 @@ } for (i = 0; i < NCH(ch); i += 4) { - expr_ty expression; + PyObject *expression = NULL; expression = ast_for_expr(c, CHILD(ch, i)); if (!expression) { @@ -1414,9 +1417,10 @@ } } -static slice_ty +static PyObject* ast_for_slice(struct compiling *c, const node *n) { + PyObject *result = NULL; node *ch; expr_ty lower = NULL, upper = NULL, step = NULL; @@ -1485,7 +1489,7 @@ return Slice(lower, upper, step); } -static expr_ty +static PyObject* ast_for_binop(struct compiling *c, const node *n) { /* Must account for a sequence of expressions. @@ -1493,8 +1497,9 @@ BinOp(BinOp(A, op, B), op, C). */ + PyObject *result = NULL; int i, nops; - expr_ty expr1, expr2, result; + PyObject *expr1 = NULL; PyObject *expr2 = NULL; PyObject *result = NULL; operator_ty operator; expr1 = ast_for_expr(c, CHILD(n, 0)); @@ -1515,7 +1520,7 @@ nops = (NCH(n) - 1) / 2; for (i = 1; i < nops; i++) { - expr_ty tmp_result, tmp; + PyObject *tmp_result = NULL; PyObject *tmp = NULL; const node* next_oper = CHILD(n, i * 2 + 1); operator = get_operator(next_oper); @@ -1535,11 +1540,12 @@ return result; } -static expr_ty +static PyObject* ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) { /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME */ - expr_ty e; + PyObject *result = NULL; + PyObject *e = NULL; REQ(n, trailer); if (TYPE(CHILD(n, 0)) == LPAR) { if (NCH(n) == 2) @@ -1592,13 +1598,14 @@ return e; } -static expr_ty +static PyObject* ast_for_power(struct compiling *c, const node *n) { /* power: atom trailer* ('**' factor)* */ + PyObject *result = NULL; int i; - expr_ty e, tmp; + PyObject *e = NULL; PyObject *tmp = NULL; REQ(n, power); e = ast_for_atom(c, CHILD(n, 0)); if (!e) @@ -1636,7 +1643,7 @@ /* Do not name a variable 'expr'! Will cause a compile error. */ -static expr_ty +static PyObject* ast_for_expr(struct compiling *c, const node *n) { /* handle the full range of simple expressions @@ -1654,7 +1661,8 @@ power: atom trailer* ('**' factor)* */ - asdl_seq *seq; + PyObject *result = NULL; + PyObject *seq = NULL; int i; loop: @@ -1702,8 +1710,8 @@ goto loop; } else { - expr_ty expression; - asdl_seq *ops, *cmps; + PyObject *expression = NULL; + PyObject *ops = NULL; PyObject *cmps = NULL; ops = asdl_seq_new(NCH(n) / 2); if (!ops) return NULL; @@ -1769,7 +1777,7 @@ return Yield(exp, LINENO(n)); } case factor: { - expr_ty expression; + PyObject *expression = NULL; if (NCH(n) == 1) { n = CHILD(n, 0); @@ -1802,7 +1810,7 @@ return NULL; } -static expr_ty +static PyObject* ast_for_call(struct compiling *c, const node *n, expr_ty func) { /* @@ -1811,6 +1819,7 @@ argument: [test '='] test [gen_for] # Really [keyword '='] test */ + PyObject *result = NULL; int i, nargs, nkeywords, ngens; asdl_seq *args = NULL; asdl_seq *keywords = NULL; @@ -1854,7 +1863,7 @@ for (i = 0; i < NCH(n); i++) { node *ch = CHILD(n, i); if (TYPE(ch) == argument) { - expr_ty e; + PyObject *e = NULL; if (NCH(ch) == 1) { e = ast_for_expr(c, CHILD(ch, 0)); if (!e) @@ -1923,13 +1932,14 @@ return NULL; } -static expr_ty +static PyObject* ast_for_testlist(struct compiling *c, const node* n) { /* testlist_gexp: test (',' test)* [','] */ /* testlist: test (',' test)* [','] */ /* testlist_safe: test (',' test)+ [','] */ /* testlist1: test (',' test)* */ + PyObject *result = NULL; assert(NCH(n) > 0); if (TYPE(n) == testlist_gexp) { if (NCH(n) > 1) @@ -1950,11 +1960,12 @@ } } -static expr_ty +static PyObject* ast_for_testlist_gexp(struct compiling *c, const node* n) { /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */ /* argument: test [ gen_for ] */ + PyObject *result = NULL; assert(TYPE(n) == testlist_gexp || TYPE(n) == argument); if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) { return ast_for_genexp(c, n); @@ -1968,10 +1979,11 @@ ast_for_class_bases(struct compiling *c, const node* n) { /* testlist: test (',' test)* [','] */ + PyObject *result = NULL; assert(NCH(n) > 0); REQ(n, testlist); if (NCH(n) == 1) { - expr_ty base; + PyObject *base = NULL; asdl_seq *bases = asdl_seq_new(1); if (!bases) return NULL; @@ -1988,9 +2000,10 @@ } } -static stmt_ty +static PyObject* ast_for_expr_stmt(struct compiling *c, const node *n) { + PyObject *result = NULL; REQ(n, expr_stmt); /* expr_stmt: testlist (augassign (yield_expr|testlist) | ('=' (yield_expr|testlist))*) @@ -2008,7 +2021,7 @@ return Expr(e, LINENO(n)); } else if (TYPE(CHILD(n, 1)) == augassign) { - expr_ty expr1, expr2; + PyObject *expr1 = NULL; PyObject *expr2 = NULL; operator_ty operator; node *ch = CHILD(n, 0); @@ -2055,9 +2068,9 @@ } else { int i; - asdl_seq *targets; + PyObject *targets = NULL; node *value; - expr_ty expression; + PyObject *expression = NULL; /* a normal assignment */ REQ(CHILD(n, 1), EQUAL); @@ -2065,7 +2078,7 @@ if (!targets) return NULL; for (i = 0; i < NCH(n) - 2; i += 2) { - expr_ty e; + PyObject *e = NULL; node *ch = CHILD(n, i); if (TYPE(ch) == yield_expr) { ast_error(ch, "assignment to yield expression not possible"); @@ -2098,14 +2111,15 @@ return NULL; } -static stmt_ty +static PyObject* ast_for_print_stmt(struct compiling *c, const node *n) { /* print_stmt: 'print' ( [ test (',' test)* [','] ] | '>>' test [ (',' test)+ [','] ] ) */ + PyObject *result = NULL; expr_ty dest = NULL, expression; - asdl_seq *seq; + PyObject *seq = NULL; int nl; int i, start = 1; @@ -2136,9 +2150,9 @@ static asdl_seq * ast_for_exprlist(struct compiling *c, const node *n, int context) { - asdl_seq *seq; + PyObject *seq = NULL; int i; - expr_ty e; + PyObject *e = NULL; REQ(n, exprlist); @@ -2162,10 +2176,11 @@ return NULL; } -static stmt_ty +static PyObject* ast_for_del_stmt(struct compiling *c, const node *n) { - asdl_seq *expr_list; + PyObject *result = NULL; + PyObject *expr_list = NULL; /* del_stmt: 'del' exprlist */ REQ(n, del_stmt); @@ -2176,7 +2191,7 @@ return Delete(expr_list, LINENO(n)); } -static stmt_ty +static PyObject* ast_for_flow_stmt(struct compiling *c, const node *n) { /* @@ -2189,6 +2204,7 @@ yield_expr: 'yield' testlist raise_stmt: 'raise' [test [',' test [',' test]]] */ + PyObject *result = NULL; node *ch; REQ(n, flow_stmt); @@ -2223,7 +2239,7 @@ return Raise(expression, NULL, NULL, LINENO(n)); } else if (NCH(ch) == 4) { - expr_ty expr1, expr2; + PyObject *expr1 = NULL; PyObject *expr2 = NULL; expr1 = ast_for_expr(c, CHILD(ch, 1)); if (!expr1) @@ -2235,7 +2251,7 @@ return Raise(expr1, expr2, NULL, LINENO(n)); } else if (NCH(ch) == 6) { - expr_ty expr1, expr2, expr3; + PyObject *expr1 = NULL; PyObject *expr2 = NULL; PyObject *expr3 = NULL; expr1 = ast_for_expr(c, CHILD(ch, 1)); if (!expr1) @@ -2256,7 +2272,7 @@ } } -static alias_ty +static PyObject* alias_for_import_name(const node *n) { /* @@ -2264,6 +2280,7 @@ dotted_as_name: dotted_name [NAME NAME] dotted_name: NAME ('.' NAME)* */ + PyObject *result = NULL; loop: switch (TYPE(n)) { case import_as_name: @@ -2328,7 +2345,7 @@ return NULL; } -static stmt_ty +static PyObject* ast_for_import_stmt(struct compiling *c, const node *n) { /* @@ -2338,8 +2355,9 @@ '(' import_as_names ')' | import_as_names) */ + PyObject *result = NULL; int i; - asdl_seq *aliases; + PyObject *aliases = NULL; REQ(n, import_stmt); n = CHILD(n, 0); @@ -2433,12 +2451,13 @@ return NULL; } -static stmt_ty +static PyObject* ast_for_global_stmt(struct compiling *c, const node *n) { /* global_stmt: 'global' NAME (',' NAME)* */ + PyObject *result = NULL; identifier name; - asdl_seq *s; + PyObject *s = NULL; int i; REQ(n, global_stmt); @@ -2458,7 +2477,7 @@ return Global(s, LINENO(n)); } -static stmt_ty +static PyObject* ast_for_exec_stmt(struct compiling *c, const node *n) { expr_ty expr1, globals = NULL, locals = NULL; @@ -2489,10 +2508,11 @@ return Exec(expr1, globals, locals, LINENO(n)); } -static stmt_ty +static PyObject* ast_for_assert_stmt(struct compiling *c, const node *n) { /* assert_stmt: 'assert' test [',' test] */ + PyObject *result = NULL; REQ(n, assert_stmt); if (NCH(n) == 2) { expr_ty expression = ast_for_expr(c, CHILD(n, 1)); @@ -2501,7 +2521,7 @@ return Assert(expression, NULL, LINENO(n)); } else if (NCH(n) == 4) { - expr_ty expr1, expr2; + PyObject *expr1 = NULL; PyObject *expr2 = NULL; expr1 = ast_for_expr(c, CHILD(n, 1)); if (!expr1) @@ -2583,19 +2603,20 @@ return NULL; } -static stmt_ty +static PyObject* ast_for_if_stmt(struct compiling *c, const node *n) { /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */ + PyObject *result = NULL; char *s; REQ(n, if_stmt); if (NCH(n) == 4) { - expr_ty expression; - asdl_seq *suite_seq; + PyObject *expression = NULL; + PyObject *suite_seq = NULL; expression = ast_for_expr(c, CHILD(n, 1)); if (!expression) @@ -2614,8 +2635,8 @@ 'i' for el_i_f */ if (s[2] == 's') { - expr_ty expression; - asdl_seq *seq1, *seq2; + PyObject *expression = NULL; + PyObject *seq1 = NULL; PyObject *seq2 = NULL; expression = ast_for_expr(c, CHILD(n, 1)); if (!expression) @@ -2648,8 +2669,8 @@ n_elif /= 4; if (has_else) { - expr_ty expression; - asdl_seq *seq1, *seq2; + PyObject *expression = NULL; + PyObject *seq1 = NULL; PyObject *seq2 = NULL; orelse = asdl_seq_new(1); if (!orelse) @@ -2683,8 +2704,8 @@ for (i = 0; i < n_elif; i++) { int off = 5 + (n_elif - i - 1) * 4; - expr_ty expression; - asdl_seq *suite_seq; + PyObject *expression = NULL; + PyObject *suite_seq = NULL; asdl_seq *new = asdl_seq_new(1); if (!new) { asdl_stmt_seq_free(orelse); @@ -2720,15 +2741,16 @@ } } -static stmt_ty +static PyObject* ast_for_while_stmt(struct compiling *c, const node *n) { /* while_stmt: 'while' test ':' suite ['else' ':' suite] */ + PyObject *result = NULL; REQ(n, while_stmt); if (NCH(n) == 4) { - expr_ty expression; - asdl_seq *suite_seq; + PyObject *expression = NULL; + PyObject *suite_seq = NULL; expression = ast_for_expr(c, CHILD(n, 1)); if (!expression) @@ -2741,8 +2763,8 @@ return While(expression, suite_seq, NULL, LINENO(n)); } else if (NCH(n) == 7) { - expr_ty expression; - asdl_seq *seq1, *seq2; + PyObject *expression = NULL; + PyObject *seq1 = NULL; PyObject *seq2 = NULL; expression = ast_for_expr(c, CHILD(n, 1)); if (!expression) @@ -2769,12 +2791,13 @@ } } -static stmt_ty +static PyObject* ast_for_for_stmt(struct compiling *c, const node *n) { + PyObject *result = NULL; asdl_seq *_target = NULL, *seq = NULL, *suite_seq = NULL; - expr_ty expression; - expr_ty target; + PyObject *expression = NULL; + PyObject *target = NULL; /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */ REQ(n, for_stmt); @@ -2813,10 +2836,11 @@ return For(target, expression, suite_seq, seq, LINENO(n)); } -static excepthandler_ty +static PyObject* ast_for_except_clause(struct compiling *c, const node *exc, node *body) { /* except_clause: 'except' [test [',' test]] */ + PyObject *result = NULL; REQ(exc, except_clause); REQ(body, suite); @@ -2828,8 +2852,8 @@ return excepthandler(NULL, NULL, suite_seq); } else if (NCH(exc) == 2) { - expr_ty expression; - asdl_seq *suite_seq; + PyObject *expression = NULL; + PyObject *suite_seq = NULL; expression = ast_for_expr(c, CHILD(exc, 1)); if (!expression) @@ -2843,8 +2867,8 @@ return excepthandler(expression, NULL, suite_seq); } else if (NCH(exc) == 4) { - asdl_seq *suite_seq; - expr_ty expression; + PyObject *suite_seq = NULL; + PyObject *expression = NULL; expr_ty e = ast_for_expr(c, CHILD(exc, 3)); if (!e) return NULL; @@ -2874,14 +2898,15 @@ } } -static stmt_ty +static PyObject* ast_for_try_stmt(struct compiling *c, const node *n) { + PyObject *result = NULL; REQ(n, try_stmt); if (TYPE(CHILD(n, 3)) == NAME) {/* must be 'finally' */ /* try_stmt: 'try' ':' suite 'finally' ':' suite) */ - asdl_seq *s1, *s2; + PyObject *s1 = NULL; PyObject *s2 = NULL; s1 = ast_for_suite(c, CHILD(n, 2)); if (!s1) return NULL; @@ -2897,8 +2922,8 @@ /* try_stmt: ('try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] */ - asdl_seq *suite_seq1, *suite_seq2; - asdl_seq *handlers; + PyObject *suite_seq1 = NULL; PyObject *suite_seq2 = NULL; + PyObject *handlers = NULL; int i, has_else = 0, n_except = NCH(n) - 3; if (TYPE(CHILD(n, NCH(n) - 3)) == NAME) { has_else = 1; @@ -2949,11 +2974,12 @@ } } -static stmt_ty +static PyObject* ast_for_classdef(struct compiling *c, const node *n) { /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */ - asdl_seq *bases, *s; + PyObject *result = NULL; + PyObject *bases = NULL; PyObject *s = NULL; REQ(n, classdef); @@ -2989,9 +3015,10 @@ return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n)); } -static stmt_ty +static PyObject* ast_for_stmt(struct compiling *c, const node *n) { + PyObject *result = NULL; if (TYPE(n) == stmt) { assert(NCH(n) == 1); n = CHILD(n, 0); @@ -3064,6 +3091,7 @@ static PyObject * parsenumber(const char *s) { + PyObject *result = NULL; const char *end; long x; double dx; @@ -3116,6 +3144,7 @@ static PyObject * decode_utf8(const char **sPtr, const char *end, char* encoding) { + PyObject *result = NULL; #ifndef Py_USING_UNICODE Py_FatalError("decode_utf8 should not be called in this build."); return NULL; @@ -3138,6 +3167,7 @@ static PyObject * decode_unicode(const char *s, size_t len, int rawmode, const char *encoding) { + PyObject *result = NULL; PyObject *v, *u; char *buf; char *p; @@ -3204,6 +3234,7 @@ static PyObject * parsestr(const char *s, const char *encoding) { + PyObject *result = NULL; PyObject *v; size_t len; int quote = *s; @@ -3283,6 +3314,7 @@ static PyObject * parsestrplus(struct compiling *c, const node *n) { + PyObject *result = NULL; PyObject *v; int i; REQ(CHILD(n, 0), STRING); From python-checkins at python.org Sun Dec 4 20:46:37 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 4 Dec 2005 20:46:37 +0100 (CET) Subject: [Python-checkins] commit of r41596 - in python/branches/ast-objects: Include/Python-ast.h Parser/asdl_c.py Python/ast.c Message-ID: <20051204194637.283D81E400D@bag.python.org> Author: martin.v.loewis Date: Sun Dec 4 20:46:29 2005 New Revision: 41596 Modified: python/branches/ast-objects/Include/Python-ast.h python/branches/ast-objects/Parser/asdl_c.py python/branches/ast-objects/Python/ast.c Log: Make it compile up to line 1214. Modified: python/branches/ast-objects/Include/Python-ast.h ============================================================================== --- python/branches/ast-objects/Include/Python-ast.h (original) +++ python/branches/ast-objects/Include/Python-ast.h Sun Dec 4 20:46:29 2005 @@ -1037,6 +1037,9 @@ }; PyObject *Py_comprehension_New(PyObject*, PyObject*, PyObject*); #define comprehension Py_comprehension_New +#define comprehension_target(o) (((struct _comprehension*)o)->target) +#define comprehension_iter(o) (((struct _comprehension*)o)->iter) +#define comprehension_ifs(o) (((struct _comprehension*)o)->ifs) PyAPI_DATA(PyTypeObject) Py_excepthandler_Type; #define excepthandler_Check(op) PyObject_TypeCheck(op, &Py_excepthandler_Type) @@ -1049,6 +1052,9 @@ }; PyObject *Py_excepthandler_New(PyObject*, PyObject*, PyObject*); #define excepthandler Py_excepthandler_New +#define excepthandler_type(o) (((struct _excepthandler*)o)->type) +#define excepthandler_name(o) (((struct _excepthandler*)o)->name) +#define excepthandler_body(o) (((struct _excepthandler*)o)->body) PyAPI_DATA(PyTypeObject) Py_arguments_Type; #define arguments_Check(op) PyObject_TypeCheck(op, &Py_arguments_Type) @@ -1062,6 +1068,10 @@ }; PyObject *Py_arguments_New(PyObject*, PyObject*, PyObject*, PyObject*); #define arguments Py_arguments_New +#define arguments_args(o) (((struct _arguments*)o)->args) +#define arguments_vararg(o) (((struct _arguments*)o)->vararg) +#define arguments_kwarg(o) (((struct _arguments*)o)->kwarg) +#define arguments_defaults(o) (((struct _arguments*)o)->defaults) PyAPI_DATA(PyTypeObject) Py_keyword_Type; #define keyword_Check(op) PyObject_TypeCheck(op, &Py_keyword_Type) @@ -1073,6 +1083,8 @@ }; PyObject *Py_keyword_New(PyObject*, PyObject*); #define keyword Py_keyword_New +#define keyword_arg(o) (((struct _keyword*)o)->arg) +#define keyword_value(o) (((struct _keyword*)o)->value) PyAPI_DATA(PyTypeObject) Py_alias_Type; #define alias_Check(op) PyObject_TypeCheck(op, &Py_alias_Type) @@ -1084,4 +1096,6 @@ }; PyObject *Py_alias_New(PyObject*, PyObject*); #define alias Py_alias_New +#define alias_name(o) (((struct _alias*)o)->name) +#define alias_asname(o) (((struct _alias*)o)->asname) Modified: python/branches/ast-objects/Parser/asdl_c.py ============================================================================== --- python/branches/ast-objects/Parser/asdl_c.py (original) +++ python/branches/ast-objects/Parser/asdl_c.py Sun Dec 4 20:46:29 2005 @@ -200,6 +200,7 @@ self.emit("};", depth) self.emit("PyObject *Py_%s_New(%s);" % (name, ", ".join(field_types)), depth) self.emit("#define %s Py_%s_New" % (name, name), depth) + self.emit_field_access(name, product.fields) self.emit("", depth) class ForwardVisitor(TraversalVisitor): Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Sun Dec 4 20:46:29 2005 @@ -71,7 +71,7 @@ static PyObject *ast_for_expr(struct compiling *, const node *); static PyObject *ast_for_stmt(struct compiling *, const node *); static PyObject *ast_for_suite(struct compiling *, const node *); -static PyObject *ast_for_exprlist(struct compiling *, const node *, int); +static PyObject *ast_for_exprlist(struct compiling *, const node *, PyObject*); static PyObject *ast_for_testlist(struct compiling *, const node *); static PyObject *ast_for_testlist_gexp(struct compiling *, const node *); @@ -927,25 +927,25 @@ if (NCH(n) == 3) { args = arguments(NULL, NULL, NULL, NULL); if (!args) - return NULL; + goto error; expression = ast_for_expr(c, CHILD(n, 2)); - if (!expression) { - free_arguments(args); - return NULL; - } + if (!expression) + goto error; } else { args = ast_for_arguments(c, CHILD(n, 1)); if (!args) - return NULL; + goto error; expression = ast_for_expr(c, CHILD(n, 3)); - if (!expression) { - free_arguments(args); - return NULL; - } + if (!expression) + goto error; } - return Lambda(args, expression, LINENO(n)); + result = Lambda(args, expression, LINENO(n)); + error: + Py_XDECREF(args); + Py_XDECREF(expression); + return result; } /* Count the number of 'for' loop in a list comprehension. @@ -1018,8 +1018,14 @@ list_if: 'if' test [list_iter] testlist_safe: test [(',' test)+ [',']] */ + PyObject *result; PyObject *elt = NULL; PyObject *listcomps = NULL; + PyObject *t = NULL; + PyObject *expression = NULL; + PyObject *lc = NULL; + PyObject *store = NULL; + PyObject *ifs = NULL; int i, n_fors; node *ch; @@ -1028,77 +1034,62 @@ elt = ast_for_expr(c, CHILD(n, 0)); if (!elt) - return NULL; + goto error; n_fors = count_list_fors(n); if (n_fors == -1) - return NULL; + goto error; - listcomps = asdl_seq_new(n_fors); - if (!listcomps) { - free_expr(elt); - return NULL; - } + listcomps = PyList_New(n_fors); + if (!listcomps) + goto error; ch = CHILD(n, 1); for (i = 0; i < n_fors; i++) { - comprehension_ty lc; - PyObject *t = NULL; - PyObject *expression = NULL; + /* each variable should be NULL each round */ + assert(lc == NULL); + assert(t == NULL); + assert(expression == NULL); + assert(ifs == NULL); REQ(ch, list_for); - t = ast_for_exprlist(c, CHILD(ch, 1), Store); - if (!t) { - asdl_comprehension_seq_free(listcomps); - free_expr(elt); - return NULL; - } + if (!store) store = Store(); + if (!store) goto error; + t = ast_for_exprlist(c, CHILD(ch, 1), store); + if (!t) + goto error; expression = ast_for_testlist(c, CHILD(ch, 3)); - if (!expression) { - asdl_expr_seq_free(t); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); - return NULL; - } + if (!expression) + goto error; - if (asdl_seq_LEN(t) == 1) { - lc = comprehension(asdl_seq_GET(t, 0), expression, NULL); - /* only free the sequence since we grabbed element 0 above */ - if (lc) - asdl_seq_free(t); /* ok */ + if (PyList_GET_SIZE(t) == 1) { + lc = comprehension(PyList_GET_ITEM(t, 0), expression, NULL); + if (!lc) + goto error; } - else - lc = comprehension(Tuple(t, Store, LINENO(ch)), expression, NULL); - - if (!lc) { - asdl_expr_seq_free(t); - asdl_comprehension_seq_free(listcomps); - free_expr(expression); - free_expr(elt); - return NULL; - } + else { + t = Tuple(t, store, LINENO(ch)); + if (!t) + goto error; + lc = comprehension(t, expression, NULL); + if (!lc) + goto error; + } + Py_RELEASE(t); + Py_RELEASE(expression); if (NCH(ch) == 5) { int j, n_ifs; - PyObject *ifs = NULL; ch = CHILD(ch, 4); n_ifs = count_list_ifs(ch); - if (n_ifs == -1) { - free_comprehension(lc); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); - return NULL; - } + if (n_ifs == -1) + goto error; - ifs = asdl_seq_new(n_ifs); - if (!ifs) { - free_comprehension(lc); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); - return NULL; - } + ifs = PyList_New(n_ifs); + if (!ifs) + goto error; for (j = 0; j < n_ifs; j++) { REQ(ch, list_iter); @@ -1106,19 +1097,33 @@ ch = CHILD(ch, 0); REQ(ch, list_if); - asdl_seq_APPEND(ifs, ast_for_expr(c, CHILD(ch, 1))); + t = ast_for_expr(c, CHILD(ch, 1)); + if (!t) + goto error; + STEAL_ITEM(ifs, j, t); if (NCH(ch) == 3) ch = CHILD(ch, 2); } /* on exit, must guarantee that ch is a list_for */ if (TYPE(ch) == list_iter) ch = CHILD(ch, 0); - lc->ifs = ifs; + Py_DECREF(comprehension_ifs(lc)); + comprehension_ifs(lc) = ifs; + ifs = NULL; } - asdl_seq_APPEND(listcomps, lc); + STEAL_ITEM(listcomps, i, lc); } - return ListComp(elt, listcomps, LINENO(n)); + result = ListComp(elt, listcomps, LINENO(n)); + error: + Py_XDECREF(elt); + Py_XDECREF(listcomps); + Py_XDECREF(t); + Py_XDECREF(expression); + Py_XDECREF(lc); + Py_XDECREF(store); + Py_XDECREF(ifs); + return result; } /* @@ -2148,7 +2153,7 @@ } static asdl_seq * -ast_for_exprlist(struct compiling *c, const node *n, int context) +ast_for_exprlist(struct compiling *c, const node *n, PyObject* context) { PyObject *seq = NULL; int i; From python-checkins at python.org Sun Dec 4 20:53:51 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 20:53:51 +0100 (CET) Subject: [Python-checkins] commit of r41597 - python/trunk/Lib/xml/sax/expatreader.py Message-ID: <20051204195351.828FC1E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 20:53:45 2005 New Revision: 41597 Modified: python/trunk/Lib/xml/sax/expatreader.py Log: [Bug #1281032] Pass encoding from the input source to pyexpat's ParserCreate() Modified: python/trunk/Lib/xml/sax/expatreader.py ============================================================================== --- python/trunk/Lib/xml/sax/expatreader.py (original) +++ python/trunk/Lib/xml/sax/expatreader.py Sun Dec 4 20:53:45 2005 @@ -243,13 +243,14 @@ def reset(self): if self._namespaces: - self._parser = expat.ParserCreate(None, " ", + self._parser = expat.ParserCreate(self._source.getEncoding(), " ", intern=self._interning) self._parser.namespace_prefixes = 1 self._parser.StartElementHandler = self.start_element_ns self._parser.EndElementHandler = self.end_element_ns else: - self._parser = expat.ParserCreate(intern = self._interning) + self._parser = expat.ParserCreate(self._source.getEncoding(), + intern = self._interning) self._parser.StartElementHandler = self.start_element self._parser.EndElementHandler = self.end_element From python-checkins at python.org Sun Dec 4 21:16:54 2005 From: python-checkins at python.org (jeremy.hylton) Date: Sun, 4 Dec 2005 21:16:54 +0100 (CET) Subject: [Python-checkins] commit of r41598 - python/branches/ast-arena Message-ID: <20051204201654.CAD051E400B@bag.python.org> Author: jeremy.hylton Date: Sun Dec 4 21:16:49 2005 New Revision: 41598 Added: python/branches/ast-arena/ - copied from r41597, python/trunk/ Log: Create experimental branch for using arenas in compiler From python-checkins at python.org Sun Dec 4 21:25:27 2005 From: python-checkins at python.org (andrew.kuchling) Date: Sun, 4 Dec 2005 21:25:27 +0100 (CET) Subject: [Python-checkins] commit of r41599 - python/trunk/Doc/lib/libcookielib.tex python/trunk/Doc/lib/liburllib2.tex Message-ID: <20051204202527.E4BFA1E400B@bag.python.org> Author: andrew.kuchling Date: Sun Dec 4 21:25:23 2005 New Revision: 41599 Modified: python/trunk/Doc/lib/libcookielib.tex python/trunk/Doc/lib/liburllib2.tex Log: [Patch #1372995] Add \versionadded Modified: python/trunk/Doc/lib/libcookielib.tex ============================================================================== --- python/trunk/Doc/lib/libcookielib.tex (original) +++ python/trunk/Doc/lib/libcookielib.tex Sun Dec 4 21:25:23 2005 @@ -5,6 +5,8 @@ \moduleauthor{John J. Lee}{jjl at pobox.com} \sectionauthor{John J. Lee}{jjl at pobox.com} +\versionadded{2.4} + \modulesynopsis{Cookie handling for HTTP clients} The \module{cookielib} module defines classes for automatic handling Modified: python/trunk/Doc/lib/liburllib2.tex ============================================================================== --- python/trunk/Doc/lib/liburllib2.tex (original) +++ python/trunk/Doc/lib/liburllib2.tex Sun Dec 4 21:25:23 2005 @@ -583,6 +583,8 @@ \subsection{HTTPCookieProcessor Objects \label{http-cookie-processor}} +\versionadded{2.4} + \class{HTTPCookieProcessor} instances have one attribute: \begin{memberdesc}{cookiejar} From python-checkins at python.org Sun Dec 4 23:15:25 2005 From: python-checkins at python.org (brett.cannon) Date: Sun, 4 Dec 2005 23:15:25 +0100 (CET) Subject: [Python-checkins] commit of r41600 - peps/trunk/pep-0000.txt peps/trunk/pep-0347.txt Message-ID: <20051204221525.9F6D11E4017@bag.python.org> Author: brett.cannon Date: Sun Dec 4 23:15:20 2005 New Revision: 41600 Modified: peps/trunk/pep-0000.txt peps/trunk/pep-0347.txt Log: Change PEP 347 (cvs -> svn conversion) to being accepted. Modified: peps/trunk/pep-0000.txt ============================================================================== --- peps/trunk/pep-0000.txt (original) +++ peps/trunk/pep-0000.txt Sun Dec 4 23:15:20 2005 @@ -42,6 +42,7 @@ I 10 Voting Guidelines Warsaw I 11 Removing support for little used platforms von Loewis I 12 Sample reStructuredText PEP Template Goodger, Warsaw + P 347 Migrating the Python CVS to Subversion von Löwis Other Informational PEPs @@ -103,7 +104,6 @@ S 343 The "with" Statement GvR, Coghlan S 344 Exception Chaining and Embedded Tracebacks Yee S 345 Metadata for Python Software Packages 1.2 Jones - P 347 Migrating the Python CVS to Subversion von Löwis I 350 Codetags Elliott S 351 The freeze protocol Warsaw S 352 Required Superclass for Exceptions GvR, Cannon Modified: peps/trunk/pep-0347.txt ============================================================================== --- peps/trunk/pep-0347.txt (original) +++ peps/trunk/pep-0347.txt Sun Dec 4 23:15:20 2005 @@ -4,7 +4,7 @@ Last-Modified: $Date$ Author: Martin v. Löwis Discussions-To: -Status: Draft +Status: Accepted Type: Process Content-Type: text/x-rst Created: 14-Jul-2004 From python-checkins at python.org Mon Dec 5 01:27:55 2005 From: python-checkins at python.org (michael.hudson) Date: Mon, 5 Dec 2005 01:27:55 +0100 (CET) Subject: [Python-checkins] commit of r41601 - python/trunk/Objects/floatobject.c Message-ID: <20051205002755.1F24B1E400B@bag.python.org> Author: michael.hudson Date: Mon Dec 5 01:27:49 2005 New Revision: 41601 Modified: python/trunk/Objects/floatobject.c Log: Fix bug [ 1346144 ] Segfaults from unaligned loads in floatobject.c by using memcpy and not just blinding casting char* to double*. Thanks to Rune Holm for the report. Modified: python/trunk/Objects/floatobject.c ============================================================================== --- python/trunk/Objects/floatobject.c (original) +++ python/trunk/Objects/floatobject.c Mon Dec 5 01:27:49 2005 @@ -1631,20 +1631,24 @@ return x; } else { + float x; + if ((float_format == ieee_little_endian_format && !le) || (float_format == ieee_big_endian_format && le)) { - char buf[8]; + char buf[4]; char *d = &buf[3]; int i; for (i = 0; i < 4; i++) { *d-- = *p++; } - return *(float*)&buf[0]; + memcpy(&x, buf, 4); } else { - return *(float*)p; + memcpy(&x, p, 4); } + + return x; } } @@ -1722,6 +1726,8 @@ return x; } else { + double x; + if ((double_format == ieee_little_endian_format && !le) || (double_format == ieee_big_endian_format && le)) { char buf[8]; @@ -1731,10 +1737,12 @@ for (i = 0; i < 8; i++) { *d-- = *p++; } - return *(double*)&buf[0]; + memcpy(&x, buf, 8); } else { - return *(double*)p; + memcpy(&x, p, 8); } + + return x; } } From python-checkins at python.org Mon Dec 5 02:17:11 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 02:17:11 +0100 (CET) Subject: [Python-checkins] commit of r41602 - python/trunk/Lib/test/test_file.py Message-ID: <20051205011711.644AC1E400B@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 02:17:03 2005 New Revision: 41602 Modified: python/trunk/Lib/test/test_file.py Log: Fix SF #1373161, r41552 broke test_file on OS X You apparently can seek(0) on sys.stdin on OS X. But you can't go backwards, so seek(-1). Modified: python/trunk/Lib/test/test_file.py ============================================================================== --- python/trunk/Lib/test/test_file.py (original) +++ python/trunk/Lib/test/test_file.py Mon Dec 5 02:17:03 2005 @@ -101,7 +101,7 @@ f.close() try: - sys.stdin.seek(0) + sys.stdin.seek(-1) except IOError: pass else: From python-checkins at python.org Mon Dec 5 02:23:56 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 02:23:56 +0100 (CET) Subject: [Python-checkins] commit of r41603 - python/trunk/Lib/test/test_file.py Message-ID: <20051205012356.A5AED1E400B@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 02:23:48 2005 New Revision: 41603 Modified: python/trunk/Lib/test/test_file.py Log: mwh spotted a copied error message, make it unique (and correct) Modified: python/trunk/Lib/test/test_file.py ============================================================================== --- python/trunk/Lib/test/test_file.py (original) +++ python/trunk/Lib/test/test_file.py Mon Dec 5 02:23:48 2005 @@ -112,7 +112,7 @@ except IOError: pass else: - print "should not be able to seek on sys.stdin" + print "should not be able to tell on sys.stdin" try: sys.stdin.truncate() From python-checkins at python.org Mon Dec 5 06:26:00 2005 From: python-checkins at python.org (jeremy.hylton) Date: Mon, 5 Dec 2005 06:26:00 +0100 (CET) Subject: [Python-checkins] commit of r41604 - in python/branches/ast-arena: Include/Python-ast.h Include/Python.h Include/asdl.h Include/ast.h Include/compile.h Include/pyarena.h Include/pythonrun.h Makefile.pre.in Parser/asdl_c.py Python/Python-ast.c Python/asdl.c Python/ast.c Python/compile.c Python/import.c Python/pyarena.c Python/pythonrun.c Message-ID: <20051205052600.CB6981E400B@bag.python.org> Author: jeremy.hylton Date: Mon Dec 5 06:25:53 2005 New Revision: 41604 Added: python/branches/ast-arena/Include/pyarena.h python/branches/ast-arena/Python/pyarena.c Modified: python/branches/ast-arena/Include/Python-ast.h python/branches/ast-arena/Include/Python.h python/branches/ast-arena/Include/asdl.h python/branches/ast-arena/Include/ast.h python/branches/ast-arena/Include/compile.h python/branches/ast-arena/Include/pythonrun.h python/branches/ast-arena/Makefile.pre.in python/branches/ast-arena/Parser/asdl_c.py python/branches/ast-arena/Python/Python-ast.c python/branches/ast-arena/Python/asdl.c python/branches/ast-arena/Python/ast.c python/branches/ast-arena/Python/compile.c python/branches/ast-arena/Python/import.c python/branches/ast-arena/Python/pythonrun.c Log: Implement memory management for AST using an arena API. The key idea is to allocate all AST notes from a single arena that is freed when the compilation finishes (success or failure). The change is pervasive: Every AST constructor now takes an arena as an additional argument. Also, every call related to freeing AST memory is gone. The actual implementation of the arena is a toy. It uses plain old malloc and free and stores all the pointers so allocated in a linked list. The arena also keeps track of PyObjects allocated by the AST and DECREFs each of them when the arena is freed. This part of the implementation would probably stay, although Fredrik Lundh noted that a PyList would server as a fine container for the pointers. This set of changes only modifies the compiler in two places, where Attributes are created. In theory, the entire compiler could use an AST interface. Modified: python/branches/ast-arena/Include/Python-ast.h ============================================================================== --- python/branches/ast-arena/Include/Python-ast.h (original) +++ python/branches/ast-arena/Include/Python-ast.h Mon Dec 5 06:25:53 2005 @@ -1,4 +1,4 @@ -/* File automatically generated by ./Parser/asdl_c.py */ +/* File automatically generated by ../Parser/asdl_c.py */ #include "asdl.h" @@ -328,81 +328,79 @@ }; -mod_ty Module(asdl_seq * body); -mod_ty Interactive(asdl_seq * body); -mod_ty Expression(expr_ty body); -mod_ty Suite(asdl_seq * body); +mod_ty Module(asdl_seq * body, PyArena *arena); +mod_ty Interactive(asdl_seq * body, PyArena *arena); +mod_ty Expression(expr_ty body, PyArena *arena); +mod_ty Suite(asdl_seq * body, PyArena *arena); stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, - asdl_seq * decorators, int lineno); + asdl_seq * decorators, int lineno, PyArena *arena); stmt_ty ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int - lineno); -stmt_ty Return(expr_ty value, int lineno); -stmt_ty Delete(asdl_seq * targets, int lineno); -stmt_ty Assign(asdl_seq * targets, expr_ty value, int lineno); -stmt_ty AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno); -stmt_ty Print(expr_ty dest, asdl_seq * values, bool nl, int lineno); + lineno, PyArena *arena); +stmt_ty Return(expr_ty value, int lineno, PyArena *arena); +stmt_ty Delete(asdl_seq * targets, int lineno, PyArena *arena); +stmt_ty Assign(asdl_seq * targets, expr_ty value, int lineno, PyArena *arena); +stmt_ty AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, + PyArena *arena); +stmt_ty Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, PyArena + *arena); stmt_ty For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, - int lineno); -stmt_ty While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno); -stmt_ty If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno); -stmt_ty Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno); + int lineno, PyArena *arena); +stmt_ty While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + PyArena *arena); +stmt_ty If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + PyArena *arena); +stmt_ty Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, PyArena + *arena); stmt_ty TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int - lineno); -stmt_ty TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno); -stmt_ty Assert(expr_ty test, expr_ty msg, int lineno); -stmt_ty Import(asdl_seq * names, int lineno); -stmt_ty ImportFrom(identifier module, asdl_seq * names, int lineno); -stmt_ty Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno); -stmt_ty Global(asdl_seq * names, int lineno); -stmt_ty Expr(expr_ty value, int lineno); -stmt_ty Pass(int lineno); -stmt_ty Break(int lineno); -stmt_ty Continue(int lineno); -expr_ty BoolOp(boolop_ty op, asdl_seq * values, int lineno); -expr_ty BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno); -expr_ty UnaryOp(unaryop_ty op, expr_ty operand, int lineno); -expr_ty Lambda(arguments_ty args, expr_ty body, int lineno); -expr_ty Dict(asdl_seq * keys, asdl_seq * values, int lineno); -expr_ty ListComp(expr_ty elt, asdl_seq * generators, int lineno); -expr_ty GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno); -expr_ty Yield(expr_ty value, int lineno); + lineno, PyArena *arena); +stmt_ty TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, PyArena + *arena); +stmt_ty Assert(expr_ty test, expr_ty msg, int lineno, PyArena *arena); +stmt_ty Import(asdl_seq * names, int lineno, PyArena *arena); +stmt_ty ImportFrom(identifier module, asdl_seq * names, int lineno, PyArena + *arena); +stmt_ty Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, PyArena + *arena); +stmt_ty Global(asdl_seq * names, int lineno, PyArena *arena); +stmt_ty Expr(expr_ty value, int lineno, PyArena *arena); +stmt_ty Pass(int lineno, PyArena *arena); +stmt_ty Break(int lineno, PyArena *arena); +stmt_ty Continue(int lineno, PyArena *arena); +expr_ty BoolOp(boolop_ty op, asdl_seq * values, int lineno, PyArena *arena); +expr_ty BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, PyArena + *arena); +expr_ty UnaryOp(unaryop_ty op, expr_ty operand, int lineno, PyArena *arena); +expr_ty Lambda(arguments_ty args, expr_ty body, int lineno, PyArena *arena); +expr_ty Dict(asdl_seq * keys, asdl_seq * values, int lineno, PyArena *arena); +expr_ty ListComp(expr_ty elt, asdl_seq * generators, int lineno, PyArena + *arena); +expr_ty GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, PyArena + *arena); +expr_ty Yield(expr_ty value, int lineno, PyArena *arena); expr_ty Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int - lineno); + lineno, PyArena *arena); expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty - starargs, expr_ty kwargs, int lineno); -expr_ty Repr(expr_ty value, int lineno); -expr_ty Num(object n, int lineno); -expr_ty Str(string s, int lineno); + starargs, expr_ty kwargs, int lineno, PyArena *arena); +expr_ty Repr(expr_ty value, int lineno, PyArena *arena); +expr_ty Num(object n, int lineno, PyArena *arena); +expr_ty Str(string s, int lineno, PyArena *arena); expr_ty Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int - lineno); + lineno, PyArena *arena); expr_ty Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int - lineno); -expr_ty Name(identifier id, expr_context_ty ctx, int lineno); -expr_ty List(asdl_seq * elts, expr_context_ty ctx, int lineno); -expr_ty Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno); -slice_ty Ellipsis(void); -slice_ty Slice(expr_ty lower, expr_ty upper, expr_ty step); -slice_ty ExtSlice(asdl_seq * dims); -slice_ty Index(expr_ty value); -comprehension_ty comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs); -excepthandler_ty excepthandler(expr_ty type, expr_ty name, asdl_seq * body); + lineno, PyArena *arena); +expr_ty Name(identifier id, expr_context_ty ctx, int lineno, PyArena *arena); +expr_ty List(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena); +expr_ty Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena); +slice_ty Ellipsis(PyArena *arena); +slice_ty Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); +slice_ty ExtSlice(asdl_seq * dims, PyArena *arena); +slice_ty Index(expr_ty value, PyArena *arena); +comprehension_ty comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, + PyArena *arena); +excepthandler_ty excepthandler(expr_ty type, expr_ty name, asdl_seq * body, + PyArena *arena); arguments_ty arguments(asdl_seq * args, identifier vararg, identifier kwarg, - asdl_seq * defaults); -keyword_ty keyword(identifier arg, expr_ty value); -alias_ty alias(identifier name, identifier asname); - -void free_mod(mod_ty); -void free_stmt(stmt_ty); -void free_expr(expr_ty); -void free_expr_context(expr_context_ty); -void free_slice(slice_ty); -void free_boolop(boolop_ty); -void free_operator(operator_ty); -void free_unaryop(unaryop_ty); -void free_cmpop(cmpop_ty); -void free_comprehension(comprehension_ty); -void free_excepthandler(excepthandler_ty); -void free_arguments(arguments_ty); -void free_keyword(keyword_ty); -void free_alias(alias_ty); + asdl_seq * defaults, PyArena *arena); +keyword_ty keyword(identifier arg, expr_ty value, PyArena *arena); +alias_ty alias(identifier name, identifier asname, PyArena *arena); Modified: python/branches/ast-arena/Include/Python.h ============================================================================== --- python/branches/ast-arena/Include/Python.h (original) +++ python/branches/ast-arena/Include/Python.h Mon Dec 5 06:25:53 2005 @@ -113,6 +113,7 @@ #include "pystate.h" +#include "pyarena.h" #include "modsupport.h" #include "pythonrun.h" #include "ceval.h" Modified: python/branches/ast-arena/Include/asdl.h ============================================================================== --- python/branches/ast-arena/Include/asdl.h (original) +++ python/branches/ast-arena/Include/asdl.h Mon Dec 5 06:25:53 2005 @@ -23,7 +23,7 @@ void *elements[1]; } asdl_seq; -asdl_seq *asdl_seq_new(int size); +asdl_seq *asdl_seq_new(int size, PyArena *arena); void asdl_seq_free(asdl_seq *); #ifdef Py_DEBUG Modified: python/branches/ast-arena/Include/ast.h ============================================================================== --- python/branches/ast-arena/Include/ast.h (original) +++ python/branches/ast-arena/Include/ast.h Mon Dec 5 06:25:53 2005 @@ -5,7 +5,7 @@ #endif PyAPI_FUNC(mod_ty) PyAST_FromNode(const node *, PyCompilerFlags *flags, - const char *); + const char *, PyArena *); #ifdef __cplusplus } Modified: python/branches/ast-arena/Include/compile.h ============================================================================== --- python/branches/ast-arena/Include/compile.h (original) +++ python/branches/ast-arena/Include/compile.h Mon Dec 5 06:25:53 2005 @@ -25,7 +25,7 @@ struct _mod; /* Declare the existence of this type */ PyAPI_FUNC(PyCodeObject *) PyAST_Compile(struct _mod *, const char *, - PyCompilerFlags *); + PyCompilerFlags *, PyArena *); PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); #define ERR_LATE_FUTURE \ Added: python/branches/ast-arena/Include/pyarena.h ============================================================================== --- (empty file) +++ python/branches/ast-arena/Include/pyarena.h Mon Dec 5 06:25:53 2005 @@ -0,0 +1,42 @@ +/* An arena-like memory interface for the compiler. + */ + +#ifndef Py_PYARENA_H +#define Py_PYARENA_H + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct _arena PyArena; + + /* PyArena_New() and PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory. Once it is freed, all the memory it allocated + is freed and none of its pointers are valid. + + Py_ArenaNew() returns an arena pointer. On error, it + returns a negative number and sets an exception. + */ + PyAPI_FUNC(PyArena *) PyArena_New(void); + PyAPI_FUNC(void) PyArena_Free(PyArena *); + + PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t); + + /* The next two routines aren't proper arena allocation routines. + They exist to experiment with the arena API without making wholesale + changes to the implementation. + + The two functions register pointers with the arena id. These + are externally allocated pointers that will be freed when the + arena is freed. One takes a pointer allocated with malloc. The + other takes a PyObject that is DECREFed when the arena is freed. + */ + PyAPI_FUNC(int) PyArena_AddMallocPointer(PyArena *, void *); + PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYARENA_H */ Modified: python/branches/ast-arena/Include/pythonrun.h ============================================================================== --- python/branches/ast-arena/Include/pythonrun.h (original) +++ python/branches/ast-arena/Include/pythonrun.h Mon Dec 5 06:25:53 2005 @@ -37,10 +37,12 @@ PyAPI_FUNC(int) PyRun_InteractiveLoopFlags(FILE *, const char *, PyCompilerFlags *); PyAPI_FUNC(struct _mod *) PyParser_ASTFromString(const char *, const char *, - int, PyCompilerFlags *flags); + int, PyCompilerFlags *flags, + PyArena *); PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile(FILE *, const char *, int, char *, char *, - PyCompilerFlags *, int *); + PyCompilerFlags *, int *, + PyArena *); #define PyParser_SimpleParseString(S, B) \ PyParser_SimpleParseStringFlags(S, B, 0) #define PyParser_SimpleParseFile(FP, S, B) \ Modified: python/branches/ast-arena/Makefile.pre.in ============================================================================== --- python/branches/ast-arena/Makefile.pre.in (original) +++ python/branches/ast-arena/Makefile.pre.in Mon Dec 5 06:25:53 2005 @@ -254,6 +254,7 @@ Python/modsupport.o \ Python/mystrtoul.o \ Python/mysnprintf.o \ + Python/pyarena.o \ Python/pyfpe.o \ Python/pystate.o \ Python/pythonrun.o \ @@ -520,6 +521,7 @@ Include/object.h \ Include/objimpl.h \ Include/patchlevel.h \ + Include/pyarena.h \ Include/pydebug.h \ Include/pyerrors.h \ Include/pyfpe.h \ Modified: python/branches/ast-arena/Parser/asdl_c.py ============================================================================== --- python/branches/ast-arena/Parser/asdl_c.py (original) +++ python/branches/ast-arena/Parser/asdl_c.py Mon Dec 5 06:25:53 2005 @@ -249,8 +249,9 @@ if args: argstr = ", ".join(["%s %s" % (atype, aname) for atype, aname, opt in args]) + argstr += ", PyArena *arena" else: - argstr = "void" + argstr = "PyArena *arena" self.emit("%s %s(%s);" % (ctype, name, argstr), 0) def visitProduct(self, prod, name): @@ -265,6 +266,10 @@ self.emit(s, depth, reflow) argstr = ", ".join(["%s %s" % (atype, aname) for atype, aname, opt in args + attrs]) + if argstr: + argstr += ", PyArena *arena" + else: + argstr = "PyArena *arena" self.emit("%s" % ctype, 0) emit("%s(%s)" % (name, argstr)) emit("{") @@ -280,7 +285,7 @@ emit('return NULL;', 2) emit('}', 1) - emit("p = (%s)malloc(sizeof(*p));" % ctype, 1) + emit("p = (%s)PyArena_Malloc(arena, sizeof(*p));" % ctype, 1); emit("if (!p) {", 1) emit("PyErr_NoMemory();", 2) emit("return NULL;", 2) @@ -652,7 +657,7 @@ c = ChainOfVisitors(TypeDefVisitor(f), StructVisitor(f), PrototypeVisitor(f), - FreePrototypeVisitor(f), +## FreePrototypeVisitor(f), ) c.visit(mod) f.close() @@ -668,8 +673,8 @@ print >> f v = ChainOfVisitors(MarshalPrototypeVisitor(f), FunctionVisitor(f), - FreeUtilVisitor(f), - FreeVisitor(f), +## FreeUtilVisitor(f), +## FreeVisitor(f), MarshalUtilVisitor(f), MarshalFunctionVisitor(f), ) Modified: python/branches/ast-arena/Python/Python-ast.c ============================================================================== --- python/branches/ast-arena/Python/Python-ast.c (original) +++ python/branches/ast-arena/Python/Python-ast.c Mon Dec 5 06:25:53 2005 @@ -1,4 +1,4 @@ -/* File automatically generated by ./Parser/asdl_c.py */ +/* File automatically generated by ../Parser/asdl_c.py */ #include "Python.h" #include "Python-ast.h" @@ -19,10 +19,10 @@ static int marshal_write_alias(PyObject **, int *, alias_ty); mod_ty -Module(asdl_seq * body) +Module(asdl_seq * body, PyArena *arena) { mod_ty p; - p = (mod_ty)malloc(sizeof(*p)); + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -33,10 +33,10 @@ } mod_ty -Interactive(asdl_seq * body) +Interactive(asdl_seq * body, PyArena *arena) { mod_ty p; - p = (mod_ty)malloc(sizeof(*p)); + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -47,7 +47,7 @@ } mod_ty -Expression(expr_ty body) +Expression(expr_ty body, PyArena *arena) { mod_ty p; if (!body) { @@ -55,7 +55,7 @@ "field body is required for Expression"); return NULL; } - p = (mod_ty)malloc(sizeof(*p)); + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -66,10 +66,10 @@ } mod_ty -Suite(asdl_seq * body) +Suite(asdl_seq * body, PyArena *arena) { mod_ty p; - p = (mod_ty)malloc(sizeof(*p)); + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -81,7 +81,7 @@ stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * - decorators, int lineno) + decorators, int lineno, PyArena *arena) { stmt_ty p; if (!name) { @@ -94,7 +94,7 @@ "field args is required for FunctionDef"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -109,7 +109,8 @@ } stmt_ty -ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int lineno) +ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int lineno, + PyArena *arena) { stmt_ty p; if (!name) { @@ -117,7 +118,7 @@ "field name is required for ClassDef"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -131,10 +132,10 @@ } stmt_ty -Return(expr_ty value, int lineno) +Return(expr_ty value, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -146,10 +147,10 @@ } stmt_ty -Delete(asdl_seq * targets, int lineno) +Delete(asdl_seq * targets, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -161,7 +162,7 @@ } stmt_ty -Assign(asdl_seq * targets, expr_ty value, int lineno) +Assign(asdl_seq * targets, expr_ty value, int lineno, PyArena *arena) { stmt_ty p; if (!value) { @@ -169,7 +170,7 @@ "field value is required for Assign"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -182,7 +183,8 @@ } stmt_ty -AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno) +AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, PyArena + *arena) { stmt_ty p; if (!target) { @@ -200,7 +202,7 @@ "field value is required for AugAssign"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -214,10 +216,10 @@ } stmt_ty -Print(expr_ty dest, asdl_seq * values, bool nl, int lineno) +Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -232,7 +234,7 @@ stmt_ty For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int - lineno) + lineno, PyArena *arena) { stmt_ty p; if (!target) { @@ -245,7 +247,7 @@ "field iter is required for For"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -260,7 +262,8 @@ } stmt_ty -While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno) +While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, PyArena + *arena) { stmt_ty p; if (!test) { @@ -268,7 +271,7 @@ "field test is required for While"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -282,7 +285,7 @@ } stmt_ty -If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno) +If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, PyArena *arena) { stmt_ty p; if (!test) { @@ -290,7 +293,7 @@ "field test is required for If"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -304,10 +307,10 @@ } stmt_ty -Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno) +Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -321,10 +324,11 @@ } stmt_ty -TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno) +TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno, + PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -338,10 +342,10 @@ } stmt_ty -TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno) +TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -354,7 +358,7 @@ } stmt_ty -Assert(expr_ty test, expr_ty msg, int lineno) +Assert(expr_ty test, expr_ty msg, int lineno, PyArena *arena) { stmt_ty p; if (!test) { @@ -362,7 +366,7 @@ "field test is required for Assert"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -375,10 +379,10 @@ } stmt_ty -Import(asdl_seq * names, int lineno) +Import(asdl_seq * names, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -390,7 +394,7 @@ } stmt_ty -ImportFrom(identifier module, asdl_seq * names, int lineno) +ImportFrom(identifier module, asdl_seq * names, int lineno, PyArena *arena) { stmt_ty p; if (!module) { @@ -398,7 +402,7 @@ "field module is required for ImportFrom"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -411,7 +415,7 @@ } stmt_ty -Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno) +Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, PyArena *arena) { stmt_ty p; if (!body) { @@ -419,7 +423,7 @@ "field body is required for Exec"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -433,10 +437,10 @@ } stmt_ty -Global(asdl_seq * names, int lineno) +Global(asdl_seq * names, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -448,7 +452,7 @@ } stmt_ty -Expr(expr_ty value, int lineno) +Expr(expr_ty value, int lineno, PyArena *arena) { stmt_ty p; if (!value) { @@ -456,7 +460,7 @@ "field value is required for Expr"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -468,10 +472,10 @@ } stmt_ty -Pass(int lineno) +Pass(int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -482,10 +486,10 @@ } stmt_ty -Break(int lineno) +Break(int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -496,10 +500,10 @@ } stmt_ty -Continue(int lineno) +Continue(int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -510,7 +514,7 @@ } expr_ty -BoolOp(boolop_ty op, asdl_seq * values, int lineno) +BoolOp(boolop_ty op, asdl_seq * values, int lineno, PyArena *arena) { expr_ty p; if (!op) { @@ -518,7 +522,7 @@ "field op is required for BoolOp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -531,7 +535,7 @@ } expr_ty -BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno) +BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, PyArena *arena) { expr_ty p; if (!left) { @@ -549,7 +553,7 @@ "field right is required for BinOp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -563,7 +567,7 @@ } expr_ty -UnaryOp(unaryop_ty op, expr_ty operand, int lineno) +UnaryOp(unaryop_ty op, expr_ty operand, int lineno, PyArena *arena) { expr_ty p; if (!op) { @@ -576,7 +580,7 @@ "field operand is required for UnaryOp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -589,7 +593,7 @@ } expr_ty -Lambda(arguments_ty args, expr_ty body, int lineno) +Lambda(arguments_ty args, expr_ty body, int lineno, PyArena *arena) { expr_ty p; if (!args) { @@ -602,7 +606,7 @@ "field body is required for Lambda"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -615,10 +619,10 @@ } expr_ty -Dict(asdl_seq * keys, asdl_seq * values, int lineno) +Dict(asdl_seq * keys, asdl_seq * values, int lineno, PyArena *arena) { expr_ty p; - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -631,7 +635,7 @@ } expr_ty -ListComp(expr_ty elt, asdl_seq * generators, int lineno) +ListComp(expr_ty elt, asdl_seq * generators, int lineno, PyArena *arena) { expr_ty p; if (!elt) { @@ -639,7 +643,7 @@ "field elt is required for ListComp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -652,7 +656,7 @@ } expr_ty -GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno) +GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, PyArena *arena) { expr_ty p; if (!elt) { @@ -660,7 +664,7 @@ "field elt is required for GeneratorExp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -673,10 +677,10 @@ } expr_ty -Yield(expr_ty value, int lineno) +Yield(expr_ty value, int lineno, PyArena *arena) { expr_ty p; - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -688,7 +692,8 @@ } expr_ty -Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno) +Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno, + PyArena *arena) { expr_ty p; if (!left) { @@ -696,7 +701,7 @@ "field left is required for Compare"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -711,7 +716,7 @@ expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty starargs, - expr_ty kwargs, int lineno) + expr_ty kwargs, int lineno, PyArena *arena) { expr_ty p; if (!func) { @@ -719,7 +724,7 @@ "field func is required for Call"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -735,7 +740,7 @@ } expr_ty -Repr(expr_ty value, int lineno) +Repr(expr_ty value, int lineno, PyArena *arena) { expr_ty p; if (!value) { @@ -743,7 +748,7 @@ "field value is required for Repr"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -755,7 +760,7 @@ } expr_ty -Num(object n, int lineno) +Num(object n, int lineno, PyArena *arena) { expr_ty p; if (!n) { @@ -763,7 +768,7 @@ "field n is required for Num"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -775,7 +780,7 @@ } expr_ty -Str(string s, int lineno) +Str(string s, int lineno, PyArena *arena) { expr_ty p; if (!s) { @@ -783,7 +788,7 @@ "field s is required for Str"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -795,7 +800,8 @@ } expr_ty -Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno) +Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, + PyArena *arena) { expr_ty p; if (!value) { @@ -813,7 +819,7 @@ "field ctx is required for Attribute"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -827,7 +833,8 @@ } expr_ty -Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno) +Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, + PyArena *arena) { expr_ty p; if (!value) { @@ -845,7 +852,7 @@ "field ctx is required for Subscript"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -859,7 +866,7 @@ } expr_ty -Name(identifier id, expr_context_ty ctx, int lineno) +Name(identifier id, expr_context_ty ctx, int lineno, PyArena *arena) { expr_ty p; if (!id) { @@ -872,7 +879,7 @@ "field ctx is required for Name"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -885,7 +892,7 @@ } expr_ty -List(asdl_seq * elts, expr_context_ty ctx, int lineno) +List(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena) { expr_ty p; if (!ctx) { @@ -893,7 +900,7 @@ "field ctx is required for List"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -906,7 +913,7 @@ } expr_ty -Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno) +Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena) { expr_ty p; if (!ctx) { @@ -914,7 +921,7 @@ "field ctx is required for Tuple"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -927,10 +934,10 @@ } slice_ty -Ellipsis() +Ellipsis(PyArena *arena) { slice_ty p; - p = (slice_ty)malloc(sizeof(*p)); + p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -940,10 +947,10 @@ } slice_ty -Slice(expr_ty lower, expr_ty upper, expr_ty step) +Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena) { slice_ty p; - p = (slice_ty)malloc(sizeof(*p)); + p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -956,10 +963,10 @@ } slice_ty -ExtSlice(asdl_seq * dims) +ExtSlice(asdl_seq * dims, PyArena *arena) { slice_ty p; - p = (slice_ty)malloc(sizeof(*p)); + p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -970,7 +977,7 @@ } slice_ty -Index(expr_ty value) +Index(expr_ty value, PyArena *arena) { slice_ty p; if (!value) { @@ -978,7 +985,7 @@ "field value is required for Index"); return NULL; } - p = (slice_ty)malloc(sizeof(*p)); + p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -989,7 +996,7 @@ } comprehension_ty -comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs) +comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena) { comprehension_ty p; if (!target) { @@ -1002,7 +1009,7 @@ "field iter is required for comprehension"); return NULL; } - p = (comprehension_ty)malloc(sizeof(*p)); + p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1014,10 +1021,10 @@ } excepthandler_ty -excepthandler(expr_ty type, expr_ty name, asdl_seq * body) +excepthandler(expr_ty type, expr_ty name, asdl_seq * body, PyArena *arena) { excepthandler_ty p; - p = (excepthandler_ty)malloc(sizeof(*p)); + p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1030,10 +1037,10 @@ arguments_ty arguments(asdl_seq * args, identifier vararg, identifier kwarg, asdl_seq * - defaults) + defaults, PyArena *arena) { arguments_ty p; - p = (arguments_ty)malloc(sizeof(*p)); + p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1046,7 +1053,7 @@ } keyword_ty -keyword(identifier arg, expr_ty value) +keyword(identifier arg, expr_ty value, PyArena *arena) { keyword_ty p; if (!arg) { @@ -1059,7 +1066,7 @@ "field value is required for keyword"); return NULL; } - p = (keyword_ty)malloc(sizeof(*p)); + p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1070,7 +1077,7 @@ } alias_ty -alias(identifier name, identifier asname) +alias(identifier name, identifier asname, PyArena *arena) { alias_ty p; if (!name) { @@ -1078,7 +1085,7 @@ "field name is required for alias"); return NULL; } - p = (alias_ty)malloc(sizeof(*p)); + p = (alias_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1089,454 +1096,6 @@ } -static void -free_seq_exprs(asdl_seq *seq) -{ - int i, n; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_expr((expr_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); -} - -static void -free_seq_stmts(asdl_seq *seq) -{ - int i, n; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_stmt((stmt_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); -} - - -void -free_mod(mod_ty o) -{ - if (!o) - return; - - switch (o->kind) { - case Module_kind: - free_seq_stmts(o->v.Module.body); - break; - case Interactive_kind: - free_seq_stmts(o->v.Interactive.body); - break; - case Expression_kind: - free_expr((expr_ty)o->v.Expression.body); - break; - case Suite_kind: - free_seq_stmts(o->v.Suite.body); - break; - } - - free(o); -} - -void -free_stmt(stmt_ty o) -{ - int i, n; - asdl_seq *seq; - - if (!o) - return; - - switch (o->kind) { - case FunctionDef_kind: - Py_DECREF((identifier)o->v.FunctionDef.name); - free_arguments((arguments_ty)o->v.FunctionDef.args); - free_seq_stmts(o->v.FunctionDef.body); - free_seq_exprs(o->v.FunctionDef.decorators); - break; - case ClassDef_kind: - Py_DECREF((identifier)o->v.ClassDef.name); - free_seq_exprs(o->v.ClassDef.bases); - free_seq_stmts(o->v.ClassDef.body); - break; - case Return_kind: - if (o->v.Return.value) { - free_expr((expr_ty)o->v.Return.value); - } - break; - case Delete_kind: - free_seq_exprs(o->v.Delete.targets); - break; - case Assign_kind: - free_seq_exprs(o->v.Assign.targets); - free_expr((expr_ty)o->v.Assign.value); - break; - case AugAssign_kind: - free_expr((expr_ty)o->v.AugAssign.target); - free_operator((operator_ty)o->v.AugAssign.op); - free_expr((expr_ty)o->v.AugAssign.value); - break; - case Print_kind: - if (o->v.Print.dest) { - free_expr((expr_ty)o->v.Print.dest); - } - free_seq_exprs(o->v.Print.values); - break; - case For_kind: - free_expr((expr_ty)o->v.For.target); - free_expr((expr_ty)o->v.For.iter); - free_seq_stmts(o->v.For.body); - free_seq_stmts(o->v.For.orelse); - break; - case While_kind: - free_expr((expr_ty)o->v.While.test); - free_seq_stmts(o->v.While.body); - free_seq_stmts(o->v.While.orelse); - break; - case If_kind: - free_expr((expr_ty)o->v.If.test); - free_seq_stmts(o->v.If.body); - free_seq_stmts(o->v.If.orelse); - break; - case Raise_kind: - if (o->v.Raise.type) { - free_expr((expr_ty)o->v.Raise.type); - } - if (o->v.Raise.inst) { - free_expr((expr_ty)o->v.Raise.inst); - } - if (o->v.Raise.tback) { - free_expr((expr_ty)o->v.Raise.tback); - } - break; - case TryExcept_kind: - free_seq_stmts(o->v.TryExcept.body); - seq = o->v.TryExcept.handlers; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_excepthandler((excepthandler_ty)asdl_seq_GET(seq, - i)); - asdl_seq_free(seq); - free_seq_stmts(o->v.TryExcept.orelse); - break; - case TryFinally_kind: - free_seq_stmts(o->v.TryFinally.body); - free_seq_stmts(o->v.TryFinally.finalbody); - break; - case Assert_kind: - free_expr((expr_ty)o->v.Assert.test); - if (o->v.Assert.msg) { - free_expr((expr_ty)o->v.Assert.msg); - } - break; - case Import_kind: - seq = o->v.Import.names; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_alias((alias_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - break; - case ImportFrom_kind: - Py_DECREF((identifier)o->v.ImportFrom.module); - seq = o->v.ImportFrom.names; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_alias((alias_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - break; - case Exec_kind: - free_expr((expr_ty)o->v.Exec.body); - if (o->v.Exec.globals) { - free_expr((expr_ty)o->v.Exec.globals); - } - if (o->v.Exec.locals) { - free_expr((expr_ty)o->v.Exec.locals); - } - break; - case Global_kind: - seq = o->v.Global.names; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - Py_DECREF((identifier)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - break; - case Expr_kind: - free_expr((expr_ty)o->v.Expr.value); - break; - case Pass_kind: - break; - case Break_kind: - break; - case Continue_kind: - break; - } - - free(o); -} - -void -free_expr(expr_ty o) -{ - int i, n; - asdl_seq *seq; - - if (!o) - return; - - switch (o->kind) { - case BoolOp_kind: - free_boolop((boolop_ty)o->v.BoolOp.op); - free_seq_exprs(o->v.BoolOp.values); - break; - case BinOp_kind: - free_expr((expr_ty)o->v.BinOp.left); - free_operator((operator_ty)o->v.BinOp.op); - free_expr((expr_ty)o->v.BinOp.right); - break; - case UnaryOp_kind: - free_unaryop((unaryop_ty)o->v.UnaryOp.op); - free_expr((expr_ty)o->v.UnaryOp.operand); - break; - case Lambda_kind: - free_arguments((arguments_ty)o->v.Lambda.args); - free_expr((expr_ty)o->v.Lambda.body); - break; - case Dict_kind: - free_seq_exprs(o->v.Dict.keys); - free_seq_exprs(o->v.Dict.values); - break; - case ListComp_kind: - free_expr((expr_ty)o->v.ListComp.elt); - seq = o->v.ListComp.generators; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_comprehension((comprehension_ty)asdl_seq_GET(seq, - i)); - asdl_seq_free(seq); - break; - case GeneratorExp_kind: - free_expr((expr_ty)o->v.GeneratorExp.elt); - seq = o->v.GeneratorExp.generators; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_comprehension((comprehension_ty)asdl_seq_GET(seq, - i)); - asdl_seq_free(seq); - break; - case Yield_kind: - if (o->v.Yield.value) { - free_expr((expr_ty)o->v.Yield.value); - } - break; - case Compare_kind: - free_expr((expr_ty)o->v.Compare.left); - seq = o->v.Compare.ops; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_cmpop((cmpop_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - free_seq_exprs(o->v.Compare.comparators); - break; - case Call_kind: - free_expr((expr_ty)o->v.Call.func); - free_seq_exprs(o->v.Call.args); - seq = o->v.Call.keywords; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_keyword((keyword_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - if (o->v.Call.starargs) { - free_expr((expr_ty)o->v.Call.starargs); - } - if (o->v.Call.kwargs) { - free_expr((expr_ty)o->v.Call.kwargs); - } - break; - case Repr_kind: - free_expr((expr_ty)o->v.Repr.value); - break; - case Num_kind: - Py_DECREF((object)o->v.Num.n); - break; - case Str_kind: - Py_DECREF((string)o->v.Str.s); - break; - case Attribute_kind: - free_expr((expr_ty)o->v.Attribute.value); - Py_DECREF((identifier)o->v.Attribute.attr); - free_expr_context((expr_context_ty)o->v.Attribute.ctx); - break; - case Subscript_kind: - free_expr((expr_ty)o->v.Subscript.value); - free_slice((slice_ty)o->v.Subscript.slice); - free_expr_context((expr_context_ty)o->v.Subscript.ctx); - break; - case Name_kind: - Py_DECREF((identifier)o->v.Name.id); - free_expr_context((expr_context_ty)o->v.Name.ctx); - break; - case List_kind: - free_seq_exprs(o->v.List.elts); - free_expr_context((expr_context_ty)o->v.List.ctx); - break; - case Tuple_kind: - free_seq_exprs(o->v.Tuple.elts); - free_expr_context((expr_context_ty)o->v.Tuple.ctx); - break; - } - - free(o); -} - -void -free_expr_context(expr_context_ty o) -{ - if (!o) - return; - -} - -void -free_slice(slice_ty o) -{ - int i, n; - asdl_seq *seq; - - if (!o) - return; - - switch (o->kind) { - case Ellipsis_kind: - break; - case Slice_kind: - if (o->v.Slice.lower) { - free_expr((expr_ty)o->v.Slice.lower); - } - if (o->v.Slice.upper) { - free_expr((expr_ty)o->v.Slice.upper); - } - if (o->v.Slice.step) { - free_expr((expr_ty)o->v.Slice.step); - } - break; - case ExtSlice_kind: - seq = o->v.ExtSlice.dims; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_slice((slice_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - break; - case Index_kind: - free_expr((expr_ty)o->v.Index.value); - break; - } - - free(o); -} - -void -free_boolop(boolop_ty o) -{ - if (!o) - return; - -} - -void -free_operator(operator_ty o) -{ - if (!o) - return; - -} - -void -free_unaryop(unaryop_ty o) -{ - if (!o) - return; - -} - -void -free_cmpop(cmpop_ty o) -{ - if (!o) - return; - -} - -void -free_comprehension(comprehension_ty o) -{ - if (!o) - return; - - free_expr((expr_ty)o->target); - free_expr((expr_ty)o->iter); - free_seq_exprs(o->ifs); - - free(o); -} - -void -free_excepthandler(excepthandler_ty o) -{ - if (!o) - return; - - if (o->type) { - free_expr((expr_ty)o->type); - } - if (o->name) { - free_expr((expr_ty)o->name); - } - free_seq_stmts(o->body); - - free(o); -} - -void -free_arguments(arguments_ty o) -{ - if (!o) - return; - - free_seq_exprs(o->args); - if (o->vararg) { - Py_DECREF((identifier)o->vararg); - } - if (o->kwarg) { - Py_DECREF((identifier)o->kwarg); - } - free_seq_exprs(o->defaults); - - free(o); -} - -void -free_keyword(keyword_ty o) -{ - if (!o) - return; - - Py_DECREF((identifier)o->arg); - free_expr((expr_ty)o->value); - - free(o); -} - -void -free_alias(alias_ty o) -{ - if (!o) - return; - - Py_DECREF((identifier)o->name); - if (o->asname) { - Py_DECREF((identifier)o->asname); - } - - free(o); -} - - #define CHECKSIZE(BUF, OFF, MIN) { \ int need = *(OFF) + MIN; \ Modified: python/branches/ast-arena/Python/asdl.c ============================================================================== --- python/branches/ast-arena/Python/asdl.c (original) +++ python/branches/ast-arena/Python/asdl.c Mon Dec 5 06:25:53 2005 @@ -2,7 +2,7 @@ #include "asdl.h" asdl_seq * -asdl_seq_new(int size) +asdl_seq_new(int size, PyArena *arena) { asdl_seq *seq = NULL; size_t n = sizeof(asdl_seq) + @@ -13,6 +13,7 @@ PyErr_NoMemory(); return NULL; } + PyArena_AddMallocPointer(arena, (void *)seq); memset(seq, 0, n); seq->size = size; return seq; @@ -21,6 +22,4 @@ void asdl_seq_free(asdl_seq *seq) { - PyObject_Free(seq); } - Modified: python/branches/ast-arena/Python/ast.c ============================================================================== --- python/branches/ast-arena/Python/ast.c (original) +++ python/branches/ast-arena/Python/ast.c Mon Dec 5 06:25:53 2005 @@ -7,6 +7,7 @@ #include "Python-ast.h" #include "grammar.h" #include "node.h" +#include "pyarena.h" #include "ast.h" #include "token.h" #include "parsetok.h" @@ -20,51 +21,10 @@ - syntax errors */ -/* - Note: - - You should rarely need to use the asdl_seq_free() in this file. - If you use asdl_seq_free(), you will leak any objects held in the seq. - If there is an appropriate asdl_*_seq_free() function, use it. - If there isn't an asdl_*_seq_free() function for you, you will - need to loop over the data in the sequence and free it. - - asdl_seq* seq; - int i; - - for (i = 0; i < asdl_seq_LEN(seq); i++) - free_***(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); / * ok * / - - Almost all of the ast functions return a seq of expr, so you should - use asdl_expr_seq_free(). The exception is ast_for_suite() which - returns a seq of stmt's, so use asdl_stmt_seq_free() to free it. - - If asdl_seq_free is appropriate, you should mark it with an ok comment. - - There are still many memory problems in this file even though - it runs clean in valgrind, save one problem that may have existed - before the AST. - - Any code which does something like this: - - return ASTconstruct(local, LINENO(n)); - - will leak memory. The problem is if ASTconstruct (e.g., TryFinally) - cannot allocate memory, local will be leaked. - - There was discussion on python-dev to replace the entire allocation - scheme in this file with arenas. Basically rather than allocate - memory in little blocks with malloc(), we allocate one big honking - hunk and deref everything into this block. We would still need - another block or technique to handle the PyObject*s. - - http://mail.python.org/pipermail/python-dev/2005-November/058138.html -*/ - /* Data structure used internally */ struct compiling { - char *c_encoding; /* source encoding */ + char *c_encoding; /* source encoding */ + PyArena *c_arena; /* arena for allocating memeory */ }; static asdl_seq *seq_for_testlist(struct compiling *, const node *); @@ -88,63 +48,14 @@ #define LINENO(n) ((n)->n_lineno) #endif -#define NEW_IDENTIFIER(n) PyString_InternFromString(STR(n)) - -static void -asdl_stmt_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_stmt(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_expr_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_expr(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_alias_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_alias(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ +static identifier +new_identifier(const char* n, PyArena *arena) { + PyObject* id = PyString_InternFromString(n); + PyArena_AddPyObject(arena, id); + return id; } -static void -asdl_comprehension_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_comprehension(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} +#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena) /* This routine provides an invalid object for the syntax error. The outermost routine must unpack this error and create the @@ -267,7 +178,8 @@ */ mod_ty -PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename) +PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, + PyArena *arena) { int i, j, num; asdl_seq *stmts = NULL; @@ -276,17 +188,18 @@ struct compiling c; if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) { - c.c_encoding = "utf-8"; + c.c_encoding = "utf-8"; } else if (TYPE(n) == encoding_decl) { c.c_encoding = STR(n); n = CHILD(n, 0); } else { c.c_encoding = NULL; } + c.c_arena = arena; switch (TYPE(n)) { case file_input: - stmts = asdl_seq_new(num_stmts(n)); + stmts = asdl_seq_new(num_stmts(n), arena); if (!stmts) return NULL; for (i = 0; i < NCH(n) - 1; i++) { @@ -312,7 +225,7 @@ } } } - return Module(stmts); + return Module(stmts, arena); case eval_input: { expr_ty testlist_ast; @@ -320,20 +233,20 @@ testlist_ast = ast_for_testlist(&c, CHILD(n, 0)); if (!testlist_ast) goto error; - return Expression(testlist_ast); + return Expression(testlist_ast, arena); } case single_input: if (TYPE(CHILD(n, 0)) == NEWLINE) { - stmts = asdl_seq_new(1); + stmts = asdl_seq_new(1, arena); if (!stmts) goto error; - asdl_seq_SET(stmts, 0, Pass(n->n_lineno)); - return Interactive(stmts); + asdl_seq_SET(stmts, 0, Pass(n->n_lineno, arena)); + return Interactive(stmts, arena); } else { n = CHILD(n, 0); num = num_stmts(n); - stmts = asdl_seq_new(num); + stmts = asdl_seq_new(num, arena); if (!stmts) goto error; if (num == 1) { @@ -356,14 +269,12 @@ } } - return Interactive(stmts); + return Interactive(stmts, arena); } default: goto error; } error: - if (stmts) - asdl_stmt_seq_free(stmts); ast_error_finish(filename); return NULL; } @@ -587,7 +498,7 @@ || TYPE(n) == testlist_safe ); - seq = asdl_seq_new((NCH(n) + 1) / 2); + seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; @@ -596,7 +507,6 @@ expression = ast_for_expr(c, CHILD(n, i)); if (!expression) { - asdl_expr_seq_free(seq); return NULL; } @@ -607,11 +517,11 @@ } static expr_ty -compiler_complex_args(const node *n) +compiler_complex_args(struct compiling *c, const node *n) { int i, len = (NCH(n) + 1) / 2; expr_ty result; - asdl_seq *args = asdl_seq_new(len); + asdl_seq *args = asdl_seq_new(len, c->c_arena); if (!args) return NULL; @@ -625,15 +535,16 @@ ast_error(child, "assignment to None"); return NULL; } - arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child)); + arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child), + c->c_arena); } else - arg = compiler_complex_args(CHILD(CHILD(n, 2*i), 1)); + arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1)); set_context(arg, Store, n); asdl_seq_SET(args, i, arg); } - result = Tuple(args, Store, LINENO(n)); + result = Tuple(args, Store, LINENO(n), c->c_arena); set_context(result, Store, n); return result; } @@ -658,7 +569,7 @@ if (TYPE(n) == parameters) { if (NCH(n) == 2) /* () as argument list */ - return arguments(NULL, NULL, NULL, NULL); + return arguments(NULL, NULL, NULL, NULL, c->c_arena); n = CHILD(n, 1); } REQ(n, varargslist); @@ -672,10 +583,10 @@ if (TYPE(ch) == EQUAL) n_defaults++; } - args = (n_args ? asdl_seq_new(n_args) : NULL); + args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL); if (!args && n_args) return NULL; /* Don't need to go to NULL; nothing allocated */ - defaults = (n_defaults ? asdl_seq_new(n_defaults) : NULL); + defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL); if (!defaults && n_defaults) goto error; @@ -704,7 +615,7 @@ if (NCH(ch) == 3) { asdl_seq_APPEND(args, - compiler_complex_args(CHILD(ch, 1))); + compiler_complex_args(c, CHILD(ch, 1))); } else if (TYPE(CHILD(ch, 0)) == NAME) { expr_ty name; @@ -713,7 +624,7 @@ goto error; } name = Name(NEW_IDENTIFIER(CHILD(ch, 0)), - Param, LINENO(ch)); + Param, LINENO(ch), c->c_arena); if (!name) goto error; asdl_seq_APPEND(args, name); @@ -745,15 +656,11 @@ } } - return arguments(args, vararg, kwarg, defaults); + return arguments(args, vararg, kwarg, defaults, c->c_arena); error: Py_XDECREF(vararg); Py_XDECREF(kwarg); - if (args) - asdl_expr_seq_free(args); - if (defaults) - asdl_expr_seq_free(defaults); return NULL; } @@ -770,7 +677,7 @@ id = NEW_IDENTIFIER(CHILD(n, 0)); if (!id) goto error; - e = Name(id, Load, LINENO(n)); + e = Name(id, Load, LINENO(n), c->c_arena); if (!e) goto error; id = NULL; @@ -779,7 +686,7 @@ id = NEW_IDENTIFIER(CHILD(n, i)); if (!id) goto error; - attrib = Attribute(e, id, Load, LINENO(CHILD(n, i))); + attrib = Attribute(e, id, Load, LINENO(CHILD(n, i)), c->c_arena); if (!attrib) goto error; e = attrib; @@ -789,8 +696,6 @@ return e; error: - Py_XDECREF(id); - free_expr(e); return NULL; } @@ -818,7 +723,7 @@ name_expr = NULL; } else if (NCH(n) == 5) { /* Call with no arguments */ - d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n)); + d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena); if (!d) goto error; name_expr = NULL; @@ -833,8 +738,6 @@ return d; error: - free_expr(name_expr); - free_expr(d); return NULL; } @@ -847,7 +750,7 @@ REQ(n, decorators); - decorator_seq = asdl_seq_new(NCH(n)); + decorator_seq = asdl_seq_new(NCH(n), c->c_arena); if (!decorator_seq) return NULL; @@ -859,7 +762,6 @@ } return decorator_seq; error: - asdl_expr_seq_free(decorator_seq); return NULL; } @@ -899,13 +801,9 @@ if (!body) goto error; - return FunctionDef(name, args, body, decorator_seq, LINENO(n)); + return FunctionDef(name, args, body, decorator_seq, LINENO(n), c->c_arena); error: - asdl_stmt_seq_free(body); - asdl_expr_seq_free(decorator_seq); - free_arguments(args); - Py_XDECREF(name); return NULL; } @@ -917,12 +815,11 @@ expr_ty expression; if (NCH(n) == 3) { - args = arguments(NULL, NULL, NULL, NULL); + args = arguments(NULL, NULL, NULL, NULL, c->c_arena); if (!args) return NULL; expression = ast_for_expr(c, CHILD(n, 2)); if (!expression) { - free_arguments(args); return NULL; } } @@ -932,12 +829,11 @@ return NULL; expression = ast_for_expr(c, CHILD(n, 3)); if (!expression) { - free_arguments(args); return NULL; } } - return Lambda(args, expression, LINENO(n)); + return Lambda(args, expression, LINENO(n), c->c_arena); } /* Count the number of 'for' loop in a list comprehension. @@ -1026,9 +922,8 @@ if (n_fors == -1) return NULL; - listcomps = asdl_seq_new(n_fors); + listcomps = asdl_seq_new(n_fors, c->c_arena); if (!listcomps) { - free_expr(elt); return NULL; } @@ -1042,32 +937,22 @@ t = ast_for_exprlist(c, CHILD(ch, 1), Store); if (!t) { - asdl_comprehension_seq_free(listcomps); - free_expr(elt); return NULL; } expression = ast_for_testlist(c, CHILD(ch, 3)); if (!expression) { - asdl_expr_seq_free(t); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); return NULL; } if (asdl_seq_LEN(t) == 1) { - lc = comprehension(asdl_seq_GET(t, 0), expression, NULL); - /* only free the sequence since we grabbed element 0 above */ - if (lc) - asdl_seq_free(t); /* ok */ + lc = comprehension(asdl_seq_GET(t, 0), expression, NULL, + c->c_arena); } else - lc = comprehension(Tuple(t, Store, LINENO(ch)), expression, NULL); + lc = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena), + expression, NULL, c->c_arena); if (!lc) { - asdl_expr_seq_free(t); - asdl_comprehension_seq_free(listcomps); - free_expr(expression); - free_expr(elt); return NULL; } @@ -1078,17 +963,11 @@ ch = CHILD(ch, 4); n_ifs = count_list_ifs(ch); if (n_ifs == -1) { - free_comprehension(lc); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); return NULL; } - ifs = asdl_seq_new(n_ifs); + ifs = asdl_seq_new(n_ifs, c->c_arena); if (!ifs) { - free_comprehension(lc); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); return NULL; } @@ -1110,7 +989,7 @@ asdl_seq_APPEND(listcomps, lc); } - return ListComp(elt, listcomps, LINENO(n)); + return ListComp(elt, listcomps, LINENO(n), c->c_arena); } /* @@ -1197,9 +1076,8 @@ if (n_fors == -1) return NULL; - genexps = asdl_seq_new(n_fors); + genexps = asdl_seq_new(n_fors, c->c_arena); if (!genexps) { - free_expr(elt); return NULL; } @@ -1213,34 +1091,22 @@ t = ast_for_exprlist(c, CHILD(ch, 1), Store); if (!t) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); return NULL; } expression = ast_for_expr(c, CHILD(ch, 3)); if (!expression) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); return NULL; } if (asdl_seq_LEN(t) == 1) { ge = comprehension(asdl_seq_GET(t, 0), expression, - NULL); - /* only free the sequence since we grabbed element 0 above */ - if (ge) - asdl_seq_free(t); /* ok */ + NULL, c->c_arena); } else - ge = comprehension(Tuple(t, Store, LINENO(ch)), - expression, NULL); + ge = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena), + expression, NULL, c->c_arena); if (!ge) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); return NULL; } @@ -1251,17 +1117,11 @@ ch = CHILD(ch, 4); n_ifs = count_gen_ifs(ch); if (n_ifs == -1) { - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); return NULL; } - ifs = asdl_seq_new(n_ifs); + ifs = asdl_seq_new(n_ifs, c->c_arena); if (!ifs) { - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); return NULL; } @@ -1273,10 +1133,6 @@ expression = ast_for_expr(c, CHILD(ch, 1)); if (!expression) { - asdl_expr_seq_free(ifs); - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); return NULL; } asdl_seq_APPEND(ifs, expression); @@ -1291,7 +1147,7 @@ asdl_seq_APPEND(genexps, ge); } - return GeneratorExp(elt, genexps, LINENO(n)); + return GeneratorExp(elt, genexps, LINENO(n), c->c_arena); } static expr_ty @@ -1306,14 +1162,14 @@ case NAME: /* All names start in Load context, but may later be changed. */ - return Name(NEW_IDENTIFIER(ch), Load, LINENO(n)); + return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), c->c_arena); case STRING: { PyObject *str = parsestrplus(c, n); if (!str) return NULL; - return Str(str, LINENO(n)); + return Str(str, LINENO(n), c->c_arena); } case NUMBER: { PyObject *pynum = parsenumber(STR(ch)); @@ -1321,13 +1177,13 @@ if (!pynum) return NULL; - return Num(pynum, LINENO(n)); + return Num(pynum, LINENO(n), c->c_arena); } case LPAR: /* some parenthesized expressions */ ch = CHILD(n, 1); if (TYPE(ch) == RPAR) - return Tuple(NULL, Load, LINENO(n)); + return Tuple(NULL, Load, LINENO(n), c->c_arena); if (TYPE(ch) == yield_expr) return ast_for_expr(c, ch); @@ -1340,7 +1196,7 @@ ch = CHILD(n, 1); if (TYPE(ch) == RSQB) - return List(NULL, Load, LINENO(n)); + return List(NULL, Load, LINENO(n), c->c_arena); REQ(ch, listmaker); if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { @@ -1349,7 +1205,7 @@ if (!elts) return NULL; - return List(elts, Load, LINENO(n)); + return List(elts, Load, LINENO(n), c->c_arena); } else return ast_for_listcomp(c, ch); @@ -1360,13 +1216,12 @@ ch = CHILD(n, 1); size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ - keys = asdl_seq_new(size); + keys = asdl_seq_new(size, c->c_arena); if (!keys) return NULL; - values = asdl_seq_new(size); + values = asdl_seq_new(size, c->c_arena); if (!values) { - asdl_seq_free(keys); /* ok */ return NULL; } @@ -1375,8 +1230,6 @@ expression = ast_for_expr(c, CHILD(ch, i)); if (!expression) { - asdl_expr_seq_free(keys); - asdl_expr_seq_free(values); return NULL; } @@ -1384,14 +1237,12 @@ expression = ast_for_expr(c, CHILD(ch, i + 2)); if (!expression) { - asdl_expr_seq_free(keys); - asdl_expr_seq_free(values); return NULL; } asdl_seq_SET(values, i / 4, expression); } - return Dict(keys, values, LINENO(n)); + return Dict(keys, values, LINENO(n), c->c_arena); } case BACKQUOTE: { /* repr */ expr_ty expression = ast_for_testlist(c, CHILD(n, 1)); @@ -1399,7 +1250,7 @@ if (!expression) return NULL; - return Repr(expression, LINENO(n)); + return Repr(expression, LINENO(n), c->c_arena); } default: PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch)); @@ -1421,7 +1272,7 @@ */ ch = CHILD(n, 0); if (TYPE(ch) == DOT) - return Ellipsis(); + return Ellipsis(c->c_arena); if (NCH(n) == 1 && TYPE(ch) == test) { /* 'step' variable hold no significance in terms of being used over @@ -1430,7 +1281,7 @@ if (!step) return NULL; - return Index(step); + return Index(step, c->c_arena); } if (TYPE(ch) == test) { @@ -1475,7 +1326,7 @@ } } - return Slice(lower, upper, step); + return Slice(lower, upper, step, c->c_arena); } static expr_ty @@ -1502,7 +1353,7 @@ if (!operator) return NULL; - result = BinOp(expr1, operator, expr2, LINENO(n)); + result = BinOp(expr1, operator, expr2, LINENO(n), c->c_arena); if (!result) return NULL; @@ -1520,7 +1371,7 @@ return NULL; tmp_result = BinOp(result, operator, tmp, - LINENO(next_oper)); + LINENO(next_oper), c->c_arena); if (!tmp) return NULL; result = tmp_result; @@ -1536,7 +1387,7 @@ REQ(n, trailer); if (TYPE(CHILD(n, 0)) == LPAR) { if (NCH(n) == 2) - e = Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n)); + e = Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena); else e = ast_for_call(c, CHILD(n, 1), left_expr); } @@ -1547,40 +1398,35 @@ slice_ty slc = ast_for_slice(c, CHILD(n, 0)); if (!slc) return NULL; - e = Subscript(left_expr, slc, Load, LINENO(n)); + e = Subscript(left_expr, slc, Load, LINENO(n), c->c_arena); if (!e) { - free_slice(slc); return NULL; } } else { int j; slice_ty slc; - asdl_seq *slices = asdl_seq_new((NCH(n) + 1) / 2); + asdl_seq *slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!slices) return NULL; for (j = 0; j < NCH(n); j += 2) { slc = ast_for_slice(c, CHILD(n, j)); if (!slc) { - for (j = j / 2; j >= 0; j--) - free_slice(asdl_seq_GET(slices, j)); - asdl_seq_free(slices); /* ok */ return NULL; } asdl_seq_SET(slices, j / 2, slc); } - e = Subscript(left_expr, ExtSlice(slices), Load, LINENO(n)); + e = Subscript(left_expr, ExtSlice(slices, c->c_arena), + Load, LINENO(n), c->c_arena); if (!e) { - for (j = 0; j < asdl_seq_LEN(slices); j++) - free_slice(asdl_seq_GET(slices, j)); - asdl_seq_free(slices); /* ok */ return NULL; } } } else { assert(TYPE(CHILD(n, 0)) == DOT); - e = Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n)); + e = Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), + c->c_arena); } return e; } @@ -1604,7 +1450,6 @@ break; tmp = ast_for_trailer(c, ch, e); if (!tmp) { - free_expr(e); return NULL; } e = tmp; @@ -1612,13 +1457,10 @@ if (TYPE(CHILD(n, NCH(n) - 1)) == factor) { expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1)); if (!f) { - free_expr(e); return NULL; } - tmp = BinOp(e, Pow, f, LINENO(n)); + tmp = BinOp(e, Pow, f, LINENO(n), c->c_arena); if (!tmp) { - free_expr(f); - free_expr(e); return NULL; } e = tmp; @@ -1661,7 +1503,7 @@ n = CHILD(n, 0); goto loop; } - seq = asdl_seq_new((NCH(n) + 1) / 2); + seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -1671,10 +1513,10 @@ asdl_seq_SET(seq, i / 2, e); } if (!strcmp(STR(CHILD(n, 1)), "and")) - return BoolOp(And, seq, LINENO(n)); + return BoolOp(And, seq, LINENO(n), c->c_arena); else { assert(!strcmp(STR(CHILD(n, 1)), "or")); - return BoolOp(Or, seq, LINENO(n)); + return BoolOp(Or, seq, LINENO(n), c->c_arena); } break; case not_test: @@ -1687,7 +1529,7 @@ if (!expression) return NULL; - return UnaryOp(Not, expression, LINENO(n)); + return UnaryOp(Not, expression, LINENO(n), c->c_arena); } case comparison: if (NCH(n) == 1) { @@ -1697,12 +1539,11 @@ else { expr_ty expression; asdl_seq *ops, *cmps; - ops = asdl_seq_new(NCH(n) / 2); + ops = asdl_seq_new(NCH(n) / 2, c->c_arena); if (!ops) return NULL; - cmps = asdl_seq_new(NCH(n) / 2); + cmps = asdl_seq_new(NCH(n) / 2, c->c_arena); if (!cmps) { - asdl_seq_free(ops); /* ok */ return NULL; } for (i = 1; i < NCH(n); i += 2) { @@ -1711,15 +1552,11 @@ operator = ast_for_comp_op(CHILD(n, i)); if (!operator) { - asdl_expr_seq_free(ops); - asdl_expr_seq_free(cmps); return NULL; } expression = ast_for_expr(c, CHILD(n, i + 1)); if (!expression) { - asdl_expr_seq_free(ops); - asdl_expr_seq_free(cmps); return NULL; } @@ -1728,12 +1565,10 @@ } expression = ast_for_expr(c, CHILD(n, 0)); if (!expression) { - asdl_expr_seq_free(ops); - asdl_expr_seq_free(cmps); return NULL; } - return Compare(expression, ops, cmps, LINENO(n)); + return Compare(expression, ops, cmps, LINENO(n), c->c_arena); } break; @@ -1759,7 +1594,7 @@ if (!exp) return NULL; } - return Yield(exp, LINENO(n)); + return Yield(exp, LINENO(n), c->c_arena); } case factor: { expr_ty expression; @@ -1775,11 +1610,11 @@ switch (TYPE(CHILD(n, 0))) { case PLUS: - return UnaryOp(UAdd, expression, LINENO(n)); + return UnaryOp(UAdd, expression, LINENO(n), c->c_arena); case MINUS: - return UnaryOp(USub, expression, LINENO(n)); + return UnaryOp(USub, expression, LINENO(n), c->c_arena); case TILDE: - return UnaryOp(Invert, expression, LINENO(n)); + return UnaryOp(Invert, expression, LINENO(n), c->c_arena); } PyErr_Format(PyExc_SystemError, "unhandled factor: %d", TYPE(CHILD(n, 0))); @@ -1836,10 +1671,10 @@ return NULL; } - args = asdl_seq_new(nargs + ngens); + args = asdl_seq_new(nargs + ngens, c->c_arena); if (!args) goto error; - keywords = asdl_seq_new(nkeywords); + keywords = asdl_seq_new(nkeywords, c->c_arena); if (!keywords) goto error; nargs = 0; @@ -1881,11 +1716,10 @@ goto error; } key = e->v.Name.id; - free(e); /* XXX: is free correct here? */ e = ast_for_expr(c, CHILD(ch, 2)); if (!e) goto error; - kw = keyword(key, e); + kw = keyword(key, e, c->c_arena); if (!kw) goto error; asdl_seq_SET(keywords, nkeywords++, kw); @@ -1901,18 +1735,9 @@ } } - return Call(func, args, keywords, vararg, kwarg, LINENO(n)); + return Call(func, args, keywords, vararg, kwarg, LINENO(n), c->c_arena); error: - free_expr(vararg); - free_expr(kwarg); - if (args) - asdl_expr_seq_free(args); - if (keywords) { - for (i = 0; i < asdl_seq_LEN(keywords); i++) - free_keyword(asdl_seq_GET(keywords, i)); - asdl_seq_free(keywords); /* ok */ - } return NULL; } @@ -1939,7 +1764,7 @@ asdl_seq *tmp = seq_for_testlist(c, n); if (!tmp) return NULL; - return Tuple(tmp, Load, LINENO(n)); + return Tuple(tmp, Load, LINENO(n), c->c_arena); } } @@ -1965,12 +1790,11 @@ REQ(n, testlist); if (NCH(n) == 1) { expr_ty base; - asdl_seq *bases = asdl_seq_new(1); + asdl_seq *bases = asdl_seq_new(1, c->c_arena); if (!bases) return NULL; base = ast_for_expr(c, CHILD(n, 0)); if (!base) { - asdl_seq_free(bases); /* ok */ return NULL; } asdl_seq_SET(bases, 0, base); @@ -1998,7 +1822,7 @@ if (!e) return NULL; - return Expr(e, LINENO(n)); + return Expr(e, LINENO(n), c->c_arena); } else if (TYPE(CHILD(n, 1)) == augassign) { expr_ty expr1, expr2; @@ -2008,12 +1832,12 @@ if (TYPE(ch) == testlist) expr1 = ast_for_testlist(c, ch); else - expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch)); + expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch), + c->c_arena); if (!expr1) return NULL; if (expr1->kind == GeneratorExp_kind) { - free_expr(expr1); ast_error(ch, "augmented assignment to generator " "expression not possible"); return NULL; @@ -2021,7 +1845,6 @@ if (expr1->kind == Name_kind) { char *var_name = PyString_AS_STRING(expr1->v.Name.id); if (var_name[0] == 'N' && !strcmp(var_name, "None")) { - free_expr(expr1); ast_error(ch, "assignment to None"); return NULL; } @@ -2031,20 +1854,17 @@ if (TYPE(ch) == testlist) expr2 = ast_for_testlist(c, ch); else - expr2 = Yield(ast_for_expr(c, ch), LINENO(ch)); + expr2 = Yield(ast_for_expr(c, ch), LINENO(ch), c->c_arena); if (!expr2) { - free_expr(expr1); return NULL; } operator = ast_for_augassign(CHILD(n, 1)); if (!operator) { - free_expr(expr1); - free_expr(expr2); return NULL; } - return AugAssign(expr1, operator, expr2, LINENO(n)); + return AugAssign(expr1, operator, expr2, LINENO(n), c->c_arena); } else { int i; @@ -2054,7 +1874,7 @@ /* a normal assignment */ REQ(CHILD(n, 1), EQUAL); - targets = asdl_seq_new(NCH(n) / 2); + targets = asdl_seq_new(NCH(n) / 2, c->c_arena); if (!targets) return NULL; for (i = 0; i < NCH(n) - 2; i += 2) { @@ -2071,7 +1891,6 @@ goto error; if (!set_context(e, Store, CHILD(n, i))) { - free_expr(e); goto error; } @@ -2084,9 +1903,9 @@ expression = ast_for_expr(c, value); if (!expression) goto error; - return Assign(targets, expression, LINENO(n)); + return Assign(targets, expression, LINENO(n), c->c_arena); error: - asdl_expr_seq_free(targets); + (void)1; } return NULL; } @@ -2109,21 +1928,19 @@ return NULL; start = 4; } - seq = asdl_seq_new((NCH(n) + 1 - start) / 2); + seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena); if (!seq) return NULL; for (i = start; i < NCH(n); i += 2) { expression = ast_for_expr(c, CHILD(n, i)); if (!expression) { - free_expr(dest); - asdl_expr_seq_free(seq); return NULL; } asdl_seq_APPEND(seq, expression); } nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true; - return Print(dest, seq, nl, LINENO(n)); + return Print(dest, seq, nl, LINENO(n), c->c_arena); } static asdl_seq * @@ -2135,7 +1952,7 @@ REQ(n, exprlist); - seq = asdl_seq_new((NCH(n) + 1) / 2); + seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2151,7 +1968,6 @@ return seq; error: - asdl_expr_seq_free(seq); return NULL; } @@ -2166,7 +1982,7 @@ expr_list = ast_for_exprlist(c, CHILD(n, 1), Del); if (!expr_list) return NULL; - return Delete(expr_list, LINENO(n)); + return Delete(expr_list, LINENO(n), c->c_arena); } static stmt_ty @@ -2188,32 +2004,32 @@ ch = CHILD(n, 0); switch (TYPE(ch)) { case break_stmt: - return Break(LINENO(n)); + return Break(LINENO(n), c->c_arena); case continue_stmt: - return Continue(LINENO(n)); + return Continue(LINENO(n), c->c_arena); case yield_stmt: { /* will reduce to yield_expr */ expr_ty exp = ast_for_expr(c, CHILD(ch, 0)); if (!exp) return NULL; - return Expr(exp, LINENO(n)); + return Expr(exp, LINENO(n), c->c_arena); } case return_stmt: if (NCH(ch) == 1) - return Return(NULL, LINENO(n)); + return Return(NULL, LINENO(n), c->c_arena); else { expr_ty expression = ast_for_testlist(c, CHILD(ch, 1)); if (!expression) return NULL; - return Return(expression, LINENO(n)); + return Return(expression, LINENO(n), c->c_arena); } case raise_stmt: if (NCH(ch) == 1) - return Raise(NULL, NULL, NULL, LINENO(n)); + return Raise(NULL, NULL, NULL, LINENO(n), c->c_arena); else if (NCH(ch) == 2) { expr_ty expression = ast_for_expr(c, CHILD(ch, 1)); if (!expression) return NULL; - return Raise(expression, NULL, NULL, LINENO(n)); + return Raise(expression, NULL, NULL, LINENO(n), c->c_arena); } else if (NCH(ch) == 4) { expr_ty expr1, expr2; @@ -2225,7 +2041,7 @@ if (!expr2) return NULL; - return Raise(expr1, expr2, NULL, LINENO(n)); + return Raise(expr1, expr2, NULL, LINENO(n), c->c_arena); } else if (NCH(ch) == 6) { expr_ty expr1, expr2, expr3; @@ -2240,7 +2056,7 @@ if (!expr3) return NULL; - return Raise(expr1, expr2, expr3, LINENO(n)); + return Raise(expr1, expr2, expr3, LINENO(n), c->c_arena); } default: PyErr_Format(PyExc_SystemError, @@ -2250,7 +2066,7 @@ } static alias_ty -alias_for_import_name(const node *n) +alias_for_import_name(struct compiling *c, const node *n) { /* import_as_name: NAME [NAME NAME] @@ -2262,10 +2078,10 @@ case import_as_name: if (NCH(n) == 3) return alias(NEW_IDENTIFIER(CHILD(n, 0)), - NEW_IDENTIFIER(CHILD(n, 2))); + NEW_IDENTIFIER(CHILD(n, 2)), c->c_arena); else return alias(NEW_IDENTIFIER(CHILD(n, 0)), - NULL); + NULL, c->c_arena); break; case dotted_as_name: if (NCH(n) == 1) { @@ -2273,7 +2089,7 @@ goto loop; } else { - alias_ty a = alias_for_import_name(CHILD(n, 0)); + alias_ty a = alias_for_import_name(c, CHILD(n, 0)); assert(!a->asname); a->asname = NEW_IDENTIFIER(CHILD(n, 2)); return a; @@ -2281,7 +2097,7 @@ break; case dotted_name: if (NCH(n) == 1) - return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL); + return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena); else { /* Create a string of the form "a.b.c" */ int i, len; @@ -2308,11 +2124,11 @@ --s; *s = '\0'; PyString_InternInPlace(&str); - return alias(str, NULL); + return alias(str, NULL, c->c_arena); } break; case STAR: - return alias(PyString_InternFromString("*"), NULL); + return alias(PyString_InternFromString("*"), NULL, c->c_arena); default: PyErr_Format(PyExc_SystemError, "unexpected import name: %d", TYPE(n)); @@ -2339,25 +2155,24 @@ if (STR(CHILD(n, 0))[0] == 'i') { /* import */ n = CHILD(n, 1); REQ(n, dotted_as_names); - aliases = asdl_seq_new((NCH(n) + 1) / 2); + aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!aliases) return NULL; for (i = 0; i < NCH(n); i += 2) { - alias_ty import_alias = alias_for_import_name(CHILD(n, i)); + alias_ty import_alias = alias_for_import_name(c, CHILD(n, i)); if (!import_alias) { - asdl_alias_seq_free(aliases); return NULL; } asdl_seq_SET(aliases, i / 2, import_alias); } - return Import(aliases, LINENO(n)); + return Import(aliases, LINENO(n), c->c_arena); } else if (STR(CHILD(n, 0))[0] == 'f') { /* from */ stmt_ty import; int n_children; const char *from_modules; int lineno = LINENO(n); - alias_ty mod = alias_for_import_name(CHILD(n, 1)); + alias_ty mod = alias_for_import_name(c, CHILD(n, 1)); if (!mod) return NULL; @@ -2368,7 +2183,6 @@ n = CHILD(n, 3); /* from ... import x, y, z */ if (NCH(n) % 2 == 0) { /* it ends with a comma, not valid but the parser allows it */ - free_alias(mod); ast_error(n, "trailing comma not allowed without" " surrounding parentheses"); return NULL; @@ -2381,7 +2195,6 @@ n = CHILD(n, 4); /* from ... import (x, y, z) */ else { /* XXX: don't we need to call ast_error(n, "..."); */ - free_alias(mod); return NULL; } @@ -2389,35 +2202,29 @@ if (from_modules && from_modules[0] == '*') n_children = 1; - aliases = asdl_seq_new((n_children + 1) / 2); + aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena); if (!aliases) { - free_alias(mod); return NULL; } /* handle "from ... import *" special b/c there's no children */ if (from_modules && from_modules[0] == '*') { - alias_ty import_alias = alias_for_import_name(n); + alias_ty import_alias = alias_for_import_name(c, n); if (!import_alias) { - asdl_alias_seq_free(aliases); - free_alias(mod); return NULL; } asdl_seq_APPEND(aliases, import_alias); } for (i = 0; i < NCH(n); i += 2) { - alias_ty import_alias = alias_for_import_name(CHILD(n, i)); + alias_ty import_alias = alias_for_import_name(c, CHILD(n, i)); if (!import_alias) { - asdl_alias_seq_free(aliases); - free_alias(mod); return NULL; } asdl_seq_APPEND(aliases, import_alias); } Py_INCREF(mod->name); - import = ImportFrom(mod->name, aliases, lineno); - free_alias(mod); + import = ImportFrom(mod->name, aliases, lineno, c->c_arena); return import; } PyErr_Format(PyExc_SystemError, @@ -2435,20 +2242,17 @@ int i; REQ(n, global_stmt); - s = asdl_seq_new(NCH(n) / 2); + s = asdl_seq_new(NCH(n) / 2, c->c_arena); if (!s) return NULL; for (i = 1; i < NCH(n); i += 2) { name = NEW_IDENTIFIER(CHILD(n, i)); if (!name) { - for (i = i / 2; i > 0; i--) - Py_XDECREF((identifier) asdl_seq_GET(s, i)); - asdl_seq_free(s); /* ok */ return NULL; } asdl_seq_SET(s, i / 2, name); } - return Global(s, LINENO(n)); + return Global(s, LINENO(n), c->c_arena); } static stmt_ty @@ -2479,7 +2283,7 @@ return NULL; } - return Exec(expr1, globals, locals, LINENO(n)); + return Exec(expr1, globals, locals, LINENO(n), c->c_arena); } static stmt_ty @@ -2491,7 +2295,7 @@ expr_ty expression = ast_for_expr(c, CHILD(n, 1)); if (!expression) return NULL; - return Assert(expression, NULL, LINENO(n)); + return Assert(expression, NULL, LINENO(n), c->c_arena); } else if (NCH(n) == 4) { expr_ty expr1, expr2; @@ -2503,7 +2307,7 @@ if (!expr2) return NULL; - return Assert(expr1, expr2, LINENO(n)); + return Assert(expr1, expr2, LINENO(n), c->c_arena); } PyErr_Format(PyExc_SystemError, "improper number of parts to 'assert' statement: %d", @@ -2523,7 +2327,7 @@ REQ(n, suite); total = num_stmts(n); - seq = asdl_seq_new(total); + seq = asdl_seq_new(total, c->c_arena); if (!seq) return NULL; if (TYPE(CHILD(n, 0)) == simple_stmt) { @@ -2571,8 +2375,6 @@ assert(pos == seq->size); return seq; error: - if (seq) - asdl_stmt_seq_free(seq); return NULL; } @@ -2595,11 +2397,10 @@ return NULL; suite_seq = ast_for_suite(c, CHILD(n, 3)); if (!suite_seq) { - free_expr(expression); return NULL; } - return If(expression, suite_seq, NULL, LINENO(n)); + return If(expression, suite_seq, NULL, LINENO(n), c->c_arena); } s = STR(CHILD(n, 4)); /* s[2], the third character in the string, will be @@ -2615,17 +2416,14 @@ return NULL; seq1 = ast_for_suite(c, CHILD(n, 3)); if (!seq1) { - free_expr(expression); return NULL; } seq2 = ast_for_suite(c, CHILD(n, 6)); if (!seq2) { - asdl_stmt_seq_free(seq1); - free_expr(expression); return NULL; } - return If(expression, seq1, seq2, LINENO(n)); + return If(expression, seq1, seq2, LINENO(n), c->c_arena); } else if (s[2] == 'i') { int i, n_elif, has_else = 0; @@ -2644,30 +2442,25 @@ expr_ty expression; asdl_seq *seq1, *seq2; - orelse = asdl_seq_new(1); + orelse = asdl_seq_new(1, c->c_arena); if (!orelse) return NULL; expression = ast_for_expr(c, CHILD(n, NCH(n) - 6)); if (!expression) { - asdl_seq_free(orelse); /* ok */ return NULL; } seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4)); if (!seq1) { - free_expr(expression); - asdl_seq_free(orelse); /* ok */ return NULL; } seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1)); if (!seq2) { - free_expr(expression); - asdl_stmt_seq_free(seq1); - asdl_seq_free(orelse); /* ok */ return NULL; } asdl_seq_SET(orelse, 0, If(expression, seq1, seq2, - LINENO(CHILD(n, NCH(n) - 6)))); + LINENO(CHILD(n, NCH(n) - 6)), + c->c_arena)); /* the just-created orelse handled the last elif */ n_elif--; } @@ -2678,33 +2471,27 @@ int off = 5 + (n_elif - i - 1) * 4; expr_ty expression; asdl_seq *suite_seq; - asdl_seq *new = asdl_seq_new(1); + asdl_seq *new = asdl_seq_new(1, c->c_arena); if (!new) { - asdl_stmt_seq_free(orelse); return NULL; } expression = ast_for_expr(c, CHILD(n, off)); if (!expression) { - asdl_stmt_seq_free(orelse); - asdl_seq_free(new); /* ok */ return NULL; } suite_seq = ast_for_suite(c, CHILD(n, off + 2)); if (!suite_seq) { - asdl_stmt_seq_free(orelse); - free_expr(expression); - asdl_seq_free(new); /* ok */ return NULL; } asdl_seq_SET(new, 0, If(expression, suite_seq, orelse, - LINENO(CHILD(n, off)))); + LINENO(CHILD(n, off)), c->c_arena)); orelse = new; } return If(ast_for_expr(c, CHILD(n, 1)), ast_for_suite(c, CHILD(n, 3)), - orelse, LINENO(n)); + orelse, LINENO(n), c->c_arena); } else { PyErr_Format(PyExc_SystemError, @@ -2728,10 +2515,9 @@ return NULL; suite_seq = ast_for_suite(c, CHILD(n, 3)); if (!suite_seq) { - free_expr(expression); return NULL; } - return While(expression, suite_seq, NULL, LINENO(n)); + return While(expression, suite_seq, NULL, LINENO(n), c->c_arena); } else if (NCH(n) == 7) { expr_ty expression; @@ -2742,17 +2528,14 @@ return NULL; seq1 = ast_for_suite(c, CHILD(n, 3)); if (!seq1) { - free_expr(expression); return NULL; } seq2 = ast_for_suite(c, CHILD(n, 6)); if (!seq2) { - asdl_stmt_seq_free(seq1); - free_expr(expression); return NULL; } - return While(expression, seq1, seq2, LINENO(n)); + return While(expression, seq1, seq2, LINENO(n), c->c_arena); } else { PyErr_Format(PyExc_SystemError, @@ -2779,31 +2562,24 @@ _target = ast_for_exprlist(c, CHILD(n, 1), Store); if (!_target) { - asdl_stmt_seq_free(seq); return NULL; } if (asdl_seq_LEN(_target) == 1) { target = asdl_seq_GET(_target, 0); - asdl_seq_free(_target); /* ok */ } else - target = Tuple(_target, Store, LINENO(n)); + target = Tuple(_target, Store, LINENO(n), c->c_arena); expression = ast_for_testlist(c, CHILD(n, 3)); if (!expression) { - free_expr(target); - asdl_stmt_seq_free(seq); return NULL; } suite_seq = ast_for_suite(c, CHILD(n, 5)); if (!suite_seq) { - free_expr(target); - free_expr(expression); - asdl_stmt_seq_free(seq); return NULL; } - return For(target, expression, suite_seq, seq, LINENO(n)); + return For(target, expression, suite_seq, seq, LINENO(n), c->c_arena); } static excepthandler_ty @@ -2818,7 +2594,7 @@ if (!suite_seq) return NULL; - return excepthandler(NULL, NULL, suite_seq); + return excepthandler(NULL, NULL, suite_seq, c->c_arena); } else if (NCH(exc) == 2) { expr_ty expression; @@ -2829,11 +2605,10 @@ return NULL; suite_seq = ast_for_suite(c, body); if (!suite_seq) { - free_expr(expression); return NULL; } - return excepthandler(expression, NULL, suite_seq); + return excepthandler(expression, NULL, suite_seq, c->c_arena); } else if (NCH(exc) == 4) { asdl_seq *suite_seq; @@ -2842,22 +2617,18 @@ if (!e) return NULL; if (!set_context(e, Store, CHILD(exc, 3))) { - free_expr(e); return NULL; } expression = ast_for_expr(c, CHILD(exc, 1)); if (!expression) { - free_expr(e); return NULL; } suite_seq = ast_for_suite(c, body); if (!suite_seq) { - free_expr(expression); - free_expr(e); return NULL; } - return excepthandler(expression, e, suite_seq); + return excepthandler(expression, e, suite_seq, c->c_arena); } else { PyErr_Format(PyExc_SystemError, @@ -2880,11 +2651,10 @@ return NULL; s2 = ast_for_suite(c, CHILD(n, 5)); if (!s2) { - asdl_stmt_seq_free(s1); return NULL; } - return TryFinally(s1, s2, LINENO(n)); + return TryFinally(s1, s2, LINENO(n), c->c_arena); } else if (TYPE(CHILD(n, 3)) == except_clause) { /* try_stmt: ('try' ':' suite (except_clause ':' suite)+ @@ -2898,7 +2668,7 @@ n_except -= 3; } n_except /= 3; - handlers = asdl_seq_new(n_except); + handlers = asdl_seq_new(n_except, c->c_arena); if (!handlers) return NULL; for (i = 0; i < n_except; i++) { @@ -2906,9 +2676,6 @@ CHILD(n, 3 + i * 3), CHILD(n, 5 + i * 3)); if (!e) { - for ( ; i >= 0; i--) - free_excepthandler(asdl_seq_GET(handlers, i)); - asdl_seq_free(handlers); /* ok */ return NULL; } asdl_seq_SET(handlers, i, e); @@ -2916,25 +2683,19 @@ suite_seq1 = ast_for_suite(c, CHILD(n, 2)); if (!suite_seq1) { - for (i = 0; i < asdl_seq_LEN(handlers); i++) - free_excepthandler(asdl_seq_GET(handlers, i)); - asdl_seq_free(handlers); /* ok */ return NULL; } if (has_else) { suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1)); if (!suite_seq2) { - for (i = 0; i < asdl_seq_LEN(handlers); i++) - free_excepthandler(asdl_seq_GET(handlers, i)); - asdl_seq_free(handlers); /* ok */ - asdl_stmt_seq_free(suite_seq1); return NULL; } } else suite_seq2 = NULL; - return TryExcept(suite_seq1, handlers, suite_seq2, LINENO(n)); + return TryExcept(suite_seq1, handlers, suite_seq2, LINENO(n), + c->c_arena); } else { ast_error(n, "malformed 'try' statement"); @@ -2959,14 +2720,16 @@ s = ast_for_suite(c, CHILD(n, 3)); if (!s) return NULL; - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n)); + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n), + c->c_arena); } /* check for empty base list */ if (TYPE(CHILD(n,3)) == RPAR) { s = ast_for_suite(c, CHILD(n,5)); if (!s) return NULL; - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n)); + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n), + c->c_arena); } /* else handle the base class list */ @@ -2976,10 +2739,10 @@ s = ast_for_suite(c, CHILD(n, 6)); if (!s) { - asdl_expr_seq_free(bases); return NULL; } - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n)); + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n), + c->c_arena); } static stmt_ty @@ -3008,7 +2771,7 @@ case del_stmt: return ast_for_del_stmt(c, n); case pass_stmt: - return Pass(LINENO(n)); + return Pass(LINENO(n), c->c_arena); case flow_stmt: return ast_for_flow_stmt(c, n); case import_stmt: Modified: python/branches/ast-arena/Python/compile.c ============================================================================== --- python/branches/ast-arena/Python/compile.c (original) +++ python/branches/ast-arena/Python/compile.c Mon Dec 5 06:25:53 2005 @@ -23,6 +23,7 @@ #include "Python-ast.h" #include "node.h" +#include "pyarena.h" #include "ast.h" #include "code.h" #include "compile.h" @@ -148,6 +149,7 @@ struct compiler_unit *u; /* compiler state for current block */ PyObject *c_stack; /* Python list holding compiler_unit ptrs */ char *c_encoding; /* source encoding (a borrowed reference) */ + PyArena *c_arena; /* pointer to memory allocation arena */ }; struct assembler { @@ -243,7 +245,8 @@ } PyCodeObject * -PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags) +PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags, + PyArena *arena) { struct compiler c; PyCodeObject *co = NULL; @@ -259,6 +262,7 @@ if (!compiler_init(&c)) goto error; c.c_filename = filename; + c.c_arena = arena; c.c_future = PyFuture_FromAST(mod, filename); if (c.c_future == NULL) goto error; @@ -293,11 +297,13 @@ PyNode_Compile(struct _node *n, const char *filename) { PyCodeObject *co; - mod_ty mod = PyAST_FromNode(n, NULL, filename); + PyArena *arena; + arena = PyArena_New(); + mod_ty mod = PyAST_FromNode(n, NULL, filename, arena); if (!mod) return NULL; - co = PyAST_Compile(mod, filename, NULL); - free_mod(mod); + co = PyAST_Compile(mod, filename, NULL, arena); + PyArena_Free(arena); return co; } @@ -3407,7 +3413,7 @@ switch (e->kind) { case Attribute_kind: auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, - AugLoad, e->lineno); + AugLoad, e->lineno, c->c_arena); if (auge == NULL) return 0; VISIT(c, expr, auge); @@ -3415,11 +3421,10 @@ ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); auge->v.Attribute.ctx = AugStore; VISIT(c, expr, auge); - free(auge); break; case Subscript_kind: auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, - AugLoad, e->lineno); + AugLoad, e->lineno, c->c_arena); if (auge == NULL) return 0; VISIT(c, expr, auge); @@ -3427,7 +3432,6 @@ ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); auge->v.Subscript.ctx = AugStore; VISIT(c, expr, auge); - free(auge); break; case Name_kind: VISIT(c, expr, s->v.AugAssign.target); Modified: python/branches/ast-arena/Python/import.c ============================================================================== --- python/branches/ast-arena/Python/import.c (original) +++ python/branches/ast-arena/Python/import.c Mon Dec 5 06:25:53 2005 @@ -4,6 +4,7 @@ #include "Python.h" #include "Python-ast.h" +#include "pyarena.h" #include "pythonrun.h" #include "errcode.h" #include "marshal.h" @@ -773,13 +774,14 @@ { PyCodeObject *co = NULL; mod_ty mod; + PyArena *arena = PyArena_New(); mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, 0, - NULL); + NULL, arena); if (mod) { - co = PyAST_Compile(mod, pathname, NULL); - free_mod(mod); + co = PyAST_Compile(mod, pathname, NULL, arena); } + PyArena_Free(arena); return co; } Added: python/branches/ast-arena/Python/pyarena.c ============================================================================== --- (empty file) +++ python/branches/ast-arena/Python/pyarena.c Mon Dec 5 06:25:53 2005 @@ -0,0 +1,129 @@ +#include "Python.h" +#include "pyarena.h" + +/* An arena list is a linked list that can store either pointers or + PyObjects. The type is clear from context. + */ + +typedef struct _arena_list { + struct _arena_list *al_next; + void *al_pointer; +} PyArenaList; + +/* There are two linked lists in an arena, one for malloc pointers and + one for PyObject. For each list, there is a pointer to the head + and to the tail. The head is used to free the list. The tail is + used to add a new element to the list. + + The list always keeps one un-used node at the end of the list. +*/ + +struct _arena { + PyArenaList *a_malloc_head; + PyArenaList *a_malloc_tail; + PyArenaList *a_object_head; + PyArenaList *a_object_tail; +}; + +static PyArenaList* +PyArenaList_New(void) +{ + PyArenaList *alist = (PyArenaList *)malloc(sizeof(PyArenaList)); + alist->al_next = NULL; + alist->al_pointer = NULL; + return alist; +} + +static PyArenaList* +PyArenaList_Add(PyArenaList *alist) +{ + assert(alist->al_next == NULL); + alist->al_next = PyArenaList_New(); + return alist->al_next; +} + +static void +PyArenaList_FreeObject(PyArenaList *alist) +{ + PyArenaList *prev; + while (alist) { + Py_XDECREF((PyObject *)alist->al_pointer); + alist->al_pointer = NULL; + prev = alist; + alist = alist->al_next; + free(prev); + } +} + +static void +PyArenaList_FreeMalloc(PyArenaList *alist) +{ + PyArenaList *prev; + while (alist) { + if (alist->al_pointer) { + free(alist->al_pointer); + } + alist->al_pointer = NULL; + prev = alist; + alist = alist->al_next; + free(prev); + } +} + + +PyAPI_FUNC(PyArena *) +PyArena_New() +{ + PyArena* arena = (PyArena *)malloc(sizeof(PyArena)); + arena->a_object_head = PyArenaList_New(); + arena->a_object_tail = arena->a_object_head; + arena->a_malloc_head = PyArenaList_New(); + arena->a_malloc_tail = arena->a_malloc_head; + return arena; +} + +PyAPI_FUNC(void) +PyArena_Free(PyArena *arena) +{ + assert(arena); + PyArenaList_FreeObject(arena->a_object_head); + PyArenaList_FreeMalloc(arena->a_malloc_head); + free(arena); +} + +PyAPI_FUNC(void *) +PyArena_Malloc(PyArena *arena, size_t size) +{ + /* A better implementation might actually use an arena. The current + approach is just a trivial implementation of the API that allows + it to be tested. + */ + void *p; + assert(size != 0); + p = malloc(size); + PyArena_AddMallocPointer(arena, p); + return p; +} + +PyAPI_FUNC(int) +PyArena_AddMallocPointer(PyArena *arena, void *pointer) +{ + assert(pointer); + PyArenaList *tail = arena->a_malloc_tail; + assert(tail->al_pointer != pointer); + tail->al_next = PyArenaList_New(); + tail->al_pointer = pointer; + arena->a_malloc_tail = tail->al_next; + return 1; +} + +PyAPI_FUNC(int) +PyArena_AddPyObject(PyArena *arena, PyObject *pointer) +{ + assert(pointer); + PyArenaList *tail = arena->a_object_tail; + tail->al_next = PyArenaList_New(); + tail->al_pointer = pointer; + arena->a_object_tail = tail->al_next; + return 1; +} Modified: python/branches/ast-arena/Python/pythonrun.c ============================================================================== --- python/branches/ast-arena/Python/pythonrun.c (original) +++ python/branches/ast-arena/Python/pythonrun.c Mon Dec 5 06:25:53 2005 @@ -12,6 +12,7 @@ #include "code.h" #include "compile.h" #include "symtable.h" +#include "pyarena.h" #include "ast.h" #include "eval.h" #include "marshal.h" @@ -36,9 +37,9 @@ static void initmain(void); static void initsite(void); static PyObject *run_err_mod(mod_ty, const char *, PyObject *, PyObject *, - PyCompilerFlags *); + PyCompilerFlags *, PyArena *arena); static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *, - PyCompilerFlags *); + PyCompilerFlags *, PyArena *); static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, PyCompilerFlags *); static void err_input(perrdetail *); @@ -697,6 +698,7 @@ { PyObject *m, *d, *v, *w; mod_ty mod; + PyArena *arena; char *ps1 = "", *ps2 = ""; int errcode = 0; @@ -716,9 +718,10 @@ else if (PyString_Check(w)) ps2 = PyString_AsString(w); } + arena = PyArena_New(); mod = PyParser_ASTFromFile(fp, filename, Py_single_input, ps1, ps2, - flags, &errcode); + flags, &errcode, arena); Py_XDECREF(v); Py_XDECREF(w); if (mod == NULL) { @@ -733,8 +736,8 @@ if (m == NULL) return -1; d = PyModule_GetDict(m); - v = run_mod(mod, filename, d, d, flags); - free_mod(mod); + v = run_mod(mod, filename, d, d, flags, arena); + PyArena_Free(arena); if (v == NULL) { PyErr_Print(); return -1; @@ -1155,9 +1158,11 @@ PyObject *locals, PyCompilerFlags *flags) { PyObject *ret; - mod_ty mod = PyParser_ASTFromString(str, "", start, flags); - ret = run_err_mod(mod, "", globals, locals, flags); - free_mod(mod); + PyArena *arena = PyArena_New(); + mod_ty mod = PyParser_ASTFromString(str, "", start, flags, + arena); + ret = run_err_mod(mod, "", globals, locals, flags, arena); + PyArena_Free(arena); return ret; } @@ -1166,33 +1171,36 @@ PyObject *locals, int closeit, PyCompilerFlags *flags) { PyObject *ret; + PyArena *arena = PyArena_New(); mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, - flags, NULL); - if (mod == NULL) + flags, NULL, arena); + if (mod == NULL) { + PyArena_Free(arena); return NULL; + } if (closeit) fclose(fp); - ret = run_err_mod(mod, filename, globals, locals, flags); - free_mod(mod); + ret = run_err_mod(mod, filename, globals, locals, flags, arena); + PyArena_Free(arena); return ret; } static PyObject * run_err_mod(mod_ty mod, const char *filename, PyObject *globals, - PyObject *locals, PyCompilerFlags *flags) + PyObject *locals, PyCompilerFlags *flags, PyArena *arena) { if (mod == NULL) return NULL; - return run_mod(mod, filename, globals, locals, flags); + return run_mod(mod, filename, globals, locals, flags, arena); } static PyObject * run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals, - PyCompilerFlags *flags) + PyCompilerFlags *flags, PyArena *arena) { PyCodeObject *co; PyObject *v; - co = PyAST_Compile(mod, filename, flags); + co = PyAST_Compile(mod, filename, flags, arena); if (co == NULL) return NULL; v = PyEval_EvalCode(co, globals, locals); @@ -1238,11 +1246,15 @@ { mod_ty mod; PyCodeObject *co; - mod = PyParser_ASTFromString(str, filename, start, flags); - if (mod == NULL) + PyArena *arena; + arena = PyArena_New(); + mod = PyParser_ASTFromString(str, filename, start, flags, arena); + if (mod == NULL) { + PyArena_Free(arena); return NULL; - co = PyAST_Compile(mod, filename, flags); - free_mod(mod); + } + co = PyAST_Compile(mod, filename, flags, arena); + PyArena_Free(arena); return (PyObject *)co; } @@ -1252,18 +1264,22 @@ mod_ty mod; struct symtable *st; - mod = PyParser_ASTFromString(str, filename, start, NULL); - if (mod == NULL) + PyArena *arena; + arena = PyArena_New(); + mod = PyParser_ASTFromString(str, filename, start, NULL, arena); + if (mod == NULL) { + PyArena_Free(arena); return NULL; + } st = PySymtable_Build(mod, filename, 0); - free_mod(mod); + PyArena_Free(arena); return st; } /* Preferred access to parser is through AST. */ mod_ty PyParser_ASTFromString(const char *s, const char *filename, int start, - PyCompilerFlags *flags) + PyCompilerFlags *flags, PyArena *arena) { node *n; mod_ty mod; @@ -1272,7 +1288,7 @@ start, &err, PARSER_FLAGS(flags)); if (n) { - mod = PyAST_FromNode(n, flags, filename); + mod = PyAST_FromNode(n, flags, filename, arena); PyNode_Free(n); return mod; } @@ -1284,7 +1300,8 @@ mod_ty PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1, - char *ps2, PyCompilerFlags *flags, int *errcode) + char *ps2, PyCompilerFlags *flags, int *errcode, + PyArena *arena) { node *n; mod_ty mod; @@ -1292,7 +1309,7 @@ n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, ps1, ps2, &err, PARSER_FLAGS(flags)); if (n) { - mod = PyAST_FromNode(n, flags, filename); + mod = PyAST_FromNode(n, flags, filename, arena); PyNode_Free(n); return mod; } From python-checkins at python.org Mon Dec 5 06:31:26 2005 From: python-checkins at python.org (brett.cannon) Date: Mon, 5 Dec 2005 06:31:26 +0100 (CET) Subject: [Python-checkins] commit of r41605 - python/branches/ast-arena/Include/pyarena.h Message-ID: <20051205053126.78FF61E400E@bag.python.org> Author: brett.cannon Date: Mon Dec 5 06:31:22 2005 New Revision: 41605 Modified: python/branches/ast-arena/Include/pyarena.h Log: Fix a typo of a function name in a comment. Modified: python/branches/ast-arena/Include/pyarena.h ============================================================================== --- python/branches/ast-arena/Include/pyarena.h (original) +++ python/branches/ast-arena/Include/pyarena.h Mon Dec 5 06:31:22 2005 @@ -15,7 +15,7 @@ to allocate memory. Once it is freed, all the memory it allocated is freed and none of its pointers are valid. - Py_ArenaNew() returns an arena pointer. On error, it + PyArena_New() returns an arena pointer. On error, it returns a negative number and sets an exception. */ PyAPI_FUNC(PyArena *) PyArena_New(void); From python-checkins at python.org Mon Dec 5 07:02:05 2005 From: python-checkins at python.org (brett.cannon) Date: Mon, 5 Dec 2005 07:02:05 +0100 (CET) Subject: [Python-checkins] commit of r41606 - python/branches/ast-arena/Python/compile.c Message-ID: <20051205060205.20A061E400B@bag.python.org> Author: brett.cannon Date: Mon Dec 5 07:02:00 2005 New Revision: 41606 Modified: python/branches/ast-arena/Python/compile.c Log: Fix a missed freeing of an arena on an error case. Might be a bad fix since some tests failed, but they didn't not seem to occur from memory issues. Modified: python/branches/ast-arena/Python/compile.c ============================================================================== --- python/branches/ast-arena/Python/compile.c (original) +++ python/branches/ast-arena/Python/compile.c Mon Dec 5 07:02:00 2005 @@ -296,13 +296,12 @@ PyCodeObject * PyNode_Compile(struct _node *n, const char *filename) { - PyCodeObject *co; + PyCodeObject *co = NULL; PyArena *arena; arena = PyArena_New(); mod_ty mod = PyAST_FromNode(n, NULL, filename, arena); - if (!mod) - return NULL; - co = PyAST_Compile(mod, filename, NULL, arena); + if (mod) + co = PyAST_Compile(mod, filename, NULL, arena); PyArena_Free(arena); return co; } From python-checkins at python.org Mon Dec 5 08:16:42 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 08:16:42 +0100 (CET) Subject: [Python-checkins] commit of r41607 - python/trunk/Python/ast.c Message-ID: <20051205071642.C09C21E4011@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 08:16:38 2005 New Revision: 41607 Modified: python/trunk/Python/ast.c Log: Remove unnecessary extern variable Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Mon Dec 5 08:16:38 2005 @@ -82,8 +82,6 @@ static PyObject *parsestr(const char *s, const char *encoding); static PyObject *parsestrplus(struct compiling *, const node *n); -extern grammar _PyParser_Grammar; /* From graminit.c */ - #ifndef LINENO #define LINENO(n) ((n)->n_lineno) #endif From python-checkins at python.org Mon Dec 5 08:18:17 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 08:18:17 +0100 (CET) Subject: [Python-checkins] commit of r41608 - python/branches/ast-objects/Python/ast.c Message-ID: <20051205071817.DEA841E400C@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 08:18:15 2005 New Revision: 41608 Modified: python/branches/ast-objects/Python/ast.c Log: Remove unnecessary extern variable Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Mon Dec 5 08:18:15 2005 @@ -82,8 +82,6 @@ static PyObject *parsestr(const char *s, const char *encoding); static PyObject *parsestrplus(struct compiling *, const node *n); -extern grammar _PyParser_Grammar; /* From graminit.c */ - #ifndef LINENO #define LINENO(n) ((n)->n_lineno) #endif From python-checkins at python.org Mon Dec 5 08:19:19 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 08:19:19 +0100 (CET) Subject: [Python-checkins] commit of r41609 - python/branches/ast-arena/Python/ast.c Message-ID: <20051205071919.1D27E1E400C@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 08:19:15 2005 New Revision: 41609 Modified: python/branches/ast-arena/Python/ast.c Log: Remove unnecessary extern variable Modified: python/branches/ast-arena/Python/ast.c ============================================================================== --- python/branches/ast-arena/Python/ast.c (original) +++ python/branches/ast-arena/Python/ast.c Mon Dec 5 08:19:15 2005 @@ -42,8 +42,6 @@ static PyObject *parsestr(const char *s, const char *encoding); static PyObject *parsestrplus(struct compiling *, const node *n); -extern grammar _PyParser_Grammar; /* From graminit.c */ - #ifndef LINENO #define LINENO(n) ((n)->n_lineno) #endif From python-checkins at python.org Mon Dec 5 08:33:45 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 08:33:45 +0100 (CET) Subject: [Python-checkins] commit of r41610 - python/branches/ast-arena/Python/asdl.c Message-ID: <20051205073345.6B96E1E400D@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 08:33:42 2005 New Revision: 41610 Modified: python/branches/ast-arena/Python/asdl.c Log: we need to malloc the seq since we call free() on this pointer Modified: python/branches/ast-arena/Python/asdl.c ============================================================================== --- python/branches/ast-arena/Python/asdl.c (original) +++ python/branches/ast-arena/Python/asdl.c Mon Dec 5 08:33:42 2005 @@ -8,7 +8,7 @@ size_t n = sizeof(asdl_seq) + (size ? (sizeof(void *) * (size - 1)) : 0); - seq = (asdl_seq *)PyObject_Malloc(n); + seq = (asdl_seq *)malloc(n); if (!seq) { PyErr_NoMemory(); return NULL; From python-checkins at python.org Mon Dec 5 08:35:01 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 08:35:01 +0100 (CET) Subject: [Python-checkins] commit of r41611 - python/branches/ast-arena/Python/pyarena.c Message-ID: <20051205073501.39B081E400B@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 08:34:57 2005 New Revision: 41611 Modified: python/branches/ast-arena/Python/pyarena.c Log: Remove PyAPI_FUNC(), they are only needed in the header file. check pointers are non-NULL from malloc() Modified: python/branches/ast-arena/Python/pyarena.c ============================================================================== --- python/branches/ast-arena/Python/pyarena.c (original) +++ python/branches/ast-arena/Python/pyarena.c Mon Dec 5 08:34:57 2005 @@ -29,6 +29,9 @@ PyArenaList_New(void) { PyArenaList *alist = (PyArenaList *)malloc(sizeof(PyArenaList)); + if (!alist) + return NULL; + alist->al_next = NULL; alist->al_pointer = NULL; return alist; @@ -45,8 +48,11 @@ static void PyArenaList_FreeObject(PyArenaList *alist) { - PyArenaList *prev; + if (!alist) + return; + while (alist) { + PyArenaList *prev; Py_XDECREF((PyObject *)alist->al_pointer); alist->al_pointer = NULL; prev = alist; @@ -58,8 +64,11 @@ static void PyArenaList_FreeMalloc(PyArenaList *alist) { - PyArenaList *prev; + if (!alist) + return; + while (alist) { + PyArenaList *prev; if (alist->al_pointer) { free(alist->al_pointer); } @@ -71,10 +80,13 @@ } -PyAPI_FUNC(PyArena *) +PyArena * PyArena_New() { PyArena* arena = (PyArena *)malloc(sizeof(PyArena)); + if (!arena) + return NULL; + arena->a_object_head = PyArenaList_New(); arena->a_object_tail = arena->a_object_head; arena->a_malloc_head = PyArenaList_New(); @@ -82,7 +94,7 @@ return arena; } -PyAPI_FUNC(void) +void PyArena_Free(PyArena *arena) { assert(arena); @@ -91,7 +103,7 @@ free(arena); } -PyAPI_FUNC(void *) +void * PyArena_Malloc(PyArena *arena, size_t size) { /* A better implementation might actually use an arena. The current @@ -105,7 +117,7 @@ return p; } -PyAPI_FUNC(int) +int PyArena_AddMallocPointer(PyArena *arena, void *pointer) { assert(pointer); @@ -117,7 +129,7 @@ return 1; } -PyAPI_FUNC(int) +int PyArena_AddPyObject(PyArena *arena, PyObject *pointer) { assert(pointer); From python-checkins at python.org Mon Dec 5 08:36:53 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 08:36:53 +0100 (CET) Subject: [Python-checkins] commit of r41612 - python/branches/ast-arena/Python/pyarena.c Message-ID: <20051205073653.114701E400B@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 08:36:50 2005 New Revision: 41612 Modified: python/branches/ast-arena/Python/pyarena.c Log: Remove unused static function Modified: python/branches/ast-arena/Python/pyarena.c ============================================================================== --- python/branches/ast-arena/Python/pyarena.c (original) +++ python/branches/ast-arena/Python/pyarena.c Mon Dec 5 08:36:50 2005 @@ -37,14 +37,6 @@ return alist; } -static PyArenaList* -PyArenaList_Add(PyArenaList *alist) -{ - assert(alist->al_next == NULL); - alist->al_next = PyArenaList_New(); - return alist->al_next; -} - static void PyArenaList_FreeObject(PyArenaList *alist) { From python-checkins at python.org Mon Dec 5 08:50:50 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 08:50:50 +0100 (CET) Subject: [Python-checkins] commit of r41613 - python/branches/ast-arena/Python/pythonrun.c Message-ID: <20051205075050.115751E400B@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 08:50:33 2005 New Revision: 41613 Modified: python/branches/ast-arena/Python/pythonrun.c Log: Fix leaks of arena in error paths Modified: python/branches/ast-arena/Python/pythonrun.c ============================================================================== --- python/branches/ast-arena/Python/pythonrun.c (original) +++ python/branches/ast-arena/Python/pythonrun.c Mon Dec 5 08:50:33 2005 @@ -725,6 +725,7 @@ Py_XDECREF(v); Py_XDECREF(w); if (mod == NULL) { + PyArena_Free(arena); if (errcode == E_EOF) { PyErr_Clear(); return E_EOF; @@ -733,8 +734,10 @@ return -1; } m = PyImport_AddModule("__main__"); - if (m == NULL) + if (m == NULL) { + PyArena_Free(arena); return -1; + } d = PyModule_GetDict(m); v = run_mod(mod, filename, d, d, flags, arena); PyArena_Free(arena); From python-checkins at python.org Mon Dec 5 08:56:07 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 5 Dec 2005 08:56:07 +0100 (CET) Subject: [Python-checkins] commit of r41614 - python/branches/ast-arena/Python/ast.c Message-ID: <20051205075607.A67691E400B@bag.python.org> Author: neal.norwitz Date: Mon Dec 5 08:55:59 2005 New Revision: 41614 Modified: python/branches/ast-arena/Python/ast.c Log: Need to add these objects to the arena so they don't leak Modified: python/branches/ast-arena/Python/ast.c ============================================================================== --- python/branches/ast-arena/Python/ast.c (original) +++ python/branches/ast-arena/Python/ast.c Mon Dec 5 08:55:59 2005 @@ -1167,6 +1167,7 @@ if (!str) return NULL; + PyArena_AddPyObject(c->c_arena, str); return Str(str, LINENO(n), c->c_arena); } case NUMBER: { @@ -1175,6 +1176,7 @@ if (!pynum) return NULL; + PyArena_AddPyObject(c->c_arena, pynum); return Num(pynum, LINENO(n), c->c_arena); } case LPAR: /* some parenthesized expressions */ From python-checkins at python.org Tue Dec 6 02:02:32 2005 From: python-checkins at python.org (phillip.eby) Date: Tue, 6 Dec 2005 02:02:32 +0100 (CET) Subject: [Python-checkins] commit of r41615 - in sandbox/trunk/setuptools: pkg_resources.py pkg_resources.txt setuptools/tests/test_resources.py Message-ID: <20051206010232.BA05E1E400B@bag.python.org> Author: phillip.eby Date: Tue Dec 6 02:02:27 2005 New Revision: 41615 Modified: sandbox/trunk/setuptools/pkg_resources.py sandbox/trunk/setuptools/pkg_resources.txt sandbox/trunk/setuptools/setuptools/tests/test_resources.py Log: Added support for ``.egg-info`` files or directories with version/platform information embedded in the filename, so that system packagers have the option of including ``PKG-INFO`` files to indicate the presence of a system-installed egg, without needing to use ``.egg`` directories, zipfiles, or ``.pth`` manipulation. Modified: sandbox/trunk/setuptools/pkg_resources.py ============================================================================== --- sandbox/trunk/setuptools/pkg_resources.py (original) +++ sandbox/trunk/setuptools/pkg_resources.py Tue Dec 6 02:02:27 2005 @@ -70,7 +70,7 @@ 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', 'IResourceProvider', + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', 'register_finder', 'register_namespace_handler', 'register_loader_type', @@ -1155,31 +1155,31 @@ register_loader_type(zipimport.zipimporter, ZipProvider) +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + Usage:: + metadata = FileMetadata("/path/to/PKG-INFO") + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + def __init__(self,path): + self.path = path + def has_metadata(self,name): + return name=='PKG-INFO' + def get_metadata(self,name): + if name=='PKG-INFO': + return open(self.path,'rU').read() + raise KeyError("No metadata except PKG-INFO is available") - - - - - - - - - - - - - - - - - - + def get_metadata_lines(self,name): + return yield_lines(self.get_metadata(name)) @@ -1373,13 +1373,14 @@ lower = entry.lower() if lower.endswith('.egg-info'): fullpath = os.path.join(path_item, entry) - if os.path.isdir(fullpath): - # development egg + metadata = None + if os.path.isdir(fullpath): + # egg-info directory, allow getting metadata metadata = PathMetadata(path_item, fullpath) - dist_name = os.path.splitext(entry)[0] - yield Distribution( - path_item, metadata, project_name=dist_name - ) + else: + metadata = FileMetadata(fullpath) + yield Distribution.from_location(path_item,entry,metadata) + elif not only and lower.endswith('.egg'): for dist in find_distributions(os.path.join(path_item, entry)): yield dist @@ -1391,7 +1392,6 @@ register_finder(ImpWrapper,find_on_path) - _namespace_handlers = {} _namespace_packages = {} @@ -1739,7 +1739,7 @@ def from_location(cls,location,basename,metadata=None): project_name, version, py_version, platform = [None]*4 basename, ext = os.path.splitext(basename) - if ext.lower()==".egg": + if ext.lower() in (".egg",".egg-info"): match = EGG_NAME(basename) if match: project_name, version, py_version, platform = match.group( @@ -1754,13 +1754,13 @@ hashcmp = property( lambda self: ( getattr(self,'parsed_version',()), self.precedence, self.key, - -len(self.location), self.location, self.py_version, self.platform + -len(self.location or ''), self.location, self.py_version, + self.platform ) ) def __cmp__(self, other): return cmp(self.hashcmp, other) def __hash__(self): return hash(self.hashcmp) - # These properties have to be lazy so that we don't have to load any # metadata until/unless it's actually needed. (i.e., some distributions # may not know their name or version without loading PKG-INFO) Modified: sandbox/trunk/setuptools/pkg_resources.txt ============================================================================== --- sandbox/trunk/setuptools/pkg_resources.txt (original) +++ sandbox/trunk/setuptools/pkg_resources.txt Tue Dec 6 02:02:27 2005 @@ -1282,6 +1282,7 @@ ZipProvider EggMetadata EmptyProvider + FileMetadata ``NullProvider`` @@ -1326,6 +1327,14 @@ itself is a ".egg"). It can also be a combination, such as a zipfile egg that also contains other eggs. +``FileMetadata(path_to_pkg_info)`` + Create an ``IResourceProvider`` that provides exactly one metadata + resource: ``PKG-INFO``. The supplied path should be a distutils PKG-INFO + file. This is basically the same as an ``EmptyProvider``, except that + requests for ``PKG-INFO`` will be answered using the contents of the + designated file. (This provider is used to wrap ``.egg-info`` files + installed by vendor-supplied system packages.) + Utility Functions ================= @@ -1503,6 +1512,12 @@ unless absolutely necessary. Warn about skipping invalid/unfinished eggs when building an Environment. + * Added support for ``.egg-info`` files or directories with version/platform + information embedded in the filename, so that system packagers have the + option of including ``PKG-INFO`` files to indicate the presence of a + system-installed egg, without needing to use ``.egg`` directories, zipfiles, + or ``.pth`` manipulation. + 0.6a8 * Fixed a problem with ``WorkingSet.resolve()`` that prevented version conflicts from being detected at runtime. Modified: sandbox/trunk/setuptools/setuptools/tests/test_resources.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/tests/test_resources.py (original) +++ sandbox/trunk/setuptools/setuptools/tests/test_resources.py Tue Dec 6 02:02:27 2005 @@ -94,6 +94,8 @@ def testDistroParse(self): d = Distribution.from_filename("FooPkg-1.3_1-py2.4-win32.egg") self.checkFooPkg(d) + d = Distribution.from_filename("FooPkg-1.3_1-py2.4-win32.egg-info") + self.checkFooPkg(d) def testDistroMetadata(self): d = Distribution( @@ -119,8 +121,6 @@ self.checkRequires(self.distRequires(v), v) - - def testResolve(self): ad = Environment([]); ws = WorkingSet([]) # Resolving no requirements -> nothing to install From python-checkins at python.org Tue Dec 6 04:11:26 2005 From: python-checkins at python.org (phillip.eby) Date: Tue, 6 Dec 2005 04:11:26 +0100 (CET) Subject: [Python-checkins] commit of r41616 - sandbox/trunk/setuptools/pkg_resources.py Message-ID: <20051206031126.F058F1E400B@bag.python.org> Author: phillip.eby Date: Tue Dec 6 04:11:22 2005 New Revision: 41616 Modified: sandbox/trunk/setuptools/pkg_resources.py Log: Remove unneeded code that slipped into last commit. Modified: sandbox/trunk/setuptools/pkg_resources.py ============================================================================== --- sandbox/trunk/setuptools/pkg_resources.py (original) +++ sandbox/trunk/setuptools/pkg_resources.py Tue Dec 6 04:11:22 2005 @@ -1373,7 +1373,6 @@ lower = entry.lower() if lower.endswith('.egg-info'): fullpath = os.path.join(path_item, entry) - metadata = None if os.path.isdir(fullpath): # egg-info directory, allow getting metadata metadata = PathMetadata(path_item, fullpath) @@ -1392,6 +1391,7 @@ register_finder(ImpWrapper,find_on_path) + _namespace_handlers = {} _namespace_packages = {} From python-checkins at python.org Tue Dec 6 04:12:53 2005 From: python-checkins at python.org (phillip.eby) Date: Tue, 6 Dec 2005 04:12:53 +0100 (CET) Subject: [Python-checkins] commit of r41617 - in sandbox/trunk/setuptools: setuptools.txt setuptools/archive_util.py Message-ID: <20051206031253.42DB41E400B@bag.python.org> Author: phillip.eby Date: Tue Dec 6 04:12:48 2005 New Revision: 41617 Modified: sandbox/trunk/setuptools/setuptools.txt sandbox/trunk/setuptools/setuptools/archive_util.py Log: Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so that you can process a directory tree through a processing filter as if it were a zipfile or tarfile. Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Tue Dec 6 04:12:48 2005 @@ -2177,6 +2177,10 @@ * Made all commands that use ``easy_install`` respect its configuration options, as this was causing some problems with ``setup.py install``. + * Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so + that you can process a directory tree through a processing filter as if it + were a zipfile or tarfile. + 0.6a8 * Fixed some problems building extensions when Pyrex was installed, especially with Python 2.4 and/or packages using SWIG. Modified: sandbox/trunk/setuptools/setuptools/archive_util.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/archive_util.py (original) +++ sandbox/trunk/setuptools/setuptools/archive_util.py Tue Dec 6 04:12:48 2005 @@ -3,10 +3,10 @@ __all__ = [ "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", - "UnrecognizedFormat", "extraction_drivers" + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", ] -import zipfile, tarfile, os +import zipfile, tarfile, os, shutil from pkg_resources import ensure_directory from distutils.errors import DistutilsError @@ -80,6 +80,47 @@ +def unpack_directory(filename, extract_dir, progress_filter=default_filter): + """"Unpack" a directory, using the same interface as for archives + + Raises ``UnrecognizedFormat`` if `filename` is not a directory + """ + if not os.path.isdir(filename): + raise UnrecognizedFormat("%s is not a directory" % (filename,)) + + paths = {filename:('',extract_dir)} + for base, dirs, files in os.walk(filename): + src,dst = paths[base] + for d in dirs: + paths[os.path.join(base,d)] = src+d+'/', os.path.join(dst,d) + for f in files: + name = src+f + target = os.path.join(dst,f) + target = progress_filter(src+f, target) + if not target: + continue # skip non-files + ensure_directory(target) + shutil.copyfile(os.path.join(base,f), target) + + + + + + + + + + + + + + + + + + + + def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): """Unpack zip `filename` to `extract_dir` @@ -156,7 +197,7 @@ -extraction_drivers = unpack_zipfile, unpack_tarfile +extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile From python-checkins at python.org Tue Dec 6 07:36:36 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 07:36:36 +0100 (CET) Subject: [Python-checkins] commit of r41618 - python/trunk/Python/future.c Message-ID: <20051206063636.04D481E400C@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 07:36:36 2005 New Revision: 41618 Modified: python/trunk/Python/future.c Log: Remove unused macro, check is done elsewhere Modified: python/trunk/Python/future.c ============================================================================== --- python/trunk/Python/future.c (original) +++ python/trunk/Python/future.c Tue Dec 6 07:36:36 2005 @@ -8,7 +8,6 @@ #include "symtable.h" #define UNDEFINED_FUTURE_FEATURE "future feature %.100s is not defined" -#define FUTURE_IMPORT_STAR "future statement does not support import *" static int future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) From python-checkins at python.org Tue Dec 6 07:36:49 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 07:36:49 +0100 (CET) Subject: [Python-checkins] commit of r41619 - python/branches/ast-arena/Python/future.c Message-ID: <20051206063649.E9FA51E400C@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 07:36:49 2005 New Revision: 41619 Modified: python/branches/ast-arena/Python/future.c Log: Remove unused macro, check is done elsewhere Modified: python/branches/ast-arena/Python/future.c ============================================================================== --- python/branches/ast-arena/Python/future.c (original) +++ python/branches/ast-arena/Python/future.c Tue Dec 6 07:36:49 2005 @@ -8,7 +8,6 @@ #include "symtable.h" #define UNDEFINED_FUTURE_FEATURE "future feature %.100s is not defined" -#define FUTURE_IMPORT_STAR "future statement does not support import *" static int future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) From python-checkins at python.org Tue Dec 6 07:37:33 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 07:37:33 +0100 (CET) Subject: [Python-checkins] commit of r41620 - python/branches/ast-objects/Python/future.c Message-ID: <20051206063733.58B7B1E400B@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 07:37:33 2005 New Revision: 41620 Modified: python/branches/ast-objects/Python/future.c Log: Remove unused macro, check is done elsewhere Modified: python/branches/ast-objects/Python/future.c ============================================================================== --- python/branches/ast-objects/Python/future.c (original) +++ python/branches/ast-objects/Python/future.c Tue Dec 6 07:37:33 2005 @@ -8,7 +8,6 @@ #include "symtable.h" #define UNDEFINED_FUTURE_FEATURE "future feature %.100s is not defined" -#define FUTURE_IMPORT_STAR "future statement does not support import *" static int future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) From python-checkins at python.org Tue Dec 6 08:26:02 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 08:26:02 +0100 (CET) Subject: [Python-checkins] commit of r41621 - python/trunk/Python/future.c Message-ID: <20051206072602.7B4931E400B@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 08:26:02 2005 New Revision: 41621 Modified: python/trunk/Python/future.c Log: Reduce scope of feature Modified: python/trunk/Python/future.c ============================================================================== --- python/trunk/Python/future.c (original) +++ python/trunk/Python/future.c Tue Dec 6 08:26:02 2005 @@ -13,7 +13,6 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) { int i; - const char *feature; asdl_seq *names; assert(s->kind == ImportFrom_kind); @@ -21,7 +20,7 @@ names = s->v.ImportFrom.names; for (i = 0; i < asdl_seq_LEN(names); i++) { alias_ty name = asdl_seq_GET(names, i); - feature = PyString_AsString(name->name); + const char *feature = PyString_AsString(name->name); if (!feature) return 0; if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) { From python-checkins at python.org Tue Dec 6 08:26:31 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 08:26:31 +0100 (CET) Subject: [Python-checkins] commit of r41622 - python/branches/ast-objects/Python/future.c Message-ID: <20051206072631.0F74D1E400B@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 08:26:30 2005 New Revision: 41622 Modified: python/branches/ast-objects/Python/future.c Log: Reduce scope of feature Modified: python/branches/ast-objects/Python/future.c ============================================================================== --- python/branches/ast-objects/Python/future.c (original) +++ python/branches/ast-objects/Python/future.c Tue Dec 6 08:26:30 2005 @@ -13,7 +13,6 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) { int i; - const char *feature; asdl_seq *names; assert(s->kind == ImportFrom_kind); @@ -21,7 +20,7 @@ names = s->v.ImportFrom.names; for (i = 0; i < asdl_seq_LEN(names); i++) { alias_ty name = asdl_seq_GET(names, i); - feature = PyString_AsString(name->name); + const char *feature = PyString_AsString(name->name); if (!feature) return 0; if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) { From python-checkins at python.org Tue Dec 6 08:26:47 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 08:26:47 +0100 (CET) Subject: [Python-checkins] commit of r41623 - python/branches/ast-arena/Python/future.c Message-ID: <20051206072647.530B91E400B@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 08:26:47 2005 New Revision: 41623 Modified: python/branches/ast-arena/Python/future.c Log: Reduce scope of feature Modified: python/branches/ast-arena/Python/future.c ============================================================================== --- python/branches/ast-arena/Python/future.c (original) +++ python/branches/ast-arena/Python/future.c Tue Dec 6 08:26:47 2005 @@ -13,7 +13,6 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) { int i; - const char *feature; asdl_seq *names; assert(s->kind == ImportFrom_kind); @@ -21,7 +20,7 @@ names = s->v.ImportFrom.names; for (i = 0; i < asdl_seq_LEN(names); i++) { alias_ty name = asdl_seq_GET(names, i); - feature = PyString_AsString(name->name); + const char *feature = PyString_AsString(name->name); if (!feature) return 0; if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) { From python-checkins at python.org Tue Dec 6 08:35:06 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 08:35:06 +0100 (CET) Subject: [Python-checkins] commit of r41624 - python/branches/ast-arena/Python/compile.c Message-ID: <20051206073506.4B3061E400C@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 08:35:05 2005 New Revision: 41624 Modified: python/branches/ast-arena/Python/compile.c Log: Simplify logic for handling import * Modified: python/branches/ast-arena/Python/compile.c ============================================================================== --- python/branches/ast-arena/Python/compile.c (original) +++ python/branches/ast-arena/Python/compile.c Tue Dec 6 08:35:05 2005 @@ -2445,7 +2445,6 @@ compiler_from_import(struct compiler *c, stmt_ty s) { int i, n = asdl_seq_LEN(s->v.ImportFrom.names); - int star = 0; PyObject *names = PyTuple_New(n); if (!names) @@ -2479,8 +2478,7 @@ if (i == 0 && *PyString_AS_STRING(alias->name) == '*') { assert(n == 1); ADDOP(c, IMPORT_STAR); - star = 1; - break; + return 1; } ADDOP_NAME(c, IMPORT_FROM, alias->name, names); @@ -2493,9 +2491,8 @@ return 0; } } - if (!star) - /* remove imported module */ - ADDOP(c, POP_TOP); + /* remove imported module */ + ADDOP(c, POP_TOP); return 1; } From python-checkins at python.org Tue Dec 6 08:35:12 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 08:35:12 +0100 (CET) Subject: [Python-checkins] commit of r41625 - python/branches/ast-objects/Python/compile.c Message-ID: <20051206073512.54CE61E4011@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 08:35:11 2005 New Revision: 41625 Modified: python/branches/ast-objects/Python/compile.c Log: Simplify logic for handling import * Modified: python/branches/ast-objects/Python/compile.c ============================================================================== --- python/branches/ast-objects/Python/compile.c (original) +++ python/branches/ast-objects/Python/compile.c Tue Dec 6 08:35:11 2005 @@ -2440,7 +2440,6 @@ compiler_from_import(struct compiler *c, stmt_ty s) { int i, n = asdl_seq_LEN(s->v.ImportFrom.names); - int star = 0; PyObject *names = PyTuple_New(n); if (!names) @@ -2474,8 +2473,7 @@ if (i == 0 && *PyString_AS_STRING(alias->name) == '*') { assert(n == 1); ADDOP(c, IMPORT_STAR); - star = 1; - break; + return 1; } ADDOP_NAME(c, IMPORT_FROM, alias->name, names); @@ -2488,9 +2486,8 @@ return 0; } } - if (!star) - /* remove imported module */ - ADDOP(c, POP_TOP); + /* remove imported module */ + ADDOP(c, POP_TOP); return 1; } From python-checkins at python.org Tue Dec 6 08:41:31 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 08:41:31 +0100 (CET) Subject: [Python-checkins] commit of r41626 - python/trunk/Python/compile.c Message-ID: <20051206074131.355F31E400B@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 08:41:30 2005 New Revision: 41626 Modified: python/trunk/Python/compile.c Log: Simplify logic for handling import * Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Tue Dec 6 08:41:30 2005 @@ -2440,7 +2440,6 @@ compiler_from_import(struct compiler *c, stmt_ty s) { int i, n = asdl_seq_LEN(s->v.ImportFrom.names); - int star = 0; PyObject *names = PyTuple_New(n); if (!names) @@ -2474,8 +2473,7 @@ if (i == 0 && *PyString_AS_STRING(alias->name) == '*') { assert(n == 1); ADDOP(c, IMPORT_STAR); - star = 1; - break; + return 1; } ADDOP_NAME(c, IMPORT_FROM, alias->name, names); @@ -2488,9 +2486,8 @@ return 0; } } - if (!star) - /* remove imported module */ - ADDOP(c, POP_TOP); + /* remove imported module */ + ADDOP(c, POP_TOP); return 1; } From python-checkins at python.org Tue Dec 6 08:42:45 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 08:42:45 +0100 (CET) Subject: [Python-checkins] commit of r41627 - python/branches/ast-arena/Python/ast.c Message-ID: <20051206074245.0791B1E400B@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 08:42:44 2005 New Revision: 41627 Modified: python/branches/ast-arena/Python/ast.c Log: Get rid of unnecessary goto error labels. They can simply be return NULL; Fix a few ref leaks wrt import a.b.c and from ... import * Modified: python/branches/ast-arena/Python/ast.c ============================================================================== --- python/branches/ast-arena/Python/ast.c (original) +++ python/branches/ast-arena/Python/ast.c Tue Dec 6 08:42:44 2005 @@ -674,27 +674,24 @@ id = NEW_IDENTIFIER(CHILD(n, 0)); if (!id) - goto error; + return NULL; e = Name(id, Load, LINENO(n), c->c_arena); if (!e) - goto error; + return NULL; id = NULL; for (i = 2; i < NCH(n); i+=2) { id = NEW_IDENTIFIER(CHILD(n, i)); if (!id) - goto error; + return NULL; attrib = Attribute(e, id, Load, LINENO(CHILD(n, i)), c->c_arena); if (!attrib) - goto error; + return NULL; e = attrib; attrib = NULL; } return e; - - error: - return NULL; } static expr_ty @@ -709,12 +706,12 @@ if ((NCH(n) < 3 && NCH(n) != 5 && NCH(n) != 6) || TYPE(CHILD(n, 0)) != AT || TYPE(RCHILD(n, -1)) != NEWLINE) { ast_error(n, "Invalid decorator node"); - goto error; + return NULL; } name_expr = ast_for_dotted_name(c, CHILD(n, 1)); if (!name_expr) - goto error; + return NULL; if (NCH(n) == 3) { /* No arguments */ d = name_expr; @@ -723,20 +720,17 @@ else if (NCH(n) == 5) { /* Call with no arguments */ d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena); if (!d) - goto error; + return NULL; name_expr = NULL; } else { d = ast_for_call(c, CHILD(n, 3), name_expr); if (!d) - goto error; + return NULL; name_expr = NULL; } return d; - - error: - return NULL; } static asdl_seq* @@ -755,12 +749,10 @@ for (i = 0; i < NCH(n); i++) { d = ast_for_decorator(c, CHILD(n, i)); if (!d) - goto error; + return NULL; asdl_seq_APPEND(decorator_seq, d); } return decorator_seq; - error: - return NULL; } static stmt_ty @@ -778,7 +770,7 @@ if (NCH(n) == 6) { /* decorators are present */ decorator_seq = ast_for_decorators(c, CHILD(n, 0)); if (!decorator_seq) - goto error; + return NULL; name_i = 2; } else { @@ -787,22 +779,19 @@ name = NEW_IDENTIFIER(CHILD(n, name_i)); if (!name) - goto error; + return NULL; else if (!strcmp(STR(CHILD(n, name_i)), "None")) { ast_error(CHILD(n, name_i), "assignment to None"); - goto error; + return NULL; } args = ast_for_arguments(c, CHILD(n, name_i + 1)); if (!args) - goto error; + return NULL; body = ast_for_suite(c, CHILD(n, name_i + 3)); if (!body) - goto error; + return NULL; return FunctionDef(name, args, body, decorator_seq, LINENO(n), c->c_arena); - -error: - return NULL; } static expr_ty @@ -1673,10 +1662,10 @@ args = asdl_seq_new(nargs + ngens, c->c_arena); if (!args) - goto error; + return NULL; keywords = asdl_seq_new(nkeywords, c->c_arena); if (!keywords) - goto error; + return NULL; nargs = 0; nkeywords = 0; for (i = 0; i < NCH(n); i++) { @@ -1686,13 +1675,13 @@ if (NCH(ch) == 1) { e = ast_for_expr(c, CHILD(ch, 0)); if (!e) - goto error; + return NULL; asdl_seq_SET(args, nargs++, e); } else if (TYPE(CHILD(ch, 1)) == gen_for) { e = ast_for_genexp(c, ch); if (!e) - goto error; + return NULL; asdl_seq_SET(args, nargs++, e); } else { @@ -1702,7 +1691,7 @@ /* CHILD(ch, 0) is test, but must be an identifier? */ e = ast_for_expr(c, CHILD(ch, 0)); if (!e) - goto error; + return NULL; /* f(lambda x: x[0] = 3) ends up getting parsed with * LHS test = lambda x: x[0], and RHS test = 3. * SF bug 132313 points out that complaining about a keyword @@ -1710,18 +1699,18 @@ */ if (e->kind == Lambda_kind) { ast_error(CHILD(ch, 0), "lambda cannot contain assignment"); - goto error; + return NULL; } else if (e->kind != Name_kind) { ast_error(CHILD(ch, 0), "keyword can't be an expression"); - goto error; + return NULL; } key = e->v.Name.id; e = ast_for_expr(c, CHILD(ch, 2)); if (!e) - goto error; + return NULL; kw = keyword(key, e, c->c_arena); if (!kw) - goto error; + return NULL; asdl_seq_SET(keywords, nkeywords++, kw); } } @@ -1736,9 +1725,6 @@ } return Call(func, args, keywords, vararg, kwarg, LINENO(n), c->c_arena); - - error: - return NULL; } static expr_ty @@ -1882,16 +1868,16 @@ node *ch = CHILD(n, i); if (TYPE(ch) == yield_expr) { ast_error(ch, "assignment to yield expression not possible"); - goto error; + return NULL; } e = ast_for_testlist(c, ch); /* set context to assign */ if (!e) - goto error; + return NULL; if (!set_context(e, Store, CHILD(n, i))) { - goto error; + return NULL; } asdl_seq_SET(targets, i / 2, e); @@ -1902,12 +1888,9 @@ else expression = ast_for_expr(c, value); if (!expression) - goto error; + return NULL; return Assign(targets, expression, LINENO(n), c->c_arena); - error: - (void)1; } - return NULL; } static stmt_ty @@ -1958,17 +1941,14 @@ for (i = 0; i < NCH(n); i += 2) { e = ast_for_expr(c, CHILD(n, i)); if (!e) - goto error; + return NULL; asdl_seq_SET(seq, i / 2, e); if (context) { if (!set_context(e, context, CHILD(n, i))) - goto error; + return NULL; } } return seq; - -error: - return NULL; } static stmt_ty @@ -2073,6 +2053,8 @@ dotted_as_name: dotted_name [NAME NAME] dotted_name: NAME ('.' NAME)* */ + PyObject *str; + loop: switch (TYPE(n)) { case import_as_name: @@ -2101,7 +2083,6 @@ else { /* Create a string of the form "a.b.c" */ int i, len; - PyObject *str; char *s; len = 0; @@ -2124,11 +2105,14 @@ --s; *s = '\0'; PyString_InternInPlace(&str); + PyArena_AddPyObject(c->c_arena, str); return alias(str, NULL, c->c_arena); } break; case STAR: - return alias(PyString_InternFromString("*"), NULL, c->c_arena); + str = PyString_InternFromString("*"); + PyArena_AddPyObject(c->c_arena, str); + return alias(str, NULL, c->c_arena); default: PyErr_Format(PyExc_SystemError, "unexpected import name: %d", TYPE(n)); @@ -2168,7 +2152,6 @@ return Import(aliases, LINENO(n), c->c_arena); } else if (STR(CHILD(n, 0))[0] == 'f') { /* from */ - stmt_ty import; int n_children; const char *from_modules; int lineno = LINENO(n); @@ -2223,9 +2206,7 @@ } asdl_seq_APPEND(aliases, import_alias); } - Py_INCREF(mod->name); - import = ImportFrom(mod->name, aliases, lineno, c->c_arena); - return import; + return ImportFrom(mod->name, aliases, lineno, c->c_arena); } PyErr_Format(PyExc_SystemError, "unknown import statement: starts with command '%s'", @@ -2343,7 +2324,7 @@ ch = CHILD(n, i); s = ast_for_stmt(c, ch); if (!s) - goto error; + return NULL; asdl_seq_SET(seq, pos++, s); } } @@ -2356,7 +2337,7 @@ /* small_stmt or compound_stmt with only one child */ s = ast_for_stmt(c, ch); if (!s) - goto error; + return NULL; asdl_seq_SET(seq, pos++, s); } else { @@ -2366,7 +2347,7 @@ for (j = 0; j < NCH(ch); j += 2) { s = ast_for_stmt(c, CHILD(ch, j)); if (!s) - goto error; + return NULL; asdl_seq_SET(seq, pos++, s); } } @@ -2374,8 +2355,6 @@ } assert(pos == seq->size); return seq; - error: - return NULL; } static stmt_ty From python-checkins at python.org Tue Dec 6 09:24:24 2005 From: python-checkins at python.org (neal.norwitz) Date: Tue, 6 Dec 2005 09:24:24 +0100 (CET) Subject: [Python-checkins] commit of r41628 - python/branches/ast-arena/Python/ast.c Message-ID: <20051206082424.4E6B81E401C@bag.python.org> Author: neal.norwitz Date: Tue Dec 6 09:24:23 2005 New Revision: 41628 Modified: python/branches/ast-arena/Python/ast.c Log: Remove lots of unnecessary braces. No functional changes Modified: python/branches/ast-arena/Python/ast.c ============================================================================== --- python/branches/ast-arena/Python/ast.c (original) +++ python/branches/ast-arena/Python/ast.c Tue Dec 6 09:24:23 2005 @@ -504,9 +504,8 @@ REQ(CHILD(n, i), test); expression = ast_for_expr(c, CHILD(n, i)); - if (!expression) { + if (!expression) return NULL; - } assert(i / 2 < seq->size); asdl_seq_SET(seq, i / 2, expression); @@ -806,18 +805,16 @@ if (!args) return NULL; expression = ast_for_expr(c, CHILD(n, 2)); - if (!expression) { + if (!expression) return NULL; - } } else { args = ast_for_arguments(c, CHILD(n, 1)); if (!args) return NULL; expression = ast_for_expr(c, CHILD(n, 3)); - if (!expression) { + if (!expression) return NULL; - } } return Lambda(args, expression, LINENO(n), c->c_arena); @@ -910,10 +907,9 @@ return NULL; listcomps = asdl_seq_new(n_fors, c->c_arena); - if (!listcomps) { + if (!listcomps) return NULL; - } - + ch = CHILD(n, 1); for (i = 0; i < n_fors; i++) { comprehension_ty lc; @@ -923,25 +919,20 @@ REQ(ch, list_for); t = ast_for_exprlist(c, CHILD(ch, 1), Store); - if (!t) { + if (!t) return NULL; - } expression = ast_for_testlist(c, CHILD(ch, 3)); - if (!expression) { + if (!expression) return NULL; - } - if (asdl_seq_LEN(t) == 1) { + if (asdl_seq_LEN(t) == 1) lc = comprehension(asdl_seq_GET(t, 0), expression, NULL, c->c_arena); - } else lc = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena), expression, NULL, c->c_arena); - - if (!lc) { + if (!lc) return NULL; - } if (NCH(ch) == 5) { int j, n_ifs; @@ -949,14 +940,12 @@ ch = CHILD(ch, 4); n_ifs = count_list_ifs(ch); - if (n_ifs == -1) { + if (n_ifs == -1) return NULL; - } ifs = asdl_seq_new(n_ifs, c->c_arena); - if (!ifs) { + if (!ifs) return NULL; - } for (j = 0; j < n_ifs; j++) { REQ(ch, list_iter); @@ -1062,12 +1051,11 @@ n_fors = count_gen_fors(n); if (n_fors == -1) return NULL; - + genexps = asdl_seq_new(n_fors, c->c_arena); - if (!genexps) { + if (!genexps) return NULL; - } - + ch = CHILD(n, 1); for (i = 0; i < n_fors; i++) { comprehension_ty ge; @@ -1077,41 +1065,35 @@ REQ(ch, gen_for); t = ast_for_exprlist(c, CHILD(ch, 1), Store); - if (!t) { + if (!t) return NULL; - } expression = ast_for_expr(c, CHILD(ch, 3)); - if (!expression) { + if (!expression) return NULL; - } - - if (asdl_seq_LEN(t) == 1) { + + if (asdl_seq_LEN(t) == 1) ge = comprehension(asdl_seq_GET(t, 0), expression, NULL, c->c_arena); - } else ge = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena), expression, NULL, c->c_arena); - - if (!ge) { + + if (!ge) return NULL; - } - + if (NCH(ch) == 5) { int j, n_ifs; asdl_seq *ifs; ch = CHILD(ch, 4); n_ifs = count_gen_ifs(ch); - if (n_ifs == -1) { + if (n_ifs == -1) return NULL; - } - + ifs = asdl_seq_new(n_ifs, c->c_arena); - if (!ifs) { + if (!ifs) return NULL; - } - + for (j = 0; j < n_ifs; j++) { expr_ty expression; REQ(ch, gen_iter); @@ -1119,9 +1101,8 @@ REQ(ch, gen_if); expression = ast_for_expr(c, CHILD(ch, 1)); - if (!expression) { + if (!expression) return NULL; - } asdl_seq_APPEND(ifs, expression); if (NCH(ch) == 3) ch = CHILD(ch, 2); @@ -1152,19 +1133,17 @@ return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), c->c_arena); case STRING: { PyObject *str = parsestrplus(c, n); - if (!str) return NULL; - + PyArena_AddPyObject(c->c_arena, str); return Str(str, LINENO(n), c->c_arena); } case NUMBER: { PyObject *pynum = parsenumber(STR(ch)); - if (!pynum) return NULL; - + PyArena_AddPyObject(c->c_arena, pynum); return Num(pynum, LINENO(n), c->c_arena); } @@ -1190,10 +1169,9 @@ REQ(ch, listmaker); if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { asdl_seq *elts = seq_for_testlist(c, ch); - if (!elts) return NULL; - + return List(elts, Load, LINENO(n), c->c_arena); } else @@ -1210,24 +1188,21 @@ return NULL; values = asdl_seq_new(size, c->c_arena); - if (!values) { + if (!values) return NULL; - } for (i = 0; i < NCH(ch); i += 4) { expr_ty expression; expression = ast_for_expr(c, CHILD(ch, i)); - if (!expression) { + if (!expression) return NULL; - } - + asdl_seq_SET(keys, i / 4, expression); - + expression = ast_for_expr(c, CHILD(ch, i + 2)); - if (!expression) { + if (!expression) return NULL; - } asdl_seq_SET(values, i / 4, expression); } @@ -1235,10 +1210,9 @@ } case BACKQUOTE: { /* repr */ expr_ty expression = ast_for_testlist(c, CHILD(n, 1)); - if (!expression) return NULL; - + return Repr(expression, LINENO(n), c->c_arena); } default: @@ -1388,9 +1362,8 @@ if (!slc) return NULL; e = Subscript(left_expr, slc, Load, LINENO(n), c->c_arena); - if (!e) { + if (!e) return NULL; - } } else { int j; @@ -1400,16 +1373,14 @@ return NULL; for (j = 0; j < NCH(n); j += 2) { slc = ast_for_slice(c, CHILD(n, j)); - if (!slc) { + if (!slc) return NULL; - } asdl_seq_SET(slices, j / 2, slc); } e = Subscript(left_expr, ExtSlice(slices, c->c_arena), Load, LINENO(n), c->c_arena); - if (!e) { + if (!e) return NULL; - } } } else { @@ -1438,20 +1409,17 @@ if (TYPE(ch) != trailer) break; tmp = ast_for_trailer(c, ch, e); - if (!tmp) { + if (!tmp) return NULL; - } e = tmp; } if (TYPE(CHILD(n, NCH(n) - 1)) == factor) { expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1)); - if (!f) { + if (!f) return NULL; - } tmp = BinOp(e, Pow, f, LINENO(n), c->c_arena); - if (!tmp) { + if (!tmp) return NULL; - } e = tmp; } return e; @@ -1615,7 +1583,7 @@ PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n)); return NULL; } - /* should never get here */ + /* should never get here unless if error is set*/ return NULL; } @@ -2939,7 +2907,6 @@ static PyObject * parsestr(const char *s, const char *encoding) { - PyObject *v; size_t len; int quote = *s; int rawmode = 0; @@ -2994,7 +2961,7 @@ encoding. */ Py_FatalError("cannot deal with encodings in this build."); #else - PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL); + PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL); if (u == NULL) return NULL; v = PyUnicode_AsEncodedString(u, encoding, NULL); @@ -3006,9 +2973,8 @@ } } - v = PyString_DecodeEscape(s, len, NULL, unicode, - need_encoding ? encoding : NULL); - return v; + return PyString_DecodeEscape(s, len, NULL, unicode, + need_encoding ? encoding : NULL); } /* Build a Python string object out of a STRING atom. This takes care of @@ -3035,13 +3001,12 @@ } #ifdef Py_USING_UNICODE else { - PyObject *temp; - temp = PyUnicode_Concat(v, s); + PyObject *temp = PyUnicode_Concat(v, s); Py_DECREF(s); - if (temp == NULL) - goto onError; Py_DECREF(v); v = temp; + if (v == NULL) + goto onError; } #endif } From mwh at python.net Tue Dec 6 09:50:09 2005 From: mwh at python.net (Michael Hudson) Date: Tue, 06 Dec 2005 08:50:09 +0000 Subject: [Python-checkins] commit of r41623 - python/branches/ast-arena/Python/future.c In-Reply-To: <20051206072647.530B91E400B@bag.python.org> (neal norwitz's message of "Tue, 6 Dec 2005 08:26:47 +0100 (CET)") References: <20051206072647.530B91E400B@bag.python.org> Message-ID: <2mk6eia9tq.fsf@starship.python.net> "neal.norwitz" writes: > Author: neal.norwitz > Date: Tue Dec 6 08:26:47 2005 > New Revision: 41623 > > Modified: > python/branches/ast-arena/Python/future.c > Log: > Reduce scope of feature > > Modified: python/branches/ast-arena/Python/future.c > ============================================================================== > --- python/branches/ast-arena/Python/future.c (original) > +++ python/branches/ast-arena/Python/future.c Tue Dec 6 08:26:47 2005 > @@ -13,7 +13,6 @@ > future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) > { > int i; > - const char *feature; > asdl_seq *names; > > assert(s->kind == ImportFrom_kind); > @@ -21,7 +20,7 @@ > names = s->v.ImportFrom.names; > for (i = 0; i < asdl_seq_LEN(names); i++) { > alias_ty name = asdl_seq_GET(names, i); > - feature = PyString_AsString(name->name); > + const char *feature = PyString_AsString(name->name); This isn't C89, for the usual boring "code before declaration" reasons. Cheers, mwh -- You can lead an idiot to knowledge but you cannot make him think. You can, however, rectally insert the information, printed on stone tablets, using a sharpened poker. -- Nicolai -- http://home.xnet.com/~raven/Sysadmin/ASR.Quotes.html From nnorwitz at gmail.com Tue Dec 6 09:54:20 2005 From: nnorwitz at gmail.com (Neal Norwitz) Date: Tue, 6 Dec 2005 00:54:20 -0800 Subject: [Python-checkins] commit of r41623 - python/branches/ast-arena/Python/future.c In-Reply-To: <2mk6eia9tq.fsf@starship.python.net> References: <20051206072647.530B91E400B@bag.python.org> <2mk6eia9tq.fsf@starship.python.net> Message-ID: On 12/6/05, Michael Hudson wrote: > "neal.norwitz" writes: > > > Author: neal.norwitz > > Date: Tue Dec 6 08:26:47 2005 > > New Revision: 41623 > > > > Modified: > > python/branches/ast-arena/Python/future.c > > Log: > > Reduce scope of feature > > > > Modified: python/branches/ast-arena/Python/future.c > > ============================================================================== > > --- python/branches/ast-arena/Python/future.c (original) > > +++ python/branches/ast-arena/Python/future.c Tue Dec 6 08:26:47 2005 > > @@ -13,7 +13,6 @@ > > future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) > > { > > int i; > > - const char *feature; > > asdl_seq *names; > > > > assert(s->kind == ImportFrom_kind); > > @@ -21,7 +20,7 @@ > > names = s->v.ImportFrom.names; > > for (i = 0; i < asdl_seq_LEN(names); i++) { > > alias_ty name = asdl_seq_GET(names, i); > > - feature = PyString_AsString(name->name); > > + const char *feature = PyString_AsString(name->name); > > This isn't C89, for the usual boring "code before declaration" reasons. The line above is a declaration too (alias_ty name = ...) which is ok AFAIK. Does it create a problem for some compiler? n From python-checkins at python.org Tue Dec 6 15:07:40 2005 From: python-checkins at python.org (armin.rigo) Date: Tue, 6 Dec 2005 15:07:40 +0100 (CET) Subject: [Python-checkins] commit of r41629 - python/trunk/Modules/_hotshot.c Message-ID: <20051206140740.D23F31E400C@bag.python.org> Author: armin.rigo Date: Tue Dec 6 15:07:39 2005 New Revision: 41629 Modified: python/trunk/Modules/_hotshot.c Log: Nobody on python-dev seemed particularly bothered that Hotshot generates half- meaningless numbers, but I figured out I would fix that bug anyway. Modified: python/trunk/Modules/_hotshot.c ============================================================================== --- python/trunk/Modules/_hotshot.c (original) +++ python/trunk/Modules/_hotshot.c Tue Dec 6 15:07:39 2005 @@ -844,38 +844,6 @@ /* The workhorse: the profiler callback function. */ static int -profiler_callback(ProfilerObject *self, PyFrameObject *frame, int what, - PyObject *arg) -{ - int tdelta = -1; - int fileno; - - if (self->frametimings) - tdelta = get_tdelta(self); - switch (what) { - case PyTrace_CALL: - fileno = get_fileno(self, frame->f_code); - if (fileno < 0) - return -1; - if (pack_enter(self, fileno, tdelta, - frame->f_code->co_firstlineno) < 0) - return -1; - break; - case PyTrace_RETURN: - if (pack_exit(self, tdelta) < 0) - return -1; - break; - default: - /* should never get here */ - break; - } - return 0; -} - - -/* Alternate callback when we want PyTrace_LINE events */ - -static int tracer_callback(ProfilerObject *self, PyFrameObject *frame, int what, PyObject *arg) { @@ -893,7 +861,7 @@ case PyTrace_RETURN: return pack_exit(self, get_tdelta(self)); - case PyTrace_LINE: + case PyTrace_LINE: /* we only get these events if we asked for them */ if (self->linetimings) return pack_lineno_tdelta(self, frame->f_lineno, get_tdelta(self)); @@ -987,7 +955,7 @@ if (self->lineevents) PyEval_SetTrace((Py_tracefunc) tracer_callback, (PyObject *)self); else - PyEval_SetProfile((Py_tracefunc) profiler_callback, (PyObject *)self); + PyEval_SetProfile((Py_tracefunc) tracer_callback, (PyObject *)self); } static void From guido at python.org Tue Dec 6 16:47:06 2005 From: guido at python.org (Guido van Rossum) Date: Tue, 6 Dec 2005 07:47:06 -0800 Subject: [Python-checkins] commit of r41586 - in python/trunk: Lib/SimpleXMLRPCServer.py Misc/NEWS In-Reply-To: <20051204153705.0D91F1E400B@bag.python.org> References: <20051204153705.0D91F1E400B@bag.python.org> Message-ID: Happened to see this commit. What's the magic about 10MB? Is there any understanding of what causes it to fail? What is the failure mode? Could it just be fragmentation causing the malloc or realloc to fail? Should we perhaps use a more conservative buffer size, e.g. 1MB or even 8K (the international standard for I/O buffering :-)? --Guido On 12/4/05, andrew.kuchling wrote: > Author: andrew.kuchling > Date: Sun Dec 4 16:36:57 2005 > New Revision: 41586 > > Modified: > python/trunk/Lib/SimpleXMLRPCServer.py > python/trunk/Misc/NEWS > Log: > [Bug #792570] Under Windows, socket.read() seems to run into trouble when > asked to read tens of megabytes of data. On my Mac, it hits MemoryErrors > when reading around 15Mb in one chunk. The fix is to read the body in several > parts, not as one big piece. > > It would be nice to fix the underlying socket.read() problem, too. > > 2.4 bugfix candidate. > > > Modified: python/trunk/Lib/SimpleXMLRPCServer.py > ============================================================================== > --- python/trunk/Lib/SimpleXMLRPCServer.py (original) > +++ python/trunk/Lib/SimpleXMLRPCServer.py Sun Dec 4 16:36:57 2005 > @@ -422,8 +422,19 @@ > """ > > try: > - # get arguments > - data = self.rfile.read(int(self.headers["content-length"])) > + # Get arguments by reading body of request. > + # We read this in chunks to avoid straining > + # socket.read(); around the 10 or 15Mb mark, some platforms > + # begin to have problems (bug #792570). > + max_chunk_size = 10*1024*1024 > + size_remaining = int(self.headers["content-length"]) > + L = [] > + while size_remaining: > + chunk_size = min(size_remaining, max_chunk_size) > + L.append(self.rfile.read(chunk_size)) > + size_remaining -= len(L[-1]) > + data = ''.join(L) > + > # In previous versions of SimpleXMLRPCServer, _dispatch > # could be overridden in this class, instead of in > # SimpleXMLRPCDispatcher. To maintain backwards compatibility, > > Modified: python/trunk/Misc/NEWS > ============================================================================== > --- python/trunk/Misc/NEWS (original) > +++ python/trunk/Misc/NEWS Sun Dec 4 16:36:57 2005 > @@ -451,6 +451,9 @@ > - Bug #1222790: in SimpleXMLRPCServer, set the reuse-address and close-on-exec > flags on the HTTP listening socket. > > +- Bug #792570: SimpleXMLRPCServer had problems if the request grew too large. > + Fixed by reading the HTTP body in chunks instead of one big socket.read(). > + > - Bug #1110478: Revert os.environ.update to do putenv again. > > - Bug #1103844: fix distutils.install.dump_dirs() with negated options. > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > -- --Guido van Rossum (home page: http://www.python.org/~guido/) From mal at egenix.com Tue Dec 6 17:01:12 2005 From: mal at egenix.com (M.-A. Lemburg) Date: Tue, 06 Dec 2005 17:01:12 +0100 Subject: [Python-checkins] commit of r41586 - in python/trunk: Lib/SimpleXMLRPCServer.py Misc/NEWS In-Reply-To: References: <20051204153705.0D91F1E400B@bag.python.org> Message-ID: <4395B5C8.4070406@egenix.com> Guido van Rossum wrote: > Happened to see this commit. What's the magic about 10MB? Is there any > understanding of what causes it to fail? What is the failure mode? > Could it just be fragmentation causing the malloc or realloc to fail? > Should we perhaps use a more conservative buffer size, e.g. 1MB or > even 8K (the international standard for I/O buffering :-)? Just as data point: I've been hitting problems much earlier than with 10MB (unrelated to SimpleXMLRPCServer.py, this is experience from doing plain socket communication). Even 65535 is too much for some platforms (AIX at the time). Things got stable at around 64000 bytes. > --Guido > > On 12/4/05, andrew.kuchling wrote: > >>Author: andrew.kuchling >>Date: Sun Dec 4 16:36:57 2005 >>New Revision: 41586 >> >>Modified: >> python/trunk/Lib/SimpleXMLRPCServer.py >> python/trunk/Misc/NEWS >>Log: >>[Bug #792570] Under Windows, socket.read() seems to run into trouble when >>asked to read tens of megabytes of data. On my Mac, it hits MemoryErrors >>when reading around 15Mb in one chunk. The fix is to read the body in several >>parts, not as one big piece. >> >>It would be nice to fix the underlying socket.read() problem, too. >> >>2.4 bugfix candidate. >> >> >>Modified: python/trunk/Lib/SimpleXMLRPCServer.py >>============================================================================== >>--- python/trunk/Lib/SimpleXMLRPCServer.py (original) >>+++ python/trunk/Lib/SimpleXMLRPCServer.py Sun Dec 4 16:36:57 2005 >>@@ -422,8 +422,19 @@ >> """ >> >> try: >>- # get arguments >>- data = self.rfile.read(int(self.headers["content-length"])) >>+ # Get arguments by reading body of request. >>+ # We read this in chunks to avoid straining >>+ # socket.read(); around the 10 or 15Mb mark, some platforms >>+ # begin to have problems (bug #792570). >>+ max_chunk_size = 10*1024*1024 >>+ size_remaining = int(self.headers["content-length"]) >>+ L = [] >>+ while size_remaining: >>+ chunk_size = min(size_remaining, max_chunk_size) >>+ L.append(self.rfile.read(chunk_size)) >>+ size_remaining -= len(L[-1]) >>+ data = ''.join(L) >>+ >> # In previous versions of SimpleXMLRPCServer, _dispatch >> # could be overridden in this class, instead of in >> # SimpleXMLRPCDispatcher. To maintain backwards compatibility, >> >>Modified: python/trunk/Misc/NEWS >>============================================================================== >>--- python/trunk/Misc/NEWS (original) >>+++ python/trunk/Misc/NEWS Sun Dec 4 16:36:57 2005 >>@@ -451,6 +451,9 @@ >> - Bug #1222790: in SimpleXMLRPCServer, set the reuse-address and close-on-exec >> flags on the HTTP listening socket. >> >>+- Bug #792570: SimpleXMLRPCServer had problems if the request grew too large. >>+ Fixed by reading the HTTP body in chunks instead of one big socket.read(). >>+ >> - Bug #1110478: Revert os.environ.update to do putenv again. >> >> - Bug #1103844: fix distutils.install.dump_dirs() with negated options. >>_______________________________________________ >>Python-checkins mailing list >>Python-checkins at python.org >>http://mail.python.org/mailman/listinfo/python-checkins >> > > > > -- > --Guido van Rossum (home page: http://www.python.org/~guido/) > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Dec 06 2005) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From python-checkins at python.org Tue Dec 6 18:41:41 2005 From: python-checkins at python.org (phillip.eby) Date: Tue, 6 Dec 2005 18:41:41 +0100 (CET) Subject: [Python-checkins] commit of r41630 - in sandbox/trunk/setuptools: pkg_resources.py pkg_resources.txt setuptools/tests/test_resources.py Message-ID: <20051206174141.130701E400C@bag.python.org> Author: phillip.eby Date: Tue Dec 6 18:41:36 2005 New Revision: 41630 Modified: sandbox/trunk/setuptools/pkg_resources.py sandbox/trunk/setuptools/pkg_resources.txt sandbox/trunk/setuptools/setuptools/tests/test_resources.py Log: Changed ``parse_version()`` to remove dashes before pre-release tags, so that ``0.2-rc1`` is considered an *older* version than ``0.2``, and is equal to ``0.2rc1``. The idea that a dash *always* meant a post-release version was highly non-intuitive to setuptools users and Python developers, who seem to want to use ``-rc`` version numbers a lot. Modified: sandbox/trunk/setuptools/pkg_resources.py ============================================================================== --- sandbox/trunk/setuptools/pkg_resources.py (original) +++ sandbox/trunk/setuptools/pkg_resources.py Tue Dec 6 18:41:36 2005 @@ -1589,14 +1589,14 @@ parts = [] for part in _parse_version_parts(s.lower()): if part.startswith('*'): + if part<'*final': # remove '-' before a prerelease tag + while parts and parts[-1]=='*final-': parts.pop() # remove trailing zeros from each series of numeric parts while parts and parts[-1]=='00000000': parts.pop() parts.append(part) return tuple(parts) - - class EntryPoint(object): """Object representing an advertised importable object""" Modified: sandbox/trunk/setuptools/pkg_resources.txt ============================================================================== --- sandbox/trunk/setuptools/pkg_resources.txt (original) +++ sandbox/trunk/setuptools/pkg_resources.txt Tue Dec 6 18:41:36 2005 @@ -1371,7 +1371,11 @@ Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that come before "final" alphabetically) are assumed to be pre-release versions, - so that the version "2.4" is considered newer than "2.4a1". + so that the version "2.4" is considered newer than "2.4a1". Any "-" + characters preceding a pre-release indicator are removed. (In versions of + setuptools prior to 0.6a9, "-" characters were not removed, leading to the + unintuitive result that "0.2-rc1" was considered a newer version than + "0.2".) Finally, to handle miscellaneous cases, the strings "pre", "preview", and "rc" are treated as if they were "c", i.e. as though they were release @@ -1518,6 +1522,12 @@ system-installed egg, without needing to use ``.egg`` directories, zipfiles, or ``.pth`` manipulation. + * Changed ``parse_version()`` to remove dashes before pre-release tags, so + that ``0.2-rc1`` is considered an *older* version than ``0.2``, and is equal + to ``0.2rc1``. The idea that a dash *always* meant a post-release version + was highly non-intuitive to setuptools users and Python developers, who + seem to want to use ``-rc`` version numbers a lot. + 0.6a8 * Fixed a problem with ``WorkingSet.resolve()`` that prevented version conflicts from being detected at runtime. Modified: sandbox/trunk/setuptools/setuptools/tests/test_resources.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/tests/test_resources.py (original) +++ sandbox/trunk/setuptools/setuptools/tests/test_resources.py Tue Dec 6 18:41:36 2005 @@ -434,19 +434,19 @@ self.assertRaises(ValueError,Requirement.parse,"X==1\nY==2") self.assertRaises(ValueError,Requirement.parse,"#") - def testVersionEquality(self): def c(s1,s2): p1, p2 = parse_version(s1),parse_version(s2) self.assertEqual(p1,p2, (s1,s2,p1,p2)) + c('1.2-rc1', '1.2rc1') c('0.4', '0.4.0') c('0.4.0.0', '0.4.0') c('0.4.0-0', '0.4-0') c('0pl1', '0.0pl1') c('0pre1', '0.0c1') c('0.0.0preview1', '0c1') - c('0.0c1', '0rc1') + c('0.0c1', '0-rc1') c('1.2a1', '1.2.a.1'); c('1.2...a', '1.2a') def testVersionOrdering(self): @@ -470,6 +470,7 @@ c('0.4', '4.0') c('0.0.4', '0.4.0') c('0pl1', '0.4pl1') + c('2.1.0-rc1','2.1.0') torture =""" 0.80.1-3 0.80.1-2 0.80.1-1 0.79.9999+0.80.0pre4-1 @@ -489,4 +490,3 @@ - From python-checkins at python.org Tue Dec 6 19:32:37 2005 From: python-checkins at python.org (armin.rigo) Date: Tue, 6 Dec 2005 19:32:37 +0100 (CET) Subject: [Python-checkins] commit of r41631 - python/trunk/Doc/lib/libfunctional.tex Message-ID: <20051206183237.B8DA71E400D@bag.python.org> Author: armin.rigo Date: Tue Dec 6 19:32:37 2005 New Revision: 41631 Modified: python/trunk/Doc/lib/libfunctional.tex Log: Typo in a code example. Modified: python/trunk/Doc/lib/libfunctional.tex ============================================================================== --- python/trunk/Doc/lib/libfunctional.tex (original) +++ python/trunk/Doc/lib/libfunctional.tex Tue Dec 6 19:32:37 2005 @@ -44,7 +44,7 @@ two: \begin{verbatim} >>> basetwo = partial(int, base=2) - >>> basetwo.__doc__('Convert base 2 string to an int.') + >>> basetwo.__doc__ = 'Convert base 2 string to an int.' >>> basetwo('10010') 18 \end{verbatim} From python-checkins at python.org Tue Dec 6 22:00:50 2005 From: python-checkins at python.org (skip.montanaro) Date: Tue, 6 Dec 2005 22:00:50 +0100 (CET) Subject: [Python-checkins] commit of r41632 - python/trunk/Doc/lib/libdatetime.tex Message-ID: <20051206210050.895711E4012@bag.python.org> Author: skip.montanaro Date: Tue Dec 6 22:00:47 2005 New Revision: 41632 Modified: python/trunk/Doc/lib/libdatetime.tex Log: add common usage example Modified: python/trunk/Doc/lib/libdatetime.tex ============================================================================== --- python/trunk/Doc/lib/libdatetime.tex (original) +++ python/trunk/Doc/lib/libdatetime.tex Tue Dec 6 22:00:47 2005 @@ -1419,3 +1419,20 @@ The exact range of years for which \method{strftime()} works also varies across platforms. Regardless of platform, years before 1900 cannot be used. + +\subsection{Examples} + +\subsubsection{Creating Datetime Objects from Formatted Strings} + +The \class{datetime} class does not directly support parsing formatted time +strings. You can use \function{time.strptime} to do the parsing and create +a \class{datetime} object from the tuple it returns: + +\begin{verbatim} +>>> s = "2005-12-06T12:13:14" +>>> from datetime import datetime +>>> from time import strptime +>>> datetime(*strptime(s, "%Y-%m-%dT%H:%M:%S")[0:6]) +datetime.datetime(2005, 12, 6, 12, 13, 14) +\end{verbatim} + From python-checkins at python.org Wed Dec 7 17:21:49 2005 From: python-checkins at python.org (andrew.kuchling) Date: Wed, 7 Dec 2005 17:21:49 +0100 (CET) Subject: [Python-checkins] commit of r41633 - sandbox/trunk/seealso sandbox/trunk/seealso/make-seealso.py sandbox/trunk/seealso/parse-seealso.py Message-ID: <20051207162149.1717B1E4022@bag.python.org> Author: andrew.kuchling Date: Wed Dec 7 17:21:47 2005 New Revision: 41633 Added: sandbox/trunk/seealso/ sandbox/trunk/seealso/make-seealso.py (contents, props changed) sandbox/trunk/seealso/parse-seealso.py (contents, props changed) Log: Add strawman implementation of /F's seealso idea Added: sandbox/trunk/seealso/make-seealso.py ============================================================================== --- (empty file) +++ sandbox/trunk/seealso/make-seealso.py Wed Dec 7 17:21:47 2005 @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +# Read a pickled dictionary, and output a bunch of *.tex files +# into the specified directory. + +import os, sys +import pickle + +def main (): + if len(sys.argv) < 3: + print 'Usage: %s database-filename example-dir' + sys.exit(1) + + db_file = sys.argv[1] + example_dir = sys.argv[2] + + # Delete all *.tex files + for fn in os.listdir(example_dir): + if fn.endswith('.tex'): + p = os.path.join(example_dir, fn) + print p + os.remove(p) + + # Read dictionary + input = open(db_file, 'rb') + db = pickle.load(input) + input.close() + + # Output files + for module in db: + examples = db[module] + + # XXX sort examples in some way? + + def tex_escape (t): + t = t.replace('%', '\%') + t = t.replace('$', '\$') + return t + + # Write file containing examples for this module + p = os.path.join(example_dir, module + '.tex') + output = open(p, 'w') + for title, url, excerpt in examples: + if excerpt is None: + output.write("\seeurl{%s}{%s}\n" % (tex_escape(url), + tex_escape(title))) + else: + output.write("\seeurl{%s}{%s\n\n%s}\n" % (tex_escape(url), + tex_escape(title), + tex_escape(excerpt))) + + + output.close() + + +if __name__ == '__main__': + main() + Added: sandbox/trunk/seealso/parse-seealso.py ============================================================================== --- (empty file) +++ sandbox/trunk/seealso/parse-seealso.py Wed Dec 7 17:21:47 2005 @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +# Parse a seealso file, and add its contents to a pickled dictionary. + +import os, sys +import urllib, pickle +from xml.dom import minidom + +def main (): + if len(sys.argv) < 3: + print 'Usage: %s URL database-filename' + sys.exit(1) + + url = sys.argv[1] + db_file = sys.argv[2] + + # Fetch XML data + f = urllib.urlopen(url) + data = f.read() + f.close() + + # Parse XML data + dom = minidom.parseString(data) + L = [] + def get_text (node): + t = "" + for c in node.childNodes: + if c.nodeType == c.TEXT_NODE: + t += c.nodeValue + elif c.nodeType == c.ELEMENT_NODE: + t += get_text(c) + return t + + for item in dom.getElementsByTagNameNS(None, 'item'): + href = item.getAttributeNS(None, 'href') + title_node = item.getElementsByTagNameNS(None, 'title')[0] + title = get_text(title_node) + + # XXX this will ignore emphasized chunks of text + excerpt_nodes = item.getElementsByTagNameNS(None, 'excerpt') + if len(excerpt_nodes): + excerpt = get_text(excerpt_nodes[0]) + else: + excerpt = None + + # Multiple target elements are allowed + target_nodes = item.getElementsByTagNameNS(None, 'target') + for t in target_nodes: + target = get_text(t) + L.append((target, title, href, excerpt)) + + + + + # update database + # The database is a pickled dictionary mapping 'module name' -> + # list of (title, url, excerpt) pairs + if not os.path.exists(db_file): + db = {} + else: + input = open(db_file, 'rb') + db = pickle.load(input) + input.close() + for module, title, url, excerpt in L: + # Check if URL is already listed; if yes, delete the old entry + exlist = db.setdefault(module, []) + exlist = [t for t in exlist if t[1] != url] + + # Append to list + exlist.append((title, url, excerpt)) + + # Reinsert (since the list-comp created a new list) + db[module] = exlist + + ##import pprint ; pprint.pprint(db) + output = open(db_file, 'wb') + pickle.dump(db, output) + output.close() + +if __name__ == '__main__': + main() + From python-checkins at python.org Wed Dec 7 17:22:22 2005 From: python-checkins at python.org (andrew.kuchling) Date: Wed, 7 Dec 2005 17:22:22 +0100 (CET) Subject: [Python-checkins] commit of r41634 - sandbox/trunk/seealso/seealso.xml Message-ID: <20051207162222.CD0971E4023@bag.python.org> Author: andrew.kuchling Date: Wed Dec 7 17:22:21 2005 New Revision: 41634 Added: sandbox/trunk/seealso/seealso.xml Log: Add copy of /F's seealso.xml file Added: sandbox/trunk/seealso/seealso.xml ============================================================================== --- (empty file) +++ sandbox/trunk/seealso/seealso.xml Wed Dec 7 17:22:21 2005 @@ -0,0 +1,1000 @@ + + + + + Standard Python Library + (the eff-bot guide to) The Standard Python Library + Based in part on over 3,000 newsgroup articles written by Python veteran Fredrik Lundh since 1995, this book provides brief descriptions and sample scripts for all standard modules in the Python library. + Fredrik Lundh + http://effbot.org/librarybook + en + + + The aifc module + aifc + + + The anydbm module + anydbm + + + The array module + array + + + The asynchat module + asynchat + + + The asyncore module + asyncore + + + The atexit module + atexit + + + The audiodev module + audiodev + + + The base64 module + base64 + + + The BaseHTTPServer module + BaseHTTPServer + + + The Bastion module + Bastion + + + The bdb module + bdb + + + The binascii module + binascii + + + The binhex module + binhex + + + The bisect module + bisect + + + The bsddb Package + bsddb + + + The __builtin__ module + __builtin__ + + + The bz2 Module + bz2 + + + The calendar module + calendar + + + The cgi module + cgi + + + The CGIHTTPServer module + CGIHTTPServer + + + The cgitb Module + cgitb + + + The cmath module + cmath + + + The cmd module + cmd + + + The cmp module + cmp + + + The cmpcache module + cmpcache + + + The code module + code + + + The colorsys module + colorsys + + + The commands module + commands + + + The compileall module + compileall + + + The compiler Package + compiler + + + The ConfigParser module + ConfigParser + + + The Cookie module + Cookie + + + The copy_reg module + copy_reg + + + The copy module + copy + + + The cPickle module + cPickle + + + The crypt module + crypt + + + The cStringIO module + cStringIO + + + The csv Module + csv + + + The curses module + curses + + + The datetime Module + datetime + + + The dbhash module + dbhash + + + The dbm module + dbm + + + The difflib Module + difflib + + + The dircache module + dircache + + + The dircmp module + dircmp + + + The dis module + dis + + + The distutils Package + distutils + + + The doctest Module + doctest + + + The DocXMLRPCServer Module + DocXMLRPCServer + + + The dospath module + dospath + + + The dumbdbm module + dumbdbm + + + The dummy_thread Module + dummy_thread + + + The dummy_threading Module + dummy_threading + + + The email Package + email + + + The encodings.base64_codec Module + encodings.base64_codec + + + The encodings.hex_codec Module + encodings.hex_codec + + + The encodings.quopri_codec Module + encodings.quopri_codec + + + The encodings.rot_13 Module + encodings.rot_13 + + + The encodings.uu_codec Module + encodings.uu_codec + + + The encodings.zlib_codec Module + encodings.zlib_codec + + + The encodings Package + encodings + + + The errno module + errno + + + The exceptions module + exceptions + + + The fcntl module + fcntl + + + The filecmp module + filecmp + + + The fileinput module + fileinput + + + The find module + find + + + The fnmatch module + fnmatch + + + The formatter module + formatter + + + The ftplib module + ftplib + + + The __future__ Module + __future__ + + + The gc module + gc + + + The gdbm module + gdbm + + + The getopt module + getopt + + + The getpass module + getpass + + + The glob module + glob + + + The gopherlib module + gopherlib + + + The grep module + grep + + + The grp module + grp + + + The gzip module + gzip + + + The heapq Module + heapq + + + The hmac Module + hmac + + + The hotshot Package + hotshot + + + The htmlentitydefs module + htmlentitydefs + + + The htmllib module + htmllib + + + The HTMLParser Module + HTMLParser + + + The httplib module + httplib + + + The idlelib Package + idlelib + + + The ihooks module + ihooks + + + The imaplib module + imaplib + + + The imghdr module + imghdr + + + The imp module + imp + + + The inspect Module + inspect + + + The itertools Module + itertools + + + The keyword module + keyword + + + The knee module + knee + + + The linecache module + linecache + + + The locale module + locale + + + The logging Package + logging + + + The macpath module + macpath + + + The macurl2path module + macurl2path + + + The mailbox module + mailbox + + + The mailcap module + mailcap + + + The markupbase Module + markupbase + + + The marshal module + marshal + + + The math module + math + + + The md5 module + md5 + + + The mimetools module + mimetools + + + The mimetypes module + mimetypes + + + The MimeWriter module + MimeWriter + + + The mimify module + mimify + + + The mmap module + mmap + + + The modulefinder Module + modulefinder + + + The msvcrt module + msvcrt + + + The multifile module + multifile + + + The netrc module + netrc + + + The new module + new + + + The nis module + nis + + + The nntplib module + nntplib + + + The nt module + nt + + + The ntpath module + ntpath + + + The nturl2path module + nturl2path + + + The opcode Module + opcode + + + The operator module + operator + + + The optparse Module + optparse + + + The os.path module + os.path + + + The os module + os + + + The os2emxpath Module + os2emxpath + + + The packmail module + packmail + + + The parser module + parser + + + The pdb module + pdb + + + The pickle module + pickle + + + The pickletools Module + pickletools + + + The pipes module + pipes + + + The pkgutil Module + pkgutil + + + The platform Module + platform + + + The popen2 module + popen2 + + + The poplib module + poplib + + + The posix module + posix + + + The posixfile module + posixfile + + + The posixpath module + posixpath + + + The pprint module + pprint + + + The pre module + pre + + + The profile module + profile + + + The pstats module + pstats + + + The pwd module + pwd + + + The py_compile module + py_compile + + + The pyclbr module + pyclbr + + + The pydoc Module + pydoc + + + The Queue module + Queue + + + The quopri module + quopri + + + The random module + random + + + The re module + re + + + The readline module + readline + + + The reconvert module + reconvert + + + The regex_syntax module + regex_syntax + + + The regex module + regex + + + The regsub module + regsub + + + The repr module + repr + + + The resource module + resource + + + The rexec module + rexec + + + The rfc822 module + rfc822 + + + The rlcompleter module + rlcompleter + + + The robotparser module + robotparser + + + The rotor module + rotor + + + The sched module + sched + + + The select module + select + + + The sets Module + sets + + + The sgmllib module + sgmllib + + + The sha module + sha + + + The shelve module + shelve + + + The shlex module + shlex + + + The shutil module + shutil + + + The signal module + signal + + + The SimpleHTTPServer module + SimpleHTTPServer + + + The SimpleXMLRPCServer module + SimpleXMLRPCServer + + + The smtpd Module + smtpd + + + The smtplib module + smtplib + + + The sndhdr module + sndhdr + + + The socket module + socket + + + The SocketServer module + SocketServer + + + The soundex module + soundex + + + The sre module + sre + + + The stat module + stat + + + The statcache module + statcache + + + The statvfs module + statvfs + + + The string module + string + + + The StringIO module + StringIO + + + The stringprep Module + stringprep + + + The strop module + strop + + + The struct module + struct + + + The sunau module + sunau + + + The sunaudio module + sunaudio + + + The symbol module + symbol + + + The symtable Module + symtable + + + The sys module + sys + + + The syslog module + syslog + + + The tabnanny module + tabnanny + + + The tarfile Module + tarfile + + + Test + te + + + The telnetlib module + telnetlib + + + The tempfile module + tempfile + + + The termios module + termios + + + Test + test + + + The textwrap Module + textwrap + + + The this Module + this + + + The thread module + thread + + + The threading module + threading + + + The time module + time + + + The timeit Module + timeit + + + The timing module + timing + + + The token module + token + + + The tokenize module + tokenize + + + The trace Module + trace + + + The traceback module + traceback + + + The tty module + tty + + + The types module + types + + + The tzparse module + tzparse + + + The ucnhash module + ucnhash + + + The unicodedata module + unicodedata + + + The unittest Module + unittest + + + Test + untitled + + + The urllib module + urllib + + + The urlparse module + urlparse + + + The UserDict module + UserDict + + + The UserList module + UserList + + + The UserString module + UserString + + + The util module + util + + + The uu module + uu + + + The warnings Module + warnings + + + The wave module + wave + + + The weakref Module + weakref + + + The webbrowser module + webbrowser + + + The whatsound module + whatsound + + + The whichdb module + whichdb + + + The whrandom module + whrandom + + + The _winreg module + _winreg + + + The winsound module + winsound + + + The xdrlib module + xdrlib + + + The xml.dom Package + xml.dom + + + The xml.parsers.expat module + xml.parsers.expat + + + The xmllib module + xmllib + + + The xmlrpclib Module + xmlrpclib + + + The xreadlines Module + xreadlines + + + The zipfile module + zipfile + + + The zipimport Module + zipimport + + + The zlib module + zlib + + From python-checkins at python.org Wed Dec 7 17:24:49 2005 From: python-checkins at python.org (andrew.kuchling) Date: Wed, 7 Dec 2005 17:24:49 +0100 (CET) Subject: [Python-checkins] commit of r41635 - sandbox/trunk/seealso/README Message-ID: <20051207162449.37BD11E4002@bag.python.org> Author: andrew.kuchling Date: Wed Dec 7 17:24:48 2005 New Revision: 41635 Added: sandbox/trunk/seealso/README Log: Forgot the README Added: sandbox/trunk/seealso/README ============================================================================== --- (empty file) +++ sandbox/trunk/seealso/README Wed Dec 7 17:24:48 2005 @@ -0,0 +1,15 @@ + +Implementation of see-also idea by Fredrik Lundh. + +See http://effbot.org/zone/idea-seealso.htm for the XML description. + +parse-seealso.py : retrieves a URL, parses contents, adds them to a + pickled dictionary + +make-seealso.py : reads the dictionary and outputs *.tex files + +Error trapping is minimal; usually it'll die with an exception +if something goes wrong. + +--amk + From python-checkins at python.org Thu Dec 8 15:54:21 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 8 Dec 2005 15:54:21 +0100 (CET) Subject: [Python-checkins] commit of r41636 - python/trunk/Doc/lib/libxmlrpclib.tex Message-ID: <20051208145421.777A31E400E@bag.python.org> Author: andrew.kuchling Date: Thu Dec 8 15:54:20 2005 New Revision: 41636 Modified: python/trunk/Doc/lib/libxmlrpclib.tex Log: [Bug #1349316] Show how to use XML-RPC through a proxy Modified: python/trunk/Doc/lib/libxmlrpclib.tex ============================================================================== --- python/trunk/Doc/lib/libxmlrpclib.tex (original) +++ python/trunk/Doc/lib/libxmlrpclib.tex Thu Dec 8 15:54:20 2005 @@ -355,3 +355,30 @@ except Error, v: print "ERROR", v \end{verbatim} + +To access an XML-RPC server through a proxy, you need to define +a custom transport. The following example, +written by NoboNobo, % fill in original author's name if we ever learn it +shows how: + +% Example taken from http://lowlife.jp/nobonobo/wiki/xmlrpcwithproxy.html +\begin{verbatim} +import xmlrpclib, httplib + +class ProxiedTransport(xmlrpclib.Transport): + def set_proxy(self, proxy): + self.proxy = proxy + def make_connection(self, host): + self.realhost = host + h = httplib.HTTP(self.proxy) + return h + def send_request(self, connection, handler, request_body): + connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler)) + def send_host(self, connection, host): + connection.putheader('Host', self.realhost) + +p = ProxiedTransport() +p.set_proxy('proxy-server:8080') +server = xmlrpclib.Server('http://time.xmlrpc.com/RPC2', transport=p) +print server.currentTime.getCurrentTime() +\end{verbatim} From guido at python.org Fri Dec 9 05:53:44 2005 From: guido at python.org (Guido van Rossum) Date: Thu, 8 Dec 2005 20:53:44 -0800 Subject: [Python-checkins] commit of r41617 - in sandbox/trunk/setuptools: setuptools.txt setuptools/archive_util.py In-Reply-To: <20051206031253.42DB41E400B@bag.python.org> References: <20051206031253.42DB41E400B@bag.python.org> Message-ID: Why so many blank lines? On 12/5/05, phillip.eby wrote: > Author: phillip.eby > Date: Tue Dec 6 04:12:48 2005 > New Revision: 41617 > > Modified: > sandbox/trunk/setuptools/setuptools.txt > sandbox/trunk/setuptools/setuptools/archive_util.py > Log: > Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so > that you can process a directory tree through a processing filter as if > it were a zipfile or tarfile. > > > Modified: sandbox/trunk/setuptools/setuptools.txt > ============================================================================== > --- sandbox/trunk/setuptools/setuptools.txt (original) > +++ sandbox/trunk/setuptools/setuptools.txt Tue Dec 6 04:12:48 2005 > @@ -2177,6 +2177,10 @@ > * Made all commands that use ``easy_install`` respect its configuration > options, as this was causing some problems with ``setup.py install``. > > + * Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so > + that you can process a directory tree through a processing filter as if it > + were a zipfile or tarfile. > + > 0.6a8 > * Fixed some problems building extensions when Pyrex was installed, especially > with Python 2.4 and/or packages using SWIG. > > Modified: sandbox/trunk/setuptools/setuptools/archive_util.py > ============================================================================== > --- sandbox/trunk/setuptools/setuptools/archive_util.py (original) > +++ sandbox/trunk/setuptools/setuptools/archive_util.py Tue Dec 6 04:12:48 2005 > @@ -3,10 +3,10 @@ > > __all__ = [ > "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", > - "UnrecognizedFormat", "extraction_drivers" > + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", > ] > > -import zipfile, tarfile, os > +import zipfile, tarfile, os, shutil > from pkg_resources import ensure_directory > from distutils.errors import DistutilsError > > @@ -80,6 +80,47 @@ > > > > +def unpack_directory(filename, extract_dir, progress_filter=default_filter): > + """"Unpack" a directory, using the same interface as for archives > + > + Raises ``UnrecognizedFormat`` if `filename` is not a directory > + """ > + if not os.path.isdir(filename): > + raise UnrecognizedFormat("%s is not a directory" % (filename,)) > + > + paths = {filename:('',extract_dir)} > + for base, dirs, files in os.walk(filename): > + src,dst = paths[base] > + for d in dirs: > + paths[os.path.join(base,d)] = src+d+'/', os.path.join(dst,d) > + for f in files: > + name = src+f > + target = os.path.join(dst,f) > + target = progress_filter(src+f, target) > + if not target: > + continue # skip non-files > + ensure_directory(target) > + shutil.copyfile(os.path.join(base,f), target) > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): > """Unpack zip `filename` to `extract_dir` > > @@ -156,7 +197,7 @@ > > > > -extraction_drivers = unpack_zipfile, unpack_tarfile > +extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile > > > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > -- --Guido van Rossum (home page: http://www.python.org/~guido/) From guido at python.org Fri Dec 9 06:00:19 2005 From: guido at python.org (Guido van Rossum) Date: Thu, 8 Dec 2005 21:00:19 -0800 Subject: [Python-checkins] commit of r41602 - python/trunk/Lib/test/test_file.py In-Reply-To: <20051205011711.644AC1E400B@bag.python.org> References: <20051205011711.644AC1E400B@bag.python.org> Message-ID: I think that defeats the purpose of the test; f.seek(-1) raises IOError on a regular seekable file as well. But in any case I'm not sure what the test is attempting to prove. Since sys.stdin.seek(0) is not portable (works on OSX, doesn't work on linux) the test can't be made portable so it's better to delete it IMO... --Guido On 12/4/05, neal.norwitz wrote: > Author: neal.norwitz > Date: Mon Dec 5 02:17:03 2005 > New Revision: 41602 > > Modified: > python/trunk/Lib/test/test_file.py > Log: > Fix SF #1373161, r41552 broke test_file on OS X > > You apparently can seek(0) on sys.stdin on OS X. > But you can't go backwards, so seek(-1). > > > > Modified: python/trunk/Lib/test/test_file.py > ============================================================================== > --- python/trunk/Lib/test/test_file.py (original) > +++ python/trunk/Lib/test/test_file.py Mon Dec 5 02:17:03 2005 > @@ -101,7 +101,7 @@ > f.close() > > try: > - sys.stdin.seek(0) > + sys.stdin.seek(-1) > except IOError: > pass > else: > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > -- --Guido van Rossum (home page: http://www.python.org/~guido/) From mwh at python.net Fri Dec 9 11:10:07 2005 From: mwh at python.net (Michael Hudson) Date: Fri, 09 Dec 2005 10:10:07 +0000 Subject: [Python-checkins] commit of r41602 - python/trunk/Lib/test/test_file.py In-Reply-To: (Guido van Rossum's message of "Thu, 8 Dec 2005 21:00:19 -0800") References: <20051205011711.644AC1E400B@bag.python.org> Message-ID: <2mek4m8tts.fsf@starship.python.net> Guido van Rossum writes: > I think that defeats the purpose of the test; f.seek(-1) raises > IOError on a regular seekable file as well. The purpose of the test is to get some coverage of the "an error occurred" code in fileobject.c, which seems worthwhile to me, and f.seek(-1) is probably a fine way of doing that. f.tell(), now, I am not sure about. Cheers, mwh -- Hmmm... its Sunday afternoon: I could do my work, or I could do a Fourier analysis of my computer's fan noise. -- Amit Muthu, ucam.chat (from Owen Dunn's summary of the year) From python-checkins at python.org Sat Dec 10 18:44:32 2005 From: python-checkins at python.org (hyeshik.chang) Date: Sat, 10 Dec 2005 18:44:32 +0100 (CET) Subject: [Python-checkins] commit of r41637 - in python/trunk: Lib/test/regrtest.py Lib/test/test_codecmaps_cn.py Lib/test/test_codecmaps_hk.py Lib/test/test_codecmaps_jp.py Lib/test/test_codecmaps_kr.py Lib/test/test_codecmaps_tw.py Lib/test/test_multibytecodec_support.py Lib/test/test_normalization.py Lib/test/test_support.py Misc/NEWS Message-ID: <20051210174432.051D91E4002@bag.python.org> Author: hyeshik.chang Date: Sat Dec 10 18:44:27 2005 New Revision: 41637 Modified: python/trunk/Lib/test/regrtest.py python/trunk/Lib/test/test_codecmaps_cn.py python/trunk/Lib/test/test_codecmaps_hk.py python/trunk/Lib/test/test_codecmaps_jp.py python/trunk/Lib/test/test_codecmaps_kr.py python/trunk/Lib/test/test_codecmaps_tw.py python/trunk/Lib/test/test_multibytecodec_support.py python/trunk/Lib/test/test_normalization.py python/trunk/Lib/test/test_support.py python/trunk/Misc/NEWS Log: Patch #1276356: Implement new resource "urlfetch" for regrtest. This enables even impatient people to run tests that require remote files such as test_normalization and test_codecmaps_*. Modified: python/trunk/Lib/test/regrtest.py ============================================================================== --- python/trunk/Lib/test/regrtest.py (original) +++ python/trunk/Lib/test/regrtest.py Sat Dec 10 18:44:27 2005 @@ -97,6 +97,8 @@ subprocess Run all tests for the subprocess module. + urlfetch - It is okay to download files required on testing. + To enable all resources except one, use '-uall,-'. For example, to run all the tests except for the bsddb tests, give the option '-uall,-bsddb'. @@ -140,7 +142,7 @@ from test import test_support RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb', - 'decimal', 'compiler', 'subprocess') + 'decimal', 'compiler', 'subprocess', 'urlfetch') def usage(code, msg=''): @@ -671,20 +673,12 @@ # test_pep277 # The _ExpectedSkips constructor adds this to the set of expected # skips if not os.path.supports_unicode_filenames. -# test_normalization -# Whether a skip is expected here depends on whether a large test -# input file has been downloaded. test_normalization.skip_expected -# controls that. # test_socket_ssl # Controlled by test_socket_ssl.skip_expected. Requires the network # resource, and a socket module with ssl support. # test_timeout # Controlled by test_timeout.skip_expected. Requires the network # resource and a socket module. -# test_codecmaps_* -# Whether a skip is expected here depends on whether a large test -# input file has been downloaded. test_codecmaps_*.skip_expected -# controls that. _expectations = { 'win32': @@ -1056,7 +1050,6 @@ test_macfs test_macostools test_nis - test_normalization test_ossaudiodev test_pep277 test_plistlib @@ -1108,12 +1101,8 @@ class _ExpectedSkips: def __init__(self): import os.path - from test import test_normalization from test import test_socket_ssl from test import test_timeout - from test import test_codecmaps_cn, test_codecmaps_jp - from test import test_codecmaps_kr, test_codecmaps_tw - from test import test_codecmaps_hk self.valid = False if sys.platform in _expectations: @@ -1126,19 +1115,12 @@ if not os.path.supports_unicode_filenames: self.expected.add('test_pep277') - if test_normalization.skip_expected: - self.expected.add('test_normalization') - if test_socket_ssl.skip_expected: self.expected.add('test_socket_ssl') if test_timeout.skip_expected: self.expected.add('test_timeout') - for cc in ('cn', 'jp', 'kr', 'tw', 'hk'): - if eval('test_codecmaps_' + cc).skip_expected: - self.expected.add('test_codecmaps_' + cc) - if sys.maxint == 9223372036854775807L: self.expected.add('test_rgbimg') self.expected.add('test_imageop') Modified: python/trunk/Lib/test/test_codecmaps_cn.py ============================================================================== --- python/trunk/Lib/test/test_codecmaps_cn.py (original) +++ python/trunk/Lib/test/test_codecmaps_cn.py Sat Dec 10 18:44:27 2005 @@ -12,13 +12,11 @@ class TestGB2312Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'gb2312' - mapfilename = 'EUC-CN.TXT' mapfileurl = 'http://people.freebsd.org/~perky/i18n/EUC-CN.TXT' class TestGBKMap(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'gbk' - mapfilename = 'CP936.TXT' mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/' \ 'MICSFT/WINDOWS/CP936.TXT' @@ -28,6 +26,5 @@ suite.addTest(unittest.makeSuite(TestGBKMap)) test_support.run_suite(suite) -test_multibytecodec_support.register_skip_expected(TestGB2312Map, TestGBKMap) if __name__ == "__main__": test_main() Modified: python/trunk/Lib/test/test_codecmaps_hk.py ============================================================================== --- python/trunk/Lib/test/test_codecmaps_hk.py (original) +++ python/trunk/Lib/test/test_codecmaps_hk.py Sat Dec 10 18:44:27 2005 @@ -12,7 +12,6 @@ class TestBig5HKSCSMap(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'big5hkscs' - mapfilename = 'BIG5HKSCS.TXT' mapfileurl = 'http://people.freebsd.org/~perky/i18n/BIG5HKSCS.TXT' def test_main(): @@ -20,6 +19,5 @@ suite.addTest(unittest.makeSuite(TestBig5HKSCSMap)) test_support.run_suite(suite) -test_multibytecodec_support.register_skip_expected(TestBig5HKSCSMap) if __name__ == "__main__": test_main() Modified: python/trunk/Lib/test/test_codecmaps_jp.py ============================================================================== --- python/trunk/Lib/test/test_codecmaps_jp.py (original) +++ python/trunk/Lib/test/test_codecmaps_jp.py Sat Dec 10 18:44:27 2005 @@ -12,7 +12,6 @@ class TestCP932Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'cp932' - mapfilename = 'CP932.TXT' mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/' \ 'WINDOWS/CP932.TXT' supmaps = [ @@ -71,9 +70,5 @@ suite.addTest(unittest.makeSuite(TestSJISX0213Map)) test_support.run_suite(suite) -test_multibytecodec_support.register_skip_expected(TestCP932Map, - TestEUCJPCOMPATMap, TestSJISCOMPATMap, TestEUCJISX0213Map, - TestSJISX0213Map) - if __name__ == "__main__": test_main() Modified: python/trunk/Lib/test/test_codecmaps_kr.py ============================================================================== --- python/trunk/Lib/test/test_codecmaps_kr.py (original) +++ python/trunk/Lib/test/test_codecmaps_kr.py Sat Dec 10 18:44:27 2005 @@ -12,7 +12,6 @@ class TestCP949Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'cp949' - mapfilename = 'CP949.TXT' mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT' \ '/WINDOWS/CP949.TXT' @@ -20,14 +19,12 @@ class TestEUCKRMap(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'euc_kr' - mapfilename = 'EUC-KR.TXT' mapfileurl = 'http://people.freebsd.org/~perky/i18n/EUC-KR.TXT' class TestJOHABMap(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'johab' - mapfilename = 'JOHAB.TXT' mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/' \ 'KSC/JOHAB.TXT' # KS X 1001 standard assigned 0x5c as WON SIGN. @@ -44,7 +41,5 @@ suite.addTest(unittest.makeSuite(TestJOHABMap)) test_support.run_suite(suite) -test_multibytecodec_support.register_skip_expected(TestCP949Map, - TestEUCKRMap, TestJOHABMap) if __name__ == "__main__": test_main() Modified: python/trunk/Lib/test/test_codecmaps_tw.py ============================================================================== --- python/trunk/Lib/test/test_codecmaps_tw.py (original) +++ python/trunk/Lib/test/test_codecmaps_tw.py Sat Dec 10 18:44:27 2005 @@ -12,14 +12,12 @@ class TestBIG5Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'big5' - mapfilename = 'BIG5.TXT' mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/' \ 'EASTASIA/OTHER/BIG5.TXT' class TestCP950Map(test_multibytecodec_support.TestBase_Mapping, unittest.TestCase): encoding = 'cp950' - mapfilename = 'CP950.TXT' mapfileurl = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/' \ 'WINDOWS/CP950.TXT' pass_enctest = [ @@ -33,6 +31,5 @@ suite.addTest(unittest.makeSuite(TestCP950Map)) test_support.run_suite(suite) -test_multibytecodec_support.register_skip_expected(TestBIG5Map, TestCP950Map) if __name__ == "__main__": test_main() Modified: python/trunk/Lib/test/test_multibytecodec_support.py ============================================================================== --- python/trunk/Lib/test/test_multibytecodec_support.py (original) +++ python/trunk/Lib/test/test_multibytecodec_support.py Sat Dec 10 18:44:27 2005 @@ -163,15 +163,16 @@ def __init__(self, *args, **kw): unittest.TestCase.__init__(self, *args, **kw) - if not os.path.exists(self.mapfilename): - raise test_support.TestSkipped('%s not found, download from %s' % - (self.mapfilename, self.mapfileurl)) + self.open_mapping_file() # test it to report the error early + + def open_mapping_file(self): + return test_support.open_urlresource(self.mapfileurl) def test_mapping_file(self): unichrs = lambda s: u''.join(map(unichr, map(eval, s.split('+')))) urt_wa = {} - for line in open(self.mapfilename): + for line in self.open_mapping_file(): if not line: break data = line.split('#')[0].strip().split() @@ -217,16 +218,3 @@ else: from test import cjkencodings_test return cjkencodings_test.teststring[encoding] - -def register_skip_expected(*cases): - for case in cases: # len(cases) must be 1 at least. - for path in [os.path.curdir, os.path.pardir]: - fn = os.path.join(path, case.mapfilename) - if os.path.exists(fn): - case.mapfilename = fn - break - else: - sys.modules[case.__module__].skip_expected = True - break - else: - sys.modules[case.__module__].skip_expected = False Modified: python/trunk/Lib/test/test_normalization.py ============================================================================== --- python/trunk/Lib/test/test_normalization.py (original) +++ python/trunk/Lib/test/test_normalization.py Sat Dec 10 18:44:27 2005 @@ -1,21 +1,11 @@ -from test.test_support import verbose, TestFailed, TestSkipped, verify +from test.test_support import (verbose, TestFailed, TestSkipped, verify, + open_urlresource) import sys import os from unicodedata import normalize TESTDATAFILE = "NormalizationTest-3.2.0" + os.extsep + "txt" - -# This search allows using a build directory just inside the source -# directory, and saving just one copy of the test data in the source -# tree, rather than having a copy in each build directory. -# There might be a better way to do this. - -for path in [os.path.curdir, os.path.pardir]: - fn = os.path.join(path, TESTDATAFILE) - skip_expected = not os.path.exists(fn) - if not skip_expected: - TESTDATAFILE = fn - break +TESTDATAURL = "http://www.unicode.org/Public/3.2-Update/" + TESTDATAFILE class RangeError: pass @@ -40,12 +30,8 @@ return u"".join([unichr(x) for x in data]) def test_main(): - if skip_expected: - raise TestSkipped(TESTDATAFILE + " not found, download from " + - "http://www.unicode.org/Public/3.2-Update/" + TESTDATAFILE) - part1_data = {} - for line in open(TESTDATAFILE): + for line in open_urlresource(TESTDATAURL): if '#' in line: line = line.split('#')[0] line = line.strip() Modified: python/trunk/Lib/test/test_support.py ============================================================================== --- python/trunk/Lib/test/test_support.py (original) +++ python/trunk/Lib/test/test_support.py Sat Dec 10 18:44:27 2005 @@ -237,7 +237,21 @@ else: print 'Missing SyntaxError: "%s"' % statement - +def open_urlresource(url): + import urllib, urlparse + import os.path + + filename = urlparse.urlparse(url)[2].split('/')[-1] # '/': it's URL! + + for path in [os.path.curdir, os.path.pardir]: + fn = os.path.join(path, filename) + if os.path.exists(fn): + return open(fn) + + requires('urlfetch') + print >> get_original_stdout(), '\tfetching %s ...' % url + fn, _ = urllib.urlretrieve(url, filename) + return open(fn) #======================================================================= # Preliminary PyUNIT integration. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sat Dec 10 18:44:27 2005 @@ -633,6 +633,9 @@ - In test_os, st_?time is now truncated before comparing it with ST_?TIME. +- Patch #1276356: New resource "urlfetch" is implemented. This enables + even impatient people to run tests that require remote files. + Documentation ------------- From python-checkins at python.org Sat Dec 10 19:50:29 2005 From: python-checkins at python.org (jeremy.hylton) Date: Sat, 10 Dec 2005 19:50:29 +0100 (CET) Subject: [Python-checkins] commit of r41638 - in python/trunk: Include/cStringIO.h Include/ceval.h Include/import.h Include/methodobject.h Include/modsupport.h Include/moduleobject.h Include/object.h Modules/_bisectmodule.c Modules/_bsddb.c Modules/_csv.c Modules/_cursesmodule.c Modules/_hashopenssl.c Modules/_sre.c Modules/_tkinter.c Modules/binascii.c Modules/bz2module.c Modules/cPickle.c Modules/cStringIO.c Modules/cjkcodecs/multibytecodec.c Modules/datetimemodule.c Modules/itertoolsmodule.c Modules/mmapmodule.c Modules/parsermodule.c Modules/pyexpat.c Modules/sha256module.c Modules/sha512module.c Modules/socketmodule.c Objects/boolobject.c Objects/classobject.c Objects/complexobject.c Objects/descrobject.c Objects/enumobject.c Objects/fileobject.c Objects/floatobject.c Objects/funcobject.c Objects/intobject.c Objects/listobject.c Objects/longobject.c Objects/methodobject.c Objects/moduleobject.c Objects/object.c Objects/stringobject.c Objects/structseq.c Objects/tupleobject.c Objects/typeobject.c Objects/unicodeobject.c Objects/weakrefobject.c Python/bltinmodule.c Python/ceval.c Python/getargs.c Python/import.c Python/modsupport.c Message-ID: <20051210185029.1754A1E4002@bag.python.org> Author: jeremy.hylton Date: Sat Dec 10 19:50:16 2005 New Revision: 41638 Modified: python/trunk/Include/cStringIO.h python/trunk/Include/ceval.h python/trunk/Include/import.h python/trunk/Include/methodobject.h python/trunk/Include/modsupport.h python/trunk/Include/moduleobject.h python/trunk/Include/object.h python/trunk/Modules/_bisectmodule.c python/trunk/Modules/_bsddb.c python/trunk/Modules/_csv.c python/trunk/Modules/_cursesmodule.c python/trunk/Modules/_hashopenssl.c python/trunk/Modules/_sre.c python/trunk/Modules/_tkinter.c python/trunk/Modules/binascii.c python/trunk/Modules/bz2module.c python/trunk/Modules/cPickle.c python/trunk/Modules/cStringIO.c python/trunk/Modules/cjkcodecs/multibytecodec.c python/trunk/Modules/datetimemodule.c python/trunk/Modules/itertoolsmodule.c python/trunk/Modules/mmapmodule.c python/trunk/Modules/parsermodule.c python/trunk/Modules/pyexpat.c python/trunk/Modules/sha256module.c python/trunk/Modules/sha512module.c python/trunk/Modules/socketmodule.c python/trunk/Objects/boolobject.c python/trunk/Objects/classobject.c python/trunk/Objects/complexobject.c python/trunk/Objects/descrobject.c python/trunk/Objects/enumobject.c python/trunk/Objects/fileobject.c python/trunk/Objects/floatobject.c python/trunk/Objects/funcobject.c python/trunk/Objects/intobject.c python/trunk/Objects/listobject.c python/trunk/Objects/longobject.c python/trunk/Objects/methodobject.c python/trunk/Objects/moduleobject.c python/trunk/Objects/object.c python/trunk/Objects/stringobject.c python/trunk/Objects/structseq.c python/trunk/Objects/tupleobject.c python/trunk/Objects/typeobject.c python/trunk/Objects/unicodeobject.c python/trunk/Objects/weakrefobject.c python/trunk/Python/bltinmodule.c python/trunk/Python/ceval.c python/trunk/Python/getargs.c python/trunk/Python/import.c python/trunk/Python/modsupport.c Log: Add const to several API functions that take char *. In C++, it's an error to pass a string literal to a char* function without a const_cast(). Rather than require every C++ extension module to put a cast around string literals, fix the API to state the const-ness. I focused on parts of the API where people usually pass literals: PyArg_ParseTuple() and friends, Py_BuildValue(), PyMethodDef, the type slots, etc. Predictably, there were a large set of functions that needed to be fixed as a result of these changes. The most pervasive change was to make the keyword args list passed to PyArg_ParseTupleAndKewords() to be a const char *kwlist[]. One cast was required as a result of the changes: A type object mallocs the memory for its tp_doc slot and later frees it. PyTypeObject says that tp_doc is const char *; but if the type was created by type_new(), we know it is safe to cast to char *. Modified: python/trunk/Include/cStringIO.h ============================================================================== --- python/trunk/Include/cStringIO.h (original) +++ python/trunk/Include/cStringIO.h Sat Dec 10 19:50:16 2005 @@ -38,7 +38,7 @@ int(*creadline)(PyObject *, char **); /* Write a string to an output object*/ - int(*cwrite)(PyObject *, char *, int); + int(*cwrite)(PyObject *, const char *, int); /* Get the output object as a Python string (returns new reference). */ PyObject *(*cgetvalue)(PyObject *); Modified: python/trunk/Include/ceval.h ============================================================================== --- python/trunk/Include/ceval.h (original) +++ python/trunk/Include/ceval.h Sat Dec 10 19:50:16 2005 @@ -18,9 +18,11 @@ #define PyEval_CallObject(func,arg) \ PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL) -PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *obj, char *format, ...); +PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *obj, + const char *format, ...); PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, - char *methodname, char *format, ...); + const char *methodname, + const char *format, ...); PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); @@ -60,8 +62,8 @@ # define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit) #endif -PyAPI_FUNC(char *) PyEval_GetFuncName(PyObject *); -PyAPI_FUNC(char *) PyEval_GetFuncDesc(PyObject *); +PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); +PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *); PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *); Modified: python/trunk/Include/import.h ============================================================================== --- python/trunk/Include/import.h (original) +++ python/trunk/Include/import.h Sat Dec 10 19:50:16 2005 @@ -12,8 +12,8 @@ PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleEx( char *name, PyObject *co, char *pathname); PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void); -PyAPI_FUNC(PyObject *) PyImport_AddModule(char *name); -PyAPI_FUNC(PyObject *) PyImport_ImportModule(char *name); +PyAPI_FUNC(PyObject *) PyImport_AddModule(const char *name); +PyAPI_FUNC(PyObject *) PyImport_ImportModule(const char *name); PyAPI_FUNC(PyObject *) PyImport_ImportModuleEx( char *name, PyObject *globals, PyObject *locals, PyObject *fromlist); PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name); Modified: python/trunk/Include/methodobject.h ============================================================================== --- python/trunk/Include/methodobject.h (original) +++ python/trunk/Include/methodobject.h Sat Dec 10 19:50:16 2005 @@ -35,15 +35,15 @@ PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); struct PyMethodDef { - char *ml_name; /* The name of the built-in function/method */ + const char *ml_name; /* The name of the built-in function/method */ PyCFunction ml_meth; /* The C function that implements it */ int ml_flags; /* Combination of METH_xxx flags, which mostly describe the args expected by the C func */ - char *ml_doc; /* The __doc__ attribute, or NULL */ + const char *ml_doc; /* The __doc__ attribute, or NULL */ }; typedef struct PyMethodDef PyMethodDef; -PyAPI_FUNC(PyObject *) Py_FindMethod(PyMethodDef[], PyObject *, char *); +PyAPI_FUNC(PyObject *) Py_FindMethod(PyMethodDef[], PyObject *, const char *); #define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, @@ -76,7 +76,7 @@ } PyMethodChain; PyAPI_FUNC(PyObject *) Py_FindMethodInChain(PyMethodChain *, PyObject *, - char *); + const char *); typedef struct { PyObject_HEAD Modified: python/trunk/Include/modsupport.h ============================================================================== --- python/trunk/Include/modsupport.h (original) +++ python/trunk/Include/modsupport.h Sat Dec 10 19:50:16 2005 @@ -9,22 +9,22 @@ #include -PyAPI_FUNC(int) PyArg_Parse(PyObject *, char *, ...); -PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, char *, ...); +PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, - char *, char **, ...); -PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, char *, int, int, ...); -PyAPI_FUNC(PyObject *) Py_BuildValue(char *, ...); -PyAPI_FUNC(int) _PyArg_NoKeywords(char *funcname, PyObject *kw); + const char *, const char **, ...); +PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, int, int, ...); +PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); +PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kw); -PyAPI_FUNC(int) PyArg_VaParse(PyObject *, char *, va_list); +PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list); PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, - char *, char **, va_list); -PyAPI_FUNC(PyObject *) Py_VaBuildValue(char *, va_list); + const char *, const char **, va_list); +PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); -PyAPI_FUNC(int) PyModule_AddObject(PyObject *, char *, PyObject *); -PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, char *, long); -PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, char *, char *); +PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); +PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); #define PYTHON_API_VERSION 1012 #define PYTHON_API_STRING "1012" @@ -84,9 +84,9 @@ #define Py_InitModule4 Py_InitModule4TraceRefs #endif -PyAPI_FUNC(PyObject *) Py_InitModule4(char *name, PyMethodDef *methods, - char *doc, PyObject *self, - int apiver); +PyAPI_FUNC(PyObject *) Py_InitModule4(const char *name, PyMethodDef *methods, + const char *doc, PyObject *self, + int apiver); #define Py_InitModule(name, methods) \ Py_InitModule4(name, methods, (char *)NULL, (PyObject *)NULL, \ Modified: python/trunk/Include/moduleobject.h ============================================================================== --- python/trunk/Include/moduleobject.h (original) +++ python/trunk/Include/moduleobject.h Sat Dec 10 19:50:16 2005 @@ -12,7 +12,7 @@ #define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) #define PyModule_CheckExact(op) ((op)->ob_type == &PyModule_Type) -PyAPI_FUNC(PyObject *) PyModule_New(char *); +PyAPI_FUNC(PyObject *) PyModule_New(const char *); PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *); PyAPI_FUNC(char *) PyModule_GetName(PyObject *); PyAPI_FUNC(char *) PyModule_GetFilename(PyObject *); Modified: python/trunk/Include/object.h ============================================================================== --- python/trunk/Include/object.h (original) +++ python/trunk/Include/object.h Sat Dec 10 19:50:16 2005 @@ -225,9 +225,9 @@ typedef void (*freefunc)(void *); typedef void (*destructor)(PyObject *); typedef int (*printfunc)(PyObject *, FILE *, int); -typedef PyObject *(*getattrfunc)(PyObject *, char *); +typedef PyObject *(*getattrfunc)(PyObject *, const char *); typedef PyObject *(*getattrofunc)(PyObject *, PyObject *); -typedef int (*setattrfunc)(PyObject *, char *, PyObject *); +typedef int (*setattrfunc)(PyObject *, const char *, PyObject *); typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *); typedef int (*cmpfunc)(PyObject *, PyObject *); typedef PyObject *(*reprfunc)(PyObject *); @@ -243,7 +243,7 @@ typedef struct _typeobject { PyObject_VAR_HEAD - char *tp_name; /* For printing, in format "." */ + const char *tp_name; /* For printing, in format "." */ int tp_basicsize, tp_itemsize; /* For allocation */ /* Methods to implement standard operations */ @@ -275,7 +275,7 @@ /* Flags to define presence of optional/expanded features */ long tp_flags; - char *tp_doc; /* Documentation string */ + const char *tp_doc; /* Documentation string */ /* Assigned meaning in release 2.0 */ /* call function for all accessible objects */ @@ -379,9 +379,9 @@ PyAPI_FUNC(int) PyObject_Compare(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int); PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int); -PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, char *); -PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, char *, PyObject *); -PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, char *); +PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *); +PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *); PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); Modified: python/trunk/Modules/_bisectmodule.c ============================================================================== --- python/trunk/Modules/_bisectmodule.c (original) +++ python/trunk/Modules/_bisectmodule.c Sat Dec 10 19:50:16 2005 @@ -40,7 +40,7 @@ int lo = 0; int hi = -1; int index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; + static const char *keywords[] = {"a", "x", "lo", "hi", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|ii:bisect_right", keywords, &list, &item, &lo, &hi)) @@ -70,7 +70,7 @@ int lo = 0; int hi = -1; int index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; + static const char *keywords[] = {"a", "x", "lo", "hi", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|ii:insort_right", keywords, &list, &item, &lo, &hi)) @@ -137,7 +137,7 @@ int lo = 0; int hi = -1; int index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; + static const char *keywords[] = {"a", "x", "lo", "hi", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|ii:bisect_left", keywords, &list, &item, &lo, &hi)) @@ -167,7 +167,7 @@ int lo = 0; int hi = -1; int index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; + static const char *keywords[] = {"a", "x", "lo", "hi", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|ii:insort_left", keywords, &list, &item, &lo, &hi)) @@ -233,4 +233,3 @@ m = Py_InitModule3("_bisect", bisect_methods, module_doc); } - Modified: python/trunk/Modules/_bsddb.c ============================================================================== --- python/trunk/Modules/_bsddb.c (original) +++ python/trunk/Modules/_bsddb.c Sat Dec 10 19:50:16 2005 @@ -650,7 +650,7 @@ int dlen = -1; int doff = -1; int flags = 0; - char* kwnames[] = { "flags", "dlen", "doff", NULL }; + static const char* kwnames[] = { "flags", "dlen", "doff", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, format, kwnames, &flags, &dlen, &doff)) @@ -1147,9 +1147,10 @@ #if (DBVER >= 41) PyObject *txnobj = NULL; DB_TXN *txn = NULL; - char* kwnames[] = {"secondaryDB", "callback", "flags", "txn", NULL}; + static const char* kwnames[] = {"secondaryDB", "callback", "flags", "txn", + NULL}; #else - char* kwnames[] = {"secondaryDB", "callback", "flags", NULL}; + static const char* kwnames[] = {"secondaryDB", "callback", "flags", NULL}; #endif #if (DBVER >= 41) @@ -1255,7 +1256,7 @@ PyObject* retval = NULL; DBT key, data; DB_TXN *txn = NULL; - char* kwnames[] = { "txn", "flags", NULL }; + static const char* kwnames[] = { "txn", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:consume", kwnames, &txnobj, &flags)) @@ -1325,7 +1326,7 @@ DBC* dbc; PyObject* txnobj = NULL; DB_TXN *txn = NULL; - char* kwnames[] = { "txn", "flags", NULL }; + static const char* kwnames[] = { "txn", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:cursor", kwnames, &txnobj, &flags)) @@ -1350,7 +1351,7 @@ PyObject* keyobj; DBT key; DB_TXN *txn = NULL; - char* kwnames[] = { "key", "txn", "flags", NULL }; + static const char* kwnames[] = { "key", "txn", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oi:delete", kwnames, &keyobj, &txnobj, &flags)) @@ -1402,7 +1403,8 @@ int doff = -1; DBT key, data; DB_TXN *txn = NULL; - char* kwnames[] = {"key", "default", "txn", "flags", "dlen", "doff", NULL}; + static const char* kwnames[] = {"key", "default", "txn", "flags", "dlen", + "doff", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOiii:get", kwnames, &keyobj, &dfltobj, &txnobj, &flags, &dlen, @@ -1469,7 +1471,8 @@ int doff = -1; DBT key, pkey, data; DB_TXN *txn = NULL; - char* kwnames[] = {"key", "default", "txn", "flags", "dlen", "doff", NULL}; + static const char* kwnames[] = {"key", "default", "txn", "flags", "dlen", + "doff", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOiii:pget", kwnames, &keyobj, &dfltobj, &txnobj, &flags, &dlen, @@ -1558,7 +1561,7 @@ PyObject* retval = NULL; DBT key, data; DB_TXN *txn = NULL; - char* kwnames[] = { "key", "txn", NULL }; + static const char* kwnames[] = { "key", "txn", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O:get_size", kwnames, &keyobj, &txnobj)) @@ -1601,7 +1604,7 @@ PyObject* retval = NULL; DBT key, data; DB_TXN *txn = NULL; - char* kwnames[] = { "key", "data", "txn", "flags", NULL }; + static const char* kwnames[] = { "key", "data", "txn", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|Oi:get_both", kwnames, @@ -1752,7 +1755,7 @@ DBT key; DB_TXN *txn = NULL; DB_KEY_RANGE range; - char* kwnames[] = { "key", "txn", "flags", NULL }; + static const char* kwnames[] = { "key", "txn", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oi:key_range", kwnames, &keyobj, &txnobj, &flags)) @@ -1783,17 +1786,17 @@ PyObject *txnobj = NULL; DB_TXN *txn = NULL; /* with dbname */ - char* kwnames[] = { + static const char* kwnames[] = { "filename", "dbname", "dbtype", "flags", "mode", "txn", NULL}; /* without dbname */ - char* kwnames_basic[] = { + static const char* kwnames_basic[] = { "filename", "dbtype", "flags", "mode", "txn", NULL}; #else /* with dbname */ - char* kwnames[] = { + static const char* kwnames[] = { "filename", "dbname", "dbtype", "flags", "mode", NULL}; /* without dbname */ - char* kwnames_basic[] = { + static const char* kwnames_basic[] = { "filename", "dbtype", "flags", "mode", NULL}; #endif @@ -1877,7 +1880,8 @@ PyObject* keyobj, *dataobj, *retval; DBT key, data; DB_TXN *txn = NULL; - char* kwnames[] = { "key", "data", "txn", "flags", "dlen", "doff", NULL }; + static const char* kwnames[] = { "key", "data", "txn", "flags", "dlen", + "doff", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|Oiii:put", kwnames, &keyobj, &dataobj, &txnobj, &flags, &dlen, &doff)) @@ -1917,7 +1921,7 @@ char* filename; char* database = NULL; int err, flags=0; - char* kwnames[] = { "filename", "dbname", "flags", NULL}; + static const char* kwnames[] = { "filename", "dbname", "flags", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|zi:remove", kwnames, &filename, &database, &flags)) @@ -2335,9 +2339,9 @@ #if (DBVER >= 43) PyObject* txnobj = NULL; DB_TXN *txn = NULL; - char* kwnames[] = { "txn", "flags", NULL }; + static const char* kwnames[] = { "txn", "flags", NULL }; #else - char* kwnames[] = { "flags", NULL }; + static const char* kwnames[] = { "flags", NULL }; #endif #if (DBVER >= 43) @@ -2477,7 +2481,7 @@ u_int32_t count=0; PyObject* txnobj = NULL; DB_TXN *txn = NULL; - char* kwnames[] = { "txn", "flags", NULL }; + static const char* kwnames[] = { "txn", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:cursor", kwnames, &txnobj, &flags)) @@ -2521,7 +2525,8 @@ char* dbName=NULL; char* outFileName=NULL; FILE* outFile=NULL; - char* kwnames[] = { "filename", "dbname", "outfile", "flags", NULL }; + static const char* kwnames[] = { "filename", "dbname", "outfile", "flags", + NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|zzi:verify", kwnames, &fileName, &dbName, &outFileName, &flags)) @@ -2578,7 +2583,7 @@ int err; u_int32_t flags=0; char *passwd = NULL; - char* kwnames[] = { "passwd", "flags", NULL }; + static const char* kwnames[] = { "passwd", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i:set_encrypt", kwnames, &passwd, &flags)) { @@ -3018,7 +3023,8 @@ int dlen = -1; int doff = -1; DBT key, data; - char* kwnames[] = { "key","data", "flags", "dlen", "doff", NULL }; + static const char* kwnames[] = { "key","data", "flags", "dlen", "doff", + NULL }; CLEAR_DBT(key); CLEAR_DBT(data); @@ -3104,7 +3110,8 @@ int dlen = -1; int doff = -1; DBT key, pkey, data; - char* kwnames[] = { "key","data", "flags", "dlen", "doff", NULL }; + static const char* kwnames[] = { "key","data", "flags", "dlen", "doff", + NULL }; CLEAR_DBT(key); CLEAR_DBT(data); @@ -3257,7 +3264,8 @@ int err, flags = 0; PyObject* keyobj, *dataobj; DBT key, data; - char* kwnames[] = { "key", "data", "flags", "dlen", "doff", NULL }; + static const char* kwnames[] = { "key", "data", "flags", "dlen", "doff", + NULL }; int dlen = -1; int doff = -1; @@ -3292,7 +3300,7 @@ int err, flags = 0; DBT key, data; PyObject* retval, *keyobj; - char* kwnames[] = { "key", "flags", "dlen", "doff", NULL }; + static const char* kwnames[] = { "key", "flags", "dlen", "doff", NULL }; int dlen = -1; int doff = -1; @@ -3362,7 +3370,7 @@ int err, flags = 0; DBT key, data; PyObject* retval, *keyobj; - char* kwnames[] = { "key", "flags", "dlen", "doff", NULL }; + static const char* kwnames[] = { "key", "flags", "dlen", "doff", NULL }; int dlen = -1; int doff = -1; @@ -3552,7 +3560,7 @@ PyObject* retval; int dlen = -1; int doff = -1; - char* kwnames[] = { "recno","flags", "dlen", "doff", NULL }; + static const char* kwnames[] = { "recno","flags", "dlen", "doff", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|iii:set_recno", kwnames, &irecno, &flags, &dlen, &doff)) @@ -3746,7 +3754,8 @@ char *database = NULL; PyObject *txnobj = NULL; DB_TXN *txn = NULL; - char* kwnames[] = { "file", "database", "txn", "flags", NULL }; + static const char* kwnames[] = { "file", "database", "txn", "flags", + NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss|Oi:dbremove", kwnames, &file, &database, &txnobj, &flags)) { @@ -3773,7 +3782,8 @@ char *newname = NULL; PyObject *txnobj = NULL; DB_TXN *txn = NULL; - char* kwnames[] = { "file", "database", "newname", "txn", "flags", NULL }; + static const char* kwnames[] = { "file", "database", "newname", "txn", + "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sss|Oi:dbrename", kwnames, &file, &database, &newname, &txnobj, &flags)) { @@ -3797,7 +3807,7 @@ int err; u_int32_t flags=0; char *passwd = NULL; - char* kwnames[] = { "passwd", "flags", NULL }; + static const char* kwnames[] = { "passwd", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i:set_encrypt", kwnames, &passwd, &flags)) { @@ -3820,7 +3830,7 @@ int err; u_int32_t flags=0; u_int32_t timeout = 0; - char* kwnames[] = { "timeout", "flags", NULL }; + static const char* kwnames[] = { "timeout", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii:set_timeout", kwnames, &timeout, &flags)) { @@ -4107,7 +4117,7 @@ int flags = 0; PyObject* txnobj = NULL; DB_TXN *txn = NULL; - char* kwnames[] = { "parent", "flags", NULL }; + static const char* kwnames[] = { "parent", "flags", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:txn_begin", kwnames, &txnobj, &flags)) @@ -4937,7 +4947,7 @@ { PyObject* dbenvobj = NULL; int flags = 0; - char* kwnames[] = { "dbEnv", "flags", NULL}; + static const char* kwnames[] = { "dbEnv", "flags", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Oi:DB", kwnames, &dbenvobj, &flags)) Modified: python/trunk/Modules/_csv.c ============================================================================== --- python/trunk/Modules/_csv.c (original) +++ python/trunk/Modules/_csv.c Sat Dec 10 19:50:16 2005 @@ -291,7 +291,7 @@ self->ob_type->tp_free((PyObject *)self); } -static char *dialect_kws[] = { +static const char *dialect_kws[] = { "dialect", "delimiter", "doublequote", Modified: python/trunk/Modules/_cursesmodule.c ============================================================================== --- python/trunk/Modules/_cursesmodule.c (original) +++ python/trunk/Modules/_cursesmodule.c Sat Dec 10 19:50:16 2005 @@ -1886,10 +1886,10 @@ int err; char* termstr = NULL; - static char *kwlist[] = {"term", "fd", NULL}; + static const char *kwlist[] = {"term", "fd", NULL}; if (!PyArg_ParseTupleAndKeywords( - args,keywds,"|zi:setupterm",kwlist,&termstr,&fd)) { + args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) { return NULL; } Modified: python/trunk/Modules/_hashopenssl.c ============================================================================== --- python/trunk/Modules/_hashopenssl.c (original) +++ python/trunk/Modules/_hashopenssl.c Sat Dec 10 19:50:16 2005 @@ -230,7 +230,7 @@ static int EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"name", "string", NULL}; + static const char *kwlist[] = {"name", "string", NULL}; PyObject *name_obj = NULL; char *nameStr; unsigned char *cp = NULL; @@ -366,7 +366,7 @@ static PyObject * EVP_new(PyObject *self, PyObject *args, PyObject *kwdict) { - static char *kwlist[] = {"name", "string", NULL}; + static const char *kwlist[] = {"name", "string", NULL}; PyObject *name_obj = NULL; char *name; const EVP_MD *digest; Modified: python/trunk/Modules/_sre.c ============================================================================== --- python/trunk/Modules/_sre.c (original) +++ python/trunk/Modules/_sre.c Sat Dec 10 19:50:16 2005 @@ -2007,7 +2007,7 @@ PyObject* string; int start = 0; int end = INT_MAX; - static char* kwlist[] = { "pattern", "pos", "endpos", NULL }; + static const char* kwlist[] = { "pattern", "pos", "endpos", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "O|ii:match", kwlist, &string, &start, &end)) return NULL; @@ -2044,7 +2044,7 @@ PyObject* string; int start = 0; int end = INT_MAX; - static char* kwlist[] = { "pattern", "pos", "endpos", NULL }; + static const char* kwlist[] = { "pattern", "pos", "endpos", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "O|ii:search", kwlist, &string, &start, &end)) return NULL; @@ -2185,7 +2185,7 @@ PyObject* string; int start = 0; int end = INT_MAX; - static char* kwlist[] = { "source", "pos", "endpos", NULL }; + static const char* kwlist[] = { "source", "pos", "endpos", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "O|ii:findall", kwlist, &string, &start, &end)) return NULL; @@ -2311,7 +2311,7 @@ PyObject* string; int maxsplit = 0; - static char* kwlist[] = { "source", "maxsplit", NULL }; + static const char* kwlist[] = { "source", "maxsplit", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "O|i:split", kwlist, &string, &maxsplit)) return NULL; @@ -2595,7 +2595,7 @@ PyObject* template; PyObject* string; int count = 0; - static char* kwlist[] = { "repl", "string", "count", NULL }; + static const char* kwlist[] = { "repl", "string", "count", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|i:sub", kwlist, &template, &string, &count)) return NULL; @@ -2609,7 +2609,7 @@ PyObject* template; PyObject* string; int count = 0; - static char* kwlist[] = { "repl", "string", "count", NULL }; + static const char* kwlist[] = { "repl", "string", "count", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|i:subn", kwlist, &template, &string, &count)) return NULL; @@ -2916,7 +2916,7 @@ int index; PyObject* def = Py_None; - static char* kwlist[] = { "default", NULL }; + static const char* kwlist[] = { "default", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:groups", kwlist, &def)) return NULL; @@ -2945,7 +2945,7 @@ int index; PyObject* def = Py_None; - static char* kwlist[] = { "default", NULL }; + static const char* kwlist[] = { "default", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:groupdict", kwlist, &def)) return NULL; Modified: python/trunk/Modules/_tkinter.c ============================================================================== --- python/trunk/Modules/_tkinter.c (original) +++ python/trunk/Modules/_tkinter.c Sat Dec 10 19:50:16 2005 @@ -2393,7 +2393,7 @@ } static PyObject * -Tktt_GetAttr(PyObject *self, char *name) +Tktt_GetAttr(PyObject *self, const char *name) { return Py_FindMethod(Tktt_methods, self, name); } @@ -2723,7 +2723,7 @@ } static PyObject * -Tkapp_GetAttr(PyObject *self, char *name) +Tkapp_GetAttr(PyObject *self, const char *name) { return Py_FindMethod(Tkapp_methods, self, name); } Modified: python/trunk/Modules/binascii.c ============================================================================== --- python/trunk/Modules/binascii.c (original) +++ python/trunk/Modules/binascii.c Sat Dec 10 19:50:16 2005 @@ -1032,7 +1032,7 @@ unsigned char *data, *odata; unsigned int datalen = 0; PyObject *rv; - static char *kwlist[] = {"data", "header", NULL}; + static const char *kwlist[] = {"data", "header", NULL}; int header = 0; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|i", kwlist, &data, @@ -1133,7 +1133,8 @@ unsigned int datalen = 0, odatalen = 0; PyObject *rv; unsigned int linelen = 0; - static char *kwlist[] = {"data", "quotetabs", "istext", "header", NULL}; + static const char *kwlist[] = {"data", "quotetabs", "istext", + "header", NULL}; int istext = 1; int quotetabs = 0; int header = 0; Modified: python/trunk/Modules/bz2module.c ============================================================================== --- python/trunk/Modules/bz2module.c (original) +++ python/trunk/Modules/bz2module.c Sat Dec 10 19:50:16 2005 @@ -1285,8 +1285,8 @@ static int BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"filename", "mode", "buffering", - "compresslevel", 0}; + static const char *kwlist[] = {"filename", "mode", "buffering", + "compresslevel", 0}; PyObject *name; char *mode = "r"; int buffering = -1; @@ -1674,7 +1674,7 @@ { int compresslevel = 9; int bzerror; - static char *kwlist[] = {"compresslevel", 0}; + static const char *kwlist[] = {"compresslevel", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:BZ2Compressor", kwlist, &compresslevel)) @@ -2019,7 +2019,7 @@ bz_stream _bzs; bz_stream *bzs = &_bzs; int bzerror; - static char *kwlist[] = {"data", "compresslevel", 0}; + static const char *kwlist[] = {"data", "compresslevel", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|i", kwlist, &data, &datasize, Modified: python/trunk/Modules/cPickle.c ============================================================================== --- python/trunk/Modules/cPickle.c (original) +++ python/trunk/Modules/cPickle.c Sat Dec 10 19:50:16 2005 @@ -339,7 +339,7 @@ int fast; /* Fast mode doesn't save in memo, don't use if circ ref */ int nesting; - int (*write_func)(struct Picklerobject *, char *, int); + int (*write_func)(struct Picklerobject *, const char *, int); char *write_buf; int buf_size; PyObject *dispatch_table; @@ -417,7 +417,7 @@ } static int -write_file(Picklerobject *self, char *s, int n) +write_file(Picklerobject *self, const char *s, int n) { size_t nbyteswritten; @@ -437,7 +437,7 @@ } static int -write_cStringIO(Picklerobject *self, char *s, int n) +write_cStringIO(Picklerobject *self, const char *s, int n) { if (s == NULL) { return 0; @@ -451,14 +451,14 @@ } static int -write_none(Picklerobject *self, char *s, int n) +write_none(Picklerobject *self, const char *s, int n) { if (s == NULL) return 0; return n; } static int -write_other(Picklerobject *self, char *s, int n) +write_other(Picklerobject *self, const char *s, int n) { PyObject *py_str = 0, *junk = 0; @@ -669,7 +669,7 @@ * The caller is responsible for free()'ing the return value. */ static char * -pystrndup(char *s, int n) +pystrndup(const char *s, int n) { char *r = (char *)malloc(n+1); if (r == NULL) @@ -945,7 +945,7 @@ static int save_bool(Picklerobject *self, PyObject *args) { - static char *buf[2] = {FALSE, TRUE}; + static const char *buf[2] = {FALSE, TRUE}; static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1}; long l = PyInt_AS_LONG((PyIntObject *)args); @@ -2858,7 +2858,7 @@ static PyObject * get_Pickler(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"file", "protocol", NULL}; + static const char *kwlist[] = {"file", "protocol", NULL}; PyObject *file = NULL; int proto = 0; @@ -5378,7 +5378,7 @@ static PyObject * cpm_dump(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"obj", "file", "protocol", NULL}; + static const char *kwlist[] = {"obj", "file", "protocol", NULL}; PyObject *ob, *file, *res = NULL; Picklerobject *pickler = 0; int proto = 0; @@ -5407,7 +5407,7 @@ static PyObject * cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"obj", "protocol", NULL}; + static const char *kwlist[] = {"obj", "protocol", NULL}; PyObject *ob, *file = 0, *res = NULL; Picklerobject *pickler = 0; int proto = 0; Modified: python/trunk/Modules/cStringIO.c ============================================================================== --- python/trunk/Modules/cStringIO.c (original) +++ python/trunk/Modules/cStringIO.c Sat Dec 10 19:50:16 2005 @@ -362,7 +362,7 @@ static int -O_cwrite(PyObject *self, char *c, int l) { +O_cwrite(PyObject *self, const char *c, int l) { int newl; Oobject *oself; Modified: python/trunk/Modules/cjkcodecs/multibytecodec.c ============================================================================== --- python/trunk/Modules/cjkcodecs/multibytecodec.c (original) +++ python/trunk/Modules/cjkcodecs/multibytecodec.c Sat Dec 10 19:50:16 2005 @@ -45,8 +45,8 @@ PyDoc_STRVAR(MultibyteCodec_StreamWriter__doc__, "I.StreamWriter(stream[, errors]) -> StreamWriter instance"); -static char *codeckwarglist[] = {"input", "errors", NULL}; -static char *streamkwarglist[] = {"stream", "errors", NULL}; +static const char *codeckwarglist[] = {"input", "errors", NULL}; +static const char *streamkwarglist[] = {"stream", "errors", NULL}; static PyObject *multibytecodec_encode(MultibyteCodec *, MultibyteCodec_State *, const Py_UNICODE **, size_t, Modified: python/trunk/Modules/datetimemodule.c ============================================================================== --- python/trunk/Modules/datetimemodule.c (original) +++ python/trunk/Modules/datetimemodule.c Sat Dec 10 19:50:16 2005 @@ -1073,10 +1073,10 @@ static PyObject * format_ctime(PyDateTime_Date *date, int hours, int minutes, int seconds) { - static char *DayNames[] = { + static const char *DayNames[] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" }; - static char *MonthNames[] = { + static const char *MonthNames[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; @@ -1891,7 +1891,7 @@ PyObject *y = NULL; /* temp sum of microseconds */ double leftover_us = 0.0; - static char *keywords[] = { + static const char *keywords[] = { "days", "seconds", "microseconds", "milliseconds", "minutes", "hours", "weeks", NULL }; @@ -2194,7 +2194,7 @@ /* Constructors. */ -static char *date_kws[] = {"year", "month", "day", NULL}; +static const char *date_kws[] = {"year", "month", "day", NULL}; static PyObject * date_new(PyTypeObject *type, PyObject *args, PyObject *kw) @@ -2406,7 +2406,7 @@ date_repr(PyDateTime_Date *self) { char buffer[1028]; - char *typename; + const char *typename; typename = self->ob_type->tp_name; PyOS_snprintf(buffer, sizeof(buffer), "%s(%d, %d, %d)", @@ -2448,7 +2448,7 @@ PyObject *result; PyObject *format; PyObject *tuple; - static char *keywords[] = {"format", NULL}; + static const char *keywords[] = {"format", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:strftime", keywords, &PyString_Type, &format)) @@ -3028,7 +3028,7 @@ * Constructors. */ -static char *time_kws[] = {"hour", "minute", "second", "microsecond", +static const char *time_kws[] = {"hour", "minute", "second", "microsecond", "tzinfo", NULL}; static PyObject * @@ -3133,7 +3133,7 @@ time_repr(PyDateTime_Time *self) { char buffer[100]; - char *typename = self->ob_type->tp_name; + const char *typename = self->ob_type->tp_name; int h = TIME_GET_HOUR(self); int m = TIME_GET_MINUTE(self); int s = TIME_GET_SECOND(self); @@ -3196,7 +3196,7 @@ PyObject *result; PyObject *format; PyObject *tuple; - static char *keywords[] = {"format", NULL}; + static const char *keywords[] = {"format", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:strftime", keywords, &PyString_Type, &format)) @@ -3548,7 +3548,7 @@ * Constructors. */ -static char *datetime_kws[] = { +static const char *datetime_kws[] = { "year", "month", "day", "hour", "minute", "second", "microsecond", "tzinfo", NULL }; @@ -3729,7 +3729,7 @@ { PyObject *self; PyObject *tzinfo = Py_None; - static char *keywords[] = {"tz", NULL}; + static const char *keywords[] = {"tz", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:now", keywords, &tzinfo)) @@ -3765,7 +3765,7 @@ PyObject *self; double timestamp; PyObject *tzinfo = Py_None; - static char *keywords[] = {"timestamp", "tz", NULL}; + static const char *keywords[] = {"timestamp", "tz", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "d|O:fromtimestamp", keywords, ×tamp, &tzinfo)) @@ -3843,7 +3843,7 @@ static PyObject * datetime_combine(PyObject *cls, PyObject *args, PyObject *kw) { - static char *keywords[] = {"date", "time", NULL}; + static const char *keywords[] = {"date", "time", NULL}; PyObject *date; PyObject *time; PyObject *result = NULL; @@ -4027,7 +4027,7 @@ datetime_repr(PyDateTime_DateTime *self) { char buffer[1000]; - char *typename = self->ob_type->tp_name; + const char *typename = self->ob_type->tp_name; PyObject *baserepr; if (DATE_GET_MICROSECOND(self)) { @@ -4070,7 +4070,7 @@ datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) { char sep = 'T'; - static char *keywords[] = {"sep", NULL}; + static const char *keywords[] = {"sep", NULL}; char buffer[100]; char *cp; PyObject *result; @@ -4261,7 +4261,7 @@ int offset, none; PyObject *tzinfo; - static char *keywords[] = {"tz", NULL}; + static const char *keywords[] = {"tz", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:astimezone", keywords, &PyDateTime_TZInfoType, &tzinfo)) Modified: python/trunk/Modules/itertoolsmodule.c ============================================================================== --- python/trunk/Modules/itertoolsmodule.c (original) +++ python/trunk/Modules/itertoolsmodule.c Sat Dec 10 19:50:16 2005 @@ -26,7 +26,7 @@ static PyObject * groupby_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - static char *kwargs[] = {"iterable", "key", NULL}; + static const char *kwargs[] = {"iterable", "key", NULL}; groupbyobject *gbo; PyObject *it, *keyfunc = Py_None; Modified: python/trunk/Modules/mmapmodule.c ============================================================================== --- python/trunk/Modules/mmapmodule.c (original) +++ python/trunk/Modules/mmapmodule.c Sat Dec 10 19:50:16 2005 @@ -864,12 +864,13 @@ int map_size; int fd, flags = MAP_SHARED, prot = PROT_WRITE | PROT_READ; access_mode access = ACCESS_DEFAULT; - char *keywords[] = {"fileno", "length", - "flags", "prot", - "access", NULL}; + static const char *keywords[] = {"fileno", "length", + "flags", "prot", + "access", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iO|iii", keywords, - &fd, &map_size_obj, &flags, &prot, &access)) + &fd, &map_size_obj, &flags, &prot, + &access)) return NULL; map_size = _GetMapSize(map_size_obj); if (map_size < 0) @@ -952,9 +953,9 @@ HANDLE fh = 0; access_mode access = ACCESS_DEFAULT; DWORD flProtect, dwDesiredAccess; - char *keywords[] = { "fileno", "length", - "tagname", - "access", NULL }; + static const char *keywords[] = { "fileno", "length", + "tagname", + "access", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iO|zi", keywords, &fileno, &map_size_obj, Modified: python/trunk/Modules/parsermodule.c ============================================================================== --- python/trunk/Modules/parsermodule.c (original) +++ python/trunk/Modules/parsermodule.c Sat Dec 10 19:50:16 2005 @@ -158,7 +158,7 @@ static void parser_free(PyST_Object *st); static int parser_compare(PyST_Object *left, PyST_Object *right); -static PyObject *parser_getattr(PyObject *self, char *name); +static PyObject *parser_getattr(PyObject *self, const char *name); static @@ -292,7 +292,7 @@ PyObject *res = 0; int ok; - static char *keywords[] = {"ast", "line_info", NULL}; + static const char *keywords[] = {"ast", "line_info", NULL}; if (self == NULL) { ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|O:st2tuple", keywords, @@ -330,7 +330,7 @@ PyObject *res = 0; int ok; - static char *keywords[] = {"ast", "line_info", NULL}; + static const char *keywords[] = {"ast", "line_info", NULL}; if (self == NULL) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|O:st2list", keywords, @@ -367,7 +367,7 @@ char* str = ""; int ok; - static char *keywords[] = {"ast", "filename", NULL}; + static const char *keywords[] = {"ast", "filename", NULL}; if (self == NULL) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|s:compilest", keywords, @@ -396,7 +396,7 @@ PyObject* res = 0; int ok; - static char *keywords[] = {"ast", NULL}; + static const char *keywords[] = {"ast", NULL}; if (self == NULL) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:isexpr", keywords, @@ -419,7 +419,7 @@ PyObject* res = 0; int ok; - static char *keywords[] = {"ast", NULL}; + static const char *keywords[] = {"ast", NULL}; if (self == NULL) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:issuite", keywords, @@ -456,7 +456,7 @@ static PyObject* -parser_getattr(PyObject *self, char *name) +parser_getattr(PyObject *self, const char *name) { return (Py_FindMethod(parser_methods, self, name)); } @@ -486,7 +486,7 @@ char* string = 0; PyObject* res = 0; - static char *keywords[] = {"source", NULL}; + static const char *keywords[] = {"source", NULL}; if (PyArg_ParseTupleAndKeywords(args, kw, argspec, keywords, &string)) { node* n = PyParser_SimpleParseString(string, @@ -568,7 +568,7 @@ PyObject *tuple; node *tree; - static char *keywords[] = {"sequence", NULL}; + static const char *keywords[] = {"sequence", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kw, "O:sequence2st", keywords, &tuple)) Modified: python/trunk/Modules/pyexpat.c ============================================================================== --- python/trunk/Modules/pyexpat.c (original) +++ python/trunk/Modules/pyexpat.c Sat Dec 10 19:50:16 2005 @@ -1724,8 +1724,8 @@ PyObject *intern = NULL; PyObject *result; int intern_decref = 0; - static char *kwlist[] = {"encoding", "namespace_separator", - "intern", NULL}; + static const char *kwlist[] = {"encoding", "namespace_separator", + "intern", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kw, "|zzO:ParserCreate", kwlist, &encoding, &namespace_separator, &intern)) Modified: python/trunk/Modules/sha256module.c ============================================================================== --- python/trunk/Modules/sha256module.c (original) +++ python/trunk/Modules/sha256module.c Sat Dec 10 19:50:16 2005 @@ -624,7 +624,7 @@ static PyObject * SHA256_new(PyObject *self, PyObject *args, PyObject *kwdict) { - static char *kwlist[] = {"string", NULL}; + static const char *kwlist[] = {"string", NULL}; SHAobject *new; unsigned char *cp = NULL; int len; @@ -655,7 +655,7 @@ static PyObject * SHA224_new(PyObject *self, PyObject *args, PyObject *kwdict) { - static char *kwlist[] = {"string", NULL}; + static const char *kwlist[] = {"string", NULL}; SHAobject *new; unsigned char *cp = NULL; int len; Modified: python/trunk/Modules/sha512module.c ============================================================================== --- python/trunk/Modules/sha512module.c (original) +++ python/trunk/Modules/sha512module.c Sat Dec 10 19:50:16 2005 @@ -690,7 +690,7 @@ static PyObject * SHA512_new(PyObject *self, PyObject *args, PyObject *kwdict) { - static char *kwlist[] = {"string", NULL}; + static const char *kwlist[] = {"string", NULL}; SHAobject *new; unsigned char *cp = NULL; int len; @@ -721,7 +721,7 @@ static PyObject * SHA384_new(PyObject *self, PyObject *args, PyObject *kwdict) { - static char *kwlist[] = {"string", NULL}; + static const char *kwlist[] = {"string", NULL}; SHAobject *new; unsigned char *cp = NULL; int len; Modified: python/trunk/Modules/socketmodule.c ============================================================================== --- python/trunk/Modules/socketmodule.c (original) +++ python/trunk/Modules/socketmodule.c Sat Dec 10 19:50:16 2005 @@ -2489,7 +2489,7 @@ PySocketSockObject *s = (PySocketSockObject *)self; SOCKET_T fd; int family = AF_INET, type = SOCK_STREAM, proto = 0; - static char *keywords[] = {"family", "type", "proto", 0}; + static const char *keywords[] = {"family", "type", "proto", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|iii:socket", keywords, Modified: python/trunk/Objects/boolobject.c ============================================================================== --- python/trunk/Objects/boolobject.c (original) +++ python/trunk/Objects/boolobject.c Sat Dec 10 19:50:16 2005 @@ -50,7 +50,7 @@ static PyObject * bool_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"x", 0}; + static const char *kwlist[] = {"x", 0}; PyObject *x = Py_False; long ok; Modified: python/trunk/Objects/classobject.c ============================================================================== --- python/trunk/Objects/classobject.c (original) +++ python/trunk/Objects/classobject.c Sat Dec 10 19:50:16 2005 @@ -159,7 +159,7 @@ class_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *name, *bases, *dict; - static char *kwlist[] = {"name", "bases", "dict", 0}; + static const char *kwlist[] = {"name", "bases", "dict", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist, &name, &bases, &dict)) Modified: python/trunk/Objects/complexobject.c ============================================================================== --- python/trunk/Objects/complexobject.c (original) +++ python/trunk/Objects/complexobject.c Sat Dec 10 19:50:16 2005 @@ -829,7 +829,7 @@ Py_complex cr, ci; int own_r = 0; static PyObject *complexstr; - static char *kwlist[] = {"real", "imag", 0}; + static const char *kwlist[] = {"real", "imag", 0}; r = Py_False; i = NULL; Modified: python/trunk/Objects/descrobject.c ============================================================================== --- python/trunk/Objects/descrobject.c (original) +++ python/trunk/Objects/descrobject.c Sat Dec 10 19:50:16 2005 @@ -579,7 +579,7 @@ }; static PyDescrObject * -descr_new(PyTypeObject *descrtype, PyTypeObject *type, char *name) +descr_new(PyTypeObject *descrtype, PyTypeObject *type, const char *name) { PyDescrObject *descr; @@ -1182,7 +1182,7 @@ property_init(PyObject *self, PyObject *args, PyObject *kwds) { PyObject *get = NULL, *set = NULL, *del = NULL, *doc = NULL; - static char *kwlist[] = {"fget", "fset", "fdel", "doc", 0}; + static const char *kwlist[] = {"fget", "fset", "fdel", "doc", 0}; propertyobject *gs = (propertyobject *)self; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO:property", Modified: python/trunk/Objects/enumobject.c ============================================================================== --- python/trunk/Objects/enumobject.c (original) +++ python/trunk/Objects/enumobject.c Sat Dec 10 19:50:16 2005 @@ -16,7 +16,7 @@ { enumobject *en; PyObject *seq = NULL; - static char *kwlist[] = {"sequence", 0}; + static const char *kwlist[] = {"sequence", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:enumerate", kwlist, &seq)) Modified: python/trunk/Objects/fileobject.c ============================================================================== --- python/trunk/Objects/fileobject.c (original) +++ python/trunk/Objects/fileobject.c Sat Dec 10 19:50:16 2005 @@ -1884,7 +1884,7 @@ { PyFileObject *foself = (PyFileObject *)self; int ret = 0; - static char *kwlist[] = {"name", "mode", "buffering", 0}; + static const char *kwlist[] = {"name", "mode", "buffering", 0}; char *name = NULL; char *mode = "r"; int bufsize = -1; @@ -1926,8 +1926,9 @@ return -1; /* We parse again to get the name as a PyObject */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:file", kwlist, - &o_name, &mode, &bufsize)) + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:file", + kwlist, &o_name, &mode, + &bufsize)) return -1; if (fill_file_fields(foself, NULL, o_name, mode, Modified: python/trunk/Objects/floatobject.c ============================================================================== --- python/trunk/Objects/floatobject.c (original) +++ python/trunk/Objects/floatobject.c Sat Dec 10 19:50:16 2005 @@ -941,7 +941,7 @@ float_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *x = Py_False; /* Integer zero */ - static char *kwlist[] = {"x", 0}; + static const char *kwlist[] = {"x", 0}; if (type != &PyFloat_Type) return float_subtype_new(type, args, kwds); /* Wimp out */ Modified: python/trunk/Objects/funcobject.c ============================================================================== --- python/trunk/Objects/funcobject.c (original) +++ python/trunk/Objects/funcobject.c Sat Dec 10 19:50:16 2005 @@ -364,7 +364,7 @@ PyObject *closure = Py_None; PyFunctionObject *newfunc; int nfree, nclosure; - static char *kwlist[] = {"code", "globals", "name", + static const char *kwlist[] = {"code", "globals", "name", "argdefs", "closure", 0}; if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function", Modified: python/trunk/Objects/intobject.c ============================================================================== --- python/trunk/Objects/intobject.c (original) +++ python/trunk/Objects/intobject.c Sat Dec 10 19:50:16 2005 @@ -879,7 +879,7 @@ { PyObject *x = NULL; int base = -909; - static char *kwlist[] = {"x", "base", 0}; + static const char *kwlist[] = {"x", "base", 0}; if (type != &PyInt_Type) return int_subtype_new(type, args, kwds); /* Wimp out */ Modified: python/trunk/Objects/listobject.c ============================================================================== --- python/trunk/Objects/listobject.c (original) +++ python/trunk/Objects/listobject.c Sat Dec 10 19:50:16 2005 @@ -1983,7 +1983,7 @@ PyObject *keyfunc = NULL; int i; PyObject *key, *value, *kvpair; - static char *kwlist[] = {"cmp", "key", "reverse", 0}; + static const char *kwlist[] = {"cmp", "key", "reverse", 0}; assert(self != NULL); assert (PyList_Check(self)); @@ -2357,7 +2357,7 @@ list_init(PyListObject *self, PyObject *args, PyObject *kw) { PyObject *arg = NULL; - static char *kwlist[] = {"sequence", 0}; + static const char *kwlist[] = {"sequence", 0}; if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg)) return -1; Modified: python/trunk/Objects/longobject.c ============================================================================== --- python/trunk/Objects/longobject.c (original) +++ python/trunk/Objects/longobject.c Sat Dec 10 19:50:16 2005 @@ -1,4 +1,5 @@ + /* Long (arbitrary precision) integer object implementation */ /* XXX The functional organization of this file is terrible */ @@ -2922,7 +2923,7 @@ { PyObject *x = NULL; int base = -909; /* unlikely! */ - static char *kwlist[] = {"x", "base", 0}; + static const char *kwlist[] = {"x", "base", 0}; if (type != &PyLong_Type) return long_subtype_new(type, args, kwds); /* Wimp out */ Modified: python/trunk/Objects/methodobject.c ============================================================================== --- python/trunk/Objects/methodobject.c (original) +++ python/trunk/Objects/methodobject.c Sat Dec 10 19:50:16 2005 @@ -132,7 +132,7 @@ static PyObject * meth_get__doc__(PyCFunctionObject *m, void *closure) { - char *doc = m->m_ml->ml_doc; + const char *doc = m->m_ml->ml_doc; if (doc != NULL) return PyString_FromString(doc); @@ -311,13 +311,13 @@ /* Find a method in a method chain */ PyObject * -Py_FindMethodInChain(PyMethodChain *chain, PyObject *self, char *name) +Py_FindMethodInChain(PyMethodChain *chain, PyObject *self, const char *name) { if (name[0] == '_' && name[1] == '_') { if (strcmp(name, "__methods__") == 0) return listmethodchain(chain); if (strcmp(name, "__doc__") == 0) { - char *doc = self->ob_type->tp_doc; + const char *doc = self->ob_type->tp_doc; if (doc != NULL) return PyString_FromString(doc); } @@ -339,7 +339,7 @@ /* Find a method in a single method list */ PyObject * -Py_FindMethod(PyMethodDef *methods, PyObject *self, char *name) +Py_FindMethod(PyMethodDef *methods, PyObject *self, const char *name) { PyMethodChain chain; chain.methods = methods; Modified: python/trunk/Objects/moduleobject.c ============================================================================== --- python/trunk/Objects/moduleobject.c (original) +++ python/trunk/Objects/moduleobject.c Sat Dec 10 19:50:16 2005 @@ -15,7 +15,7 @@ }; PyObject * -PyModule_New(char *name) +PyModule_New(const char *name) { PyModuleObject *m; PyObject *nameobj; @@ -149,10 +149,10 @@ static int module_init(PyModuleObject *m, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"name", "doc", NULL}; + static const char *kwlist[] = {"name", "doc", NULL}; PyObject *dict, *name = Py_None, *doc = Py_None; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "S|O:module.__init__", kwlist, - &name, &doc)) + if (!PyArg_ParseTupleAndKeywords(args, kwds, "S|O:module.__init__", + kwlist, &name, &doc)) return -1; dict = m->md_dict; if (dict == NULL) { Modified: python/trunk/Objects/object.c ============================================================================== --- python/trunk/Objects/object.c (original) +++ python/trunk/Objects/object.c Sat Dec 10 19:50:16 2005 @@ -663,7 +663,7 @@ default_3way_compare(PyObject *v, PyObject *w) { int c; - char *vname, *wname; + const char *vname, *wname; if (v->ob_type == w->ob_type) { /* When comparing these pointers, they must be cast to @@ -1018,7 +1018,7 @@ } PyObject * -PyObject_GetAttrString(PyObject *v, char *name) +PyObject_GetAttrString(PyObject *v, const char *name) { PyObject *w, *res; @@ -1033,7 +1033,7 @@ } int -PyObject_HasAttrString(PyObject *v, char *name) +PyObject_HasAttrString(PyObject *v, const char *name) { PyObject *res = PyObject_GetAttrString(v, name); if (res != NULL) { @@ -1045,7 +1045,7 @@ } int -PyObject_SetAttrString(PyObject *v, char *name, PyObject *w) +PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w) { PyObject *s; int res; @@ -1589,7 +1589,7 @@ */ static int -merge_list_attr(PyObject* dict, PyObject* obj, char *attrname) +merge_list_attr(PyObject* dict, PyObject* obj, const char *attrname) { PyObject *list; int result = 0; Modified: python/trunk/Objects/stringobject.c ============================================================================== --- python/trunk/Objects/stringobject.c (original) +++ python/trunk/Objects/stringobject.c Sat Dec 10 19:50:16 2005 @@ -3325,7 +3325,7 @@ string_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *x = NULL; - static char *kwlist[] = {"object", 0}; + static const char *kwlist[] = {"object", 0}; if (type != &PyString_Type) return str_subtype_new(type, args, kwds); Modified: python/trunk/Objects/structseq.c ============================================================================== --- python/trunk/Objects/structseq.c (original) +++ python/trunk/Objects/structseq.c Sat Dec 10 19:50:16 2005 @@ -97,7 +97,7 @@ PyObject *ob; PyStructSequence *res = NULL; int len, min_len, max_len, i, n_unnamed_fields; - static char *kwlist[] = {"sequence", "dict", 0}; + static const char *kwlist[] = {"sequence", "dict", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:structseq", kwlist, &arg, &dict)) Modified: python/trunk/Objects/tupleobject.c ============================================================================== --- python/trunk/Objects/tupleobject.c (original) +++ python/trunk/Objects/tupleobject.c Sat Dec 10 19:50:16 2005 @@ -528,7 +528,7 @@ tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *arg = NULL; - static char *kwlist[] = {"sequence", 0}; + static const char *kwlist[] = {"sequence", 0}; if (type != &PyTuple_Type) return tuple_subtype_new(type, args, kwds); Modified: python/trunk/Objects/typeobject.c ============================================================================== --- python/trunk/Objects/typeobject.c (original) +++ python/trunk/Objects/typeobject.c Sat Dec 10 19:50:16 2005 @@ -21,7 +21,7 @@ static PyObject * type_name(PyTypeObject *type, void *context) { - char *s; + const char *s; if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { PyHeapTypeObject* et = (PyHeapTypeObject*)type; @@ -1556,7 +1556,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) { PyObject *name, *bases, *dict; - static char *kwlist[] = {"name", "bases", "dict", 0}; + static const char *kwlist[] = {"name", "bases", "dict", 0}; PyObject *slots, *tmp, *newslots; PyTypeObject *type, *base, *tmptype, *winner; PyHeapTypeObject *et; @@ -1856,12 +1856,13 @@ PyObject *doc = PyDict_GetItemString(dict, "__doc__"); if (doc != NULL && PyString_Check(doc)) { const size_t n = (size_t)PyString_GET_SIZE(doc); - type->tp_doc = (char *)PyObject_MALLOC(n+1); - if (type->tp_doc == NULL) { + char *tp_doc = PyObject_MALLOC(n+1); + if (tp_doc == NULL) { Py_DECREF(type); return NULL; } - memcpy(type->tp_doc, PyString_AS_STRING(doc), n+1); + memcpy(tp_doc, PyString_AS_STRING(doc), n+1); + type->tp_doc = tp_doc; } } @@ -2105,7 +2106,10 @@ Py_XDECREF(type->tp_mro); Py_XDECREF(type->tp_cache); Py_XDECREF(type->tp_subclasses); - PyObject_Free(type->tp_doc); + /* A type's tp_doc is heap allocated, unlike the tp_doc slots + * of most other objects. It's okay to cast it to char *. + */ + PyObject_Free((char *)type->tp_doc); Py_XDECREF(et->name); Py_XDECREF(et->slots); type->ob_type->tp_free((PyObject *)type); Modified: python/trunk/Objects/unicodeobject.c ============================================================================== --- python/trunk/Objects/unicodeobject.c (original) +++ python/trunk/Objects/unicodeobject.c Sat Dec 10 19:50:16 2005 @@ -7238,7 +7238,7 @@ unicode_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *x = NULL; - static char *kwlist[] = {"string", "encoding", "errors", 0}; + static const char *kwlist[] = {"string", "encoding", "errors", 0}; char *encoding = NULL; char *errors = NULL; Modified: python/trunk/Objects/weakrefobject.c ============================================================================== --- python/trunk/Objects/weakrefobject.c (original) +++ python/trunk/Objects/weakrefobject.c Sat Dec 10 19:50:16 2005 @@ -126,7 +126,7 @@ static PyObject * weakref_call(PyWeakReference *self, PyObject *args, PyObject *kw) { - static char *argnames[] = {NULL}; + static const char *argnames[] = {NULL}; if (PyArg_ParseTupleAndKeywords(args, kw, ":__call__", argnames)) { PyObject *object = PyWeakref_GET_OBJECT(self); Modified: python/trunk/Python/bltinmodule.c ============================================================================== --- python/trunk/Python/bltinmodule.c (original) +++ python/trunk/Python/bltinmodule.c Sat Dec 10 19:50:16 2005 @@ -1907,7 +1907,7 @@ { PyObject *newlist, *v, *seq, *compare=NULL, *keyfunc=NULL, *newargs; PyObject *callable; - static char *kwlist[] = {"iterable", "cmp", "key", "reverse", 0}; + static const char *kwlist[] = {"iterable", "cmp", "key", "reverse", 0}; long reverse; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OOi:sorted", Modified: python/trunk/Python/ceval.c ============================================================================== --- python/trunk/Python/ceval.c (original) +++ python/trunk/Python/ceval.c Sat Dec 10 19:50:16 2005 @@ -3434,7 +3434,7 @@ return result; } -char * +const char * PyEval_GetFuncName(PyObject *func) { if (PyMethod_Check(func)) @@ -3453,7 +3453,7 @@ } } -char * +const char * PyEval_GetFuncDesc(PyObject *func) { if (PyMethod_Check(func)) Modified: python/trunk/Python/getargs.c ============================================================================== --- python/trunk/Python/getargs.c (original) +++ python/trunk/Python/getargs.c Sat Dec 10 19:50:16 2005 @@ -6,33 +6,33 @@ #include -int PyArg_Parse(PyObject *, char *, ...); -int PyArg_ParseTuple(PyObject *, char *, ...); -int PyArg_VaParse(PyObject *, char *, va_list); +int PyArg_Parse(PyObject *, const char *, ...); +int PyArg_ParseTuple(PyObject *, const char *, ...); +int PyArg_VaParse(PyObject *, const char *, va_list); int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, - char *, char **, ...); + const char *, const char **, ...); int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, - char *, char **, va_list); + const char *, const char **, va_list); /* Forward */ -static int vgetargs1(PyObject *, char *, va_list *, int); -static void seterror(int, char *, int *, char *, char *); -static char *convertitem(PyObject *, char **, va_list *, int *, char *, +static int vgetargs1(PyObject *, const char *, va_list *, int); +static void seterror(int, const char *, int *, const char *, const char *); +static char *convertitem(PyObject *, const char **, va_list *, int *, char *, size_t, PyObject **); -static char *converttuple(PyObject *, char **, va_list *, +static char *converttuple(PyObject *, const char **, va_list *, int *, char *, size_t, int, PyObject **); -static char *convertsimple(PyObject *, char **, va_list *, char *, +static char *convertsimple(PyObject *, const char **, va_list *, char *, size_t, PyObject **); static int convertbuffer(PyObject *, void **p, char **); static int vgetargskeywords(PyObject *, PyObject *, - char *, char **, va_list *); -static char *skipitem(char **, va_list *); + const char *, const char **, va_list *); +static char *skipitem(const char **, va_list *); int -PyArg_Parse(PyObject *args, char *format, ...) +PyArg_Parse(PyObject *args, const char *format, ...) { int retval; va_list va; @@ -45,7 +45,7 @@ int -PyArg_ParseTuple(PyObject *args, char *format, ...) +PyArg_ParseTuple(PyObject *args, const char *format, ...) { int retval; va_list va; @@ -58,7 +58,7 @@ int -PyArg_VaParse(PyObject *args, char *format, va_list va) +PyArg_VaParse(PyObject *args, const char *format, va_list va) { va_list lva; @@ -120,17 +120,17 @@ static int -vgetargs1(PyObject *args, char *format, va_list *p_va, int compat) +vgetargs1(PyObject *args, const char *format, va_list *p_va, int compat) { char msgbuf[256]; int levels[32]; - char *fname = NULL; - char *message = NULL; + const char *fname = NULL; + const char *message = NULL; int min = -1; int max = 0; int level = 0; int endfmt = 0; - char *formatsave = format; + const char *formatsave = format; int i, len; char *msg; PyObject *freelist = NULL; @@ -269,7 +269,8 @@ static void -seterror(int iarg, char *msg, int *levels, char *fname, char *message) +seterror(int iarg, const char *msg, int *levels, const char *fname, + const char *message) { char buf[512]; int i; @@ -324,12 +325,12 @@ */ static char * -converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels, +converttuple(PyObject *arg, const char **p_format, va_list *p_va, int *levels, char *msgbuf, size_t bufsize, int toplevel, PyObject **freelist) { int level = 0; int n = 0; - char *format = *p_format; + const char *format = *p_format; int i; for (;;) { @@ -392,11 +393,11 @@ /* Convert a single item. */ static char * -convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels, +convertitem(PyObject *arg, const char **p_format, va_list *p_va, int *levels, char *msgbuf, size_t bufsize, PyObject **freelist) { char *msg; - char *format = *p_format; + const char *format = *p_format; if (*format == '(' /* ')' */) { format++; @@ -424,7 +425,7 @@ /* Format an error message generated by convertsimple(). */ static char * -converterr(char *expected, PyObject *arg, char *msgbuf, size_t bufsize) +converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) { assert(expected != NULL); assert(arg != NULL); @@ -459,10 +460,10 @@ */ static char * -convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf, - size_t bufsize, PyObject **freelist) +convertsimple(PyObject *arg, const char **p_format, va_list *p_va, + char *msgbuf, size_t bufsize, PyObject **freelist) { - char *format = *p_format; + const char *format = *p_format; char c = *format++; #ifdef Py_USING_UNICODE PyObject *uarg; @@ -1134,8 +1135,8 @@ int PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *keywords, - char *format, - char **kwlist, ...) + const char *format, + const char **kwlist, ...) { int retval; va_list va; @@ -1158,9 +1159,9 @@ int PyArg_VaParseTupleAndKeywords(PyObject *args, - PyObject *keywords, - char *format, - char **kwlist, va_list va) + PyObject *keywords, + const char *format, + const char **kwlist, va_list va) { int retval; va_list lva; @@ -1190,16 +1191,16 @@ static int -vgetargskeywords(PyObject *args, PyObject *keywords, char *format, - char **kwlist, va_list *p_va) +vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, + const char **kwlist, va_list *p_va) { char msgbuf[512]; int levels[32]; - char *fname, *message; + const char *fname, *message; int min, max; - char *formatsave; + const char *formatsave; int i, len, nargs, nkeywords; - char *msg, **p; + const char *msg, **p; PyObject *freelist = NULL; assert(args != NULL && PyTuple_Check(args)); @@ -1269,7 +1270,7 @@ keyword parameter in messages */ if (nkeywords > 0) { for (i = 0; i < nargs; i++) { - char *thiskw = kwlist[i]; + const char *thiskw = kwlist[i]; if (thiskw == NULL) break; if (PyDict_GetItemString(keywords, thiskw)) { @@ -1402,9 +1403,9 @@ static char * -skipitem(char **p_format, va_list *p_va) +skipitem(const char **p_format, va_list *p_va) { - char *format = *p_format; + const char *format = *p_format; char c = *format++; switch (c) { @@ -1518,7 +1519,7 @@ int -PyArg_UnpackTuple(PyObject *args, char *name, int min, int max, ...) +PyArg_UnpackTuple(PyObject *args, const char *name, int min, int max, ...) { int i, l; PyObject **o; @@ -1583,7 +1584,7 @@ * not emtpy, returns 1 otherwise */ int -_PyArg_NoKeywords(char *funcname, PyObject *kw) +_PyArg_NoKeywords(const char *funcname, PyObject *kw) { if (kw == NULL) return 1; @@ -1598,6 +1599,3 @@ funcname); return 0; } - - - Modified: python/trunk/Python/import.c ============================================================================== --- python/trunk/Python/import.c (original) +++ python/trunk/Python/import.c Sat Dec 10 19:50:16 2005 @@ -555,7 +555,7 @@ 'NEW' REFERENCE! */ PyObject * -PyImport_AddModule(char *name) +PyImport_AddModule(const char *name) { PyObject *modules = PyImport_GetModuleDict(); PyObject *m; @@ -1875,7 +1875,7 @@ its module object WITH INCREMENTED REFERENCE COUNT */ PyObject * -PyImport_ImportModule(char *name) +PyImport_ImportModule(const char *name) { PyObject *pname; PyObject *result; Modified: python/trunk/Python/modsupport.c ============================================================================== --- python/trunk/Python/modsupport.c (original) +++ python/trunk/Python/modsupport.c Sat Dec 10 19:50:16 2005 @@ -26,7 +26,7 @@ This Python has API version %d, module %.100s has version %d."; PyObject * -Py_InitModule4(char *name, PyMethodDef *methods, char *doc, +Py_InitModule4(const char *name, PyMethodDef *methods, const char *doc, PyObject *passthrough, int module_api_version) { PyObject *m, *d, *v, *n; @@ -99,7 +99,7 @@ /* Helper for mkvalue() to scan the length of a format */ static int -countformat(char *format, int endchar) +countformat(const char *format, int endchar) { int count = 0; int level = 0; @@ -142,14 +142,14 @@ /* Generic function to create a value -- the inverse of getargs() */ /* After an original idea and first implementation by Steven Miale */ -static PyObject *do_mktuple(char**, va_list *, int, int); -static PyObject *do_mklist(char**, va_list *, int, int); -static PyObject *do_mkdict(char**, va_list *, int, int); -static PyObject *do_mkvalue(char**, va_list *); +static PyObject *do_mktuple(const char**, va_list *, int, int); +static PyObject *do_mklist(const char**, va_list *, int, int); +static PyObject *do_mkdict(const char**, va_list *, int, int); +static PyObject *do_mkvalue(const char**, va_list *); static PyObject * -do_mkdict(char **p_format, va_list *p_va, int endchar, int n) +do_mkdict(const char **p_format, va_list *p_va, int endchar, int n) { PyObject *d; int i; @@ -195,7 +195,7 @@ } static PyObject * -do_mklist(char **p_format, va_list *p_va, int endchar, int n) +do_mklist(const char **p_format, va_list *p_va, int endchar, int n) { PyObject *v; int i; @@ -242,7 +242,7 @@ #endif static PyObject * -do_mktuple(char **p_format, va_list *p_va, int endchar, int n) +do_mktuple(const char **p_format, va_list *p_va, int endchar, int n) { PyObject *v; int i; @@ -278,7 +278,7 @@ } static PyObject * -do_mkvalue(char **p_format, va_list *p_va) +do_mkvalue(const char **p_format, va_list *p_va) { for (;;) { switch (*(*p_format)++) { @@ -454,7 +454,7 @@ PyObject * -Py_BuildValue(char *format, ...) +Py_BuildValue(const char *format, ...) { va_list va; PyObject* retval; @@ -465,9 +465,9 @@ } PyObject * -Py_VaBuildValue(char *format, va_list va) +Py_VaBuildValue(const char *format, va_list va) { - char *f = format; + const char *f = format; int n = countformat(f, '\0'); va_list lva; @@ -494,7 +494,7 @@ PyObject * -PyEval_CallFunction(PyObject *obj, char *format, ...) +PyEval_CallFunction(PyObject *obj, const char *format, ...) { va_list vargs; PyObject *args; @@ -516,7 +516,7 @@ PyObject * -PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...) +PyEval_CallMethod(PyObject *obj, const char *methodname, const char *format, ...) { va_list vargs; PyObject *meth; @@ -545,7 +545,7 @@ } int -PyModule_AddObject(PyObject *m, char *name, PyObject *o) +PyModule_AddObject(PyObject *m, const char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { @@ -574,13 +574,13 @@ } int -PyModule_AddIntConstant(PyObject *m, char *name, long value) +PyModule_AddIntConstant(PyObject *m, const char *name, long value) { return PyModule_AddObject(m, name, PyInt_FromLong(value)); } int -PyModule_AddStringConstant(PyObject *m, char *name, char *value) +PyModule_AddStringConstant(PyObject *m, const char *name, const char *value) { return PyModule_AddObject(m, name, PyString_FromString(value)); } From python-checkins at python.org Sun Dec 11 18:19:32 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 11 Dec 2005 18:19:32 +0100 (CET) Subject: [Python-checkins] commit of r41639 - projects projects/martin.v.loewis Message-ID: <20051211171932.99D5F1E4002@bag.python.org> Author: martin.v.loewis Date: Sun Dec 11 18:19:31 2005 New Revision: 41639 Added: projects/ projects/martin.v.loewis Log: Setup ssh key management. Added: projects/martin.v.loewis ============================================================================== --- (empty file) +++ projects/martin.v.loewis Sun Dec 11 18:19:31 2005 @@ -0,0 +1 @@ +ssh-dss martin at mira From python-checkins at python.org Sun Dec 11 18:27:33 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 11 Dec 2005 18:27:33 +0100 (CET) Subject: [Python-checkins] commit of r41640 - projects sshkeys Message-ID: <20051211172733.23B2E1E4002@bag.python.org> Author: martin.v.loewis Date: Sun Dec 11 18:27:32 2005 New Revision: 41640 Added: sshkeys/ - copied from r41639, projects/ Removed: projects/ Log: fix bogus import From python-checkins at python.org Sun Dec 11 21:08:33 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 11 Dec 2005 21:08:33 +0100 (CET) Subject: [Python-checkins] commit of r41641 - python/trunk/Python/ast.c Message-ID: <20051211200833.9E7FF1E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 11 21:08:33 2005 New Revision: 41641 Modified: python/trunk/Python/ast.c Log: SF #1370197, memory leak - ast_error_finish (in error conditions). Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Sun Dec 11 21:08:33 2005 @@ -179,8 +179,10 @@ return; Py_INCREF(errstr); lineno = PyInt_AsLong(PyTuple_GetItem(value, 1)); - if (lineno == -1) + if (lineno == -1) { + Py_DECREF(errstr); return; + } Py_DECREF(value); loc = PyErr_ProgramText(filename, lineno); @@ -190,8 +192,10 @@ } tmp = Py_BuildValue("(ziOO)", filename, lineno, Py_None, loc); Py_DECREF(loc); - if (!tmp) + if (!tmp) { + Py_DECREF(errstr); return; + } value = Py_BuildValue("(OO)", errstr, tmp); Py_DECREF(errstr); Py_DECREF(tmp); From python-checkins at python.org Sun Dec 11 21:12:41 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 11 Dec 2005 21:12:41 +0100 (CET) Subject: [Python-checkins] commit of r41642 - in python/trunk: Lib/test/test_grammar.py Python/ast.c Message-ID: <20051211201241.A22611E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 11 21:12:40 2005 New Revision: 41642 Modified: python/trunk/Lib/test/test_grammar.py python/trunk/Python/ast.c Log: SF #1377897, Bus error in ast If a line had multiple semi-colons and ended with a semi-colon, we would loop too many times and access a NULL node. Exit the loop early if there are no more children. Modified: python/trunk/Lib/test/test_grammar.py ============================================================================== --- python/trunk/Lib/test/test_grammar.py (original) +++ python/trunk/Lib/test/test_grammar.py Sun Dec 11 21:12:40 2005 @@ -276,6 +276,10 @@ ### simple_stmt: small_stmt (';' small_stmt)* [';'] print 'simple_stmt' x = 1; pass; del x +def foo(): + # verify statments that end with semi-colons + x = 1; pass; del x; +foo() ### small_stmt: expr_stmt | print_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt | exec_stmt # Tested below Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Sun Dec 11 21:12:40 2005 @@ -2562,6 +2562,11 @@ ch = CHILD(ch, 0); REQ(ch, simple_stmt); for (j = 0; j < NCH(ch); j += 2) { + /* statement terminates with a semi-colon ';' */ + if (NCH(CHILD(ch, j)) == 0) { + assert((j + 1) == NCH(ch)); + break; + } s = ast_for_stmt(c, CHILD(ch, j)); if (!s) goto error; From python-checkins at python.org Sun Dec 11 21:55:11 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 11 Dec 2005 21:55:11 +0100 (CET) Subject: [Python-checkins] commit of r41643 - python/trunk/Objects/enumobject.c Message-ID: <20051211205511.7EA8F1E4010@bag.python.org> Author: neal.norwitz Date: Sun Dec 11 21:55:10 2005 New Revision: 41643 Modified: python/trunk/Objects/enumobject.c Log: en_sit will be freed when en is DECREF'd. Don't double free. Modified: python/trunk/Objects/enumobject.c ============================================================================== --- python/trunk/Objects/enumobject.c (original) +++ python/trunk/Objects/enumobject.c Sun Dec 11 21:55:10 2005 @@ -33,7 +33,6 @@ } en->en_result = PyTuple_Pack(2, Py_None, Py_None); if (en->en_result == NULL) { - Py_DECREF(en->en_sit); Py_DECREF(en); return NULL; } From python-checkins at python.org Sun Dec 11 22:18:23 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 11 Dec 2005 22:18:23 +0100 (CET) Subject: [Python-checkins] commit of r41644 - in python/trunk: Include/Python-ast.h Parser/asdl_c.py Python/Python-ast.c Message-ID: <20051211211823.4CD1D1E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 11 22:18:22 2005 New Revision: 41644 Modified: python/trunk/Include/Python-ast.h python/trunk/Parser/asdl_c.py python/trunk/Python/Python-ast.c Log: SF #1373150, diffs in working copy after a build Strip off leading dots and slash so the generated files are the same regardless of whether you configure in the checkout directory or build. If anyone configures in a different directory, we might want a cleaner approach using os.path.*(). Hopefully this is good enough. Modified: python/trunk/Include/Python-ast.h ============================================================================== --- python/trunk/Include/Python-ast.h (original) +++ python/trunk/Include/Python-ast.h Sun Dec 11 22:18:22 2005 @@ -1,4 +1,4 @@ -/* File automatically generated by ./Parser/asdl_c.py */ +/* File automatically generated by Parser/asdl_c.py */ #include "asdl.h" Modified: python/trunk/Parser/asdl_c.py ============================================================================== --- python/trunk/Parser/asdl_c.py (original) +++ python/trunk/Parser/asdl_c.py Sun Dec 11 22:18:22 2005 @@ -638,7 +638,11 @@ v.emit("", 0) def main(srcfile): - auto_gen_msg = '/* File automatically generated by %s */\n' % sys.argv[0] + argv0 = sys.argv[0] + index = argv0.find('/') + if index > 0: + argv0 = argv0[index + 1:] + auto_gen_msg = '/* File automatically generated by %s */\n' % argv0 mod = asdl.parse(srcfile) if not asdl.check(mod): sys.exit(1) Modified: python/trunk/Python/Python-ast.c ============================================================================== --- python/trunk/Python/Python-ast.c (original) +++ python/trunk/Python/Python-ast.c Sun Dec 11 22:18:22 2005 @@ -1,4 +1,4 @@ -/* File automatically generated by ./Parser/asdl_c.py */ +/* File automatically generated by Parser/asdl_c.py */ #include "Python.h" #include "Python-ast.h" From python-checkins at python.org Mon Dec 12 00:33:54 2005 From: python-checkins at python.org (brett.cannon) Date: Mon, 12 Dec 2005 00:33:54 +0100 (CET) Subject: [Python-checkins] commit of r41645 - peps/trunk/pep-0291.txt Message-ID: <20051211233354.74DB51E4002@bag.python.org> Author: brett.cannon Date: Mon Dec 12 00:33:53 2005 New Revision: 41645 Modified: peps/trunk/pep-0291.txt Log: Add mention of features added in 2.4 and thus to be avoided in 2.3 . Also make all lines 70 characters or less. Modified: peps/trunk/pep-0291.txt ============================================================================== --- peps/trunk/pep-0291.txt (original) +++ peps/trunk/pep-0291.txt Mon Dec 12 00:33:53 2005 @@ -58,19 +58,24 @@ ------- ----------------- 1.5.2 string methods, Unicode, list comprehensions, augmented assignment (eg, +=), zip(), import x as y, - dict.setdefault(), print >> f, calling f(*args, **kw), - plus all features below + dict.setdefault(), print >> f, + calling f(*args, **kw), plus all features below - 2.0 nested scopes, rich comparisons, function attributes, - plus all features below + 2.0 nested scopes, rich comparisons, + function attributes, plus all features below 2.1 use of object or new-style classes, iterators, using generators, nested scopes, or // without from __future__ import ... statement, plus all features below - 2.2 bool, True, False, basestring, enumerate(), {}.pop(), - PendingDeprecationWarning, Universal Newlines + 2.2 bool, True, False, basestring, enumerate(), + {}.pop(), PendingDeprecationWarning, + Universal Newlines, plus all features below + + 2.3 generator expressions, multi-line imports, + decorators, int/long unification, set/frozenset, + reversed(), sorted(), "".rsplit() Backward Compatible Packages, Modules, and Tools From python-checkins at python.org Mon Dec 12 03:02:25 2005 From: python-checkins at python.org (andrew.kuchling) Date: Mon, 12 Dec 2005 03:02:25 +0100 (CET) Subject: [Python-checkins] commit of r41646 - python/trunk/Tools/faqwiz/faqconf.py Message-ID: <20051212020225.785801E4007@bag.python.org> Author: andrew.kuchling Date: Mon Dec 12 03:02:24 2005 New Revision: 41646 Modified: python/trunk/Tools/faqwiz/faqconf.py Log: Remove background image Modified: python/trunk/Tools/faqwiz/faqconf.py ============================================================================== --- python/trunk/Tools/faqwiz/faqconf.py (original) +++ python/trunk/Tools/faqwiz/faqconf.py Mon Dec 12 03:02:24 2005 @@ -145,7 +145,7 @@ %(title)s - Author: hyeshik.chang Date: Mon Dec 12 12:48:32 2005 New Revision: 41647 Modified: python/branches/release24-maint/Misc/NEWS python/branches/release24-maint/Modules/cjkcodecs/_codecs_cn.c python/trunk/Misc/NEWS python/trunk/Modules/cjkcodecs/_codecs_cn.c Log: Bug #1290333: Added a workaround for cjkcodecs' _codecs_cn module build problem on AIX. Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Mon Dec 12 12:48:32 2005 @@ -32,6 +32,9 @@ Extension Modules ----------------- +- Bug #1290333: Added a workaround for cjkcodecs' _codecs_cn build + problem on AIX. + - Bug #869197: os.setgroups rejects long integer arguments - Bug #1344508, Fix UNIX mmap leaking file descriptors Modified: python/branches/release24-maint/Modules/cjkcodecs/_codecs_cn.c ============================================================================== --- python/branches/release24-maint/Modules/cjkcodecs/_codecs_cn.c (original) +++ python/branches/release24-maint/Modules/cjkcodecs/_codecs_cn.c Mon Dec 12 12:48:32 2005 @@ -8,6 +8,14 @@ #include "cjkcodecs.h" #include "mappings_cn.h" +/** + * hz is predefined as 100 on AIX. So we undefine it to avoid + * conflict against hz codec's. + */ +#ifdef _AIX +#undef hz +#endif + #define GBK_PREDECODE(dc1, dc2, assi) \ if ((dc1) == 0xa1 && (dc2) == 0xaa) (assi) = 0x2014; \ else if ((dc1) == 0xa8 && (dc2) == 0x44) (assi) = 0x2015; \ Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Mon Dec 12 12:48:32 2005 @@ -186,6 +186,9 @@ Extension Modules ----------------- +- Bug #1290333: Added a workaround for cjkcodecs' _codecs_cn build + problem on AIX. + - Bug #869197: os.setgroups rejects long integer arguments - Bug #1346533, select.poll() doesn't raise an error if timeout > sys.maxint Modified: python/trunk/Modules/cjkcodecs/_codecs_cn.c ============================================================================== --- python/trunk/Modules/cjkcodecs/_codecs_cn.c (original) +++ python/trunk/Modules/cjkcodecs/_codecs_cn.c Mon Dec 12 12:48:32 2005 @@ -8,6 +8,14 @@ #include "cjkcodecs.h" #include "mappings_cn.h" +/** + * hz is predefined as 100 on AIX. So we undefine it to avoid + * conflict against hz codec's. + */ +#ifdef _AIX +#undef hz +#endif + #define GBK_PREDECODE(dc1, dc2, assi) \ if ((dc1) == 0xa1 && (dc2) == 0xaa) (assi) = 0x2014; \ else if ((dc1) == 0xa8 && (dc2) == 0x44) (assi) = 0x2015; \ From python-checkins at python.org Mon Dec 12 15:44:33 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 15:44:33 +0100 (CET) Subject: [Python-checkins] commit of r41648 - external Message-ID: <20051212144433.029221E400F@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 15:44:27 2005 New Revision: 41648 Added: external/ Log: added toplevel directory for externally maintained components From python-checkins at python.org Mon Dec 12 15:45:23 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 15:45:23 +0100 (CET) Subject: [Python-checkins] commit of r41649 - in external/elementtree-1.2.6-20050316: CHANGES PKG-INFO README benchmark.py docs docs/effbot.css docs/index.html docs/pythondoc-elementtree.ElementInclude.html docs/pythondoc-elementtree.ElementPath.html docs/pythondoc-elementtree.ElementTree.html docs/pythondoc-elementtree.HTMLTreeBuilder.html docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html docs/pythondoc-elementtree.SimpleXMLWriter.html docs/pythondoc-elementtree.TidyTools.html docs/pythondoc-elementtree.XMLTreeBuilder.html elementtree elementtree/ElementInclude.py elementtree/ElementPath.py elementtree/ElementTree.py elementtree/HTMLTreeBuilder.py elementtree/SgmlopXMLTreeBuilder.py elementtree/SimpleXMLTreeBuilder.py elementtree/SimpleXMLWriter.py elementtree/TidyHTMLTreeBuilder.py elementtree/TidyTools.py elementtree/XMLTreeBuilder.py elementtree/__init__.py samples samples/simple-ns.xml samples/simple.xml selftest.py setup.py Message-ID: <20051212144523.C70001E400F@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 15:45:19 2005 New Revision: 41649 Added: external/elementtree-1.2.6-20050316/ external/elementtree-1.2.6-20050316/CHANGES external/elementtree-1.2.6-20050316/PKG-INFO external/elementtree-1.2.6-20050316/README external/elementtree-1.2.6-20050316/benchmark.py external/elementtree-1.2.6-20050316/docs/ external/elementtree-1.2.6-20050316/docs/effbot.css external/elementtree-1.2.6-20050316/docs/index.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementInclude.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementPath.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementTree.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.HTMLTreeBuilder.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLWriter.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.TidyTools.html external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.XMLTreeBuilder.html external/elementtree-1.2.6-20050316/elementtree/ external/elementtree-1.2.6-20050316/elementtree/ElementInclude.py external/elementtree-1.2.6-20050316/elementtree/ElementPath.py external/elementtree-1.2.6-20050316/elementtree/ElementTree.py external/elementtree-1.2.6-20050316/elementtree/HTMLTreeBuilder.py external/elementtree-1.2.6-20050316/elementtree/SgmlopXMLTreeBuilder.py external/elementtree-1.2.6-20050316/elementtree/SimpleXMLTreeBuilder.py external/elementtree-1.2.6-20050316/elementtree/SimpleXMLWriter.py external/elementtree-1.2.6-20050316/elementtree/TidyHTMLTreeBuilder.py external/elementtree-1.2.6-20050316/elementtree/TidyTools.py external/elementtree-1.2.6-20050316/elementtree/XMLTreeBuilder.py external/elementtree-1.2.6-20050316/elementtree/__init__.py external/elementtree-1.2.6-20050316/samples/ external/elementtree-1.2.6-20050316/samples/simple-ns.xml external/elementtree-1.2.6-20050316/samples/simple.xml external/elementtree-1.2.6-20050316/selftest.py external/elementtree-1.2.6-20050316/setup.py Log: import elementtree 1.2.6 Added: external/elementtree-1.2.6-20050316/CHANGES ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/CHANGES Mon Dec 12 15:45:19 2005 @@ -0,0 +1,210 @@ +The ElementTree Library +$Id: CHANGES 2326 2005-03-17 07:45:21Z fredrik $ + +*** Changes from release 1.1 to 1.2 *** + +(1.2.6 released) + +- Fixed handling of entities defined in internal DTD's (reported + by Greg Wilson). + +- Fixed serialization under non-standard default encodings (but + using non-standard default encodings is still a lousy idea ;-) + +(1.2.5 released) + +- Added 'iterparse' implementation. This is similar to 'parse', but + returns a stream of events while it builds the tree. By default, + the parser only returns "end" events (for completed elements): + + for event, elem in iterparse(source): + ... + + To get other events, use the "events" option to pass in a tuple + containing the events you want: + + for event, elem in iterparse(source, events=(...)): + ... + + The event tuple can contain one or more of: + + "start" + generated for start tags, after the element has been created + (but before the current element has been fully populated) + "end" + generated for end tags, after all element children has been + created. + "start-ns" + generated when a new namespace scope is opened. for this event, + the elem value is a (prefix, url) tuple. + "end-ns" + generated when the current namespace scope is closed. elem + is None. + + Events arrive asynchronously; the tree is usually more complete + than the events indicate, but this is nothing you can rely on. + + The iterable itself contains context information. In the current + release, the only public context attribute is "root", which is set + to the root element when parsing is finished. To access the con- + text, assign the iterable to a variable before looping over it: + + context = iterparse(source) + for event, elem in context: + ... + root = context.root + +(1.2.4 released) + +- Fixed another FancyTreeBuilder bug on Python 2.3. + +(1.2.3 released) + +- Fixed the FancyTreeBuilder class, which was broken in 1.2.1 + and 1.2.2 (broken for some Python versions, at least). + +(1.2.2 released) + +- Fixed some ASCII/Unicode issues in the HTML parser. You can now + use the parser on documents that mixes encoded 8-bit data with + character references outside the ASCII range. (backported from 1.3) + +(1.2.1 released) + +- Changed XMLTreeBuilder to take advantage of new expat features, if + present. This speeds up parsing quite a bit. (backported from 1.3) + +(1.2c1 released; 1.2 final released) + +- Added 'docs' directory, with PythonDoc documentation for the + ElementTree library. See docs/index.html for an overview. + +(1.2b4 released) + +- Fixed encoding of Unicode element names and attribute names + (reported by Ken Rimey). + +(1.2b3 released) + +- Added default argument to 'findtext'. Note that 'findtext' now + always returns an empty string if a matching element is found, but + has no text content. None is only returned if no element is found, + and no default value is specified. + +- Make sure 'dump' adds a trailing linefeed. + +(1.2b2 released) + +- Added optional tree builder argument to the HTMLTreeBuilder class. + +(1.2b1 released) + +- Added XMLID() helper. This is similar to XML(), but returns both + the root element and a dictionary mapping ID attributes to elements. + +- Added simple SgmlopXMLTreeBuilder module. This is a very fast + parser, but it doesn't yet support namespaces. To use this parser, + you need the sgmlop driver: + + http://effbot.org/zone/sgmlop-index.htm + +- Fixed exception in test suite; the TidyHTMLTreeBuilder class + now raises a RuntimeError exception if the _elementidy module + is not available. + +(1.2a5 released) + +- Fixed problem that could result in repeated use of the same + namespace prefix in the same element (!). + +- Fixed import error in ElementInclude, when using the default + loader (Gustavo Niemeyer). + +(1.2a4 released) + +- Fixed exception when .//tag fails to find matching elements + (reported by Mike Kent) (@XMLTOOLKIT28) + +- Fall back on pre-1.2 find/findtext/findall behaviour if the + ElementPath module is not installed. If you don't need path + support, you can simply copy the ElementTree module to your + own project. + +(1.2a3 released) + +- Added experimental support for XInclude-style preprocessing. The + ElementInclude module expands xi:include elements, using a custom + resolver. The current release ignores xi:fallback elements. + +- Fixed typo in ElementTree.findtext (reported by Thomas Dartsch) + (@XMLTOOLKIT25) + +- Fixed parsing of periods in element names (reported by Brian + Vicente) (@XMLTOOLKIT27) + +(1.2a2 released) + +- Fixed serialization of elements and attributes in the XML default + namespace (http://www.w3.org/XML/1998/namespace). Added "rdf" to + the set of "well-known" namespace prefixes. + +- Added 'makeelement' factory method. Added 'target' argument to + XMLTreeBuilder class. + +(1.2a1 released) + +- Added support for a very limited subset of the abbreviated XPath + syntax. The following location paths are supported: + + tag -- select all subelements with the given tag + . -- select this element + * -- select all subelements + // (empty path) -- select all subelements, on all levels + + Examples: + + p -- select all p subelements + .//a -- select all a sublements, at all sublevels + */img -- select all img grandchildren + ul/li -- select all li elements that are children of ul elements + .//ul/li -- same, but select elements anywhere in the subtree + + Absolute paths (paths starting with a slash) can only be used on + ElementTree instances. To use // on an Element instance, add a + leading period (.). + +*** Changes from release 1.0 to 1.1 *** + +(1.1 final released) + +- Added 'fromstring' and 'tostring' helpers. The 'XML' function is + an alias for 'fromstring', and provides a convenient way to add XML + literals to source code: + + from elementtree.ElementTree import XML + + element = XML('content') + +- Moved XMLTreeBuilder functionality into the ElementTree module. If + all you need is basic XML support, you can simply copy the ElementTree + module to your own project. + +- Added SimpleXMLWriter module. + +(1.1b2 released) + +- Changed default encoding to US-ASCII. Use tree.write(file, "utf-8") + to get the old behaviour. If the tree contains text that cannot be + encoded using the given encoding, the writer uses numerical entities + for all non-ASCII characters in that text segment. + +(1.1b1 released) + +- Map tags and attribute names having the same value to the same + object. This saves space when reading large XML trees, and also + gives a small speedup (less than 10%). + +- Added benchmark script. This script takes a filename argument, and + loads the given file into memory using the XML and SimpleXML tree + builders. For each parser, it reports the document size and the + time needed to parse the document. Added: external/elementtree-1.2.6-20050316/PKG-INFO ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/PKG-INFO Mon Dec 12 15:45:19 2005 @@ -0,0 +1,17 @@ +Metadata-Version: 1.0 +Name: elementtree +Version: 1.2.6-20050316 +Summary: ElementTree - a light-weight XML object model for Python. +Home-page: http://effbot.org/zone/element-index.htm +Author: Fredrik Lundh +Author-email: fredrik at pythonware.com +License: Python (MIT style) +Download-URL: http://effbot.org/downloads#elementtree +Description: The Element type is a flexible container object, designed to store + hierarchical data structures in memory. Element structures can be + converted to and from XML. +Platform: Python 1.5.2 and later. +Classifier: Development Status :: 6 - Mature +Classifier: Operating System :: OS Independent +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: XML Added: external/elementtree-1.2.6-20050316/README ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/README Mon Dec 12 15:45:19 2005 @@ -0,0 +1,130 @@ +$Id: README 2326 2005-03-17 07:45:21Z fredrik $ + +======================= +The elementtree library +======================= + +This kit contains the ElementTree library, a light-weight toolkit for +XML processing in Python. + +For more information on this library, see: + + docs/index.html + http://effbot.org/zone/element.htm + +The modules are designed to work with Python 2.1 and newer. The core +ElementTree module and the SimpleXMLTreeBuilder class also works under +1.5.2 and 2.0. + +Enjoy /F + +fredrik at pythonware.com +http://www.pythonware.com + +-------------------------------------------------------------------- +The ElementTree Library is + +Copyright (c) 1999-2005 by Secret Labs AB +Copyright (c) 1999-2005 by Fredrik Lundh + +By obtaining, using, and/or copying this software and/or its +associated documentation, you agree that you have read, understood, +and will comply with the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its +associated documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appears in all +copies, and that both that copyright notice and this permission notice +appear in supporting documentation, and that the name of Secret Labs +AB or the author not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR 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. +-------------------------------------------------------------------- + +release info +------------ + +This is release 1.2.6 of the ElementTree library. + +For a list of changes in this release, see the CHANGES document. + +The latest version of this library can be downloaded from: + + http://effbot.org/downloads + +Comments, bug reports, and patches are welcome. Send them to +fredrik at pythonware.com. + +Note that this is free software, with limited support. If you need +commercial support on this module, contact fredrik at pythonware.com. + +-------------------------------------------------------------------- +contents +-------------------------------------------------------------------- + +README This file + +CHANGES List of changes in this release. + +elementtree/ + + ElementTree.py Element tree implementation. For a minimal + install, this file is all you need. + + ElementPath.py Element path support module. Adds limited + XPath support to find/findtext/findall. + + ElementInclude.py Element include support module. Adds limited + XInclude support. + + HTMLTreeBuilder.py Element tree builder for HTML. This only + works for mostly well-formed HTML; if you + need something that can parse arbitrary + HTML at least as good as your browser, use + TidyHTMLTreeBuilder or TidyTools (see below). + + XMLTreeBuilder.py Element tree builder for XML (compatibility; + new code should use the tree builder in the + ElementTree module). + + TidyHTMLTreeBuilder.py Element tree builder for HTML, based on the + tidylib library. This tree builder requires + the _elementtidy extension module (available + from http://effbot.org/downloads). + + SimpleXMLTreeBuilder.py Old element tree builder for XML, based on + xmllib, for Python versions where "expat" is + not available. Due to bugs in xmllib, the + namespace support is not reliable (run the + module as a script to find out exactly how + unreliable it is on your Python version...) + + SgmlopXMLTreeBuilder.py Simple element tree builder based on the + SGMLOP parser. Note: The current version + does not support namespaces. + + SimpleXMLWriter.py Simple XML writer + + TidyTools.py Build element trees from HTML, using the + external 'tidy' utility. + +setup.py Build/installation script + +docs/index.html API reference pages. +docs/* + +demo*.py Sample scripts +samples/* Sample data + +selftest.py Selftest (requires Python 2.1 or later) +tidytest.py Selftest for TidyHTMLTreeBuilder components. + +benchmark.py Benchmark script (usage: benchmark.py file) Added: external/elementtree-1.2.6-20050316/benchmark.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/benchmark.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,46 @@ +# $Id: benchmark.py 1757 2004-03-28 17:21:25Z fredrik $ +# simple elementtree benchmark program + +from elementtree import XMLTreeBuilder, SimpleXMLTreeBuilder +from elementtree import SgmlopXMLTreeBuilder +from xml.dom import minidom + +import sys, time + +try: + file = sys.argv[1] +except IndexError: + file = "hamlet.xml" + +def benchmark(file, builder_module): + source = open(file, "rb") + t0 = time.time() + parser = builder_module.TreeBuilder() + while 1: + data = source.read(32768) + if not data: + break + parser.feed(data) + tree = parser.close() + t1 = time.time() + print "%s: %d nodes read in %.3f seconds" % ( + builder_module.__name__, len(tree.getiterator()), t1-t0 + ) + raw_input("press return to continue...") + del tree + +def benchmark_minidom(file): + t0 = time.time() + dom = minidom.parse(file) + t1 = time.time() + print "minidom tree read in %.3f seconds" % (t1-t0) + raw_input("press return to continue...") + del dom + +benchmark(file, XMLTreeBuilder) +benchmark(file, SimpleXMLTreeBuilder) # use xmllib +try: + benchmark(file, SgmlopXMLTreeBuilder) # use sgmlop +except RuntimeError, v: + print "=== SgmlopXMLTreeBuilder not available (%s)" % v +benchmark_minidom(file) Added: external/elementtree-1.2.6-20050316/docs/effbot.css ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/effbot.css Mon Dec 12 15:45:19 2005 @@ -0,0 +1,118 @@ +/* effbot.css */ + +BODY { + font: 100% Georgia, Times, serif; + color: black; + margin: 0px 20px 0px 20px; +} + +#effbot-body { + background: white; + padding: 10px 40px 10px 40px; + max-width: 50em; +} + +#effbot-menu { + display: none; +} + +.adsense { + background: #f8fff8; + border: 1px solid #084; + padding: 10px 4px 4px 4px; +} + +.sidebar { + border: 1px solid #000; + float: right; clear: right; + width: 200px; + background: white; + padding: 10px; + margin: 0px -25px 10px 0px; +} + +/* visual style */ + +P { + line-height: 1.3em; +} + +CODE, PRE { + font: 100% "Courier New", Courier, Monaco, monospace; + color: #042; margin-left: 20px; +} + +H1, H2, H3 { + font-family: Georgia, Times, serif; + color: #084; margin-top: 30px; +} + +H1, H2, { border-top: 1px solid #084; } + +H4, H5, H6 { + font-family: Georgia, Times, serif; + color: #084; margin-top: 15px; +} + +A:link, A:hover { color: #084; } +A:visited { color: #404040; } + +UL LI { list-style-type: square; } + +.title { margin-bottom: 2px; color: #084; } +.info { font-size: 80%; color: #084; margin-top: 0px; } + +.bluebox { color: #084; margin-top: 10px; } + +.highlight { background: #cfc; } +.mark { color: #084; } +.small { font-size: 80%; } +.display { background: #eee; padding: 20px; } + +.note { + background: #efe; + border-top: 1px solid #084; + border-bottom: 1px solid #084; + padding: 2px 20px; +} + +.example { + border-top: medium solid #084; + border-bottom: medium solid #084; + padding: 5px; +} + +.figure { + border-top: medium solid #084; + border-bottom: medium solid #084; + padding: 5px; +} + +.fixme { + background: #eee; + border: 1px solid #084; + padding: 2x 20px; +} + +.simpletable { + border: 1px solid #084; + border-collapse: collapse; +} + +.simpletable TH { + text-align: left; + background: #cfc; + border: 1px solid #084; + margin: 0px; + padding: 1px 5px; +} + +.simpletable TD { + border: 1px solid #084; + margin: 0px; + padding: 5px; +} + +/* xmldiff markup */ +.new { text-decoration: underline; color: red; background: #fff0f0; } +.old { text-decoration: line-through; color: blue; background: #f0f0ff; } Added: external/elementtree-1.2.6-20050316/docs/index.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/index.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,35 @@ + + + + +The elementtree Package + + + +

The elementtree Package

+ +

Package Contents

+ +
+
ElementTree
+
ElementPath
+
ElementInclude
+
HTMLTreeBuilder
+
XMLTreeBuilder
+
SgmlopXMLTreeBuilder
+
SimpleXMLTreeBuilder
+
SimpleXMLWriter
+
TidyTools
+
+ +

Online Resources

+ +
+
Elements and Element Trees (effbot.org)
+
XPath Support in ElementTree 1.2 (effbot.org)
+
XInclude Support in ElementTree 1.2 (effbot.org)
+
Simple XML Processing With elementtree (xml.com)
+
+ + + Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementInclude.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementInclude.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,69 @@ + + + + +The elementtree.ElementInclude Module + + + +

The elementtree.ElementInclude Module

+

Limited XInclude support for the ElementTree package.

+

Module Contents

+
+
default_loader(href, parse, encoding=None) [#]
+
+

Default loader. This loader reads an included resource from disk.

+
+
href
+
+Resource reference.
+
parse
+
+Parse mode. Either "xml" or "text".
+
encoding
+
+Optional text encoding.
+
Returns:
+
+The expanded resource. If the parse mode is "xml", this + is an ElementTree instance. If the parse mode is "text", this + is a Unicode string. If the loader fails, it can return None + or raise an IOError exception.
+
Raises IOError:
+If the loader fails to load the resource.
+

+
+
FatalIncludeError (class) [#]
+
+

Fatal include error.

+

For more information about this class, see The FatalIncludeError Class.

+
+
include(elem, loader=None) [#]
+
+

Expand XInclude directives.

+
+
elem
+
+Root element.
+
loader
+
+Optional resource loader. If omitted, it defaults + to default_loader. If given, it should be a callable + that implements the same interface as default_loader. +
+
Raises FatalIncludeError:
+If the function fails to include a given + resource, or if the tree contains malformed XInclude elements.
+
Raises IOError:
+If the function fails to load a given resource.
+

+
+
+

The FatalIncludeError Class

+
+
FatalIncludeError (class) [#]
+
+

Fatal include error.

+
+
+ Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementPath.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementPath.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,60 @@ + + + + +The elementtree.ElementPath Module + + + +

The elementtree.ElementPath Module

+

Implementation module for XPath support. There's usually no reason +to import this module directly; the ElementTree does this for +you, if needed. +

Module Contents

+
+
_compile(path) [#]
+
+

(Internal) Compile path.

+
+
find(element, path) [#]
+
+

Find first matching object.

+
+
findall(element, path) [#]
+
+

Find all matching objects.

+
+
findtext(element, path, default=None) [#]
+
+

Find text for first matching object.

+
+
Path(path) (class) [#]
+
+

Wrapper for a compiled XPath.

+

For more information about this class, see The Path Class.

+
+
+

The Path Class

+
+
Path(path) (class) [#]
+
+

Wrapper for a compiled XPath.

+
+
__init__(path) [#]
+
+

Create an Path instance from an XPath expression.

+
+
find(element) [#]
+
+

Find first matching object.

+
+
findall(element) [#]
+
+

Find all matching objects.

+
+
findtext(element, default=None) [#]
+
+

Find text for first matching object.

+
+
+ Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementTree.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementTree.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,886 @@ + + + + +The elementtree.ElementTree Module + + + +

The elementtree.ElementTree Module

+

The Element type is a flexible container object, designed to +store hierarchical data structures in memory. The type can be +described as a cross between a list and a dictionary. +

+Each element has a number of properties associated with it: +

    +
  • a tag. This is a string identifying what kind of data +this element represents (the element type, in other words).
  • +
  • a number of attributes, stored in a Python dictionary.
  • +
  • a text string.
  • +
  • an optional tail string.
  • +
  • a number of child elements, stored in a Python sequence
  • +
+ +To create an element instance, use the Element or SubElement factory functions. +

+The ElementTree class can be used to wrap an element +structure, and convert it from and to XML. +

Module Contents

+
+
_ElementInterface(tag, attrib) (class) [#]
+
+

Internal element class.

+

For more information about this class, see The _ElementInterface Class.

+
+
Comment(text=None) ⇒ Element [#]
+
+

Comment element factory. This factory function creates a special +element that will be serialized as an XML comment. +

+The comment string can be either an 8-bit ASCII string or a Unicode +string. + +

+
text
+
+A string containing the comment string.
+
Returns:
+
+An element instance, representing a comment.
+

+
+
dump(elem) [#]
+
+

Writes an element tree or element structure to sys.stdout. This +function should be used for debugging only. +

+The exact output format is implementation dependent. In this +version, it's written as an ordinary XML file. + +

+
elem
+
+An element tree or an individual element.
+

+
+
Element(tag, attrib={}, **extra) ⇒ Element [#]
+
+

Element factory. This function returns an object implementing the +standard Element interface. The exact class or type of that object +is implementation dependent, but it will always be compatible with +the _ElementInterface class in this module. +

+The element name, attribute names, and attribute values can be +either 8-bit ASCII strings or Unicode strings. + +

+
tag
+
+The element name.
+
attrib
+
+An optional dictionary, containing element attributes.
+
**extra
+
+Additional attributes, given as keyword arguments.
+
Returns:
+
+An element instance.
+

+
+
ElementTree(element=None, file=None) (class) [#]
+
+

ElementTree wrapper class.

+
+
element
+
+Optional root element.
+
file=
+
+Optional file handle or name. If given, the + tree is initialized with the contents of this XML file.
+

+

For more information about this class, see The ElementTree Class.

+
+
fromstring (variable) [#]
+
+

Parses an XML document from a string constant. Same as XML. + +

+
source
+
+A string containing XML data.
+
Returns:
+
+An Element instance.
+

+
+
iselement(element) ⇒ flag [#]
+
+

Checks if an object appears to be a valid element object.

+
+
An
+
+element instance.
+
Returns:
+
+A true value if this is an element object.
+

+
+
iterparse(source, events=None) (class) [#]
+
+

Parses an XML document into an element tree incrementally, and reports +what's going on to the user.

+
+
source
+
+A filename or file object containing XML data.
+
events
+
+A list of events to report back. If omitted, only "end" + events are reported.
+
Returns:
+
+A (event, elem) iterator.
+

+

For more information about this class, see The iterparse Class.

+
+
parse(source, parser=None) [#]
+
+

Parses an XML document into an element tree.

+
+
source
+
+A filename or file object containing XML data.
+
parser
+
+An optional parser instance. If not given, the + standard XMLTreeBuilder parser is used. +
+
Returns:
+
+An ElementTree instance
+

+
+
ProcessingInstruction(target, text=None) ⇒ Element [#]
+
+

PI element factory. This factory function creates a special element +that will be serialized as an XML processing instruction.

+
+
target
+
+A string containing the PI target.
+
text
+
+A string containing the PI contents, if any.
+
Returns:
+
+An element instance, representing a PI.
+

+
+
QName(text_or_uri, tag=None) (class) [#]
+
+

QName wrapper.

+
+
text
+
+A string containing the QName value, in the form {uri}local, + or, if the tag argument is given, the URI part of a QName.
+
tag
+
+Optional tag. If given, the first argument is interpreted as + an URI, and this argument is interpreted as a local name.
+
Returns:
+
+An opaque object, representing the QName.
+

+

For more information about this class, see The QName Class.

+
+
SubElement(parent, tag, attrib={}, **extra) ⇒ Element [#]
+
+

Subelement factory. This function creates an element instance, and +appends it to an existing element. +

+The element name, attribute names, and attribute values can be +either 8-bit ASCII strings or Unicode strings. + +

+
parent
+
+The parent element.
+
tag
+
+The subelement name.
+
attrib
+
+An optional dictionary, containing element attributes.
+
**extra
+
+Additional attributes, given as keyword arguments.
+
Returns:
+
+An element instance.
+

+
+
tostring(element, encoding=None) ⇒ string [#]
+
+

Generates a string representation of an XML element, including all +subelements.

+
+
element
+
+An Element instance.
+
Returns:
+
+An encoded string containing the XML data.
+

+
+
TreeBuilder(element_factory=None) (class) [#]
+
+

Generic element structure builder.

+
+
element_factory
+
+Optional element factory. This factory + is called to create new Element instances, as necessary.
+

+

For more information about this class, see The TreeBuilder Class.

+
+
XML(text) ⇒ Element [#]
+
+

Parses an XML document from a string constant. This function can +be used to embed "XML literals" in Python code.

+
+
source
+
+A string containing XML data.
+
Returns:
+
+An Element instance.
+

+
+
XMLID(text) ⇒ (Element, dictionary) [#]
+
+

Parses an XML document from a string constant, and also returns +a dictionary which maps from element id:s to elements.

+
+
source
+
+A string containing XML data.
+
Returns:
+
+A tuple containing an Element instance and a dictionary.
+

+
+
XMLTreeBuilder(html=0, target=None) (class) [#]
+
+

Element structure builder for XML source data, based on the +expat parser.

+
+
target=
+
+Target object. If omitted, the builder uses an + instance of the standard TreeBuilder class. +
+
html=
+
+Predefine HTML entities. This flag is not supported + by the current implementation.
+

+

For more information about this class, see The XMLTreeBuilder Class.

+
+
+

The _ElementInterface Class

+
+
_ElementInterface(tag, attrib) (class) [#]
+
+

Internal element class. This class defines the Element interface, +and provides a reference implementation of this interface. +

+You should not create instances of this class directly. Use the +appropriate factory functions instead, such as Element +and SubElement. + +

+
__delitem__(index) [#]
+
+

Deletes the given subelement.

+
+
index
+
+What subelement to delete.
+
Raises IndexError:
+If the given element does not exist.
+

+
+
__delslice__(start, stop) [#]
+
+

Deletes a number of subelements.

+
+
start
+
+The first subelement to delete.
+
stop
+
+The first subelement to leave in there.
+

+
+
__getitem__(index) [#]
+
+

Returns the given subelement.

+
+
index
+
+What subelement to return.
+
Returns:
+
+The given subelement.
+
Raises IndexError:
+If the given element does not exist.
+

+
+
__getslice__(start, stop) [#]
+
+

Returns a list containing subelements in the given range.

+
+
start
+
+The first subelement to return.
+
stop
+
+The first subelement that shouldn't be returned.
+
Returns:
+
+A sequence object containing subelements.
+

+
+
__len__() [#]
+
+

Returns the number of subelements.

+
+
Returns:
+
+The number of subelements.
+

+
+
__setitem__(index, element) [#]
+
+

Replaces the given subelement.

+
+
index
+
+What subelement to replace.
+
element
+
+The new element value.
+
Raises IndexError:
+If the given element does not exist.
+
Raises AssertionError:
+If element is not a valid object.
+

+
+
__setslice__(start, stop, elements) [#]
+
+

Replaces a number of subelements with elements from a sequence.

+
+
start
+
+The first subelement to replace.
+
stop
+
+The first subelement that shouldn't be replaced.
+
elements
+
+A sequence object with zero or more elements.
+
Raises AssertionError:
+If a sequence member is not a valid object.
+

+
+
append(element) [#]
+
+

Adds a subelement to the end of this element.

+
+
element
+
+The element to add.
+
Raises AssertionError:
+If a sequence member is not a valid object.
+

+
+
attrib [#]
+
+

(Attribute) Element attribute dictionary. Where possible, use +get, +set, +keys, and +items to access +element attributes. +

+
clear() [#]
+
+

Resets an element. This function removes all subelements, clears +all attributes, and sets the text and tail attributes to None.

+
+
find(path) ⇒ Element or None [#]
+
+

Finds the first matching subelement, by tag name or path.

+
+
path
+
+What element to look for.
+
Returns:
+
+The first matching element, or None if no element was found.
+

+
+
findall(path) ⇒ list of Element instances [#]
+
+

Finds all matching subelements, by tag name or path.

+
+
path
+
+What element to look for.
+
Returns:
+
+A list or iterator containing all matching elements, + in document order.
+

+
+
findtext(path, default=None) ⇒ string [#]
+
+

Finds text for the first matching subelement, by tag name or path.

+
+
path
+
+What element to look for.
+
default
+
+What to return if the element was not found.
+
Returns:
+
+The text content of the first matching element, or the + default value no element was found. Note that if the element + has is found, but has no text content, this method returns an + empty string.
+

+
+
get(key, default=None) ⇒ string or None [#]
+
+

Gets an element attribute.

+
+
key
+
+What attribute to look for.
+
default
+
+What to return if the attribute was not found.
+
Returns:
+
+The attribute value, or the default value, if the + attribute was not found.
+

+
+
getchildren() ⇒ list of Element instances [#]
+
+

Returns all subelements. The elements are returned in document +order.

+
+
Returns:
+
+A list of subelements.
+

+
+
getiterator(tag=None) ⇒ list or iterator [#]
+
+

Creates a tree iterator. The iterator loops over this element +and all subelements, in document order, and returns all elements +with a matching tag. +

+If the tree structure is modified during iteration, the result +is undefined. + +

+
tag
+
+What tags to look for (default is to return all elements).
+
Returns:
+
+A list or iterator containing all the matching elements.
+

+
+
insert(index, element) [#]
+
+

Inserts a subelement at the given position in this element.

+
+
index
+
+Where to insert the new subelement.
+
Raises AssertionError:
+If the element is not a valid object.
+

+
+
items() ⇒ list of (string, string) tuples [#]
+
+

Gets element attributes, as a sequence. The attributes are +returned in an arbitrary order.

+
+
Returns:
+
+A list of (name, value) tuples for all attributes.
+

+
+
keys() ⇒ list of strings [#]
+
+

Gets a list of attribute names. The names are returned in an +arbitrary order (just like for an ordinary Python dictionary).

+
+
Returns:
+
+A list of element attribute names.
+

+
+
makeelement(tag, attrib) [#]
+
+

Creates a new element object of the same type as this element.

+
+
tag
+
+Element tag.
+
attrib
+
+Element attributes, given as a dictionary.
+
Returns:
+
+A new element instance.
+

+
+
remove(element) [#]
+
+

Removes a matching subelement. Unlike the find methods, +this method compares elements based on identity, not on tag +value or contents. + +

+
element
+
+What element to remove.
+
Raises ValueError:
+If a matching element could not be found.
+
Raises AssertionError:
+If the element is not a valid object.
+

+
+
set(key, value) [#]
+
+

Sets an element attribute.

+
+
key
+
+What attribute to set.
+
value
+
+The attribute value.
+

+
+
tag [#]
+
+

(Attribute) Element tag.

+
+
tail [#]
+
+

(Attribute) Text after this element's end tag, but before the +next sibling element's start tag. This is either a string or +the value None, if there was no text.

+
+
text [#]
+
+

(Attribute) Text before first subelement. This is either a +string or the value None, if there was no text.

+
+
+

The ElementTree Class

+
+
ElementTree(element=None, file=None) (class) [#]
+
+

ElementTree wrapper class. This class represents an entire element +hierarchy, and adds some extra support for serialization to and from +standard XML.

+
+
element
+
+Optional root element.
+
file=
+
+Optional file handle or name. If given, the + tree is initialized with the contents of this XML file.
+

+
+
_setroot(element) [#]
+
+

Replaces the root element for this tree. This discards the +current contents of the tree, and replaces it with the given +element. Use with care.

+
+
element
+
+An element instance.
+

+
+
find(path) ⇒ Element or None [#]
+
+

Finds the first toplevel element with given tag. +Same as getroot().find(path).

+
+
path
+
+What element to look for.
+
Returns:
+
+The first matching element, or None if no element was found.
+

+
+
findall(path) ⇒ list of Element instances [#]
+
+

Finds all toplevel elements with the given tag. +Same as getroot().findall(path).

+
+
path
+
+What element to look for.
+
Returns:
+
+A list or iterator containing all matching elements, + in document order.
+

+
+
findtext(path, default=None) ⇒ string [#]
+
+

Finds the element text for the first toplevel element with given +tag. Same as getroot().findtext(path).

+
+
path
+
+What toplevel element to look for.
+
default
+
+What to return if the element was not found.
+
Returns:
+
+The text content of the first matching element, or the + default value no element was found. Note that if the element + has is found, but has no text content, this method returns an + empty string.
+

+
+
getiterator(tag=None) ⇒ iterator [#]
+
+

Creates a tree iterator for the root element. The iterator loops +over all elements in this tree, in document order.

+
+
tag
+
+What tags to look for (default is to return all elements)
+
Returns:
+
+An iterator.
+

+
+
getroot() ⇒ Element [#]
+
+

Gets the root element for this tree.

+
+
Returns:
+
+An element instance.
+

+
+
parse(source, parser=None) ⇒ Element [#]
+
+

Loads an external XML document into this element tree.

+
+
source
+
+A file name or file object.
+
parser
+
+An optional parser instance. If not given, the + standard XMLTreeBuilder parser is used. +
+
Returns:
+
+The document root element.
+

+
+
write(file, encoding="us-ascii") [#]
+
+

Writes the element tree to a file, as XML.

+
+
file
+
+A file name, or a file object opened for writing.
+
encoding
+
+Optional output encoding (default is US-ASCII).
+

+
+
+

The iterparse Class

+
+
iterparse(source, events=None) (class) [#]
+
+

Parses an XML document into an element tree incrementally, and reports +what's going on to the user.

+
+
source
+
+A filename or file object containing XML data.
+
events
+
+A list of events to report back. If omitted, only "end" + events are reported.
+
Returns:
+
+A (event, elem) iterator.
+

+
+
+

The QName Class

+
+
QName(text_or_uri, tag=None) (class) [#]
+
+

QName wrapper. This can be used to wrap a QName attribute value, in +order to get proper namespace handling on output.

+
+
text
+
+A string containing the QName value, in the form {uri}local, + or, if the tag argument is given, the URI part of a QName.
+
tag
+
+Optional tag. If given, the first argument is interpreted as + an URI, and this argument is interpreted as a local name.
+
Returns:
+
+An opaque object, representing the QName.
+

+
+
+

The TreeBuilder Class

+
+
TreeBuilder(element_factory=None) (class) [#]
+
+

Generic element structure builder. This builder converts a sequence +of start, data, and end method calls to a well-formed element structure. +

+You can use this class to build an element structure using a custom XML +parser, or a parser for some other XML-like format. + +

+
element_factory
+
+Optional element factory. This factory + is called to create new Element instances, as necessary.
+

+
+
close() ⇒ Element [#]
+
+

Flushes the parser buffers, and returns the toplevel documen +element.

+
+
Returns:
+
+An Element instance.
+

+
+
data(data) [#]
+
+

Adds text to the current element.

+
+
data
+
+A string. This should be either an 8-bit string + containing ASCII text, or a Unicode string.
+

+
+
end(tag) ⇒ Element [#]
+
+

Closes the current element.

+
+
tag
+
+The element name.
+
Returns:
+
+The closed element.
+

+
+
start(tag, attrs) ⇒ Element [#]
+
+

Opens a new element.

+
+
tag
+
+The element name.
+
attrib
+
+A dictionary containing element attributes.
+
Returns:
+
+The opened element.
+

+
+
+

The XMLTreeBuilder Class

+
+
XMLTreeBuilder(html=0, target=None) (class) [#]
+
+

Element structure builder for XML source data, based on the +expat parser. + +

+
target=
+
+Target object. If omitted, the builder uses an + instance of the standard TreeBuilder class. +
+
html=
+
+Predefine HTML entities. This flag is not supported + by the current implementation.
+

+
+
close() ⇒ Element [#]
+
+

Finishes feeding data to the parser.

+
+
Returns:
+
+An element structure.
+

+
+
doctype(name, pubid, system) [#]
+
+

Handles a doctype declaration.

+
+
name
+
+Doctype name.
+
pubid
+
+Public identifier.
+
system
+
+System identifier.
+

+
+
feed(data) [#]
+
+

Feeds data to the parser.

+
+
data
+
+Encoded data.
+

+
+
+ Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.HTMLTreeBuilder.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.HTMLTreeBuilder.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,118 @@ + + + + +The elementtree.HTMLTreeBuilder Module + + + +

The elementtree.HTMLTreeBuilder Module

+

Tools to build element trees from HTML files.

+

Module Contents

+
+
HTMLTreeBuilder(builder=None, encoding=None) (class) [#]
+
+

ElementTree builder for HTML source code.

+
+
builder=
+
+Optional builder object. If omitted, the parser + uses the standard elementtree builder. +
+
encoding=
+
+Optional character encoding, if known. If omitted, + the parser looks for META tags inside the document. If no tags + are found, the parser defaults to ISO-8859-1. Note that if your + document uses a non-ASCII compatible encoding, you must decode + the document before parsing.
+

+

For more information about this class, see The HTMLTreeBuilder Class.

+
+
parse(source, encoding=None) [#]
+
+

Parse an HTML document or document fragment.

+
+
source
+
+A filename or file object containing HTML data.
+
encoding
+
+Optional character encoding, if known. If omitted, + the parser looks for META tags inside the document. If no tags + are found, the parser defaults to ISO-8859-1.
+
Returns:
+
+An ElementTree instance
+

+
+
TreeBuilder (variable) [#]
+
+

An alias for the HTMLTreeBuilder class. +

+
+

The HTMLTreeBuilder Class

+
+
HTMLTreeBuilder(builder=None, encoding=None) (class) [#]
+
+

ElementTree builder for HTML source code. This builder converts an +HTML document or fragment to an ElementTree. +

+The parser is relatively picky, and requires balanced tags for most +elements. However, elements belonging to the following group are +automatically closed: P, LI, TR, TH, and TD. In addition, the +parser automatically inserts end tags immediately after the start +tag, and ignores any end tags for the following group: IMG, HR, +META, and LINK. + +

+
builder=
+
+Optional builder object. If omitted, the parser + uses the standard elementtree builder. +
+
encoding=
+
+Optional character encoding, if known. If omitted, + the parser looks for META tags inside the document. If no tags + are found, the parser defaults to ISO-8859-1. Note that if your + document uses a non-ASCII compatible encoding, you must decode + the document before parsing.
+

+
+
close() [#]
+
+

Flushes parser buffers, and return the root element.

+
+
Returns:
+
+An Element instance.
+

+
+
handle_charref(char) [#]
+
+

(Internal) Handles character references.

+
+
handle_data(data) [#]
+
+

(Internal) Handles character data.

+
+
handle_endtag(tag) [#]
+
+

(Internal) Handles end tags.

+
+
handle_entityref(name) [#]
+
+

(Internal) Handles entity references.

+
+
handle_starttag(tag, attrs) [#]
+
+

(Internal) Handles start tags.

+
+
unknown_entityref(name) [#]
+
+

(Hook) Handles unknown entity references. The default action +is to ignore unknown entities.

+
+
+ Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,50 @@ + + + + +The elementtree.SgmlopXMLTreeBuilder Module + + + +

The elementtree.SgmlopXMLTreeBuilder Module

+

Tools to build element trees from XML, based on the SGMLOP parser. +

+The current version does not support XML namespaces. +

+This tree builder requires the sgmlop extension module +(available from +http://effbot.org/downloads). +

Module Contents

+
+
TreeBuilder(html=0) (class) [#]
+
+

ElementTree builder for XML source data, based on the SGMLOP parser.

+

For more information about this class, see The TreeBuilder Class.

+
+
+

The TreeBuilder Class

+
+
TreeBuilder(html=0) (class) [#]
+
+

ElementTree builder for XML source data, based on the SGMLOP parser.

+
+
close() ⇒ Element [#]
+
+

Finishes feeding data to the parser.

+
+
Returns:
+
+An element structure.
+

+
+
feed(data) [#]
+
+

Feeds data to the parser.

+
+
data
+
+Encoded data.
+

+
+
+ Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,50 @@ + + + + +The elementtree.SimpleXMLTreeBuilder Module + + + +

The elementtree.SimpleXMLTreeBuilder Module

+

Tools to build element trees from XML files, using xmllib. +This module can be used instead of the standard tree builder, for +Python versions where "expat" is not available (such as 1.5.2). +

+Note that due to bugs in xmllib, the namespace support is +not reliable (you can run the module as a script to find out exactly +how unreliable it is on your Python version). +

Module Contents

+
+
TreeBuilder(html=0) (class) [#]
+
+

ElementTree builder for XML source data.

+

For more information about this class, see The TreeBuilder Class.

+
+
+

The TreeBuilder Class

+
+
TreeBuilder(html=0) (class) [#]
+
+

ElementTree builder for XML source data.

+
+
close() ⇒ Element [#]
+
+

Finishes feeding data to the parser.

+
+
Returns:
+
+An element structure.
+

+
+
feed(data) [#]
+
+

Feeds data to the parser.

+
+
data
+
+Encoded data.
+

+
+
+ Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLWriter.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLWriter.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,161 @@ + + + + +The elementtree.SimpleXMLWriter Module + + + +

The elementtree.SimpleXMLWriter Module

+

Tools to write XML files, without having to deal with encoding +issues, well-formedness, etc. +

+The current version does not provide built-in support for +namespaces. To create files using namespaces, you have to provide +"xmlns" attributes and explicitly add prefixes to tags and +attributes. + +

Patterns

+ +The following example generates a small XHTML document. +
+
+from elementtree.SimpleXMLWriter import XMLWriter
+import sys
+
+w = XMLWriter(sys.stdout)
+
+html = w.start("html")
+
+w.start("head")
+w.element("title", "my document")
+w.element("meta", name="generator", value="my application 1.0")
+w.end()
+
+w.start("body")
+w.element("h1", "this is a heading")
+w.element("p", "this is a paragraph")
+
+w.start("p")
+w.data("this is ")
+w.element("b", "bold")
+w.data(" and ")
+w.element("i", "italic")
+w.data(".")
+w.end("p")
+
+w.close(html)
+
+

Module Contents

+
+
XMLWriter(file, encoding="us-ascii") (class) [#]
+
+

XML writer class.

+
+
file
+
+A file or file-like object. This object must implement + a write method that takes an 8-bit string. +
+
encoding
+
+Optional encoding.
+

+

For more information about this class, see The XMLWriter Class.

+
+
+

The XMLWriter Class

+
+
XMLWriter(file, encoding="us-ascii") (class) [#]
+
+

XML writer class.

+
+
file
+
+A file or file-like object. This object must implement + a write method that takes an 8-bit string. +
+
encoding
+
+Optional encoding.
+

+
+
close(id) [#]
+
+

Closes open elements, up to (and including) the element identified +by the given identifier.

+
+
id
+
+Element identifier, as returned by the start method. +
+

+
+
comment(comment) [#]
+
+

Adds a comment to the output stream.

+
+
comment
+
+Comment text, as an 8-bit string or Unicode string.
+

+
+
data(text) [#]
+
+

Adds character data to the output stream.

+
+
text
+
+Character data, as an 8-bit string or Unicode string.
+

+
+
declaration() [#]
+
+

Writes an XML declaration.

+
+
element(tag, text=None, attrib={}, **extra) [#]
+
+

Adds an entire element. This is the same as calling start, +data, and end in sequence. The text argument +can be omitted. +

+
end(tag=None) [#]
+
+

Closes the current element (opened by the most recent call to +start). + +

+
tag
+
+Element tag. If given, the tag must match the start + tag. If omitted, the current element is closed.
+

+
+
flush() [#]
+
+

Flushes the output stream.

+
+
start(tag, attrib={}, **extra) [#]
+
+

Opens a new element. Attributes can be given as keyword +arguments, or as a string/string dictionary. You can pass in +8-bit strings or Unicode strings; the former are assumed to use +the encoding passed to the constructor. The method returns an +opaque identifier that can be passed to the close method, +to close all open elements up to and including this one. + +

+
tag
+
+Element tag.
+
attrib
+
+Attribute dictionary. Alternatively, attributes + can be given as keyword arguments.
+
Returns:
+
+An element identifier.
+

+
+
+ Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.TidyTools.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.TidyTools.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,65 @@ + + + + +The elementtree.TidyTools Module + + + +

The elementtree.TidyTools Module

+

Tools to build element trees from HTML, using the external tidy +utility. +

Module Contents

+
+
getbody(file, **options) [#]
+
+

Get document body from a an HTML or HTML-like file. This function +uses the tidy function to convert HTML to XHTML, and cleans +up the resulting XML tree. + +

+
file
+
+Filename.
+
Returns:
+
+A body element, or None if not successful. +
+

+
+
getzonebody(file, **options) [#]
+
+

Same as getbody, but turns plain text at the start of the +document into an H1 tag. This function can be used to parse zone +documents. + +

+
file
+
+Filename.
+
Returns:
+
+A body element, or None if not successful. +
+

+
+
tidy(file, new_inline_tags=None) [#]
+
+

Convert an HTML or HTML-like file to XHTML, using the tidy +command line utility. + +

+
file
+
+Filename.
+
new_inline_tags
+
+An optional list of valid but non-standard + inline tags.
+
Returns:
+
+An element tree, or None if not successful.
+

+
+
+ Added: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.XMLTreeBuilder.html ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.XMLTreeBuilder.html Mon Dec 12 15:45:19 2005 @@ -0,0 +1,70 @@ + + + + +The elementtree.XMLTreeBuilder Module + + + +

The elementtree.XMLTreeBuilder Module

+

Tools to build element trees from XML files.

+

Module Contents

+
+
FancyTreeBuilder(html=0) (class) [#]
+
+

(experimental) An alternate builder that supports manipulation of +new elements.

+

For more information about this class, see The FancyTreeBuilder Class.

+
+
TreeBuilder (class) [#]
+
+

(obsolete) ElementTree builder for XML source data, based on the +expat parser.

+

For more information about this class, see The TreeBuilder Class.

+
+
+

The FancyTreeBuilder Class

+
+
FancyTreeBuilder(html=0) (class) [#]
+
+

(experimental) An alternate builder that supports manipulation of +new elements.

+
+
end(element) [#]
+
+

Hook method that's called when a new element has been closed. +May access the namespaces attribute. + +

+
element
+
+The new element.
+

+
+
start(element) [#]
+
+

Hook method that's called when a new element has been opened. +May access the namespaces attribute. + +

+
element
+
+The new element. The tag name and attributes are, + set, but it has no children, and the text and tail attributes + are still empty.
+

+
+
+

The TreeBuilder Class

+
+
TreeBuilder (class) [#]
+
+

(obsolete) ElementTree builder for XML source data, based on the +expat parser. +

+This class is an alias for ElementTree.XMLTreeBuilder. New code +should use that version instead. + +

+
+ Added: external/elementtree-1.2.6-20050316/elementtree/ElementInclude.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/ElementInclude.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,141 @@ +# +# ElementTree +# $Id: ElementInclude.py 1862 2004-06-18 07:31:02Z Fredrik $ +# +# limited xinclude support for element trees +# +# history: +# 2003-08-15 fl created +# 2003-11-14 fl fixed default loader +# +# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Limited XInclude support for the ElementTree package. +## + +import copy +import ElementTree + +XINCLUDE = "{http://www.w3.org/2001/XInclude}" + +XINCLUDE_INCLUDE = XINCLUDE + "include" +XINCLUDE_FALLBACK = XINCLUDE + "fallback" + +## +# Fatal include error. + +class FatalIncludeError(SyntaxError): + pass + +## +# Default loader. This loader reads an included resource from disk. +# +# @param href Resource reference. +# @param parse Parse mode. Either "xml" or "text". +# @param encoding Optional text encoding. +# @return The expanded resource. If the parse mode is "xml", this +# is an ElementTree instance. If the parse mode is "text", this +# is a Unicode string. If the loader fails, it can return None +# or raise an IOError exception. +# @throws IOError If the loader fails to load the resource. + +def default_loader(href, parse, encoding=None): + file = open(href) + if parse == "xml": + data = ElementTree.parse(file).getroot() + else: + data = file.read() + if encoding: + data = data.decode(encoding) + file.close() + return data + +## +# Expand XInclude directives. +# +# @param elem Root element. +# @param loader Optional resource loader. If omitted, it defaults +# to {@link default_loader}. If given, it should be a callable +# that implements the same interface as default_loader. +# @throws FatalIncludeError If the function fails to include a given +# resource, or if the tree contains malformed XInclude elements. +# @throws IOError If the function fails to load a given resource. + +def include(elem, loader=None): + if loader is None: + loader = default_loader + # look for xinclude elements + i = 0 + while i < len(elem): + e = elem[i] + if e.tag == XINCLUDE_INCLUDE: + # process xinclude directive + href = e.get("href") + parse = e.get("parse", "xml") + if parse == "xml": + node = loader(href, parse) + if node is None: + raise FatalIncludeError( + "cannot load %r as %r" % (href, parse) + ) + node = copy.copy(node) + if e.tail: + node.tail = (node.tail or "") + e.tail + elem[i] = node + elif parse == "text": + text = loader(href, parse, e.get("encoding")) + if text is None: + raise FatalIncludeError( + "cannot load %r as %r" % (href, parse) + ) + if i: + node = elem[i-1] + node.tail = (node.tail or "") + text + else: + elem.text = (elem.text or "") + text + (e.tail or "") + del elem[i] + continue + else: + raise FatalIncludeError( + "unknown parse type in xi:include tag (%r)" % parse + ) + elif e.tag == XINCLUDE_FALLBACK: + raise FatalIncludeError( + "xi:fallback tag must be child of xi:include (%r)" % e.tag + ) + else: + include(e, loader) + i = i + 1 + Added: external/elementtree-1.2.6-20050316/elementtree/ElementPath.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/ElementPath.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,196 @@ +# +# ElementTree +# $Id: ElementPath.py 1858 2004-06-17 21:31:41Z Fredrik $ +# +# limited xpath support for element trees +# +# history: +# 2003-05-23 fl created +# 2003-05-28 fl added support for // etc +# 2003-08-27 fl fixed parsing of periods in element names +# +# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Implementation module for XPath support. There's usually no reason +# to import this module directly; the ElementTree does this for +# you, if needed. +## + +import re + +xpath_tokenizer = re.compile( + "(::|\.\.|\(\)|[/.*:\[\]\(\)@=])|((?:\{[^}]+\})?[^/:\[\]\(\)@=\s]+)|\s+" + ).findall + +class xpath_descendant_or_self: + pass + +## +# Wrapper for a compiled XPath. + +class Path: + + ## + # Create an Path instance from an XPath expression. + + def __init__(self, path): + tokens = xpath_tokenizer(path) + # the current version supports 'path/path'-style expressions only + self.path = [] + self.tag = None + if tokens and tokens[0][0] == "/": + raise SyntaxError("cannot use absolute path on element") + while tokens: + op, tag = tokens.pop(0) + if tag or op == "*": + self.path.append(tag or op) + elif op == ".": + pass + elif op == "/": + self.path.append(xpath_descendant_or_self()) + continue + else: + raise SyntaxError("unsupported path syntax (%s)" % op) + if tokens: + op, tag = tokens.pop(0) + if op != "/": + raise SyntaxError( + "expected path separator (%s)" % (op or tag) + ) + if self.path and isinstance(self.path[-1], xpath_descendant_or_self): + raise SyntaxError("path cannot end with //") + if len(self.path) == 1 and isinstance(self.path[0], type("")): + self.tag = self.path[0] + + ## + # Find first matching object. + + def find(self, element): + tag = self.tag + if tag is None: + nodeset = self.findall(element) + if not nodeset: + return None + return nodeset[0] + for elem in element: + if elem.tag == tag: + return elem + return None + + ## + # Find text for first matching object. + + def findtext(self, element, default=None): + tag = self.tag + if tag is None: + nodeset = self.findall(element) + if not nodeset: + return default + return nodeset[0].text or "" + for elem in element: + if elem.tag == tag: + return elem.text or "" + return default + + ## + # Find all matching objects. + + def findall(self, element): + nodeset = [element] + index = 0 + while 1: + try: + path = self.path[index] + index = index + 1 + except IndexError: + return nodeset + set = [] + if isinstance(path, xpath_descendant_or_self): + try: + tag = self.path[index] + if not isinstance(tag, type("")): + tag = None + else: + index = index + 1 + except IndexError: + tag = None # invalid path + for node in nodeset: + new = list(node.getiterator(tag)) + if new and new[0] is node: + set.extend(new[1:]) + else: + set.extend(new) + else: + for node in nodeset: + for node in node: + if path == "*" or node.tag == path: + set.append(node) + if not set: + return [] + nodeset = set + +_cache = {} + +## +# (Internal) Compile path. + +def _compile(path): + p = _cache.get(path) + if p is not None: + return p + p = Path(path) + if len(_cache) >= 100: + _cache.clear() + _cache[path] = p + return p + +## +# Find first matching object. + +def find(element, path): + return _compile(path).find(element) + +## +# Find text for first matching object. + +def findtext(element, path, default=None): + return _compile(path).findtext(element, default) + +## +# Find all matching objects. + +def findall(element, path): + return _compile(path).findall(element) + Added: external/elementtree-1.2.6-20050316/elementtree/ElementTree.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/ElementTree.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,1254 @@ +# +# ElementTree +# $Id: ElementTree.py 2326 2005-03-17 07:45:21Z fredrik $ +# +# light-weight XML support for Python 1.5.2 and later. +# +# history: +# 2001-10-20 fl created (from various sources) +# 2001-11-01 fl return root from parse method +# 2002-02-16 fl sort attributes in lexical order +# 2002-04-06 fl TreeBuilder refactoring, added PythonDoc markup +# 2002-05-01 fl finished TreeBuilder refactoring +# 2002-07-14 fl added basic namespace support to ElementTree.write +# 2002-07-25 fl added QName attribute support +# 2002-10-20 fl fixed encoding in write +# 2002-11-24 fl changed default encoding to ascii; fixed attribute encoding +# 2002-11-27 fl accept file objects or file names for parse/write +# 2002-12-04 fl moved XMLTreeBuilder back to this module +# 2003-01-11 fl fixed entity encoding glitch for us-ascii +# 2003-02-13 fl added XML literal factory +# 2003-02-21 fl added ProcessingInstruction/PI factory +# 2003-05-11 fl added tostring/fromstring helpers +# 2003-05-26 fl added ElementPath support +# 2003-07-05 fl added makeelement factory method +# 2003-07-28 fl added more well-known namespace prefixes +# 2003-08-15 fl fixed typo in ElementTree.findtext (Thomas Dartsch) +# 2003-09-04 fl fall back on emulator if ElementPath is not installed +# 2003-10-31 fl markup updates +# 2003-11-15 fl fixed nested namespace bug +# 2004-03-28 fl added XMLID helper +# 2004-06-02 fl added default support to findtext +# 2004-06-08 fl fixed encoding of non-ascii element/attribute names +# 2004-08-23 fl take advantage of post-2.1 expat features +# 2005-02-01 fl added iterparse implementation +# 2005-03-02 fl fixed iterparse support for pre-2.2 versions +# +# Copyright (c) 1999-2005 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2005 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +__all__ = [ + # public symbols + "Comment", + "dump", + "Element", "ElementTree", + "fromstring", + "iselement", "iterparse", + "parse", + "PI", "ProcessingInstruction", + "QName", + "SubElement", + "tostring", + "TreeBuilder", + "VERSION", "XML", + "XMLTreeBuilder", + ] + +## +# The Element type is a flexible container object, designed to +# store hierarchical data structures in memory. The type can be +# described as a cross between a list and a dictionary. +#

+# Each element has a number of properties associated with it: +#

    +#
  • a tag. This is a string identifying what kind of data +# this element represents (the element type, in other words).
  • +#
  • a number of attributes, stored in a Python dictionary.
  • +#
  • a text string.
  • +#
  • an optional tail string.
  • +#
  • a number of child elements, stored in a Python sequence
  • +#
+# +# To create an element instance, use the {@link #Element} or {@link +# #SubElement} factory functions. +#

+# The {@link #ElementTree} class can be used to wrap an element +# structure, and convert it from and to XML. +## + +import string, sys, re + +class _SimpleElementPath: + # emulate pre-1.2 find/findtext/findall behaviour + def find(self, element, tag): + for elem in element: + if elem.tag == tag: + return elem + return None + def findtext(self, element, tag, default=None): + for elem in element: + if elem.tag == tag: + return elem.text or "" + return default + def findall(self, element, tag): + if tag[:3] == ".//": + return element.getiterator(tag[3:]) + result = [] + for elem in element: + if elem.tag == tag: + result.append(elem) + return result + +try: + import ElementPath +except ImportError: + # FIXME: issue warning in this case? + ElementPath = _SimpleElementPath() + +# TODO: add support for custom namespace resolvers/default namespaces +# TODO: add improved support for incremental parsing + +VERSION = "1.2.6" + +## +# Internal element class. This class defines the Element interface, +# and provides a reference implementation of this interface. +#

+# You should not create instances of this class directly. Use the +# appropriate factory functions instead, such as {@link #Element} +# and {@link #SubElement}. +# +# @see Element +# @see SubElement +# @see Comment +# @see ProcessingInstruction + +class _ElementInterface: + # text...tail + + ## + # (Attribute) Element tag. + + tag = None + + ## + # (Attribute) Element attribute dictionary. Where possible, use + # {@link #_ElementInterface.get}, + # {@link #_ElementInterface.set}, + # {@link #_ElementInterface.keys}, and + # {@link #_ElementInterface.items} to access + # element attributes. + + attrib = None + + ## + # (Attribute) Text before first subelement. This is either a + # string or the value None, if there was no text. + + text = None + + ## + # (Attribute) Text after this element's end tag, but before the + # next sibling element's start tag. This is either a string or + # the value None, if there was no text. + + tail = None # text after end tag, if any + + def __init__(self, tag, attrib): + self.tag = tag + self.attrib = attrib + self._children = [] + + def __repr__(self): + return "" % (self.tag, id(self)) + + ## + # Creates a new element object of the same type as this element. + # + # @param tag Element tag. + # @param attrib Element attributes, given as a dictionary. + # @return A new element instance. + + def makeelement(self, tag, attrib): + return Element(tag, attrib) + + ## + # Returns the number of subelements. + # + # @return The number of subelements. + + def __len__(self): + return len(self._children) + + ## + # Returns the given subelement. + # + # @param index What subelement to return. + # @return The given subelement. + # @exception IndexError If the given element does not exist. + + def __getitem__(self, index): + return self._children[index] + + ## + # Replaces the given subelement. + # + # @param index What subelement to replace. + # @param element The new element value. + # @exception IndexError If the given element does not exist. + # @exception AssertionError If element is not a valid object. + + def __setitem__(self, index, element): + assert iselement(element) + self._children[index] = element + + ## + # Deletes the given subelement. + # + # @param index What subelement to delete. + # @exception IndexError If the given element does not exist. + + def __delitem__(self, index): + del self._children[index] + + ## + # Returns a list containing subelements in the given range. + # + # @param start The first subelement to return. + # @param stop The first subelement that shouldn't be returned. + # @return A sequence object containing subelements. + + def __getslice__(self, start, stop): + return self._children[start:stop] + + ## + # Replaces a number of subelements with elements from a sequence. + # + # @param start The first subelement to replace. + # @param stop The first subelement that shouldn't be replaced. + # @param elements A sequence object with zero or more elements. + # @exception AssertionError If a sequence member is not a valid object. + + def __setslice__(self, start, stop, elements): + for element in elements: + assert iselement(element) + self._children[start:stop] = list(elements) + + ## + # Deletes a number of subelements. + # + # @param start The first subelement to delete. + # @param stop The first subelement to leave in there. + + def __delslice__(self, start, stop): + del self._children[start:stop] + + ## + # Adds a subelement to the end of this element. + # + # @param element The element to add. + # @exception AssertionError If a sequence member is not a valid object. + + def append(self, element): + assert iselement(element) + self._children.append(element) + + ## + # Inserts a subelement at the given position in this element. + # + # @param index Where to insert the new subelement. + # @exception AssertionError If the element is not a valid object. + + def insert(self, index, element): + assert iselement(element) + self._children.insert(index, element) + + ## + # Removes a matching subelement. Unlike the find methods, + # this method compares elements based on identity, not on tag + # value or contents. + # + # @param element What element to remove. + # @exception ValueError If a matching element could not be found. + # @exception AssertionError If the element is not a valid object. + + def remove(self, element): + assert iselement(element) + self._children.remove(element) + + ## + # Returns all subelements. The elements are returned in document + # order. + # + # @return A list of subelements. + # @defreturn list of Element instances + + def getchildren(self): + return self._children + + ## + # Finds the first matching subelement, by tag name or path. + # + # @param path What element to look for. + # @return The first matching element, or None if no element was found. + # @defreturn Element or None + + def find(self, path): + return ElementPath.find(self, path) + + ## + # Finds text for the first matching subelement, by tag name or path. + # + # @param path What element to look for. + # @param default What to return if the element was not found. + # @return The text content of the first matching element, or the + # default value no element was found. Note that if the element + # has is found, but has no text content, this method returns an + # empty string. + # @defreturn string + + def findtext(self, path, default=None): + return ElementPath.findtext(self, path, default) + + ## + # Finds all matching subelements, by tag name or path. + # + # @param path What element to look for. + # @return A list or iterator containing all matching elements, + # in document order. + # @defreturn list of Element instances + + def findall(self, path): + return ElementPath.findall(self, path) + + ## + # Resets an element. This function removes all subelements, clears + # all attributes, and sets the text and tail attributes to None. + + def clear(self): + self.attrib.clear() + self._children = [] + self.text = self.tail = None + + ## + # Gets an element attribute. + # + # @param key What attribute to look for. + # @param default What to return if the attribute was not found. + # @return The attribute value, or the default value, if the + # attribute was not found. + # @defreturn string or None + + def get(self, key, default=None): + return self.attrib.get(key, default) + + ## + # Sets an element attribute. + # + # @param key What attribute to set. + # @param value The attribute value. + + def set(self, key, value): + self.attrib[key] = value + + ## + # Gets a list of attribute names. The names are returned in an + # arbitrary order (just like for an ordinary Python dictionary). + # + # @return A list of element attribute names. + # @defreturn list of strings + + def keys(self): + return self.attrib.keys() + + ## + # Gets element attributes, as a sequence. The attributes are + # returned in an arbitrary order. + # + # @return A list of (name, value) tuples for all attributes. + # @defreturn list of (string, string) tuples + + def items(self): + return self.attrib.items() + + ## + # Creates a tree iterator. The iterator loops over this element + # and all subelements, in document order, and returns all elements + # with a matching tag. + #

+ # If the tree structure is modified during iteration, the result + # is undefined. + # + # @param tag What tags to look for (default is to return all elements). + # @return A list or iterator containing all the matching elements. + # @defreturn list or iterator + + def getiterator(self, tag=None): + nodes = [] + if tag == "*": + tag = None + if tag is None or self.tag == tag: + nodes.append(self) + for node in self._children: + nodes.extend(node.getiterator(tag)) + return nodes + +# compatibility +_Element = _ElementInterface + +## +# Element factory. This function returns an object implementing the +# standard Element interface. The exact class or type of that object +# is implementation dependent, but it will always be compatible with +# the {@link #_ElementInterface} class in this module. +#

+# The element name, attribute names, and attribute values can be +# either 8-bit ASCII strings or Unicode strings. +# +# @param tag The element name. +# @param attrib An optional dictionary, containing element attributes. +# @param **extra Additional attributes, given as keyword arguments. +# @return An element instance. +# @defreturn Element + +def Element(tag, attrib={}, **extra): + attrib = attrib.copy() + attrib.update(extra) + return _ElementInterface(tag, attrib) + +## +# Subelement factory. This function creates an element instance, and +# appends it to an existing element. +#

+# The element name, attribute names, and attribute values can be +# either 8-bit ASCII strings or Unicode strings. +# +# @param parent The parent element. +# @param tag The subelement name. +# @param attrib An optional dictionary, containing element attributes. +# @param **extra Additional attributes, given as keyword arguments. +# @return An element instance. +# @defreturn Element + +def SubElement(parent, tag, attrib={}, **extra): + attrib = attrib.copy() + attrib.update(extra) + element = parent.makeelement(tag, attrib) + parent.append(element) + return element + +## +# Comment element factory. This factory function creates a special +# element that will be serialized as an XML comment. +#

+# The comment string can be either an 8-bit ASCII string or a Unicode +# string. +# +# @param text A string containing the comment string. +# @return An element instance, representing a comment. +# @defreturn Element + +def Comment(text=None): + element = Element(Comment) + element.text = text + return element + +## +# PI element factory. This factory function creates a special element +# that will be serialized as an XML processing instruction. +# +# @param target A string containing the PI target. +# @param text A string containing the PI contents, if any. +# @return An element instance, representing a PI. +# @defreturn Element + +def ProcessingInstruction(target, text=None): + element = Element(ProcessingInstruction) + element.text = target + if text: + element.text = element.text + " " + text + return element + +PI = ProcessingInstruction + +## +# QName wrapper. This can be used to wrap a QName attribute value, in +# order to get proper namespace handling on output. +# +# @param text A string containing the QName value, in the form {uri}local, +# or, if the tag argument is given, the URI part of a QName. +# @param tag Optional tag. If given, the first argument is interpreted as +# an URI, and this argument is interpreted as a local name. +# @return An opaque object, representing the QName. + +class QName: + def __init__(self, text_or_uri, tag=None): + if tag: + text_or_uri = "{%s}%s" % (text_or_uri, tag) + self.text = text_or_uri + def __str__(self): + return self.text + def __hash__(self): + return hash(self.text) + def __cmp__(self, other): + if isinstance(other, QName): + return cmp(self.text, other.text) + return cmp(self.text, other) + +## +# ElementTree wrapper class. This class represents an entire element +# hierarchy, and adds some extra support for serialization to and from +# standard XML. +# +# @param element Optional root element. +# @keyparam file Optional file handle or name. If given, the +# tree is initialized with the contents of this XML file. + +class ElementTree: + + def __init__(self, element=None, file=None): + assert element is None or iselement(element) + self._root = element # first node + if file: + self.parse(file) + + ## + # Gets the root element for this tree. + # + # @return An element instance. + # @defreturn Element + + def getroot(self): + return self._root + + ## + # Replaces the root element for this tree. This discards the + # current contents of the tree, and replaces it with the given + # element. Use with care. + # + # @param element An element instance. + + def _setroot(self, element): + assert iselement(element) + self._root = element + + ## + # Loads an external XML document into this element tree. + # + # @param source A file name or file object. + # @param parser An optional parser instance. If not given, the + # standard {@link XMLTreeBuilder} parser is used. + # @return The document root element. + # @defreturn Element + + def parse(self, source, parser=None): + if not hasattr(source, "read"): + source = open(source, "rb") + if not parser: + parser = XMLTreeBuilder() + while 1: + data = source.read(32768) + if not data: + break + parser.feed(data) + self._root = parser.close() + return self._root + + ## + # Creates a tree iterator for the root element. The iterator loops + # over all elements in this tree, in document order. + # + # @param tag What tags to look for (default is to return all elements) + # @return An iterator. + # @defreturn iterator + + def getiterator(self, tag=None): + assert self._root is not None + return self._root.getiterator(tag) + + ## + # Finds the first toplevel element with given tag. + # Same as getroot().find(path). + # + # @param path What element to look for. + # @return The first matching element, or None if no element was found. + # @defreturn Element or None + + def find(self, path): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.find(path) + + ## + # Finds the element text for the first toplevel element with given + # tag. Same as getroot().findtext(path). + # + # @param path What toplevel element to look for. + # @param default What to return if the element was not found. + # @return The text content of the first matching element, or the + # default value no element was found. Note that if the element + # has is found, but has no text content, this method returns an + # empty string. + # @defreturn string + + def findtext(self, path, default=None): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.findtext(path, default) + + ## + # Finds all toplevel elements with the given tag. + # Same as getroot().findall(path). + # + # @param path What element to look for. + # @return A list or iterator containing all matching elements, + # in document order. + # @defreturn list of Element instances + + def findall(self, path): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.findall(path) + + ## + # Writes the element tree to a file, as XML. + # + # @param file A file name, or a file object opened for writing. + # @param encoding Optional output encoding (default is US-ASCII). + + def write(self, file, encoding="us-ascii"): + assert self._root is not None + if not hasattr(file, "write"): + file = open(file, "wb") + if not encoding: + encoding = "us-ascii" + elif encoding != "utf-8" and encoding != "us-ascii": + file.write("\n" % encoding) + self._write(file, self._root, encoding, {}) + + def _write(self, file, node, encoding, namespaces): + # write XML to file + tag = node.tag + if tag is Comment: + file.write("" % _escape_cdata(node.text, encoding)) + elif tag is ProcessingInstruction: + file.write("" % _escape_cdata(node.text, encoding)) + else: + items = node.items() + xmlns_items = [] # new namespaces in this scope + try: + if isinstance(tag, QName) or tag[:1] == "{": + tag, xmlns = fixtag(tag, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(tag) + file.write("<" + _encode(tag, encoding)) + if items or xmlns_items: + items.sort() # lexical order + for k, v in items: + try: + if isinstance(k, QName) or k[:1] == "{": + k, xmlns = fixtag(k, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(k) + try: + if isinstance(v, QName): + v, xmlns = fixtag(v, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(v) + file.write(" %s=\"%s\"" % (_encode(k, encoding), + _escape_attrib(v, encoding))) + for k, v in xmlns_items: + file.write(" %s=\"%s\"" % (_encode(k, encoding), + _escape_attrib(v, encoding))) + if node.text or len(node): + file.write(">") + if node.text: + file.write(_escape_cdata(node.text, encoding)) + for n in node: + self._write(file, n, encoding, namespaces) + file.write("") + else: + file.write(" />") + for k, v in xmlns_items: + del namespaces[v] + if node.tail: + file.write(_escape_cdata(node.tail, encoding)) + +# -------------------------------------------------------------------- +# helpers + +## +# Checks if an object appears to be a valid element object. +# +# @param An element instance. +# @return A true value if this is an element object. +# @defreturn flag + +def iselement(element): + # FIXME: not sure about this; might be a better idea to look + # for tag/attrib/text attributes + return isinstance(element, _ElementInterface) or hasattr(element, "tag") + +## +# Writes an element tree or element structure to sys.stdout. This +# function should be used for debugging only. +#

+# The exact output format is implementation dependent. In this +# version, it's written as an ordinary XML file. +# +# @param elem An element tree or an individual element. + +def dump(elem): + # debugging + if not isinstance(elem, ElementTree): + elem = ElementTree(elem) + elem.write(sys.stdout) + tail = elem.getroot().tail + if not tail or tail[-1] != "\n": + sys.stdout.write("\n") + +def _encode(s, encoding): + try: + return s.encode(encoding) + except AttributeError: + return s # 1.5.2: assume the string uses the right encoding + +if sys.version[:3] == "1.5": + _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2 +else: + _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) + +_escape_map = { + "&": "&", + "<": "<", + ">": ">", + '"': """, +} + +_namespace_map = { + # "well-known" namespace prefixes + "http://www.w3.org/XML/1998/namespace": "xml", + "http://www.w3.org/1999/xhtml": "html", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", + "http://schemas.xmlsoap.org/wsdl/": "wsdl", +} + +def _raise_serialization_error(text): + raise TypeError( + "cannot serialize %r (type %s)" % (text, type(text).__name__) + ) + +def _encode_entity(text, pattern=_escape): + # map reserved and non-ascii characters to numerical entities + def escape_entities(m, map=_escape_map): + out = [] + append = out.append + for char in m.group(): + text = map.get(char) + if text is None: + text = "&#%d;" % ord(char) + append(text) + return string.join(out, "") + try: + return _encode(pattern.sub(escape_entities, text), "ascii") + except TypeError: + _raise_serialization_error(text) + +# +# the following functions assume an ascii-compatible encoding +# (or "utf-16") + +def _escape_cdata(text, encoding=None, replace=string.replace): + # escape character data + try: + if encoding: + try: + text = _encode(text, encoding) + except UnicodeError: + return _encode_entity(text) + text = replace(text, "&", "&") + text = replace(text, "<", "<") + text = replace(text, ">", ">") + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + +def _escape_attrib(text, encoding=None, replace=string.replace): + # escape attribute value + try: + if encoding: + try: + text = _encode(text, encoding) + except UnicodeError: + return _encode_entity(text) + text = replace(text, "&", "&") + text = replace(text, "'", "'") # FIXME: overkill + text = replace(text, "\"", """) + text = replace(text, "<", "<") + text = replace(text, ">", ">") + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + +def fixtag(tag, namespaces): + # given a decorated tag (of the form {uri}tag), return prefixed + # tag and namespace declaration, if any + if isinstance(tag, QName): + tag = tag.text + namespace_uri, tag = string.split(tag[1:], "}", 1) + prefix = namespaces.get(namespace_uri) + if prefix is None: + prefix = _namespace_map.get(namespace_uri) + if prefix is None: + prefix = "ns%d" % len(namespaces) + namespaces[namespace_uri] = prefix + if prefix == "xml": + xmlns = None + else: + xmlns = ("xmlns:%s" % prefix, namespace_uri) + else: + xmlns = None + return "%s:%s" % (prefix, tag), xmlns + +## +# Parses an XML document into an element tree. +# +# @param source A filename or file object containing XML data. +# @param parser An optional parser instance. If not given, the +# standard {@link XMLTreeBuilder} parser is used. +# @return An ElementTree instance + +def parse(source, parser=None): + tree = ElementTree() + tree.parse(source, parser) + return tree + +## +# Parses an XML document into an element tree incrementally, and reports +# what's going on to the user. +# +# @param source A filename or file object containing XML data. +# @param events A list of events to report back. If omitted, only "end" +# events are reported. +# @return A (event, elem) iterator. + +class iterparse: + + def __init__(self, source, events=None): + if not hasattr(source, "read"): + source = open(source, "rb") + self._file = source + self._events = [] + self._index = 0 + self.root = self._root = None + self._parser = XMLTreeBuilder() + # wire up the parser for event reporting + parser = self._parser._parser + append = self._events.append + if events is None: + events = ["end"] + for event in events: + if event == "start": + try: + parser.ordered_attributes = 1 + parser.specified_attributes = 1 + def handler(tag, attrib_in, event=event, append=append, + start=self._parser._start_list): + append((event, start(tag, attrib_in))) + parser.StartElementHandler = handler + except AttributeError: + def handler(tag, attrib_in, event=event, append=append, + start=self._parser._start): + append((event, start(tag, attrib_in))) + parser.StartElementHandler = handler + elif event == "end": + def handler(tag, event=event, append=append, + end=self._parser._end): + append((event, end(tag))) + parser.EndElementHandler = handler + elif event == "start-ns": + def handler(prefix, uri, event=event, append=append): + try: + uri = _encode(uri, "ascii") + except UnicodeError: + pass + append((event, (prefix or "", uri))) + parser.StartNamespaceDeclHandler = handler + elif event == "end-ns": + def handler(prefix, event=event, append=append): + append((event, None)) + parser.EndNamespaceDeclHandler = handler + + def next(self): + while 1: + try: + item = self._events[self._index] + except IndexError: + if self._parser is None: + self.root = self._root + try: + raise StopIteration + except NameError: + raise IndexError + # load event buffer + del self._events[:] + self._index = 0 + data = self._file.read(16384) + if data: + self._parser.feed(data) + else: + self._root = self._parser.close() + self._parser = None + else: + self._index = self._index + 1 + return item + + try: + iter + def __iter__(self): + return self + except NameError: + def __getitem__(self, index): + return self.next() + +## +# Parses an XML document from a string constant. This function can +# be used to embed "XML literals" in Python code. +# +# @param source A string containing XML data. +# @return An Element instance. +# @defreturn Element + +def XML(text): + parser = XMLTreeBuilder() + parser.feed(text) + return parser.close() + +## +# Parses an XML document from a string constant, and also returns +# a dictionary which maps from element id:s to elements. +# +# @param source A string containing XML data. +# @return A tuple containing an Element instance and a dictionary. +# @defreturn (Element, dictionary) + +def XMLID(text): + parser = XMLTreeBuilder() + parser.feed(text) + tree = parser.close() + ids = {} + for elem in tree.getiterator(): + id = elem.get("id") + if id: + ids[id] = elem + return tree, ids + +## +# Parses an XML document from a string constant. Same as {@link #XML}. +# +# @def fromstring(text) +# @param source A string containing XML data. +# @return An Element instance. +# @defreturn Element + +fromstring = XML + +## +# Generates a string representation of an XML element, including all +# subelements. +# +# @param element An Element instance. +# @return An encoded string containing the XML data. +# @defreturn string + +def tostring(element, encoding=None): + class dummy: + pass + data = [] + file = dummy() + file.write = data.append + ElementTree(element).write(file, encoding) + return string.join(data, "") + +## +# Generic element structure builder. This builder converts a sequence +# of {@link #TreeBuilder.start}, {@link #TreeBuilder.data}, and {@link +# #TreeBuilder.end} method calls to a well-formed element structure. +#

+# You can use this class to build an element structure using a custom XML +# parser, or a parser for some other XML-like format. +# +# @param element_factory Optional element factory. This factory +# is called to create new Element instances, as necessary. + +class TreeBuilder: + + def __init__(self, element_factory=None): + self._data = [] # data collector + self._elem = [] # element stack + self._last = None # last element + self._tail = None # true if we're after an end tag + if element_factory is None: + element_factory = _ElementInterface + self._factory = element_factory + + ## + # Flushes the parser buffers, and returns the toplevel documen + # element. + # + # @return An Element instance. + # @defreturn Element + + def close(self): + assert len(self._elem) == 0, "missing end tags" + assert self._last != None, "missing toplevel element" + return self._last + + def _flush(self): + if self._data: + if self._last is not None: + text = string.join(self._data, "") + if self._tail: + assert self._last.tail is None, "internal error (tail)" + self._last.tail = text + else: + assert self._last.text is None, "internal error (text)" + self._last.text = text + self._data = [] + + ## + # Adds text to the current element. + # + # @param data A string. This should be either an 8-bit string + # containing ASCII text, or a Unicode string. + + def data(self, data): + self._data.append(data) + + ## + # Opens a new element. + # + # @param tag The element name. + # @param attrib A dictionary containing element attributes. + # @return The opened element. + # @defreturn Element + + def start(self, tag, attrs): + self._flush() + self._last = elem = self._factory(tag, attrs) + if self._elem: + self._elem[-1].append(elem) + self._elem.append(elem) + self._tail = 0 + return elem + + ## + # Closes the current element. + # + # @param tag The element name. + # @return The closed element. + # @defreturn Element + + def end(self, tag): + self._flush() + self._last = self._elem.pop() + assert self._last.tag == tag,\ + "end tag mismatch (expected %s, got %s)" % ( + self._last.tag, tag) + self._tail = 1 + return self._last + +## +# Element structure builder for XML source data, based on the +# expat parser. +# +# @keyparam target Target object. If omitted, the builder uses an +# instance of the standard {@link #TreeBuilder} class. +# @keyparam html Predefine HTML entities. This flag is not supported +# by the current implementation. +# @see #ElementTree +# @see #TreeBuilder + +class XMLTreeBuilder: + + def __init__(self, html=0, target=None): + try: + from xml.parsers import expat + except ImportError: + raise ImportError( + "No module named expat; use SimpleXMLTreeBuilder instead" + ) + self._parser = parser = expat.ParserCreate(None, "}") + if target is None: + target = TreeBuilder() + self._target = target + self._names = {} # name memo cache + # callbacks + parser.DefaultHandlerExpand = self._default + parser.StartElementHandler = self._start + parser.EndElementHandler = self._end + parser.CharacterDataHandler = self._data + # let expat do the buffering, if supported + try: + self._parser.buffer_text = 1 + except AttributeError: + pass + # use new-style attribute handling, if supported + try: + self._parser.ordered_attributes = 1 + self._parser.specified_attributes = 1 + parser.StartElementHandler = self._start_list + except AttributeError: + pass + encoding = None + if not parser.returns_unicode: + encoding = "utf-8" + # target.xml(encoding, None) + self._doctype = None + self.entity = {} + + def _fixtext(self, text): + # convert text string to ascii, if possible + try: + return _encode(text, "ascii") + except UnicodeError: + return text + + def _fixname(self, key): + # expand qname, and convert name string to ascii, if possible + try: + name = self._names[key] + except KeyError: + name = key + if "}" in name: + name = "{" + name + self._names[key] = name = self._fixtext(name) + return name + + def _start(self, tag, attrib_in): + fixname = self._fixname + tag = fixname(tag) + attrib = {} + for key, value in attrib_in.items(): + attrib[fixname(key)] = self._fixtext(value) + return self._target.start(tag, attrib) + + def _start_list(self, tag, attrib_in): + fixname = self._fixname + tag = fixname(tag) + attrib = {} + if attrib_in: + for i in range(0, len(attrib_in), 2): + attrib[fixname(attrib_in[i])] = self._fixtext(attrib_in[i+1]) + return self._target.start(tag, attrib) + + def _data(self, text): + return self._target.data(self._fixtext(text)) + + def _end(self, tag): + return self._target.end(self._fixname(tag)) + + def _default(self, text): + prefix = text[:1] + if prefix == "&": + # deal with undefined entities + try: + self._target.data(self.entity[text[1:-1]]) + except KeyError: + from xml.parsers import expat + raise expat.error( + "undefined entity %s: line %d, column %d" % + (text, self._parser.ErrorLineNumber, + self._parser.ErrorColumnNumber) + ) + elif prefix == "<" and text[:9] == "": + self._doctype = None + return + text = string.strip(text) + if not text: + return + self._doctype.append(text) + n = len(self._doctype) + if n > 2: + type = self._doctype[1] + if type == "PUBLIC" and n == 4: + name, type, pubid, system = self._doctype + elif type == "SYSTEM" and n == 3: + name, type, system = self._doctype + pubid = None + else: + return + if pubid: + pubid = pubid[1:-1] + self.doctype(name, pubid, system[1:-1]) + self._doctype = None + + ## + # Handles a doctype declaration. + # + # @param name Doctype name. + # @param pubid Public identifier. + # @param system System identifier. + + def doctype(self, name, pubid, system): + pass + + ## + # Feeds data to the parser. + # + # @param data Encoded data. + + def feed(self, data): + self._parser.Parse(data, 0) + + ## + # Finishes feeding data to the parser. + # + # @return An element structure. + # @defreturn Element + + def close(self): + self._parser.Parse("", 1) # end of data + tree = self._target.close() + del self._target, self._parser # get rid of circular references + return tree Added: external/elementtree-1.2.6-20050316/elementtree/HTMLTreeBuilder.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/HTMLTreeBuilder.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,230 @@ +# +# ElementTree +# $Id: HTMLTreeBuilder.py 2325 2005-03-16 15:50:43Z fredrik $ +# +# a simple tree builder, for HTML input +# +# history: +# 2002-04-06 fl created +# 2002-04-07 fl ignore IMG and HR end tags +# 2002-04-07 fl added support for 1.5.2 and later +# 2003-04-13 fl added HTMLTreeBuilder alias +# 2004-12-02 fl don't feed non-ASCII charrefs/entities as 8-bit strings +# 2004-12-05 fl don't feed non-ASCII CDATA as 8-bit strings +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to build element trees from HTML files. +## + +import htmlentitydefs +import re, string, sys +import mimetools, StringIO + +import ElementTree + +AUTOCLOSE = "p", "li", "tr", "th", "td", "head", "body" +IGNOREEND = "img", "hr", "meta", "link", "br" + +if sys.version[:3] == "1.5": + is_not_ascii = re.compile(r"[\x80-\xff]").search # 1.5.2 +else: + is_not_ascii = re.compile(eval(r'u"[\u0080-\uffff]"')).search + +try: + from HTMLParser import HTMLParser +except ImportError: + from sgmllib import SGMLParser + # hack to use sgmllib's SGMLParser to emulate 2.2's HTMLParser + class HTMLParser(SGMLParser): + # the following only works as long as this class doesn't + # provide any do, start, or end handlers + def unknown_starttag(self, tag, attrs): + self.handle_starttag(tag, attrs) + def unknown_endtag(self, tag): + self.handle_endtag(tag) + +## +# ElementTree builder for HTML source code. This builder converts an +# HTML document or fragment to an ElementTree. +#

+# The parser is relatively picky, and requires balanced tags for most +# elements. However, elements belonging to the following group are +# automatically closed: P, LI, TR, TH, and TD. In addition, the +# parser automatically inserts end tags immediately after the start +# tag, and ignores any end tags for the following group: IMG, HR, +# META, and LINK. +# +# @keyparam builder Optional builder object. If omitted, the parser +# uses the standard elementtree builder. +# @keyparam encoding Optional character encoding, if known. If omitted, +# the parser looks for META tags inside the document. If no tags +# are found, the parser defaults to ISO-8859-1. Note that if your +# document uses a non-ASCII compatible encoding, you must decode +# the document before parsing. +# +# @see elementtree.ElementTree + +class HTMLTreeBuilder(HTMLParser): + + # FIXME: shouldn't this class be named Parser, not Builder? + + def __init__(self, builder=None, encoding=None): + self.__stack = [] + if builder is None: + builder = ElementTree.TreeBuilder() + self.__builder = builder + self.encoding = encoding or "iso-8859-1" + HTMLParser.__init__(self) + + ## + # Flushes parser buffers, and return the root element. + # + # @return An Element instance. + + def close(self): + HTMLParser.close(self) + return self.__builder.close() + + ## + # (Internal) Handles start tags. + + def handle_starttag(self, tag, attrs): + if tag == "meta": + # look for encoding directives + http_equiv = content = None + for k, v in attrs: + if k == "http-equiv": + http_equiv = string.lower(v) + elif k == "content": + content = v + if http_equiv == "content-type" and content: + # use mimetools to parse the http header + header = mimetools.Message( + StringIO.StringIO("%s: %s\n\n" % (http_equiv, content)) + ) + encoding = header.getparam("charset") + if encoding: + self.encoding = encoding + if tag in AUTOCLOSE: + if self.__stack and self.__stack[-1] == tag: + self.handle_endtag(tag) + self.__stack.append(tag) + attrib = {} + if attrs: + for k, v in attrs: + attrib[string.lower(k)] = v + self.__builder.start(tag, attrib) + if tag in IGNOREEND: + self.__stack.pop() + self.__builder.end(tag) + + ## + # (Internal) Handles end tags. + + def handle_endtag(self, tag): + if tag in IGNOREEND: + return + lasttag = self.__stack.pop() + if tag != lasttag and lasttag in AUTOCLOSE: + self.handle_endtag(lasttag) + self.__builder.end(tag) + + ## + # (Internal) Handles character references. + + def handle_charref(self, char): + if char[:1] == "x": + char = int(char[1:], 16) + else: + char = int(char) + if 0 <= char < 128: + self.__builder.data(chr(char)) + else: + self.__builder.data(unichr(char)) + + ## + # (Internal) Handles entity references. + + def handle_entityref(self, name): + entity = htmlentitydefs.entitydefs.get(name) + if entity: + if len(entity) == 1: + entity = ord(entity) + else: + entity = int(entity[2:-1]) + if 0 <= entity < 128: + self.__builder.data(chr(entity)) + else: + self.__builder.data(unichr(entity)) + else: + self.unknown_entityref(name) + + ## + # (Internal) Handles character data. + + def handle_data(self, data): + if isinstance(data, type('')) and is_not_ascii(data): + # convert to unicode, but only if necessary + data = unicode(data, self.encoding, "ignore") + self.__builder.data(data) + + ## + # (Hook) Handles unknown entity references. The default action + # is to ignore unknown entities. + + def unknown_entityref(self, name): + pass # ignore by default; override if necessary + +## +# An alias for the HTMLTreeBuilder class. + +TreeBuilder = HTMLTreeBuilder + +## +# Parse an HTML document or document fragment. +# +# @param source A filename or file object containing HTML data. +# @param encoding Optional character encoding, if known. If omitted, +# the parser looks for META tags inside the document. If no tags +# are found, the parser defaults to ISO-8859-1. +# @return An ElementTree instance + +def parse(source, encoding=None): + return ElementTree.parse(source, HTMLTreeBuilder(encoding=encoding)) + +if __name__ == "__main__": + import sys + ElementTree.dump(parse(open(sys.argv[1]))) Added: external/elementtree-1.2.6-20050316/elementtree/SgmlopXMLTreeBuilder.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/SgmlopXMLTreeBuilder.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,103 @@ +# +# ElementTree +# $Id$ +# +# A simple XML tree builder, based on the sgmlop library. +# +# Note that this version does not support namespaces. This may be +# changed in future versions. +# +# history: +# 2004-03-28 fl created +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to build element trees from XML, based on the SGMLOP parser. +#

+# The current version does not support XML namespaces. +#

+# This tree builder requires the sgmlop extension module +# (available from +# http://effbot.org/downloads). +## + +import ElementTree + +## +# ElementTree builder for XML source data, based on the SGMLOP parser. +# +# @see elementtree.ElementTree + +class TreeBuilder: + + def __init__(self, html=0): + try: + import sgmlop + except ImportError: + raise RuntimeError("sgmlop parser not available") + self.__builder = ElementTree.TreeBuilder() + if html: + import htmlentitydefs + self.entitydefs.update(htmlentitydefs.entitydefs) + self.__parser = sgmlop.XMLParser() + self.__parser.register(self) + + ## + # Feeds data to the parser. + # + # @param data Encoded data. + + def feed(self, data): + self.__parser.feed(data) + + ## + # Finishes feeding data to the parser. + # + # @return An element structure. + # @defreturn Element + + def close(self): + self.__parser.close() + self.__parser = None + return self.__builder.close() + + def finish_starttag(self, tag, attrib): + self.__builder.start(tag, attrib) + + def finish_endtag(self, tag): + self.__builder.end(tag) + + def handle_data(self, data): + self.__builder.data(data) Added: external/elementtree-1.2.6-20050316/elementtree/SimpleXMLTreeBuilder.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/SimpleXMLTreeBuilder.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,144 @@ +# +# ElementTree +# $Id: SimpleXMLTreeBuilder.py 1862 2004-06-18 07:31:02Z Fredrik $ +# +# A simple XML tree builder, based on Python's xmllib +# +# Note that due to bugs in xmllib, this builder does not fully support +# namespaces (unqualified attributes are put in the default namespace, +# instead of being left as is). Run this module as a script to find +# out if this affects your Python version. +# +# history: +# 2001-10-20 fl created +# 2002-05-01 fl added namespace support for xmllib +# 2002-08-17 fl added xmllib sanity test +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to build element trees from XML files, using xmllib. +# This module can be used instead of the standard tree builder, for +# Python versions where "expat" is not available (such as 1.5.2). +#

+# Note that due to bugs in xmllib, the namespace support is +# not reliable (you can run the module as a script to find out exactly +# how unreliable it is on your Python version). +## + +import xmllib, string + +import ElementTree + +## +# ElementTree builder for XML source data. +# +# @see elementtree.ElementTree + +class TreeBuilder(xmllib.XMLParser): + + def __init__(self, html=0): + self.__builder = ElementTree.TreeBuilder() + if html: + import htmlentitydefs + self.entitydefs.update(htmlentitydefs.entitydefs) + xmllib.XMLParser.__init__(self) + + ## + # Feeds data to the parser. + # + # @param data Encoded data. + + def feed(self, data): + xmllib.XMLParser.feed(self, data) + + ## + # Finishes feeding data to the parser. + # + # @return An element structure. + # @defreturn Element + + def close(self): + xmllib.XMLParser.close(self) + return self.__builder.close() + + def handle_data(self, data): + self.__builder.data(data) + + handle_cdata = handle_data + + def unknown_starttag(self, tag, attrs): + attrib = {} + for key, value in attrs.items(): + attrib[fixname(key)] = value + self.__builder.start(fixname(tag), attrib) + + def unknown_endtag(self, tag): + self.__builder.end(fixname(tag)) + + +def fixname(name, split=string.split): + # xmllib in 2.0 and later provides limited (and slightly broken) + # support for XML namespaces. + if " " not in name: + return name + return "{%s}%s" % tuple(split(name, " ", 1)) + + +if __name__ == "__main__": + import sys + # sanity check: look for known namespace bugs in xmllib + p = TreeBuilder() + text = """\ + + + + """ + p.feed(text) + tree = p.close() + status = [] + # check for bugs in the xmllib implementation + tag = tree.find("{default}tag") + if tag is None: + status.append("namespaces not supported") + if tag is not None and tag.get("{default}attribute"): + status.append("default namespace applied to unqualified attribute") + # report bugs + if status: + print "xmllib doesn't work properly in this Python version:" + for bug in status: + print "-", bug + else: + print "congratulations; no problems found in xmllib" + Added: external/elementtree-1.2.6-20050316/elementtree/SimpleXMLWriter.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/SimpleXMLWriter.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,279 @@ +# +# SimpleXMLWriter +# $Id: SimpleXMLWriter.py 2312 2005-03-02 18:13:39Z fredrik $ +# +# a simple XML writer +# +# history: +# 2001-12-28 fl created +# 2002-11-25 fl fixed attribute encoding +# 2002-12-02 fl minor fixes for 1.5.2 +# 2004-06-17 fl added pythondoc markup +# 2004-07-23 fl added flush method (from Jay Graves) +# 2004-10-03 fl added declaration method +# +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The SimpleXMLWriter module is +# +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to write XML files, without having to deal with encoding +# issues, well-formedness, etc. +#

+# The current version does not provide built-in support for +# namespaces. To create files using namespaces, you have to provide +# "xmlns" attributes and explicitly add prefixes to tags and +# attributes. +# +#

Patterns

+# +# The following example generates a small XHTML document. +#
+#
+# from elementtree.SimpleXMLWriter import XMLWriter
+# import sys
+#
+# w = XMLWriter(sys.stdout)
+#
+# html = w.start("html")
+#
+# w.start("head")
+# w.element("title", "my document")
+# w.element("meta", name="generator", value="my application 1.0")
+# w.end()
+#
+# w.start("body")
+# w.element("h1", "this is a heading")
+# w.element("p", "this is a paragraph")
+#
+# w.start("p")
+# w.data("this is ")
+# w.element("b", "bold")
+# w.data(" and ")
+# w.element("i", "italic")
+# w.data(".")
+# w.end("p")
+#
+# w.close(html)
+# 
+## + +import re, sys, string + +try: + unicode("") +except NameError: + def encode(s, encoding): + # 1.5.2: application must use the right encoding + return s + _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2 +else: + def encode(s, encoding): + return s.encode(encoding) + _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) + +def encode_entity(text, pattern=_escape): + # map reserved and non-ascii characters to numerical entities + def escape_entities(m): + out = [] + for char in m.group(): + out.append("&#%d;" % ord(char)) + return string.join(out, "") + return encode(pattern.sub(escape_entities, text), "ascii") + +del _escape + +# +# the following functions assume an ascii-compatible encoding +# (or "utf-16") + +def escape_cdata(s, encoding=None, replace=string.replace): + s = replace(s, "&", "&") + s = replace(s, "<", "<") + s = replace(s, ">", ">") + if encoding: + try: + return encode(s, encoding) + except UnicodeError: + return encode_entity(s) + return s + +def escape_attrib(s, encoding=None, replace=string.replace): + s = replace(s, "&", "&") + s = replace(s, "'", "'") + s = replace(s, "\"", """) + s = replace(s, "<", "<") + s = replace(s, ">", ">") + if encoding: + try: + return encode(s, encoding) + except UnicodeError: + return encode_entity(s) + return s + +## +# XML writer class. +# +# @param file A file or file-like object. This object must implement +# a write method that takes an 8-bit string. +# @param encoding Optional encoding. + +class XMLWriter: + + def __init__(self, file, encoding="us-ascii"): + if not hasattr(file, "write"): + file = open(file, "w") + self.__write = file.write + if hasattr(file, "flush"): + self.flush = file.flush + self.__open = 0 # true if start tag is open + self.__tags = [] + self.__data = [] + self.__encoding = encoding + + def __flush(self): + # flush internal buffers + if self.__open: + self.__write(">") + self.__open = 0 + if self.__data: + data = string.join(self.__data, "") + self.__write(escape_cdata(data, self.__encoding)) + self.__data = [] + + ## + # Writes an XML declaration. + + def declaration(self): + encoding = self.__encoding + if encoding == "us-ascii" or encoding == "utf-8": + self.__write("\n") + else: + self.__write("\n" % encoding) + + ## + # Opens a new element. Attributes can be given as keyword + # arguments, or as a string/string dictionary. You can pass in + # 8-bit strings or Unicode strings; the former are assumed to use + # the encoding passed to the constructor. The method returns an + # opaque identifier that can be passed to the close method, + # to close all open elements up to and including this one. + # + # @param tag Element tag. + # @param attrib Attribute dictionary. Alternatively, attributes + # can be given as keyword arguments. + # @return An element identifier. + + def start(self, tag, attrib={}, **extra): + self.__flush() + tag = escape_cdata(tag, self.__encoding) + self.__data = [] + self.__tags.append(tag) + self.__write("<%s" % tag) + if attrib or extra: + attrib = attrib.copy() + attrib.update(extra) + attrib = attrib.items() + attrib.sort() + for k, v in attrib: + k = escape_cdata(k, self.__encoding) + v = escape_attrib(v, self.__encoding) + self.__write(" %s=\"%s\"" % (k, v)) + self.__open = 1 + return len(self.__tags)-1 + + ## + # Adds a comment to the output stream. + # + # @param comment Comment text, as an 8-bit string or Unicode string. + + def comment(self, comment): + self.__flush() + self.__write("\n" % escape_cdata(comment, self.__encoding)) + + ## + # Adds character data to the output stream. + # + # @param text Character data, as an 8-bit string or Unicode string. + + def data(self, text): + self.__data.append(text) + + ## + # Closes the current element (opened by the most recent call to + # start). + # + # @param tag Element tag. If given, the tag must match the start + # tag. If omitted, the current element is closed. + + def end(self, tag=None): + if tag: + assert self.__tags, "unbalanced end(%s)" % tag + assert escape_cdata(tag, self.__encoding) == self.__tags[-1],\ + "expected end(%s), got %s" % (self.__tags[-1], tag) + else: + assert self.__tags, "unbalanced end()" + tag = self.__tags.pop() + if self.__data: + self.__flush() + elif self.__open: + self.__open = 0 + self.__write(" />") + return + self.__write("" % tag) + + ## + # Closes open elements, up to (and including) the element identified + # by the given identifier. + # + # @param id Element identifier, as returned by the start method. + + def close(self, id): + while len(self.__tags) > id: + self.end() + + ## + # Adds an entire element. This is the same as calling start, + # data, and end in sequence. The text argument + # can be omitted. + + def element(self, tag, text=None, attrib={}, **extra): + apply(self.start, (tag, attrib), extra) + if text: + self.data(text) + self.end() + + ## + # Flushes the output stream. + + def flush(self): + pass # replaced by the constructor Added: external/elementtree-1.2.6-20050316/elementtree/TidyHTMLTreeBuilder.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/TidyHTMLTreeBuilder.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,6 @@ +# +# ElementTree +# $Id: TidyHTMLTreeBuilder.py 2304 2005-03-01 17:42:41Z fredrik $ +# + +from elementtidy.TidyHTMLTreeBuilder import * Added: external/elementtree-1.2.6-20050316/elementtree/TidyTools.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/TidyTools.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,128 @@ +# +# ElementTree +# $Id: TidyTools.py 1862 2004-06-18 07:31:02Z Fredrik $ +# +# tools to run the "tidy" command on an HTML or XHTML file, and return +# the contents as an XHTML element tree. +# +# history: +# 2002-10-19 fl added to ElementTree library; added getzonebody function +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# + +## +# Tools to build element trees from HTML, using the external tidy +# utility. +## + +import glob, string, os, sys + +from ElementTree import ElementTree, Element + +NS_XHTML = "{http://www.w3.org/1999/xhtml}" + +## +# Convert an HTML or HTML-like file to XHTML, using the tidy +# command line utility. +# +# @param file Filename. +# @param new_inline_tags An optional list of valid but non-standard +# inline tags. +# @return An element tree, or None if not successful. + +def tidy(file, new_inline_tags=None): + + command = ["tidy", "-qn", "-asxml"] + + if new_inline_tags: + command.append("--new-inline-tags") + command.append(string.join(new_inline_tags, ",")) + + # FIXME: support more tidy options! + + # convert + os.system( + "%s %s >%s.out 2>%s.err" % (string.join(command), file, file, file) + ) + # check that the result is valid XML + try: + tree = ElementTree() + tree.parse(file + ".out") + except: + print "*** %s:%s" % sys.exc_info()[:2] + print ("*** %s is not valid XML " + "(check %s.err for info)" % (file, file)) + tree = None + else: + if os.path.isfile(file + ".out"): + os.remove(file + ".out") + if os.path.isfile(file + ".err"): + os.remove(file + ".err") + + return tree + +## +# Get document body from a an HTML or HTML-like file. This function +# uses the tidy function to convert HTML to XHTML, and cleans +# up the resulting XML tree. +# +# @param file Filename. +# @return A body element, or None if not successful. + +def getbody(file, **options): + # get clean body from text file + + # get xhtml tree + try: + tree = apply(tidy, (file,), options) + if tree is None: + return + except IOError, v: + print "***", v + return None + + NS = NS_XHTML + + # remove namespace uris + for node in tree.getiterator(): + if node.tag.startswith(NS): + node.tag = node.tag[len(NS):] + + body = tree.getroot().find("body") + + return body + +## +# Same as getbody, but turns plain text at the start of the +# document into an H1 tag. This function can be used to parse zone +# documents. +# +# @param file Filename. +# @return A body element, or None if not successful. + +def getzonebody(file, **options): + + body = getbody(file, **options) + if body is None: + return + + if body.text and string.strip(body.text): + title = Element("h1") + title.text = string.strip(body.text) + title.tail = "\n\n" + body.insert(0, title) + + body.text = None + + return body + +if __name__ == "__main__": + + import sys + for arg in sys.argv[1:]: + for file in glob.glob(arg): + print file, "...", tidy(file) Added: external/elementtree-1.2.6-20050316/elementtree/XMLTreeBuilder.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/XMLTreeBuilder.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,113 @@ +# +# ElementTree +# $Id: XMLTreeBuilder.py 2305 2005-03-01 17:43:09Z fredrik $ +# +# an XML tree builder +# +# history: +# 2001-10-20 fl created +# 2002-05-01 fl added namespace support for xmllib +# 2002-07-27 fl require expat (1.5.2 code can use SimpleXMLTreeBuilder) +# 2002-08-17 fl use tag/attribute name memo cache +# 2002-12-04 fl moved XMLTreeBuilder to the ElementTree module +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to build element trees from XML files. +## + +import ElementTree + +## +# (obsolete) ElementTree builder for XML source data, based on the +# expat parser. +#

+# This class is an alias for ElementTree.XMLTreeBuilder. New code +# should use that version instead. +# +# @see elementtree.ElementTree + +class TreeBuilder(ElementTree.XMLTreeBuilder): + pass + +## +# (experimental) An alternate builder that supports manipulation of +# new elements. + +class FancyTreeBuilder(TreeBuilder): + + def __init__(self, html=0): + TreeBuilder.__init__(self, html) + self._parser.StartNamespaceDeclHandler = self._start_ns + self._parser.EndNamespaceDeclHandler = self._end_ns + self.namespaces = [] + + def _start(self, tag, attrib_in): + elem = TreeBuilder._start(self, tag, attrib_in) + self.start(elem) + + def _start_list(self, tag, attrib_in): + elem = TreeBuilder._start_list(self, tag, attrib_in) + self.start(elem) + + def _end(self, tag): + elem = TreeBuilder._end(self, tag) + self.end(elem) + + def _start_ns(self, prefix, value): + self.namespaces.insert(0, (prefix, value)) + + def _end_ns(self, prefix): + assert self.namespaces.pop(0)[0] == prefix, "implementation confused" + + ## + # Hook method that's called when a new element has been opened. + # May access the namespaces attribute. + # + # @param element The new element. The tag name and attributes are, + # set, but it has no children, and the text and tail attributes + # are still empty. + + def start(self, element): + pass + + ## + # Hook method that's called when a new element has been closed. + # May access the namespaces attribute. + # + # @param element The new element. + + def end(self, element): + pass Added: external/elementtree-1.2.6-20050316/elementtree/__init__.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/elementtree/__init__.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,30 @@ +# $Id: __init__.py 1821 2004-06-03 16:57:49Z fredrik $ +# elementtree package + +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- Added: external/elementtree-1.2.6-20050316/samples/simple-ns.xml ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/samples/simple-ns.xml Mon Dec 12 15:45:19 2005 @@ -0,0 +1,5 @@ + + text + texttail + + Added: external/elementtree-1.2.6-20050316/samples/simple.xml ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/samples/simple.xml Mon Dec 12 15:45:19 2005 @@ -0,0 +1,5 @@ + + text + texttail + + Added: external/elementtree-1.2.6-20050316/selftest.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/selftest.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,1005 @@ +# $Id: selftest.py 2326 2005-03-17 07:45:21Z fredrik $ +# -*- coding: iso-8859-1 -*- +# elementtree selftest program + +# this test script uses Python's "doctest" module to check that the +# *test script* works as expected. + +# TODO: add more elementtree method tests +# TODO: add xml/html parsing tests +# TODO: etc + +import sys, string, StringIO + +from elementtree import ElementTree +from elementtree import ElementPath +from elementtree import ElementInclude +from elementtree import HTMLTreeBuilder +from elementtree import SimpleXMLWriter + +def serialize(elem, encoding=None): + import StringIO + file = StringIO.StringIO() + tree = ElementTree.ElementTree(elem) + if encoding: + tree.write(file, encoding) + else: + tree.write(file) + return file.getvalue() + +def summarize(elem): + return elem.tag + +def summarize_list(seq): + return map(summarize, seq) + +def normalize_crlf(tree): + for elem in tree.getiterator(): + if elem.text: elem.text = string.replace(elem.text, "\r\n", "\n") + if elem.tail: elem.tail = string.replace(elem.tail, "\r\n", "\n") + +SAMPLE_XML = ElementTree.XML(""" + + text + +

+ subtext +
+ +""") + +# +# interface tests + +def check_string(string): + len(string) + for char in string: + if len(char) != 1: + print "expected one-character string, got %r" % char + new_string = string + "" + new_string = string + " " + string[:0] + +def check_string_or_none(value): + if value is None: + return + return check_string(value) + +def check_mapping(mapping): + len(mapping) + keys = mapping.keys() + items = mapping.items() + for key in keys: + item = mapping[key] + mapping["key"] = "value" + if mapping["key"] != "value": + print "expected value string, got %r" % mapping["key"] + +def check_element(element): + if not hasattr(element, "tag"): + print "no tag member" + if not hasattr(element, "attrib"): + print "no attrib member" + if not hasattr(element, "text"): + print "no text member" + if not hasattr(element, "tail"): + print "no tail member" + check_string(element.tag) + check_mapping(element.attrib) + check_string_or_none(element.text) + check_string_or_none(element.tail) + for elem in element: + check_element(elem) + +def check_element_tree(tree): + check_element(tree.getroot()) + +# -------------------------------------------------------------------- +# element tree tests + +def sanity(): + """ + >>> from elementtree.ElementTree import * + >>> from elementtree.ElementInclude import * + >>> from elementtree.ElementPath import * + >>> from elementtree.HTMLTreeBuilder import * + >>> from elementtree.SimpleXMLTreeBuilder import * + >>> from elementtree.SimpleXMLWriter import * + >>> from elementtree.TidyTools import * + >>> from elementtree.XMLTreeBuilder import * + """ + +def version(): + """ + >>> ElementTree.VERSION + '1.2.6' + """ + +def interface(): + """ + Test element tree interface. + + >>> element = ElementTree.Element("tag") + >>> check_element(element) + >>> tree = ElementTree.ElementTree(element) + >>> check_element_tree(tree) + """ + +def simplefind(): + """ + Test find methods using the elementpath fallback. + + >>> CurrentElementPath = ElementTree.ElementPath + >>> ElementTree.ElementPath = ElementTree._SimpleElementPath() + >>> elem = SAMPLE_XML + >>> elem.find("tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog") + >>> elem.findtext("tog", "default") + 'default' + >>> ElementTree.ElementTree(elem).findtext("tag") + 'text' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + + Path syntax doesn't work in this case. + + >>> elem.find("section/tag") + >>> elem.findtext("section/tag") + >>> elem.findall("section/tag") + [] + + >>> ElementTree.ElementPath = CurrentElementPath + """ + +def find(): + """ + Test find methods (including xpath syntax). + + >>> elem = SAMPLE_XML + >>> elem.find("tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.find("section/tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("section/tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog") + >>> elem.findtext("tog", "default") + 'default' + >>> ElementTree.ElementTree(elem).findtext("tag") + 'text' + >>> elem.findtext("section/tag") + 'subtext' + >>> ElementTree.ElementTree(elem).findtext("section/tag") + 'subtext' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall("*")) + ['tag', 'tag', 'section'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("section/tag")) + ['tag'] + >>> summarize_list(elem.findall("section//tag")) + ['tag'] + >>> summarize_list(elem.findall("section/*")) + ['tag'] + >>> summarize_list(elem.findall("section//*")) + ['tag'] + >>> summarize_list(elem.findall("section/.//*")) + ['tag'] + >>> summarize_list(elem.findall("*/*")) + ['tag'] + >>> summarize_list(elem.findall("*//*")) + ['tag'] + >>> summarize_list(elem.findall("*/tag")) + ['tag'] + >>> summarize_list(elem.findall("*/./tag")) + ['tag'] + >>> summarize_list(elem.findall("./tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("././tag")) + ['tag', 'tag'] + >>> summarize_list(ElementTree.ElementTree(elem).findall("/tag")) + ['tag', 'tag'] + >>> summarize_list(ElementTree.ElementTree(elem).findall("./tag")) + ['tag', 'tag'] + """ + +def bad_find(): + """ + Check bad or unsupported path expressions. + + >>> elem = SAMPLE_XML + >>> elem.findall("/tag") + Traceback (most recent call last): + SyntaxError: cannot use absolute path on element + >>> elem.findall("../tag") + Traceback (most recent call last): + SyntaxError: unsupported path syntax (..) + >>> elem.findall("section//") + Traceback (most recent call last): + SyntaxError: path cannot end with // + >>> elem.findall("tag[tag]") + Traceback (most recent call last): + SyntaxError: expected path separator ([) + """ + +def parsefile(): + """ + Test parsing from file. + + >>> tree = ElementTree.parse("samples/simple.xml") + >>> normalize_crlf(tree) + >>> tree.write(sys.stdout) + + text + texttail + + + >>> tree = ElementTree.parse("samples/simple-ns.xml") + >>> normalize_crlf(tree) + >>> tree.write(sys.stdout) + + text + texttail + + + """ + +def parsehtml(): + """ + Test HTML parsing. + + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

spamegg

") + >>> serialize(p.close()) + '

spamegg

' + """ + +def parseliteral(): + r""" + >>> element = ElementTree.XML("text") + >>> ElementTree.ElementTree(element).write(sys.stdout) + text + >>> element = ElementTree.fromstring("text") + >>> ElementTree.ElementTree(element).write(sys.stdout) + text + >>> print ElementTree.tostring(element) + text + >>> print ElementTree.tostring(element, "ascii") + + text + >>> _, ids = ElementTree.XMLID("text") + >>> len(ids) + 0 + >>> _, ids = ElementTree.XMLID("text") + >>> len(ids) + 1 + >>> ids["body"].tag + 'body' + """ + +def simpleparsefile(): + """ + Test the xmllib-based parser. + + >>> from elementtree import SimpleXMLTreeBuilder + >>> parser = SimpleXMLTreeBuilder.TreeBuilder() + >>> tree = ElementTree.parse("samples/simple.xml", parser) + >>> normalize_crlf(tree) + >>> tree.write(sys.stdout) + + text + texttail + + + """ + +def iterparse(): + """ + Test iterparse interface. + + >>> iterparse = ElementTree.iterparse + + >>> context = iterparse("samples/simple.xml") + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + end empty-element + end root + >>> context.root.tag + 'root' + + >>> context = iterparse("samples/simple-ns.xml") + >>> for action, elem in context: + ... print action, elem.tag + end {namespace}element + end {namespace}element + end {namespace}empty-element + end {namespace}root + + >>> events = () + >>> context = iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = () + >>> context = iterparse("samples/simple.xml", events=events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = ("start", "end") + >>> context = iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + start root + start element + end element + start element + end element + start empty-element + end empty-element + end root + + >>> events = ("start", "end", "start-ns", "end-ns") + >>> context = iterparse("samples/simple-ns.xml", events) + >>> for action, elem in context: + ... if action in ("start", "end"): + ... print action, elem.tag + ... else: + ... print action, elem + start-ns ('', 'namespace') + start {namespace}root + start {namespace}element + end {namespace}element + start {namespace}element + end {namespace}element + start {namespace}empty-element + end {namespace}empty-element + end {namespace}root + end-ns None + + """ + +def fancyparsefile(): + """ + Test the "fancy" parser. + + Sanity check. + >>> from elementtree import XMLTreeBuilder + >>> parser = XMLTreeBuilder.FancyTreeBuilder() + >>> tree = ElementTree.parse("samples/simple.xml", parser) + >>> normalize_crlf(tree) + >>> tree.write(sys.stdout) + + text + texttail + + + + Callback check. + >>> class MyFancyParser(XMLTreeBuilder.FancyTreeBuilder): + ... def start(self, elem): + ... print "START", elem.tag + ... def end(self, elem): + ... print "END", elem.tag + >>> parser = MyFancyParser() + >>> tree = ElementTree.parse("samples/simple.xml", parser) + START root + START element + END element + START element + END element + START empty-element + END empty-element + END root + """ + +def writefile(): + """ + >>> elem = ElementTree.Element("tag") + >>> elem.text = "text" + >>> serialize(elem) + 'text' + >>> ElementTree.SubElement(elem, "subtag").text = "subtext" + >>> serialize(elem) + 'textsubtext' + """ + +def writestring(): + """ + >>> elem = ElementTree.XML("text") + >>> ElementTree.tostring(elem) + 'text' + >>> elem = ElementTree.fromstring("text") + >>> ElementTree.tostring(elem) + 'text' + """ + +def encoding(): + r""" + Test encoding issues. + + >>> elem = ElementTree.Element("tag") + >>> elem.text = u"abc" + >>> serialize(elem) + 'abc' + >>> serialize(elem, "utf-8") + 'abc' + >>> serialize(elem, "us-ascii") + 'abc' + >>> serialize(elem, "iso-8859-1") + "\nabc" + + >>> elem.text = "<&\"\'>" + >>> serialize(elem) + '<&"\'>' + >>> serialize(elem, "utf-8") + '<&"\'>' + >>> serialize(elem, "us-ascii") # cdata characters + '<&"\'>' + >>> serialize(elem, "iso-8859-1") + '\n<&"\'>' + + >>> elem.attrib["key"] = "<&\"\'>" + >>> elem.text = None + >>> serialize(elem) + '' + >>> serialize(elem, "utf-8") + '' + >>> serialize(elem, "us-ascii") + '' + >>> serialize(elem, "iso-8859-1") + '\n' + + >>> elem.text = u'\xe5\xf6\xf6<>' + >>> elem.attrib.clear() + >>> serialize(elem) + 'åöö<>' + >>> serialize(elem, "utf-8") + '\xc3\xa5\xc3\xb6\xc3\xb6<>' + >>> serialize(elem, "us-ascii") + 'åöö<>' + >>> serialize(elem, "iso-8859-1") + "\n\xe5\xf6\xf6<>" + + >>> elem.attrib["key"] = u'\xe5\xf6\xf6<>' + >>> elem.text = None + >>> serialize(elem) + '' + >>> serialize(elem, "utf-8") + '' + >>> serialize(elem, "us-ascii") + '' + >>> serialize(elem, "iso-8859-1") + '\n' + + """ + +ENTITY_XML = """\ + +%user-entities; +]> +&entity; +""" + +def entity(): + """ + Test entity handling. + + 1) bad entities + + >>> ElementTree.XML("&entity;") + Traceback (most recent call last): + ExpatError: undefined entity: line 1, column 10 + + >>> ElementTree.XML(ENTITY_XML) + Traceback (most recent call last): + ExpatError: undefined entity &entity;: line 5, column 10 + + (add more tests here) + + """ + +def namespace(): + """ + Test namespace issues. + + 1) xml namespace + + >>> elem = ElementTree.XML("") + >>> serialize(elem) # 1.1 + '' + + 2) other "well-known" namespaces + + >>> elem = ElementTree.XML("") + >>> serialize(elem) # 2.1 + '' + + >>> elem = ElementTree.XML("") + >>> serialize(elem) # 2.2 + '' + + >>> elem = ElementTree.XML("") + >>> serialize(elem) # 2.3 + '' + + 3) unknown namespaces + + """ + +def qname(): + """ + Test QName handling. + + 1) decorated tags + + >>> elem = ElementTree.Element("{uri}tag") + >>> serialize(elem) # 1.1 + '' + >>> elem = ElementTree.Element(ElementTree.QName("{uri}tag")) + >>> serialize(elem) # 1.2 + '' + >>> elem = ElementTree.Element(ElementTree.QName("uri", "tag")) + >>> serialize(elem) # 1.3 + '' + + 2) decorated attributes + + >>> elem.clear() + >>> elem.attrib["{uri}key"] = "value" + >>> serialize(elem) # 2.1 + '' + + >>> elem.clear() + >>> elem.attrib[ElementTree.QName("{uri}key")] = "value" + >>> serialize(elem) # 2.2 + '' + + 3) decorated values are not converted by default, but the + QName wrapper can be used for values + + >>> elem.clear() + >>> elem.attrib["{uri}key"] = "{uri}value" + >>> serialize(elem) # 3.1 + '' + + >>> elem.clear() + >>> elem.attrib["{uri}key"] = ElementTree.QName("{uri}value") + >>> serialize(elem) # 3.2 + '' + + >>> elem.clear() + >>> subelem = ElementTree.Element("tag") + >>> subelem.attrib["{uri1}key"] = ElementTree.QName("{uri2}value") + >>> elem.append(subelem) + >>> elem.append(subelem) + >>> serialize(elem) # 3.3 + '' + + """ + +def xpath_tokenizer(p): + """ + Test the XPath tokenizer. + + >>> # tests from the xml specification + >>> xpath_tokenizer("*") + ['*'] + >>> xpath_tokenizer("text()") + ['text', '()'] + >>> xpath_tokenizer("@name") + ['@', 'name'] + >>> xpath_tokenizer("@*") + ['@', '*'] + >>> xpath_tokenizer("para[1]") + ['para', '[', '1', ']'] + >>> xpath_tokenizer("para[last()]") + ['para', '[', 'last', '()', ']'] + >>> xpath_tokenizer("*/para") + ['*', '/', 'para'] + >>> xpath_tokenizer("/doc/chapter[5]/section[2]") + ['/', 'doc', '/', 'chapter', '[', '5', ']', '/', 'section', '[', '2', ']'] + >>> xpath_tokenizer("chapter//para") + ['chapter', '/', '/', 'para'] + >>> xpath_tokenizer("//para") + ['/', '/', 'para'] + >>> xpath_tokenizer("//olist/item") + ['/', '/', 'olist', '/', 'item'] + >>> xpath_tokenizer(".") + ['.'] + >>> xpath_tokenizer(".//para") + ['.', '/', '/', 'para'] + >>> xpath_tokenizer("..") + ['..'] + >>> xpath_tokenizer("../@lang") + ['..', '/', '@', 'lang'] + >>> xpath_tokenizer("chapter[title]") + ['chapter', '[', 'title', ']'] + >>> xpath_tokenizer("employee[@secretary and @assistant]") + ['employee', '[', '@', 'secretary', '', 'and', '', '@', 'assistant', ']'] + + >>> # additional tests + >>> xpath_tokenizer("{http://spam}egg") + ['{http://spam}egg'] + >>> xpath_tokenizer("./spam.egg") + ['.', '/', 'spam.egg'] + >>> xpath_tokenizer(".//{http://spam}egg") + ['.', '/', '/', '{http://spam}egg'] + """ + out = [] + for op, tag in ElementPath.xpath_tokenizer(p): + out.append(op or tag) + return out + +# +# xinclude tests (samples from appendix C of the xinclude specification) + +XINCLUDE = {} + +XINCLUDE["C1.xml"] = """\ + + +

120 Mz is adequate for an average home user.

+ +
+""" + +XINCLUDE["disclaimer.xml"] = """\ + + +

The opinions represented herein represent those of the individual + and should not be interpreted as official policy endorsed by this + organization.

+
+""" + +XINCLUDE["C2.xml"] = """\ + + +

This document has been accessed + times.

+
+""" + +XINCLUDE["count.txt"] = "324387" + +XINCLUDE["C3.xml"] = """\ + + +

The following is the source of the "data.xml" resource:

+ +
+""" + +XINCLUDE["data.xml"] = """\ + + + + +""" + +XINCLUDE["C5.xml"] = """\ + +
+ + + + Report error + + + +
+""" + +XINCLUDE["default.xml"] = """\ + + +

Example.

+ +
+""" + +def xinclude_loader(href, parse="xml", encoding=None): + try: + data = XINCLUDE[href] + except KeyError: + raise IOError("resource not found") + if parse == "xml": + return ElementTree.XML(data) + return data + +def xinclude(): + r""" + Basic inclusion example (XInclude C.1) + + >>> document = xinclude_loader("C1.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(document) # C1 + +

120 Mz is adequate for an average home user.

+ +

The opinions represented herein represent those of the individual + and should not be interpreted as official policy endorsed by this + organization.

+
+
+ + Textual inclusion example (XInclude C.2) + + >>> document = xinclude_loader("C2.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(document) # C2 + +

This document has been accessed + 324387 times.

+
+ + Textual inclusion of XML example (XInclude C.3) + + >>> document = xinclude_loader("C3.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(document) # C3 + +

The following is the source of the "data.xml" resource:

+ <?xml version='1.0'?> + <data> + <item><![CDATA[Brooks & Shields]]></item> + </data> + +
+ + Fallback example (XInclude C.5) + Note! Fallback support is not yet implemented + + >>> document = xinclude_loader("C5.xml") + >>> ElementInclude.include(document, xinclude_loader) + Traceback (most recent call last): + IOError: resource not found + >>> # print serialize(document) # C5 + + """ + +def xinclude_default(): + """ + >>> document = xinclude_loader("default.xml") + >>> ElementInclude.include(document) + >>> print serialize(document) # default + +

Example.

+ + text + texttail + + +
+ """ + +# +# xmlwriter + +def xmlwriter(): + r""" + >>> file = StringIO.StringIO() + >>> w = SimpleXMLWriter.XMLWriter(file) + >>> html = w.start("html") + >>> x = w.start("head") + >>> w.element("title", "my document") + >>> w.data("\n") + >>> w.element("meta", name="hello", value="goodbye") + >>> w.data("\n") + >>> w.end() + >>> x = w.start("body") + >>> w.element("h1", "this is a heading") + >>> w.data("\n") + >>> w.element("p", u"this is a paragraph") + >>> w.data("\n") + >>> w.element("p", u"reserved characters: <&>") + >>> w.data("\n") + >>> w.element("p", u"detta är också ett stycke") + >>> w.data("\n") + >>> w.close(html) + >>> print file.getvalue() + my document + +

this is a heading

+

this is a paragraph

+

reserved characters: <&>

+

detta är också ett stycke

+ + """ + +# -------------------------------------------------------------------- +# reported bugs + +def bug_xmltoolkit21(): + """ + marshaller gives obscure errors for non-string values + + >>> elem = ElementTree.Element(123) + >>> serialize(elem) # tag + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + >>> elem = ElementTree.Element("elem") + >>> elem.text = 123 + >>> serialize(elem) # text + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + >>> elem = ElementTree.Element("elem") + >>> elem.tail = 123 + >>> serialize(elem) # tail + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + >>> elem = ElementTree.Element("elem") + >>> elem.set(123, "123") + >>> serialize(elem) # attribute key + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + >>> elem = ElementTree.Element("elem") + >>> elem.set("123", 123) + >>> serialize(elem) # attribute value + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + + """ + +def bug_xmltoolkit25(): + """ + typo in ElementTree.findtext + + >>> tree = ElementTree.ElementTree(SAMPLE_XML) + >>> tree.findtext("tag") + 'text' + >>> tree.findtext("section/tag") + 'subtext' + """ + +def bug_xmltoolkit28(): + """ + .//tag causes exceptions + + >>> tree = ElementTree.XML("
") + >>> summarize_list(tree.findall(".//thead")) + [] + >>> summarize_list(tree.findall(".//tbody")) + ['tbody'] + """ + +def bug_xmltoolkitX1(): + """ + dump() doesn't flush the output buffer + + >>> tree = ElementTree.XML("
") + >>> ElementTree.dump(tree); sys.stdout.write("tail") +
+ tail + """ + +def bug_xmltoolkit39(): + """ + non-ascii element and attribute names doesn't work + + >>> tree = ElementTree.XML("") + >>> ElementTree.tostring(tree, "utf-8") + '' + + >>> tree = ElementTree.XML("") + >>> tree.attrib + {u'\\xe4ttr': u'v\\xe4lue'} + >>> ElementTree.tostring(tree, "utf-8") + '' + + >>> tree = ElementTree.XML("text") + >>> ElementTree.tostring(tree, "utf-8") + 'text' + + >>> tree = ElementTree.Element(u"täg") + >>> ElementTree.tostring(tree, "utf-8") + '' + + >>> tree = ElementTree.Element("tag") + >>> tree.set(u"ättr", u"välue") + >>> ElementTree.tostring(tree, "utf-8") + '' + + """ + +def bug_xmltoolkit45(): + """ + problems parsing mixed unicode/non-ascii html documents + + latin-1 text + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

välue

") + >>> serialize(p.close()) + '

välue

' + + utf-8 text + >>> p = HTMLTreeBuilder.TreeBuilder(encoding="utf-8") + >>> p.feed("

v\xc3\xa4lue

") + >>> serialize(p.close()) + '

välue

' + + utf-8 text using meta tag + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

v\xc3\xa4lue

") + >>> serialize(p.close().find("p")) + '

välue

' + + latin-1 character references + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

välue

") + >>> serialize(p.close()) + '

välue

' + + latin-1 character entities + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

välue

") + >>> serialize(p.close()) + '

välue

' + + mixed latin-1 text and unicode entities + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

”välue”

") + >>> serialize(p.close()) + '

”välue”

' + + mixed unicode and latin-1 entities + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

”välue”

") + >>> serialize(p.close()) + '

”välue”

' + + """ + +def bug_xmltoolkit46(): + """ + problems parsing open BR tags + + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

key
value

") + >>> serialize(p.close()) + '

key
value

' + + """ + +def bug_xmltoolkit54(): + """ + problems handling internally defined entities + + >>> e = ElementTree.XML("]>&ldots;") + >>> serialize(e) + '' + """ + +def bug_xmltoolkit55(): + """ + make sure we're reporting the first error, not the last + + >>> e = ElementTree.XML("&ldots;&ndots;&rdots;") + Traceback (most recent call last): + ExpatError: undefined entity &ldots;: line 1, column 36 + """ + +# -------------------------------------------------------------------- + +if __name__ == "__main__": + import doctest, selftest + failed, tested = doctest.testmod(selftest) + print tested - failed, "tests ok." Added: external/elementtree-1.2.6-20050316/setup.py ============================================================================== --- (empty file) +++ external/elementtree-1.2.6-20050316/setup.py Mon Dec 12 15:45:19 2005 @@ -0,0 +1,44 @@ +#!/usr/bin/env python +# +# Setup script for the elementtree library +# $Id: setup.py 2326 2005-03-17 07:45:21Z fredrik $ +# +# Usage: python setup.py install +# + +from distutils.core import setup + +try: + # add download_url syntax to distutils + from distutils.dist import DistributionMetadata + DistributionMetadata.classifiers = None + DistributionMetadata.download_url = None +except: + pass + +DESCRIPTION="ElementTree - a light-weight XML object model for Python." + +LONG_DESCRIPTION="""\ +The Element type is a flexible container object, designed to store +hierarchical data structures in memory. Element structures can be +converted to and from XML.""" + +setup( + name="elementtree", + version="1.2.6-20050316", + author="Fredrik Lundh", + author_email="fredrik at pythonware.com", + url="http://effbot.org/zone/element-index.htm", + description=DESCRIPTION, + long_description=LONG_DESCRIPTION, + download_url="http://effbot.org/downloads#elementtree", + license="Python (MIT style)", + packages=["elementtree"], + platforms="Python 1.5.2 and later.", + classifiers=[ + "Development Status :: 6 - Mature", + "Operating System :: OS Independent", + "Topic :: Text Processing :: Markup :: HTML", + "Topic :: Text Processing :: Markup :: XML", + ] + ) From python-checkins at python.org Mon Dec 12 15:59:17 2005 From: python-checkins at python.org (andrew.kuchling) Date: Mon, 12 Dec 2005 15:59:17 +0100 (CET) Subject: [Python-checkins] commit of r41650 - sandbox/trunk/seealso/make-seealso.py sandbox/trunk/seealso/parse-seealso.py Message-ID: <20051212145917.F3F9C1E4018@bag.python.org> Author: andrew.kuchling Date: Mon Dec 12 15:59:17 2005 New Revision: 41650 Modified: sandbox/trunk/seealso/make-seealso.py sandbox/trunk/seealso/parse-seealso.py Log: Parse document author, URL, and title, and include them in the generated output Modified: sandbox/trunk/seealso/make-seealso.py ============================================================================== --- sandbox/trunk/seealso/make-seealso.py (original) +++ sandbox/trunk/seealso/make-seealso.py Mon Dec 12 15:59:17 2005 @@ -8,7 +8,7 @@ def main (): if len(sys.argv) < 3: - print 'Usage: %s database-filename example-dir' + print 'Usage: %s database-filename example-dir' % sys.argv[0] sys.exit(1) db_file = sys.argv[1] @@ -18,7 +18,6 @@ for fn in os.listdir(example_dir): if fn.endswith('.tex'): p = os.path.join(example_dir, fn) - print p os.remove(p) # Read dictionary @@ -40,14 +39,30 @@ # Write file containing examples for this module p = os.path.join(example_dir, module + '.tex') output = open(p, 'w') - for title, url, excerpt in examples: + for (url, document_title, document_url, + author, title, excerpt) in examples: + + attribution = "" + if document_title: + attribution += ' from "%s"' % tex_escape(document_title) + if document_url: + attribution += ' (\url{%s})' % (tex_escape(document_url)) + if author: + attribution += " by %s" % (tex_escape(author)) + + if attribution: + attribution = ',' + attribution + if excerpt is None: - output.write("\seeurl{%s}{%s}\n" % (tex_escape(url), - tex_escape(title))) + output.write("\seeurl{%s}{%s%s.}\n" % (tex_escape(url), + tex_escape(title), + attribution, + )) else: - output.write("\seeurl{%s}{%s\n\n%s}\n" % (tex_escape(url), - tex_escape(title), - tex_escape(excerpt))) + output.write("\seeurl{%s}{%s%s.\n\n%s}\n" % (tex_escape(url), + tex_escape(title), + attribution, + tex_escape(excerpt))) output.close() Modified: sandbox/trunk/seealso/parse-seealso.py ============================================================================== --- sandbox/trunk/seealso/parse-seealso.py (original) +++ sandbox/trunk/seealso/parse-seealso.py Mon Dec 12 15:59:17 2005 @@ -6,6 +6,9 @@ import urllib, pickle from xml.dom import minidom +# Dublin Core namespace +DC_NS = 'http://purl.org/dc/elements/1.1/' + def main (): if len(sys.argv) < 3: print 'Usage: %s URL database-filename' @@ -30,7 +33,27 @@ elif c.nodeType == c.ELEMENT_NODE: t += get_text(c) return t - + + # Get document title and author + author = document_title = document_url = None + + document_title_nodes = list(dom.getElementsByTagNameNS(DC_NS, 'title')) + document_url_nodes = list(dom.getElementsByTagNameNS(DC_NS, 'identifier')) + author_nodes = list(dom.getElementsByTagNameNS(DC_NS, 'creator')) + + assert len(document_title_nodes) <= 1 + assert len(document_url_nodes) <= 1 + assert len(author_nodes) <= 1 + + if document_title_nodes: + document_title = get_text(document_title_nodes[0]) + if author_nodes: + author = get_text(author_nodes[0]) + if document_url_nodes: + document_url = get_text(document_url_nodes[0]) + + + # Loop over items for item in dom.getElementsByTagNameNS(None, 'item'): href = item.getAttributeNS(None, 'href') title_node = item.getElementsByTagNameNS(None, 'title')[0] @@ -47,7 +70,8 @@ target_nodes = item.getElementsByTagNameNS(None, 'target') for t in target_nodes: target = get_text(t) - L.append((target, title, href, excerpt)) + L.append((target, href, document_title, document_url, author, + title, excerpt)) @@ -61,18 +85,20 @@ input = open(db_file, 'rb') db = pickle.load(input) input.close() - for module, title, url, excerpt in L: + for entry in L: # Check if URL is already listed; if yes, delete the old entry - exlist = db.setdefault(module, []) - exlist = [t for t in exlist if t[1] != url] + module = entry[0] + url = entry[1] + exlist = db.get(module, []) + exlist = [t for t in exlist if t[0] != url] # Append to list - exlist.append((title, url, excerpt)) + exlist.append(entry[1:]) # Reinsert (since the list-comp created a new list) db[module] = exlist - - ##import pprint ; pprint.pprint(db) + + import pprint ; pprint.pprint(db) output = open(db_file, 'wb') pickle.dump(db, output) output.close() From python-checkins at python.org Mon Dec 12 16:10:49 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 16:10:49 +0100 (CET) Subject: [Python-checkins] commit of r41651 - python/trunk/Lib/xml/etree python/trunk/Lib/xml/etree/ElementInclude.py python/trunk/Lib/xml/etree/ElementPath.py python/trunk/Lib/xml/etree/ElementTree.py python/trunk/Lib/xml/etree/__init__.py Message-ID: <20051212151049.6310D1E4002@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 16:10:44 2005 New Revision: 41651 Added: python/trunk/Lib/xml/etree/ python/trunk/Lib/xml/etree/ElementInclude.py - copied unchanged from r41650, external/elementtree-1.2.6-20050316/elementtree/ElementInclude.py python/trunk/Lib/xml/etree/ElementPath.py - copied unchanged from r41650, external/elementtree-1.2.6-20050316/elementtree/ElementPath.py python/trunk/Lib/xml/etree/ElementTree.py - copied unchanged from r41650, external/elementtree-1.2.6-20050316/elementtree/ElementTree.py python/trunk/Lib/xml/etree/__init__.py - copied unchanged from r41650, external/elementtree-1.2.6-20050316/elementtree/__init__.py Log: added ElementTree core components to xml.etree From python-checkins at python.org Mon Dec 12 19:54:56 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 19:54:56 +0100 (CET) Subject: [Python-checkins] commit of r41652 - in python/trunk: Doc/whatsnew/whatsnew25.tex Lib/test/xmltests.py Lib/xml/__init__.py Misc/NEWS Message-ID: <20051212185456.897451E4002@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 19:54:55 2005 New Revision: 41652 Modified: python/trunk/ (props changed) python/trunk/Doc/whatsnew/whatsnew25.tex python/trunk/Lib/test/xmltests.py python/trunk/Lib/xml/__init__.py python/trunk/Misc/NEWS Log: r1068 at spiff: Fredrik | 2005-12-12 19:50:30 +0100 assorted xml.etree tweaks Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Mon Dec 12 19:54:55 2005 @@ -421,6 +421,12 @@ % patch 918101 (Contributed by Lars Gust\"abel.) +\item A new package \module{xml.etree} has been added, which contains +a subset of the ElementTree XML library. Available modules are +\module{ElementTree}, \module{ElementPath}, and +\module{ElementInclude}, from ElementTree 1.2.6. (Contributed by +Fredrik Lundh.) + \item The \module{xmlrpclib} module now supports returning \class{datetime} objects for the XML-RPC date type. Supply \code{use_datetime=True} to the \function{loads()} function @@ -437,6 +443,8 @@ % XXX new distutils features: upload +% XXX should hashlib perhaps be described here instead? +% XXX should xml.etree perhaps be described here instead? Modified: python/trunk/Lib/test/xmltests.py ============================================================================== --- python/trunk/Lib/test/xmltests.py (original) +++ python/trunk/Lib/test/xmltests.py Mon Dec 12 19:54:55 2005 @@ -15,5 +15,6 @@ runtest("test.test_minidom") runtest("test.test_pyexpat") runtest("test.test_sax") +runtest("test.test_xml_etree") runtest("test.test_xmllib") runtest("test.test_xmlrpc") Modified: python/trunk/Lib/xml/__init__.py ============================================================================== --- python/trunk/Lib/xml/__init__.py (original) +++ python/trunk/Lib/xml/__init__.py Mon Dec 12 19:54:55 2005 @@ -1,6 +1,6 @@ """Core XML support for Python. -This package contains three sub-packages: +This package contains four sub-packages: dom -- The W3C Document Object Model. This supports DOM Level 1 + Namespaces. @@ -10,10 +10,14 @@ sax -- The Simple API for XML, developed by XML-Dev, led by David Megginson and ported to Python by Lars Marius Garshol. This supports the SAX 2 API. + +etree -- The ElementTree XML library. This is a subset of the full + ElementTree XML release. + """ -__all__ = ["dom", "parsers", "sax"] +__all__ = ["dom", "parsers", "sax", "etree"] # When being checked-out without options, this has the form # "Revision: x.y " Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Mon Dec 12 19:54:55 2005 @@ -292,6 +292,10 @@ Library ------- +- Added a subset of Fredrik Lundh's ElementTree package. Available + modules are xml.etree.ElementTree, xml.etree.ElementPath, and + xml.etree.ElementInclude, from ElementTree 1.2.6. + - Patch #1162825: Support non-ASCII characters in IDLE window titles. - Bug #1365984: urllib now opens "data:" URLs again. From python-checkins at python.org Mon Dec 12 21:03:03 2005 From: python-checkins at python.org (andrew.kuchling) Date: Mon, 12 Dec 2005 21:03:03 +0100 (CET) Subject: [Python-checkins] commit of r41653 - sandbox/trunk/seealso/parse-seealso.py Message-ID: <20051212200303.D466E1E4002@bag.python.org> Author: andrew.kuchling Date: Mon Dec 12 21:03:03 2005 New Revision: 41653 Modified: sandbox/trunk/seealso/parse-seealso.py Log: Ignore non-HTTP dc:identifiers; silence debug print Modified: sandbox/trunk/seealso/parse-seealso.py ============================================================================== --- sandbox/trunk/seealso/parse-seealso.py (original) +++ sandbox/trunk/seealso/parse-seealso.py Mon Dec 12 21:03:03 2005 @@ -51,6 +51,8 @@ author = get_text(author_nodes[0]) if document_url_nodes: document_url = get_text(document_url_nodes[0]) + if document_url == '' or not document_url.startswith('http://'): + document_url = None # Loop over items @@ -98,7 +100,7 @@ # Reinsert (since the list-comp created a new list) db[module] = exlist - import pprint ; pprint.pprint(db) + #import pprint ; pprint.pprint(db) output = open(db_file, 'wb') pickle.dump(db, output) output.close() From python-checkins at python.org Mon Dec 12 21:03:59 2005 From: python-checkins at python.org (andrew.kuchling) Date: Mon, 12 Dec 2005 21:03:59 +0100 (CET) Subject: [Python-checkins] commit of r41654 - sandbox/trunk/seealso/parse-seealso.py Message-ID: <20051212200359.DA6191E4002@bag.python.org> Author: andrew.kuchling Date: Mon Dec 12 21:03:59 2005 New Revision: 41654 Modified: sandbox/trunk/seealso/parse-seealso.py Log: Strip whitespace Modified: sandbox/trunk/seealso/parse-seealso.py ============================================================================== --- sandbox/trunk/seealso/parse-seealso.py (original) +++ sandbox/trunk/seealso/parse-seealso.py Mon Dec 12 21:03:59 2005 @@ -32,7 +32,7 @@ t += c.nodeValue elif c.nodeType == c.ELEMENT_NODE: t += get_text(c) - return t + return t.strip() # Get document title and author author = document_title = document_url = None From python-checkins at python.org Mon Dec 12 21:19:44 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 21:19:44 +0100 (CET) Subject: [Python-checkins] commit of r41655 - in python/trunk: Lib/test/test_xml_etree.py Message-ID: <20051212201944.D969F1E4002@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 21:19:44 2005 New Revision: 41655 Added: python/trunk/Lib/test/test_xml_etree.py Modified: python/trunk/ (props changed) Log: added xml.etree test (enough of the ElementTree selftest to make sure that all included components work) Added: python/trunk/Lib/test/test_xml_etree.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/test_xml_etree.py Mon Dec 12 21:19:44 2005 @@ -0,0 +1,339 @@ +# xml.etree test. This file contains enough tests to make sure that +# all included components work as they should. For a more extensive +# test suite, see the selftest script in the ElementTree distribution. + +import doctest, sys + +from test import test_support + +SAMPLE_XML = """ + + text + +
+ subtext +
+ +""" + +SAMPLE_XML_NS = """ + + text + +
+ subtext +
+ +""" + +def sanity(): + """ + Import sanity. + + >>> from xml.etree import ElementTree + >>> from xml.etree import ElementInclude + >>> from xml.etree import ElementPath + """ + +def check_method(method): + if not callable(method): + print method, "not callable" + +def serialize(ET, elem, encoding=None): + import StringIO + file = StringIO.StringIO() + tree = ET.ElementTree(elem) + if encoding: + tree.write(file, encoding) + else: + tree.write(file) + return file.getvalue() + +def summarize(elem): + return elem.tag + +def summarize_list(seq): + return map(summarize, seq) + +def interface(): + """ + Test element tree interface. + + >>> from xml.etree import ElementTree as ET + + >>> element = ET.Element("tag", key="value") + >>> tree = ET.ElementTree(element) + + Make sure all standard element methods exist. + + >>> check_method(element.append) + >>> check_method(element.insert) + >>> check_method(element.remove) + >>> check_method(element.getchildren) + >>> check_method(element.find) + >>> check_method(element.findall) + >>> check_method(element.findtext) + >>> check_method(element.clear) + >>> check_method(element.get) + >>> check_method(element.set) + >>> check_method(element.keys) + >>> check_method(element.items) + >>> check_method(element.getiterator) + + Basic method sanity checks. + + >>> serialize(ET, element) # 1 + '' + >>> subelement = ET.Element("subtag") + >>> element.append(subelement) + >>> serialize(ET, element) # 2 + '' + >>> element.insert(0, subelement) + >>> serialize(ET, element) # 3 + '' + >>> element.remove(subelement) + >>> serialize(ET, element) # 4 + '' + >>> element.remove(subelement) + >>> serialize(ET, element) # 5 + '' + >>> element.remove(subelement) + Traceback (most recent call last): + ValueError: list.remove(x): x not in list + >>> serialize(ET, element) # 6 + '' + """ + +def find(): + """ + Test find methods (including xpath syntax). + + >>> from xml.etree import ElementTree as ET + + >>> elem = ET.XML(SAMPLE_XML) + >>> elem.find("tag").tag + 'tag' + >>> ET.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.find("section/tag").tag + 'tag' + >>> ET.ElementTree(elem).find("section/tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog") + >>> elem.findtext("tog", "default") + 'default' + >>> ET.ElementTree(elem).findtext("tag") + 'text' + >>> elem.findtext("section/tag") + 'subtext' + >>> ET.ElementTree(elem).findtext("section/tag") + 'subtext' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall("*")) + ['tag', 'tag', 'section'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("section/tag")) + ['tag'] + >>> summarize_list(elem.findall("section//tag")) + ['tag'] + >>> summarize_list(elem.findall("section/*")) + ['tag'] + >>> summarize_list(elem.findall("section//*")) + ['tag'] + >>> summarize_list(elem.findall("section/.//*")) + ['tag'] + >>> summarize_list(elem.findall("*/*")) + ['tag'] + >>> summarize_list(elem.findall("*//*")) + ['tag'] + >>> summarize_list(elem.findall("*/tag")) + ['tag'] + >>> summarize_list(elem.findall("*/./tag")) + ['tag'] + >>> summarize_list(elem.findall("./tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("././tag")) + ['tag', 'tag'] + >>> summarize_list(ET.ElementTree(elem).findall("/tag")) + ['tag', 'tag'] + >>> summarize_list(ET.ElementTree(elem).findall("./tag")) + ['tag', 'tag'] + >>> elem = ET.XML(SAMPLE_XML_NS) + >>> summarize_list(elem.findall("tag")) + [] + >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + """ + +def parseliteral(): + r""" + + >>> from xml.etree import ElementTree as ET + + >>> element = ET.XML("text") + >>> ET.ElementTree(element).write(sys.stdout) + text + >>> element = ET.fromstring("text") + >>> ET.ElementTree(element).write(sys.stdout) + text + >>> print ET.tostring(element) + text + >>> print ET.tostring(element, "ascii") + + text + >>> _, ids = ET.XMLID("text") + >>> len(ids) + 0 + >>> _, ids = ET.XMLID("text") + >>> len(ids) + 1 + >>> ids["body"].tag + 'body' + """ + +# +# xinclude tests (samples from appendix C of the xinclude specification) + +XINCLUDE = {} + +XINCLUDE["C1.xml"] = """\ + + +

120 Mz is adequate for an average home user.

+ +
+""" + +XINCLUDE["disclaimer.xml"] = """\ + + +

The opinions represented herein represent those of the individual + and should not be interpreted as official policy endorsed by this + organization.

+
+""" + +XINCLUDE["C2.xml"] = """\ + + +

This document has been accessed + times.

+
+""" + +XINCLUDE["count.txt"] = "324387" + +XINCLUDE["C3.xml"] = """\ + + +

The following is the source of the "data.xml" resource:

+ +
+""" + +XINCLUDE["data.xml"] = """\ + + + + +""" + +XINCLUDE["C5.xml"] = """\ + +
+ + + + Report error + + + +
+""" + +XINCLUDE["default.xml"] = """\ + + +

Example.

+ +
+""" + +def xinclude_loader(href, parse="xml", encoding=None): + try: + data = XINCLUDE[href] + except KeyError: + raise IOError("resource not found") + if parse == "xml": + from xml.etree.ElementTree import XML + return XML(data) + return data + +def xinclude(): + r""" + Basic inclusion example (XInclude C.1) + + >>> from xml.etree import ElementTree as ET + >>> from xml.etree import ElementInclude + + >>> document = xinclude_loader("C1.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(ET, document) # C1 + +

120 Mz is adequate for an average home user.

+ +

The opinions represented herein represent those of the individual + and should not be interpreted as official policy endorsed by this + organization.

+
+
+ + Textual inclusion example (XInclude C.2) + + >>> document = xinclude_loader("C2.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(ET, document) # C2 + +

This document has been accessed + 324387 times.

+
+ + Textual inclusion of XML example (XInclude C.3) + + >>> document = xinclude_loader("C3.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(ET, document) # C3 + +

The following is the source of the "data.xml" resource:

+ <?xml version='1.0'?> + <data> + <item><![CDATA[Brooks & Shields]]></item> + </data> + +
+ + Fallback example (XInclude C.5) + Note! Fallback support is not yet implemented + + >>> document = xinclude_loader("C5.xml") + >>> ElementInclude.include(document, xinclude_loader) + Traceback (most recent call last): + IOError: resource not found + >>> # print serialize(ET, document) # C5 + + """ + +def test_main(): + from test import test_xml_etree + test_support.run_doctest(test_xml_etree, verbosity=True) + +if __name__ == '__main__': + test_main() From python-checkins at python.org Mon Dec 12 21:33:51 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 21:33:51 +0100 (CET) Subject: [Python-checkins] commit of r41656 - external/README Message-ID: <20051212203351.725681E4002@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 21:33:51 2005 New Revision: 41656 Added: external/README Log: explain what this is, and how it's supposed to be used Added: external/README ============================================================================== --- (empty file) +++ external/README Mon Dec 12 21:33:51 2005 @@ -0,0 +1,8 @@ +This directory contains snapshots of externally maintained libraries. +To add a new library or release, import it into this repository, and +use "svn copy" to copy relevant components to the trunk. + +This directory should not be used for development. The snapshots +should be treated as readonly copies, with the possible exception for +critical errors and security patches. When in doubt, consult with the +python-dev team. From python-checkins at python.org Mon Dec 12 21:46:32 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 21:46:32 +0100 (CET) Subject: [Python-checkins] commit of r41657 - in python/trunk: Lib/test/test_pwd.py Message-ID: <20051212204632.3E7EC1E4002@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 21:46:31 2005 New Revision: 41657 Modified: python/trunk/ (props changed) python/trunk/Lib/test/test_pwd.py Log: skip nis entries, if not filtered out by getpwall itself Modified: python/trunk/Lib/test/test_pwd.py ============================================================================== --- python/trunk/Lib/test/test_pwd.py (original) +++ python/trunk/Lib/test/test_pwd.py Mon Dec 12 21:46:31 2005 @@ -38,6 +38,8 @@ # check whether the entry returned by getpwuid() # for each uid is among those from getpwall() for this uid for e in entries: + if e[0] == '+': + continue # skip NIS entries self.assert_(pwd.getpwnam(e.pw_name) in entriesbyname[e.pw_name]) self.assert_(pwd.getpwuid(e.pw_uid) in entriesbyuid[e.pw_uid]) From python-checkins at python.org Mon Dec 12 21:53:40 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 21:53:40 +0100 (CET) Subject: [Python-checkins] commit of r41658 - in python/trunk: Lib/test/test_grp.py Lib/test/test_pwd.py Message-ID: <20051212205340.D4A4F1E4002@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 21:53:40 2005 New Revision: 41658 Modified: python/trunk/ (props changed) python/trunk/Lib/test/test_grp.py python/trunk/Lib/test/test_pwd.py Log: skip NIS entries, empty entries, etc Modified: python/trunk/Lib/test/test_grp.py ============================================================================== --- python/trunk/Lib/test/test_grp.py (original) +++ python/trunk/Lib/test/test_grp.py Mon Dec 12 21:53:40 2005 @@ -42,6 +42,8 @@ bynames = {} bygids = {} for (n, p, g, mem) in grp.getgrall(): + if not n or n == '+': + continue # skip NIS entries etc. bynames[n] = g bygids[g] = n Modified: python/trunk/Lib/test/test_pwd.py ============================================================================== --- python/trunk/Lib/test/test_pwd.py (original) +++ python/trunk/Lib/test/test_pwd.py Mon Dec 12 21:53:40 2005 @@ -38,8 +38,8 @@ # check whether the entry returned by getpwuid() # for each uid is among those from getpwall() for this uid for e in entries: - if e[0] == '+': - continue # skip NIS entries + if not e[0] or e[0] == '+': + continue # skip NIS entries etc. self.assert_(pwd.getpwnam(e.pw_name) in entriesbyname[e.pw_name]) self.assert_(pwd.getpwuid(e.pw_uid) in entriesbyuid[e.pw_uid]) From python-checkins at python.org Mon Dec 12 22:59:44 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 22:59:44 +0100 (CET) Subject: [Python-checkins] commit of r41659 - in python/trunk: Doc/lib/lib.tex Doc/lib/xmletree.tex Message-ID: <20051212215944.CF8C91E4007@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 22:59:44 2005 New Revision: 41659 Added: python/trunk/Doc/lib/xmletree.tex Modified: python/trunk/ (props changed) python/trunk/Doc/lib/lib.tex Log: r1076 at spiff: Fredrik | 2005-12-12 22:32:28 +0100 added xml.etree documentation stub Modified: python/trunk/Doc/lib/lib.tex ============================================================================== --- python/trunk/Doc/lib/lib.tex (original) +++ python/trunk/Doc/lib/lib.tex Mon Dec 12 22:59:44 2005 @@ -286,6 +286,7 @@ \input{xmlsaxhandler} \input{xmlsaxutils} \input{xmlsaxreader} +\input{xmletree} % \input{libxmllib} \input{libmm} % Multimedia Services Added: python/trunk/Doc/lib/xmletree.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/xmletree.tex Mon Dec 12 22:59:44 2005 @@ -0,0 +1,27 @@ +\section{\module{xml.etree} --- + The ElementTree API for XML} + +\declaremodule{standard}{xml.etree} +\modulesynopsis{Package containing common ElementTree modules.} +\moduleauthor{Fredrik Lundh}{fredrik at pythonware.com} + +\versionadded{2.5} + +The ElementTree package is a simple, efficient, and quite popular +library for XML manipulation in Python. + +The \module{xml.etree} package contains the most common components +from the ElementTree API library. +In the current release, this package contains the \module{ElementTree}, +\module{ElementPath}, and \module{ElementInclude} modules from the full +ElementTree distribution. + +% XXX To be continued! + +\begin{seealso} +\seetitle[http://effbot.org/tag/elementtree] + {ElementTree Overview} + {The home page for \module{ElementTree}. This includes links + to additional documentation, alternative implementations, and + other add-ons.} +\end{seealso} From python-checkins at python.org Mon Dec 12 22:59:52 2005 From: python-checkins at python.org (fredrik.lundh) Date: Mon, 12 Dec 2005 22:59:52 +0100 (CET) Subject: [Python-checkins] commit of r41660 - in python/trunk: Lib/xml/__init__.py Message-ID: <20051212215952.93E4F1E4007@bag.python.org> Author: fredrik.lundh Date: Mon Dec 12 22:59:52 2005 New Revision: 41660 Modified: python/trunk/ (props changed) python/trunk/Lib/xml/__init__.py Log: r1077 at spiff: Fredrik | 2005-12-12 22:58:44 +0100 make sure xml.etree can be used even if PyXML is present (solution proposed by Philip J. Eby) Modified: python/trunk/Lib/xml/__init__.py ============================================================================== --- python/trunk/Lib/xml/__init__.py (original) +++ python/trunk/Lib/xml/__init__.py Mon Dec 12 22:59:52 2005 @@ -41,6 +41,7 @@ else: if v >= _MINIMUM_XMLPLUS_VERSION: import sys + _xmlplus.__path__.extend(__path__) sys.modules[__name__] = _xmlplus else: del v From python-checkins at python.org Tue Dec 13 16:49:40 2005 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 13 Dec 2005 16:49:40 +0100 (CET) Subject: [Python-checkins] commit of r41661 - python/trunk/Doc/tut/tut.tex Message-ID: <20051213154940.98AD31E4002@bag.python.org> Author: andrew.kuchling Date: Tue Dec 13 16:49:37 2005 New Revision: 41661 Modified: python/trunk/Doc/tut/tut.tex Log: >From a suggestion on c.l.py: modernize the introduction to the tutorial. * Remove talk of shell scripting, replacing it by some more current examples * Mention C++ and Java as well as C Raymond H., please feel free to rewrite or revert as you see fit. If the changes are OK, they could be backported to the 2.4-maint branch. Modified: python/trunk/Doc/tut/tut.tex ============================================================================== --- python/trunk/Doc/tut/tut.tex (original) +++ python/trunk/Doc/tut/tut.tex Tue Dec 13 16:49:37 2005 @@ -72,35 +72,42 @@ \chapter{Whetting Your Appetite \label{intro}} -If you ever wrote a large shell script, you probably know this -feeling: you'd love to add yet another feature, but it's already so -slow, and so big, and so complicated; or the feature involves a system -call or other function that is only accessible from C\ldots\ Usually -the problem at hand isn't serious enough to warrant rewriting the -script in C; perhaps the problem requires variable-length strings or -other data types (like sorted lists of file names) that are easy in -the shell but lots of work to implement in C, or perhaps you're not -sufficiently familiar with C. - -Another situation: perhaps you have to work with several C libraries, -and the usual C write/compile/test/re-compile cycle is too slow. You -need to develop software more quickly. Possibly you've -written a program that could use an extension language, and you don't -want to design a language, write and debug an interpreter for it, then -tie it into your application. - -In such cases, Python may be just the language for you. Python is -simple to use, but it is a real programming language, offering much -more structure and support for large programs than the shell has. On -the other hand, it also offers much more error checking than C, and, -being a \emph{very-high-level language}, it has high-level data types -built in, such as flexible arrays and dictionaries that would cost you -days to implement efficiently in C. Because of its more general data -types Python is applicable to a much larger problem domain than -\emph{Awk} or even \emph{Perl}, yet many things are at least as easy -in Python as in those languages. +If you do much work on computers, eventually you find that there's +some task you'd like to automate. For example, you may wish to +perform a search-and-replace over a large number of text files, or +rename and rearrange a bunch of photo files in a complicated way. +Perhaps you'd like to write a small custom database, or a specialized +GUI application, or a simple game. + +If you're a professional software developer, you may have to work with +several C/\Cpp/Java libraries but find the usual +write/compile/test/re-compile cycle is too slow. Perhaps you're +writing a test suite for such a library and find writing the testing +code a tedious task. Or maybe you've written a program that could use +an extension language, and you don't want to design and implement a +whole new language for your application. + +Python is just the language for you. + +You could write a {\UNIX} shell script or Windows batch files for some +of these tasks, but shell scripts are best at moving around files and +changing text data, not well-suited for GUI applications or games. +You could write a C/{\Cpp}/Java program, but it can take a lot of +development time to get even a first-draft program. Python is simpler +to use, available on Windows, MacOS X, and {\UNIX} operating systems, +and will help you get the job done more quickly. + +Python is simple to use, but it is a real programming language, +offering much more structure and support for large programs than shell +scripts or batch files can offer. On the other hand, Python also +offers much more error checking than C, and, being a +\emph{very-high-level language}, it has high-level data types built +in, such as flexible arrays and dictionaries. Because of its more +general data types Python is applicable to a much larger problem +domain than Awk or even Perl, yet many things are at +least as easy in Python as in those languages. -Python allows you to split your program in modules that can be +Python allows you to split your program into modules that can be reused in other Python programs. It comes with a large collection of standard modules that you can use as the basis of your programs --- or as examples to start learning to program in Python. Some of these @@ -115,8 +122,8 @@ It is also a handy desk calculator. Python enables programs to be written compactly and readably. Programs -written in Python are typically much shorter than equivalent C or -\Cpp{} programs, for several reasons: +written in Python are typically much shorter than equivalent C, +\Cpp{}, or Java programs, for several reasons: \begin{itemize} \item the high-level data types allow you to express complex operations in a @@ -145,7 +152,8 @@ Now that you are all excited about Python, you'll want to examine it in some more detail. Since the best way to learn a language is -to use it, you are invited to do so with this tutorial. +to use it, the tutorial invites you to play with the Python interpreter +as you read. In the next chapter, the mechanics of using the interpreter are explained. This is rather mundane information, but essential for From python-checkins at python.org Tue Dec 13 17:44:05 2005 From: python-checkins at python.org (hyeshik.chang) Date: Tue, 13 Dec 2005 17:44:05 +0100 (CET) Subject: [Python-checkins] commit of r41662 - in python/trunk: Misc/NEWS Objects/fileobject.c configure configure.in pyconfig.h.in Message-ID: <20051213164405.AD0681E4002@bag.python.org> Author: hyeshik.chang Date: Tue Dec 13 17:44:02 2005 New Revision: 41662 Modified: python/trunk/Misc/NEWS python/trunk/Objects/fileobject.c python/trunk/configure python/trunk/configure.in python/trunk/pyconfig.h.in Log: Add a workaround for file.ftell() to raise IOError for ttys. ftell(3) on BSD doesn't set errno even for ttys and returns useless values. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Tue Dec 13 17:44:02 2005 @@ -12,6 +12,9 @@ Core and builtins ----------------- +- Added a workaround for file.tell() to raise IOError when the file + is a tty on every platforms as documented in our library reference. + - Patch #1350409: Work around signal handling bug in Visual Studio 2005. - Bug #1281408: Py_BuildValue now works correct even with unsigned longs Modified: python/trunk/Objects/fileobject.c ============================================================================== --- python/trunk/Objects/fileobject.c (original) +++ python/trunk/Objects/fileobject.c Tue Dec 13 17:44:02 2005 @@ -482,6 +482,13 @@ static Py_off_t _portable_ftell(FILE* fp) { +#ifdef HAVE_BROKEN_FTELL + /* ftell doesn't fail for tty fds on FreeBSD and some others */ + if (isatty(fileno(fp))) { + errno = ESPIPE; + return -1; + } +#endif #if !defined(HAVE_LARGEFILE_SUPPORT) return ftell(fp); #elif defined(HAVE_FTELLO) && SIZEOF_OFF_T >= 8 Modified: python/trunk/configure ============================================================================== --- python/trunk/configure (original) +++ python/trunk/configure Tue Dec 13 17:44:02 2005 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 39267 . +# From configure.in Revision: 41662 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for python 2.5. # @@ -20118,6 +20118,67 @@ fi +echo "$as_me:$LINENO: checking for broken ftell()" >&5 +echo $ECHO_N "checking for broken ftell()... $ECHO_C" >&6 +if test "${ac_cv_broken_ftell+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes; then + ac_cv_broken_ftell=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +int main() +{ + long val = ftell(stdin); + if (val != -1) + exit(0); + exit(1); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_broken_ftell=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_broken_ftell=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi + +echo "$as_me:$LINENO: result: $ac_cv_broken_ftell" >&5 +echo "${ECHO_T}$ac_cv_broken_ftell" >&6 +if test "$ac_cv_broken_ftell" = yes +then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_BROKEN_FTELL 1 +_ACEOF + +fi + # Before we can test tzset, we need to check if struct tm has a tm_zone # (which is not required by ISO C or UNIX spec) and/or if we support # tzname[] Modified: python/trunk/configure.in ============================================================================== --- python/trunk/configure.in (original) +++ python/trunk/configure.in Tue Dec 13 17:44:02 2005 @@ -2955,6 +2955,28 @@ [Define if poll() sets errno on invalid file descriptors.]) fi +AC_MSG_CHECKING(for broken ftell()) +AC_CACHE_VAL(ac_cv_broken_ftell, [ +AC_TRY_RUN([ +#include +int main() +{ + long val = ftell(stdin); + if (val != -1) + exit(0); + exit(1); +} +], +ac_cv_broken_ftell=yes, +ac_cv_broken_ftell=no, +ac_cv_broken_ftell=no)]) +AC_MSG_RESULT($ac_cv_broken_ftell) +if test "$ac_cv_broken_ftell" = yes +then + AC_DEFINE(HAVE_BROKEN_FTELL, 1, + [Define if ftell() set errno on tty files.]) +fi + # Before we can test tzset, we need to check if struct tm has a tm_zone # (which is not required by ISO C or UNIX spec) and/or if we support # tzname[] Modified: python/trunk/pyconfig.h.in ============================================================================== --- python/trunk/pyconfig.h.in (original) +++ python/trunk/pyconfig.h.in Tue Dec 13 17:44:02 2005 @@ -46,6 +46,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_BLUETOOTH_H +/* Define if ftell() set errno on tty files. */ +#undef HAVE_BROKEN_FTELL + /* Define if nice() returns success/failure instead of the new priority. */ #undef HAVE_BROKEN_NICE From python-checkins at python.org Tue Dec 13 18:06:45 2005 From: python-checkins at python.org (hyeshik.chang) Date: Tue, 13 Dec 2005 18:06:45 +0100 (CET) Subject: [Python-checkins] commit of r41663 - python/trunk/Lib/test/test_cmd_line.py Message-ID: <20051213170645.E7C041E4002@bag.python.org> Author: hyeshik.chang Date: Tue Dec 13 18:06:45 2005 New Revision: 41663 Modified: python/trunk/Lib/test/test_cmd_line.py Log: Fix test not to fail on FreeBSD. Directories work also as data files on the platform. Modified: python/trunk/Lib/test/test_cmd_line.py ============================================================================== --- python/trunk/Lib/test/test_cmd_line.py (original) +++ python/trunk/Lib/test/test_cmd_line.py Tue Dec 13 18:06:45 2005 @@ -19,6 +19,10 @@ if sys.platform == 'win32': # Exit code for "python .", Error 13: permission denied = 2 expected_exit_code = 2 + elif sys.platform.startswith('freebsd'): + # On FreeBSD, it more likely raise SyntaxError for binary + # directory data. + expected_exit_code = 1 else: # Linux has no problem with "python .", Exit code = 0 expected_exit_code = 0 From guido at python.org Tue Dec 13 19:57:55 2005 From: guido at python.org (Guido van Rossum) Date: Tue, 13 Dec 2005 10:57:55 -0800 Subject: [Python-checkins] commit of r41662 - in python/trunk: Misc/NEWS Objects/fileobject.c configure configure.in pyconfig.h.in In-Reply-To: <20051213164405.AD0681E4002@bag.python.org> References: <20051213164405.AD0681E4002@bag.python.org> Message-ID: Isn't it expensive to call isatty() on every tell() call? Is it worth it just to make a unit test pass? Or is there a real bug caused by tell() lying? --Guido On 12/13/05, hyeshik.chang wrote: > Author: hyeshik.chang > Date: Tue Dec 13 17:44:02 2005 > New Revision: 41662 > > Modified: > python/trunk/Misc/NEWS > python/trunk/Objects/fileobject.c > python/trunk/configure > python/trunk/configure.in > python/trunk/pyconfig.h.in > Log: > Add a workaround for file.ftell() to raise IOError for ttys. > ftell(3) on BSD doesn't set errno even for ttys and returns useless > values. > > > Modified: python/trunk/Misc/NEWS > ============================================================================== > --- python/trunk/Misc/NEWS (original) > +++ python/trunk/Misc/NEWS Tue Dec 13 17:44:02 2005 > @@ -12,6 +12,9 @@ > Core and builtins > ----------------- > > +- Added a workaround for file.tell() to raise IOError when the file > + is a tty on every platforms as documented in our library reference. > + > - Patch #1350409: Work around signal handling bug in Visual Studio 2005. > > - Bug #1281408: Py_BuildValue now works correct even with unsigned longs > > Modified: python/trunk/Objects/fileobject.c > ============================================================================== > --- python/trunk/Objects/fileobject.c (original) > +++ python/trunk/Objects/fileobject.c Tue Dec 13 17:44:02 2005 > @@ -482,6 +482,13 @@ > static Py_off_t > _portable_ftell(FILE* fp) > { > +#ifdef HAVE_BROKEN_FTELL > + /* ftell doesn't fail for tty fds on FreeBSD and some others */ > + if (isatty(fileno(fp))) { > + errno = ESPIPE; > + return -1; > + } > +#endif > #if !defined(HAVE_LARGEFILE_SUPPORT) > return ftell(fp); > #elif defined(HAVE_FTELLO) && SIZEOF_OFF_T >= 8 > > Modified: python/trunk/configure [...] -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-checkins at python.org Tue Dec 13 20:49:56 2005 From: python-checkins at python.org (fredrik.lundh) Date: Tue, 13 Dec 2005 20:49:56 +0100 (CET) Subject: [Python-checkins] commit of r41664 - in python/trunk: Include/pyexpat.h Modules/pyexpat.c Message-ID: <20051213194956.9D4B51E400A@bag.python.org> Author: fredrik.lundh Date: Tue Dec 13 20:49:55 2005 New Revision: 41664 Added: python/trunk/Include/pyexpat.h Modified: python/trunk/Modules/pyexpat.c Log: added cobject-based expat dispatch mechanism to pyexpat Added: python/trunk/Include/pyexpat.h ============================================================================== --- (empty file) +++ python/trunk/Include/pyexpat.h Tue Dec 13 20:49:55 2005 @@ -0,0 +1,45 @@ +/* Stuff to export relevant 'expat' entry points from pyexpat to other + * parser modules, such as cElementTree. */ + +/* note: you must import expat.h before importing this module! */ + +#define PyExpat_DISPATCH_MAGIC "pyexpat.dispatch 1.0" + +struct PyExpat_Dispatch +{ + int size; /* set to sizeof(struct PyExpat_Dispatch) */ + int MAJOR_VERSION; /* XXX: use the ExpatVersionInfo instead? */ + int MINOR_VERSION; + int MICRO_VERSION; + /* pointers to selected expat functions. add new functions at + the end, if needed */ + const XML_LChar * (*ErrorString)(enum XML_Error code); + int (*GetCurrentColumnNumber)(XML_Parser parser); + int (*GetCurrentLineNumber)(XML_Parser parser); + enum XML_Status (*Parse)( + XML_Parser parser, const char *s, int len, int isFinal); + XML_Parser (*ParserCreate_MM)( + const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + void (*ParserFree)(XML_Parser parser); + void (*SetCharacterDataHandler)( + XML_Parser parser, XML_CharacterDataHandler handler); + void (*SetCommentHandler)( + XML_Parser parser, XML_CommentHandler handler); + void (*SetDefaultHandlerExpand)( + XML_Parser parser, XML_DefaultHandler handler); + void (*SetElementHandler)( + XML_Parser parser, XML_StartElementHandler start, + XML_EndElementHandler end); + void (*SetNamespaceDeclHandler)( + XML_Parser parser, XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + void (*SetProcessingInstructionHandler)( + XML_Parser parser, XML_ProcessingInstructionHandler handler); + void (*SetUnknownEncodingHandler)( + XML_Parser parser, XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + void (*SetUserData)(XML_Parser parser, void *userData); + /* always add new stuff to the end! */ +}; + Modified: python/trunk/Modules/pyexpat.c ============================================================================== --- python/trunk/Modules/pyexpat.c (original) +++ python/trunk/Modules/pyexpat.c Tue Dec 13 20:49:55 2005 @@ -4,6 +4,8 @@ #include "frameobject.h" #include "expat.h" +#include "pyexpat.h" + #define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION) #ifndef PyDoc_STRVAR @@ -1838,6 +1840,8 @@ PyObject *modelmod_name; PyObject *model_module; PyObject *sys_modules; + static struct PyExpat_Dispatch dispatch; + PyObject* dispatch_object; if (errmod_name == NULL) return; @@ -2011,6 +2015,33 @@ MYCONST(XML_CQUANT_REP); MYCONST(XML_CQUANT_PLUS); #undef MYCONST + + /* initialize pyexpat dispatch table */ + dispatch.size = sizeof(dispatch); + dispatch.MAJOR_VERSION = XML_MAJOR_VERSION; + dispatch.MINOR_VERSION = XML_MINOR_VERSION; + dispatch.MICRO_VERSION = XML_MICRO_VERSION; + dispatch.ErrorString = XML_ErrorString; + dispatch.GetCurrentColumnNumber = XML_GetCurrentColumnNumber; + dispatch.GetCurrentLineNumber = XML_GetCurrentLineNumber; + dispatch.Parse = XML_Parse; + dispatch.ParserCreate_MM = XML_ParserCreate_MM; + dispatch.ParserFree = XML_ParserFree; + dispatch.SetCharacterDataHandler = XML_SetCharacterDataHandler; + dispatch.SetCommentHandler = XML_SetCommentHandler; + dispatch.SetDefaultHandlerExpand = XML_SetDefaultHandlerExpand; + dispatch.SetElementHandler = XML_SetElementHandler; + dispatch.SetNamespaceDeclHandler = XML_SetNamespaceDeclHandler; + dispatch.SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler; + dispatch.SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler; + dispatch.SetUserData = XML_SetUserData; + + /* export as cobject */ + dispatch_object = PyCObject_FromVoidPtrAndDesc( + &dispatch, PyExpat_DISPATCH_MAGIC, NULL + ); + if (dispatch_object) + PyModule_AddObject(m, "dispatch", dispatch_object); } static void From python-checkins at python.org Tue Dec 13 21:43:05 2005 From: python-checkins at python.org (fredrik.lundh) Date: Tue, 13 Dec 2005 21:43:05 +0100 (CET) Subject: [Python-checkins] commit of r41665 - in python/trunk: Include/pyexpat.h Modules/pyexpat.c Message-ID: <20051213204305.54B401E4009@bag.python.org> Author: fredrik.lundh Date: Tue Dec 13 21:43:04 2005 New Revision: 41665 Modified: python/trunk/Include/pyexpat.h python/trunk/Modules/pyexpat.c Log: renamed dispatch -> capi to match other CAPI implementations (e.g. cStringIO, ucnhash, etc) Modified: python/trunk/Include/pyexpat.h ============================================================================== --- python/trunk/Include/pyexpat.h (original) +++ python/trunk/Include/pyexpat.h Tue Dec 13 21:43:04 2005 @@ -3,11 +3,11 @@ /* note: you must import expat.h before importing this module! */ -#define PyExpat_DISPATCH_MAGIC "pyexpat.dispatch 1.0" +#define PyExpat_CAPI_MAGIC "pyexpat.expat_CAPI 1.0" -struct PyExpat_Dispatch +struct PyExpat_CAPI { - int size; /* set to sizeof(struct PyExpat_Dispatch) */ + int size; /* set to sizeof(struct PyExpat_CAPI) */ int MAJOR_VERSION; /* XXX: use the ExpatVersionInfo instead? */ int MINOR_VERSION; int MICRO_VERSION; Modified: python/trunk/Modules/pyexpat.c ============================================================================== --- python/trunk/Modules/pyexpat.c (original) +++ python/trunk/Modules/pyexpat.c Tue Dec 13 21:43:04 2005 @@ -1840,8 +1840,8 @@ PyObject *modelmod_name; PyObject *model_module; PyObject *sys_modules; - static struct PyExpat_Dispatch dispatch; - PyObject* dispatch_object; + static struct PyExpat_CAPI capi; + PyObject* capi_object; if (errmod_name == NULL) return; @@ -2017,31 +2017,31 @@ #undef MYCONST /* initialize pyexpat dispatch table */ - dispatch.size = sizeof(dispatch); - dispatch.MAJOR_VERSION = XML_MAJOR_VERSION; - dispatch.MINOR_VERSION = XML_MINOR_VERSION; - dispatch.MICRO_VERSION = XML_MICRO_VERSION; - dispatch.ErrorString = XML_ErrorString; - dispatch.GetCurrentColumnNumber = XML_GetCurrentColumnNumber; - dispatch.GetCurrentLineNumber = XML_GetCurrentLineNumber; - dispatch.Parse = XML_Parse; - dispatch.ParserCreate_MM = XML_ParserCreate_MM; - dispatch.ParserFree = XML_ParserFree; - dispatch.SetCharacterDataHandler = XML_SetCharacterDataHandler; - dispatch.SetCommentHandler = XML_SetCommentHandler; - dispatch.SetDefaultHandlerExpand = XML_SetDefaultHandlerExpand; - dispatch.SetElementHandler = XML_SetElementHandler; - dispatch.SetNamespaceDeclHandler = XML_SetNamespaceDeclHandler; - dispatch.SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler; - dispatch.SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler; - dispatch.SetUserData = XML_SetUserData; + capi.size = sizeof(capi); + capi.MAJOR_VERSION = XML_MAJOR_VERSION; + capi.MINOR_VERSION = XML_MINOR_VERSION; + capi.MICRO_VERSION = XML_MICRO_VERSION; + capi.ErrorString = XML_ErrorString; + capi.GetCurrentColumnNumber = XML_GetCurrentColumnNumber; + capi.GetCurrentLineNumber = XML_GetCurrentLineNumber; + capi.Parse = XML_Parse; + capi.ParserCreate_MM = XML_ParserCreate_MM; + capi.ParserFree = XML_ParserFree; + capi.SetCharacterDataHandler = XML_SetCharacterDataHandler; + capi.SetCommentHandler = XML_SetCommentHandler; + capi.SetDefaultHandlerExpand = XML_SetDefaultHandlerExpand; + capi.SetElementHandler = XML_SetElementHandler; + capi.SetNamespaceDeclHandler = XML_SetNamespaceDeclHandler; + capi.SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler; + capi.SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler; + capi.SetUserData = XML_SetUserData; /* export as cobject */ - dispatch_object = PyCObject_FromVoidPtrAndDesc( - &dispatch, PyExpat_DISPATCH_MAGIC, NULL + capi_object = PyCObject_FromVoidPtrAndDesc( + &capi, PyExpat_CAPI_MAGIC, NULL ); - if (dispatch_object) - PyModule_AddObject(m, "dispatch", dispatch_object); + if (capi_object) + PyModule_AddObject(m, "expat_CAPI", capi_object); } static void From python-checkins at python.org Tue Dec 13 22:55:36 2005 From: python-checkins at python.org (fredrik.lundh) Date: Tue, 13 Dec 2005 22:55:36 +0100 (CET) Subject: [Python-checkins] commit of r41666 - in python/trunk: Include/pyexpat.h Modules/pyexpat.c Message-ID: <20051213215536.D37091E400B@bag.python.org> Author: fredrik.lundh Date: Tue Dec 13 22:55:36 2005 New Revision: 41666 Modified: python/trunk/Include/pyexpat.h python/trunk/Modules/pyexpat.c Log: moved magic into structure (mainly to simplify the client code) added missing API hooks Modified: python/trunk/Include/pyexpat.h ============================================================================== --- python/trunk/Include/pyexpat.h (original) +++ python/trunk/Include/pyexpat.h Tue Dec 13 22:55:36 2005 @@ -7,15 +7,17 @@ struct PyExpat_CAPI { + char* magic; /* set to PyExpat_CAPI_MAGIC */ int size; /* set to sizeof(struct PyExpat_CAPI) */ - int MAJOR_VERSION; /* XXX: use the ExpatVersionInfo instead? */ + int MAJOR_VERSION; int MINOR_VERSION; int MICRO_VERSION; /* pointers to selected expat functions. add new functions at the end, if needed */ const XML_LChar * (*ErrorString)(enum XML_Error code); - int (*GetCurrentColumnNumber)(XML_Parser parser); - int (*GetCurrentLineNumber)(XML_Parser parser); + enum XML_Error (*GetErrorCode)(XML_Parser parser); + int (*GetErrorColumnNumber)(XML_Parser parser); + int (*GetErrorLineNumber)(XML_Parser parser); enum XML_Status (*Parse)( XML_Parser parser, const char *s, int len, int isFinal); XML_Parser (*ParserCreate_MM)( Modified: python/trunk/Modules/pyexpat.c ============================================================================== --- python/trunk/Modules/pyexpat.c (original) +++ python/trunk/Modules/pyexpat.c Tue Dec 13 22:55:36 2005 @@ -2018,12 +2018,14 @@ /* initialize pyexpat dispatch table */ capi.size = sizeof(capi); + capi.magic = PyExpat_CAPI_MAGIC; capi.MAJOR_VERSION = XML_MAJOR_VERSION; capi.MINOR_VERSION = XML_MINOR_VERSION; capi.MICRO_VERSION = XML_MICRO_VERSION; capi.ErrorString = XML_ErrorString; - capi.GetCurrentColumnNumber = XML_GetCurrentColumnNumber; - capi.GetCurrentLineNumber = XML_GetCurrentLineNumber; + capi.GetErrorCode = XML_GetErrorCode; + capi.GetErrorColumnNumber = XML_GetErrorColumnNumber; + capi.GetErrorLineNumber = XML_GetErrorLineNumber; capi.Parse = XML_Parse; capi.ParserCreate_MM = XML_ParserCreate_MM; capi.ParserFree = XML_ParserFree; @@ -2037,9 +2039,7 @@ capi.SetUserData = XML_SetUserData; /* export as cobject */ - capi_object = PyCObject_FromVoidPtrAndDesc( - &capi, PyExpat_CAPI_MAGIC, NULL - ); + capi_object = PyCObject_FromVoidPtr(&capi, NULL); if (capi_object) PyModule_AddObject(m, "expat_CAPI", capi_object); } From hyeshik at gmail.com Wed Dec 14 01:36:26 2005 From: hyeshik at gmail.com (Hye-Shik Chang) Date: Wed, 14 Dec 2005 09:36:26 +0900 Subject: [Python-checkins] commit of r41662 - in python/trunk: Misc/NEWS Objects/fileobject.c configure configure.in pyconfig.h.in In-Reply-To: References: <20051213164405.AD0681E4002@bag.python.org> Message-ID: <4f0b69dc0512131636o505484fw5f5b3a9819c9de93@mail.gmail.com> On 12/14/05, Guido van Rossum wrote: > Isn't it expensive to call isatty() on every tell() call? Is it worth > it just to make a unit test pass? > Indeed. isatty() requires a system call. I think it's somewhat expensive in case of using tell() for file monitoring or progress bars. But, it's just for platforms that doesn't return error for ttys. And it's not clearly defined for ftell(3) in POSIX: [ESPIPE] The file descriptor underlying stream is associated with a pipe or FIFO. [ESPIPE] The file descriptor underlying stream is associated with a socket. But, our library reference says that tty.seek() will raise IOError. So, I thought it should make some consistency. > Or is there a real bug caused by tell() lying? I don't think it's harm to keep the original behavior as before this fix. But file.tell() is quite cheap operation among routines likely enclose the operation. Hmm. If isatty() for every call still looks too expensive, we can just fix documentation and unittest. I'm quite neutral for the problem because tty.tell() is quite non-sense. :) Hye-Shik > On 12/13/05, hyeshik.chang wrote: > > Author: hyeshik.chang > > Date: Tue Dec 13 17:44:02 2005 > > New Revision: 41662 > > > > Modified: > > python/trunk/Misc/NEWS > > python/trunk/Objects/fileobject.c > > python/trunk/configure > > python/trunk/configure.in > > python/trunk/pyconfig.h.in > > Log: > > Add a workaround for file.ftell() to raise IOError for ttys. > > ftell(3) on BSD doesn't set errno even for ttys and returns useless > > values. > > > > From nas at arctrix.com Wed Dec 14 03:51:35 2005 From: nas at arctrix.com (Neil Schemenauer) Date: Wed, 14 Dec 2005 02:51:35 +0000 (UTC) Subject: [Python-checkins] commit of r41662 - in python/trunk: Misc/NEWS Objects/fileobject.c configure configure.in pyconfig.h.in References: <20051213164405.AD0681E4002@bag.python.org> <4f0b69dc0512131636o505484fw5f5b3a9819c9de93@mail.gmail.com> Message-ID: Hye-Shik Chang wrote: > But file.tell() is quite cheap operation among routines likely > enclose the operation. Hmm. If isatty() for every call still > looks too expensive, we can just fix documentation and unittest. Please don't make file.tell() start doing extra stuff. The Python method should match the C function, if possible. Neil From guido at python.org Wed Dec 14 04:34:30 2005 From: guido at python.org (Guido van Rossum) Date: Tue, 13 Dec 2005 19:34:30 -0800 Subject: [Python-checkins] commit of r41662 - in python/trunk: Misc/NEWS Objects/fileobject.c configure configure.in pyconfig.h.in In-Reply-To: <4f0b69dc0512131636o505484fw5f5b3a9819c9de93@mail.gmail.com> References: <20051213164405.AD0681E4002@bag.python.org> <4f0b69dc0512131636o505484fw5f5b3a9819c9de93@mail.gmail.com> Message-ID: On 12/13/05, Hye-Shik Chang wrote: > On 12/14/05, Guido van Rossum wrote: > > Isn't it expensive to call isatty() on every tell() call? Is it worth > > it just to make a unit test pass? > > > > Indeed. isatty() requires a system call. I think it's somewhat expensive > in case of using tell() for file monitoring or progress bars. But, > it's just for platforms that doesn't return error for ttys. And it's > not clearly defined for ftell(3) in POSIX: > > [ESPIPE] > The file descriptor underlying stream is associated with a pipe or FIFO. > [ESPIPE] > The file descriptor underlying stream is associated with a socket. > > But, our library reference says that tty.seek() will raise IOError. > So, I thought it should make some consistency. That's a somewhat dangerous practice. The library manual is most likely documenting observed behavior, not intended behavior -- the intention was to match the semantics of the underlying OS. (I know about the intentions because it's mainly all my code. :-) But see below. > > Or is there a real bug caused by tell() lying? > > I don't think it's harm to keep the original behavior as before this fix. > But file.tell() is quite cheap operation among routines likely enclose > the operation. Hmm. If isatty() for every call still looks too expensive, > we can just fix documentation and unittest. I'm quite neutral for the > problem because tty.tell() is quite non-sense. :) Unfortunately there is now code that depends on the documented behavior. In httplib (and perhaps other mail-header-parsing code) there's a flag 'seekable' that's set to True iff tell() succeeds. While it's unlikely that anyone would attempt to read mail from a tty device, I now believe that forcing the failure if isatty() is the right thing to do. Sorry for the waffling... -- --Guido van Rossum (home page: http://www.python.org/~guido/) From nnorwitz at gmail.com Wed Dec 14 06:41:35 2005 From: nnorwitz at gmail.com (Neal Norwitz) Date: Tue, 13 Dec 2005 21:41:35 -0800 Subject: [Python-checkins] commit of r41662 - in python/trunk: Misc/NEWS Objects/fileobject.c configure configure.in pyconfig.h.in In-Reply-To: References: <20051213164405.AD0681E4002@bag.python.org> <4f0b69dc0512131636o505484fw5f5b3a9819c9de93@mail.gmail.com> Message-ID: On 12/13/05, Guido van Rossum wrote: > > > > Or is there a real bug caused by tell() lying? > > > > I don't think it's harm to keep the original behavior as before this fix. > > But file.tell() is quite cheap operation among routines likely enclose > > the operation. Hmm. If isatty() for every call still looks too expensive, > > we can just fix documentation and unittest. I'm quite neutral for the > > problem because tty.tell() is quite non-sense. :) > > Unfortunately there is now code that depends on the documented > behavior. In httplib (and perhaps other mail-header-parsing code) > there's a flag 'seekable' that's set to True iff tell() succeeds. > While it's unlikely that anyone would attempt to read mail from a tty > device, I now believe that forcing the failure if isatty() is the > right thing to do. Sorry, I was planning on responding sooner. Before the rest of this thread, I thought it best to remove the test code. I thought I heard that POSIX was ambiguous. Since I'm the one that started this mess, let me know if I should revert. n From python-checkins at python.org Wed Dec 14 07:20:37 2005 From: python-checkins at python.org (fred.drake) Date: Wed, 14 Dec 2005 07:20:37 +0100 (CET) Subject: [Python-checkins] commit of r41667 - in python/trunk/Lib: test/test_minidom.py test/test_sax.py test/test_xml_etree.py xml.py xml/__init__.py xml/dom xml/etree xml/parsers xml/sax xmlcore xmlcore/dom xmlcore/dom/domreg.py xmlcore/dom/expatbuilder.py xmlcore/dom/minicompat.py xmlcore/dom/minidom.py xmlcore/dom/pulldom.py xmlcore/dom/xmlbuilder.py xmlcore/etree xmlcore/etree/ElementTree.py xmlcore/parsers xmlcore/sax xmlcore/sax/__init__.py xmlcore/sax/expatreader.py Message-ID: <20051214062037.3B18C1E4002@bag.python.org> Author: fred.drake Date: Wed Dec 14 07:20:35 2005 New Revision: 41667 Added: python/trunk/Lib/xml.py - copied, changed from r41666, python/trunk/Lib/xml/__init__.py python/trunk/Lib/xmlcore/ python/trunk/Lib/xmlcore/dom/ - copied from r41666, python/trunk/Lib/xml/dom/ python/trunk/Lib/xmlcore/etree/ - copied from r41666, python/trunk/Lib/xml/etree/ python/trunk/Lib/xmlcore/parsers/ - copied from r41666, python/trunk/Lib/xml/parsers/ python/trunk/Lib/xmlcore/sax/ - copied from r41666, python/trunk/Lib/xml/sax/ Removed: python/trunk/Lib/xml/__init__.py python/trunk/Lib/xml/dom/ python/trunk/Lib/xml/etree/ python/trunk/Lib/xml/parsers/ python/trunk/Lib/xml/sax/ Modified: python/trunk/Lib/test/test_minidom.py python/trunk/Lib/test/test_sax.py python/trunk/Lib/test/test_xml_etree.py python/trunk/Lib/xmlcore/dom/domreg.py python/trunk/Lib/xmlcore/dom/expatbuilder.py python/trunk/Lib/xmlcore/dom/minicompat.py python/trunk/Lib/xmlcore/dom/minidom.py python/trunk/Lib/xmlcore/dom/pulldom.py python/trunk/Lib/xmlcore/dom/xmlbuilder.py python/trunk/Lib/xmlcore/etree/ElementTree.py python/trunk/Lib/xmlcore/sax/__init__.py python/trunk/Lib/xmlcore/sax/expatreader.py Log: move the xml package implementation to xmlcore, and adjust the tests to test that package, not the xmlcore/PyXML switcheroo fiasco in the xml module/package Modified: python/trunk/Lib/test/test_minidom.py ============================================================================== --- python/trunk/Lib/test/test_minidom.py (original) +++ python/trunk/Lib/test/test_minidom.py Wed Dec 14 07:20:35 2005 @@ -1,4 +1,4 @@ -# test for xml.dom.minidom +# test for xmlcore.dom.minidom import os import sys @@ -7,12 +7,12 @@ from StringIO import StringIO from test.test_support import verbose -import xml.dom -import xml.dom.minidom -import xml.parsers.expat +import xmlcore.dom +import xmlcore.dom.minidom +import xmlcore.parsers.expat -from xml.dom.minidom import parse, Node, Document, parseString -from xml.dom.minidom import getDOMImplementation +from xmlcore.dom.minidom import parse, Node, Document, parseString +from xmlcore.dom.minidom import getDOMImplementation if __name__ == "__main__": @@ -138,29 +138,29 @@ text = dom.createTextNode('text') try: dom.appendChild(text) - except xml.dom.HierarchyRequestErr: pass + except xmlcore.dom.HierarchyRequestErr: pass else: print "dom.appendChild didn't raise HierarchyRequestErr" dom.appendChild(elem) try: dom.insertBefore(text, elem) - except xml.dom.HierarchyRequestErr: pass + except xmlcore.dom.HierarchyRequestErr: pass else: print "dom.appendChild didn't raise HierarchyRequestErr" try: dom.replaceChild(text, elem) - except xml.dom.HierarchyRequestErr: pass + except xmlcore.dom.HierarchyRequestErr: pass else: print "dom.appendChild didn't raise HierarchyRequestErr" nodemap = elem.attributes try: nodemap.setNamedItem(text) - except xml.dom.HierarchyRequestErr: pass + except xmlcore.dom.HierarchyRequestErr: pass else: print "NamedNodeMap.setNamedItem didn't raise HierarchyRequestErr" try: nodemap.setNamedItemNS(text) - except xml.dom.HierarchyRequestErr: pass + except xmlcore.dom.HierarchyRequestErr: pass else: print "NamedNodeMap.setNamedItemNS didn't raise HierarchyRequestErr" @@ -439,7 +439,7 @@ and pi.firstChild is None and pi.lastChild is None and pi.localName is None - and pi.namespaceURI == xml.dom.EMPTY_NAMESPACE) + and pi.namespaceURI == xmlcore.dom.EMPTY_NAMESPACE) def testProcessingInstructionRepr(): pass @@ -454,7 +454,7 @@ elem = doc.createElement("extra") try: doc.appendChild(elem) - except xml.dom.HierarchyRequestErr: + except xmlcore.dom.HierarchyRequestErr: pass else: print "Failed to catch expected exception when" \ @@ -491,7 +491,7 @@ confirm(a1.isSameNode(a2)) try: attrs.removeNamedItem("a") - except xml.dom.NotFoundErr: + except xmlcore.dom.NotFoundErr: pass def testRemoveNamedItemNS(): @@ -503,7 +503,7 @@ confirm(a1.isSameNode(a2)) try: attrs.removeNamedItemNS("http://xml.python.org/", "b") - except xml.dom.NotFoundErr: + except xmlcore.dom.NotFoundErr: pass def testAttrListValues(): pass @@ -682,7 +682,7 @@ doc2 = parseString("") try: doc1.importNode(doc2, deep) - except xml.dom.NotSupportedErr: + except xmlcore.dom.NotSupportedErr: pass else: raise Exception(testName + @@ -705,12 +705,14 @@ doctype = getDOMImplementation().createDocumentType("doc", None, None) doctype.entities._seq = [] doctype.notations._seq = [] - notation = xml.dom.minidom.Notation("my-notation", None, - "http://xml.python.org/notations/my") + notation = xmlcore.dom.minidom.Notation( + "my-notation", None, + "http://xml.python.org/notations/my") doctype.notations._seq.append(notation) - entity = xml.dom.minidom.Entity("my-entity", None, - "http://xml.python.org/entities/my", - "my-notation") + entity = xmlcore.dom.minidom.Entity( + "my-entity", None, + "http://xml.python.org/entities/my", + "my-notation") entity.version = "1.0" entity.encoding = "utf-8" entity.actualEncoding = "us-ascii" @@ -729,7 +731,7 @@ target = create_doc_without_doctype() try: imported = target.importNode(src.doctype, 0) - except xml.dom.NotSupportedErr: + except xmlcore.dom.NotSupportedErr: pass else: raise Exception( @@ -740,7 +742,7 @@ target = create_doc_without_doctype() try: imported = target.importNode(src.doctype, 1) - except xml.dom.NotSupportedErr: + except xmlcore.dom.NotSupportedErr: pass else: raise Exception( @@ -848,7 +850,7 @@ doc.unlink() def testSAX2DOM(): - from xml.dom import pulldom + from xmlcore.dom import pulldom sax2dom = pulldom.SAX2DOM() sax2dom.startDocument() @@ -938,11 +940,11 @@ attr = elem.attributes['a'] # Simple renaming - attr = doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, "b") + attr = doc.renameNode(attr, xmlcore.dom.EMPTY_NAMESPACE, "b") confirm(attr.name == "b" and attr.nodeName == "b" and attr.localName is None - and attr.namespaceURI == xml.dom.EMPTY_NAMESPACE + and attr.namespaceURI == xmlcore.dom.EMPTY_NAMESPACE and attr.prefix is None and attr.value == "v" and elem.getAttributeNode("a") is None @@ -987,11 +989,11 @@ and attrmap[("http://xml.python.org/ns2", "d")].isSameNode(attr)) # Rename back to a simple non-NS node - attr = doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, "e") + attr = doc.renameNode(attr, xmlcore.dom.EMPTY_NAMESPACE, "e") confirm(attr.name == "e" and attr.nodeName == "e" and attr.localName is None - and attr.namespaceURI == xml.dom.EMPTY_NAMESPACE + and attr.namespaceURI == xmlcore.dom.EMPTY_NAMESPACE and attr.prefix is None and attr.value == "v" and elem.getAttributeNode("a") is None @@ -1005,7 +1007,7 @@ try: doc.renameNode(attr, "http://xml.python.org/ns", "xmlns") - except xml.dom.NamespaceErr: + except xmlcore.dom.NamespaceErr: pass else: print "expected NamespaceErr" @@ -1018,11 +1020,11 @@ elem = doc.documentElement # Simple renaming - elem = doc.renameNode(elem, xml.dom.EMPTY_NAMESPACE, "a") + elem = doc.renameNode(elem, xmlcore.dom.EMPTY_NAMESPACE, "a") confirm(elem.tagName == "a" and elem.nodeName == "a" and elem.localName is None - and elem.namespaceURI == xml.dom.EMPTY_NAMESPACE + and elem.namespaceURI == xmlcore.dom.EMPTY_NAMESPACE and elem.prefix is None and elem.ownerDocument.isSameNode(doc)) @@ -1045,11 +1047,11 @@ and elem.ownerDocument.isSameNode(doc)) # Rename back to a simple non-NS node - elem = doc.renameNode(elem, xml.dom.EMPTY_NAMESPACE, "d") + elem = doc.renameNode(elem, xmlcore.dom.EMPTY_NAMESPACE, "d") confirm(elem.tagName == "d" and elem.nodeName == "d" and elem.localName is None - and elem.namespaceURI == xml.dom.EMPTY_NAMESPACE + and elem.namespaceURI == xmlcore.dom.EMPTY_NAMESPACE and elem.prefix is None and elem.ownerDocument.isSameNode(doc)) @@ -1060,15 +1062,15 @@ # Make sure illegal NS usage is detected: try: doc.renameNode(node, "http://xml.python.org/ns", "xmlns:foo") - except xml.dom.NamespaceErr: + except xmlcore.dom.NamespaceErr: pass else: print "expected NamespaceErr" doc2 = parseString("") try: - doc2.renameNode(node, xml.dom.EMPTY_NAMESPACE, "foo") - except xml.dom.WrongDocumentErr: + doc2.renameNode(node, xmlcore.dom.EMPTY_NAMESPACE, "foo") + except xmlcore.dom.WrongDocumentErr: pass else: print "expected WrongDocumentErr" @@ -1076,12 +1078,12 @@ def testRenameOther(): # We have to create a comment node explicitly since not all DOM # builders used with minidom add comments to the DOM. - doc = xml.dom.minidom.getDOMImplementation().createDocument( - xml.dom.EMPTY_NAMESPACE, "e", None) + doc = xmlcore.dom.minidom.getDOMImplementation().createDocument( + xmlcore.dom.EMPTY_NAMESPACE, "e", None) node = doc.createComment("comment") try: - doc.renameNode(node, xml.dom.EMPTY_NAMESPACE, "foo") - except xml.dom.NotSupportedErr: + doc.renameNode(node, xmlcore.dom.EMPTY_NAMESPACE, "foo") + except xmlcore.dom.NotSupportedErr: pass else: print "expected NotSupportedErr when renaming comment node" @@ -1192,13 +1194,13 @@ # since each supports a different level of DTD information. t = elem.schemaType confirm(t.name is None - and t.namespace == xml.dom.EMPTY_NAMESPACE) + and t.namespace == xmlcore.dom.EMPTY_NAMESPACE) names = "id notid text enum ref refs ent ents nm nms".split() for name in names: a = elem.getAttributeNode(name) t = a.schemaType confirm(hasattr(t, "name") - and t.namespace == xml.dom.EMPTY_NAMESPACE) + and t.namespace == xmlcore.dom.EMPTY_NAMESPACE) def testSetIdAttribute(): doc = parseString("") @@ -1227,7 +1229,7 @@ and a2.isId and not a3.isId) # renaming an attribute should not affect its ID-ness: - doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an") + doc.renameNode(a2, xmlcore.dom.EMPTY_NAMESPACE, "an") confirm(e.isSameNode(doc.getElementById("w")) and a2.isId) @@ -1263,7 +1265,7 @@ confirm(not a3.isId) confirm(doc.getElementById("v") is None) # renaming an attribute should not affect its ID-ness: - doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an") + doc.renameNode(a2, xmlcore.dom.EMPTY_NAMESPACE, "an") confirm(e.isSameNode(doc.getElementById("w")) and a2.isId) @@ -1299,7 +1301,7 @@ confirm(not a3.isId) confirm(doc.getElementById("v") is None) # renaming an attribute should not affect its ID-ness: - doc.renameNode(a2, xml.dom.EMPTY_NAMESPACE, "an") + doc.renameNode(a2, xmlcore.dom.EMPTY_NAMESPACE, "an") confirm(e.isSameNode(doc.getElementById("w")) and a2.isId) Modified: python/trunk/Lib/test/test_sax.py ============================================================================== --- python/trunk/Lib/test/test_sax.py (original) +++ python/trunk/Lib/test/test_sax.py Wed Dec 14 07:20:35 2005 @@ -1,17 +1,17 @@ # regression test for SAX 2.0 -*- coding: iso-8859-1 -*- # $Id$ -from xml.sax import make_parser, ContentHandler, \ - SAXException, SAXReaderNotAvailable, SAXParseException +from xmlcore.sax import make_parser, ContentHandler, \ + SAXException, SAXReaderNotAvailable, SAXParseException try: make_parser() except SAXReaderNotAvailable: # don't try to test this module if we cannot create a parser raise ImportError("no XML parsers available") -from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \ - XMLFilterBase -from xml.sax.expatreader import create_parser -from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl +from xmlcore.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \ + XMLFilterBase +from xmlcore.sax.expatreader import create_parser +from xmlcore.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl from cStringIO import StringIO from test.test_support import verify, verbose, TestFailed, findfile import os @@ -36,17 +36,17 @@ # Creating parsers several times in a row should succeed. # Testing this because there have been failures of this kind # before. - from xml.sax import make_parser + from xmlcore.sax import make_parser p = make_parser() - from xml.sax import make_parser + from xmlcore.sax import make_parser p = make_parser() - from xml.sax import make_parser + from xmlcore.sax import make_parser p = make_parser() - from xml.sax import make_parser + from xmlcore.sax import make_parser p = make_parser() - from xml.sax import make_parser + from xmlcore.sax import make_parser p = make_parser() - from xml.sax import make_parser + from xmlcore.sax import make_parser p = make_parser() except: return 0 @@ -108,7 +108,7 @@ try: # Creating a parser should succeed - it should fall back # to the expatreader - p = make_parser(['xml.parsers.no_such_parser']) + p = make_parser(['xmlcore.parsers.no_such_parser']) except: return 0 else: Modified: python/trunk/Lib/test/test_xml_etree.py ============================================================================== --- python/trunk/Lib/test/test_xml_etree.py (original) +++ python/trunk/Lib/test/test_xml_etree.py Wed Dec 14 07:20:35 2005 @@ -1,4 +1,4 @@ -# xml.etree test. This file contains enough tests to make sure that +# xmlcore.etree test. This file contains enough tests to make sure that # all included components work as they should. For a more extensive # test suite, see the selftest script in the ElementTree distribution. @@ -30,9 +30,9 @@ """ Import sanity. - >>> from xml.etree import ElementTree - >>> from xml.etree import ElementInclude - >>> from xml.etree import ElementPath + >>> from xmlcore.etree import ElementTree + >>> from xmlcore.etree import ElementInclude + >>> from xmlcore.etree import ElementPath """ def check_method(method): @@ -59,7 +59,7 @@ """ Test element tree interface. - >>> from xml.etree import ElementTree as ET + >>> from xmlcore.etree import ElementTree as ET >>> element = ET.Element("tag", key="value") >>> tree = ET.ElementTree(element) @@ -108,7 +108,7 @@ """ Test find methods (including xpath syntax). - >>> from xml.etree import ElementTree as ET + >>> from xmlcore.etree import ElementTree as ET >>> elem = ET.XML(SAMPLE_XML) >>> elem.find("tag").tag @@ -176,7 +176,7 @@ def parseliteral(): r""" - >>> from xml.etree import ElementTree as ET + >>> from xmlcore.etree import ElementTree as ET >>> element = ET.XML("text") >>> ET.ElementTree(element).write(sys.stdout) @@ -273,7 +273,7 @@ except KeyError: raise IOError("resource not found") if parse == "xml": - from xml.etree.ElementTree import XML + from xmlcore.etree.ElementTree import XML return XML(data) return data @@ -281,8 +281,8 @@ r""" Basic inclusion example (XInclude C.1) - >>> from xml.etree import ElementTree as ET - >>> from xml.etree import ElementInclude + >>> from xmlcore.etree import ElementTree as ET + >>> from xmlcore.etree import ElementInclude >>> document = xinclude_loader("C1.xml") >>> ElementInclude.include(document, xinclude_loader) Copied: python/trunk/Lib/xml.py (from r41666, python/trunk/Lib/xml/__init__.py) ============================================================================== --- python/trunk/Lib/xml/__init__.py (original) +++ python/trunk/Lib/xml.py Wed Dec 14 07:20:35 2005 @@ -16,6 +16,8 @@ """ +import sys +import xmlcore __all__ = ["dom", "parsers", "sax", "etree"] @@ -27,11 +29,10 @@ _MINIMUM_XMLPLUS_VERSION = (0, 8, 4) - try: import _xmlplus except ImportError: - pass + sys.modules[__name__] = xmlcore else: try: v = _xmlplus.version_info @@ -40,8 +41,7 @@ pass else: if v >= _MINIMUM_XMLPLUS_VERSION: - import sys - _xmlplus.__path__.extend(__path__) + _xmlplus.__path__.extend(xmlcore.__path__) sys.modules[__name__] = _xmlplus else: del v Deleted: /python/trunk/Lib/xml/__init__.py ============================================================================== --- /python/trunk/Lib/xml/__init__.py Wed Dec 14 07:20:35 2005 +++ (empty file) @@ -1,47 +0,0 @@ -"""Core XML support for Python. - -This package contains four sub-packages: - -dom -- The W3C Document Object Model. This supports DOM Level 1 + - Namespaces. - -parsers -- Python wrappers for XML parsers (currently only supports Expat). - -sax -- The Simple API for XML, developed by XML-Dev, led by David - Megginson and ported to Python by Lars Marius Garshol. This - supports the SAX 2 API. - -etree -- The ElementTree XML library. This is a subset of the full - ElementTree XML release. - -""" - - -__all__ = ["dom", "parsers", "sax", "etree"] - -# When being checked-out without options, this has the form -# "Revision: x.y " -# When exported using -kv, it is "x.y". -__version__ = "$Revision$".split()[-2:][0] - - -_MINIMUM_XMLPLUS_VERSION = (0, 8, 4) - - -try: - import _xmlplus -except ImportError: - pass -else: - try: - v = _xmlplus.version_info - except AttributeError: - # _xmlplus is too old; ignore it - pass - else: - if v >= _MINIMUM_XMLPLUS_VERSION: - import sys - _xmlplus.__path__.extend(__path__) - sys.modules[__name__] = _xmlplus - else: - del v Modified: python/trunk/Lib/xmlcore/dom/domreg.py ============================================================================== --- python/trunk/Lib/xml/dom/domreg.py (original) +++ python/trunk/Lib/xmlcore/dom/domreg.py Wed Dec 14 07:20:35 2005 @@ -2,7 +2,7 @@ directly. Instead, the functions getDOMImplementation and registerDOMImplementation should be imported from xml.dom.""" -from xml.dom.minicompat import * # isinstance, StringTypes +from xmlcore.dom.minicompat import * # isinstance, StringTypes # This is a list of well-known implementations. Well-known names # should be published by posting to xml-sig at python.org, and are Modified: python/trunk/Lib/xmlcore/dom/expatbuilder.py ============================================================================== --- python/trunk/Lib/xml/dom/expatbuilder.py (original) +++ python/trunk/Lib/xmlcore/dom/expatbuilder.py Wed Dec 14 07:20:35 2005 @@ -27,13 +27,13 @@ # calling any methods on the node object if it exists. (A rather # nice speedup is achieved this way as well!) -from xml.dom import xmlbuilder, minidom, Node -from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE -from xml.parsers import expat -from xml.dom.minidom import _append_child, _set_attribute_node -from xml.dom.NodeFilter import NodeFilter +from xmlcore.dom import xmlbuilder, minidom, Node +from xmlcore.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE +from xmlcore.parsers import expat +from xmlcore.dom.minidom import _append_child, _set_attribute_node +from xmlcore.dom.NodeFilter import NodeFilter -from xml.dom.minicompat import * +from xmlcore.dom.minicompat import * TEXT_NODE = Node.TEXT_NODE CDATA_SECTION_NODE = Node.CDATA_SECTION_NODE Modified: python/trunk/Lib/xmlcore/dom/minicompat.py ============================================================================== --- python/trunk/Lib/xml/dom/minicompat.py (original) +++ python/trunk/Lib/xmlcore/dom/minicompat.py Wed Dec 14 07:20:35 2005 @@ -50,7 +50,7 @@ __all__ = ["NodeList", "EmptyNodeList", "NewStyle", "StringTypes", "defproperty", "GetattrMagic"] -import xml.dom +import xmlcore.dom try: unicode @@ -100,7 +100,7 @@ return len(self) def _set_length(self, value): - raise xml.dom.NoModificationAllowedErr( + raise xmlcore.dom.NoModificationAllowedErr( "attempt to modify read-only attribute 'length'") length = property(_get_length, _set_length, @@ -132,7 +132,7 @@ return 0 def _set_length(self, value): - raise xml.dom.NoModificationAllowedErr( + raise xmlcore.dom.NoModificationAllowedErr( "attempt to modify read-only attribute 'length'") length = property(_get_length, _set_length, @@ -171,7 +171,7 @@ def defproperty(klass, name, doc): get = getattr(klass, ("_get_" + name)).im_func def set(self, value, name=name): - raise xml.dom.NoModificationAllowedErr( + raise xmlcore.dom.NoModificationAllowedErr( "attempt to modify read-only attribute " + repr(name)) assert not hasattr(klass, "_set_" + name), \ "expected not to find _set_" + name Modified: python/trunk/Lib/xmlcore/dom/minidom.py ============================================================================== --- python/trunk/Lib/xml/dom/minidom.py (original) +++ python/trunk/Lib/xmlcore/dom/minidom.py Wed Dec 14 07:20:35 2005 @@ -14,11 +14,11 @@ * SAX 2 namespaces """ -import xml.dom +import xmlcore.dom -from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg -from xml.dom.minicompat import * -from xml.dom.xmlbuilder import DOMImplementationLS, DocumentLS +from xmlcore.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg +from xmlcore.dom.minicompat import * +from xmlcore.dom.xmlbuilder import DOMImplementationLS, DocumentLS _TupleType = type(()) @@ -27,11 +27,11 @@ # DOCUMENT_NODE or DOCUMENT_FRAGMENT_NODE. (The node being checked is # the node being added or removed, not the node being modified.) # -_nodeTypes_with_children = (xml.dom.Node.ELEMENT_NODE, - xml.dom.Node.ENTITY_REFERENCE_NODE) +_nodeTypes_with_children = (xmlcore.dom.Node.ELEMENT_NODE, + xmlcore.dom.Node.ENTITY_REFERENCE_NODE) -class Node(xml.dom.Node, GetattrMagic): +class Node(xmlcore.dom.Node, GetattrMagic): namespaceURI = None # this is non-null only for elements and attributes parentNode = None ownerDocument = None @@ -85,7 +85,7 @@ ### The DOM does not clearly specify what to return in this case return newChild if newChild.nodeType not in self._child_node_types: - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "%s cannot be child of %s" % (repr(newChild), repr(self))) if newChild.parentNode is not None: newChild.parentNode.removeChild(newChild) @@ -95,7 +95,7 @@ try: index = self.childNodes.index(refChild) except ValueError: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() if newChild.nodeType in _nodeTypes_with_children: _clear_id_cache(self) self.childNodes.insert(index, newChild) @@ -117,7 +117,7 @@ ### The DOM does not clearly specify what to return in this case return node if node.nodeType not in self._child_node_types: - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "%s cannot be child of %s" % (repr(node), repr(self))) elif node.nodeType in _nodeTypes_with_children: _clear_id_cache(self) @@ -133,7 +133,7 @@ self.removeChild(oldChild) return self.insertBefore(newChild, refChild) if newChild.nodeType not in self._child_node_types: - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "%s cannot be child of %s" % (repr(newChild), repr(self))) if newChild is oldChild: return @@ -142,7 +142,7 @@ try: index = self.childNodes.index(oldChild) except ValueError: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() self.childNodes[index] = newChild newChild.parentNode = self oldChild.parentNode = None @@ -163,7 +163,7 @@ try: self.childNodes.remove(oldChild) except ValueError: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() if oldChild.nextSibling is not None: oldChild.nextSibling.previousSibling = oldChild.previousSibling if oldChild.previousSibling is not None: @@ -388,7 +388,7 @@ nsuri = self.namespaceURI if prefix == "xmlns": if nsuri and nsuri != XMLNS_NAMESPACE: - raise xml.dom.NamespaceErr( + raise xmlcore.dom.NamespaceErr( "illegal use of 'xmlns' prefix for the wrong namespace") d = self.__dict__ d['prefix'] = prefix @@ -566,7 +566,7 @@ n.__dict__['ownerElement'] = None return n else: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() def removeNamedItemNS(self, namespaceURI, localName): n = self.getNamedItemNS(namespaceURI, localName) @@ -578,11 +578,11 @@ n.__dict__['ownerElement'] = None return n else: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() def setNamedItem(self, node): if not isinstance(node, Attr): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "%s cannot be child of %s" % (repr(node), repr(self))) old = self._attrs.get(node.name) if old: @@ -733,7 +733,7 @@ def setAttributeNode(self, attr): if attr.ownerElement not in (None, self): - raise xml.dom.InuseAttributeErr("attribute node already owned") + raise xmlcore.dom.InuseAttributeErr("attribute node already owned") old1 = self._attrs.get(attr.name, None) if old1 is not None: self.removeAttributeNode(old1) @@ -755,23 +755,23 @@ try: attr = self._attrs[name] except KeyError: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() self.removeAttributeNode(attr) def removeAttributeNS(self, namespaceURI, localName): try: attr = self._attrsNS[(namespaceURI, localName)] except KeyError: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() self.removeAttributeNode(attr) def removeAttributeNode(self, node): if node is None: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() try: self._attrs[node.name] except KeyError: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() _clear_id_cache(self) node.unlink() # Restore this since the node is still useful and otherwise @@ -839,9 +839,9 @@ def setIdAttributeNode(self, idAttr): if idAttr is None or not self.isSameNode(idAttr.ownerElement): - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() if _get_containing_entref(self) is not None: - raise xml.dom.NoModificationAllowedErr() + raise xmlcore.dom.NoModificationAllowedErr() if not idAttr._is_id: idAttr.__dict__['_is_id'] = True self._magic_id_nodes += 1 @@ -882,22 +882,22 @@ return None def appendChild(self, node): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( self.nodeName + " nodes cannot have children") def hasChildNodes(self): return False def insertBefore(self, newChild, refChild): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( self.nodeName + " nodes do not have children") def removeChild(self, oldChild): - raise xml.dom.NotFoundErr( + raise xmlcore.dom.NotFoundErr( self.nodeName + " nodes do not have children") def replaceChild(self, newChild, oldChild): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( self.nodeName + " nodes do not have children") @@ -963,11 +963,11 @@ def substringData(self, offset, count): if offset < 0: - raise xml.dom.IndexSizeErr("offset cannot be negative") + raise xmlcore.dom.IndexSizeErr("offset cannot be negative") if offset >= len(self.data): - raise xml.dom.IndexSizeErr("offset cannot be beyond end of data") + raise xmlcore.dom.IndexSizeErr("offset cannot be beyond end of data") if count < 0: - raise xml.dom.IndexSizeErr("count cannot be negative") + raise xmlcore.dom.IndexSizeErr("count cannot be negative") return self.data[offset:offset+count] def appendData(self, arg): @@ -975,30 +975,30 @@ def insertData(self, offset, arg): if offset < 0: - raise xml.dom.IndexSizeErr("offset cannot be negative") + raise xmlcore.dom.IndexSizeErr("offset cannot be negative") if offset >= len(self.data): - raise xml.dom.IndexSizeErr("offset cannot be beyond end of data") + raise xmlcore.dom.IndexSizeErr("offset cannot be beyond end of data") if arg: self.data = "%s%s%s" % ( self.data[:offset], arg, self.data[offset:]) def deleteData(self, offset, count): if offset < 0: - raise xml.dom.IndexSizeErr("offset cannot be negative") + raise xmlcore.dom.IndexSizeErr("offset cannot be negative") if offset >= len(self.data): - raise xml.dom.IndexSizeErr("offset cannot be beyond end of data") + raise xmlcore.dom.IndexSizeErr("offset cannot be beyond end of data") if count < 0: - raise xml.dom.IndexSizeErr("count cannot be negative") + raise xmlcore.dom.IndexSizeErr("count cannot be negative") if count: self.data = self.data[:offset] + self.data[offset+count:] def replaceData(self, offset, count, arg): if offset < 0: - raise xml.dom.IndexSizeErr("offset cannot be negative") + raise xmlcore.dom.IndexSizeErr("offset cannot be negative") if offset >= len(self.data): - raise xml.dom.IndexSizeErr("offset cannot be beyond end of data") + raise xmlcore.dom.IndexSizeErr("offset cannot be beyond end of data") if count < 0: - raise xml.dom.IndexSizeErr("count cannot be negative") + raise xmlcore.dom.IndexSizeErr("count cannot be negative") if count: self.data = "%s%s%s" % ( self.data[:offset], arg, self.data[offset+count:]) @@ -1018,7 +1018,7 @@ def splitText(self, offset): if offset < 0 or offset > len(self.data): - raise xml.dom.IndexSizeErr("illegal offset value") + raise xmlcore.dom.IndexSizeErr("illegal offset value") newText = self.__class__() newText.data = self.data[offset:] newText.ownerDocument = self.ownerDocument @@ -1187,19 +1187,19 @@ return None def removeNamedItem(self, name): - raise xml.dom.NoModificationAllowedErr( + raise xmlcore.dom.NoModificationAllowedErr( "NamedNodeMap instance is read-only") def removeNamedItemNS(self, namespaceURI, localName): - raise xml.dom.NoModificationAllowedErr( + raise xmlcore.dom.NoModificationAllowedErr( "NamedNodeMap instance is read-only") def setNamedItem(self, node): - raise xml.dom.NoModificationAllowedErr( + raise xmlcore.dom.NoModificationAllowedErr( "NamedNodeMap instance is read-only") def setNamedItemNS(self, node): - raise xml.dom.NoModificationAllowedErr( + raise xmlcore.dom.NoModificationAllowedErr( "NamedNodeMap instance is read-only") def __getstate__(self): @@ -1253,7 +1253,7 @@ clone = DocumentType(None) clone.name = self.name clone.nodeName = self.name - operation = xml.dom.UserDataHandler.NODE_CLONED + operation = xmlcore.dom.UserDataHandler.NODE_CLONED if deep: clone.entities._seq = [] clone.notations._seq = [] @@ -1313,19 +1313,19 @@ return self.version def appendChild(self, newChild): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "cannot append children to an entity node") def insertBefore(self, newChild, refChild): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "cannot insert children below an entity node") def removeChild(self, oldChild): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "cannot remove children from an entity node") def replaceChild(self, newChild, oldChild): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "cannot replace children of an entity node") class Notation(Identified, Childless, Node): @@ -1357,7 +1357,7 @@ def createDocument(self, namespaceURI, qualifiedName, doctype): if doctype and doctype.parentNode is not None: - raise xml.dom.WrongDocumentErr( + raise xmlcore.dom.WrongDocumentErr( "doctype object owned by another DOM tree") doc = self._create_document() @@ -1378,15 +1378,15 @@ # Null the document is returned without a document element # Otherwise if doctype or namespaceURI are not None # Then we go back to the above problem - raise xml.dom.InvalidCharacterErr("Element with no name") + raise xmlcore.dom.InvalidCharacterErr("Element with no name") if add_root_element: prefix, localname = _nssplit(qualifiedName) if prefix == "xml" \ and namespaceURI != "http://www.w3.org/XML/1998/namespace": - raise xml.dom.NamespaceErr("illegal use of 'xml' prefix") + raise xmlcore.dom.NamespaceErr("illegal use of 'xml' prefix") if prefix and not namespaceURI: - raise xml.dom.NamespaceErr( + raise xmlcore.dom.NamespaceErr( "illegal use of prefix without namespaces") element = doc.createElementNS(namespaceURI, qualifiedName) if doctype: @@ -1535,7 +1535,7 @@ def appendChild(self, node): if node.nodeType not in self._child_node_types: - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "%s cannot be child of %s" % (repr(node), repr(self))) if node.parentNode is not None: # This needs to be done before the next test since this @@ -1545,7 +1545,7 @@ if node.nodeType == Node.ELEMENT_NODE \ and self._get_documentElement(): - raise xml.dom.HierarchyRequestErr( + raise xmlcore.dom.HierarchyRequestErr( "two document elements disallowed") return Node.appendChild(self, node) @@ -1553,7 +1553,7 @@ try: self.childNodes.remove(oldChild) except ValueError: - raise xml.dom.NotFoundErr() + raise xmlcore.dom.NotFoundErr() oldChild.nextSibling = oldChild.previousSibling = None oldChild.parentNode = None if self.documentElement is oldChild: @@ -1589,7 +1589,7 @@ assert clone.doctype is None clone.doctype = childclone childclone.parentNode = clone - self._call_user_data_handler(xml.dom.UserDataHandler.NODE_CLONED, + self._call_user_data_handler(xmlcore.dom.UserDataHandler.NODE_CLONED, self, clone) return clone @@ -1731,9 +1731,9 @@ def importNode(self, node, deep): if node.nodeType == Node.DOCUMENT_NODE: - raise xml.dom.NotSupportedErr("cannot import document nodes") + raise xmlcore.dom.NotSupportedErr("cannot import document nodes") elif node.nodeType == Node.DOCUMENT_TYPE_NODE: - raise xml.dom.NotSupportedErr("cannot import document type nodes") + raise xmlcore.dom.NotSupportedErr("cannot import document type nodes") return _clone_node(node, deep, self) def writexml(self, writer, indent="", addindent="", newl="", @@ -1749,24 +1749,24 @@ def renameNode(self, n, namespaceURI, name): if n.ownerDocument is not self: - raise xml.dom.WrongDocumentErr( + raise xmlcore.dom.WrongDocumentErr( "cannot rename nodes from other documents;\n" "expected %s,\nfound %s" % (self, n.ownerDocument)) if n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE): - raise xml.dom.NotSupportedErr( + raise xmlcore.dom.NotSupportedErr( "renameNode() only applies to element and attribute nodes") if namespaceURI != EMPTY_NAMESPACE: if ':' in name: prefix, localName = name.split(':', 1) if ( prefix == "xmlns" - and namespaceURI != xml.dom.XMLNS_NAMESPACE): - raise xml.dom.NamespaceErr( + and namespaceURI != xmlcore.dom.XMLNS_NAMESPACE): + raise xmlcore.dom.NamespaceErr( "illegal use of 'xmlns' prefix") else: if ( name == "xmlns" - and namespaceURI != xml.dom.XMLNS_NAMESPACE + and namespaceURI != xmlcore.dom.XMLNS_NAMESPACE and n.nodeType == Node.ATTRIBUTE_NODE): - raise xml.dom.NamespaceErr( + raise xmlcore.dom.NamespaceErr( "illegal use of the 'xmlns' attribute") prefix = None localName = name @@ -1812,9 +1812,9 @@ Called by Node.cloneNode and Document.importNode """ if node.ownerDocument.isSameNode(newOwnerDocument): - operation = xml.dom.UserDataHandler.NODE_CLONED + operation = xmlcore.dom.UserDataHandler.NODE_CLONED else: - operation = xml.dom.UserDataHandler.NODE_IMPORTED + operation = xmlcore.dom.UserDataHandler.NODE_IMPORTED if node.nodeType == Node.ELEMENT_NODE: clone = newOwnerDocument.createElementNS(node.namespaceURI, node.nodeName) @@ -1851,7 +1851,7 @@ clone.value = node.value elif node.nodeType == Node.DOCUMENT_TYPE_NODE: assert node.ownerDocument is not newOwnerDocument - operation = xml.dom.UserDataHandler.NODE_IMPORTED + operation = xmlcore.dom.UserDataHandler.NODE_IMPORTED clone = newOwnerDocument.implementation.createDocumentType( node.name, node.publicId, node.systemId) clone.ownerDocument = newOwnerDocument @@ -1878,7 +1878,7 @@ # Note the cloning of Document and DocumentType nodes is # implemenetation specific. minidom handles those cases # directly in the cloneNode() methods. - raise xml.dom.NotSupportedErr("Cannot clone node %s" % repr(node)) + raise xmlcore.dom.NotSupportedErr("Cannot clone node %s" % repr(node)) # Check for _call_user_data_handler() since this could conceivably # used with other DOM implementations (one of the FourThought @@ -1911,20 +1911,20 @@ def parse(file, parser=None, bufsize=None): """Parse a file into a DOM by filename or file object.""" if parser is None and not bufsize: - from xml.dom import expatbuilder + from xmlcore.dom import expatbuilder return expatbuilder.parse(file) else: - from xml.dom import pulldom + from xmlcore.dom import pulldom return _do_pulldom_parse(pulldom.parse, (file,), {'parser': parser, 'bufsize': bufsize}) def parseString(string, parser=None): """Parse a file into a DOM from a string.""" if parser is None: - from xml.dom import expatbuilder + from xmlcore.dom import expatbuilder return expatbuilder.parseString(string) else: - from xml.dom import pulldom + from xmlcore.dom import pulldom return _do_pulldom_parse(pulldom.parseString, (string,), {'parser': parser}) Modified: python/trunk/Lib/xmlcore/dom/pulldom.py ============================================================================== --- python/trunk/Lib/xml/dom/pulldom.py (original) +++ python/trunk/Lib/xmlcore/dom/pulldom.py Wed Dec 14 07:20:35 2005 @@ -1,5 +1,5 @@ -import xml.sax -import xml.sax.handler +import xmlcore.sax +import xmlcore.sax.handler import types try: @@ -16,12 +16,12 @@ IGNORABLE_WHITESPACE = "IGNORABLE_WHITESPACE" CHARACTERS = "CHARACTERS" -class PullDOM(xml.sax.ContentHandler): +class PullDOM(xmlcore.sax.ContentHandler): _locator = None document = None def __init__(self, documentFactory=None): - from xml.dom import XML_NAMESPACE + from xmlcore.dom import XML_NAMESPACE self.documentFactory = documentFactory self.firstEvent = [None, None] self.lastEvent = self.firstEvent @@ -164,8 +164,8 @@ def startDocument(self): if self.documentFactory is None: - import xml.dom.minidom - self.documentFactory = xml.dom.minidom.Document.implementation + import xmlcore.dom.minidom + self.documentFactory = xmlcore.dom.minidom.Document.implementation def buildDocument(self, uri, tagname): # Can't do that in startDocument, since we need the tagname @@ -219,7 +219,7 @@ def reset(self): self.pulldom = PullDOM() # This content handler relies on namespace support - self.parser.setFeature(xml.sax.handler.feature_namespaces, 1) + self.parser.setFeature(xmlcore.sax.handler.feature_namespaces, 1) self.parser.setContentHandler(self.pulldom) def __getitem__(self, pos): @@ -335,7 +335,7 @@ else: stream = stream_or_string if not parser: - parser = xml.sax.make_parser() + parser = xmlcore.sax.make_parser() return DOMEventStream(stream, parser, bufsize) def parseString(string, parser=None): @@ -347,5 +347,5 @@ bufsize = len(string) buf = StringIO(string) if not parser: - parser = xml.sax.make_parser() + parser = xmlcore.sax.make_parser() return DOMEventStream(buf, parser, bufsize) Modified: python/trunk/Lib/xmlcore/dom/xmlbuilder.py ============================================================================== --- python/trunk/Lib/xml/dom/xmlbuilder.py (original) +++ python/trunk/Lib/xmlcore/dom/xmlbuilder.py Wed Dec 14 07:20:35 2005 @@ -1,11 +1,11 @@ """Implementation of the DOM Level 3 'LS-Load' feature.""" import copy -import xml.dom +import xmlcore.dom -from xml.dom.minicompat import * +from xmlcore.dom.minicompat import * -from xml.dom.NodeFilter import NodeFilter +from xmlcore.dom.NodeFilter import NodeFilter __all__ = ["DOMBuilder", "DOMEntityResolver", "DOMInputSource"] @@ -80,13 +80,13 @@ try: settings = self._settings[(_name_xform(name), state)] except KeyError: - raise xml.dom.NotSupportedErr( + raise xmlcore.dom.NotSupportedErr( "unsupported feature: %r" % (name,)) else: for name, value in settings: setattr(self._options, name, value) else: - raise xml.dom.NotFoundErr("unknown feature: " + repr(name)) + raise xmlcore.dom.NotFoundErr("unknown feature: " + repr(name)) def supportsFeature(self, name): return hasattr(self._options, _name_xform(name)) @@ -177,7 +177,7 @@ or options.create_entity_ref_nodes or options.entities or options.cdata_sections)) - raise xml.dom.NotFoundErr("feature %s not known" % repr(name)) + raise xmlcore.dom.NotFoundErr("feature %s not known" % repr(name)) def parseURI(self, uri): if self.entityResolver: @@ -202,8 +202,8 @@ raise NotImplementedError("Haven't written this yet...") def _parse_bytestream(self, stream, options): - import xml.dom.expatbuilder - builder = xml.dom.expatbuilder.makeBuilder(options) + import xmlcore.dom.expatbuilder + builder = xmlcore.dom.expatbuilder.makeBuilder(options) return builder.parseFile(stream) @@ -342,7 +342,7 @@ return False def _set_async(self, async): if async: - raise xml.dom.NotSupportedErr( + raise xmlcore.dom.NotSupportedErr( "asynchronous document loading is not supported") def abort(self): @@ -361,7 +361,7 @@ if snode is None: snode = self elif snode.ownerDocument is not self: - raise xml.dom.WrongDocumentErr() + raise xmlcore.dom.WrongDocumentErr() return snode.toxml() @@ -371,12 +371,12 @@ def createDOMBuilder(self, mode, schemaType): if schemaType is not None: - raise xml.dom.NotSupportedErr( + raise xmlcore.dom.NotSupportedErr( "schemaType not yet supported") if mode == self.MODE_SYNCHRONOUS: return DOMBuilder() if mode == self.MODE_ASYNCHRONOUS: - raise xml.dom.NotSupportedErr( + raise xmlcore.dom.NotSupportedErr( "asynchronous builders are not supported") raise ValueError("unknown value for mode") Modified: python/trunk/Lib/xmlcore/etree/ElementTree.py ============================================================================== --- python/trunk/Lib/xml/etree/ElementTree.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementTree.py Wed Dec 14 07:20:35 2005 @@ -1109,7 +1109,7 @@ def __init__(self, html=0, target=None): try: - from xml.parsers import expat + from xmlcore.parsers import expat except ImportError: raise ImportError( "No module named expat; use SimpleXMLTreeBuilder instead" @@ -1191,7 +1191,7 @@ try: self._target.data(self.entity[text[1:-1]]) except KeyError: - from xml.parsers import expat + from xmlcore.parsers import expat raise expat.error( "undefined entity %s: line %d, column %d" % (text, self._parser.ErrorLineNumber, Modified: python/trunk/Lib/xmlcore/sax/__init__.py ============================================================================== --- python/trunk/Lib/xml/sax/__init__.py (original) +++ python/trunk/Lib/xmlcore/sax/__init__.py Wed Dec 14 07:20:35 2005 @@ -51,12 +51,12 @@ # this is the parser list used by the make_parser function if no # alternatives are given as parameters to the function -default_parser_list = ["xml.sax.expatreader"] +default_parser_list = ["xmlcore.sax.expatreader"] # tell modulefinder that importing sax potentially imports expatreader _false = 0 if _false: - import xml.sax.expatreader + import xmlcore.sax.expatreader import os, sys if os.environ.has_key("PY_SAX_PARSER"): Modified: python/trunk/Lib/xmlcore/sax/expatreader.py ============================================================================== --- python/trunk/Lib/xml/sax/expatreader.py (original) +++ python/trunk/Lib/xmlcore/sax/expatreader.py Wed Dec 14 07:20:35 2005 @@ -5,27 +5,27 @@ version = "0.20" -from xml.sax._exceptions import * -from xml.sax.handler import feature_validation, feature_namespaces -from xml.sax.handler import feature_namespace_prefixes -from xml.sax.handler import feature_external_ges, feature_external_pes -from xml.sax.handler import feature_string_interning -from xml.sax.handler import property_xml_string, property_interning_dict +from xmlcore.sax._exceptions import * +from xmlcore.sax.handler import feature_validation, feature_namespaces +from xmlcore.sax.handler import feature_namespace_prefixes +from xmlcore.sax.handler import feature_external_ges, feature_external_pes +from xmlcore.sax.handler import feature_string_interning +from xmlcore.sax.handler import property_xml_string, property_interning_dict -# xml.parsers.expat does not raise ImportError in Jython +# xmlcore.parsers.expat does not raise ImportError in Jython import sys if sys.platform[:4] == "java": raise SAXReaderNotAvailable("expat not available in Java", None) del sys try: - from xml.parsers import expat + from xmlcore.parsers import expat except ImportError: raise SAXReaderNotAvailable("expat not supported", None) else: if not hasattr(expat, "ParserCreate"): raise SAXReaderNotAvailable("expat not supported", None) -from xml.sax import xmlreader, saxutils, handler +from xmlcore.sax import xmlreader, saxutils, handler AttributesImpl = xmlreader.AttributesImpl AttributesNSImpl = xmlreader.AttributesNSImpl @@ -407,8 +407,8 @@ # --- if __name__ == "__main__": - import xml.sax + import xmlcore.sax p = create_parser() - p.setContentHandler(xml.sax.XMLGenerator()) - p.setErrorHandler(xml.sax.ErrorHandler()) + p.setContentHandler(xmlcore.sax.XMLGenerator()) + p.setErrorHandler(xmlcore.sax.ErrorHandler()) p.parse("../../../hamlet.xml") From python-checkins at python.org Wed Dec 14 07:26:11 2005 From: python-checkins at python.org (fred.drake) Date: Wed, 14 Dec 2005 07:26:11 +0100 (CET) Subject: [Python-checkins] commit of r41668 - in python/trunk/Lib: xml xmlcore/__init__.py Message-ID: <20051214062611.B7BE01E4002@bag.python.org> Author: fred.drake Date: Wed Dec 14 07:26:11 2005 New Revision: 41668 Added: python/trunk/Lib/xmlcore/__init__.py (contents, props changed) Removed: python/trunk/Lib/xml/ Log: - remove leftover directory - add file I forgot to add in previous commit Added: python/trunk/Lib/xmlcore/__init__.py ============================================================================== --- (empty file) +++ python/trunk/Lib/xmlcore/__init__.py Wed Dec 14 07:26:11 2005 @@ -0,0 +1,20 @@ +"""Core XML support for Python. + +This package contains four sub-packages: + +dom -- The W3C Document Object Model. This supports DOM Level 1 + + Namespaces. + +parsers -- Python wrappers for XML parsers (currently only supports Expat). + +sax -- The Simple API for XML, developed by XML-Dev, led by David + Megginson and ported to Python by Lars Marius Garshol. This + supports the SAX 2 API. + +etree -- The ElementTree XML library. This is a subset of the full + ElementTree XML release. + +""" + + +__all__ = ["dom", "parsers", "sax", "etree"] From martin at v.loewis.de Wed Dec 14 07:47:10 2005 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Wed, 14 Dec 2005 07:47:10 +0100 Subject: [Python-checkins] commit of r41667 - in python/trunk/Lib: test/test_minidom.py test/test_sax.py test/test_xml_etree.py xml.py xml/__init__.py xml/dom xml/etree xml/parsers xml/sax xmlcore xmlcore/dom xmlcore/dom/domreg.py xmlcore/dom/expatbuilder.py xmlcore/dom/minicompat.py xmlcore/dom/minidom.py xmlcore/dom/pulldom.py xmlcore/dom/xmlbuilder.py xmlcore/etree xmlcore/etree/ElementTree.py xmlcore/parsers xmlcore/sax xmlcore/sax/__init__.py xmlcore/sax/expatreader.py In-Reply-To: <20051214062037.3B18C1E4002@bag.python.org> References: <20051214062037.3B18C1E4002@bag.python.org> Message-ID: <439FBFEE.6040005@v.loewis.de> fred.drake wrote: > move the xml package implementation to xmlcore, and adjust the tests to > test that package, not the xmlcore/PyXML switcheroo fiasco in the xml > module/package What is the rationale for this change? Can you please revert it? Maintaining PyXML will be a pain if this stays, and users will be confused what the "xmlcore" package is. Regards, Martin From python-checkins at python.org Wed Dec 14 18:36:37 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 18:36:37 +0100 (CET) Subject: [Python-checkins] commit of r41669 - python/trunk/Makefile.pre.in Message-ID: <20051214173637.0F45B1E4002@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 18:36:36 2005 New Revision: 41669 Modified: python/trunk/Makefile.pre.in Log: fixed installation of xmlcore libraries (including xmlcore.etree) Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Wed Dec 14 18:36:36 2005 @@ -667,7 +667,7 @@ EXTRAPLATDIR= @EXTRAPLATDIR@ EXTRAMACHDEPPATH=@EXTRAMACHDEPPATH@ MACHDEPS= $(PLATDIR) $(EXTRAPLATDIR) -XMLLIBSUBDIRS= xml xml/dom xml/parsers xml/sax +XMLLIBSUBDIRS= xmlcore xmlcore/dom xmlcore/etree xmlcore/parsers xmlcore/sax PLATMACDIRS= plat-mac plat-mac/Carbon plat-mac/lib-scriptpackages \ plat-mac/lib-scriptpackages/_builtinSuites \ plat-mac/lib-scriptpackages/CodeWarrior \ From python-checkins at python.org Wed Dec 14 18:37:31 2005 From: python-checkins at python.org (phillip.eby) Date: Wed, 14 Dec 2005 18:37:31 +0100 (CET) Subject: [Python-checkins] commit of r41670 - in sandbox/trunk/setuptools: setuptools.egg-info/entry_points.txt setuptools.txt setuptools/command/__init__.py setuptools/command/install.py setuptools/command/install_egg_info.py Message-ID: <20051214173731.6CEEE1E400A@bag.python.org> Author: phillip.eby Date: Wed Dec 14 18:37:30 2005 New Revision: 41670 Added: sandbox/trunk/setuptools/setuptools/command/install_egg_info.py (contents, props changed) Modified: sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt sandbox/trunk/setuptools/setuptools.txt sandbox/trunk/setuptools/setuptools/command/__init__.py sandbox/trunk/setuptools/setuptools/command/install.py Log: Added an internal ``install_egg_info`` command to use as part of old-style ``install`` operations, that installs an ``.egg-info`` directory with the package. This is a preliminary step to implementing "install --single-version-externally-managed" for use with bdist_* commands and Debian. Modified: sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt (original) +++ sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt Wed Dec 14 18:37:30 2005 @@ -30,6 +30,7 @@ saveopts = setuptools.command.saveopts:saveopts egg_info = setuptools.command.egg_info:egg_info upload = setuptools.command.upload:upload +install_egg_info = setuptools.command.install_egg_info:install_egg_info alias = setuptools.command.alias:alias easy_install = setuptools.command.easy_install:easy_install bdist_egg = setuptools.command.bdist_egg:bdist_egg Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Wed Dec 14 18:37:30 2005 @@ -11,7 +11,7 @@ ordinary Python packages based on the ``distutils``. Your users don't need to install or even know about setuptools in order to use them, and you don't have to include the entire setuptools package in your distributions. By -including just a single `bootstrap module`_ (a 7K .py file), your package will +including just a single `bootstrap module`_ (an 8K .py file), your package will automatically download and install ``setuptools`` if the user is building your package from source and doesn't have a suitable version already installed. @@ -2181,6 +2181,10 @@ that you can process a directory tree through a processing filter as if it were a zipfile or tarfile. + * Added an internal ``install_egg_info`` command to use as part of old-style + ``install`` operations, that installs an ``.egg-info`` directory with the + package. + 0.6a8 * Fixed some problems building extensions when Pyrex was installed, especially with Python 2.4 and/or packages using SWIG. @@ -2434,3 +2438,12 @@ 0.3a1 * Initial release. + +Mailing list +============ + +Please use the `distutils-sig mailing list`_ for questions and discussion about +setuptools. + +.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/ + Modified: sandbox/trunk/setuptools/setuptools/command/__init__.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/__init__.py (original) +++ sandbox/trunk/setuptools/setuptools/command/__init__.py Wed Dec 14 18:37:30 2005 @@ -1,7 +1,7 @@ __all__ = [ 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', - 'sdist', 'setopt', 'test', 'upload', + 'sdist', 'setopt', 'test', 'upload', 'install_egg_info', ] Modified: sandbox/trunk/setuptools/setuptools/command/install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install.py Wed Dec 14 18:37:30 2005 @@ -50,9 +50,9 @@ cmd.run() setuptools.bootstrap_install_from = None - - - + sub_commands = _install.sub_commands + [ + ('install_egg_info', lambda self: True), + ] Added: sandbox/trunk/setuptools/setuptools/command/install_egg_info.py ============================================================================== --- (empty file) +++ sandbox/trunk/setuptools/setuptools/command/install_egg_info.py Wed Dec 14 18:37:30 2005 @@ -0,0 +1,82 @@ +from setuptools import Command +from setuptools.archive_util import unpack_archive +from distutils import log, dir_util +import os, shutil, pkg_resources + +class install_egg_info(Command): + """Install an .egg-info directory for the package""" + + description = "Install an .egg-info directory for the package" + + user_options = [ + ('install-dir=', 'd', "directory to install to"), + ] + + def initialize_options(self): + self.install_dir = None + + def finalize_options(self): + self.set_undefined_options('install_lib',('install_dir','install_dir')) + ei_cmd = self.get_finalized_command("egg_info") + basename = pkg_resources.Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version + ).egg_name()+'.egg-info' + self.source = ei_cmd.egg_info + self.target = os.path.join(self.install_dir, basename) + + def run(self): + self.run_command('egg_info') + target = self.target + if os.path.isdir(self.target) and not os.path.islink(self.target): + dir_util.remove_tree(self.target, dry_run=self.dry_run) + elif os.path.exists(self.target): + self.execute(os.unlink,(self.target,),"Removing "+self.target) + if not self.dry_run: + pkg_resources.ensure_directory(self.target) + self.execute(self.copytree, (), + "Copying %s to %s" % (self.source, self.target) + ) + + + + def get_outputs(self): + return [self.target] # XXX list all files, not just dir? + + def copytree(self): + # Copy the .egg-info tree to site-packages + + def skimmer(src,dst): + # filter out source-control directories; note that 'src' is always + # a '/'-separated path, regardless of platform. 'dst' is a + # platform-specific path. + for skip in '.svn/','CVS/': + if src.startswith(skip) or '/'+skip in src: + return None + log.debug("Copying %s to %s", src, dst) + return dst + + unpack_archive(self.source, self.target, skimmer) + + + + + + + + + + + + + + + + + + + + + + + + From python-checkins at python.org Wed Dec 14 19:05:14 2005 From: python-checkins at python.org (armin.rigo) Date: Wed, 14 Dec 2005 19:05:14 +0100 (CET) Subject: [Python-checkins] commit of r41671 - python/trunk/Parser/asdl_c.py Message-ID: <20051214180514.C3FF71E4009@bag.python.org> Author: armin.rigo Date: Wed Dec 14 19:05:14 2005 New Revision: 41671 Modified: python/trunk/Parser/asdl_c.py Log: When regenerating files like Python-ast.h, take care that the generated comment based on 'sys.args[0]' does not depend on the path. For Python builds from a remote directory ("/path/to/configure; make") the previous logic used to include the "/path/to" portion in Python-ast.h. Then svn would consider this file to be locally modified. Modified: python/trunk/Parser/asdl_c.py ============================================================================== --- python/trunk/Parser/asdl_c.py (original) +++ python/trunk/Parser/asdl_c.py Wed Dec 14 19:05:14 2005 @@ -639,9 +639,8 @@ def main(srcfile): argv0 = sys.argv[0] - index = argv0.find('/') - if index > 0: - argv0 = argv0[index + 1:] + components = argv0.split(os.sep) + argv0 = os.sep.join(components[-2:]) auto_gen_msg = '/* File automatically generated by %s */\n' % argv0 mod = asdl.parse(srcfile) if not asdl.check(mod): From python-checkins at python.org Wed Dec 14 19:05:45 2005 From: python-checkins at python.org (armin.rigo) Date: Wed, 14 Dec 2005 19:05:45 +0100 (CET) Subject: [Python-checkins] commit of r41672 - python/trunk/Modules/sha512module.c Message-ID: <20051214180545.17DBF1E400B@bag.python.org> Author: armin.rigo Date: Wed Dec 14 19:05:44 2005 New Revision: 41672 Modified: python/trunk/Modules/sha512module.c Log: Added the 'ULL' prefix to the unsigned long long literal constants. Supresses numerous pages of compiler warnings. Modified: python/trunk/Modules/sha512module.c ============================================================================== --- python/trunk/Modules/sha512module.c (original) +++ python/trunk/Modules/sha512module.c Wed Dec 14 19:05:44 2005 @@ -121,12 +121,12 @@ /* Various logical functions */ #define ROR64(x, y) \ - ( ((((x) & 0xFFFFFFFFFFFFFFFF)>>((unsigned PY_LONG_LONG)(y) & 63)) | \ - ((x)<<((unsigned PY_LONG_LONG)(64-((y) & 63))))) & 0xFFFFFFFFFFFFFFFF) + ( ((((x) & 0xFFFFFFFFFFFFFFFFULL)>>((unsigned PY_LONG_LONG)(y) & 63)) | \ + ((x)<<((unsigned PY_LONG_LONG)(64-((y) & 63))))) & 0xFFFFFFFFFFFFFFFFULL) #define Ch(x,y,z) (z ^ (x & (y ^ z))) #define Maj(x,y,z) (((x | y) & z) | (x & y)) #define S(x, n) ROR64((x),(n)) -#define R(x, n) (((x) & 0xFFFFFFFFFFFFFFFF) >> ((unsigned PY_LONG_LONG)n)) +#define R(x, n) (((x) & 0xFFFFFFFFFFFFFFFFULL) >> ((unsigned PY_LONG_LONG)n)) #define Sigma0(x) (S(x, 28) ^ S(x, 34) ^ S(x, 39)) #define Sigma1(x) (S(x, 14) ^ S(x, 18) ^ S(x, 41)) #define Gamma0(x) (S(x, 1) ^ S(x, 8) ^ R(x, 7)) @@ -156,86 +156,86 @@ d += t0; \ h = t0 + t1; - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98d728ae22); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x7137449123ef65cd); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcfec4d3b2f); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba58189dbbc); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25bf348b538); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1b605d019); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4af194f9b); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5da6d8118); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98a3030242); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b0145706fbe); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be4ee4b28c); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3d5ffb4e2); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74f27b896f); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe3b1696b1); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a725c71235); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174cf692694); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c19ef14ad2); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786384f25e3); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc68b8cd5b5); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc77ac9c65); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f592b0275); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa6ea6e483); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dcbd41fbd4); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da831153b5); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152ee66dfab); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d2db43210); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c898fb213f); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7beef0ee4); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf33da88fc2); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147930aa725); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351e003826f); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x142929670a0e6e70); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a8546d22ffc); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b21385c26c926); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc5ac42aed); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d139d95b3df); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a73548baf63de); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb3c77b2a8); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e47edaee6); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c851482353b); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a14cf10364); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664bbc423001); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70d0f89791); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a30654be30); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819d6ef5218); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd69906245565a910); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e35855771202a); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa07032bbd1b8); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116b8d2d0c8); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c085141ab53); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774cdf8eeb99); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5e19b48a8); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3c5c95a63); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4ae3418acb); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f7763e373); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3d6b2b8a3); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee5defb2fc); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f43172f60); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814a1f0ab72); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc702081a6439ec); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa23631e28); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506cebde82bde9); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7b2c67915); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2e372532b); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],64,0xca273eceea26619c); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],65,0xd186b8c721c0c207); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],66,0xeada7dd6cde0eb1e); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],67,0xf57d4f7fee6ed178); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],68,0x06f067aa72176fba); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],69,0x0a637dc5a2c898a6); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],70,0x113f9804bef90dae); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],71,0x1b710b35131c471b); - RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],72,0x28db77f523047d84); - RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],73,0x32caab7b40c72493); - RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],74,0x3c9ebe0a15c9bebc); - RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],75,0x431d67c49c100d4c); - RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],76,0x4cc5d4becb3e42b6); - RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],77,0x597f299cfc657e2a); - RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],78,0x5fcb6fab3ad6faec); - RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],79,0x6c44198c4a475817); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98d728ae22ULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x7137449123ef65cdULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcfec4d3b2fULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba58189dbbcULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25bf348b538ULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1b605d019ULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4af194f9bULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5da6d8118ULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98a3030242ULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b0145706fbeULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be4ee4b28cULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3d5ffb4e2ULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74f27b896fULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe3b1696b1ULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a725c71235ULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174cf692694ULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c19ef14ad2ULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786384f25e3ULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc68b8cd5b5ULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc77ac9c65ULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f592b0275ULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa6ea6e483ULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dcbd41fbd4ULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da831153b5ULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152ee66dfabULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d2db43210ULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c898fb213fULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7beef0ee4ULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf33da88fc2ULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147930aa725ULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351e003826fULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x142929670a0e6e70ULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a8546d22ffcULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b21385c26c926ULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc5ac42aedULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d139d95b3dfULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a73548baf63deULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb3c77b2a8ULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e47edaee6ULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c851482353bULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a14cf10364ULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664bbc423001ULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70d0f89791ULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a30654be30ULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819d6ef5218ULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd69906245565a910ULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e35855771202aULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa07032bbd1b8ULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116b8d2d0c8ULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c085141ab53ULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774cdf8eeb99ULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5e19b48a8ULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3c5c95a63ULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4ae3418acbULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f7763e373ULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3d6b2b8a3ULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee5defb2fcULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f43172f60ULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814a1f0ab72ULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc702081a6439ecULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa23631e28ULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506cebde82bde9ULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7b2c67915ULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2e372532bULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],64,0xca273eceea26619cULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],65,0xd186b8c721c0c207ULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],66,0xeada7dd6cde0eb1eULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],67,0xf57d4f7fee6ed178ULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],68,0x06f067aa72176fbaULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],69,0x0a637dc5a2c898a6ULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],70,0x113f9804bef90daeULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],71,0x1b710b35131c471bULL); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],72,0x28db77f523047d84ULL); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],73,0x32caab7b40c72493ULL); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],74,0x3c9ebe0a15c9bebcULL); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],75,0x431d67c49c100d4cULL); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],76,0x4cc5d4becb3e42b6ULL); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],77,0x597f299cfc657e2aULL); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],78,0x5fcb6fab3ad6faecULL); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],79,0x6c44198c4a475817ULL); #undef RND @@ -254,14 +254,14 @@ sha512_init(SHAobject *sha_info) { TestEndianness(sha_info->Endianness) - sha_info->digest[0] = 0x6a09e667f3bcc908; - sha_info->digest[1] = 0xbb67ae8584caa73b; - sha_info->digest[2] = 0x3c6ef372fe94f82b; - sha_info->digest[3] = 0xa54ff53a5f1d36f1; - sha_info->digest[4] = 0x510e527fade682d1; - sha_info->digest[5] = 0x9b05688c2b3e6c1f; - sha_info->digest[6] = 0x1f83d9abfb41bd6b; - sha_info->digest[7] = 0x5be0cd19137e2179; + sha_info->digest[0] = 0x6a09e667f3bcc908ULL; + sha_info->digest[1] = 0xbb67ae8584caa73bULL; + sha_info->digest[2] = 0x3c6ef372fe94f82bULL; + sha_info->digest[3] = 0xa54ff53a5f1d36f1ULL; + sha_info->digest[4] = 0x510e527fade682d1ULL; + sha_info->digest[5] = 0x9b05688c2b3e6c1fULL; + sha_info->digest[6] = 0x1f83d9abfb41bd6bULL; + sha_info->digest[7] = 0x5be0cd19137e2179ULL; sha_info->count_lo = 0L; sha_info->count_hi = 0L; sha_info->local = 0; @@ -272,14 +272,14 @@ sha384_init(SHAobject *sha_info) { TestEndianness(sha_info->Endianness) - sha_info->digest[0] = 0xcbbb9d5dc1059ed8; - sha_info->digest[1] = 0x629a292a367cd507; - sha_info->digest[2] = 0x9159015a3070dd17; - sha_info->digest[3] = 0x152fecd8f70e5939; - sha_info->digest[4] = 0x67332667ffc00b31; - sha_info->digest[5] = 0x8eb44a8768581511; - sha_info->digest[6] = 0xdb0c2e0d64f98fa7; - sha_info->digest[7] = 0x47b5481dbefa4fa4; + sha_info->digest[0] = 0xcbbb9d5dc1059ed8ULL; + sha_info->digest[1] = 0x629a292a367cd507ULL; + sha_info->digest[2] = 0x9159015a3070dd17ULL; + sha_info->digest[3] = 0x152fecd8f70e5939ULL; + sha_info->digest[4] = 0x67332667ffc00b31ULL; + sha_info->digest[5] = 0x8eb44a8768581511ULL; + sha_info->digest[6] = 0xdb0c2e0d64f98fa7ULL; + sha_info->digest[7] = 0x47b5481dbefa4fa4ULL; sha_info->count_lo = 0L; sha_info->count_hi = 0L; sha_info->local = 0; From python-checkins at python.org Wed Dec 14 19:10:12 2005 From: python-checkins at python.org (phillip.eby) Date: Wed, 14 Dec 2005 19:10:12 +0100 (CET) Subject: [Python-checkins] commit of r41673 - in sandbox/trunk/setuptools: EasyInstall.txt setuptools.txt setuptools/command/bdist_rpm.py setuptools/command/install.py Message-ID: <20051214181012.B7F4D1E4013@bag.python.org> Author: phillip.eby Date: Wed Dec 14 19:10:11 2005 New Revision: 41673 Modified: sandbox/trunk/setuptools/EasyInstall.txt sandbox/trunk/setuptools/setuptools.txt sandbox/trunk/setuptools/setuptools/command/bdist_rpm.py sandbox/trunk/setuptools/setuptools/command/install.py Log: Added a ``--single-version-externally-managed`` option to the ``install`` command so that you can more easily wrap a "flat" egg in a system package. Enhanced ``bdist_rpm`` so that it installs single-version eggs that don't rely on a ``.pth`` file. The ``--no-egg`` option has been removed, since all RPMs are now built in a more backwards-compatible format. Some work is now needed for easy_install to recognize bdist_wininst .exe's that wrap these new flat eggs, as currently the .egg-info will not be recognized. Modified: sandbox/trunk/setuptools/EasyInstall.txt ============================================================================== --- sandbox/trunk/setuptools/EasyInstall.txt (original) +++ sandbox/trunk/setuptools/EasyInstall.txt Wed Dec 14 19:10:11 2005 @@ -874,6 +874,10 @@ the shortest one. This helps to avoid "table of contents" CGI URLs like the ones on effbot.org. + * Quote arguments to python.exe (including python's path) to avoid problems + when Python (or a script) is installed in a directory whose name contains + spaces on Windows. + 0.6a8 * Update for changed SourceForge mirror format Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Wed Dec 14 19:10:11 2005 @@ -1629,6 +1629,25 @@ them in a ``[develop]`` section or on the command line. +``easy_install`` - Find and install packages +============================================ + +This command runs the `EasyInstall tool +`_ for you. It is exactly +equivalent to running the ``easy_install`` command. All command line arguments +following this command are consumed and not processed further by the distutils, +so this must be the last command listed on the command line. Please see +the EasyInstall documentation for the options reference and usage examples. +Normally, there is no reason to use this command via the command line, as you +can just use ``easy_install`` directly. It's only listed here so that you know +it's a distutils command, which means that you can: + +* create command aliases that use it, +* create distutils extensions that invoke it as a subcommand, and +* configure options for it in your ``setup.cfg`` or other distutils config + files. + + .. _egg_info: ``egg_info`` - Create egg metadata and set build tags @@ -1717,6 +1736,47 @@ no ``package_dir`` set, this option defaults to the current directory. +``install`` - Run ``easy_install`` or old-style installation +============================================================ + +The setuptools ``install`` command is basically a shortcut to run the +``easy_install`` command on the current project. However, for convenience +in creating "system packages" of setuptools-based projects, you can also +use this option: + +``--single-version-externally-managed`` + This boolean option tells the ``install`` command to perform an "old style" + installation, with the addition of an ``.egg-info`` directory so that the + installed project will still have its metadata available and operate + normally. If you use this option, you *must* also specify the ``--root`` + or ``--record`` options (or both), because otherwise you will have no way + to identify and remove the installed files. + +This option is automatically in effect when ``install`` is invoked by another +distutils command, so that commands like ``bdist_wininst`` and ``bdist_rpm`` +will create system packages of eggs. + + +``install_egg_info`` - Install an ``.egg-info`` directory in ``site-packages`` +============================================================================== + +Setuptools runs this command as part of ``install`` operations that use the +``--single-version-externally-managed`` options. You should not invoke it +directly; it is documented here for completeness and so that distutils +extensions such as system package builders can make use of it. This command +has only one option: + +``--install-dir=DIR, -d DIR`` + The parent directory where the ``.egg-info`` directory will be placed. + Defaults to the same as the ``--install-dir`` option specified for the + ``install_lib`` command, which is usually the system ``site-packages`` + directory. + +This command assumes that the ``egg_info`` command has been given valid options +via the command line or ``setup.cfg``, as it will invoke the ``egg_info`` +command and use its options to locate the project's source ``.egg-info`` +directory. + .. _rotate: @@ -2185,6 +2245,13 @@ ``install`` operations, that installs an ``.egg-info`` directory with the package. + * Added a ``--single-version-externally-managed`` option to the ``install`` + command so that you can more easily wrap a "flat" egg in a system package. + + * Enhanced ``bdist_rpm`` so that it installs single-version eggs that + don't rely on a ``.pth`` file. The ``--no-egg`` option has been removed, + since all RPMs are now built in a more backwards-compatible format. + 0.6a8 * Fixed some problems building extensions when Pyrex was installed, especially with Python 2.4 and/or packages using SWIG. Modified: sandbox/trunk/setuptools/setuptools/command/bdist_rpm.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/bdist_rpm.py (original) +++ sandbox/trunk/setuptools/setuptools/command/bdist_rpm.py Wed Dec 14 19:10:11 2005 @@ -6,12 +6,6 @@ class bdist_rpm(_bdist_rpm): - user_options = _bdist_rpm.user_options + [ - ('no-egg', None, "Don't install as an egg (may break the package!)") - ] - - boolean_options = _bdist_rpm.boolean_options + ['no-egg'] - def initialize_options(self): _bdist_rpm.initialize_options(self) self.no_egg = None @@ -31,24 +25,16 @@ "Source0: %{name}-%{version}.tar", "Source0: %{name}-%{unmangled_version}.tar" ).replace( + "setup.py install ", + "setup.py install --single-version-externally-managed " + ).replace( "%setup", "%setup -n %{name}-%{unmangled_version}" ).replace(line23,line24) for line in spec ] spec.insert(spec.index(line24)+1, "%define unmangled_version "+version) - - - if not self.no_egg: - return spec - - # Hack the spec file so that we install old-style - return [ - line.replace( - "setup.py install ","setup.py install --old-and-unmanageable " - ) for line in spec - ] - + return spec Modified: sandbox/trunk/setuptools/setuptools/command/install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install.py Wed Dec 14 19:10:11 2005 @@ -1,29 +1,47 @@ import setuptools, sys from distutils.command.install import install as _install +from distutils.errors import DistutilsArgError class install(_install): """Use easy_install to install the package, w/dependencies""" user_options = _install.user_options + [ ('old-and-unmanageable', None, "Try not to use this!"), + ('single-version-externally-managed', None, + "used by system package builders to create 'flat' eggs"), ] - boolean_options = _install.boolean_options + ['old-and-unmanageable'] + boolean_options = _install.boolean_options + [ + 'old-and-unmanageable', 'single-version-externally-managed', + ] + + sub_commands = _install.sub_commands + [ + ('install_egg_info', lambda self: True), + ] def initialize_options(self): _install.initialize_options(self) self.old_and_unmanageable = None + self.single_version_externally_managed = None self.no_compile = None # make DISTUTILS_DEBUG work right! + def finalize_options(self): + _install.initialize_options(self) + if self.single_version_externally_managed: + if not self.root and not self.record: + raise DistutilsArgError( + "You must specify --record or --root when building system" + " packages" + ) + def handle_extra_path(self): - # We always ignore extra_path, because we always install eggs - # (you can always use install_* commands directly if needed) + # We always ignore extra_path, because we install as .egg or .egg-info self.path_file = None self.extra_dirs = '' def run(self): - if (self.old_and_unmanageable or - sys._getframe(1).f_globals.get('__name__','') != 'distutils.dist' + if (self.old_and_unmanageable or self.single_version_externally_managed + or sys._getframe(1).f_globals.get('__name__','') != 'distutils.dist' ): # Either we were asked for the old behavior, or we're not being # run from the command line. This is a bit kludgy, because a @@ -50,24 +68,6 @@ cmd.run() setuptools.bootstrap_install_from = None - sub_commands = _install.sub_commands + [ - ('install_egg_info', lambda self: True), - ] - - - - - - - - - - - - - - - From python-checkins at python.org Wed Dec 14 19:10:46 2005 From: python-checkins at python.org (armin.rigo) Date: Wed, 14 Dec 2005 19:10:46 +0100 (CET) Subject: [Python-checkins] commit of r41674 - in python/trunk/Lib: test/test_xml_etree.py xmlcore xmlcore/etree xmlcore/etree/ElementInclude.py xmlcore/etree/ElementPath.py xmlcore/etree/ElementTree.py xmlcore/etree/__init__.py Message-ID: <20051214181046.2746F1E4015@bag.python.org> Author: armin.rigo Date: Wed Dec 14 19:10:45 2005 New Revision: 41674 Modified: python/trunk/Lib/test/test_xml_etree.py (contents, props changed) python/trunk/Lib/xmlcore/ (props changed) python/trunk/Lib/xmlcore/etree/ (props changed) python/trunk/Lib/xmlcore/etree/ElementInclude.py (contents, props changed) python/trunk/Lib/xmlcore/etree/ElementPath.py (contents, props changed) python/trunk/Lib/xmlcore/etree/ElementTree.py (contents, props changed) python/trunk/Lib/xmlcore/etree/__init__.py (contents, props changed) Log: Subversion settings: svn:ignore *.pyc *.pyo svn:eol-style native The .py files appear to have been checked in with Windows or inconsistent line endings. The current check-in disrupts the 'svn blame', but hopefully it is irrelevant for freshly imported code. Modified: python/trunk/Lib/test/test_xml_etree.py ============================================================================== --- python/trunk/Lib/test/test_xml_etree.py (original) +++ python/trunk/Lib/test/test_xml_etree.py Wed Dec 14 19:10:45 2005 @@ -1,339 +1,339 @@ -# xmlcore.etree test. This file contains enough tests to make sure that -# all included components work as they should. For a more extensive -# test suite, see the selftest script in the ElementTree distribution. - -import doctest, sys - -from test import test_support - -SAMPLE_XML = """ - - text - -
- subtext -
- -""" - -SAMPLE_XML_NS = """ - - text - -
- subtext -
- -""" - -def sanity(): - """ - Import sanity. - - >>> from xmlcore.etree import ElementTree - >>> from xmlcore.etree import ElementInclude - >>> from xmlcore.etree import ElementPath - """ - -def check_method(method): - if not callable(method): - print method, "not callable" - -def serialize(ET, elem, encoding=None): - import StringIO - file = StringIO.StringIO() - tree = ET.ElementTree(elem) - if encoding: - tree.write(file, encoding) - else: - tree.write(file) - return file.getvalue() - -def summarize(elem): - return elem.tag - -def summarize_list(seq): - return map(summarize, seq) - -def interface(): - """ - Test element tree interface. - - >>> from xmlcore.etree import ElementTree as ET - - >>> element = ET.Element("tag", key="value") - >>> tree = ET.ElementTree(element) - - Make sure all standard element methods exist. - - >>> check_method(element.append) - >>> check_method(element.insert) - >>> check_method(element.remove) - >>> check_method(element.getchildren) - >>> check_method(element.find) - >>> check_method(element.findall) - >>> check_method(element.findtext) - >>> check_method(element.clear) - >>> check_method(element.get) - >>> check_method(element.set) - >>> check_method(element.keys) - >>> check_method(element.items) - >>> check_method(element.getiterator) - - Basic method sanity checks. - - >>> serialize(ET, element) # 1 - '' - >>> subelement = ET.Element("subtag") - >>> element.append(subelement) - >>> serialize(ET, element) # 2 - '' - >>> element.insert(0, subelement) - >>> serialize(ET, element) # 3 - '' - >>> element.remove(subelement) - >>> serialize(ET, element) # 4 - '' - >>> element.remove(subelement) - >>> serialize(ET, element) # 5 - '' - >>> element.remove(subelement) - Traceback (most recent call last): - ValueError: list.remove(x): x not in list - >>> serialize(ET, element) # 6 - '' - """ - -def find(): - """ - Test find methods (including xpath syntax). - - >>> from xmlcore.etree import ElementTree as ET - - >>> elem = ET.XML(SAMPLE_XML) - >>> elem.find("tag").tag - 'tag' - >>> ET.ElementTree(elem).find("tag").tag - 'tag' - >>> elem.find("section/tag").tag - 'tag' - >>> ET.ElementTree(elem).find("section/tag").tag - 'tag' - >>> elem.findtext("tag") - 'text' - >>> elem.findtext("tog") - >>> elem.findtext("tog", "default") - 'default' - >>> ET.ElementTree(elem).findtext("tag") - 'text' - >>> elem.findtext("section/tag") - 'subtext' - >>> ET.ElementTree(elem).findtext("section/tag") - 'subtext' - >>> summarize_list(elem.findall("tag")) - ['tag', 'tag'] - >>> summarize_list(elem.findall("*")) - ['tag', 'tag', 'section'] - >>> summarize_list(elem.findall(".//tag")) - ['tag', 'tag', 'tag'] - >>> summarize_list(elem.findall("section/tag")) - ['tag'] - >>> summarize_list(elem.findall("section//tag")) - ['tag'] - >>> summarize_list(elem.findall("section/*")) - ['tag'] - >>> summarize_list(elem.findall("section//*")) - ['tag'] - >>> summarize_list(elem.findall("section/.//*")) - ['tag'] - >>> summarize_list(elem.findall("*/*")) - ['tag'] - >>> summarize_list(elem.findall("*//*")) - ['tag'] - >>> summarize_list(elem.findall("*/tag")) - ['tag'] - >>> summarize_list(elem.findall("*/./tag")) - ['tag'] - >>> summarize_list(elem.findall("./tag")) - ['tag', 'tag'] - >>> summarize_list(elem.findall(".//tag")) - ['tag', 'tag', 'tag'] - >>> summarize_list(elem.findall("././tag")) - ['tag', 'tag'] - >>> summarize_list(ET.ElementTree(elem).findall("/tag")) - ['tag', 'tag'] - >>> summarize_list(ET.ElementTree(elem).findall("./tag")) - ['tag', 'tag'] - >>> elem = ET.XML(SAMPLE_XML_NS) - >>> summarize_list(elem.findall("tag")) - [] - >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) - ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] - >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) - ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] - """ - -def parseliteral(): - r""" - - >>> from xmlcore.etree import ElementTree as ET - - >>> element = ET.XML("text") - >>> ET.ElementTree(element).write(sys.stdout) - text - >>> element = ET.fromstring("text") - >>> ET.ElementTree(element).write(sys.stdout) - text - >>> print ET.tostring(element) - text - >>> print ET.tostring(element, "ascii") - - text - >>> _, ids = ET.XMLID("text") - >>> len(ids) - 0 - >>> _, ids = ET.XMLID("text") - >>> len(ids) - 1 - >>> ids["body"].tag - 'body' - """ - -# -# xinclude tests (samples from appendix C of the xinclude specification) - -XINCLUDE = {} - -XINCLUDE["C1.xml"] = """\ - - -

120 Mz is adequate for an average home user.

- -
-""" - -XINCLUDE["disclaimer.xml"] = """\ - - -

The opinions represented herein represent those of the individual - and should not be interpreted as official policy endorsed by this - organization.

-
-""" - -XINCLUDE["C2.xml"] = """\ - - -

This document has been accessed - times.

-
-""" - -XINCLUDE["count.txt"] = "324387" - -XINCLUDE["C3.xml"] = """\ - - -

The following is the source of the "data.xml" resource:

- -
-""" - -XINCLUDE["data.xml"] = """\ - - - - -""" - -XINCLUDE["C5.xml"] = """\ - -
- - - - Report error - - - -
-""" - -XINCLUDE["default.xml"] = """\ - - -

Example.

- -
-""" - -def xinclude_loader(href, parse="xml", encoding=None): - try: - data = XINCLUDE[href] - except KeyError: - raise IOError("resource not found") - if parse == "xml": - from xmlcore.etree.ElementTree import XML - return XML(data) - return data - -def xinclude(): - r""" - Basic inclusion example (XInclude C.1) - - >>> from xmlcore.etree import ElementTree as ET - >>> from xmlcore.etree import ElementInclude - - >>> document = xinclude_loader("C1.xml") - >>> ElementInclude.include(document, xinclude_loader) - >>> print serialize(ET, document) # C1 - -

120 Mz is adequate for an average home user.

- -

The opinions represented herein represent those of the individual - and should not be interpreted as official policy endorsed by this - organization.

-
-
- - Textual inclusion example (XInclude C.2) - - >>> document = xinclude_loader("C2.xml") - >>> ElementInclude.include(document, xinclude_loader) - >>> print serialize(ET, document) # C2 - -

This document has been accessed - 324387 times.

-
- - Textual inclusion of XML example (XInclude C.3) - - >>> document = xinclude_loader("C3.xml") - >>> ElementInclude.include(document, xinclude_loader) - >>> print serialize(ET, document) # C3 - -

The following is the source of the "data.xml" resource:

- <?xml version='1.0'?> - <data> - <item><![CDATA[Brooks & Shields]]></item> - </data> - -
- - Fallback example (XInclude C.5) - Note! Fallback support is not yet implemented - - >>> document = xinclude_loader("C5.xml") - >>> ElementInclude.include(document, xinclude_loader) - Traceback (most recent call last): - IOError: resource not found - >>> # print serialize(ET, document) # C5 - - """ - -def test_main(): - from test import test_xml_etree - test_support.run_doctest(test_xml_etree, verbosity=True) - -if __name__ == '__main__': - test_main() +# xmlcore.etree test. This file contains enough tests to make sure that +# all included components work as they should. For a more extensive +# test suite, see the selftest script in the ElementTree distribution. + +import doctest, sys + +from test import test_support + +SAMPLE_XML = """ + + text + +
+ subtext +
+ +""" + +SAMPLE_XML_NS = """ + + text + +
+ subtext +
+ +""" + +def sanity(): + """ + Import sanity. + + >>> from xmlcore.etree import ElementTree + >>> from xmlcore.etree import ElementInclude + >>> from xmlcore.etree import ElementPath + """ + +def check_method(method): + if not callable(method): + print method, "not callable" + +def serialize(ET, elem, encoding=None): + import StringIO + file = StringIO.StringIO() + tree = ET.ElementTree(elem) + if encoding: + tree.write(file, encoding) + else: + tree.write(file) + return file.getvalue() + +def summarize(elem): + return elem.tag + +def summarize_list(seq): + return map(summarize, seq) + +def interface(): + """ + Test element tree interface. + + >>> from xmlcore.etree import ElementTree as ET + + >>> element = ET.Element("tag", key="value") + >>> tree = ET.ElementTree(element) + + Make sure all standard element methods exist. + + >>> check_method(element.append) + >>> check_method(element.insert) + >>> check_method(element.remove) + >>> check_method(element.getchildren) + >>> check_method(element.find) + >>> check_method(element.findall) + >>> check_method(element.findtext) + >>> check_method(element.clear) + >>> check_method(element.get) + >>> check_method(element.set) + >>> check_method(element.keys) + >>> check_method(element.items) + >>> check_method(element.getiterator) + + Basic method sanity checks. + + >>> serialize(ET, element) # 1 + '' + >>> subelement = ET.Element("subtag") + >>> element.append(subelement) + >>> serialize(ET, element) # 2 + '' + >>> element.insert(0, subelement) + >>> serialize(ET, element) # 3 + '' + >>> element.remove(subelement) + >>> serialize(ET, element) # 4 + '' + >>> element.remove(subelement) + >>> serialize(ET, element) # 5 + '' + >>> element.remove(subelement) + Traceback (most recent call last): + ValueError: list.remove(x): x not in list + >>> serialize(ET, element) # 6 + '' + """ + +def find(): + """ + Test find methods (including xpath syntax). + + >>> from xmlcore.etree import ElementTree as ET + + >>> elem = ET.XML(SAMPLE_XML) + >>> elem.find("tag").tag + 'tag' + >>> ET.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.find("section/tag").tag + 'tag' + >>> ET.ElementTree(elem).find("section/tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog") + >>> elem.findtext("tog", "default") + 'default' + >>> ET.ElementTree(elem).findtext("tag") + 'text' + >>> elem.findtext("section/tag") + 'subtext' + >>> ET.ElementTree(elem).findtext("section/tag") + 'subtext' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall("*")) + ['tag', 'tag', 'section'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("section/tag")) + ['tag'] + >>> summarize_list(elem.findall("section//tag")) + ['tag'] + >>> summarize_list(elem.findall("section/*")) + ['tag'] + >>> summarize_list(elem.findall("section//*")) + ['tag'] + >>> summarize_list(elem.findall("section/.//*")) + ['tag'] + >>> summarize_list(elem.findall("*/*")) + ['tag'] + >>> summarize_list(elem.findall("*//*")) + ['tag'] + >>> summarize_list(elem.findall("*/tag")) + ['tag'] + >>> summarize_list(elem.findall("*/./tag")) + ['tag'] + >>> summarize_list(elem.findall("./tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("././tag")) + ['tag', 'tag'] + >>> summarize_list(ET.ElementTree(elem).findall("/tag")) + ['tag', 'tag'] + >>> summarize_list(ET.ElementTree(elem).findall("./tag")) + ['tag', 'tag'] + >>> elem = ET.XML(SAMPLE_XML_NS) + >>> summarize_list(elem.findall("tag")) + [] + >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + """ + +def parseliteral(): + r""" + + >>> from xmlcore.etree import ElementTree as ET + + >>> element = ET.XML("text") + >>> ET.ElementTree(element).write(sys.stdout) + text + >>> element = ET.fromstring("text") + >>> ET.ElementTree(element).write(sys.stdout) + text + >>> print ET.tostring(element) + text + >>> print ET.tostring(element, "ascii") + + text + >>> _, ids = ET.XMLID("text") + >>> len(ids) + 0 + >>> _, ids = ET.XMLID("text") + >>> len(ids) + 1 + >>> ids["body"].tag + 'body' + """ + +# +# xinclude tests (samples from appendix C of the xinclude specification) + +XINCLUDE = {} + +XINCLUDE["C1.xml"] = """\ + + +

120 Mz is adequate for an average home user.

+ +
+""" + +XINCLUDE["disclaimer.xml"] = """\ + + +

The opinions represented herein represent those of the individual + and should not be interpreted as official policy endorsed by this + organization.

+
+""" + +XINCLUDE["C2.xml"] = """\ + + +

This document has been accessed + times.

+
+""" + +XINCLUDE["count.txt"] = "324387" + +XINCLUDE["C3.xml"] = """\ + + +

The following is the source of the "data.xml" resource:

+ +
+""" + +XINCLUDE["data.xml"] = """\ + + + + +""" + +XINCLUDE["C5.xml"] = """\ + +
+ + + + Report error + + + +
+""" + +XINCLUDE["default.xml"] = """\ + + +

Example.

+ +
+""" + +def xinclude_loader(href, parse="xml", encoding=None): + try: + data = XINCLUDE[href] + except KeyError: + raise IOError("resource not found") + if parse == "xml": + from xmlcore.etree.ElementTree import XML + return XML(data) + return data + +def xinclude(): + r""" + Basic inclusion example (XInclude C.1) + + >>> from xmlcore.etree import ElementTree as ET + >>> from xmlcore.etree import ElementInclude + + >>> document = xinclude_loader("C1.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(ET, document) # C1 + +

120 Mz is adequate for an average home user.

+ +

The opinions represented herein represent those of the individual + and should not be interpreted as official policy endorsed by this + organization.

+
+
+ + Textual inclusion example (XInclude C.2) + + >>> document = xinclude_loader("C2.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(ET, document) # C2 + +

This document has been accessed + 324387 times.

+
+ + Textual inclusion of XML example (XInclude C.3) + + >>> document = xinclude_loader("C3.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(ET, document) # C3 + +

The following is the source of the "data.xml" resource:

+ <?xml version='1.0'?> + <data> + <item><![CDATA[Brooks & Shields]]></item> + </data> + +
+ + Fallback example (XInclude C.5) + Note! Fallback support is not yet implemented + + >>> document = xinclude_loader("C5.xml") + >>> ElementInclude.include(document, xinclude_loader) + Traceback (most recent call last): + IOError: resource not found + >>> # print serialize(ET, document) # C5 + + """ + +def test_main(): + from test import test_xml_etree + test_support.run_doctest(test_xml_etree, verbosity=True) + +if __name__ == '__main__': + test_main() Modified: python/trunk/Lib/xmlcore/etree/ElementInclude.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/ElementInclude.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementInclude.py Wed Dec 14 19:10:45 2005 @@ -1,141 +1,141 @@ -# -# ElementTree -# $Id: ElementInclude.py 1862 2004-06-18 07:31:02Z Fredrik $ -# -# limited xinclude support for element trees -# -# history: -# 2003-08-15 fl created -# 2003-11-14 fl fixed default loader -# -# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Limited XInclude support for the ElementTree package. -## - -import copy -import ElementTree - -XINCLUDE = "{http://www.w3.org/2001/XInclude}" - -XINCLUDE_INCLUDE = XINCLUDE + "include" -XINCLUDE_FALLBACK = XINCLUDE + "fallback" - -## -# Fatal include error. - -class FatalIncludeError(SyntaxError): - pass - -## -# Default loader. This loader reads an included resource from disk. -# -# @param href Resource reference. -# @param parse Parse mode. Either "xml" or "text". -# @param encoding Optional text encoding. -# @return The expanded resource. If the parse mode is "xml", this -# is an ElementTree instance. If the parse mode is "text", this -# is a Unicode string. If the loader fails, it can return None -# or raise an IOError exception. -# @throws IOError If the loader fails to load the resource. - -def default_loader(href, parse, encoding=None): - file = open(href) - if parse == "xml": - data = ElementTree.parse(file).getroot() - else: - data = file.read() - if encoding: - data = data.decode(encoding) - file.close() - return data - -## -# Expand XInclude directives. -# -# @param elem Root element. -# @param loader Optional resource loader. If omitted, it defaults -# to {@link default_loader}. If given, it should be a callable -# that implements the same interface as default_loader. -# @throws FatalIncludeError If the function fails to include a given -# resource, or if the tree contains malformed XInclude elements. -# @throws IOError If the function fails to load a given resource. - -def include(elem, loader=None): - if loader is None: - loader = default_loader - # look for xinclude elements - i = 0 - while i < len(elem): - e = elem[i] - if e.tag == XINCLUDE_INCLUDE: - # process xinclude directive - href = e.get("href") - parse = e.get("parse", "xml") - if parse == "xml": - node = loader(href, parse) - if node is None: - raise FatalIncludeError( - "cannot load %r as %r" % (href, parse) - ) - node = copy.copy(node) - if e.tail: - node.tail = (node.tail or "") + e.tail - elem[i] = node - elif parse == "text": - text = loader(href, parse, e.get("encoding")) - if text is None: - raise FatalIncludeError( - "cannot load %r as %r" % (href, parse) - ) - if i: - node = elem[i-1] - node.tail = (node.tail or "") + text - else: - elem.text = (elem.text or "") + text + (e.tail or "") - del elem[i] - continue - else: - raise FatalIncludeError( - "unknown parse type in xi:include tag (%r)" % parse - ) - elif e.tag == XINCLUDE_FALLBACK: - raise FatalIncludeError( - "xi:fallback tag must be child of xi:include (%r)" % e.tag - ) - else: - include(e, loader) - i = i + 1 - +# +# ElementTree +# $Id: ElementInclude.py 1862 2004-06-18 07:31:02Z Fredrik $ +# +# limited xinclude support for element trees +# +# history: +# 2003-08-15 fl created +# 2003-11-14 fl fixed default loader +# +# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Limited XInclude support for the ElementTree package. +## + +import copy +import ElementTree + +XINCLUDE = "{http://www.w3.org/2001/XInclude}" + +XINCLUDE_INCLUDE = XINCLUDE + "include" +XINCLUDE_FALLBACK = XINCLUDE + "fallback" + +## +# Fatal include error. + +class FatalIncludeError(SyntaxError): + pass + +## +# Default loader. This loader reads an included resource from disk. +# +# @param href Resource reference. +# @param parse Parse mode. Either "xml" or "text". +# @param encoding Optional text encoding. +# @return The expanded resource. If the parse mode is "xml", this +# is an ElementTree instance. If the parse mode is "text", this +# is a Unicode string. If the loader fails, it can return None +# or raise an IOError exception. +# @throws IOError If the loader fails to load the resource. + +def default_loader(href, parse, encoding=None): + file = open(href) + if parse == "xml": + data = ElementTree.parse(file).getroot() + else: + data = file.read() + if encoding: + data = data.decode(encoding) + file.close() + return data + +## +# Expand XInclude directives. +# +# @param elem Root element. +# @param loader Optional resource loader. If omitted, it defaults +# to {@link default_loader}. If given, it should be a callable +# that implements the same interface as default_loader. +# @throws FatalIncludeError If the function fails to include a given +# resource, or if the tree contains malformed XInclude elements. +# @throws IOError If the function fails to load a given resource. + +def include(elem, loader=None): + if loader is None: + loader = default_loader + # look for xinclude elements + i = 0 + while i < len(elem): + e = elem[i] + if e.tag == XINCLUDE_INCLUDE: + # process xinclude directive + href = e.get("href") + parse = e.get("parse", "xml") + if parse == "xml": + node = loader(href, parse) + if node is None: + raise FatalIncludeError( + "cannot load %r as %r" % (href, parse) + ) + node = copy.copy(node) + if e.tail: + node.tail = (node.tail or "") + e.tail + elem[i] = node + elif parse == "text": + text = loader(href, parse, e.get("encoding")) + if text is None: + raise FatalIncludeError( + "cannot load %r as %r" % (href, parse) + ) + if i: + node = elem[i-1] + node.tail = (node.tail or "") + text + else: + elem.text = (elem.text or "") + text + (e.tail or "") + del elem[i] + continue + else: + raise FatalIncludeError( + "unknown parse type in xi:include tag (%r)" % parse + ) + elif e.tag == XINCLUDE_FALLBACK: + raise FatalIncludeError( + "xi:fallback tag must be child of xi:include (%r)" % e.tag + ) + else: + include(e, loader) + i = i + 1 + Modified: python/trunk/Lib/xmlcore/etree/ElementPath.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/ElementPath.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementPath.py Wed Dec 14 19:10:45 2005 @@ -1,196 +1,196 @@ -# -# ElementTree -# $Id: ElementPath.py 1858 2004-06-17 21:31:41Z Fredrik $ -# -# limited xpath support for element trees -# -# history: -# 2003-05-23 fl created -# 2003-05-28 fl added support for // etc -# 2003-08-27 fl fixed parsing of periods in element names -# -# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Implementation module for XPath support. There's usually no reason -# to import this module directly; the ElementTree does this for -# you, if needed. -## - -import re - -xpath_tokenizer = re.compile( - "(::|\.\.|\(\)|[/.*:\[\]\(\)@=])|((?:\{[^}]+\})?[^/:\[\]\(\)@=\s]+)|\s+" - ).findall - -class xpath_descendant_or_self: - pass - -## -# Wrapper for a compiled XPath. - -class Path: - - ## - # Create an Path instance from an XPath expression. - - def __init__(self, path): - tokens = xpath_tokenizer(path) - # the current version supports 'path/path'-style expressions only - self.path = [] - self.tag = None - if tokens and tokens[0][0] == "/": - raise SyntaxError("cannot use absolute path on element") - while tokens: - op, tag = tokens.pop(0) - if tag or op == "*": - self.path.append(tag or op) - elif op == ".": - pass - elif op == "/": - self.path.append(xpath_descendant_or_self()) - continue - else: - raise SyntaxError("unsupported path syntax (%s)" % op) - if tokens: - op, tag = tokens.pop(0) - if op != "/": - raise SyntaxError( - "expected path separator (%s)" % (op or tag) - ) - if self.path and isinstance(self.path[-1], xpath_descendant_or_self): - raise SyntaxError("path cannot end with //") - if len(self.path) == 1 and isinstance(self.path[0], type("")): - self.tag = self.path[0] - - ## - # Find first matching object. - - def find(self, element): - tag = self.tag - if tag is None: - nodeset = self.findall(element) - if not nodeset: - return None - return nodeset[0] - for elem in element: - if elem.tag == tag: - return elem - return None - - ## - # Find text for first matching object. - - def findtext(self, element, default=None): - tag = self.tag - if tag is None: - nodeset = self.findall(element) - if not nodeset: - return default - return nodeset[0].text or "" - for elem in element: - if elem.tag == tag: - return elem.text or "" - return default - - ## - # Find all matching objects. - - def findall(self, element): - nodeset = [element] - index = 0 - while 1: - try: - path = self.path[index] - index = index + 1 - except IndexError: - return nodeset - set = [] - if isinstance(path, xpath_descendant_or_self): - try: - tag = self.path[index] - if not isinstance(tag, type("")): - tag = None - else: - index = index + 1 - except IndexError: - tag = None # invalid path - for node in nodeset: - new = list(node.getiterator(tag)) - if new and new[0] is node: - set.extend(new[1:]) - else: - set.extend(new) - else: - for node in nodeset: - for node in node: - if path == "*" or node.tag == path: - set.append(node) - if not set: - return [] - nodeset = set - -_cache = {} - -## -# (Internal) Compile path. - -def _compile(path): - p = _cache.get(path) - if p is not None: - return p - p = Path(path) - if len(_cache) >= 100: - _cache.clear() - _cache[path] = p - return p - -## -# Find first matching object. - -def find(element, path): - return _compile(path).find(element) - -## -# Find text for first matching object. - -def findtext(element, path, default=None): - return _compile(path).findtext(element, default) - -## -# Find all matching objects. - -def findall(element, path): - return _compile(path).findall(element) - +# +# ElementTree +# $Id: ElementPath.py 1858 2004-06-17 21:31:41Z Fredrik $ +# +# limited xpath support for element trees +# +# history: +# 2003-05-23 fl created +# 2003-05-28 fl added support for // etc +# 2003-08-27 fl fixed parsing of periods in element names +# +# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Implementation module for XPath support. There's usually no reason +# to import this module directly; the ElementTree does this for +# you, if needed. +## + +import re + +xpath_tokenizer = re.compile( + "(::|\.\.|\(\)|[/.*:\[\]\(\)@=])|((?:\{[^}]+\})?[^/:\[\]\(\)@=\s]+)|\s+" + ).findall + +class xpath_descendant_or_self: + pass + +## +# Wrapper for a compiled XPath. + +class Path: + + ## + # Create an Path instance from an XPath expression. + + def __init__(self, path): + tokens = xpath_tokenizer(path) + # the current version supports 'path/path'-style expressions only + self.path = [] + self.tag = None + if tokens and tokens[0][0] == "/": + raise SyntaxError("cannot use absolute path on element") + while tokens: + op, tag = tokens.pop(0) + if tag or op == "*": + self.path.append(tag or op) + elif op == ".": + pass + elif op == "/": + self.path.append(xpath_descendant_or_self()) + continue + else: + raise SyntaxError("unsupported path syntax (%s)" % op) + if tokens: + op, tag = tokens.pop(0) + if op != "/": + raise SyntaxError( + "expected path separator (%s)" % (op or tag) + ) + if self.path and isinstance(self.path[-1], xpath_descendant_or_self): + raise SyntaxError("path cannot end with //") + if len(self.path) == 1 and isinstance(self.path[0], type("")): + self.tag = self.path[0] + + ## + # Find first matching object. + + def find(self, element): + tag = self.tag + if tag is None: + nodeset = self.findall(element) + if not nodeset: + return None + return nodeset[0] + for elem in element: + if elem.tag == tag: + return elem + return None + + ## + # Find text for first matching object. + + def findtext(self, element, default=None): + tag = self.tag + if tag is None: + nodeset = self.findall(element) + if not nodeset: + return default + return nodeset[0].text or "" + for elem in element: + if elem.tag == tag: + return elem.text or "" + return default + + ## + # Find all matching objects. + + def findall(self, element): + nodeset = [element] + index = 0 + while 1: + try: + path = self.path[index] + index = index + 1 + except IndexError: + return nodeset + set = [] + if isinstance(path, xpath_descendant_or_self): + try: + tag = self.path[index] + if not isinstance(tag, type("")): + tag = None + else: + index = index + 1 + except IndexError: + tag = None # invalid path + for node in nodeset: + new = list(node.getiterator(tag)) + if new and new[0] is node: + set.extend(new[1:]) + else: + set.extend(new) + else: + for node in nodeset: + for node in node: + if path == "*" or node.tag == path: + set.append(node) + if not set: + return [] + nodeset = set + +_cache = {} + +## +# (Internal) Compile path. + +def _compile(path): + p = _cache.get(path) + if p is not None: + return p + p = Path(path) + if len(_cache) >= 100: + _cache.clear() + _cache[path] = p + return p + +## +# Find first matching object. + +def find(element, path): + return _compile(path).find(element) + +## +# Find text for first matching object. + +def findtext(element, path, default=None): + return _compile(path).findtext(element, default) + +## +# Find all matching objects. + +def findall(element, path): + return _compile(path).findall(element) + Modified: python/trunk/Lib/xmlcore/etree/ElementTree.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/ElementTree.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementTree.py Wed Dec 14 19:10:45 2005 @@ -1,1254 +1,1254 @@ -# -# ElementTree -# $Id: ElementTree.py 2326 2005-03-17 07:45:21Z fredrik $ -# -# light-weight XML support for Python 1.5.2 and later. -# -# history: -# 2001-10-20 fl created (from various sources) -# 2001-11-01 fl return root from parse method -# 2002-02-16 fl sort attributes in lexical order -# 2002-04-06 fl TreeBuilder refactoring, added PythonDoc markup -# 2002-05-01 fl finished TreeBuilder refactoring -# 2002-07-14 fl added basic namespace support to ElementTree.write -# 2002-07-25 fl added QName attribute support -# 2002-10-20 fl fixed encoding in write -# 2002-11-24 fl changed default encoding to ascii; fixed attribute encoding -# 2002-11-27 fl accept file objects or file names for parse/write -# 2002-12-04 fl moved XMLTreeBuilder back to this module -# 2003-01-11 fl fixed entity encoding glitch for us-ascii -# 2003-02-13 fl added XML literal factory -# 2003-02-21 fl added ProcessingInstruction/PI factory -# 2003-05-11 fl added tostring/fromstring helpers -# 2003-05-26 fl added ElementPath support -# 2003-07-05 fl added makeelement factory method -# 2003-07-28 fl added more well-known namespace prefixes -# 2003-08-15 fl fixed typo in ElementTree.findtext (Thomas Dartsch) -# 2003-09-04 fl fall back on emulator if ElementPath is not installed -# 2003-10-31 fl markup updates -# 2003-11-15 fl fixed nested namespace bug -# 2004-03-28 fl added XMLID helper -# 2004-06-02 fl added default support to findtext -# 2004-06-08 fl fixed encoding of non-ascii element/attribute names -# 2004-08-23 fl take advantage of post-2.1 expat features -# 2005-02-01 fl added iterparse implementation -# 2005-03-02 fl fixed iterparse support for pre-2.2 versions -# -# Copyright (c) 1999-2005 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2005 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -__all__ = [ - # public symbols - "Comment", - "dump", - "Element", "ElementTree", - "fromstring", - "iselement", "iterparse", - "parse", - "PI", "ProcessingInstruction", - "QName", - "SubElement", - "tostring", - "TreeBuilder", - "VERSION", "XML", - "XMLTreeBuilder", - ] - -## -# The Element type is a flexible container object, designed to -# store hierarchical data structures in memory. The type can be -# described as a cross between a list and a dictionary. -#

-# Each element has a number of properties associated with it: -#

    -#
  • a tag. This is a string identifying what kind of data -# this element represents (the element type, in other words).
  • -#
  • a number of attributes, stored in a Python dictionary.
  • -#
  • a text string.
  • -#
  • an optional tail string.
  • -#
  • a number of child elements, stored in a Python sequence
  • -#
-# -# To create an element instance, use the {@link #Element} or {@link -# #SubElement} factory functions. -#

-# The {@link #ElementTree} class can be used to wrap an element -# structure, and convert it from and to XML. -## - -import string, sys, re - -class _SimpleElementPath: - # emulate pre-1.2 find/findtext/findall behaviour - def find(self, element, tag): - for elem in element: - if elem.tag == tag: - return elem - return None - def findtext(self, element, tag, default=None): - for elem in element: - if elem.tag == tag: - return elem.text or "" - return default - def findall(self, element, tag): - if tag[:3] == ".//": - return element.getiterator(tag[3:]) - result = [] - for elem in element: - if elem.tag == tag: - result.append(elem) - return result - -try: - import ElementPath -except ImportError: - # FIXME: issue warning in this case? - ElementPath = _SimpleElementPath() - -# TODO: add support for custom namespace resolvers/default namespaces -# TODO: add improved support for incremental parsing - -VERSION = "1.2.6" - -## -# Internal element class. This class defines the Element interface, -# and provides a reference implementation of this interface. -#

-# You should not create instances of this class directly. Use the -# appropriate factory functions instead, such as {@link #Element} -# and {@link #SubElement}. -# -# @see Element -# @see SubElement -# @see Comment -# @see ProcessingInstruction - -class _ElementInterface: - # text...tail - - ## - # (Attribute) Element tag. - - tag = None - - ## - # (Attribute) Element attribute dictionary. Where possible, use - # {@link #_ElementInterface.get}, - # {@link #_ElementInterface.set}, - # {@link #_ElementInterface.keys}, and - # {@link #_ElementInterface.items} to access - # element attributes. - - attrib = None - - ## - # (Attribute) Text before first subelement. This is either a - # string or the value None, if there was no text. - - text = None - - ## - # (Attribute) Text after this element's end tag, but before the - # next sibling element's start tag. This is either a string or - # the value None, if there was no text. - - tail = None # text after end tag, if any - - def __init__(self, tag, attrib): - self.tag = tag - self.attrib = attrib - self._children = [] - - def __repr__(self): - return "" % (self.tag, id(self)) - - ## - # Creates a new element object of the same type as this element. - # - # @param tag Element tag. - # @param attrib Element attributes, given as a dictionary. - # @return A new element instance. - - def makeelement(self, tag, attrib): - return Element(tag, attrib) - - ## - # Returns the number of subelements. - # - # @return The number of subelements. - - def __len__(self): - return len(self._children) - - ## - # Returns the given subelement. - # - # @param index What subelement to return. - # @return The given subelement. - # @exception IndexError If the given element does not exist. - - def __getitem__(self, index): - return self._children[index] - - ## - # Replaces the given subelement. - # - # @param index What subelement to replace. - # @param element The new element value. - # @exception IndexError If the given element does not exist. - # @exception AssertionError If element is not a valid object. - - def __setitem__(self, index, element): - assert iselement(element) - self._children[index] = element - - ## - # Deletes the given subelement. - # - # @param index What subelement to delete. - # @exception IndexError If the given element does not exist. - - def __delitem__(self, index): - del self._children[index] - - ## - # Returns a list containing subelements in the given range. - # - # @param start The first subelement to return. - # @param stop The first subelement that shouldn't be returned. - # @return A sequence object containing subelements. - - def __getslice__(self, start, stop): - return self._children[start:stop] - - ## - # Replaces a number of subelements with elements from a sequence. - # - # @param start The first subelement to replace. - # @param stop The first subelement that shouldn't be replaced. - # @param elements A sequence object with zero or more elements. - # @exception AssertionError If a sequence member is not a valid object. - - def __setslice__(self, start, stop, elements): - for element in elements: - assert iselement(element) - self._children[start:stop] = list(elements) - - ## - # Deletes a number of subelements. - # - # @param start The first subelement to delete. - # @param stop The first subelement to leave in there. - - def __delslice__(self, start, stop): - del self._children[start:stop] - - ## - # Adds a subelement to the end of this element. - # - # @param element The element to add. - # @exception AssertionError If a sequence member is not a valid object. - - def append(self, element): - assert iselement(element) - self._children.append(element) - - ## - # Inserts a subelement at the given position in this element. - # - # @param index Where to insert the new subelement. - # @exception AssertionError If the element is not a valid object. - - def insert(self, index, element): - assert iselement(element) - self._children.insert(index, element) - - ## - # Removes a matching subelement. Unlike the find methods, - # this method compares elements based on identity, not on tag - # value or contents. - # - # @param element What element to remove. - # @exception ValueError If a matching element could not be found. - # @exception AssertionError If the element is not a valid object. - - def remove(self, element): - assert iselement(element) - self._children.remove(element) - - ## - # Returns all subelements. The elements are returned in document - # order. - # - # @return A list of subelements. - # @defreturn list of Element instances - - def getchildren(self): - return self._children - - ## - # Finds the first matching subelement, by tag name or path. - # - # @param path What element to look for. - # @return The first matching element, or None if no element was found. - # @defreturn Element or None - - def find(self, path): - return ElementPath.find(self, path) - - ## - # Finds text for the first matching subelement, by tag name or path. - # - # @param path What element to look for. - # @param default What to return if the element was not found. - # @return The text content of the first matching element, or the - # default value no element was found. Note that if the element - # has is found, but has no text content, this method returns an - # empty string. - # @defreturn string - - def findtext(self, path, default=None): - return ElementPath.findtext(self, path, default) - - ## - # Finds all matching subelements, by tag name or path. - # - # @param path What element to look for. - # @return A list or iterator containing all matching elements, - # in document order. - # @defreturn list of Element instances - - def findall(self, path): - return ElementPath.findall(self, path) - - ## - # Resets an element. This function removes all subelements, clears - # all attributes, and sets the text and tail attributes to None. - - def clear(self): - self.attrib.clear() - self._children = [] - self.text = self.tail = None - - ## - # Gets an element attribute. - # - # @param key What attribute to look for. - # @param default What to return if the attribute was not found. - # @return The attribute value, or the default value, if the - # attribute was not found. - # @defreturn string or None - - def get(self, key, default=None): - return self.attrib.get(key, default) - - ## - # Sets an element attribute. - # - # @param key What attribute to set. - # @param value The attribute value. - - def set(self, key, value): - self.attrib[key] = value - - ## - # Gets a list of attribute names. The names are returned in an - # arbitrary order (just like for an ordinary Python dictionary). - # - # @return A list of element attribute names. - # @defreturn list of strings - - def keys(self): - return self.attrib.keys() - - ## - # Gets element attributes, as a sequence. The attributes are - # returned in an arbitrary order. - # - # @return A list of (name, value) tuples for all attributes. - # @defreturn list of (string, string) tuples - - def items(self): - return self.attrib.items() - - ## - # Creates a tree iterator. The iterator loops over this element - # and all subelements, in document order, and returns all elements - # with a matching tag. - #

- # If the tree structure is modified during iteration, the result - # is undefined. - # - # @param tag What tags to look for (default is to return all elements). - # @return A list or iterator containing all the matching elements. - # @defreturn list or iterator - - def getiterator(self, tag=None): - nodes = [] - if tag == "*": - tag = None - if tag is None or self.tag == tag: - nodes.append(self) - for node in self._children: - nodes.extend(node.getiterator(tag)) - return nodes - -# compatibility -_Element = _ElementInterface - -## -# Element factory. This function returns an object implementing the -# standard Element interface. The exact class or type of that object -# is implementation dependent, but it will always be compatible with -# the {@link #_ElementInterface} class in this module. -#

-# The element name, attribute names, and attribute values can be -# either 8-bit ASCII strings or Unicode strings. -# -# @param tag The element name. -# @param attrib An optional dictionary, containing element attributes. -# @param **extra Additional attributes, given as keyword arguments. -# @return An element instance. -# @defreturn Element - -def Element(tag, attrib={}, **extra): - attrib = attrib.copy() - attrib.update(extra) - return _ElementInterface(tag, attrib) - -## -# Subelement factory. This function creates an element instance, and -# appends it to an existing element. -#

-# The element name, attribute names, and attribute values can be -# either 8-bit ASCII strings or Unicode strings. -# -# @param parent The parent element. -# @param tag The subelement name. -# @param attrib An optional dictionary, containing element attributes. -# @param **extra Additional attributes, given as keyword arguments. -# @return An element instance. -# @defreturn Element - -def SubElement(parent, tag, attrib={}, **extra): - attrib = attrib.copy() - attrib.update(extra) - element = parent.makeelement(tag, attrib) - parent.append(element) - return element - -## -# Comment element factory. This factory function creates a special -# element that will be serialized as an XML comment. -#

-# The comment string can be either an 8-bit ASCII string or a Unicode -# string. -# -# @param text A string containing the comment string. -# @return An element instance, representing a comment. -# @defreturn Element - -def Comment(text=None): - element = Element(Comment) - element.text = text - return element - -## -# PI element factory. This factory function creates a special element -# that will be serialized as an XML processing instruction. -# -# @param target A string containing the PI target. -# @param text A string containing the PI contents, if any. -# @return An element instance, representing a PI. -# @defreturn Element - -def ProcessingInstruction(target, text=None): - element = Element(ProcessingInstruction) - element.text = target - if text: - element.text = element.text + " " + text - return element - -PI = ProcessingInstruction - -## -# QName wrapper. This can be used to wrap a QName attribute value, in -# order to get proper namespace handling on output. -# -# @param text A string containing the QName value, in the form {uri}local, -# or, if the tag argument is given, the URI part of a QName. -# @param tag Optional tag. If given, the first argument is interpreted as -# an URI, and this argument is interpreted as a local name. -# @return An opaque object, representing the QName. - -class QName: - def __init__(self, text_or_uri, tag=None): - if tag: - text_or_uri = "{%s}%s" % (text_or_uri, tag) - self.text = text_or_uri - def __str__(self): - return self.text - def __hash__(self): - return hash(self.text) - def __cmp__(self, other): - if isinstance(other, QName): - return cmp(self.text, other.text) - return cmp(self.text, other) - -## -# ElementTree wrapper class. This class represents an entire element -# hierarchy, and adds some extra support for serialization to and from -# standard XML. -# -# @param element Optional root element. -# @keyparam file Optional file handle or name. If given, the -# tree is initialized with the contents of this XML file. - -class ElementTree: - - def __init__(self, element=None, file=None): - assert element is None or iselement(element) - self._root = element # first node - if file: - self.parse(file) - - ## - # Gets the root element for this tree. - # - # @return An element instance. - # @defreturn Element - - def getroot(self): - return self._root - - ## - # Replaces the root element for this tree. This discards the - # current contents of the tree, and replaces it with the given - # element. Use with care. - # - # @param element An element instance. - - def _setroot(self, element): - assert iselement(element) - self._root = element - - ## - # Loads an external XML document into this element tree. - # - # @param source A file name or file object. - # @param parser An optional parser instance. If not given, the - # standard {@link XMLTreeBuilder} parser is used. - # @return The document root element. - # @defreturn Element - - def parse(self, source, parser=None): - if not hasattr(source, "read"): - source = open(source, "rb") - if not parser: - parser = XMLTreeBuilder() - while 1: - data = source.read(32768) - if not data: - break - parser.feed(data) - self._root = parser.close() - return self._root - - ## - # Creates a tree iterator for the root element. The iterator loops - # over all elements in this tree, in document order. - # - # @param tag What tags to look for (default is to return all elements) - # @return An iterator. - # @defreturn iterator - - def getiterator(self, tag=None): - assert self._root is not None - return self._root.getiterator(tag) - - ## - # Finds the first toplevel element with given tag. - # Same as getroot().find(path). - # - # @param path What element to look for. - # @return The first matching element, or None if no element was found. - # @defreturn Element or None - - def find(self, path): - assert self._root is not None - if path[:1] == "/": - path = "." + path - return self._root.find(path) - - ## - # Finds the element text for the first toplevel element with given - # tag. Same as getroot().findtext(path). - # - # @param path What toplevel element to look for. - # @param default What to return if the element was not found. - # @return The text content of the first matching element, or the - # default value no element was found. Note that if the element - # has is found, but has no text content, this method returns an - # empty string. - # @defreturn string - - def findtext(self, path, default=None): - assert self._root is not None - if path[:1] == "/": - path = "." + path - return self._root.findtext(path, default) - - ## - # Finds all toplevel elements with the given tag. - # Same as getroot().findall(path). - # - # @param path What element to look for. - # @return A list or iterator containing all matching elements, - # in document order. - # @defreturn list of Element instances - - def findall(self, path): - assert self._root is not None - if path[:1] == "/": - path = "." + path - return self._root.findall(path) - - ## - # Writes the element tree to a file, as XML. - # - # @param file A file name, or a file object opened for writing. - # @param encoding Optional output encoding (default is US-ASCII). - - def write(self, file, encoding="us-ascii"): - assert self._root is not None - if not hasattr(file, "write"): - file = open(file, "wb") - if not encoding: - encoding = "us-ascii" - elif encoding != "utf-8" and encoding != "us-ascii": - file.write("\n" % encoding) - self._write(file, self._root, encoding, {}) - - def _write(self, file, node, encoding, namespaces): - # write XML to file - tag = node.tag - if tag is Comment: - file.write("" % _escape_cdata(node.text, encoding)) - elif tag is ProcessingInstruction: - file.write("" % _escape_cdata(node.text, encoding)) - else: - items = node.items() - xmlns_items = [] # new namespaces in this scope - try: - if isinstance(tag, QName) or tag[:1] == "{": - tag, xmlns = fixtag(tag, namespaces) - if xmlns: xmlns_items.append(xmlns) - except TypeError: - _raise_serialization_error(tag) - file.write("<" + _encode(tag, encoding)) - if items or xmlns_items: - items.sort() # lexical order - for k, v in items: - try: - if isinstance(k, QName) or k[:1] == "{": - k, xmlns = fixtag(k, namespaces) - if xmlns: xmlns_items.append(xmlns) - except TypeError: - _raise_serialization_error(k) - try: - if isinstance(v, QName): - v, xmlns = fixtag(v, namespaces) - if xmlns: xmlns_items.append(xmlns) - except TypeError: - _raise_serialization_error(v) - file.write(" %s=\"%s\"" % (_encode(k, encoding), - _escape_attrib(v, encoding))) - for k, v in xmlns_items: - file.write(" %s=\"%s\"" % (_encode(k, encoding), - _escape_attrib(v, encoding))) - if node.text or len(node): - file.write(">") - if node.text: - file.write(_escape_cdata(node.text, encoding)) - for n in node: - self._write(file, n, encoding, namespaces) - file.write("") - else: - file.write(" />") - for k, v in xmlns_items: - del namespaces[v] - if node.tail: - file.write(_escape_cdata(node.tail, encoding)) - -# -------------------------------------------------------------------- -# helpers - -## -# Checks if an object appears to be a valid element object. -# -# @param An element instance. -# @return A true value if this is an element object. -# @defreturn flag - -def iselement(element): - # FIXME: not sure about this; might be a better idea to look - # for tag/attrib/text attributes - return isinstance(element, _ElementInterface) or hasattr(element, "tag") - -## -# Writes an element tree or element structure to sys.stdout. This -# function should be used for debugging only. -#

-# The exact output format is implementation dependent. In this -# version, it's written as an ordinary XML file. -# -# @param elem An element tree or an individual element. - -def dump(elem): - # debugging - if not isinstance(elem, ElementTree): - elem = ElementTree(elem) - elem.write(sys.stdout) - tail = elem.getroot().tail - if not tail or tail[-1] != "\n": - sys.stdout.write("\n") - -def _encode(s, encoding): - try: - return s.encode(encoding) - except AttributeError: - return s # 1.5.2: assume the string uses the right encoding - -if sys.version[:3] == "1.5": - _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2 -else: - _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) - -_escape_map = { - "&": "&", - "<": "<", - ">": ">", - '"': """, -} - -_namespace_map = { - # "well-known" namespace prefixes - "http://www.w3.org/XML/1998/namespace": "xml", - "http://www.w3.org/1999/xhtml": "html", - "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", - "http://schemas.xmlsoap.org/wsdl/": "wsdl", -} - -def _raise_serialization_error(text): - raise TypeError( - "cannot serialize %r (type %s)" % (text, type(text).__name__) - ) - -def _encode_entity(text, pattern=_escape): - # map reserved and non-ascii characters to numerical entities - def escape_entities(m, map=_escape_map): - out = [] - append = out.append - for char in m.group(): - text = map.get(char) - if text is None: - text = "&#%d;" % ord(char) - append(text) - return string.join(out, "") - try: - return _encode(pattern.sub(escape_entities, text), "ascii") - except TypeError: - _raise_serialization_error(text) - -# -# the following functions assume an ascii-compatible encoding -# (or "utf-16") - -def _escape_cdata(text, encoding=None, replace=string.replace): - # escape character data - try: - if encoding: - try: - text = _encode(text, encoding) - except UnicodeError: - return _encode_entity(text) - text = replace(text, "&", "&") - text = replace(text, "<", "<") - text = replace(text, ">", ">") - return text - except (TypeError, AttributeError): - _raise_serialization_error(text) - -def _escape_attrib(text, encoding=None, replace=string.replace): - # escape attribute value - try: - if encoding: - try: - text = _encode(text, encoding) - except UnicodeError: - return _encode_entity(text) - text = replace(text, "&", "&") - text = replace(text, "'", "'") # FIXME: overkill - text = replace(text, "\"", """) - text = replace(text, "<", "<") - text = replace(text, ">", ">") - return text - except (TypeError, AttributeError): - _raise_serialization_error(text) - -def fixtag(tag, namespaces): - # given a decorated tag (of the form {uri}tag), return prefixed - # tag and namespace declaration, if any - if isinstance(tag, QName): - tag = tag.text - namespace_uri, tag = string.split(tag[1:], "}", 1) - prefix = namespaces.get(namespace_uri) - if prefix is None: - prefix = _namespace_map.get(namespace_uri) - if prefix is None: - prefix = "ns%d" % len(namespaces) - namespaces[namespace_uri] = prefix - if prefix == "xml": - xmlns = None - else: - xmlns = ("xmlns:%s" % prefix, namespace_uri) - else: - xmlns = None - return "%s:%s" % (prefix, tag), xmlns - -## -# Parses an XML document into an element tree. -# -# @param source A filename or file object containing XML data. -# @param parser An optional parser instance. If not given, the -# standard {@link XMLTreeBuilder} parser is used. -# @return An ElementTree instance - -def parse(source, parser=None): - tree = ElementTree() - tree.parse(source, parser) - return tree - -## -# Parses an XML document into an element tree incrementally, and reports -# what's going on to the user. -# -# @param source A filename or file object containing XML data. -# @param events A list of events to report back. If omitted, only "end" -# events are reported. -# @return A (event, elem) iterator. - -class iterparse: - - def __init__(self, source, events=None): - if not hasattr(source, "read"): - source = open(source, "rb") - self._file = source - self._events = [] - self._index = 0 - self.root = self._root = None - self._parser = XMLTreeBuilder() - # wire up the parser for event reporting - parser = self._parser._parser - append = self._events.append - if events is None: - events = ["end"] - for event in events: - if event == "start": - try: - parser.ordered_attributes = 1 - parser.specified_attributes = 1 - def handler(tag, attrib_in, event=event, append=append, - start=self._parser._start_list): - append((event, start(tag, attrib_in))) - parser.StartElementHandler = handler - except AttributeError: - def handler(tag, attrib_in, event=event, append=append, - start=self._parser._start): - append((event, start(tag, attrib_in))) - parser.StartElementHandler = handler - elif event == "end": - def handler(tag, event=event, append=append, - end=self._parser._end): - append((event, end(tag))) - parser.EndElementHandler = handler - elif event == "start-ns": - def handler(prefix, uri, event=event, append=append): - try: - uri = _encode(uri, "ascii") - except UnicodeError: - pass - append((event, (prefix or "", uri))) - parser.StartNamespaceDeclHandler = handler - elif event == "end-ns": - def handler(prefix, event=event, append=append): - append((event, None)) - parser.EndNamespaceDeclHandler = handler - - def next(self): - while 1: - try: - item = self._events[self._index] - except IndexError: - if self._parser is None: - self.root = self._root - try: - raise StopIteration - except NameError: - raise IndexError - # load event buffer - del self._events[:] - self._index = 0 - data = self._file.read(16384) - if data: - self._parser.feed(data) - else: - self._root = self._parser.close() - self._parser = None - else: - self._index = self._index + 1 - return item - - try: - iter - def __iter__(self): - return self - except NameError: - def __getitem__(self, index): - return self.next() - -## -# Parses an XML document from a string constant. This function can -# be used to embed "XML literals" in Python code. -# -# @param source A string containing XML data. -# @return An Element instance. -# @defreturn Element - -def XML(text): - parser = XMLTreeBuilder() - parser.feed(text) - return parser.close() - -## -# Parses an XML document from a string constant, and also returns -# a dictionary which maps from element id:s to elements. -# -# @param source A string containing XML data. -# @return A tuple containing an Element instance and a dictionary. -# @defreturn (Element, dictionary) - -def XMLID(text): - parser = XMLTreeBuilder() - parser.feed(text) - tree = parser.close() - ids = {} - for elem in tree.getiterator(): - id = elem.get("id") - if id: - ids[id] = elem - return tree, ids - -## -# Parses an XML document from a string constant. Same as {@link #XML}. -# -# @def fromstring(text) -# @param source A string containing XML data. -# @return An Element instance. -# @defreturn Element - -fromstring = XML - -## -# Generates a string representation of an XML element, including all -# subelements. -# -# @param element An Element instance. -# @return An encoded string containing the XML data. -# @defreturn string - -def tostring(element, encoding=None): - class dummy: - pass - data = [] - file = dummy() - file.write = data.append - ElementTree(element).write(file, encoding) - return string.join(data, "") - -## -# Generic element structure builder. This builder converts a sequence -# of {@link #TreeBuilder.start}, {@link #TreeBuilder.data}, and {@link -# #TreeBuilder.end} method calls to a well-formed element structure. -#

-# You can use this class to build an element structure using a custom XML -# parser, or a parser for some other XML-like format. -# -# @param element_factory Optional element factory. This factory -# is called to create new Element instances, as necessary. - -class TreeBuilder: - - def __init__(self, element_factory=None): - self._data = [] # data collector - self._elem = [] # element stack - self._last = None # last element - self._tail = None # true if we're after an end tag - if element_factory is None: - element_factory = _ElementInterface - self._factory = element_factory - - ## - # Flushes the parser buffers, and returns the toplevel documen - # element. - # - # @return An Element instance. - # @defreturn Element - - def close(self): - assert len(self._elem) == 0, "missing end tags" - assert self._last != None, "missing toplevel element" - return self._last - - def _flush(self): - if self._data: - if self._last is not None: - text = string.join(self._data, "") - if self._tail: - assert self._last.tail is None, "internal error (tail)" - self._last.tail = text - else: - assert self._last.text is None, "internal error (text)" - self._last.text = text - self._data = [] - - ## - # Adds text to the current element. - # - # @param data A string. This should be either an 8-bit string - # containing ASCII text, or a Unicode string. - - def data(self, data): - self._data.append(data) - - ## - # Opens a new element. - # - # @param tag The element name. - # @param attrib A dictionary containing element attributes. - # @return The opened element. - # @defreturn Element - - def start(self, tag, attrs): - self._flush() - self._last = elem = self._factory(tag, attrs) - if self._elem: - self._elem[-1].append(elem) - self._elem.append(elem) - self._tail = 0 - return elem - - ## - # Closes the current element. - # - # @param tag The element name. - # @return The closed element. - # @defreturn Element - - def end(self, tag): - self._flush() - self._last = self._elem.pop() - assert self._last.tag == tag,\ - "end tag mismatch (expected %s, got %s)" % ( - self._last.tag, tag) - self._tail = 1 - return self._last - -## -# Element structure builder for XML source data, based on the -# expat parser. -# -# @keyparam target Target object. If omitted, the builder uses an -# instance of the standard {@link #TreeBuilder} class. -# @keyparam html Predefine HTML entities. This flag is not supported -# by the current implementation. -# @see #ElementTree -# @see #TreeBuilder - -class XMLTreeBuilder: - - def __init__(self, html=0, target=None): - try: - from xmlcore.parsers import expat - except ImportError: - raise ImportError( - "No module named expat; use SimpleXMLTreeBuilder instead" - ) - self._parser = parser = expat.ParserCreate(None, "}") - if target is None: - target = TreeBuilder() - self._target = target - self._names = {} # name memo cache - # callbacks - parser.DefaultHandlerExpand = self._default - parser.StartElementHandler = self._start - parser.EndElementHandler = self._end - parser.CharacterDataHandler = self._data - # let expat do the buffering, if supported - try: - self._parser.buffer_text = 1 - except AttributeError: - pass - # use new-style attribute handling, if supported - try: - self._parser.ordered_attributes = 1 - self._parser.specified_attributes = 1 - parser.StartElementHandler = self._start_list - except AttributeError: - pass - encoding = None - if not parser.returns_unicode: - encoding = "utf-8" - # target.xml(encoding, None) - self._doctype = None - self.entity = {} - - def _fixtext(self, text): - # convert text string to ascii, if possible - try: - return _encode(text, "ascii") - except UnicodeError: - return text - - def _fixname(self, key): - # expand qname, and convert name string to ascii, if possible - try: - name = self._names[key] - except KeyError: - name = key - if "}" in name: - name = "{" + name - self._names[key] = name = self._fixtext(name) - return name - - def _start(self, tag, attrib_in): - fixname = self._fixname - tag = fixname(tag) - attrib = {} - for key, value in attrib_in.items(): - attrib[fixname(key)] = self._fixtext(value) - return self._target.start(tag, attrib) - - def _start_list(self, tag, attrib_in): - fixname = self._fixname - tag = fixname(tag) - attrib = {} - if attrib_in: - for i in range(0, len(attrib_in), 2): - attrib[fixname(attrib_in[i])] = self._fixtext(attrib_in[i+1]) - return self._target.start(tag, attrib) - - def _data(self, text): - return self._target.data(self._fixtext(text)) - - def _end(self, tag): - return self._target.end(self._fixname(tag)) - - def _default(self, text): - prefix = text[:1] - if prefix == "&": - # deal with undefined entities - try: - self._target.data(self.entity[text[1:-1]]) - except KeyError: - from xmlcore.parsers import expat - raise expat.error( - "undefined entity %s: line %d, column %d" % - (text, self._parser.ErrorLineNumber, - self._parser.ErrorColumnNumber) - ) - elif prefix == "<" and text[:9] == "": - self._doctype = None - return - text = string.strip(text) - if not text: - return - self._doctype.append(text) - n = len(self._doctype) - if n > 2: - type = self._doctype[1] - if type == "PUBLIC" and n == 4: - name, type, pubid, system = self._doctype - elif type == "SYSTEM" and n == 3: - name, type, system = self._doctype - pubid = None - else: - return - if pubid: - pubid = pubid[1:-1] - self.doctype(name, pubid, system[1:-1]) - self._doctype = None - - ## - # Handles a doctype declaration. - # - # @param name Doctype name. - # @param pubid Public identifier. - # @param system System identifier. - - def doctype(self, name, pubid, system): - pass - - ## - # Feeds data to the parser. - # - # @param data Encoded data. - - def feed(self, data): - self._parser.Parse(data, 0) - - ## - # Finishes feeding data to the parser. - # - # @return An element structure. - # @defreturn Element - - def close(self): - self._parser.Parse("", 1) # end of data - tree = self._target.close() - del self._target, self._parser # get rid of circular references - return tree +# +# ElementTree +# $Id: ElementTree.py 2326 2005-03-17 07:45:21Z fredrik $ +# +# light-weight XML support for Python 1.5.2 and later. +# +# history: +# 2001-10-20 fl created (from various sources) +# 2001-11-01 fl return root from parse method +# 2002-02-16 fl sort attributes in lexical order +# 2002-04-06 fl TreeBuilder refactoring, added PythonDoc markup +# 2002-05-01 fl finished TreeBuilder refactoring +# 2002-07-14 fl added basic namespace support to ElementTree.write +# 2002-07-25 fl added QName attribute support +# 2002-10-20 fl fixed encoding in write +# 2002-11-24 fl changed default encoding to ascii; fixed attribute encoding +# 2002-11-27 fl accept file objects or file names for parse/write +# 2002-12-04 fl moved XMLTreeBuilder back to this module +# 2003-01-11 fl fixed entity encoding glitch for us-ascii +# 2003-02-13 fl added XML literal factory +# 2003-02-21 fl added ProcessingInstruction/PI factory +# 2003-05-11 fl added tostring/fromstring helpers +# 2003-05-26 fl added ElementPath support +# 2003-07-05 fl added makeelement factory method +# 2003-07-28 fl added more well-known namespace prefixes +# 2003-08-15 fl fixed typo in ElementTree.findtext (Thomas Dartsch) +# 2003-09-04 fl fall back on emulator if ElementPath is not installed +# 2003-10-31 fl markup updates +# 2003-11-15 fl fixed nested namespace bug +# 2004-03-28 fl added XMLID helper +# 2004-06-02 fl added default support to findtext +# 2004-06-08 fl fixed encoding of non-ascii element/attribute names +# 2004-08-23 fl take advantage of post-2.1 expat features +# 2005-02-01 fl added iterparse implementation +# 2005-03-02 fl fixed iterparse support for pre-2.2 versions +# +# Copyright (c) 1999-2005 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2005 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +__all__ = [ + # public symbols + "Comment", + "dump", + "Element", "ElementTree", + "fromstring", + "iselement", "iterparse", + "parse", + "PI", "ProcessingInstruction", + "QName", + "SubElement", + "tostring", + "TreeBuilder", + "VERSION", "XML", + "XMLTreeBuilder", + ] + +## +# The Element type is a flexible container object, designed to +# store hierarchical data structures in memory. The type can be +# described as a cross between a list and a dictionary. +#

+# Each element has a number of properties associated with it: +#

    +#
  • a tag. This is a string identifying what kind of data +# this element represents (the element type, in other words).
  • +#
  • a number of attributes, stored in a Python dictionary.
  • +#
  • a text string.
  • +#
  • an optional tail string.
  • +#
  • a number of child elements, stored in a Python sequence
  • +#
+# +# To create an element instance, use the {@link #Element} or {@link +# #SubElement} factory functions. +#

+# The {@link #ElementTree} class can be used to wrap an element +# structure, and convert it from and to XML. +## + +import string, sys, re + +class _SimpleElementPath: + # emulate pre-1.2 find/findtext/findall behaviour + def find(self, element, tag): + for elem in element: + if elem.tag == tag: + return elem + return None + def findtext(self, element, tag, default=None): + for elem in element: + if elem.tag == tag: + return elem.text or "" + return default + def findall(self, element, tag): + if tag[:3] == ".//": + return element.getiterator(tag[3:]) + result = [] + for elem in element: + if elem.tag == tag: + result.append(elem) + return result + +try: + import ElementPath +except ImportError: + # FIXME: issue warning in this case? + ElementPath = _SimpleElementPath() + +# TODO: add support for custom namespace resolvers/default namespaces +# TODO: add improved support for incremental parsing + +VERSION = "1.2.6" + +## +# Internal element class. This class defines the Element interface, +# and provides a reference implementation of this interface. +#

+# You should not create instances of this class directly. Use the +# appropriate factory functions instead, such as {@link #Element} +# and {@link #SubElement}. +# +# @see Element +# @see SubElement +# @see Comment +# @see ProcessingInstruction + +class _ElementInterface: + # text...tail + + ## + # (Attribute) Element tag. + + tag = None + + ## + # (Attribute) Element attribute dictionary. Where possible, use + # {@link #_ElementInterface.get}, + # {@link #_ElementInterface.set}, + # {@link #_ElementInterface.keys}, and + # {@link #_ElementInterface.items} to access + # element attributes. + + attrib = None + + ## + # (Attribute) Text before first subelement. This is either a + # string or the value None, if there was no text. + + text = None + + ## + # (Attribute) Text after this element's end tag, but before the + # next sibling element's start tag. This is either a string or + # the value None, if there was no text. + + tail = None # text after end tag, if any + + def __init__(self, tag, attrib): + self.tag = tag + self.attrib = attrib + self._children = [] + + def __repr__(self): + return "" % (self.tag, id(self)) + + ## + # Creates a new element object of the same type as this element. + # + # @param tag Element tag. + # @param attrib Element attributes, given as a dictionary. + # @return A new element instance. + + def makeelement(self, tag, attrib): + return Element(tag, attrib) + + ## + # Returns the number of subelements. + # + # @return The number of subelements. + + def __len__(self): + return len(self._children) + + ## + # Returns the given subelement. + # + # @param index What subelement to return. + # @return The given subelement. + # @exception IndexError If the given element does not exist. + + def __getitem__(self, index): + return self._children[index] + + ## + # Replaces the given subelement. + # + # @param index What subelement to replace. + # @param element The new element value. + # @exception IndexError If the given element does not exist. + # @exception AssertionError If element is not a valid object. + + def __setitem__(self, index, element): + assert iselement(element) + self._children[index] = element + + ## + # Deletes the given subelement. + # + # @param index What subelement to delete. + # @exception IndexError If the given element does not exist. + + def __delitem__(self, index): + del self._children[index] + + ## + # Returns a list containing subelements in the given range. + # + # @param start The first subelement to return. + # @param stop The first subelement that shouldn't be returned. + # @return A sequence object containing subelements. + + def __getslice__(self, start, stop): + return self._children[start:stop] + + ## + # Replaces a number of subelements with elements from a sequence. + # + # @param start The first subelement to replace. + # @param stop The first subelement that shouldn't be replaced. + # @param elements A sequence object with zero or more elements. + # @exception AssertionError If a sequence member is not a valid object. + + def __setslice__(self, start, stop, elements): + for element in elements: + assert iselement(element) + self._children[start:stop] = list(elements) + + ## + # Deletes a number of subelements. + # + # @param start The first subelement to delete. + # @param stop The first subelement to leave in there. + + def __delslice__(self, start, stop): + del self._children[start:stop] + + ## + # Adds a subelement to the end of this element. + # + # @param element The element to add. + # @exception AssertionError If a sequence member is not a valid object. + + def append(self, element): + assert iselement(element) + self._children.append(element) + + ## + # Inserts a subelement at the given position in this element. + # + # @param index Where to insert the new subelement. + # @exception AssertionError If the element is not a valid object. + + def insert(self, index, element): + assert iselement(element) + self._children.insert(index, element) + + ## + # Removes a matching subelement. Unlike the find methods, + # this method compares elements based on identity, not on tag + # value or contents. + # + # @param element What element to remove. + # @exception ValueError If a matching element could not be found. + # @exception AssertionError If the element is not a valid object. + + def remove(self, element): + assert iselement(element) + self._children.remove(element) + + ## + # Returns all subelements. The elements are returned in document + # order. + # + # @return A list of subelements. + # @defreturn list of Element instances + + def getchildren(self): + return self._children + + ## + # Finds the first matching subelement, by tag name or path. + # + # @param path What element to look for. + # @return The first matching element, or None if no element was found. + # @defreturn Element or None + + def find(self, path): + return ElementPath.find(self, path) + + ## + # Finds text for the first matching subelement, by tag name or path. + # + # @param path What element to look for. + # @param default What to return if the element was not found. + # @return The text content of the first matching element, or the + # default value no element was found. Note that if the element + # has is found, but has no text content, this method returns an + # empty string. + # @defreturn string + + def findtext(self, path, default=None): + return ElementPath.findtext(self, path, default) + + ## + # Finds all matching subelements, by tag name or path. + # + # @param path What element to look for. + # @return A list or iterator containing all matching elements, + # in document order. + # @defreturn list of Element instances + + def findall(self, path): + return ElementPath.findall(self, path) + + ## + # Resets an element. This function removes all subelements, clears + # all attributes, and sets the text and tail attributes to None. + + def clear(self): + self.attrib.clear() + self._children = [] + self.text = self.tail = None + + ## + # Gets an element attribute. + # + # @param key What attribute to look for. + # @param default What to return if the attribute was not found. + # @return The attribute value, or the default value, if the + # attribute was not found. + # @defreturn string or None + + def get(self, key, default=None): + return self.attrib.get(key, default) + + ## + # Sets an element attribute. + # + # @param key What attribute to set. + # @param value The attribute value. + + def set(self, key, value): + self.attrib[key] = value + + ## + # Gets a list of attribute names. The names are returned in an + # arbitrary order (just like for an ordinary Python dictionary). + # + # @return A list of element attribute names. + # @defreturn list of strings + + def keys(self): + return self.attrib.keys() + + ## + # Gets element attributes, as a sequence. The attributes are + # returned in an arbitrary order. + # + # @return A list of (name, value) tuples for all attributes. + # @defreturn list of (string, string) tuples + + def items(self): + return self.attrib.items() + + ## + # Creates a tree iterator. The iterator loops over this element + # and all subelements, in document order, and returns all elements + # with a matching tag. + #

+ # If the tree structure is modified during iteration, the result + # is undefined. + # + # @param tag What tags to look for (default is to return all elements). + # @return A list or iterator containing all the matching elements. + # @defreturn list or iterator + + def getiterator(self, tag=None): + nodes = [] + if tag == "*": + tag = None + if tag is None or self.tag == tag: + nodes.append(self) + for node in self._children: + nodes.extend(node.getiterator(tag)) + return nodes + +# compatibility +_Element = _ElementInterface + +## +# Element factory. This function returns an object implementing the +# standard Element interface. The exact class or type of that object +# is implementation dependent, but it will always be compatible with +# the {@link #_ElementInterface} class in this module. +#

+# The element name, attribute names, and attribute values can be +# either 8-bit ASCII strings or Unicode strings. +# +# @param tag The element name. +# @param attrib An optional dictionary, containing element attributes. +# @param **extra Additional attributes, given as keyword arguments. +# @return An element instance. +# @defreturn Element + +def Element(tag, attrib={}, **extra): + attrib = attrib.copy() + attrib.update(extra) + return _ElementInterface(tag, attrib) + +## +# Subelement factory. This function creates an element instance, and +# appends it to an existing element. +#

+# The element name, attribute names, and attribute values can be +# either 8-bit ASCII strings or Unicode strings. +# +# @param parent The parent element. +# @param tag The subelement name. +# @param attrib An optional dictionary, containing element attributes. +# @param **extra Additional attributes, given as keyword arguments. +# @return An element instance. +# @defreturn Element + +def SubElement(parent, tag, attrib={}, **extra): + attrib = attrib.copy() + attrib.update(extra) + element = parent.makeelement(tag, attrib) + parent.append(element) + return element + +## +# Comment element factory. This factory function creates a special +# element that will be serialized as an XML comment. +#

+# The comment string can be either an 8-bit ASCII string or a Unicode +# string. +# +# @param text A string containing the comment string. +# @return An element instance, representing a comment. +# @defreturn Element + +def Comment(text=None): + element = Element(Comment) + element.text = text + return element + +## +# PI element factory. This factory function creates a special element +# that will be serialized as an XML processing instruction. +# +# @param target A string containing the PI target. +# @param text A string containing the PI contents, if any. +# @return An element instance, representing a PI. +# @defreturn Element + +def ProcessingInstruction(target, text=None): + element = Element(ProcessingInstruction) + element.text = target + if text: + element.text = element.text + " " + text + return element + +PI = ProcessingInstruction + +## +# QName wrapper. This can be used to wrap a QName attribute value, in +# order to get proper namespace handling on output. +# +# @param text A string containing the QName value, in the form {uri}local, +# or, if the tag argument is given, the URI part of a QName. +# @param tag Optional tag. If given, the first argument is interpreted as +# an URI, and this argument is interpreted as a local name. +# @return An opaque object, representing the QName. + +class QName: + def __init__(self, text_or_uri, tag=None): + if tag: + text_or_uri = "{%s}%s" % (text_or_uri, tag) + self.text = text_or_uri + def __str__(self): + return self.text + def __hash__(self): + return hash(self.text) + def __cmp__(self, other): + if isinstance(other, QName): + return cmp(self.text, other.text) + return cmp(self.text, other) + +## +# ElementTree wrapper class. This class represents an entire element +# hierarchy, and adds some extra support for serialization to and from +# standard XML. +# +# @param element Optional root element. +# @keyparam file Optional file handle or name. If given, the +# tree is initialized with the contents of this XML file. + +class ElementTree: + + def __init__(self, element=None, file=None): + assert element is None or iselement(element) + self._root = element # first node + if file: + self.parse(file) + + ## + # Gets the root element for this tree. + # + # @return An element instance. + # @defreturn Element + + def getroot(self): + return self._root + + ## + # Replaces the root element for this tree. This discards the + # current contents of the tree, and replaces it with the given + # element. Use with care. + # + # @param element An element instance. + + def _setroot(self, element): + assert iselement(element) + self._root = element + + ## + # Loads an external XML document into this element tree. + # + # @param source A file name or file object. + # @param parser An optional parser instance. If not given, the + # standard {@link XMLTreeBuilder} parser is used. + # @return The document root element. + # @defreturn Element + + def parse(self, source, parser=None): + if not hasattr(source, "read"): + source = open(source, "rb") + if not parser: + parser = XMLTreeBuilder() + while 1: + data = source.read(32768) + if not data: + break + parser.feed(data) + self._root = parser.close() + return self._root + + ## + # Creates a tree iterator for the root element. The iterator loops + # over all elements in this tree, in document order. + # + # @param tag What tags to look for (default is to return all elements) + # @return An iterator. + # @defreturn iterator + + def getiterator(self, tag=None): + assert self._root is not None + return self._root.getiterator(tag) + + ## + # Finds the first toplevel element with given tag. + # Same as getroot().find(path). + # + # @param path What element to look for. + # @return The first matching element, or None if no element was found. + # @defreturn Element or None + + def find(self, path): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.find(path) + + ## + # Finds the element text for the first toplevel element with given + # tag. Same as getroot().findtext(path). + # + # @param path What toplevel element to look for. + # @param default What to return if the element was not found. + # @return The text content of the first matching element, or the + # default value no element was found. Note that if the element + # has is found, but has no text content, this method returns an + # empty string. + # @defreturn string + + def findtext(self, path, default=None): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.findtext(path, default) + + ## + # Finds all toplevel elements with the given tag. + # Same as getroot().findall(path). + # + # @param path What element to look for. + # @return A list or iterator containing all matching elements, + # in document order. + # @defreturn list of Element instances + + def findall(self, path): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.findall(path) + + ## + # Writes the element tree to a file, as XML. + # + # @param file A file name, or a file object opened for writing. + # @param encoding Optional output encoding (default is US-ASCII). + + def write(self, file, encoding="us-ascii"): + assert self._root is not None + if not hasattr(file, "write"): + file = open(file, "wb") + if not encoding: + encoding = "us-ascii" + elif encoding != "utf-8" and encoding != "us-ascii": + file.write("\n" % encoding) + self._write(file, self._root, encoding, {}) + + def _write(self, file, node, encoding, namespaces): + # write XML to file + tag = node.tag + if tag is Comment: + file.write("" % _escape_cdata(node.text, encoding)) + elif tag is ProcessingInstruction: + file.write("" % _escape_cdata(node.text, encoding)) + else: + items = node.items() + xmlns_items = [] # new namespaces in this scope + try: + if isinstance(tag, QName) or tag[:1] == "{": + tag, xmlns = fixtag(tag, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(tag) + file.write("<" + _encode(tag, encoding)) + if items or xmlns_items: + items.sort() # lexical order + for k, v in items: + try: + if isinstance(k, QName) or k[:1] == "{": + k, xmlns = fixtag(k, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(k) + try: + if isinstance(v, QName): + v, xmlns = fixtag(v, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(v) + file.write(" %s=\"%s\"" % (_encode(k, encoding), + _escape_attrib(v, encoding))) + for k, v in xmlns_items: + file.write(" %s=\"%s\"" % (_encode(k, encoding), + _escape_attrib(v, encoding))) + if node.text or len(node): + file.write(">") + if node.text: + file.write(_escape_cdata(node.text, encoding)) + for n in node: + self._write(file, n, encoding, namespaces) + file.write("") + else: + file.write(" />") + for k, v in xmlns_items: + del namespaces[v] + if node.tail: + file.write(_escape_cdata(node.tail, encoding)) + +# -------------------------------------------------------------------- +# helpers + +## +# Checks if an object appears to be a valid element object. +# +# @param An element instance. +# @return A true value if this is an element object. +# @defreturn flag + +def iselement(element): + # FIXME: not sure about this; might be a better idea to look + # for tag/attrib/text attributes + return isinstance(element, _ElementInterface) or hasattr(element, "tag") + +## +# Writes an element tree or element structure to sys.stdout. This +# function should be used for debugging only. +#

+# The exact output format is implementation dependent. In this +# version, it's written as an ordinary XML file. +# +# @param elem An element tree or an individual element. + +def dump(elem): + # debugging + if not isinstance(elem, ElementTree): + elem = ElementTree(elem) + elem.write(sys.stdout) + tail = elem.getroot().tail + if not tail or tail[-1] != "\n": + sys.stdout.write("\n") + +def _encode(s, encoding): + try: + return s.encode(encoding) + except AttributeError: + return s # 1.5.2: assume the string uses the right encoding + +if sys.version[:3] == "1.5": + _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2 +else: + _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) + +_escape_map = { + "&": "&", + "<": "<", + ">": ">", + '"': """, +} + +_namespace_map = { + # "well-known" namespace prefixes + "http://www.w3.org/XML/1998/namespace": "xml", + "http://www.w3.org/1999/xhtml": "html", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", + "http://schemas.xmlsoap.org/wsdl/": "wsdl", +} + +def _raise_serialization_error(text): + raise TypeError( + "cannot serialize %r (type %s)" % (text, type(text).__name__) + ) + +def _encode_entity(text, pattern=_escape): + # map reserved and non-ascii characters to numerical entities + def escape_entities(m, map=_escape_map): + out = [] + append = out.append + for char in m.group(): + text = map.get(char) + if text is None: + text = "&#%d;" % ord(char) + append(text) + return string.join(out, "") + try: + return _encode(pattern.sub(escape_entities, text), "ascii") + except TypeError: + _raise_serialization_error(text) + +# +# the following functions assume an ascii-compatible encoding +# (or "utf-16") + +def _escape_cdata(text, encoding=None, replace=string.replace): + # escape character data + try: + if encoding: + try: + text = _encode(text, encoding) + except UnicodeError: + return _encode_entity(text) + text = replace(text, "&", "&") + text = replace(text, "<", "<") + text = replace(text, ">", ">") + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + +def _escape_attrib(text, encoding=None, replace=string.replace): + # escape attribute value + try: + if encoding: + try: + text = _encode(text, encoding) + except UnicodeError: + return _encode_entity(text) + text = replace(text, "&", "&") + text = replace(text, "'", "'") # FIXME: overkill + text = replace(text, "\"", """) + text = replace(text, "<", "<") + text = replace(text, ">", ">") + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + +def fixtag(tag, namespaces): + # given a decorated tag (of the form {uri}tag), return prefixed + # tag and namespace declaration, if any + if isinstance(tag, QName): + tag = tag.text + namespace_uri, tag = string.split(tag[1:], "}", 1) + prefix = namespaces.get(namespace_uri) + if prefix is None: + prefix = _namespace_map.get(namespace_uri) + if prefix is None: + prefix = "ns%d" % len(namespaces) + namespaces[namespace_uri] = prefix + if prefix == "xml": + xmlns = None + else: + xmlns = ("xmlns:%s" % prefix, namespace_uri) + else: + xmlns = None + return "%s:%s" % (prefix, tag), xmlns + +## +# Parses an XML document into an element tree. +# +# @param source A filename or file object containing XML data. +# @param parser An optional parser instance. If not given, the +# standard {@link XMLTreeBuilder} parser is used. +# @return An ElementTree instance + +def parse(source, parser=None): + tree = ElementTree() + tree.parse(source, parser) + return tree + +## +# Parses an XML document into an element tree incrementally, and reports +# what's going on to the user. +# +# @param source A filename or file object containing XML data. +# @param events A list of events to report back. If omitted, only "end" +# events are reported. +# @return A (event, elem) iterator. + +class iterparse: + + def __init__(self, source, events=None): + if not hasattr(source, "read"): + source = open(source, "rb") + self._file = source + self._events = [] + self._index = 0 + self.root = self._root = None + self._parser = XMLTreeBuilder() + # wire up the parser for event reporting + parser = self._parser._parser + append = self._events.append + if events is None: + events = ["end"] + for event in events: + if event == "start": + try: + parser.ordered_attributes = 1 + parser.specified_attributes = 1 + def handler(tag, attrib_in, event=event, append=append, + start=self._parser._start_list): + append((event, start(tag, attrib_in))) + parser.StartElementHandler = handler + except AttributeError: + def handler(tag, attrib_in, event=event, append=append, + start=self._parser._start): + append((event, start(tag, attrib_in))) + parser.StartElementHandler = handler + elif event == "end": + def handler(tag, event=event, append=append, + end=self._parser._end): + append((event, end(tag))) + parser.EndElementHandler = handler + elif event == "start-ns": + def handler(prefix, uri, event=event, append=append): + try: + uri = _encode(uri, "ascii") + except UnicodeError: + pass + append((event, (prefix or "", uri))) + parser.StartNamespaceDeclHandler = handler + elif event == "end-ns": + def handler(prefix, event=event, append=append): + append((event, None)) + parser.EndNamespaceDeclHandler = handler + + def next(self): + while 1: + try: + item = self._events[self._index] + except IndexError: + if self._parser is None: + self.root = self._root + try: + raise StopIteration + except NameError: + raise IndexError + # load event buffer + del self._events[:] + self._index = 0 + data = self._file.read(16384) + if data: + self._parser.feed(data) + else: + self._root = self._parser.close() + self._parser = None + else: + self._index = self._index + 1 + return item + + try: + iter + def __iter__(self): + return self + except NameError: + def __getitem__(self, index): + return self.next() + +## +# Parses an XML document from a string constant. This function can +# be used to embed "XML literals" in Python code. +# +# @param source A string containing XML data. +# @return An Element instance. +# @defreturn Element + +def XML(text): + parser = XMLTreeBuilder() + parser.feed(text) + return parser.close() + +## +# Parses an XML document from a string constant, and also returns +# a dictionary which maps from element id:s to elements. +# +# @param source A string containing XML data. +# @return A tuple containing an Element instance and a dictionary. +# @defreturn (Element, dictionary) + +def XMLID(text): + parser = XMLTreeBuilder() + parser.feed(text) + tree = parser.close() + ids = {} + for elem in tree.getiterator(): + id = elem.get("id") + if id: + ids[id] = elem + return tree, ids + +## +# Parses an XML document from a string constant. Same as {@link #XML}. +# +# @def fromstring(text) +# @param source A string containing XML data. +# @return An Element instance. +# @defreturn Element + +fromstring = XML + +## +# Generates a string representation of an XML element, including all +# subelements. +# +# @param element An Element instance. +# @return An encoded string containing the XML data. +# @defreturn string + +def tostring(element, encoding=None): + class dummy: + pass + data = [] + file = dummy() + file.write = data.append + ElementTree(element).write(file, encoding) + return string.join(data, "") + +## +# Generic element structure builder. This builder converts a sequence +# of {@link #TreeBuilder.start}, {@link #TreeBuilder.data}, and {@link +# #TreeBuilder.end} method calls to a well-formed element structure. +#

+# You can use this class to build an element structure using a custom XML +# parser, or a parser for some other XML-like format. +# +# @param element_factory Optional element factory. This factory +# is called to create new Element instances, as necessary. + +class TreeBuilder: + + def __init__(self, element_factory=None): + self._data = [] # data collector + self._elem = [] # element stack + self._last = None # last element + self._tail = None # true if we're after an end tag + if element_factory is None: + element_factory = _ElementInterface + self._factory = element_factory + + ## + # Flushes the parser buffers, and returns the toplevel documen + # element. + # + # @return An Element instance. + # @defreturn Element + + def close(self): + assert len(self._elem) == 0, "missing end tags" + assert self._last != None, "missing toplevel element" + return self._last + + def _flush(self): + if self._data: + if self._last is not None: + text = string.join(self._data, "") + if self._tail: + assert self._last.tail is None, "internal error (tail)" + self._last.tail = text + else: + assert self._last.text is None, "internal error (text)" + self._last.text = text + self._data = [] + + ## + # Adds text to the current element. + # + # @param data A string. This should be either an 8-bit string + # containing ASCII text, or a Unicode string. + + def data(self, data): + self._data.append(data) + + ## + # Opens a new element. + # + # @param tag The element name. + # @param attrib A dictionary containing element attributes. + # @return The opened element. + # @defreturn Element + + def start(self, tag, attrs): + self._flush() + self._last = elem = self._factory(tag, attrs) + if self._elem: + self._elem[-1].append(elem) + self._elem.append(elem) + self._tail = 0 + return elem + + ## + # Closes the current element. + # + # @param tag The element name. + # @return The closed element. + # @defreturn Element + + def end(self, tag): + self._flush() + self._last = self._elem.pop() + assert self._last.tag == tag,\ + "end tag mismatch (expected %s, got %s)" % ( + self._last.tag, tag) + self._tail = 1 + return self._last + +## +# Element structure builder for XML source data, based on the +# expat parser. +# +# @keyparam target Target object. If omitted, the builder uses an +# instance of the standard {@link #TreeBuilder} class. +# @keyparam html Predefine HTML entities. This flag is not supported +# by the current implementation. +# @see #ElementTree +# @see #TreeBuilder + +class XMLTreeBuilder: + + def __init__(self, html=0, target=None): + try: + from xmlcore.parsers import expat + except ImportError: + raise ImportError( + "No module named expat; use SimpleXMLTreeBuilder instead" + ) + self._parser = parser = expat.ParserCreate(None, "}") + if target is None: + target = TreeBuilder() + self._target = target + self._names = {} # name memo cache + # callbacks + parser.DefaultHandlerExpand = self._default + parser.StartElementHandler = self._start + parser.EndElementHandler = self._end + parser.CharacterDataHandler = self._data + # let expat do the buffering, if supported + try: + self._parser.buffer_text = 1 + except AttributeError: + pass + # use new-style attribute handling, if supported + try: + self._parser.ordered_attributes = 1 + self._parser.specified_attributes = 1 + parser.StartElementHandler = self._start_list + except AttributeError: + pass + encoding = None + if not parser.returns_unicode: + encoding = "utf-8" + # target.xml(encoding, None) + self._doctype = None + self.entity = {} + + def _fixtext(self, text): + # convert text string to ascii, if possible + try: + return _encode(text, "ascii") + except UnicodeError: + return text + + def _fixname(self, key): + # expand qname, and convert name string to ascii, if possible + try: + name = self._names[key] + except KeyError: + name = key + if "}" in name: + name = "{" + name + self._names[key] = name = self._fixtext(name) + return name + + def _start(self, tag, attrib_in): + fixname = self._fixname + tag = fixname(tag) + attrib = {} + for key, value in attrib_in.items(): + attrib[fixname(key)] = self._fixtext(value) + return self._target.start(tag, attrib) + + def _start_list(self, tag, attrib_in): + fixname = self._fixname + tag = fixname(tag) + attrib = {} + if attrib_in: + for i in range(0, len(attrib_in), 2): + attrib[fixname(attrib_in[i])] = self._fixtext(attrib_in[i+1]) + return self._target.start(tag, attrib) + + def _data(self, text): + return self._target.data(self._fixtext(text)) + + def _end(self, tag): + return self._target.end(self._fixname(tag)) + + def _default(self, text): + prefix = text[:1] + if prefix == "&": + # deal with undefined entities + try: + self._target.data(self.entity[text[1:-1]]) + except KeyError: + from xmlcore.parsers import expat + raise expat.error( + "undefined entity %s: line %d, column %d" % + (text, self._parser.ErrorLineNumber, + self._parser.ErrorColumnNumber) + ) + elif prefix == "<" and text[:9] == "": + self._doctype = None + return + text = string.strip(text) + if not text: + return + self._doctype.append(text) + n = len(self._doctype) + if n > 2: + type = self._doctype[1] + if type == "PUBLIC" and n == 4: + name, type, pubid, system = self._doctype + elif type == "SYSTEM" and n == 3: + name, type, system = self._doctype + pubid = None + else: + return + if pubid: + pubid = pubid[1:-1] + self.doctype(name, pubid, system[1:-1]) + self._doctype = None + + ## + # Handles a doctype declaration. + # + # @param name Doctype name. + # @param pubid Public identifier. + # @param system System identifier. + + def doctype(self, name, pubid, system): + pass + + ## + # Feeds data to the parser. + # + # @param data Encoded data. + + def feed(self, data): + self._parser.Parse(data, 0) + + ## + # Finishes feeding data to the parser. + # + # @return An element structure. + # @defreturn Element + + def close(self): + self._parser.Parse("", 1) # end of data + tree = self._target.close() + del self._target, self._parser # get rid of circular references + return tree Modified: python/trunk/Lib/xmlcore/etree/__init__.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/__init__.py (original) +++ python/trunk/Lib/xmlcore/etree/__init__.py Wed Dec 14 19:10:45 2005 @@ -1,30 +1,30 @@ -# $Id: __init__.py 1821 2004-06-03 16:57:49Z fredrik $ -# elementtree package - -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- +# $Id: __init__.py 1821 2004-06-03 16:57:49Z fredrik $ +# elementtree package + +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- From python-checkins at python.org Wed Dec 14 19:26:28 2005 From: python-checkins at python.org (phillip.eby) Date: Wed, 14 Dec 2005 19:26:28 +0100 (CET) Subject: [Python-checkins] commit of r41675 - sandbox/trunk/setuptools/setuptools/command/install.py Message-ID: <20051214182628.CBBFB1E4002@bag.python.org> Author: phillip.eby Date: Wed Dec 14 19:26:28 2005 New Revision: 41675 Modified: sandbox/trunk/setuptools/setuptools/command/install.py Log: Oops. Modified: sandbox/trunk/setuptools/setuptools/command/install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install.py Wed Dec 14 19:26:28 2005 @@ -26,7 +26,7 @@ self.no_compile = None # make DISTUTILS_DEBUG work right! def finalize_options(self): - _install.initialize_options(self) + _install.finalize_options(self) if self.single_version_externally_managed: if not self.root and not self.record: raise DistutilsArgError( From python-checkins at python.org Wed Dec 14 19:33:45 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 19:33:45 +0100 (CET) Subject: [Python-checkins] commit of r41676 - in external: README elementtree-1.2.6-20050316/CHANGES elementtree-1.2.6-20050316/PKG-INFO elementtree-1.2.6-20050316/README elementtree-1.2.6-20050316/benchmark.py elementtree-1.2.6-20050316/docs/effbot.css elementtree-1.2.6-20050316/docs/index.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementInclude.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementPath.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementTree.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.HTMLTreeBuilder.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLWriter.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.TidyTools.html elementtree-1.2.6-20050316/docs/pythondoc-elementtree.XMLTreeBuilder.html elementtree-1.2.6-20050316/elementtree/ElementInclude.py elementtree-1.2.6-20050316/elementtree/ElementPath.py elementtree-1.2.6-20050316/elementtree/ElementTree.py elementtree-1.2.6-20050316/elementtree/HTMLTreeBuilder.py elementtree-1.2.6-20050316/elementtree/SgmlopXMLTreeBuilder.py elementtree-1.2.6-20050316/elementtree/SimpleXMLTreeBuilder.py elementtree-1.2.6-20050316/elementtree/SimpleXMLWriter.py elementtree-1.2.6-20050316/elementtree/TidyHTMLTreeBuilder.py elementtree-1.2.6-20050316/elementtree/TidyTools.py elementtree-1.2.6-20050316/elementtree/XMLTreeBuilder.py elementtree-1.2.6-20050316/elementtree/__init__.py elementtree-1.2.6-20050316/samples/simple-ns.xml elementtree-1.2.6-20050316/samples/simple.xml elementtree-1.2.6-20050316/selftest.py elementtree-1.2.6-20050316/setup.py Message-ID: <20051214183345.EC2861E4002@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 19:33:39 2005 New Revision: 41676 Modified: external/README (contents, props changed) external/elementtree-1.2.6-20050316/CHANGES (contents, props changed) external/elementtree-1.2.6-20050316/PKG-INFO (contents, props changed) external/elementtree-1.2.6-20050316/README (contents, props changed) external/elementtree-1.2.6-20050316/benchmark.py (contents, props changed) external/elementtree-1.2.6-20050316/docs/effbot.css (contents, props changed) external/elementtree-1.2.6-20050316/docs/index.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementInclude.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementPath.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementTree.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.HTMLTreeBuilder.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLWriter.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.TidyTools.html (contents, props changed) external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.XMLTreeBuilder.html (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/ElementInclude.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/ElementPath.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/ElementTree.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/HTMLTreeBuilder.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/SgmlopXMLTreeBuilder.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/SimpleXMLTreeBuilder.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/SimpleXMLWriter.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/TidyHTMLTreeBuilder.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/TidyTools.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/XMLTreeBuilder.py (contents, props changed) external/elementtree-1.2.6-20050316/elementtree/__init__.py (contents, props changed) external/elementtree-1.2.6-20050316/samples/simple-ns.xml (contents, props changed) external/elementtree-1.2.6-20050316/samples/simple.xml (contents, props changed) external/elementtree-1.2.6-20050316/selftest.py (contents, props changed) external/elementtree-1.2.6-20050316/setup.py (contents, props changed) Log: fixed botched eol-style setting (thanks to armin for fixing the xml.etree copy) Modified: external/README ============================================================================== --- external/README (original) +++ external/README Wed Dec 14 19:33:39 2005 @@ -1,8 +1,8 @@ -This directory contains snapshots of externally maintained libraries. -To add a new library or release, import it into this repository, and -use "svn copy" to copy relevant components to the trunk. - -This directory should not be used for development. The snapshots -should be treated as readonly copies, with the possible exception for -critical errors and security patches. When in doubt, consult with the -python-dev team. +This directory contains snapshots of externally maintained libraries. +To add a new library or release, import it into this repository, and +use "svn copy" to copy relevant components to the trunk. + +This directory should not be used for development. The snapshots +should be treated as readonly copies, with the possible exception for +critical errors and security patches. When in doubt, consult with the +python-dev team. Modified: external/elementtree-1.2.6-20050316/CHANGES ============================================================================== --- external/elementtree-1.2.6-20050316/CHANGES (original) +++ external/elementtree-1.2.6-20050316/CHANGES Wed Dec 14 19:33:39 2005 @@ -1,210 +1,210 @@ -The ElementTree Library -$Id: CHANGES 2326 2005-03-17 07:45:21Z fredrik $ - -*** Changes from release 1.1 to 1.2 *** - -(1.2.6 released) - -- Fixed handling of entities defined in internal DTD's (reported - by Greg Wilson). - -- Fixed serialization under non-standard default encodings (but - using non-standard default encodings is still a lousy idea ;-) - -(1.2.5 released) - -- Added 'iterparse' implementation. This is similar to 'parse', but - returns a stream of events while it builds the tree. By default, - the parser only returns "end" events (for completed elements): - - for event, elem in iterparse(source): - ... - - To get other events, use the "events" option to pass in a tuple - containing the events you want: - - for event, elem in iterparse(source, events=(...)): - ... - - The event tuple can contain one or more of: - - "start" - generated for start tags, after the element has been created - (but before the current element has been fully populated) - "end" - generated for end tags, after all element children has been - created. - "start-ns" - generated when a new namespace scope is opened. for this event, - the elem value is a (prefix, url) tuple. - "end-ns" - generated when the current namespace scope is closed. elem - is None. - - Events arrive asynchronously; the tree is usually more complete - than the events indicate, but this is nothing you can rely on. - - The iterable itself contains context information. In the current - release, the only public context attribute is "root", which is set - to the root element when parsing is finished. To access the con- - text, assign the iterable to a variable before looping over it: - - context = iterparse(source) - for event, elem in context: - ... - root = context.root - -(1.2.4 released) - -- Fixed another FancyTreeBuilder bug on Python 2.3. - -(1.2.3 released) - -- Fixed the FancyTreeBuilder class, which was broken in 1.2.1 - and 1.2.2 (broken for some Python versions, at least). - -(1.2.2 released) - -- Fixed some ASCII/Unicode issues in the HTML parser. You can now - use the parser on documents that mixes encoded 8-bit data with - character references outside the ASCII range. (backported from 1.3) - -(1.2.1 released) - -- Changed XMLTreeBuilder to take advantage of new expat features, if - present. This speeds up parsing quite a bit. (backported from 1.3) - -(1.2c1 released; 1.2 final released) - -- Added 'docs' directory, with PythonDoc documentation for the - ElementTree library. See docs/index.html for an overview. - -(1.2b4 released) - -- Fixed encoding of Unicode element names and attribute names - (reported by Ken Rimey). - -(1.2b3 released) - -- Added default argument to 'findtext'. Note that 'findtext' now - always returns an empty string if a matching element is found, but - has no text content. None is only returned if no element is found, - and no default value is specified. - -- Make sure 'dump' adds a trailing linefeed. - -(1.2b2 released) - -- Added optional tree builder argument to the HTMLTreeBuilder class. - -(1.2b1 released) - -- Added XMLID() helper. This is similar to XML(), but returns both - the root element and a dictionary mapping ID attributes to elements. - -- Added simple SgmlopXMLTreeBuilder module. This is a very fast - parser, but it doesn't yet support namespaces. To use this parser, - you need the sgmlop driver: - - http://effbot.org/zone/sgmlop-index.htm - -- Fixed exception in test suite; the TidyHTMLTreeBuilder class - now raises a RuntimeError exception if the _elementidy module - is not available. - -(1.2a5 released) - -- Fixed problem that could result in repeated use of the same - namespace prefix in the same element (!). - -- Fixed import error in ElementInclude, when using the default - loader (Gustavo Niemeyer). - -(1.2a4 released) - -- Fixed exception when .//tag fails to find matching elements - (reported by Mike Kent) (@XMLTOOLKIT28) - -- Fall back on pre-1.2 find/findtext/findall behaviour if the - ElementPath module is not installed. If you don't need path - support, you can simply copy the ElementTree module to your - own project. - -(1.2a3 released) - -- Added experimental support for XInclude-style preprocessing. The - ElementInclude module expands xi:include elements, using a custom - resolver. The current release ignores xi:fallback elements. - -- Fixed typo in ElementTree.findtext (reported by Thomas Dartsch) - (@XMLTOOLKIT25) - -- Fixed parsing of periods in element names (reported by Brian - Vicente) (@XMLTOOLKIT27) - -(1.2a2 released) - -- Fixed serialization of elements and attributes in the XML default - namespace (http://www.w3.org/XML/1998/namespace). Added "rdf" to - the set of "well-known" namespace prefixes. - -- Added 'makeelement' factory method. Added 'target' argument to - XMLTreeBuilder class. - -(1.2a1 released) - -- Added support for a very limited subset of the abbreviated XPath - syntax. The following location paths are supported: - - tag -- select all subelements with the given tag - . -- select this element - * -- select all subelements - // (empty path) -- select all subelements, on all levels - - Examples: - - p -- select all p subelements - .//a -- select all a sublements, at all sublevels - */img -- select all img grandchildren - ul/li -- select all li elements that are children of ul elements - .//ul/li -- same, but select elements anywhere in the subtree - - Absolute paths (paths starting with a slash) can only be used on - ElementTree instances. To use // on an Element instance, add a - leading period (.). - -*** Changes from release 1.0 to 1.1 *** - -(1.1 final released) - -- Added 'fromstring' and 'tostring' helpers. The 'XML' function is - an alias for 'fromstring', and provides a convenient way to add XML - literals to source code: - - from elementtree.ElementTree import XML - - element = XML('content') - -- Moved XMLTreeBuilder functionality into the ElementTree module. If - all you need is basic XML support, you can simply copy the ElementTree - module to your own project. - -- Added SimpleXMLWriter module. - -(1.1b2 released) - -- Changed default encoding to US-ASCII. Use tree.write(file, "utf-8") - to get the old behaviour. If the tree contains text that cannot be - encoded using the given encoding, the writer uses numerical entities - for all non-ASCII characters in that text segment. - -(1.1b1 released) - -- Map tags and attribute names having the same value to the same - object. This saves space when reading large XML trees, and also - gives a small speedup (less than 10%). - -- Added benchmark script. This script takes a filename argument, and - loads the given file into memory using the XML and SimpleXML tree - builders. For each parser, it reports the document size and the - time needed to parse the document. +The ElementTree Library +$Id: CHANGES 2326 2005-03-17 07:45:21Z fredrik $ + +*** Changes from release 1.1 to 1.2 *** + +(1.2.6 released) + +- Fixed handling of entities defined in internal DTD's (reported + by Greg Wilson). + +- Fixed serialization under non-standard default encodings (but + using non-standard default encodings is still a lousy idea ;-) + +(1.2.5 released) + +- Added 'iterparse' implementation. This is similar to 'parse', but + returns a stream of events while it builds the tree. By default, + the parser only returns "end" events (for completed elements): + + for event, elem in iterparse(source): + ... + + To get other events, use the "events" option to pass in a tuple + containing the events you want: + + for event, elem in iterparse(source, events=(...)): + ... + + The event tuple can contain one or more of: + + "start" + generated for start tags, after the element has been created + (but before the current element has been fully populated) + "end" + generated for end tags, after all element children has been + created. + "start-ns" + generated when a new namespace scope is opened. for this event, + the elem value is a (prefix, url) tuple. + "end-ns" + generated when the current namespace scope is closed. elem + is None. + + Events arrive asynchronously; the tree is usually more complete + than the events indicate, but this is nothing you can rely on. + + The iterable itself contains context information. In the current + release, the only public context attribute is "root", which is set + to the root element when parsing is finished. To access the con- + text, assign the iterable to a variable before looping over it: + + context = iterparse(source) + for event, elem in context: + ... + root = context.root + +(1.2.4 released) + +- Fixed another FancyTreeBuilder bug on Python 2.3. + +(1.2.3 released) + +- Fixed the FancyTreeBuilder class, which was broken in 1.2.1 + and 1.2.2 (broken for some Python versions, at least). + +(1.2.2 released) + +- Fixed some ASCII/Unicode issues in the HTML parser. You can now + use the parser on documents that mixes encoded 8-bit data with + character references outside the ASCII range. (backported from 1.3) + +(1.2.1 released) + +- Changed XMLTreeBuilder to take advantage of new expat features, if + present. This speeds up parsing quite a bit. (backported from 1.3) + +(1.2c1 released; 1.2 final released) + +- Added 'docs' directory, with PythonDoc documentation for the + ElementTree library. See docs/index.html for an overview. + +(1.2b4 released) + +- Fixed encoding of Unicode element names and attribute names + (reported by Ken Rimey). + +(1.2b3 released) + +- Added default argument to 'findtext'. Note that 'findtext' now + always returns an empty string if a matching element is found, but + has no text content. None is only returned if no element is found, + and no default value is specified. + +- Make sure 'dump' adds a trailing linefeed. + +(1.2b2 released) + +- Added optional tree builder argument to the HTMLTreeBuilder class. + +(1.2b1 released) + +- Added XMLID() helper. This is similar to XML(), but returns both + the root element and a dictionary mapping ID attributes to elements. + +- Added simple SgmlopXMLTreeBuilder module. This is a very fast + parser, but it doesn't yet support namespaces. To use this parser, + you need the sgmlop driver: + + http://effbot.org/zone/sgmlop-index.htm + +- Fixed exception in test suite; the TidyHTMLTreeBuilder class + now raises a RuntimeError exception if the _elementidy module + is not available. + +(1.2a5 released) + +- Fixed problem that could result in repeated use of the same + namespace prefix in the same element (!). + +- Fixed import error in ElementInclude, when using the default + loader (Gustavo Niemeyer). + +(1.2a4 released) + +- Fixed exception when .//tag fails to find matching elements + (reported by Mike Kent) (@XMLTOOLKIT28) + +- Fall back on pre-1.2 find/findtext/findall behaviour if the + ElementPath module is not installed. If you don't need path + support, you can simply copy the ElementTree module to your + own project. + +(1.2a3 released) + +- Added experimental support for XInclude-style preprocessing. The + ElementInclude module expands xi:include elements, using a custom + resolver. The current release ignores xi:fallback elements. + +- Fixed typo in ElementTree.findtext (reported by Thomas Dartsch) + (@XMLTOOLKIT25) + +- Fixed parsing of periods in element names (reported by Brian + Vicente) (@XMLTOOLKIT27) + +(1.2a2 released) + +- Fixed serialization of elements and attributes in the XML default + namespace (http://www.w3.org/XML/1998/namespace). Added "rdf" to + the set of "well-known" namespace prefixes. + +- Added 'makeelement' factory method. Added 'target' argument to + XMLTreeBuilder class. + +(1.2a1 released) + +- Added support for a very limited subset of the abbreviated XPath + syntax. The following location paths are supported: + + tag -- select all subelements with the given tag + . -- select this element + * -- select all subelements + // (empty path) -- select all subelements, on all levels + + Examples: + + p -- select all p subelements + .//a -- select all a sublements, at all sublevels + */img -- select all img grandchildren + ul/li -- select all li elements that are children of ul elements + .//ul/li -- same, but select elements anywhere in the subtree + + Absolute paths (paths starting with a slash) can only be used on + ElementTree instances. To use // on an Element instance, add a + leading period (.). + +*** Changes from release 1.0 to 1.1 *** + +(1.1 final released) + +- Added 'fromstring' and 'tostring' helpers. The 'XML' function is + an alias for 'fromstring', and provides a convenient way to add XML + literals to source code: + + from elementtree.ElementTree import XML + + element = XML('content') + +- Moved XMLTreeBuilder functionality into the ElementTree module. If + all you need is basic XML support, you can simply copy the ElementTree + module to your own project. + +- Added SimpleXMLWriter module. + +(1.1b2 released) + +- Changed default encoding to US-ASCII. Use tree.write(file, "utf-8") + to get the old behaviour. If the tree contains text that cannot be + encoded using the given encoding, the writer uses numerical entities + for all non-ASCII characters in that text segment. + +(1.1b1 released) + +- Map tags and attribute names having the same value to the same + object. This saves space when reading large XML trees, and also + gives a small speedup (less than 10%). + +- Added benchmark script. This script takes a filename argument, and + loads the given file into memory using the XML and SimpleXML tree + builders. For each parser, it reports the document size and the + time needed to parse the document. Modified: external/elementtree-1.2.6-20050316/PKG-INFO ============================================================================== --- external/elementtree-1.2.6-20050316/PKG-INFO (original) +++ external/elementtree-1.2.6-20050316/PKG-INFO Wed Dec 14 19:33:39 2005 @@ -1,17 +1,17 @@ -Metadata-Version: 1.0 -Name: elementtree -Version: 1.2.6-20050316 -Summary: ElementTree - a light-weight XML object model for Python. -Home-page: http://effbot.org/zone/element-index.htm -Author: Fredrik Lundh -Author-email: fredrik at pythonware.com -License: Python (MIT style) -Download-URL: http://effbot.org/downloads#elementtree -Description: The Element type is a flexible container object, designed to store - hierarchical data structures in memory. Element structures can be - converted to and from XML. -Platform: Python 1.5.2 and later. -Classifier: Development Status :: 6 - Mature -Classifier: Operating System :: OS Independent -Classifier: Topic :: Text Processing :: Markup :: HTML -Classifier: Topic :: Text Processing :: Markup :: XML +Metadata-Version: 1.0 +Name: elementtree +Version: 1.2.6-20050316 +Summary: ElementTree - a light-weight XML object model for Python. +Home-page: http://effbot.org/zone/element-index.htm +Author: Fredrik Lundh +Author-email: fredrik at pythonware.com +License: Python (MIT style) +Download-URL: http://effbot.org/downloads#elementtree +Description: The Element type is a flexible container object, designed to store + hierarchical data structures in memory. Element structures can be + converted to and from XML. +Platform: Python 1.5.2 and later. +Classifier: Development Status :: 6 - Mature +Classifier: Operating System :: OS Independent +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: XML Modified: external/elementtree-1.2.6-20050316/README ============================================================================== --- external/elementtree-1.2.6-20050316/README (original) +++ external/elementtree-1.2.6-20050316/README Wed Dec 14 19:33:39 2005 @@ -1,130 +1,130 @@ -$Id: README 2326 2005-03-17 07:45:21Z fredrik $ - -======================= -The elementtree library -======================= - -This kit contains the ElementTree library, a light-weight toolkit for -XML processing in Python. - -For more information on this library, see: - - docs/index.html - http://effbot.org/zone/element.htm - -The modules are designed to work with Python 2.1 and newer. The core -ElementTree module and the SimpleXMLTreeBuilder class also works under -1.5.2 and 2.0. - -Enjoy /F - -fredrik at pythonware.com -http://www.pythonware.com - --------------------------------------------------------------------- -The ElementTree Library is - -Copyright (c) 1999-2005 by Secret Labs AB -Copyright (c) 1999-2005 by Fredrik Lundh - -By obtaining, using, and/or copying this software and/or its -associated documentation, you agree that you have read, understood, -and will comply with the following terms and conditions: - -Permission to use, copy, modify, and distribute this software and its -associated documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies, and that both that copyright notice and this permission notice -appear in supporting documentation, and that the name of Secret Labs -AB or the author not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR 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. --------------------------------------------------------------------- - -release info ------------- - -This is release 1.2.6 of the ElementTree library. - -For a list of changes in this release, see the CHANGES document. - -The latest version of this library can be downloaded from: - - http://effbot.org/downloads - -Comments, bug reports, and patches are welcome. Send them to -fredrik at pythonware.com. - -Note that this is free software, with limited support. If you need -commercial support on this module, contact fredrik at pythonware.com. - --------------------------------------------------------------------- -contents --------------------------------------------------------------------- - -README This file - -CHANGES List of changes in this release. - -elementtree/ - - ElementTree.py Element tree implementation. For a minimal - install, this file is all you need. - - ElementPath.py Element path support module. Adds limited - XPath support to find/findtext/findall. - - ElementInclude.py Element include support module. Adds limited - XInclude support. - - HTMLTreeBuilder.py Element tree builder for HTML. This only - works for mostly well-formed HTML; if you - need something that can parse arbitrary - HTML at least as good as your browser, use - TidyHTMLTreeBuilder or TidyTools (see below). - - XMLTreeBuilder.py Element tree builder for XML (compatibility; - new code should use the tree builder in the - ElementTree module). - - TidyHTMLTreeBuilder.py Element tree builder for HTML, based on the - tidylib library. This tree builder requires - the _elementtidy extension module (available - from http://effbot.org/downloads). - - SimpleXMLTreeBuilder.py Old element tree builder for XML, based on - xmllib, for Python versions where "expat" is - not available. Due to bugs in xmllib, the - namespace support is not reliable (run the - module as a script to find out exactly how - unreliable it is on your Python version...) - - SgmlopXMLTreeBuilder.py Simple element tree builder based on the - SGMLOP parser. Note: The current version - does not support namespaces. - - SimpleXMLWriter.py Simple XML writer - - TidyTools.py Build element trees from HTML, using the - external 'tidy' utility. - -setup.py Build/installation script - -docs/index.html API reference pages. -docs/* - -demo*.py Sample scripts -samples/* Sample data - -selftest.py Selftest (requires Python 2.1 or later) -tidytest.py Selftest for TidyHTMLTreeBuilder components. - -benchmark.py Benchmark script (usage: benchmark.py file) +$Id: README 2326 2005-03-17 07:45:21Z fredrik $ + +======================= +The elementtree library +======================= + +This kit contains the ElementTree library, a light-weight toolkit for +XML processing in Python. + +For more information on this library, see: + + docs/index.html + http://effbot.org/zone/element.htm + +The modules are designed to work with Python 2.1 and newer. The core +ElementTree module and the SimpleXMLTreeBuilder class also works under +1.5.2 and 2.0. + +Enjoy /F + +fredrik at pythonware.com +http://www.pythonware.com + +-------------------------------------------------------------------- +The ElementTree Library is + +Copyright (c) 1999-2005 by Secret Labs AB +Copyright (c) 1999-2005 by Fredrik Lundh + +By obtaining, using, and/or copying this software and/or its +associated documentation, you agree that you have read, understood, +and will comply with the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its +associated documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appears in all +copies, and that both that copyright notice and this permission notice +appear in supporting documentation, and that the name of Secret Labs +AB or the author not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR 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. +-------------------------------------------------------------------- + +release info +------------ + +This is release 1.2.6 of the ElementTree library. + +For a list of changes in this release, see the CHANGES document. + +The latest version of this library can be downloaded from: + + http://effbot.org/downloads + +Comments, bug reports, and patches are welcome. Send them to +fredrik at pythonware.com. + +Note that this is free software, with limited support. If you need +commercial support on this module, contact fredrik at pythonware.com. + +-------------------------------------------------------------------- +contents +-------------------------------------------------------------------- + +README This file + +CHANGES List of changes in this release. + +elementtree/ + + ElementTree.py Element tree implementation. For a minimal + install, this file is all you need. + + ElementPath.py Element path support module. Adds limited + XPath support to find/findtext/findall. + + ElementInclude.py Element include support module. Adds limited + XInclude support. + + HTMLTreeBuilder.py Element tree builder for HTML. This only + works for mostly well-formed HTML; if you + need something that can parse arbitrary + HTML at least as good as your browser, use + TidyHTMLTreeBuilder or TidyTools (see below). + + XMLTreeBuilder.py Element tree builder for XML (compatibility; + new code should use the tree builder in the + ElementTree module). + + TidyHTMLTreeBuilder.py Element tree builder for HTML, based on the + tidylib library. This tree builder requires + the _elementtidy extension module (available + from http://effbot.org/downloads). + + SimpleXMLTreeBuilder.py Old element tree builder for XML, based on + xmllib, for Python versions where "expat" is + not available. Due to bugs in xmllib, the + namespace support is not reliable (run the + module as a script to find out exactly how + unreliable it is on your Python version...) + + SgmlopXMLTreeBuilder.py Simple element tree builder based on the + SGMLOP parser. Note: The current version + does not support namespaces. + + SimpleXMLWriter.py Simple XML writer + + TidyTools.py Build element trees from HTML, using the + external 'tidy' utility. + +setup.py Build/installation script + +docs/index.html API reference pages. +docs/* + +demo*.py Sample scripts +samples/* Sample data + +selftest.py Selftest (requires Python 2.1 or later) +tidytest.py Selftest for TidyHTMLTreeBuilder components. + +benchmark.py Benchmark script (usage: benchmark.py file) Modified: external/elementtree-1.2.6-20050316/benchmark.py ============================================================================== --- external/elementtree-1.2.6-20050316/benchmark.py (original) +++ external/elementtree-1.2.6-20050316/benchmark.py Wed Dec 14 19:33:39 2005 @@ -1,46 +1,46 @@ -# $Id: benchmark.py 1757 2004-03-28 17:21:25Z fredrik $ -# simple elementtree benchmark program - -from elementtree import XMLTreeBuilder, SimpleXMLTreeBuilder -from elementtree import SgmlopXMLTreeBuilder -from xml.dom import minidom - -import sys, time - -try: - file = sys.argv[1] -except IndexError: - file = "hamlet.xml" - -def benchmark(file, builder_module): - source = open(file, "rb") - t0 = time.time() - parser = builder_module.TreeBuilder() - while 1: - data = source.read(32768) - if not data: - break - parser.feed(data) - tree = parser.close() - t1 = time.time() - print "%s: %d nodes read in %.3f seconds" % ( - builder_module.__name__, len(tree.getiterator()), t1-t0 - ) - raw_input("press return to continue...") - del tree - -def benchmark_minidom(file): - t0 = time.time() - dom = minidom.parse(file) - t1 = time.time() - print "minidom tree read in %.3f seconds" % (t1-t0) - raw_input("press return to continue...") - del dom - -benchmark(file, XMLTreeBuilder) -benchmark(file, SimpleXMLTreeBuilder) # use xmllib -try: - benchmark(file, SgmlopXMLTreeBuilder) # use sgmlop -except RuntimeError, v: - print "=== SgmlopXMLTreeBuilder not available (%s)" % v -benchmark_minidom(file) +# $Id: benchmark.py 1757 2004-03-28 17:21:25Z fredrik $ +# simple elementtree benchmark program + +from elementtree import XMLTreeBuilder, SimpleXMLTreeBuilder +from elementtree import SgmlopXMLTreeBuilder +from xml.dom import minidom + +import sys, time + +try: + file = sys.argv[1] +except IndexError: + file = "hamlet.xml" + +def benchmark(file, builder_module): + source = open(file, "rb") + t0 = time.time() + parser = builder_module.TreeBuilder() + while 1: + data = source.read(32768) + if not data: + break + parser.feed(data) + tree = parser.close() + t1 = time.time() + print "%s: %d nodes read in %.3f seconds" % ( + builder_module.__name__, len(tree.getiterator()), t1-t0 + ) + raw_input("press return to continue...") + del tree + +def benchmark_minidom(file): + t0 = time.time() + dom = minidom.parse(file) + t1 = time.time() + print "minidom tree read in %.3f seconds" % (t1-t0) + raw_input("press return to continue...") + del dom + +benchmark(file, XMLTreeBuilder) +benchmark(file, SimpleXMLTreeBuilder) # use xmllib +try: + benchmark(file, SgmlopXMLTreeBuilder) # use sgmlop +except RuntimeError, v: + print "=== SgmlopXMLTreeBuilder not available (%s)" % v +benchmark_minidom(file) Modified: external/elementtree-1.2.6-20050316/docs/effbot.css ============================================================================== --- external/elementtree-1.2.6-20050316/docs/effbot.css (original) +++ external/elementtree-1.2.6-20050316/docs/effbot.css Wed Dec 14 19:33:39 2005 @@ -1,118 +1,118 @@ -/* effbot.css */ - -BODY { - font: 100% Georgia, Times, serif; - color: black; - margin: 0px 20px 0px 20px; -} - -#effbot-body { - background: white; - padding: 10px 40px 10px 40px; - max-width: 50em; -} - -#effbot-menu { - display: none; -} - -.adsense { - background: #f8fff8; - border: 1px solid #084; - padding: 10px 4px 4px 4px; -} - -.sidebar { - border: 1px solid #000; - float: right; clear: right; - width: 200px; - background: white; - padding: 10px; - margin: 0px -25px 10px 0px; -} - -/* visual style */ - -P { - line-height: 1.3em; -} - -CODE, PRE { - font: 100% "Courier New", Courier, Monaco, monospace; - color: #042; margin-left: 20px; -} - -H1, H2, H3 { - font-family: Georgia, Times, serif; - color: #084; margin-top: 30px; -} - -H1, H2, { border-top: 1px solid #084; } - -H4, H5, H6 { - font-family: Georgia, Times, serif; - color: #084; margin-top: 15px; -} - -A:link, A:hover { color: #084; } -A:visited { color: #404040; } - -UL LI { list-style-type: square; } - -.title { margin-bottom: 2px; color: #084; } -.info { font-size: 80%; color: #084; margin-top: 0px; } - -.bluebox { color: #084; margin-top: 10px; } - -.highlight { background: #cfc; } -.mark { color: #084; } -.small { font-size: 80%; } -.display { background: #eee; padding: 20px; } - -.note { - background: #efe; - border-top: 1px solid #084; - border-bottom: 1px solid #084; - padding: 2px 20px; -} - -.example { - border-top: medium solid #084; - border-bottom: medium solid #084; - padding: 5px; -} - -.figure { - border-top: medium solid #084; - border-bottom: medium solid #084; - padding: 5px; -} - -.fixme { - background: #eee; - border: 1px solid #084; - padding: 2x 20px; -} - -.simpletable { - border: 1px solid #084; - border-collapse: collapse; -} - -.simpletable TH { - text-align: left; - background: #cfc; - border: 1px solid #084; - margin: 0px; - padding: 1px 5px; -} - -.simpletable TD { - border: 1px solid #084; - margin: 0px; - padding: 5px; -} - -/* xmldiff markup */ -.new { text-decoration: underline; color: red; background: #fff0f0; } -.old { text-decoration: line-through; color: blue; background: #f0f0ff; } +/* effbot.css */ + +BODY { + font: 100% Georgia, Times, serif; + color: black; + margin: 0px 20px 0px 20px; +} + +#effbot-body { + background: white; + padding: 10px 40px 10px 40px; + max-width: 50em; +} + +#effbot-menu { + display: none; +} + +.adsense { + background: #f8fff8; + border: 1px solid #084; + padding: 10px 4px 4px 4px; +} + +.sidebar { + border: 1px solid #000; + float: right; clear: right; + width: 200px; + background: white; + padding: 10px; + margin: 0px -25px 10px 0px; +} + +/* visual style */ + +P { + line-height: 1.3em; +} + +CODE, PRE { + font: 100% "Courier New", Courier, Monaco, monospace; + color: #042; margin-left: 20px; +} + +H1, H2, H3 { + font-family: Georgia, Times, serif; + color: #084; margin-top: 30px; +} + +H1, H2, { border-top: 1px solid #084; } + +H4, H5, H6 { + font-family: Georgia, Times, serif; + color: #084; margin-top: 15px; +} + +A:link, A:hover { color: #084; } +A:visited { color: #404040; } + +UL LI { list-style-type: square; } + +.title { margin-bottom: 2px; color: #084; } +.info { font-size: 80%; color: #084; margin-top: 0px; } + +.bluebox { color: #084; margin-top: 10px; } + +.highlight { background: #cfc; } +.mark { color: #084; } +.small { font-size: 80%; } +.display { background: #eee; padding: 20px; } + +.note { + background: #efe; + border-top: 1px solid #084; + border-bottom: 1px solid #084; + padding: 2px 20px; +} + +.example { + border-top: medium solid #084; + border-bottom: medium solid #084; + padding: 5px; +} + +.figure { + border-top: medium solid #084; + border-bottom: medium solid #084; + padding: 5px; +} + +.fixme { + background: #eee; + border: 1px solid #084; + padding: 2x 20px; +} + +.simpletable { + border: 1px solid #084; + border-collapse: collapse; +} + +.simpletable TH { + text-align: left; + background: #cfc; + border: 1px solid #084; + margin: 0px; + padding: 1px 5px; +} + +.simpletable TD { + border: 1px solid #084; + margin: 0px; + padding: 5px; +} + +/* xmldiff markup */ +.new { text-decoration: underline; color: red; background: #fff0f0; } +.old { text-decoration: line-through; color: blue; background: #f0f0ff; } Modified: external/elementtree-1.2.6-20050316/docs/index.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/index.html (original) +++ external/elementtree-1.2.6-20050316/docs/index.html Wed Dec 14 19:33:39 2005 @@ -1,35 +1,35 @@ - - - - -The elementtree Package - - - -

The elementtree Package

- -

Package Contents

- -
-
ElementTree
-
ElementPath
-
ElementInclude
-
HTMLTreeBuilder
-
XMLTreeBuilder
-
SgmlopXMLTreeBuilder
-
SimpleXMLTreeBuilder
-
SimpleXMLWriter
-
TidyTools
-
- -

Online Resources

- -
-
Elements and Element Trees (effbot.org)
-
XPath Support in ElementTree 1.2 (effbot.org)
-
XInclude Support in ElementTree 1.2 (effbot.org)
-
Simple XML Processing With elementtree (xml.com)
-
- - - + + + + +The elementtree Package + + + +

The elementtree Package

+ +

Package Contents

+ +
+
ElementTree
+
ElementPath
+
ElementInclude
+
HTMLTreeBuilder
+
XMLTreeBuilder
+
SgmlopXMLTreeBuilder
+
SimpleXMLTreeBuilder
+
SimpleXMLWriter
+
TidyTools
+
+ +

Online Resources

+ +
+
Elements and Element Trees (effbot.org)
+
XPath Support in ElementTree 1.2 (effbot.org)
+
XInclude Support in ElementTree 1.2 (effbot.org)
+
Simple XML Processing With elementtree (xml.com)
+
+ + + Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementInclude.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementInclude.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementInclude.html Wed Dec 14 19:33:39 2005 @@ -1,69 +1,69 @@ - - - - -The elementtree.ElementInclude Module - - - -

The elementtree.ElementInclude Module

-

Limited XInclude support for the ElementTree package.

-

Module Contents

-
-
default_loader(href, parse, encoding=None) [#]
-
-

Default loader. This loader reads an included resource from disk.

-
-
href
-
-Resource reference.
-
parse
-
-Parse mode. Either "xml" or "text".
-
encoding
-
-Optional text encoding.
-
Returns:
-
-The expanded resource. If the parse mode is "xml", this - is an ElementTree instance. If the parse mode is "text", this - is a Unicode string. If the loader fails, it can return None - or raise an IOError exception.
-
Raises IOError:
-If the loader fails to load the resource.
-

-
-
FatalIncludeError (class) [#]
-
-

Fatal include error.

-

For more information about this class, see The FatalIncludeError Class.

-
-
include(elem, loader=None) [#]
-
-

Expand XInclude directives.

-
-
elem
-
-Root element.
-
loader
-
-Optional resource loader. If omitted, it defaults - to default_loader. If given, it should be a callable - that implements the same interface as default_loader. -
-
Raises FatalIncludeError:
-If the function fails to include a given - resource, or if the tree contains malformed XInclude elements.
-
Raises IOError:
-If the function fails to load a given resource.
-

-
-
-

The FatalIncludeError Class

-
-
FatalIncludeError (class) [#]
-
-

Fatal include error.

-
-
- + + + + +The elementtree.ElementInclude Module + + + +

The elementtree.ElementInclude Module

+

Limited XInclude support for the ElementTree package.

+

Module Contents

+
+
default_loader(href, parse, encoding=None) [#]
+
+

Default loader. This loader reads an included resource from disk.

+
+
href
+
+Resource reference.
+
parse
+
+Parse mode. Either "xml" or "text".
+
encoding
+
+Optional text encoding.
+
Returns:
+
+The expanded resource. If the parse mode is "xml", this + is an ElementTree instance. If the parse mode is "text", this + is a Unicode string. If the loader fails, it can return None + or raise an IOError exception.
+
Raises IOError:
+If the loader fails to load the resource.
+

+
+
FatalIncludeError (class) [#]
+
+

Fatal include error.

+

For more information about this class, see The FatalIncludeError Class.

+
+
include(elem, loader=None) [#]
+
+

Expand XInclude directives.

+
+
elem
+
+Root element.
+
loader
+
+Optional resource loader. If omitted, it defaults + to default_loader. If given, it should be a callable + that implements the same interface as default_loader. +
+
Raises FatalIncludeError:
+If the function fails to include a given + resource, or if the tree contains malformed XInclude elements.
+
Raises IOError:
+If the function fails to load a given resource.
+

+
+
+

The FatalIncludeError Class

+
+
FatalIncludeError (class) [#]
+
+

Fatal include error.

+
+
+ Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementPath.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementPath.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementPath.html Wed Dec 14 19:33:39 2005 @@ -1,60 +1,60 @@ - - - - -The elementtree.ElementPath Module - - - -

The elementtree.ElementPath Module

-

Implementation module for XPath support. There's usually no reason -to import this module directly; the ElementTree does this for -you, if needed. -

Module Contents

-
-
_compile(path) [#]
-
-

(Internal) Compile path.

-
-
find(element, path) [#]
-
-

Find first matching object.

-
-
findall(element, path) [#]
-
-

Find all matching objects.

-
-
findtext(element, path, default=None) [#]
-
-

Find text for first matching object.

-
-
Path(path) (class) [#]
-
-

Wrapper for a compiled XPath.

-

For more information about this class, see The Path Class.

-
-
-

The Path Class

-
-
Path(path) (class) [#]
-
-

Wrapper for a compiled XPath.

-
-
__init__(path) [#]
-
-

Create an Path instance from an XPath expression.

-
-
find(element) [#]
-
-

Find first matching object.

-
-
findall(element) [#]
-
-

Find all matching objects.

-
-
findtext(element, default=None) [#]
-
-

Find text for first matching object.

-
-
- + + + + +The elementtree.ElementPath Module + + + +

The elementtree.ElementPath Module

+

Implementation module for XPath support. There's usually no reason +to import this module directly; the ElementTree does this for +you, if needed. +

Module Contents

+
+
_compile(path) [#]
+
+

(Internal) Compile path.

+
+
find(element, path) [#]
+
+

Find first matching object.

+
+
findall(element, path) [#]
+
+

Find all matching objects.

+
+
findtext(element, path, default=None) [#]
+
+

Find text for first matching object.

+
+
Path(path) (class) [#]
+
+

Wrapper for a compiled XPath.

+

For more information about this class, see The Path Class.

+
+
+

The Path Class

+
+
Path(path) (class) [#]
+
+

Wrapper for a compiled XPath.

+
+
__init__(path) [#]
+
+

Create an Path instance from an XPath expression.

+
+
find(element) [#]
+
+

Find first matching object.

+
+
findall(element) [#]
+
+

Find all matching objects.

+
+
findtext(element, default=None) [#]
+
+

Find text for first matching object.

+
+
+ Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementTree.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementTree.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.ElementTree.html Wed Dec 14 19:33:39 2005 @@ -1,886 +1,886 @@ - - - - -The elementtree.ElementTree Module - - - -

The elementtree.ElementTree Module

-

The Element type is a flexible container object, designed to -store hierarchical data structures in memory. The type can be -described as a cross between a list and a dictionary. -

-Each element has a number of properties associated with it: -

    -
  • a tag. This is a string identifying what kind of data -this element represents (the element type, in other words).
  • -
  • a number of attributes, stored in a Python dictionary.
  • -
  • a text string.
  • -
  • an optional tail string.
  • -
  • a number of child elements, stored in a Python sequence
  • -
- -To create an element instance, use the Element or SubElement factory functions. -

-The ElementTree class can be used to wrap an element -structure, and convert it from and to XML. -

Module Contents

-
-
_ElementInterface(tag, attrib) (class) [#]
-
-

Internal element class.

-

For more information about this class, see The _ElementInterface Class.

-
-
Comment(text=None) ⇒ Element [#]
-
-

Comment element factory. This factory function creates a special -element that will be serialized as an XML comment. -

-The comment string can be either an 8-bit ASCII string or a Unicode -string. - -

-
text
-
-A string containing the comment string.
-
Returns:
-
-An element instance, representing a comment.
-

-
-
dump(elem) [#]
-
-

Writes an element tree or element structure to sys.stdout. This -function should be used for debugging only. -

-The exact output format is implementation dependent. In this -version, it's written as an ordinary XML file. - -

-
elem
-
-An element tree or an individual element.
-

-
-
Element(tag, attrib={}, **extra) ⇒ Element [#]
-
-

Element factory. This function returns an object implementing the -standard Element interface. The exact class or type of that object -is implementation dependent, but it will always be compatible with -the _ElementInterface class in this module. -

-The element name, attribute names, and attribute values can be -either 8-bit ASCII strings or Unicode strings. - -

-
tag
-
-The element name.
-
attrib
-
-An optional dictionary, containing element attributes.
-
**extra
-
-Additional attributes, given as keyword arguments.
-
Returns:
-
-An element instance.
-

-
-
ElementTree(element=None, file=None) (class) [#]
-
-

ElementTree wrapper class.

-
-
element
-
-Optional root element.
-
file=
-
-Optional file handle or name. If given, the - tree is initialized with the contents of this XML file.
-

-

For more information about this class, see The ElementTree Class.

-
-
fromstring (variable) [#]
-
-

Parses an XML document from a string constant. Same as XML. - -

-
source
-
-A string containing XML data.
-
Returns:
-
-An Element instance.
-

-
-
iselement(element) ⇒ flag [#]
-
-

Checks if an object appears to be a valid element object.

-
-
An
-
-element instance.
-
Returns:
-
-A true value if this is an element object.
-

-
-
iterparse(source, events=None) (class) [#]
-
-

Parses an XML document into an element tree incrementally, and reports -what's going on to the user.

-
-
source
-
-A filename or file object containing XML data.
-
events
-
-A list of events to report back. If omitted, only "end" - events are reported.
-
Returns:
-
-A (event, elem) iterator.
-

-

For more information about this class, see The iterparse Class.

-
-
parse(source, parser=None) [#]
-
-

Parses an XML document into an element tree.

-
-
source
-
-A filename or file object containing XML data.
-
parser
-
-An optional parser instance. If not given, the - standard XMLTreeBuilder parser is used. -
-
Returns:
-
-An ElementTree instance
-

-
-
ProcessingInstruction(target, text=None) ⇒ Element [#]
-
-

PI element factory. This factory function creates a special element -that will be serialized as an XML processing instruction.

-
-
target
-
-A string containing the PI target.
-
text
-
-A string containing the PI contents, if any.
-
Returns:
-
-An element instance, representing a PI.
-

-
-
QName(text_or_uri, tag=None) (class) [#]
-
-

QName wrapper.

-
-
text
-
-A string containing the QName value, in the form {uri}local, - or, if the tag argument is given, the URI part of a QName.
-
tag
-
-Optional tag. If given, the first argument is interpreted as - an URI, and this argument is interpreted as a local name.
-
Returns:
-
-An opaque object, representing the QName.
-

-

For more information about this class, see The QName Class.

-
-
SubElement(parent, tag, attrib={}, **extra) ⇒ Element [#]
-
-

Subelement factory. This function creates an element instance, and -appends it to an existing element. -

-The element name, attribute names, and attribute values can be -either 8-bit ASCII strings or Unicode strings. - -

-
parent
-
-The parent element.
-
tag
-
-The subelement name.
-
attrib
-
-An optional dictionary, containing element attributes.
-
**extra
-
-Additional attributes, given as keyword arguments.
-
Returns:
-
-An element instance.
-

-
-
tostring(element, encoding=None) ⇒ string [#]
-
-

Generates a string representation of an XML element, including all -subelements.

-
-
element
-
-An Element instance.
-
Returns:
-
-An encoded string containing the XML data.
-

-
-
TreeBuilder(element_factory=None) (class) [#]
-
-

Generic element structure builder.

-
-
element_factory
-
-Optional element factory. This factory - is called to create new Element instances, as necessary.
-

-

For more information about this class, see The TreeBuilder Class.

-
-
XML(text) ⇒ Element [#]
-
-

Parses an XML document from a string constant. This function can -be used to embed "XML literals" in Python code.

-
-
source
-
-A string containing XML data.
-
Returns:
-
-An Element instance.
-

-
-
XMLID(text) ⇒ (Element, dictionary) [#]
-
-

Parses an XML document from a string constant, and also returns -a dictionary which maps from element id:s to elements.

-
-
source
-
-A string containing XML data.
-
Returns:
-
-A tuple containing an Element instance and a dictionary.
-

-
-
XMLTreeBuilder(html=0, target=None) (class) [#]
-
-

Element structure builder for XML source data, based on the -expat parser.

-
-
target=
-
-Target object. If omitted, the builder uses an - instance of the standard TreeBuilder class. -
-
html=
-
-Predefine HTML entities. This flag is not supported - by the current implementation.
-

-

For more information about this class, see The XMLTreeBuilder Class.

-
-
-

The _ElementInterface Class

-
-
_ElementInterface(tag, attrib) (class) [#]
-
-

Internal element class. This class defines the Element interface, -and provides a reference implementation of this interface. -

-You should not create instances of this class directly. Use the -appropriate factory functions instead, such as Element -and SubElement. - -

-
__delitem__(index) [#]
-
-

Deletes the given subelement.

-
-
index
-
-What subelement to delete.
-
Raises IndexError:
-If the given element does not exist.
-

-
-
__delslice__(start, stop) [#]
-
-

Deletes a number of subelements.

-
-
start
-
-The first subelement to delete.
-
stop
-
-The first subelement to leave in there.
-

-
-
__getitem__(index) [#]
-
-

Returns the given subelement.

-
-
index
-
-What subelement to return.
-
Returns:
-
-The given subelement.
-
Raises IndexError:
-If the given element does not exist.
-

-
-
__getslice__(start, stop) [#]
-
-

Returns a list containing subelements in the given range.

-
-
start
-
-The first subelement to return.
-
stop
-
-The first subelement that shouldn't be returned.
-
Returns:
-
-A sequence object containing subelements.
-

-
-
__len__() [#]
-
-

Returns the number of subelements.

-
-
Returns:
-
-The number of subelements.
-

-
-
__setitem__(index, element) [#]
-
-

Replaces the given subelement.

-
-
index
-
-What subelement to replace.
-
element
-
-The new element value.
-
Raises IndexError:
-If the given element does not exist.
-
Raises AssertionError:
-If element is not a valid object.
-

-
-
__setslice__(start, stop, elements) [#]
-
-

Replaces a number of subelements with elements from a sequence.

-
-
start
-
-The first subelement to replace.
-
stop
-
-The first subelement that shouldn't be replaced.
-
elements
-
-A sequence object with zero or more elements.
-
Raises AssertionError:
-If a sequence member is not a valid object.
-

-
-
append(element) [#]
-
-

Adds a subelement to the end of this element.

-
-
element
-
-The element to add.
-
Raises AssertionError:
-If a sequence member is not a valid object.
-

-
-
attrib [#]
-
-

(Attribute) Element attribute dictionary. Where possible, use -get, -set, -keys, and -items to access -element attributes. -

-
clear() [#]
-
-

Resets an element. This function removes all subelements, clears -all attributes, and sets the text and tail attributes to None.

-
-
find(path) ⇒ Element or None [#]
-
-

Finds the first matching subelement, by tag name or path.

-
-
path
-
-What element to look for.
-
Returns:
-
-The first matching element, or None if no element was found.
-

-
-
findall(path) ⇒ list of Element instances [#]
-
-

Finds all matching subelements, by tag name or path.

-
-
path
-
-What element to look for.
-
Returns:
-
-A list or iterator containing all matching elements, - in document order.
-

-
-
findtext(path, default=None) ⇒ string [#]
-
-

Finds text for the first matching subelement, by tag name or path.

-
-
path
-
-What element to look for.
-
default
-
-What to return if the element was not found.
-
Returns:
-
-The text content of the first matching element, or the - default value no element was found. Note that if the element - has is found, but has no text content, this method returns an - empty string.
-

-
-
get(key, default=None) ⇒ string or None [#]
-
-

Gets an element attribute.

-
-
key
-
-What attribute to look for.
-
default
-
-What to return if the attribute was not found.
-
Returns:
-
-The attribute value, or the default value, if the - attribute was not found.
-

-
-
getchildren() ⇒ list of Element instances [#]
-
-

Returns all subelements. The elements are returned in document -order.

-
-
Returns:
-
-A list of subelements.
-

-
-
getiterator(tag=None) ⇒ list or iterator [#]
-
-

Creates a tree iterator. The iterator loops over this element -and all subelements, in document order, and returns all elements -with a matching tag. -

-If the tree structure is modified during iteration, the result -is undefined. - -

-
tag
-
-What tags to look for (default is to return all elements).
-
Returns:
-
-A list or iterator containing all the matching elements.
-

-
-
insert(index, element) [#]
-
-

Inserts a subelement at the given position in this element.

-
-
index
-
-Where to insert the new subelement.
-
Raises AssertionError:
-If the element is not a valid object.
-

-
-
items() ⇒ list of (string, string) tuples [#]
-
-

Gets element attributes, as a sequence. The attributes are -returned in an arbitrary order.

-
-
Returns:
-
-A list of (name, value) tuples for all attributes.
-

-
-
keys() ⇒ list of strings [#]
-
-

Gets a list of attribute names. The names are returned in an -arbitrary order (just like for an ordinary Python dictionary).

-
-
Returns:
-
-A list of element attribute names.
-

-
-
makeelement(tag, attrib) [#]
-
-

Creates a new element object of the same type as this element.

-
-
tag
-
-Element tag.
-
attrib
-
-Element attributes, given as a dictionary.
-
Returns:
-
-A new element instance.
-

-
-
remove(element) [#]
-
-

Removes a matching subelement. Unlike the find methods, -this method compares elements based on identity, not on tag -value or contents. - -

-
element
-
-What element to remove.
-
Raises ValueError:
-If a matching element could not be found.
-
Raises AssertionError:
-If the element is not a valid object.
-

-
-
set(key, value) [#]
-
-

Sets an element attribute.

-
-
key
-
-What attribute to set.
-
value
-
-The attribute value.
-

-
-
tag [#]
-
-

(Attribute) Element tag.

-
-
tail [#]
-
-

(Attribute) Text after this element's end tag, but before the -next sibling element's start tag. This is either a string or -the value None, if there was no text.

-
-
text [#]
-
-

(Attribute) Text before first subelement. This is either a -string or the value None, if there was no text.

-
-
-

The ElementTree Class

-
-
ElementTree(element=None, file=None) (class) [#]
-
-

ElementTree wrapper class. This class represents an entire element -hierarchy, and adds some extra support for serialization to and from -standard XML.

-
-
element
-
-Optional root element.
-
file=
-
-Optional file handle or name. If given, the - tree is initialized with the contents of this XML file.
-

-
-
_setroot(element) [#]
-
-

Replaces the root element for this tree. This discards the -current contents of the tree, and replaces it with the given -element. Use with care.

-
-
element
-
-An element instance.
-

-
-
find(path) ⇒ Element or None [#]
-
-

Finds the first toplevel element with given tag. -Same as getroot().find(path).

-
-
path
-
-What element to look for.
-
Returns:
-
-The first matching element, or None if no element was found.
-

-
-
findall(path) ⇒ list of Element instances [#]
-
-

Finds all toplevel elements with the given tag. -Same as getroot().findall(path).

-
-
path
-
-What element to look for.
-
Returns:
-
-A list or iterator containing all matching elements, - in document order.
-

-
-
findtext(path, default=None) ⇒ string [#]
-
-

Finds the element text for the first toplevel element with given -tag. Same as getroot().findtext(path).

-
-
path
-
-What toplevel element to look for.
-
default
-
-What to return if the element was not found.
-
Returns:
-
-The text content of the first matching element, or the - default value no element was found. Note that if the element - has is found, but has no text content, this method returns an - empty string.
-

-
-
getiterator(tag=None) ⇒ iterator [#]
-
-

Creates a tree iterator for the root element. The iterator loops -over all elements in this tree, in document order.

-
-
tag
-
-What tags to look for (default is to return all elements)
-
Returns:
-
-An iterator.
-

-
-
getroot() ⇒ Element [#]
-
-

Gets the root element for this tree.

-
-
Returns:
-
-An element instance.
-

-
-
parse(source, parser=None) ⇒ Element [#]
-
-

Loads an external XML document into this element tree.

-
-
source
-
-A file name or file object.
-
parser
-
-An optional parser instance. If not given, the - standard XMLTreeBuilder parser is used. -
-
Returns:
-
-The document root element.
-

-
-
write(file, encoding="us-ascii") [#]
-
-

Writes the element tree to a file, as XML.

-
-
file
-
-A file name, or a file object opened for writing.
-
encoding
-
-Optional output encoding (default is US-ASCII).
-

-
-
-

The iterparse Class

-
-
iterparse(source, events=None) (class) [#]
-
-

Parses an XML document into an element tree incrementally, and reports -what's going on to the user.

-
-
source
-
-A filename or file object containing XML data.
-
events
-
-A list of events to report back. If omitted, only "end" - events are reported.
-
Returns:
-
-A (event, elem) iterator.
-

-
-
-

The QName Class

-
-
QName(text_or_uri, tag=None) (class) [#]
-
-

QName wrapper. This can be used to wrap a QName attribute value, in -order to get proper namespace handling on output.

-
-
text
-
-A string containing the QName value, in the form {uri}local, - or, if the tag argument is given, the URI part of a QName.
-
tag
-
-Optional tag. If given, the first argument is interpreted as - an URI, and this argument is interpreted as a local name.
-
Returns:
-
-An opaque object, representing the QName.
-

-
-
-

The TreeBuilder Class

-
-
TreeBuilder(element_factory=None) (class) [#]
-
-

Generic element structure builder. This builder converts a sequence -of start, data, and end method calls to a well-formed element structure. -

-You can use this class to build an element structure using a custom XML -parser, or a parser for some other XML-like format. - -

-
element_factory
-
-Optional element factory. This factory - is called to create new Element instances, as necessary.
-

-
-
close() ⇒ Element [#]
-
-

Flushes the parser buffers, and returns the toplevel documen -element.

-
-
Returns:
-
-An Element instance.
-

-
-
data(data) [#]
-
-

Adds text to the current element.

-
-
data
-
-A string. This should be either an 8-bit string - containing ASCII text, or a Unicode string.
-

-
-
end(tag) ⇒ Element [#]
-
-

Closes the current element.

-
-
tag
-
-The element name.
-
Returns:
-
-The closed element.
-

-
-
start(tag, attrs) ⇒ Element [#]
-
-

Opens a new element.

-
-
tag
-
-The element name.
-
attrib
-
-A dictionary containing element attributes.
-
Returns:
-
-The opened element.
-

-
-
-

The XMLTreeBuilder Class

-
-
XMLTreeBuilder(html=0, target=None) (class) [#]
-
-

Element structure builder for XML source data, based on the -expat parser. - -

-
target=
-
-Target object. If omitted, the builder uses an - instance of the standard TreeBuilder class. -
-
html=
-
-Predefine HTML entities. This flag is not supported - by the current implementation.
-

-
-
close() ⇒ Element [#]
-
-

Finishes feeding data to the parser.

-
-
Returns:
-
-An element structure.
-

-
-
doctype(name, pubid, system) [#]
-
-

Handles a doctype declaration.

-
-
name
-
-Doctype name.
-
pubid
-
-Public identifier.
-
system
-
-System identifier.
-

-
-
feed(data) [#]
-
-

Feeds data to the parser.

-
-
data
-
-Encoded data.
-

-
-
- + + + + +The elementtree.ElementTree Module + + + +

The elementtree.ElementTree Module

+

The Element type is a flexible container object, designed to +store hierarchical data structures in memory. The type can be +described as a cross between a list and a dictionary. +

+Each element has a number of properties associated with it: +

    +
  • a tag. This is a string identifying what kind of data +this element represents (the element type, in other words).
  • +
  • a number of attributes, stored in a Python dictionary.
  • +
  • a text string.
  • +
  • an optional tail string.
  • +
  • a number of child elements, stored in a Python sequence
  • +
+ +To create an element instance, use the Element or SubElement factory functions. +

+The ElementTree class can be used to wrap an element +structure, and convert it from and to XML. +

Module Contents

+
+
_ElementInterface(tag, attrib) (class) [#]
+
+

Internal element class.

+

For more information about this class, see The _ElementInterface Class.

+
+
Comment(text=None) ⇒ Element [#]
+
+

Comment element factory. This factory function creates a special +element that will be serialized as an XML comment. +

+The comment string can be either an 8-bit ASCII string or a Unicode +string. + +

+
text
+
+A string containing the comment string.
+
Returns:
+
+An element instance, representing a comment.
+

+
+
dump(elem) [#]
+
+

Writes an element tree or element structure to sys.stdout. This +function should be used for debugging only. +

+The exact output format is implementation dependent. In this +version, it's written as an ordinary XML file. + +

+
elem
+
+An element tree or an individual element.
+

+
+
Element(tag, attrib={}, **extra) ⇒ Element [#]
+
+

Element factory. This function returns an object implementing the +standard Element interface. The exact class or type of that object +is implementation dependent, but it will always be compatible with +the _ElementInterface class in this module. +

+The element name, attribute names, and attribute values can be +either 8-bit ASCII strings or Unicode strings. + +

+
tag
+
+The element name.
+
attrib
+
+An optional dictionary, containing element attributes.
+
**extra
+
+Additional attributes, given as keyword arguments.
+
Returns:
+
+An element instance.
+

+
+
ElementTree(element=None, file=None) (class) [#]
+
+

ElementTree wrapper class.

+
+
element
+
+Optional root element.
+
file=
+
+Optional file handle or name. If given, the + tree is initialized with the contents of this XML file.
+

+

For more information about this class, see The ElementTree Class.

+
+
fromstring (variable) [#]
+
+

Parses an XML document from a string constant. Same as XML. + +

+
source
+
+A string containing XML data.
+
Returns:
+
+An Element instance.
+

+
+
iselement(element) ⇒ flag [#]
+
+

Checks if an object appears to be a valid element object.

+
+
An
+
+element instance.
+
Returns:
+
+A true value if this is an element object.
+

+
+
iterparse(source, events=None) (class) [#]
+
+

Parses an XML document into an element tree incrementally, and reports +what's going on to the user.

+
+
source
+
+A filename or file object containing XML data.
+
events
+
+A list of events to report back. If omitted, only "end" + events are reported.
+
Returns:
+
+A (event, elem) iterator.
+

+

For more information about this class, see The iterparse Class.

+
+
parse(source, parser=None) [#]
+
+

Parses an XML document into an element tree.

+
+
source
+
+A filename or file object containing XML data.
+
parser
+
+An optional parser instance. If not given, the + standard XMLTreeBuilder parser is used. +
+
Returns:
+
+An ElementTree instance
+

+
+
ProcessingInstruction(target, text=None) ⇒ Element [#]
+
+

PI element factory. This factory function creates a special element +that will be serialized as an XML processing instruction.

+
+
target
+
+A string containing the PI target.
+
text
+
+A string containing the PI contents, if any.
+
Returns:
+
+An element instance, representing a PI.
+

+
+
QName(text_or_uri, tag=None) (class) [#]
+
+

QName wrapper.

+
+
text
+
+A string containing the QName value, in the form {uri}local, + or, if the tag argument is given, the URI part of a QName.
+
tag
+
+Optional tag. If given, the first argument is interpreted as + an URI, and this argument is interpreted as a local name.
+
Returns:
+
+An opaque object, representing the QName.
+

+

For more information about this class, see The QName Class.

+
+
SubElement(parent, tag, attrib={}, **extra) ⇒ Element [#]
+
+

Subelement factory. This function creates an element instance, and +appends it to an existing element. +

+The element name, attribute names, and attribute values can be +either 8-bit ASCII strings or Unicode strings. + +

+
parent
+
+The parent element.
+
tag
+
+The subelement name.
+
attrib
+
+An optional dictionary, containing element attributes.
+
**extra
+
+Additional attributes, given as keyword arguments.
+
Returns:
+
+An element instance.
+

+
+
tostring(element, encoding=None) ⇒ string [#]
+
+

Generates a string representation of an XML element, including all +subelements.

+
+
element
+
+An Element instance.
+
Returns:
+
+An encoded string containing the XML data.
+

+
+
TreeBuilder(element_factory=None) (class) [#]
+
+

Generic element structure builder.

+
+
element_factory
+
+Optional element factory. This factory + is called to create new Element instances, as necessary.
+

+

For more information about this class, see The TreeBuilder Class.

+
+
XML(text) ⇒ Element [#]
+
+

Parses an XML document from a string constant. This function can +be used to embed "XML literals" in Python code.

+
+
source
+
+A string containing XML data.
+
Returns:
+
+An Element instance.
+

+
+
XMLID(text) ⇒ (Element, dictionary) [#]
+
+

Parses an XML document from a string constant, and also returns +a dictionary which maps from element id:s to elements.

+
+
source
+
+A string containing XML data.
+
Returns:
+
+A tuple containing an Element instance and a dictionary.
+

+
+
XMLTreeBuilder(html=0, target=None) (class) [#]
+
+

Element structure builder for XML source data, based on the +expat parser.

+
+
target=
+
+Target object. If omitted, the builder uses an + instance of the standard TreeBuilder class. +
+
html=
+
+Predefine HTML entities. This flag is not supported + by the current implementation.
+

+

For more information about this class, see The XMLTreeBuilder Class.

+
+
+

The _ElementInterface Class

+
+
_ElementInterface(tag, attrib) (class) [#]
+
+

Internal element class. This class defines the Element interface, +and provides a reference implementation of this interface. +

+You should not create instances of this class directly. Use the +appropriate factory functions instead, such as Element +and SubElement. + +

+
__delitem__(index) [#]
+
+

Deletes the given subelement.

+
+
index
+
+What subelement to delete.
+
Raises IndexError:
+If the given element does not exist.
+

+
+
__delslice__(start, stop) [#]
+
+

Deletes a number of subelements.

+
+
start
+
+The first subelement to delete.
+
stop
+
+The first subelement to leave in there.
+

+
+
__getitem__(index) [#]
+
+

Returns the given subelement.

+
+
index
+
+What subelement to return.
+
Returns:
+
+The given subelement.
+
Raises IndexError:
+If the given element does not exist.
+

+
+
__getslice__(start, stop) [#]
+
+

Returns a list containing subelements in the given range.

+
+
start
+
+The first subelement to return.
+
stop
+
+The first subelement that shouldn't be returned.
+
Returns:
+
+A sequence object containing subelements.
+

+
+
__len__() [#]
+
+

Returns the number of subelements.

+
+
Returns:
+
+The number of subelements.
+

+
+
__setitem__(index, element) [#]
+
+

Replaces the given subelement.

+
+
index
+
+What subelement to replace.
+
element
+
+The new element value.
+
Raises IndexError:
+If the given element does not exist.
+
Raises AssertionError:
+If element is not a valid object.
+

+
+
__setslice__(start, stop, elements) [#]
+
+

Replaces a number of subelements with elements from a sequence.

+
+
start
+
+The first subelement to replace.
+
stop
+
+The first subelement that shouldn't be replaced.
+
elements
+
+A sequence object with zero or more elements.
+
Raises AssertionError:
+If a sequence member is not a valid object.
+

+
+
append(element) [#]
+
+

Adds a subelement to the end of this element.

+
+
element
+
+The element to add.
+
Raises AssertionError:
+If a sequence member is not a valid object.
+

+
+
attrib [#]
+
+

(Attribute) Element attribute dictionary. Where possible, use +get, +set, +keys, and +items to access +element attributes. +

+
clear() [#]
+
+

Resets an element. This function removes all subelements, clears +all attributes, and sets the text and tail attributes to None.

+
+
find(path) ⇒ Element or None [#]
+
+

Finds the first matching subelement, by tag name or path.

+
+
path
+
+What element to look for.
+
Returns:
+
+The first matching element, or None if no element was found.
+

+
+
findall(path) ⇒ list of Element instances [#]
+
+

Finds all matching subelements, by tag name or path.

+
+
path
+
+What element to look for.
+
Returns:
+
+A list or iterator containing all matching elements, + in document order.
+

+
+
findtext(path, default=None) ⇒ string [#]
+
+

Finds text for the first matching subelement, by tag name or path.

+
+
path
+
+What element to look for.
+
default
+
+What to return if the element was not found.
+
Returns:
+
+The text content of the first matching element, or the + default value no element was found. Note that if the element + has is found, but has no text content, this method returns an + empty string.
+

+
+
get(key, default=None) ⇒ string or None [#]
+
+

Gets an element attribute.

+
+
key
+
+What attribute to look for.
+
default
+
+What to return if the attribute was not found.
+
Returns:
+
+The attribute value, or the default value, if the + attribute was not found.
+

+
+
getchildren() ⇒ list of Element instances [#]
+
+

Returns all subelements. The elements are returned in document +order.

+
+
Returns:
+
+A list of subelements.
+

+
+
getiterator(tag=None) ⇒ list or iterator [#]
+
+

Creates a tree iterator. The iterator loops over this element +and all subelements, in document order, and returns all elements +with a matching tag. +

+If the tree structure is modified during iteration, the result +is undefined. + +

+
tag
+
+What tags to look for (default is to return all elements).
+
Returns:
+
+A list or iterator containing all the matching elements.
+

+
+
insert(index, element) [#]
+
+

Inserts a subelement at the given position in this element.

+
+
index
+
+Where to insert the new subelement.
+
Raises AssertionError:
+If the element is not a valid object.
+

+
+
items() ⇒ list of (string, string) tuples [#]
+
+

Gets element attributes, as a sequence. The attributes are +returned in an arbitrary order.

+
+
Returns:
+
+A list of (name, value) tuples for all attributes.
+

+
+
keys() ⇒ list of strings [#]
+
+

Gets a list of attribute names. The names are returned in an +arbitrary order (just like for an ordinary Python dictionary).

+
+
Returns:
+
+A list of element attribute names.
+

+
+
makeelement(tag, attrib) [#]
+
+

Creates a new element object of the same type as this element.

+
+
tag
+
+Element tag.
+
attrib
+
+Element attributes, given as a dictionary.
+
Returns:
+
+A new element instance.
+

+
+
remove(element) [#]
+
+

Removes a matching subelement. Unlike the find methods, +this method compares elements based on identity, not on tag +value or contents. + +

+
element
+
+What element to remove.
+
Raises ValueError:
+If a matching element could not be found.
+
Raises AssertionError:
+If the element is not a valid object.
+

+
+
set(key, value) [#]
+
+

Sets an element attribute.

+
+
key
+
+What attribute to set.
+
value
+
+The attribute value.
+

+
+
tag [#]
+
+

(Attribute) Element tag.

+
+
tail [#]
+
+

(Attribute) Text after this element's end tag, but before the +next sibling element's start tag. This is either a string or +the value None, if there was no text.

+
+
text [#]
+
+

(Attribute) Text before first subelement. This is either a +string or the value None, if there was no text.

+
+
+

The ElementTree Class

+
+
ElementTree(element=None, file=None) (class) [#]
+
+

ElementTree wrapper class. This class represents an entire element +hierarchy, and adds some extra support for serialization to and from +standard XML.

+
+
element
+
+Optional root element.
+
file=
+
+Optional file handle or name. If given, the + tree is initialized with the contents of this XML file.
+

+
+
_setroot(element) [#]
+
+

Replaces the root element for this tree. This discards the +current contents of the tree, and replaces it with the given +element. Use with care.

+
+
element
+
+An element instance.
+

+
+
find(path) ⇒ Element or None [#]
+
+

Finds the first toplevel element with given tag. +Same as getroot().find(path).

+
+
path
+
+What element to look for.
+
Returns:
+
+The first matching element, or None if no element was found.
+

+
+
findall(path) ⇒ list of Element instances [#]
+
+

Finds all toplevel elements with the given tag. +Same as getroot().findall(path).

+
+
path
+
+What element to look for.
+
Returns:
+
+A list or iterator containing all matching elements, + in document order.
+

+
+
findtext(path, default=None) ⇒ string [#]
+
+

Finds the element text for the first toplevel element with given +tag. Same as getroot().findtext(path).

+
+
path
+
+What toplevel element to look for.
+
default
+
+What to return if the element was not found.
+
Returns:
+
+The text content of the first matching element, or the + default value no element was found. Note that if the element + has is found, but has no text content, this method returns an + empty string.
+

+
+
getiterator(tag=None) ⇒ iterator [#]
+
+

Creates a tree iterator for the root element. The iterator loops +over all elements in this tree, in document order.

+
+
tag
+
+What tags to look for (default is to return all elements)
+
Returns:
+
+An iterator.
+

+
+
getroot() ⇒ Element [#]
+
+

Gets the root element for this tree.

+
+
Returns:
+
+An element instance.
+

+
+
parse(source, parser=None) ⇒ Element [#]
+
+

Loads an external XML document into this element tree.

+
+
source
+
+A file name or file object.
+
parser
+
+An optional parser instance. If not given, the + standard XMLTreeBuilder parser is used. +
+
Returns:
+
+The document root element.
+

+
+
write(file, encoding="us-ascii") [#]
+
+

Writes the element tree to a file, as XML.

+
+
file
+
+A file name, or a file object opened for writing.
+
encoding
+
+Optional output encoding (default is US-ASCII).
+

+
+
+

The iterparse Class

+
+
iterparse(source, events=None) (class) [#]
+
+

Parses an XML document into an element tree incrementally, and reports +what's going on to the user.

+
+
source
+
+A filename or file object containing XML data.
+
events
+
+A list of events to report back. If omitted, only "end" + events are reported.
+
Returns:
+
+A (event, elem) iterator.
+

+
+
+

The QName Class

+
+
QName(text_or_uri, tag=None) (class) [#]
+
+

QName wrapper. This can be used to wrap a QName attribute value, in +order to get proper namespace handling on output.

+
+
text
+
+A string containing the QName value, in the form {uri}local, + or, if the tag argument is given, the URI part of a QName.
+
tag
+
+Optional tag. If given, the first argument is interpreted as + an URI, and this argument is interpreted as a local name.
+
Returns:
+
+An opaque object, representing the QName.
+

+
+
+

The TreeBuilder Class

+
+
TreeBuilder(element_factory=None) (class) [#]
+
+

Generic element structure builder. This builder converts a sequence +of start, data, and end method calls to a well-formed element structure. +

+You can use this class to build an element structure using a custom XML +parser, or a parser for some other XML-like format. + +

+
element_factory
+
+Optional element factory. This factory + is called to create new Element instances, as necessary.
+

+
+
close() ⇒ Element [#]
+
+

Flushes the parser buffers, and returns the toplevel documen +element.

+
+
Returns:
+
+An Element instance.
+

+
+
data(data) [#]
+
+

Adds text to the current element.

+
+
data
+
+A string. This should be either an 8-bit string + containing ASCII text, or a Unicode string.
+

+
+
end(tag) ⇒ Element [#]
+
+

Closes the current element.

+
+
tag
+
+The element name.
+
Returns:
+
+The closed element.
+

+
+
start(tag, attrs) ⇒ Element [#]
+
+

Opens a new element.

+
+
tag
+
+The element name.
+
attrib
+
+A dictionary containing element attributes.
+
Returns:
+
+The opened element.
+

+
+
+

The XMLTreeBuilder Class

+
+
XMLTreeBuilder(html=0, target=None) (class) [#]
+
+

Element structure builder for XML source data, based on the +expat parser. + +

+
target=
+
+Target object. If omitted, the builder uses an + instance of the standard TreeBuilder class. +
+
html=
+
+Predefine HTML entities. This flag is not supported + by the current implementation.
+

+
+
close() ⇒ Element [#]
+
+

Finishes feeding data to the parser.

+
+
Returns:
+
+An element structure.
+

+
+
doctype(name, pubid, system) [#]
+
+

Handles a doctype declaration.

+
+
name
+
+Doctype name.
+
pubid
+
+Public identifier.
+
system
+
+System identifier.
+

+
+
feed(data) [#]
+
+

Feeds data to the parser.

+
+
data
+
+Encoded data.
+

+
+
+ Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.HTMLTreeBuilder.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.HTMLTreeBuilder.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.HTMLTreeBuilder.html Wed Dec 14 19:33:39 2005 @@ -1,118 +1,118 @@ - - - - -The elementtree.HTMLTreeBuilder Module - - - -

The elementtree.HTMLTreeBuilder Module

-

Tools to build element trees from HTML files.

-

Module Contents

-
-
HTMLTreeBuilder(builder=None, encoding=None) (class) [#]
-
-

ElementTree builder for HTML source code.

-
-
builder=
-
-Optional builder object. If omitted, the parser - uses the standard elementtree builder. -
-
encoding=
-
-Optional character encoding, if known. If omitted, - the parser looks for META tags inside the document. If no tags - are found, the parser defaults to ISO-8859-1. Note that if your - document uses a non-ASCII compatible encoding, you must decode - the document before parsing.
-

-

For more information about this class, see The HTMLTreeBuilder Class.

-
-
parse(source, encoding=None) [#]
-
-

Parse an HTML document or document fragment.

-
-
source
-
-A filename or file object containing HTML data.
-
encoding
-
-Optional character encoding, if known. If omitted, - the parser looks for META tags inside the document. If no tags - are found, the parser defaults to ISO-8859-1.
-
Returns:
-
-An ElementTree instance
-

-
-
TreeBuilder (variable) [#]
-
-

An alias for the HTMLTreeBuilder class. -

-
-

The HTMLTreeBuilder Class

-
-
HTMLTreeBuilder(builder=None, encoding=None) (class) [#]
-
-

ElementTree builder for HTML source code. This builder converts an -HTML document or fragment to an ElementTree. -

-The parser is relatively picky, and requires balanced tags for most -elements. However, elements belonging to the following group are -automatically closed: P, LI, TR, TH, and TD. In addition, the -parser automatically inserts end tags immediately after the start -tag, and ignores any end tags for the following group: IMG, HR, -META, and LINK. - -

-
builder=
-
-Optional builder object. If omitted, the parser - uses the standard elementtree builder. -
-
encoding=
-
-Optional character encoding, if known. If omitted, - the parser looks for META tags inside the document. If no tags - are found, the parser defaults to ISO-8859-1. Note that if your - document uses a non-ASCII compatible encoding, you must decode - the document before parsing.
-

-
-
close() [#]
-
-

Flushes parser buffers, and return the root element.

-
-
Returns:
-
-An Element instance.
-

-
-
handle_charref(char) [#]
-
-

(Internal) Handles character references.

-
-
handle_data(data) [#]
-
-

(Internal) Handles character data.

-
-
handle_endtag(tag) [#]
-
-

(Internal) Handles end tags.

-
-
handle_entityref(name) [#]
-
-

(Internal) Handles entity references.

-
-
handle_starttag(tag, attrs) [#]
-
-

(Internal) Handles start tags.

-
-
unknown_entityref(name) [#]
-
-

(Hook) Handles unknown entity references. The default action -is to ignore unknown entities.

-
-
- + + + + +The elementtree.HTMLTreeBuilder Module + + + +

The elementtree.HTMLTreeBuilder Module

+

Tools to build element trees from HTML files.

+

Module Contents

+
+
HTMLTreeBuilder(builder=None, encoding=None) (class) [#]
+
+

ElementTree builder for HTML source code.

+
+
builder=
+
+Optional builder object. If omitted, the parser + uses the standard elementtree builder. +
+
encoding=
+
+Optional character encoding, if known. If omitted, + the parser looks for META tags inside the document. If no tags + are found, the parser defaults to ISO-8859-1. Note that if your + document uses a non-ASCII compatible encoding, you must decode + the document before parsing.
+

+

For more information about this class, see The HTMLTreeBuilder Class.

+
+
parse(source, encoding=None) [#]
+
+

Parse an HTML document or document fragment.

+
+
source
+
+A filename or file object containing HTML data.
+
encoding
+
+Optional character encoding, if known. If omitted, + the parser looks for META tags inside the document. If no tags + are found, the parser defaults to ISO-8859-1.
+
Returns:
+
+An ElementTree instance
+

+
+
TreeBuilder (variable) [#]
+
+

An alias for the HTMLTreeBuilder class. +

+
+

The HTMLTreeBuilder Class

+
+
HTMLTreeBuilder(builder=None, encoding=None) (class) [#]
+
+

ElementTree builder for HTML source code. This builder converts an +HTML document or fragment to an ElementTree. +

+The parser is relatively picky, and requires balanced tags for most +elements. However, elements belonging to the following group are +automatically closed: P, LI, TR, TH, and TD. In addition, the +parser automatically inserts end tags immediately after the start +tag, and ignores any end tags for the following group: IMG, HR, +META, and LINK. + +

+
builder=
+
+Optional builder object. If omitted, the parser + uses the standard elementtree builder. +
+
encoding=
+
+Optional character encoding, if known. If omitted, + the parser looks for META tags inside the document. If no tags + are found, the parser defaults to ISO-8859-1. Note that if your + document uses a non-ASCII compatible encoding, you must decode + the document before parsing.
+

+
+
close() [#]
+
+

Flushes parser buffers, and return the root element.

+
+
Returns:
+
+An Element instance.
+

+
+
handle_charref(char) [#]
+
+

(Internal) Handles character references.

+
+
handle_data(data) [#]
+
+

(Internal) Handles character data.

+
+
handle_endtag(tag) [#]
+
+

(Internal) Handles end tags.

+
+
handle_entityref(name) [#]
+
+

(Internal) Handles entity references.

+
+
handle_starttag(tag, attrs) [#]
+
+

(Internal) Handles start tags.

+
+
unknown_entityref(name) [#]
+
+

(Hook) Handles unknown entity references. The default action +is to ignore unknown entities.

+
+
+ Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SgmlopXMLTreeBuilder.html Wed Dec 14 19:33:39 2005 @@ -1,50 +1,50 @@ - - - - -The elementtree.SgmlopXMLTreeBuilder Module - - - -

The elementtree.SgmlopXMLTreeBuilder Module

-

Tools to build element trees from XML, based on the SGMLOP parser. -

-The current version does not support XML namespaces. -

-This tree builder requires the sgmlop extension module -(available from -http://effbot.org/downloads). -

Module Contents

-
-
TreeBuilder(html=0) (class) [#]
-
-

ElementTree builder for XML source data, based on the SGMLOP parser.

-

For more information about this class, see The TreeBuilder Class.

-
-
-

The TreeBuilder Class

-
-
TreeBuilder(html=0) (class) [#]
-
-

ElementTree builder for XML source data, based on the SGMLOP parser.

-
-
close() ⇒ Element [#]
-
-

Finishes feeding data to the parser.

-
-
Returns:
-
-An element structure.
-

-
-
feed(data) [#]
-
-

Feeds data to the parser.

-
-
data
-
-Encoded data.
-

-
-
- + + + + +The elementtree.SgmlopXMLTreeBuilder Module + + + +

The elementtree.SgmlopXMLTreeBuilder Module

+

Tools to build element trees from XML, based on the SGMLOP parser. +

+The current version does not support XML namespaces. +

+This tree builder requires the sgmlop extension module +(available from +http://effbot.org/downloads). +

Module Contents

+
+
TreeBuilder(html=0) (class) [#]
+
+

ElementTree builder for XML source data, based on the SGMLOP parser.

+

For more information about this class, see The TreeBuilder Class.

+
+
+

The TreeBuilder Class

+
+
TreeBuilder(html=0) (class) [#]
+
+

ElementTree builder for XML source data, based on the SGMLOP parser.

+
+
close() ⇒ Element [#]
+
+

Finishes feeding data to the parser.

+
+
Returns:
+
+An element structure.
+

+
+
feed(data) [#]
+
+

Feeds data to the parser.

+
+
data
+
+Encoded data.
+

+
+
+ Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLTreeBuilder.html Wed Dec 14 19:33:39 2005 @@ -1,50 +1,50 @@ - - - - -The elementtree.SimpleXMLTreeBuilder Module - - - -

The elementtree.SimpleXMLTreeBuilder Module

-

Tools to build element trees from XML files, using xmllib. -This module can be used instead of the standard tree builder, for -Python versions where "expat" is not available (such as 1.5.2). -

-Note that due to bugs in xmllib, the namespace support is -not reliable (you can run the module as a script to find out exactly -how unreliable it is on your Python version). -

Module Contents

-
-
TreeBuilder(html=0) (class) [#]
-
-

ElementTree builder for XML source data.

-

For more information about this class, see The TreeBuilder Class.

-
-
-

The TreeBuilder Class

-
-
TreeBuilder(html=0) (class) [#]
-
-

ElementTree builder for XML source data.

-
-
close() ⇒ Element [#]
-
-

Finishes feeding data to the parser.

-
-
Returns:
-
-An element structure.
-

-
-
feed(data) [#]
-
-

Feeds data to the parser.

-
-
data
-
-Encoded data.
-

-
-
- + + + + +The elementtree.SimpleXMLTreeBuilder Module + + + +

The elementtree.SimpleXMLTreeBuilder Module

+

Tools to build element trees from XML files, using xmllib. +This module can be used instead of the standard tree builder, for +Python versions where "expat" is not available (such as 1.5.2). +

+Note that due to bugs in xmllib, the namespace support is +not reliable (you can run the module as a script to find out exactly +how unreliable it is on your Python version). +

Module Contents

+
+
TreeBuilder(html=0) (class) [#]
+
+

ElementTree builder for XML source data.

+

For more information about this class, see The TreeBuilder Class.

+
+
+

The TreeBuilder Class

+
+
TreeBuilder(html=0) (class) [#]
+
+

ElementTree builder for XML source data.

+
+
close() ⇒ Element [#]
+
+

Finishes feeding data to the parser.

+
+
Returns:
+
+An element structure.
+

+
+
feed(data) [#]
+
+

Feeds data to the parser.

+
+
data
+
+Encoded data.
+

+
+
+ Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLWriter.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLWriter.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.SimpleXMLWriter.html Wed Dec 14 19:33:39 2005 @@ -1,161 +1,161 @@ - - - - -The elementtree.SimpleXMLWriter Module - - - -

The elementtree.SimpleXMLWriter Module

-

Tools to write XML files, without having to deal with encoding -issues, well-formedness, etc. -

-The current version does not provide built-in support for -namespaces. To create files using namespaces, you have to provide -"xmlns" attributes and explicitly add prefixes to tags and -attributes. - -

Patterns

- -The following example generates a small XHTML document. -
-
-from elementtree.SimpleXMLWriter import XMLWriter
-import sys
-
-w = XMLWriter(sys.stdout)
-
-html = w.start("html")
-
-w.start("head")
-w.element("title", "my document")
-w.element("meta", name="generator", value="my application 1.0")
-w.end()
-
-w.start("body")
-w.element("h1", "this is a heading")
-w.element("p", "this is a paragraph")
-
-w.start("p")
-w.data("this is ")
-w.element("b", "bold")
-w.data(" and ")
-w.element("i", "italic")
-w.data(".")
-w.end("p")
-
-w.close(html)
-
-

Module Contents

-
-
XMLWriter(file, encoding="us-ascii") (class) [#]
-
-

XML writer class.

-
-
file
-
-A file or file-like object. This object must implement - a write method that takes an 8-bit string. -
-
encoding
-
-Optional encoding.
-

-

For more information about this class, see The XMLWriter Class.

-
-
-

The XMLWriter Class

-
-
XMLWriter(file, encoding="us-ascii") (class) [#]
-
-

XML writer class.

-
-
file
-
-A file or file-like object. This object must implement - a write method that takes an 8-bit string. -
-
encoding
-
-Optional encoding.
-

-
-
close(id) [#]
-
-

Closes open elements, up to (and including) the element identified -by the given identifier.

-
-
id
-
-Element identifier, as returned by the start method. -
-

-
-
comment(comment) [#]
-
-

Adds a comment to the output stream.

-
-
comment
-
-Comment text, as an 8-bit string or Unicode string.
-

-
-
data(text) [#]
-
-

Adds character data to the output stream.

-
-
text
-
-Character data, as an 8-bit string or Unicode string.
-

-
-
declaration() [#]
-
-

Writes an XML declaration.

-
-
element(tag, text=None, attrib={}, **extra) [#]
-
-

Adds an entire element. This is the same as calling start, -data, and end in sequence. The text argument -can be omitted. -

-
end(tag=None) [#]
-
-

Closes the current element (opened by the most recent call to -start). - -

-
tag
-
-Element tag. If given, the tag must match the start - tag. If omitted, the current element is closed.
-

-
-
flush() [#]
-
-

Flushes the output stream.

-
-
start(tag, attrib={}, **extra) [#]
-
-

Opens a new element. Attributes can be given as keyword -arguments, or as a string/string dictionary. You can pass in -8-bit strings or Unicode strings; the former are assumed to use -the encoding passed to the constructor. The method returns an -opaque identifier that can be passed to the close method, -to close all open elements up to and including this one. - -

-
tag
-
-Element tag.
-
attrib
-
-Attribute dictionary. Alternatively, attributes - can be given as keyword arguments.
-
Returns:
-
-An element identifier.
-

-
-
- + + + + +The elementtree.SimpleXMLWriter Module + + + +

The elementtree.SimpleXMLWriter Module

+

Tools to write XML files, without having to deal with encoding +issues, well-formedness, etc. +

+The current version does not provide built-in support for +namespaces. To create files using namespaces, you have to provide +"xmlns" attributes and explicitly add prefixes to tags and +attributes. + +

Patterns

+ +The following example generates a small XHTML document. +
+
+from elementtree.SimpleXMLWriter import XMLWriter
+import sys
+
+w = XMLWriter(sys.stdout)
+
+html = w.start("html")
+
+w.start("head")
+w.element("title", "my document")
+w.element("meta", name="generator", value="my application 1.0")
+w.end()
+
+w.start("body")
+w.element("h1", "this is a heading")
+w.element("p", "this is a paragraph")
+
+w.start("p")
+w.data("this is ")
+w.element("b", "bold")
+w.data(" and ")
+w.element("i", "italic")
+w.data(".")
+w.end("p")
+
+w.close(html)
+
+

Module Contents

+
+
XMLWriter(file, encoding="us-ascii") (class) [#]
+
+

XML writer class.

+
+
file
+
+A file or file-like object. This object must implement + a write method that takes an 8-bit string. +
+
encoding
+
+Optional encoding.
+

+

For more information about this class, see The XMLWriter Class.

+
+
+

The XMLWriter Class

+
+
XMLWriter(file, encoding="us-ascii") (class) [#]
+
+

XML writer class.

+
+
file
+
+A file or file-like object. This object must implement + a write method that takes an 8-bit string. +
+
encoding
+
+Optional encoding.
+

+
+
close(id) [#]
+
+

Closes open elements, up to (and including) the element identified +by the given identifier.

+
+
id
+
+Element identifier, as returned by the start method. +
+

+
+
comment(comment) [#]
+
+

Adds a comment to the output stream.

+
+
comment
+
+Comment text, as an 8-bit string or Unicode string.
+

+
+
data(text) [#]
+
+

Adds character data to the output stream.

+
+
text
+
+Character data, as an 8-bit string or Unicode string.
+

+
+
declaration() [#]
+
+

Writes an XML declaration.

+
+
element(tag, text=None, attrib={}, **extra) [#]
+
+

Adds an entire element. This is the same as calling start, +data, and end in sequence. The text argument +can be omitted. +

+
end(tag=None) [#]
+
+

Closes the current element (opened by the most recent call to +start). + +

+
tag
+
+Element tag. If given, the tag must match the start + tag. If omitted, the current element is closed.
+

+
+
flush() [#]
+
+

Flushes the output stream.

+
+
start(tag, attrib={}, **extra) [#]
+
+

Opens a new element. Attributes can be given as keyword +arguments, or as a string/string dictionary. You can pass in +8-bit strings or Unicode strings; the former are assumed to use +the encoding passed to the constructor. The method returns an +opaque identifier that can be passed to the close method, +to close all open elements up to and including this one. + +

+
tag
+
+Element tag.
+
attrib
+
+Attribute dictionary. Alternatively, attributes + can be given as keyword arguments.
+
Returns:
+
+An element identifier.
+

+
+
+ Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.TidyTools.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.TidyTools.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.TidyTools.html Wed Dec 14 19:33:39 2005 @@ -1,65 +1,65 @@ - - - - -The elementtree.TidyTools Module - - - -

The elementtree.TidyTools Module

-

Tools to build element trees from HTML, using the external tidy -utility. -

Module Contents

-
-
getbody(file, **options) [#]
-
-

Get document body from a an HTML or HTML-like file. This function -uses the tidy function to convert HTML to XHTML, and cleans -up the resulting XML tree. - -

-
file
-
-Filename.
-
Returns:
-
-A body element, or None if not successful. -
-

-
-
getzonebody(file, **options) [#]
-
-

Same as getbody, but turns plain text at the start of the -document into an H1 tag. This function can be used to parse zone -documents. - -

-
file
-
-Filename.
-
Returns:
-
-A body element, or None if not successful. -
-

-
-
tidy(file, new_inline_tags=None) [#]
-
-

Convert an HTML or HTML-like file to XHTML, using the tidy -command line utility. - -

-
file
-
-Filename.
-
new_inline_tags
-
-An optional list of valid but non-standard - inline tags.
-
Returns:
-
-An element tree, or None if not successful.
-

-
-
- + + + + +The elementtree.TidyTools Module + + + +

The elementtree.TidyTools Module

+

Tools to build element trees from HTML, using the external tidy +utility. +

Module Contents

+
+
getbody(file, **options) [#]
+
+

Get document body from a an HTML or HTML-like file. This function +uses the tidy function to convert HTML to XHTML, and cleans +up the resulting XML tree. + +

+
file
+
+Filename.
+
Returns:
+
+A body element, or None if not successful. +
+

+
+
getzonebody(file, **options) [#]
+
+

Same as getbody, but turns plain text at the start of the +document into an H1 tag. This function can be used to parse zone +documents. + +

+
file
+
+Filename.
+
Returns:
+
+A body element, or None if not successful. +
+

+
+
tidy(file, new_inline_tags=None) [#]
+
+

Convert an HTML or HTML-like file to XHTML, using the tidy +command line utility. + +

+
file
+
+Filename.
+
new_inline_tags
+
+An optional list of valid but non-standard + inline tags.
+
Returns:
+
+An element tree, or None if not successful.
+

+
+
+ Modified: external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.XMLTreeBuilder.html ============================================================================== --- external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.XMLTreeBuilder.html (original) +++ external/elementtree-1.2.6-20050316/docs/pythondoc-elementtree.XMLTreeBuilder.html Wed Dec 14 19:33:39 2005 @@ -1,70 +1,70 @@ - - - - -The elementtree.XMLTreeBuilder Module - - - -

The elementtree.XMLTreeBuilder Module

-

Tools to build element trees from XML files.

-

Module Contents

-
-
FancyTreeBuilder(html=0) (class) [#]
-
-

(experimental) An alternate builder that supports manipulation of -new elements.

-

For more information about this class, see The FancyTreeBuilder Class.

-
-
TreeBuilder (class) [#]
-
-

(obsolete) ElementTree builder for XML source data, based on the -expat parser.

-

For more information about this class, see The TreeBuilder Class.

-
-
-

The FancyTreeBuilder Class

-
-
FancyTreeBuilder(html=0) (class) [#]
-
-

(experimental) An alternate builder that supports manipulation of -new elements.

-
-
end(element) [#]
-
-

Hook method that's called when a new element has been closed. -May access the namespaces attribute. - -

-
element
-
-The new element.
-

-
-
start(element) [#]
-
-

Hook method that's called when a new element has been opened. -May access the namespaces attribute. - -

-
element
-
-The new element. The tag name and attributes are, - set, but it has no children, and the text and tail attributes - are still empty.
-

-
-
-

The TreeBuilder Class

-
-
TreeBuilder (class) [#]
-
-

(obsolete) ElementTree builder for XML source data, based on the -expat parser. -

-This class is an alias for ElementTree.XMLTreeBuilder. New code -should use that version instead. - -

-
- + + + + +The elementtree.XMLTreeBuilder Module + + + +

The elementtree.XMLTreeBuilder Module

+

Tools to build element trees from XML files.

+

Module Contents

+
+
FancyTreeBuilder(html=0) (class) [#]
+
+

(experimental) An alternate builder that supports manipulation of +new elements.

+

For more information about this class, see The FancyTreeBuilder Class.

+
+
TreeBuilder (class) [#]
+
+

(obsolete) ElementTree builder for XML source data, based on the +expat parser.

+

For more information about this class, see The TreeBuilder Class.

+
+
+

The FancyTreeBuilder Class

+
+
FancyTreeBuilder(html=0) (class) [#]
+
+

(experimental) An alternate builder that supports manipulation of +new elements.

+
+
end(element) [#]
+
+

Hook method that's called when a new element has been closed. +May access the namespaces attribute. + +

+
element
+
+The new element.
+

+
+
start(element) [#]
+
+

Hook method that's called when a new element has been opened. +May access the namespaces attribute. + +

+
element
+
+The new element. The tag name and attributes are, + set, but it has no children, and the text and tail attributes + are still empty.
+

+
+
+

The TreeBuilder Class

+
+
TreeBuilder (class) [#]
+
+

(obsolete) ElementTree builder for XML source data, based on the +expat parser. +

+This class is an alias for ElementTree.XMLTreeBuilder. New code +should use that version instead. + +

+
+ Modified: external/elementtree-1.2.6-20050316/elementtree/ElementInclude.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/ElementInclude.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/ElementInclude.py Wed Dec 14 19:33:39 2005 @@ -1,141 +1,141 @@ -# -# ElementTree -# $Id: ElementInclude.py 1862 2004-06-18 07:31:02Z Fredrik $ -# -# limited xinclude support for element trees -# -# history: -# 2003-08-15 fl created -# 2003-11-14 fl fixed default loader -# -# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Limited XInclude support for the ElementTree package. -## - -import copy -import ElementTree - -XINCLUDE = "{http://www.w3.org/2001/XInclude}" - -XINCLUDE_INCLUDE = XINCLUDE + "include" -XINCLUDE_FALLBACK = XINCLUDE + "fallback" - -## -# Fatal include error. - -class FatalIncludeError(SyntaxError): - pass - -## -# Default loader. This loader reads an included resource from disk. -# -# @param href Resource reference. -# @param parse Parse mode. Either "xml" or "text". -# @param encoding Optional text encoding. -# @return The expanded resource. If the parse mode is "xml", this -# is an ElementTree instance. If the parse mode is "text", this -# is a Unicode string. If the loader fails, it can return None -# or raise an IOError exception. -# @throws IOError If the loader fails to load the resource. - -def default_loader(href, parse, encoding=None): - file = open(href) - if parse == "xml": - data = ElementTree.parse(file).getroot() - else: - data = file.read() - if encoding: - data = data.decode(encoding) - file.close() - return data - -## -# Expand XInclude directives. -# -# @param elem Root element. -# @param loader Optional resource loader. If omitted, it defaults -# to {@link default_loader}. If given, it should be a callable -# that implements the same interface as default_loader. -# @throws FatalIncludeError If the function fails to include a given -# resource, or if the tree contains malformed XInclude elements. -# @throws IOError If the function fails to load a given resource. - -def include(elem, loader=None): - if loader is None: - loader = default_loader - # look for xinclude elements - i = 0 - while i < len(elem): - e = elem[i] - if e.tag == XINCLUDE_INCLUDE: - # process xinclude directive - href = e.get("href") - parse = e.get("parse", "xml") - if parse == "xml": - node = loader(href, parse) - if node is None: - raise FatalIncludeError( - "cannot load %r as %r" % (href, parse) - ) - node = copy.copy(node) - if e.tail: - node.tail = (node.tail or "") + e.tail - elem[i] = node - elif parse == "text": - text = loader(href, parse, e.get("encoding")) - if text is None: - raise FatalIncludeError( - "cannot load %r as %r" % (href, parse) - ) - if i: - node = elem[i-1] - node.tail = (node.tail or "") + text - else: - elem.text = (elem.text or "") + text + (e.tail or "") - del elem[i] - continue - else: - raise FatalIncludeError( - "unknown parse type in xi:include tag (%r)" % parse - ) - elif e.tag == XINCLUDE_FALLBACK: - raise FatalIncludeError( - "xi:fallback tag must be child of xi:include (%r)" % e.tag - ) - else: - include(e, loader) - i = i + 1 - +# +# ElementTree +# $Id: ElementInclude.py 1862 2004-06-18 07:31:02Z Fredrik $ +# +# limited xinclude support for element trees +# +# history: +# 2003-08-15 fl created +# 2003-11-14 fl fixed default loader +# +# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Limited XInclude support for the ElementTree package. +## + +import copy +import ElementTree + +XINCLUDE = "{http://www.w3.org/2001/XInclude}" + +XINCLUDE_INCLUDE = XINCLUDE + "include" +XINCLUDE_FALLBACK = XINCLUDE + "fallback" + +## +# Fatal include error. + +class FatalIncludeError(SyntaxError): + pass + +## +# Default loader. This loader reads an included resource from disk. +# +# @param href Resource reference. +# @param parse Parse mode. Either "xml" or "text". +# @param encoding Optional text encoding. +# @return The expanded resource. If the parse mode is "xml", this +# is an ElementTree instance. If the parse mode is "text", this +# is a Unicode string. If the loader fails, it can return None +# or raise an IOError exception. +# @throws IOError If the loader fails to load the resource. + +def default_loader(href, parse, encoding=None): + file = open(href) + if parse == "xml": + data = ElementTree.parse(file).getroot() + else: + data = file.read() + if encoding: + data = data.decode(encoding) + file.close() + return data + +## +# Expand XInclude directives. +# +# @param elem Root element. +# @param loader Optional resource loader. If omitted, it defaults +# to {@link default_loader}. If given, it should be a callable +# that implements the same interface as default_loader. +# @throws FatalIncludeError If the function fails to include a given +# resource, or if the tree contains malformed XInclude elements. +# @throws IOError If the function fails to load a given resource. + +def include(elem, loader=None): + if loader is None: + loader = default_loader + # look for xinclude elements + i = 0 + while i < len(elem): + e = elem[i] + if e.tag == XINCLUDE_INCLUDE: + # process xinclude directive + href = e.get("href") + parse = e.get("parse", "xml") + if parse == "xml": + node = loader(href, parse) + if node is None: + raise FatalIncludeError( + "cannot load %r as %r" % (href, parse) + ) + node = copy.copy(node) + if e.tail: + node.tail = (node.tail or "") + e.tail + elem[i] = node + elif parse == "text": + text = loader(href, parse, e.get("encoding")) + if text is None: + raise FatalIncludeError( + "cannot load %r as %r" % (href, parse) + ) + if i: + node = elem[i-1] + node.tail = (node.tail or "") + text + else: + elem.text = (elem.text or "") + text + (e.tail or "") + del elem[i] + continue + else: + raise FatalIncludeError( + "unknown parse type in xi:include tag (%r)" % parse + ) + elif e.tag == XINCLUDE_FALLBACK: + raise FatalIncludeError( + "xi:fallback tag must be child of xi:include (%r)" % e.tag + ) + else: + include(e, loader) + i = i + 1 + Modified: external/elementtree-1.2.6-20050316/elementtree/ElementPath.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/ElementPath.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/ElementPath.py Wed Dec 14 19:33:39 2005 @@ -1,196 +1,196 @@ -# -# ElementTree -# $Id: ElementPath.py 1858 2004-06-17 21:31:41Z Fredrik $ -# -# limited xpath support for element trees -# -# history: -# 2003-05-23 fl created -# 2003-05-28 fl added support for // etc -# 2003-08-27 fl fixed parsing of periods in element names -# -# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Implementation module for XPath support. There's usually no reason -# to import this module directly; the ElementTree does this for -# you, if needed. -## - -import re - -xpath_tokenizer = re.compile( - "(::|\.\.|\(\)|[/.*:\[\]\(\)@=])|((?:\{[^}]+\})?[^/:\[\]\(\)@=\s]+)|\s+" - ).findall - -class xpath_descendant_or_self: - pass - -## -# Wrapper for a compiled XPath. - -class Path: - - ## - # Create an Path instance from an XPath expression. - - def __init__(self, path): - tokens = xpath_tokenizer(path) - # the current version supports 'path/path'-style expressions only - self.path = [] - self.tag = None - if tokens and tokens[0][0] == "/": - raise SyntaxError("cannot use absolute path on element") - while tokens: - op, tag = tokens.pop(0) - if tag or op == "*": - self.path.append(tag or op) - elif op == ".": - pass - elif op == "/": - self.path.append(xpath_descendant_or_self()) - continue - else: - raise SyntaxError("unsupported path syntax (%s)" % op) - if tokens: - op, tag = tokens.pop(0) - if op != "/": - raise SyntaxError( - "expected path separator (%s)" % (op or tag) - ) - if self.path and isinstance(self.path[-1], xpath_descendant_or_self): - raise SyntaxError("path cannot end with //") - if len(self.path) == 1 and isinstance(self.path[0], type("")): - self.tag = self.path[0] - - ## - # Find first matching object. - - def find(self, element): - tag = self.tag - if tag is None: - nodeset = self.findall(element) - if not nodeset: - return None - return nodeset[0] - for elem in element: - if elem.tag == tag: - return elem - return None - - ## - # Find text for first matching object. - - def findtext(self, element, default=None): - tag = self.tag - if tag is None: - nodeset = self.findall(element) - if not nodeset: - return default - return nodeset[0].text or "" - for elem in element: - if elem.tag == tag: - return elem.text or "" - return default - - ## - # Find all matching objects. - - def findall(self, element): - nodeset = [element] - index = 0 - while 1: - try: - path = self.path[index] - index = index + 1 - except IndexError: - return nodeset - set = [] - if isinstance(path, xpath_descendant_or_self): - try: - tag = self.path[index] - if not isinstance(tag, type("")): - tag = None - else: - index = index + 1 - except IndexError: - tag = None # invalid path - for node in nodeset: - new = list(node.getiterator(tag)) - if new and new[0] is node: - set.extend(new[1:]) - else: - set.extend(new) - else: - for node in nodeset: - for node in node: - if path == "*" or node.tag == path: - set.append(node) - if not set: - return [] - nodeset = set - -_cache = {} - -## -# (Internal) Compile path. - -def _compile(path): - p = _cache.get(path) - if p is not None: - return p - p = Path(path) - if len(_cache) >= 100: - _cache.clear() - _cache[path] = p - return p - -## -# Find first matching object. - -def find(element, path): - return _compile(path).find(element) - -## -# Find text for first matching object. - -def findtext(element, path, default=None): - return _compile(path).findtext(element, default) - -## -# Find all matching objects. - -def findall(element, path): - return _compile(path).findall(element) - +# +# ElementTree +# $Id: ElementPath.py 1858 2004-06-17 21:31:41Z Fredrik $ +# +# limited xpath support for element trees +# +# history: +# 2003-05-23 fl created +# 2003-05-28 fl added support for // etc +# 2003-08-27 fl fixed parsing of periods in element names +# +# Copyright (c) 2003-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Implementation module for XPath support. There's usually no reason +# to import this module directly; the ElementTree does this for +# you, if needed. +## + +import re + +xpath_tokenizer = re.compile( + "(::|\.\.|\(\)|[/.*:\[\]\(\)@=])|((?:\{[^}]+\})?[^/:\[\]\(\)@=\s]+)|\s+" + ).findall + +class xpath_descendant_or_self: + pass + +## +# Wrapper for a compiled XPath. + +class Path: + + ## + # Create an Path instance from an XPath expression. + + def __init__(self, path): + tokens = xpath_tokenizer(path) + # the current version supports 'path/path'-style expressions only + self.path = [] + self.tag = None + if tokens and tokens[0][0] == "/": + raise SyntaxError("cannot use absolute path on element") + while tokens: + op, tag = tokens.pop(0) + if tag or op == "*": + self.path.append(tag or op) + elif op == ".": + pass + elif op == "/": + self.path.append(xpath_descendant_or_self()) + continue + else: + raise SyntaxError("unsupported path syntax (%s)" % op) + if tokens: + op, tag = tokens.pop(0) + if op != "/": + raise SyntaxError( + "expected path separator (%s)" % (op or tag) + ) + if self.path and isinstance(self.path[-1], xpath_descendant_or_self): + raise SyntaxError("path cannot end with //") + if len(self.path) == 1 and isinstance(self.path[0], type("")): + self.tag = self.path[0] + + ## + # Find first matching object. + + def find(self, element): + tag = self.tag + if tag is None: + nodeset = self.findall(element) + if not nodeset: + return None + return nodeset[0] + for elem in element: + if elem.tag == tag: + return elem + return None + + ## + # Find text for first matching object. + + def findtext(self, element, default=None): + tag = self.tag + if tag is None: + nodeset = self.findall(element) + if not nodeset: + return default + return nodeset[0].text or "" + for elem in element: + if elem.tag == tag: + return elem.text or "" + return default + + ## + # Find all matching objects. + + def findall(self, element): + nodeset = [element] + index = 0 + while 1: + try: + path = self.path[index] + index = index + 1 + except IndexError: + return nodeset + set = [] + if isinstance(path, xpath_descendant_or_self): + try: + tag = self.path[index] + if not isinstance(tag, type("")): + tag = None + else: + index = index + 1 + except IndexError: + tag = None # invalid path + for node in nodeset: + new = list(node.getiterator(tag)) + if new and new[0] is node: + set.extend(new[1:]) + else: + set.extend(new) + else: + for node in nodeset: + for node in node: + if path == "*" or node.tag == path: + set.append(node) + if not set: + return [] + nodeset = set + +_cache = {} + +## +# (Internal) Compile path. + +def _compile(path): + p = _cache.get(path) + if p is not None: + return p + p = Path(path) + if len(_cache) >= 100: + _cache.clear() + _cache[path] = p + return p + +## +# Find first matching object. + +def find(element, path): + return _compile(path).find(element) + +## +# Find text for first matching object. + +def findtext(element, path, default=None): + return _compile(path).findtext(element, default) + +## +# Find all matching objects. + +def findall(element, path): + return _compile(path).findall(element) + Modified: external/elementtree-1.2.6-20050316/elementtree/ElementTree.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/ElementTree.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/ElementTree.py Wed Dec 14 19:33:39 2005 @@ -1,1254 +1,1254 @@ -# -# ElementTree -# $Id: ElementTree.py 2326 2005-03-17 07:45:21Z fredrik $ -# -# light-weight XML support for Python 1.5.2 and later. -# -# history: -# 2001-10-20 fl created (from various sources) -# 2001-11-01 fl return root from parse method -# 2002-02-16 fl sort attributes in lexical order -# 2002-04-06 fl TreeBuilder refactoring, added PythonDoc markup -# 2002-05-01 fl finished TreeBuilder refactoring -# 2002-07-14 fl added basic namespace support to ElementTree.write -# 2002-07-25 fl added QName attribute support -# 2002-10-20 fl fixed encoding in write -# 2002-11-24 fl changed default encoding to ascii; fixed attribute encoding -# 2002-11-27 fl accept file objects or file names for parse/write -# 2002-12-04 fl moved XMLTreeBuilder back to this module -# 2003-01-11 fl fixed entity encoding glitch for us-ascii -# 2003-02-13 fl added XML literal factory -# 2003-02-21 fl added ProcessingInstruction/PI factory -# 2003-05-11 fl added tostring/fromstring helpers -# 2003-05-26 fl added ElementPath support -# 2003-07-05 fl added makeelement factory method -# 2003-07-28 fl added more well-known namespace prefixes -# 2003-08-15 fl fixed typo in ElementTree.findtext (Thomas Dartsch) -# 2003-09-04 fl fall back on emulator if ElementPath is not installed -# 2003-10-31 fl markup updates -# 2003-11-15 fl fixed nested namespace bug -# 2004-03-28 fl added XMLID helper -# 2004-06-02 fl added default support to findtext -# 2004-06-08 fl fixed encoding of non-ascii element/attribute names -# 2004-08-23 fl take advantage of post-2.1 expat features -# 2005-02-01 fl added iterparse implementation -# 2005-03-02 fl fixed iterparse support for pre-2.2 versions -# -# Copyright (c) 1999-2005 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2005 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -__all__ = [ - # public symbols - "Comment", - "dump", - "Element", "ElementTree", - "fromstring", - "iselement", "iterparse", - "parse", - "PI", "ProcessingInstruction", - "QName", - "SubElement", - "tostring", - "TreeBuilder", - "VERSION", "XML", - "XMLTreeBuilder", - ] - -## -# The Element type is a flexible container object, designed to -# store hierarchical data structures in memory. The type can be -# described as a cross between a list and a dictionary. -#

-# Each element has a number of properties associated with it: -#

    -#
  • a tag. This is a string identifying what kind of data -# this element represents (the element type, in other words).
  • -#
  • a number of attributes, stored in a Python dictionary.
  • -#
  • a text string.
  • -#
  • an optional tail string.
  • -#
  • a number of child elements, stored in a Python sequence
  • -#
-# -# To create an element instance, use the {@link #Element} or {@link -# #SubElement} factory functions. -#

-# The {@link #ElementTree} class can be used to wrap an element -# structure, and convert it from and to XML. -## - -import string, sys, re - -class _SimpleElementPath: - # emulate pre-1.2 find/findtext/findall behaviour - def find(self, element, tag): - for elem in element: - if elem.tag == tag: - return elem - return None - def findtext(self, element, tag, default=None): - for elem in element: - if elem.tag == tag: - return elem.text or "" - return default - def findall(self, element, tag): - if tag[:3] == ".//": - return element.getiterator(tag[3:]) - result = [] - for elem in element: - if elem.tag == tag: - result.append(elem) - return result - -try: - import ElementPath -except ImportError: - # FIXME: issue warning in this case? - ElementPath = _SimpleElementPath() - -# TODO: add support for custom namespace resolvers/default namespaces -# TODO: add improved support for incremental parsing - -VERSION = "1.2.6" - -## -# Internal element class. This class defines the Element interface, -# and provides a reference implementation of this interface. -#

-# You should not create instances of this class directly. Use the -# appropriate factory functions instead, such as {@link #Element} -# and {@link #SubElement}. -# -# @see Element -# @see SubElement -# @see Comment -# @see ProcessingInstruction - -class _ElementInterface: - # text...tail - - ## - # (Attribute) Element tag. - - tag = None - - ## - # (Attribute) Element attribute dictionary. Where possible, use - # {@link #_ElementInterface.get}, - # {@link #_ElementInterface.set}, - # {@link #_ElementInterface.keys}, and - # {@link #_ElementInterface.items} to access - # element attributes. - - attrib = None - - ## - # (Attribute) Text before first subelement. This is either a - # string or the value None, if there was no text. - - text = None - - ## - # (Attribute) Text after this element's end tag, but before the - # next sibling element's start tag. This is either a string or - # the value None, if there was no text. - - tail = None # text after end tag, if any - - def __init__(self, tag, attrib): - self.tag = tag - self.attrib = attrib - self._children = [] - - def __repr__(self): - return "" % (self.tag, id(self)) - - ## - # Creates a new element object of the same type as this element. - # - # @param tag Element tag. - # @param attrib Element attributes, given as a dictionary. - # @return A new element instance. - - def makeelement(self, tag, attrib): - return Element(tag, attrib) - - ## - # Returns the number of subelements. - # - # @return The number of subelements. - - def __len__(self): - return len(self._children) - - ## - # Returns the given subelement. - # - # @param index What subelement to return. - # @return The given subelement. - # @exception IndexError If the given element does not exist. - - def __getitem__(self, index): - return self._children[index] - - ## - # Replaces the given subelement. - # - # @param index What subelement to replace. - # @param element The new element value. - # @exception IndexError If the given element does not exist. - # @exception AssertionError If element is not a valid object. - - def __setitem__(self, index, element): - assert iselement(element) - self._children[index] = element - - ## - # Deletes the given subelement. - # - # @param index What subelement to delete. - # @exception IndexError If the given element does not exist. - - def __delitem__(self, index): - del self._children[index] - - ## - # Returns a list containing subelements in the given range. - # - # @param start The first subelement to return. - # @param stop The first subelement that shouldn't be returned. - # @return A sequence object containing subelements. - - def __getslice__(self, start, stop): - return self._children[start:stop] - - ## - # Replaces a number of subelements with elements from a sequence. - # - # @param start The first subelement to replace. - # @param stop The first subelement that shouldn't be replaced. - # @param elements A sequence object with zero or more elements. - # @exception AssertionError If a sequence member is not a valid object. - - def __setslice__(self, start, stop, elements): - for element in elements: - assert iselement(element) - self._children[start:stop] = list(elements) - - ## - # Deletes a number of subelements. - # - # @param start The first subelement to delete. - # @param stop The first subelement to leave in there. - - def __delslice__(self, start, stop): - del self._children[start:stop] - - ## - # Adds a subelement to the end of this element. - # - # @param element The element to add. - # @exception AssertionError If a sequence member is not a valid object. - - def append(self, element): - assert iselement(element) - self._children.append(element) - - ## - # Inserts a subelement at the given position in this element. - # - # @param index Where to insert the new subelement. - # @exception AssertionError If the element is not a valid object. - - def insert(self, index, element): - assert iselement(element) - self._children.insert(index, element) - - ## - # Removes a matching subelement. Unlike the find methods, - # this method compares elements based on identity, not on tag - # value or contents. - # - # @param element What element to remove. - # @exception ValueError If a matching element could not be found. - # @exception AssertionError If the element is not a valid object. - - def remove(self, element): - assert iselement(element) - self._children.remove(element) - - ## - # Returns all subelements. The elements are returned in document - # order. - # - # @return A list of subelements. - # @defreturn list of Element instances - - def getchildren(self): - return self._children - - ## - # Finds the first matching subelement, by tag name or path. - # - # @param path What element to look for. - # @return The first matching element, or None if no element was found. - # @defreturn Element or None - - def find(self, path): - return ElementPath.find(self, path) - - ## - # Finds text for the first matching subelement, by tag name or path. - # - # @param path What element to look for. - # @param default What to return if the element was not found. - # @return The text content of the first matching element, or the - # default value no element was found. Note that if the element - # has is found, but has no text content, this method returns an - # empty string. - # @defreturn string - - def findtext(self, path, default=None): - return ElementPath.findtext(self, path, default) - - ## - # Finds all matching subelements, by tag name or path. - # - # @param path What element to look for. - # @return A list or iterator containing all matching elements, - # in document order. - # @defreturn list of Element instances - - def findall(self, path): - return ElementPath.findall(self, path) - - ## - # Resets an element. This function removes all subelements, clears - # all attributes, and sets the text and tail attributes to None. - - def clear(self): - self.attrib.clear() - self._children = [] - self.text = self.tail = None - - ## - # Gets an element attribute. - # - # @param key What attribute to look for. - # @param default What to return if the attribute was not found. - # @return The attribute value, or the default value, if the - # attribute was not found. - # @defreturn string or None - - def get(self, key, default=None): - return self.attrib.get(key, default) - - ## - # Sets an element attribute. - # - # @param key What attribute to set. - # @param value The attribute value. - - def set(self, key, value): - self.attrib[key] = value - - ## - # Gets a list of attribute names. The names are returned in an - # arbitrary order (just like for an ordinary Python dictionary). - # - # @return A list of element attribute names. - # @defreturn list of strings - - def keys(self): - return self.attrib.keys() - - ## - # Gets element attributes, as a sequence. The attributes are - # returned in an arbitrary order. - # - # @return A list of (name, value) tuples for all attributes. - # @defreturn list of (string, string) tuples - - def items(self): - return self.attrib.items() - - ## - # Creates a tree iterator. The iterator loops over this element - # and all subelements, in document order, and returns all elements - # with a matching tag. - #

- # If the tree structure is modified during iteration, the result - # is undefined. - # - # @param tag What tags to look for (default is to return all elements). - # @return A list or iterator containing all the matching elements. - # @defreturn list or iterator - - def getiterator(self, tag=None): - nodes = [] - if tag == "*": - tag = None - if tag is None or self.tag == tag: - nodes.append(self) - for node in self._children: - nodes.extend(node.getiterator(tag)) - return nodes - -# compatibility -_Element = _ElementInterface - -## -# Element factory. This function returns an object implementing the -# standard Element interface. The exact class or type of that object -# is implementation dependent, but it will always be compatible with -# the {@link #_ElementInterface} class in this module. -#

-# The element name, attribute names, and attribute values can be -# either 8-bit ASCII strings or Unicode strings. -# -# @param tag The element name. -# @param attrib An optional dictionary, containing element attributes. -# @param **extra Additional attributes, given as keyword arguments. -# @return An element instance. -# @defreturn Element - -def Element(tag, attrib={}, **extra): - attrib = attrib.copy() - attrib.update(extra) - return _ElementInterface(tag, attrib) - -## -# Subelement factory. This function creates an element instance, and -# appends it to an existing element. -#

-# The element name, attribute names, and attribute values can be -# either 8-bit ASCII strings or Unicode strings. -# -# @param parent The parent element. -# @param tag The subelement name. -# @param attrib An optional dictionary, containing element attributes. -# @param **extra Additional attributes, given as keyword arguments. -# @return An element instance. -# @defreturn Element - -def SubElement(parent, tag, attrib={}, **extra): - attrib = attrib.copy() - attrib.update(extra) - element = parent.makeelement(tag, attrib) - parent.append(element) - return element - -## -# Comment element factory. This factory function creates a special -# element that will be serialized as an XML comment. -#

-# The comment string can be either an 8-bit ASCII string or a Unicode -# string. -# -# @param text A string containing the comment string. -# @return An element instance, representing a comment. -# @defreturn Element - -def Comment(text=None): - element = Element(Comment) - element.text = text - return element - -## -# PI element factory. This factory function creates a special element -# that will be serialized as an XML processing instruction. -# -# @param target A string containing the PI target. -# @param text A string containing the PI contents, if any. -# @return An element instance, representing a PI. -# @defreturn Element - -def ProcessingInstruction(target, text=None): - element = Element(ProcessingInstruction) - element.text = target - if text: - element.text = element.text + " " + text - return element - -PI = ProcessingInstruction - -## -# QName wrapper. This can be used to wrap a QName attribute value, in -# order to get proper namespace handling on output. -# -# @param text A string containing the QName value, in the form {uri}local, -# or, if the tag argument is given, the URI part of a QName. -# @param tag Optional tag. If given, the first argument is interpreted as -# an URI, and this argument is interpreted as a local name. -# @return An opaque object, representing the QName. - -class QName: - def __init__(self, text_or_uri, tag=None): - if tag: - text_or_uri = "{%s}%s" % (text_or_uri, tag) - self.text = text_or_uri - def __str__(self): - return self.text - def __hash__(self): - return hash(self.text) - def __cmp__(self, other): - if isinstance(other, QName): - return cmp(self.text, other.text) - return cmp(self.text, other) - -## -# ElementTree wrapper class. This class represents an entire element -# hierarchy, and adds some extra support for serialization to and from -# standard XML. -# -# @param element Optional root element. -# @keyparam file Optional file handle or name. If given, the -# tree is initialized with the contents of this XML file. - -class ElementTree: - - def __init__(self, element=None, file=None): - assert element is None or iselement(element) - self._root = element # first node - if file: - self.parse(file) - - ## - # Gets the root element for this tree. - # - # @return An element instance. - # @defreturn Element - - def getroot(self): - return self._root - - ## - # Replaces the root element for this tree. This discards the - # current contents of the tree, and replaces it with the given - # element. Use with care. - # - # @param element An element instance. - - def _setroot(self, element): - assert iselement(element) - self._root = element - - ## - # Loads an external XML document into this element tree. - # - # @param source A file name or file object. - # @param parser An optional parser instance. If not given, the - # standard {@link XMLTreeBuilder} parser is used. - # @return The document root element. - # @defreturn Element - - def parse(self, source, parser=None): - if not hasattr(source, "read"): - source = open(source, "rb") - if not parser: - parser = XMLTreeBuilder() - while 1: - data = source.read(32768) - if not data: - break - parser.feed(data) - self._root = parser.close() - return self._root - - ## - # Creates a tree iterator for the root element. The iterator loops - # over all elements in this tree, in document order. - # - # @param tag What tags to look for (default is to return all elements) - # @return An iterator. - # @defreturn iterator - - def getiterator(self, tag=None): - assert self._root is not None - return self._root.getiterator(tag) - - ## - # Finds the first toplevel element with given tag. - # Same as getroot().find(path). - # - # @param path What element to look for. - # @return The first matching element, or None if no element was found. - # @defreturn Element or None - - def find(self, path): - assert self._root is not None - if path[:1] == "/": - path = "." + path - return self._root.find(path) - - ## - # Finds the element text for the first toplevel element with given - # tag. Same as getroot().findtext(path). - # - # @param path What toplevel element to look for. - # @param default What to return if the element was not found. - # @return The text content of the first matching element, or the - # default value no element was found. Note that if the element - # has is found, but has no text content, this method returns an - # empty string. - # @defreturn string - - def findtext(self, path, default=None): - assert self._root is not None - if path[:1] == "/": - path = "." + path - return self._root.findtext(path, default) - - ## - # Finds all toplevel elements with the given tag. - # Same as getroot().findall(path). - # - # @param path What element to look for. - # @return A list or iterator containing all matching elements, - # in document order. - # @defreturn list of Element instances - - def findall(self, path): - assert self._root is not None - if path[:1] == "/": - path = "." + path - return self._root.findall(path) - - ## - # Writes the element tree to a file, as XML. - # - # @param file A file name, or a file object opened for writing. - # @param encoding Optional output encoding (default is US-ASCII). - - def write(self, file, encoding="us-ascii"): - assert self._root is not None - if not hasattr(file, "write"): - file = open(file, "wb") - if not encoding: - encoding = "us-ascii" - elif encoding != "utf-8" and encoding != "us-ascii": - file.write("\n" % encoding) - self._write(file, self._root, encoding, {}) - - def _write(self, file, node, encoding, namespaces): - # write XML to file - tag = node.tag - if tag is Comment: - file.write("" % _escape_cdata(node.text, encoding)) - elif tag is ProcessingInstruction: - file.write("" % _escape_cdata(node.text, encoding)) - else: - items = node.items() - xmlns_items = [] # new namespaces in this scope - try: - if isinstance(tag, QName) or tag[:1] == "{": - tag, xmlns = fixtag(tag, namespaces) - if xmlns: xmlns_items.append(xmlns) - except TypeError: - _raise_serialization_error(tag) - file.write("<" + _encode(tag, encoding)) - if items or xmlns_items: - items.sort() # lexical order - for k, v in items: - try: - if isinstance(k, QName) or k[:1] == "{": - k, xmlns = fixtag(k, namespaces) - if xmlns: xmlns_items.append(xmlns) - except TypeError: - _raise_serialization_error(k) - try: - if isinstance(v, QName): - v, xmlns = fixtag(v, namespaces) - if xmlns: xmlns_items.append(xmlns) - except TypeError: - _raise_serialization_error(v) - file.write(" %s=\"%s\"" % (_encode(k, encoding), - _escape_attrib(v, encoding))) - for k, v in xmlns_items: - file.write(" %s=\"%s\"" % (_encode(k, encoding), - _escape_attrib(v, encoding))) - if node.text or len(node): - file.write(">") - if node.text: - file.write(_escape_cdata(node.text, encoding)) - for n in node: - self._write(file, n, encoding, namespaces) - file.write("") - else: - file.write(" />") - for k, v in xmlns_items: - del namespaces[v] - if node.tail: - file.write(_escape_cdata(node.tail, encoding)) - -# -------------------------------------------------------------------- -# helpers - -## -# Checks if an object appears to be a valid element object. -# -# @param An element instance. -# @return A true value if this is an element object. -# @defreturn flag - -def iselement(element): - # FIXME: not sure about this; might be a better idea to look - # for tag/attrib/text attributes - return isinstance(element, _ElementInterface) or hasattr(element, "tag") - -## -# Writes an element tree or element structure to sys.stdout. This -# function should be used for debugging only. -#

-# The exact output format is implementation dependent. In this -# version, it's written as an ordinary XML file. -# -# @param elem An element tree or an individual element. - -def dump(elem): - # debugging - if not isinstance(elem, ElementTree): - elem = ElementTree(elem) - elem.write(sys.stdout) - tail = elem.getroot().tail - if not tail or tail[-1] != "\n": - sys.stdout.write("\n") - -def _encode(s, encoding): - try: - return s.encode(encoding) - except AttributeError: - return s # 1.5.2: assume the string uses the right encoding - -if sys.version[:3] == "1.5": - _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2 -else: - _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) - -_escape_map = { - "&": "&", - "<": "<", - ">": ">", - '"': """, -} - -_namespace_map = { - # "well-known" namespace prefixes - "http://www.w3.org/XML/1998/namespace": "xml", - "http://www.w3.org/1999/xhtml": "html", - "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", - "http://schemas.xmlsoap.org/wsdl/": "wsdl", -} - -def _raise_serialization_error(text): - raise TypeError( - "cannot serialize %r (type %s)" % (text, type(text).__name__) - ) - -def _encode_entity(text, pattern=_escape): - # map reserved and non-ascii characters to numerical entities - def escape_entities(m, map=_escape_map): - out = [] - append = out.append - for char in m.group(): - text = map.get(char) - if text is None: - text = "&#%d;" % ord(char) - append(text) - return string.join(out, "") - try: - return _encode(pattern.sub(escape_entities, text), "ascii") - except TypeError: - _raise_serialization_error(text) - -# -# the following functions assume an ascii-compatible encoding -# (or "utf-16") - -def _escape_cdata(text, encoding=None, replace=string.replace): - # escape character data - try: - if encoding: - try: - text = _encode(text, encoding) - except UnicodeError: - return _encode_entity(text) - text = replace(text, "&", "&") - text = replace(text, "<", "<") - text = replace(text, ">", ">") - return text - except (TypeError, AttributeError): - _raise_serialization_error(text) - -def _escape_attrib(text, encoding=None, replace=string.replace): - # escape attribute value - try: - if encoding: - try: - text = _encode(text, encoding) - except UnicodeError: - return _encode_entity(text) - text = replace(text, "&", "&") - text = replace(text, "'", "'") # FIXME: overkill - text = replace(text, "\"", """) - text = replace(text, "<", "<") - text = replace(text, ">", ">") - return text - except (TypeError, AttributeError): - _raise_serialization_error(text) - -def fixtag(tag, namespaces): - # given a decorated tag (of the form {uri}tag), return prefixed - # tag and namespace declaration, if any - if isinstance(tag, QName): - tag = tag.text - namespace_uri, tag = string.split(tag[1:], "}", 1) - prefix = namespaces.get(namespace_uri) - if prefix is None: - prefix = _namespace_map.get(namespace_uri) - if prefix is None: - prefix = "ns%d" % len(namespaces) - namespaces[namespace_uri] = prefix - if prefix == "xml": - xmlns = None - else: - xmlns = ("xmlns:%s" % prefix, namespace_uri) - else: - xmlns = None - return "%s:%s" % (prefix, tag), xmlns - -## -# Parses an XML document into an element tree. -# -# @param source A filename or file object containing XML data. -# @param parser An optional parser instance. If not given, the -# standard {@link XMLTreeBuilder} parser is used. -# @return An ElementTree instance - -def parse(source, parser=None): - tree = ElementTree() - tree.parse(source, parser) - return tree - -## -# Parses an XML document into an element tree incrementally, and reports -# what's going on to the user. -# -# @param source A filename or file object containing XML data. -# @param events A list of events to report back. If omitted, only "end" -# events are reported. -# @return A (event, elem) iterator. - -class iterparse: - - def __init__(self, source, events=None): - if not hasattr(source, "read"): - source = open(source, "rb") - self._file = source - self._events = [] - self._index = 0 - self.root = self._root = None - self._parser = XMLTreeBuilder() - # wire up the parser for event reporting - parser = self._parser._parser - append = self._events.append - if events is None: - events = ["end"] - for event in events: - if event == "start": - try: - parser.ordered_attributes = 1 - parser.specified_attributes = 1 - def handler(tag, attrib_in, event=event, append=append, - start=self._parser._start_list): - append((event, start(tag, attrib_in))) - parser.StartElementHandler = handler - except AttributeError: - def handler(tag, attrib_in, event=event, append=append, - start=self._parser._start): - append((event, start(tag, attrib_in))) - parser.StartElementHandler = handler - elif event == "end": - def handler(tag, event=event, append=append, - end=self._parser._end): - append((event, end(tag))) - parser.EndElementHandler = handler - elif event == "start-ns": - def handler(prefix, uri, event=event, append=append): - try: - uri = _encode(uri, "ascii") - except UnicodeError: - pass - append((event, (prefix or "", uri))) - parser.StartNamespaceDeclHandler = handler - elif event == "end-ns": - def handler(prefix, event=event, append=append): - append((event, None)) - parser.EndNamespaceDeclHandler = handler - - def next(self): - while 1: - try: - item = self._events[self._index] - except IndexError: - if self._parser is None: - self.root = self._root - try: - raise StopIteration - except NameError: - raise IndexError - # load event buffer - del self._events[:] - self._index = 0 - data = self._file.read(16384) - if data: - self._parser.feed(data) - else: - self._root = self._parser.close() - self._parser = None - else: - self._index = self._index + 1 - return item - - try: - iter - def __iter__(self): - return self - except NameError: - def __getitem__(self, index): - return self.next() - -## -# Parses an XML document from a string constant. This function can -# be used to embed "XML literals" in Python code. -# -# @param source A string containing XML data. -# @return An Element instance. -# @defreturn Element - -def XML(text): - parser = XMLTreeBuilder() - parser.feed(text) - return parser.close() - -## -# Parses an XML document from a string constant, and also returns -# a dictionary which maps from element id:s to elements. -# -# @param source A string containing XML data. -# @return A tuple containing an Element instance and a dictionary. -# @defreturn (Element, dictionary) - -def XMLID(text): - parser = XMLTreeBuilder() - parser.feed(text) - tree = parser.close() - ids = {} - for elem in tree.getiterator(): - id = elem.get("id") - if id: - ids[id] = elem - return tree, ids - -## -# Parses an XML document from a string constant. Same as {@link #XML}. -# -# @def fromstring(text) -# @param source A string containing XML data. -# @return An Element instance. -# @defreturn Element - -fromstring = XML - -## -# Generates a string representation of an XML element, including all -# subelements. -# -# @param element An Element instance. -# @return An encoded string containing the XML data. -# @defreturn string - -def tostring(element, encoding=None): - class dummy: - pass - data = [] - file = dummy() - file.write = data.append - ElementTree(element).write(file, encoding) - return string.join(data, "") - -## -# Generic element structure builder. This builder converts a sequence -# of {@link #TreeBuilder.start}, {@link #TreeBuilder.data}, and {@link -# #TreeBuilder.end} method calls to a well-formed element structure. -#

-# You can use this class to build an element structure using a custom XML -# parser, or a parser for some other XML-like format. -# -# @param element_factory Optional element factory. This factory -# is called to create new Element instances, as necessary. - -class TreeBuilder: - - def __init__(self, element_factory=None): - self._data = [] # data collector - self._elem = [] # element stack - self._last = None # last element - self._tail = None # true if we're after an end tag - if element_factory is None: - element_factory = _ElementInterface - self._factory = element_factory - - ## - # Flushes the parser buffers, and returns the toplevel documen - # element. - # - # @return An Element instance. - # @defreturn Element - - def close(self): - assert len(self._elem) == 0, "missing end tags" - assert self._last != None, "missing toplevel element" - return self._last - - def _flush(self): - if self._data: - if self._last is not None: - text = string.join(self._data, "") - if self._tail: - assert self._last.tail is None, "internal error (tail)" - self._last.tail = text - else: - assert self._last.text is None, "internal error (text)" - self._last.text = text - self._data = [] - - ## - # Adds text to the current element. - # - # @param data A string. This should be either an 8-bit string - # containing ASCII text, or a Unicode string. - - def data(self, data): - self._data.append(data) - - ## - # Opens a new element. - # - # @param tag The element name. - # @param attrib A dictionary containing element attributes. - # @return The opened element. - # @defreturn Element - - def start(self, tag, attrs): - self._flush() - self._last = elem = self._factory(tag, attrs) - if self._elem: - self._elem[-1].append(elem) - self._elem.append(elem) - self._tail = 0 - return elem - - ## - # Closes the current element. - # - # @param tag The element name. - # @return The closed element. - # @defreturn Element - - def end(self, tag): - self._flush() - self._last = self._elem.pop() - assert self._last.tag == tag,\ - "end tag mismatch (expected %s, got %s)" % ( - self._last.tag, tag) - self._tail = 1 - return self._last - -## -# Element structure builder for XML source data, based on the -# expat parser. -# -# @keyparam target Target object. If omitted, the builder uses an -# instance of the standard {@link #TreeBuilder} class. -# @keyparam html Predefine HTML entities. This flag is not supported -# by the current implementation. -# @see #ElementTree -# @see #TreeBuilder - -class XMLTreeBuilder: - - def __init__(self, html=0, target=None): - try: - from xml.parsers import expat - except ImportError: - raise ImportError( - "No module named expat; use SimpleXMLTreeBuilder instead" - ) - self._parser = parser = expat.ParserCreate(None, "}") - if target is None: - target = TreeBuilder() - self._target = target - self._names = {} # name memo cache - # callbacks - parser.DefaultHandlerExpand = self._default - parser.StartElementHandler = self._start - parser.EndElementHandler = self._end - parser.CharacterDataHandler = self._data - # let expat do the buffering, if supported - try: - self._parser.buffer_text = 1 - except AttributeError: - pass - # use new-style attribute handling, if supported - try: - self._parser.ordered_attributes = 1 - self._parser.specified_attributes = 1 - parser.StartElementHandler = self._start_list - except AttributeError: - pass - encoding = None - if not parser.returns_unicode: - encoding = "utf-8" - # target.xml(encoding, None) - self._doctype = None - self.entity = {} - - def _fixtext(self, text): - # convert text string to ascii, if possible - try: - return _encode(text, "ascii") - except UnicodeError: - return text - - def _fixname(self, key): - # expand qname, and convert name string to ascii, if possible - try: - name = self._names[key] - except KeyError: - name = key - if "}" in name: - name = "{" + name - self._names[key] = name = self._fixtext(name) - return name - - def _start(self, tag, attrib_in): - fixname = self._fixname - tag = fixname(tag) - attrib = {} - for key, value in attrib_in.items(): - attrib[fixname(key)] = self._fixtext(value) - return self._target.start(tag, attrib) - - def _start_list(self, tag, attrib_in): - fixname = self._fixname - tag = fixname(tag) - attrib = {} - if attrib_in: - for i in range(0, len(attrib_in), 2): - attrib[fixname(attrib_in[i])] = self._fixtext(attrib_in[i+1]) - return self._target.start(tag, attrib) - - def _data(self, text): - return self._target.data(self._fixtext(text)) - - def _end(self, tag): - return self._target.end(self._fixname(tag)) - - def _default(self, text): - prefix = text[:1] - if prefix == "&": - # deal with undefined entities - try: - self._target.data(self.entity[text[1:-1]]) - except KeyError: - from xml.parsers import expat - raise expat.error( - "undefined entity %s: line %d, column %d" % - (text, self._parser.ErrorLineNumber, - self._parser.ErrorColumnNumber) - ) - elif prefix == "<" and text[:9] == "": - self._doctype = None - return - text = string.strip(text) - if not text: - return - self._doctype.append(text) - n = len(self._doctype) - if n > 2: - type = self._doctype[1] - if type == "PUBLIC" and n == 4: - name, type, pubid, system = self._doctype - elif type == "SYSTEM" and n == 3: - name, type, system = self._doctype - pubid = None - else: - return - if pubid: - pubid = pubid[1:-1] - self.doctype(name, pubid, system[1:-1]) - self._doctype = None - - ## - # Handles a doctype declaration. - # - # @param name Doctype name. - # @param pubid Public identifier. - # @param system System identifier. - - def doctype(self, name, pubid, system): - pass - - ## - # Feeds data to the parser. - # - # @param data Encoded data. - - def feed(self, data): - self._parser.Parse(data, 0) - - ## - # Finishes feeding data to the parser. - # - # @return An element structure. - # @defreturn Element - - def close(self): - self._parser.Parse("", 1) # end of data - tree = self._target.close() - del self._target, self._parser # get rid of circular references - return tree +# +# ElementTree +# $Id: ElementTree.py 2326 2005-03-17 07:45:21Z fredrik $ +# +# light-weight XML support for Python 1.5.2 and later. +# +# history: +# 2001-10-20 fl created (from various sources) +# 2001-11-01 fl return root from parse method +# 2002-02-16 fl sort attributes in lexical order +# 2002-04-06 fl TreeBuilder refactoring, added PythonDoc markup +# 2002-05-01 fl finished TreeBuilder refactoring +# 2002-07-14 fl added basic namespace support to ElementTree.write +# 2002-07-25 fl added QName attribute support +# 2002-10-20 fl fixed encoding in write +# 2002-11-24 fl changed default encoding to ascii; fixed attribute encoding +# 2002-11-27 fl accept file objects or file names for parse/write +# 2002-12-04 fl moved XMLTreeBuilder back to this module +# 2003-01-11 fl fixed entity encoding glitch for us-ascii +# 2003-02-13 fl added XML literal factory +# 2003-02-21 fl added ProcessingInstruction/PI factory +# 2003-05-11 fl added tostring/fromstring helpers +# 2003-05-26 fl added ElementPath support +# 2003-07-05 fl added makeelement factory method +# 2003-07-28 fl added more well-known namespace prefixes +# 2003-08-15 fl fixed typo in ElementTree.findtext (Thomas Dartsch) +# 2003-09-04 fl fall back on emulator if ElementPath is not installed +# 2003-10-31 fl markup updates +# 2003-11-15 fl fixed nested namespace bug +# 2004-03-28 fl added XMLID helper +# 2004-06-02 fl added default support to findtext +# 2004-06-08 fl fixed encoding of non-ascii element/attribute names +# 2004-08-23 fl take advantage of post-2.1 expat features +# 2005-02-01 fl added iterparse implementation +# 2005-03-02 fl fixed iterparse support for pre-2.2 versions +# +# Copyright (c) 1999-2005 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2005 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +__all__ = [ + # public symbols + "Comment", + "dump", + "Element", "ElementTree", + "fromstring", + "iselement", "iterparse", + "parse", + "PI", "ProcessingInstruction", + "QName", + "SubElement", + "tostring", + "TreeBuilder", + "VERSION", "XML", + "XMLTreeBuilder", + ] + +## +# The Element type is a flexible container object, designed to +# store hierarchical data structures in memory. The type can be +# described as a cross between a list and a dictionary. +#

+# Each element has a number of properties associated with it: +#

    +#
  • a tag. This is a string identifying what kind of data +# this element represents (the element type, in other words).
  • +#
  • a number of attributes, stored in a Python dictionary.
  • +#
  • a text string.
  • +#
  • an optional tail string.
  • +#
  • a number of child elements, stored in a Python sequence
  • +#
+# +# To create an element instance, use the {@link #Element} or {@link +# #SubElement} factory functions. +#

+# The {@link #ElementTree} class can be used to wrap an element +# structure, and convert it from and to XML. +## + +import string, sys, re + +class _SimpleElementPath: + # emulate pre-1.2 find/findtext/findall behaviour + def find(self, element, tag): + for elem in element: + if elem.tag == tag: + return elem + return None + def findtext(self, element, tag, default=None): + for elem in element: + if elem.tag == tag: + return elem.text or "" + return default + def findall(self, element, tag): + if tag[:3] == ".//": + return element.getiterator(tag[3:]) + result = [] + for elem in element: + if elem.tag == tag: + result.append(elem) + return result + +try: + import ElementPath +except ImportError: + # FIXME: issue warning in this case? + ElementPath = _SimpleElementPath() + +# TODO: add support for custom namespace resolvers/default namespaces +# TODO: add improved support for incremental parsing + +VERSION = "1.2.6" + +## +# Internal element class. This class defines the Element interface, +# and provides a reference implementation of this interface. +#

+# You should not create instances of this class directly. Use the +# appropriate factory functions instead, such as {@link #Element} +# and {@link #SubElement}. +# +# @see Element +# @see SubElement +# @see Comment +# @see ProcessingInstruction + +class _ElementInterface: + # text...tail + + ## + # (Attribute) Element tag. + + tag = None + + ## + # (Attribute) Element attribute dictionary. Where possible, use + # {@link #_ElementInterface.get}, + # {@link #_ElementInterface.set}, + # {@link #_ElementInterface.keys}, and + # {@link #_ElementInterface.items} to access + # element attributes. + + attrib = None + + ## + # (Attribute) Text before first subelement. This is either a + # string or the value None, if there was no text. + + text = None + + ## + # (Attribute) Text after this element's end tag, but before the + # next sibling element's start tag. This is either a string or + # the value None, if there was no text. + + tail = None # text after end tag, if any + + def __init__(self, tag, attrib): + self.tag = tag + self.attrib = attrib + self._children = [] + + def __repr__(self): + return "" % (self.tag, id(self)) + + ## + # Creates a new element object of the same type as this element. + # + # @param tag Element tag. + # @param attrib Element attributes, given as a dictionary. + # @return A new element instance. + + def makeelement(self, tag, attrib): + return Element(tag, attrib) + + ## + # Returns the number of subelements. + # + # @return The number of subelements. + + def __len__(self): + return len(self._children) + + ## + # Returns the given subelement. + # + # @param index What subelement to return. + # @return The given subelement. + # @exception IndexError If the given element does not exist. + + def __getitem__(self, index): + return self._children[index] + + ## + # Replaces the given subelement. + # + # @param index What subelement to replace. + # @param element The new element value. + # @exception IndexError If the given element does not exist. + # @exception AssertionError If element is not a valid object. + + def __setitem__(self, index, element): + assert iselement(element) + self._children[index] = element + + ## + # Deletes the given subelement. + # + # @param index What subelement to delete. + # @exception IndexError If the given element does not exist. + + def __delitem__(self, index): + del self._children[index] + + ## + # Returns a list containing subelements in the given range. + # + # @param start The first subelement to return. + # @param stop The first subelement that shouldn't be returned. + # @return A sequence object containing subelements. + + def __getslice__(self, start, stop): + return self._children[start:stop] + + ## + # Replaces a number of subelements with elements from a sequence. + # + # @param start The first subelement to replace. + # @param stop The first subelement that shouldn't be replaced. + # @param elements A sequence object with zero or more elements. + # @exception AssertionError If a sequence member is not a valid object. + + def __setslice__(self, start, stop, elements): + for element in elements: + assert iselement(element) + self._children[start:stop] = list(elements) + + ## + # Deletes a number of subelements. + # + # @param start The first subelement to delete. + # @param stop The first subelement to leave in there. + + def __delslice__(self, start, stop): + del self._children[start:stop] + + ## + # Adds a subelement to the end of this element. + # + # @param element The element to add. + # @exception AssertionError If a sequence member is not a valid object. + + def append(self, element): + assert iselement(element) + self._children.append(element) + + ## + # Inserts a subelement at the given position in this element. + # + # @param index Where to insert the new subelement. + # @exception AssertionError If the element is not a valid object. + + def insert(self, index, element): + assert iselement(element) + self._children.insert(index, element) + + ## + # Removes a matching subelement. Unlike the find methods, + # this method compares elements based on identity, not on tag + # value or contents. + # + # @param element What element to remove. + # @exception ValueError If a matching element could not be found. + # @exception AssertionError If the element is not a valid object. + + def remove(self, element): + assert iselement(element) + self._children.remove(element) + + ## + # Returns all subelements. The elements are returned in document + # order. + # + # @return A list of subelements. + # @defreturn list of Element instances + + def getchildren(self): + return self._children + + ## + # Finds the first matching subelement, by tag name or path. + # + # @param path What element to look for. + # @return The first matching element, or None if no element was found. + # @defreturn Element or None + + def find(self, path): + return ElementPath.find(self, path) + + ## + # Finds text for the first matching subelement, by tag name or path. + # + # @param path What element to look for. + # @param default What to return if the element was not found. + # @return The text content of the first matching element, or the + # default value no element was found. Note that if the element + # has is found, but has no text content, this method returns an + # empty string. + # @defreturn string + + def findtext(self, path, default=None): + return ElementPath.findtext(self, path, default) + + ## + # Finds all matching subelements, by tag name or path. + # + # @param path What element to look for. + # @return A list or iterator containing all matching elements, + # in document order. + # @defreturn list of Element instances + + def findall(self, path): + return ElementPath.findall(self, path) + + ## + # Resets an element. This function removes all subelements, clears + # all attributes, and sets the text and tail attributes to None. + + def clear(self): + self.attrib.clear() + self._children = [] + self.text = self.tail = None + + ## + # Gets an element attribute. + # + # @param key What attribute to look for. + # @param default What to return if the attribute was not found. + # @return The attribute value, or the default value, if the + # attribute was not found. + # @defreturn string or None + + def get(self, key, default=None): + return self.attrib.get(key, default) + + ## + # Sets an element attribute. + # + # @param key What attribute to set. + # @param value The attribute value. + + def set(self, key, value): + self.attrib[key] = value + + ## + # Gets a list of attribute names. The names are returned in an + # arbitrary order (just like for an ordinary Python dictionary). + # + # @return A list of element attribute names. + # @defreturn list of strings + + def keys(self): + return self.attrib.keys() + + ## + # Gets element attributes, as a sequence. The attributes are + # returned in an arbitrary order. + # + # @return A list of (name, value) tuples for all attributes. + # @defreturn list of (string, string) tuples + + def items(self): + return self.attrib.items() + + ## + # Creates a tree iterator. The iterator loops over this element + # and all subelements, in document order, and returns all elements + # with a matching tag. + #

+ # If the tree structure is modified during iteration, the result + # is undefined. + # + # @param tag What tags to look for (default is to return all elements). + # @return A list or iterator containing all the matching elements. + # @defreturn list or iterator + + def getiterator(self, tag=None): + nodes = [] + if tag == "*": + tag = None + if tag is None or self.tag == tag: + nodes.append(self) + for node in self._children: + nodes.extend(node.getiterator(tag)) + return nodes + +# compatibility +_Element = _ElementInterface + +## +# Element factory. This function returns an object implementing the +# standard Element interface. The exact class or type of that object +# is implementation dependent, but it will always be compatible with +# the {@link #_ElementInterface} class in this module. +#

+# The element name, attribute names, and attribute values can be +# either 8-bit ASCII strings or Unicode strings. +# +# @param tag The element name. +# @param attrib An optional dictionary, containing element attributes. +# @param **extra Additional attributes, given as keyword arguments. +# @return An element instance. +# @defreturn Element + +def Element(tag, attrib={}, **extra): + attrib = attrib.copy() + attrib.update(extra) + return _ElementInterface(tag, attrib) + +## +# Subelement factory. This function creates an element instance, and +# appends it to an existing element. +#

+# The element name, attribute names, and attribute values can be +# either 8-bit ASCII strings or Unicode strings. +# +# @param parent The parent element. +# @param tag The subelement name. +# @param attrib An optional dictionary, containing element attributes. +# @param **extra Additional attributes, given as keyword arguments. +# @return An element instance. +# @defreturn Element + +def SubElement(parent, tag, attrib={}, **extra): + attrib = attrib.copy() + attrib.update(extra) + element = parent.makeelement(tag, attrib) + parent.append(element) + return element + +## +# Comment element factory. This factory function creates a special +# element that will be serialized as an XML comment. +#

+# The comment string can be either an 8-bit ASCII string or a Unicode +# string. +# +# @param text A string containing the comment string. +# @return An element instance, representing a comment. +# @defreturn Element + +def Comment(text=None): + element = Element(Comment) + element.text = text + return element + +## +# PI element factory. This factory function creates a special element +# that will be serialized as an XML processing instruction. +# +# @param target A string containing the PI target. +# @param text A string containing the PI contents, if any. +# @return An element instance, representing a PI. +# @defreturn Element + +def ProcessingInstruction(target, text=None): + element = Element(ProcessingInstruction) + element.text = target + if text: + element.text = element.text + " " + text + return element + +PI = ProcessingInstruction + +## +# QName wrapper. This can be used to wrap a QName attribute value, in +# order to get proper namespace handling on output. +# +# @param text A string containing the QName value, in the form {uri}local, +# or, if the tag argument is given, the URI part of a QName. +# @param tag Optional tag. If given, the first argument is interpreted as +# an URI, and this argument is interpreted as a local name. +# @return An opaque object, representing the QName. + +class QName: + def __init__(self, text_or_uri, tag=None): + if tag: + text_or_uri = "{%s}%s" % (text_or_uri, tag) + self.text = text_or_uri + def __str__(self): + return self.text + def __hash__(self): + return hash(self.text) + def __cmp__(self, other): + if isinstance(other, QName): + return cmp(self.text, other.text) + return cmp(self.text, other) + +## +# ElementTree wrapper class. This class represents an entire element +# hierarchy, and adds some extra support for serialization to and from +# standard XML. +# +# @param element Optional root element. +# @keyparam file Optional file handle or name. If given, the +# tree is initialized with the contents of this XML file. + +class ElementTree: + + def __init__(self, element=None, file=None): + assert element is None or iselement(element) + self._root = element # first node + if file: + self.parse(file) + + ## + # Gets the root element for this tree. + # + # @return An element instance. + # @defreturn Element + + def getroot(self): + return self._root + + ## + # Replaces the root element for this tree. This discards the + # current contents of the tree, and replaces it with the given + # element. Use with care. + # + # @param element An element instance. + + def _setroot(self, element): + assert iselement(element) + self._root = element + + ## + # Loads an external XML document into this element tree. + # + # @param source A file name or file object. + # @param parser An optional parser instance. If not given, the + # standard {@link XMLTreeBuilder} parser is used. + # @return The document root element. + # @defreturn Element + + def parse(self, source, parser=None): + if not hasattr(source, "read"): + source = open(source, "rb") + if not parser: + parser = XMLTreeBuilder() + while 1: + data = source.read(32768) + if not data: + break + parser.feed(data) + self._root = parser.close() + return self._root + + ## + # Creates a tree iterator for the root element. The iterator loops + # over all elements in this tree, in document order. + # + # @param tag What tags to look for (default is to return all elements) + # @return An iterator. + # @defreturn iterator + + def getiterator(self, tag=None): + assert self._root is not None + return self._root.getiterator(tag) + + ## + # Finds the first toplevel element with given tag. + # Same as getroot().find(path). + # + # @param path What element to look for. + # @return The first matching element, or None if no element was found. + # @defreturn Element or None + + def find(self, path): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.find(path) + + ## + # Finds the element text for the first toplevel element with given + # tag. Same as getroot().findtext(path). + # + # @param path What toplevel element to look for. + # @param default What to return if the element was not found. + # @return The text content of the first matching element, or the + # default value no element was found. Note that if the element + # has is found, but has no text content, this method returns an + # empty string. + # @defreturn string + + def findtext(self, path, default=None): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.findtext(path, default) + + ## + # Finds all toplevel elements with the given tag. + # Same as getroot().findall(path). + # + # @param path What element to look for. + # @return A list or iterator containing all matching elements, + # in document order. + # @defreturn list of Element instances + + def findall(self, path): + assert self._root is not None + if path[:1] == "/": + path = "." + path + return self._root.findall(path) + + ## + # Writes the element tree to a file, as XML. + # + # @param file A file name, or a file object opened for writing. + # @param encoding Optional output encoding (default is US-ASCII). + + def write(self, file, encoding="us-ascii"): + assert self._root is not None + if not hasattr(file, "write"): + file = open(file, "wb") + if not encoding: + encoding = "us-ascii" + elif encoding != "utf-8" and encoding != "us-ascii": + file.write("\n" % encoding) + self._write(file, self._root, encoding, {}) + + def _write(self, file, node, encoding, namespaces): + # write XML to file + tag = node.tag + if tag is Comment: + file.write("" % _escape_cdata(node.text, encoding)) + elif tag is ProcessingInstruction: + file.write("" % _escape_cdata(node.text, encoding)) + else: + items = node.items() + xmlns_items = [] # new namespaces in this scope + try: + if isinstance(tag, QName) or tag[:1] == "{": + tag, xmlns = fixtag(tag, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(tag) + file.write("<" + _encode(tag, encoding)) + if items or xmlns_items: + items.sort() # lexical order + for k, v in items: + try: + if isinstance(k, QName) or k[:1] == "{": + k, xmlns = fixtag(k, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(k) + try: + if isinstance(v, QName): + v, xmlns = fixtag(v, namespaces) + if xmlns: xmlns_items.append(xmlns) + except TypeError: + _raise_serialization_error(v) + file.write(" %s=\"%s\"" % (_encode(k, encoding), + _escape_attrib(v, encoding))) + for k, v in xmlns_items: + file.write(" %s=\"%s\"" % (_encode(k, encoding), + _escape_attrib(v, encoding))) + if node.text or len(node): + file.write(">") + if node.text: + file.write(_escape_cdata(node.text, encoding)) + for n in node: + self._write(file, n, encoding, namespaces) + file.write("") + else: + file.write(" />") + for k, v in xmlns_items: + del namespaces[v] + if node.tail: + file.write(_escape_cdata(node.tail, encoding)) + +# -------------------------------------------------------------------- +# helpers + +## +# Checks if an object appears to be a valid element object. +# +# @param An element instance. +# @return A true value if this is an element object. +# @defreturn flag + +def iselement(element): + # FIXME: not sure about this; might be a better idea to look + # for tag/attrib/text attributes + return isinstance(element, _ElementInterface) or hasattr(element, "tag") + +## +# Writes an element tree or element structure to sys.stdout. This +# function should be used for debugging only. +#

+# The exact output format is implementation dependent. In this +# version, it's written as an ordinary XML file. +# +# @param elem An element tree or an individual element. + +def dump(elem): + # debugging + if not isinstance(elem, ElementTree): + elem = ElementTree(elem) + elem.write(sys.stdout) + tail = elem.getroot().tail + if not tail or tail[-1] != "\n": + sys.stdout.write("\n") + +def _encode(s, encoding): + try: + return s.encode(encoding) + except AttributeError: + return s # 1.5.2: assume the string uses the right encoding + +if sys.version[:3] == "1.5": + _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2 +else: + _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) + +_escape_map = { + "&": "&", + "<": "<", + ">": ">", + '"': """, +} + +_namespace_map = { + # "well-known" namespace prefixes + "http://www.w3.org/XML/1998/namespace": "xml", + "http://www.w3.org/1999/xhtml": "html", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", + "http://schemas.xmlsoap.org/wsdl/": "wsdl", +} + +def _raise_serialization_error(text): + raise TypeError( + "cannot serialize %r (type %s)" % (text, type(text).__name__) + ) + +def _encode_entity(text, pattern=_escape): + # map reserved and non-ascii characters to numerical entities + def escape_entities(m, map=_escape_map): + out = [] + append = out.append + for char in m.group(): + text = map.get(char) + if text is None: + text = "&#%d;" % ord(char) + append(text) + return string.join(out, "") + try: + return _encode(pattern.sub(escape_entities, text), "ascii") + except TypeError: + _raise_serialization_error(text) + +# +# the following functions assume an ascii-compatible encoding +# (or "utf-16") + +def _escape_cdata(text, encoding=None, replace=string.replace): + # escape character data + try: + if encoding: + try: + text = _encode(text, encoding) + except UnicodeError: + return _encode_entity(text) + text = replace(text, "&", "&") + text = replace(text, "<", "<") + text = replace(text, ">", ">") + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + +def _escape_attrib(text, encoding=None, replace=string.replace): + # escape attribute value + try: + if encoding: + try: + text = _encode(text, encoding) + except UnicodeError: + return _encode_entity(text) + text = replace(text, "&", "&") + text = replace(text, "'", "'") # FIXME: overkill + text = replace(text, "\"", """) + text = replace(text, "<", "<") + text = replace(text, ">", ">") + return text + except (TypeError, AttributeError): + _raise_serialization_error(text) + +def fixtag(tag, namespaces): + # given a decorated tag (of the form {uri}tag), return prefixed + # tag and namespace declaration, if any + if isinstance(tag, QName): + tag = tag.text + namespace_uri, tag = string.split(tag[1:], "}", 1) + prefix = namespaces.get(namespace_uri) + if prefix is None: + prefix = _namespace_map.get(namespace_uri) + if prefix is None: + prefix = "ns%d" % len(namespaces) + namespaces[namespace_uri] = prefix + if prefix == "xml": + xmlns = None + else: + xmlns = ("xmlns:%s" % prefix, namespace_uri) + else: + xmlns = None + return "%s:%s" % (prefix, tag), xmlns + +## +# Parses an XML document into an element tree. +# +# @param source A filename or file object containing XML data. +# @param parser An optional parser instance. If not given, the +# standard {@link XMLTreeBuilder} parser is used. +# @return An ElementTree instance + +def parse(source, parser=None): + tree = ElementTree() + tree.parse(source, parser) + return tree + +## +# Parses an XML document into an element tree incrementally, and reports +# what's going on to the user. +# +# @param source A filename or file object containing XML data. +# @param events A list of events to report back. If omitted, only "end" +# events are reported. +# @return A (event, elem) iterator. + +class iterparse: + + def __init__(self, source, events=None): + if not hasattr(source, "read"): + source = open(source, "rb") + self._file = source + self._events = [] + self._index = 0 + self.root = self._root = None + self._parser = XMLTreeBuilder() + # wire up the parser for event reporting + parser = self._parser._parser + append = self._events.append + if events is None: + events = ["end"] + for event in events: + if event == "start": + try: + parser.ordered_attributes = 1 + parser.specified_attributes = 1 + def handler(tag, attrib_in, event=event, append=append, + start=self._parser._start_list): + append((event, start(tag, attrib_in))) + parser.StartElementHandler = handler + except AttributeError: + def handler(tag, attrib_in, event=event, append=append, + start=self._parser._start): + append((event, start(tag, attrib_in))) + parser.StartElementHandler = handler + elif event == "end": + def handler(tag, event=event, append=append, + end=self._parser._end): + append((event, end(tag))) + parser.EndElementHandler = handler + elif event == "start-ns": + def handler(prefix, uri, event=event, append=append): + try: + uri = _encode(uri, "ascii") + except UnicodeError: + pass + append((event, (prefix or "", uri))) + parser.StartNamespaceDeclHandler = handler + elif event == "end-ns": + def handler(prefix, event=event, append=append): + append((event, None)) + parser.EndNamespaceDeclHandler = handler + + def next(self): + while 1: + try: + item = self._events[self._index] + except IndexError: + if self._parser is None: + self.root = self._root + try: + raise StopIteration + except NameError: + raise IndexError + # load event buffer + del self._events[:] + self._index = 0 + data = self._file.read(16384) + if data: + self._parser.feed(data) + else: + self._root = self._parser.close() + self._parser = None + else: + self._index = self._index + 1 + return item + + try: + iter + def __iter__(self): + return self + except NameError: + def __getitem__(self, index): + return self.next() + +## +# Parses an XML document from a string constant. This function can +# be used to embed "XML literals" in Python code. +# +# @param source A string containing XML data. +# @return An Element instance. +# @defreturn Element + +def XML(text): + parser = XMLTreeBuilder() + parser.feed(text) + return parser.close() + +## +# Parses an XML document from a string constant, and also returns +# a dictionary which maps from element id:s to elements. +# +# @param source A string containing XML data. +# @return A tuple containing an Element instance and a dictionary. +# @defreturn (Element, dictionary) + +def XMLID(text): + parser = XMLTreeBuilder() + parser.feed(text) + tree = parser.close() + ids = {} + for elem in tree.getiterator(): + id = elem.get("id") + if id: + ids[id] = elem + return tree, ids + +## +# Parses an XML document from a string constant. Same as {@link #XML}. +# +# @def fromstring(text) +# @param source A string containing XML data. +# @return An Element instance. +# @defreturn Element + +fromstring = XML + +## +# Generates a string representation of an XML element, including all +# subelements. +# +# @param element An Element instance. +# @return An encoded string containing the XML data. +# @defreturn string + +def tostring(element, encoding=None): + class dummy: + pass + data = [] + file = dummy() + file.write = data.append + ElementTree(element).write(file, encoding) + return string.join(data, "") + +## +# Generic element structure builder. This builder converts a sequence +# of {@link #TreeBuilder.start}, {@link #TreeBuilder.data}, and {@link +# #TreeBuilder.end} method calls to a well-formed element structure. +#

+# You can use this class to build an element structure using a custom XML +# parser, or a parser for some other XML-like format. +# +# @param element_factory Optional element factory. This factory +# is called to create new Element instances, as necessary. + +class TreeBuilder: + + def __init__(self, element_factory=None): + self._data = [] # data collector + self._elem = [] # element stack + self._last = None # last element + self._tail = None # true if we're after an end tag + if element_factory is None: + element_factory = _ElementInterface + self._factory = element_factory + + ## + # Flushes the parser buffers, and returns the toplevel documen + # element. + # + # @return An Element instance. + # @defreturn Element + + def close(self): + assert len(self._elem) == 0, "missing end tags" + assert self._last != None, "missing toplevel element" + return self._last + + def _flush(self): + if self._data: + if self._last is not None: + text = string.join(self._data, "") + if self._tail: + assert self._last.tail is None, "internal error (tail)" + self._last.tail = text + else: + assert self._last.text is None, "internal error (text)" + self._last.text = text + self._data = [] + + ## + # Adds text to the current element. + # + # @param data A string. This should be either an 8-bit string + # containing ASCII text, or a Unicode string. + + def data(self, data): + self._data.append(data) + + ## + # Opens a new element. + # + # @param tag The element name. + # @param attrib A dictionary containing element attributes. + # @return The opened element. + # @defreturn Element + + def start(self, tag, attrs): + self._flush() + self._last = elem = self._factory(tag, attrs) + if self._elem: + self._elem[-1].append(elem) + self._elem.append(elem) + self._tail = 0 + return elem + + ## + # Closes the current element. + # + # @param tag The element name. + # @return The closed element. + # @defreturn Element + + def end(self, tag): + self._flush() + self._last = self._elem.pop() + assert self._last.tag == tag,\ + "end tag mismatch (expected %s, got %s)" % ( + self._last.tag, tag) + self._tail = 1 + return self._last + +## +# Element structure builder for XML source data, based on the +# expat parser. +# +# @keyparam target Target object. If omitted, the builder uses an +# instance of the standard {@link #TreeBuilder} class. +# @keyparam html Predefine HTML entities. This flag is not supported +# by the current implementation. +# @see #ElementTree +# @see #TreeBuilder + +class XMLTreeBuilder: + + def __init__(self, html=0, target=None): + try: + from xml.parsers import expat + except ImportError: + raise ImportError( + "No module named expat; use SimpleXMLTreeBuilder instead" + ) + self._parser = parser = expat.ParserCreate(None, "}") + if target is None: + target = TreeBuilder() + self._target = target + self._names = {} # name memo cache + # callbacks + parser.DefaultHandlerExpand = self._default + parser.StartElementHandler = self._start + parser.EndElementHandler = self._end + parser.CharacterDataHandler = self._data + # let expat do the buffering, if supported + try: + self._parser.buffer_text = 1 + except AttributeError: + pass + # use new-style attribute handling, if supported + try: + self._parser.ordered_attributes = 1 + self._parser.specified_attributes = 1 + parser.StartElementHandler = self._start_list + except AttributeError: + pass + encoding = None + if not parser.returns_unicode: + encoding = "utf-8" + # target.xml(encoding, None) + self._doctype = None + self.entity = {} + + def _fixtext(self, text): + # convert text string to ascii, if possible + try: + return _encode(text, "ascii") + except UnicodeError: + return text + + def _fixname(self, key): + # expand qname, and convert name string to ascii, if possible + try: + name = self._names[key] + except KeyError: + name = key + if "}" in name: + name = "{" + name + self._names[key] = name = self._fixtext(name) + return name + + def _start(self, tag, attrib_in): + fixname = self._fixname + tag = fixname(tag) + attrib = {} + for key, value in attrib_in.items(): + attrib[fixname(key)] = self._fixtext(value) + return self._target.start(tag, attrib) + + def _start_list(self, tag, attrib_in): + fixname = self._fixname + tag = fixname(tag) + attrib = {} + if attrib_in: + for i in range(0, len(attrib_in), 2): + attrib[fixname(attrib_in[i])] = self._fixtext(attrib_in[i+1]) + return self._target.start(tag, attrib) + + def _data(self, text): + return self._target.data(self._fixtext(text)) + + def _end(self, tag): + return self._target.end(self._fixname(tag)) + + def _default(self, text): + prefix = text[:1] + if prefix == "&": + # deal with undefined entities + try: + self._target.data(self.entity[text[1:-1]]) + except KeyError: + from xml.parsers import expat + raise expat.error( + "undefined entity %s: line %d, column %d" % + (text, self._parser.ErrorLineNumber, + self._parser.ErrorColumnNumber) + ) + elif prefix == "<" and text[:9] == "": + self._doctype = None + return + text = string.strip(text) + if not text: + return + self._doctype.append(text) + n = len(self._doctype) + if n > 2: + type = self._doctype[1] + if type == "PUBLIC" and n == 4: + name, type, pubid, system = self._doctype + elif type == "SYSTEM" and n == 3: + name, type, system = self._doctype + pubid = None + else: + return + if pubid: + pubid = pubid[1:-1] + self.doctype(name, pubid, system[1:-1]) + self._doctype = None + + ## + # Handles a doctype declaration. + # + # @param name Doctype name. + # @param pubid Public identifier. + # @param system System identifier. + + def doctype(self, name, pubid, system): + pass + + ## + # Feeds data to the parser. + # + # @param data Encoded data. + + def feed(self, data): + self._parser.Parse(data, 0) + + ## + # Finishes feeding data to the parser. + # + # @return An element structure. + # @defreturn Element + + def close(self): + self._parser.Parse("", 1) # end of data + tree = self._target.close() + del self._target, self._parser # get rid of circular references + return tree Modified: external/elementtree-1.2.6-20050316/elementtree/HTMLTreeBuilder.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/HTMLTreeBuilder.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/HTMLTreeBuilder.py Wed Dec 14 19:33:39 2005 @@ -1,230 +1,230 @@ -# -# ElementTree -# $Id: HTMLTreeBuilder.py 2325 2005-03-16 15:50:43Z fredrik $ -# -# a simple tree builder, for HTML input -# -# history: -# 2002-04-06 fl created -# 2002-04-07 fl ignore IMG and HR end tags -# 2002-04-07 fl added support for 1.5.2 and later -# 2003-04-13 fl added HTMLTreeBuilder alias -# 2004-12-02 fl don't feed non-ASCII charrefs/entities as 8-bit strings -# 2004-12-05 fl don't feed non-ASCII CDATA as 8-bit strings -# -# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Tools to build element trees from HTML files. -## - -import htmlentitydefs -import re, string, sys -import mimetools, StringIO - -import ElementTree - -AUTOCLOSE = "p", "li", "tr", "th", "td", "head", "body" -IGNOREEND = "img", "hr", "meta", "link", "br" - -if sys.version[:3] == "1.5": - is_not_ascii = re.compile(r"[\x80-\xff]").search # 1.5.2 -else: - is_not_ascii = re.compile(eval(r'u"[\u0080-\uffff]"')).search - -try: - from HTMLParser import HTMLParser -except ImportError: - from sgmllib import SGMLParser - # hack to use sgmllib's SGMLParser to emulate 2.2's HTMLParser - class HTMLParser(SGMLParser): - # the following only works as long as this class doesn't - # provide any do, start, or end handlers - def unknown_starttag(self, tag, attrs): - self.handle_starttag(tag, attrs) - def unknown_endtag(self, tag): - self.handle_endtag(tag) - -## -# ElementTree builder for HTML source code. This builder converts an -# HTML document or fragment to an ElementTree. -#

-# The parser is relatively picky, and requires balanced tags for most -# elements. However, elements belonging to the following group are -# automatically closed: P, LI, TR, TH, and TD. In addition, the -# parser automatically inserts end tags immediately after the start -# tag, and ignores any end tags for the following group: IMG, HR, -# META, and LINK. -# -# @keyparam builder Optional builder object. If omitted, the parser -# uses the standard elementtree builder. -# @keyparam encoding Optional character encoding, if known. If omitted, -# the parser looks for META tags inside the document. If no tags -# are found, the parser defaults to ISO-8859-1. Note that if your -# document uses a non-ASCII compatible encoding, you must decode -# the document before parsing. -# -# @see elementtree.ElementTree - -class HTMLTreeBuilder(HTMLParser): - - # FIXME: shouldn't this class be named Parser, not Builder? - - def __init__(self, builder=None, encoding=None): - self.__stack = [] - if builder is None: - builder = ElementTree.TreeBuilder() - self.__builder = builder - self.encoding = encoding or "iso-8859-1" - HTMLParser.__init__(self) - - ## - # Flushes parser buffers, and return the root element. - # - # @return An Element instance. - - def close(self): - HTMLParser.close(self) - return self.__builder.close() - - ## - # (Internal) Handles start tags. - - def handle_starttag(self, tag, attrs): - if tag == "meta": - # look for encoding directives - http_equiv = content = None - for k, v in attrs: - if k == "http-equiv": - http_equiv = string.lower(v) - elif k == "content": - content = v - if http_equiv == "content-type" and content: - # use mimetools to parse the http header - header = mimetools.Message( - StringIO.StringIO("%s: %s\n\n" % (http_equiv, content)) - ) - encoding = header.getparam("charset") - if encoding: - self.encoding = encoding - if tag in AUTOCLOSE: - if self.__stack and self.__stack[-1] == tag: - self.handle_endtag(tag) - self.__stack.append(tag) - attrib = {} - if attrs: - for k, v in attrs: - attrib[string.lower(k)] = v - self.__builder.start(tag, attrib) - if tag in IGNOREEND: - self.__stack.pop() - self.__builder.end(tag) - - ## - # (Internal) Handles end tags. - - def handle_endtag(self, tag): - if tag in IGNOREEND: - return - lasttag = self.__stack.pop() - if tag != lasttag and lasttag in AUTOCLOSE: - self.handle_endtag(lasttag) - self.__builder.end(tag) - - ## - # (Internal) Handles character references. - - def handle_charref(self, char): - if char[:1] == "x": - char = int(char[1:], 16) - else: - char = int(char) - if 0 <= char < 128: - self.__builder.data(chr(char)) - else: - self.__builder.data(unichr(char)) - - ## - # (Internal) Handles entity references. - - def handle_entityref(self, name): - entity = htmlentitydefs.entitydefs.get(name) - if entity: - if len(entity) == 1: - entity = ord(entity) - else: - entity = int(entity[2:-1]) - if 0 <= entity < 128: - self.__builder.data(chr(entity)) - else: - self.__builder.data(unichr(entity)) - else: - self.unknown_entityref(name) - - ## - # (Internal) Handles character data. - - def handle_data(self, data): - if isinstance(data, type('')) and is_not_ascii(data): - # convert to unicode, but only if necessary - data = unicode(data, self.encoding, "ignore") - self.__builder.data(data) - - ## - # (Hook) Handles unknown entity references. The default action - # is to ignore unknown entities. - - def unknown_entityref(self, name): - pass # ignore by default; override if necessary - -## -# An alias for the HTMLTreeBuilder class. - -TreeBuilder = HTMLTreeBuilder - -## -# Parse an HTML document or document fragment. -# -# @param source A filename or file object containing HTML data. -# @param encoding Optional character encoding, if known. If omitted, -# the parser looks for META tags inside the document. If no tags -# are found, the parser defaults to ISO-8859-1. -# @return An ElementTree instance - -def parse(source, encoding=None): - return ElementTree.parse(source, HTMLTreeBuilder(encoding=encoding)) - -if __name__ == "__main__": - import sys - ElementTree.dump(parse(open(sys.argv[1]))) +# +# ElementTree +# $Id: HTMLTreeBuilder.py 2325 2005-03-16 15:50:43Z fredrik $ +# +# a simple tree builder, for HTML input +# +# history: +# 2002-04-06 fl created +# 2002-04-07 fl ignore IMG and HR end tags +# 2002-04-07 fl added support for 1.5.2 and later +# 2003-04-13 fl added HTMLTreeBuilder alias +# 2004-12-02 fl don't feed non-ASCII charrefs/entities as 8-bit strings +# 2004-12-05 fl don't feed non-ASCII CDATA as 8-bit strings +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to build element trees from HTML files. +## + +import htmlentitydefs +import re, string, sys +import mimetools, StringIO + +import ElementTree + +AUTOCLOSE = "p", "li", "tr", "th", "td", "head", "body" +IGNOREEND = "img", "hr", "meta", "link", "br" + +if sys.version[:3] == "1.5": + is_not_ascii = re.compile(r"[\x80-\xff]").search # 1.5.2 +else: + is_not_ascii = re.compile(eval(r'u"[\u0080-\uffff]"')).search + +try: + from HTMLParser import HTMLParser +except ImportError: + from sgmllib import SGMLParser + # hack to use sgmllib's SGMLParser to emulate 2.2's HTMLParser + class HTMLParser(SGMLParser): + # the following only works as long as this class doesn't + # provide any do, start, or end handlers + def unknown_starttag(self, tag, attrs): + self.handle_starttag(tag, attrs) + def unknown_endtag(self, tag): + self.handle_endtag(tag) + +## +# ElementTree builder for HTML source code. This builder converts an +# HTML document or fragment to an ElementTree. +#

+# The parser is relatively picky, and requires balanced tags for most +# elements. However, elements belonging to the following group are +# automatically closed: P, LI, TR, TH, and TD. In addition, the +# parser automatically inserts end tags immediately after the start +# tag, and ignores any end tags for the following group: IMG, HR, +# META, and LINK. +# +# @keyparam builder Optional builder object. If omitted, the parser +# uses the standard elementtree builder. +# @keyparam encoding Optional character encoding, if known. If omitted, +# the parser looks for META tags inside the document. If no tags +# are found, the parser defaults to ISO-8859-1. Note that if your +# document uses a non-ASCII compatible encoding, you must decode +# the document before parsing. +# +# @see elementtree.ElementTree + +class HTMLTreeBuilder(HTMLParser): + + # FIXME: shouldn't this class be named Parser, not Builder? + + def __init__(self, builder=None, encoding=None): + self.__stack = [] + if builder is None: + builder = ElementTree.TreeBuilder() + self.__builder = builder + self.encoding = encoding or "iso-8859-1" + HTMLParser.__init__(self) + + ## + # Flushes parser buffers, and return the root element. + # + # @return An Element instance. + + def close(self): + HTMLParser.close(self) + return self.__builder.close() + + ## + # (Internal) Handles start tags. + + def handle_starttag(self, tag, attrs): + if tag == "meta": + # look for encoding directives + http_equiv = content = None + for k, v in attrs: + if k == "http-equiv": + http_equiv = string.lower(v) + elif k == "content": + content = v + if http_equiv == "content-type" and content: + # use mimetools to parse the http header + header = mimetools.Message( + StringIO.StringIO("%s: %s\n\n" % (http_equiv, content)) + ) + encoding = header.getparam("charset") + if encoding: + self.encoding = encoding + if tag in AUTOCLOSE: + if self.__stack and self.__stack[-1] == tag: + self.handle_endtag(tag) + self.__stack.append(tag) + attrib = {} + if attrs: + for k, v in attrs: + attrib[string.lower(k)] = v + self.__builder.start(tag, attrib) + if tag in IGNOREEND: + self.__stack.pop() + self.__builder.end(tag) + + ## + # (Internal) Handles end tags. + + def handle_endtag(self, tag): + if tag in IGNOREEND: + return + lasttag = self.__stack.pop() + if tag != lasttag and lasttag in AUTOCLOSE: + self.handle_endtag(lasttag) + self.__builder.end(tag) + + ## + # (Internal) Handles character references. + + def handle_charref(self, char): + if char[:1] == "x": + char = int(char[1:], 16) + else: + char = int(char) + if 0 <= char < 128: + self.__builder.data(chr(char)) + else: + self.__builder.data(unichr(char)) + + ## + # (Internal) Handles entity references. + + def handle_entityref(self, name): + entity = htmlentitydefs.entitydefs.get(name) + if entity: + if len(entity) == 1: + entity = ord(entity) + else: + entity = int(entity[2:-1]) + if 0 <= entity < 128: + self.__builder.data(chr(entity)) + else: + self.__builder.data(unichr(entity)) + else: + self.unknown_entityref(name) + + ## + # (Internal) Handles character data. + + def handle_data(self, data): + if isinstance(data, type('')) and is_not_ascii(data): + # convert to unicode, but only if necessary + data = unicode(data, self.encoding, "ignore") + self.__builder.data(data) + + ## + # (Hook) Handles unknown entity references. The default action + # is to ignore unknown entities. + + def unknown_entityref(self, name): + pass # ignore by default; override if necessary + +## +# An alias for the HTMLTreeBuilder class. + +TreeBuilder = HTMLTreeBuilder + +## +# Parse an HTML document or document fragment. +# +# @param source A filename or file object containing HTML data. +# @param encoding Optional character encoding, if known. If omitted, +# the parser looks for META tags inside the document. If no tags +# are found, the parser defaults to ISO-8859-1. +# @return An ElementTree instance + +def parse(source, encoding=None): + return ElementTree.parse(source, HTMLTreeBuilder(encoding=encoding)) + +if __name__ == "__main__": + import sys + ElementTree.dump(parse(open(sys.argv[1]))) Modified: external/elementtree-1.2.6-20050316/elementtree/SgmlopXMLTreeBuilder.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/SgmlopXMLTreeBuilder.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/SgmlopXMLTreeBuilder.py Wed Dec 14 19:33:39 2005 @@ -1,103 +1,103 @@ -# -# ElementTree -# $Id$ -# -# A simple XML tree builder, based on the sgmlop library. -# -# Note that this version does not support namespaces. This may be -# changed in future versions. -# -# history: -# 2004-03-28 fl created -# -# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Tools to build element trees from XML, based on the SGMLOP parser. -#

-# The current version does not support XML namespaces. -#

-# This tree builder requires the sgmlop extension module -# (available from -# http://effbot.org/downloads). -## - -import ElementTree - -## -# ElementTree builder for XML source data, based on the SGMLOP parser. -# -# @see elementtree.ElementTree - -class TreeBuilder: - - def __init__(self, html=0): - try: - import sgmlop - except ImportError: - raise RuntimeError("sgmlop parser not available") - self.__builder = ElementTree.TreeBuilder() - if html: - import htmlentitydefs - self.entitydefs.update(htmlentitydefs.entitydefs) - self.__parser = sgmlop.XMLParser() - self.__parser.register(self) - - ## - # Feeds data to the parser. - # - # @param data Encoded data. - - def feed(self, data): - self.__parser.feed(data) - - ## - # Finishes feeding data to the parser. - # - # @return An element structure. - # @defreturn Element - - def close(self): - self.__parser.close() - self.__parser = None - return self.__builder.close() - - def finish_starttag(self, tag, attrib): - self.__builder.start(tag, attrib) - - def finish_endtag(self, tag): - self.__builder.end(tag) - - def handle_data(self, data): - self.__builder.data(data) +# +# ElementTree +# $Id$ +# +# A simple XML tree builder, based on the sgmlop library. +# +# Note that this version does not support namespaces. This may be +# changed in future versions. +# +# history: +# 2004-03-28 fl created +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to build element trees from XML, based on the SGMLOP parser. +#

+# The current version does not support XML namespaces. +#

+# This tree builder requires the sgmlop extension module +# (available from +# http://effbot.org/downloads). +## + +import ElementTree + +## +# ElementTree builder for XML source data, based on the SGMLOP parser. +# +# @see elementtree.ElementTree + +class TreeBuilder: + + def __init__(self, html=0): + try: + import sgmlop + except ImportError: + raise RuntimeError("sgmlop parser not available") + self.__builder = ElementTree.TreeBuilder() + if html: + import htmlentitydefs + self.entitydefs.update(htmlentitydefs.entitydefs) + self.__parser = sgmlop.XMLParser() + self.__parser.register(self) + + ## + # Feeds data to the parser. + # + # @param data Encoded data. + + def feed(self, data): + self.__parser.feed(data) + + ## + # Finishes feeding data to the parser. + # + # @return An element structure. + # @defreturn Element + + def close(self): + self.__parser.close() + self.__parser = None + return self.__builder.close() + + def finish_starttag(self, tag, attrib): + self.__builder.start(tag, attrib) + + def finish_endtag(self, tag): + self.__builder.end(tag) + + def handle_data(self, data): + self.__builder.data(data) Modified: external/elementtree-1.2.6-20050316/elementtree/SimpleXMLTreeBuilder.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/SimpleXMLTreeBuilder.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/SimpleXMLTreeBuilder.py Wed Dec 14 19:33:39 2005 @@ -1,144 +1,144 @@ -# -# ElementTree -# $Id: SimpleXMLTreeBuilder.py 1862 2004-06-18 07:31:02Z Fredrik $ -# -# A simple XML tree builder, based on Python's xmllib -# -# Note that due to bugs in xmllib, this builder does not fully support -# namespaces (unqualified attributes are put in the default namespace, -# instead of being left as is). Run this module as a script to find -# out if this affects your Python version. -# -# history: -# 2001-10-20 fl created -# 2002-05-01 fl added namespace support for xmllib -# 2002-08-17 fl added xmllib sanity test -# -# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Tools to build element trees from XML files, using xmllib. -# This module can be used instead of the standard tree builder, for -# Python versions where "expat" is not available (such as 1.5.2). -#

-# Note that due to bugs in xmllib, the namespace support is -# not reliable (you can run the module as a script to find out exactly -# how unreliable it is on your Python version). -## - -import xmllib, string - -import ElementTree - -## -# ElementTree builder for XML source data. -# -# @see elementtree.ElementTree - -class TreeBuilder(xmllib.XMLParser): - - def __init__(self, html=0): - self.__builder = ElementTree.TreeBuilder() - if html: - import htmlentitydefs - self.entitydefs.update(htmlentitydefs.entitydefs) - xmllib.XMLParser.__init__(self) - - ## - # Feeds data to the parser. - # - # @param data Encoded data. - - def feed(self, data): - xmllib.XMLParser.feed(self, data) - - ## - # Finishes feeding data to the parser. - # - # @return An element structure. - # @defreturn Element - - def close(self): - xmllib.XMLParser.close(self) - return self.__builder.close() - - def handle_data(self, data): - self.__builder.data(data) - - handle_cdata = handle_data - - def unknown_starttag(self, tag, attrs): - attrib = {} - for key, value in attrs.items(): - attrib[fixname(key)] = value - self.__builder.start(fixname(tag), attrib) - - def unknown_endtag(self, tag): - self.__builder.end(fixname(tag)) - - -def fixname(name, split=string.split): - # xmllib in 2.0 and later provides limited (and slightly broken) - # support for XML namespaces. - if " " not in name: - return name - return "{%s}%s" % tuple(split(name, " ", 1)) - - -if __name__ == "__main__": - import sys - # sanity check: look for known namespace bugs in xmllib - p = TreeBuilder() - text = """\ - - - - """ - p.feed(text) - tree = p.close() - status = [] - # check for bugs in the xmllib implementation - tag = tree.find("{default}tag") - if tag is None: - status.append("namespaces not supported") - if tag is not None and tag.get("{default}attribute"): - status.append("default namespace applied to unqualified attribute") - # report bugs - if status: - print "xmllib doesn't work properly in this Python version:" - for bug in status: - print "-", bug - else: - print "congratulations; no problems found in xmllib" - +# +# ElementTree +# $Id: SimpleXMLTreeBuilder.py 1862 2004-06-18 07:31:02Z Fredrik $ +# +# A simple XML tree builder, based on Python's xmllib +# +# Note that due to bugs in xmllib, this builder does not fully support +# namespaces (unqualified attributes are put in the default namespace, +# instead of being left as is). Run this module as a script to find +# out if this affects your Python version. +# +# history: +# 2001-10-20 fl created +# 2002-05-01 fl added namespace support for xmllib +# 2002-08-17 fl added xmllib sanity test +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to build element trees from XML files, using xmllib. +# This module can be used instead of the standard tree builder, for +# Python versions where "expat" is not available (such as 1.5.2). +#

+# Note that due to bugs in xmllib, the namespace support is +# not reliable (you can run the module as a script to find out exactly +# how unreliable it is on your Python version). +## + +import xmllib, string + +import ElementTree + +## +# ElementTree builder for XML source data. +# +# @see elementtree.ElementTree + +class TreeBuilder(xmllib.XMLParser): + + def __init__(self, html=0): + self.__builder = ElementTree.TreeBuilder() + if html: + import htmlentitydefs + self.entitydefs.update(htmlentitydefs.entitydefs) + xmllib.XMLParser.__init__(self) + + ## + # Feeds data to the parser. + # + # @param data Encoded data. + + def feed(self, data): + xmllib.XMLParser.feed(self, data) + + ## + # Finishes feeding data to the parser. + # + # @return An element structure. + # @defreturn Element + + def close(self): + xmllib.XMLParser.close(self) + return self.__builder.close() + + def handle_data(self, data): + self.__builder.data(data) + + handle_cdata = handle_data + + def unknown_starttag(self, tag, attrs): + attrib = {} + for key, value in attrs.items(): + attrib[fixname(key)] = value + self.__builder.start(fixname(tag), attrib) + + def unknown_endtag(self, tag): + self.__builder.end(fixname(tag)) + + +def fixname(name, split=string.split): + # xmllib in 2.0 and later provides limited (and slightly broken) + # support for XML namespaces. + if " " not in name: + return name + return "{%s}%s" % tuple(split(name, " ", 1)) + + +if __name__ == "__main__": + import sys + # sanity check: look for known namespace bugs in xmllib + p = TreeBuilder() + text = """\ + + + + """ + p.feed(text) + tree = p.close() + status = [] + # check for bugs in the xmllib implementation + tag = tree.find("{default}tag") + if tag is None: + status.append("namespaces not supported") + if tag is not None and tag.get("{default}attribute"): + status.append("default namespace applied to unqualified attribute") + # report bugs + if status: + print "xmllib doesn't work properly in this Python version:" + for bug in status: + print "-", bug + else: + print "congratulations; no problems found in xmllib" + Modified: external/elementtree-1.2.6-20050316/elementtree/SimpleXMLWriter.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/SimpleXMLWriter.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/SimpleXMLWriter.py Wed Dec 14 19:33:39 2005 @@ -1,279 +1,279 @@ -# -# SimpleXMLWriter -# $Id: SimpleXMLWriter.py 2312 2005-03-02 18:13:39Z fredrik $ -# -# a simple XML writer -# -# history: -# 2001-12-28 fl created -# 2002-11-25 fl fixed attribute encoding -# 2002-12-02 fl minor fixes for 1.5.2 -# 2004-06-17 fl added pythondoc markup -# 2004-07-23 fl added flush method (from Jay Graves) -# 2004-10-03 fl added declaration method -# -# Copyright (c) 2001-2004 by Fredrik Lundh -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The SimpleXMLWriter module is -# -# Copyright (c) 2001-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Tools to write XML files, without having to deal with encoding -# issues, well-formedness, etc. -#

-# The current version does not provide built-in support for -# namespaces. To create files using namespaces, you have to provide -# "xmlns" attributes and explicitly add prefixes to tags and -# attributes. -# -#

Patterns

-# -# The following example generates a small XHTML document. -#
-#
-# from elementtree.SimpleXMLWriter import XMLWriter
-# import sys
-#
-# w = XMLWriter(sys.stdout)
-#
-# html = w.start("html")
-#
-# w.start("head")
-# w.element("title", "my document")
-# w.element("meta", name="generator", value="my application 1.0")
-# w.end()
-#
-# w.start("body")
-# w.element("h1", "this is a heading")
-# w.element("p", "this is a paragraph")
-#
-# w.start("p")
-# w.data("this is ")
-# w.element("b", "bold")
-# w.data(" and ")
-# w.element("i", "italic")
-# w.data(".")
-# w.end("p")
-#
-# w.close(html)
-# 
-## - -import re, sys, string - -try: - unicode("") -except NameError: - def encode(s, encoding): - # 1.5.2: application must use the right encoding - return s - _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2 -else: - def encode(s, encoding): - return s.encode(encoding) - _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) - -def encode_entity(text, pattern=_escape): - # map reserved and non-ascii characters to numerical entities - def escape_entities(m): - out = [] - for char in m.group(): - out.append("&#%d;" % ord(char)) - return string.join(out, "") - return encode(pattern.sub(escape_entities, text), "ascii") - -del _escape - -# -# the following functions assume an ascii-compatible encoding -# (or "utf-16") - -def escape_cdata(s, encoding=None, replace=string.replace): - s = replace(s, "&", "&") - s = replace(s, "<", "<") - s = replace(s, ">", ">") - if encoding: - try: - return encode(s, encoding) - except UnicodeError: - return encode_entity(s) - return s - -def escape_attrib(s, encoding=None, replace=string.replace): - s = replace(s, "&", "&") - s = replace(s, "'", "'") - s = replace(s, "\"", """) - s = replace(s, "<", "<") - s = replace(s, ">", ">") - if encoding: - try: - return encode(s, encoding) - except UnicodeError: - return encode_entity(s) - return s - -## -# XML writer class. -# -# @param file A file or file-like object. This object must implement -# a write method that takes an 8-bit string. -# @param encoding Optional encoding. - -class XMLWriter: - - def __init__(self, file, encoding="us-ascii"): - if not hasattr(file, "write"): - file = open(file, "w") - self.__write = file.write - if hasattr(file, "flush"): - self.flush = file.flush - self.__open = 0 # true if start tag is open - self.__tags = [] - self.__data = [] - self.__encoding = encoding - - def __flush(self): - # flush internal buffers - if self.__open: - self.__write(">") - self.__open = 0 - if self.__data: - data = string.join(self.__data, "") - self.__write(escape_cdata(data, self.__encoding)) - self.__data = [] - - ## - # Writes an XML declaration. - - def declaration(self): - encoding = self.__encoding - if encoding == "us-ascii" or encoding == "utf-8": - self.__write("\n") - else: - self.__write("\n" % encoding) - - ## - # Opens a new element. Attributes can be given as keyword - # arguments, or as a string/string dictionary. You can pass in - # 8-bit strings or Unicode strings; the former are assumed to use - # the encoding passed to the constructor. The method returns an - # opaque identifier that can be passed to the close method, - # to close all open elements up to and including this one. - # - # @param tag Element tag. - # @param attrib Attribute dictionary. Alternatively, attributes - # can be given as keyword arguments. - # @return An element identifier. - - def start(self, tag, attrib={}, **extra): - self.__flush() - tag = escape_cdata(tag, self.__encoding) - self.__data = [] - self.__tags.append(tag) - self.__write("<%s" % tag) - if attrib or extra: - attrib = attrib.copy() - attrib.update(extra) - attrib = attrib.items() - attrib.sort() - for k, v in attrib: - k = escape_cdata(k, self.__encoding) - v = escape_attrib(v, self.__encoding) - self.__write(" %s=\"%s\"" % (k, v)) - self.__open = 1 - return len(self.__tags)-1 - - ## - # Adds a comment to the output stream. - # - # @param comment Comment text, as an 8-bit string or Unicode string. - - def comment(self, comment): - self.__flush() - self.__write("\n" % escape_cdata(comment, self.__encoding)) - - ## - # Adds character data to the output stream. - # - # @param text Character data, as an 8-bit string or Unicode string. - - def data(self, text): - self.__data.append(text) - - ## - # Closes the current element (opened by the most recent call to - # start). - # - # @param tag Element tag. If given, the tag must match the start - # tag. If omitted, the current element is closed. - - def end(self, tag=None): - if tag: - assert self.__tags, "unbalanced end(%s)" % tag - assert escape_cdata(tag, self.__encoding) == self.__tags[-1],\ - "expected end(%s), got %s" % (self.__tags[-1], tag) - else: - assert self.__tags, "unbalanced end()" - tag = self.__tags.pop() - if self.__data: - self.__flush() - elif self.__open: - self.__open = 0 - self.__write(" />") - return - self.__write("" % tag) - - ## - # Closes open elements, up to (and including) the element identified - # by the given identifier. - # - # @param id Element identifier, as returned by the start method. - - def close(self, id): - while len(self.__tags) > id: - self.end() - - ## - # Adds an entire element. This is the same as calling start, - # data, and end in sequence. The text argument - # can be omitted. - - def element(self, tag, text=None, attrib={}, **extra): - apply(self.start, (tag, attrib), extra) - if text: - self.data(text) - self.end() - - ## - # Flushes the output stream. - - def flush(self): - pass # replaced by the constructor +# +# SimpleXMLWriter +# $Id: SimpleXMLWriter.py 2312 2005-03-02 18:13:39Z fredrik $ +# +# a simple XML writer +# +# history: +# 2001-12-28 fl created +# 2002-11-25 fl fixed attribute encoding +# 2002-12-02 fl minor fixes for 1.5.2 +# 2004-06-17 fl added pythondoc markup +# 2004-07-23 fl added flush method (from Jay Graves) +# 2004-10-03 fl added declaration method +# +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The SimpleXMLWriter module is +# +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to write XML files, without having to deal with encoding +# issues, well-formedness, etc. +#

+# The current version does not provide built-in support for +# namespaces. To create files using namespaces, you have to provide +# "xmlns" attributes and explicitly add prefixes to tags and +# attributes. +# +#

Patterns

+# +# The following example generates a small XHTML document. +#
+#
+# from elementtree.SimpleXMLWriter import XMLWriter
+# import sys
+#
+# w = XMLWriter(sys.stdout)
+#
+# html = w.start("html")
+#
+# w.start("head")
+# w.element("title", "my document")
+# w.element("meta", name="generator", value="my application 1.0")
+# w.end()
+#
+# w.start("body")
+# w.element("h1", "this is a heading")
+# w.element("p", "this is a paragraph")
+#
+# w.start("p")
+# w.data("this is ")
+# w.element("b", "bold")
+# w.data(" and ")
+# w.element("i", "italic")
+# w.data(".")
+# w.end("p")
+#
+# w.close(html)
+# 
+## + +import re, sys, string + +try: + unicode("") +except NameError: + def encode(s, encoding): + # 1.5.2: application must use the right encoding + return s + _escape = re.compile(r"[&<>\"\x80-\xff]+") # 1.5.2 +else: + def encode(s, encoding): + return s.encode(encoding) + _escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) + +def encode_entity(text, pattern=_escape): + # map reserved and non-ascii characters to numerical entities + def escape_entities(m): + out = [] + for char in m.group(): + out.append("&#%d;" % ord(char)) + return string.join(out, "") + return encode(pattern.sub(escape_entities, text), "ascii") + +del _escape + +# +# the following functions assume an ascii-compatible encoding +# (or "utf-16") + +def escape_cdata(s, encoding=None, replace=string.replace): + s = replace(s, "&", "&") + s = replace(s, "<", "<") + s = replace(s, ">", ">") + if encoding: + try: + return encode(s, encoding) + except UnicodeError: + return encode_entity(s) + return s + +def escape_attrib(s, encoding=None, replace=string.replace): + s = replace(s, "&", "&") + s = replace(s, "'", "'") + s = replace(s, "\"", """) + s = replace(s, "<", "<") + s = replace(s, ">", ">") + if encoding: + try: + return encode(s, encoding) + except UnicodeError: + return encode_entity(s) + return s + +## +# XML writer class. +# +# @param file A file or file-like object. This object must implement +# a write method that takes an 8-bit string. +# @param encoding Optional encoding. + +class XMLWriter: + + def __init__(self, file, encoding="us-ascii"): + if not hasattr(file, "write"): + file = open(file, "w") + self.__write = file.write + if hasattr(file, "flush"): + self.flush = file.flush + self.__open = 0 # true if start tag is open + self.__tags = [] + self.__data = [] + self.__encoding = encoding + + def __flush(self): + # flush internal buffers + if self.__open: + self.__write(">") + self.__open = 0 + if self.__data: + data = string.join(self.__data, "") + self.__write(escape_cdata(data, self.__encoding)) + self.__data = [] + + ## + # Writes an XML declaration. + + def declaration(self): + encoding = self.__encoding + if encoding == "us-ascii" or encoding == "utf-8": + self.__write("\n") + else: + self.__write("\n" % encoding) + + ## + # Opens a new element. Attributes can be given as keyword + # arguments, or as a string/string dictionary. You can pass in + # 8-bit strings or Unicode strings; the former are assumed to use + # the encoding passed to the constructor. The method returns an + # opaque identifier that can be passed to the close method, + # to close all open elements up to and including this one. + # + # @param tag Element tag. + # @param attrib Attribute dictionary. Alternatively, attributes + # can be given as keyword arguments. + # @return An element identifier. + + def start(self, tag, attrib={}, **extra): + self.__flush() + tag = escape_cdata(tag, self.__encoding) + self.__data = [] + self.__tags.append(tag) + self.__write("<%s" % tag) + if attrib or extra: + attrib = attrib.copy() + attrib.update(extra) + attrib = attrib.items() + attrib.sort() + for k, v in attrib: + k = escape_cdata(k, self.__encoding) + v = escape_attrib(v, self.__encoding) + self.__write(" %s=\"%s\"" % (k, v)) + self.__open = 1 + return len(self.__tags)-1 + + ## + # Adds a comment to the output stream. + # + # @param comment Comment text, as an 8-bit string or Unicode string. + + def comment(self, comment): + self.__flush() + self.__write("\n" % escape_cdata(comment, self.__encoding)) + + ## + # Adds character data to the output stream. + # + # @param text Character data, as an 8-bit string or Unicode string. + + def data(self, text): + self.__data.append(text) + + ## + # Closes the current element (opened by the most recent call to + # start). + # + # @param tag Element tag. If given, the tag must match the start + # tag. If omitted, the current element is closed. + + def end(self, tag=None): + if tag: + assert self.__tags, "unbalanced end(%s)" % tag + assert escape_cdata(tag, self.__encoding) == self.__tags[-1],\ + "expected end(%s), got %s" % (self.__tags[-1], tag) + else: + assert self.__tags, "unbalanced end()" + tag = self.__tags.pop() + if self.__data: + self.__flush() + elif self.__open: + self.__open = 0 + self.__write(" />") + return + self.__write("" % tag) + + ## + # Closes open elements, up to (and including) the element identified + # by the given identifier. + # + # @param id Element identifier, as returned by the start method. + + def close(self, id): + while len(self.__tags) > id: + self.end() + + ## + # Adds an entire element. This is the same as calling start, + # data, and end in sequence. The text argument + # can be omitted. + + def element(self, tag, text=None, attrib={}, **extra): + apply(self.start, (tag, attrib), extra) + if text: + self.data(text) + self.end() + + ## + # Flushes the output stream. + + def flush(self): + pass # replaced by the constructor Modified: external/elementtree-1.2.6-20050316/elementtree/TidyHTMLTreeBuilder.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/TidyHTMLTreeBuilder.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/TidyHTMLTreeBuilder.py Wed Dec 14 19:33:39 2005 @@ -1,6 +1,6 @@ -# -# ElementTree -# $Id: TidyHTMLTreeBuilder.py 2304 2005-03-01 17:42:41Z fredrik $ -# - -from elementtidy.TidyHTMLTreeBuilder import * +# +# ElementTree +# $Id: TidyHTMLTreeBuilder.py 2304 2005-03-01 17:42:41Z fredrik $ +# + +from elementtidy.TidyHTMLTreeBuilder import * Modified: external/elementtree-1.2.6-20050316/elementtree/TidyTools.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/TidyTools.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/TidyTools.py Wed Dec 14 19:33:39 2005 @@ -1,128 +1,128 @@ -# -# ElementTree -# $Id: TidyTools.py 1862 2004-06-18 07:31:02Z Fredrik $ -# -# tools to run the "tidy" command on an HTML or XHTML file, and return -# the contents as an XHTML element tree. -# -# history: -# 2002-10-19 fl added to ElementTree library; added getzonebody function -# -# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# - -## -# Tools to build element trees from HTML, using the external tidy -# utility. -## - -import glob, string, os, sys - -from ElementTree import ElementTree, Element - -NS_XHTML = "{http://www.w3.org/1999/xhtml}" - -## -# Convert an HTML or HTML-like file to XHTML, using the tidy -# command line utility. -# -# @param file Filename. -# @param new_inline_tags An optional list of valid but non-standard -# inline tags. -# @return An element tree, or None if not successful. - -def tidy(file, new_inline_tags=None): - - command = ["tidy", "-qn", "-asxml"] - - if new_inline_tags: - command.append("--new-inline-tags") - command.append(string.join(new_inline_tags, ",")) - - # FIXME: support more tidy options! - - # convert - os.system( - "%s %s >%s.out 2>%s.err" % (string.join(command), file, file, file) - ) - # check that the result is valid XML - try: - tree = ElementTree() - tree.parse(file + ".out") - except: - print "*** %s:%s" % sys.exc_info()[:2] - print ("*** %s is not valid XML " - "(check %s.err for info)" % (file, file)) - tree = None - else: - if os.path.isfile(file + ".out"): - os.remove(file + ".out") - if os.path.isfile(file + ".err"): - os.remove(file + ".err") - - return tree - -## -# Get document body from a an HTML or HTML-like file. This function -# uses the tidy function to convert HTML to XHTML, and cleans -# up the resulting XML tree. -# -# @param file Filename. -# @return A body element, or None if not successful. - -def getbody(file, **options): - # get clean body from text file - - # get xhtml tree - try: - tree = apply(tidy, (file,), options) - if tree is None: - return - except IOError, v: - print "***", v - return None - - NS = NS_XHTML - - # remove namespace uris - for node in tree.getiterator(): - if node.tag.startswith(NS): - node.tag = node.tag[len(NS):] - - body = tree.getroot().find("body") - - return body - -## -# Same as getbody, but turns plain text at the start of the -# document into an H1 tag. This function can be used to parse zone -# documents. -# -# @param file Filename. -# @return A body element, or None if not successful. - -def getzonebody(file, **options): - - body = getbody(file, **options) - if body is None: - return - - if body.text and string.strip(body.text): - title = Element("h1") - title.text = string.strip(body.text) - title.tail = "\n\n" - body.insert(0, title) - - body.text = None - - return body - -if __name__ == "__main__": - - import sys - for arg in sys.argv[1:]: - for file in glob.glob(arg): - print file, "...", tidy(file) +# +# ElementTree +# $Id: TidyTools.py 1862 2004-06-18 07:31:02Z Fredrik $ +# +# tools to run the "tidy" command on an HTML or XHTML file, and return +# the contents as an XHTML element tree. +# +# history: +# 2002-10-19 fl added to ElementTree library; added getzonebody function +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# + +## +# Tools to build element trees from HTML, using the external tidy +# utility. +## + +import glob, string, os, sys + +from ElementTree import ElementTree, Element + +NS_XHTML = "{http://www.w3.org/1999/xhtml}" + +## +# Convert an HTML or HTML-like file to XHTML, using the tidy +# command line utility. +# +# @param file Filename. +# @param new_inline_tags An optional list of valid but non-standard +# inline tags. +# @return An element tree, or None if not successful. + +def tidy(file, new_inline_tags=None): + + command = ["tidy", "-qn", "-asxml"] + + if new_inline_tags: + command.append("--new-inline-tags") + command.append(string.join(new_inline_tags, ",")) + + # FIXME: support more tidy options! + + # convert + os.system( + "%s %s >%s.out 2>%s.err" % (string.join(command), file, file, file) + ) + # check that the result is valid XML + try: + tree = ElementTree() + tree.parse(file + ".out") + except: + print "*** %s:%s" % sys.exc_info()[:2] + print ("*** %s is not valid XML " + "(check %s.err for info)" % (file, file)) + tree = None + else: + if os.path.isfile(file + ".out"): + os.remove(file + ".out") + if os.path.isfile(file + ".err"): + os.remove(file + ".err") + + return tree + +## +# Get document body from a an HTML or HTML-like file. This function +# uses the tidy function to convert HTML to XHTML, and cleans +# up the resulting XML tree. +# +# @param file Filename. +# @return A body element, or None if not successful. + +def getbody(file, **options): + # get clean body from text file + + # get xhtml tree + try: + tree = apply(tidy, (file,), options) + if tree is None: + return + except IOError, v: + print "***", v + return None + + NS = NS_XHTML + + # remove namespace uris + for node in tree.getiterator(): + if node.tag.startswith(NS): + node.tag = node.tag[len(NS):] + + body = tree.getroot().find("body") + + return body + +## +# Same as getbody, but turns plain text at the start of the +# document into an H1 tag. This function can be used to parse zone +# documents. +# +# @param file Filename. +# @return A body element, or None if not successful. + +def getzonebody(file, **options): + + body = getbody(file, **options) + if body is None: + return + + if body.text and string.strip(body.text): + title = Element("h1") + title.text = string.strip(body.text) + title.tail = "\n\n" + body.insert(0, title) + + body.text = None + + return body + +if __name__ == "__main__": + + import sys + for arg in sys.argv[1:]: + for file in glob.glob(arg): + print file, "...", tidy(file) Modified: external/elementtree-1.2.6-20050316/elementtree/XMLTreeBuilder.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/XMLTreeBuilder.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/XMLTreeBuilder.py Wed Dec 14 19:33:39 2005 @@ -1,113 +1,113 @@ -# -# ElementTree -# $Id: XMLTreeBuilder.py 2305 2005-03-01 17:43:09Z fredrik $ -# -# an XML tree builder -# -# history: -# 2001-10-20 fl created -# 2002-05-01 fl added namespace support for xmllib -# 2002-07-27 fl require expat (1.5.2 code can use SimpleXMLTreeBuilder) -# 2002-08-17 fl use tag/attribute name memo cache -# 2002-12-04 fl moved XMLTreeBuilder to the ElementTree module -# -# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. -# -# fredrik at pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- - -## -# Tools to build element trees from XML files. -## - -import ElementTree - -## -# (obsolete) ElementTree builder for XML source data, based on the -# expat parser. -#

-# This class is an alias for ElementTree.XMLTreeBuilder. New code -# should use that version instead. -# -# @see elementtree.ElementTree - -class TreeBuilder(ElementTree.XMLTreeBuilder): - pass - -## -# (experimental) An alternate builder that supports manipulation of -# new elements. - -class FancyTreeBuilder(TreeBuilder): - - def __init__(self, html=0): - TreeBuilder.__init__(self, html) - self._parser.StartNamespaceDeclHandler = self._start_ns - self._parser.EndNamespaceDeclHandler = self._end_ns - self.namespaces = [] - - def _start(self, tag, attrib_in): - elem = TreeBuilder._start(self, tag, attrib_in) - self.start(elem) - - def _start_list(self, tag, attrib_in): - elem = TreeBuilder._start_list(self, tag, attrib_in) - self.start(elem) - - def _end(self, tag): - elem = TreeBuilder._end(self, tag) - self.end(elem) - - def _start_ns(self, prefix, value): - self.namespaces.insert(0, (prefix, value)) - - def _end_ns(self, prefix): - assert self.namespaces.pop(0)[0] == prefix, "implementation confused" - - ## - # Hook method that's called when a new element has been opened. - # May access the namespaces attribute. - # - # @param element The new element. The tag name and attributes are, - # set, but it has no children, and the text and tail attributes - # are still empty. - - def start(self, element): - pass - - ## - # Hook method that's called when a new element has been closed. - # May access the namespaces attribute. - # - # @param element The new element. - - def end(self, element): - pass +# +# ElementTree +# $Id: XMLTreeBuilder.py 2305 2005-03-01 17:43:09Z fredrik $ +# +# an XML tree builder +# +# history: +# 2001-10-20 fl created +# 2002-05-01 fl added namespace support for xmllib +# 2002-07-27 fl require expat (1.5.2 code can use SimpleXMLTreeBuilder) +# 2002-08-17 fl use tag/attribute name memo cache +# 2002-12-04 fl moved XMLTreeBuilder to the ElementTree module +# +# Copyright (c) 1999-2004 by Fredrik Lundh. All rights reserved. +# +# fredrik at pythonware.com +# http://www.pythonware.com +# +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- + +## +# Tools to build element trees from XML files. +## + +import ElementTree + +## +# (obsolete) ElementTree builder for XML source data, based on the +# expat parser. +#

+# This class is an alias for ElementTree.XMLTreeBuilder. New code +# should use that version instead. +# +# @see elementtree.ElementTree + +class TreeBuilder(ElementTree.XMLTreeBuilder): + pass + +## +# (experimental) An alternate builder that supports manipulation of +# new elements. + +class FancyTreeBuilder(TreeBuilder): + + def __init__(self, html=0): + TreeBuilder.__init__(self, html) + self._parser.StartNamespaceDeclHandler = self._start_ns + self._parser.EndNamespaceDeclHandler = self._end_ns + self.namespaces = [] + + def _start(self, tag, attrib_in): + elem = TreeBuilder._start(self, tag, attrib_in) + self.start(elem) + + def _start_list(self, tag, attrib_in): + elem = TreeBuilder._start_list(self, tag, attrib_in) + self.start(elem) + + def _end(self, tag): + elem = TreeBuilder._end(self, tag) + self.end(elem) + + def _start_ns(self, prefix, value): + self.namespaces.insert(0, (prefix, value)) + + def _end_ns(self, prefix): + assert self.namespaces.pop(0)[0] == prefix, "implementation confused" + + ## + # Hook method that's called when a new element has been opened. + # May access the namespaces attribute. + # + # @param element The new element. The tag name and attributes are, + # set, but it has no children, and the text and tail attributes + # are still empty. + + def start(self, element): + pass + + ## + # Hook method that's called when a new element has been closed. + # May access the namespaces attribute. + # + # @param element The new element. + + def end(self, element): + pass Modified: external/elementtree-1.2.6-20050316/elementtree/__init__.py ============================================================================== --- external/elementtree-1.2.6-20050316/elementtree/__init__.py (original) +++ external/elementtree-1.2.6-20050316/elementtree/__init__.py Wed Dec 14 19:33:39 2005 @@ -1,30 +1,30 @@ -# $Id: __init__.py 1821 2004-06-03 16:57:49Z fredrik $ -# elementtree package - -# -------------------------------------------------------------------- -# The ElementTree toolkit is -# -# Copyright (c) 1999-2004 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# 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. -# -------------------------------------------------------------------- +# $Id: __init__.py 1821 2004-06-03 16:57:49Z fredrik $ +# elementtree package + +# -------------------------------------------------------------------- +# The ElementTree toolkit is +# +# Copyright (c) 1999-2004 by Fredrik Lundh +# +# By obtaining, using, and/or copying this software and/or its +# associated documentation, you agree that you have read, understood, +# and will comply with the following terms and conditions: +# +# Permission to use, copy, modify, and distribute this software and +# its associated documentation for any purpose and without fee is +# hereby granted, provided that the above copyright notice appears in +# all copies, and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Secret Labs AB or the author not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- +# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR +# 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. +# -------------------------------------------------------------------- Modified: external/elementtree-1.2.6-20050316/samples/simple-ns.xml ============================================================================== --- external/elementtree-1.2.6-20050316/samples/simple-ns.xml (original) +++ external/elementtree-1.2.6-20050316/samples/simple-ns.xml Wed Dec 14 19:33:39 2005 @@ -1,5 +1,5 @@ - - text - texttail - - + + text + texttail + + Modified: external/elementtree-1.2.6-20050316/samples/simple.xml ============================================================================== --- external/elementtree-1.2.6-20050316/samples/simple.xml (original) +++ external/elementtree-1.2.6-20050316/samples/simple.xml Wed Dec 14 19:33:39 2005 @@ -1,5 +1,5 @@ - - text - texttail - - + + text + texttail + + Modified: external/elementtree-1.2.6-20050316/selftest.py ============================================================================== --- external/elementtree-1.2.6-20050316/selftest.py (original) +++ external/elementtree-1.2.6-20050316/selftest.py Wed Dec 14 19:33:39 2005 @@ -1,1005 +1,1005 @@ -# $Id: selftest.py 2326 2005-03-17 07:45:21Z fredrik $ -# -*- coding: iso-8859-1 -*- -# elementtree selftest program - -# this test script uses Python's "doctest" module to check that the -# *test script* works as expected. - -# TODO: add more elementtree method tests -# TODO: add xml/html parsing tests -# TODO: etc - -import sys, string, StringIO - -from elementtree import ElementTree -from elementtree import ElementPath -from elementtree import ElementInclude -from elementtree import HTMLTreeBuilder -from elementtree import SimpleXMLWriter - -def serialize(elem, encoding=None): - import StringIO - file = StringIO.StringIO() - tree = ElementTree.ElementTree(elem) - if encoding: - tree.write(file, encoding) - else: - tree.write(file) - return file.getvalue() - -def summarize(elem): - return elem.tag - -def summarize_list(seq): - return map(summarize, seq) - -def normalize_crlf(tree): - for elem in tree.getiterator(): - if elem.text: elem.text = string.replace(elem.text, "\r\n", "\n") - if elem.tail: elem.tail = string.replace(elem.tail, "\r\n", "\n") - -SAMPLE_XML = ElementTree.XML(""" - - text - -

- subtext -
- -""") - -# -# interface tests - -def check_string(string): - len(string) - for char in string: - if len(char) != 1: - print "expected one-character string, got %r" % char - new_string = string + "" - new_string = string + " " - string[:0] - -def check_string_or_none(value): - if value is None: - return - return check_string(value) - -def check_mapping(mapping): - len(mapping) - keys = mapping.keys() - items = mapping.items() - for key in keys: - item = mapping[key] - mapping["key"] = "value" - if mapping["key"] != "value": - print "expected value string, got %r" % mapping["key"] - -def check_element(element): - if not hasattr(element, "tag"): - print "no tag member" - if not hasattr(element, "attrib"): - print "no attrib member" - if not hasattr(element, "text"): - print "no text member" - if not hasattr(element, "tail"): - print "no tail member" - check_string(element.tag) - check_mapping(element.attrib) - check_string_or_none(element.text) - check_string_or_none(element.tail) - for elem in element: - check_element(elem) - -def check_element_tree(tree): - check_element(tree.getroot()) - -# -------------------------------------------------------------------- -# element tree tests - -def sanity(): - """ - >>> from elementtree.ElementTree import * - >>> from elementtree.ElementInclude import * - >>> from elementtree.ElementPath import * - >>> from elementtree.HTMLTreeBuilder import * - >>> from elementtree.SimpleXMLTreeBuilder import * - >>> from elementtree.SimpleXMLWriter import * - >>> from elementtree.TidyTools import * - >>> from elementtree.XMLTreeBuilder import * - """ - -def version(): - """ - >>> ElementTree.VERSION - '1.2.6' - """ - -def interface(): - """ - Test element tree interface. - - >>> element = ElementTree.Element("tag") - >>> check_element(element) - >>> tree = ElementTree.ElementTree(element) - >>> check_element_tree(tree) - """ - -def simplefind(): - """ - Test find methods using the elementpath fallback. - - >>> CurrentElementPath = ElementTree.ElementPath - >>> ElementTree.ElementPath = ElementTree._SimpleElementPath() - >>> elem = SAMPLE_XML - >>> elem.find("tag").tag - 'tag' - >>> ElementTree.ElementTree(elem).find("tag").tag - 'tag' - >>> elem.findtext("tag") - 'text' - >>> elem.findtext("tog") - >>> elem.findtext("tog", "default") - 'default' - >>> ElementTree.ElementTree(elem).findtext("tag") - 'text' - >>> summarize_list(elem.findall("tag")) - ['tag', 'tag'] - >>> summarize_list(elem.findall(".//tag")) - ['tag', 'tag', 'tag'] - - Path syntax doesn't work in this case. - - >>> elem.find("section/tag") - >>> elem.findtext("section/tag") - >>> elem.findall("section/tag") - [] - - >>> ElementTree.ElementPath = CurrentElementPath - """ - -def find(): - """ - Test find methods (including xpath syntax). - - >>> elem = SAMPLE_XML - >>> elem.find("tag").tag - 'tag' - >>> ElementTree.ElementTree(elem).find("tag").tag - 'tag' - >>> elem.find("section/tag").tag - 'tag' - >>> ElementTree.ElementTree(elem).find("section/tag").tag - 'tag' - >>> elem.findtext("tag") - 'text' - >>> elem.findtext("tog") - >>> elem.findtext("tog", "default") - 'default' - >>> ElementTree.ElementTree(elem).findtext("tag") - 'text' - >>> elem.findtext("section/tag") - 'subtext' - >>> ElementTree.ElementTree(elem).findtext("section/tag") - 'subtext' - >>> summarize_list(elem.findall("tag")) - ['tag', 'tag'] - >>> summarize_list(elem.findall("*")) - ['tag', 'tag', 'section'] - >>> summarize_list(elem.findall(".//tag")) - ['tag', 'tag', 'tag'] - >>> summarize_list(elem.findall("section/tag")) - ['tag'] - >>> summarize_list(elem.findall("section//tag")) - ['tag'] - >>> summarize_list(elem.findall("section/*")) - ['tag'] - >>> summarize_list(elem.findall("section//*")) - ['tag'] - >>> summarize_list(elem.findall("section/.//*")) - ['tag'] - >>> summarize_list(elem.findall("*/*")) - ['tag'] - >>> summarize_list(elem.findall("*//*")) - ['tag'] - >>> summarize_list(elem.findall("*/tag")) - ['tag'] - >>> summarize_list(elem.findall("*/./tag")) - ['tag'] - >>> summarize_list(elem.findall("./tag")) - ['tag', 'tag'] - >>> summarize_list(elem.findall(".//tag")) - ['tag', 'tag', 'tag'] - >>> summarize_list(elem.findall("././tag")) - ['tag', 'tag'] - >>> summarize_list(ElementTree.ElementTree(elem).findall("/tag")) - ['tag', 'tag'] - >>> summarize_list(ElementTree.ElementTree(elem).findall("./tag")) - ['tag', 'tag'] - """ - -def bad_find(): - """ - Check bad or unsupported path expressions. - - >>> elem = SAMPLE_XML - >>> elem.findall("/tag") - Traceback (most recent call last): - SyntaxError: cannot use absolute path on element - >>> elem.findall("../tag") - Traceback (most recent call last): - SyntaxError: unsupported path syntax (..) - >>> elem.findall("section//") - Traceback (most recent call last): - SyntaxError: path cannot end with // - >>> elem.findall("tag[tag]") - Traceback (most recent call last): - SyntaxError: expected path separator ([) - """ - -def parsefile(): - """ - Test parsing from file. - - >>> tree = ElementTree.parse("samples/simple.xml") - >>> normalize_crlf(tree) - >>> tree.write(sys.stdout) - - text - texttail - - - >>> tree = ElementTree.parse("samples/simple-ns.xml") - >>> normalize_crlf(tree) - >>> tree.write(sys.stdout) - - text - texttail - - - """ - -def parsehtml(): - """ - Test HTML parsing. - - >>> p = HTMLTreeBuilder.TreeBuilder() - >>> p.feed("

spamegg

") - >>> serialize(p.close()) - '

spamegg

' - """ - -def parseliteral(): - r""" - >>> element = ElementTree.XML("text") - >>> ElementTree.ElementTree(element).write(sys.stdout) - text - >>> element = ElementTree.fromstring("text") - >>> ElementTree.ElementTree(element).write(sys.stdout) - text - >>> print ElementTree.tostring(element) - text - >>> print ElementTree.tostring(element, "ascii") - - text - >>> _, ids = ElementTree.XMLID("text") - >>> len(ids) - 0 - >>> _, ids = ElementTree.XMLID("text") - >>> len(ids) - 1 - >>> ids["body"].tag - 'body' - """ - -def simpleparsefile(): - """ - Test the xmllib-based parser. - - >>> from elementtree import SimpleXMLTreeBuilder - >>> parser = SimpleXMLTreeBuilder.TreeBuilder() - >>> tree = ElementTree.parse("samples/simple.xml", parser) - >>> normalize_crlf(tree) - >>> tree.write(sys.stdout) - - text - texttail - - - """ - -def iterparse(): - """ - Test iterparse interface. - - >>> iterparse = ElementTree.iterparse - - >>> context = iterparse("samples/simple.xml") - >>> for action, elem in context: - ... print action, elem.tag - end element - end element - end empty-element - end root - >>> context.root.tag - 'root' - - >>> context = iterparse("samples/simple-ns.xml") - >>> for action, elem in context: - ... print action, elem.tag - end {namespace}element - end {namespace}element - end {namespace}empty-element - end {namespace}root - - >>> events = () - >>> context = iterparse("samples/simple.xml", events) - >>> for action, elem in context: - ... print action, elem.tag - - >>> events = () - >>> context = iterparse("samples/simple.xml", events=events) - >>> for action, elem in context: - ... print action, elem.tag - - >>> events = ("start", "end") - >>> context = iterparse("samples/simple.xml", events) - >>> for action, elem in context: - ... print action, elem.tag - start root - start element - end element - start element - end element - start empty-element - end empty-element - end root - - >>> events = ("start", "end", "start-ns", "end-ns") - >>> context = iterparse("samples/simple-ns.xml", events) - >>> for action, elem in context: - ... if action in ("start", "end"): - ... print action, elem.tag - ... else: - ... print action, elem - start-ns ('', 'namespace') - start {namespace}root - start {namespace}element - end {namespace}element - start {namespace}element - end {namespace}element - start {namespace}empty-element - end {namespace}empty-element - end {namespace}root - end-ns None - - """ - -def fancyparsefile(): - """ - Test the "fancy" parser. - - Sanity check. - >>> from elementtree import XMLTreeBuilder - >>> parser = XMLTreeBuilder.FancyTreeBuilder() - >>> tree = ElementTree.parse("samples/simple.xml", parser) - >>> normalize_crlf(tree) - >>> tree.write(sys.stdout) - - text - texttail - - - - Callback check. - >>> class MyFancyParser(XMLTreeBuilder.FancyTreeBuilder): - ... def start(self, elem): - ... print "START", elem.tag - ... def end(self, elem): - ... print "END", elem.tag - >>> parser = MyFancyParser() - >>> tree = ElementTree.parse("samples/simple.xml", parser) - START root - START element - END element - START element - END element - START empty-element - END empty-element - END root - """ - -def writefile(): - """ - >>> elem = ElementTree.Element("tag") - >>> elem.text = "text" - >>> serialize(elem) - 'text' - >>> ElementTree.SubElement(elem, "subtag").text = "subtext" - >>> serialize(elem) - 'textsubtext' - """ - -def writestring(): - """ - >>> elem = ElementTree.XML("text") - >>> ElementTree.tostring(elem) - 'text' - >>> elem = ElementTree.fromstring("text") - >>> ElementTree.tostring(elem) - 'text' - """ - -def encoding(): - r""" - Test encoding issues. - - >>> elem = ElementTree.Element("tag") - >>> elem.text = u"abc" - >>> serialize(elem) - 'abc' - >>> serialize(elem, "utf-8") - 'abc' - >>> serialize(elem, "us-ascii") - 'abc' - >>> serialize(elem, "iso-8859-1") - "\nabc" - - >>> elem.text = "<&\"\'>" - >>> serialize(elem) - '<&"\'>' - >>> serialize(elem, "utf-8") - '<&"\'>' - >>> serialize(elem, "us-ascii") # cdata characters - '<&"\'>' - >>> serialize(elem, "iso-8859-1") - '\n<&"\'>' - - >>> elem.attrib["key"] = "<&\"\'>" - >>> elem.text = None - >>> serialize(elem) - '' - >>> serialize(elem, "utf-8") - '' - >>> serialize(elem, "us-ascii") - '' - >>> serialize(elem, "iso-8859-1") - '\n' - - >>> elem.text = u'\xe5\xf6\xf6<>' - >>> elem.attrib.clear() - >>> serialize(elem) - 'åöö<>' - >>> serialize(elem, "utf-8") - '\xc3\xa5\xc3\xb6\xc3\xb6<>' - >>> serialize(elem, "us-ascii") - 'åöö<>' - >>> serialize(elem, "iso-8859-1") - "\n\xe5\xf6\xf6<>" - - >>> elem.attrib["key"] = u'\xe5\xf6\xf6<>' - >>> elem.text = None - >>> serialize(elem) - '' - >>> serialize(elem, "utf-8") - '' - >>> serialize(elem, "us-ascii") - '' - >>> serialize(elem, "iso-8859-1") - '\n' - - """ - -ENTITY_XML = """\ - -%user-entities; -]> -&entity; -""" - -def entity(): - """ - Test entity handling. - - 1) bad entities - - >>> ElementTree.XML("&entity;") - Traceback (most recent call last): - ExpatError: undefined entity: line 1, column 10 - - >>> ElementTree.XML(ENTITY_XML) - Traceback (most recent call last): - ExpatError: undefined entity &entity;: line 5, column 10 - - (add more tests here) - - """ - -def namespace(): - """ - Test namespace issues. - - 1) xml namespace - - >>> elem = ElementTree.XML("") - >>> serialize(elem) # 1.1 - '' - - 2) other "well-known" namespaces - - >>> elem = ElementTree.XML("") - >>> serialize(elem) # 2.1 - '' - - >>> elem = ElementTree.XML("") - >>> serialize(elem) # 2.2 - '' - - >>> elem = ElementTree.XML("") - >>> serialize(elem) # 2.3 - '' - - 3) unknown namespaces - - """ - -def qname(): - """ - Test QName handling. - - 1) decorated tags - - >>> elem = ElementTree.Element("{uri}tag") - >>> serialize(elem) # 1.1 - '' - >>> elem = ElementTree.Element(ElementTree.QName("{uri}tag")) - >>> serialize(elem) # 1.2 - '' - >>> elem = ElementTree.Element(ElementTree.QName("uri", "tag")) - >>> serialize(elem) # 1.3 - '' - - 2) decorated attributes - - >>> elem.clear() - >>> elem.attrib["{uri}key"] = "value" - >>> serialize(elem) # 2.1 - '' - - >>> elem.clear() - >>> elem.attrib[ElementTree.QName("{uri}key")] = "value" - >>> serialize(elem) # 2.2 - '' - - 3) decorated values are not converted by default, but the - QName wrapper can be used for values - - >>> elem.clear() - >>> elem.attrib["{uri}key"] = "{uri}value" - >>> serialize(elem) # 3.1 - '' - - >>> elem.clear() - >>> elem.attrib["{uri}key"] = ElementTree.QName("{uri}value") - >>> serialize(elem) # 3.2 - '' - - >>> elem.clear() - >>> subelem = ElementTree.Element("tag") - >>> subelem.attrib["{uri1}key"] = ElementTree.QName("{uri2}value") - >>> elem.append(subelem) - >>> elem.append(subelem) - >>> serialize(elem) # 3.3 - '' - - """ - -def xpath_tokenizer(p): - """ - Test the XPath tokenizer. - - >>> # tests from the xml specification - >>> xpath_tokenizer("*") - ['*'] - >>> xpath_tokenizer("text()") - ['text', '()'] - >>> xpath_tokenizer("@name") - ['@', 'name'] - >>> xpath_tokenizer("@*") - ['@', '*'] - >>> xpath_tokenizer("para[1]") - ['para', '[', '1', ']'] - >>> xpath_tokenizer("para[last()]") - ['para', '[', 'last', '()', ']'] - >>> xpath_tokenizer("*/para") - ['*', '/', 'para'] - >>> xpath_tokenizer("/doc/chapter[5]/section[2]") - ['/', 'doc', '/', 'chapter', '[', '5', ']', '/', 'section', '[', '2', ']'] - >>> xpath_tokenizer("chapter//para") - ['chapter', '/', '/', 'para'] - >>> xpath_tokenizer("//para") - ['/', '/', 'para'] - >>> xpath_tokenizer("//olist/item") - ['/', '/', 'olist', '/', 'item'] - >>> xpath_tokenizer(".") - ['.'] - >>> xpath_tokenizer(".//para") - ['.', '/', '/', 'para'] - >>> xpath_tokenizer("..") - ['..'] - >>> xpath_tokenizer("../@lang") - ['..', '/', '@', 'lang'] - >>> xpath_tokenizer("chapter[title]") - ['chapter', '[', 'title', ']'] - >>> xpath_tokenizer("employee[@secretary and @assistant]") - ['employee', '[', '@', 'secretary', '', 'and', '', '@', 'assistant', ']'] - - >>> # additional tests - >>> xpath_tokenizer("{http://spam}egg") - ['{http://spam}egg'] - >>> xpath_tokenizer("./spam.egg") - ['.', '/', 'spam.egg'] - >>> xpath_tokenizer(".//{http://spam}egg") - ['.', '/', '/', '{http://spam}egg'] - """ - out = [] - for op, tag in ElementPath.xpath_tokenizer(p): - out.append(op or tag) - return out - -# -# xinclude tests (samples from appendix C of the xinclude specification) - -XINCLUDE = {} - -XINCLUDE["C1.xml"] = """\ - - -

120 Mz is adequate for an average home user.

- -
-""" - -XINCLUDE["disclaimer.xml"] = """\ - - -

The opinions represented herein represent those of the individual - and should not be interpreted as official policy endorsed by this - organization.

-
-""" - -XINCLUDE["C2.xml"] = """\ - - -

This document has been accessed - times.

-
-""" - -XINCLUDE["count.txt"] = "324387" - -XINCLUDE["C3.xml"] = """\ - - -

The following is the source of the "data.xml" resource:

- -
-""" - -XINCLUDE["data.xml"] = """\ - - - - -""" - -XINCLUDE["C5.xml"] = """\ - -
- - - - Report error - - - -
-""" - -XINCLUDE["default.xml"] = """\ - - -

Example.

- -
-""" - -def xinclude_loader(href, parse="xml", encoding=None): - try: - data = XINCLUDE[href] - except KeyError: - raise IOError("resource not found") - if parse == "xml": - return ElementTree.XML(data) - return data - -def xinclude(): - r""" - Basic inclusion example (XInclude C.1) - - >>> document = xinclude_loader("C1.xml") - >>> ElementInclude.include(document, xinclude_loader) - >>> print serialize(document) # C1 - -

120 Mz is adequate for an average home user.

- -

The opinions represented herein represent those of the individual - and should not be interpreted as official policy endorsed by this - organization.

-
-
- - Textual inclusion example (XInclude C.2) - - >>> document = xinclude_loader("C2.xml") - >>> ElementInclude.include(document, xinclude_loader) - >>> print serialize(document) # C2 - -

This document has been accessed - 324387 times.

-
- - Textual inclusion of XML example (XInclude C.3) - - >>> document = xinclude_loader("C3.xml") - >>> ElementInclude.include(document, xinclude_loader) - >>> print serialize(document) # C3 - -

The following is the source of the "data.xml" resource:

- <?xml version='1.0'?> - <data> - <item><![CDATA[Brooks & Shields]]></item> - </data> - -
- - Fallback example (XInclude C.5) - Note! Fallback support is not yet implemented - - >>> document = xinclude_loader("C5.xml") - >>> ElementInclude.include(document, xinclude_loader) - Traceback (most recent call last): - IOError: resource not found - >>> # print serialize(document) # C5 - - """ - -def xinclude_default(): - """ - >>> document = xinclude_loader("default.xml") - >>> ElementInclude.include(document) - >>> print serialize(document) # default - -

Example.

- - text - texttail - - -
- """ - -# -# xmlwriter - -def xmlwriter(): - r""" - >>> file = StringIO.StringIO() - >>> w = SimpleXMLWriter.XMLWriter(file) - >>> html = w.start("html") - >>> x = w.start("head") - >>> w.element("title", "my document") - >>> w.data("\n") - >>> w.element("meta", name="hello", value="goodbye") - >>> w.data("\n") - >>> w.end() - >>> x = w.start("body") - >>> w.element("h1", "this is a heading") - >>> w.data("\n") - >>> w.element("p", u"this is a paragraph") - >>> w.data("\n") - >>> w.element("p", u"reserved characters: <&>") - >>> w.data("\n") - >>> w.element("p", u"detta är också ett stycke") - >>> w.data("\n") - >>> w.close(html) - >>> print file.getvalue() - my document - -

this is a heading

-

this is a paragraph

-

reserved characters: <&>

-

detta är också ett stycke

- - """ - -# -------------------------------------------------------------------- -# reported bugs - -def bug_xmltoolkit21(): - """ - marshaller gives obscure errors for non-string values - - >>> elem = ElementTree.Element(123) - >>> serialize(elem) # tag - Traceback (most recent call last): - TypeError: cannot serialize 123 (type int) - >>> elem = ElementTree.Element("elem") - >>> elem.text = 123 - >>> serialize(elem) # text - Traceback (most recent call last): - TypeError: cannot serialize 123 (type int) - >>> elem = ElementTree.Element("elem") - >>> elem.tail = 123 - >>> serialize(elem) # tail - Traceback (most recent call last): - TypeError: cannot serialize 123 (type int) - >>> elem = ElementTree.Element("elem") - >>> elem.set(123, "123") - >>> serialize(elem) # attribute key - Traceback (most recent call last): - TypeError: cannot serialize 123 (type int) - >>> elem = ElementTree.Element("elem") - >>> elem.set("123", 123) - >>> serialize(elem) # attribute value - Traceback (most recent call last): - TypeError: cannot serialize 123 (type int) - - """ - -def bug_xmltoolkit25(): - """ - typo in ElementTree.findtext - - >>> tree = ElementTree.ElementTree(SAMPLE_XML) - >>> tree.findtext("tag") - 'text' - >>> tree.findtext("section/tag") - 'subtext' - """ - -def bug_xmltoolkit28(): - """ - .//tag causes exceptions - - >>> tree = ElementTree.XML("
") - >>> summarize_list(tree.findall(".//thead")) - [] - >>> summarize_list(tree.findall(".//tbody")) - ['tbody'] - """ - -def bug_xmltoolkitX1(): - """ - dump() doesn't flush the output buffer - - >>> tree = ElementTree.XML("
") - >>> ElementTree.dump(tree); sys.stdout.write("tail") -
- tail - """ - -def bug_xmltoolkit39(): - """ - non-ascii element and attribute names doesn't work - - >>> tree = ElementTree.XML("") - >>> ElementTree.tostring(tree, "utf-8") - '' - - >>> tree = ElementTree.XML("") - >>> tree.attrib - {u'\\xe4ttr': u'v\\xe4lue'} - >>> ElementTree.tostring(tree, "utf-8") - '' - - >>> tree = ElementTree.XML("text") - >>> ElementTree.tostring(tree, "utf-8") - 'text' - - >>> tree = ElementTree.Element(u"täg") - >>> ElementTree.tostring(tree, "utf-8") - '' - - >>> tree = ElementTree.Element("tag") - >>> tree.set(u"ättr", u"välue") - >>> ElementTree.tostring(tree, "utf-8") - '' - - """ - -def bug_xmltoolkit45(): - """ - problems parsing mixed unicode/non-ascii html documents - - latin-1 text - >>> p = HTMLTreeBuilder.TreeBuilder() - >>> p.feed("

välue

") - >>> serialize(p.close()) - '

välue

' - - utf-8 text - >>> p = HTMLTreeBuilder.TreeBuilder(encoding="utf-8") - >>> p.feed("

v\xc3\xa4lue

") - >>> serialize(p.close()) - '

välue

' - - utf-8 text using meta tag - >>> p = HTMLTreeBuilder.TreeBuilder() - >>> p.feed("

v\xc3\xa4lue

") - >>> serialize(p.close().find("p")) - '

välue

' - - latin-1 character references - >>> p = HTMLTreeBuilder.TreeBuilder() - >>> p.feed("

välue

") - >>> serialize(p.close()) - '

välue

' - - latin-1 character entities - >>> p = HTMLTreeBuilder.TreeBuilder() - >>> p.feed("

välue

") - >>> serialize(p.close()) - '

välue

' - - mixed latin-1 text and unicode entities - >>> p = HTMLTreeBuilder.TreeBuilder() - >>> p.feed("

”välue”

") - >>> serialize(p.close()) - '

”välue”

' - - mixed unicode and latin-1 entities - >>> p = HTMLTreeBuilder.TreeBuilder() - >>> p.feed("

”välue”

") - >>> serialize(p.close()) - '

”välue”

' - - """ - -def bug_xmltoolkit46(): - """ - problems parsing open BR tags - - >>> p = HTMLTreeBuilder.TreeBuilder() - >>> p.feed("

key
value

") - >>> serialize(p.close()) - '

key
value

' - - """ - -def bug_xmltoolkit54(): - """ - problems handling internally defined entities - - >>> e = ElementTree.XML("]>&ldots;") - >>> serialize(e) - '' - """ - -def bug_xmltoolkit55(): - """ - make sure we're reporting the first error, not the last - - >>> e = ElementTree.XML("&ldots;&ndots;&rdots;") - Traceback (most recent call last): - ExpatError: undefined entity &ldots;: line 1, column 36 - """ - -# -------------------------------------------------------------------- - -if __name__ == "__main__": - import doctest, selftest - failed, tested = doctest.testmod(selftest) - print tested - failed, "tests ok." +# $Id: selftest.py 2326 2005-03-17 07:45:21Z fredrik $ +# -*- coding: iso-8859-1 -*- +# elementtree selftest program + +# this test script uses Python's "doctest" module to check that the +# *test script* works as expected. + +# TODO: add more elementtree method tests +# TODO: add xml/html parsing tests +# TODO: etc + +import sys, string, StringIO + +from elementtree import ElementTree +from elementtree import ElementPath +from elementtree import ElementInclude +from elementtree import HTMLTreeBuilder +from elementtree import SimpleXMLWriter + +def serialize(elem, encoding=None): + import StringIO + file = StringIO.StringIO() + tree = ElementTree.ElementTree(elem) + if encoding: + tree.write(file, encoding) + else: + tree.write(file) + return file.getvalue() + +def summarize(elem): + return elem.tag + +def summarize_list(seq): + return map(summarize, seq) + +def normalize_crlf(tree): + for elem in tree.getiterator(): + if elem.text: elem.text = string.replace(elem.text, "\r\n", "\n") + if elem.tail: elem.tail = string.replace(elem.tail, "\r\n", "\n") + +SAMPLE_XML = ElementTree.XML(""" + + text + +
+ subtext +
+ +""") + +# +# interface tests + +def check_string(string): + len(string) + for char in string: + if len(char) != 1: + print "expected one-character string, got %r" % char + new_string = string + "" + new_string = string + " " + string[:0] + +def check_string_or_none(value): + if value is None: + return + return check_string(value) + +def check_mapping(mapping): + len(mapping) + keys = mapping.keys() + items = mapping.items() + for key in keys: + item = mapping[key] + mapping["key"] = "value" + if mapping["key"] != "value": + print "expected value string, got %r" % mapping["key"] + +def check_element(element): + if not hasattr(element, "tag"): + print "no tag member" + if not hasattr(element, "attrib"): + print "no attrib member" + if not hasattr(element, "text"): + print "no text member" + if not hasattr(element, "tail"): + print "no tail member" + check_string(element.tag) + check_mapping(element.attrib) + check_string_or_none(element.text) + check_string_or_none(element.tail) + for elem in element: + check_element(elem) + +def check_element_tree(tree): + check_element(tree.getroot()) + +# -------------------------------------------------------------------- +# element tree tests + +def sanity(): + """ + >>> from elementtree.ElementTree import * + >>> from elementtree.ElementInclude import * + >>> from elementtree.ElementPath import * + >>> from elementtree.HTMLTreeBuilder import * + >>> from elementtree.SimpleXMLTreeBuilder import * + >>> from elementtree.SimpleXMLWriter import * + >>> from elementtree.TidyTools import * + >>> from elementtree.XMLTreeBuilder import * + """ + +def version(): + """ + >>> ElementTree.VERSION + '1.2.6' + """ + +def interface(): + """ + Test element tree interface. + + >>> element = ElementTree.Element("tag") + >>> check_element(element) + >>> tree = ElementTree.ElementTree(element) + >>> check_element_tree(tree) + """ + +def simplefind(): + """ + Test find methods using the elementpath fallback. + + >>> CurrentElementPath = ElementTree.ElementPath + >>> ElementTree.ElementPath = ElementTree._SimpleElementPath() + >>> elem = SAMPLE_XML + >>> elem.find("tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog") + >>> elem.findtext("tog", "default") + 'default' + >>> ElementTree.ElementTree(elem).findtext("tag") + 'text' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + + Path syntax doesn't work in this case. + + >>> elem.find("section/tag") + >>> elem.findtext("section/tag") + >>> elem.findall("section/tag") + [] + + >>> ElementTree.ElementPath = CurrentElementPath + """ + +def find(): + """ + Test find methods (including xpath syntax). + + >>> elem = SAMPLE_XML + >>> elem.find("tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.find("section/tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("section/tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog") + >>> elem.findtext("tog", "default") + 'default' + >>> ElementTree.ElementTree(elem).findtext("tag") + 'text' + >>> elem.findtext("section/tag") + 'subtext' + >>> ElementTree.ElementTree(elem).findtext("section/tag") + 'subtext' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall("*")) + ['tag', 'tag', 'section'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("section/tag")) + ['tag'] + >>> summarize_list(elem.findall("section//tag")) + ['tag'] + >>> summarize_list(elem.findall("section/*")) + ['tag'] + >>> summarize_list(elem.findall("section//*")) + ['tag'] + >>> summarize_list(elem.findall("section/.//*")) + ['tag'] + >>> summarize_list(elem.findall("*/*")) + ['tag'] + >>> summarize_list(elem.findall("*//*")) + ['tag'] + >>> summarize_list(elem.findall("*/tag")) + ['tag'] + >>> summarize_list(elem.findall("*/./tag")) + ['tag'] + >>> summarize_list(elem.findall("./tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("././tag")) + ['tag', 'tag'] + >>> summarize_list(ElementTree.ElementTree(elem).findall("/tag")) + ['tag', 'tag'] + >>> summarize_list(ElementTree.ElementTree(elem).findall("./tag")) + ['tag', 'tag'] + """ + +def bad_find(): + """ + Check bad or unsupported path expressions. + + >>> elem = SAMPLE_XML + >>> elem.findall("/tag") + Traceback (most recent call last): + SyntaxError: cannot use absolute path on element + >>> elem.findall("../tag") + Traceback (most recent call last): + SyntaxError: unsupported path syntax (..) + >>> elem.findall("section//") + Traceback (most recent call last): + SyntaxError: path cannot end with // + >>> elem.findall("tag[tag]") + Traceback (most recent call last): + SyntaxError: expected path separator ([) + """ + +def parsefile(): + """ + Test parsing from file. + + >>> tree = ElementTree.parse("samples/simple.xml") + >>> normalize_crlf(tree) + >>> tree.write(sys.stdout) + + text + texttail + + + >>> tree = ElementTree.parse("samples/simple-ns.xml") + >>> normalize_crlf(tree) + >>> tree.write(sys.stdout) + + text + texttail + + + """ + +def parsehtml(): + """ + Test HTML parsing. + + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

spamegg

") + >>> serialize(p.close()) + '

spamegg

' + """ + +def parseliteral(): + r""" + >>> element = ElementTree.XML("text") + >>> ElementTree.ElementTree(element).write(sys.stdout) + text + >>> element = ElementTree.fromstring("text") + >>> ElementTree.ElementTree(element).write(sys.stdout) + text + >>> print ElementTree.tostring(element) + text + >>> print ElementTree.tostring(element, "ascii") + + text + >>> _, ids = ElementTree.XMLID("text") + >>> len(ids) + 0 + >>> _, ids = ElementTree.XMLID("text") + >>> len(ids) + 1 + >>> ids["body"].tag + 'body' + """ + +def simpleparsefile(): + """ + Test the xmllib-based parser. + + >>> from elementtree import SimpleXMLTreeBuilder + >>> parser = SimpleXMLTreeBuilder.TreeBuilder() + >>> tree = ElementTree.parse("samples/simple.xml", parser) + >>> normalize_crlf(tree) + >>> tree.write(sys.stdout) + + text + texttail + + + """ + +def iterparse(): + """ + Test iterparse interface. + + >>> iterparse = ElementTree.iterparse + + >>> context = iterparse("samples/simple.xml") + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + end empty-element + end root + >>> context.root.tag + 'root' + + >>> context = iterparse("samples/simple-ns.xml") + >>> for action, elem in context: + ... print action, elem.tag + end {namespace}element + end {namespace}element + end {namespace}empty-element + end {namespace}root + + >>> events = () + >>> context = iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = () + >>> context = iterparse("samples/simple.xml", events=events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = ("start", "end") + >>> context = iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + start root + start element + end element + start element + end element + start empty-element + end empty-element + end root + + >>> events = ("start", "end", "start-ns", "end-ns") + >>> context = iterparse("samples/simple-ns.xml", events) + >>> for action, elem in context: + ... if action in ("start", "end"): + ... print action, elem.tag + ... else: + ... print action, elem + start-ns ('', 'namespace') + start {namespace}root + start {namespace}element + end {namespace}element + start {namespace}element + end {namespace}element + start {namespace}empty-element + end {namespace}empty-element + end {namespace}root + end-ns None + + """ + +def fancyparsefile(): + """ + Test the "fancy" parser. + + Sanity check. + >>> from elementtree import XMLTreeBuilder + >>> parser = XMLTreeBuilder.FancyTreeBuilder() + >>> tree = ElementTree.parse("samples/simple.xml", parser) + >>> normalize_crlf(tree) + >>> tree.write(sys.stdout) + + text + texttail + + + + Callback check. + >>> class MyFancyParser(XMLTreeBuilder.FancyTreeBuilder): + ... def start(self, elem): + ... print "START", elem.tag + ... def end(self, elem): + ... print "END", elem.tag + >>> parser = MyFancyParser() + >>> tree = ElementTree.parse("samples/simple.xml", parser) + START root + START element + END element + START element + END element + START empty-element + END empty-element + END root + """ + +def writefile(): + """ + >>> elem = ElementTree.Element("tag") + >>> elem.text = "text" + >>> serialize(elem) + 'text' + >>> ElementTree.SubElement(elem, "subtag").text = "subtext" + >>> serialize(elem) + 'textsubtext' + """ + +def writestring(): + """ + >>> elem = ElementTree.XML("text") + >>> ElementTree.tostring(elem) + 'text' + >>> elem = ElementTree.fromstring("text") + >>> ElementTree.tostring(elem) + 'text' + """ + +def encoding(): + r""" + Test encoding issues. + + >>> elem = ElementTree.Element("tag") + >>> elem.text = u"abc" + >>> serialize(elem) + 'abc' + >>> serialize(elem, "utf-8") + 'abc' + >>> serialize(elem, "us-ascii") + 'abc' + >>> serialize(elem, "iso-8859-1") + "\nabc" + + >>> elem.text = "<&\"\'>" + >>> serialize(elem) + '<&"\'>' + >>> serialize(elem, "utf-8") + '<&"\'>' + >>> serialize(elem, "us-ascii") # cdata characters + '<&"\'>' + >>> serialize(elem, "iso-8859-1") + '\n<&"\'>' + + >>> elem.attrib["key"] = "<&\"\'>" + >>> elem.text = None + >>> serialize(elem) + '' + >>> serialize(elem, "utf-8") + '' + >>> serialize(elem, "us-ascii") + '' + >>> serialize(elem, "iso-8859-1") + '\n' + + >>> elem.text = u'\xe5\xf6\xf6<>' + >>> elem.attrib.clear() + >>> serialize(elem) + 'åöö<>' + >>> serialize(elem, "utf-8") + '\xc3\xa5\xc3\xb6\xc3\xb6<>' + >>> serialize(elem, "us-ascii") + 'åöö<>' + >>> serialize(elem, "iso-8859-1") + "\n\xe5\xf6\xf6<>" + + >>> elem.attrib["key"] = u'\xe5\xf6\xf6<>' + >>> elem.text = None + >>> serialize(elem) + '' + >>> serialize(elem, "utf-8") + '' + >>> serialize(elem, "us-ascii") + '' + >>> serialize(elem, "iso-8859-1") + '\n' + + """ + +ENTITY_XML = """\ + +%user-entities; +]> +&entity; +""" + +def entity(): + """ + Test entity handling. + + 1) bad entities + + >>> ElementTree.XML("&entity;") + Traceback (most recent call last): + ExpatError: undefined entity: line 1, column 10 + + >>> ElementTree.XML(ENTITY_XML) + Traceback (most recent call last): + ExpatError: undefined entity &entity;: line 5, column 10 + + (add more tests here) + + """ + +def namespace(): + """ + Test namespace issues. + + 1) xml namespace + + >>> elem = ElementTree.XML("") + >>> serialize(elem) # 1.1 + '' + + 2) other "well-known" namespaces + + >>> elem = ElementTree.XML("") + >>> serialize(elem) # 2.1 + '' + + >>> elem = ElementTree.XML("") + >>> serialize(elem) # 2.2 + '' + + >>> elem = ElementTree.XML("") + >>> serialize(elem) # 2.3 + '' + + 3) unknown namespaces + + """ + +def qname(): + """ + Test QName handling. + + 1) decorated tags + + >>> elem = ElementTree.Element("{uri}tag") + >>> serialize(elem) # 1.1 + '' + >>> elem = ElementTree.Element(ElementTree.QName("{uri}tag")) + >>> serialize(elem) # 1.2 + '' + >>> elem = ElementTree.Element(ElementTree.QName("uri", "tag")) + >>> serialize(elem) # 1.3 + '' + + 2) decorated attributes + + >>> elem.clear() + >>> elem.attrib["{uri}key"] = "value" + >>> serialize(elem) # 2.1 + '' + + >>> elem.clear() + >>> elem.attrib[ElementTree.QName("{uri}key")] = "value" + >>> serialize(elem) # 2.2 + '' + + 3) decorated values are not converted by default, but the + QName wrapper can be used for values + + >>> elem.clear() + >>> elem.attrib["{uri}key"] = "{uri}value" + >>> serialize(elem) # 3.1 + '' + + >>> elem.clear() + >>> elem.attrib["{uri}key"] = ElementTree.QName("{uri}value") + >>> serialize(elem) # 3.2 + '' + + >>> elem.clear() + >>> subelem = ElementTree.Element("tag") + >>> subelem.attrib["{uri1}key"] = ElementTree.QName("{uri2}value") + >>> elem.append(subelem) + >>> elem.append(subelem) + >>> serialize(elem) # 3.3 + '' + + """ + +def xpath_tokenizer(p): + """ + Test the XPath tokenizer. + + >>> # tests from the xml specification + >>> xpath_tokenizer("*") + ['*'] + >>> xpath_tokenizer("text()") + ['text', '()'] + >>> xpath_tokenizer("@name") + ['@', 'name'] + >>> xpath_tokenizer("@*") + ['@', '*'] + >>> xpath_tokenizer("para[1]") + ['para', '[', '1', ']'] + >>> xpath_tokenizer("para[last()]") + ['para', '[', 'last', '()', ']'] + >>> xpath_tokenizer("*/para") + ['*', '/', 'para'] + >>> xpath_tokenizer("/doc/chapter[5]/section[2]") + ['/', 'doc', '/', 'chapter', '[', '5', ']', '/', 'section', '[', '2', ']'] + >>> xpath_tokenizer("chapter//para") + ['chapter', '/', '/', 'para'] + >>> xpath_tokenizer("//para") + ['/', '/', 'para'] + >>> xpath_tokenizer("//olist/item") + ['/', '/', 'olist', '/', 'item'] + >>> xpath_tokenizer(".") + ['.'] + >>> xpath_tokenizer(".//para") + ['.', '/', '/', 'para'] + >>> xpath_tokenizer("..") + ['..'] + >>> xpath_tokenizer("../@lang") + ['..', '/', '@', 'lang'] + >>> xpath_tokenizer("chapter[title]") + ['chapter', '[', 'title', ']'] + >>> xpath_tokenizer("employee[@secretary and @assistant]") + ['employee', '[', '@', 'secretary', '', 'and', '', '@', 'assistant', ']'] + + >>> # additional tests + >>> xpath_tokenizer("{http://spam}egg") + ['{http://spam}egg'] + >>> xpath_tokenizer("./spam.egg") + ['.', '/', 'spam.egg'] + >>> xpath_tokenizer(".//{http://spam}egg") + ['.', '/', '/', '{http://spam}egg'] + """ + out = [] + for op, tag in ElementPath.xpath_tokenizer(p): + out.append(op or tag) + return out + +# +# xinclude tests (samples from appendix C of the xinclude specification) + +XINCLUDE = {} + +XINCLUDE["C1.xml"] = """\ + + +

120 Mz is adequate for an average home user.

+ +
+""" + +XINCLUDE["disclaimer.xml"] = """\ + + +

The opinions represented herein represent those of the individual + and should not be interpreted as official policy endorsed by this + organization.

+
+""" + +XINCLUDE["C2.xml"] = """\ + + +

This document has been accessed + times.

+
+""" + +XINCLUDE["count.txt"] = "324387" + +XINCLUDE["C3.xml"] = """\ + + +

The following is the source of the "data.xml" resource:

+ +
+""" + +XINCLUDE["data.xml"] = """\ + + + + +""" + +XINCLUDE["C5.xml"] = """\ + +
+ + + + Report error + + + +
+""" + +XINCLUDE["default.xml"] = """\ + + +

Example.

+ +
+""" + +def xinclude_loader(href, parse="xml", encoding=None): + try: + data = XINCLUDE[href] + except KeyError: + raise IOError("resource not found") + if parse == "xml": + return ElementTree.XML(data) + return data + +def xinclude(): + r""" + Basic inclusion example (XInclude C.1) + + >>> document = xinclude_loader("C1.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(document) # C1 + +

120 Mz is adequate for an average home user.

+ +

The opinions represented herein represent those of the individual + and should not be interpreted as official policy endorsed by this + organization.

+
+
+ + Textual inclusion example (XInclude C.2) + + >>> document = xinclude_loader("C2.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(document) # C2 + +

This document has been accessed + 324387 times.

+
+ + Textual inclusion of XML example (XInclude C.3) + + >>> document = xinclude_loader("C3.xml") + >>> ElementInclude.include(document, xinclude_loader) + >>> print serialize(document) # C3 + +

The following is the source of the "data.xml" resource:

+ <?xml version='1.0'?> + <data> + <item><![CDATA[Brooks & Shields]]></item> + </data> + +
+ + Fallback example (XInclude C.5) + Note! Fallback support is not yet implemented + + >>> document = xinclude_loader("C5.xml") + >>> ElementInclude.include(document, xinclude_loader) + Traceback (most recent call last): + IOError: resource not found + >>> # print serialize(document) # C5 + + """ + +def xinclude_default(): + """ + >>> document = xinclude_loader("default.xml") + >>> ElementInclude.include(document) + >>> print serialize(document) # default + +

Example.

+ + text + texttail + + +
+ """ + +# +# xmlwriter + +def xmlwriter(): + r""" + >>> file = StringIO.StringIO() + >>> w = SimpleXMLWriter.XMLWriter(file) + >>> html = w.start("html") + >>> x = w.start("head") + >>> w.element("title", "my document") + >>> w.data("\n") + >>> w.element("meta", name="hello", value="goodbye") + >>> w.data("\n") + >>> w.end() + >>> x = w.start("body") + >>> w.element("h1", "this is a heading") + >>> w.data("\n") + >>> w.element("p", u"this is a paragraph") + >>> w.data("\n") + >>> w.element("p", u"reserved characters: <&>") + >>> w.data("\n") + >>> w.element("p", u"detta är också ett stycke") + >>> w.data("\n") + >>> w.close(html) + >>> print file.getvalue() + my document + +

this is a heading

+

this is a paragraph

+

reserved characters: <&>

+

detta är också ett stycke

+ + """ + +# -------------------------------------------------------------------- +# reported bugs + +def bug_xmltoolkit21(): + """ + marshaller gives obscure errors for non-string values + + >>> elem = ElementTree.Element(123) + >>> serialize(elem) # tag + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + >>> elem = ElementTree.Element("elem") + >>> elem.text = 123 + >>> serialize(elem) # text + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + >>> elem = ElementTree.Element("elem") + >>> elem.tail = 123 + >>> serialize(elem) # tail + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + >>> elem = ElementTree.Element("elem") + >>> elem.set(123, "123") + >>> serialize(elem) # attribute key + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + >>> elem = ElementTree.Element("elem") + >>> elem.set("123", 123) + >>> serialize(elem) # attribute value + Traceback (most recent call last): + TypeError: cannot serialize 123 (type int) + + """ + +def bug_xmltoolkit25(): + """ + typo in ElementTree.findtext + + >>> tree = ElementTree.ElementTree(SAMPLE_XML) + >>> tree.findtext("tag") + 'text' + >>> tree.findtext("section/tag") + 'subtext' + """ + +def bug_xmltoolkit28(): + """ + .//tag causes exceptions + + >>> tree = ElementTree.XML("
") + >>> summarize_list(tree.findall(".//thead")) + [] + >>> summarize_list(tree.findall(".//tbody")) + ['tbody'] + """ + +def bug_xmltoolkitX1(): + """ + dump() doesn't flush the output buffer + + >>> tree = ElementTree.XML("
") + >>> ElementTree.dump(tree); sys.stdout.write("tail") +
+ tail + """ + +def bug_xmltoolkit39(): + """ + non-ascii element and attribute names doesn't work + + >>> tree = ElementTree.XML("") + >>> ElementTree.tostring(tree, "utf-8") + '' + + >>> tree = ElementTree.XML("") + >>> tree.attrib + {u'\\xe4ttr': u'v\\xe4lue'} + >>> ElementTree.tostring(tree, "utf-8") + '' + + >>> tree = ElementTree.XML("text") + >>> ElementTree.tostring(tree, "utf-8") + 'text' + + >>> tree = ElementTree.Element(u"täg") + >>> ElementTree.tostring(tree, "utf-8") + '' + + >>> tree = ElementTree.Element("tag") + >>> tree.set(u"ättr", u"välue") + >>> ElementTree.tostring(tree, "utf-8") + '' + + """ + +def bug_xmltoolkit45(): + """ + problems parsing mixed unicode/non-ascii html documents + + latin-1 text + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

välue

") + >>> serialize(p.close()) + '

välue

' + + utf-8 text + >>> p = HTMLTreeBuilder.TreeBuilder(encoding="utf-8") + >>> p.feed("

v\xc3\xa4lue

") + >>> serialize(p.close()) + '

välue

' + + utf-8 text using meta tag + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

v\xc3\xa4lue

") + >>> serialize(p.close().find("p")) + '

välue

' + + latin-1 character references + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

välue

") + >>> serialize(p.close()) + '

välue

' + + latin-1 character entities + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

välue

") + >>> serialize(p.close()) + '

välue

' + + mixed latin-1 text and unicode entities + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

”välue”

") + >>> serialize(p.close()) + '

”välue”

' + + mixed unicode and latin-1 entities + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

”välue”

") + >>> serialize(p.close()) + '

”välue”

' + + """ + +def bug_xmltoolkit46(): + """ + problems parsing open BR tags + + >>> p = HTMLTreeBuilder.TreeBuilder() + >>> p.feed("

key
value

") + >>> serialize(p.close()) + '

key
value

' + + """ + +def bug_xmltoolkit54(): + """ + problems handling internally defined entities + + >>> e = ElementTree.XML("]>&ldots;") + >>> serialize(e) + '' + """ + +def bug_xmltoolkit55(): + """ + make sure we're reporting the first error, not the last + + >>> e = ElementTree.XML("&ldots;&ndots;&rdots;") + Traceback (most recent call last): + ExpatError: undefined entity &ldots;: line 1, column 36 + """ + +# -------------------------------------------------------------------- + +if __name__ == "__main__": + import doctest, selftest + failed, tested = doctest.testmod(selftest) + print tested - failed, "tests ok." Modified: external/elementtree-1.2.6-20050316/setup.py ============================================================================== --- external/elementtree-1.2.6-20050316/setup.py (original) +++ external/elementtree-1.2.6-20050316/setup.py Wed Dec 14 19:33:39 2005 @@ -1,44 +1,44 @@ -#!/usr/bin/env python -# -# Setup script for the elementtree library -# $Id: setup.py 2326 2005-03-17 07:45:21Z fredrik $ -# -# Usage: python setup.py install -# - -from distutils.core import setup - -try: - # add download_url syntax to distutils - from distutils.dist import DistributionMetadata - DistributionMetadata.classifiers = None - DistributionMetadata.download_url = None -except: - pass - -DESCRIPTION="ElementTree - a light-weight XML object model for Python." - -LONG_DESCRIPTION="""\ -The Element type is a flexible container object, designed to store -hierarchical data structures in memory. Element structures can be -converted to and from XML.""" - -setup( - name="elementtree", - version="1.2.6-20050316", - author="Fredrik Lundh", - author_email="fredrik at pythonware.com", - url="http://effbot.org/zone/element-index.htm", - description=DESCRIPTION, - long_description=LONG_DESCRIPTION, - download_url="http://effbot.org/downloads#elementtree", - license="Python (MIT style)", - packages=["elementtree"], - platforms="Python 1.5.2 and later.", - classifiers=[ - "Development Status :: 6 - Mature", - "Operating System :: OS Independent", - "Topic :: Text Processing :: Markup :: HTML", - "Topic :: Text Processing :: Markup :: XML", - ] - ) +#!/usr/bin/env python +# +# Setup script for the elementtree library +# $Id: setup.py 2326 2005-03-17 07:45:21Z fredrik $ +# +# Usage: python setup.py install +# + +from distutils.core import setup + +try: + # add download_url syntax to distutils + from distutils.dist import DistributionMetadata + DistributionMetadata.classifiers = None + DistributionMetadata.download_url = None +except: + pass + +DESCRIPTION="ElementTree - a light-weight XML object model for Python." + +LONG_DESCRIPTION="""\ +The Element type is a flexible container object, designed to store +hierarchical data structures in memory. Element structures can be +converted to and from XML.""" + +setup( + name="elementtree", + version="1.2.6-20050316", + author="Fredrik Lundh", + author_email="fredrik at pythonware.com", + url="http://effbot.org/zone/element-index.htm", + description=DESCRIPTION, + long_description=LONG_DESCRIPTION, + download_url="http://effbot.org/downloads#elementtree", + license="Python (MIT style)", + packages=["elementtree"], + platforms="Python 1.5.2 and later.", + classifiers=[ + "Development Status :: 6 - Mature", + "Operating System :: OS Independent", + "Topic :: Text Processing :: Markup :: HTML", + "Topic :: Text Processing :: Markup :: XML", + ] + ) From python-checkins at python.org Wed Dec 14 19:46:17 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 19:46:17 +0100 (CET) Subject: [Python-checkins] commit of r41677 - in python/trunk: Lib/xmlcore/etree/cElementTree.py setup.py Message-ID: <20051214184617.A450E1E4011@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 19:46:16 2005 New Revision: 41677 Added: python/trunk/Lib/xmlcore/etree/cElementTree.py Modified: python/trunk/setup.py Log: added cElementTree/_elementtree build stuff and wrapper module Added: python/trunk/Lib/xmlcore/etree/cElementTree.py ============================================================================== --- (empty file) +++ python/trunk/Lib/xmlcore/etree/cElementTree.py Wed Dec 14 19:46:16 2005 @@ -0,0 +1,3 @@ +# Wrapper module for _elementtree + +from _elementtree import * Modified: python/trunk/setup.py ============================================================================== --- python/trunk/setup.py (original) +++ python/trunk/setup.py Wed Dec 14 19:46:16 2005 @@ -841,6 +841,17 @@ ], )) + # Fredrik Lundh's cElementTree module. Note that this also + # uses expat (via the CAPI hook in pyexpat). + + if os.path.isfile('Modules/_elementtree.c'): + define_macros.append(('USE_PYEXPAT_CAPI', None)) + exts.append(Extension('_elementtree', + define_macros = define_macros, + include_dirs = [expatinc], + sources = ['_elementtree.c'], + )) + # Hye-Shik Chang's CJKCodecs modules. if have_unicode: exts.append(Extension('_multibytecodec', From nnorwitz at gmail.com Wed Dec 14 19:47:02 2005 From: nnorwitz at gmail.com (Neal Norwitz) Date: Wed, 14 Dec 2005 10:47:02 -0800 Subject: [Python-checkins] commit of r41671 - python/trunk/Parser/asdl_c.py In-Reply-To: <20051214180514.C3FF71E4009@bag.python.org> References: <20051214180514.C3FF71E4009@bag.python.org> Message-ID: Thank you, much nicer than the crap I wrote. The original argv0 = isn't really necessary if the next line is components = sys.argv[0].split(...) n -- On 12/14/05, armin.rigo wrote: > Author: armin.rigo > Date: Wed Dec 14 19:05:14 2005 > New Revision: 41671 > > Modified: > python/trunk/Parser/asdl_c.py > Log: > When regenerating files like Python-ast.h, take care that the generated > comment based on 'sys.args[0]' does not depend on the path. For Python > builds from a remote directory ("/path/to/configure; make") the previous > logic used to include the "/path/to" portion in Python-ast.h. Then svn > would consider this file to be locally modified. > > > Modified: python/trunk/Parser/asdl_c.py > ============================================================================== > --- python/trunk/Parser/asdl_c.py (original) > +++ python/trunk/Parser/asdl_c.py Wed Dec 14 19:05:14 2005 > @@ -639,9 +639,8 @@ > > def main(srcfile): > argv0 = sys.argv[0] > - index = argv0.find('/') > - if index > 0: > - argv0 = argv0[index + 1:] > + components = argv0.split(os.sep) > + argv0 = os.sep.join(components[-2:]) > auto_gen_msg = '/* File automatically generated by %s */\n' % argv0 > mod = asdl.parse(srcfile) > if not asdl.check(mod): > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From guido at python.org Wed Dec 14 19:57:29 2005 From: guido at python.org (Guido van Rossum) Date: Wed, 14 Dec 2005 10:57:29 -0800 Subject: [Python-checkins] commit of r41662 - in python/trunk: Misc/NEWS Objects/fileobject.c configure configure.in pyconfig.h.in In-Reply-To: References: <20051213164405.AD0681E4002@bag.python.org> <4f0b69dc0512131636o505484fw5f5b3a9819c9de93@mail.gmail.com> Message-ID: Given Neil's response (which matches my initial gut feeling) I think you should revert. --Guido On 12/13/05, Neal Norwitz wrote: > On 12/13/05, Guido van Rossum wrote: > > > > > > Or is there a real bug caused by tell() lying? > > > > > > I don't think it's harm to keep the original behavior as before this fix. > > > But file.tell() is quite cheap operation among routines likely enclose > > > the operation. Hmm. If isatty() for every call still looks too expensive, > > > we can just fix documentation and unittest. I'm quite neutral for the > > > problem because tty.tell() is quite non-sense. :) > > > > Unfortunately there is now code that depends on the documented > > behavior. In httplib (and perhaps other mail-header-parsing code) > > there's a flag 'seekable' that's set to True iff tell() succeeds. > > While it's unlikely that anyone would attempt to read mail from a tty > > device, I now believe that forcing the failure if isatty() is the > > right thing to do. > > Sorry, I was planning on responding sooner. > > Before the rest of this thread, I thought it best to remove the test > code. I thought I heard that POSIX was ambiguous. Since I'm the one > that started this mess, let me know if I should revert. > > n > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-checkins at python.org Wed Dec 14 21:49:37 2005 From: python-checkins at python.org (phillip.eby) Date: Wed, 14 Dec 2005 21:49:37 +0100 (CET) Subject: [Python-checkins] commit of r41678 - sandbox/trunk/setuptools/setuptools/command/bdist_egg.py sandbox/trunk/setuptools/setuptools/command/easy_install.py sandbox/trunk/setuptools/setuptools/command/egg_info.py Message-ID: <20051214204937.917741E4002@bag.python.org> Author: phillip.eby Date: Wed Dec 14 21:49:36 2005 New Revision: 41678 Modified: sandbox/trunk/setuptools/setuptools/command/bdist_egg.py sandbox/trunk/setuptools/setuptools/command/easy_install.py sandbox/trunk/setuptools/setuptools/command/egg_info.py Log: Basic roundtripping support between bdist_wininst and eggs. EasyInstall will now recognize when a bdist_wininst .exe wraps a .egg-info style package, and reconstitute it correctly, maintaining the original zip safety flag, if applicable. This still needs support for entrypoint scripts, though, as does the install_scripts command. Modified: sandbox/trunk/setuptools/setuptools/command/bdist_egg.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/bdist_egg.py (original) +++ sandbox/trunk/setuptools/setuptools/command/bdist_egg.py Wed Dec 14 21:49:36 2005 @@ -221,7 +221,9 @@ if os.path.isfile(path): self.copy_file(path,os.path.join(egg_info,filename)) - write_safety_flag(archive_root, self.zip_safe()) + write_safety_flag( + os.path.join(archive_root,'EGG-INFO'), self.zip_safe() + ) if os.path.exists(os.path.join(self.egg_info,'depends.txt')): log.warn( @@ -242,8 +244,6 @@ getattr(self.distribution,'dist_files',[]).append( ('bdist_egg',get_python_version(),self.egg_output)) - - def zap_pyfiles(self): log.info("Removing .py files from temporary directory") for base,dirs,files in walk_egg(self.bdist_dir): @@ -337,6 +337,11 @@ yield bdf def analyze_egg(egg_dir, stubs): + # check for existing flag in EGG-INFO + for flag,fn in safety_flags.items(): + if os.path.exists(os.path.join(egg_dir,'EGG-INFO',fn)): + return flag + safe = True for base, dirs, files in walk_egg(egg_dir): for name in files: @@ -345,27 +350,22 @@ elif name.endswith('.pyc') or name.endswith('.pyo'): # always scan, even if we already know we're not safe safe = scan_module(egg_dir, base, name, stubs) and safe - '''elif safe: - log.warn( - "Distribution contains data or extensions; assuming " - "it's unsafe (set zip_safe=True in setup() to change" - ) - safe = False # XXX''' return safe def write_safety_flag(egg_dir, safe): - # Write a zip safety flag file - flag = safe and 'zip-safe' or 'not-zip-safe' - open(os.path.join(egg_dir,'EGG-INFO',flag),'w').close() - - - - - - - - - + # Write or remove zip safety flag file(s) + for flag,fn in safety_flags.items(): + fn = os.path.join(egg_dir, fn) + if os.path.exists(fn): + if safe is None or bool(safe)<>flag: + os.unlink(fn) + elif safe is not None and bool(safe)==flag: + open(fn,'w').close() + +safety_flags = { + True: 'zip-safe', + False: 'not-zip-safe', +} def scan_module(egg_dir, base, name, stubs): """Check whether module possibly uses unsafe-for-zipfile stuff""" Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Wed Dec 14 21:49:36 2005 @@ -145,7 +145,7 @@ site_dirs = [ os.path.expanduser(s.strip()) for s in self.site_dirs.split(',') ] - for d in site_dirs: + for d in site_dirs: if not os.path.isdir(d): log.warn("%s (in --site-dirs) does not exist", d) elif normalize_path(d) not in normpath: @@ -637,12 +637,13 @@ self.exe_to_egg(dist_filename, egg_tmp) # Write EGG-INFO/PKG-INFO - f = open(pkg_inf,'w') - f.write('Metadata-Version: 1.0\n') - for k,v in cfg.items('metadata'): - if k<>'target_version': - f.write('%s: %s\n' % (k.replace('_','-').title(), v)) - f.close() + if not os.path.exists(pkg_inf): + f = open(pkg_inf,'w') + f.write('Metadata-Version: 1.0\n') + for k,v in cfg.items('metadata'): + if k<>'target_version': + f.write('%s: %s\n' % (k.replace('_','-').title(), v)) + f.close() # Build .egg file from tmpdir bdist_egg.make_zipfile( @@ -653,7 +654,6 @@ # install the .egg return self.install_egg(egg_path, tmpdir) - def exe_to_egg(self, dist_filename, egg_tmp): """Extract a bdist_wininst to the directories an egg would use""" # Check for .pth file and set up prefix translations @@ -692,14 +692,14 @@ bdist_egg.write_stub(resource, pyfile) self.byte_compile(to_compile) # compile .py's - bdist_egg.write_safety_flag(egg_tmp, + bdist_egg.write_safety_flag(os.path.join(egg_tmp,'EGG-INFO'), bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag for name in 'top_level','native_libs': if locals()[name]: txt = os.path.join(egg_tmp, 'EGG-INFO', name+'.txt') - open(txt,'w').write('\n'.join(locals()[name])+'\n') - + if not os.path.exists(txt): + open(txt,'w').write('\n'.join(locals()[name])+'\n') def check_conflicts(self, dist): """Verify that there are no conflicting "old-style" packages""" @@ -1076,10 +1076,12 @@ try: for info in z.infolist(): name = info.filename - if not name.endswith('.pth'): - continue parts = name.split('/') - if len(parts)<>2: + if len(parts)==3 and parts[2]=='PKG-INFO': + if parts[1].endswith('.egg-info'): + prefixes.insert(0,('/'.join(parts[:2]), 'EGG-INFO/')) + break + if len(parts)<>2 or not name.endswith('.pth'): continue if parts[0] in ('PURELIB','PLATLIB'): pth = z.read(name).strip() @@ -1103,8 +1105,6 @@ - - class PthDistributions(Environment): """A .pth file with Distribution paths in it""" Modified: sandbox/trunk/setuptools/setuptools/command/egg_info.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/egg_info.py (original) +++ sandbox/trunk/setuptools/setuptools/command/egg_info.py Wed Dec 14 21:49:36 2005 @@ -285,7 +285,6 @@ - def write_pkg_info(cmd, basename, filename): log.info("writing %s", filename) if not cmd.dry_run: @@ -299,6 +298,9 @@ finally: metadata.name, metadata.version = oldname, oldver + safe = getattr(cmd.distribution,'zip_safe',None) + import bdist_egg; bdist_egg.write_safety_flag(cmd.egg_info, safe) + def warn_depends_obsolete(cmd, basename, filename): if os.path.exists(filename): log.warn( @@ -324,9 +326,6 @@ - - - def write_arg(cmd, basename, filename): argname = os.path.splitext(basename)[0] value = getattr(cmd.distribution, argname, None) From python-checkins at python.org Wed Dec 14 22:12:59 2005 From: python-checkins at python.org (barry.warsaw) Date: Wed, 14 Dec 2005 22:12:59 +0100 (CET) Subject: [Python-checkins] commit of r41679 - peps/trunk/pep-0008.txt Message-ID: <20051214211259.73FA31E4002@bag.python.org> Author: barry.warsaw Date: Wed Dec 14 22:12:58 2005 New Revision: 41679 Modified: peps/trunk/pep-0008.txt Log: After lengthy discussion on python-dev, here is an update to the Python style guide. Hopefully it has been simplified and made more prescriptive, as well as improved by all the great community suggestions. Modified: peps/trunk/pep-0008.txt ============================================================================== --- peps/trunk/pep-0008.txt (original) +++ peps/trunk/pep-0008.txt Wed Dec 14 22:12:58 2005 @@ -11,83 +11,86 @@ Introduction - This document gives coding conventions for the Python code - comprising the standard library for the main Python distribution. - Please see the companion informational PEP describing style - guidelines for the C code in the C implementation of Python[1]. - - This document was adapted from Guido's original Python Style - Guide essay[2], with some additions from Barry's style guide[5]. - Where there's conflict, Guido's style rules for the purposes of - this PEP. This PEP may still be incomplete (in fact, it may never - be finished ). + This document gives coding conventions for the Python code comprising the + standard library in the main Python distribution. Please see the + companion informational PEP describing style guidelines for the C code in + the C implementation of Python[1]. + + This document was adapted from Guido's original Python Style Guide + essay[2], with some additions from Barry's style guide[5]. Where there's + conflict, Guido's style rules for the purposes of this PEP. This PEP may + still be incomplete (in fact, it may never be finished ). A Foolish Consistency is the Hobgoblin of Little Minds - A style guide is about consistency. Consistency with this style - guide is important. Consistency within a project is more - important. Consistency within one module or function is most - important. - - But most importantly: know when to be inconsistent -- sometimes - the style guide just doesn't apply. When in doubt, use your best - judgement. Look at other examples and decide what looks best. - And don't hesitate to ask! + One of Guido's key insights is that code is read much more often than it + is written. The guidelines provided here are intended to improve the + readability of code and make it consistent across the wide spectrum of + Python code. As PEP 20 [6] says, "Readability counts". + + A style guide is about consistency. Consistency with this style guide is + important. Consistency within a project is more important. Consistency + within one module or function is most important. + + But most importantly: know when to be inconsistent -- sometimes the style + guide just doesn't apply. When in doubt, use your best judgment. Look + at other examples and decide what looks best. And don't hesitate to ask! Two good reasons to break a particular rule: - (1) When applying the rule would make the code less readable, even - for someone who is used to reading code that follows the rules. + (1) When applying the rule would make the code less readable, even for + someone who is used to reading code that follows the rules. - (2) To be consistent with surrounding code that also breaks it - (maybe for historic reasons) -- although this is also an - opportunity to clean up someone else's mess (in true XP style). + (2) To be consistent with surrounding code that also breaks it (maybe for + historic reasons) -- although this is also an opportunity to clean up + someone else's mess (in true XP style). Code lay-out Indentation - Use the default of Emacs' Python-mode: 4 spaces for one - indentation level. For really old code that you don't want to - mess up, you can continue to use 8-space tabs. Emacs Python-mode - auto-detects the prevailing indentation level used in a file and - sets its indentation parameters accordingly. + Use 4 spaces per indentation level. + + This is the default for Emacs's python-mode. For really old code that you + don't want to mess up, you can continue to use 8-space tabs. Emacs + python-mode auto-detects the prevailing indentation level used in a file + and sets its indentation parameters accordingly. Tabs or Spaces? - Never mix tabs and spaces. The most popular way of indenting - Python is with spaces only. The second-most popular way is with - tabs only. Code indented with a mixture of tabs and spaces should - be converted to using spaces exclusively. (In Emacs, select the - whole buffer and hit ESC-x untabify.) When invoking the python - command line interpreter with the -t option, it issues warnings - about code that illegally mixes tabs and spaces. When using -tt - these warnings become errors. These options are highly - recommended! - - For new projects, spaces-only are strongly recommended over tabs. - Most editors have features that make this easy to do. (In Emacs, - make sure indent-tabs-mode is nil). + Never mix tabs and spaces. + + The most popular way of indenting Python is with spaces only. The + second-most popular way is with tabs only. Code indented with a mixture + of tabs and spaces should be converted to using spaces exclusively. (In + Emacs, select the whole buffer and hit ESC-x untabify.) When invoking the + Python command line interpreter with the -t option, it issues warnings + about code that illegally mixes tabs and spaces. When using -tt these + warnings become errors. These options are highly recommended! + + For new projects, spaces-only are strongly recommended over tabs. Most + editors have features that make this easy to do. (In Emacs, make sure + indent-tabs-mode is nil). Maximum Line Length - There are still many devices around that are limited to 80 - character lines; plus, limiting windows to 80 characters makes it - possible to have several windows side-by-side. The default - wrapping on such devices looks ugly. Therefore, please limit all - lines to a maximum of 79 characters (Emacs wraps lines that are - exactly 80 characters long). For flowing long blocks of text - (docstrings or comments), limiting the length to 72 characters is - recommended. - - The preferred way of wrapping long lines is by using Python's - implied line continuation inside parentheses, brackets and braces. - If necessary, you can add an extra pair of parentheses around an - expression, but sometimes using a backslash looks better. Make - sure to indent the continued line appropriately. Emacs - Python-mode does this right. Some examples: + Limit all lines to a maximum of 79 characters. + + There are still many devices around that are limited to 80 character + lines; plus, limiting windows to 80 characters makes it possible to have + several windows side-by-side. The default wrapping on such devices looks + ugly. Therefore, please limit all lines to a maximum of 79 characters + (Emacs wraps lines that are exactly 80 characters long). For flowing long + blocks of text (docstrings or comments), limiting the length to 72 + characters is recommended. + + The preferred way of wrapping long lines is by using Python's implied line + continuation inside parentheses, brackets and braces. If necessary, you + can add an extra pair of parentheses around an expression, but sometimes + using a backslash looks better. Make sure to indent the continued line + appropriately. Emacs's python-mode does this right. Some examples: class Rectangle(Blob): @@ -105,65 +108,63 @@ Blank Lines - Separate top-level function and class definitions with two blank - lines. Method definitions inside a class are separated by a - single blank line. Extra blank lines may be used (sparingly) to - separate groups of related functions. Blank lines may be omitted - between a bunch of related one-liners (e.g. a set of dummy - implementations). - - When blank lines are used to separate method definitions, there is - also a blank line between the `class' line and the first method - definition. - - Use blank lines in functions, sparingly, to indicate logical - sections. - - Python accepts the control-L (i.e. ^L) form feed character as - whitespace; Emacs (and some printing tools) treat these - characters as page separators, so you may use them to separate - pages of related sections of your file. + Separate top-level function and class definitions with two blank lines. + + Method definitions inside a class are separated by a single blank line. + + Extra blank lines may be used (sparingly) to separate groups of related + functions. Blank lines may be omitted between a bunch of related + one-liners (e.g. a set of dummy implementations). + + Use blank lines in functions, sparingly, to indicate logical sections. + + Python accepts the control-L (i.e. ^L) form feed character as whitespace; + Emacs (and some printing tools) treat these characters as page separators, + so you may use them to separate pages of related sections of your file. Encodings (PEP 263) - Code in the core Python distribution should aways use the ASCII or - Latin-1 encoding (a.k.a. ISO-8859-1). Files using ASCII should - not have a coding cookie. Latin-1 should only be used when a - comment or docstring needs to mention an author name that requires - Latin-1; otherwise, using \x escapes is the preferred way to - include non-ASCII data in string literals. An exception is made - for those files that are part of the test suite for the code - implementing PEP 263. + Code in the core Python distribution should aways use the ASCII or Latin-1 + encoding (a.k.a. ISO-8859-1). + + Files using ASCII should not have a coding cookie. Latin-1 should only be + used when a comment or docstring needs to mention an author name that + requires Latin-1; otherwise, using \x escapes is the preferred way to + include non-ASCII data in string literals. An exception is made for those + files that are part of the test suite for the code implementing PEP 263. Imports - Imports should usually be on separate lines, e.g.: + Yes: import os + import sys + No: import sys, os - Yes: import sys - import os it's okay to say this though: - from types import StringType, ListType + from subprocess import Popen, PIPE + + - Imports are always put at the top of the file, just after any module + comments and docstrings, and before module globals and constants. - - Imports are always put at the top of the file, just after any - module comments and docstrings, and before module globals and - constants. Imports should be grouped, with the order being + Imports should be grouped in the following order: 1. standard library imports - 2. related major package imports (i.e. all email package imports next) - 3. application specific imports + 2. related third party imports + 3. local application/library specific imports You should put a blank line between each group of imports. - - Relative imports for intra-package imports are highly - discouraged. Always use the absolute package path for all - imports. + Put any relevant __all__ specification after the imports. - - When importing a class from a class-containing module, it's usually - okay to spell this + - Relative imports for intra-package imports are highly discouraged. + Always use the absolute package path for all imports. + + - When importing a class from a class-containing module, it's usually okay + to spell this from MyClass import MyClass from foo.bar.YourClass import YourClass @@ -180,39 +181,44 @@ Pet Peeves - Guido hates whitespace in the following places: + Avoid extraneous whitespace in the following situations: + + - Immediately inside parentheses, brackets or braces. + + Yes: spam(ham[1], {eggs: 2}) + No: spam( ham[ 1 ], { eggs: 2 } ) - - Immediately inside parentheses, brackets or braces, as in: - "spam( ham[ 1 ], { eggs: 2 } )". Always write this as - "spam(ham[1], {eggs: 2})". - - - Immediately before a comma, semicolon, or colon, as in: - "if x == 4 : print x , y ; x , y = y , x". Always write this as - "if x == 4: print x, y; x, y = y, x". + - Immediately before a comma, semicolon, or colon: + + Yes: if x == 4: print x, y; x, y = y, x + No: if x == 4 : print x , y ; x , y = y , x - Immediately before the open parenthesis that starts the argument - list of a function call, as in "spam (1)". Always write - this as "spam(1)". + list of a function call: + + Yes: spam(1) + No: spam (1) - Immediately before the open parenthesis that starts an indexing or - slicing, as in: "dict ['key'] = list [index]". Always - write this as "dict['key'] = list[index]". + slicing: - - More than one space around an assignment (or other) operator to - align it with another, as in: + Yes: dict['key'] = list[index] + No: dict ['key'] = list [index] - x = 1 - y = 2 - long_variable = 3 + - More than one space around an assignment (or other) operator to + align it with another. - Always write this as + Yes: x = 1 y = 2 long_variable = 3 - (Don't bother to argue with him on any of the above -- Guido's - grown accustomed to this style over 20 years.) + No: + + x = 1 + y = 2 + long_variable = 3 Other Recommendations @@ -221,53 +227,70 @@ either side: assignment (=), comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not), Booleans (and, or, not). - - Use your better judgment for the insertion of spaces around - arithmetic operators. Always be consistent about whitespace on - either side of a binary operator. Some examples: + - Use spaces around arithmetic operators: + + Yes: + + i = i + 1 + submitted += 1 + x = x * 2 - 1 + hypot2 = x * x + y * y + c = (a + b) * (a - b) + + No: - i = i+1 - submitted = submitted + 1 + i=i+1 + submitted +=1 x = x*2 - 1 hypot2 = x*x + y*y c = (a+b) * (a-b) - c = (a + b) * (a - b) - Don't use spaces around the '=' sign when used to indicate a - keyword argument or a default parameter value. For instance: + keyword argument or a default parameter value. + + Yes: def complex(real, imag=0.0): return magic(r=real, i=imag) + No: + + def complex(real, imag = 0.0): + return magic(r = real, i = imag) + - Compound statements (multiple statements on the same line) are generally discouraged. - No: if foo == 'blah': do_blah_thing() - Yes: if foo == 'blah': - do_blah_thing() - - No: do_one(); do_two(); do_three() - Yes: do_one() - do_two() - do_three() + Yes: + + if foo == 'blah': + do_blah_thing() + do_one() + do_two() + do_three() + + No: + + if foo == 'blah': do_blah_thing() + do_one(); do_two(); do_three() + Comments - Comments that contradict the code are worse than no comments. - Always make a priority of keeping the comments up-to-date when the - code changes! - - Comments should be complete sentences. If a comment is a phrase - or sentence, its first word should be capitalized, unless it is an - identifier that begins with a lower case letter (never alter the - case of identifiers!). - - If a comment is short, the period at the end is best omitted. - Block comments generally consist of one or more paragraphs built - out of complete sentences, and each sentence should end in a - period. + Comments that contradict the code are worse than no comments. Always make + a priority of keeping the comments up-to-date when the code changes! + + Comments should be complete sentences. If a comment is a phrase or + sentence, its first word should be capitalized, unless it is an identifier + that begins with a lower case letter (never alter the case of + identifiers!). + + If a comment is short, the period at the end can be omitted. Block + comments generally consist of one or more paragraphs built out of complete + sentences, and each sentence should end in a period. You should use two spaces after a sentence-ending period, since it - makes Emacs wrapping and filling work consistenty. + makes Emacs wrapping and filling work consistently. When writing English, Strunk and White apply. @@ -278,66 +301,65 @@ Block Comments - Block comments generally apply to some (or all) code that follows - them, and are indented to the same level as that code. Each line - of a block comment starts with a # and a single space (unless it - is indented text inside the comment). Paragraphs inside a block - comment are separated by a line containing a single #. Block - comments are best surrounded by a blank line above and below them - (or two lines above and a single line below for a block comment at - the start of a a new section of function definitions). + Block comments generally apply to some (or all) code that follows them, + and are indented to the same level as that code. Each line of a block + comment starts with a # and a single space (unless it is indented text + inside the comment). + + Paragraphs inside a block comment are separated by a line containing a + single #. Inline Comments - An inline comment is a comment on the same line as a statement. - Inline comments should be used sparingly. Inline comments should - be separated by at least two spaces from the statement. They - should start with a # and a single space. + Use inline comments sparingly. + + An inline comment is a comment on the same line as a statement. Inline + comments should be separated by at least two spaces from the statement. + They should start with a # and a single space. Inline comments are unnecessary and in fact distracting if they state the obvious. Don't do this: - x = x+1 # Increment x + x = x + 1 # Increment x But sometimes, this is useful: - x = x+1 # Compensate for border + x = x + 1 # Compensate for border Documentation Strings - Conventions for writing good documentation strings - (a.k.a. "docstrings") are immortalized in PEP 257 [3]. + Conventions for writing good documentation strings (a.k.a. "docstrings") + are immortalized in PEP 257 [3]. - Write docstrings for all public modules, functions, classes, and - methods. Docstrings are not necessary for non-public methods, - but you should have a comment that describes what the method - does. This comment should appear after the "def" line. + methods. Docstrings are not necessary for non-public methods, but you + should have a comment that describes what the method does. This comment + should appear after the "def" line. - PEP 257 describes good docstring conventions. Note that most - importantly, the """ that ends a multiline docstring should be - on a line by itself, e.g.: + importantly, the """ that ends a multiline docstring should be on a line + by itself, e.g.: """Return a foobang Optional plotz says to frobnicate the bizbaz first. """ - - For one liner docstrings, it's okay to keep the closing """ on - the same line. + - For one liner docstrings, it's okay to keep the closing """ on the same + line. Version Bookkeeping - If you have to have RCS or CVS crud in your source file, do it as - follows. + If you have to have Subversion, CVS, or RCS crud in your source file, do + it as follows. __version__ = "$Revision$" # $Source$ - These lines should be included after the module's docstring, - before any other code, separated by a blank line above and - below. + These lines should be included after the module's docstring, before any + other code, separated by a blank line above and below. Naming Conventions @@ -345,15 +367,15 @@ The naming conventions of Python's library are a bit of a mess, so we'll never get this completely consistent -- nevertheless, here are the currently recommended naming standards. New modules and packages - (including 3rd party frameworks) should be written to these standards, but - where an existing library has a different style, internal consistency is - preferred. + (including third party frameworks) should be written to these standards, + but where an existing library has a different style, internal consistency + is preferred. Descriptive: Naming Styles - There are a lot of different naming styles. It helps to be able - to recognize what naming style is being used, independently from - what they are used for. + There are a lot of different naming styles. It helps to be able to + recognize what naming style is being used, independently from what they + are used for. The following naming styles are commonly distinguished: @@ -373,73 +395,66 @@ of the bumpy look of its letters[4]). This is also sometimes known as StudlyCaps. + Note: When using abbreviations in CapWords, capitalize all the letters + of the abbreviation. Thus HTTPServerError is better than + HttpServerError. + - mixedCase (differs from CapitalizedWords by initial lowercase character!) - Capitalized_Words_With_Underscores (ugly!) - There's also the style of using a short unique prefix to group - related names together. This is not used much in Python, but it - is mentioned for completeness. For example, the os.stat() - function returns a tuple whose items traditionally have names like - st_mode, st_size, st_mtime and so on. The X11 library uses a - leading X for all its public functions. (In Python, this style is - generally deemed unnecessary because attribute and method names - are prefixed with an object, and function names are prefixed with - a module name.) + There's also the style of using a short unique prefix to group related + names together. This is not used much in Python, but it is mentioned for + completeness. For example, the os.stat() function returns a tuple whose + items traditionally have names like st_mode, st_size, st_mtime and so on. + The X11 library uses a leading X for all its public functions. In Python, + this style is generally deemed unnecessary because attribute and method + names are prefixed with an object, and function names are prefixed with a + module name. In addition, the following special forms using leading or trailing - underscores are recognized (these can generally be combined with any - case convention): + underscores are recognized (these can generally be combined with any case + convention): + + - _single_leading_underscore: weak "internal use" indicator. E.g. "from M + import *" does not import objects whose name starts with an underscore. + + - single_trailing_underscore_: used by convention to avoid conflicts with + Python keyword, e.g. - - _single_leading_underscore: weak "internal use" indicator - (e.g. "from M import *" does not import objects whose name - starts with an underscore). - - - single_trailing_underscore_: used by convention to avoid - conflicts with Python keyword, e.g. - "Tkinter.Toplevel(master, class_='ClassName')". + Tkinter.Toplevel(master, class_='ClassName') - - __double_leading_underscore: class-private names as of Python 1.4. + - __double_leading_underscore: when naming a class attribute, invokes name + mangling as of Python 1.4. - __double_leading_and_trailing_underscore__: "magic" objects or - attributes that live in user-controlled namespaces, - e.g. __init__, __import__ or __file__. Sometimes these are - defined by the user to trigger certain magic behavior - (e.g. operator overloading); sometimes these are inserted by the - infrastructure for its own use or for debugging purposes. Since - the infrastructure (loosely defined as the Python interpreter - and the standard library) may decide to grow its list of magic - attributes in future versions, user code should generally - refrain from using this convention for its own use. User code - that aspires to become part of the infrastructure could combine - this with a short prefix inside the underscores, - e.g. __bobo_magic_attr__. + attributes that live in user-controlled namespaces. E.g. __init__, + __import__ or __file__. Prescriptive: Naming Conventions Names to Avoid - Never use the characters `l' (lowercase letter el), `O' - (uppercase letter oh), or `I' (uppercase letter eye) as single - character variable names. In some fonts, these characters are - indistinguisable from the numerals one and zero. When tempted - to use `l' use `L' instead. + Never use the characters `l' (lowercase letter el), `O' (uppercase + letter oh), or `I' (uppercase letter eye) as single character variable + names. + + In some fonts, these characters are indistinguishable from the numerals + one and zero. When tempted to use `l' use `L' instead. Module Names Modules should have short, lowercase names, without underscores. - Since module names are mapped to file names, and some file systems - are case insensitive and truncate long names, it is important that - module names be chosen to be fairly short -- this won't be a - problem on Unix, but it may be a problem when the code is - transported to Mac or Windows. - - When an extension module written in C or C++ has an accompanying - Python module that provides a higher level (e.g. more object - oriented) interface, the C/C++ module has a leading underscore - (e.g. _socket). + Since module names are mapped to file names, and some file systems are + case insensitive and truncate long names, it is important that module + names be chosen to be fairly short -- this won't be a problem on Unix, + but it may be a problem when the code is transported to Mac or Windows. + + When an extension module written in C or C++ has an accompanying Python + module that provides a higher level (e.g. more object oriented) + interface, the C/C++ module has a leading underscore (e.g. _socket). Python packages should have short, all-lowercase names, without underscores. @@ -451,137 +466,201 @@ Exception Names - If a module defines a single exception raised for all sorts of - conditions, it is generally called "error" or "Error". It seems - that built-in (extension) modules use "error" (e.g. os.error), - while Python modules generally use "Error" (e.g. xdrlib.Error). - The trend seems to be toward CapWords exception names. + Because exceptions should be classes, the class naming convention + applies here. However, you should use the suffix "Error" on your + exception names (if the exception actually is an error). Global Variable Names - (Let's hope that these variables are meant for use inside one - module only.) The conventions are about the same as those for - functions. Modules that are designed for use via "from M import *" - should prefix their globals (and internal functions and classes) - with an underscore to prevent exporting them. + (Let's hope that these variables are meant for use inside one module + only.) The conventions are about the same as those for functions. + + Modules that are designed for use via "from M import *" should use the + __all__ mechanism to prevent exporting globals, or use the the older + convention of prefixing such globals with an underscore (which you might + want to do to indicate these globals are "module non-public"). Function Names - Function names should be lowercase, possibly with words separated by - underscores to improve readability. mixedCase is allowed only in - contexts where that's already the prevailing style (e.g. threading.py), - to retain backwards compatibility. + Function names should be lowercase, with words separated by underscores + as necessary to improve readability. + + mixedCase is allowed only in contexts where that's already the + prevailing style (e.g. threading.py), to retain backwards compatibility. + + Function and method arguments + + Always use 'self' for the first argument to instance methods. + + Always use 'cls' for the first argument to class methods. + + If a function argument's name clashes with a reserved keyword, it is + generally better to append a single trailing underscore rather than use + an abbreviation or spelling corruption. Thus "print_" is better than + "prnt". Method Names and Instance Variables - The story is largely the same as with functions: in general, use - lowercase with words separated by underscores as necessary to improve - readability. - - Use one leading underscore only for internal methods and instance - variables which are not intended to be part of the class's public - interface. Python does not enforce this; it is up to programmers to - respect the convention. + Use the function naming rules: lowercase with words separated by + underscores as necessary to improve readability. + + Use one leading underscore only for non-public methods and instance + variables. - Use two leading underscores to denote class-private names. Python - "mangles" these names with the class name: if class Foo has an + To avoid name clashes with subclasses, use two leading underscores to + invoke Python's name mangling rules. + + Python mangles these names with the class name: if class Foo has an attribute named __a, it cannot be accessed by Foo.__a. (An insistent - user could still gain access by calling Foo._Foo__a.) Generally, - double leading underscores should be used only to avoid name conflicts - with attributes in classes designed to be subclassed. + user could still gain access by calling Foo._Foo__a.) Generally, double + leading underscores should be used only to avoid name conflicts with + attributes in classes designed to be subclassed. + + Note: there is some controversy about the use of __names (see below). Designing for inheritance Always decide whether a class's methods and instance variables - should be public or non-public. In general, never make data - variables public unless you're implementing essentially a - record. It's almost always preferrable to give a functional - interface to your class instead (and some Python 2.2 - developments will make this much nicer). - - Also decide whether your attributes should be private or not. - The difference between private and non-public is that the former - will never be useful for a derived class, while the latter might - be. Yes, you should design your classes with inheritence in - mind! - - Private attributes should have two leading underscores, no - trailing underscores. - - Non-public attributes should have a single leading underscore, - no trailing underscores. - - Public attributes should have no leading or trailing - underscores, unless they conflict with reserved words, in which - case, a single trailing underscore is preferrable to a leading - one, or a corrupted spelling, e.g. class_ rather than klass. - (This last point is a bit controversial; if you prefer klass - over class_ then just be consistent. :). + (collectively: "attributes") should be public or non-public. If in + doubt, choose non-public; it's easier to make it public later than to + make a public attribute non-public. + + Public attributes are those that you expect unrelated clients of your + class to use, with your commitment to avoid backward incompatible + changes. Non-public attributes are those that are not intended to be + used by third parties; you make no guarantees that non-pubic attributes + won't change or even be removed. + + We don't use the term "private" here, since no attribute is really + private in Python (without a generally unnecessary amount of work). + + Another category of attributes are those that are part of the "subclass + API" (often called "protected" in other languages). Some classes are + designed to be inherited from, either to extend or modify aspects of the + class's behavior. When designing such a class, take care to make + explicit decisions about which attributes are public, which are part of + the subclass API, and which are truly only to be used by your base + class. + + With this in mind, here are the Pythonic guidelines: + + - Public attributes should have no leading underscores. + + - If your public attribute name collides with a reserved keyword, append + a single trailing underscore to your attribute name. This is + preferable to an abbreviation or corrupted spelling. E.g. "class_" + is preferable to "cls" or "klass". + + Note 1: See the argument name recommendation above for class methods. + + - For simple public data attributes, it is best to expose just the + attribute name, without complicated accessor/mutator methods. Keep in + mind that Python provides an easy path to future enhancement, should + you find that a simple data attribute needs to grow functional + behavior. In that case, use properties to hide functional + implementation behind simple data attribute access syntax. + + Note 1: Properties only work on new-style classes. + + Note 2: Try to keep the functional behavior side-effect free, although + side-effects such as caching are generally fine. + + - If your class is intended to be subclassed, and you have attributes + that you do not want subclasses to use, consider naming them with + double leading underscores and no trailing underscores. This invokes + Python's name mangling algorithm, where the name of the class is + mangled into the attribute name. This helps avoid attribute name + collisions should subclasses inadvertently contain attributes with the + same name. + + Note 1: Note that only the simple class name is used in the mangled + name, so if a subclass chooses both the same class name and attribute + name, you can still get name collisions. + + Note 2: Name mangling can make certain uses, such as debugging and + __getattr__(), less convenient. However the name mangling algorithm + is well documented and easy to perform manually. Programming Recommendations - Code should be written in a way that does not disadvantage other implementations of Python (PyPy, Jython, IronPython, Pyrex, Psyco, - and such). For example, do not rely on CPython's efficient - implementation of in-place string concatenation for statements in - the form a+=b or a=a+b. Those statements run more slowly in - Jython. In performance sensitive parts of the library, the - ''.join() form should be used instead. This will assure that - concatenation occurs in linear time across various implementations. + and such). + + For example, do not rely on CPython's efficient implementation of + in-place string concatenation for statements in the form a+=b or a=a+b. + Those statements run more slowly in Jython. In performance sensitive + parts of the library, the ''.join() form should be used instead. This + will assure that concatenation occurs in linear time across various + implementations. - Comparisons to singletons like None should always be done with - 'is' or 'is not'. Also, beware of writing "if x" when you - really mean "if x is not None" -- e.g. when testing whether a - variable or argument that defaults to None was set to some other - value. The other value might be a value that's false in a - Boolean context! - - - Class-based exceptions are always preferred over string-based - exceptions. Modules or packages should define their own - domain-specific base exception class, which should be subclassed - from the built-in Exception class. Always include a class - docstring. E.g.: + 'is' or 'is not', never the equality operators. + + Also, beware of writing "if x" when you really mean "if x is not None" + -- e.g. when testing whether a variable or argument that defaults to + None was set to some other value. The other value might be a value + that's false in a boolean context! + + - Use class-based exceptions. + + String exceptions in new code are strongly discouraged, as they will + eventually be deprecated and then removed. + + Modules or packages should define their own domain-specific base + exception class, which should be subclassed from the built-in Exception + class. Always include a class docstring. E.g.: class MessageError(Exception): """Base class for errors in the email package.""" - When raising an exception, use "raise ValueError('message')" - instead of the older form "raise ValueError, 'message'". The - paren-using form is preferred because when the exception - arguments are long or include string formatting, you don't need - to use line continuation characters thanks to the containing - parentheses. The older form will be removed in Python 3000. - - - Use string methods instead of the string module unless - backward-compatibility with versions earlier than Python 2.0 is - important. String methods are always much faster and share the - same API with unicode strings. - - - Avoid slicing strings when checking for prefixes or suffixes. - Use startswith() and endswith() instead, since they are - cleaner and less error prone. For example: + Class naming conventions apply here, although you should add the suffix + "Error" to your exception classes, if the exception is an error. + Non-error exceptions need no special suffix. + + - When raising an exception, use "raise ValueError('message')" instead of + the older form "raise ValueError, 'message'". + + The paren-using form is preferred because when the exception arguments + are long or include string formatting, you don't need to use line + continuation characters thanks to the containing parentheses. The older + form will be removed in Python 3000. + + - Use string methods instead of the string module. + + String methods are always much faster and share the same API with + unicode strings. Override this rule if backward compatibility with + Pythons older than 2.0 is required. + + - Use ''.startswith() and ''.endswith() instead of string slicing to check + for prefixes or suffixes. + + startswith() and endswith() are cleaner and less error prone. For + example: - No: if foo[:3] == 'bar': Yes: if foo.startswith('bar'): - The exception is if your code must work with Python 1.5.2 (but - let's hope not!). + No: if foo[:3] == 'bar': + + The exception is if your code must work with Python 1.5.2 (but let's + hope not!). - Object type comparisons should always use isinstance() instead - of comparing types directly. E.g. + of comparing types directly. - No: if type(obj) is type(1): Yes: if isinstance(obj, int): - When checking if an object is a string, keep in mind that it - might be a unicode string too! In Python 2.3, str and unicode - have a common base class, basestring, so you can do: + No: if type(obj) is type(1): + + When checking if an object is a string, keep in mind that it might be a + unicode string too! In Python 2.3, str and unicode have a common base + class, basestring, so you can do: if isinstance(obj, basestring): - In Python 2.2, the types module has the StringTypes type defined - for that purpose, e.g.: + In Python 2.2, the types module has the StringTypes type defined for + that purpose, e.g.: from types import StringTypes if isinstance(obj, StringTypes): @@ -593,19 +672,22 @@ isinstance(obj, UnicodeType) : - For sequences, (strings, lists, tuples), use the fact that empty - sequences are false, so "if not seq" or "if seq" is preferable - to "if len(seq)" or "if not len(seq)". + sequences are false. + + Yes: if not seq: + if seq: + + No: if len(seq) + if not len(seq) - Don't write string literals that rely on significant trailing - whitespace. Such trailing whitespace is visually - indistinguishable and some editors (or more recently, - reindent.py) will trim them. + whitespace. Such trailing whitespace is visually indistinguishable and + some editors (or more recently, reindent.py) will trim them. - - Don't compare boolean values to True or False using == (bool - types are new in Python 2.3): + - Don't compare boolean values to True or False using == - No: if greeting == True: Yes: if greeting: + No: if greeting == True: References @@ -621,6 +703,8 @@ [5] Barry's GNU Mailman style guide http://barry.warsaw.us/software/STYLEGUIDE.txt + [6] PEP 20, The Zen of Python + Copyright From python-checkins at python.org Wed Dec 14 22:43:30 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 22:43:30 +0100 (CET) Subject: [Python-checkins] commit of r41680 - in external/celementtree-1.0.4-20051213: CHANGES PKG-INFO README cElementTree.c cElementTreeWrite.c expat expat/ascii.h expat/asciitab.h expat/expat.h expat/expat_external.h expat/iasciitab.h expat/internal.h expat/latin1tab.h expat/macconfig.h expat/nametab.h expat/utf8tab.h expat/winconfig.h expat/xmlparse.c expat/xmlrole.c expat/xmlrole.h expat/xmltok.c expat/xmltok.h expat/xmltok_impl.c expat/xmltok_impl.h expat/xmltok_ns.c samples samples/simple-ns.xml samples/simple.xml selftest.py setup.py Message-ID: <20051214214330.4E77A1E4002@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 22:43:26 2005 New Revision: 41680 Added: external/celementtree-1.0.4-20051213/ external/celementtree-1.0.4-20051213/CHANGES external/celementtree-1.0.4-20051213/PKG-INFO external/celementtree-1.0.4-20051213/README external/celementtree-1.0.4-20051213/cElementTree.c external/celementtree-1.0.4-20051213/cElementTreeWrite.c external/celementtree-1.0.4-20051213/expat/ external/celementtree-1.0.4-20051213/expat/ascii.h external/celementtree-1.0.4-20051213/expat/asciitab.h external/celementtree-1.0.4-20051213/expat/expat.h external/celementtree-1.0.4-20051213/expat/expat_external.h external/celementtree-1.0.4-20051213/expat/iasciitab.h external/celementtree-1.0.4-20051213/expat/internal.h external/celementtree-1.0.4-20051213/expat/latin1tab.h external/celementtree-1.0.4-20051213/expat/macconfig.h external/celementtree-1.0.4-20051213/expat/nametab.h external/celementtree-1.0.4-20051213/expat/utf8tab.h external/celementtree-1.0.4-20051213/expat/winconfig.h external/celementtree-1.0.4-20051213/expat/xmlparse.c external/celementtree-1.0.4-20051213/expat/xmlrole.c external/celementtree-1.0.4-20051213/expat/xmlrole.h external/celementtree-1.0.4-20051213/expat/xmltok.c external/celementtree-1.0.4-20051213/expat/xmltok.h external/celementtree-1.0.4-20051213/expat/xmltok_impl.c external/celementtree-1.0.4-20051213/expat/xmltok_impl.h external/celementtree-1.0.4-20051213/expat/xmltok_ns.c external/celementtree-1.0.4-20051213/samples/ external/celementtree-1.0.4-20051213/samples/simple-ns.xml external/celementtree-1.0.4-20051213/samples/simple.xml external/celementtree-1.0.4-20051213/selftest.py external/celementtree-1.0.4-20051213/setup.py Log: imported celementtree 1.0.4 Added: external/celementtree-1.0.4-20051213/CHANGES ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/CHANGES Wed Dec 14 22:43:26 2005 @@ -0,0 +1,122 @@ +$Id: /work/modules/celementtree/CHANGES 1089 2005-12-14T21:22:30.257830Z Fredrik $ + +(1.0.4 released) + ++ Added support for linking against the "pyexpat" library in Python + 2.5. Define USE_PYEXPAT_CAPI to enable this feature. + ++ Minor optimizations. + +(1.0.3 released) + ++ Use runtime test for figure out if copy workaround is needed. + ++ Don't crash in 'parse' if the file object's 'read' method raises + an unexpected exception (reported by Martin Pool). + ++ Added comment and processing instruction support to the XMLParser + type. The parser now calls 'comment' and 'pi' methods on the target + object, if available. + ++ Make 'iterparse' available under Python 2.1 (requires ElementTree + 1.2.5 or newer). + ++ Report unknown events passed to 'iterparse', rather than ignoring + them. (Under 2.1, this only works if ElementTree's iterparse does + this) + ++ Added 'Comment' and 'PI'/'ProcessingInstruction' output helpers. + +(1.0.2 released) + ++ Let Expat use Python's memory allocator. + ++ Added missing 'iselement' function (reported by Ken Rimey). + ++ Fixed attribute dictionary aliasing bug in 'makeelement' method + (reported by Ken Rimey). + +(1.0.1 released) + ++ Added missing 'remove' method (based on code by Michael Droettboom). + +(1.0 released) + ++ Added a VERSION attribute to the cElementTree module (also available + as __version__). + +(0.9.8 released) + ++ Changed the 'iterparse' interface slightly. The context object + is no longer included in the sequence, and by default, the parser + only returns "end" events (for completed elements): + + for event, elem in iterparse(source): + ... + + To get other events, use the "events" option to pass in a tuple + containing the events you want: + + for event, elem in iterparse(source, events=(...)): + ... + + The event tuple can contain one or more of: + + "start" + generated for start tags, after the element has been created + (but before the current element has been fully populated) + "end" + generated for end tags, after all element children has been + created. + "start-ns" + generated when a new namespace scope is opened. for this event, + the elem value is a (prefix, url) tuple. + "end-ns" + generated when the current namespace scope is closed. elem + is None. + + Events arrive asynchronously; the tree is usually more complete + than the events indicate, but this is nothing you can rely on. + + The iterable itself contains context information. In the current + release, the only public context attribute is "root", which is set + to the root element when parsing is finished. To access the con- + text, assign the iterable to a variable before looping over it: + + context = iterparse(source) + for event, elem in context: + ... + root = context.root + +(0.9.3 released) + ++ Added 'iterparse' function. This is similar to 'parse', but returns + a stream of events while it builds the tree. Usage: + + for context, action, elem in iterparse(source): + ... + + - The context object is a dummy object in the current release. The + action object is either "start" (for start tags) or "end" (for end + tags). The elem object is the current element; for "start" events, + the element itself has been created (including attributes), but its + contents may not be complete; for "end" events, all child elements + has been processed as well. You can use "start" tags to count + elements, check attributes, and check if certain tags are present + in a tree. For all other purposes, use "end" handlers instead. + + - For incremental parsing, call 'elem.clear()' in the "end" handler, + when you're done processing a given element. + + - When the loop finishes, the last elem object will be the tree's + root note. You can terminate the loop at any time (but doing that + will of course leave the tree in an unknown, unfinished state). + ++ Fixed getchildren crash. Note that getchildren is deprecated; use + 'elem' or 'list(elem)' instead of 'elem.getchildren()' (elements are + sequences; only use 'list(elem)' if you need a real list object). + ++ Removed the addobserver/removeobserver API from the TreeBuilder class. + Use 'iterparse' instead. + +(0.9.2 released) Added: external/celementtree-1.0.4-20051213/PKG-INFO ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/PKG-INFO Wed Dec 14 22:43:26 2005 @@ -0,0 +1,14 @@ +Metadata-Version: 1.0 +Name: cElementTree +Version: 1.0.4-20051213 +Summary: A fast C implementation of the ElementTree API. +Home-page: http://www.effbot.org/zone/celementtree.htm +Author: Fredrik Lundh +Author-email: fredrik at pythonware.com +License: Python (MIT style) +Download-URL: http://effbot.org/downloads#celementtree +Description: A fast C implementation of the ElementTree API. +Platform: Python 2.1 and later. +Classifier: Development Status :: 5 - Production/Stable +Classifier: Operating System :: OS Independent +Classifier: Topic :: Text Processing :: Markup :: XML Added: external/celementtree-1.0.4-20051213/README ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/README Wed Dec 14 22:43:26 2005 @@ -0,0 +1,156 @@ +ElementTree +$Id: /work/modules/celementtree/README 1089 2005-12-14T21:22:30.257830Z Fredrik $ + +Release 1.0.4 (December 13, 2005) + +==================================================================== +The cElementTree module, release 1.0.4 +==================================================================== + +-------------------------------------------------------------------- +Introduction + +The cElementTree module is a C implementation of the ElementTree API. +On typical documents, it's 15-20 times faster than the Python version +of ElementTree, and uses 2-5 times less memory. + +Here are some benchmark results, using a number of popular XML tool- +kits to parse a 3405k source file from disk to memory, on my develop- +ment machine: + + library memory time + ------------------------------------------------------------ + minidom (python 2.1) 80000k 6.3s + minidom (python 2.4) 53000k 1.4s + ElementTree 1.3 14500k 1.1s + cDomlette 20500k 0.54s + pyRXPU 10850k 0.175s + libxml2 16000k 0.098s + cElementTree 1.0 4900k 0.047s + ------------------------------------------------------------ + readlines (read as utf-8) 8850k 0.093s + readlines (read as ascii) 5050k 0.032s + ------------------------------------------------------------ + +For more information on this module, see: + + http://effbot.org/zone/celementtree.htm + +and + + http://effbot.org/zone/element-index.htm + +For detailed information about changes/fixes in this release, see the +CHANGES document. + +The current version is designed to work with Python 2.1 and newer, +with the exception of the 'iterparse' mechanism, which only works +under Python 2.2 and later. Earlier Python versions are not supported +(let me know if you need support for 2.0 or 1.5.2). For best per- +formance, use Python 2.4 or later. + +Enjoy /F + +fredrik at pythonware.com +http://www.pythonware.com + +-------------------------------------------------------------------- +Installation + +The cElementTree module is shipped as a distutils package. To install +the library, unpack the distribution archive, and issue the following +command: + + $ python setup.py install + +If you're using Windows, you can usually get prebuilt installers from +the effbot.org downloads site: + + http://effbot.org/downloads#celementtree + +The current version depends on certain support functions and classes +from the ElementTree and ElementPath modules, so you must install the +standard elementtree package before you can use this library. You can +get the elementtree distribution from: + + http://effbot.org/downloads#elementtree + +-------------------------------------------------------------------- +Usage + +The cElementTree module is designed to replace the ElementTree module +from the standard elementtree package. In theory, you should be able +to simply change: + + from elementtree import ElementTree + +to + + import cElementTree as ElementTree + +in existing code, and run your programs without any problems (note +that cElementTree replaces the elementtree.ElementTree module, not the +elementtree package). Some ElementTree 1.2 features may not be fully +supported by this release. (Let me know if you find that something +you rely on doesn't work as expected.) + +For more information on the elementtree package, see: + + http://effbot.org/zone/element.htm + +-------------------------------------------------------------------- +ElementTree Software License + +The ElementTree package and the cElementTree accelerator are + +Copyright (c) 1999-2005 by Secret Labs AB +Copyright (c) 1999-2005 by Fredrik Lundh + +By obtaining, using, and/or copying this software and/or its +associated documentation, you agree that you have read, understood, +and will comply with the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its +associated documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appears in all +copies, and that both that copyright notice and this permission notice +appear in supporting documentation, and that the name of Secret Labs +AB or the author not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR 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. + +-------------------------------------------------------------------- +Expat Software License + +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------- Added: external/celementtree-1.0.4-20051213/cElementTree.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/cElementTree.c Wed Dec 14 22:43:26 2005 @@ -0,0 +1,2720 @@ +/* + * ElementTree + * $Id: /work/modules/celementtree/cElementTree.c 1089 2005-12-14T21:22:30.257830Z Fredrik $ + * + * elementtree accelerator + * + * History: + * 1999-06-20 fl created (as part of sgmlop) + * 2001-05-29 fl effdom edition + * 2001-06-05 fl backported to unix; fixed bogus free in clear + * 2001-07-10 fl added findall helper + * 2003-02-27 fl elementtree edition (alpha) + * 2004-06-03 fl updates for elementtree 1.2 + * 2005-01-05 fl added universal name cache, Element/SubElement factories + * 2005-01-06 fl moved python helpers into C module; removed 1.5.2 support + * 2005-01-07 fl added 2.1 support; work around broken __copy__ in 2.3 + * 2005-01-08 fl added makeelement method; fixed path support + * 2005-01-10 fl optimized memory usage + * 2005-01-11 fl first public release (cElementTree 0.8) + * 2005-01-12 fl split element object into base and extras + * 2005-01-13 fl use tagged pointers for tail/text (cElementTree 0.9) + * 2005-01-17 fl added treebuilder close method + * 2005-01-17 fl fixed crash in getchildren + * 2005-01-18 fl removed observer api, added iterparse (cElementTree 0.9.3) + * 2005-01-23 fl revised iterparse api; added namespace event support (0.9.8) + * 2005-01-26 fl added VERSION module property (cElementTree 1.0) + * 2005-01-28 fl added remove method (1.0.1) + * 2005-03-01 fl added iselement function; fixed makeelement aliasing (1.0.2) + * 2005-03-13 fl export Comment and ProcessingInstruction/PI helpers + * 2005-03-26 fl added Comment and PI support to XMLParser + * 2005-03-27 fl event optimizations; complain about bogus events + * 2005-08-08 fl fixed read error handling in parse + * 2005-08-11 fl added runtime test for copy workaround (1.0.3) + * 2005-12-13 fl added expat_capi support (for xml.etree) + * + * Copyright (c) 1999-2005 by Secret Labs AB. All rights reserved. + * Copyright (c) 1999-2005 by Fredrik Lundh. + * + * info at pythonware.com + * http://www.pythonware.com + */ + +#include "Python.h" + +#define VERSION "1.0.4" + +/* -------------------------------------------------------------------- */ +/* configuration */ + +/* Leave defined to include the expat-based XMLParser type */ +#define USE_EXPAT + +/* Define to to all expat calls via pyexpat's embedded expat library */ +/* #define USE_PYEXPAT_CAPI */ + +/* An element can hold this many children without extra memory + allocations. */ +#define STATIC_CHILDREN 4 + +/* For best performance, chose a value so that 80-90% of all nodes + have no more than the given number of children. Set this to zero + to minimize the size of the element structure itself (this only + helps if you have lots of leaf nodes with attributes). */ + +/* Also note that pymalloc always allocates blocks in multiples of + eight bytes. For the current version of cElementTree, this means + that the number of children should be an even number, at least on + 32-bit platforms. */ + +/* -------------------------------------------------------------------- */ + +#if 0 +static int memory = 0; +#define ALLOC(size, comment)\ +do { memory += size; printf("%8d - %s\n", memory, comment); } while (0) +#define RELEASE(size, comment)\ +do { memory -= size; printf("%8d - %s\n", memory, comment); } while (0) +#else +#define ALLOC(size, comment) +#define RELEASE(size, comment) +#endif + +/* compiler tweaks */ +#if defined(_MSC_VER) +#define LOCAL(type) static __inline type __fastcall +#else +#define LOCAL(type) static type +#endif + +/* compatibility macros */ +#if (PY_VERSION_HEX < 0x02040000) +#define PyDict_CheckExact PyDict_Check +#if (PY_VERSION_HEX < 0x02020000) +#define PyList_CheckExact PyList_Check +#define PyString_CheckExact PyString_Check +#if (PY_VERSION_HEX >= 0x01060000) +#define Py_USING_UNICODE /* always enabled for 2.0 and 2.1 */ +#endif +#endif +#endif + +#if (PY_VERSION_HEX >= 0x02050000) +#define PY_CONST const /* 2.5 adds const to some API:s */ +#else +#define PY_CONST +#endif + +#if !defined(Py_RETURN_NONE) +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None +#endif + +/* macros used to store 'join' flags in string object pointers. note + that all use of text and tail as object pointers must be wrapped in + JOIN_OBJ. see comments in the ElementObject definition for more + info. */ +#define JOIN_GET(p) ((Py_uintptr_t) (p) & 1) +#define JOIN_SET(p, flag) ((void*) ((Py_uintptr_t) (JOIN_OBJ(p)) | (flag))) +#define JOIN_OBJ(p) ((PyObject*) ((Py_uintptr_t) (p) & ~1)) + +/* glue functions (see the init function for details) */ +static PyObject* elementtree_copyelement_obj; +static PyObject* elementtree_deepcopy_obj; +static PyObject* elementtree_getiterator_obj; +static PyObject* elementpath_obj; + +/* helpers */ + +LOCAL(PyObject*) +deepcopy(PyObject* object, PyObject* memo) +{ + /* do a deep copy of the given object */ + + PyObject* args; + PyObject* result; + + if (!elementtree_deepcopy_obj) { + PyErr_SetString( + PyExc_RuntimeError, + "deepcopy helper not found" + ); + return NULL; + } + + args = PyTuple_New(2); + Py_INCREF(object); PyTuple_SET_ITEM(args, 0, (PyObject*) object); + Py_INCREF(memo); PyTuple_SET_ITEM(args, 1, (PyObject*) memo); + + result = PyObject_CallObject(elementtree_deepcopy_obj, args); + + Py_DECREF(args); + + return result; +} + +LOCAL(PyObject*) +list_join(PyObject* list) +{ + /* join list elements (destroying the list in the process) */ + + PyObject* joiner; + PyObject* function; + PyObject* args; + PyObject* result; + + switch (PyList_GET_SIZE(list)) { + case 0: + Py_DECREF(list); + return PyString_FromString(""); + case 1: + result = PyList_GET_ITEM(list, 0); + Py_INCREF(result); + Py_DECREF(list); + return result; + } + + /* two or more elements: slice out a suitable separator from the + first member, and use that to join the entire list */ + + joiner = PySequence_GetSlice(PyList_GET_ITEM(list, 0), 0, 0); + if (!joiner) + return NULL; + + function = PyObject_GetAttrString(joiner, "join"); + if (!function) { + Py_DECREF(joiner); + return NULL; + } + + args = PyTuple_New(1); + PyTuple_SET_ITEM(args, 0, list); + + result = PyObject_CallObject(function, args); + + Py_DECREF(args); /* also removes list */ + Py_DECREF(function); + Py_DECREF(joiner); + + return result; +} + +#if (PY_VERSION_HEX < 0x02020000) +LOCAL(int) +PyDict_Update(PyObject* dict, PyObject* other) +{ + /* PyDict_Update emulation for 2.1 and earlier */ + + PyObject* res; + + res = PyObject_CallMethod(dict, "update", "O", other); + if (!res) + return -1; + + Py_DECREF(res); + return 0; +} +#endif + +/* -------------------------------------------------------------------- */ +/* the element type */ + +typedef struct { + + /* attributes (a dictionary object), or None if no attributes */ + PyObject* attrib; + + /* child elements */ + int length; /* actual number of items */ + int allocated; /* allocated items */ + + /* this either points to _children or to a malloced buffer */ + PyObject* *children; + + PyObject* _children[STATIC_CHILDREN]; + +} ElementObjectExtra; + +typedef struct { + PyObject_HEAD + + /* element tag (a string). */ + PyObject* tag; + + /* text before first child. note that this is a tagged pointer; + use JOIN_OBJ to get the object pointer. the join flag is used + to distinguish lists created by the tree builder from lists + assigned to the attribute by application code; the former + should be joined before being returned to the user, the latter + should be left intact. */ + PyObject* text; + + /* text after this element, in parent. note that this is a tagged + pointer; use JOIN_OBJ to get the object pointer. */ + PyObject* tail; + + ElementObjectExtra* extra; + +} ElementObject; + +staticforward PyTypeObject Element_Type; + +#define Element_CheckExact(op) ((op)->ob_type == &Element_Type) + +/* -------------------------------------------------------------------- */ +/* element constructor and destructor */ + +LOCAL(int) +element_new_extra(ElementObject* self, PyObject* attrib) +{ + self->extra = PyObject_Malloc(sizeof(ElementObjectExtra)); + if (!self->extra) + return -1; + + if (!attrib) + attrib = Py_None; + + Py_INCREF(attrib); + self->extra->attrib = attrib; + + self->extra->length = 0; + self->extra->allocated = STATIC_CHILDREN; + self->extra->children = self->extra->_children; + + return 0; +} + +LOCAL(void) +element_dealloc_extra(ElementObject* self) +{ + int i; + + Py_DECREF(self->extra->attrib); + + for (i = 0; i < self->extra->length; i++) + Py_DECREF(self->extra->children[i]); + + if (self->extra->children != self->extra->_children) + PyObject_Free(self->extra->children); + + PyObject_Free(self->extra); +} + +LOCAL(PyObject*) +element_new(PyObject* tag, PyObject* attrib) +{ + ElementObject* self; + + self = PyObject_New(ElementObject, &Element_Type); + if (self == NULL) + return NULL; + + /* use None for empty dictionaries */ + if (PyDict_CheckExact(attrib) && !PyDict_Size(attrib)) + attrib = Py_None; + + self->extra = NULL; + + if (attrib != Py_None) { + + if (element_new_extra(self, attrib) < 0) + return NULL; + + self->extra->length = 0; + self->extra->allocated = STATIC_CHILDREN; + self->extra->children = self->extra->_children; + + } + + Py_INCREF(tag); + self->tag = tag; + + Py_INCREF(Py_None); + self->text = Py_None; + + Py_INCREF(Py_None); + self->tail = Py_None; + + ALLOC(sizeof(ElementObject), "create element"); + + return (PyObject*) self; +} + +LOCAL(int) +element_resize(ElementObject* self, int extra) +{ + int size; + PyObject* *children; + + /* make sure self->children can hold the given number of extra + elements. set an exception and return -1 if allocation failed */ + + if (!self->extra) + element_new_extra(self, NULL); + + size = self->extra->length + extra; + + if (size > self->extra->allocated) { + /* use Python 2.4's list growth strategy */ + size = (size >> 3) + (size < 9 ? 3 : 6) + size; + if (self->extra->children != self->extra->_children) { + children = PyObject_Realloc(self->extra->children, + size * sizeof(PyObject*)); + if (!children) + goto nomemory; + } else { + children = PyObject_Malloc(size * sizeof(PyObject*)); + if (!children) + goto nomemory; + /* copy existing children from static area to malloc buffer */ + memcpy(children, self->extra->children, + self->extra->length * sizeof(PyObject*)); + } + self->extra->children = children; + self->extra->allocated = size; + } + + return 0; + + nomemory: + PyErr_NoMemory(); + return -1; +} + +LOCAL(int) +element_add_subelement(ElementObject* self, PyObject* element) +{ + /* add a child element to a parent */ + + if (element_resize(self, 1) < 0) + return -1; + + Py_INCREF(element); + self->extra->children[self->extra->length] = element; + + self->extra->length++; + + return 0; +} + +LOCAL(PyObject*) +element_get_attrib(ElementObject* self) +{ + /* return borrowed reference to attrib dictionary */ + /* note: this function assumes that the extra section exists */ + + PyObject* res = self->extra->attrib; + + if (res == Py_None) { + /* create missing dictionary */ + res = PyDict_New(); + if (!res) + return NULL; + self->extra->attrib = res; + } + + return res; +} + +LOCAL(PyObject*) +element_get_text(ElementObject* self) +{ + /* return borrowed reference to text attribute */ + + PyObject* res = self->text; + + if (JOIN_GET(res)) { + res = JOIN_OBJ(res); + if (PyList_CheckExact(res)) { + res = list_join(res); + if (!res) + return NULL; + self->text = res; + } + } + + return res; +} + +LOCAL(PyObject*) +element_get_tail(ElementObject* self) +{ + /* return borrowed reference to text attribute */ + + PyObject* res = self->tail; + + if (JOIN_GET(res)) { + res = JOIN_OBJ(res); + if (PyList_CheckExact(res)) { + res = list_join(res); + if (!res) + return NULL; + self->tail = res; + } + } + + return res; +} + +static PyObject* +element(PyObject* self, PyObject* args, PyObject* kw) +{ + PyObject* elem; + + PyObject* tag; + PyObject* attrib = NULL; + if (!PyArg_ParseTuple(args, "O|O!:Element", &tag, + &PyDict_Type, &attrib)) + return NULL; + + if (attrib || kw) { + attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New(); + if (!attrib) + return NULL; + if (kw) + PyDict_Update(attrib, kw); + } else { + Py_INCREF(Py_None); + attrib = Py_None; + } + + elem = element_new(tag, attrib); + + Py_DECREF(attrib); + + return elem; +} + +static PyObject* +subelement(PyObject* self, PyObject* args, PyObject* kw) +{ + PyObject* elem; + + ElementObject* parent; + PyObject* tag; + PyObject* attrib = NULL; + if (!PyArg_ParseTuple(args, "O!O|O!:SubElement", + &Element_Type, &parent, &tag, + &PyDict_Type, &attrib)) + return NULL; + + if (attrib || kw) { + attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New(); + if (!attrib) + return NULL; + if (kw) + PyDict_Update(attrib, kw); + } else { + Py_INCREF(Py_None); + attrib = Py_None; + } + + elem = element_new(tag, attrib); + + Py_DECREF(attrib); + + if (element_add_subelement(parent, elem) < 0) + return NULL; + + return elem; +} + +static void +element_dealloc(ElementObject* self) +{ + if (self->extra) + element_dealloc_extra(self); + + /* discard attributes */ + Py_DECREF(self->tag); + Py_DECREF(JOIN_OBJ(self->text)); + Py_DECREF(JOIN_OBJ(self->tail)); + + RELEASE(sizeof(ElementObject), "destroy element"); + + PyObject_Del(self); +} + +/* -------------------------------------------------------------------- */ +/* methods (in alphabetical order) */ + +static PyObject* +element_append(ElementObject* self, PyObject* args) +{ + PyObject* element; + if (!PyArg_ParseTuple(args, "O!:append", &Element_Type, &element)) + return NULL; + + if (element_add_subelement(self, element) < 0) + return NULL; + + Py_RETURN_NONE; +} + +static PyObject* +element_clear(ElementObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":clear")) + return NULL; + + if (self->extra) { + element_dealloc_extra(self); + self->extra = NULL; + } + + Py_INCREF(Py_None); + Py_DECREF(JOIN_OBJ(self->text)); + self->text = Py_None; + + Py_INCREF(Py_None); + Py_DECREF(JOIN_OBJ(self->tail)); + self->tail = Py_None; + + Py_RETURN_NONE; +} + +static PyObject* +element_copy(ElementObject* self, PyObject* args) +{ + int i; + ElementObject* element; + + if (!PyArg_ParseTuple(args, ":__copy__")) + return NULL; + + element = (ElementObject*) element_new( + self->tag, (self->extra) ? self->extra->attrib : Py_None + ); + if (!element) + return NULL; + + Py_DECREF(JOIN_OBJ(element->text)); + element->text = self->text; + Py_INCREF(JOIN_OBJ(element->text)); + + Py_DECREF(JOIN_OBJ(element->tail)); + element->tail = self->tail; + Py_INCREF(JOIN_OBJ(element->tail)); + + if (self->extra) { + + if (element_resize(element, self->extra->length) < 0) + return NULL; + + for (i = 0; i < self->extra->length; i++) { + Py_INCREF(self->extra->children[i]); + element->extra->children[i] = self->extra->children[i]; + } + + element->extra->length = self->extra->length; + + } + + return (PyObject*) element; +} + +static PyObject* +element_deepcopy(ElementObject* self, PyObject* args) +{ + int i; + ElementObject* element; + PyObject* tag; + PyObject* attrib; + PyObject* text; + PyObject* tail; + PyObject* id; + + PyObject* memo; + if (!PyArg_ParseTuple(args, "O:__deepcopy__", &memo)) + return NULL; + + tag = deepcopy(self->tag, memo); + if (!tag) + return NULL; + + if (self->extra) { + attrib = deepcopy(self->extra->attrib, memo); + if (!attrib) { + Py_DECREF(tag); + return NULL; + } + } else { + Py_INCREF(Py_None); + attrib = Py_None; + } + + element = (ElementObject*) element_new(tag, attrib); + + Py_DECREF(tag); + Py_DECREF(attrib); + + if (!element) + return NULL; + + text = deepcopy(JOIN_OBJ(self->text), memo); + if (!text) + goto error; + Py_DECREF(element->text); + element->text = JOIN_SET(text, JOIN_GET(self->text)); + + tail = deepcopy(JOIN_OBJ(self->tail), memo); + if (!tail) + goto error; + Py_DECREF(element->tail); + element->tail = JOIN_SET(tail, JOIN_GET(self->tail)); + + if (self->extra) { + + if (element_resize(element, self->extra->length) < 0) + goto error; + + for (i = 0; i < self->extra->length; i++) { + PyObject* child = deepcopy(self->extra->children[i], memo); + if (!child) { + element->extra->length = i; + goto error; + } + element->extra->children[i] = child; + } + + element->extra->length = self->extra->length; + + } + + /* add object to memo dictionary (so deepcopy won't visit it again) */ + id = PyInt_FromLong((Py_uintptr_t) self); + + i = PyDict_SetItem(memo, id, (PyObject*) element); + + Py_DECREF(id); + + if (i < 0) + goto error; + + return (PyObject*) element; + + error: + Py_DECREF(element); + return NULL; +} + +LOCAL(int) +checkpath(PyObject* tag) +{ + int i, check = 1; + + /* check if a tag contains an xpath character */ + +#define PATHCHAR(ch) (ch == '/' || ch == '*' || ch == '[' || ch == '@') + +#if defined(Py_USING_UNICODE) + if (PyUnicode_Check(tag)) { + Py_UNICODE *p = PyUnicode_AS_UNICODE(tag); + for (i = 0; i < PyUnicode_GET_SIZE(tag); i++) { + if (p[i] == '{') + check = 0; + else if (p[i] == '}') + check = 1; + else if (check && PATHCHAR(p[i])) + return 1; + } + return 0; + } +#endif + if (PyString_Check(tag)) { + char *p = PyString_AS_STRING(tag); + for (i = 0; i < PyString_GET_SIZE(tag); i++) { + if (p[i] == '{') + check = 0; + else if (p[i] == '}') + check = 1; + else if (check && PATHCHAR(p[i])) + return 1; + } + return 0; + } + + return 1; /* unknown type; might be path expression */ +} + +static PyObject* +element_find(ElementObject* self, PyObject* args) +{ + int i; + + PyObject* tag; + if (!PyArg_ParseTuple(args, "O:find", &tag)) + return NULL; + + if (checkpath(tag)) + return PyObject_CallMethod( + elementpath_obj, "find", "OO", self, tag + ); + + if (!self->extra) + Py_RETURN_NONE; + + for (i = 0; i < self->extra->length; i++) { + PyObject* item = self->extra->children[i]; + if (Element_CheckExact(item) && + PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) { + Py_INCREF(item); + return item; + } + } + + Py_RETURN_NONE; +} + +static PyObject* +element_findtext(ElementObject* self, PyObject* args) +{ + int i; + + PyObject* tag; + PyObject* default_value = Py_None; + if (!PyArg_ParseTuple(args, "O|O:findtext", &tag, &default_value)) + return NULL; + + if (checkpath(tag)) + return PyObject_CallMethod( + elementpath_obj, "findtext", "OOO", self, tag, default_value + ); + + if (!self->extra) { + Py_INCREF(default_value); + return default_value; + } + + for (i = 0; i < self->extra->length; i++) { + ElementObject* item = (ElementObject*) self->extra->children[i]; + if (Element_CheckExact(item) && !PyObject_Compare(item->tag, tag)) { + PyObject* text = element_get_text(item); + if (text == Py_None) + return PyString_FromString(""); + Py_INCREF(text); + return text; + } + } + + Py_INCREF(default_value); + return default_value; +} + +static PyObject* +element_findall(ElementObject* self, PyObject* args) +{ + int i; + PyObject* out; + + PyObject* tag; + if (!PyArg_ParseTuple(args, "O:findall", &tag)) + return NULL; + + if (checkpath(tag)) + return PyObject_CallMethod( + elementpath_obj, "findall", "OO", self, tag + ); + + out = PyList_New(0); + if (!out) + return NULL; + + if (!self->extra) + return out; + + for (i = 0; i < self->extra->length; i++) { + PyObject* item = self->extra->children[i]; + if (Element_CheckExact(item) && + PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) { + if (PyList_Append(out, item) < 0) { + Py_DECREF(out); + return NULL; + } + } + } + + return out; +} + +static PyObject* +element_get(ElementObject* self, PyObject* args) +{ + PyObject* value; + + PyObject* key; + PyObject* default_value = Py_None; + if (!PyArg_ParseTuple(args, "O|O:get", &key, &default_value)) + return NULL; + + if (!self->extra || self->extra->attrib == Py_None) + value = default_value; + else { + value = PyDict_GetItem(self->extra->attrib, key); + if (!value) + value = default_value; + } + + Py_INCREF(value); + return value; +} + +static PyObject* +element_getchildren(ElementObject* self, PyObject* args) +{ + int i; + PyObject* list; + + if (!PyArg_ParseTuple(args, ":getchildren")) + return NULL; + + if (!self->extra) + return PyList_New(0); + + list = PyList_New(self->extra->length); + if (!list) + return NULL; + + for (i = 0; i < self->extra->length; i++) { + PyObject* item = self->extra->children[i]; + Py_INCREF(item); + PyList_SET_ITEM(list, i, item); + } + + return list; +} + +static PyObject* +element_getiterator(ElementObject* self, PyObject* args) +{ + PyObject* result; + + PyObject* tag = Py_None; + if (!PyArg_ParseTuple(args, "|O:getiterator", &tag)) + return NULL; + + if (!elementtree_getiterator_obj) { + PyErr_SetString( + PyExc_RuntimeError, + "getiterator helper not found" + ); + return NULL; + } + + args = PyTuple_New(2); + Py_INCREF(self); PyTuple_SET_ITEM(args, 0, (PyObject*) self); + Py_INCREF(tag); PyTuple_SET_ITEM(args, 1, (PyObject*) tag); + + result = PyObject_CallObject(elementtree_getiterator_obj, args); + + Py_DECREF(args); + + return result; +} + +static PyObject* +element_getitem(ElementObject* self, int index) +{ + if (!self->extra || index < 0 || index >= self->extra->length) { + PyErr_SetString( + PyExc_IndexError, + "child index out of range" + ); + return NULL; + } + + Py_INCREF(self->extra->children[index]); + return self->extra->children[index]; +} + +static PyObject* +element_getslice(ElementObject* self, int start, int end) +{ + int i; + PyObject* list; + + if (!self->extra) + return PyList_New(0); + + /* standard clamping */ + if (start < 0) + start = 0; + if (end < 0) + end = 0; + if (end > self->extra->length) + end = self->extra->length; + if (start > end) + start = end; + + list = PyList_New(end - start); + if (!list) + return NULL; + + for (i = start; i < end; i++) { + PyObject* item = self->extra->children[i]; + Py_INCREF(item); + PyList_SET_ITEM(list, i - start, item); + } + + return list; +} + +static PyObject* +element_insert(ElementObject* self, PyObject* args) +{ + int i; + + int index; + PyObject* element; + if (!PyArg_ParseTuple(args, "iO!:insert", &index, + &Element_Type, &element)) + return NULL; + + if (!self->extra) + element_new_extra(self, NULL); + + if (index < 0) + index = 0; + if (index > self->extra->length) + index = self->extra->length; + + if (element_resize(self, 1) < 0) + return NULL; + + for (i = self->extra->length; i > index; i--) + self->extra->children[i] = self->extra->children[i-1]; + + Py_INCREF(element); + self->extra->children[index] = element; + + self->extra->length++; + + Py_RETURN_NONE; +} + +static PyObject* +element_items(ElementObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":items")) + return NULL; + + if (!self->extra || self->extra->attrib == Py_None) + return PyList_New(0); + + return PyDict_Items(self->extra->attrib); +} + +static PyObject* +element_keys(ElementObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":keys")) + return NULL; + + if (!self->extra || self->extra->attrib == Py_None) + return PyList_New(0); + + return PyDict_Keys(self->extra->attrib); +} + +static int +element_length(ElementObject* self) +{ + if (!self->extra) + return 0; + + return self->extra->length; +} + +static PyObject* +element_makeelement(PyObject* self, PyObject* args, PyObject* kw) +{ + PyObject* elem; + + PyObject* tag; + PyObject* attrib; + if (!PyArg_ParseTuple(args, "OO:makeelement", &tag, &attrib)) + return NULL; + + attrib = PyDict_Copy(attrib); + if (!attrib) + return NULL; + + elem = element_new(tag, attrib); + + Py_DECREF(attrib); + + return elem; +} + +static PyObject* +element_reduce(ElementObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":__reduce__")) + return NULL; + + /* Hack alert: This method is used to work around a __copy__ + problem on certain 2.3 and 2.4 versions. To save time and + simplify the code, we create the copy in here, and use a dummy + copyelement helper to trick the copy module into doing the + right thing. */ + + if (!elementtree_copyelement_obj) { + PyErr_SetString( + PyExc_RuntimeError, + "copyelement helper not found" + ); + return NULL; + } + + return Py_BuildValue( + "O(N)", elementtree_copyelement_obj, element_copy(self, args) + ); +} + +static PyObject* +element_remove(ElementObject* self, PyObject* args) +{ + int i; + + PyObject* element; + if (!PyArg_ParseTuple(args, "O!:remove", &Element_Type, &element)) + return NULL; + + if (!self->extra) { + /* element has no children, so raise exception */ + PyErr_SetString( + PyExc_ValueError, + "list.remove(x): x not in list" + ); + return NULL; + } + + for (i = 0; i < self->extra->length; i++) { + if (self->extra->children[i] == element) + break; + if (PyObject_Compare(self->extra->children[i], element) == 0) + break; + } + + if (i == self->extra->length) { + /* element is not in children, so raise exception */ + PyErr_SetString( + PyExc_ValueError, + "list.remove(x): x not in list" + ); + return NULL; + } + + Py_DECREF(self->extra->children[i]); + + self->extra->length--; + + for (; i < self->extra->length; i++) + self->extra->children[i] = self->extra->children[i+1]; + + Py_RETURN_NONE; +} + +static PyObject* +element_repr(ElementObject* self) +{ + PyObject* repr; + char buffer[100]; + + repr = PyString_FromString("tag)); + + sprintf(buffer, " at %p>", self); + PyString_ConcatAndDel(&repr, PyString_FromString(buffer)); + + return repr; +} + +static PyObject* +element_set(ElementObject* self, PyObject* args) +{ + PyObject* attrib; + + PyObject* key; + PyObject* value; + if (!PyArg_ParseTuple(args, "OO:set", &key, &value)) + return NULL; + + if (!self->extra) + element_new_extra(self, NULL); + + attrib = element_get_attrib(self); + if (!attrib) + return NULL; + + if (PyDict_SetItem(attrib, key, value) < 0) + return NULL; + + Py_RETURN_NONE; +} + +static int +element_setslice(ElementObject* self, int start, int end, PyObject* item) +{ + int i, new, old; + PyObject* recycle = NULL; + + if (!self->extra) + element_new_extra(self, NULL); + + /* standard clamping */ + if (start < 0) + start = 0; + if (end < 0) + end = 0; + if (end > self->extra->length) + end = self->extra->length; + if (start > end) + start = end; + + old = end - start; + + if (item == NULL) + new = 0; + else if (PyList_CheckExact(item)) { + new = PyList_GET_SIZE(item); + } else { + /* FIXME: support arbitrary sequences? */ + PyErr_Format( + PyExc_TypeError, + "expected list, not \"%.200s\"", item->ob_type->tp_name + ); + return -1; + } + + if (old > 0) { + /* to avoid recursive calls to this method (via decref), move + old items to the recycle bin here, and get rid of them when + we're done modifying the element */ + recycle = PyList_New(old); + for (i = 0; i < old; i++) + PyList_SET_ITEM(recycle, i, self->extra->children[i + start]); + } + + if (new < old) { + /* delete slice */ + for (i = end; i < self->extra->length; i++) + self->extra->children[i + new - old] = self->extra->children[i]; + } else if (new > old) { + /* insert slice */ + if (element_resize(self, new - old) < 0) + return -1; + for (i = self->extra->length-1; i >= end; i--) + self->extra->children[i + new - old] = self->extra->children[i]; + } + + /* replace the slice */ + for (i = 0; i < new; i++) { + PyObject* element = PyList_GET_ITEM(item, i); + Py_INCREF(element); + self->extra->children[i + start] = element; + } + + self->extra->length += new - old; + + /* discard the recycle bin, and everything in it */ + Py_XDECREF(recycle); + + return 0; +} + +static int +element_setitem(ElementObject* self, int index, PyObject* item) +{ + int i; + PyObject* old; + + if (!self->extra || index < 0 || index >= self->extra->length) { + PyErr_SetString( + PyExc_IndexError, + "child assignment index out of range"); + return -1; + } + + old = self->extra->children[index]; + + if (item) { + Py_INCREF(item); + self->extra->children[index] = item; + } else { + self->extra->length--; + for (i = index; i < self->extra->length; i++) + self->extra->children[i] = self->extra->children[i+1]; + } + + Py_DECREF(old); + + return 0; +} + +static PyMethodDef element_methods[] = { + + {"clear", (PyCFunction) element_clear, METH_VARARGS}, + + {"get", (PyCFunction) element_get, METH_VARARGS}, + {"set", (PyCFunction) element_set, METH_VARARGS}, + + {"find", (PyCFunction) element_find, METH_VARARGS}, + {"findtext", (PyCFunction) element_findtext, METH_VARARGS}, + {"findall", (PyCFunction) element_findall, METH_VARARGS}, + + {"append", (PyCFunction) element_append, METH_VARARGS}, + {"insert", (PyCFunction) element_insert, METH_VARARGS}, + {"remove", (PyCFunction) element_remove, METH_VARARGS}, + + {"getiterator", (PyCFunction) element_getiterator, METH_VARARGS}, + {"getchildren", (PyCFunction) element_getchildren, METH_VARARGS}, + + {"items", (PyCFunction) element_items, METH_VARARGS}, + {"keys", (PyCFunction) element_keys, METH_VARARGS}, + + {"makeelement", (PyCFunction) element_makeelement, METH_VARARGS}, + + {"__copy__", (PyCFunction) element_copy, METH_VARARGS}, + {"__deepcopy__", (PyCFunction) element_deepcopy, METH_VARARGS}, + + /* Some 2.3 and 2.4 versions do not handle the __copy__ method on + C objects correctly, so we have to fake it using a __reduce__- + based hack (see the element_reduce implementation above for + details). */ + + /* The behaviour has been changed in 2.3.5 and 2.4.1, so we're + using a runtime test to figure out if we need to fake things + or now (see the init code below). The following entry is + enabled only if the hack is needed. */ + + {"!__reduce__", (PyCFunction) element_reduce, METH_VARARGS}, + + {NULL, NULL} +}; + +static PyObject* +element_getattr(ElementObject* self, char* name) +{ + PyObject* res; + + res = Py_FindMethod(element_methods, (PyObject*) self, name); + if (res) + return res; + + PyErr_Clear(); + + if (strcmp(name, "tag") == 0) + res = self->tag; + else if (strcmp(name, "text") == 0) + res = element_get_text(self); + else if (strcmp(name, "tail") == 0) { + res = element_get_tail(self); + } else if (strcmp(name, "attrib") == 0) { + if (!self->extra) + element_new_extra(self, NULL); + res = element_get_attrib(self); + } else { + PyErr_SetString(PyExc_AttributeError, name); + return NULL; + } + + if (!res) + return NULL; + + Py_INCREF(res); + return res; +} + +static int +element_setattr(ElementObject* self, const char* name, PyObject* value) +{ + if (value == NULL) { + PyErr_SetString( + PyExc_AttributeError, + "can't delete element attributes" + ); + return -1; + } + + if (strcmp(name, "tag") == 0) { + Py_DECREF(self->tag); + self->tag = value; + Py_INCREF(self->tag); + } else if (strcmp(name, "text") == 0) { + Py_DECREF(JOIN_OBJ(self->text)); + self->text = value; + Py_INCREF(self->text); + } else if (strcmp(name, "tail") == 0) { + Py_DECREF(JOIN_OBJ(self->tail)); + self->tail = value; + Py_INCREF(self->tail); + } else if (strcmp(name, "attrib") == 0) { + if (!self->extra) + element_new_extra(self, NULL); + Py_DECREF(self->extra->attrib); + self->extra->attrib = value; + Py_INCREF(self->extra->attrib); + } else { + PyErr_SetString(PyExc_AttributeError, name); + return -1; + } + + return 0; +} + +static PySequenceMethods element_as_sequence = { + (inquiry) element_length, + 0, /* sq_concat */ + 0, /* sq_repeat */ + (intargfunc) element_getitem, + (intintargfunc) element_getslice, + (intobjargproc) element_setitem, + (intintobjargproc) element_setslice, +}; + +statichere PyTypeObject Element_Type = { + PyObject_HEAD_INIT(NULL) + 0, "Element", sizeof(ElementObject), 0, + /* methods */ + (destructor)element_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)element_getattr, /* tp_getattr */ + (setattrfunc)element_setattr, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc)element_repr, /* tp_repr */ + 0, /* tp_as_number */ + &element_as_sequence, /* tp_as_sequence */ +}; + +/* ==================================================================== */ +/* the tree builder type */ + +typedef struct { + PyObject_HEAD + + PyObject* root; /* root node (first created node) */ + + ElementObject* this; /* current node */ + ElementObject* last; /* most recently created node */ + + PyObject* data; /* data collector (string or list), or NULL */ + + PyObject* stack; /* element stack */ + int index; /* current stack size (0=empty) */ + + /* element tracing */ + PyObject* events; /* list of events, or NULL if not collecting */ + PyObject* start_event_obj; /* event objects (NULL to ignore) */ + PyObject* end_event_obj; + PyObject* start_ns_event_obj; + PyObject* end_ns_event_obj; + +} TreeBuilderObject; + +staticforward PyTypeObject TreeBuilder_Type; + +#define TreeBuilder_CheckExact(op) ((op)->ob_type == &TreeBuilder_Type) + +/* -------------------------------------------------------------------- */ +/* constructor and destructor */ + +LOCAL(PyObject*) +treebuilder_new(void) +{ + TreeBuilderObject* self; + + self = PyObject_New(TreeBuilderObject, &TreeBuilder_Type); + if (self == NULL) + return NULL; + + self->root = NULL; + + Py_INCREF(Py_None); + self->this = (ElementObject*) Py_None; + + Py_INCREF(Py_None); + self->last = (ElementObject*) Py_None; + + self->data = NULL; + + self->stack = PyList_New(20); + self->index = 0; + + self->events = NULL; + self->start_event_obj = self->end_event_obj = NULL; + self->start_ns_event_obj = self->end_ns_event_obj = NULL; + + ALLOC(sizeof(TreeBuilderObject), "create treebuilder"); + + return (PyObject*) self; +} + +static PyObject* +treebuilder(PyObject* _self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":TreeBuilder")) + return NULL; + + return treebuilder_new(); +} + +static void +treebuilder_dealloc(TreeBuilderObject* self) +{ + Py_XDECREF(self->end_ns_event_obj); + Py_XDECREF(self->start_ns_event_obj); + Py_XDECREF(self->end_event_obj); + Py_XDECREF(self->start_event_obj); + Py_XDECREF(self->events); + Py_DECREF(self->stack); + Py_XDECREF(self->data); + Py_DECREF(self->last); + Py_DECREF(self->this); + Py_XDECREF(self->root); + + RELEASE(sizeof(TreeBuilderObject), "destroy treebuilder"); + + PyObject_Del(self); +} + +/* -------------------------------------------------------------------- */ +/* handlers */ + +LOCAL(PyObject*) +treebuilder_handle_xml(TreeBuilderObject* self, PyObject* encoding, + PyObject* standalone) +{ + Py_RETURN_NONE; +} + +LOCAL(PyObject*) +treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, + PyObject* attrib) +{ + PyObject* node; + PyObject* this; + + if (self->data) { + if (self->this == self->last) { + self->last->text = JOIN_SET( + self->data, PyList_CheckExact(self->data) + ); + } else { + self->last->tail = JOIN_SET( + self->data, PyList_CheckExact(self->data) + ); + } + self->data = NULL; + } + + node = element_new(tag, attrib); + if (!node) + return NULL; + + this = (PyObject*) self->this; + + if (this != Py_None) { + if (element_add_subelement((ElementObject*) this, node) < 0) + return NULL; + } else { + if (self->root) { + PyErr_SetString( + PyExc_SyntaxError, + "multiple elements on top level" + ); + return NULL; + } + Py_INCREF(node); + self->root = node; + } + + if (self->index < PyList_GET_SIZE(self->stack)) { + if (PyList_SetItem(self->stack, self->index, this) < 0) + return NULL; + Py_INCREF(this); + } else { + if (PyList_Append(self->stack, this) < 0) + return NULL; + } + self->index++; + + Py_DECREF(this); + Py_INCREF(node); + self->this = (ElementObject*) node; + + Py_DECREF(self->last); + Py_INCREF(node); + self->last = (ElementObject*) node; + + if (self->start_event_obj) { + PyObject* res; + PyObject* action = self->start_event_obj; + res = PyTuple_New(2); + if (res) { + Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action); + Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node); + PyList_Append(self->events, res); + Py_DECREF(res); + } else + PyErr_Clear(); /* FIXME: propagate error */ + } + + return node; +} + +LOCAL(PyObject*) +treebuilder_handle_data(TreeBuilderObject* self, PyObject* data) +{ + if (!self->data) { + /* store the first item as is */ + Py_INCREF(data); self->data = data; + } else { + /* more than one item; use a list to collect items */ + if (PyString_CheckExact(self->data) && self->data->ob_refcnt == 1 && + PyString_CheckExact(data) && PyString_GET_SIZE(data) == 1) { + /* expat often generates single character data sections; handle + the most common case by resizing the existing string... */ + int size = PyString_GET_SIZE(self->data); + if (_PyString_Resize(&self->data, size + 1) < 0) + return NULL; + PyString_AS_STRING(self->data)[size] = PyString_AS_STRING(data)[0]; + } else if (PyList_CheckExact(self->data)) { + if (PyList_Append(self->data, data) < 0) + return NULL; + } else { + PyObject* list = PyList_New(2); + if (!list) + return NULL; + PyList_SET_ITEM(list, 0, self->data); + Py_INCREF(data); PyList_SET_ITEM(list, 1, data); + self->data = list; + } + } + + Py_RETURN_NONE; +} + +LOCAL(PyObject*) +treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) +{ + PyObject* item; + + if (self->data) { + if (self->this == self->last) { + self->last->text = JOIN_SET( + self->data, PyList_CheckExact(self->data) + ); + } else { + self->last->tail = JOIN_SET( + self->data, PyList_CheckExact(self->data) + ); + } + self->data = NULL; + } + + if (self->index == 0) { + PyErr_SetString( + PyExc_IndexError, + "pop from empty stack" + ); + return NULL; + } + + self->index--; + + item = PyList_GET_ITEM(self->stack, self->index); + Py_INCREF(item); + + Py_DECREF(self->last); + + self->last = (ElementObject*) self->this; + self->this = (ElementObject*) item; + + if (self->end_event_obj) { + PyObject* res; + PyObject* action = self->end_event_obj; + PyObject* node = (PyObject*) self->last; + res = PyTuple_New(2); + if (res) { + Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action); + Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node); + PyList_Append(self->events, res); + Py_DECREF(res); + } else + PyErr_Clear(); /* FIXME: propagate error */ + } + + Py_INCREF(self->last); + return (PyObject*) self->last; +} + +LOCAL(void) +treebuilder_handle_namespace(TreeBuilderObject* self, int start, + const char* prefix, const char *uri) +{ + PyObject* res; + PyObject* action; + PyObject* parcel; + + if (!self->events) + return; + + if (start) { + if (!self->start_ns_event_obj) + return; + action = self->start_ns_event_obj; + /* FIXME: prefix and uri use utf-8 encoding! */ + parcel = Py_BuildValue("ss", (prefix) ? prefix : "", uri); + if (!parcel) + return; + Py_INCREF(action); + } else { + if (!self->end_ns_event_obj) + return; + action = self->end_ns_event_obj; + Py_INCREF(action); + parcel = Py_None; + Py_INCREF(parcel); + } + + res = PyTuple_New(2); + + if (res) { + PyTuple_SET_ITEM(res, 0, action); + PyTuple_SET_ITEM(res, 1, parcel); + PyList_Append(self->events, res); + Py_DECREF(res); + } else + PyErr_Clear(); /* FIXME: propagate error */ +} + +/* -------------------------------------------------------------------- */ +/* methods (in alphabetical order) */ + +static PyObject* +treebuilder_data(TreeBuilderObject* self, PyObject* args) +{ + PyObject* data; + if (!PyArg_ParseTuple(args, "O:data", &data)) + return NULL; + + return treebuilder_handle_data(self, data); +} + +static PyObject* +treebuilder_end(TreeBuilderObject* self, PyObject* args) +{ + PyObject* tag; + if (!PyArg_ParseTuple(args, "O:end", &tag)) + return NULL; + + return treebuilder_handle_end(self, tag); +} + +LOCAL(PyObject*) +treebuilder_done(TreeBuilderObject* self) +{ + PyObject* res; + + /* FIXME: check stack size? */ + + if (self->root) + res = self->root; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +static PyObject* +treebuilder_close(TreeBuilderObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":close")) + return NULL; + + return treebuilder_done(self); +} + +static PyObject* +treebuilder_start(TreeBuilderObject* self, PyObject* args) +{ + PyObject* tag; + PyObject* attrib = Py_None; + if (!PyArg_ParseTuple(args, "O|O:start", &tag, &attrib)) + return NULL; + + return treebuilder_handle_start(self, tag, attrib); +} + +static PyObject* +treebuilder_xml(TreeBuilderObject* self, PyObject* args) +{ + PyObject* encoding; + PyObject* standalone; + if (!PyArg_ParseTuple(args, "OO:xml", &encoding, &standalone)) + return NULL; + + return treebuilder_handle_xml(self, encoding, standalone); +} + +static PyMethodDef treebuilder_methods[] = { + {"data", (PyCFunction) treebuilder_data, METH_VARARGS}, + {"start", (PyCFunction) treebuilder_start, METH_VARARGS}, + {"end", (PyCFunction) treebuilder_end, METH_VARARGS}, + {"xml", (PyCFunction) treebuilder_xml, METH_VARARGS}, + {"close", (PyCFunction) treebuilder_close, METH_VARARGS}, + {NULL, NULL} +}; + +static PyObject* +treebuilder_getattr(TreeBuilderObject* self, char* name) +{ + return Py_FindMethod(treebuilder_methods, (PyObject*) self, name); +} + +statichere PyTypeObject TreeBuilder_Type = { + PyObject_HEAD_INIT(NULL) + 0, "TreeBuilder", sizeof(TreeBuilderObject), 0, + /* methods */ + (destructor)treebuilder_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)treebuilder_getattr, /* tp_getattr */ +}; + +/* ==================================================================== */ +/* the expat interface */ + +#if defined(USE_EXPAT) + +#include "expat.h" + +#if defined(USE_PYEXPAT_CAPI) +#include "pyexpat.h" +static struct PyExpat_CAPI* expat_capi; +#define EXPAT(func) (expat_capi->func) +#else +#define EXPAT(func) (XML_##func) +#endif + +typedef struct { + PyObject_HEAD + + XML_Parser parser; + + PyObject* target; + PyObject* entity; + + PyObject* names; + + PyObject* handle_xml; + PyObject* handle_start; + PyObject* handle_data; + PyObject* handle_end; + + PyObject* handle_comment; + PyObject* handle_pi; + +} XMLParserObject; + +staticforward PyTypeObject XMLParser_Type; + +/* helpers */ + +#if defined(Py_USING_UNICODE) +LOCAL(int) +checkstring(const char* string, int size) +{ + int i; + + /* check if an 8-bit string contains UTF-8 characters */ + for (i = 0; i < size; i++) + if (string[i] & 0x80) + return 1; + + return 0; +} +#endif + +LOCAL(PyObject*) +makestring(const char* string, int size) +{ + /* convert a UTF-8 string to either a 7-bit ascii string or a + Unicode string */ + +#if defined(Py_USING_UNICODE) + if (checkstring(string, size)) + return PyUnicode_DecodeUTF8(string, size, "strict"); +#endif + + return PyString_FromStringAndSize(string, size); +} + +LOCAL(PyObject*) +makeuniversal(XMLParserObject* self, const char* string) +{ + /* convert a UTF-8 tag/attribute name from the expat parser + to a universal name string */ + + int size = strlen(string); + PyObject* key; + PyObject* value; + + /* look the 'raw' name up in the names dictionary */ + key = PyString_FromStringAndSize(string, size); + if (!key) + return NULL; + + value = PyDict_GetItem(self->names, key); + + if (value) { + Py_INCREF(value); + } else { + /* new name. convert to universal name, and decode as + necessary */ + + PyObject* tag; + char* p; + int i; + + /* look for namespace separator */ + for (i = 0; i < size; i++) + if (string[i] == '}') + break; + if (i != size) { + /* convert to universal name */ + tag = PyString_FromStringAndSize(NULL, size+1); + p = PyString_AS_STRING(tag); + p[0] = '{'; + memcpy(p+1, string, size); + size++; + } else { + /* plain name; use key as tag */ + Py_INCREF(key); + tag = key; + } + + /* decode universal name */ +#if defined(Py_USING_UNICODE) + /* inline makestring, to avoid duplicating the source string if + it's not an utf-8 string */ + p = PyString_AS_STRING(tag); + if (checkstring(p, size)) { + value = PyUnicode_DecodeUTF8(p, size, "strict"); + Py_DECREF(tag); + if (!value) { + Py_DECREF(key); + return NULL; + } + } else +#endif + value = tag; /* use tag as is */ + + /* add to names dictionary */ + if (PyDict_SetItem(self->names, key, value) < 0) { + Py_DECREF(key); + Py_DECREF(value); + return NULL; + } + } + + Py_DECREF(key); + return value; +} + +/* -------------------------------------------------------------------- */ +/* handlers */ + +static void +expat_default_handler(XMLParserObject* self, const XML_Char* data_in, + int data_len) +{ + PyObject* key; + PyObject* value; + PyObject* res; + + if (data_len < 2 || data_in[0] != '&') + return; + + key = makestring(data_in + 1, data_len - 2); + if (!key) + return; + + value = PyDict_GetItem(self->entity, key); + + if (value) { + if (TreeBuilder_CheckExact(self->target)) + res = treebuilder_handle_data( + (TreeBuilderObject*) self->target, value + ); + else if (self->handle_data) + res = PyObject_CallFunction(self->handle_data, "O", value); + else + res = NULL; + Py_DECREF(value); + Py_XDECREF(res); + } else { + PyErr_Format( + PyExc_SyntaxError, "undefined entity &%s;: line %d, column %d", + PyString_AS_STRING(key), + EXPAT(GetErrorLineNumber)(self->parser), + EXPAT(GetErrorColumnNumber)(self->parser) + ); + } + + Py_DECREF(key); +} + +static void +expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, + const XML_Char **attrib_in) +{ + PyObject* res; + PyObject* tag; + PyObject* attrib; + int ok; + + /* tag name */ + tag = makeuniversal(self, tag_in); + if (!tag) + return; /* parser will look for errors */ + + /* attributes */ + if (attrib_in[0]) { + attrib = PyDict_New(); + if (!attrib) + return; + while (attrib_in[0] && attrib_in[1]) { + PyObject* key = makeuniversal(self, attrib_in[0]); + PyObject* value = makestring(attrib_in[1], strlen(attrib_in[1])); + if (!key || !value) { + Py_XDECREF(value); + Py_XDECREF(key); + Py_DECREF(attrib); + return; + } + ok = PyDict_SetItem(attrib, key, value); + Py_DECREF(value); + Py_DECREF(key); + if (ok < 0) { + Py_DECREF(attrib); + return; + } + attrib_in += 2; + } + } else { + Py_INCREF(Py_None); + attrib = Py_None; + } + + if (TreeBuilder_CheckExact(self->target)) + /* shortcut */ + res = treebuilder_handle_start((TreeBuilderObject*) self->target, + tag, attrib); + else if (self->handle_start) + res = PyObject_CallFunction(self->handle_start, "OO", tag, attrib); + else + res = NULL; + + Py_DECREF(tag); + Py_DECREF(attrib); + + Py_XDECREF(res); +} + +static void +expat_data_handler(XMLParserObject* self, const XML_Char* data_in, + int data_len) +{ + PyObject* data; + PyObject* res; + + data = makestring(data_in, data_len); + + if (TreeBuilder_CheckExact(self->target)) + /* shortcut */ + res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); + else if (self->handle_data) + res = PyObject_CallFunction(self->handle_data, "O", data); + else + res = NULL; + + Py_DECREF(data); + + Py_XDECREF(res); +} + +static void +expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) +{ + PyObject* tag; + PyObject* res = NULL; + + if (TreeBuilder_CheckExact(self->target)) + /* shortcut */ + /* the standard tree builder doesn't look at the end tag */ + res = treebuilder_handle_end( + (TreeBuilderObject*) self->target, Py_None + ); + else if (self->handle_end) { + tag = makeuniversal(self, tag_in); + if (tag) { + res = PyObject_CallFunction(self->handle_end, "O", tag); + Py_DECREF(tag); + } + } + + Py_XDECREF(res); +} + +static void +expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix, + const XML_Char *uri) +{ + treebuilder_handle_namespace( + (TreeBuilderObject*) self->target, 1, prefix, uri + ); +} + +static void +expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) +{ + treebuilder_handle_namespace( + (TreeBuilderObject*) self->target, 0, NULL, NULL + ); +} + +static void +expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) +{ + PyObject* comment; + PyObject* res; + + if (self->handle_comment) { + comment = makestring(comment_in, strlen(comment_in)); + if (comment) { + res = PyObject_CallFunction(self->handle_comment, "O", comment); + Py_XDECREF(res); + Py_DECREF(comment); + } + } +} + +static void +expat_pi_handler(XMLParserObject* self, const XML_Char* target_in, + const XML_Char* data_in) +{ + PyObject* target; + PyObject* data; + PyObject* res; + + if (self->handle_pi) { + target = makestring(target_in, strlen(target_in)); + data = makestring(data_in, strlen(data_in)); + if (target && data) { + res = PyObject_CallFunction(self->handle_pi, "OO", target, data); + Py_XDECREF(res); + Py_DECREF(data); + Py_DECREF(target); + } else { + Py_XDECREF(data); + Py_XDECREF(target); + } + } +} + +/* -------------------------------------------------------------------- */ +/* constructor and destructor */ + +static PyObject* +xmlparser(PyObject* _self, PyObject* args, PyObject* kw) +{ + XMLParserObject* self; + /* FIXME: does this need to be static? */ + static XML_Memory_Handling_Suite memory_handler; + + PyObject* target = NULL; + char* encoding = NULL; + static PY_CONST char* kwlist[] = { "target", "encoding", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kw, "|Oz:XMLParser", kwlist, + &target, &encoding)) + return NULL; + +#if defined(USE_PYEXPAT_CAPI) + if (!expat_capi) { + PyErr_SetString( + PyExc_RuntimeError, "cannot load dispatch table from pyexpat" + ); + return NULL; + } +#endif + + self = PyObject_New(XMLParserObject, &XMLParser_Type); + if (self == NULL) + return NULL; + + self->entity = PyDict_New(); + if (!self->entity) { + PyObject_Del(self); + return NULL; /* FIXME: cleanup on error */ + } + + self->names = PyDict_New(); + if (!self->names) { + PyObject_Del(self); + return NULL; /* FIXME: cleanup on error */ + } + + memory_handler.malloc_fcn = PyObject_Malloc; + memory_handler.realloc_fcn = PyObject_Realloc; + memory_handler.free_fcn = PyObject_Free; + + self->parser = EXPAT(ParserCreate_MM)(encoding, &memory_handler, "}"); + if (!self->parser) { + PyErr_NoMemory(); + return NULL; /* FIXME: cleanup on error */ + } + + /* setup target handlers */ + if (!target) { + target = treebuilder_new(); + if (!target) { + PyObject_Del(self); + return NULL; /* FIXME: cleanup on error */ + } + } else + Py_INCREF(target); + self->target = target; + + self->handle_xml = PyObject_GetAttrString(target, "xml"); + self->handle_start = PyObject_GetAttrString(target, "start"); + self->handle_data = PyObject_GetAttrString(target, "data"); + self->handle_end = PyObject_GetAttrString(target, "end"); + self->handle_comment = PyObject_GetAttrString(target, "comment"); + self->handle_pi = PyObject_GetAttrString(target, "pi"); + + PyErr_Clear(); + + /* configure parser */ + EXPAT(SetUserData)(self->parser, self); + EXPAT(SetElementHandler)( + self->parser, + (XML_StartElementHandler) expat_start_handler, + (XML_EndElementHandler) expat_end_handler + ); + EXPAT(SetDefaultHandlerExpand)( + self->parser, + (XML_DefaultHandler) expat_default_handler + ); + EXPAT(SetCharacterDataHandler)( + self->parser, + (XML_CharacterDataHandler) expat_data_handler + ); + if (self->handle_comment) + EXPAT(SetCommentHandler)( + self->parser, + (XML_CommentHandler) expat_comment_handler + ); + if (self->handle_pi) + EXPAT(SetProcessingInstructionHandler)( + self->parser, + (XML_ProcessingInstructionHandler) expat_pi_handler + ); + + ALLOC(sizeof(XMLParserObject), "create expatparser"); + + return (PyObject*) self; +} + +static void +xmlparser_dealloc(XMLParserObject* self) +{ + EXPAT(ParserFree)(self->parser); + + Py_XDECREF(self->handle_pi); + Py_XDECREF(self->handle_comment); + Py_XDECREF(self->handle_end); + Py_XDECREF(self->handle_data); + Py_XDECREF(self->handle_start); + Py_XDECREF(self->handle_xml); + + Py_DECREF(self->target); + Py_DECREF(self->entity); + Py_DECREF(self->names); + + RELEASE(sizeof(XMLParserObject), "destroy expatparser"); + + PyObject_Del(self); +} + +/* -------------------------------------------------------------------- */ +/* methods (in alphabetical order) */ + +LOCAL(PyObject*) +expat_parse(XMLParserObject* self, char* data, int data_len, int final) +{ + int ok; + + ok = EXPAT(Parse)(self->parser, data, data_len, final); + + if (PyErr_Occurred()) + return NULL; + + if (!ok) { + PyErr_Format( + PyExc_SyntaxError, "%s: line %d, column %d", + EXPAT(ErrorString)(EXPAT(GetErrorCode)(self->parser)), + EXPAT(GetErrorLineNumber)(self->parser), + EXPAT(GetErrorColumnNumber)(self->parser) + ); + return NULL; + } + + Py_RETURN_NONE; +} + +static PyObject* +xmlparser_close(XMLParserObject* self, PyObject* args) +{ + /* end feeding data to parser */ + + PyObject* res; + if (!PyArg_ParseTuple(args, ":close")) + return NULL; + + res = expat_parse(self, "", 0, 1); + + if (res && TreeBuilder_CheckExact(self->target)) { + Py_DECREF(res); + return treebuilder_done((TreeBuilderObject*) self->target); + } + + return res; +} + +static PyObject* +xmlparser_feed(XMLParserObject* self, PyObject* args) +{ + /* feed data to parser */ + + char* data; + int data_len; + if (!PyArg_ParseTuple(args, "s#:feed", &data, &data_len)) + return NULL; + + return expat_parse(self, data, data_len, 0); +} + +static PyObject* +xmlparser_parse(XMLParserObject* self, PyObject* args) +{ + /* (internal) parse until end of input stream */ + + PyObject* reader; + PyObject* buffer; + PyObject* res; + + PyObject* fileobj; + if (!PyArg_ParseTuple(args, "O:_parse", &fileobj)) + return NULL; + + reader = PyObject_GetAttrString(fileobj, "read"); + if (!reader) + return NULL; + + /* read from open file object */ + for (;;) { + + buffer = PyObject_CallFunction(reader, "i", 64*1024); + + if (!buffer) { + /* read failed (e.g. due to KeyboardInterrupt) */ + Py_DECREF(reader); + return NULL; + } + + if (!PyString_CheckExact(buffer) || PyString_GET_SIZE(buffer) == 0) { + Py_DECREF(buffer); + break; + } + + res = expat_parse( + self, PyString_AS_STRING(buffer), PyString_GET_SIZE(buffer), 0 + ); + + Py_DECREF(buffer); + + if (!res) { + Py_DECREF(reader); + return NULL; + } + Py_DECREF(res); + + } + + Py_DECREF(reader); + + res = expat_parse(self, "", 0, 1); + + if (res && TreeBuilder_CheckExact(self->target)) { + Py_DECREF(res); + return treebuilder_done((TreeBuilderObject*) self->target); + } + + return res; +} + +static PyObject* +xmlparser_setevents(XMLParserObject* self, PyObject* args) +{ + /* activate element event reporting */ + + int i; + TreeBuilderObject* target; + + PyObject* events; /* event collector */ + PyObject* event_set = Py_None; + if (!PyArg_ParseTuple(args, "O!|O:_setevents", &PyList_Type, &events, + &event_set)) + return NULL; + + if (!TreeBuilder_CheckExact(self->target)) { + PyErr_SetString( + PyExc_TypeError, + "event handling only supported for cElementTree.Treebuilder " + "targets" + ); + return NULL; + } + + target = (TreeBuilderObject*) self->target; + + Py_INCREF(events); + Py_XDECREF(target->events); + target->events = events; + + /* clear out existing events */ + Py_XDECREF(target->start_event_obj); target->start_event_obj = NULL; + Py_XDECREF(target->end_event_obj); target->end_event_obj = NULL; + Py_XDECREF(target->start_ns_event_obj); target->start_ns_event_obj = NULL; + Py_XDECREF(target->end_ns_event_obj); target->end_ns_event_obj = NULL; + + if (event_set == Py_None) { + /* default is "end" only */ + target->end_event_obj = PyString_FromString("end"); + Py_RETURN_NONE; + } + + if (!PyTuple_Check(event_set)) /* FIXME: handle arbitrary sequences */ + goto error; + + for (i = 0; i < PyTuple_GET_SIZE(event_set); i++) { + PyObject* item = PyTuple_GET_ITEM(event_set, i); + char* event; + if (!PyString_Check(item)) + goto error; + event = PyString_AS_STRING(item); + if (strcmp(event, "start") == 0) { + Py_INCREF(item); + target->start_event_obj = item; + } else if (strcmp(event, "end") == 0) { + Py_INCREF(item); + Py_XDECREF(target->end_event_obj); + target->end_event_obj = item; + } else if (strcmp(event, "start-ns") == 0) { + Py_INCREF(item); + Py_XDECREF(target->start_ns_event_obj); + target->start_ns_event_obj = item; + EXPAT(SetNamespaceDeclHandler)( + self->parser, + (XML_StartNamespaceDeclHandler) expat_start_ns_handler, + (XML_EndNamespaceDeclHandler) expat_end_ns_handler + ); + } else if (strcmp(event, "end-ns") == 0) { + Py_INCREF(item); + Py_XDECREF(target->end_ns_event_obj); + target->end_ns_event_obj = item; + EXPAT(SetNamespaceDeclHandler)( + self->parser, + (XML_StartNamespaceDeclHandler) expat_start_ns_handler, + (XML_EndNamespaceDeclHandler) expat_end_ns_handler + ); + } else { + PyErr_Format( + PyExc_ValueError, + "unknown event '%s'", event + ); + return NULL; + } + } + + Py_RETURN_NONE; + + error: + PyErr_SetString( + PyExc_TypeError, + "invalid event tuple" + ); + return NULL; +} + +static PyMethodDef xmlparser_methods[] = { + {"feed", (PyCFunction) xmlparser_feed, METH_VARARGS}, + {"close", (PyCFunction) xmlparser_close, METH_VARARGS}, + {"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS}, + {"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS}, + {NULL, NULL} +}; + +static PyObject* +xmlparser_getattr(XMLParserObject* self, char* name) +{ + PyObject* res; + + res = Py_FindMethod(xmlparser_methods, (PyObject*) self, name); + if (res) + return res; + + PyErr_Clear(); + + if (strcmp(name, "entity") == 0) + res = self->entity; + else if (strcmp(name, "target") == 0) + res = self->target; + else if (strcmp(name, "version") == 0) { + char buffer[100]; + sprintf(buffer, "Expat %d.%d.%d", XML_MAJOR_VERSION, + XML_MINOR_VERSION, XML_MICRO_VERSION); + return PyString_FromString(buffer); + } else { + PyErr_SetString(PyExc_AttributeError, name); + return NULL; + } + + Py_INCREF(res); + return res; +} + +statichere PyTypeObject XMLParser_Type = { + PyObject_HEAD_INIT(NULL) + 0, "XMLParser", sizeof(XMLParserObject), 0, + /* methods */ + (destructor)xmlparser_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)xmlparser_getattr, /* tp_getattr */ +}; + +#endif + +/* ==================================================================== */ +/* python module interface */ + +static PyMethodDef _functions[] = { + {"Element", (PyCFunction) element, METH_VARARGS|METH_KEYWORDS}, + {"SubElement", (PyCFunction) subelement, METH_VARARGS|METH_KEYWORDS}, + {"TreeBuilder", (PyCFunction) treebuilder, METH_VARARGS}, +#if defined(USE_EXPAT) + {"XMLParser", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS}, + {"XMLTreeBuilder", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS}, +#endif + {NULL, NULL} +}; + +DL_EXPORT(void) +initcElementTree(void) +{ + PyObject* m; + PyObject* g; + char* bootstrap; +#if defined(USE_PYEXPAT_CAPI) + struct PyExpat_CAPI* capi; +#endif + + /* Patch object type */ + Element_Type.ob_type = TreeBuilder_Type.ob_type = &PyType_Type; +#if defined(USE_EXPAT) + XMLParser_Type.ob_type = &PyType_Type; +#endif + + m = Py_InitModule("cElementTree", _functions); + + /* python glue code */ + + g = PyDict_New(); + + PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins()); + + bootstrap = ( + +#if (PY_VERSION_HEX >= 0x02020000 && PY_VERSION_HEX < 0x02030000) + "from __future__ import generators\n" /* enable yield under 2.2 */ +#endif + + "from copy import copy, deepcopy\n" + + "try:\n" + " from elementtree import ElementTree\n" + "except ImportError:\n" + " import ElementTree\n" + "ET = ElementTree\n" + "del ElementTree\n" + + "import cElementTree\n" + + "try:\n" /* check if copy works as is */ + " copy(cElementTree.Element('x'))\n" + "except:\n" + " def copyelement(elem):\n" + " return elem\n" + + "def Comment(text=None):\n" /* public */ + " element = cElementTree.Element(ET.Comment)\n" + " element.text = text\n" + " return element\n" + "cElementTree.Comment = Comment\n" + + "class ElementTree(ET.ElementTree):\n" /* public */ + " def parse(self, source, parser=None):\n" + " if not hasattr(source, 'read'):\n" + " source = open(source, 'rb')\n" + " if parser is not None:\n" + " while 1:\n" + " data = source.read(65536)\n" + " if not data:\n" + " break\n" + " parser.feed(data)\n" + " self._root = parser.close()\n" + " else:\n" + " parser = cElementTree.XMLParser()\n" + " self._root = parser._parse(source)\n" + " return self._root\n" + "cElementTree.ElementTree = ElementTree\n" + + "def getiterator(node, tag=None):\n" /* helper */ + " if tag == '*':\n" + " tag = None\n" +#if (PY_VERSION_HEX < 0x02020000) + " nodes = []\n" /* 2.1 doesn't have yield */ + " if tag is None or node.tag == tag:\n" + " nodes.append(node)\n" + " for node in node:\n" + " nodes.extend(getiterator(node, tag))\n" + " return nodes\n" +#else + " if tag is None or node.tag == tag:\n" + " yield node\n" + " for node in node:\n" + " for node in getiterator(node, tag):\n" + " yield node\n" +#endif + + "def parse(source, parser=None):\n" /* public */ + " tree = ElementTree()\n" + " tree.parse(source, parser)\n" + " return tree\n" + "cElementTree.parse = parse\n" + +#if (PY_VERSION_HEX < 0x02020000) + "if hasattr(ET, 'iterparse'):\n" + " cElementTree.iterparse = ET.iterparse\n" /* delegate on 2.1 */ +#else + "class iterparse(object):\n" + " root = None\n" + " def __init__(self, file, events=None):\n" + " if not hasattr(file, 'read'):\n" + " file = open(file, 'rb')\n" + " self._file = file\n" + " self._events = events\n" + " def __iter__(self):\n" + " events = []\n" + " b = cElementTree.TreeBuilder()\n" + " p = cElementTree.XMLParser(b)\n" + " p._setevents(events, self._events)\n" + " while 1:\n" + " data = self._file.read(16384)\n" + " if not data:\n" + " break\n" + " p.feed(data)\n" + " for event in events:\n" + " yield event\n" + " del events[:]\n" + " root = p.close()\n" + " for event in events:\n" + " yield event\n" + " self.root = root\n" + "cElementTree.iterparse = iterparse\n" +#endif + + "def PI(target, text=None):\n" /* public */ + " element = cElementTree.Element(ET.ProcessingInstruction)\n" + " element.text = target\n" + " if text:\n" + " element.text = element.text + ' ' + text\n" + " return element\n" + + " elem = cElementTree.Element(ET.PI)\n" + " elem.text = text\n" + " return elem\n" + "cElementTree.PI = cElementTree.ProcessingInstruction = PI\n" + + "def XML(text):\n" /* public */ + " parser = cElementTree.XMLParser()\n" + " parser.feed(text)\n" + " return parser.close()\n" + "cElementTree.XML = cElementTree.fromstring = XML\n" + + "def XMLID(text):\n" /* public */ + " tree = XML(text)\n" + " ids = {}\n" + " for elem in tree.getiterator():\n" + " id = elem.get('id')\n" + " if id:\n" + " ids[id] = elem\n" + " return tree, ids\n" + "cElementTree.XMLID = XMLID\n" + + "cElementTree.dump = ET.dump\n" + "cElementTree.ElementPath = ElementPath = ET.ElementPath\n" + "cElementTree.iselement = ET.iselement\n" + "cElementTree.QName = ET.QName\n" + "cElementTree.tostring = ET.tostring\n" + "cElementTree.VERSION = '" VERSION "'\n" + "cElementTree.__version__ = '" VERSION "'\n" + "cElementTree.XMLParserError = SyntaxError\n" + + ); + + PyRun_String(bootstrap, Py_file_input, g, NULL); + + elementpath_obj = PyDict_GetItemString(g, "ElementPath"); + + elementtree_copyelement_obj = PyDict_GetItemString(g, "copyelement"); + if (elementtree_copyelement_obj) { + /* reduce hack needed; enable reduce method */ + PyMethodDef* mp; + for (mp = element_methods; mp->ml_name; mp++) + if (mp->ml_meth == (PyCFunction) element_reduce) { + mp->ml_name = "__reduce__"; + break; + } + } else + PyErr_Clear(); + elementtree_deepcopy_obj = PyDict_GetItemString(g, "deepcopy"); + elementtree_getiterator_obj = PyDict_GetItemString(g, "getiterator"); + +#if defined(USE_PYEXPAT_CAPI) + /* link against pyexpat, if possible */ + capi = PyCObject_Import("pyexpat", "expat_CAPI"); + if (capi && + strcmp(capi->magic, PyExpat_CAPI_MAGIC) == 0 && + capi->size <= sizeof(*expat_capi) && + capi->MAJOR_VERSION == XML_MAJOR_VERSION && + capi->MINOR_VERSION == XML_MINOR_VERSION && + capi->MICRO_VERSION == XML_MICRO_VERSION) + expat_capi = capi; + else + expat_capi = NULL; +#endif + +} Added: external/celementtree-1.0.4-20051213/cElementTreeWrite.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/cElementTreeWrite.c Wed Dec 14 22:43:26 2005 @@ -0,0 +1,176 @@ +/* + * ElementTree + * $Id$ + * + * elementtree write accelerator (work in progress) + * + * History: + * 2005-11-21 fl created + * + * Copyright (c) 2005 by Secret Labs AB. All rights reserved. + * Copyright (c) 2005 by Fredrik Lundh. + * + * info at pythonware.com + * http://www.pythonware.com + */ + +#include "Python.h" + + +/* -------------------------------------------------------------------- */ +/* configuration */ + +/* compiler tweaks */ +#if defined(_MSC_VER) +#define LOCAL(type) static __inline type __fastcall +#else +#define LOCAL(type) static type +#endif + +/* compatibility macros */ +#if (PY_VERSION_HEX < 0x02040000) +#define PyDict_CheckExact PyDict_Check +#if (PY_VERSION_HEX < 0x02020000) +#define PyList_CheckExact PyList_Check +#define PyString_CheckExact PyString_Check +#if (PY_VERSION_HEX >= 0x01060000) +#define Py_USING_UNICODE /* always enabled for 2.0 and 2.1 */ +#endif +#endif +#endif + +#if !defined(Py_RETURN_NONE) +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None +#endif + +/* -------------------------------------------------------------------- */ +/* the encoder type */ + +typedef struct { + PyObject_HEAD + PyObject* encoding; +} EncoderObject; + +staticforward PyTypeObject Encoder_Type; + +#define Encoder_CheckExact(op) ((op)->ob_type == &Encoder_Type) + +/* -------------------------------------------------------------------- */ +/* encoder constructor and destructor */ + +static PyObject* +encoder_new(PyObject* self_, PyObject* args) +{ + EncoderObject* self; + + PyObject* encoding; + if (!PyArg_ParseTuple(args, "O!:encode", &PyString_Type, &encoding)) + return NULL; + + self = PyObject_New(EncoderObject, &Encoder_Type); + if (self == NULL) + return NULL; + + Py_INCREF(encoding); + self->encoding = encoding; + + return (PyObject*) self; +} + +#define CHECK_NONASCII 1 +#define CHECK_ENTITY 2 +#define CHECK_ATTRIB 4 +#define CHECK_ALL 7 + +static PyObject* +encoder_encode(EncoderObject* self, PyObject* args) +{ + PyObject* text; + if (!PyArg_ParseTuple(args, "O:encode", &text)) + return NULL; + + if (PyString_Check(text)) { + unsigned char* p = PyString_AS_STRING(text); + int i, len = PyString_GET_SIZE(text); + for (i = 0; i < len; i++) { + if (p[i] & 0x80) + break; + } + if (i == len) { + Py_INCREF(text); + return text; + } + } else if (PyUnicode_Check(text)) { + /* FIXME */ + } else { + PyErr_SetString(PyExc_TypeError, "invalid string"); + return NULL; + } + + Py_RETURN_NONE; +} + +static PyObject* +encoder_encode_cdata(EncoderObject* self, PyObject* args) +{ + PyObject* text; + if (!PyArg_ParseTuple(args, "O:encode_cdata", &text)) + return NULL; + + Py_RETURN_NONE; +} + +static PyObject* +encoder_encode_attrib(EncoderObject* self, PyObject* args) +{ + PyObject* text; + if (!PyArg_ParseTuple(args, "O:encode_attrib", &text)) + return NULL; + + Py_RETURN_NONE; +} + +static void +encoder_dealloc(EncoderObject* self) +{ + Py_XDECREF(self->encoding); + + PyObject_Del(self); +} + +static PyMethodDef encoder_methods[] = { + + {"encode", (PyCFunction) encoder_encode, METH_VARARGS}, + {"encode_cdata", (PyCFunction) encoder_encode_cdata, METH_VARARGS}, + {"encode_attrib", (PyCFunction) encoder_encode_attrib, METH_VARARGS}, + + {NULL, NULL} +}; + +static PyObject* +encoder_getattr(EncoderObject* self, char* name) +{ + return Py_FindMethod(encoder_methods, (PyObject*) self, name); +} + +statichere PyTypeObject Encoder_Type = { + PyObject_HEAD_INIT(NULL) + 0, "Encoder", sizeof(EncoderObject), 0, + /* methods */ + (destructor)encoder_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)encoder_getattr, /* tp_getattr */ +}; + +static PyMethodDef _functions[] = { + {"Encoder", (PyCFunction) encoder_new, METH_VARARGS}, + {NULL, NULL} +}; + +DL_EXPORT(void) +initcElementTreeWrite(void) +{ + Encoder_Type.ob_type = &PyType_Type; + + Py_InitModule("cElementTreeWrite", _functions); +} Added: external/celementtree-1.0.4-20051213/expat/ascii.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/ascii.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,85 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#define ASCII_A 0x41 +#define ASCII_B 0x42 +#define ASCII_C 0x43 +#define ASCII_D 0x44 +#define ASCII_E 0x45 +#define ASCII_F 0x46 +#define ASCII_G 0x47 +#define ASCII_H 0x48 +#define ASCII_I 0x49 +#define ASCII_J 0x4A +#define ASCII_K 0x4B +#define ASCII_L 0x4C +#define ASCII_M 0x4D +#define ASCII_N 0x4E +#define ASCII_O 0x4F +#define ASCII_P 0x50 +#define ASCII_Q 0x51 +#define ASCII_R 0x52 +#define ASCII_S 0x53 +#define ASCII_T 0x54 +#define ASCII_U 0x55 +#define ASCII_V 0x56 +#define ASCII_W 0x57 +#define ASCII_X 0x58 +#define ASCII_Y 0x59 +#define ASCII_Z 0x5A + +#define ASCII_a 0x61 +#define ASCII_b 0x62 +#define ASCII_c 0x63 +#define ASCII_d 0x64 +#define ASCII_e 0x65 +#define ASCII_f 0x66 +#define ASCII_g 0x67 +#define ASCII_h 0x68 +#define ASCII_i 0x69 +#define ASCII_j 0x6A +#define ASCII_k 0x6B +#define ASCII_l 0x6C +#define ASCII_m 0x6D +#define ASCII_n 0x6E +#define ASCII_o 0x6F +#define ASCII_p 0x70 +#define ASCII_q 0x71 +#define ASCII_r 0x72 +#define ASCII_s 0x73 +#define ASCII_t 0x74 +#define ASCII_u 0x75 +#define ASCII_v 0x76 +#define ASCII_w 0x77 +#define ASCII_x 0x78 +#define ASCII_y 0x79 +#define ASCII_z 0x7A + +#define ASCII_0 0x30 +#define ASCII_1 0x31 +#define ASCII_2 0x32 +#define ASCII_3 0x33 +#define ASCII_4 0x34 +#define ASCII_5 0x35 +#define ASCII_6 0x36 +#define ASCII_7 0x37 +#define ASCII_8 0x38 +#define ASCII_9 0x39 + +#define ASCII_TAB 0x09 +#define ASCII_SPACE 0x20 +#define ASCII_EXCL 0x21 +#define ASCII_QUOT 0x22 +#define ASCII_AMP 0x26 +#define ASCII_APOS 0x27 +#define ASCII_MINUS 0x2D +#define ASCII_PERIOD 0x2E +#define ASCII_COLON 0x3A +#define ASCII_SEMI 0x3B +#define ASCII_LT 0x3C +#define ASCII_EQUALS 0x3D +#define ASCII_GT 0x3E +#define ASCII_LSQB 0x5B +#define ASCII_RSQB 0x5D +#define ASCII_UNDERSCORE 0x5F Added: external/celementtree-1.0.4-20051213/expat/asciitab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/asciitab.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,36 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, +/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, +/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, +/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, +/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, +/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, +/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, +/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, +/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, +/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, +/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, Added: external/celementtree-1.0.4-20051213/expat/expat.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/expat.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,1004 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlParse_INCLUDED +#define XmlParse_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler +#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler +#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler +#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg +#endif + +#include +#include "expat_external.h" + +struct XML_ParserStruct; +typedef struct XML_ParserStruct *XML_Parser; + +/* Should this be defined using stdbool.h when C99 is available? */ +typedef unsigned char XML_Bool; +#define XML_TRUE ((XML_Bool) 1) +#define XML_FALSE ((XML_Bool) 0) + +/* The XML_Status enum gives the possible return values for several + API functions. The preprocessor #defines are included so this + stanza can be added to code that still needs to support older + versions of Expat 1.95.x: + + #ifndef XML_STATUS_OK + #define XML_STATUS_OK 1 + #define XML_STATUS_ERROR 0 + #endif + + Otherwise, the #define hackery is quite ugly and would have been + dropped. +*/ +enum XML_Status { + XML_STATUS_ERROR = 0, +#define XML_STATUS_ERROR XML_STATUS_ERROR + XML_STATUS_OK = 1, +#define XML_STATUS_OK XML_STATUS_OK + XML_STATUS_SUSPENDED = 2, +#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED +}; + +enum XML_Error { + XML_ERROR_NONE, + XML_ERROR_NO_MEMORY, + XML_ERROR_SYNTAX, + XML_ERROR_NO_ELEMENTS, + XML_ERROR_INVALID_TOKEN, + XML_ERROR_UNCLOSED_TOKEN, + XML_ERROR_PARTIAL_CHAR, + XML_ERROR_TAG_MISMATCH, + XML_ERROR_DUPLICATE_ATTRIBUTE, + XML_ERROR_JUNK_AFTER_DOC_ELEMENT, + XML_ERROR_PARAM_ENTITY_REF, + XML_ERROR_UNDEFINED_ENTITY, + XML_ERROR_RECURSIVE_ENTITY_REF, + XML_ERROR_ASYNC_ENTITY, + XML_ERROR_BAD_CHAR_REF, + XML_ERROR_BINARY_ENTITY_REF, + XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, + XML_ERROR_MISPLACED_XML_PI, + XML_ERROR_UNKNOWN_ENCODING, + XML_ERROR_INCORRECT_ENCODING, + XML_ERROR_UNCLOSED_CDATA_SECTION, + XML_ERROR_EXTERNAL_ENTITY_HANDLING, + XML_ERROR_NOT_STANDALONE, + XML_ERROR_UNEXPECTED_STATE, + XML_ERROR_ENTITY_DECLARED_IN_PE, + XML_ERROR_FEATURE_REQUIRES_XML_DTD, + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, + /* Added in 1.95.7. */ + XML_ERROR_UNBOUND_PREFIX, + /* Added in 1.95.8. */ + XML_ERROR_UNDECLARING_PREFIX, + XML_ERROR_INCOMPLETE_PE, + XML_ERROR_XML_DECL, + XML_ERROR_TEXT_DECL, + XML_ERROR_PUBLICID, + XML_ERROR_SUSPENDED, + XML_ERROR_NOT_SUSPENDED, + XML_ERROR_ABORTED, + XML_ERROR_FINISHED, + XML_ERROR_SUSPEND_PE +}; + +enum XML_Content_Type { + XML_CTYPE_EMPTY = 1, + XML_CTYPE_ANY, + XML_CTYPE_MIXED, + XML_CTYPE_NAME, + XML_CTYPE_CHOICE, + XML_CTYPE_SEQ +}; + +enum XML_Content_Quant { + XML_CQUANT_NONE, + XML_CQUANT_OPT, + XML_CQUANT_REP, + XML_CQUANT_PLUS +}; + +/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be + XML_CQUANT_NONE, and the other fields will be zero or NULL. + If type == XML_CTYPE_MIXED, then quant will be NONE or REP and + numchildren will contain number of elements that may be mixed in + and children point to an array of XML_Content cells that will be + all of XML_CTYPE_NAME type with no quantification. + + If type == XML_CTYPE_NAME, then the name points to the name, and + the numchildren field will be zero and children will be NULL. The + quant fields indicates any quantifiers placed on the name. + + CHOICE and SEQ will have name NULL, the number of children in + numchildren and children will point, recursively, to an array + of XML_Content cells. + + The EMPTY, ANY, and MIXED types will only occur at top level. +*/ + +typedef struct XML_cp XML_Content; + +struct XML_cp { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + XML_Char * name; + unsigned int numchildren; + XML_Content * children; +}; + + +/* This is called for an element declaration. See above for + description of the model argument. It's the caller's responsibility + to free model when finished with it. +*/ +typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, + const XML_Char *name, + XML_Content *model); + +XMLPARSEAPI(void) +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl); + +/* The Attlist declaration handler is called for *each* attribute. So + a single Attlist declaration with multiple attributes declared will + generate multiple calls to this handler. The "default" parameter + may be NULL in the case of the "#IMPLIED" or "#REQUIRED" + keyword. The "isrequired" parameter will be true and the default + value will be NULL in the case of "#REQUIRED". If "isrequired" is + true and default is non-NULL, then this is a "#FIXED" default. +*/ +typedef void (XMLCALL *XML_AttlistDeclHandler) ( + void *userData, + const XML_Char *elname, + const XML_Char *attname, + const XML_Char *att_type, + const XML_Char *dflt, + int isrequired); + +XMLPARSEAPI(void) +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl); + +/* The XML declaration handler is called for *both* XML declarations + and text declarations. The way to distinguish is that the version + parameter will be NULL for text declarations. The encoding + parameter may be NULL for XML declarations. The standalone + parameter will be -1, 0, or 1 indicating respectively that there + was no standalone parameter in the declaration, that it was given + as no, or that it was given as yes. +*/ +typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, + const XML_Char *version, + const XML_Char *encoding, + int standalone); + +XMLPARSEAPI(void) +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler xmldecl); + + +typedef struct { + void *(*malloc_fcn)(size_t size); + void *(*realloc_fcn)(void *ptr, size_t size); + void (*free_fcn)(void *ptr); +} XML_Memory_Handling_Suite; + +/* Constructs a new parser; encoding is the encoding specified by the + external protocol or NULL if there is none specified. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate(const XML_Char *encoding); + +/* Constructs a new parser and namespace processor. Element type + names and attribute names that belong to a namespace will be + expanded; unprefixed attribute names are never expanded; unprefixed + element type names are expanded only if there is a default + namespace. The expanded name is the concatenation of the namespace + URI, the namespace separator character, and the local part of the + name. If the namespace separator is '\0' then the namespace URI + and the local part will be concatenated without any separator. + When a namespace is not declared, the name and prefix will be + passed through without expansion. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); + + +/* Constructs a new parser using the memory management suite referred to + by memsuite. If memsuite is NULL, then use the standard library memory + suite. If namespaceSeparator is non-NULL it creates a parser with + namespace processing as described above. The character pointed at + will serve as the namespace separator. + + All further memory operations used for the created parser will come from + the given suite. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate_MM(const XML_Char *encoding, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + +/* Prepare a parser object to be re-used. This is particularly + valuable when memory allocation overhead is disproportionatly high, + such as when a large number of small documnents need to be parsed. + All handlers are cleared from the parser, except for the + unknownEncodingHandler. The parser's external state is re-initialized + except for the values of ns and ns_triplets. + + Added in Expat 1.95.3. +*/ +XMLPARSEAPI(XML_Bool) +XML_ParserReset(XML_Parser parser, const XML_Char *encoding); + +/* atts is array of name/value pairs, terminated by 0; + names and values are 0 terminated. +*/ +typedef void (XMLCALL *XML_StartElementHandler) (void *userData, + const XML_Char *name, + const XML_Char **atts); + +typedef void (XMLCALL *XML_EndElementHandler) (void *userData, + const XML_Char *name); + + +/* s is not 0 terminated. */ +typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, + const XML_Char *s, + int len); + +/* target and data are 0 terminated */ +typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( + void *userData, + const XML_Char *target, + const XML_Char *data); + +/* data is 0 terminated */ +typedef void (XMLCALL *XML_CommentHandler) (void *userData, + const XML_Char *data); + +typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); +typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); + +/* This is called for any characters in the XML document for which + there is no applicable handler. This includes both characters that + are part of markup which is of a kind that is not reported + (comments, markup declarations), or characters that are part of a + construct which could be reported but for which no handler has been + supplied. The characters are passed exactly as they were in the XML + document except that they will be encoded in UTF-8 or UTF-16. + Line boundaries are not normalized. Note that a byte order mark + character is not passed to the default handler. There are no + guarantees about how characters are divided between calls to the + default handler: for example, a comment might be split between + multiple calls. +*/ +typedef void (XMLCALL *XML_DefaultHandler) (void *userData, + const XML_Char *s, + int len); + +/* This is called for the start of the DOCTYPE declaration, before + any DTD or internal subset is parsed. +*/ +typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( + void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset); + +/* This is called for the start of the DOCTYPE declaration when the + closing > is encountered, but after processing any external + subset. +*/ +typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); + +/* This is called for entity declarations. The is_parameter_entity + argument will be non-zero if the entity is a parameter entity, zero + otherwise. + + For internal entities (), value will + be non-NULL and systemId, publicID, and notationName will be NULL. + The value string is NOT nul-terminated; the length is provided in + the value_length argument. Since it is legal to have zero-length + values, do not use this argument to test for internal entities. + + For external entities, value will be NULL and systemId will be + non-NULL. The publicId argument will be NULL unless a public + identifier was provided. The notationName argument will have a + non-NULL value only for unparsed entity declarations. + + Note that is_parameter_entity can't be changed to XML_Bool, since + that would break binary compatibility. +*/ +typedef void (XMLCALL *XML_EntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity, + const XML_Char *value, + int value_length, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +XMLPARSEAPI(void) +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler); + +/* OBSOLETE -- OBSOLETE -- OBSOLETE + This handler has been superceded by the EntityDeclHandler above. + It is provided here for backward compatibility. + + This is called for a declaration of an unparsed (NDATA) entity. + The base argument is whatever was set by XML_SetBase. The + entityName, systemId and notationName arguments will never be + NULL. The other arguments may be. +*/ +typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +/* This is called for a declaration of notation. The base argument is + whatever was set by XML_SetBase. The notationName will never be + NULL. The other arguments can be. +*/ +typedef void (XMLCALL *XML_NotationDeclHandler) ( + void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* When namespace processing is enabled, these are called once for + each namespace declaration. The call to the start and end element + handlers occur between the calls to the start and end namespace + declaration handlers. For an xmlns attribute, prefix will be + NULL. For an xmlns="" attribute, uri will be NULL. +*/ +typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix, + const XML_Char *uri); + +typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix); + +/* This is called if the document is not standalone, that is, it has an + external subset or a reference to a parameter entity, but does not + have standalone="yes". If this handler returns XML_STATUS_ERROR, + then processing will not continue, and the parser will return a + XML_ERROR_NOT_STANDALONE error. + If parameter entity parsing is enabled, then in addition to the + conditions above this handler will only be called if the referenced + entity was actually read. +*/ +typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); + +/* This is called for a reference to an external parsed general + entity. The referenced entity is not automatically parsed. The + application can parse it immediately or later using + XML_ExternalEntityParserCreate. + + The parser argument is the parser parsing the entity containing the + reference; it can be passed as the parser argument to + XML_ExternalEntityParserCreate. The systemId argument is the + system identifier as specified in the entity declaration; it will + not be NULL. + + The base argument is the system identifier that should be used as + the base for resolving systemId if systemId was relative; this is + set by XML_SetBase; it may be NULL. + + The publicId argument is the public identifier as specified in the + entity declaration, or NULL if none was specified; the whitespace + in the public identifier will have been normalized as required by + the XML spec. + + The context argument specifies the parsing context in the format + expected by the context argument to XML_ExternalEntityParserCreate; + context is valid only until the handler returns, so if the + referenced entity is to be parsed later, it must be copied. + context is NULL only when the entity is a parameter entity. + + The handler should return XML_STATUS_ERROR if processing should not + continue because of a fatal error in the handling of the external + entity. In this case the calling parser will return an + XML_ERROR_EXTERNAL_ENTITY_HANDLING error. + + Note that unlike other handlers the first argument is the parser, + not userData. +*/ +typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( + XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* This is called in two situations: + 1) An entity reference is encountered for which no declaration + has been read *and* this is not an error. + 2) An internal entity reference is read, but not expanded, because + XML_SetDefaultHandler has been called. + Note: skipped parameter entities in declarations and skipped general + entities in attribute values cannot be reported, because + the event would be out of sync with the reporting of the + declarations or attribute values +*/ +typedef void (XMLCALL *XML_SkippedEntityHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity); + +/* This structure is filled in by the XML_UnknownEncodingHandler to + provide information to the parser about encodings that are unknown + to the parser. + + The map[b] member gives information about byte sequences whose + first byte is b. + + If map[b] is c where c is >= 0, then b by itself encodes the + Unicode scalar value c. + + If map[b] is -1, then the byte sequence is malformed. + + If map[b] is -n, where n >= 2, then b is the first byte of an + n-byte sequence that encodes a single Unicode scalar value. + + The data member will be passed as the first argument to the convert + function. + + The convert function is used to convert multibyte sequences; s will + point to a n-byte sequence where map[(unsigned char)*s] == -n. The + convert function must return the Unicode scalar value represented + by this byte sequence or -1 if the byte sequence is malformed. + + The convert function may be NULL if the encoding is a single-byte + encoding, that is if map[b] >= -1 for all bytes b. + + When the parser is finished with the encoding, then if release is + not NULL, it will call release passing it the data member; once + release has been called, the convert function will not be called + again. + + Expat places certain restrictions on the encodings that are supported + using this mechanism. + + 1. Every ASCII character that can appear in a well-formed XML document, + other than the characters + + $@\^`{}~ + + must be represented by a single byte, and that byte must be the + same byte that represents that character in ASCII. + + 2. No character may require more than 4 bytes to encode. + + 3. All characters encoded must have Unicode scalar values <= + 0xFFFF, (i.e., characters that would be encoded by surrogates in + UTF-16 are not allowed). Note that this restriction doesn't + apply to the built-in support for UTF-8 and UTF-16. + + 4. No Unicode character may be encoded by more than one distinct + sequence of bytes. +*/ +typedef struct { + int map[256]; + void *data; + int (XMLCALL *convert)(void *data, const char *s); + void (XMLCALL *release)(void *data); +} XML_Encoding; + +/* This is called for an encoding that is unknown to the parser. + + The encodingHandlerData argument is that which was passed as the + second argument to XML_SetUnknownEncodingHandler. + + The name argument gives the name of the encoding as specified in + the encoding declaration. + + If the callback can provide information about the encoding, it must + fill in the XML_Encoding structure, and return XML_STATUS_OK. + Otherwise it must return XML_STATUS_ERROR. + + If info does not describe a suitable encoding, then the parser will + return an XML_UNKNOWN_ENCODING error. +*/ +typedef int (XMLCALL *XML_UnknownEncodingHandler) ( + void *encodingHandlerData, + const XML_Char *name, + XML_Encoding *info); + +XMLPARSEAPI(void) +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end); + +XMLPARSEAPI(void) +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler handler); + +XMLPARSEAPI(void) +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler handler); + +XMLPARSEAPI(void) +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler); + +XMLPARSEAPI(void) +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler); +XMLPARSEAPI(void) +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler); + +XMLPARSEAPI(void) +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end); + +XMLPARSEAPI(void) +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start); + +XMLPARSEAPI(void) +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end); + +/* This sets the default handler and also inhibits expansion of + internal entities. These entity references will be passed to the + default handler, or to the skipped entity handler, if one is set. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler); + +/* This sets the default handler but does not inhibit expansion of + internal entities. The entity reference will not be passed to the + default handler. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler); + +XMLPARSEAPI(void) +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler); + +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler); + +/* If a non-NULL value for arg is specified here, then it will be + passed as the first argument to the external entity ref handler + instead of the parser object. +*/ +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, + void *arg); + +XMLPARSEAPI(void) +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler); + +XMLPARSEAPI(void) +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + +/* This can be called within a handler for a start element, end + element, processing instruction or character data. It causes the + corresponding markup to be passed to the default handler. +*/ +XMLPARSEAPI(void) +XML_DefaultCurrent(XML_Parser parser); + +/* If do_nst is non-zero, and namespace processing is in effect, and + a name has a prefix (i.e. an explicit namespace qualifier) then + that name is returned as a triplet in a single string separated by + the separator character specified when the parser was created: URI + + sep + local_name + sep + prefix. + + If do_nst is zero, then namespace information is returned in the + default manner (URI + sep + local_name) whether or not the name + has a prefix. + + Note: Calling XML_SetReturnNSTriplet after XML_Parse or + XML_ParseBuffer has no effect. +*/ + +XMLPARSEAPI(void) +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); + +/* This value is passed as the userData argument to callbacks. */ +XMLPARSEAPI(void) +XML_SetUserData(XML_Parser parser, void *userData); + +/* Returns the last value set by XML_SetUserData or NULL. */ +#define XML_GetUserData(parser) (*(void **)(parser)) + +/* This is equivalent to supplying an encoding argument to + XML_ParserCreate. On success XML_SetEncoding returns non-zero, + zero otherwise. + Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer + has no effect and returns XML_STATUS_ERROR. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); + +/* If this function is called, then the parser will be passed as the + first argument to callbacks instead of userData. The userData will + still be accessible using XML_GetUserData. +*/ +XMLPARSEAPI(void) +XML_UseParserAsHandlerArg(XML_Parser parser); + +/* If useDTD == XML_TRUE is passed to this function, then the parser + will assume that there is an external subset, even if none is + specified in the document. In such a case the parser will call the + externalEntityRefHandler with a value of NULL for the systemId + argument (the publicId and context arguments will be NULL as well). + Note: For the purpose of checking WFC: Entity Declared, passing + useDTD == XML_TRUE will make the parser behave as if the document + had a DTD with an external subset. + Note: If this function is called, then this must be done before + the first call to XML_Parse or XML_ParseBuffer, since it will + have no effect after that. Returns + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. + Note: If the document does not have a DOCTYPE declaration at all, + then startDoctypeDeclHandler and endDoctypeDeclHandler will not + be called, despite an external subset being parsed. + Note: If XML_DTD is not defined when Expat is compiled, returns + XML_ERROR_FEATURE_REQUIRES_XML_DTD. +*/ +XMLPARSEAPI(enum XML_Error) +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); + + +/* Sets the base to be used for resolving relative URIs in system + identifiers in declarations. Resolving relative identifiers is + left to the application: this value will be passed through as the + base argument to the XML_ExternalEntityRefHandler, + XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base + argument will be copied. Returns XML_STATUS_ERROR if out of memory, + XML_STATUS_OK otherwise. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetBase(XML_Parser parser, const XML_Char *base); + +XMLPARSEAPI(const XML_Char *) +XML_GetBase(XML_Parser parser); + +/* Returns the number of the attribute/value pairs passed in last call + to the XML_StartElementHandler that were specified in the start-tag + rather than defaulted. Each attribute/value pair counts as 2; thus + this correspondds to an index into the atts array passed to the + XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetSpecifiedAttributeCount(XML_Parser parser); + +/* Returns the index of the ID attribute passed in the last call to + XML_StartElementHandler, or -1 if there is no ID attribute. Each + attribute/value pair counts as 2; thus this correspondds to an + index into the atts array passed to the XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetIdAttributeIndex(XML_Parser parser); + +/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is + detected. The last call to XML_Parse must have isFinal true; len + may be zero for this call (or any other). + + Though the return values for these functions has always been + described as a Boolean value, the implementation, at least for the + 1.95.x series, has always returned exactly one of the XML_Status + values. +*/ +XMLPARSEAPI(enum XML_Status) +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); + +XMLPARSEAPI(void *) +XML_GetBuffer(XML_Parser parser, int len); + +XMLPARSEAPI(enum XML_Status) +XML_ParseBuffer(XML_Parser parser, int len, int isFinal); + +/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. + Must be called from within a call-back handler, except when aborting + (resumable = 0) an already suspended parser. Some call-backs may + still follow because they would otherwise get lost. Examples: + - endElementHandler() for empty elements when stopped in + startElementHandler(), + - endNameSpaceDeclHandler() when stopped in endElementHandler(), + and possibly others. + + Can be called from most handlers, including DTD related call-backs, + except when parsing an external parameter entity and resumable != 0. + Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. + Possible error codes: + - XML_ERROR_SUSPENDED: when suspending an already suspended parser. + - XML_ERROR_FINISHED: when the parser has already finished. + - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. + + When resumable != 0 (true) then parsing is suspended, that is, + XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. + Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() + return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. + + *Note*: + This will be applied to the current parser instance only, that is, if + there is a parent parser then it will continue parsing when the + externalEntityRefHandler() returns. It is up to the implementation of + the externalEntityRefHandler() to call XML_StopParser() on the parent + parser (recursively), if one wants to stop parsing altogether. + + When suspended, parsing can be resumed by calling XML_ResumeParser(). +*/ +XMLPARSEAPI(enum XML_Status) +XML_StopParser(XML_Parser parser, XML_Bool resumable); + +/* Resumes parsing after it has been suspended with XML_StopParser(). + Must not be called from within a handler call-back. Returns same + status codes as XML_Parse() or XML_ParseBuffer(). + Additional error code XML_ERROR_NOT_SUSPENDED possible. + + *Note*: + This must be called on the most deeply nested child parser instance + first, and on its parent parser only after the child parser has finished, + to be applied recursively until the document entity's parser is restarted. + That is, the parent parser will not resume by itself and it is up to the + application to call XML_ResumeParser() on it at the appropriate moment. +*/ +XMLPARSEAPI(enum XML_Status) +XML_ResumeParser(XML_Parser parser); + +enum XML_Parsing { + XML_INITIALIZED, + XML_PARSING, + XML_FINISHED, + XML_SUSPENDED +}; + +typedef struct { + enum XML_Parsing parsing; + XML_Bool finalBuffer; +} XML_ParsingStatus; + +/* Returns status of parser with respect to being initialized, parsing, + finished, or suspended and processing the final buffer. + XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, + XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED +*/ +XMLPARSEAPI(void) +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); + +/* Creates an XML_Parser object that can parse an external general + entity; context is a '\0'-terminated string specifying the parse + context; encoding is a '\0'-terminated string giving the name of + the externally specified encoding, or NULL if there is no + externally specified encoding. The context string consists of a + sequence of tokens separated by formfeeds (\f); a token consisting + of a name specifies that the general entity of the name is open; a + token of the form prefix=uri specifies the namespace for a + particular prefix; a token of the form =uri specifies the default + namespace. This can be called at any point after the first call to + an ExternalEntityRefHandler so longer as the parser has not yet + been freed. The new parser is completely independent and may + safely be used in a separate thread. The handlers and userData are + initialized from the parser argument. Returns NULL if out of memory. + Otherwise returns a new XML_Parser object. +*/ +XMLPARSEAPI(XML_Parser) +XML_ExternalEntityParserCreate(XML_Parser parser, + const XML_Char *context, + const XML_Char *encoding); + +enum XML_ParamEntityParsing { + XML_PARAM_ENTITY_PARSING_NEVER, + XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, + XML_PARAM_ENTITY_PARSING_ALWAYS +}; + +/* Controls parsing of parameter entities (including the external DTD + subset). If parsing of parameter entities is enabled, then + references to external parameter entities (including the external + DTD subset) will be passed to the handler set with + XML_SetExternalEntityRefHandler. The context passed will be 0. + + Unlike external general entities, external parameter entities can + only be parsed synchronously. If the external parameter entity is + to be parsed, it must be parsed during the call to the external + entity ref handler: the complete sequence of + XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and + XML_ParserFree calls must be made during this call. After + XML_ExternalEntityParserCreate has been called to create the parser + for the external parameter entity (context must be 0 for this + call), it is illegal to make any calls on the old parser until + XML_ParserFree has been called on the newly created parser. + If the library has been compiled without support for parameter + entity parsing (ie without XML_DTD being defined), then + XML_SetParamEntityParsing will return 0 if parsing of parameter + entities is requested; otherwise it will return non-zero. + Note: If XML_SetParamEntityParsing is called after XML_Parse or + XML_ParseBuffer, then it has no effect and will always return 0. +*/ +XMLPARSEAPI(int) +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing parsing); + +/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then + XML_GetErrorCode returns information about the error. +*/ +XMLPARSEAPI(enum XML_Error) +XML_GetErrorCode(XML_Parser parser); + +/* These functions return information about the current parse + location. They may be called from any callback called to report + some parse event; in this case the location is the location of the + first of the sequence of characters that generated the event. When + called from callbacks generated by declarations in the document + prologue, the location identified isn't as neatly defined, but will + be within the relevant markup. When called outside of the callback + functions, the position indicated will be just past the last parse + event (regardless of whether there was an associated callback). + + They may also be called after returning from a call to XML_Parse + or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then + the location is the location of the character at which the error + was detected; otherwise the location is the location of the last + parse event, as described above. +*/ +XMLPARSEAPI(int) XML_GetCurrentLineNumber(XML_Parser parser); +XMLPARSEAPI(int) XML_GetCurrentColumnNumber(XML_Parser parser); +XMLPARSEAPI(long) XML_GetCurrentByteIndex(XML_Parser parser); + +/* Return the number of bytes in the current event. + Returns 0 if the event is in an internal entity. +*/ +XMLPARSEAPI(int) +XML_GetCurrentByteCount(XML_Parser parser); + +/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets + the integer pointed to by offset to the offset within this buffer + of the current parse position, and sets the integer pointed to by size + to the size of this buffer (the number of input bytes). Otherwise + returns a NULL pointer. Also returns a NULL pointer if a parse isn't + active. + + NOTE: The character pointer returned should not be used outside + the handler that makes the call. +*/ +XMLPARSEAPI(const char *) +XML_GetInputContext(XML_Parser parser, + int *offset, + int *size); + +/* For backwards compatibility with previous versions. */ +#define XML_GetErrorLineNumber XML_GetCurrentLineNumber +#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber +#define XML_GetErrorByteIndex XML_GetCurrentByteIndex + +/* Frees the content model passed to the element declaration handler */ +XMLPARSEAPI(void) +XML_FreeContentModel(XML_Parser parser, XML_Content *model); + +/* Exposing the memory handling functions used in Expat */ +XMLPARSEAPI(void *) +XML_MemMalloc(XML_Parser parser, size_t size); + +XMLPARSEAPI(void *) +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); + +XMLPARSEAPI(void) +XML_MemFree(XML_Parser parser, void *ptr); + +/* Frees memory used by the parser. */ +XMLPARSEAPI(void) +XML_ParserFree(XML_Parser parser); + +/* Returns a string describing the error. */ +XMLPARSEAPI(const XML_LChar *) +XML_ErrorString(enum XML_Error code); + +/* Return a string containing the version number of this expat */ +XMLPARSEAPI(const XML_LChar *) +XML_ExpatVersion(void); + +typedef struct { + int major; + int minor; + int micro; +} XML_Expat_Version; + +/* Return an XML_Expat_Version structure containing numeric version + number information for this version of expat. +*/ +XMLPARSEAPI(XML_Expat_Version) +XML_ExpatVersionInfo(void); + +/* Added in Expat 1.95.5. */ +enum XML_FeatureEnum { + XML_FEATURE_END = 0, + XML_FEATURE_UNICODE, + XML_FEATURE_UNICODE_WCHAR_T, + XML_FEATURE_DTD, + XML_FEATURE_CONTEXT_BYTES, + XML_FEATURE_MIN_SIZE, + XML_FEATURE_SIZEOF_XML_CHAR, + XML_FEATURE_SIZEOF_XML_LCHAR + /* Additional features must be added to the end of this enum. */ +}; + +typedef struct { + enum XML_FeatureEnum feature; + const XML_LChar *name; + long int value; +} XML_Feature; + +XMLPARSEAPI(const XML_Feature *) +XML_GetFeatureList(void); + + +/* Expat follows the GNU/Linux convention of odd number minor version for + beta/development releases and even number minor version for stable + releases. Micro is bumped with each release, and set to 0 with each + change to major or minor version. +*/ +#define XML_MAJOR_VERSION 1 +#define XML_MINOR_VERSION 95 +#define XML_MICRO_VERSION 8 + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlParse_INCLUDED */ Added: external/celementtree-1.0.4-20051213/expat/expat_external.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/expat_external.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,92 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* External API definitions */ + +#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) +#define XML_USE_MSC_EXTENSIONS 1 +#endif + +/* Expat tries very hard to make the API boundary very specifically + defined. There are two macros defined to control this boundary; + each of these can be defined before including this header to + achieve some different behavior, but doing so it not recommended or + tested frequently. + + XMLCALL - The calling convention to use for all calls across the + "library boundary." This will default to cdecl, and + try really hard to tell the compiler that's what we + want. + + XMLIMPORT - Whatever magic is needed to note that a function is + to be imported from a dynamically loaded library + (.dll, .so, or .sl, depending on your platform). + + The XMLCALL macro was added in Expat 1.95.7. The only one which is + expected to be directly useful in client code is XMLCALL. + + Note that on at least some Unix versions, the Expat library must be + compiled with the cdecl calling convention as the default since + system headers may assume the cdecl convention. +*/ +#ifndef XMLCALL +#if defined(XML_USE_MSC_EXTENSIONS) +#define XMLCALL __cdecl +#elif defined(__GNUC__) && defined(__i386) +#define XMLCALL __attribute__((cdecl)) +#else +/* For any platform which uses this definition and supports more than + one calling convention, we need to extend this definition to + declare the convention used on that platform, if it's possible to + do so. + + If this is the case for your platform, please file a bug report + with information on how to identify your platform via the C + pre-processor and how to specify the same calling convention as the + platform's malloc() implementation. +*/ +#define XMLCALL +#endif +#endif /* not defined XMLCALL */ + + +#if !defined(XML_STATIC) && !defined(XMLIMPORT) +#ifndef XML_BUILDING_EXPAT +/* using Expat from an application */ + +#ifdef XML_USE_MSC_EXTENSIONS +#define XMLIMPORT __declspec(dllimport) +#endif + +#endif +#endif /* not defined XML_STATIC */ + +/* If we didn't define it above, define it away: */ +#ifndef XMLIMPORT +#define XMLIMPORT +#endif + + +#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef XML_UNICODE_WCHAR_T +#define XML_UNICODE +#endif + +#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ +#ifdef XML_UNICODE_WCHAR_T +typedef wchar_t XML_Char; +typedef wchar_t XML_LChar; +#else +typedef unsigned short XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE_WCHAR_T */ +#else /* Information is UTF-8 encoded. */ +typedef char XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE */ Added: external/celementtree-1.0.4-20051213/expat/iasciitab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/iasciitab.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,37 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ +/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, +/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, +/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, +/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, +/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, +/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, +/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, +/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, +/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, +/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, +/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, Added: external/celementtree-1.0.4-20051213/expat/internal.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/internal.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,73 @@ +/* internal.h + + Internal definitions used by Expat. This is not needed to compile + client code. + + The following calling convention macros are defined for frequently + called functions: + + FASTCALL - Used for those internal functions that have a simple + body and a low number of arguments and local variables. + + PTRCALL - Used for functions called though function pointers. + + PTRFASTCALL - Like PTRCALL, but for low number of arguments. + + inline - Used for selected internal functions for which inlining + may improve performance on some platforms. + + Note: Use of these macros is based on judgement, not hard rules, + and therefore subject to change. +*/ + +#if defined(__GNUC__) && defined(__i386__) +/* We'll use this version by default only where we know it helps. + + regparm() generates warnings on Solaris boxes. See SF bug #692878. + + Instability reported with egcs on a RedHat Linux 7.3. + Let's comment out: + #define FASTCALL __attribute__((stdcall, regparm(3))) + and let's try this: +*/ +#define FASTCALL __attribute__((regparm(3))) +#define PTRFASTCALL __attribute__((regparm(3))) +#endif + +/* Using __fastcall seems to have an unexpected negative effect under + MS VC++, especially for function pointers, so we won't use it for + now on that platform. It may be reconsidered for a future release + if it can be made more effective. + Likely reason: __fastcall on Windows is like stdcall, therefore + the compiler cannot perform stack optimizations for call clusters. +*/ + +/* Make sure all of these are defined if they aren't already. */ + +#ifndef FASTCALL +#define FASTCALL +#endif + +#ifndef PTRCALL +#define PTRCALL +#endif + +#ifndef PTRFASTCALL +#define PTRFASTCALL +#endif + +#ifndef XML_MIN_SIZE +#if !defined(__cplusplus) && !defined(inline) +#ifdef __GNUC__ +#define inline __inline +#endif /* __GNUC__ */ +#endif +#endif /* XML_MIN_SIZE */ + +#ifdef __cplusplus +#define inline inline +#else +#ifndef inline +#define inline +#endif +#endif Added: external/celementtree-1.0.4-20051213/expat/latin1tab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/latin1tab.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,36 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, +/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, +/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, +/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, Added: external/celementtree-1.0.4-20051213/expat/macconfig.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/macconfig.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,53 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +** +*/ + +#ifndef MACCONFIG_H +#define MACCONFIG_H + + +/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ +#define BYTEORDER 4321 + +/* Define to 1 if you have the `bcopy' function. */ +#undef HAVE_BCOPY + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* whether byteorder is bigendian */ +#define WORDS_BIGENDIAN + +/* Define to specify how much context to retain around the current parse + point. */ +#undef XML_CONTEXT_BYTES + +/* Define to make parameter entity parsing functionality available. */ +#define XML_DTD + +/* Define to make XML Namespaces functionality available. */ +#define XML_NS + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `long' if does not define. */ +#define off_t long + +/* Define to `unsigned' if does not define. */ +#undef size_t + + +#endif /* ifndef MACCONFIG_H */ Added: external/celementtree-1.0.4-20051213/expat/nametab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/nametab.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,150 @@ +static const unsigned namingBitmap[] = { +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, +0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, +0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, +0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, +0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, +0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, +0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, +0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, +0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, +0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, +0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, +0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, +0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, +0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, +0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, +0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, +0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, +0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, +0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, +0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, +0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, +0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, +0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, +0x40000000, 0xF580C900, 0x00000007, 0x02010800, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, +0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, +0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, +0x00000000, 0x00004C40, 0x00000000, 0x00000000, +0x00000007, 0x00000000, 0x00000000, 0x00000000, +0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, +0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, +0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, +0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, +0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, +0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, +0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, +0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, +0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, +0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, +0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, +0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, +0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, +0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, +0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, +0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, +0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, +0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, +0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, +0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, +0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, +0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, +0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, +0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, +0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, +0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, +0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, +0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, +}; +static const unsigned char nmstrtPages[] = { +0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, +0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, +0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, +0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +static const unsigned char namePages[] = { +0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, +0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, +0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, +0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; Added: external/celementtree-1.0.4-20051213/expat/utf8tab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/utf8tab.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,37 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + + +/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, +/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, Added: external/celementtree-1.0.4-20051213/expat/winconfig.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/winconfig.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,30 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +*/ + +#ifndef WINCONFIG_H +#define WINCONFIG_H + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + +#include +#include + +#define XML_NS 1 +#define XML_DTD 1 +#define XML_CONTEXT_BYTES 1024 + +/* we will assume all Windows platforms are little endian */ +#define BYTEORDER 1234 + +/* Windows has memmove() available. */ +#define HAVE_MEMMOVE + +#endif /* ndef WINCONFIG_H */ Added: external/celementtree-1.0.4-20051213/expat/xmlparse.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/xmlparse.c Wed Dec 14 22:43:26 2005 @@ -0,0 +1,6183 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include /* memset(), memcpy() */ +#include + +#define XML_BUILDING_EXPAT 1 + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#elif defined(HAVE_EXPAT_CONFIG_H) +#include +#endif /* ndef COMPILED_FROM_DSP */ + +#include "expat.h" + +#ifdef XML_UNICODE +#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX +#define XmlConvert XmlUtf16Convert +#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS +#define XmlEncode XmlUtf16Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) +typedef unsigned short ICHAR; +#else +#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX +#define XmlConvert XmlUtf8Convert +#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS +#define XmlEncode XmlUtf8Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) +typedef char ICHAR; +#endif + + +#ifndef XML_NS + +#define XmlInitEncodingNS XmlInitEncoding +#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding +#undef XmlGetInternalEncodingNS +#define XmlGetInternalEncodingNS XmlGetInternalEncoding +#define XmlParseXmlDeclNS XmlParseXmlDecl + +#endif + +#ifdef XML_UNICODE + +#ifdef XML_UNICODE_WCHAR_T +#define XML_T(x) (const wchar_t)x +#define XML_L(x) L ## x +#else +#define XML_T(x) (const unsigned short)x +#define XML_L(x) x +#endif + +#else + +#define XML_T(x) x +#define XML_L(x) x + +#endif + +/* Round up n to be a multiple of sz, where sz is a power of 2. */ +#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) + +/* Handle the case where memmove() doesn't exist. */ +#ifndef HAVE_MEMMOVE +#ifdef HAVE_BCOPY +#define memmove(d,s,l) bcopy((s),(d),(l)) +#else +#error memmove does not exist on this platform, nor is a substitute available +#endif /* HAVE_BCOPY */ +#endif /* HAVE_MEMMOVE */ + +#include "internal.h" +#include "xmltok.h" +#include "xmlrole.h" + +typedef const XML_Char *KEY; + +typedef struct { + KEY name; +} NAMED; + +typedef struct { + NAMED **v; + unsigned char power; + size_t size; + size_t used; + const XML_Memory_Handling_Suite *mem; +} HASH_TABLE; + +/* Basic character hash algorithm, taken from Python's string hash: + h = h * 1000003 ^ character, the constant being a prime number. + +*/ +#ifdef XML_UNICODE +#define CHAR_HASH(h, c) \ + (((h) * 0xF4243) ^ (unsigned short)(c)) +#else +#define CHAR_HASH(h, c) \ + (((h) * 0xF4243) ^ (unsigned char)(c)) +#endif + +/* For probing (after a collision) we need a step size relative prime + to the hash table size, which is a power of 2. We use double-hashing, + since we can calculate a second hash value cheaply by taking those bits + of the first hash value that were discarded (masked out) when the table + index was calculated: index = hash & mask, where mask = table->size - 1. + We limit the maximum step size to table->size / 4 (mask >> 2) and make + it odd, since odd numbers are always relative prime to a power of 2. +*/ +#define SECOND_HASH(hash, mask, power) \ + ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) +#define PROBE_STEP(hash, mask, power) \ + ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) + +typedef struct { + NAMED **p; + NAMED **end; +} HASH_TABLE_ITER; + +#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ +#define INIT_DATA_BUF_SIZE 1024 +#define INIT_ATTS_SIZE 16 +#define INIT_ATTS_VERSION 0xFFFFFFFF +#define INIT_BLOCK_SIZE 1024 +#define INIT_BUFFER_SIZE 1024 + +#define EXPAND_SPARE 24 + +typedef struct binding { + struct prefix *prefix; + struct binding *nextTagBinding; + struct binding *prevPrefixBinding; + const struct attribute_id *attId; + XML_Char *uri; + int uriLen; + int uriAlloc; +} BINDING; + +typedef struct prefix { + const XML_Char *name; + BINDING *binding; +} PREFIX; + +typedef struct { + const XML_Char *str; + const XML_Char *localPart; + const XML_Char *prefix; + int strLen; + int uriLen; + int prefixLen; +} TAG_NAME; + +/* TAG represents an open element. + The name of the element is stored in both the document and API + encodings. The memory buffer 'buf' is a separately-allocated + memory area which stores the name. During the XML_Parse()/ + XMLParseBuffer() when the element is open, the memory for the 'raw' + version of the name (in the document encoding) is shared with the + document buffer. If the element is open across calls to + XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to + contain the 'raw' name as well. + + A parser re-uses these structures, maintaining a list of allocated + TAG objects in a free list. +*/ +typedef struct tag { + struct tag *parent; /* parent of this element */ + const char *rawName; /* tagName in the original encoding */ + int rawNameLength; + TAG_NAME name; /* tagName in the API encoding */ + char *buf; /* buffer for name components */ + char *bufEnd; /* end of the buffer */ + BINDING *bindings; +} TAG; + +typedef struct { + const XML_Char *name; + const XML_Char *textPtr; + int textLen; /* length in XML_Chars */ + int processed; /* # of processed bytes - when suspended */ + const XML_Char *systemId; + const XML_Char *base; + const XML_Char *publicId; + const XML_Char *notation; + XML_Bool open; + XML_Bool is_param; + XML_Bool is_internal; /* true if declared in internal subset outside PE */ +} ENTITY; + +typedef struct { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + const XML_Char * name; + int firstchild; + int lastchild; + int childcnt; + int nextsib; +} CONTENT_SCAFFOLD; + +#define INIT_SCAFFOLD_ELEMENTS 32 + +typedef struct block { + struct block *next; + int size; + XML_Char s[1]; +} BLOCK; + +typedef struct { + BLOCK *blocks; + BLOCK *freeBlocks; + const XML_Char *end; + XML_Char *ptr; + XML_Char *start; + const XML_Memory_Handling_Suite *mem; +} STRING_POOL; + +/* The XML_Char before the name is used to determine whether + an attribute has been specified. */ +typedef struct attribute_id { + XML_Char *name; + PREFIX *prefix; + XML_Bool maybeTokenized; + XML_Bool xmlns; +} ATTRIBUTE_ID; + +typedef struct { + const ATTRIBUTE_ID *id; + XML_Bool isCdata; + const XML_Char *value; +} DEFAULT_ATTRIBUTE; + +typedef struct { + unsigned long version; + unsigned long hash; + const XML_Char *uriName; +} NS_ATT; + +typedef struct { + const XML_Char *name; + PREFIX *prefix; + const ATTRIBUTE_ID *idAtt; + int nDefaultAtts; + int allocDefaultAtts; + DEFAULT_ATTRIBUTE *defaultAtts; +} ELEMENT_TYPE; + +typedef struct { + HASH_TABLE generalEntities; + HASH_TABLE elementTypes; + HASH_TABLE attributeIds; + HASH_TABLE prefixes; + STRING_POOL pool; + STRING_POOL entityValuePool; + /* false once a parameter entity reference has been skipped */ + XML_Bool keepProcessing; + /* true once an internal or external PE reference has been encountered; + this includes the reference to an external subset */ + XML_Bool hasParamEntityRefs; + XML_Bool standalone; +#ifdef XML_DTD + /* indicates if external PE has been read */ + XML_Bool paramEntityRead; + HASH_TABLE paramEntities; +#endif /* XML_DTD */ + PREFIX defaultPrefix; + /* === scaffolding for building content model === */ + XML_Bool in_eldecl; + CONTENT_SCAFFOLD *scaffold; + unsigned contentStringLen; + unsigned scaffSize; + unsigned scaffCount; + int scaffLevel; + int *scaffIndex; +} DTD; + +typedef struct open_internal_entity { + const char *internalEventPtr; + const char *internalEventEndPtr; + struct open_internal_entity *next; + ENTITY *entity; + int startTagLevel; + XML_Bool betweenDecl; /* WFC: PE Between Declarations */ +} OPEN_INTERNAL_ENTITY; + +typedef enum XML_Error PTRCALL Processor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr); + +static Processor prologProcessor; +static Processor prologInitProcessor; +static Processor contentProcessor; +static Processor cdataSectionProcessor; +#ifdef XML_DTD +static Processor ignoreSectionProcessor; +static Processor externalParEntProcessor; +static Processor externalParEntInitProcessor; +static Processor entityValueProcessor; +static Processor entityValueInitProcessor; +#endif /* XML_DTD */ +static Processor epilogProcessor; +static Processor errorProcessor; +static Processor externalEntityInitProcessor; +static Processor externalEntityInitProcessor2; +static Processor externalEntityInitProcessor3; +static Processor externalEntityContentProcessor; +static Processor internalEntityProcessor; + +static enum XML_Error +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); +static enum XML_Error +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next); +static enum XML_Error +initializeEncoding(XML_Parser parser); +static enum XML_Error +doProlog(XML_Parser parser, const ENCODING *enc, const char *s, + const char *end, int tok, const char *next, const char **nextPtr, + XML_Bool haveMore); +static enum XML_Error +processInternalEntity(XML_Parser parser, ENTITY *entity, + XML_Bool betweenDecl); +static enum XML_Error +doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + const char *start, const char *end, const char **endPtr, + XML_Bool haveMore); +static enum XML_Error +doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, + const char *end, const char **nextPtr, XML_Bool haveMore); +#ifdef XML_DTD +static enum XML_Error +doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, + const char *end, const char **nextPtr, XML_Bool haveMore); +#endif /* XML_DTD */ + +static enum XML_Error +storeAtts(XML_Parser parser, const ENCODING *, const char *s, + TAG_NAME *tagNamePtr, BINDING **bindingsPtr); +static enum XML_Error +addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, + const XML_Char *uri, BINDING **bindingsPtr); +static int +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, + XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); +static enum XML_Error +storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, + const char *, const char *, STRING_POOL *); +static enum XML_Error +appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, + const char *, const char *, STRING_POOL *); +static ATTRIBUTE_ID * +getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static int +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); +static enum XML_Error +storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static int +reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); +static int +reportComment(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static void +reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); + +static const XML_Char * getContext(XML_Parser parser); +static XML_Bool +setContext(XML_Parser parser, const XML_Char *context); + +static void FASTCALL normalizePublicId(XML_Char *s); + +static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); +/* do not call if parentParser != NULL */ +static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); +static void +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); +static int +dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); +static int +copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); + +static NAMED * +lookup(HASH_TABLE *table, KEY name, size_t createSize); +static void FASTCALL +hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL hashTableClear(HASH_TABLE *); +static void FASTCALL hashTableDestroy(HASH_TABLE *); +static void FASTCALL +hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); +static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); + +static void FASTCALL +poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL poolClear(STRING_POOL *); +static void FASTCALL poolDestroy(STRING_POOL *); +static XML_Char * +poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Char * +poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); +static const XML_Char * FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s); +static const XML_Char * +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); +static const XML_Char * FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s); + +static int FASTCALL nextScaffoldPart(XML_Parser parser); +static XML_Content * build_model(XML_Parser parser); +static ELEMENT_TYPE * +getElementType(XML_Parser parser, const ENCODING *enc, + const char *ptr, const char *end); + +static XML_Parser +parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, + DTD *dtd); +static void +parserInit(XML_Parser parser, const XML_Char *encodingName); + +#define poolStart(pool) ((pool)->start) +#define poolEnd(pool) ((pool)->ptr) +#define poolLength(pool) ((pool)->ptr - (pool)->start) +#define poolChop(pool) ((void)--(pool->ptr)) +#define poolLastChar(pool) (((pool)->ptr)[-1]) +#define poolDiscard(pool) ((pool)->ptr = (pool)->start) +#define poolFinish(pool) ((pool)->start = (pool)->ptr) +#define poolAppendChar(pool, c) \ + (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ + ? 0 \ + : ((*((pool)->ptr)++ = c), 1)) + +struct XML_ParserStruct { + /* The first member must be userData so that the XML_GetUserData + macro works. */ + void *m_userData; + void *m_handlerArg; + char *m_buffer; + const XML_Memory_Handling_Suite m_mem; + /* first character to be parsed */ + const char *m_bufferPtr; + /* past last character to be parsed */ + char *m_bufferEnd; + /* allocated end of buffer */ + const char *m_bufferLim; + long m_parseEndByteIndex; + const char *m_parseEndPtr; + XML_Char *m_dataBuf; + XML_Char *m_dataBufEnd; + XML_StartElementHandler m_startElementHandler; + XML_EndElementHandler m_endElementHandler; + XML_CharacterDataHandler m_characterDataHandler; + XML_ProcessingInstructionHandler m_processingInstructionHandler; + XML_CommentHandler m_commentHandler; + XML_StartCdataSectionHandler m_startCdataSectionHandler; + XML_EndCdataSectionHandler m_endCdataSectionHandler; + XML_DefaultHandler m_defaultHandler; + XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; + XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; + XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; + XML_NotationDeclHandler m_notationDeclHandler; + XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; + XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; + XML_NotStandaloneHandler m_notStandaloneHandler; + XML_ExternalEntityRefHandler m_externalEntityRefHandler; + XML_Parser m_externalEntityRefHandlerArg; + XML_SkippedEntityHandler m_skippedEntityHandler; + XML_UnknownEncodingHandler m_unknownEncodingHandler; + XML_ElementDeclHandler m_elementDeclHandler; + XML_AttlistDeclHandler m_attlistDeclHandler; + XML_EntityDeclHandler m_entityDeclHandler; + XML_XmlDeclHandler m_xmlDeclHandler; + const ENCODING *m_encoding; + INIT_ENCODING m_initEncoding; + const ENCODING *m_internalEncoding; + const XML_Char *m_protocolEncodingName; + XML_Bool m_ns; + XML_Bool m_ns_triplets; + void *m_unknownEncodingMem; + void *m_unknownEncodingData; + void *m_unknownEncodingHandlerData; + void (XMLCALL *m_unknownEncodingRelease)(void *); + PROLOG_STATE m_prologState; + Processor *m_processor; + enum XML_Error m_errorCode; + const char *m_eventPtr; + const char *m_eventEndPtr; + const char *m_positionPtr; + OPEN_INTERNAL_ENTITY *m_openInternalEntities; + OPEN_INTERNAL_ENTITY *m_freeInternalEntities; + XML_Bool m_defaultExpandInternalEntities; + int m_tagLevel; + ENTITY *m_declEntity; + const XML_Char *m_doctypeName; + const XML_Char *m_doctypeSysid; + const XML_Char *m_doctypePubid; + const XML_Char *m_declAttributeType; + const XML_Char *m_declNotationName; + const XML_Char *m_declNotationPublicId; + ELEMENT_TYPE *m_declElementType; + ATTRIBUTE_ID *m_declAttributeId; + XML_Bool m_declAttributeIsCdata; + XML_Bool m_declAttributeIsId; + DTD *m_dtd; + const XML_Char *m_curBase; + TAG *m_tagStack; + TAG *m_freeTagList; + BINDING *m_inheritedBindings; + BINDING *m_freeBindingList; + int m_attsSize; + int m_nSpecifiedAtts; + int m_idAttIndex; + ATTRIBUTE *m_atts; + NS_ATT *m_nsAtts; + unsigned long m_nsAttsVersion; + unsigned char m_nsAttsPower; + POSITION m_position; + STRING_POOL m_tempPool; + STRING_POOL m_temp2Pool; + char *m_groupConnector; + unsigned int m_groupSize; + XML_Char m_namespaceSeparator; + XML_Parser m_parentParser; + XML_ParsingStatus m_parsingStatus; +#ifdef XML_DTD + XML_Bool m_isParamEntity; + XML_Bool m_useForeignDTD; + enum XML_ParamEntityParsing m_paramEntityParsing; +#endif +}; + +#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) +#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) +#define FREE(p) (parser->m_mem.free_fcn((p))) + +#define userData (parser->m_userData) +#define handlerArg (parser->m_handlerArg) +#define startElementHandler (parser->m_startElementHandler) +#define endElementHandler (parser->m_endElementHandler) +#define characterDataHandler (parser->m_characterDataHandler) +#define processingInstructionHandler \ + (parser->m_processingInstructionHandler) +#define commentHandler (parser->m_commentHandler) +#define startCdataSectionHandler \ + (parser->m_startCdataSectionHandler) +#define endCdataSectionHandler (parser->m_endCdataSectionHandler) +#define defaultHandler (parser->m_defaultHandler) +#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) +#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) +#define unparsedEntityDeclHandler \ + (parser->m_unparsedEntityDeclHandler) +#define notationDeclHandler (parser->m_notationDeclHandler) +#define startNamespaceDeclHandler \ + (parser->m_startNamespaceDeclHandler) +#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) +#define notStandaloneHandler (parser->m_notStandaloneHandler) +#define externalEntityRefHandler \ + (parser->m_externalEntityRefHandler) +#define externalEntityRefHandlerArg \ + (parser->m_externalEntityRefHandlerArg) +#define internalEntityRefHandler \ + (parser->m_internalEntityRefHandler) +#define skippedEntityHandler (parser->m_skippedEntityHandler) +#define unknownEncodingHandler (parser->m_unknownEncodingHandler) +#define elementDeclHandler (parser->m_elementDeclHandler) +#define attlistDeclHandler (parser->m_attlistDeclHandler) +#define entityDeclHandler (parser->m_entityDeclHandler) +#define xmlDeclHandler (parser->m_xmlDeclHandler) +#define encoding (parser->m_encoding) +#define initEncoding (parser->m_initEncoding) +#define internalEncoding (parser->m_internalEncoding) +#define unknownEncodingMem (parser->m_unknownEncodingMem) +#define unknownEncodingData (parser->m_unknownEncodingData) +#define unknownEncodingHandlerData \ + (parser->m_unknownEncodingHandlerData) +#define unknownEncodingRelease (parser->m_unknownEncodingRelease) +#define protocolEncodingName (parser->m_protocolEncodingName) +#define ns (parser->m_ns) +#define ns_triplets (parser->m_ns_triplets) +#define prologState (parser->m_prologState) +#define processor (parser->m_processor) +#define errorCode (parser->m_errorCode) +#define eventPtr (parser->m_eventPtr) +#define eventEndPtr (parser->m_eventEndPtr) +#define positionPtr (parser->m_positionPtr) +#define position (parser->m_position) +#define openInternalEntities (parser->m_openInternalEntities) +#define freeInternalEntities (parser->m_freeInternalEntities) +#define defaultExpandInternalEntities \ + (parser->m_defaultExpandInternalEntities) +#define tagLevel (parser->m_tagLevel) +#define buffer (parser->m_buffer) +#define bufferPtr (parser->m_bufferPtr) +#define bufferEnd (parser->m_bufferEnd) +#define parseEndByteIndex (parser->m_parseEndByteIndex) +#define parseEndPtr (parser->m_parseEndPtr) +#define bufferLim (parser->m_bufferLim) +#define dataBuf (parser->m_dataBuf) +#define dataBufEnd (parser->m_dataBufEnd) +#define _dtd (parser->m_dtd) +#define curBase (parser->m_curBase) +#define declEntity (parser->m_declEntity) +#define doctypeName (parser->m_doctypeName) +#define doctypeSysid (parser->m_doctypeSysid) +#define doctypePubid (parser->m_doctypePubid) +#define declAttributeType (parser->m_declAttributeType) +#define declNotationName (parser->m_declNotationName) +#define declNotationPublicId (parser->m_declNotationPublicId) +#define declElementType (parser->m_declElementType) +#define declAttributeId (parser->m_declAttributeId) +#define declAttributeIsCdata (parser->m_declAttributeIsCdata) +#define declAttributeIsId (parser->m_declAttributeIsId) +#define freeTagList (parser->m_freeTagList) +#define freeBindingList (parser->m_freeBindingList) +#define inheritedBindings (parser->m_inheritedBindings) +#define tagStack (parser->m_tagStack) +#define atts (parser->m_atts) +#define attsSize (parser->m_attsSize) +#define nSpecifiedAtts (parser->m_nSpecifiedAtts) +#define idAttIndex (parser->m_idAttIndex) +#define nsAtts (parser->m_nsAtts) +#define nsAttsVersion (parser->m_nsAttsVersion) +#define nsAttsPower (parser->m_nsAttsPower) +#define tempPool (parser->m_tempPool) +#define temp2Pool (parser->m_temp2Pool) +#define groupConnector (parser->m_groupConnector) +#define groupSize (parser->m_groupSize) +#define namespaceSeparator (parser->m_namespaceSeparator) +#define parentParser (parser->m_parentParser) +#define parsing (parser->m_parsingStatus.parsing) +#define finalBuffer (parser->m_parsingStatus.finalBuffer) +#ifdef XML_DTD +#define isParamEntity (parser->m_isParamEntity) +#define useForeignDTD (parser->m_useForeignDTD) +#define paramEntityParsing (parser->m_paramEntityParsing) +#endif /* XML_DTD */ + +XML_Parser XMLCALL +XML_ParserCreate(const XML_Char *encodingName) +{ + return XML_ParserCreate_MM(encodingName, NULL, NULL); +} + +XML_Parser XMLCALL +XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) +{ + XML_Char tmp[2]; + *tmp = nsSep; + return XML_ParserCreate_MM(encodingName, NULL, tmp); +} + +static const XML_Char implicitContext[] = { + 'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/', + 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/', + 'X', 'M', 'L', '/', '1', '9', '9', '8', '/', + 'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0' +}; + +XML_Parser XMLCALL +XML_ParserCreate_MM(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep) +{ + XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL); + if (parser != NULL && ns) { + /* implicit context only set for root parser, since child + parsers (i.e. external entity parsers) will inherit it + */ + if (!setContext(parser, implicitContext)) { + XML_ParserFree(parser); + return NULL; + } + } + return parser; +} + +static XML_Parser +parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, + DTD *dtd) +{ + XML_Parser parser; + + if (memsuite) { + XML_Memory_Handling_Suite *mtemp; + parser = (XML_Parser) + memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); + if (parser != NULL) { + mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); + mtemp->malloc_fcn = memsuite->malloc_fcn; + mtemp->realloc_fcn = memsuite->realloc_fcn; + mtemp->free_fcn = memsuite->free_fcn; + } + } + else { + XML_Memory_Handling_Suite *mtemp; + parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); + if (parser != NULL) { + mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); + mtemp->malloc_fcn = malloc; + mtemp->realloc_fcn = realloc; + mtemp->free_fcn = free; + } + } + + if (!parser) + return parser; + + buffer = NULL; + bufferLim = NULL; + + attsSize = INIT_ATTS_SIZE; + atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); + if (atts == NULL) { + FREE(parser); + return NULL; + } + dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); + if (dataBuf == NULL) { + FREE(atts); + FREE(parser); + return NULL; + } + dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; + + if (dtd) + _dtd = dtd; + else { + _dtd = dtdCreate(&parser->m_mem); + if (_dtd == NULL) { + FREE(dataBuf); + FREE(atts); + FREE(parser); + return NULL; + } + } + + freeBindingList = NULL; + freeTagList = NULL; + freeInternalEntities = NULL; + + groupSize = 0; + groupConnector = NULL; + + unknownEncodingHandler = NULL; + unknownEncodingHandlerData = NULL; + + namespaceSeparator = '!'; + ns = XML_FALSE; + ns_triplets = XML_FALSE; + + nsAtts = NULL; + nsAttsVersion = 0; + nsAttsPower = 0; + + poolInit(&tempPool, &(parser->m_mem)); + poolInit(&temp2Pool, &(parser->m_mem)); + parserInit(parser, encodingName); + + if (encodingName && !protocolEncodingName) { + XML_ParserFree(parser); + return NULL; + } + + if (nameSep) { + ns = XML_TRUE; + internalEncoding = XmlGetInternalEncodingNS(); + namespaceSeparator = *nameSep; + } + else { + internalEncoding = XmlGetInternalEncoding(); + } + + return parser; +} + +static void +parserInit(XML_Parser parser, const XML_Char *encodingName) +{ + processor = prologInitProcessor; + XmlPrologStateInit(&prologState); + protocolEncodingName = (encodingName != NULL + ? poolCopyString(&tempPool, encodingName) + : NULL); + curBase = NULL; + XmlInitEncoding(&initEncoding, &encoding, 0); + userData = NULL; + handlerArg = NULL; + startElementHandler = NULL; + endElementHandler = NULL; + characterDataHandler = NULL; + processingInstructionHandler = NULL; + commentHandler = NULL; + startCdataSectionHandler = NULL; + endCdataSectionHandler = NULL; + defaultHandler = NULL; + startDoctypeDeclHandler = NULL; + endDoctypeDeclHandler = NULL; + unparsedEntityDeclHandler = NULL; + notationDeclHandler = NULL; + startNamespaceDeclHandler = NULL; + endNamespaceDeclHandler = NULL; + notStandaloneHandler = NULL; + externalEntityRefHandler = NULL; + externalEntityRefHandlerArg = parser; + skippedEntityHandler = NULL; + elementDeclHandler = NULL; + attlistDeclHandler = NULL; + entityDeclHandler = NULL; + xmlDeclHandler = NULL; + bufferPtr = buffer; + bufferEnd = buffer; + parseEndByteIndex = 0; + parseEndPtr = NULL; + declElementType = NULL; + declAttributeId = NULL; + declEntity = NULL; + doctypeName = NULL; + doctypeSysid = NULL; + doctypePubid = NULL; + declAttributeType = NULL; + declNotationName = NULL; + declNotationPublicId = NULL; + declAttributeIsCdata = XML_FALSE; + declAttributeIsId = XML_FALSE; + memset(&position, 0, sizeof(POSITION)); + errorCode = XML_ERROR_NONE; + eventPtr = NULL; + eventEndPtr = NULL; + positionPtr = NULL; + openInternalEntities = NULL; + defaultExpandInternalEntities = XML_TRUE; + tagLevel = 0; + tagStack = NULL; + inheritedBindings = NULL; + nSpecifiedAtts = 0; + unknownEncodingMem = NULL; + unknownEncodingRelease = NULL; + unknownEncodingData = NULL; + parentParser = NULL; + parsing = XML_INITIALIZED; +#ifdef XML_DTD + isParamEntity = XML_FALSE; + useForeignDTD = XML_FALSE; + paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; +#endif +} + +/* moves list of bindings to freeBindingList */ +static void FASTCALL +moveToFreeBindingList(XML_Parser parser, BINDING *bindings) +{ + while (bindings) { + BINDING *b = bindings; + bindings = bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + } +} + +XML_Bool XMLCALL +XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) +{ + TAG *tStk; + OPEN_INTERNAL_ENTITY *openEntityList; + if (parentParser) + return XML_FALSE; + /* move tagStack to freeTagList */ + tStk = tagStack; + while (tStk) { + TAG *tag = tStk; + tStk = tStk->parent; + tag->parent = freeTagList; + moveToFreeBindingList(parser, tag->bindings); + tag->bindings = NULL; + freeTagList = tag; + } + /* move openInternalEntities to freeInternalEntities */ + openEntityList = openInternalEntities; + while (openEntityList) { + OPEN_INTERNAL_ENTITY *openEntity = openEntityList; + openEntityList = openEntity->next; + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + moveToFreeBindingList(parser, inheritedBindings); + FREE(unknownEncodingMem); + if (unknownEncodingRelease) + unknownEncodingRelease(unknownEncodingData); + poolClear(&tempPool); + poolClear(&temp2Pool); + parserInit(parser, encodingName); + dtdReset(_dtd, &parser->m_mem); + return setContext(parser, implicitContext); +} + +enum XML_Status XMLCALL +XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) +{ + /* Block after XML_Parse()/XML_ParseBuffer() has been called. + XXX There's no way for the caller to determine which of the + XXX possible error cases caused the XML_STATUS_ERROR return. + */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return XML_STATUS_ERROR; + if (encodingName == NULL) + protocolEncodingName = NULL; + else { + protocolEncodingName = poolCopyString(&tempPool, encodingName); + if (!protocolEncodingName) + return XML_STATUS_ERROR; + } + return XML_STATUS_OK; +} + +XML_Parser XMLCALL +XML_ExternalEntityParserCreate(XML_Parser oldParser, + const XML_Char *context, + const XML_Char *encodingName) +{ + XML_Parser parser = oldParser; + DTD *newDtd = NULL; + DTD *oldDtd = _dtd; + XML_StartElementHandler oldStartElementHandler = startElementHandler; + XML_EndElementHandler oldEndElementHandler = endElementHandler; + XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; + XML_ProcessingInstructionHandler oldProcessingInstructionHandler + = processingInstructionHandler; + XML_CommentHandler oldCommentHandler = commentHandler; + XML_StartCdataSectionHandler oldStartCdataSectionHandler + = startCdataSectionHandler; + XML_EndCdataSectionHandler oldEndCdataSectionHandler + = endCdataSectionHandler; + XML_DefaultHandler oldDefaultHandler = defaultHandler; + XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler + = unparsedEntityDeclHandler; + XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; + XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler + = startNamespaceDeclHandler; + XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler + = endNamespaceDeclHandler; + XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; + XML_ExternalEntityRefHandler oldExternalEntityRefHandler + = externalEntityRefHandler; + XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; + XML_UnknownEncodingHandler oldUnknownEncodingHandler + = unknownEncodingHandler; + XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; + XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; + XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; + XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; + ELEMENT_TYPE * oldDeclElementType = declElementType; + + void *oldUserData = userData; + void *oldHandlerArg = handlerArg; + XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; + XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; +#ifdef XML_DTD + enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; + int oldInEntityValue = prologState.inEntityValue; +#endif + XML_Bool oldns_triplets = ns_triplets; + +#ifdef XML_DTD + if (!context) + newDtd = oldDtd; +#endif /* XML_DTD */ + + /* Note that the magical uses of the pre-processor to make field + access look more like C++ require that `parser' be overwritten + here. This makes this function more painful to follow than it + would be otherwise. + */ + if (ns) { + XML_Char tmp[2]; + *tmp = namespaceSeparator; + parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); + } + else { + parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); + } + + if (!parser) + return NULL; + + startElementHandler = oldStartElementHandler; + endElementHandler = oldEndElementHandler; + characterDataHandler = oldCharacterDataHandler; + processingInstructionHandler = oldProcessingInstructionHandler; + commentHandler = oldCommentHandler; + startCdataSectionHandler = oldStartCdataSectionHandler; + endCdataSectionHandler = oldEndCdataSectionHandler; + defaultHandler = oldDefaultHandler; + unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; + notationDeclHandler = oldNotationDeclHandler; + startNamespaceDeclHandler = oldStartNamespaceDeclHandler; + endNamespaceDeclHandler = oldEndNamespaceDeclHandler; + notStandaloneHandler = oldNotStandaloneHandler; + externalEntityRefHandler = oldExternalEntityRefHandler; + skippedEntityHandler = oldSkippedEntityHandler; + unknownEncodingHandler = oldUnknownEncodingHandler; + elementDeclHandler = oldElementDeclHandler; + attlistDeclHandler = oldAttlistDeclHandler; + entityDeclHandler = oldEntityDeclHandler; + xmlDeclHandler = oldXmlDeclHandler; + declElementType = oldDeclElementType; + userData = oldUserData; + if (oldUserData == oldHandlerArg) + handlerArg = userData; + else + handlerArg = parser; + if (oldExternalEntityRefHandlerArg != oldParser) + externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; + defaultExpandInternalEntities = oldDefaultExpandInternalEntities; + ns_triplets = oldns_triplets; + parentParser = oldParser; +#ifdef XML_DTD + paramEntityParsing = oldParamEntityParsing; + prologState.inEntityValue = oldInEntityValue; + if (context) { +#endif /* XML_DTD */ + if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) + || !setContext(parser, context)) { + XML_ParserFree(parser); + return NULL; + } + processor = externalEntityInitProcessor; +#ifdef XML_DTD + } + else { + /* The DTD instance referenced by _dtd is shared between the document's + root parser and external PE parsers, therefore one does not need to + call setContext. In addition, one also *must* not call setContext, + because this would overwrite existing prefix->binding pointers in + _dtd with ones that get destroyed with the external PE parser. + This would leave those prefixes with dangling pointers. + */ + isParamEntity = XML_TRUE; + XmlPrologStateInitExternalEntity(&prologState); + processor = externalParEntInitProcessor; + } +#endif /* XML_DTD */ + return parser; +} + +static void FASTCALL +destroyBindings(BINDING *bindings, XML_Parser parser) +{ + for (;;) { + BINDING *b = bindings; + if (!b) + break; + bindings = b->nextTagBinding; + FREE(b->uri); + FREE(b); + } +} + +void XMLCALL +XML_ParserFree(XML_Parser parser) +{ + TAG *tagList; + OPEN_INTERNAL_ENTITY *entityList; + if (parser == NULL) + return; + /* free tagStack and freeTagList */ + tagList = tagStack; + for (;;) { + TAG *p; + if (tagList == NULL) { + if (freeTagList == NULL) + break; + tagList = freeTagList; + freeTagList = NULL; + } + p = tagList; + tagList = tagList->parent; + FREE(p->buf); + destroyBindings(p->bindings, parser); + FREE(p); + } + /* free openInternalEntities and freeInternalEntities */ + entityList = openInternalEntities; + for (;;) { + OPEN_INTERNAL_ENTITY *openEntity; + if (entityList == NULL) { + if (freeInternalEntities == NULL) + break; + entityList = freeInternalEntities; + freeInternalEntities = NULL; + } + openEntity = entityList; + entityList = entityList->next; + FREE(openEntity); + } + + destroyBindings(freeBindingList, parser); + destroyBindings(inheritedBindings, parser); + poolDestroy(&tempPool); + poolDestroy(&temp2Pool); +#ifdef XML_DTD + /* external parameter entity parsers share the DTD structure + parser->m_dtd with the root parser, so we must not destroy it + */ + if (!isParamEntity && _dtd) +#else + if (_dtd) +#endif /* XML_DTD */ + dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); + FREE((void *)atts); + FREE(groupConnector); + FREE(buffer); + FREE(dataBuf); + FREE(nsAtts); + FREE(unknownEncodingMem); + if (unknownEncodingRelease) + unknownEncodingRelease(unknownEncodingData); + FREE(parser); +} + +void XMLCALL +XML_UseParserAsHandlerArg(XML_Parser parser) +{ + handlerArg = parser; +} + +enum XML_Error XMLCALL +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) +{ +#ifdef XML_DTD + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; + useForeignDTD = useDTD; + return XML_ERROR_NONE; +#else + return XML_ERROR_FEATURE_REQUIRES_XML_DTD; +#endif +} + +void XMLCALL +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) +{ + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return; + ns_triplets = do_nst ? XML_TRUE : XML_FALSE; +} + +void XMLCALL +XML_SetUserData(XML_Parser parser, void *p) +{ + if (handlerArg == userData) + handlerArg = userData = p; + else + userData = p; +} + +enum XML_Status XMLCALL +XML_SetBase(XML_Parser parser, const XML_Char *p) +{ + if (p) { + p = poolCopyString(&_dtd->pool, p); + if (!p) + return XML_STATUS_ERROR; + curBase = p; + } + else + curBase = NULL; + return XML_STATUS_OK; +} + +const XML_Char * XMLCALL +XML_GetBase(XML_Parser parser) +{ + return curBase; +} + +int XMLCALL +XML_GetSpecifiedAttributeCount(XML_Parser parser) +{ + return nSpecifiedAtts; +} + +int XMLCALL +XML_GetIdAttributeIndex(XML_Parser parser) +{ + return idAttIndex; +} + +void XMLCALL +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end) +{ + startElementHandler = start; + endElementHandler = end; +} + +void XMLCALL +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler start) { + startElementHandler = start; +} + +void XMLCALL +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler end) { + endElementHandler = end; +} + +void XMLCALL +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler) +{ + characterDataHandler = handler; +} + +void XMLCALL +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler) +{ + processingInstructionHandler = handler; +} + +void XMLCALL +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler) +{ + commentHandler = handler; +} + +void XMLCALL +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end) +{ + startCdataSectionHandler = start; + endCdataSectionHandler = end; +} + +void XMLCALL +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start) { + startCdataSectionHandler = start; +} + +void XMLCALL +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end) { + endCdataSectionHandler = end; +} + +void XMLCALL +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler) +{ + defaultHandler = handler; + defaultExpandInternalEntities = XML_FALSE; +} + +void XMLCALL +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler) +{ + defaultHandler = handler; + defaultExpandInternalEntities = XML_TRUE; +} + +void XMLCALL +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end) +{ + startDoctypeDeclHandler = start; + endDoctypeDeclHandler = end; +} + +void XMLCALL +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start) { + startDoctypeDeclHandler = start; +} + +void XMLCALL +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end) { + endDoctypeDeclHandler = end; +} + +void XMLCALL +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler) +{ + unparsedEntityDeclHandler = handler; +} + +void XMLCALL +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler) +{ + notationDeclHandler = handler; +} + +void XMLCALL +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end) +{ + startNamespaceDeclHandler = start; + endNamespaceDeclHandler = end; +} + +void XMLCALL +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start) { + startNamespaceDeclHandler = start; +} + +void XMLCALL +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end) { + endNamespaceDeclHandler = end; +} + +void XMLCALL +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler) +{ + notStandaloneHandler = handler; +} + +void XMLCALL +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler) +{ + externalEntityRefHandler = handler; +} + +void XMLCALL +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) +{ + if (arg) + externalEntityRefHandlerArg = (XML_Parser)arg; + else + externalEntityRefHandlerArg = parser; +} + +void XMLCALL +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler) +{ + skippedEntityHandler = handler; +} + +void XMLCALL +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *data) +{ + unknownEncodingHandler = handler; + unknownEncodingHandlerData = data; +} + +void XMLCALL +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl) +{ + elementDeclHandler = eldecl; +} + +void XMLCALL +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl) +{ + attlistDeclHandler = attdecl; +} + +void XMLCALL +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler) +{ + entityDeclHandler = handler; +} + +void XMLCALL +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler handler) { + xmlDeclHandler = handler; +} + +int XMLCALL +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing peParsing) +{ + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return 0; +#ifdef XML_DTD + paramEntityParsing = peParsing; + return 1; +#else + return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; +#endif +} + +enum XML_Status XMLCALL +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) +{ + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + parsing = XML_PARSING; + } + + if (len == 0) { + finalBuffer = (XML_Bool)isFinal; + if (!isFinal) + return XML_STATUS_OK; + positionPtr = bufferPtr; + parseEndPtr = bufferEnd; + + /* If data are left over from last buffer, and we now know that these + data are the final chunk of input, then we have to check them again + to detect errors based on this information. + */ + errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); + + if (errorCode == XML_ERROR_NONE) { + switch (parsing) { + case XML_SUSPENDED: + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return XML_STATUS_SUSPENDED; + case XML_INITIALIZED: + case XML_PARSING: + parsing = XML_FINISHED; + /* fall through */ + default: + return XML_STATUS_OK; + } + } + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } +#ifndef XML_CONTEXT_BYTES + else if (bufferPtr == bufferEnd) { + const char *end; + int nLeftOver; + enum XML_Error result; + parseEndByteIndex += len; + positionPtr = s; + finalBuffer = (XML_Bool)isFinal; + + errorCode = processor(parser, s, parseEndPtr = s + len, &end); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + result = XML_STATUS_OK; + if (isFinal) { + parsing = XML_FINISHED; + return result; + } + } + } + + XmlUpdatePosition(encoding, positionPtr, end, &position); + positionPtr = end; + nLeftOver = s + len - end; + if (nLeftOver) { + if (buffer == NULL || nLeftOver > bufferLim - buffer) { + /* FIXME avoid integer overflow */ + char *temp; + temp = (buffer == NULL + ? (char *)MALLOC(len * 2) + : (char *)REALLOC(buffer, len * 2)); + if (temp == NULL) { + errorCode = XML_ERROR_NO_MEMORY; + return XML_STATUS_ERROR; + } + buffer = temp; + if (!buffer) { + errorCode = XML_ERROR_NO_MEMORY; + eventPtr = eventEndPtr = NULL; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + bufferLim = buffer + len * 2; + } + memcpy(buffer, end, nLeftOver); + bufferPtr = buffer; + bufferEnd = buffer + nLeftOver; + } + return result; + } +#endif /* not defined XML_CONTEXT_BYTES */ + else { + void *buff = XML_GetBuffer(parser, len); + if (buff == NULL) + return XML_STATUS_ERROR; + else { + memcpy(buff, s, len); + return XML_ParseBuffer(parser, len, isFinal); + } + } +} + +enum XML_Status XMLCALL +XML_ParseBuffer(XML_Parser parser, int len, int isFinal) +{ + const char *start; + enum XML_Error result = XML_STATUS_OK; + + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + parsing = XML_PARSING; + } + + start = bufferPtr; + positionPtr = start; + bufferEnd += len; + parseEndPtr = bufferEnd; + parseEndByteIndex += len; + finalBuffer = (XML_Bool)isFinal; + + errorCode = processor(parser, start, parseEndPtr, &bufferPtr); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (isFinal) { + parsing = XML_FINISHED; + return result; + } + default: ; /* should not happen */ + } + } + + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return result; +} + +void * XMLCALL +XML_GetBuffer(XML_Parser parser, int len) +{ + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return NULL; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return NULL; + default: ; + } + + if (len > bufferLim - bufferEnd) { + /* FIXME avoid integer overflow */ + int neededSize = len + (bufferEnd - bufferPtr); +#ifdef XML_CONTEXT_BYTES + int keep = bufferPtr - buffer; + + if (keep > XML_CONTEXT_BYTES) + keep = XML_CONTEXT_BYTES; + neededSize += keep; +#endif /* defined XML_CONTEXT_BYTES */ + if (neededSize <= bufferLim - buffer) { +#ifdef XML_CONTEXT_BYTES + if (keep < bufferPtr - buffer) { + int offset = (bufferPtr - buffer) - keep; + memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); + bufferEnd -= offset; + bufferPtr -= offset; + } +#else + memmove(buffer, bufferPtr, bufferEnd - bufferPtr); + bufferEnd = buffer + (bufferEnd - bufferPtr); + bufferPtr = buffer; +#endif /* not defined XML_CONTEXT_BYTES */ + } + else { + char *newBuf; + int bufferSize = bufferLim - bufferPtr; + if (bufferSize == 0) + bufferSize = INIT_BUFFER_SIZE; + do { + bufferSize *= 2; + } while (bufferSize < neededSize); + newBuf = (char *)MALLOC(bufferSize); + if (newBuf == 0) { + errorCode = XML_ERROR_NO_MEMORY; + return NULL; + } + bufferLim = newBuf + bufferSize; +#ifdef XML_CONTEXT_BYTES + if (bufferPtr) { + int keep = bufferPtr - buffer; + if (keep > XML_CONTEXT_BYTES) + keep = XML_CONTEXT_BYTES; + memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); + FREE(buffer); + buffer = newBuf; + bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; + bufferPtr = buffer + keep; + } + else { + bufferEnd = newBuf + (bufferEnd - bufferPtr); + bufferPtr = buffer = newBuf; + } +#else + if (bufferPtr) { + memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); + FREE(buffer); + } + bufferEnd = newBuf + (bufferEnd - bufferPtr); + bufferPtr = buffer = newBuf; +#endif /* not defined XML_CONTEXT_BYTES */ + } + } + return bufferEnd; +} + +enum XML_Status XMLCALL +XML_StopParser(XML_Parser parser, XML_Bool resumable) +{ + switch (parsing) { + case XML_SUSPENDED: + if (resumable) { + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + } + parsing = XML_FINISHED; + break; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + if (resumable) { +#ifdef XML_DTD + if (isParamEntity) { + errorCode = XML_ERROR_SUSPEND_PE; + return XML_STATUS_ERROR; + } +#endif + parsing = XML_SUSPENDED; + } + else + parsing = XML_FINISHED; + } + return XML_STATUS_OK; +} + +enum XML_Status XMLCALL +XML_ResumeParser(XML_Parser parser) +{ + enum XML_Error result = XML_STATUS_OK; + + if (parsing != XML_SUSPENDED) { + errorCode = XML_ERROR_NOT_SUSPENDED; + return XML_STATUS_ERROR; + } + parsing = XML_PARSING; + + errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (finalBuffer) { + parsing = XML_FINISHED; + return result; + } + default: ; + } + } + + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return result; +} + +void XMLCALL +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) +{ + assert(status != NULL); + *status = parser->m_parsingStatus; +} + +enum XML_Error XMLCALL +XML_GetErrorCode(XML_Parser parser) +{ + return errorCode; +} + +long XMLCALL +XML_GetCurrentByteIndex(XML_Parser parser) +{ + if (eventPtr) + return parseEndByteIndex - (parseEndPtr - eventPtr); + return -1; +} + +int XMLCALL +XML_GetCurrentByteCount(XML_Parser parser) +{ + if (eventEndPtr && eventPtr) + return eventEndPtr - eventPtr; + return 0; +} + +const char * XMLCALL +XML_GetInputContext(XML_Parser parser, int *offset, int *size) +{ +#ifdef XML_CONTEXT_BYTES + if (eventPtr && buffer) { + *offset = eventPtr - buffer; + *size = bufferEnd - buffer; + return buffer; + } +#endif /* defined XML_CONTEXT_BYTES */ + return (char *) 0; +} + +int XMLCALL +XML_GetCurrentLineNumber(XML_Parser parser) +{ + if (eventPtr && eventPtr >= positionPtr) { + XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); + positionPtr = eventPtr; + } + return position.lineNumber + 1; +} + +int XMLCALL +XML_GetCurrentColumnNumber(XML_Parser parser) +{ + if (eventPtr && eventPtr >= positionPtr) { + XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); + positionPtr = eventPtr; + } + return position.columnNumber; +} + +void XMLCALL +XML_FreeContentModel(XML_Parser parser, XML_Content *model) +{ + FREE(model); +} + +void * XMLCALL +XML_MemMalloc(XML_Parser parser, size_t size) +{ + return MALLOC(size); +} + +void * XMLCALL +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) +{ + return REALLOC(ptr, size); +} + +void XMLCALL +XML_MemFree(XML_Parser parser, void *ptr) +{ + FREE(ptr); +} + +void XMLCALL +XML_DefaultCurrent(XML_Parser parser) +{ + if (defaultHandler) { + if (openInternalEntities) + reportDefault(parser, + internalEncoding, + openInternalEntities->internalEventPtr, + openInternalEntities->internalEventEndPtr); + else + reportDefault(parser, encoding, eventPtr, eventEndPtr); + } +} + +const XML_LChar * XMLCALL +XML_ErrorString(enum XML_Error code) +{ + static const XML_LChar *message[] = { + 0, + XML_L("out of memory"), + XML_L("syntax error"), + XML_L("no element found"), + XML_L("not well-formed (invalid token)"), + XML_L("unclosed token"), + XML_L("partial character"), + XML_L("mismatched tag"), + XML_L("duplicate attribute"), + XML_L("junk after document element"), + XML_L("illegal parameter entity reference"), + XML_L("undefined entity"), + XML_L("recursive entity reference"), + XML_L("asynchronous entity"), + XML_L("reference to invalid character number"), + XML_L("reference to binary entity"), + XML_L("reference to external entity in attribute"), + XML_L("xml declaration not at start of external entity"), + XML_L("unknown encoding"), + XML_L("encoding specified in XML declaration is incorrect"), + XML_L("unclosed CDATA section"), + XML_L("error in processing external entity reference"), + XML_L("document is not standalone"), + XML_L("unexpected parser state - please send a bug report"), + XML_L("entity declared in parameter entity"), + XML_L("requested feature requires XML_DTD support in Expat"), + XML_L("cannot change setting once parsing has begun"), + XML_L("unbound prefix"), + XML_L("must not undeclare prefix"), + XML_L("incomplete markup in parameter entity"), + XML_L("XML declaration not well-formed"), + XML_L("text declaration not well-formed"), + XML_L("illegal character(s) in public id"), + XML_L("parser suspended"), + XML_L("parser not suspended"), + XML_L("parsing aborted"), + XML_L("parsing finished"), + XML_L("cannot suspend in external parameter entity") + }; + if (code > 0 && code < sizeof(message)/sizeof(message[0])) + return message[code]; + return NULL; +} + +const XML_LChar * XMLCALL +XML_ExpatVersion(void) { + + /* V1 is used to string-ize the version number. However, it would + string-ize the actual version macro *names* unless we get them + substituted before being passed to V1. CPP is defined to expand + a macro, then rescan for more expansions. Thus, we use V2 to expand + the version macros, then CPP will expand the resulting V1() macro + with the correct numerals. */ + /* ### I'm assuming cpp is portable in this respect... */ + +#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) +#define V2(a,b,c) XML_L("expat_")V1(a,b,c) + + return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); + +#undef V1 +#undef V2 +} + +XML_Expat_Version XMLCALL +XML_ExpatVersionInfo(void) +{ + XML_Expat_Version version; + + version.major = XML_MAJOR_VERSION; + version.minor = XML_MINOR_VERSION; + version.micro = XML_MICRO_VERSION; + + return version; +} + +const XML_Feature * XMLCALL +XML_GetFeatureList(void) +{ + static XML_Feature features[] = { + {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), 0}, + {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), 0}, +#ifdef XML_UNICODE + {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, +#endif +#ifdef XML_UNICODE_WCHAR_T + {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, +#endif +#ifdef XML_DTD + {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, +#endif +#ifdef XML_CONTEXT_BYTES + {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), + XML_CONTEXT_BYTES}, +#endif +#ifdef XML_MIN_SIZE + {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, +#endif + {XML_FEATURE_END, NULL, 0} + }; + + features[0].value = sizeof(XML_Char); + features[1].value = sizeof(XML_LChar); + return features; +} + +/* Initially tag->rawName always points into the parse buffer; + for those TAG instances opened while the current parse buffer was + processed, and not yet closed, we need to store tag->rawName in a more + permanent location, since the parse buffer is about to be discarded. +*/ +static XML_Bool +storeRawNames(XML_Parser parser) +{ + TAG *tag = tagStack; + while (tag) { + int bufSize; + int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); + char *rawNameBuf = tag->buf + nameLen; + /* Stop if already stored. Since tagStack is a stack, we can stop + at the first entry that has already been copied; everything + below it in the stack is already been accounted for in a + previous call to this function. + */ + if (tag->rawName == rawNameBuf) + break; + /* For re-use purposes we need to ensure that the + size of tag->buf is a multiple of sizeof(XML_Char). + */ + bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); + if (bufSize > tag->bufEnd - tag->buf) { + char *temp = (char *)REALLOC(tag->buf, bufSize); + if (temp == NULL) + return XML_FALSE; + /* if tag->name.str points to tag->buf (only when namespace + processing is off) then we have to update it + */ + if (tag->name.str == (XML_Char *)tag->buf) + tag->name.str = (XML_Char *)temp; + /* if tag->name.localPart is set (when namespace processing is on) + then update it as well, since it will always point into tag->buf + */ + if (tag->name.localPart) + tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - + (XML_Char *)tag->buf); + tag->buf = temp; + tag->bufEnd = temp + bufSize; + rawNameBuf = temp + nameLen; + } + memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); + tag->rawName = rawNameBuf; + tag = tag->parent; + } + return XML_TRUE; +} + +static enum XML_Error PTRCALL +contentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doContent(parser, 0, encoding, start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result == XML_ERROR_NONE) { + if (!storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; + } + return result; +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + processor = externalEntityInitProcessor2; + return externalEntityInitProcessor2(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor2(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + const char *next = start; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(encoding, start, end, &next); + switch (tok) { + case XML_TOK_BOM: + /* If we are at the end of the buffer, this would cause the next stage, + i.e. externalEntityInitProcessor3, to pass control directly to + doContent (by detecting XML_TOK_NONE) without processing any xml text + declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. + */ + if (next == end && !finalBuffer) { + *endPtr = next; + return XML_ERROR_NONE; + } + start = next; + break; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_PARTIAL_CHAR; + } + processor = externalEntityInitProcessor3; + return externalEntityInitProcessor3(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor3(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + int tok; + const char *next = start; /* XmlContentTok doesn't always set the last arg */ + eventPtr = start; + tok = XmlContentTok(encoding, start, end, &next); + eventEndPtr = next; + + switch (tok) { + case XML_TOK_XML_DECL: + { + enum XML_Error result; + result = processXmlDecl(parser, 1, start, next); + if (result != XML_ERROR_NONE) + return result; + switch (parsing) { + case XML_SUSPENDED: + *endPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + start = next; + } + } + break; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + } + processor = externalEntityContentProcessor; + tagLevel = 1; + return externalEntityContentProcessor(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityContentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doContent(parser, 1, encoding, start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result == XML_ERROR_NONE) { + if (!storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; + } + return result; +} + +static enum XML_Error +doContent(XML_Parser parser, + int startTagLevel, + const ENCODING *enc, + const char *s, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + /* save one level of indirection */ + DTD * const dtd = _dtd; + + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + + for (;;) { + const char *next = s; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_TRAILING_CR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + *eventEndPP = end; + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, end); + /* We are at the end of the final buffer, should we check for + XML_SUSPENDED, XML_FINISHED? + */ + if (startTagLevel == 0) + return XML_ERROR_NO_ELEMENTS; + if (tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + *nextPtr = end; + return XML_ERROR_NONE; + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (startTagLevel > 0) { + if (tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_NO_ELEMENTS; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_ENTITY_REF: + { + const XML_Char *name; + ENTITY *entity; + XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (ch) { + if (characterDataHandler) + characterDataHandler(handlerArg, &ch, 1); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + name = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); + poolDiscard(&dtd->pool); + /* First, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity or default handler. + */ + if (!dtd->hasParamEntityRefs || dtd->standalone) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->notation) + return XML_ERROR_BINARY_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + if (!defaultExpandInternalEntities) { + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, entity->name, 0); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + result = processInternalEntity(parser, entity, XML_FALSE); + if (result != XML_ERROR_NONE) + return result; + } + else if (externalEntityRefHandler) { + const XML_Char *context; + entity->open = XML_TRUE; + context = getContext(parser); + entity->open = XML_FALSE; + if (!context) + return XML_ERROR_NO_MEMORY; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + context, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + poolDiscard(&tempPool); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + case XML_TOK_START_TAG_NO_ATTS: + /* fall through */ + case XML_TOK_START_TAG_WITH_ATTS: + { + TAG *tag; + enum XML_Error result; + XML_Char *toPtr; + if (freeTagList) { + tag = freeTagList; + freeTagList = freeTagList->parent; + } + else { + tag = (TAG *)MALLOC(sizeof(TAG)); + if (!tag) + return XML_ERROR_NO_MEMORY; + tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); + if (!tag->buf) { + FREE(tag); + return XML_ERROR_NO_MEMORY; + } + tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; + } + tag->bindings = NULL; + tag->parent = tagStack; + tagStack = tag; + tag->name.localPart = NULL; + tag->name.prefix = NULL; + tag->rawName = s + enc->minBytesPerChar; + tag->rawNameLength = XmlNameLength(enc, tag->rawName); + ++tagLevel; + { + const char *rawNameEnd = tag->rawName + tag->rawNameLength; + const char *fromPtr = tag->rawName; + toPtr = (XML_Char *)tag->buf; + for (;;) { + int bufSize; + int convLen; + XmlConvert(enc, + &fromPtr, rawNameEnd, + (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); + convLen = toPtr - (XML_Char *)tag->buf; + if (fromPtr == rawNameEnd) { + tag->name.strLen = convLen; + break; + } + bufSize = (tag->bufEnd - tag->buf) << 1; + { + char *temp = (char *)REALLOC(tag->buf, bufSize); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + tag->buf = temp; + tag->bufEnd = temp + bufSize; + toPtr = (XML_Char *)temp + convLen; + } + } + } + tag->name.str = (XML_Char *)tag->buf; + *toPtr = XML_T('\0'); + result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); + if (result) + return result; + if (startElementHandler) + startElementHandler(handlerArg, tag->name.str, + (const XML_Char **)atts); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&tempPool); + break; + } + case XML_TOK_EMPTY_ELEMENT_NO_ATTS: + /* fall through */ + case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: + { + const char *rawName = s + enc->minBytesPerChar; + enum XML_Error result; + BINDING *bindings = NULL; + XML_Bool noElmHandlers = XML_TRUE; + TAG_NAME name; + name.str = poolStoreString(&tempPool, enc, rawName, + rawName + XmlNameLength(enc, rawName)); + if (!name.str) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + result = storeAtts(parser, enc, s, &name, &bindings); + if (result) + return result; + poolFinish(&tempPool); + if (startElementHandler) { + startElementHandler(handlerArg, name.str, (const XML_Char **)atts); + noElmHandlers = XML_FALSE; + } + if (endElementHandler) { + if (startElementHandler) + *eventPP = *eventEndPP; + endElementHandler(handlerArg, name.str); + noElmHandlers = XML_FALSE; + } + if (noElmHandlers && defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&tempPool); + while (bindings) { + BINDING *b = bindings; + if (endNamespaceDeclHandler) + endNamespaceDeclHandler(handlerArg, b->prefix->name); + bindings = bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + } + if (tagLevel == 0) + return epilogProcessor(parser, next, end, nextPtr); + break; + case XML_TOK_END_TAG: + if (tagLevel == startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + else { + int len; + const char *rawName; + TAG *tag = tagStack; + tagStack = tag->parent; + tag->parent = freeTagList; + freeTagList = tag; + rawName = s + enc->minBytesPerChar*2; + len = XmlNameLength(enc, rawName); + if (len != tag->rawNameLength + || memcmp(tag->rawName, rawName, len) != 0) { + *eventPP = rawName; + return XML_ERROR_TAG_MISMATCH; + } + --tagLevel; + if (endElementHandler) { + const XML_Char *localPart; + const XML_Char *prefix; + XML_Char *uri; + localPart = tag->name.localPart; + if (ns && localPart) { + /* localPart and prefix may have been overwritten in + tag->name.str, since this points to the binding->uri + buffer which gets re-used; so we have to add them again + */ + uri = (XML_Char *)tag->name.str + tag->name.uriLen; + /* don't need to check for space - already done in storeAtts() */ + while (*localPart) *uri++ = *localPart++; + prefix = (XML_Char *)tag->name.prefix; + if (ns_triplets && prefix) { + *uri++ = namespaceSeparator; + while (*prefix) *uri++ = *prefix++; + } + *uri = XML_T('\0'); + } + endElementHandler(handlerArg, tag->name.str); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + while (tag->bindings) { + BINDING *b = tag->bindings; + if (endNamespaceDeclHandler) + endNamespaceDeclHandler(handlerArg, b->prefix->name); + tag->bindings = tag->bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + if (tagLevel == 0) + return epilogProcessor(parser, next, end, nextPtr); + } + break; + case XML_TOK_CHAR_REF: + { + int n = XmlCharRefNumber(enc, s); + if (n < 0) + return XML_ERROR_BAD_CHAR_REF; + if (characterDataHandler) { + XML_Char buf[XML_ENCODE_MAX]; + characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + } + break; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + case XML_TOK_DATA_NEWLINE: + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_CDATA_SECT_OPEN: + { + enum XML_Error result; + if (startCdataSectionHandler) + startCdataSectionHandler(handlerArg); +#if 0 + /* Suppose you doing a transformation on a document that involves + changing only the character data. You set up a defaultHandler + and a characterDataHandler. The defaultHandler simply copies + characters through. The characterDataHandler does the + transformation and writes the characters out escaping them as + necessary. This case will fail to work if we leave out the + following two lines (because & and < inside CDATA sections will + be incorrectly escaped). + + However, now we have a start/endCdataSectionHandler, so it seems + easier to let the user deal with this. + */ + else if (characterDataHandler) + characterDataHandler(handlerArg, dataBuf, 0); +#endif + else if (defaultHandler) + reportDefault(parser, enc, s, next); + result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (!next) { + processor = cdataSectionProcessor; + return result; + } + } + break; + case XML_TOK_TRAILING_RSQB: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)end - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, end); + /* We are at the end of the final buffer, should we check for + XML_SUSPENDED, XML_FINISHED? + */ + if (startTagLevel == 0) { + *eventPP = end; + return XML_ERROR_NO_ELEMENTS; + } + if (tagLevel != startTagLevel) { + *eventPP = end; + return XML_ERROR_ASYNC_ENTITY; + } + *nextPtr = end; + return XML_ERROR_NONE; + case XML_TOK_DATA_CHARS: + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = s; + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + if (s == next) + break; + *eventPP = s; + } + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)next - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + default: + if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + *eventPP = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } + /* not reached */ +} + +/* Precondition: all arguments must be non-NULL; + Purpose: + - normalize attributes + - check attributes for well-formedness + - generate namespace aware attribute names (URI, prefix) + - build list of attributes for startElementHandler + - default attributes + - process namespace declarations (check and report them) + - generate namespace aware element name (URI, prefix) +*/ +static enum XML_Error +storeAtts(XML_Parser parser, const ENCODING *enc, + const char *attStr, TAG_NAME *tagNamePtr, + BINDING **bindingsPtr) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + ELEMENT_TYPE *elementType; + int nDefaultAtts; + const XML_Char **appAtts; /* the attribute list for the application */ + int attIndex = 0; + int prefixLen; + int i; + int n; + XML_Char *uri; + int nPrefixes = 0; + BINDING *binding; + const XML_Char *localPart; + + /* lookup the element type name */ + elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0); + if (!elementType) { + const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); + if (!name) + return XML_ERROR_NO_MEMORY; + elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name, + sizeof(ELEMENT_TYPE)); + if (!elementType) + return XML_ERROR_NO_MEMORY; + if (ns && !setElementTypePrefix(parser, elementType)) + return XML_ERROR_NO_MEMORY; + } + nDefaultAtts = elementType->nDefaultAtts; + + /* get the attributes from the tokenizer */ + n = XmlGetAttributes(enc, attStr, attsSize, atts); + if (n + nDefaultAtts > attsSize) { + int oldAttsSize = attsSize; + ATTRIBUTE *temp; + attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; + temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + atts = temp; + if (n > oldAttsSize) + XmlGetAttributes(enc, attStr, n, atts); + } + + appAtts = (const XML_Char **)atts; + for (i = 0; i < n; i++) { + /* add the name and value to the attribute list */ + ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, + atts[i].name + + XmlNameLength(enc, atts[i].name)); + if (!attId) + return XML_ERROR_NO_MEMORY; + /* Detect duplicate attributes by their QNames. This does not work when + namespace processing is turned on and different prefixes for the same + namespace are used. For this case we have a check further down. + */ + if ((attId->name)[-1]) { + if (enc == encoding) + eventPtr = atts[i].name; + return XML_ERROR_DUPLICATE_ATTRIBUTE; + } + (attId->name)[-1] = 1; + appAtts[attIndex++] = attId->name; + if (!atts[i].normalized) { + enum XML_Error result; + XML_Bool isCdata = XML_TRUE; + + /* figure out whether declared as other than CDATA */ + if (attId->maybeTokenized) { + int j; + for (j = 0; j < nDefaultAtts; j++) { + if (attId == elementType->defaultAtts[j].id) { + isCdata = elementType->defaultAtts[j].isCdata; + break; + } + } + } + + /* normalize the attribute value */ + result = storeAttributeValue(parser, enc, isCdata, + atts[i].valuePtr, atts[i].valueEnd, + &tempPool); + if (result) + return result; + appAtts[attIndex] = poolStart(&tempPool); + poolFinish(&tempPool); + } + else { + /* the value did not need normalizing */ + appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, + atts[i].valueEnd); + if (appAtts[attIndex] == 0) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + } + /* handle prefixed attribute names */ + if (attId->prefix) { + if (attId->xmlns) { + /* deal with namespace declarations here */ + enum XML_Error result = addBinding(parser, attId->prefix, attId, + appAtts[attIndex], bindingsPtr); + if (result) + return result; + --attIndex; + } + else { + /* deal with other prefixed names later */ + attIndex++; + nPrefixes++; + (attId->name)[-1] = 2; + } + } + else + attIndex++; + } + + /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ + nSpecifiedAtts = attIndex; + if (elementType->idAtt && (elementType->idAtt->name)[-1]) { + for (i = 0; i < attIndex; i += 2) + if (appAtts[i] == elementType->idAtt->name) { + idAttIndex = i; + break; + } + } + else + idAttIndex = -1; + + /* do attribute defaulting */ + for (i = 0; i < nDefaultAtts; i++) { + const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; + if (!(da->id->name)[-1] && da->value) { + if (da->id->prefix) { + if (da->id->xmlns) { + enum XML_Error result = addBinding(parser, da->id->prefix, da->id, + da->value, bindingsPtr); + if (result) + return result; + } + else { + (da->id->name)[-1] = 2; + nPrefixes++; + appAtts[attIndex++] = da->id->name; + appAtts[attIndex++] = da->value; + } + } + else { + (da->id->name)[-1] = 1; + appAtts[attIndex++] = da->id->name; + appAtts[attIndex++] = da->value; + } + } + } + appAtts[attIndex] = 0; + + /* expand prefixed attribute names, check for duplicates, + and clear flags that say whether attributes were specified */ + i = 0; + if (nPrefixes) { + int j; /* hash table index */ + unsigned long version = nsAttsVersion; + int nsAttsSize = (int)1 << nsAttsPower; + /* size of hash table must be at least 2 * (# of prefixed attributes) */ + if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ + NS_ATT *temp; + /* hash table size must also be a power of 2 and >= 8 */ + while (nPrefixes >> nsAttsPower++); + if (nsAttsPower < 3) + nsAttsPower = 3; + nsAttsSize = (int)1 << nsAttsPower; + temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); + if (!temp) + return XML_ERROR_NO_MEMORY; + nsAtts = temp; + version = 0; /* force re-initialization of nsAtts hash table */ + } + /* using a version flag saves us from initializing nsAtts every time */ + if (!version) { /* initialize version flags when version wraps around */ + version = INIT_ATTS_VERSION; + for (j = nsAttsSize; j != 0; ) + nsAtts[--j].version = version; + } + nsAttsVersion = --version; + + /* expand prefixed names and check for duplicates */ + for (; i < attIndex; i += 2) { + const XML_Char *s = appAtts[i]; + if (s[-1] == 2) { /* prefixed */ + ATTRIBUTE_ID *id; + const BINDING *b; + unsigned long uriHash = 0; + ((XML_Char *)s)[-1] = 0; /* clear flag */ + id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0); + b = id->prefix->binding; + if (!b) + return XML_ERROR_UNBOUND_PREFIX; + + /* as we expand the name we also calculate its hash value */ + for (j = 0; j < b->uriLen; j++) { + const XML_Char c = b->uri[j]; + if (!poolAppendChar(&tempPool, c)) + return XML_ERROR_NO_MEMORY; + uriHash = CHAR_HASH(uriHash, c); + } + while (*s++ != XML_T(':')) + ; + do { /* copies null terminator */ + const XML_Char c = *s; + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + uriHash = CHAR_HASH(uriHash, c); + } while (*s++); + + { /* Check hash table for duplicate of expanded name (uriName). + Derived from code in lookup(HASH_TABLE *table, ...). + */ + unsigned char step = 0; + unsigned long mask = nsAttsSize - 1; + j = uriHash & mask; /* index into hash table */ + while (nsAtts[j].version == version) { + /* for speed we compare stored hash values first */ + if (uriHash == nsAtts[j].hash) { + const XML_Char *s1 = poolStart(&tempPool); + const XML_Char *s2 = nsAtts[j].uriName; + /* s1 is null terminated, but not s2 */ + for (; *s1 == *s2 && *s1 != 0; s1++, s2++); + if (*s1 == 0) + return XML_ERROR_DUPLICATE_ATTRIBUTE; + } + if (!step) + step = PROBE_STEP(uriHash, mask, nsAttsPower); + j < step ? ( j += nsAttsSize - step) : (j -= step); + } + } + + if (ns_triplets) { /* append namespace separator and prefix */ + tempPool.ptr[-1] = namespaceSeparator; + s = b->prefix->name; + do { + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + } while (*s++); + } + + /* store expanded name in attribute list */ + s = poolStart(&tempPool); + poolFinish(&tempPool); + appAtts[i] = s; + + /* fill empty slot with new version, uriName and hash value */ + nsAtts[j].version = version; + nsAtts[j].hash = uriHash; + nsAtts[j].uriName = s; + + if (!--nPrefixes) + break; + } + else /* not prefixed */ + ((XML_Char *)s)[-1] = 0; /* clear flag */ + } + } + /* clear flags for the remaining attributes */ + for (; i < attIndex; i += 2) + ((XML_Char *)(appAtts[i]))[-1] = 0; + for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) + binding->attId->name[-1] = 0; + + if (!ns) + return XML_ERROR_NONE; + + /* expand the element type name */ + if (elementType->prefix) { + binding = elementType->prefix->binding; + if (!binding) + return XML_ERROR_UNBOUND_PREFIX; + localPart = tagNamePtr->str; + while (*localPart++ != XML_T(':')) + ; + } + else if (dtd->defaultPrefix.binding) { + binding = dtd->defaultPrefix.binding; + localPart = tagNamePtr->str; + } + else + return XML_ERROR_NONE; + prefixLen = 0; + if (ns_triplets && binding->prefix->name) { + for (; binding->prefix->name[prefixLen++];) + ; + } + tagNamePtr->localPart = localPart; + tagNamePtr->uriLen = binding->uriLen; + tagNamePtr->prefix = binding->prefix->name; + tagNamePtr->prefixLen = prefixLen; + for (i = 0; localPart[i++];) + ; + n = i + binding->uriLen + prefixLen; + if (n > binding->uriAlloc) { + TAG *p; + uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); + if (!uri) + return XML_ERROR_NO_MEMORY; + binding->uriAlloc = n + EXPAND_SPARE; + memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); + for (p = tagStack; p; p = p->parent) + if (p->name.str == binding->uri) + p->name.str = uri; + FREE(binding->uri); + binding->uri = uri; + } + uri = binding->uri + binding->uriLen; + memcpy(uri, localPart, i * sizeof(XML_Char)); + if (prefixLen) { + uri = uri + (i - 1); + if (namespaceSeparator) + *uri = namespaceSeparator; + memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); + } + tagNamePtr->str = binding->uri; + return XML_ERROR_NONE; +} + +/* addBinding() overwrites the value of prefix->binding without checking. + Therefore one must keep track of the old value outside of addBinding(). +*/ +static enum XML_Error +addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, + const XML_Char *uri, BINDING **bindingsPtr) +{ + BINDING *b; + int len; + + /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ + if (*uri == XML_T('\0') && prefix->name) + return XML_ERROR_UNDECLARING_PREFIX; + + for (len = 0; uri[len]; len++) + ; + if (namespaceSeparator) + len++; + if (freeBindingList) { + b = freeBindingList; + if (len > b->uriAlloc) { + XML_Char *temp = (XML_Char *)REALLOC(b->uri, + sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + b->uri = temp; + b->uriAlloc = len + EXPAND_SPARE; + } + freeBindingList = b->nextTagBinding; + } + else { + b = (BINDING *)MALLOC(sizeof(BINDING)); + if (!b) + return XML_ERROR_NO_MEMORY; + b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (!b->uri) { + FREE(b); + return XML_ERROR_NO_MEMORY; + } + b->uriAlloc = len + EXPAND_SPARE; + } + b->uriLen = len; + memcpy(b->uri, uri, len * sizeof(XML_Char)); + if (namespaceSeparator) + b->uri[len - 1] = namespaceSeparator; + b->prefix = prefix; + b->attId = attId; + b->prevPrefixBinding = prefix->binding; + /* NULL binding when default namespace undeclared */ + if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) + prefix->binding = NULL; + else + prefix->binding = b; + b->nextTagBinding = *bindingsPtr; + *bindingsPtr = b; + /* if attId == NULL then we are not starting a namespace scope */ + if (attId && startNamespaceDeclHandler) + startNamespaceDeclHandler(handlerArg, prefix->name, + prefix->binding ? uri : 0); + return XML_ERROR_NONE; +} + +/* The idea here is to avoid using stack for each CDATA section when + the whole file is parsed with one call. +*/ +static enum XML_Error PTRCALL +cdataSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doCdataSection(parser, encoding, &start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result != XML_ERROR_NONE) + return result; + if (start) { + if (parentParser) { /* we are parsing an external entity */ + processor = externalEntityContentProcessor; + return externalEntityContentProcessor(parser, start, end, endPtr); + } + else { + processor = contentProcessor; + return contentProcessor(parser, start, end, endPtr); + } + } + return result; +} + +/* startPtr gets set to non-null if the section is closed, and to null if + the section is not yet closed. +*/ +static enum XML_Error +doCdataSection(XML_Parser parser, + const ENCODING *enc, + const char **startPtr, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + const char *s = *startPtr; + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + *eventPP = s; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + *startPtr = NULL; + + for (;;) { + const char *next; + int tok = XmlCdataSectionTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_CDATA_SECT_CLOSE: + if (endCdataSectionHandler) + endCdataSectionHandler(handlerArg); +#if 0 + /* see comment under XML_TOK_CDATA_SECT_OPEN */ + else if (characterDataHandler) + characterDataHandler(handlerArg, dataBuf, 0); +#endif + else if (defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + *nextPtr = next; + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + else + return XML_ERROR_NONE; + case XML_TOK_DATA_NEWLINE: + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_DATA_CHARS: + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = next; + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + if (s == next) + break; + *eventPP = s; + } + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)next - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_CDATA_SECTION; + default: + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + } + + *eventPP = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } + /* not reached */ +} + +#ifdef XML_DTD + +/* The idea here is to avoid using stack for each IGNORE section when + the whole file is parsed with one call. +*/ +static enum XML_Error PTRCALL +ignoreSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result != XML_ERROR_NONE) + return result; + if (start) { + processor = prologProcessor; + return prologProcessor(parser, start, end, endPtr); + } + return result; +} + +/* startPtr gets set to non-null is the section is closed, and to null + if the section is not yet closed. +*/ +static enum XML_Error +doIgnoreSection(XML_Parser parser, + const ENCODING *enc, + const char **startPtr, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + const char *next; + int tok; + const char *s = *startPtr; + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + *eventPP = s; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + *startPtr = NULL; + tok = XmlIgnoreSectionTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_IGNORE_SECT: + if (defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + *nextPtr = next; + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + else + return XML_ERROR_NONE; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ + default: + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + } + /* not reached */ +} + +#endif /* XML_DTD */ + +static enum XML_Error +initializeEncoding(XML_Parser parser) +{ + const char *s; +#ifdef XML_UNICODE + char encodingBuf[128]; + if (!protocolEncodingName) + s = NULL; + else { + int i; + for (i = 0; protocolEncodingName[i]; i++) { + if (i == sizeof(encodingBuf) - 1 + || (protocolEncodingName[i] & ~0x7f) != 0) { + encodingBuf[0] = '\0'; + break; + } + encodingBuf[i] = (char)protocolEncodingName[i]; + } + encodingBuf[i] = '\0'; + s = encodingBuf; + } +#else + s = protocolEncodingName; +#endif + if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) + return XML_ERROR_NONE; + return handleUnknownEncoding(parser, protocolEncodingName); +} + +static enum XML_Error +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next) +{ + const char *encodingName = NULL; + const XML_Char *storedEncName = NULL; + const ENCODING *newEncoding = NULL; + const char *version = NULL; + const char *versionend; + const XML_Char *storedversion = NULL; + int standalone = -1; + if (!(ns + ? XmlParseXmlDeclNS + : XmlParseXmlDecl)(isGeneralTextEntity, + encoding, + s, + next, + &eventPtr, + &version, + &versionend, + &encodingName, + &newEncoding, + &standalone)) { + if (isGeneralTextEntity) + return XML_ERROR_TEXT_DECL; + else + return XML_ERROR_XML_DECL; + } + if (!isGeneralTextEntity && standalone == 1) { + _dtd->standalone = XML_TRUE; +#ifdef XML_DTD + if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) + paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; +#endif /* XML_DTD */ + } + if (xmlDeclHandler) { + if (encodingName != NULL) { + storedEncName = poolStoreString(&temp2Pool, + encoding, + encodingName, + encodingName + + XmlNameLength(encoding, encodingName)); + if (!storedEncName) + return XML_ERROR_NO_MEMORY; + poolFinish(&temp2Pool); + } + if (version) { + storedversion = poolStoreString(&temp2Pool, + encoding, + version, + versionend - encoding->minBytesPerChar); + if (!storedversion) + return XML_ERROR_NO_MEMORY; + } + xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); + } + else if (defaultHandler) + reportDefault(parser, encoding, s, next); + if (protocolEncodingName == NULL) { + if (newEncoding) { + if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { + eventPtr = encodingName; + return XML_ERROR_INCORRECT_ENCODING; + } + encoding = newEncoding; + } + else if (encodingName) { + enum XML_Error result; + if (!storedEncName) { + storedEncName = poolStoreString( + &temp2Pool, encoding, encodingName, + encodingName + XmlNameLength(encoding, encodingName)); + if (!storedEncName) + return XML_ERROR_NO_MEMORY; + } + result = handleUnknownEncoding(parser, storedEncName); + poolClear(&temp2Pool); + if (result == XML_ERROR_UNKNOWN_ENCODING) + eventPtr = encodingName; + return result; + } + } + + if (storedEncName || storedversion) + poolClear(&temp2Pool); + + return XML_ERROR_NONE; +} + +static enum XML_Error +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) +{ + if (unknownEncodingHandler) { + XML_Encoding info; + int i; + for (i = 0; i < 256; i++) + info.map[i] = -1; + info.convert = NULL; + info.data = NULL; + info.release = NULL; + if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, + &info)) { + ENCODING *enc; + unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); + if (!unknownEncodingMem) { + if (info.release) + info.release(info.data); + return XML_ERROR_NO_MEMORY; + } + enc = (ns + ? XmlInitUnknownEncodingNS + : XmlInitUnknownEncoding)(unknownEncodingMem, + info.map, + info.convert, + info.data); + if (enc) { + unknownEncodingData = info.data; + unknownEncodingRelease = info.release; + encoding = enc; + return XML_ERROR_NONE; + } + } + if (info.release != NULL) + info.release(info.data); + } + return XML_ERROR_UNKNOWN_ENCODING; +} + +static enum XML_Error PTRCALL +prologInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + processor = prologProcessor; + return prologProcessor(parser, s, end, nextPtr); +} + +#ifdef XML_DTD + +static enum XML_Error PTRCALL +externalParEntInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + + /* we know now that XML_Parse(Buffer) has been called, + so we consider the external parameter entity read */ + _dtd->paramEntityRead = XML_TRUE; + + if (prologState.inEntityValue) { + processor = entityValueInitProcessor; + return entityValueInitProcessor(parser, s, end, nextPtr); + } + else { + processor = externalParEntProcessor; + return externalParEntProcessor(parser, s, end, nextPtr); + } +} + +static enum XML_Error PTRCALL +entityValueInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + int tok; + const char *start = s; + const char *next = start; + eventPtr = start; + + for (;;) { + tok = XmlPrologTok(encoding, start, end, &next); + eventEndPtr = next; + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + /* found end of entity value - can store it now */ + return storeEntityValue(parser, encoding, s, end); + } + else if (tok == XML_TOK_XML_DECL) { + enum XML_Error result; + result = processXmlDecl(parser, 0, start, next); + if (result != XML_ERROR_NONE) + return result; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + *nextPtr = next; + } + /* stop scanning for text declaration - we found one */ + processor = entityValueProcessor; + return entityValueProcessor(parser, next, end, nextPtr); + } + /* If we are at the end of the buffer, this would cause XmlPrologTok to + return XML_TOK_NONE on the next call, which would then cause the + function to exit with *nextPtr set to s - that is what we want for other + tokens, but not for the BOM - we would rather like to skip it; + then, when this routine is entered the next time, XmlPrologTok will + return XML_TOK_INVALID, since the BOM is still in the buffer + */ + else if (tok == XML_TOK_BOM && next == end && !finalBuffer) { + *nextPtr = next; + return XML_ERROR_NONE; + } + start = next; + eventPtr = start; + } +} + +static enum XML_Error PTRCALL +externalParEntProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *next = s; + int tok; + + tok = XmlPrologTok(encoding, s, end, &next); + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + } + /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. + However, when parsing an external subset, doProlog will not accept a BOM + as valid, and report a syntax error, so we have to skip the BOM + */ + else if (tok == XML_TOK_BOM) { + s = next; + tok = XmlPrologTok(encoding, s, end, &next); + } + + processor = prologProcessor; + return doProlog(parser, encoding, s, end, tok, next, + nextPtr, (XML_Bool)!finalBuffer); +} + +static enum XML_Error PTRCALL +entityValueProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *start = s; + const char *next = s; + const ENCODING *enc = encoding; + int tok; + + for (;;) { + tok = XmlPrologTok(enc, start, end, &next); + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + /* found end of entity value - can store it now */ + return storeEntityValue(parser, enc, s, end); + } + start = next; + } +} + +#endif /* XML_DTD */ + +static enum XML_Error PTRCALL +prologProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *next = s; + int tok = XmlPrologTok(encoding, s, end, &next); + return doProlog(parser, encoding, s, end, tok, next, + nextPtr, (XML_Bool)!finalBuffer); +} + +static enum XML_Error +doProlog(XML_Parser parser, + const ENCODING *enc, + const char *s, + const char *end, + int tok, + const char *next, + const char **nextPtr, + XML_Bool haveMore) +{ +#ifdef XML_DTD + static const XML_Char externalSubsetName[] = { '#' , '\0' }; +#endif /* XML_DTD */ + static const XML_Char atypeCDATA[] = { 'C', 'D', 'A', 'T', 'A', '\0' }; + static const XML_Char atypeID[] = { 'I', 'D', '\0' }; + static const XML_Char atypeIDREF[] = { 'I', 'D', 'R', 'E', 'F', '\0' }; + static const XML_Char atypeIDREFS[] = { 'I', 'D', 'R', 'E', 'F', 'S', '\0' }; + static const XML_Char atypeENTITY[] = { 'E', 'N', 'T', 'I', 'T', 'Y', '\0' }; + static const XML_Char atypeENTITIES[] = + { 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S', '\0' }; + static const XML_Char atypeNMTOKEN[] = { + 'N', 'M', 'T', 'O', 'K', 'E', 'N', '\0' }; + static const XML_Char atypeNMTOKENS[] = { + 'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S', '\0' }; + static const XML_Char notationPrefix[] = { + 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N', '(', '\0' }; + static const XML_Char enumValueSep[] = { '|', '\0' }; + static const XML_Char enumValueStart[] = { '(', '\0' }; + + /* save one level of indirection */ + DTD * const dtd = _dtd; + + const char **eventPP; + const char **eventEndPP; + enum XML_Content_Quant quant; + + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + + for (;;) { + int role; + XML_Bool handleDefault = XML_TRUE; + *eventPP = s; + *eventEndPP = next; + if (tok <= 0) { + if (haveMore && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: +#ifdef XML_DTD + /* for internal PE NOT referenced between declarations */ + if (enc != encoding && !openInternalEntities->betweenDecl) { + *nextPtr = s; + return XML_ERROR_NONE; + } + /* WFC: PE Between Declarations - must check that PE contains + complete markup, not only for external PEs, but also for + internal PEs if the reference occurs between declarations. + */ + if (isParamEntity || enc != encoding) { + if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) + == XML_ROLE_ERROR) + return XML_ERROR_INCOMPLETE_PE; + *nextPtr = s; + return XML_ERROR_NONE; + } +#endif /* XML_DTD */ + return XML_ERROR_NO_ELEMENTS; + default: + tok = -tok; + next = end; + break; + } + } + role = XmlTokenRole(&prologState, tok, s, next, enc); + switch (role) { + case XML_ROLE_XML_DECL: + { + enum XML_Error result = processXmlDecl(parser, 0, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = encoding; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_DOCTYPE_NAME: + if (startDoctypeDeclHandler) { + doctypeName = poolStoreString(&tempPool, enc, s, next); + if (!doctypeName) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + doctypePubid = NULL; + handleDefault = XML_FALSE; + } + doctypeSysid = NULL; /* always initialize to NULL */ + break; + case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: + if (startDoctypeDeclHandler) { + startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, + doctypePubid, 1); + doctypeName = NULL; + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + break; +#ifdef XML_DTD + case XML_ROLE_TEXT_DECL: + { + enum XML_Error result = processXmlDecl(parser, 1, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = encoding; + handleDefault = XML_FALSE; + } + break; +#endif /* XML_DTD */ + case XML_ROLE_DOCTYPE_PUBLIC_ID: +#ifdef XML_DTD + useForeignDTD = XML_FALSE; + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (startDoctypeDeclHandler) { + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_PUBLICID; + doctypePubid = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!doctypePubid) + return XML_ERROR_NO_MEMORY; + normalizePublicId((XML_Char *)doctypePubid); + poolFinish(&tempPool); + handleDefault = XML_FALSE; + goto alreadyChecked; + } + /* fall through */ + case XML_ROLE_ENTITY_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_PUBLICID; + alreadyChecked: + if (dtd->keepProcessing && declEntity) { + XML_Char *tem = poolStoreString(&dtd->pool, + enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) + return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + declEntity->publicId = tem; + poolFinish(&dtd->pool); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_DOCTYPE_CLOSE: + if (doctypeName) { + startDoctypeDeclHandler(handlerArg, doctypeName, + doctypeSysid, doctypePubid, 0); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + /* doctypeSysid will be non-NULL in the case of a previous + XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler + was not set, indicating an external subset + */ +#ifdef XML_DTD + if (doctypeSysid || useForeignDTD) { + dtd->hasParamEntityRefs = XML_TRUE; /* when docTypeSysid == NULL */ + if (paramEntityParsing && externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!entity) + return XML_ERROR_NO_MEMORY; + if (useForeignDTD) + entity->base = curBase; + dtd->paramEntityRead = XML_FALSE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead && + !dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + /* end of DTD - no need to update dtd->keepProcessing */ + } + useForeignDTD = XML_FALSE; + } +#endif /* XML_DTD */ + if (endDoctypeDeclHandler) { + endDoctypeDeclHandler(handlerArg); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_INSTANCE_START: +#ifdef XML_DTD + /* if there is no DOCTYPE declaration then now is the + last chance to read the foreign DTD + */ + if (useForeignDTD) { + dtd->hasParamEntityRefs = XML_TRUE; + if (paramEntityParsing && externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!entity) + return XML_ERROR_NO_MEMORY; + entity->base = curBase; + dtd->paramEntityRead = XML_FALSE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead && + !dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + /* end of DTD - no need to update dtd->keepProcessing */ + } + } +#endif /* XML_DTD */ + processor = contentProcessor; + return contentProcessor(parser, s, end, nextPtr); + case XML_ROLE_ATTLIST_ELEMENT_NAME: + declElementType = getElementType(parser, enc, s, next); + if (!declElementType) + return XML_ERROR_NO_MEMORY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_NAME: + declAttributeId = getAttributeId(parser, enc, s, next); + if (!declAttributeId) + return XML_ERROR_NO_MEMORY; + declAttributeIsCdata = XML_FALSE; + declAttributeType = NULL; + declAttributeIsId = XML_FALSE; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_CDATA: + declAttributeIsCdata = XML_TRUE; + declAttributeType = atypeCDATA; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ID: + declAttributeIsId = XML_TRUE; + declAttributeType = atypeID; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREF: + declAttributeType = atypeIDREF; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: + declAttributeType = atypeIDREFS; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: + declAttributeType = atypeENTITY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: + declAttributeType = atypeENTITIES; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: + declAttributeType = atypeNMTOKEN; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: + declAttributeType = atypeNMTOKENS; + checkAttListDeclHandler: + if (dtd->keepProcessing && attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTRIBUTE_ENUM_VALUE: + case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: + if (dtd->keepProcessing && attlistDeclHandler) { + const XML_Char *prefix; + if (declAttributeType) { + prefix = enumValueSep; + } + else { + prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE + ? notationPrefix + : enumValueStart); + } + if (!poolAppendString(&tempPool, prefix)) + return XML_ERROR_NO_MEMORY; + if (!poolAppend(&tempPool, enc, s, next)) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: + case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + if (!defineAttribute(declElementType, declAttributeId, + declAttributeIsCdata, declAttributeIsId, + 0, parser)) + return XML_ERROR_NO_MEMORY; + if (attlistDeclHandler && declAttributeType) { + if (*declAttributeType == XML_T('(') + || (*declAttributeType == XML_T('N') + && declAttributeType[1] == XML_T('O'))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&tempPool, XML_T(')')) + || !poolAppendChar(&tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + poolFinish(&tempPool); + } + *eventEndPP = s; + attlistDeclHandler(handlerArg, declElementType->name, + declAttributeId->name, declAttributeType, + 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: + case XML_ROLE_FIXED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + const XML_Char *attVal; + enum XML_Error result = + storeAttributeValue(parser, enc, declAttributeIsCdata, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar, + &dtd->pool); + if (result) + return result; + attVal = poolStart(&dtd->pool); + poolFinish(&dtd->pool); + /* ID attributes aren't allowed to have a default */ + if (!defineAttribute(declElementType, declAttributeId, + declAttributeIsCdata, XML_FALSE, attVal, parser)) + return XML_ERROR_NO_MEMORY; + if (attlistDeclHandler && declAttributeType) { + if (*declAttributeType == XML_T('(') + || (*declAttributeType == XML_T('N') + && declAttributeType[1] == XML_T('O'))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&tempPool, XML_T(')')) + || !poolAppendChar(&tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + poolFinish(&tempPool); + } + *eventEndPP = s; + attlistDeclHandler(handlerArg, declElementType->name, + declAttributeId->name, declAttributeType, + attVal, + role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_ENTITY_VALUE: + if (dtd->keepProcessing) { + enum XML_Error result = storeEntityValue(parser, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (declEntity) { + declEntity->textPtr = poolStart(&dtd->entityValuePool); + declEntity->textLen = poolLength(&dtd->entityValuePool); + poolFinish(&dtd->entityValuePool); + if (entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + declEntity->is_param, + declEntity->textPtr, + declEntity->textLen, + curBase, 0, 0, 0); + handleDefault = XML_FALSE; + } + } + else + poolDiscard(&dtd->entityValuePool); + if (result != XML_ERROR_NONE) + return result; + } + break; + case XML_ROLE_DOCTYPE_SYSTEM_ID: +#ifdef XML_DTD + useForeignDTD = XML_FALSE; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (startDoctypeDeclHandler) { + doctypeSysid = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (doctypeSysid == NULL) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } +#ifdef XML_DTD + else + /* use externalSubsetName to make doctypeSysid non-NULL + for the case where no startDoctypeDeclHandler is set */ + doctypeSysid = externalSubsetName; +#endif /* XML_DTD */ + if (!dtd->standalone +#ifdef XML_DTD + && !paramEntityParsing +#endif /* XML_DTD */ + && notStandaloneHandler + && !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; +#ifndef XML_DTD + break; +#else /* XML_DTD */ + if (!declEntity) { + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + declEntity->publicId = NULL; + } + /* fall through */ +#endif /* XML_DTD */ + case XML_ROLE_ENTITY_SYSTEM_ID: + if (dtd->keepProcessing && declEntity) { + declEntity->systemId = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!declEntity->systemId) + return XML_ERROR_NO_MEMORY; + declEntity->base = curBase; + poolFinish(&dtd->pool); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_COMPLETE: + if (dtd->keepProcessing && declEntity && entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + declEntity->is_param, + 0,0, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + 0); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_NOTATION_NAME: + if (dtd->keepProcessing && declEntity) { + declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); + if (!declEntity->notation) + return XML_ERROR_NO_MEMORY; + poolFinish(&dtd->pool); + if (unparsedEntityDeclHandler) { + *eventEndPP = s; + unparsedEntityDeclHandler(handlerArg, + declEntity->name, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + declEntity->notation); + handleDefault = XML_FALSE; + } + else if (entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + 0,0,0, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + declEntity->notation); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_GENERAL_ENTITY_NAME: + { + if (XmlPredefinedEntityName(enc, s, next)) { + declEntity = NULL; + break; + } + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) + return XML_ERROR_NO_MEMORY; + declEntity = (ENTITY *)lookup(&dtd->generalEntities, name, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + if (declEntity->name != name) { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + else { + poolFinish(&dtd->pool); + declEntity->publicId = NULL; + declEntity->is_param = XML_FALSE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + declEntity->is_internal = !(parentParser || openInternalEntities); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + } + else { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + } + break; + case XML_ROLE_PARAM_ENTITY_NAME: +#ifdef XML_DTD + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) + return XML_ERROR_NO_MEMORY; + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + name, sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + if (declEntity->name != name) { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + else { + poolFinish(&dtd->pool); + declEntity->publicId = NULL; + declEntity->is_param = XML_TRUE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + declEntity->is_internal = !(parentParser || openInternalEntities); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + } + else { + poolDiscard(&dtd->pool); + declEntity = NULL; + } +#else /* not XML_DTD */ + declEntity = NULL; +#endif /* XML_DTD */ + break; + case XML_ROLE_NOTATION_NAME: + declNotationPublicId = NULL; + declNotationName = NULL; + if (notationDeclHandler) { + declNotationName = poolStoreString(&tempPool, enc, s, next); + if (!declNotationName) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_PUBLICID; + if (declNotationName) { /* means notationDeclHandler != NULL */ + XML_Char *tem = poolStoreString(&tempPool, + enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) + return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + declNotationPublicId = tem; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_SYSTEM_ID: + if (declNotationName && notationDeclHandler) { + const XML_Char *systemId + = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!systemId) + return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + notationDeclHandler(handlerArg, + declNotationName, + curBase, + systemId, + declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&tempPool); + break; + case XML_ROLE_NOTATION_NO_SYSTEM_ID: + if (declNotationPublicId && notationDeclHandler) { + *eventEndPP = s; + notationDeclHandler(handlerArg, + declNotationName, + curBase, + 0, + declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&tempPool); + break; + case XML_ROLE_ERROR: + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: + /* PE references in internal subset are + not allowed within declarations. */ + return XML_ERROR_PARAM_ENTITY_REF; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + default: + return XML_ERROR_SYNTAX; + } +#ifdef XML_DTD + case XML_ROLE_IGNORE_SECT: + { + enum XML_Error result; + if (defaultHandler) + reportDefault(parser, enc, s, next); + handleDefault = XML_FALSE; + result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (!next) { + processor = ignoreSectionProcessor; + return result; + } + } + break; +#endif /* XML_DTD */ + case XML_ROLE_GROUP_OPEN: + if (prologState.level >= groupSize) { + if (groupSize) { + char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + groupConnector = temp; + if (dtd->scaffIndex) { + int *temp = (int *)REALLOC(dtd->scaffIndex, + groupSize * sizeof(int)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + dtd->scaffIndex = temp; + } + } + else { + groupConnector = (char *)MALLOC(groupSize = 32); + if (!groupConnector) + return XML_ERROR_NO_MEMORY; + } + } + groupConnector[prologState.level] = 0; + if (dtd->in_eldecl) { + int myindex = nextScaffoldPart(parser); + if (myindex < 0) + return XML_ERROR_NO_MEMORY; + dtd->scaffIndex[dtd->scaffLevel] = myindex; + dtd->scaffLevel++; + dtd->scaffold[myindex].type = XML_CTYPE_SEQ; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_GROUP_SEQUENCE: + if (groupConnector[prologState.level] == '|') + return XML_ERROR_SYNTAX; + groupConnector[prologState.level] = ','; + if (dtd->in_eldecl && elementDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_GROUP_CHOICE: + if (groupConnector[prologState.level] == ',') + return XML_ERROR_SYNTAX; + if (dtd->in_eldecl + && !groupConnector[prologState.level] + && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + != XML_CTYPE_MIXED) + ) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + = XML_CTYPE_CHOICE; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + groupConnector[prologState.level] = '|'; + break; + case XML_ROLE_PARAM_ENTITY_REF: +#ifdef XML_DTD + case XML_ROLE_INNER_PARAM_ENTITY_REF: + dtd->hasParamEntityRefs = XML_TRUE; + if (!paramEntityParsing) + dtd->keepProcessing = dtd->standalone; + else { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); + poolDiscard(&dtd->pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity handler + */ + if (prologState.documentEntity && + (dtd->standalone + ? !openInternalEntities + : !dtd->hasParamEntityRefs)) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + dtd->keepProcessing = dtd->standalone; + /* cannot report skipped entities in declarations */ + if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { + skippedEntityHandler(handlerArg, name, 1); + handleDefault = XML_FALSE; + } + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + XML_Bool betweenDecl = + (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); + result = processInternalEntity(parser, entity, betweenDecl); + if (result != XML_ERROR_NONE) + return result; + handleDefault = XML_FALSE; + break; + } + if (externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) { + entity->open = XML_FALSE; + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + } + entity->open = XML_FALSE; + handleDefault = XML_FALSE; + if (!dtd->paramEntityRead) { + dtd->keepProcessing = dtd->standalone; + break; + } + } + else { + dtd->keepProcessing = dtd->standalone; + break; + } + } +#endif /* XML_DTD */ + if (!dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + break; + + /* Element declaration stuff */ + + case XML_ROLE_ELEMENT_NAME: + if (elementDeclHandler) { + declElementType = getElementType(parser, enc, s, next); + if (!declElementType) + return XML_ERROR_NO_MEMORY; + dtd->scaffLevel = 0; + dtd->scaffCount = 0; + dtd->in_eldecl = XML_TRUE; + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ANY: + case XML_ROLE_CONTENT_EMPTY: + if (dtd->in_eldecl) { + if (elementDeclHandler) { + XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); + if (!content) + return XML_ERROR_NO_MEMORY; + content->quant = XML_CQUANT_NONE; + content->name = NULL; + content->numchildren = 0; + content->children = NULL; + content->type = ((role == XML_ROLE_CONTENT_ANY) ? + XML_CTYPE_ANY : + XML_CTYPE_EMPTY); + *eventEndPP = s; + elementDeclHandler(handlerArg, declElementType->name, content); + handleDefault = XML_FALSE; + } + dtd->in_eldecl = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_PCDATA: + if (dtd->in_eldecl) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + = XML_CTYPE_MIXED; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ELEMENT: + quant = XML_CQUANT_NONE; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_OPT: + quant = XML_CQUANT_OPT; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_REP: + quant = XML_CQUANT_REP; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_PLUS: + quant = XML_CQUANT_PLUS; + elementContent: + if (dtd->in_eldecl) { + ELEMENT_TYPE *el; + const XML_Char *name; + int nameLen; + const char *nxt = (quant == XML_CQUANT_NONE + ? next + : next - enc->minBytesPerChar); + int myindex = nextScaffoldPart(parser); + if (myindex < 0) + return XML_ERROR_NO_MEMORY; + dtd->scaffold[myindex].type = XML_CTYPE_NAME; + dtd->scaffold[myindex].quant = quant; + el = getElementType(parser, enc, s, nxt); + if (!el) + return XML_ERROR_NO_MEMORY; + name = el->name; + dtd->scaffold[myindex].name = name; + nameLen = 0; + for (; name[nameLen++]; ); + dtd->contentStringLen += nameLen; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_GROUP_CLOSE: + quant = XML_CQUANT_NONE; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_OPT: + quant = XML_CQUANT_OPT; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_REP: + quant = XML_CQUANT_REP; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_PLUS: + quant = XML_CQUANT_PLUS; + closeGroup: + if (dtd->in_eldecl) { + if (elementDeclHandler) + handleDefault = XML_FALSE; + dtd->scaffLevel--; + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; + if (dtd->scaffLevel == 0) { + if (!handleDefault) { + XML_Content *model = build_model(parser); + if (!model) + return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + elementDeclHandler(handlerArg, declElementType->name, model); + } + dtd->in_eldecl = XML_FALSE; + dtd->contentStringLen = 0; + } + } + break; + /* End element declaration stuff */ + + case XML_ROLE_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + handleDefault = XML_FALSE; + break; + case XML_ROLE_COMMENT: + if (!reportComment(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + handleDefault = XML_FALSE; + break; + case XML_ROLE_NONE: + switch (tok) { + case XML_TOK_BOM: + handleDefault = XML_FALSE; + break; + } + break; + case XML_ROLE_DOCTYPE_NONE: + if (startDoctypeDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ENTITY_NONE: + if (dtd->keepProcessing && entityDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_NOTATION_NONE: + if (notationDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTLIST_NONE: + if (dtd->keepProcessing && attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ELEMENT_NONE: + if (elementDeclHandler) + handleDefault = XML_FALSE; + break; + } /* end of big switch */ + + if (handleDefault && defaultHandler) + reportDefault(parser, enc, s, next); + + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + s = next; + tok = XmlPrologTok(enc, s, end, &next); + } + } + /* not reached */ +} + +static enum XML_Error PTRCALL +epilogProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + processor = epilogProcessor; + eventPtr = s; + for (;;) { + const char *next = NULL; + int tok = XmlPrologTok(encoding, s, end, &next); + eventEndPtr = next; + switch (tok) { + /* report partial linebreak - it might be the last token */ + case -XML_TOK_PROLOG_S: + if (defaultHandler) { + reportDefault(parser, encoding, s, next); + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + } + *nextPtr = next; + return XML_ERROR_NONE; + case XML_TOK_NONE: + *nextPtr = s; + return XML_ERROR_NONE; + case XML_TOK_PROLOG_S: + if (defaultHandler) + reportDefault(parser, encoding, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_INVALID: + eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + default: + return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; + } + eventPtr = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } +} + +static enum XML_Error +processInternalEntity(XML_Parser parser, ENTITY *entity, + XML_Bool betweenDecl) +{ + const char *textStart, *textEnd; + const char *next; + enum XML_Error result; + OPEN_INTERNAL_ENTITY *openEntity; + + if (freeInternalEntities) { + openEntity = freeInternalEntities; + freeInternalEntities = openEntity->next; + } + else { + openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY)); + if (!openEntity) + return XML_ERROR_NO_MEMORY; + } + entity->open = XML_TRUE; + entity->processed = 0; + openEntity->next = openInternalEntities; + openInternalEntities = openEntity; + openEntity->entity = entity; + openEntity->startTagLevel = tagLevel; + openEntity->betweenDecl = betweenDecl; + openEntity->internalEventPtr = NULL; + openEntity->internalEventEndPtr = NULL; + textStart = (char *)entity->textPtr; + textEnd = (char *)(entity->textPtr + entity->textLen); + +#ifdef XML_DTD + if (entity->is_param) { + int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); + result = doProlog(parser, internalEncoding, textStart, textEnd, tok, + next, &next, XML_FALSE); + } + else +#endif /* XML_DTD */ + result = doContent(parser, tagLevel, internalEncoding, textStart, + textEnd, &next, XML_FALSE); + + if (result == XML_ERROR_NONE) { + if (textEnd != next && parsing == XML_SUSPENDED) { + entity->processed = next - textStart; + processor = internalEntityProcessor; + } + else { + entity->open = XML_FALSE; + openInternalEntities = openEntity->next; + /* put openEntity back in list of free instances */ + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + } + return result; +} + +static enum XML_Error PTRCALL +internalEntityProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + ENTITY *entity; + const char *textStart, *textEnd; + const char *next; + enum XML_Error result; + OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities; + if (!openEntity) + return XML_ERROR_UNEXPECTED_STATE; + + entity = openEntity->entity; + textStart = ((char *)entity->textPtr) + entity->processed; + textEnd = (char *)(entity->textPtr + entity->textLen); + +#ifdef XML_DTD + if (entity->is_param) { + int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); + result = doProlog(parser, internalEncoding, textStart, textEnd, tok, + next, &next, XML_FALSE); + } + else +#endif /* XML_DTD */ + result = doContent(parser, openEntity->startTagLevel, internalEncoding, + textStart, textEnd, &next, XML_FALSE); + + if (result != XML_ERROR_NONE) + return result; + else if (textEnd != next && parsing == XML_SUSPENDED) { + entity->processed = next - (char *)entity->textPtr; + return result; + } + else { + entity->open = XML_FALSE; + openInternalEntities = openEntity->next; + /* put openEntity back in list of free instances */ + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + +#ifdef XML_DTD + if (entity->is_param) { + int tok; + processor = prologProcessor; + tok = XmlPrologTok(encoding, s, end, &next); + return doProlog(parser, encoding, s, end, tok, next, nextPtr, + (XML_Bool)!finalBuffer); + } + else +#endif /* XML_DTD */ + { + processor = contentProcessor; + /* see externalEntityContentProcessor vs contentProcessor */ + return doContent(parser, parentParser ? 1 : 0, encoding, s, end, + nextPtr, (XML_Bool)!finalBuffer); + } +} + +static enum XML_Error PTRCALL +errorProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + return errorCode; +} + +static enum XML_Error +storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) +{ + enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, + end, pool); + if (result) + return result; + if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) + poolChop(pool); + if (!poolAppendChar(pool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + return XML_ERROR_NONE; +} + +static enum XML_Error +appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + for (;;) { + const char *next; + int tok = XmlAttributeValueTok(enc, ptr, end, &next); + switch (tok) { + case XML_TOK_NONE: + return XML_ERROR_NONE; + case XML_TOK_INVALID: + if (enc == encoding) + eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_CHAR_REF: + { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, ptr); + if (n < 0) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; + } + if (!isCdata + && n == 0x20 /* space */ + && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + n = XmlEncode(n, (ICHAR *)buf); + if (!n) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; + } + for (i = 0; i < n; i++) { + if (!poolAppendChar(pool, buf[i])) + return XML_ERROR_NO_MEMORY; + } + } + break; + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, ptr, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_TRAILING_CR: + next = ptr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_ATTRIBUTE_VALUE_S: + case XML_TOK_DATA_NEWLINE: + if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + if (!poolAppendChar(pool, 0x20)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_ENTITY_REF: + { + const XML_Char *name; + ENTITY *entity; + char checkEntityDecl; + XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (ch) { + if (!poolAppendChar(pool, ch)) + return XML_ERROR_NO_MEMORY; + break; + } + name = poolStoreString(&temp2Pool, enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); + poolDiscard(&temp2Pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the default handler (if called from content) + */ + if (pool == &dtd->pool) /* are we called from prolog? */ + checkEntityDecl = +#ifdef XML_DTD + prologState.documentEntity && +#endif /* XML_DTD */ + (dtd->standalone + ? !openInternalEntities + : !dtd->hasParamEntityRefs); + else /* if (pool == &tempPool): we are called from content */ + checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; + if (checkEntityDecl) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + /* cannot report skipped entity here - see comments on + skippedEntityHandler + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + */ + if ((pool == &tempPool) && defaultHandler) + reportDefault(parser, enc, ptr, next); + break; + } + if (entity->open) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_RECURSIVE_ENTITY_REF; + } + if (entity->notation) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BINARY_ENTITY_REF; + } + if (!entity->textPtr) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; + } + else { + enum XML_Error result; + const XML_Char *textEnd = entity->textPtr + entity->textLen; + entity->open = XML_TRUE; + result = appendAttributeValue(parser, internalEncoding, isCdata, + (char *)entity->textPtr, + (char *)textEnd, pool); + entity->open = XML_FALSE; + if (result) + return result; + } + } + break; + default: + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_UNEXPECTED_STATE; + } + ptr = next; + } + /* not reached */ +} + +static enum XML_Error +storeEntityValue(XML_Parser parser, + const ENCODING *enc, + const char *entityTextPtr, + const char *entityTextEnd) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + STRING_POOL *pool = &(dtd->entityValuePool); + enum XML_Error result = XML_ERROR_NONE; +#ifdef XML_DTD + int oldInEntityValue = prologState.inEntityValue; + prologState.inEntityValue = 1; +#endif /* XML_DTD */ + /* never return Null for the value argument in EntityDeclHandler, + since this would indicate an external entity; therefore we + have to make sure that entityValuePool.start is not null */ + if (!pool->blocks) { + if (!poolGrow(pool)) + return XML_ERROR_NO_MEMORY; + } + + for (;;) { + const char *next; + int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: +#ifdef XML_DTD + if (isParamEntity || enc != encoding) { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&tempPool, enc, + entityTextPtr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); + poolDiscard(&tempPool); + if (!entity) { + /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ + /* cannot report skipped entity here - see comments on + skippedEntityHandler + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + */ + dtd->keepProcessing = dtd->standalone; + goto endEntityValue; + } + if (entity->open) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_RECURSIVE_ENTITY_REF; + goto endEntityValue; + } + if (entity->systemId) { + if (externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) { + entity->open = XML_FALSE; + result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; + goto endEntityValue; + } + entity->open = XML_FALSE; + if (!dtd->paramEntityRead) + dtd->keepProcessing = dtd->standalone; + } + else + dtd->keepProcessing = dtd->standalone; + } + else { + entity->open = XML_TRUE; + result = storeEntityValue(parser, + internalEncoding, + (char *)entity->textPtr, + (char *)(entity->textPtr + + entity->textLen)); + entity->open = XML_FALSE; + if (result) + goto endEntityValue; + } + break; + } +#endif /* XML_DTD */ + /* In the internal subset, PE references are not legal + within markup declarations, e.g entity values in this case. */ + eventPtr = entityTextPtr; + result = XML_ERROR_PARAM_ENTITY_REF; + goto endEntityValue; + case XML_TOK_NONE: + result = XML_ERROR_NONE; + goto endEntityValue; + case XML_TOK_ENTITY_REF: + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, entityTextPtr, next)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + break; + case XML_TOK_TRAILING_CR: + next = entityTextPtr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_DATA_NEWLINE: + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = 0xA; + break; + case XML_TOK_CHAR_REF: + { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, entityTextPtr); + if (n < 0) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + n = XmlEncode(n, (ICHAR *)buf); + if (!n) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + for (i = 0; i < n; i++) { + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = buf[i]; + } + } + break; + case XML_TOK_PARTIAL: + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + case XML_TOK_INVALID: + if (enc == encoding) + eventPtr = next; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + default: + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_UNEXPECTED_STATE; + goto endEntityValue; + } + entityTextPtr = next; + } +endEntityValue: +#ifdef XML_DTD + prologState.inEntityValue = oldInEntityValue; +#endif /* XML_DTD */ + return result; +} + +static void FASTCALL +normalizeLines(XML_Char *s) +{ + XML_Char *p; + for (;; s++) { + if (*s == XML_T('\0')) + return; + if (*s == 0xD) + break; + } + p = s; + do { + if (*s == 0xD) { + *p++ = 0xA; + if (*++s == 0xA) + s++; + } + else + *p++ = *s++; + } while (*s); + *p = XML_T('\0'); +} + +static int +reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + const XML_Char *target; + XML_Char *data; + const char *tem; + if (!processingInstructionHandler) { + if (defaultHandler) + reportDefault(parser, enc, start, end); + return 1; + } + start += enc->minBytesPerChar * 2; + tem = start + XmlNameLength(enc, start); + target = poolStoreString(&tempPool, enc, start, tem); + if (!target) + return 0; + poolFinish(&tempPool); + data = poolStoreString(&tempPool, enc, + XmlSkipS(enc, tem), + end - enc->minBytesPerChar*2); + if (!data) + return 0; + normalizeLines(data); + processingInstructionHandler(handlerArg, target, data); + poolClear(&tempPool); + return 1; +} + +static int +reportComment(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + XML_Char *data; + if (!commentHandler) { + if (defaultHandler) + reportDefault(parser, enc, start, end); + return 1; + } + data = poolStoreString(&tempPool, + enc, + start + enc->minBytesPerChar * 4, + end - enc->minBytesPerChar * 3); + if (!data) + return 0; + normalizeLines(data); + commentHandler(handlerArg, data); + poolClear(&tempPool); + return 1; +} + +static void +reportDefault(XML_Parser parser, const ENCODING *enc, + const char *s, const char *end) +{ + if (MUST_CONVERT(enc, s)) { + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + do { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = s; + defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); + *eventPP = s; + } while (s != end); + } + else + defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); +} + + +static int +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, + XML_Bool isId, const XML_Char *value, XML_Parser parser) +{ + DEFAULT_ATTRIBUTE *att; + if (value || isId) { + /* The handling of default attributes gets messed up if we have + a default which duplicates a non-default. */ + int i; + for (i = 0; i < type->nDefaultAtts; i++) + if (attId == type->defaultAtts[i].id) + return 1; + if (isId && !type->idAtt && !attId->xmlns) + type->idAtt = attId; + } + if (type->nDefaultAtts == type->allocDefaultAtts) { + if (type->allocDefaultAtts == 0) { + type->allocDefaultAtts = 8; + type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts + * sizeof(DEFAULT_ATTRIBUTE)); + if (!type->defaultAtts) + return 0; + } + else { + DEFAULT_ATTRIBUTE *temp; + int count = type->allocDefaultAtts * 2; + temp = (DEFAULT_ATTRIBUTE *) + REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); + if (temp == NULL) + return 0; + type->allocDefaultAtts = count; + type->defaultAtts = temp; + } + } + att = type->defaultAtts + type->nDefaultAtts; + att->id = attId; + att->value = value; + att->isCdata = isCdata; + if (!isCdata) + attId->maybeTokenized = XML_TRUE; + type->nDefaultAtts += 1; + return 1; +} + +static int +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *name; + for (name = elementType->name; *name; name++) { + if (*name == XML_T(':')) { + PREFIX *prefix; + const XML_Char *s; + for (s = elementType->name; s != name; s++) { + if (!poolAppendChar(&dtd->pool, *s)) + return 0; + } + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return 0; + prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), + sizeof(PREFIX)); + if (!prefix) + return 0; + if (prefix->name == poolStart(&dtd->pool)) + poolFinish(&dtd->pool); + else + poolDiscard(&dtd->pool); + elementType->prefix = prefix; + + } + } + return 1; +} + +static ATTRIBUTE_ID * +getAttributeId(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + ATTRIBUTE_ID *id; + const XML_Char *name; + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return NULL; + name = poolStoreString(&dtd->pool, enc, start, end); + if (!name) + return NULL; + /* skip quotation mark - its storage will be re-used (like in name[-1]) */ + ++name; + id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); + if (!id) + return NULL; + if (id->name != name) + poolDiscard(&dtd->pool); + else { + poolFinish(&dtd->pool); + if (!ns) + ; + else if (name[0] == XML_T('x') + && name[1] == XML_T('m') + && name[2] == XML_T('l') + && name[3] == XML_T('n') + && name[4] == XML_T('s') + && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) { + if (name[5] == XML_T('\0')) + id->prefix = &dtd->defaultPrefix; + else + id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX)); + id->xmlns = XML_TRUE; + } + else { + int i; + for (i = 0; name[i]; i++) { + /* attributes without prefix are *not* in the default namespace */ + if (name[i] == XML_T(':')) { + int j; + for (j = 0; j < i; j++) { + if (!poolAppendChar(&dtd->pool, name[j])) + return NULL; + } + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return NULL; + id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), + sizeof(PREFIX)); + if (id->prefix->name == poolStart(&dtd->pool)) + poolFinish(&dtd->pool); + else + poolDiscard(&dtd->pool); + break; + } + } + } + } + return id; +} + +#define CONTEXT_SEP XML_T('\f') + +static const XML_Char * +getContext(XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + HASH_TABLE_ITER iter; + XML_Bool needSep = XML_FALSE; + + if (dtd->defaultPrefix.binding) { + int i; + int len; + if (!poolAppendChar(&tempPool, XML_T('='))) + return NULL; + len = dtd->defaultPrefix.binding->uriLen; + if (namespaceSeparator != XML_T('\0')) + len--; + for (i = 0; i < len; i++) + if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) + return NULL; + needSep = XML_TRUE; + } + + hashTableIterInit(&iter, &(dtd->prefixes)); + for (;;) { + int i; + int len; + const XML_Char *s; + PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); + if (!prefix) + break; + if (!prefix->binding) + continue; + if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) + return NULL; + for (s = prefix->name; *s; s++) + if (!poolAppendChar(&tempPool, *s)) + return NULL; + if (!poolAppendChar(&tempPool, XML_T('='))) + return NULL; + len = prefix->binding->uriLen; + if (namespaceSeparator != XML_T('\0')) + len--; + for (i = 0; i < len; i++) + if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) + return NULL; + needSep = XML_TRUE; + } + + + hashTableIterInit(&iter, &(dtd->generalEntities)); + for (;;) { + const XML_Char *s; + ENTITY *e = (ENTITY *)hashTableIterNext(&iter); + if (!e) + break; + if (!e->open) + continue; + if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) + return NULL; + for (s = e->name; *s; s++) + if (!poolAppendChar(&tempPool, *s)) + return 0; + needSep = XML_TRUE; + } + + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return NULL; + return tempPool.start; +} + +static XML_Bool +setContext(XML_Parser parser, const XML_Char *context) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *s = context; + + while (*context != XML_T('\0')) { + if (*s == CONTEXT_SEP || *s == XML_T('\0')) { + ENTITY *e; + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0); + if (e) + e->open = XML_TRUE; + if (*s != XML_T('\0')) + s++; + context = s; + poolDiscard(&tempPool); + } + else if (*s == XML_T('=')) { + PREFIX *prefix; + if (poolLength(&tempPool) == 0) + prefix = &dtd->defaultPrefix; + else { + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool), + sizeof(PREFIX)); + if (!prefix) + return XML_FALSE; + if (prefix->name == poolStart(&tempPool)) { + prefix->name = poolCopyString(&dtd->pool, prefix->name); + if (!prefix->name) + return XML_FALSE; + } + poolDiscard(&tempPool); + } + for (context = s + 1; + *context != CONTEXT_SEP && *context != XML_T('\0'); + context++) + if (!poolAppendChar(&tempPool, *context)) + return XML_FALSE; + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + if (addBinding(parser, prefix, NULL, poolStart(&tempPool), + &inheritedBindings) != XML_ERROR_NONE) + return XML_FALSE; + poolDiscard(&tempPool); + if (*context != XML_T('\0')) + ++context; + s = context; + } + else { + if (!poolAppendChar(&tempPool, *s)) + return XML_FALSE; + s++; + } + } + return XML_TRUE; +} + +static void FASTCALL +normalizePublicId(XML_Char *publicId) +{ + XML_Char *p = publicId; + XML_Char *s; + for (s = publicId; *s; s++) { + switch (*s) { + case 0x20: + case 0xD: + case 0xA: + if (p != publicId && p[-1] != 0x20) + *p++ = 0x20; + break; + default: + *p++ = *s; + } + } + if (p != publicId && p[-1] == 0x20) + --p; + *p = XML_T('\0'); +} + +static DTD * +dtdCreate(const XML_Memory_Handling_Suite *ms) +{ + DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); + if (p == NULL) + return p; + poolInit(&(p->pool), ms); + poolInit(&(p->entityValuePool), ms); + hashTableInit(&(p->generalEntities), ms); + hashTableInit(&(p->elementTypes), ms); + hashTableInit(&(p->attributeIds), ms); + hashTableInit(&(p->prefixes), ms); +#ifdef XML_DTD + p->paramEntityRead = XML_FALSE; + hashTableInit(&(p->paramEntities), ms); +#endif /* XML_DTD */ + p->defaultPrefix.name = NULL; + p->defaultPrefix.binding = NULL; + + p->in_eldecl = XML_FALSE; + p->scaffIndex = NULL; + p->scaffold = NULL; + p->scaffLevel = 0; + p->scaffSize = 0; + p->scaffCount = 0; + p->contentStringLen = 0; + + p->keepProcessing = XML_TRUE; + p->hasParamEntityRefs = XML_FALSE; + p->standalone = XML_FALSE; + return p; +} + +static void +dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + hashTableIterInit(&iter, &(p->elementTypes)); + for (;;) { + ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!e) + break; + if (e->allocDefaultAtts != 0) + ms->free_fcn(e->defaultAtts); + } + hashTableClear(&(p->generalEntities)); +#ifdef XML_DTD + p->paramEntityRead = XML_FALSE; + hashTableClear(&(p->paramEntities)); +#endif /* XML_DTD */ + hashTableClear(&(p->elementTypes)); + hashTableClear(&(p->attributeIds)); + hashTableClear(&(p->prefixes)); + poolClear(&(p->pool)); + poolClear(&(p->entityValuePool)); + p->defaultPrefix.name = NULL; + p->defaultPrefix.binding = NULL; + + p->in_eldecl = XML_FALSE; + + ms->free_fcn(p->scaffIndex); + p->scaffIndex = NULL; + ms->free_fcn(p->scaffold); + p->scaffold = NULL; + + p->scaffLevel = 0; + p->scaffSize = 0; + p->scaffCount = 0; + p->contentStringLen = 0; + + p->keepProcessing = XML_TRUE; + p->hasParamEntityRefs = XML_FALSE; + p->standalone = XML_FALSE; +} + +static void +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + hashTableIterInit(&iter, &(p->elementTypes)); + for (;;) { + ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!e) + break; + if (e->allocDefaultAtts != 0) + ms->free_fcn(e->defaultAtts); + } + hashTableDestroy(&(p->generalEntities)); +#ifdef XML_DTD + hashTableDestroy(&(p->paramEntities)); +#endif /* XML_DTD */ + hashTableDestroy(&(p->elementTypes)); + hashTableDestroy(&(p->attributeIds)); + hashTableDestroy(&(p->prefixes)); + poolDestroy(&(p->pool)); + poolDestroy(&(p->entityValuePool)); + if (isDocEntity) { + ms->free_fcn(p->scaffIndex); + ms->free_fcn(p->scaffold); + } + ms->free_fcn(p); +} + +/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. + The new DTD has already been initialized. +*/ +static int +dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + + /* Copy the prefix table. */ + + hashTableIterInit(&iter, &(oldDtd->prefixes)); + for (;;) { + const XML_Char *name; + const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); + if (!oldP) + break; + name = poolCopyString(&(newDtd->pool), oldP->name); + if (!name) + return 0; + if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) + return 0; + } + + hashTableIterInit(&iter, &(oldDtd->attributeIds)); + + /* Copy the attribute id table. */ + + for (;;) { + ATTRIBUTE_ID *newA; + const XML_Char *name; + const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); + + if (!oldA) + break; + /* Remember to allocate the scratch byte before the name. */ + if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) + return 0; + name = poolCopyString(&(newDtd->pool), oldA->name); + if (!name) + return 0; + ++name; + newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, + sizeof(ATTRIBUTE_ID)); + if (!newA) + return 0; + newA->maybeTokenized = oldA->maybeTokenized; + if (oldA->prefix) { + newA->xmlns = oldA->xmlns; + if (oldA->prefix == &oldDtd->defaultPrefix) + newA->prefix = &newDtd->defaultPrefix; + else + newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), + oldA->prefix->name, 0); + } + } + + /* Copy the element type table. */ + + hashTableIterInit(&iter, &(oldDtd->elementTypes)); + + for (;;) { + int i; + ELEMENT_TYPE *newE; + const XML_Char *name; + const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!oldE) + break; + name = poolCopyString(&(newDtd->pool), oldE->name); + if (!name) + return 0; + newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, + sizeof(ELEMENT_TYPE)); + if (!newE) + return 0; + if (oldE->nDefaultAtts) { + newE->defaultAtts = (DEFAULT_ATTRIBUTE *) + ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); + if (!newE->defaultAtts) { + ms->free_fcn(newE); + return 0; + } + } + if (oldE->idAtt) + newE->idAtt = (ATTRIBUTE_ID *) + lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); + newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; + if (oldE->prefix) + newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), + oldE->prefix->name, 0); + for (i = 0; i < newE->nDefaultAtts; i++) { + newE->defaultAtts[i].id = (ATTRIBUTE_ID *) + lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); + newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; + if (oldE->defaultAtts[i].value) { + newE->defaultAtts[i].value + = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); + if (!newE->defaultAtts[i].value) + return 0; + } + else + newE->defaultAtts[i].value = NULL; + } + } + + /* Copy the entity tables. */ + if (!copyEntityTable(&(newDtd->generalEntities), + &(newDtd->pool), + &(oldDtd->generalEntities))) + return 0; + +#ifdef XML_DTD + if (!copyEntityTable(&(newDtd->paramEntities), + &(newDtd->pool), + &(oldDtd->paramEntities))) + return 0; + newDtd->paramEntityRead = oldDtd->paramEntityRead; +#endif /* XML_DTD */ + + newDtd->keepProcessing = oldDtd->keepProcessing; + newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; + newDtd->standalone = oldDtd->standalone; + + /* Don't want deep copying for scaffolding */ + newDtd->in_eldecl = oldDtd->in_eldecl; + newDtd->scaffold = oldDtd->scaffold; + newDtd->contentStringLen = oldDtd->contentStringLen; + newDtd->scaffSize = oldDtd->scaffSize; + newDtd->scaffLevel = oldDtd->scaffLevel; + newDtd->scaffIndex = oldDtd->scaffIndex; + + return 1; +} /* End dtdCopy */ + +static int +copyEntityTable(HASH_TABLE *newTable, + STRING_POOL *newPool, + const HASH_TABLE *oldTable) +{ + HASH_TABLE_ITER iter; + const XML_Char *cachedOldBase = NULL; + const XML_Char *cachedNewBase = NULL; + + hashTableIterInit(&iter, oldTable); + + for (;;) { + ENTITY *newE; + const XML_Char *name; + const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); + if (!oldE) + break; + name = poolCopyString(newPool, oldE->name); + if (!name) + return 0; + newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); + if (!newE) + return 0; + if (oldE->systemId) { + const XML_Char *tem = poolCopyString(newPool, oldE->systemId); + if (!tem) + return 0; + newE->systemId = tem; + if (oldE->base) { + if (oldE->base == cachedOldBase) + newE->base = cachedNewBase; + else { + cachedOldBase = oldE->base; + tem = poolCopyString(newPool, cachedOldBase); + if (!tem) + return 0; + cachedNewBase = newE->base = tem; + } + } + if (oldE->publicId) { + tem = poolCopyString(newPool, oldE->publicId); + if (!tem) + return 0; + newE->publicId = tem; + } + } + else { + const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, + oldE->textLen); + if (!tem) + return 0; + newE->textPtr = tem; + newE->textLen = oldE->textLen; + } + if (oldE->notation) { + const XML_Char *tem = poolCopyString(newPool, oldE->notation); + if (!tem) + return 0; + newE->notation = tem; + } + newE->is_param = oldE->is_param; + newE->is_internal = oldE->is_internal; + } + return 1; +} + +#define INIT_POWER 6 + +static XML_Bool FASTCALL +keyeq(KEY s1, KEY s2) +{ + for (; *s1 == *s2; s1++, s2++) + if (*s1 == 0) + return XML_TRUE; + return XML_FALSE; +} + +static unsigned long FASTCALL +hash(KEY s) +{ + unsigned long h = 0; + while (*s) + h = CHAR_HASH(h, *s++); + return h; +} + +static NAMED * +lookup(HASH_TABLE *table, KEY name, size_t createSize) +{ + size_t i; + if (table->size == 0) { + size_t tsize; + if (!createSize) + return NULL; + table->power = INIT_POWER; + /* table->size is a power of 2 */ + table->size = (size_t)1 << INIT_POWER; + tsize = table->size * sizeof(NAMED *); + table->v = (NAMED **)table->mem->malloc_fcn(tsize); + if (!table->v) { + table->size = 0; + return NULL; + } + memset(table->v, 0, tsize); + i = hash(name) & ((unsigned long)table->size - 1); + } + else { + unsigned long h = hash(name); + unsigned long mask = (unsigned long)table->size - 1; + unsigned char step = 0; + i = h & mask; + while (table->v[i]) { + if (keyeq(name, table->v[i]->name)) + return table->v[i]; + if (!step) + step = PROBE_STEP(h, mask, table->power); + i < step ? (i += table->size - step) : (i -= step); + } + if (!createSize) + return NULL; + + /* check for overflow (table is half full) */ + if (table->used >> (table->power - 1)) { + unsigned char newPower = table->power + 1; + size_t newSize = (size_t)1 << newPower; + unsigned long newMask = (unsigned long)newSize - 1; + size_t tsize = newSize * sizeof(NAMED *); + NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); + if (!newV) + return NULL; + memset(newV, 0, tsize); + for (i = 0; i < table->size; i++) + if (table->v[i]) { + unsigned long newHash = hash(table->v[i]->name); + size_t j = newHash & newMask; + step = 0; + while (newV[j]) { + if (!step) + step = PROBE_STEP(newHash, newMask, newPower); + j < step ? (j += newSize - step) : (j -= step); + } + newV[j] = table->v[i]; + } + table->mem->free_fcn(table->v); + table->v = newV; + table->power = newPower; + table->size = newSize; + i = h & newMask; + step = 0; + while (table->v[i]) { + if (!step) + step = PROBE_STEP(h, newMask, newPower); + i < step ? (i += newSize - step) : (i -= step); + } + } + } + table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); + if (!table->v[i]) + return NULL; + memset(table->v[i], 0, createSize); + table->v[i]->name = name; + (table->used)++; + return table->v[i]; +} + +static void FASTCALL +hashTableClear(HASH_TABLE *table) +{ + size_t i; + for (i = 0; i < table->size; i++) { + table->mem->free_fcn(table->v[i]); + table->v[i] = NULL; + } + table->used = 0; +} + +static void FASTCALL +hashTableDestroy(HASH_TABLE *table) +{ + size_t i; + for (i = 0; i < table->size; i++) + table->mem->free_fcn(table->v[i]); + table->mem->free_fcn(table->v); +} + +static void FASTCALL +hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) +{ + p->power = 0; + p->size = 0; + p->used = 0; + p->v = NULL; + p->mem = ms; +} + +static void FASTCALL +hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) +{ + iter->p = table->v; + iter->end = iter->p + table->size; +} + +static NAMED * FASTCALL +hashTableIterNext(HASH_TABLE_ITER *iter) +{ + while (iter->p != iter->end) { + NAMED *tem = *(iter->p)++; + if (tem) + return tem; + } + return NULL; +} + +static void FASTCALL +poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) +{ + pool->blocks = NULL; + pool->freeBlocks = NULL; + pool->start = NULL; + pool->ptr = NULL; + pool->end = NULL; + pool->mem = ms; +} + +static void FASTCALL +poolClear(STRING_POOL *pool) +{ + if (!pool->freeBlocks) + pool->freeBlocks = pool->blocks; + else { + BLOCK *p = pool->blocks; + while (p) { + BLOCK *tem = p->next; + p->next = pool->freeBlocks; + pool->freeBlocks = p; + p = tem; + } + } + pool->blocks = NULL; + pool->start = NULL; + pool->ptr = NULL; + pool->end = NULL; +} + +static void FASTCALL +poolDestroy(STRING_POOL *pool) +{ + BLOCK *p = pool->blocks; + while (p) { + BLOCK *tem = p->next; + pool->mem->free_fcn(p); + p = tem; + } + p = pool->freeBlocks; + while (p) { + BLOCK *tem = p->next; + pool->mem->free_fcn(p); + p = tem; + } +} + +static XML_Char * +poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) +{ + if (!pool->ptr && !poolGrow(pool)) + return NULL; + for (;;) { + XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); + if (ptr == end) + break; + if (!poolGrow(pool)) + return NULL; + } + return pool->start; +} + +static const XML_Char * FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s) +{ + do { + if (!poolAppendChar(pool, *s)) + return NULL; + } while (*s++); + s = pool->start; + poolFinish(pool); + return s; +} + +static const XML_Char * +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) +{ + if (!pool->ptr && !poolGrow(pool)) + return NULL; + for (; n > 0; --n, s++) { + if (!poolAppendChar(pool, *s)) + return NULL; + } + s = pool->start; + poolFinish(pool); + return s; +} + +static const XML_Char * FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s) +{ + while (*s) { + if (!poolAppendChar(pool, *s)) + return NULL; + s++; + } + return pool->start; +} + +static XML_Char * +poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) +{ + if (!poolAppend(pool, enc, ptr, end)) + return NULL; + if (pool->ptr == pool->end && !poolGrow(pool)) + return NULL; + *(pool->ptr)++ = 0; + return pool->start; +} + +static XML_Bool FASTCALL +poolGrow(STRING_POOL *pool) +{ + if (pool->freeBlocks) { + if (pool->start == 0) { + pool->blocks = pool->freeBlocks; + pool->freeBlocks = pool->freeBlocks->next; + pool->blocks->next = NULL; + pool->start = pool->blocks->s; + pool->end = pool->start + pool->blocks->size; + pool->ptr = pool->start; + return XML_TRUE; + } + if (pool->end - pool->start < pool->freeBlocks->size) { + BLOCK *tem = pool->freeBlocks->next; + pool->freeBlocks->next = pool->blocks; + pool->blocks = pool->freeBlocks; + pool->freeBlocks = tem; + memcpy(pool->blocks->s, pool->start, + (pool->end - pool->start) * sizeof(XML_Char)); + pool->ptr = pool->blocks->s + (pool->ptr - pool->start); + pool->start = pool->blocks->s; + pool->end = pool->start + pool->blocks->size; + return XML_TRUE; + } + } + if (pool->blocks && pool->start == pool->blocks->s) { + int blockSize = (pool->end - pool->start)*2; + pool->blocks = (BLOCK *) + pool->mem->realloc_fcn(pool->blocks, + (offsetof(BLOCK, s) + + blockSize * sizeof(XML_Char))); + if (pool->blocks == NULL) + return XML_FALSE; + pool->blocks->size = blockSize; + pool->ptr = pool->blocks->s + (pool->ptr - pool->start); + pool->start = pool->blocks->s; + pool->end = pool->start + blockSize; + } + else { + BLOCK *tem; + int blockSize = pool->end - pool->start; + if (blockSize < INIT_BLOCK_SIZE) + blockSize = INIT_BLOCK_SIZE; + else + blockSize *= 2; + tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) + + blockSize * sizeof(XML_Char)); + if (!tem) + return XML_FALSE; + tem->size = blockSize; + tem->next = pool->blocks; + pool->blocks = tem; + if (pool->ptr != pool->start) + memcpy(tem->s, pool->start, + (pool->ptr - pool->start) * sizeof(XML_Char)); + pool->ptr = tem->s + (pool->ptr - pool->start); + pool->start = tem->s; + pool->end = tem->s + blockSize; + } + return XML_TRUE; +} + +static int FASTCALL +nextScaffoldPart(XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + CONTENT_SCAFFOLD * me; + int next; + + if (!dtd->scaffIndex) { + dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); + if (!dtd->scaffIndex) + return -1; + dtd->scaffIndex[0] = 0; + } + + if (dtd->scaffCount >= dtd->scaffSize) { + CONTENT_SCAFFOLD *temp; + if (dtd->scaffold) { + temp = (CONTENT_SCAFFOLD *) + REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) + return -1; + dtd->scaffSize *= 2; + } + else { + temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS + * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) + return -1; + dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; + } + dtd->scaffold = temp; + } + next = dtd->scaffCount++; + me = &dtd->scaffold[next]; + if (dtd->scaffLevel) { + CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; + if (parent->lastchild) { + dtd->scaffold[parent->lastchild].nextsib = next; + } + if (!parent->childcnt) + parent->firstchild = next; + parent->lastchild = next; + parent->childcnt++; + } + me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; + return next; +} + +static void +build_node(XML_Parser parser, + int src_node, + XML_Content *dest, + XML_Content **contpos, + XML_Char **strpos) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + dest->type = dtd->scaffold[src_node].type; + dest->quant = dtd->scaffold[src_node].quant; + if (dest->type == XML_CTYPE_NAME) { + const XML_Char *src; + dest->name = *strpos; + src = dtd->scaffold[src_node].name; + for (;;) { + *(*strpos)++ = *src; + if (!*src) + break; + src++; + } + dest->numchildren = 0; + dest->children = NULL; + } + else { + unsigned int i; + int cn; + dest->numchildren = dtd->scaffold[src_node].childcnt; + dest->children = *contpos; + *contpos += dest->numchildren; + for (i = 0, cn = dtd->scaffold[src_node].firstchild; + i < dest->numchildren; + i++, cn = dtd->scaffold[cn].nextsib) { + build_node(parser, cn, &(dest->children[i]), contpos, strpos); + } + dest->name = NULL; + } +} + +static XML_Content * +build_model (XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + XML_Content *ret; + XML_Content *cpos; + XML_Char * str; + int allocsize = (dtd->scaffCount * sizeof(XML_Content) + + (dtd->contentStringLen * sizeof(XML_Char))); + + ret = (XML_Content *)MALLOC(allocsize); + if (!ret) + return NULL; + + str = (XML_Char *) (&ret[dtd->scaffCount]); + cpos = &ret[1]; + + build_node(parser, 0, ret, &cpos, &str); + return ret; +} + +static ELEMENT_TYPE * +getElementType(XML_Parser parser, + const ENCODING *enc, + const char *ptr, + const char *end) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); + ELEMENT_TYPE *ret; + + if (!name) + return NULL; + ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); + if (!ret) + return NULL; + if (ret->name != name) + poolDiscard(&dtd->pool); + else { + poolFinish(&dtd->pool); + if (!setElementTypePrefix(parser, ret)) + return NULL; + } + return ret; +} Added: external/celementtree-1.0.4-20051213/expat/xmlrole.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/xmlrole.c Wed Dec 14 22:43:26 2005 @@ -0,0 +1,1328 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "expat_external.h" +#include "internal.h" +#include "xmlrole.h" +#include "ascii.h" + +/* Doesn't check: + + that ,| are not mixed in a model group + content of literals + +*/ + +static const char KW_ANY[] = { + ASCII_A, ASCII_N, ASCII_Y, '\0' }; +static const char KW_ATTLIST[] = { + ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; +static const char KW_CDATA[] = { + ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_DOCTYPE[] = { + ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; +static const char KW_ELEMENT[] = { + ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; +static const char KW_EMPTY[] = { + ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; +static const char KW_ENTITIES[] = { + ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, + '\0' }; +static const char KW_ENTITY[] = { + ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; +static const char KW_FIXED[] = { + ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; +static const char KW_ID[] = { + ASCII_I, ASCII_D, '\0' }; +static const char KW_IDREF[] = { + ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; +static const char KW_IDREFS[] = { + ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; +static const char KW_IGNORE[] = { + ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; +static const char KW_IMPLIED[] = { + ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; +static const char KW_INCLUDE[] = { + ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; +static const char KW_NDATA[] = { + ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_NMTOKEN[] = { + ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; +static const char KW_NMTOKENS[] = { + ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, + '\0' }; +static const char KW_NOTATION[] = + { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, + '\0' }; +static const char KW_PCDATA[] = { + ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_PUBLIC[] = { + ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; +static const char KW_REQUIRED[] = { + ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, + '\0' }; +static const char KW_SYSTEM[] = { + ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; + +#ifndef MIN_BYTES_PER_CHAR +#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) +#endif + +#ifdef XML_DTD +#define setTopLevel(state) \ + ((state)->handler = ((state)->documentEntity \ + ? internalSubset \ + : externalSubset1)) +#else /* not XML_DTD */ +#define setTopLevel(state) ((state)->handler = internalSubset) +#endif /* not XML_DTD */ + +typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc); + +static PROLOG_HANDLER + prolog0, prolog1, prolog2, + doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, + internalSubset, + entity0, entity1, entity2, entity3, entity4, entity5, entity6, + entity7, entity8, entity9, entity10, + notation0, notation1, notation2, notation3, notation4, + attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, + attlist7, attlist8, attlist9, + element0, element1, element2, element3, element4, element5, element6, + element7, +#ifdef XML_DTD + externalSubset0, externalSubset1, + condSect0, condSect1, condSect2, +#endif /* XML_DTD */ + declClose, + error; + +static int FASTCALL common(PROLOG_STATE *state, int tok); + +static int PTRCALL +prolog0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + state->handler = prolog1; + return XML_ROLE_NONE; + case XML_TOK_XML_DECL: + state->handler = prolog1; + return XML_ROLE_XML_DECL; + case XML_TOK_PI: + state->handler = prolog1; + return XML_ROLE_PI; + case XML_TOK_COMMENT: + state->handler = prolog1; + return XML_ROLE_COMMENT; + case XML_TOK_BOM: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (!XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_DOCTYPE)) + break; + state->handler = doctype0; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +prolog1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_BOM: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (!XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_DOCTYPE)) + break; + state->handler = doctype0; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +prolog2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +doctype0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = doctype1; + return XML_ROLE_DOCTYPE_NAME; + } + return common(state, tok); +} + +static int PTRCALL +doctype1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = internalSubset; + return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = doctype3; + return XML_ROLE_DOCTYPE_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = doctype2; + return XML_ROLE_DOCTYPE_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +doctype2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_LITERAL: + state->handler = doctype3; + return XML_ROLE_DOCTYPE_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +doctype3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_LITERAL: + state->handler = doctype4; + return XML_ROLE_DOCTYPE_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +doctype4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = internalSubset; + return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + } + return common(state, tok); +} + +static int PTRCALL +doctype5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + } + return common(state, tok); +} + +static int PTRCALL +internalSubset(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ENTITY)) { + state->handler = entity0; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ATTLIST)) { + state->handler = attlist0; + return XML_ROLE_ATTLIST_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ELEMENT)) { + state->handler = element0; + return XML_ROLE_ELEMENT_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_NOTATION)) { + state->handler = notation0; + return XML_ROLE_NOTATION_NONE; + } + break; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_PARAM_ENTITY_REF: + return XML_ROLE_PARAM_ENTITY_REF; + case XML_TOK_CLOSE_BRACKET: + state->handler = doctype5; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_NONE: + return XML_ROLE_NONE; + } + return common(state, tok); +} + +#ifdef XML_DTD + +static int PTRCALL +externalSubset0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + state->handler = externalSubset1; + if (tok == XML_TOK_XML_DECL) + return XML_ROLE_TEXT_DECL; + return externalSubset1(state, tok, ptr, end, enc); +} + +static int PTRCALL +externalSubset1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_COND_SECT_OPEN: + state->handler = condSect0; + return XML_ROLE_NONE; + case XML_TOK_COND_SECT_CLOSE: + if (state->includeLevel == 0) + break; + state->includeLevel -= 1; + return XML_ROLE_NONE; + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_CLOSE_BRACKET: + break; + case XML_TOK_NONE: + if (state->includeLevel) + break; + return XML_ROLE_NONE; + default: + return internalSubset(state, tok, ptr, end, enc); + } + return common(state, tok); +} + +#endif /* XML_DTD */ + +static int PTRCALL +entity0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_PERCENT: + state->handler = entity1; + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = entity2; + return XML_ROLE_GENERAL_ENTITY_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = entity7; + return XML_ROLE_PARAM_ENTITY_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = entity4; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = entity3; + return XML_ROLE_ENTITY_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +entity3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity4; + return XML_ROLE_ENTITY_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity5; + return XML_ROLE_ENTITY_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ENTITY_COMPLETE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { + state->handler = entity6; + return XML_ROLE_ENTITY_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +entity6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_NOTATION_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = entity9; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = entity8; + return XML_ROLE_ENTITY_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +entity8(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity9; + return XML_ROLE_ENTITY_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity9(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity10; + return XML_ROLE_ENTITY_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity10(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ENTITY_COMPLETE; + } + return common(state, tok); +} + +static int PTRCALL +notation0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_NAME: + state->handler = notation1; + return XML_ROLE_NOTATION_NAME; + } + return common(state, tok); +} + +static int PTRCALL +notation1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = notation3; + return XML_ROLE_NOTATION_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = notation2; + return XML_ROLE_NOTATION_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +notation2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = notation4; + return XML_ROLE_NOTATION_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +notation3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_NOTATION_NONE; + return XML_ROLE_NOTATION_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +notation4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_NOTATION_NONE; + return XML_ROLE_NOTATION_SYSTEM_ID; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_NOTATION_NO_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +attlist0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist1; + return XML_ROLE_ATTLIST_ELEMENT_NAME; + } + return common(state, tok); +} + +static int PTRCALL +attlist1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist2; + return XML_ROLE_ATTRIBUTE_NAME; + } + return common(state, tok); +} + +static int PTRCALL +attlist2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + { + static const char *types[] = { + KW_CDATA, + KW_ID, + KW_IDREF, + KW_IDREFS, + KW_ENTITY, + KW_ENTITIES, + KW_NMTOKEN, + KW_NMTOKENS, + }; + int i; + for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) + if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { + state->handler = attlist8; + return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; + } + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { + state->handler = attlist5; + return XML_ROLE_ATTLIST_NONE; + } + break; + case XML_TOK_OPEN_PAREN: + state->handler = attlist3; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NMTOKEN: + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist4; + return XML_ROLE_ATTRIBUTE_ENUM_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = attlist8; + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OR: + state->handler = attlist3; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OPEN_PAREN: + state->handler = attlist6; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + state->handler = attlist7; + return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = attlist8; + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OR: + state->handler = attlist6; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +/* default value */ +static int PTRCALL +attlist8(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_POUND_NAME: + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_IMPLIED)) { + state->handler = attlist1; + return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; + } + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_REQUIRED)) { + state->handler = attlist1; + return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; + } + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_FIXED)) { + state->handler = attlist9; + return XML_ROLE_ATTLIST_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = attlist1; + return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist9(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_LITERAL: + state->handler = attlist1; + return XML_ROLE_FIXED_ATTRIBUTE_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +element0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element1; + return XML_ROLE_ELEMENT_NAME; + } + return common(state, tok); +} + +static int PTRCALL +element1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_CONTENT_EMPTY; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_CONTENT_ANY; + } + break; + case XML_TOK_OPEN_PAREN: + state->handler = element2; + state->level = 1; + return XML_ROLE_GROUP_OPEN; + } + return common(state, tok); +} + +static int PTRCALL +element2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_POUND_NAME: + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_PCDATA)) { + state->handler = element3; + return XML_ROLE_CONTENT_PCDATA; + } + break; + case XML_TOK_OPEN_PAREN: + state->level = 2; + state->handler = element6; + return XML_ROLE_GROUP_OPEN; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT; + case XML_TOK_NAME_QUESTION: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_OPT; + case XML_TOK_NAME_ASTERISK: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_REP; + case XML_TOK_NAME_PLUS: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_PLUS; + } + return common(state, tok); +} + +static int PTRCALL +element3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_OR: + state->handler = element4; + return XML_ROLE_ELEMENT_NONE; + } + return common(state, tok); +} + +static int PTRCALL +element4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element5; + return XML_ROLE_CONTENT_ELEMENT; + } + return common(state, tok); +} + +static int PTRCALL +element5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_OR: + state->handler = element4; + return XML_ROLE_ELEMENT_NONE; + } + return common(state, tok); +} + +static int PTRCALL +element6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_OPEN_PAREN: + state->level += 1; + return XML_ROLE_GROUP_OPEN; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT; + case XML_TOK_NAME_QUESTION: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_OPT; + case XML_TOK_NAME_ASTERISK: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_REP; + case XML_TOK_NAME_PLUS: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_PLUS; + } + return common(state, tok); +} + +static int PTRCALL +element7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_CLOSE_PAREN_QUESTION: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_OPT; + case XML_TOK_CLOSE_PAREN_PLUS: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_PLUS; + case XML_TOK_COMMA: + state->handler = element6; + return XML_ROLE_GROUP_SEQUENCE; + case XML_TOK_OR: + state->handler = element6; + return XML_ROLE_GROUP_CHOICE; + } + return common(state, tok); +} + +#ifdef XML_DTD + +static int PTRCALL +condSect0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { + state->handler = condSect1; + return XML_ROLE_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { + state->handler = condSect2; + return XML_ROLE_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +condSect1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = externalSubset1; + state->includeLevel += 1; + return XML_ROLE_NONE; + } + return common(state, tok); +} + +static int PTRCALL +condSect2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = externalSubset1; + return XML_ROLE_IGNORE_SECT; + } + return common(state, tok); +} + +#endif /* XML_DTD */ + +static int PTRCALL +declClose(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return state->role_none; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return state->role_none; + } + return common(state, tok); +} + +static int PTRCALL +error(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + return XML_ROLE_NONE; +} + +static int FASTCALL +common(PROLOG_STATE *state, int tok) +{ +#ifdef XML_DTD + if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) + return XML_ROLE_INNER_PARAM_ENTITY_REF; +#endif + state->handler = error; + return XML_ROLE_ERROR; +} + +void +XmlPrologStateInit(PROLOG_STATE *state) +{ + state->handler = prolog0; +#ifdef XML_DTD + state->documentEntity = 1; + state->includeLevel = 0; + state->inEntityValue = 0; +#endif /* XML_DTD */ +} + +#ifdef XML_DTD + +void +XmlPrologStateInitExternalEntity(PROLOG_STATE *state) +{ + state->handler = externalSubset0; + state->documentEntity = 0; + state->includeLevel = 0; +} + +#endif /* XML_DTD */ Added: external/celementtree-1.0.4-20051213/expat/xmlrole.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/xmlrole.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,114 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlRole_INCLUDED +#define XmlRole_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt +#endif + +#include "xmltok.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + XML_ROLE_ERROR = -1, + XML_ROLE_NONE = 0, + XML_ROLE_XML_DECL, + XML_ROLE_INSTANCE_START, + XML_ROLE_DOCTYPE_NONE, + XML_ROLE_DOCTYPE_NAME, + XML_ROLE_DOCTYPE_SYSTEM_ID, + XML_ROLE_DOCTYPE_PUBLIC_ID, + XML_ROLE_DOCTYPE_INTERNAL_SUBSET, + XML_ROLE_DOCTYPE_CLOSE, + XML_ROLE_GENERAL_ENTITY_NAME, + XML_ROLE_PARAM_ENTITY_NAME, + XML_ROLE_ENTITY_NONE, + XML_ROLE_ENTITY_VALUE, + XML_ROLE_ENTITY_SYSTEM_ID, + XML_ROLE_ENTITY_PUBLIC_ID, + XML_ROLE_ENTITY_COMPLETE, + XML_ROLE_ENTITY_NOTATION_NAME, + XML_ROLE_NOTATION_NONE, + XML_ROLE_NOTATION_NAME, + XML_ROLE_NOTATION_SYSTEM_ID, + XML_ROLE_NOTATION_NO_SYSTEM_ID, + XML_ROLE_NOTATION_PUBLIC_ID, + XML_ROLE_ATTRIBUTE_NAME, + XML_ROLE_ATTRIBUTE_TYPE_CDATA, + XML_ROLE_ATTRIBUTE_TYPE_ID, + XML_ROLE_ATTRIBUTE_TYPE_IDREF, + XML_ROLE_ATTRIBUTE_TYPE_IDREFS, + XML_ROLE_ATTRIBUTE_TYPE_ENTITY, + XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, + XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, + XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, + XML_ROLE_ATTRIBUTE_ENUM_VALUE, + XML_ROLE_ATTRIBUTE_NOTATION_VALUE, + XML_ROLE_ATTLIST_NONE, + XML_ROLE_ATTLIST_ELEMENT_NAME, + XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, + XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, + XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, + XML_ROLE_FIXED_ATTRIBUTE_VALUE, + XML_ROLE_ELEMENT_NONE, + XML_ROLE_ELEMENT_NAME, + XML_ROLE_CONTENT_ANY, + XML_ROLE_CONTENT_EMPTY, + XML_ROLE_CONTENT_PCDATA, + XML_ROLE_GROUP_OPEN, + XML_ROLE_GROUP_CLOSE, + XML_ROLE_GROUP_CLOSE_REP, + XML_ROLE_GROUP_CLOSE_OPT, + XML_ROLE_GROUP_CLOSE_PLUS, + XML_ROLE_GROUP_CHOICE, + XML_ROLE_GROUP_SEQUENCE, + XML_ROLE_CONTENT_ELEMENT, + XML_ROLE_CONTENT_ELEMENT_REP, + XML_ROLE_CONTENT_ELEMENT_OPT, + XML_ROLE_CONTENT_ELEMENT_PLUS, + XML_ROLE_PI, + XML_ROLE_COMMENT, +#ifdef XML_DTD + XML_ROLE_TEXT_DECL, + XML_ROLE_IGNORE_SECT, + XML_ROLE_INNER_PARAM_ENTITY_REF, +#endif /* XML_DTD */ + XML_ROLE_PARAM_ENTITY_REF +}; + +typedef struct prolog_state { + int (PTRCALL *handler) (struct prolog_state *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc); + unsigned level; + int role_none; +#ifdef XML_DTD + unsigned includeLevel; + int documentEntity; + int inEntityValue; +#endif /* XML_DTD */ +} PROLOG_STATE; + +void XmlPrologStateInit(PROLOG_STATE *); +#ifdef XML_DTD +void XmlPrologStateInitExternalEntity(PROLOG_STATE *); +#endif /* XML_DTD */ + +#define XmlTokenRole(state, tok, ptr, end, enc) \ + (((state)->handler)(state, tok, ptr, end, enc)) + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlRole_INCLUDED */ Added: external/celementtree-1.0.4-20051213/expat/xmltok.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/xmltok.c Wed Dec 14 22:43:26 2005 @@ -0,0 +1,1637 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "expat_external.h" +#include "internal.h" +#include "xmltok.h" +#include "nametab.h" + +#ifdef XML_DTD +#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) +#else +#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ +#endif + +#define VTABLE1 \ + { PREFIX(prologTok), PREFIX(contentTok), \ + PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ + { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ + PREFIX(sameName), \ + PREFIX(nameMatchesAscii), \ + PREFIX(nameLength), \ + PREFIX(skipS), \ + PREFIX(getAtts), \ + PREFIX(charRefNumber), \ + PREFIX(predefinedEntityName), \ + PREFIX(updatePosition), \ + PREFIX(isPublicId) + +#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) + +#define UCS2_GET_NAMING(pages, hi, lo) \ + (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) + +/* A 2 byte UTF-8 representation splits the characters 11 bits between + the bottom 5 and 6 bits of the bytes. We need 8 bits to index into + pages, 3 bits to add to that index and 5 bits to generate the mask. +*/ +#define UTF8_GET_NAMING2(pages, byte) \ + (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ + + ((((byte)[0]) & 3) << 1) \ + + ((((byte)[1]) >> 5) & 1)] \ + & (1 << (((byte)[1]) & 0x1F))) + +/* A 3 byte UTF-8 representation splits the characters 16 bits between + the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index + into pages, 3 bits to add to that index and 5 bits to generate the + mask. +*/ +#define UTF8_GET_NAMING3(pages, byte) \ + (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ + + ((((byte)[1]) >> 2) & 0xF)] \ + << 3) \ + + ((((byte)[1]) & 3) << 1) \ + + ((((byte)[2]) >> 5) & 1)] \ + & (1 << (((byte)[2]) & 0x1F))) + +#define UTF8_GET_NAMING(pages, p, n) \ + ((n) == 2 \ + ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ + : ((n) == 3 \ + ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ + : 0)) + +/* Detection of invalid UTF-8 sequences is based on Table 3.1B + of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ + with the additional restriction of not allowing the Unicode + code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). + Implementation details: + (A & 0x80) == 0 means A < 0x80 + and + (A & 0xC0) == 0xC0 means A > 0xBF +*/ + +#define UTF8_INVALID2(p) \ + ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) + +#define UTF8_INVALID3(p) \ + (((p)[2] & 0x80) == 0 \ + || \ + ((*p) == 0xEF && (p)[1] == 0xBF \ + ? \ + (p)[2] > 0xBD \ + : \ + ((p)[2] & 0xC0) == 0xC0) \ + || \ + ((*p) == 0xE0 \ + ? \ + (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ + : \ + ((p)[1] & 0x80) == 0 \ + || \ + ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) + +#define UTF8_INVALID4(p) \ + (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ + || \ + ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ + || \ + ((*p) == 0xF0 \ + ? \ + (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ + : \ + ((p)[1] & 0x80) == 0 \ + || \ + ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) + +static int PTRFASTCALL +isNever(const ENCODING *enc, const char *p) +{ + return 0; +} + +static int PTRFASTCALL +utf8_isName2(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isName3(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); +} + +#define utf8_isName4 isNever + +static int PTRFASTCALL +utf8_isNmstrt2(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isNmstrt3(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); +} + +#define utf8_isNmstrt4 isNever + +static int PTRFASTCALL +utf8_isInvalid2(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID2((const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isInvalid3(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID3((const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isInvalid4(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID4((const unsigned char *)p); +} + +struct normal_encoding { + ENCODING enc; + unsigned char type[256]; +#ifdef XML_MIN_SIZE + int (PTRFASTCALL *byteType)(const ENCODING *, const char *); + int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); + int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); + int (PTRCALL *charMatches)(const ENCODING *, const char *, int); +#endif /* XML_MIN_SIZE */ + int (PTRFASTCALL *isName2)(const ENCODING *, const char *); + int (PTRFASTCALL *isName3)(const ENCODING *, const char *); + int (PTRFASTCALL *isName4)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); +}; + +#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) + +#ifdef XML_MIN_SIZE + +#define STANDARD_VTABLE(E) \ + E ## byteType, \ + E ## isNameMin, \ + E ## isNmstrtMin, \ + E ## byteToAscii, \ + E ## charMatches, + +#else + +#define STANDARD_VTABLE(E) /* as nothing */ + +#endif + +#define NORMAL_VTABLE(E) \ + E ## isName2, \ + E ## isName3, \ + E ## isName4, \ + E ## isNmstrt2, \ + E ## isNmstrt3, \ + E ## isNmstrt4, \ + E ## isInvalid2, \ + E ## isInvalid3, \ + E ## isInvalid4 + +static int FASTCALL checkCharRefNumber(int); + +#include "xmltok_impl.h" +#include "ascii.h" + +#ifdef XML_MIN_SIZE +#define sb_isNameMin isNever +#define sb_isNmstrtMin isNever +#endif + +#ifdef XML_MIN_SIZE +#define MINBPC(enc) ((enc)->minBytesPerChar) +#else +/* minimum bytes per character */ +#define MINBPC(enc) 1 +#endif + +#define SB_BYTE_TYPE(enc, p) \ + (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) + +#ifdef XML_MIN_SIZE +static int PTRFASTCALL +sb_byteType(const ENCODING *enc, const char *p) +{ + return SB_BYTE_TYPE(enc, p); +} +#define BYTE_TYPE(enc, p) \ + (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) +#else +#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) +#endif + +#ifdef XML_MIN_SIZE +#define BYTE_TO_ASCII(enc, p) \ + (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) +static int PTRFASTCALL +sb_byteToAscii(const ENCODING *enc, const char *p) +{ + return *p; +} +#else +#define BYTE_TO_ASCII(enc, p) (*(p)) +#endif + +#define IS_NAME_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) +#define IS_NMSTRT_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) +#define IS_INVALID_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) + +#ifdef XML_MIN_SIZE +#define IS_NAME_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) +#else +#define IS_NAME_CHAR_MINBPC(enc, p) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) +#endif + +#ifdef XML_MIN_SIZE +#define CHAR_MATCHES(enc, p, c) \ + (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) +static int PTRCALL +sb_charMatches(const ENCODING *enc, const char *p, int c) +{ + return *p == c; +} +#else +/* c is an ASCII character */ +#define CHAR_MATCHES(enc, p, c) (*(p) == c) +#endif + +#define PREFIX(ident) normal_ ## ident +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ + UTF8_cval1 = 0x00, + UTF8_cval2 = 0xc0, + UTF8_cval3 = 0xe0, + UTF8_cval4 = 0xf0 +}; + +static void PTRCALL +utf8_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + char *to; + const char *from; + if (fromLim - *fromP > toLim - *toP) { + /* Avoid copying partial characters. */ + for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) + if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) + break; + } + for (to = *toP, from = *fromP; from != fromLim; from++, to++) + *to = *from; + *fromP = from; + *toP = to; +} + +static void PTRCALL +utf8_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + unsigned short *to = *toP; + const char *from = *fromP; + while (from != fromLim && to != toLim) { + switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { + case BT_LEAD2: + *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); + from += 2; + break; + case BT_LEAD3: + *to++ = (unsigned short)(((from[0] & 0xf) << 12) + | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); + from += 3; + break; + case BT_LEAD4: + { + unsigned long n; + if (to + 1 == toLim) + goto after; + n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) + | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); + n -= 0x10000; + to[0] = (unsigned short)((n >> 10) | 0xD800); + to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); + to += 2; + from += 4; + } + break; + default: + *to++ = *from++; + break; + } + } +after: + *fromP = from; + *toP = to; +} + +#ifdef XML_NS +static const struct normal_encoding utf8_encoding_ns = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#include "asciitab.h" +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; +#endif + +static const struct normal_encoding utf8_encoding = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +#ifdef XML_NS + +static const struct normal_encoding internal_utf8_encoding_ns = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#include "iasciitab.h" +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +#endif + +static const struct normal_encoding internal_utf8_encoding = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +static void PTRCALL +latin1_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + for (;;) { + unsigned char c; + if (*fromP == fromLim) + break; + c = (unsigned char)**fromP; + if (c & 0x80) { + if (toLim - *toP < 2) + break; + *(*toP)++ = (char)((c >> 6) | UTF8_cval2); + *(*toP)++ = (char)((c & 0x3f) | 0x80); + (*fromP)++; + } + else { + if (*toP == toLim) + break; + *(*toP)++ = *(*fromP)++; + } + } +} + +static void PTRCALL +latin1_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + while (*fromP != fromLim && *toP != toLim) + *(*toP)++ = (unsigned char)*(*fromP)++; +} + +#ifdef XML_NS + +static const struct normal_encoding latin1_encoding_ns = { + { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) +}; + +#endif + +static const struct normal_encoding latin1_encoding = { + { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) +}; + +static void PTRCALL +ascii_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + while (*fromP != fromLim && *toP != toLim) + *(*toP)++ = *(*fromP)++; +} + +#ifdef XML_NS + +static const struct normal_encoding ascii_encoding_ns = { + { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, + { +#include "asciitab.h" +/* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) +}; + +#endif + +static const struct normal_encoding ascii_encoding = { + { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +/* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) +}; + +static int PTRFASTCALL +unicode_byte_type(char hi, char lo) +{ + switch ((unsigned char)hi) { + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + return BT_LEAD4; + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + return BT_TRAIL; + case 0xFF: + switch ((unsigned char)lo) { + case 0xFF: + case 0xFE: + return BT_NONXML; + } + break; + } + return BT_NONASCII; +} + +#define DEFINE_UTF16_TO_UTF8(E) \ +static void PTRCALL \ +E ## toUtf8(const ENCODING *enc, \ + const char **fromP, const char *fromLim, \ + char **toP, const char *toLim) \ +{ \ + const char *from; \ + for (from = *fromP; from != fromLim; from += 2) { \ + int plane; \ + unsigned char lo2; \ + unsigned char lo = GET_LO(from); \ + unsigned char hi = GET_HI(from); \ + switch (hi) { \ + case 0: \ + if (lo < 0x80) { \ + if (*toP == toLim) { \ + *fromP = from; \ + return; \ + } \ + *(*toP)++ = lo; \ + break; \ + } \ + /* fall through */ \ + case 0x1: case 0x2: case 0x3: \ + case 0x4: case 0x5: case 0x6: case 0x7: \ + if (toLim - *toP < 2) { \ + *fromP = from; \ + return; \ + } \ + *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + default: \ + if (toLim - *toP < 3) { \ + *fromP = from; \ + return; \ + } \ + /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ + *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ + *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ + if (toLim - *toP < 4) { \ + *fromP = from; \ + return; \ + } \ + plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ + *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ + *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ + from += 2; \ + lo2 = GET_LO(from); \ + *(*toP)++ = (((lo & 0x3) << 4) \ + | ((GET_HI(from) & 0x3) << 2) \ + | (lo2 >> 6) \ + | 0x80); \ + *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ + break; \ + } \ + } \ + *fromP = from; \ +} + +#define DEFINE_UTF16_TO_UTF16(E) \ +static void PTRCALL \ +E ## toUtf16(const ENCODING *enc, \ + const char **fromP, const char *fromLim, \ + unsigned short **toP, const unsigned short *toLim) \ +{ \ + /* Avoid copying first half only of surrogate */ \ + if (fromLim - *fromP > ((toLim - *toP) << 1) \ + && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ + fromLim -= 2; \ + for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ + *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ +} + +#define SET2(ptr, ch) \ + (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) +#define GET_LO(ptr) ((unsigned char)(ptr)[0]) +#define GET_HI(ptr) ((unsigned char)(ptr)[1]) + +DEFINE_UTF16_TO_UTF8(little2_) +DEFINE_UTF16_TO_UTF16(little2_) + +#undef SET2 +#undef GET_LO +#undef GET_HI + +#define SET2(ptr, ch) \ + (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) +#define GET_LO(ptr) ((unsigned char)(ptr)[1]) +#define GET_HI(ptr) ((unsigned char)(ptr)[0]) + +DEFINE_UTF16_TO_UTF8(big2_) +DEFINE_UTF16_TO_UTF16(big2_) + +#undef SET2 +#undef GET_LO +#undef GET_HI + +#define LITTLE2_BYTE_TYPE(enc, p) \ + ((p)[1] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ + : unicode_byte_type((p)[1], (p)[0])) +#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) +#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) +#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) +#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) + +#ifdef XML_MIN_SIZE + +static int PTRFASTCALL +little2_byteType(const ENCODING *enc, const char *p) +{ + return LITTLE2_BYTE_TYPE(enc, p); +} + +static int PTRFASTCALL +little2_byteToAscii(const ENCODING *enc, const char *p) +{ + return LITTLE2_BYTE_TO_ASCII(enc, p); +} + +static int PTRCALL +little2_charMatches(const ENCODING *enc, const char *p, int c) +{ + return LITTLE2_CHAR_MATCHES(enc, p, c); +} + +static int PTRFASTCALL +little2_isNameMin(const ENCODING *enc, const char *p) +{ + return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); +} + +static int PTRFASTCALL +little2_isNmstrtMin(const ENCODING *enc, const char *p) +{ + return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); +} + +#undef VTABLE +#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 + +#else /* not XML_MIN_SIZE */ + +#undef PREFIX +#define PREFIX(ident) little2_ ## ident +#define MINBPC(enc) 2 +/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ +#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) +#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) +#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) +#define IS_NAME_CHAR(enc, p, n) 0 +#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) +#define IS_NMSTRT_CHAR(enc, p, n) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) + +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +#endif /* not XML_MIN_SIZE */ + +#ifdef XML_NS + +static const struct normal_encoding little2_encoding_ns = { + { VTABLE, 2, 0, +#if BYTEORDER == 1234 + 1 +#else + 0 +#endif + }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + +static const struct normal_encoding little2_encoding = { + { VTABLE, 2, 0, +#if BYTEORDER == 1234 + 1 +#else + 0 +#endif + }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#if BYTEORDER != 4321 + +#ifdef XML_NS + +static const struct normal_encoding internal_little2_encoding_ns = { + { VTABLE, 2, 0, 1 }, + { +#include "iasciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + +static const struct normal_encoding internal_little2_encoding = { + { VTABLE, 2, 0, 1 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + + +#define BIG2_BYTE_TYPE(enc, p) \ + ((p)[0] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ + : unicode_byte_type((p)[0], (p)[1])) +#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) +#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) +#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) +#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) + +#ifdef XML_MIN_SIZE + +static int PTRFASTCALL +big2_byteType(const ENCODING *enc, const char *p) +{ + return BIG2_BYTE_TYPE(enc, p); +} + +static int PTRFASTCALL +big2_byteToAscii(const ENCODING *enc, const char *p) +{ + return BIG2_BYTE_TO_ASCII(enc, p); +} + +static int PTRCALL +big2_charMatches(const ENCODING *enc, const char *p, int c) +{ + return BIG2_CHAR_MATCHES(enc, p, c); +} + +static int PTRFASTCALL +big2_isNameMin(const ENCODING *enc, const char *p) +{ + return BIG2_IS_NAME_CHAR_MINBPC(enc, p); +} + +static int PTRFASTCALL +big2_isNmstrtMin(const ENCODING *enc, const char *p) +{ + return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); +} + +#undef VTABLE +#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 + +#else /* not XML_MIN_SIZE */ + +#undef PREFIX +#define PREFIX(ident) big2_ ## ident +#define MINBPC(enc) 2 +/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ +#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) +#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) +#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) +#define IS_NAME_CHAR(enc, p, n) 0 +#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) +#define IS_NMSTRT_CHAR(enc, p, n) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) + +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +#endif /* not XML_MIN_SIZE */ + +#ifdef XML_NS + +static const struct normal_encoding big2_encoding_ns = { + { VTABLE, 2, 0, +#if BYTEORDER == 4321 + 1 +#else + 0 +#endif + }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +static const struct normal_encoding big2_encoding = { + { VTABLE, 2, 0, +#if BYTEORDER == 4321 + 1 +#else + 0 +#endif + }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#if BYTEORDER != 1234 + +#ifdef XML_NS + +static const struct normal_encoding internal_big2_encoding_ns = { + { VTABLE, 2, 0, 1 }, + { +#include "iasciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +static const struct normal_encoding internal_big2_encoding = { + { VTABLE, 2, 0, 1 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +#undef PREFIX + +static int FASTCALL +streqci(const char *s1, const char *s2) +{ + for (;;) { + char c1 = *s1++; + char c2 = *s2++; + if (ASCII_a <= c1 && c1 <= ASCII_z) + c1 += ASCII_A - ASCII_a; + if (ASCII_a <= c2 && c2 <= ASCII_z) + c2 += ASCII_A - ASCII_a; + if (c1 != c2) + return 0; + if (!c1) + break; + } + return 1; +} + +static void PTRCALL +initUpdatePosition(const ENCODING *enc, const char *ptr, + const char *end, POSITION *pos) +{ + normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); +} + +static int +toAscii(const ENCODING *enc, const char *ptr, const char *end) +{ + char buf[1]; + char *p = buf; + XmlUtf8Convert(enc, &ptr, end, &p, p + 1); + if (p == buf) + return -1; + else + return buf[0]; +} + +static int FASTCALL +isSpace(int c) +{ + switch (c) { + case 0x20: + case 0xD: + case 0xA: + case 0x9: + return 1; + } + return 0; +} + +/* Return 1 if there's just optional white space or there's an S + followed by name=val. +*/ +static int +parsePseudoAttribute(const ENCODING *enc, + const char *ptr, + const char *end, + const char **namePtr, + const char **nameEndPtr, + const char **valPtr, + const char **nextTokPtr) +{ + int c; + char open; + if (ptr == end) { + *namePtr = NULL; + return 1; + } + if (!isSpace(toAscii(enc, ptr, end))) { + *nextTokPtr = ptr; + return 0; + } + do { + ptr += enc->minBytesPerChar; + } while (isSpace(toAscii(enc, ptr, end))); + if (ptr == end) { + *namePtr = NULL; + return 1; + } + *namePtr = ptr; + for (;;) { + c = toAscii(enc, ptr, end); + if (c == -1) { + *nextTokPtr = ptr; + return 0; + } + if (c == ASCII_EQUALS) { + *nameEndPtr = ptr; + break; + } + if (isSpace(c)) { + *nameEndPtr = ptr; + do { + ptr += enc->minBytesPerChar; + } while (isSpace(c = toAscii(enc, ptr, end))); + if (c != ASCII_EQUALS) { + *nextTokPtr = ptr; + return 0; + } + break; + } + ptr += enc->minBytesPerChar; + } + if (ptr == *namePtr) { + *nextTokPtr = ptr; + return 0; + } + ptr += enc->minBytesPerChar; + c = toAscii(enc, ptr, end); + while (isSpace(c)) { + ptr += enc->minBytesPerChar; + c = toAscii(enc, ptr, end); + } + if (c != ASCII_QUOT && c != ASCII_APOS) { + *nextTokPtr = ptr; + return 0; + } + open = (char)c; + ptr += enc->minBytesPerChar; + *valPtr = ptr; + for (;; ptr += enc->minBytesPerChar) { + c = toAscii(enc, ptr, end); + if (c == open) + break; + if (!(ASCII_a <= c && c <= ASCII_z) + && !(ASCII_A <= c && c <= ASCII_Z) + && !(ASCII_0 <= c && c <= ASCII_9) + && c != ASCII_PERIOD + && c != ASCII_MINUS + && c != ASCII_UNDERSCORE) { + *nextTokPtr = ptr; + return 0; + } + } + *nextTokPtr = ptr + enc->minBytesPerChar; + return 1; +} + +static const char KW_version[] = { + ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' +}; + +static const char KW_encoding[] = { + ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' +}; + +static const char KW_standalone[] = { + ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, + ASCII_n, ASCII_e, '\0' +}; + +static const char KW_yes[] = { + ASCII_y, ASCII_e, ASCII_s, '\0' +}; + +static const char KW_no[] = { + ASCII_n, ASCII_o, '\0' +}; + +static int +doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, + const char *, + const char *), + int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingName, + const ENCODING **encoding, + int *standalone) +{ + const char *val = NULL; + const char *name = NULL; + const char *nameEnd = NULL; + ptr += 5 * enc->minBytesPerChar; + end -= 2 * enc->minBytesPerChar; + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) + || !name) { + *badPtr = ptr; + return 0; + } + if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { + if (!isGeneralTextEntity) { + *badPtr = name; + return 0; + } + } + else { + if (versionPtr) + *versionPtr = val; + if (versionEndPtr) + *versionEndPtr = ptr; + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + *badPtr = ptr; + return 0; + } + if (!name) { + if (isGeneralTextEntity) { + /* a TextDecl must have an EncodingDecl */ + *badPtr = ptr; + return 0; + } + return 1; + } + } + if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { + int c = toAscii(enc, val, end); + if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { + *badPtr = val; + return 0; + } + if (encodingName) + *encodingName = val; + if (encoding) + *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + *badPtr = ptr; + return 0; + } + if (!name) + return 1; + } + if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) + || isGeneralTextEntity) { + *badPtr = name; + return 0; + } + if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { + if (standalone) + *standalone = 1; + } + else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { + if (standalone) + *standalone = 0; + } + else { + *badPtr = val; + return 0; + } + while (isSpace(toAscii(enc, ptr, end))) + ptr += enc->minBytesPerChar; + if (ptr != end) { + *badPtr = ptr; + return 0; + } + return 1; +} + +static int FASTCALL +checkCharRefNumber(int result) +{ + switch (result >> 8) { + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + return -1; + case 0: + if (latin1_encoding.type[result] == BT_NONXML) + return -1; + break; + case 0xFF: + if (result == 0xFFFE || result == 0xFFFF) + return -1; + break; + } + return result; +} + +int FASTCALL +XmlUtf8Encode(int c, char *buf) +{ + enum { + /* minN is minimum legal resulting value for N byte sequence */ + min2 = 0x80, + min3 = 0x800, + min4 = 0x10000 + }; + + if (c < 0) + return 0; + if (c < min2) { + buf[0] = (char)(c | UTF8_cval1); + return 1; + } + if (c < min3) { + buf[0] = (char)((c >> 6) | UTF8_cval2); + buf[1] = (char)((c & 0x3f) | 0x80); + return 2; + } + if (c < min4) { + buf[0] = (char)((c >> 12) | UTF8_cval3); + buf[1] = (char)(((c >> 6) & 0x3f) | 0x80); + buf[2] = (char)((c & 0x3f) | 0x80); + return 3; + } + if (c < 0x110000) { + buf[0] = (char)((c >> 18) | UTF8_cval4); + buf[1] = (char)(((c >> 12) & 0x3f) | 0x80); + buf[2] = (char)(((c >> 6) & 0x3f) | 0x80); + buf[3] = (char)((c & 0x3f) | 0x80); + return 4; + } + return 0; +} + +int FASTCALL +XmlUtf16Encode(int charNum, unsigned short *buf) +{ + if (charNum < 0) + return 0; + if (charNum < 0x10000) { + buf[0] = (unsigned short)charNum; + return 1; + } + if (charNum < 0x110000) { + charNum -= 0x10000; + buf[0] = (unsigned short)((charNum >> 10) + 0xD800); + buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00); + return 2; + } + return 0; +} + +struct unknown_encoding { + struct normal_encoding normal; + CONVERTER convert; + void *userData; + unsigned short utf16[256]; + char utf8[256][4]; +}; + +#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) + +int +XmlSizeOfUnknownEncoding(void) +{ + return sizeof(struct unknown_encoding); +} + +static int PTRFASTCALL +unknown_isName(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + if (c & ~0xFFFF) + return 0; + return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); +} + +static int PTRFASTCALL +unknown_isNmstrt(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + if (c & ~0xFFFF) + return 0; + return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); +} + +static int PTRFASTCALL +unknown_isInvalid(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; +} + +static void PTRCALL +unknown_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + char buf[XML_UTF8_ENCODE_MAX]; + for (;;) { + const char *utf8; + int n; + if (*fromP == fromLim) + break; + utf8 = uenc->utf8[(unsigned char)**fromP]; + n = *utf8++; + if (n == 0) { + int c = uenc->convert(uenc->userData, *fromP); + n = XmlUtf8Encode(c, buf); + if (n > toLim - *toP) + break; + utf8 = buf; + *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] + - (BT_LEAD2 - 2)); + } + else { + if (n > toLim - *toP) + break; + (*fromP)++; + } + do { + *(*toP)++ = *utf8++; + } while (--n != 0); + } +} + +static void PTRCALL +unknown_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + while (*fromP != fromLim && *toP != toLim) { + unsigned short c = uenc->utf16[(unsigned char)**fromP]; + if (c == 0) { + c = (unsigned short) + uenc->convert(uenc->userData, *fromP); + *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] + - (BT_LEAD2 - 2)); + } + else + (*fromP)++; + *(*toP)++ = c; + } +} + +ENCODING * +XmlInitUnknownEncoding(void *mem, + int *table, + CONVERTER convert, + void *userData) +{ + int i; + struct unknown_encoding *e = (struct unknown_encoding *)mem; + for (i = 0; i < (int)sizeof(struct normal_encoding); i++) + ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; + for (i = 0; i < 128; i++) + if (latin1_encoding.type[i] != BT_OTHER + && latin1_encoding.type[i] != BT_NONXML + && table[i] != i) + return 0; + for (i = 0; i < 256; i++) { + int c = table[i]; + if (c == -1) { + e->normal.type[i] = BT_MALFORM; + /* This shouldn't really get used. */ + e->utf16[i] = 0xFFFF; + e->utf8[i][0] = 1; + e->utf8[i][1] = 0; + } + else if (c < 0) { + if (c < -4) + return 0; + e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); + e->utf8[i][0] = 0; + e->utf16[i] = 0; + } + else if (c < 0x80) { + if (latin1_encoding.type[c] != BT_OTHER + && latin1_encoding.type[c] != BT_NONXML + && c != i) + return 0; + e->normal.type[i] = latin1_encoding.type[c]; + e->utf8[i][0] = 1; + e->utf8[i][1] = (char)c; + e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); + } + else if (checkCharRefNumber(c) < 0) { + e->normal.type[i] = BT_NONXML; + /* This shouldn't really get used. */ + e->utf16[i] = 0xFFFF; + e->utf8[i][0] = 1; + e->utf8[i][1] = 0; + } + else { + if (c > 0xFFFF) + return 0; + if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) + e->normal.type[i] = BT_NMSTRT; + else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) + e->normal.type[i] = BT_NAME; + else + e->normal.type[i] = BT_OTHER; + e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); + e->utf16[i] = (unsigned short)c; + } + } + e->userData = userData; + e->convert = convert; + if (convert) { + e->normal.isName2 = unknown_isName; + e->normal.isName3 = unknown_isName; + e->normal.isName4 = unknown_isName; + e->normal.isNmstrt2 = unknown_isNmstrt; + e->normal.isNmstrt3 = unknown_isNmstrt; + e->normal.isNmstrt4 = unknown_isNmstrt; + e->normal.isInvalid2 = unknown_isInvalid; + e->normal.isInvalid3 = unknown_isInvalid; + e->normal.isInvalid4 = unknown_isInvalid; + } + e->normal.enc.utf8Convert = unknown_toUtf8; + e->normal.enc.utf16Convert = unknown_toUtf16; + return &(e->normal.enc); +} + +/* If this enumeration is changed, getEncodingIndex and encodings +must also be changed. */ +enum { + UNKNOWN_ENC = -1, + ISO_8859_1_ENC = 0, + US_ASCII_ENC, + UTF_8_ENC, + UTF_16_ENC, + UTF_16BE_ENC, + UTF_16LE_ENC, + /* must match encodingNames up to here */ + NO_ENC +}; + +static const char KW_ISO_8859_1[] = { + ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, + ASCII_MINUS, ASCII_1, '\0' +}; +static const char KW_US_ASCII[] = { + ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, + '\0' +}; +static const char KW_UTF_8[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' +}; +static const char KW_UTF_16[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' +}; +static const char KW_UTF_16BE[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, + '\0' +}; +static const char KW_UTF_16LE[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, + '\0' +}; + +static int FASTCALL +getEncodingIndex(const char *name) +{ + static const char *encodingNames[] = { + KW_ISO_8859_1, + KW_US_ASCII, + KW_UTF_8, + KW_UTF_16, + KW_UTF_16BE, + KW_UTF_16LE, + }; + int i; + if (name == NULL) + return NO_ENC; + for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) + if (streqci(name, encodingNames[i])) + return i; + return UNKNOWN_ENC; +} + +/* For binary compatibility, we store the index of the encoding + specified at initialization in the isUtf16 member. +*/ + +#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) +#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) + +/* This is what detects the encoding. encodingTable maps from + encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of + the external (protocol) specified encoding; state is + XML_CONTENT_STATE if we're parsing an external text entity, and + XML_PROLOG_STATE otherwise. +*/ + + +static int +initScan(const ENCODING **encodingTable, + const INIT_ENCODING *enc, + int state, + const char *ptr, + const char *end, + const char **nextTokPtr) +{ + const ENCODING **encPtr; + + if (ptr == end) + return XML_TOK_NONE; + encPtr = enc->encPtr; + if (ptr + 1 == end) { + /* only a single byte available for auto-detection */ +#ifndef XML_DTD /* FIXME */ + /* a well-formed document entity must have more than one byte */ + if (state != XML_CONTENT_STATE) + return XML_TOK_PARTIAL; +#endif + /* so we're parsing an external text entity... */ + /* if UTF-16 was externally specified, then we need at least 2 bytes */ + switch (INIT_ENC_INDEX(enc)) { + case UTF_16_ENC: + case UTF_16LE_ENC: + case UTF_16BE_ENC: + return XML_TOK_PARTIAL; + } + switch ((unsigned char)*ptr) { + case 0xFE: + case 0xFF: + case 0xEF: /* possibly first byte of UTF-8 BOM */ + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + /* fall through */ + case 0x00: + case 0x3C: + return XML_TOK_PARTIAL; + } + } + else { + switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { + case 0xFEFF: + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + *nextTokPtr = ptr + 2; + *encPtr = encodingTable[UTF_16BE_ENC]; + return XML_TOK_BOM; + /* 00 3C is handled in the default case */ + case 0x3C00: + if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC + || INIT_ENC_INDEX(enc) == UTF_16_ENC) + && state == XML_CONTENT_STATE) + break; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + case 0xFFFE: + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + *nextTokPtr = ptr + 2; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XML_TOK_BOM; + case 0xEFBB: + /* Maybe a UTF-8 BOM (EF BB BF) */ + /* If there's an explicitly specified (external) encoding + of ISO-8859-1 or some flavour of UTF-16 + and this is an external text entity, + don't look for the BOM, + because it might be a legal data. + */ + if (state == XML_CONTENT_STATE) { + int e = INIT_ENC_INDEX(enc); + if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC + || e == UTF_16LE_ENC || e == UTF_16_ENC) + break; + } + if (ptr + 2 == end) + return XML_TOK_PARTIAL; + if ((unsigned char)ptr[2] == 0xBF) { + *nextTokPtr = ptr + 3; + *encPtr = encodingTable[UTF_8_ENC]; + return XML_TOK_BOM; + } + break; + default: + if (ptr[0] == '\0') { + /* 0 isn't a legal data character. Furthermore a document + entity can only start with ASCII characters. So the only + way this can fail to be big-endian UTF-16 if it it's an + external parsed general entity that's labelled as + UTF-16LE. + */ + if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) + break; + *encPtr = encodingTable[UTF_16BE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + } + else if (ptr[1] == '\0') { + /* We could recover here in the case: + - parsing an external entity + - second byte is 0 + - no externally specified encoding + - no encoding declaration + by assuming UTF-16LE. But we don't, because this would mean when + presented just with a single byte, we couldn't reliably determine + whether we needed further bytes. + */ + if (state == XML_CONTENT_STATE) + break; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + } + break; + } + } + *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); +} + + +#define NS(x) x +#define ns(x) x +#include "xmltok_ns.c" +#undef NS +#undef ns + +#ifdef XML_NS + +#define NS(x) x ## NS +#define ns(x) x ## _ns + +#include "xmltok_ns.c" + +#undef NS +#undef ns + +ENCODING * +XmlInitUnknownEncodingNS(void *mem, + int *table, + CONVERTER convert, + void *userData) +{ + ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); + if (enc) + ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; + return enc; +} + +#endif /* XML_NS */ Added: external/celementtree-1.0.4-20051213/expat/xmltok.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/xmltok.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,316 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlTok_INCLUDED +#define XmlTok_INCLUDED 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* The following token may be returned by XmlContentTok */ +#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be + start of illegal ]]> sequence */ +/* The following tokens may be returned by both XmlPrologTok and + XmlContentTok. +*/ +#define XML_TOK_NONE -4 /* The string to be scanned is empty */ +#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; + might be part of CRLF sequence */ +#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ +#define XML_TOK_PARTIAL -1 /* only part of a token */ +#define XML_TOK_INVALID 0 + +/* The following tokens are returned by XmlContentTok; some are also + returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. +*/ +#define XML_TOK_START_TAG_WITH_ATTS 1 +#define XML_TOK_START_TAG_NO_ATTS 2 +#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ +#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 +#define XML_TOK_END_TAG 5 +#define XML_TOK_DATA_CHARS 6 +#define XML_TOK_DATA_NEWLINE 7 +#define XML_TOK_CDATA_SECT_OPEN 8 +#define XML_TOK_ENTITY_REF 9 +#define XML_TOK_CHAR_REF 10 /* numeric character reference */ + +/* The following tokens may be returned by both XmlPrologTok and + XmlContentTok. +*/ +#define XML_TOK_PI 11 /* processing instruction */ +#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ +#define XML_TOK_COMMENT 13 +#define XML_TOK_BOM 14 /* Byte order mark */ + +/* The following tokens are returned only by XmlPrologTok */ +#define XML_TOK_PROLOG_S 15 +#define XML_TOK_DECL_OPEN 16 /* */ +#define XML_TOK_NAME 18 +#define XML_TOK_NMTOKEN 19 +#define XML_TOK_POUND_NAME 20 /* #name */ +#define XML_TOK_OR 21 /* | */ +#define XML_TOK_PERCENT 22 +#define XML_TOK_OPEN_PAREN 23 +#define XML_TOK_CLOSE_PAREN 24 +#define XML_TOK_OPEN_BRACKET 25 +#define XML_TOK_CLOSE_BRACKET 26 +#define XML_TOK_LITERAL 27 +#define XML_TOK_PARAM_ENTITY_REF 28 +#define XML_TOK_INSTANCE_START 29 + +/* The following occur only in element type declarations */ +#define XML_TOK_NAME_QUESTION 30 /* name? */ +#define XML_TOK_NAME_ASTERISK 31 /* name* */ +#define XML_TOK_NAME_PLUS 32 /* name+ */ +#define XML_TOK_COND_SECT_OPEN 33 /* */ +#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ +#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ +#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ +#define XML_TOK_COMMA 38 + +/* The following token is returned only by XmlAttributeValueTok */ +#define XML_TOK_ATTRIBUTE_VALUE_S 39 + +/* The following token is returned only by XmlCdataSectionTok */ +#define XML_TOK_CDATA_SECT_CLOSE 40 + +/* With namespace processing this is returned by XmlPrologTok for a + name with a colon. +*/ +#define XML_TOK_PREFIXED_NAME 41 + +#ifdef XML_DTD +#define XML_TOK_IGNORE_SECT 42 +#endif /* XML_DTD */ + +#ifdef XML_DTD +#define XML_N_STATES 4 +#else /* not XML_DTD */ +#define XML_N_STATES 3 +#endif /* not XML_DTD */ + +#define XML_PROLOG_STATE 0 +#define XML_CONTENT_STATE 1 +#define XML_CDATA_SECTION_STATE 2 +#ifdef XML_DTD +#define XML_IGNORE_SECTION_STATE 3 +#endif /* XML_DTD */ + +#define XML_N_LITERAL_TYPES 2 +#define XML_ATTRIBUTE_VALUE_LITERAL 0 +#define XML_ENTITY_VALUE_LITERAL 1 + +/* The size of the buffer passed to XmlUtf8Encode must be at least this. */ +#define XML_UTF8_ENCODE_MAX 4 +/* The size of the buffer passed to XmlUtf16Encode must be at least this. */ +#define XML_UTF16_ENCODE_MAX 2 + +typedef struct position { + /* first line and first column are 0 not 1 */ + unsigned long lineNumber; + unsigned long columnNumber; +} POSITION; + +typedef struct { + const char *name; + const char *valuePtr; + const char *valueEnd; + char normalized; +} ATTRIBUTE; + +struct encoding; +typedef struct encoding ENCODING; + +typedef int (PTRCALL *SCANNER)(const ENCODING *, + const char *, + const char *, + const char **); + +struct encoding { + SCANNER scanners[XML_N_STATES]; + SCANNER literalScanners[XML_N_LITERAL_TYPES]; + int (PTRCALL *sameName)(const ENCODING *, + const char *, + const char *); + int (PTRCALL *nameMatchesAscii)(const ENCODING *, + const char *, + const char *, + const char *); + int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); + const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); + int (PTRCALL *getAtts)(const ENCODING *enc, + const char *ptr, + int attsMax, + ATTRIBUTE *atts); + int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); + int (PTRCALL *predefinedEntityName)(const ENCODING *, + const char *, + const char *); + void (PTRCALL *updatePosition)(const ENCODING *, + const char *ptr, + const char *end, + POSITION *); + int (PTRCALL *isPublicId)(const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr); + void (PTRCALL *utf8Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + char **toP, + const char *toLim); + void (PTRCALL *utf16Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + unsigned short **toP, + const unsigned short *toLim); + int minBytesPerChar; + char isUtf8; + char isUtf16; +}; + +/* Scan the string starting at ptr until the end of the next complete + token, but do not scan past eptr. Return an integer giving the + type of token. + + Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. + + Return XML_TOK_PARTIAL when the string does not contain a complete + token; nextTokPtr will not be set. + + Return XML_TOK_INVALID when the string does not start a valid + token; nextTokPtr will be set to point to the character which made + the token invalid. + + Otherwise the string starts with a valid token; nextTokPtr will be + set to point to the character following the end of that token. + + Each data character counts as a single token, but adjacent data + characters may be returned together. Similarly for characters in + the prolog outside literals, comments and processing instructions. +*/ + + +#define XmlTok(enc, state, ptr, end, nextTokPtr) \ + (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) + +#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) + +#define XmlContentTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) + +#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) + +#ifdef XML_DTD + +#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) + +#endif /* XML_DTD */ + +/* This is used for performing a 2nd-level tokenization on the content + of a literal that has already been returned by XmlTok. +*/ +#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ + (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) + +#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) + +#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) + +#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) + +#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ + (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) + +#define XmlNameLength(enc, ptr) \ + (((enc)->nameLength)(enc, ptr)) + +#define XmlSkipS(enc, ptr) \ + (((enc)->skipS)(enc, ptr)) + +#define XmlGetAttributes(enc, ptr, attsMax, atts) \ + (((enc)->getAtts)(enc, ptr, attsMax, atts)) + +#define XmlCharRefNumber(enc, ptr) \ + (((enc)->charRefNumber)(enc, ptr)) + +#define XmlPredefinedEntityName(enc, ptr, end) \ + (((enc)->predefinedEntityName)(enc, ptr, end)) + +#define XmlUpdatePosition(enc, ptr, end, pos) \ + (((enc)->updatePosition)(enc, ptr, end, pos)) + +#define XmlIsPublicId(enc, ptr, end, badPtr) \ + (((enc)->isPublicId)(enc, ptr, end, badPtr)) + +#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ + (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) + +#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ + (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) + +typedef struct { + ENCODING initEnc; + const ENCODING **encPtr; +} INIT_ENCODING; + +int XmlParseXmlDecl(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingNamePtr, + const ENCODING **namedEncodingPtr, + int *standalonePtr); + +int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); +const ENCODING *XmlGetUtf8InternalEncoding(void); +const ENCODING *XmlGetUtf16InternalEncoding(void); +int FASTCALL XmlUtf8Encode(int charNumber, char *buf); +int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); +int XmlSizeOfUnknownEncoding(void); + + +typedef int (XMLCALL *CONVERTER) (void *userData, const char *p); + +ENCODING * +XmlInitUnknownEncoding(void *mem, + int *table, + CONVERTER convert, + void *userData); + +int XmlParseXmlDeclNS(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingNamePtr, + const ENCODING **namedEncodingPtr, + int *standalonePtr); + +int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); +const ENCODING *XmlGetUtf8InternalEncodingNS(void); +const ENCODING *XmlGetUtf16InternalEncodingNS(void); +ENCODING * +XmlInitUnknownEncodingNS(void *mem, + int *table, + CONVERTER convert, + void *userData); +#ifdef __cplusplus +} +#endif + +#endif /* not XmlTok_INCLUDED */ Added: external/celementtree-1.0.4-20051213/expat/xmltok_impl.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/xmltok_impl.c Wed Dec 14 22:43:26 2005 @@ -0,0 +1,1779 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef IS_INVALID_CHAR +#define IS_INVALID_CHAR(enc, ptr, n) (0) +#endif + +#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_INVALID_CHAR(enc, ptr, n)) { \ + *(nextTokPtr) = (ptr); \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define INVALID_CASES(ptr, nextTokPtr) \ + INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ + INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ + INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ + case BT_NONXML: \ + case BT_MALFORM: \ + case BT_TRAIL: \ + *(nextTokPtr) = (ptr); \ + return XML_TOK_INVALID; + +#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (!IS_NAME_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ + case BT_NONASCII: \ + if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + case BT_NMSTRT: \ + case BT_HEX: \ + case BT_DIGIT: \ + case BT_NAME: \ + case BT_MINUS: \ + ptr += MINBPC(enc); \ + break; \ + CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ + CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ + CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) + +#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ + case BT_NONASCII: \ + if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + case BT_NMSTRT: \ + case BT_HEX: \ + ptr += MINBPC(enc); \ + break; \ + CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ + CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ + CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) + +#ifndef PREFIX +#define PREFIX(ident) ident +#endif + +/* ptr points to character following " */ + switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { + case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + /* fall through */ + case BT_S: case BT_CR: case BT_LF: + *nextTokPtr = ptr; + return XML_TOK_DECL_OPEN; + case BT_NMSTRT: + case BT_HEX: + ptr += MINBPC(enc); + break; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, + const char *end, int *tokPtr) +{ + int upper = 0; + *tokPtr = XML_TOK_PI; + if (end - ptr != MINBPC(enc)*3) + return 1; + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_x: + break; + case ASCII_X: + upper = 1; + break; + default: + return 1; + } + ptr += MINBPC(enc); + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_m: + break; + case ASCII_M: + upper = 1; + break; + default: + return 1; + } + ptr += MINBPC(enc); + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_l: + break; + case ASCII_L: + upper = 1; + break; + default: + return 1; + } + if (upper) + return 0; + *tokPtr = XML_TOK_XML_DECL; + return 1; +} + +/* ptr points to character following " 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + break; + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr -= MINBPC(enc); + break; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CDATA_SECT_CLOSE; + case BT_CR: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + case BT_LF: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + INVALID_CASES(ptr, nextTokPtr) + default: + ptr += MINBPC(enc); + break; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONXML: + case BT_MALFORM: + case BT_TRAIL: + case BT_CR: + case BT_LF: + case BT_RSQB: + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +/* ptr points to character following " 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_LT: + return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_AMP: + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_CR: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + case BT_LF: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_RSQB; + if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + break; + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_RSQB; + if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr -= MINBPC(enc); + break; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + INVALID_CASES(ptr, nextTokPtr) + default: + ptr += MINBPC(enc); + break; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_RSQB: + if (ptr + MINBPC(enc) != end) { + if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { + ptr += MINBPC(enc); + break; + } + if (ptr + 2*MINBPC(enc) != end) { + if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { + ptr += MINBPC(enc); + break; + } + *nextTokPtr = ptr + 2*MINBPC(enc); + return XML_TOK_INVALID; + } + } + /* fall through */ + case BT_AMP: + case BT_LT: + case BT_NONXML: + case BT_MALFORM: + case BT_TRAIL: + case BT_CR: + case BT_LF: + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +/* ptr points to character following "%" */ + +static int PTRCALL +PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + if (ptr == end) + return -XML_TOK_PERCENT; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: + *nextTokPtr = ptr; + return XML_TOK_PERCENT; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_SEMI: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_PARAM_ENTITY_REF; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + if (ptr == end) + return XML_TOK_PARTIAL; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_CR: case BT_LF: case BT_S: + case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: + *nextTokPtr = ptr; + return XML_TOK_POUND_NAME; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return -XML_TOK_POUND_NAME; +} + +static int PTRCALL +PREFIX(scanLit)(int open, const ENCODING *enc, + const char *ptr, const char *end, + const char **nextTokPtr) +{ + while (ptr != end) { + int t = BYTE_TYPE(enc, ptr); + switch (t) { + INVALID_CASES(ptr, nextTokPtr) + case BT_QUOT: + case BT_APOS: + ptr += MINBPC(enc); + if (t != open) + break; + if (ptr == end) + return -XML_TOK_LITERAL; + *nextTokPtr = ptr; + switch (BYTE_TYPE(enc, ptr)) { + case BT_S: case BT_CR: case BT_LF: + case BT_GT: case BT_PERCNT: case BT_LSQB: + return XML_TOK_LITERAL; + default: + return XML_TOK_INVALID; + } + default: + ptr += MINBPC(enc); + break; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + int tok; + if (ptr == end) + return XML_TOK_NONE; + if (MINBPC(enc) > 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_QUOT: + return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_APOS: + return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_LT: + { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + switch (BYTE_TYPE(enc, ptr)) { + case BT_EXCL: + return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_QUEST: + return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_NMSTRT: + case BT_HEX: + case BT_NONASCII: + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + *nextTokPtr = ptr - MINBPC(enc); + return XML_TOK_INSTANCE_START; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + case BT_CR: + if (ptr + MINBPC(enc) == end) { + *nextTokPtr = end; + /* indicate that this might be part of a CR/LF pair */ + return -XML_TOK_PROLOG_S; + } + /* fall through */ + case BT_S: case BT_LF: + for (;;) { + ptr += MINBPC(enc); + if (ptr == end) + break; + switch (BYTE_TYPE(enc, ptr)) { + case BT_S: case BT_LF: + break; + case BT_CR: + /* don't split CR/LF pair */ + if (ptr + MINBPC(enc) != end) + break; + /* fall through */ + default: + *nextTokPtr = ptr; + return XML_TOK_PROLOG_S; + } + } + *nextTokPtr = ptr; + return XML_TOK_PROLOG_S; + case BT_PERCNT: + return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_COMMA: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_COMMA; + case BT_LSQB: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OPEN_BRACKET; + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return -XML_TOK_CLOSE_BRACKET; + if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { + if (ptr + MINBPC(enc) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { + *nextTokPtr = ptr + 2*MINBPC(enc); + return XML_TOK_COND_SECT_CLOSE; + } + } + *nextTokPtr = ptr; + return XML_TOK_CLOSE_BRACKET; + case BT_LPAR: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OPEN_PAREN; + case BT_RPAR: + ptr += MINBPC(enc); + if (ptr == end) + return -XML_TOK_CLOSE_PAREN; + switch (BYTE_TYPE(enc, ptr)) { + case BT_AST: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_ASTERISK; + case BT_QUEST: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_QUESTION; + case BT_PLUS: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_PLUS; + case BT_CR: case BT_LF: case BT_S: + case BT_GT: case BT_COMMA: case BT_VERBAR: + case BT_RPAR: + *nextTokPtr = ptr; + return XML_TOK_CLOSE_PAREN; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + case BT_VERBAR: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OR; + case BT_GT: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DECL_CLOSE; + case BT_NUM: + return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NAME; \ + break; \ + } \ + if (IS_NAME_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NMTOKEN; \ + break; \ + } \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NMSTRT: + case BT_HEX: + tok = XML_TOK_NAME; + ptr += MINBPC(enc); + break; + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: +#ifdef XML_NS + case BT_COLON: +#endif + tok = XML_TOK_NMTOKEN; + ptr += MINBPC(enc); + break; + case BT_NONASCII: + if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { + ptr += MINBPC(enc); + tok = XML_TOK_NAME; + break; + } + if (IS_NAME_CHAR_MINBPC(enc, ptr)) { + ptr += MINBPC(enc); + tok = XML_TOK_NMTOKEN; + break; + } + /* fall through */ + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_GT: case BT_RPAR: case BT_COMMA: + case BT_VERBAR: case BT_LSQB: case BT_PERCNT: + case BT_S: case BT_CR: case BT_LF: + *nextTokPtr = ptr; + return tok; +#ifdef XML_NS + case BT_COLON: + ptr += MINBPC(enc); + switch (tok) { + case XML_TOK_NAME: + if (ptr == end) + return XML_TOK_PARTIAL; + tok = XML_TOK_PREFIXED_NAME; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + default: + tok = XML_TOK_NMTOKEN; + break; + } + break; + case XML_TOK_PREFIXED_NAME: + tok = XML_TOK_NMTOKEN; + break; + } + break; +#endif + case BT_PLUS: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_PLUS; + case BT_AST: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_ASTERISK; + case BT_QUEST: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_QUESTION; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return -tok; +} + +static int PTRCALL +PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + const char *start; + if (ptr == end) + return XML_TOK_NONE; + start = ptr; + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_AMP: + if (ptr == start) + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_LT: + /* this is for inside entity references */ + *nextTokPtr = ptr; + return XML_TOK_INVALID; + case BT_LF: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_CR: + if (ptr == start) { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_S: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_ATTRIBUTE_VALUE_S; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +static int PTRCALL +PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + const char *start; + if (ptr == end) + return XML_TOK_NONE; + start = ptr; + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_AMP: + if (ptr == start) + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_PERCNT: + if (ptr == start) { + int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), + end, nextTokPtr); + return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_LF: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_CR: + if (ptr == start) { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +#ifdef XML_DTD + +static int PTRCALL +PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + int level = 0; + if (MINBPC(enc) > 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + end = ptr + n; + } + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + INVALID_CASES(ptr, nextTokPtr) + case BT_LT: + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { + ++level; + ptr += MINBPC(enc); + } + } + break; + case BT_RSQB: + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr += MINBPC(enc); + if (level == 0) { + *nextTokPtr = ptr; + return XML_TOK_IGNORE_SECT; + } + --level; + } + } + break; + default: + ptr += MINBPC(enc); + break; + } + } + return XML_TOK_PARTIAL; +} + +#endif /* XML_DTD */ + +static int PTRCALL +PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, + const char **badPtr) +{ + ptr += MINBPC(enc); + end -= MINBPC(enc); + for (; ptr != end; ptr += MINBPC(enc)) { + switch (BYTE_TYPE(enc, ptr)) { + case BT_DIGIT: + case BT_HEX: + case BT_MINUS: + case BT_APOS: + case BT_LPAR: + case BT_RPAR: + case BT_PLUS: + case BT_COMMA: + case BT_SOL: + case BT_EQUALS: + case BT_QUEST: + case BT_CR: + case BT_LF: + case BT_SEMI: + case BT_EXCL: + case BT_AST: + case BT_PERCNT: + case BT_NUM: +#ifdef XML_NS + case BT_COLON: +#endif + break; + case BT_S: + if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { + *badPtr = ptr; + return 0; + } + break; + case BT_NAME: + case BT_NMSTRT: + if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) + break; + default: + switch (BYTE_TO_ASCII(enc, ptr)) { + case 0x24: /* $ */ + case 0x40: /* @ */ + break; + default: + *badPtr = ptr; + return 0; + } + break; + } + } + return 1; +} + +/* This must only be called for a well-formed start-tag or empty + element tag. Returns the number of attributes. Pointers to the + first attsMax attributes are stored in atts. +*/ + +static int PTRCALL +PREFIX(getAtts)(const ENCODING *enc, const char *ptr, + int attsMax, ATTRIBUTE *atts) +{ + enum { other, inName, inValue } state = inName; + int nAtts = 0; + int open = 0; /* defined when state == inValue; + initialization just to shut up compilers */ + + for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { + switch (BYTE_TYPE(enc, ptr)) { +#define START_NAME \ + if (state == other) { \ + if (nAtts < attsMax) { \ + atts[nAtts].name = ptr; \ + atts[nAtts].normalized = 1; \ + } \ + state = inName; \ + } +#define LEAD_CASE(n) \ + case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONASCII: + case BT_NMSTRT: + case BT_HEX: + START_NAME + break; +#undef START_NAME + case BT_QUOT: + if (state != inValue) { + if (nAtts < attsMax) + atts[nAtts].valuePtr = ptr + MINBPC(enc); + state = inValue; + open = BT_QUOT; + } + else if (open == BT_QUOT) { + state = other; + if (nAtts < attsMax) + atts[nAtts].valueEnd = ptr; + nAtts++; + } + break; + case BT_APOS: + if (state != inValue) { + if (nAtts < attsMax) + atts[nAtts].valuePtr = ptr + MINBPC(enc); + state = inValue; + open = BT_APOS; + } + else if (open == BT_APOS) { + state = other; + if (nAtts < attsMax) + atts[nAtts].valueEnd = ptr; + nAtts++; + } + break; + case BT_AMP: + if (nAtts < attsMax) + atts[nAtts].normalized = 0; + break; + case BT_S: + if (state == inName) + state = other; + else if (state == inValue + && nAtts < attsMax + && atts[nAtts].normalized + && (ptr == atts[nAtts].valuePtr + || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE + || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE + || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) + atts[nAtts].normalized = 0; + break; + case BT_CR: case BT_LF: + /* This case ensures that the first attribute name is counted + Apart from that we could just change state on the quote. */ + if (state == inName) + state = other; + else if (state == inValue && nAtts < attsMax) + atts[nAtts].normalized = 0; + break; + case BT_GT: + case BT_SOL: + if (state != inValue) + return nAtts; + break; + default: + break; + } + } + /* not reached */ +} + +static int PTRFASTCALL +PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) +{ + int result = 0; + /* skip &# */ + ptr += 2*MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_x)) { + for (ptr += MINBPC(enc); + !CHAR_MATCHES(enc, ptr, ASCII_SEMI); + ptr += MINBPC(enc)) { + int c = BYTE_TO_ASCII(enc, ptr); + switch (c) { + case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: + case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: + result <<= 4; + result |= (c - ASCII_0); + break; + case ASCII_A: case ASCII_B: case ASCII_C: + case ASCII_D: case ASCII_E: case ASCII_F: + result <<= 4; + result += 10 + (c - ASCII_A); + break; + case ASCII_a: case ASCII_b: case ASCII_c: + case ASCII_d: case ASCII_e: case ASCII_f: + result <<= 4; + result += 10 + (c - ASCII_a); + break; + } + if (result >= 0x110000) + return -1; + } + } + else { + for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { + int c = BYTE_TO_ASCII(enc, ptr); + result *= 10; + result += (c - ASCII_0); + if (result >= 0x110000) + return -1; + } + } + return checkCharRefNumber(result); +} + +static int PTRCALL +PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, + const char *end) +{ + switch ((end - ptr)/MINBPC(enc)) { + case 2: + if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_l: + return ASCII_LT; + case ASCII_g: + return ASCII_GT; + } + } + break; + case 3: + if (CHAR_MATCHES(enc, ptr, ASCII_a)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_m)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_p)) + return ASCII_AMP; + } + } + break; + case 4: + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_q: + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_u)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_o)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_t)) + return ASCII_QUOT; + } + } + break; + case ASCII_a: + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_p)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_o)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_s)) + return ASCII_APOS; + } + } + break; + } + } + return 0; +} + +static int PTRCALL +PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) +{ + for (;;) { + switch (BYTE_TYPE(enc, ptr1)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (*ptr1++ != *ptr2++) \ + return 0; + LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) +#undef LEAD_CASE + /* fall through */ + if (*ptr1++ != *ptr2++) + return 0; + break; + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 1) { + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 2) { + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 3) { + if (*ptr2++ != *ptr1++) + return 0; + } + } + } + break; + default: + if (MINBPC(enc) == 1 && *ptr1 == *ptr2) + return 1; + switch (BYTE_TYPE(enc, ptr2)) { + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + return 0; + default: + return 1; + } + } + } + /* not reached */ +} + +static int PTRCALL +PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, + const char *end1, const char *ptr2) +{ + for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { + if (ptr1 == end1) + return 0; + if (!CHAR_MATCHES(enc, ptr1, *ptr2)) + return 0; + } + return ptr1 == end1; +} + +static int PTRFASTCALL +PREFIX(nameLength)(const ENCODING *enc, const char *ptr) +{ + const char *start = ptr; + for (;;) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + ptr += MINBPC(enc); + break; + default: + return ptr - start; + } + } +} + +static const char * PTRFASTCALL +PREFIX(skipS)(const ENCODING *enc, const char *ptr) +{ + for (;;) { + switch (BYTE_TYPE(enc, ptr)) { + case BT_LF: + case BT_CR: + case BT_S: + ptr += MINBPC(enc); + break; + default: + return ptr; + } + } +} + +static void PTRCALL +PREFIX(updatePosition)(const ENCODING *enc, + const char *ptr, + const char *end, + POSITION *pos) +{ + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_LF: + pos->columnNumber = (unsigned)-1; + pos->lineNumber++; + ptr += MINBPC(enc); + break; + case BT_CR: + pos->lineNumber++; + ptr += MINBPC(enc); + if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + pos->columnNumber = (unsigned)-1; + break; + default: + ptr += MINBPC(enc); + break; + } + pos->columnNumber++; + } +} + +#undef DO_LEAD_CASE +#undef MULTIBYTE_CASES +#undef INVALID_CASES +#undef CHECK_NAME_CASE +#undef CHECK_NAME_CASES +#undef CHECK_NMSTRT_CASE +#undef CHECK_NMSTRT_CASES + Added: external/celementtree-1.0.4-20051213/expat/xmltok_impl.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/xmltok_impl.h Wed Dec 14 22:43:26 2005 @@ -0,0 +1,46 @@ +/* +Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd +See the file COPYING for copying permission. +*/ + +enum { + BT_NONXML, + BT_MALFORM, + BT_LT, + BT_AMP, + BT_RSQB, + BT_LEAD2, + BT_LEAD3, + BT_LEAD4, + BT_TRAIL, + BT_CR, + BT_LF, + BT_GT, + BT_QUOT, + BT_APOS, + BT_EQUALS, + BT_QUEST, + BT_EXCL, + BT_SOL, + BT_SEMI, + BT_NUM, + BT_LSQB, + BT_S, + BT_NMSTRT, + BT_COLON, + BT_HEX, + BT_DIGIT, + BT_NAME, + BT_MINUS, + BT_OTHER, /* known not to be a name or name start character */ + BT_NONASCII, /* might be a name or name start character */ + BT_PERCNT, + BT_LPAR, + BT_RPAR, + BT_AST, + BT_PLUS, + BT_COMMA, + BT_VERBAR +}; + +#include Added: external/celementtree-1.0.4-20051213/expat/xmltok_ns.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/expat/xmltok_ns.c Wed Dec 14 22:43:26 2005 @@ -0,0 +1,106 @@ +const ENCODING * +NS(XmlGetUtf8InternalEncoding)(void) +{ + return &ns(internal_utf8_encoding).enc; +} + +const ENCODING * +NS(XmlGetUtf16InternalEncoding)(void) +{ +#if BYTEORDER == 1234 + return &ns(internal_little2_encoding).enc; +#elif BYTEORDER == 4321 + return &ns(internal_big2_encoding).enc; +#else + const short n = 1; + return (*(const char *)&n + ? &ns(internal_little2_encoding).enc + : &ns(internal_big2_encoding).enc); +#endif +} + +static const ENCODING *NS(encodings)[] = { + &ns(latin1_encoding).enc, + &ns(ascii_encoding).enc, + &ns(utf8_encoding).enc, + &ns(big2_encoding).enc, + &ns(big2_encoding).enc, + &ns(little2_encoding).enc, + &ns(utf8_encoding).enc /* NO_ENC */ +}; + +static int PTRCALL +NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + return initScan(NS(encodings), (const INIT_ENCODING *)enc, + XML_PROLOG_STATE, ptr, end, nextTokPtr); +} + +static int PTRCALL +NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + return initScan(NS(encodings), (const INIT_ENCODING *)enc, + XML_CONTENT_STATE, ptr, end, nextTokPtr); +} + +int +NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, + const char *name) +{ + int i = getEncodingIndex(name); + if (i == UNKNOWN_ENC) + return 0; + SET_INIT_ENC_INDEX(p, i); + p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); + p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); + p->initEnc.updatePosition = initUpdatePosition; + p->encPtr = encPtr; + *encPtr = &(p->initEnc); + return 1; +} + +static const ENCODING * +NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) +{ +#define ENCODING_MAX 128 + char buf[ENCODING_MAX]; + char *p = buf; + int i; + XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); + if (ptr != end) + return 0; + *p = 0; + if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) + return enc; + i = getEncodingIndex(buf); + if (i == UNKNOWN_ENC) + return 0; + return NS(encodings)[i]; +} + +int +NS(XmlParseXmlDecl)(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingName, + const ENCODING **encoding, + int *standalone) +{ + return doParseXmlDecl(NS(findEncoding), + isGeneralTextEntity, + enc, + ptr, + end, + badPtr, + versionPtr, + versionEndPtr, + encodingName, + encoding, + standalone); +} Added: external/celementtree-1.0.4-20051213/samples/simple-ns.xml ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/samples/simple-ns.xml Wed Dec 14 22:43:26 2005 @@ -0,0 +1,7 @@ + + + + text + texttail + + Added: external/celementtree-1.0.4-20051213/samples/simple.xml ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/samples/simple.xml Wed Dec 14 22:43:26 2005 @@ -0,0 +1,6 @@ + + + text + texttail + + Added: external/celementtree-1.0.4-20051213/selftest.py ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/selftest.py Wed Dec 14 22:43:26 2005 @@ -0,0 +1,649 @@ +# $Id: /work/modules/celementtree/selftest.py 1082 2005-12-13T16:05:58.623368Z Fredrik $ +# elementtree selftest program + +# this test script uses Python's "doctest" module to check that the +# *test script* works as expected. + +import sys, StringIO + +import cElementTree as ElementTree + +def unserialize(text): + import StringIO + file = StringIO.StringIO(text) + tree = ElementTree.parse(file) + return tree.getroot() + +def serialize(elem, encoding=None): + import StringIO + file = StringIO.StringIO() + tree = ElementTree.ElementTree(elem) + if encoding: + tree.write(file, encoding) + else: + tree.write(file) + return file.getvalue() + +def summarize(elem): + return elem.tag + +def summarize_list(seq): + return map(summarize, seq) + +SAMPLE_XML = unserialize(""" + + text + +
+ subtext +
+ +""") + +SAMPLE_XML_NS = unserialize(""" + + text + +
+ subtext +
+ +""") + +# interface tests + +def check_string(string): + len(string) + for char in string: + if len(char) != 1: + print "expected one-character string, got %r" % char + new_string = string + "" + new_string = string + " " + string[:0] + +def check_mapping(mapping): + len(mapping) + keys = mapping.keys() + items = mapping.items() + for key in keys: + item = mapping[key] + mapping["key"] = "value" + if mapping["key"] != "value": + print "expected value string, got %r" % mapping["key"] + +def check_element(element): + if not ElementTree.iselement(element): + print "not an element" + if not hasattr(element, "tag"): + print "no tag member" + if not hasattr(element, "attrib"): + print "no attrib member" + if not hasattr(element, "text"): + print "no text member" + if not hasattr(element, "tail"): + print "no tail member" + check_string(element.tag) + check_mapping(element.attrib) + if element.text != None: + check_string(element.text) + if element.tail != None: + check_string(element.tail) + +def check_element_tree(tree): + check_element(tree.getroot()) + +def check_method(method): + if not callable(method): + print method, "not callable" + +def version(): + """ + >>> ElementTree.__version__ + '1.0.4' + >>> ElementTree.VERSION + '1.0.4' + """ + +def element(): + """ + Test element tree interface. + + >>> element = ElementTree.Element("tag") + >>> check_element(element) + >>> tree = ElementTree.ElementTree(element) + >>> check_element_tree(tree) + + Make sure all standard element methods exist. + + >>> check_method(element.append) + >>> check_method(element.insert) + >>> check_method(element.remove) + >>> check_method(element.getchildren) + >>> check_method(element.find) + >>> check_method(element.findall) + >>> check_method(element.findtext) + >>> check_method(element.clear) + >>> check_method(element.get) + >>> check_method(element.set) + >>> check_method(element.keys) + >>> check_method(element.items) + >>> check_method(element.getiterator) + + Basic method sanity checks. + + >>> serialize(element) # 1 + '' + >>> subelement = ElementTree.Element("subtag") + >>> element.append(subelement) + >>> serialize(element) # 2 + '' + >>> element.insert(0, subelement) + >>> serialize(element) # 3 + '' + >>> element.remove(subelement) + >>> serialize(element) # 4 + '' + >>> element.remove(subelement) + >>> serialize(element) # 5 + '' + >>> element.remove(subelement) + Traceback (most recent call last): + ValueError: list.remove(x): x not in list + >>> serialize(element) # 6 + '' + + """ + +def parsefile(): + """ + Test parsing from file. Note that we're opening the files in + here; by default, the 'parse' function opens the file in binary + mode, and doctest doesn't filter out carriage returns. + + >>> tree = ElementTree.parse(open("samples/simple.xml", "r")) + >>> tree.write(sys.stdout) + + text + texttail + + + >>> tree = ElementTree.parse(open("samples/simple-ns.xml", "r")) + >>> tree.write(sys.stdout) + + text + texttail + + + + >>> parser = ElementTree.XMLParser() + >>> parser.version + 'Expat 1.95.8' + >>> parser.feed(open("samples/simple.xml").read()) + >>> print serialize(parser.close()) + + text + texttail + + + + >>> parser = ElementTree.XMLTreeBuilder() # 1.2 compatibility + >>> parser.feed(open("samples/simple.xml").read()) + >>> print serialize(parser.close()) + + text + texttail + + + + >>> target = ElementTree.TreeBuilder() + >>> parser = ElementTree.XMLParser(target=target) + >>> parser.feed(open("samples/simple.xml").read()) + >>> print serialize(parser.close()) + + text + texttail + + + """ + +def writefile(): + """ + >>> elem = ElementTree.Element("tag") + >>> elem.text = "text" + >>> serialize(elem) + 'text' + >>> ElementTree.SubElement(elem, "subtag").text = "subtext" + >>> serialize(elem) + 'textsubtext' + >>> elem.insert(0, ElementTree.Comment("comment")) + >>> serialize(elem) + 'textsubtext' + >>> elem[0] = ElementTree.PI("key", "value") + >>> serialize(elem) + 'textsubtext' + """ + +def encoding(): + r""" + Test encoding issues. + + >>> elem = ElementTree.Element("tag") + >>> elem.text = u"abc" + >>> serialize(elem) + 'abc' + >>> serialize(elem, "utf-8") + 'abc' + >>> serialize(elem, "us-ascii") + 'abc' + >>> serialize(elem, "iso-8859-1") + "\nabc" + + >>> elem.text = "<&\"\'>" + >>> serialize(elem) + '<&"\'>' + >>> serialize(elem, "utf-8") + '<&"\'>' + >>> serialize(elem, "us-ascii") # cdata characters + '<&"\'>' + >>> serialize(elem, "iso-8859-1") + '\n<&"\'>' + + >>> elem.attrib["key"] = "<&\"\'>" + >>> elem.text = None + >>> serialize(elem) + '' + >>> serialize(elem, "utf-8") + '' + >>> serialize(elem, "us-ascii") + '' + >>> serialize(elem, "iso-8859-1") + '\n' + + >>> elem.text = u'\xe5\xf6\xf6<>' + >>> elem.attrib.clear() + >>> serialize(elem) + 'åöö<>' + >>> serialize(elem, "utf-8") + '\xc3\xa5\xc3\xb6\xc3\xb6<>' + >>> serialize(elem, "us-ascii") + 'åöö<>' + >>> serialize(elem, "iso-8859-1") + "\n\xe5\xf6\xf6<>" + + >>> elem.attrib["key"] = u'\xe5\xf6\xf6<>' + >>> elem.text = None + >>> serialize(elem) + '' + >>> serialize(elem, "utf-8") + '' + >>> serialize(elem, "us-ascii") + '' + >>> serialize(elem, "iso-8859-1") + '\n' + + """ + +def qname(): + """ + Test QName handling. + + 1) decorated tags + + >>> elem = ElementTree.Element("{uri}tag") + >>> serialize(elem) # 1.1 + '' + + 2) decorated attributes + + >>> elem.attrib["{uri}key"] = "value" + >>> serialize(elem) # 2.1 + '' + + """ + +def cdata(): + """ + Test CDATA handling (etc). + + >>> serialize(unserialize("hello")) + 'hello' + >>> serialize(unserialize("hello")) + 'hello' + >>> serialize(unserialize("")) + 'hello' + + """ + +def find(): + """ + Test find methods (including xpath syntax). + + >>> elem = SAMPLE_XML + >>> elem.find("tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.find("section/tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("section/tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog", "default") + 'default' + >>> ElementTree.ElementTree(elem).findtext("tag") + 'text' + >>> elem.findtext("section/tag") + 'subtext' + >>> ElementTree.ElementTree(elem).findtext("section/tag") + 'subtext' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall("*")) + ['tag', 'tag', 'section'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("section/tag")) + ['tag'] + >>> summarize_list(elem.findall("section//tag")) + ['tag'] + >>> summarize_list(elem.findall("section/*")) + ['tag'] + >>> summarize_list(elem.findall("section//*")) + ['tag'] + >>> summarize_list(elem.findall("section/.//*")) + ['tag'] + >>> summarize_list(elem.findall("*/*")) + ['tag'] + >>> summarize_list(elem.findall("*//*")) + ['tag'] + >>> summarize_list(elem.findall("*/tag")) + ['tag'] + >>> summarize_list(elem.findall("*/./tag")) + ['tag'] + >>> summarize_list(elem.findall("./tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("././tag")) + ['tag', 'tag'] + >>> summarize_list(ElementTree.ElementTree(elem).findall("/tag")) + ['tag', 'tag'] + >>> summarize_list(ElementTree.ElementTree(elem).findall("./tag")) + ['tag', 'tag'] + >>> elem = SAMPLE_XML_NS + >>> summarize_list(elem.findall("tag")) + [] + >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + """ + +def copy(): + """ + Test copy handling (etc). + + >>> import copy + >>> e1 = unserialize("hello") + >>> e2 = copy.copy(e1) + >>> e3 = copy.deepcopy(e1) + >>> e1.find("foo").tag = "bar" + >>> serialize(e1) + 'hello' + >>> serialize(e2) + 'hello' + >>> serialize(e3) + 'hello' + + """ + +def attrib(): + """ + Test attribute handling. + + >>> elem = ElementTree.Element("tag") + >>> elem.get("key") # 1.1 + >>> elem.get("key", "default") # 1.2 + 'default' + >>> elem.set("key", "value") + >>> elem.get("key") # 1.3 + 'value' + + >>> elem = ElementTree.Element("tag", key="value") + >>> elem.get("key") # 2.1 + 'value' + >>> elem.attrib # 2.2 + {'key': 'value'} + + >>> attrib = {"key": "value"} + >>> elem = ElementTree.Element("tag", attrib) + >>> attrib.clear() # check for aliasing issues + >>> elem.get("key") # 3.1 + 'value' + >>> elem.attrib # 3.2 + {'key': 'value'} + + >>> attrib = {"key": "value"} + >>> elem = ElementTree.Element("tag", **attrib) + >>> attrib.clear() # check for aliasing issues + >>> elem.get("key") # 4.1 + 'value' + >>> elem.attrib # 4.2 + {'key': 'value'} + + >>> elem = ElementTree.Element("tag", {"key": "other"}, key="value") + >>> elem.get("key") # 5.1 + 'value' + >>> elem.attrib # 5.2 + {'key': 'value'} + + """ + +def makeelement(): + """ + Test makeelement handling. + + >>> elem = ElementTree.Element("tag") + >>> attrib = {"key": "value"} + >>> subelem = elem.makeelement("subtag", attrib) + >>> if subelem.attrib is attrib: + ... print "attrib aliasing" + >>> elem.append(subelem) + >>> serialize(elem) + '' + + >>> elem.clear() + >>> serialize(elem) + '' + >>> elem.append(subelem) + >>> serialize(elem) + '' + + """ + +def iterparse(): + """ + Test iterparse interface. + + >>> context = ElementTree.iterparse("samples/simple.xml") + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + end empty-element + end root + >>> context.root.tag + 'root' + + >>> context = ElementTree.iterparse("samples/simple-ns.xml") + >>> for action, elem in context: + ... print action, elem.tag + end {namespace}element + end {namespace}element + end {namespace}empty-element + end {namespace}root + + >>> events = () + >>> context = ElementTree.iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = () + >>> context = ElementTree.iterparse("samples/simple.xml", events=events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = ("start", "end") + >>> context = ElementTree.iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + start root + start element + end element + start element + end element + start empty-element + end empty-element + end root + + >>> events = ("start", "end") + >>> context = ElementTree.iterparse("samples/simple-ns.xml", events) + >>> for action, elem in context: + ... if action in ("start", "end"): + ... print action, elem.tag + ... else: + ... print action, elem + start {namespace}root + start {namespace}element + end {namespace}element + start {namespace}element + end {namespace}element + start {namespace}empty-element + end {namespace}empty-element + end {namespace}root + + >>> events = ("start", "end", "bogus") + >>> context = ElementTree.iterparse("samples/simple.xml", events) + >>> if sys.version[:3] > "2.1": # don't apply this test for 2.1 + ... for action, elem in context: + ... if action in ("start", "end"): + ... print action, elem.tag + ... else: + ... print action, elem + ... else: + ... raise ValueError("unknown event 'bogus'") + Traceback (most recent call last): + ValueError: unknown event 'bogus' + """ + +def custom_builder(): + """ + Test parser w. custom builder. + + >>> class Builder: + ... def start(self, tag, attrib): + ... print "start", tag + ... def end(self, tag): + ... print "end", tag + ... def data(self, text): + ... pass + >>> builder = Builder() + >>> parser = ElementTree.XMLParser(builder) + >>> parser.feed(open("samples/simple.xml", "r").read()) + start root + start element + end element + start element + end element + start empty-element + end empty-element + end root + + >>> class Builder: + ... def start(self, tag, attrib): + ... print "start", tag + ... def end(self, tag): + ... print "end", tag + ... def data(self, text): + ... pass + ... def pi(self, target, data): + ... print "pi", target, repr(data) + ... def comment(self, data): + ... print "comment", repr(data) + >>> builder = Builder() + >>> parser = ElementTree.XMLParser(builder) + >>> parser.feed(open("samples/simple-ns.xml", "r").read()) + pi pi 'data' + comment ' comment ' + start {namespace}root + start {namespace}element + end {namespace}element + start {namespace}element + end {namespace}element + start {namespace}empty-element + end {namespace}empty-element + end {namespace}root + + """ + +def getchildren(): + """ + + >>> tree = ElementTree.parse(open("samples/simple.xml", "r")) + >>> for elem in tree.getiterator(): + ... summarize_list(elem.getchildren()) + ['element', 'element', 'empty-element'] + [] + [] + [] + + """ + +ENTITY_XML = """\ + +%user-entities; +]> +&entity; +""" + +def entity(): + """ + Test entity handling. + + 1) bad entities + + >>> ElementTree.XML("&entity;") + Traceback (most recent call last): + SyntaxError: undefined entity: line 1, column 10 + + 2) custom entity + + >>> parser = ElementTree.XMLParser() + >>> parser.entity["entity"] = "text" + >>> parser.feed(ENTITY_XML) + >>> root = parser.close() + >>> serialize(root) + 'text' + + """ + +# +# reported bugs + +class ExceptionFile: + def read(self, x): + raise IOError + +def xmltoolkit60(): + """ + >>> tree = ElementTree.parse(ExceptionFile()) + Traceback (most recent call last): + IOError + """ + +if __name__ == "__main__": + import doctest + failed, tested = doctest.testmod(__import__(__name__)) + print tested - failed, "tests ok." Added: external/celementtree-1.0.4-20051213/setup.py ============================================================================== --- (empty file) +++ external/celementtree-1.0.4-20051213/setup.py Wed Dec 14 22:43:26 2005 @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# +# Setup script for the cElementTree accelerator +# $Id: /work/modules/celementtree/setup.py 955 2005-11-21T22:55:52.177982Z Fredrik $ +# +# Usage: python setup.py install +# + +from distutils.core import setup, Extension +from distutils import sysconfig +import sys, os + +# -------------------------------------------------------------------- +# identification + +NAME = "cElementTree" +VERSION = "1.0.4-20051213" +DESCRIPTION = "A fast C implementation of the ElementTree API." +AUTHOR = "Fredrik Lundh", "fredrik at pythonware.com" +HOMEPAGE = "http://www.effbot.org/zone/celementtree.htm" +DOWNLOAD = "http://effbot.org/downloads#celementtree" + +# -------------------------------------------------------------------- +# expat library + +sources = [ + "expat/xmlparse.c", + "expat/xmlrole.c", + "expat/xmltok.c", + ] + +includes = [ + "expat", + ] + +defines = [ + ("XML_STATIC", None), + ] + +if sys.platform == "win32": + # fake devstudio compilation to make sure winconfig.h is used + defines.append(("COMPILED_FROM_DSP", None)) +else: + # determine suitable defines (based on Python's setup.py file) + config_h = sysconfig.get_config_h_filename() + config_h_vars = sysconfig.parse_config_h(open(config_h)) + for feature_macro in ["HAVE_MEMMOVE", "HAVE_BCOPY"]: + if config_h_vars.has_key(feature_macro): + defines.append((feature_macro, "1")) + defines.append(("XML_NS", "1")) + defines.append(("XML_DTD", "1")) + if sys.byteorder == "little": + defines.append(("BYTEORDER", "1234")) + else: + defines.append(("BYTEORDER", "4321")) + defines.append(("XML_CONTEXT_BYTES", "1024")) + + +# -------------------------------------------------------------------- +# distutils declarations + +ext_modules = [] + +ext_modules.append( + Extension( + "cElementTree", ["cElementTree.c"] + sources, + define_macros=defines, + include_dirs=includes, + ) + ) + +if os.path.isfile("cElementTreeWrite.c"): + ext_modules.append( + Extension( + "cElementTreeWrite", ["cElementTreeWrite.c"], + ) + ) + +try: + # add classifiers and download_url syntax to distutils + from distutils.dist import DistributionMetadata + DistributionMetadata.classifiers = None + DistributionMetadata.download_url = None +except: + pass + +setup( + author=AUTHOR[0], + author_email=AUTHOR[1], + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Operating System :: OS Independent", + "Topic :: Text Processing :: Markup :: XML", + ], + description=DESCRIPTION, + download_url=DOWNLOAD, + ext_modules = ext_modules, + license="Python (MIT style)", + long_description=DESCRIPTION, + name=NAME, + platforms="Python 2.1 and later.", + url=HOMEPAGE, + version=VERSION, + ) From python-checkins at python.org Wed Dec 14 22:44:43 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 22:44:43 +0100 (CET) Subject: [Python-checkins] commit of r41681 - external/celementtree-1.0.4-20051213/cElementTreeWrite.c Message-ID: <20051214214443.44B221E4011@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 22:44:41 2005 New Revision: 41681 Removed: external/celementtree-1.0.4-20051213/cElementTreeWrite.c Log: removed bogus file Deleted: /external/celementtree-1.0.4-20051213/cElementTreeWrite.c ============================================================================== --- /external/celementtree-1.0.4-20051213/cElementTreeWrite.c Wed Dec 14 22:44:41 2005 +++ (empty file) @@ -1,176 +0,0 @@ -/* - * ElementTree - * $Id$ - * - * elementtree write accelerator (work in progress) - * - * History: - * 2005-11-21 fl created - * - * Copyright (c) 2005 by Secret Labs AB. All rights reserved. - * Copyright (c) 2005 by Fredrik Lundh. - * - * info at pythonware.com - * http://www.pythonware.com - */ - -#include "Python.h" - - -/* -------------------------------------------------------------------- */ -/* configuration */ - -/* compiler tweaks */ -#if defined(_MSC_VER) -#define LOCAL(type) static __inline type __fastcall -#else -#define LOCAL(type) static type -#endif - -/* compatibility macros */ -#if (PY_VERSION_HEX < 0x02040000) -#define PyDict_CheckExact PyDict_Check -#if (PY_VERSION_HEX < 0x02020000) -#define PyList_CheckExact PyList_Check -#define PyString_CheckExact PyString_Check -#if (PY_VERSION_HEX >= 0x01060000) -#define Py_USING_UNICODE /* always enabled for 2.0 and 2.1 */ -#endif -#endif -#endif - -#if !defined(Py_RETURN_NONE) -#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None -#endif - -/* -------------------------------------------------------------------- */ -/* the encoder type */ - -typedef struct { - PyObject_HEAD - PyObject* encoding; -} EncoderObject; - -staticforward PyTypeObject Encoder_Type; - -#define Encoder_CheckExact(op) ((op)->ob_type == &Encoder_Type) - -/* -------------------------------------------------------------------- */ -/* encoder constructor and destructor */ - -static PyObject* -encoder_new(PyObject* self_, PyObject* args) -{ - EncoderObject* self; - - PyObject* encoding; - if (!PyArg_ParseTuple(args, "O!:encode", &PyString_Type, &encoding)) - return NULL; - - self = PyObject_New(EncoderObject, &Encoder_Type); - if (self == NULL) - return NULL; - - Py_INCREF(encoding); - self->encoding = encoding; - - return (PyObject*) self; -} - -#define CHECK_NONASCII 1 -#define CHECK_ENTITY 2 -#define CHECK_ATTRIB 4 -#define CHECK_ALL 7 - -static PyObject* -encoder_encode(EncoderObject* self, PyObject* args) -{ - PyObject* text; - if (!PyArg_ParseTuple(args, "O:encode", &text)) - return NULL; - - if (PyString_Check(text)) { - unsigned char* p = PyString_AS_STRING(text); - int i, len = PyString_GET_SIZE(text); - for (i = 0; i < len; i++) { - if (p[i] & 0x80) - break; - } - if (i == len) { - Py_INCREF(text); - return text; - } - } else if (PyUnicode_Check(text)) { - /* FIXME */ - } else { - PyErr_SetString(PyExc_TypeError, "invalid string"); - return NULL; - } - - Py_RETURN_NONE; -} - -static PyObject* -encoder_encode_cdata(EncoderObject* self, PyObject* args) -{ - PyObject* text; - if (!PyArg_ParseTuple(args, "O:encode_cdata", &text)) - return NULL; - - Py_RETURN_NONE; -} - -static PyObject* -encoder_encode_attrib(EncoderObject* self, PyObject* args) -{ - PyObject* text; - if (!PyArg_ParseTuple(args, "O:encode_attrib", &text)) - return NULL; - - Py_RETURN_NONE; -} - -static void -encoder_dealloc(EncoderObject* self) -{ - Py_XDECREF(self->encoding); - - PyObject_Del(self); -} - -static PyMethodDef encoder_methods[] = { - - {"encode", (PyCFunction) encoder_encode, METH_VARARGS}, - {"encode_cdata", (PyCFunction) encoder_encode_cdata, METH_VARARGS}, - {"encode_attrib", (PyCFunction) encoder_encode_attrib, METH_VARARGS}, - - {NULL, NULL} -}; - -static PyObject* -encoder_getattr(EncoderObject* self, char* name) -{ - return Py_FindMethod(encoder_methods, (PyObject*) self, name); -} - -statichere PyTypeObject Encoder_Type = { - PyObject_HEAD_INIT(NULL) - 0, "Encoder", sizeof(EncoderObject), 0, - /* methods */ - (destructor)encoder_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc)encoder_getattr, /* tp_getattr */ -}; - -static PyMethodDef _functions[] = { - {"Encoder", (PyCFunction) encoder_new, METH_VARARGS}, - {NULL, NULL} -}; - -DL_EXPORT(void) -initcElementTreeWrite(void) -{ - Encoder_Type.ob_type = &PyType_Type; - - Py_InitModule("cElementTreeWrite", _functions); -} From python-checkins at python.org Wed Dec 14 22:46:00 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 22:46:00 +0100 (CET) Subject: [Python-checkins] commit of r41682 - python/trunk/Modules/_elementtree.c Message-ID: <20051214214600.127961E4007@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 22:45:58 2005 New Revision: 41682 Added: python/trunk/Modules/_elementtree.c - copied unchanged from r41681, external/celementtree-1.0.4-20051213/cElementTree.c Log: copied cElementTree 1.0.4 to Modules From python-checkins at python.org Wed Dec 14 22:46:42 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 22:46:42 +0100 (CET) Subject: [Python-checkins] commit of r41683 - python/trunk/Modules/_elementtree.c Message-ID: <20051214214642.C5F401E4007@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 22:46:41 2005 New Revision: 41683 Modified: python/trunk/Modules/_elementtree.c Log: renamed to _elementtree (for Python 2.5) Modified: python/trunk/Modules/_elementtree.c ============================================================================== --- python/trunk/Modules/_elementtree.c (original) +++ python/trunk/Modules/_elementtree.c Wed Dec 14 22:46:41 2005 @@ -2522,7 +2522,7 @@ }; DL_EXPORT(void) -initcElementTree(void) +init_elementtree(void) { PyObject* m; PyObject* g; @@ -2537,7 +2537,7 @@ XMLParser_Type.ob_type = &PyType_Type; #endif - m = Py_InitModule("cElementTree", _functions); + m = Py_InitModule("_elementtree", _functions); /* python glue code */ @@ -2554,13 +2554,13 @@ "from copy import copy, deepcopy\n" "try:\n" - " from elementtree import ElementTree\n" + " from xml.etree import ElementTree\n" "except ImportError:\n" " import ElementTree\n" "ET = ElementTree\n" "del ElementTree\n" - "import cElementTree\n" + "import _elementtree as cElementTree\n" "try:\n" /* check if copy works as is */ " copy(cElementTree.Element('x'))\n" From python-checkins at python.org Wed Dec 14 22:47:54 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 22:47:54 +0100 (CET) Subject: [Python-checkins] commit of r41684 - python/trunk/Modules/_elementtree.c Message-ID: <20051214214754.887A41E4007@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 22:47:54 2005 New Revision: 41684 Modified: python/trunk/Modules/_elementtree.c (props changed) Log: fixed eol-style From python-checkins at python.org Wed Dec 14 22:59:12 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 22:59:12 +0100 (CET) Subject: [Python-checkins] commit of r41685 - in external/celementtree-1.0.4-20051213: CHANGES PKG-INFO README cElementTree.c expat/ascii.h expat/asciitab.h expat/expat.h expat/expat_external.h expat/iasciitab.h expat/internal.h expat/latin1tab.h expat/macconfig.h expat/nametab.h expat/utf8tab.h expat/winconfig.h expat/xmlparse.c expat/xmlrole.c expat/xmlrole.h expat/xmltok.c expat/xmltok.h expat/xmltok_impl.c expat/xmltok_impl.h expat/xmltok_ns.c samples/simple-ns.xml samples/simple.xml selftest.py setup.py Message-ID: <20051214215912.5377C1E4010@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 22:59:11 2005 New Revision: 41685 Modified: external/celementtree-1.0.4-20051213/CHANGES (props changed) external/celementtree-1.0.4-20051213/PKG-INFO (props changed) external/celementtree-1.0.4-20051213/README (props changed) external/celementtree-1.0.4-20051213/cElementTree.c (props changed) external/celementtree-1.0.4-20051213/expat/ascii.h (props changed) external/celementtree-1.0.4-20051213/expat/asciitab.h (props changed) external/celementtree-1.0.4-20051213/expat/expat.h (props changed) external/celementtree-1.0.4-20051213/expat/expat_external.h (props changed) external/celementtree-1.0.4-20051213/expat/iasciitab.h (props changed) external/celementtree-1.0.4-20051213/expat/internal.h (props changed) external/celementtree-1.0.4-20051213/expat/latin1tab.h (props changed) external/celementtree-1.0.4-20051213/expat/macconfig.h (props changed) external/celementtree-1.0.4-20051213/expat/nametab.h (props changed) external/celementtree-1.0.4-20051213/expat/utf8tab.h (props changed) external/celementtree-1.0.4-20051213/expat/winconfig.h (props changed) external/celementtree-1.0.4-20051213/expat/xmlparse.c (props changed) external/celementtree-1.0.4-20051213/expat/xmlrole.c (props changed) external/celementtree-1.0.4-20051213/expat/xmlrole.h (props changed) external/celementtree-1.0.4-20051213/expat/xmltok.c (props changed) external/celementtree-1.0.4-20051213/expat/xmltok.h (props changed) external/celementtree-1.0.4-20051213/expat/xmltok_impl.c (props changed) external/celementtree-1.0.4-20051213/expat/xmltok_impl.h (props changed) external/celementtree-1.0.4-20051213/expat/xmltok_ns.c (props changed) external/celementtree-1.0.4-20051213/samples/simple-ns.xml (props changed) external/celementtree-1.0.4-20051213/samples/simple.xml (props changed) external/celementtree-1.0.4-20051213/selftest.py (props changed) external/celementtree-1.0.4-20051213/setup.py (props changed) Log: set eol-style. sigh. From python-checkins at python.org Wed Dec 14 23:10:17 2005 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 14 Dec 2005 23:10:17 +0100 (CET) Subject: [Python-checkins] commit of r41686 - peps/trunk/pep-0008.txt Message-ID: <20051214221017.8BF441E400F@bag.python.org> Author: guido.van.rossum Date: Wed Dec 14 23:10:16 2005 New Revision: 41686 Modified: peps/trunk/pep-0008.txt Log: Some additional tweakage, hopefully non-controversial. Modified: peps/trunk/pep-0008.txt ============================================================================== --- peps/trunk/pep-0008.txt (original) +++ peps/trunk/pep-0008.txt Wed Dec 14 23:10:16 2005 @@ -162,19 +162,21 @@ - Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. + (However, once PEP 328 [7] is fully implemented, its style of + explicit relative imports will be recommended.) - When importing a class from a class-containing module, it's usually okay to spell this - from MyClass import MyClass - from foo.bar.YourClass import YourClass + from myclass import MyClass + from foo.bar.yourclass import YourClass If this spelling causes local name clashes, then spell them - import MyClass - import foo.bar.YourClass + import myclass + import foo.bar.yourclass - and use "MyClass.MyClass" and "foo.bar.YourClass.YourClass" + and use "myclass.MyClass" and "foo.bar.yourclass.YourClass" Whitespace in Expressions and Statements @@ -224,8 +226,9 @@ Other Recommendations - Always surround these binary operators with a single space on - either side: assignment (=), comparisons (==, <, >, !=, <>, <=, - >=, in, not in, is, is not), Booleans (and, or, not). + either side: assignment (=), augmented assignment (+=, -= etc.), + comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not), + Booleans (and, or, not). - Use spaces around arithmetic operators: @@ -269,11 +272,33 @@ do_two() do_three() - No: + Rather not: if foo == 'blah': do_blah_thing() do_one(); do_two(); do_three() + - While sometimes it's okay to put an if/for/while with a small + body on the same line, never do this for multi-clause + statements. Also avoid folding such long lines! + + Rather not: + + if foo == 'blah': do_blah_thing() + for x in lst: total += x + while t < 10: t = delay() + + Definitely not: + + if foo == 'blah': do_blah_thing() + else: do_non_blah_thing() + + try: something() + finally: cleanup() + + do_one(); do_two(); do_three(long, argument, + list, like, this) + + if foo == 'blah': one(); two(); three() Comments @@ -339,11 +364,12 @@ - PEP 257 describes good docstring conventions. Note that most importantly, the """ that ends a multiline docstring should be on a line - by itself, e.g.: + by itself, and preferably preceded by a blank line, e.g.: """Return a foobang Optional plotz says to frobnicate the bizbaz first. + """ - For one liner docstrings, it's okay to keep the closing """ on the same @@ -408,6 +434,9 @@ names together. This is not used much in Python, but it is mentioned for completeness. For example, the os.stat() function returns a tuple whose items traditionally have names like st_mode, st_size, st_mtime and so on. + (This is done to emphasize the correspondence with the fields of the + POSIX system call struct, which helps programmers familiar with that.) + The X11 library uses a leading X for all its public functions. In Python, this style is generally deemed unnecessary because attribute and method names are prefixed with an object, and function names are prefixed with a @@ -426,11 +455,12 @@ Tkinter.Toplevel(master, class_='ClassName') - __double_leading_underscore: when naming a class attribute, invokes name - mangling as of Python 1.4. + mangling (inside class FooBar, __boo becomes _FooBar__boo; see below). - __double_leading_and_trailing_underscore__: "magic" objects or attributes that live in user-controlled namespaces. E.g. __init__, - __import__ or __file__. + __import__ or __file__. Never invent such names; only use then + as documented. Prescriptive: Naming Conventions @@ -441,7 +471,7 @@ names. In some fonts, these characters are indistinguishable from the numerals - one and zero. When tempted to use `l' use `L' instead. + one and zero. When tempted to use `l', use `L' instead. Module Names @@ -450,14 +480,15 @@ Since module names are mapped to file names, and some file systems are case insensitive and truncate long names, it is important that module names be chosen to be fairly short -- this won't be a problem on Unix, - but it may be a problem when the code is transported to Mac or Windows. + but it may be a problem when the code is transported to older Mac or + Windows versions, or DOS. When an extension module written in C or C++ has an accompanying Python module that provides a higher level (e.g. more object oriented) interface, the C/C++ module has a leading underscore (e.g. _socket). - Python packages should have short, all-lowercase names, without - underscores. + Like module, Python packages should have short, all-lowercase names, + without underscores. Class Names @@ -497,7 +528,7 @@ If a function argument's name clashes with a reserved keyword, it is generally better to append a single trailing underscore rather than use an abbreviation or spelling corruption. Thus "print_" is better than - "prnt". + "prnt". (Perhaps better is to avoid such clashes by using a synonym.) Method Names and Instance Variables @@ -565,6 +596,10 @@ Note 2: Try to keep the functional behavior side-effect free, although side-effects such as caching are generally fine. + Note 3: Avoid using properties for computationally expensive + operations; the attribute notation makes the caller believe + that access is (relatively) cheap. + - If your class is intended to be subclassed, and you have attributes that you do not want subclasses to use, consider naming them with double leading underscores and no trailing underscores. This invokes @@ -581,6 +616,10 @@ __getattr__(), less convenient. However the name mangling algorithm is well documented and easy to perform manually. + Note 3: Not everyone likes name mangling. Try to balance the + need to avoid accidental name clashes with potential use by + advanced callers. + Programming Recommendations @@ -600,13 +639,14 @@ Also, beware of writing "if x" when you really mean "if x is not None" -- e.g. when testing whether a variable or argument that defaults to - None was set to some other value. The other value might be a value - that's false in a boolean context! + None was set to some other value. The other value might have a type + (such as a container) that could be false in a boolean context! - Use class-based exceptions. String exceptions in new code are strongly discouraged, as they will - eventually be deprecated and then removed. + eventually (in Python 2.5) be deprecated and then (in Python 3000 or + perhaps sooner) removed. Modules or packages should define their own domain-specific base exception class, which should be subclassed from the built-in Exception @@ -686,8 +726,9 @@ - Don't compare boolean values to True or False using == - Yes: if greeting: - No: if greeting == True: + Yes: if greeting: + No: if greeting == True: + Worse: if greeting is True: References @@ -705,6 +746,8 @@ [6] PEP 20, The Zen of Python + [7] PEP 328, Imports: Multi-Line and Absolute/Relative + Copyright From python-checkins at python.org Wed Dec 14 23:29:35 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 23:29:35 +0100 (CET) Subject: [Python-checkins] commit of r41687 - in python/trunk: Lib/xmlcore/etree/ElementInclude.py Lib/xmlcore/etree/ElementPath.py Lib/xmlcore/etree/ElementTree.py Lib/xmlcore/etree/__init__.py PC/_subprocess.c Message-ID: <20051214222935.4E4411E4002@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 23:29:34 2005 New Revision: 41687 Modified: python/trunk/Lib/xmlcore/etree/ElementInclude.py python/trunk/Lib/xmlcore/etree/ElementPath.py python/trunk/Lib/xmlcore/etree/ElementTree.py python/trunk/Lib/xmlcore/etree/__init__.py python/trunk/PC/_subprocess.c Log: added PSF licensing blurbs to relevant files Modified: python/trunk/Lib/xmlcore/etree/ElementInclude.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/ElementInclude.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementInclude.py Wed Dec 14 23:29:34 2005 @@ -41,6 +41,9 @@ # OF THIS SOFTWARE. # -------------------------------------------------------------------- +# Licensed to PSF under a Contributor Agreement. +# See http://www.python.org/2.4/license for licensing details. + ## # Limited XInclude support for the ElementTree package. ## Modified: python/trunk/Lib/xmlcore/etree/ElementPath.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/ElementPath.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementPath.py Wed Dec 14 23:29:34 2005 @@ -42,6 +42,9 @@ # OF THIS SOFTWARE. # -------------------------------------------------------------------- +# Licensed to PSF under a Contributor Agreement. +# See http://www.python.org/2.4/license for licensing details. + ## # Implementation module for XPath support. There's usually no reason # to import this module directly; the ElementTree does this for Modified: python/trunk/Lib/xmlcore/etree/ElementTree.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/ElementTree.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementTree.py Wed Dec 14 23:29:34 2005 @@ -67,6 +67,9 @@ # OF THIS SOFTWARE. # -------------------------------------------------------------------- +# Licensed to PSF under a Contributor Agreement. +# See http://www.python.org/2.4/license for licensing details. + __all__ = [ # public symbols "Comment", Modified: python/trunk/Lib/xmlcore/etree/__init__.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/__init__.py (original) +++ python/trunk/Lib/xmlcore/etree/__init__.py Wed Dec 14 23:29:34 2005 @@ -28,3 +28,6 @@ # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # -------------------------------------------------------------------- + +# Licensed to PSF under a Contributor Agreement. +# See http://www.python.org/2.4/license for licensing details. Modified: python/trunk/PC/_subprocess.c ============================================================================== --- python/trunk/PC/_subprocess.c (original) +++ python/trunk/PC/_subprocess.c Wed Dec 14 23:29:34 2005 @@ -32,6 +32,9 @@ * */ +/* Licensed to PSF under a Contributor Agreement. */ +/* See http://www.python.org/2.4/license for licensing details. */ + /* TODO: handle unicode command lines? */ /* TODO: handle unicode environment? */ From python-checkins at python.org Wed Dec 14 23:30:37 2005 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 14 Dec 2005 23:30:37 +0100 (CET) Subject: [Python-checkins] commit of r41688 - python/trunk/Modules/_elementtree.c Message-ID: <20051214223037.929571E4002@bag.python.org> Author: fredrik.lundh Date: Wed Dec 14 23:30:36 2005 New Revision: 41688 Modified: python/trunk/Modules/_elementtree.c Log: added PSG licensing blurb Modified: python/trunk/Modules/_elementtree.c ============================================================================== --- python/trunk/Modules/_elementtree.c (original) +++ python/trunk/Modules/_elementtree.c Wed Dec 14 23:30:36 2005 @@ -40,6 +40,9 @@ * http://www.pythonware.com */ +/* Licensed to PSF under a Contributor Agreement. */ +/* See http://www.python.org/2.4/license for licensing details. */ + #include "Python.h" #define VERSION "1.0.4" From python-checkins at python.org Wed Dec 14 23:54:57 2005 From: python-checkins at python.org (barry.warsaw) Date: Wed, 14 Dec 2005 23:54:57 +0100 (CET) Subject: [Python-checkins] commit of r41689 - peps/trunk/pep-0008.txt Message-ID: <20051214225457.9320E1E4002@bag.python.org> Author: barry.warsaw Date: Wed Dec 14 23:54:57 2005 New Revision: 41689 Modified: peps/trunk/pep-0008.txt Log: Fixed a couple of small tyops. Modified: peps/trunk/pep-0008.txt ============================================================================== --- peps/trunk/pep-0008.txt (original) +++ peps/trunk/pep-0008.txt Wed Dec 14 23:54:57 2005 @@ -459,7 +459,7 @@ - __double_leading_and_trailing_underscore__: "magic" objects or attributes that live in user-controlled namespaces. E.g. __init__, - __import__ or __file__. Never invent such names; only use then + __import__ or __file__. Never invent such names; only use them as documented. Prescriptive: Naming Conventions @@ -487,7 +487,7 @@ module that provides a higher level (e.g. more object oriented) interface, the C/C++ module has a leading underscore (e.g. _socket). - Like module, Python packages should have short, all-lowercase names, + Like modules, Python packages should have short, all-lowercase names, without underscores. Class Names @@ -727,7 +727,9 @@ - Don't compare boolean values to True or False using == Yes: if greeting: + No: if greeting == True: + Worse: if greeting is True: @@ -746,7 +748,7 @@ [6] PEP 20, The Zen of Python - [7] PEP 328, Imports: Multi-Line and Absolute/Relative + [7] PEP 328, Imports: Multi-Line and Absolute/Relative Copyright From python-checkins at python.org Wed Dec 14 23:56:41 2005 From: python-checkins at python.org (phillip.eby) Date: Wed, 14 Dec 2005 23:56:41 +0100 (CET) Subject: [Python-checkins] commit of r41690 - sandbox/trunk/setuptools/setuptools/command/easy_install.py Message-ID: <20051214225641.916E41E4002@bag.python.org> Author: phillip.eby Date: Wed Dec 14 23:56:41 2005 New Revision: 41690 Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py Log: Refactor script wrapper generation into a separate function so that it can be used by the future install_scripts command to install entry point scripts in "legacy" mode. Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Wed Dec 14 23:56:41 2005 @@ -439,56 +439,15 @@ ensure_directory(dst); shutil.move(setup_base, dst) return dst - def install_wrapper_scripts(self, dist): - if self.exclude_scripts: - return - for group in 'console_scripts', 'gui_scripts': - for name,ep in dist.get_entry_map(group).items(): - self._install_wrapper_script(dist, group, name, ep) + if not self.exclude_scripts: + for args in get_script_args(dist): + self.write_script(*args) + - def _install_wrapper_script(self, dist, group, name, entry_point): - """Write new-style console scripts, unless excluded""" - spec = str(dist.as_requirement()) - header = get_script_header("") - script_text = ( - "# EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r\n" - "__requires__ = %(spec)r\n" - "import sys\n" - "from pkg_resources import load_entry_point\n" - "\n" - "sys.exit(\n" - " load_entry_point(%(spec)r, %(group)r, %(name)r)()\n" - ")\n" - ) % locals() - if sys.platform=='win32': - # On Windows, add a .py extension and an .exe launcher - if group=='gui_scripts': - ext, launcher = '-script.pyw', 'gui.exe' - old = ['.pyw'] - new_header = re.sub('(?i)python.exe','pythonw.exe',header) - else: - ext, launcher = '-script.py', 'cli.exe' - old = ['.py','.pyc','.pyo'] - new_header = re.sub('(?i)pythonw.exe','pythonw.exe',header) - if os.path.exists(new_header[2:-1]): - header = new_header - - self.delete_blockers( # clean up old .py/.pyw w/o a script - [os.path.join(self.script_dir,name+x) for x in old]) - - self.write_script(name+ext, header+script_text) - self.write_script( - name+'.exe', resource_string('setuptools', launcher), - 'b' # write in binary mode - ) - else: - # On other platforms, we assume the right thing to do is to just - # write the stub with no extension. - self.write_script(name, header+script_text) def install_script(self, dist, script_name, script_text, dev_path=None): """Generate a legacy script wrapper and install it""" @@ -513,10 +472,11 @@ self.write_script(script_name, script_text) - def write_script(self, script_name, contents, mode="t"): + def write_script(self, script_name, contents, mode="t", blockers=()): """Write an executable file to the scripts directory""" + self.delete_blockers( # clean up old .py/.pyw w/o a script + [os.path.join(self.script_dir,x) for x in blockers]) log.info("Installing %s script to %s", script_name, self.script_dir) - target = os.path.join(self.script_dir, script_name) self.add_output(target) @@ -530,7 +490,6 @@ except (AttributeError, os.error): pass - def install_eggs(self, spec, dist_filename, tmpdir): # .egg dirs or files are already built, so just return them if dist_filename.lower().endswith('.egg'): @@ -1187,6 +1146,47 @@ exc = sys.exc_info() raise exc[0], (exc[1][0], exc[1][1] + (" %s %s" % (func,arg))) +def get_script_args(dist): + """Yield write_script() argument tuples for a distribution's entrypoints""" + spec = str(dist.as_requirement()) + header = get_script_header("") + for group in 'console_scripts', 'gui_scripts': + for name,ep in dist.get_entry_map(group).items(): + script_text = ( + "# EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r\n" + "__requires__ = %(spec)r\n" + "import sys\n" + "from pkg_resources import load_entry_point\n" + "\n" + "sys.exit(\n" + " load_entry_point(%(spec)r, %(group)r, %(name)r)()\n" + ")\n" + ) % locals() + if sys.platform=='win32': + # On Windows, add a .py extension and an .exe launcher + if group=='gui_scripts': + ext, launcher = '-script.pyw', 'gui.exe' + old = ['.pyw'] + new_header = re.sub('(?i)python.exe','pythonw.exe',header) + else: + ext, launcher = '-script.py', 'cli.exe' + old = ['.py','.pyc','.pyo'] + new_header = re.sub('(?i)pythonw.exe','pythonw.exe',header) + + if os.path.exists(new_header[2:-1]): + hdr = new_header + else: + hdr = header + yield (name+ext, hdr+script_text, 't', [name+x for x in old]) + yield ( + name+'.exe', resource_string('setuptools', launcher), + 'b' # write in binary mode + ) + else: + # On other platforms, we assume the right thing to do is to + # just write the stub with no extension. + yield (name, header+script_text) + def rmtree(path, ignore_errors=False, onerror=auto_chmod): """Recursively delete a directory tree. From python-checkins at python.org Thu Dec 15 00:32:25 2005 From: python-checkins at python.org (walter.doerwald) Date: Thu, 15 Dec 2005 00:32:25 +0100 (CET) Subject: [Python-checkins] commit of r41691 - python/trunk/Lib/test/test_quopri.py Message-ID: <20051214233225.0BE1F1E4007@bag.python.org> Author: walter.doerwald Date: Thu Dec 15 00:32:22 2005 New Revision: 41691 Modified: python/trunk/Lib/test/test_quopri.py Log: If quopri uses the implementations from binascii do the tests a second time using the Python implementations of the functions. This imcreases code coverage and makes sure that both implementations do the same thing. Modified: python/trunk/Lib/test/test_quopri.py ============================================================================== --- python/trunk/Lib/test/test_quopri.py (original) +++ python/trunk/Lib/test/test_quopri.py Thu Dec 15 00:32:22 2005 @@ -2,7 +2,7 @@ import unittest from cStringIO import StringIO -from quopri import * +import quopri @@ -44,6 +44,23 @@ """ +def withpythonimplementation(testfunc): + def newtest(self): + # Test default implementation + testfunc(self) + # Test Python implementation + if quopri.b2a_qp is not None or quopri.a2b_qp is not None: + oldencode = quopri.b2a_qp + olddecode = quopri.a2b_qp + try: + quopri.b2a_qp = None + quopri.a2b_qp = None + testfunc(self) + finally: + quopri.b2a_qp = oldencode + quopri.a2b_qp = olddecode + newtest.__name__ = testfunc.__name__ + return newtest class QuopriTestCase(unittest.TestCase): # Each entry is a tuple of (plaintext, encoded string). These strings are @@ -110,44 +127,52 @@ ('hello_world', 'hello=5Fworld'), ) + @withpythonimplementation def test_encodestring(self): for p, e in self.STRINGS: - self.assert_(encodestring(p) == e) + self.assert_(quopri.encodestring(p) == e) + @withpythonimplementation def test_decodestring(self): for p, e in self.STRINGS: - self.assert_(decodestring(e) == p) + self.assert_(quopri.decodestring(e) == p) + @withpythonimplementation def test_idempotent_string(self): for p, e in self.STRINGS: - self.assert_(decodestring(encodestring(e)) == e) + self.assert_(quopri.decodestring(quopri.encodestring(e)) == e) + @withpythonimplementation def test_encode(self): for p, e in self.STRINGS: infp = StringIO(p) outfp = StringIO() - encode(infp, outfp, quotetabs=0) + quopri.encode(infp, outfp, quotetabs=False) self.assert_(outfp.getvalue() == e) + @withpythonimplementation def test_decode(self): for p, e in self.STRINGS: infp = StringIO(e) outfp = StringIO() - decode(infp, outfp) + quopri.decode(infp, outfp) self.assert_(outfp.getvalue() == p) + @withpythonimplementation def test_embedded_ws(self): for p, e in self.ESTRINGS: - self.assert_(encodestring(p, quotetabs=1) == e) - self.assert_(decodestring(e) == p) + self.assert_(quopri.encodestring(p, quotetabs=True) == e) + self.assert_(quopri.decodestring(e) == p) + @withpythonimplementation def test_encode_header(self): for p, e in self.HSTRINGS: - self.assert_(encodestring(p, header = 1) == e) + self.assert_(quopri.encodestring(p, header=True) == e) + @withpythonimplementation def test_decode_header(self): for p, e in self.HSTRINGS: - self.assert_(decodestring(e, header = 1) == p) + self.assert_(quopri.decodestring(e, header=True) == p) def test_main(): test_support.run_unittest(QuopriTestCase) From python-checkins at python.org Thu Dec 15 00:47:23 2005 From: python-checkins at python.org (phillip.eby) Date: Thu, 15 Dec 2005 00:47:23 +0100 (CET) Subject: [Python-checkins] commit of r41692 - in sandbox/trunk/setuptools: EasyInstall.txt setuptools.egg-info/entry_points.txt setuptools.txt setuptools/command/__init__.py setuptools/command/easy_install.py setuptools/command/install.py setuptools/command/install_scripts.py Message-ID: <20051214234723.EC0741E4002@bag.python.org> Author: phillip.eby Date: Thu Dec 15 00:47:22 2005 New Revision: 41692 Added: sandbox/trunk/setuptools/setuptools/command/install_scripts.py (contents, props changed) Modified: sandbox/trunk/setuptools/EasyInstall.txt sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt sandbox/trunk/setuptools/setuptools.txt sandbox/trunk/setuptools/setuptools/command/__init__.py sandbox/trunk/setuptools/setuptools/command/easy_install.py sandbox/trunk/setuptools/setuptools/command/install.py Log: Support full roundtrip translation of eggs to and from ``bdist_wininst`` format. Running ``bdist_wininst`` on a setuptools-based package wraps the egg in an .exe that will safely install it as an egg (i.e., with metadata and entry-point wrapper scripts), and ``easy_install`` can turn the .exe back into an ``.egg`` file or directory and install it as such. At this point, it should also be possible to "system package" any egg, complete with wrapper scripts, and at least bdist_wininst works now. More testing is needed for at least bdist_dumb and bdist_rpm. Modified: sandbox/trunk/setuptools/EasyInstall.txt ============================================================================== --- sandbox/trunk/setuptools/EasyInstall.txt (original) +++ sandbox/trunk/setuptools/EasyInstall.txt Thu Dec 15 00:47:22 2005 @@ -878,6 +878,12 @@ when Python (or a script) is installed in a directory whose name contains spaces on Windows. + * Support full roundtrip translation of eggs to and from ``bdist_wininst`` + format. Running ``bdist_wininst`` on a setuptools-based package wraps the + egg in an .exe that will safely install it as an egg (i.e., with metadata + and entry-point wrapper scripts), and ``easy_install`` can turn the .exe + back into an ``.egg`` file or directory and install it as such. + 0.6a8 * Update for changed SourceForge mirror format Modified: sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt (original) +++ sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt Thu Dec 15 00:47:22 2005 @@ -33,6 +33,7 @@ install_egg_info = setuptools.command.install_egg_info:install_egg_info alias = setuptools.command.alias:alias easy_install = setuptools.command.easy_install:easy_install +install_scripts = setuptools.command.install_scripts:install_scripts bdist_egg = setuptools.command.bdist_egg:bdist_egg install = setuptools.command.install:install test = setuptools.command.test:test Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Thu Dec 15 00:47:22 2005 @@ -2252,6 +2252,13 @@ don't rely on a ``.pth`` file. The ``--no-egg`` option has been removed, since all RPMs are now built in a more backwards-compatible format. + * Support full roundtrip translation of eggs to and from ``bdist_wininst`` + format. Running ``bdist_wininst`` on a setuptools-based package wraps the + egg in an .exe that will safely install it as an egg (i.e., with metadata + and entry-point wrapper scripts), and ``easy_install`` can turn the .exe + back into an ``.egg`` file or directory and install it as such. + + 0.6a8 * Fixed some problems building extensions when Pyrex was installed, especially with Python 2.4 and/or packages using SWIG. Modified: sandbox/trunk/setuptools/setuptools/command/__init__.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/__init__.py (original) +++ sandbox/trunk/setuptools/setuptools/command/__init__.py Thu Dec 15 00:47:22 2005 @@ -1,7 +1,7 @@ __all__ = [ 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', - 'sdist', 'setopt', 'test', 'upload', 'install_egg_info', + 'sdist', 'setopt', 'test', 'upload', 'install_egg_info', 'install_scripts', ] Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Thu Dec 15 00:47:22 2005 @@ -579,20 +579,19 @@ raise DistutilsError( "%s is not a valid distutils Windows .exe" % dist_filename ) - # Create a dummy distribution object until we build the real distro dist = Distribution(None, project_name=cfg.get('metadata','name'), - version=cfg.get('metadata','version'), - platform="win32" + version=cfg.get('metadata','version'), platform="win32" ) # Convert the .exe to an unpacked egg egg_path = dist.location = os.path.join(tmpdir, dist.egg_name()+'.egg') egg_tmp = egg_path+'.tmp' - pkg_inf = os.path.join(egg_tmp, 'EGG-INFO', 'PKG-INFO') + egg_info = os.path.join(egg_tmp, 'EGG-INFO') + pkg_inf = os.path.join(egg_info, 'PKG-INFO') ensure_directory(pkg_inf) # make sure EGG-INFO dir exists - + dist._provider = PathMetadata(egg_tmp, egg_info) # XXX self.exe_to_egg(dist_filename, egg_tmp) # Write EGG-INFO/PKG-INFO @@ -603,13 +602,14 @@ if k<>'target_version': f.write('%s: %s\n' % (k.replace('_','-').title(), v)) f.close() - + script_dir = os.path.join(egg_info,'scripts') + self.delete_blockers( # delete entry-point scripts to avoid duping + [os.path.join(script_dir,args[0]) for args in get_script_args(dist)] + ) # Build .egg file from tmpdir bdist_egg.make_zipfile( - egg_path, egg_tmp, - verbose=self.verbose, dry_run=self.dry_run + egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run ) - # install the .egg return self.install_egg(egg_path, tmpdir) Modified: sandbox/trunk/setuptools/setuptools/command/install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install.py Thu Dec 15 00:47:22 2005 @@ -15,8 +15,11 @@ 'old-and-unmanageable', 'single-version-externally-managed', ] - sub_commands = _install.sub_commands + [ + sub_commands = [ + cmd for cmd in _install.sub_commands if cmd[0] != 'install_scripts' + ] + [ ('install_egg_info', lambda self: True), + ('install_scripts', lambda self: True), ] def initialize_options(self): @@ -53,7 +56,7 @@ cmd = easy_install( self.distribution, args="x", ignore_conflicts_at_my_risk=1, - root=self.root + root=self.root, record=self.record, ) cmd.ensure_finalized() # finalize before bdist_egg munges install cmd Added: sandbox/trunk/setuptools/setuptools/command/install_scripts.py ============================================================================== --- (empty file) +++ sandbox/trunk/setuptools/setuptools/command/install_scripts.py Thu Dec 15 00:47:22 2005 @@ -0,0 +1,40 @@ +from distutils.command.install_scripts import install_scripts \ + as _install_scripts +from easy_install import get_script_args +from pkg_resources import Distribution, PathMetadata, ensure_directory +import os +from distutils import log + + +class install_scripts(_install_scripts): + """Do normal script install, plus any egg_info wrapper scripts""" + + def run(self): + self.run_command("egg_info") + _install_scripts.run(self) # run first to set up self.outfiles + + ei_cmd = self.get_finalized_command("egg_info") + dist = Distribution( + ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), + ei_cmd.egg_name, ei_cmd.egg_version, + ) + for args in get_script_args(dist): + self.write_script(*args) + + def write_script(self, script_name, contents, mode="t", *ignored): + """Write an executable file to the scripts directory""" + + log.info("Installing %s script to %s", script_name, self.install_dir) + target = os.path.join(self.install_dir, script_name) + self.outfiles.append(target) + + if not self.dry_run: + ensure_directory(target) + f = open(target,"w"+mode) + f.write(contents) + f.close() + try: + os.chmod(target,0755) + except (AttributeError, os.error): + pass + From python-checkins at python.org Thu Dec 15 03:45:05 2005 From: python-checkins at python.org (phillip.eby) Date: Thu, 15 Dec 2005 03:45:05 +0100 (CET) Subject: [Python-checkins] commit of r41693 - in sandbox/trunk/setuptools: setup.py setuptools.egg-info/entry_points.txt setuptools.txt setuptools/command/build_py.py setuptools/dist.py Message-ID: <20051215024505.A000D1E4009@bag.python.org> Author: phillip.eby Date: Thu Dec 15 03:45:03 2005 New Revision: 41693 Modified: sandbox/trunk/setuptools/setup.py sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt sandbox/trunk/setuptools/setuptools.txt sandbox/trunk/setuptools/setuptools/command/build_py.py sandbox/trunk/setuptools/setuptools/dist.py Log: Added the ``exclude_package_data`` keyword to ``setup()``, allowing you to trim back files included via the ``package_data`` and ``include_package_data`` options. Modified: sandbox/trunk/setuptools/setup.py ============================================================================== --- sandbox/trunk/setuptools/setup.py (original) +++ sandbox/trunk/setuptools/setup.py Thu Dec 15 03:45:03 2005 @@ -55,6 +55,8 @@ "entry_points = setuptools.dist:check_entry_points", "test_suite = setuptools.dist:check_test_suite", "zip_safe = setuptools.dist:assert_bool", + "package_data = setuptools.dist:check_package_data", + "exclude_package_data = setuptools.dist:check_package_data", "include_package_data = setuptools.dist:assert_bool", ], "egg_info.writers": [ @@ -78,8 +80,6 @@ - - classifiers = [f.strip() for f in """ Development Status :: 3 - Alpha Intended Audience :: Developers Modified: sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt (original) +++ sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt Thu Dec 15 03:45:03 2005 @@ -1,8 +1,10 @@ [distutils.setup_keywords] entry_points = setuptools.dist:check_entry_points extras_require = setuptools.dist:check_extras +package_data = setuptools.dist:check_package_data install_requires = setuptools.dist:check_requirements include_package_data = setuptools.dist:assert_bool +exclude_package_data = setuptools.dist:check_package_data namespace_packages = setuptools.dist:check_nsp test_suite = setuptools.dist:check_test_suite eager_resources = setuptools.dist:assert_string_list Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Thu Dec 15 03:45:03 2005 @@ -26,8 +26,8 @@ the closest thing to CPAN currently available for Python.) * Create `Python Eggs `_ - - a single-file importable distribution format - + a single-file importable distribution format + * Include data files inside your package directories, where your code can actually use them. (Python 2.4 distutils also supports this feature, but setuptools provides the feature for Python 2.3 packages also, and supports @@ -147,7 +147,7 @@ more information to your setup script to help people find or learn about your project. And maybe your project will have grown by then to include a few dependencies, and perhaps some data files and scripts:: - + from setuptools import setup, find_packages setup( name = "HelloWorld", @@ -206,7 +206,7 @@ which in turn is newer than ``2.4b1`` or ``2.4a1``. Postrelease tags make a version be considered *newer* than the version they are appended to. So, revisions like ``2.4-1`` and ``2.4pl3`` are newer than ``2.4``, but are *older* -than ``2.4.1`` (which has a higher release number). +than ``2.4.1`` (which has a higher release number). A pre-release tag is a series of letters that are alphabetically before "final". Some examples of prerelease tags would include ``alpha``, ``beta``, @@ -288,11 +288,21 @@ CVS or Subversion control, or which are specified by your ``MANIFEST.in`` file. For more information, see the section below on `Including Data Files`_. - + +``exclude_package_data`` + A dictionary mapping package names to lists of glob patterns that should + be *excluded* from your package directories. You can use this to trim back + any excess files included by ``include_package_data``. For a complete + description and examples, see the section below on `Including Data Files`_. + ``package_data`` A dictionary mapping package names to lists of glob patterns. For a complete description and examples, see the section below on `Including - Data Files`_. + Data Files`_. You do not need to use this option if you are using + ``include_package_data``, unless you need to add e.g. files that are + generated by your setup script and build process. (And are therefore not + in source control or are files that you don't want to include in your + source distribution.) ``zip_safe`` A boolean (True or False) flag specifying whether the project can be @@ -357,7 +367,7 @@ ``tests_require`` If your project's tests need one or more additional packages besides those - needed to install it, you can use this option to specify them. It should + needed to install it, you can use this option to specify them. It should be a string or list of strings specifying what other distributions need to be present for the package's tests to run. When you run the ``test`` command, ``setuptools`` will attempt to obtain these (even going @@ -401,7 +411,7 @@ Anyway, ``find_packages()`` walks the target directory, and finds Python packages by looking for ``__init__.py`` files. It then filters the list of -packages using the exclusion patterns. +packages using the exclusion patterns. Exclusion patterns are package names, optionally including wildcards. For example, ``find_packages(exclude=["*.tests"])`` will exclude all packages whose @@ -627,7 +637,7 @@ for data files distributed with a package is for use *by* the package, usually by including the data files in the package directory. -Setuptools offers two ways to specify data files to be included in your +Setuptools offers three ways to specify data files to be included in your packages. First, you can simply use the ``include_package_data`` keyword, e.g.:: @@ -643,7 +653,7 @@ If you want finer-grained control over what files are included (for example, if you have documentation files in your package directories and want to exclude -them from installation), then you can use the ``package_data`` keyword instead, +them from installation), then you can also use the ``package_data`` keyword, e.g.:: from setuptools import setup, find_packages @@ -678,7 +688,7 @@ ... packages = find_packages('src'), # include all packages under src package_dir = {'':'src'}, # tell distutils packages are under src - + package_data = { # If any package contains *.txt files, include them: '': ['*.txt'], @@ -702,7 +712,56 @@ Python 2.4; there is `some documentation for the feature`__ available on the python.org website.) -__ http://docs.python.org/dist/node11.html +__ http://docs.python.org/dist/node11.html + +Sometimes, the ``include_package_data`` or ``package_data`` options alone +aren't sufficient to precisely define what files you want included. For +example, you may want to include package README files in your revision control +system and source distributions, but exclude them from being installed. So, +setuptools offers an ``exclude_package_data`` option as well, that allows you +to do things like this:: + + from setuptools import setup, find_packages + setup( + ... + packages = find_packages('src'), # include all packages under src + package_dir = {'':'src'}, # tell distutils packages are under src + + include_package_data = True, # include everything in source control + + # ...but exclude README.txt from all packages + exclude_package_data = { '': ['README.txt'] }, + ) + +The ``exclude_package_data`` option is a dictionary mapping package names to +lists of wildcard patterns, just like the ``package_data`` option. And, just +as with that option, a key of ``''`` will apply the given pattern(s) to all +packages. However, any files that match these patterns will be *excluded* +from installation, even if they were listed in ``package_data`` or were +included as a result of using ``include_package_data``. + +In summary, the three options allow you to: + +``include_package_data`` + Accept all data files and directories matched by ``MANIFEST.in`` or found + in source control. + +``package_data`` + Specify additional patterns to match files and directories that may or may + not be matched by ``MANIFEST.in`` or found in source control. + +``exclude_package_data`` + Specify patterns for data files and directories that should *not* be + included when a package is installed, even if they would otherwise have + been included due to the use of the preceding options. + +NOTE: Due to the way the distutils build process works, a data file that you +include in your project and then stop including may be "orphaned" in your +project's build directories, requiring you to run ``setup.py clean --all`` to +fully remove them. This may also be important for your users and contributors +if they track intermediate revisions of your project using Subversion; be sure +to let them know when you make changes that remove files from inclusion so they +can run ``setup.py clean --all``. Accessing Data Files at Runtime @@ -1149,7 +1208,7 @@ manually-specified post-release tag, such as a build or revision number (``--tag-build=STRING, -bSTRING``) -* A "last-modified revision number" string generated automatically from +* A "last-modified revision number" string generated automatically from Subversion's metadata (assuming your project is being built from a Subversion "working copy") (``--tag-svn-revision, -r``) @@ -1796,7 +1855,7 @@ you will use a glob pattern like ``.zip`` or ``.egg`` to match files of the specified type. Note that each supplied pattern is treated as a distinct group of files for purposes of selecting files to delete. - + ``--keep=COUNT, -k COUNT`` Number of matching distributions to keep. For each group of files identified by a pattern specified with the ``--match`` option, delete all @@ -1839,14 +1898,14 @@ the `configuration file options`_ to change where the options are saved. For example, this command does the same as above, but saves the compiler setting to the site-wide (global) distutils configuration:: - + setup.py build --compiler=mingw32 saveopts -g Note that it doesn't matter where you place the ``saveopts`` command on the command line; it will still save all the options specified for all commands. For example, this is another valid way to spell the last example:: - setup.py saveopts -g build --compiler=mingw32 + setup.py saveopts -g build --compiler=mingw32 Note, however, that all of the commands specified are always run, regardless of where ``saveopts`` is placed on the command line. @@ -1863,7 +1922,7 @@ Save settings to the global ``distutils.cfg`` file inside the ``distutils`` package directory. You must have write access to that directory to use this option. You also can't combine this option with ``-u`` or ``-f``. - + ``--user-config, -u`` Save settings to the current user's ``~/.pydistutils.cfg`` (POSIX) or ``$HOME/pydistutils.cfg`` (Windows) file. You can't combine this option @@ -1896,7 +1955,7 @@ **Example 2**. Remove any setting for the distutils default package installation directory (short option names):: - + setup.py setopt -c install -o install_lib -r @@ -1982,7 +2041,7 @@ setup.py bdist_egg upload # create an egg and upload it setup.py sdist upload # create a source distro and upload it setup.py sdist bdist_egg upload # create and upload both - + Note that to upload files for a project, the corresponding version must already be registered with PyPI, using the distutils ``register`` command. It's usually a good idea to include the ``register`` command at the start of the @@ -2223,7 +2282,11 @@ * Added the ``include_package_data`` keyword to ``setup()``, allowing you to automatically include any package data listed in revision control or - ``MANIFEST.in``. + ``MANIFEST.in`` + + * Added the ``exclude_package_data`` keyword to ``setup()``, allowing you to + trim back files included via the ``package_data`` and + ``include_package_data`` options. * Fixed ``--tag-svn-revision`` not working when run from a source distribution. @@ -2286,7 +2349,7 @@ 0.6a5 * Fixed missing gui/cli .exe files in distribution. Fixed bugs in tests. - + 0.6a3 * Added ``gui_scripts`` entry point group to allow installing GUI scripts on Windows and other platforms. (The special handling is only for Windows; @@ -2301,7 +2364,7 @@ 0.6a1 * Added support for building "old-style" RPMs that don't install an egg for the target package, using a ``--no-egg`` option. - + * The ``build_ext`` command now works better when using the ``--inplace`` option and multiple Python versions. It now makes sure that all extensions match the current Python version, even if newer copies were built for a @@ -2339,7 +2402,7 @@ * The vestigial ``depends`` command has been removed. It was never finished or documented, and never would have worked without EasyInstall - which it pre-dated and was never compatible with. - + 0.5a12 * The zip-safety scanner now checks for modules that might be used with ``python -m``, and marks them as unsafe for zipping, since Python 2.4 can't Modified: sandbox/trunk/setuptools/setuptools/command/build_py.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/build_py.py (original) +++ sandbox/trunk/setuptools/setuptools/command/build_py.py Thu Dec 15 03:45:03 2005 @@ -1,4 +1,4 @@ -import os.path, sys +import os.path, sys, fnmatch from distutils.command.build_py import build_py as _build_py from distutils.util import convert_path from glob import glob @@ -12,10 +12,10 @@ Also, this version of the 'build_py' command allows you to specify both 'py_modules' and 'packages' in the same setup operation. """ - def finalize_options(self): _build_py.finalize_options(self) self.package_data = self.distribution.package_data + self.exclude_package_data = self.distribution.exclude_package_data or {} if 'data_files' in self.__dict__: del self.__dict__['data_files'] def run(self): @@ -68,7 +68,7 @@ for pattern in globs: # Each pattern has to be converted to a platform-specific path files.extend(glob(os.path.join(src_dir, convert_path(pattern)))) - return files + return self.exclude_data_files(package, src_dir, files) def build_package_data(self): """Copy data files into build directory""" @@ -162,3 +162,44 @@ + def exclude_data_files(self, package, src_dir, files): + """Filter filenames for package's data files in 'src_dir'""" + globs = (self.exclude_package_data.get('', []) + + self.exclude_package_data.get(package, [])) + bad = [] + for pattern in globs: + bad.extend( + fnmatch.filter( + files, os.path.join(src_dir, convert_path(pattern)) + ) + ) + bad = dict.fromkeys(bad) + return [f for f in files if f not in bad] + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modified: sandbox/trunk/setuptools/setuptools/dist.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/dist.py (original) +++ sandbox/trunk/setuptools/setuptools/dist.py Thu Dec 15 03:45:03 2005 @@ -103,24 +103,24 @@ raise DistutilsSetupError("test_suite must be a string") +def check_package_data(dist, attr, value): + """Verify that value is a dictionary of package names to glob lists""" + if isinstance(value,dict): + for k,v in value.items(): + if not isinstance(k,str): break + try: iter(v) + except TypeError: + break + else: + return + raise DistutilsSetupError( + attr+" must be a dictionary mapping package names to lists of " + "wildcard patterns" + ) - - - - - - - - - - - - - - class Distribution(_Distribution): """Distribution with support for features, tests, and package data From python-checkins at python.org Thu Dec 15 05:55:36 2005 From: python-checkins at python.org (neal.norwitz) Date: Thu, 15 Dec 2005 05:55:36 +0100 (CET) Subject: [Python-checkins] commit of r41694 - peps/trunk/pep-3000.txt Message-ID: <20051215045536.DF02D1E400D@bag.python.org> Author: neal.norwitz Date: Thu Dec 15 05:55:32 2005 New Revision: 41694 Modified: peps/trunk/pep-3000.txt Log: With permission, add lots more details and references. Add a couple of changes which are likely, but not definite. At least until Guido changes his mind. ;-) Modified: peps/trunk/pep-3000.txt ============================================================================== --- peps/trunk/pep-3000.txt (original) +++ peps/trunk/pep-3000.txt Thu Dec 15 05:55:32 2005 @@ -49,11 +49,12 @@ * Support only new-style classes; classic classes will be gone [1]_ * Return iterators instead of lists where appropriate for atomic type methods (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) + (Do we keep iter*() methods or remove them? I vote remove. -- nn) * Replace ``print`` by a function [16]_ * Do something so you can catch multiple exceptions using ``except E1, E2, E3:``. Maybe use ``except E1, E2, E3 as err:`` if you want the error variable? [3]_ -* ``True`` and ``False`` become keywords [4]_ +* ``None``, ``True`` and ``False`` become keywords [4]_ * ``as`` becomes a keyword [5]_ * Have list comprehensions be syntactic sugar for passing an equivalent generator expression to ``list()``; as a consequence the @@ -61,6 +62,12 @@ * Comparisons other than ``==`` and ``!=`` between disparate types will raise an exception unless explicitly supported by the type [6]_ * Exceptions will grow an attribute to store the traceback [13]_ +* floats will not be acceptable as arguments in place of ints for operations + where floats are inadvertantly accepted (PyArg_ParseTuple() i & l formats) +* Imports will be absolute by default. + Relative imports must be explicitly specified [19]_ +* __init__.py will be optional in sub-packages. __init__.py will still + be required for top-level packages. To be removed: @@ -70,6 +77,12 @@ * ```x```: use ``repr(x)`` [2]_ * The ``<>`` operator: use ``!=`` instead [3]_ * Unbound methods [7]_ +* METH_OLDARGS +* __getslice__, __setslice__, __delslice__ [17]_ +* C APIs (see code): + PyFloat_AsString, PyFloat_AsReprString, PyFloat_AsStringEx, + PySequence_In, PyEval_EvalFrame, PyEval_CallObject, + _PyObject_Del, _PyObject_GC_Del, _PyObject_GC_Track, _PyObject_GC_UnTrack Built-in Namespace @@ -82,6 +95,7 @@ * Introduce ``trunc()``, which would call the ``__trunc__()`` method on its argument; suggested use is for objects like float where calling ``__int__()`` has data loss, but an integral representation is still desired [8]_ +* Exception hierarchy changes [20]_ To be removed: @@ -106,18 +120,41 @@ * ``basestring.find()`` and ``basestring.rfind()``; use ``basestring.index()`` or ``basestring.rindex()`` in a try/except block [15]_ +* ``file.xreadlines()`` method [17]_ Standard library ================ * Reorganize the standard library to not be as shallow +* Move test code to where it belongs, there will be no more test() functions + in the standard library To be removed: -* ``string`` and other deprecated modules [1]_ -* ``sys.exc_type``: not thread-safe; use ``sys.exc_info`` [2]_ +* Deprecated modules, methods, parameters, attributes, etc. [1]_ [17]_ [18]_ + There may be other modules, the most common are listed below. + stdlib modules to be removed (see docstrings and comments in the source): + * ``macfs``, ``new``, ``reconvert``, ``stringold``, ``xmllib`` + * ``pcre``, ``pypcre``, ``strop`` + stdlib modules to be removed (see PEP 4): [18]_ + * ``posixfile``, ``pre``, ``regsub``, ``rfc822``, + * ``statcache``, ``string``, ``TERMIOS`` + * ``mimetools``, ``MimeWriter``, ``mimify``, + * ``mpz``, ``rgbimage`` + * Everything in lib-old: [18]_ + * Para.py, addpack.py, cmp.py, cmpcache.py, codehack.py, + * dircmp.py, dump.py, find.py, fmt.py, grep.py, lockfile.py, + * newdir.py, ni.py, packmail.py, poly.py, rand.py, statcache.py, + * tb.py, tzparse.py, util.py, whatsound.py, whrandom.py, zmod.py + +* ``sys.exitfunc``: use atexit module instead [17]_ +* ``sys.exc_type``, ``sys.exc_values``, ``sys.exc_traceback``: + not thread-safe; use ``sys.exc_info()`` or an attribute + of the exception [2]_ [13]_ [17]_ +* ``array.read``, ``array.write`` [17]_ +* ``operator.isCallable``, ``operator.sequenceIncludes`` [17]_ References ========== @@ -171,6 +208,21 @@ .. [16] python-dev email (Replacement for print in Python 3.0) http://mail.python.org/pipermail/python-dev/2005-September/056154.html +.. [17] Python docs + http://docs.python.org/ref/sequence-methods.html + http://docs.python.org/lib/module-sys.html + http://docs.python.org/lib/module-operator.html + http://docs.python.org/lib/module-array.html + http://docs.python.org/lib/bltin-file-objects.html + +.. [18] PEP 4 ("Deprecation of Standard Modules") + http://www.python.org/peps/pep-0004.html + +.. [19] PEP 328 ("Imports: Multi-Line and Absolute/Relative") + http://www.python.org/peps/pep-0328.html + +.. [20] PEP 352 ("Required Superclass for Exceptions") + http://www.python.org/peps/pep-0352.html Copyright ========= From python-checkins at python.org Thu Dec 15 06:25:17 2005 From: python-checkins at python.org (neal.norwitz) Date: Thu, 15 Dec 2005 06:25:17 +0100 (CET) Subject: [Python-checkins] commit of r41695 - in python/trunk: Lib/test/test_file.py Misc/NEWS Objects/fileobject.c configure configure.in pyconfig.h.in Message-ID: <20051215052517.D404F1E4009@bag.python.org> Author: neal.norwitz Date: Thu Dec 15 06:25:09 2005 New Revision: 41695 Modified: python/trunk/Lib/test/test_file.py python/trunk/Misc/NEWS python/trunk/Objects/fileobject.c python/trunk/configure python/trunk/configure.in python/trunk/pyconfig.h.in Log: Revert r41662 and the part of 41552 that originally caused the problem (calling ftell(stdin) doesn't seem defined). So we won't test errors from ftell unless we can do it portably. Modified: python/trunk/Lib/test/test_file.py ============================================================================== --- python/trunk/Lib/test/test_file.py (original) +++ python/trunk/Lib/test/test_file.py Thu Dec 15 06:25:09 2005 @@ -108,13 +108,6 @@ print "should not be able to seek on sys.stdin" try: - sys.stdin.tell() -except IOError: - pass -else: - print "should not be able to tell on sys.stdin" - -try: sys.stdin.truncate() except IOError: pass Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Thu Dec 15 06:25:09 2005 @@ -12,9 +12,6 @@ Core and builtins ----------------- -- Added a workaround for file.tell() to raise IOError when the file - is a tty on every platforms as documented in our library reference. - - Patch #1350409: Work around signal handling bug in Visual Studio 2005. - Bug #1281408: Py_BuildValue now works correct even with unsigned longs Modified: python/trunk/Objects/fileobject.c ============================================================================== --- python/trunk/Objects/fileobject.c (original) +++ python/trunk/Objects/fileobject.c Thu Dec 15 06:25:09 2005 @@ -482,13 +482,6 @@ static Py_off_t _portable_ftell(FILE* fp) { -#ifdef HAVE_BROKEN_FTELL - /* ftell doesn't fail for tty fds on FreeBSD and some others */ - if (isatty(fileno(fp))) { - errno = ESPIPE; - return -1; - } -#endif #if !defined(HAVE_LARGEFILE_SUPPORT) return ftell(fp); #elif defined(HAVE_FTELLO) && SIZEOF_OFF_T >= 8 Modified: python/trunk/configure ============================================================================== --- python/trunk/configure (original) +++ python/trunk/configure Thu Dec 15 06:25:09 2005 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 41662 . +# From configure.in Revision: 39267 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for python 2.5. # @@ -20118,67 +20118,6 @@ fi -echo "$as_me:$LINENO: checking for broken ftell()" >&5 -echo $ECHO_N "checking for broken ftell()... $ECHO_C" >&6 -if test "${ac_cv_broken_ftell+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - -if test "$cross_compiling" = yes; then - ac_cv_broken_ftell=no -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -int main() -{ - long val = ftell(stdin); - if (val != -1) - exit(0); - exit(1); -} - -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_broken_ftell=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_broken_ftell=no -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi - -echo "$as_me:$LINENO: result: $ac_cv_broken_ftell" >&5 -echo "${ECHO_T}$ac_cv_broken_ftell" >&6 -if test "$ac_cv_broken_ftell" = yes -then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_BROKEN_FTELL 1 -_ACEOF - -fi - # Before we can test tzset, we need to check if struct tm has a tm_zone # (which is not required by ISO C or UNIX spec) and/or if we support # tzname[] Modified: python/trunk/configure.in ============================================================================== --- python/trunk/configure.in (original) +++ python/trunk/configure.in Thu Dec 15 06:25:09 2005 @@ -2955,28 +2955,6 @@ [Define if poll() sets errno on invalid file descriptors.]) fi -AC_MSG_CHECKING(for broken ftell()) -AC_CACHE_VAL(ac_cv_broken_ftell, [ -AC_TRY_RUN([ -#include -int main() -{ - long val = ftell(stdin); - if (val != -1) - exit(0); - exit(1); -} -], -ac_cv_broken_ftell=yes, -ac_cv_broken_ftell=no, -ac_cv_broken_ftell=no)]) -AC_MSG_RESULT($ac_cv_broken_ftell) -if test "$ac_cv_broken_ftell" = yes -then - AC_DEFINE(HAVE_BROKEN_FTELL, 1, - [Define if ftell() set errno on tty files.]) -fi - # Before we can test tzset, we need to check if struct tm has a tm_zone # (which is not required by ISO C or UNIX spec) and/or if we support # tzname[] Modified: python/trunk/pyconfig.h.in ============================================================================== --- python/trunk/pyconfig.h.in (original) +++ python/trunk/pyconfig.h.in Thu Dec 15 06:25:09 2005 @@ -46,9 +46,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_BLUETOOTH_H -/* Define if ftell() set errno on tty files. */ -#undef HAVE_BROKEN_FTELL - /* Define if nice() returns success/failure instead of the new priority. */ #undef HAVE_BROKEN_NICE From reinhold-birkenfeld-nospam at wolke7.net Thu Dec 15 06:55:48 2005 From: reinhold-birkenfeld-nospam at wolke7.net (Reinhold Birkenfeld) Date: Thu, 15 Dec 2005 06:55:48 +0100 Subject: [Python-checkins] commit of r41686 - peps/trunk/pep-0008.txt In-Reply-To: <20051214221017.8BF441E400F@bag.python.org> References: <20051214221017.8BF441E400F@bag.python.org> Message-ID: guido.van.rossum wrote: > Author: guido.van.rossum > Date: Wed Dec 14 23:10:16 2005 > New Revision: 41686 > > Modified: > peps/trunk/pep-0008.txt > @@ -450,14 +480,15 @@ > Since module names are mapped to file names, and some file systems are > case insensitive and truncate long names, it is important that module > names be chosen to be fairly short -- this won't be a problem on Unix, > - but it may be a problem when the code is transported to Mac or Windows. > + but it may be a problem when the code is transported to older Mac or > + Windows versions, or DOS. I'm nitpicky, but shouldn't that be "older Macs or Windows versions"? Reinhold -- Mail address is perfectly valid! From python-checkins at python.org Thu Dec 15 07:40:37 2005 From: python-checkins at python.org (neal.norwitz) Date: Thu, 15 Dec 2005 07:40:37 +0100 (CET) Subject: [Python-checkins] commit of r41696 - python/trunk/Python/bltinmodule.c Message-ID: <20051215064037.22F0D1E4002@bag.python.org> Author: neal.norwitz Date: Thu Dec 15 07:40:36 2005 New Revision: 41696 Modified: python/trunk/Python/bltinmodule.c Log: Fix an int/long mismatch identified here: http://www.tortall.net/mu/blog/2005/12/01 Pointed out from SF #1365916. Backport candidate. Modified: python/trunk/Python/bltinmodule.c ============================================================================== --- python/trunk/Python/bltinmodule.c (original) +++ python/trunk/Python/bltinmodule.c Thu Dec 15 07:40:36 2005 @@ -1908,8 +1908,9 @@ PyObject *newlist, *v, *seq, *compare=NULL, *keyfunc=NULL, *newargs; PyObject *callable; static const char *kwlist[] = {"iterable", "cmp", "key", "reverse", 0}; - long reverse; + int reverse; + /* args 1-4 should match listsort in Objects/listobject.c */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OOi:sorted", kwlist, &seq, &compare, &keyfunc, &reverse)) return NULL; From python-checkins at python.org Thu Dec 15 16:44:35 2005 From: python-checkins at python.org (barry.warsaw) Date: Thu, 15 Dec 2005 16:44:35 +0100 (CET) Subject: [Python-checkins] commit of r41697 - peps/trunk/pep-0008.txt Message-ID: <20051215154435.CF5321E4002@bag.python.org> Author: barry.warsaw Date: Thu Dec 15 16:44:35 2005 New Revision: 41697 Modified: peps/trunk/pep-0008.txt Log: Remove a bunch of Emacs references. They're unnecessary for making the point. Modified: peps/trunk/pep-0008.txt ============================================================================== --- peps/trunk/pep-0008.txt (original) +++ peps/trunk/pep-0008.txt Thu Dec 15 16:44:35 2005 @@ -53,10 +53,8 @@ Use 4 spaces per indentation level. - This is the default for Emacs's python-mode. For really old code that you - don't want to mess up, you can continue to use 8-space tabs. Emacs - python-mode auto-detects the prevailing indentation level used in a file - and sets its indentation parameters accordingly. + For really old code that you don't want to mess up, you can continue to + use 8-space tabs. Tabs or Spaces? @@ -64,15 +62,13 @@ The most popular way of indenting Python is with spaces only. The second-most popular way is with tabs only. Code indented with a mixture - of tabs and spaces should be converted to using spaces exclusively. (In - Emacs, select the whole buffer and hit ESC-x untabify.) When invoking the - Python command line interpreter with the -t option, it issues warnings - about code that illegally mixes tabs and spaces. When using -tt these - warnings become errors. These options are highly recommended! + of tabs and spaces should be converted to using spaces exclusively. When + invoking the Python command line interpreter with the -t option, it issues + warnings about code that illegally mixes tabs and spaces. When using -tt + these warnings become errors. These options are highly recommended! For new projects, spaces-only are strongly recommended over tabs. Most - editors have features that make this easy to do. (In Emacs, make sure - indent-tabs-mode is nil). + editors have features that make this easy to do. Maximum Line Length @@ -81,16 +77,15 @@ There are still many devices around that are limited to 80 character lines; plus, limiting windows to 80 characters makes it possible to have several windows side-by-side. The default wrapping on such devices looks - ugly. Therefore, please limit all lines to a maximum of 79 characters - (Emacs wraps lines that are exactly 80 characters long). For flowing long - blocks of text (docstrings or comments), limiting the length to 72 - characters is recommended. + ugly. Therefore, please limit all lines to a maximum of 79 characters. + For flowing long blocks of text (docstrings or comments), limiting the + length to 72 characters is recommended. The preferred way of wrapping long lines is by using Python's implied line continuation inside parentheses, brackets and braces. If necessary, you can add an extra pair of parentheses around an expression, but sometimes using a backslash looks better. Make sure to indent the continued line - appropriately. Emacs's python-mode does this right. Some examples: + appropriately. Some examples: class Rectangle(Blob): @@ -119,8 +114,8 @@ Use blank lines in functions, sparingly, to indicate logical sections. Python accepts the control-L (i.e. ^L) form feed character as whitespace; - Emacs (and some printing tools) treat these characters as page separators, - so you may use them to separate pages of related sections of your file. + Many tools treat these characters as page separators, so you may use them + to separate pages of related sections of your file. Encodings (PEP 263) @@ -130,8 +125,7 @@ Files using ASCII should not have a coding cookie. Latin-1 should only be used when a comment or docstring needs to mention an author name that requires Latin-1; otherwise, using \x escapes is the preferred way to - include non-ASCII data in string literals. An exception is made for those - files that are part of the test suite for the code implementing PEP 263. + include non-ASCII data in string literals. Imports @@ -314,8 +308,7 @@ comments generally consist of one or more paragraphs built out of complete sentences, and each sentence should end in a period. - You should use two spaces after a sentence-ending period, since it - makes Emacs wrapping and filling work consistently. + You should use two spaces after a sentence-ending period. When writing English, Strunk and White apply. From python-checkins at python.org Thu Dec 15 19:10:11 2005 From: python-checkins at python.org (phillip.eby) Date: Thu, 15 Dec 2005 19:10:11 +0100 (CET) Subject: [Python-checkins] commit of r41698 - sandbox/trunk/setuptools/pkg_resources.py Message-ID: <20051215181011.883C11E4002@bag.python.org> Author: phillip.eby Date: Thu Dec 15 19:10:10 2005 New Revision: 41698 Modified: sandbox/trunk/setuptools/pkg_resources.py Log: Improve startup performance when sys.path contains a lot of eggs, by caching normalized versions of path entries. It appears that normalizing paths using os.path.realpath is extremely expensive on at least Windows. Caching cuts the overhead by around 30X. Modified: sandbox/trunk/setuptools/pkg_resources.py ============================================================================== --- sandbox/trunk/setuptools/pkg_resources.py (original) +++ sandbox/trunk/setuptools/pkg_resources.py Thu Dec 15 19:10:10 2005 @@ -1357,7 +1357,7 @@ def find_on_path(importer, path_item, only=False): """Yield distributions accessible on a sys.path directory""" - path_item = normalize_path(path_item) + path_item = _normalize_cached(path_item) if os.path.isdir(path_item): if path_item.lower().endswith('.egg'): @@ -1478,9 +1478,9 @@ """Compute an ns-package subpath for a filesystem or zipfile importer""" subpath = os.path.join(path_item, packageName.split('.')[-1]) - normalized = normalize_path(subpath) + normalized = _normalize_cached(subpath) for item in module.__path__: - if normalize_path(item)==normalized: + if _normalize_cached(item)==normalized: break else: # Only return the path if it's not already there @@ -1500,6 +1500,12 @@ """Normalize a file/dir name for comparison purposes""" return os.path.normcase(os.path.realpath(filename)) +def _normalize_cached(filename,_cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result def _set_parent_ns(packageName): parts = packageName.split('.') @@ -1509,12 +1515,6 @@ setattr(sys.modules[parent], name, sys.modules[packageName]) - - - - - - def yield_lines(strs): """Yield non-empty/non-comment lines of a ``basestring`` or sequence""" if isinstance(strs,basestring): @@ -1876,7 +1876,7 @@ #@classmethod def from_filename(cls,filename,metadata=None): return cls.from_location( - normalize_path(filename), os.path.basename(filename), metadata + _normalize_cached(filename), os.path.basename(filename), metadata ) from_filename = classmethod(from_filename) @@ -1915,7 +1915,7 @@ self.check_version_conflict() best, pos = 0, -1 for p,item in enumerate(path): - item = normalize_path(item) + item = _normalize_cached(item) if loc.startswith(item) and len(item)>best and loc<>item: best, pos = len(item), p if pos==-1: From python-checkins at python.org Thu Dec 15 19:11:12 2005 From: python-checkins at python.org (phillip.eby) Date: Thu, 15 Dec 2005 19:11:12 +0100 (CET) Subject: [Python-checkins] commit of r41699 - sandbox/trunk/setuptools/setuptools/command/install_egg_info.py Message-ID: <20051215181112.8E5941E4009@bag.python.org> Author: phillip.eby Date: Thu Dec 15 19:11:12 2005 New Revision: 41699 Modified: sandbox/trunk/setuptools/setuptools/command/install_egg_info.py Log: Make install_egg_info track every file it installs, not just the directory it installs to. Modified: sandbox/trunk/setuptools/setuptools/command/install_egg_info.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install_egg_info.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install_egg_info.py Thu Dec 15 19:11:12 2005 @@ -23,6 +23,7 @@ ).egg_name()+'.egg-info' self.source = ei_cmd.egg_info self.target = os.path.join(self.install_dir, basename) + self.outputs = [self.target] def run(self): self.run_command('egg_info') @@ -38,9 +39,8 @@ ) - def get_outputs(self): - return [self.target] # XXX list all files, not just dir? + return self.outputs def copytree(self): # Copy the .egg-info tree to site-packages @@ -52,6 +52,7 @@ for skip in '.svn/','CVS/': if src.startswith(skip) or '/'+skip in src: return None + self.outputs.append(dst) log.debug("Copying %s to %s", src, dst) return dst @@ -79,4 +80,3 @@ - From python-checkins at python.org Thu Dec 15 19:41:23 2005 From: python-checkins at python.org (fredrik.lundh) Date: Thu, 15 Dec 2005 19:41:23 +0100 (CET) Subject: [Python-checkins] commit of r41700 - python/trunk/Lib/test/test_xml_etree_c.py python/trunk/Lib/test/xmltests.py Message-ID: <20051215184123.32A0C1E4002@bag.python.org> Author: fredrik.lundh Date: Thu Dec 15 19:41:22 2005 New Revision: 41700 Added: python/trunk/Lib/test/test_xml_etree_c.py (contents, props changed) Modified: python/trunk/Lib/test/xmltests.py Log: added cElementTree tests Added: python/trunk/Lib/test/test_xml_etree_c.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/test_xml_etree_c.py Thu Dec 15 19:41:22 2005 @@ -0,0 +1,203 @@ +# xmlcore.etree test for cElementTree + +import doctest, sys + +from test import test_support + +SAMPLE_XML = """ + + text + +
+ subtext +
+ +""" + +SAMPLE_XML_NS = """ + + text + +
+ subtext +
+ +""" + +def sanity(): + """ + Import sanity. + + >>> from xmlcore.etree import cElementTree + """ + +def check_method(method): + if not callable(method): + print method, "not callable" + +def serialize(ET, elem, encoding=None): + import StringIO + file = StringIO.StringIO() + tree = ET.ElementTree(elem) + if encoding: + tree.write(file, encoding) + else: + tree.write(file) + return file.getvalue() + +def summarize(elem): + return elem.tag + +def summarize_list(seq): + return map(summarize, seq) + +def interface(): + """ + Test element tree interface. + + >>> from xmlcore.etree import cElementTree as ET + + >>> element = ET.Element("tag", key="value") + >>> tree = ET.ElementTree(element) + + Make sure all standard element methods exist. + + >>> check_method(element.append) + >>> check_method(element.insert) + >>> check_method(element.remove) + >>> check_method(element.getchildren) + >>> check_method(element.find) + >>> check_method(element.findall) + >>> check_method(element.findtext) + >>> check_method(element.clear) + >>> check_method(element.get) + >>> check_method(element.set) + >>> check_method(element.keys) + >>> check_method(element.items) + >>> check_method(element.getiterator) + + Basic method sanity checks. + + >>> serialize(ET, element) # 1 + '' + >>> subelement = ET.Element("subtag") + >>> element.append(subelement) + >>> serialize(ET, element) # 2 + '' + >>> element.insert(0, subelement) + >>> serialize(ET, element) # 3 + '' + >>> element.remove(subelement) + >>> serialize(ET, element) # 4 + '' + >>> element.remove(subelement) + >>> serialize(ET, element) # 5 + '' + >>> element.remove(subelement) + Traceback (most recent call last): + ValueError: list.remove(x): x not in list + >>> serialize(ET, element) # 6 + '' + """ + +def find(): + """ + Test find methods (including xpath syntax). + + >>> from xmlcore.etree import cElementTree as ET + + >>> elem = ET.XML(SAMPLE_XML) + >>> elem.find("tag").tag + 'tag' + >>> ET.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.find("section/tag").tag + 'tag' + >>> ET.ElementTree(elem).find("section/tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog") + >>> elem.findtext("tog", "default") + 'default' + >>> ET.ElementTree(elem).findtext("tag") + 'text' + >>> elem.findtext("section/tag") + 'subtext' + >>> ET.ElementTree(elem).findtext("section/tag") + 'subtext' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall("*")) + ['tag', 'tag', 'section'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("section/tag")) + ['tag'] + >>> summarize_list(elem.findall("section//tag")) + ['tag'] + >>> summarize_list(elem.findall("section/*")) + ['tag'] + >>> summarize_list(elem.findall("section//*")) + ['tag'] + >>> summarize_list(elem.findall("section/.//*")) + ['tag'] + >>> summarize_list(elem.findall("*/*")) + ['tag'] + >>> summarize_list(elem.findall("*//*")) + ['tag'] + >>> summarize_list(elem.findall("*/tag")) + ['tag'] + >>> summarize_list(elem.findall("*/./tag")) + ['tag'] + >>> summarize_list(elem.findall("./tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("././tag")) + ['tag', 'tag'] + >>> summarize_list(ET.ElementTree(elem).findall("/tag")) + ['tag', 'tag'] + >>> summarize_list(ET.ElementTree(elem).findall("./tag")) + ['tag', 'tag'] + >>> elem = ET.XML(SAMPLE_XML_NS) + >>> summarize_list(elem.findall("tag")) + [] + >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + """ + +def parseliteral(): + r""" + + >>> from xmlcore.etree import cElementTree as ET + + >>> element = ET.XML("text") + >>> ET.ElementTree(element).write(sys.stdout) + text + >>> element = ET.fromstring("text") + >>> ET.ElementTree(element).write(sys.stdout) + text + >>> print ET.tostring(element) + text + >>> print ET.tostring(element, "ascii") + + text + >>> _, ids = ET.XMLID("text") + >>> len(ids) + 0 + >>> _, ids = ET.XMLID("text") + >>> len(ids) + 1 + >>> ids["body"].tag + 'body' + """ + +def test_main(): + from test import test_xml_etree_c + test_support.run_doctest(test_xml_etree_c, verbosity=True) + +if __name__ == '__main__': + test_main() Modified: python/trunk/Lib/test/xmltests.py ============================================================================== --- python/trunk/Lib/test/xmltests.py (original) +++ python/trunk/Lib/test/xmltests.py Thu Dec 15 19:41:22 2005 @@ -16,5 +16,6 @@ runtest("test.test_pyexpat") runtest("test.test_sax") runtest("test.test_xml_etree") +runtest("test.test_xml_etree_c") runtest("test.test_xmllib") runtest("test.test_xmlrpc") From python-checkins at python.org Thu Dec 15 20:49:04 2005 From: python-checkins at python.org (phillip.eby) Date: Thu, 15 Dec 2005 20:49:04 +0100 (CET) Subject: [Python-checkins] commit of r41701 - sandbox/trunk/setuptools/pkg_resources.py Message-ID: <20051215194904.7C02C1E4002@bag.python.org> Author: phillip.eby Date: Thu Dec 15 20:49:03 2005 New Revision: 41701 Modified: sandbox/trunk/setuptools/pkg_resources.py Log: Modify resource extraction to bypass sandbox control so that egg extraction during setup runs is not restricted. Modified: sandbox/trunk/setuptools/pkg_resources.py ============================================================================== --- sandbox/trunk/setuptools/pkg_resources.py (original) +++ sandbox/trunk/setuptools/pkg_resources.py Thu Dec 15 20:49:03 2005 @@ -15,8 +15,8 @@ import sys, os, zipimport, time, re, imp, new from sets import ImmutableSet - - +from os import utime, rename, unlink # capture these to bypass sandboxing +from os import open as os_open @@ -1084,13 +1084,12 @@ if stat.st_size==size and stat.st_mtime==timestamp: # size and stamp match, don't bother extracting return real_path - from tempfile import mkstemp - outf, tmpnam = mkstemp(".$extract", dir=os.path.dirname(real_path)) + outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path)) os.write(outf, self.loader.get_data(zip_path)) os.close(outf) - os.utime(tmpnam, (timestamp,timestamp)) + utime(tmpnam, (timestamp,timestamp)) manager.postprocess(tmpnam, real_path) - try: os.rename(tmpnam, real_path) + try: rename(tmpnam, real_path) except os.error: if os.path.isfile(real_path): stat = os.stat(real_path) @@ -1099,12 +1098,13 @@ # so we're done return real_path elif os.name=='nt': # Windows, delete old file and retry - os.unlink(real_path) - os.rename(tmpnam, real_path) + unlink(real_path) + rename(tmpnam, real_path) return real_path raise return real_path + def _get_eager_resources(self): if self.eagers is None: eagers = [] @@ -2136,7 +2136,6 @@ if not os.path.isdir(dirname): os.makedirs(dirname) - def split_sections(s): """Split a string or iterable thereof into (section,content) pairs @@ -2162,13 +2161,14 @@ # wrap up last segment yield section, content - - - - - - - +def _mkstemp(*args,**kw): + from tempfile import mkstemp + old_open = os.open + try: + os.open = os_open # temporarily bypass sandboxing + return mkstemp(*args,**kw) + finally: + os.open = old_open # and then put it back # Set up global resource manager From python-checkins at python.org Thu Dec 15 21:17:21 2005 From: python-checkins at python.org (walter.doerwald) Date: Thu, 15 Dec 2005 21:17:21 +0100 (CET) Subject: [Python-checkins] commit of r41702 - python/trunk/Lib/test/test_quopri.py Message-ID: <20051215201721.60F4E1E4002@bag.python.org> Author: walter.doerwald Date: Thu Dec 15 21:17:20 2005 New Revision: 41702 Modified: python/trunk/Lib/test/test_quopri.py Log: Add two tests for the script interface. Modified: python/trunk/Lib/test/test_quopri.py ============================================================================== --- python/trunk/Lib/test/test_quopri.py (original) +++ python/trunk/Lib/test/test_quopri.py Thu Dec 15 21:17:20 2005 @@ -1,7 +1,7 @@ from test import test_support import unittest -from cStringIO import StringIO +import sys, os, cStringIO import quopri @@ -145,16 +145,16 @@ @withpythonimplementation def test_encode(self): for p, e in self.STRINGS: - infp = StringIO(p) - outfp = StringIO() + infp = cStringIO.StringIO(p) + outfp = cStringIO.StringIO() quopri.encode(infp, outfp, quotetabs=False) self.assert_(outfp.getvalue() == e) @withpythonimplementation def test_decode(self): for p, e in self.STRINGS: - infp = StringIO(e) - outfp = StringIO() + infp = cStringIO.StringIO(e) + outfp = cStringIO.StringIO() quopri.decode(infp, outfp) self.assert_(outfp.getvalue() == p) @@ -174,6 +174,20 @@ for p, e in self.HSTRINGS: self.assert_(quopri.decodestring(e, header=True) == p) + def test_scriptencode(self): + (p, e) = self.STRINGS[-1] + (cin, cout) = os.popen2("%s -mquopri" % sys.executable) + cin.write(p) + cin.close() + self.assert_(cout.read() == e) + + def test_scriptdecode(self): + (p, e) = self.STRINGS[-1] + (cin, cout) = os.popen2("%s -mquopri -d" % sys.executable) + cin.write(e) + cin.close() + self.assert_(cout.read() == p) + def test_main(): test_support.run_unittest(QuopriTestCase) From python-checkins at python.org Thu Dec 15 22:34:30 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Thu, 15 Dec 2005 22:34:30 +0100 (CET) Subject: [Python-checkins] commit of r41703 - python/trunk/Doc/lib/libstdtypes.tex Message-ID: <20051215213430.767A61E4002@bag.python.org> Author: reinhold.birkenfeld Date: Thu Dec 15 22:34:29 2005 New Revision: 41703 Modified: python/trunk/Doc/lib/libstdtypes.tex Log: Remove reference to the "t" open() mode as it is platform dependent. Modified: python/trunk/Doc/lib/libstdtypes.tex ============================================================================== --- python/trunk/Doc/lib/libstdtypes.tex (original) +++ python/trunk/Doc/lib/libstdtypes.tex Thu Dec 15 22:34:29 2005 @@ -1588,7 +1588,7 @@ file is only opened for writing in append mode (mode \code{'a'}), this method is essentially a no-op, but it remains useful for files opened in append mode with reading enabled (mode \code{'a+'}). If the - file is opened in text mode (mode \code{'t'}), only offsets returned + file is opened in text mode (without \code{'b'}), only offsets returned by \method{tell()} are legal. Use of other offsets causes undefined behavior. From python-checkins at python.org Thu Dec 15 22:34:53 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Thu, 15 Dec 2005 22:34:53 +0100 (CET) Subject: [Python-checkins] commit of r41704 - python/branches/release24-maint/Doc/lib/libstdtypes.tex Message-ID: <20051215213453.D80221E4009@bag.python.org> Author: reinhold.birkenfeld Date: Thu Dec 15 22:34:53 2005 New Revision: 41704 Modified: python/branches/release24-maint/Doc/lib/libstdtypes.tex Log: Remove reference to open() mode "t" as it is platform dependent. Modified: python/branches/release24-maint/Doc/lib/libstdtypes.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libstdtypes.tex (original) +++ python/branches/release24-maint/Doc/lib/libstdtypes.tex Thu Dec 15 22:34:53 2005 @@ -1588,7 +1588,7 @@ file is only opened for writing in append mode (mode \code{'a'}), this method is essentially a no-op, but it remains useful for files opened in append mode with reading enabled (mode \code{'a+'}). If the - file is opened in text mode (mode \code{'t'}), only offsets returned + file is opened in text mode (without \code{'b'}), only offsets returned by \method{tell()} are legal. Use of other offsets causes undefined behavior. From python-checkins at python.org Thu Dec 15 22:59:02 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Thu, 15 Dec 2005 22:59:02 +0100 (CET) Subject: [Python-checkins] commit of r41705 - python/trunk/Lib/nturl2path.py Message-ID: <20051215215902.8173A1E4007@bag.python.org> Author: reinhold.birkenfeld Date: Thu Dec 15 22:59:00 2005 New Revision: 41705 Modified: python/trunk/Lib/nturl2path.py Log: Bug #1378455: a problem of urllib using open_local_file Modified: python/trunk/Lib/nturl2path.py ============================================================================== --- python/trunk/Lib/nturl2path.py (original) +++ python/trunk/Lib/nturl2path.py Thu Dec 15 22:59:00 2005 @@ -10,6 +10,8 @@ C:\foo\bar\spam.foo """ import string, urllib + # Windows itself uses ":" even in URLs. + url = url.replace(':', '|') if not '|' in url: # No drive specifier, just convert slashes if url[:4] == '////': From python-checkins at python.org Thu Dec 15 22:59:19 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Thu, 15 Dec 2005 22:59:19 +0100 (CET) Subject: [Python-checkins] commit of r41706 - python/branches/release24-maint/Lib/nturl2path.py Message-ID: <20051215215919.6D8801E4007@bag.python.org> Author: reinhold.birkenfeld Date: Thu Dec 15 22:59:16 2005 New Revision: 41706 Modified: python/branches/release24-maint/Lib/nturl2path.py Log: Bug #1378455: a problem of urllib using open_local_file (backport) Modified: python/branches/release24-maint/Lib/nturl2path.py ============================================================================== --- python/branches/release24-maint/Lib/nturl2path.py (original) +++ python/branches/release24-maint/Lib/nturl2path.py Thu Dec 15 22:59:16 2005 @@ -10,6 +10,8 @@ C:\foo\bar\spam.foo """ import string, urllib + # Windows itself uses ":" even in URLs. + url = url.replace(':', '|') if not '|' in url: # No drive specifier, just convert slashes if url[:4] == '////': From python-checkins at python.org Thu Dec 15 23:08:52 2005 From: python-checkins at python.org (trent.mick) Date: Thu, 15 Dec 2005 23:08:52 +0100 (CET) Subject: [Python-checkins] commit of r41707 - in python/trunk: PCbuild/_elementtree.vcproj PCbuild/pcbuild.sln Tools/msi/msi.py Message-ID: <20051215220852.353F91E4002@bag.python.org> Author: trent.mick Date: Thu Dec 15 23:08:46 2005 New Revision: 41707 Added: python/trunk/PCbuild/_elementtree.vcproj Modified: python/trunk/PCbuild/pcbuild.sln python/trunk/Tools/msi/msi.py Log: Add build support for _elementtree on Windows. Added: python/trunk/PCbuild/_elementtree.vcproj ============================================================================== --- (empty file) +++ python/trunk/PCbuild/_elementtree.vcproj Thu Dec 15 23:08:46 2005 @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modified: python/trunk/PCbuild/pcbuild.sln ============================================================================== Binary files. No diff available. Modified: python/trunk/Tools/msi/msi.py ============================================================================== --- python/trunk/Tools/msi/msi.py (original) +++ python/trunk/Tools/msi/msi.py Thu Dec 15 23:08:46 2005 @@ -104,6 +104,7 @@ 'unicodedata.pyd', 'winsound.pyd', 'zlib.pyd', + '_elementtree.pyd', '_bsddb.pyd', '_socket.pyd', '_ssl.pyd', From python-checkins at python.org Thu Dec 15 23:16:50 2005 From: python-checkins at python.org (trent.mick) Date: Thu, 15 Dec 2005 23:16:50 +0100 (CET) Subject: [Python-checkins] commit of r41708 - python/trunk/PCbuild/_elementtree.vcproj Message-ID: <20051215221650.F2E851E4002@bag.python.org> Author: trent.mick Date: Thu Dec 15 23:16:49 2005 New Revision: 41708 Modified: python/trunk/PCbuild/_elementtree.vcproj (contents, props changed) Log: Set props on _elementtree project file as per pyexpat.vcproj. Modified: python/trunk/PCbuild/_elementtree.vcproj ============================================================================== --- python/trunk/PCbuild/_elementtree.vcproj (original) +++ python/trunk/PCbuild/_elementtree.vcproj Thu Dec 15 23:16:49 2005 @@ -1,335 +1,335 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From python-checkins at python.org Fri Dec 16 19:46:57 2005 From: python-checkins at python.org (phillip.eby) Date: Fri, 16 Dec 2005 19:46:57 +0100 (CET) Subject: [Python-checkins] commit of r41709 - sandbox/trunk/setuptools/EasyInstall.txt sandbox/trunk/setuptools/setuptools.txt Message-ID: <20051216184657.464DD1E4002@bag.python.org> Author: phillip.eby Date: Fri Dec 16 19:46:56 2005 New Revision: 41709 Modified: sandbox/trunk/setuptools/EasyInstall.txt sandbox/trunk/setuptools/setuptools.txt Log: Overhaul installation docs to address frequently asked questions and problems, and to document additional approaches to dealing with custom install locations. Also, added a note about the parameters of ``use_setuptools()`` so that persons needing to distribute e.g. an in-development version of setuptools can do so. Modified: sandbox/trunk/setuptools/EasyInstall.txt ============================================================================== --- sandbox/trunk/setuptools/EasyInstall.txt (original) +++ sandbox/trunk/setuptools/EasyInstall.txt Fri Dec 16 19:46:56 2005 @@ -30,39 +30,66 @@ Installing "Easy Install" ------------------------- -If you are behind an NTLM-based firewall that prevents Python programs from -accessing the net directly, you may wish to first install and use the `APS -proxy server `_, which lets you get past such firewalls -in the same way that your web browser(s) do. - -If you do not have write access to your computer's ``site-packages`` directory, -please also see the section below on `Non-Root Installation`_ for more detailed -instructions on pre-configuring your system for the best usability with -EasyInstall, then return here for the remaining steps. - Download `ez_setup.py `_, and run it; this will download and install the appropriate ``setuptools`` egg for your Python version. (You will need at least Python 2.3.5, or if you are on a -64-bit platform, Python 2.4.) +64-bit platform, Python 2.4.) An ``easy_install`` script will be installed in +the normal location for Python scripts on your platform. + +You may receive a message telling you about an obsolete version of setuptools +being present; if so, you must be sure to delete it entirely, along with the +old ``pkg_resources`` module if it's present on ``sys.path``. +The ``ez_setup.py`` script accepts the same `Command-Line Options`_ and +`Configuration Files`_ as ``easy_install`` itself, so you can use them to +control its behavior. In particular, you can use the --script-dir option to +direct script installation to a custom location. You should not, however, +use custom installation locations without first reading the section below on +`Custom Installation Locations`_. -You may receive a message telling you about an obsolete version of -setuptools being present; if so, you must be sure to delete it entirely, along -with the old ``pkg_resources`` module if it's present on ``sys.path``. +The instructions you've just read assume that: -An ``easy_install`` script will be installed in the normal location for -Python scripts on your platform. +* You are installling to Python's primary ``site-packages`` directory -(Note: the ``ez_setup.py`` script accepts the same `Command-Line Options`_ and -`Configuration Files`_ as ``easy_install`` itself, so you can use them to -control its behavior. However, you should avoid using a custom installation -directory or doing multi-version installs of the setuptools package, because -this may make it impossible for scripts installed with EasyInstall to access -it afterwards.) +* You have unrestricted internet access on the computer where you are + installing. + +If you are behind an NTLM-based firewall that prevents Python programs from +accessing the net directly, you may wish to first install and use the `APS +proxy server `_, which lets you get past such firewalls +in the same way that your web browser(s) do. This will let ``ez_setup.py`` +download the setuptools egg. +If you can't use APS, or don't have internet access at all, you will need to +first download the appropriate ``.egg`` file from the `setuptools PyPI page +`_ using a computer with internet +access. Place the egg in the same directory as ``ez_setup.py`` on the target +computer before running it. + +If you are installing to a custom location or do not have write access to +Python's primary ``site-packages`` directory, please also see the section below +on `Custom Installation Locations`_ for more detailed instructions. + + +Troubleshooting +~~~~~~~~~~~~~~~ + +If EasyInstall/setuptools appears to install correctly, and you can run the +``easy_install`` command but it fails with an ``ImportError``, the most likely +cause is that you installed to a location other than ``site-packages``, +without taking any of the steps described in the `Custom Installation +Locations`_ section below. Please see that section and follow the steps to +make sure that your custom location will work correctly. Then re-install. + +Similarly, if you can run ``easy_install``, and it appears to be installing +packages, but then you can't import them, the most likely issue is that you +installed EasyInstall correctly but are using it to install packages to a +non-standard location that hasn't been properly prepared. Again, see the +section on `Custom Installation Locations`_ for more details. -Windows Installation -~~~~~~~~~~~~~~~~~~~~ + +Windows Notes +~~~~~~~~~~~~~ On Windows, an ``easy_install.exe`` launcher will also be installed, so that you can just type ``easy_install`` as long as it's on your ``PATH``. If typing @@ -83,6 +110,7 @@ control where ``easy_install.exe`` will be installed. + Downloading and Installing a Package ------------------------------------ @@ -669,25 +697,11 @@ "Site" directories are directories where ``.pth`` files are processed, such as the main Python ``site-packages`` directory. By default, EasyInstall only knows about Python-defined "site" directories, not those that may be - added by an OS distribution or site administrator calling + added by an OS distribution or site administrator using call(s) to ``site.addsitedir()``. You should not normally need to use this option directly, as your system administrator should configure it in the - ``distutils.cfg`` file of the Python installation. For example, if the - administrator wants to make each user's ``~/lib/python2.3`` directory be a - "site" directory, he or she should create an ``altinstall.pth`` file in the - normal site-packages directory, containing this:: - - import os, site; site.addsitedir(os.path.expanduser('~/lib/python2.3')) - - and a ``distutils.cfg`` file inside the ``distutils`` package directory, - containing this:: - - [easy_install] - site_dirs = ~/lib/python23 - - This will ensure that EasyInstall knows about the additional "site" - directory, thereby allowing individual users to install their own - Python packages via EasyInstall. + ``distutils.cfg`` file of the Python installation. See the `Administrator + Installation`_ section below for details. ``--no-deps, -N`` (New in 0.6a6) Don't install any dependencies. This is intended as a convenience for @@ -715,43 +729,157 @@ override the setting on the command line as needed. -Non-Root Installation ---------------------- +.. _non-root installation: + +Custom Installation Locations +----------------------------- + +EasyInstall manages what packages are active using Python ``.pth`` files, which +are normally only usable in Python's main ``site-packages`` directory. On some +platforms (such as Mac OS X), there are additional ``site-packages`` +directories that you can use besides the main one, but usually there is only +one directory on the system where you can install packages without extra steps. + +There are many reasons, however, why you might want to install packages +somewhere other than the ``site-packages`` directory. For example, you might +not have write access to that directory. You may be working with unstable +versions of packages that you don't want to install system-wide. And so on. + +The following sections describe various approaches to custom installation; feel +free to choose which one best suits your system and needs. + +`Administrator Installation`_ + This approach is for when you have write access to ``site-packages`` (or + another directory where ``.pth`` files are processed), but don't want to + install packages there. This can also be used by a system administrator + to enable each user having their own private directories that EasyInstall + will use to install packages. + +`Mac OS X "User" Installation`_ + This approach produces a result similar to an administrator installation + that gives each user their own private package directory, but on Mac OS + the hard part has already been done for you. This is probably the best + approach for Mac OS X users. + +`Creating a "Virtual" Python`_ + This approach is for when you don't have "root" or access to write to the + ``site-packages`` directory, and would like to be able to set up one or + more "virtual python" executables for your projects. This approach + gives you the benefits of multiple Python installations, but without having + to actually install Python more than once and use up lots of disk space. + (Only the Python executable is copied; the libraries will be symlinked + from the systemwide Python.) + + If you don't already have any ``PYTHONPATH`` customization or + special distutils configuration, and you can't use either of the preceding + approaches, this is probably the best one for you. + +`"Traditional" PYTHONPATH-based Installation`_ + If you already have a custom ``PYTHONPATH``, and/or a custom distutils + configuration, and don't want to change any of your existing setup, you may + be interested in this approach. (If you're using a custom ``.pth`` file to + point to your custom installation location, however, you should use + `Administrator Installation`_ to enable ``.pth`` processing in the custom + location instead, as that is easier and more flexible than this approach.) + + This is the least robust and least flexible of the approaches, however, so + you should probably at least take a look at the others and consider whether + one of them might be an improvement over your current setup. + + +Administrator Installation +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you have root access to your machine, you can easily configure it to allow +each user to have their own directory where Python packages can be installed +and managed by EasyInstall. + +First, create an ``altinstall.pth`` file in Python's ``site-packages`` +directory, containing the following line (substituting the correct Python +version):: + + import os, site; site.addsitedir(os.path.expanduser('~/lib/python2.3')) + +This will automatically add each user's ``~/lib/python2.X`` directory to +``sys.path`` (if it exists), *and* it will process any ``.pth`` files in that +directory -- which is what makes it usable with EasyInstall. + +The next step is to create or modify ``distutils.cfg`` in the ``distutils`` +directory of your Python library. The correct directory will be something like +``/usr/lib/python2.X/distutils`` on most Posix systems and something like +``C:\\Python2X\Lib\distutils`` on Windows machines. Add the following lines +to the file, substituting the correct Python version if necessary:: + + [install] + install_lib = ~/lib/python2.3 + + # This next line is optional but often quite useful; it directs EasyInstall + # and the distutils to install scripts in the user's "bin" directory: + install_scripts = ~/bin + + [easy_install] + site_dirs = ~/lib/python2.3 -If you want to use EasyInstall on a computer where you do not have write access -to Python's main ``site-packages`` directory, you may need to set up an -alternate "home" location for Python, so that it uses a personal -``site-packages`` directory instead of the system-wide ``site-packages``. +This will configure the distutils and EasyInstall to install packages to the +user's home directory by default, and will tell EasyInstall that Python has +been configured to accept ``.pth`` files in that directory. + +Of course, you aren't limited to using a ``~/lib/python2.X`` directory with +this approach. You can substitute a specific systemwide directory if you like. +You can also edit ``~/.pydistutils.cfg`` (or ``~/pydistutils.cfg`` on Windows) +instead of changing the master ``distutils.cfg`` file. The true keys of this +approach are simply that: + +1. any custom installation directory must be added to ``sys.path`` using a + ``site.addsitedir()`` call from a working ``.pth`` file or + ``sitecustomize.py``. + +2. The active distutils configuration file(s) or ``easy_install`` command line + should include the custom directory in the ``--site-dirs`` option, so that + EasyInstall knows that ``.pth`` files will work in that location. (This is + because Python does not keep track of what directories are or aren't enabled + for ``.pth`` processing, in any way that EasyInstall can find out.) + +As long as both of these things have been done, your custom installation +location is good to go. + + +Mac OS X "User" Installation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you are on a Mac OS X machine, you should just use the -``~/Library/Python2.x/site-packages`` directory (replacing the ``x`` with the -appropriate number). Just make sure the directory exists, and use it as your -installation location for all packages (including EasyInstall itself). To -make the distutils install to this personal ``site-packages`` directory by -default, you should create a ``~/.pydistutils.cfg`` file with the following -contents:: +``~/Library/Python2.x/site-packages`` directory as your custom installation +location, because it is already configured to process ``.pth`` files, and +EasyInstall already knows this. + +Before installing EasyInstall/setuptools, just create a ``~/.pydistutils.cfg`` +file with the following contents (or add this to the existing contents):: [install] install_lib = ~/Library/Python$py_version_short/site-packages -This will tell the distutils (and EasyInstall) to always install packages in -the appropriate personal ``site-packages`` directory. (Note: do *not* replace +This will tell the distutils and EasyInstall to always install packages in +your personal ``site-packages`` directory. (Note: do *not* replace ``$py_version_short`` with an actual Python version in the configuration file! The distutils will substitute the correct value at runtime, so that the above -configuration file will work correctly no matter what Python version you use, +configuration file should work correctly no matter what Python version you use, now or in the future.) -If you are on a Linux, BSD, Cygwin, or other similar Unix-like operating -system, you have a couple of different options. You can create a "virtual" -Python installation, which uses its own library directories and some symlinks -to the site-wide Python. Or, you can use a "traditional" ``PYTHONPATH``-based -installation, which isn't as flexible, but which you may find more familiar, -especially if you already have a custom ``PYTHONPATH`` set up. +Once you have done this, you can follow the normal `installation instructions`_ +and use ``easy_install`` without any other special options or steps, unless +you also want to customize where scripts are installed. (In which case, you +can add an ``install_scripts`` line to the above to set the installation +location.) Creating a "Virtual" Python ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If you are on a Linux, BSD, Cygwin, or other similar Unix-like operating +system, but don't have root access, you can create your own "virtual" +Python installation, which uses its own library directories and some symlinks +to the site-wide Python. + In the simplest case, your virtual Python installation will live under the ``~/lib/python2.x``, ``~/include/python2.x``, and ``~/bin`` directories. Just download `virtual-python.py`_ and run it using the site-wide Python. If you @@ -772,54 +900,14 @@ Note that if you were previously setting a ``PYTHONPATH`` and/or had other special configuration options in your ``~/.pydistutils.cfg``, you may need to -remove these settings *before* running ``virtual-python.py``. You should -also make sure that the ``~/bin`` directory (or whatever directory you choose) -is on your ``PATH``, because that is where EasyInstall will install new Python -scripts. - -If you'd prefer to do the installation steps by hand, or just want to know what -the script will do, here are the steps. (If you don't care how it works, you -can just skip the rest of this section.) - -First, you will need to know your Python version's ``sys.prefix`` and -``sys.exec_prefix``, which you can find out by running:: - - python -c "import sys; print sys.prefix; print sys.exec_prefix" - -(Replace "python" with the right path or version for your platform.) - -Assuming your ``sys.prefix`` is ``/usr/local``, and you are working with -Python 2.4, you need to then perform the following steps (possibly making -adjustments for the tools available on your platform). First, you need -to set up the local library directories, by symlinking to the system Python's -libraries:: - - mkdir -p ~/lib/python2.4 - ln -s /usr/local/lib/python2.4/* ~/lib/python2.4/ - rm ~/lib/python2.4/site-packages - mkdir ~/lib/python2.4/site-packages - ln -s /usr/local/lib/python2.4/site-packages/* ~/lib/python2.4/site-packages - mkdir -p ~/include/python2.4 - ln -s /usr/local/include/python2.4/* ~/include/python2.4 - -If your ``sys.exec_prefix`` was different from your ``sys.prefix``, you will -also need to do this:: - - ln -s /execprefix/lib/python2.4/* ~/lib/python2.4/ - -replacing ``execprefix`` in the above with the value of ``sys.exec_prefix``. - -Finally, you will also need a private ``python`` executable, e.g.:: - - mkdir -p ~/bin - ln /usr/local/bin/python2.4 ~/bin/python - -Note that if hardlinking as shown doesn't work (e.g. because the system Python -is on a different filesystem), you should use ``copy -p`` instead of ``ln``. -Do NOT use a symlink! The Python binary must be copied or hardlinked, -otherwise it will use the system ``site-packages`` directory and not yours. - -You can now proceed with the standard `installation instructions`_. +remove these settings *before* running ``virtual-python.py``. This is because +your new Python executable will not need *any* custom configuration for the +distutils or EasyInstall; everything will go to the correct ``~/lib`` and +``~/bin`` directories automatically. + +You should, however, also make sure that the ``bin`` subdirectory of your +installation prefix (e.g. ``~/bin``) is on your ``PATH``, because that is where +EasyInstall and the distutils will install new Python scripts. "Traditional" ``PYTHONPATH``-based Installation @@ -827,17 +915,16 @@ This installation method is not as robust or as flexible as `creating a "virtual" python`_ installation, as it uses various tricks to fool Python into -processing ``.pth`` files where it normally wouldn't. We suggest you try the -virtual Python approach first, as we are providing this method mainly for -people who just can't get past their unshakeable belief that creating a virtual -python is somehow "Not Right", or that putting stuff on ``PYTHONPATH`` "Should -Just Work, Darnit." So, if you're not one of those people, you don't -need these instructions. :-) +processing ``.pth`` files where it normally wouldn't. We suggest you at least +consider using one of the other approaches, as they will generally result in +a cleaner, more usable Python configuration. However, if for some reason you +can't or won't use one of the other approaches, here's how to do it. Assuming that you want to install packages in a directory called ``~/py-lib``, and scripts in ``~/bin``, here's what you need to do: -First, edit ``~/.pydistutils.cfg`` to include these settings:: +First, edit ``~/.pydistutils.cfg`` to include these settings, if you don't +already have them:: [install] install_lib = ~/py-lib @@ -851,11 +938,13 @@ careful note of the full pathname of the ``.egg`` file that gets installed, so that you can add it to your ``PYTHONPATH``, along with ``~/py_lib``. -You *must* add the setuptools egg file to your ``PYTHONPATH`` manually, or it -will not work, and neither will any other packages you install with -EasyInstall. You will not, however, have to manually add any other -packages to the ``PYTHONPATH``; EasyInstall will take care of them for you, as -long as the setuptools egg is explicitly listed in ``PYTHONPATH``. +You *must* add the setuptools egg file *and* ``~/py_lib`` to your +``PYTHONPATH`` environment variable manually, or it will not work, and neither +will any other packages you install with EasyInstall. You will not, however, +have to manually add any other packages to the ``PYTHONPATH``; EasyInstall will +take care of them for you by automatically editing +``~/py-lib/easy-install.pth``, as long as the setuptools egg is explicitly +listed in ``PYTHONPATH``. Release Notes/Change History Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Fri Dec 16 19:46:56 2005 @@ -69,6 +69,8 @@ .. contents:: **Table of Contents** +.. _ez_setup.py: `bootstrap module`_ + ----------------- Developer's Guide @@ -78,51 +80,23 @@ Installing ``setuptools`` ========================= -If you are behind an NTLM-based firewall that prevents Python programs from -accessing the net directly, you may wish to first install and use the `APS -proxy server `_, which lets you get past such firewalls -in the same way that your web browser(s) do. - -If you do not have write access to your computer's ``site-packages`` directory, -please also see the EasyInstall documentation on `Non-Root Installation`_ for -more detailed instructions on pre-configuring your system for the best -usability with setuptools and EasyInstall, then return here for the remaining -steps. - -.. _Non-Root Installation: http://peak.telecommunity.com/DevCenter/EasyInstall#non-root-installation - -To install setuptools, first download `ez_setup.py`_ and run it; this will -automatically download and install the appropriate egg for your Python version. -(You will need at least Python 2.3.5, or if you are on a 64-bit platform, -Python 2.4.) +Please follow the `EasyInstall Installation Instructions`_ to install the +current stable version of setuptools. In particular, be sure to read the +section on `Custom Installation Locations`_ if you are installing anywhere +other than Python's ``site-packages`` directory. -.. _ez_setup.py: `bootstrap module`_ +.. _EasyInstall Installation Instructions: http://peak.telecommunity.com/DevCenter/EasyInstall#installation-instructions -You may receive a message telling you about an obsolete version of -setuptools being present; if so, you must be sure to delete it entirely, along -with the old ``pkg_resources`` module if it's present on ``sys.path``. +.. _Custom Installation Locations: http://peak.telecommunity.com/DevCenter/EasyInstall#custom-installation-locations -To get the in-development version of setuptools, first install a stable version -using the instructions above. Then run:: +If you want the current in-development version of setuptools, you should first +install a stable version, and then run:: ez_setup.py setuptools==dev This will download and install the latest development (i.e. unstable) version of setuptools from the Python Subversion sandbox. -(Note that ``setuptools`` *must* be installed as an egg directory; it will not -operate correctly otherwise. If you are unable to install to a valid -``site-packages`` directory (e.g. a "non-root install" that doesn't conform -to the `Non-Root Installation`_ procedure), you will therefore need to manually -add the setuptools egg to your ``PYTHONPATH``. You won't need to do this for -every egg you install, because the ``pkg_resources`` module can automatically -find eggs and add them to ``sys.path`` at runtime. It's just that the -``setuptools`` egg contains the ``pkg_resources`` runtime, and therefore has to -be manually bootstrapped if you can't install it to a valid ``site-packages`` -directory. However, if you are installing as root or you followed the -`Non-Root Installation`_ procedure, you shouldn't have to worry about any of -this.) - Basic Use ========= @@ -1018,6 +992,10 @@ distributions, and then upload them both to PyPI, where they'll be easily found by other projects that depend on them. +(By the way, if you need to distribute a specific version of ``setuptools``, +you can specify the exact version and base download URL as parameters to the +``use_setuptools()`` function. See the function's docstring for details.) + Managing Multiple Projects -------------------------- From python-checkins at python.org Fri Dec 16 20:21:05 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Fri, 16 Dec 2005 20:21:05 +0100 (CET) Subject: [Python-checkins] commit of r41710 - python/trunk/Doc/lib/libtraceback.tex Message-ID: <20051216192105.D17F01E4010@bag.python.org> Author: reinhold.birkenfeld Date: Fri Dec 16 20:21:05 2005 New Revision: 41710 Modified: python/trunk/Doc/lib/libtraceback.tex Log: Patch #1376914: traceback.format_exc() has no "file" argument Modified: python/trunk/Doc/lib/libtraceback.tex ============================================================================== --- python/trunk/Doc/lib/libtraceback.tex (original) +++ python/trunk/Doc/lib/libtraceback.tex Fri Dec 16 20:21:05 2005 @@ -48,7 +48,7 @@ variables.) \end{funcdesc} -\begin{funcdesc}{format_exc}{\optional{limit\optional{, file}}} +\begin{funcdesc}{format_exc}{\optional{limit}} This is like \code{print_exc(\var{limit})} but returns a string instead of printing to a file. \versionadded{2.4} From python-checkins at python.org Fri Dec 16 20:21:33 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Fri, 16 Dec 2005 20:21:33 +0100 (CET) Subject: [Python-checkins] commit of r41711 - python/branches/release24-maint/Doc/lib/libtraceback.tex Message-ID: <20051216192133.04D7F1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Fri Dec 16 20:21:32 2005 New Revision: 41711 Modified: python/branches/release24-maint/Doc/lib/libtraceback.tex Log: Patch #1376914: traceback.format_exc() has no "file" argument. Modified: python/branches/release24-maint/Doc/lib/libtraceback.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libtraceback.tex (original) +++ python/branches/release24-maint/Doc/lib/libtraceback.tex Fri Dec 16 20:21:32 2005 @@ -48,7 +48,7 @@ variables.) \end{funcdesc} -\begin{funcdesc}{format_exc}{\optional{limit\optional{, file}}} +\begin{funcdesc}{format_exc}{\optional{limit}} This is like \code{print_exc(\var{limit})} but returns a string instead of printing to a file. \versionadded{2.4} From python-checkins at python.org Fri Dec 16 20:23:33 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Fri, 16 Dec 2005 20:23:33 +0100 (CET) Subject: [Python-checkins] commit of r41712 - python/trunk/Doc/lib/libpyexpat.tex Message-ID: <20051216192333.C6C211E4002@bag.python.org> Author: reinhold.birkenfeld Date: Fri Dec 16 20:23:33 2005 New Revision: 41712 Modified: python/trunk/Doc/lib/libpyexpat.tex Log: Patch #1377848: typo in pyexpat docs Modified: python/trunk/Doc/lib/libpyexpat.tex ============================================================================== --- python/trunk/Doc/lib/libpyexpat.tex (original) +++ python/trunk/Doc/lib/libpyexpat.tex Fri Dec 16 20:23:33 2005 @@ -417,7 +417,7 @@ \begin{methoddesc}[xmlparser]{StartCdataSectionHandler}{} Called at the start of a CDATA section. This and -\member{StartCdataSectionHandler} are needed to be able to identify +\member{EndCdataSectionHandler} are needed to be able to identify the syntactical start and end for CDATA sections. \end{methoddesc} From python-checkins at python.org Fri Dec 16 20:23:45 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Fri, 16 Dec 2005 20:23:45 +0100 (CET) Subject: [Python-checkins] commit of r41713 - python/branches/release24-maint/Doc/lib/libpyexpat.tex Message-ID: <20051216192345.CA2E11E4002@bag.python.org> Author: reinhold.birkenfeld Date: Fri Dec 16 20:23:45 2005 New Revision: 41713 Modified: python/branches/release24-maint/Doc/lib/libpyexpat.tex Log: Patch #1377848: typo in pyexpat docs Modified: python/branches/release24-maint/Doc/lib/libpyexpat.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libpyexpat.tex (original) +++ python/branches/release24-maint/Doc/lib/libpyexpat.tex Fri Dec 16 20:23:45 2005 @@ -417,7 +417,7 @@ \begin{methoddesc}[xmlparser]{StartCdataSectionHandler}{} Called at the start of a CDATA section. This and -\member{StartCdataSectionHandler} are needed to be able to identify +\member{EndCdataSectionHandler} are needed to be able to identify the syntactical start and end for CDATA sections. \end{methoddesc} From python-checkins at python.org Fri Dec 16 20:36:09 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Fri, 16 Dec 2005 20:36:09 +0100 (CET) Subject: [Python-checkins] commit of r41714 - python/trunk/Lib/SimpleHTTPServer.py Message-ID: <20051216193609.52AE31E4007@bag.python.org> Author: reinhold.birkenfeld Date: Fri Dec 16 20:36:08 2005 New Revision: 41714 Modified: python/trunk/Lib/SimpleHTTPServer.py Log: Patch #1360443: Make SimpleHTTPServer display unencoded directory names. Modified: python/trunk/Lib/SimpleHTTPServer.py ============================================================================== --- python/trunk/Lib/SimpleHTTPServer.py (original) +++ python/trunk/Lib/SimpleHTTPServer.py Fri Dec 16 20:36:08 2005 @@ -103,8 +103,9 @@ return None list.sort(key=lambda a: a.lower()) f = StringIO() - f.write("Directory listing for %s\n" % self.path) - f.write("

Directory listing for %s

\n" % self.path) + displaypath = cgi.escape(urllib.unquote(self.path)) + f.write("Directory listing for %s\n" % displaypath) + f.write("

Directory listing for %s

\n" % displaypath) f.write("
\n
    \n") for name in list: fullname = os.path.join(path, name) From python-checkins at python.org Fri Dec 16 20:36:24 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Fri, 16 Dec 2005 20:36:24 +0100 (CET) Subject: [Python-checkins] commit of r41715 - python/branches/release24-maint/Lib/SimpleHTTPServer.py Message-ID: <20051216193624.D9DCD1E4007@bag.python.org> Author: reinhold.birkenfeld Date: Fri Dec 16 20:36:24 2005 New Revision: 41715 Modified: python/branches/release24-maint/Lib/SimpleHTTPServer.py Log: Patch #1360443: Make SimpleHTTPServer display unencoded directory names. Modified: python/branches/release24-maint/Lib/SimpleHTTPServer.py ============================================================================== --- python/branches/release24-maint/Lib/SimpleHTTPServer.py (original) +++ python/branches/release24-maint/Lib/SimpleHTTPServer.py Fri Dec 16 20:36:24 2005 @@ -99,8 +99,9 @@ return None list.sort(key=lambda a: a.lower()) f = StringIO() - f.write("Directory listing for %s\n" % self.path) - f.write("

    Directory listing for %s

    \n" % self.path) + displaypath = cgi.escape(urllib.unquote(self.path)) + f.write("Directory listing for %s\n" % displaypath) + f.write("

    Directory listing for %s

    \n" % displaypath) f.write("
    \n
      \n") for name in list: fullname = os.path.join(path, name) From python-checkins at python.org Fri Dec 16 20:37:21 2005 From: python-checkins at python.org (phillip.eby) Date: Fri, 16 Dec 2005 20:37:21 +0100 (CET) Subject: [Python-checkins] commit of r41716 - sandbox/trunk/setuptools/setuptools/command/install.py Message-ID: <20051216193721.A4BEB1E4007@bag.python.org> Author: phillip.eby Date: Fri Dec 16 20:37:21 2005 New Revision: 41716 Modified: sandbox/trunk/setuptools/setuptools/command/install.py Log: Fix bdist_dumb support to use .egg-info instead of .egg format. Modified: sandbox/trunk/setuptools/setuptools/command/install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install.py Fri Dec 16 20:37:21 2005 @@ -37,21 +37,51 @@ " packages" ) + + def handle_extra_path(self): # We always ignore extra_path, because we install as .egg or .egg-info self.path_file = None self.extra_dirs = '' def run(self): - if (self.old_and_unmanageable or self.single_version_externally_managed - or sys._getframe(1).f_globals.get('__name__','') != 'distutils.dist' - ): - # Either we were asked for the old behavior, or we're not being - # run from the command line. This is a bit kludgy, because a - # command might use dist.run_command() to run 'install', but - # bdist_dumb and bdist_wininst both call run() directly right now. + # Explicit request for old-style install? Just do it + if self.old_and_unmanageable or self.single_version_externally_managed: return _install.run(self) + # Attempt to detect whether we were called from setup() or by another + # command. If we were called by setup(), our caller will be the + # 'run_command' method in 'distutils.dist', and *its* caller will be + # the 'run_commands' method. If we were called any other way, our + # immediate caller *might* be 'run_command', but it won't have been + # called by 'run_commands'. This is slightly kludgy, but seems to + # work. + # + caller = sys._getframe(2) + caller_module = caller.f_globals.get('__name__','') + caller_name = caller.f_code.co_name + + if caller_module != 'distutils.dist' or caller_name!='run_commands': + # We weren't called from the command line or setup(), so we + # should run in backward-compatibility mode to support bdist_* + # commands. + _install.run(self) + else: + self.do_egg_install() + + + + + + + + + + + + + def do_egg_install(self): + from setuptools.command.easy_install import easy_install cmd = easy_install( @@ -83,3 +113,11 @@ + + + + + + + + From python-checkins at python.org Fri Dec 16 21:15:02 2005 From: python-checkins at python.org (phillip.eby) Date: Fri, 16 Dec 2005 21:15:02 +0100 (CET) Subject: [Python-checkins] commit of r41717 - sandbox/trunk/setuptools/setuptools.txt Message-ID: <20051216201502.681111E4002@bag.python.org> Author: phillip.eby Date: Fri Dec 16 21:15:01 2005 New Revision: 41717 Modified: sandbox/trunk/setuptools/setuptools.txt Log: Added "What Your Users Should Know" section, telling package developers what information they should give to their users about dependencies, network access, system packaging, and other common questions or concerns. Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Fri Dec 16 21:15:01 2005 @@ -960,10 +960,9 @@ command; see the section on the `develop`_ command below for more details. -Distributing a ``setuptools``-based package +Distributing a ``setuptools``-based project =========================================== - Using ``setuptools``... Without bundling it! --------------------------------------------- @@ -997,6 +996,88 @@ ``use_setuptools()`` function. See the function's docstring for details.) +What Your Users Should Know +--------------------------- + +In general, a setuptools-based project looks just like any distutils-based +project -- as long as your users have an internet connection and are installing +to ``site-packages``, that is. But for some users, these conditions don't +apply, and they may become frustrated if this is their first encounter with +a setuptools-based project. To keep these users happy, you should review the +following topics in your project's installation instructions, if they are +relevant to your project and your target audience isn't already familiar with +setuptools and ``easy_install``. + +Network Access + If your project is using ``ez_setup``, you should inform users of the need + to either have network access, or to preinstall the correct version of + setuptools using the `EasyInstall installation instructions`_. Those + instructions also have tips for dealing with firewalls as well as how to + manually download and install setuptools. + +Custom Installation Locations + You should inform your users that if they are installing your project to + somewhere other than the main ``site-packages`` directory, they should + first install setuptools using the instructions for `Custom Installation + Locations`_, before installing your project. + +Your Project's Dependencies + If your project depends on other projects that may need to be downloaded + from PyPI or elsewhere, you should list them in your installation + instructions, or tell users how to find out what they are. While most + users will not need this information, any users who don't have unrestricted + internet access may have to find, download, and install the other projects + manually. (Note, however, that they must still install those projects + using ``easy_install``, or your project will not know they are installed, + and your setup script will try to download them again.) + + If you want to be especially friendly to users with limited network access, + you may wish to build eggs for your project and its dependencies, making + them all available for download from your site, or at least create a page + with links to all of the needed eggs. In this way, users with limited + network access can manually download all the eggs to a single directory, + then use the ``-f`` option of ``easy_install`` to specify the directory + to find eggs in. Users who have full network access can just use ``-f`` + with the URL of your download page, and ``easy_install`` will find all the + needed eggs using your links directly. This is also useful when your + target audience isn't able to compile packages (e.g. most Windows users) + and your package or some of its dependencies include C code. + +Subversion or CVS Users and Co-Developers + Users and co-developers who are tracking your in-development code using + CVS, Subversion, or some other revision control system should probably read + this manual's sections regarding such development. Alternately, you may + wish to create a quick-reference guide containing the tips from this manual + that apply to your particular situation. For example, if you recommend + that people use ``setup.py develop`` when tracking your in-development + code, you should let them know that this needs to be run after every update + or commit. + + Similarly, if you remove modules or data files from your project, you + should remind them to run ``setup.py clean --all`` and delete any obsolete + ``.pyc`` or ``.pyo``. (This tip applies to the distutils in general, not + just setuptools, but not everybody knows about them; be kind to your users + by spelling out your project's best practices rather than leaving them + guessing.) + +Creating System Packages + Some users want to manage all Python packages using a single package + manager, and sometimes that package manager isn't ``easy_install``! + Setuptools currently supports ``bdist_rpm``, ``bdist_wininst``, and + ``bdist_dumb`` formats for system packaging. If a user has a locally- + installed "bdist" packaging tool that internally uses the distutils + ``install`` command, it should be able to work with ``setuptools``. If + it doesn't, please report the problem via the `mailing list`_ so that + either the "bdist" tool in question or setuptools can be modified to + resolve the issue. + + Packaging tools that build binary distributions by running ``setup.py + install`` on the command line or as a subprocess can be made to work with + setuptools by using the ``--single-version-externally-managed`` option, + combined with the standard ``--root`` or ``--record`` options. + See the `install command`_ documentation below for more details. + + Managing Multiple Projects -------------------------- @@ -1773,6 +1854,8 @@ no ``package_dir`` set, this option defaults to the current directory. +.. _install command: + ``install`` - Run ``easy_install`` or old-style installation ============================================================ From python-checkins at python.org Fri Dec 16 21:49:12 2005 From: python-checkins at python.org (phillip.eby) Date: Fri, 16 Dec 2005 21:49:12 +0100 (CET) Subject: [Python-checkins] commit of r41718 - sandbox/trunk/setuptools/setuptools.txt Message-ID: <20051216204912.89EC01E4002@bag.python.org> Author: phillip.eby Date: Fri Dec 16 21:49:10 2005 New Revision: 41718 Modified: sandbox/trunk/setuptools/setuptools.txt Log: Add notes about bdist_msi, bdist_nsi, and bdist_deb formats' compatibility with setuptools. Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Fri Dec 16 21:49:10 2005 @@ -1066,16 +1066,24 @@ Setuptools currently supports ``bdist_rpm``, ``bdist_wininst``, and ``bdist_dumb`` formats for system packaging. If a user has a locally- installed "bdist" packaging tool that internally uses the distutils - ``install`` command, it should be able to work with ``setuptools``. If - it doesn't, please report the problem via the `mailing list`_ so that + ``install`` command, it should be able to work with ``setuptools``. Some + examples of "bdist" formats that this should work with include the + ``bdist_nsi`` and ``bdist_msi`` formats for Windows. + + However, packaging tools that build binary distributions by running + ``setup.py install`` on the command line or as a subprocess will require + modification to work with setuptools. They should use the + ``--single-version-externally-managed`` option to the ``install`` command, + combined with the standard ``--root`` or ``--record`` options. + See the `install command`_ documentation below for more details. The + ``bdist_deb`` command is an example of a command that currently requires + this kind of patching to work with setuptools. + + If you or your users have a problem building a usable system package for + your project, please report the problem via the `mailing list`_ so that either the "bdist" tool in question or setuptools can be modified to resolve the issue. - Packaging tools that build binary distributions by running ``setup.py - install`` on the command line or as a subprocess can be made to work with - setuptools by using the ``--single-version-externally-managed`` option, - combined with the standard ``--root`` or ``--record`` options. - See the `install command`_ documentation below for more details. Managing Multiple Projects From python-checkins at python.org Fri Dec 16 22:28:05 2005 From: python-checkins at python.org (guido.van.rossum) Date: Fri, 16 Dec 2005 22:28:05 +0100 (CET) Subject: [Python-checkins] commit of r41719 - peps/trunk/pep-0341.txt Message-ID: <20051216212805.166E61E4002@bag.python.org> Author: guido.van.rossum Date: Fri Dec 16 22:28:04 2005 New Revision: 41719 Modified: peps/trunk/pep-0341.txt Log: Mark PEP 341 as accepted (I was +1 in May 2005). Modified: peps/trunk/pep-0341.txt ============================================================================== --- peps/trunk/pep-0341.txt (original) +++ peps/trunk/pep-0341.txt Fri Dec 16 22:28:04 2005 @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Reinhold Birkenfeld -Status: Draft +Status: Accepted Type: Standards Track Content-Type: text/plain Created: 04-May-2005 From python-checkins at python.org Fri Dec 16 22:30:37 2005 From: python-checkins at python.org (guido.van.rossum) Date: Fri, 16 Dec 2005 22:30:37 +0100 (CET) Subject: [Python-checkins] commit of r41720 - peps/trunk/pep-0000.txt Message-ID: <20051216213037.773AE1E4002@bag.python.org> Author: guido.van.rossum Date: Fri Dec 16 22:30:36 2005 New Revision: 41720 Modified: peps/trunk/pep-0000.txt Log: Um, mark PEP 341 as accepted (but not yet implemented) here too. Modified: peps/trunk/pep-0000.txt ============================================================================== --- peps/trunk/pep-0000.txt (original) +++ peps/trunk/pep-0000.txt Fri Dec 16 22:30:36 2005 @@ -66,6 +66,7 @@ SA 308 Conditional Expressions GvR, Hettinger SA 328 Imports: Multi-Line and Absolute/Relative Aahz + SA 341 Unifying try-except and try-finally Birkenfeld SA 342 Coroutines via Enhanced Generators GvR, Eby Open PEPs (under consideration) @@ -100,7 +101,6 @@ S 335 Overloadable Boolean Operators Ewing S 337 Logging Usage in the Standard Library Dubner S 338 Executing modules inside packages with '-m' Coghlan - S 341 Unifying try-except and try-finally Birkenfeld S 343 The "with" Statement GvR, Coghlan S 344 Exception Chaining and Embedded Tracebacks Yee S 345 Metadata for Python Software Packages 1.2 Jones @@ -388,7 +388,7 @@ S 338 Executing modules inside packages with '-m' Coghlan I 339 How to Change CPython's Bytecode Cannon SR 340 Anonymous Block Statements GvR - S 341 Unifying try-except and try-finally Birkenfeld + SA 341 Unifying try-except and try-finally Birkenfeld SA 342 Coroutines via Enhanced Generators GvR, Eby S 343 Anonymous Block Redux and Generator Enhancements GvR S 344 Exception Chaining and Embedded Tracebacks Yee From python-checkins at python.org Fri Dec 16 23:02:44 2005 From: python-checkins at python.org (fredrik.lundh) Date: Fri, 16 Dec 2005 23:02:44 +0100 (CET) Subject: [Python-checkins] commit of r41721 - in external/celementtree-1.0.5-20051216: CHANGES PKG-INFO README cElementTree.c expat expat/ascii.h expat/asciitab.h expat/expat.h expat/expat_external.h expat/iasciitab.h expat/internal.h expat/latin1tab.h expat/macconfig.h expat/nametab.h expat/utf8tab.h expat/winconfig.h expat/xmlparse.c expat/xmlrole.c expat/xmlrole.h expat/xmltok.c expat/xmltok.h expat/xmltok_impl.c expat/xmltok_impl.h expat/xmltok_ns.c samples samples/simple-ns.xml samples/simple.xml selftest.py setup.py Message-ID: <20051216220244.851761E4002@bag.python.org> Author: fredrik.lundh Date: Fri Dec 16 23:02:39 2005 New Revision: 41721 Added: external/celementtree-1.0.5-20051216/ external/celementtree-1.0.5-20051216/CHANGES external/celementtree-1.0.5-20051216/PKG-INFO external/celementtree-1.0.5-20051216/README external/celementtree-1.0.5-20051216/cElementTree.c external/celementtree-1.0.5-20051216/expat/ external/celementtree-1.0.5-20051216/expat/ascii.h external/celementtree-1.0.5-20051216/expat/asciitab.h external/celementtree-1.0.5-20051216/expat/expat.h external/celementtree-1.0.5-20051216/expat/expat_external.h external/celementtree-1.0.5-20051216/expat/iasciitab.h external/celementtree-1.0.5-20051216/expat/internal.h external/celementtree-1.0.5-20051216/expat/latin1tab.h external/celementtree-1.0.5-20051216/expat/macconfig.h external/celementtree-1.0.5-20051216/expat/nametab.h external/celementtree-1.0.5-20051216/expat/utf8tab.h external/celementtree-1.0.5-20051216/expat/winconfig.h external/celementtree-1.0.5-20051216/expat/xmlparse.c external/celementtree-1.0.5-20051216/expat/xmlrole.c external/celementtree-1.0.5-20051216/expat/xmlrole.h external/celementtree-1.0.5-20051216/expat/xmltok.c external/celementtree-1.0.5-20051216/expat/xmltok.h external/celementtree-1.0.5-20051216/expat/xmltok_impl.c external/celementtree-1.0.5-20051216/expat/xmltok_impl.h external/celementtree-1.0.5-20051216/expat/xmltok_ns.c external/celementtree-1.0.5-20051216/samples/ external/celementtree-1.0.5-20051216/samples/simple-ns.xml external/celementtree-1.0.5-20051216/samples/simple.xml external/celementtree-1.0.5-20051216/selftest.py external/celementtree-1.0.5-20051216/setup.py Log: added cElementTree 1.0.5 to externals Added: external/celementtree-1.0.5-20051216/CHANGES ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/CHANGES Fri Dec 16 23:02:39 2005 @@ -0,0 +1,128 @@ +$Id: /work/modules/celementtree/CHANGES 1128 2005-12-16T21:57:13.668520Z Fredrik $ + +(1.0.5 released) + ++ Added support for non-standard encodings. If an unknown encoding + is reported by expat, cElementTree uses Python's Unicode system to + generate a decoding table. + +(1.0.4 released) + ++ Added support for linking against the "pyexpat" library in Python + 2.5. Define USE_PYEXPAT_CAPI to enable this feature. + ++ Minor optimizations. + +(1.0.3 released) + ++ Use runtime test for figure out if copy workaround is needed. + ++ Don't crash in 'parse' if the file object's 'read' method raises + an unexpected exception (reported by Martin Pool). + ++ Added comment and processing instruction support to the XMLParser + type. The parser now calls 'comment' and 'pi' methods on the target + object, if available. + ++ Make 'iterparse' available under Python 2.1 (requires ElementTree + 1.2.5 or newer). + ++ Report unknown events passed to 'iterparse', rather than ignoring + them. (Under 2.1, this only works if ElementTree's iterparse does + this) + ++ Added 'Comment' and 'PI'/'ProcessingInstruction' output helpers. + +(1.0.2 released) + ++ Let Expat use Python's memory allocator. + ++ Added missing 'iselement' function (reported by Ken Rimey). + ++ Fixed attribute dictionary aliasing bug in 'makeelement' method + (reported by Ken Rimey). + +(1.0.1 released) + ++ Added missing 'remove' method (based on code by Michael Droettboom). + +(1.0 released) + ++ Added a VERSION attribute to the cElementTree module (also available + as __version__). + +(0.9.8 released) + ++ Changed the 'iterparse' interface slightly. The context object + is no longer included in the sequence, and by default, the parser + only returns "end" events (for completed elements): + + for event, elem in iterparse(source): + ... + + To get other events, use the "events" option to pass in a tuple + containing the events you want: + + for event, elem in iterparse(source, events=(...)): + ... + + The event tuple can contain one or more of: + + "start" + generated for start tags, after the element has been created + (but before the current element has been fully populated) + "end" + generated for end tags, after all element children has been + created. + "start-ns" + generated when a new namespace scope is opened. for this event, + the elem value is a (prefix, url) tuple. + "end-ns" + generated when the current namespace scope is closed. elem + is None. + + Events arrive asynchronously; the tree is usually more complete + than the events indicate, but this is nothing you can rely on. + + The iterable itself contains context information. In the current + release, the only public context attribute is "root", which is set + to the root element when parsing is finished. To access the con- + text, assign the iterable to a variable before looping over it: + + context = iterparse(source) + for event, elem in context: + ... + root = context.root + +(0.9.3 released) + ++ Added 'iterparse' function. This is similar to 'parse', but returns + a stream of events while it builds the tree. Usage: + + for context, action, elem in iterparse(source): + ... + + - The context object is a dummy object in the current release. The + action object is either "start" (for start tags) or "end" (for end + tags). The elem object is the current element; for "start" events, + the element itself has been created (including attributes), but its + contents may not be complete; for "end" events, all child elements + has been processed as well. You can use "start" tags to count + elements, check attributes, and check if certain tags are present + in a tree. For all other purposes, use "end" handlers instead. + + - For incremental parsing, call 'elem.clear()' in the "end" handler, + when you're done processing a given element. + + - When the loop finishes, the last elem object will be the tree's + root note. You can terminate the loop at any time (but doing that + will of course leave the tree in an unknown, unfinished state). + ++ Fixed getchildren crash. Note that getchildren is deprecated; use + 'elem' or 'list(elem)' instead of 'elem.getchildren()' (elements are + sequences; only use 'list(elem)' if you need a real list object). + ++ Removed the addobserver/removeobserver API from the TreeBuilder class. + Use 'iterparse' instead. + +(0.9.2 released) Added: external/celementtree-1.0.5-20051216/PKG-INFO ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/PKG-INFO Fri Dec 16 23:02:39 2005 @@ -0,0 +1,14 @@ +Metadata-Version: 1.0 +Name: cElementTree +Version: 1.0.5-20051216 +Summary: A fast C implementation of the ElementTree API. +Home-page: http://www.effbot.org/zone/celementtree.htm +Author: Fredrik Lundh +Author-email: fredrik at pythonware.com +License: Python (MIT style) +Download-URL: http://effbot.org/downloads#celementtree +Description: A fast C implementation of the ElementTree API. +Platform: Python 2.1 and later. +Classifier: Development Status :: 5 - Production/Stable +Classifier: Operating System :: OS Independent +Classifier: Topic :: Text Processing :: Markup :: XML Added: external/celementtree-1.0.5-20051216/README ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/README Fri Dec 16 23:02:39 2005 @@ -0,0 +1,156 @@ +ElementTree +$Id: /work/modules/celementtree/README 1128 2005-12-16T21:57:13.668520Z Fredrik $ + +Release 1.0.5 (December 16, 2005) + +==================================================================== +The cElementTree module, release 1.0.5 +==================================================================== + +-------------------------------------------------------------------- +Introduction + +The cElementTree module is a C implementation of the ElementTree API. +On typical documents, it's 15-20 times faster than the Python version +of ElementTree, and uses 2-5 times less memory. + +Here are some benchmark results, using a number of popular XML tool- +kits to parse a 3405k source file from disk to memory, on my develop- +ment machine: + + library memory time + ------------------------------------------------------------ + minidom (python 2.1) 80000k 6.3s + minidom (python 2.4) 53000k 1.4s + ElementTree 1.3 14500k 1.1s + cDomlette 20500k 0.54s + pyRXPU 10850k 0.175s + libxml2 16000k 0.098s + cElementTree 1.0 4900k 0.047s + ------------------------------------------------------------ + readlines (read as utf-8) 8850k 0.093s + readlines (read as ascii) 5050k 0.032s + ------------------------------------------------------------ + +For more information on this module, see: + + http://effbot.org/zone/celementtree.htm + +and + + http://effbot.org/zone/element-index.htm + +For detailed information about changes/fixes in this release, see the +CHANGES document. + +The current version is designed to work with Python 2.1 and newer, +with the exception of the 'iterparse' mechanism, which only works +under Python 2.2 and later. Earlier Python versions are not supported +(let me know if you need support for 2.0 or 1.5.2). For best per- +formance, use Python 2.4 or later. + +Enjoy /F + +fredrik at pythonware.com +http://www.pythonware.com + +-------------------------------------------------------------------- +Installation + +The cElementTree module is shipped as a distutils package. To install +the library, unpack the distribution archive, and issue the following +command: + + $ python setup.py install + +If you're using Windows, you can usually get prebuilt installers from +the effbot.org downloads site: + + http://effbot.org/downloads#celementtree + +The current version depends on certain support functions and classes +from the ElementTree and ElementPath modules, so you must install the +standard elementtree package before you can use this library. You can +get the elementtree distribution from: + + http://effbot.org/downloads#elementtree + +-------------------------------------------------------------------- +Usage + +The cElementTree module is designed to replace the ElementTree module +from the standard elementtree package. In theory, you should be able +to simply change: + + from elementtree import ElementTree + +to + + import cElementTree as ElementTree + +in existing code, and run your programs without any problems (note +that cElementTree replaces the elementtree.ElementTree module, not the +elementtree package). Some ElementTree 1.2 features may not be fully +supported by this release. (Let me know if you find that something +you rely on doesn't work as expected.) + +For more information on the elementtree package, see: + + http://effbot.org/zone/element.htm + +-------------------------------------------------------------------- +ElementTree Software License + +The ElementTree package and the cElementTree accelerator are + +Copyright (c) 1999-2005 by Secret Labs AB +Copyright (c) 1999-2005 by Fredrik Lundh + +By obtaining, using, and/or copying this software and/or its +associated documentation, you agree that you have read, understood, +and will comply with the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its +associated documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appears in all +copies, and that both that copyright notice and this permission notice +appear in supporting documentation, and that the name of Secret Labs +AB or the author not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR 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. + +-------------------------------------------------------------------- +Expat Software License + +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------- Added: external/celementtree-1.0.5-20051216/cElementTree.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/cElementTree.c Fri Dec 16 23:02:39 2005 @@ -0,0 +1,2766 @@ +/* + * ElementTree + * $Id: /work/modules/celementtree/cElementTree.c 1128 2005-12-16T21:57:13.668520Z Fredrik $ + * + * elementtree accelerator + * + * History: + * 1999-06-20 fl created (as part of sgmlop) + * 2001-05-29 fl effdom edition + * 2001-06-05 fl backported to unix; fixed bogus free in clear + * 2001-07-10 fl added findall helper + * 2003-02-27 fl elementtree edition (alpha) + * 2004-06-03 fl updates for elementtree 1.2 + * 2005-01-05 fl added universal name cache, Element/SubElement factories + * 2005-01-06 fl moved python helpers into C module; removed 1.5.2 support + * 2005-01-07 fl added 2.1 support; work around broken __copy__ in 2.3 + * 2005-01-08 fl added makeelement method; fixed path support + * 2005-01-10 fl optimized memory usage + * 2005-01-11 fl first public release (cElementTree 0.8) + * 2005-01-12 fl split element object into base and extras + * 2005-01-13 fl use tagged pointers for tail/text (cElementTree 0.9) + * 2005-01-17 fl added treebuilder close method + * 2005-01-17 fl fixed crash in getchildren + * 2005-01-18 fl removed observer api, added iterparse (cElementTree 0.9.3) + * 2005-01-23 fl revised iterparse api; added namespace event support (0.9.8) + * 2005-01-26 fl added VERSION module property (cElementTree 1.0) + * 2005-01-28 fl added remove method (1.0.1) + * 2005-03-01 fl added iselement function; fixed makeelement aliasing (1.0.2) + * 2005-03-13 fl export Comment and ProcessingInstruction/PI helpers + * 2005-03-26 fl added Comment and PI support to XMLParser + * 2005-03-27 fl event optimizations; complain about bogus events + * 2005-08-08 fl fixed read error handling in parse + * 2005-08-11 fl added runtime test for copy workaround (1.0.3) + * 2005-12-13 fl added expat_capi support (for xml.etree) (1.0.4) + * 2005-12-16 fl added support for non-standard encodings + * + * Copyright (c) 1999-2005 by Secret Labs AB. All rights reserved. + * Copyright (c) 1999-2005 by Fredrik Lundh. + * + * info at pythonware.com + * http://www.pythonware.com + */ + +#include "Python.h" + +#define VERSION "1.0.5" + +/* -------------------------------------------------------------------- */ +/* configuration */ + +/* Leave defined to include the expat-based XMLParser type */ +#define USE_EXPAT + +/* Define to to all expat calls via pyexpat's embedded expat library */ +/* #define USE_PYEXPAT_CAPI */ + +/* An element can hold this many children without extra memory + allocations. */ +#define STATIC_CHILDREN 4 + +/* For best performance, chose a value so that 80-90% of all nodes + have no more than the given number of children. Set this to zero + to minimize the size of the element structure itself (this only + helps if you have lots of leaf nodes with attributes). */ + +/* Also note that pymalloc always allocates blocks in multiples of + eight bytes. For the current version of cElementTree, this means + that the number of children should be an even number, at least on + 32-bit platforms. */ + +/* -------------------------------------------------------------------- */ + +#if 0 +static int memory = 0; +#define ALLOC(size, comment)\ +do { memory += size; printf("%8d - %s\n", memory, comment); } while (0) +#define RELEASE(size, comment)\ +do { memory -= size; printf("%8d - %s\n", memory, comment); } while (0) +#else +#define ALLOC(size, comment) +#define RELEASE(size, comment) +#endif + +/* compiler tweaks */ +#if defined(_MSC_VER) +#define LOCAL(type) static __inline type __fastcall +#else +#define LOCAL(type) static type +#endif + +/* compatibility macros */ +#if (PY_VERSION_HEX < 0x02040000) +#define PyDict_CheckExact PyDict_Check +#if (PY_VERSION_HEX < 0x02020000) +#define PyList_CheckExact PyList_Check +#define PyString_CheckExact PyString_Check +#if (PY_VERSION_HEX >= 0x01060000) +#define Py_USING_UNICODE /* always enabled for 2.0 and 2.1 */ +#endif +#endif +#endif + +#if (PY_VERSION_HEX >= 0x02050000) +#define PY_CONST const /* 2.5 adds const to some API:s */ +#else +#define PY_CONST +#endif + +#if !defined(Py_RETURN_NONE) +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None +#endif + +/* macros used to store 'join' flags in string object pointers. note + that all use of text and tail as object pointers must be wrapped in + JOIN_OBJ. see comments in the ElementObject definition for more + info. */ +#define JOIN_GET(p) ((Py_uintptr_t) (p) & 1) +#define JOIN_SET(p, flag) ((void*) ((Py_uintptr_t) (JOIN_OBJ(p)) | (flag))) +#define JOIN_OBJ(p) ((PyObject*) ((Py_uintptr_t) (p) & ~1)) + +/* glue functions (see the init function for details) */ +static PyObject* elementtree_copyelement_obj; +static PyObject* elementtree_deepcopy_obj; +static PyObject* elementtree_getiterator_obj; +static PyObject* elementpath_obj; + +/* helpers */ + +LOCAL(PyObject*) +deepcopy(PyObject* object, PyObject* memo) +{ + /* do a deep copy of the given object */ + + PyObject* args; + PyObject* result; + + if (!elementtree_deepcopy_obj) { + PyErr_SetString( + PyExc_RuntimeError, + "deepcopy helper not found" + ); + return NULL; + } + + args = PyTuple_New(2); + Py_INCREF(object); PyTuple_SET_ITEM(args, 0, (PyObject*) object); + Py_INCREF(memo); PyTuple_SET_ITEM(args, 1, (PyObject*) memo); + + result = PyObject_CallObject(elementtree_deepcopy_obj, args); + + Py_DECREF(args); + + return result; +} + +LOCAL(PyObject*) +list_join(PyObject* list) +{ + /* join list elements (destroying the list in the process) */ + + PyObject* joiner; + PyObject* function; + PyObject* args; + PyObject* result; + + switch (PyList_GET_SIZE(list)) { + case 0: + Py_DECREF(list); + return PyString_FromString(""); + case 1: + result = PyList_GET_ITEM(list, 0); + Py_INCREF(result); + Py_DECREF(list); + return result; + } + + /* two or more elements: slice out a suitable separator from the + first member, and use that to join the entire list */ + + joiner = PySequence_GetSlice(PyList_GET_ITEM(list, 0), 0, 0); + if (!joiner) + return NULL; + + function = PyObject_GetAttrString(joiner, "join"); + if (!function) { + Py_DECREF(joiner); + return NULL; + } + + args = PyTuple_New(1); + PyTuple_SET_ITEM(args, 0, list); + + result = PyObject_CallObject(function, args); + + Py_DECREF(args); /* also removes list */ + Py_DECREF(function); + Py_DECREF(joiner); + + return result; +} + +#if (PY_VERSION_HEX < 0x02020000) +LOCAL(int) +PyDict_Update(PyObject* dict, PyObject* other) +{ + /* PyDict_Update emulation for 2.1 and earlier */ + + PyObject* res; + + res = PyObject_CallMethod(dict, "update", "O", other); + if (!res) + return -1; + + Py_DECREF(res); + return 0; +} +#endif + +/* -------------------------------------------------------------------- */ +/* the element type */ + +typedef struct { + + /* attributes (a dictionary object), or None if no attributes */ + PyObject* attrib; + + /* child elements */ + int length; /* actual number of items */ + int allocated; /* allocated items */ + + /* this either points to _children or to a malloced buffer */ + PyObject* *children; + + PyObject* _children[STATIC_CHILDREN]; + +} ElementObjectExtra; + +typedef struct { + PyObject_HEAD + + /* element tag (a string). */ + PyObject* tag; + + /* text before first child. note that this is a tagged pointer; + use JOIN_OBJ to get the object pointer. the join flag is used + to distinguish lists created by the tree builder from lists + assigned to the attribute by application code; the former + should be joined before being returned to the user, the latter + should be left intact. */ + PyObject* text; + + /* text after this element, in parent. note that this is a tagged + pointer; use JOIN_OBJ to get the object pointer. */ + PyObject* tail; + + ElementObjectExtra* extra; + +} ElementObject; + +staticforward PyTypeObject Element_Type; + +#define Element_CheckExact(op) ((op)->ob_type == &Element_Type) + +/* -------------------------------------------------------------------- */ +/* element constructor and destructor */ + +LOCAL(int) +element_new_extra(ElementObject* self, PyObject* attrib) +{ + self->extra = PyObject_Malloc(sizeof(ElementObjectExtra)); + if (!self->extra) + return -1; + + if (!attrib) + attrib = Py_None; + + Py_INCREF(attrib); + self->extra->attrib = attrib; + + self->extra->length = 0; + self->extra->allocated = STATIC_CHILDREN; + self->extra->children = self->extra->_children; + + return 0; +} + +LOCAL(void) +element_dealloc_extra(ElementObject* self) +{ + int i; + + Py_DECREF(self->extra->attrib); + + for (i = 0; i < self->extra->length; i++) + Py_DECREF(self->extra->children[i]); + + if (self->extra->children != self->extra->_children) + PyObject_Free(self->extra->children); + + PyObject_Free(self->extra); +} + +LOCAL(PyObject*) +element_new(PyObject* tag, PyObject* attrib) +{ + ElementObject* self; + + self = PyObject_New(ElementObject, &Element_Type); + if (self == NULL) + return NULL; + + /* use None for empty dictionaries */ + if (PyDict_CheckExact(attrib) && !PyDict_Size(attrib)) + attrib = Py_None; + + self->extra = NULL; + + if (attrib != Py_None) { + + if (element_new_extra(self, attrib) < 0) + return NULL; + + self->extra->length = 0; + self->extra->allocated = STATIC_CHILDREN; + self->extra->children = self->extra->_children; + + } + + Py_INCREF(tag); + self->tag = tag; + + Py_INCREF(Py_None); + self->text = Py_None; + + Py_INCREF(Py_None); + self->tail = Py_None; + + ALLOC(sizeof(ElementObject), "create element"); + + return (PyObject*) self; +} + +LOCAL(int) +element_resize(ElementObject* self, int extra) +{ + int size; + PyObject* *children; + + /* make sure self->children can hold the given number of extra + elements. set an exception and return -1 if allocation failed */ + + if (!self->extra) + element_new_extra(self, NULL); + + size = self->extra->length + extra; + + if (size > self->extra->allocated) { + /* use Python 2.4's list growth strategy */ + size = (size >> 3) + (size < 9 ? 3 : 6) + size; + if (self->extra->children != self->extra->_children) { + children = PyObject_Realloc(self->extra->children, + size * sizeof(PyObject*)); + if (!children) + goto nomemory; + } else { + children = PyObject_Malloc(size * sizeof(PyObject*)); + if (!children) + goto nomemory; + /* copy existing children from static area to malloc buffer */ + memcpy(children, self->extra->children, + self->extra->length * sizeof(PyObject*)); + } + self->extra->children = children; + self->extra->allocated = size; + } + + return 0; + + nomemory: + PyErr_NoMemory(); + return -1; +} + +LOCAL(int) +element_add_subelement(ElementObject* self, PyObject* element) +{ + /* add a child element to a parent */ + + if (element_resize(self, 1) < 0) + return -1; + + Py_INCREF(element); + self->extra->children[self->extra->length] = element; + + self->extra->length++; + + return 0; +} + +LOCAL(PyObject*) +element_get_attrib(ElementObject* self) +{ + /* return borrowed reference to attrib dictionary */ + /* note: this function assumes that the extra section exists */ + + PyObject* res = self->extra->attrib; + + if (res == Py_None) { + /* create missing dictionary */ + res = PyDict_New(); + if (!res) + return NULL; + self->extra->attrib = res; + } + + return res; +} + +LOCAL(PyObject*) +element_get_text(ElementObject* self) +{ + /* return borrowed reference to text attribute */ + + PyObject* res = self->text; + + if (JOIN_GET(res)) { + res = JOIN_OBJ(res); + if (PyList_CheckExact(res)) { + res = list_join(res); + if (!res) + return NULL; + self->text = res; + } + } + + return res; +} + +LOCAL(PyObject*) +element_get_tail(ElementObject* self) +{ + /* return borrowed reference to text attribute */ + + PyObject* res = self->tail; + + if (JOIN_GET(res)) { + res = JOIN_OBJ(res); + if (PyList_CheckExact(res)) { + res = list_join(res); + if (!res) + return NULL; + self->tail = res; + } + } + + return res; +} + +static PyObject* +element(PyObject* self, PyObject* args, PyObject* kw) +{ + PyObject* elem; + + PyObject* tag; + PyObject* attrib = NULL; + if (!PyArg_ParseTuple(args, "O|O!:Element", &tag, + &PyDict_Type, &attrib)) + return NULL; + + if (attrib || kw) { + attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New(); + if (!attrib) + return NULL; + if (kw) + PyDict_Update(attrib, kw); + } else { + Py_INCREF(Py_None); + attrib = Py_None; + } + + elem = element_new(tag, attrib); + + Py_DECREF(attrib); + + return elem; +} + +static PyObject* +subelement(PyObject* self, PyObject* args, PyObject* kw) +{ + PyObject* elem; + + ElementObject* parent; + PyObject* tag; + PyObject* attrib = NULL; + if (!PyArg_ParseTuple(args, "O!O|O!:SubElement", + &Element_Type, &parent, &tag, + &PyDict_Type, &attrib)) + return NULL; + + if (attrib || kw) { + attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New(); + if (!attrib) + return NULL; + if (kw) + PyDict_Update(attrib, kw); + } else { + Py_INCREF(Py_None); + attrib = Py_None; + } + + elem = element_new(tag, attrib); + + Py_DECREF(attrib); + + if (element_add_subelement(parent, elem) < 0) + return NULL; + + return elem; +} + +static void +element_dealloc(ElementObject* self) +{ + if (self->extra) + element_dealloc_extra(self); + + /* discard attributes */ + Py_DECREF(self->tag); + Py_DECREF(JOIN_OBJ(self->text)); + Py_DECREF(JOIN_OBJ(self->tail)); + + RELEASE(sizeof(ElementObject), "destroy element"); + + PyObject_Del(self); +} + +/* -------------------------------------------------------------------- */ +/* methods (in alphabetical order) */ + +static PyObject* +element_append(ElementObject* self, PyObject* args) +{ + PyObject* element; + if (!PyArg_ParseTuple(args, "O!:append", &Element_Type, &element)) + return NULL; + + if (element_add_subelement(self, element) < 0) + return NULL; + + Py_RETURN_NONE; +} + +static PyObject* +element_clear(ElementObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":clear")) + return NULL; + + if (self->extra) { + element_dealloc_extra(self); + self->extra = NULL; + } + + Py_INCREF(Py_None); + Py_DECREF(JOIN_OBJ(self->text)); + self->text = Py_None; + + Py_INCREF(Py_None); + Py_DECREF(JOIN_OBJ(self->tail)); + self->tail = Py_None; + + Py_RETURN_NONE; +} + +static PyObject* +element_copy(ElementObject* self, PyObject* args) +{ + int i; + ElementObject* element; + + if (!PyArg_ParseTuple(args, ":__copy__")) + return NULL; + + element = (ElementObject*) element_new( + self->tag, (self->extra) ? self->extra->attrib : Py_None + ); + if (!element) + return NULL; + + Py_DECREF(JOIN_OBJ(element->text)); + element->text = self->text; + Py_INCREF(JOIN_OBJ(element->text)); + + Py_DECREF(JOIN_OBJ(element->tail)); + element->tail = self->tail; + Py_INCREF(JOIN_OBJ(element->tail)); + + if (self->extra) { + + if (element_resize(element, self->extra->length) < 0) + return NULL; + + for (i = 0; i < self->extra->length; i++) { + Py_INCREF(self->extra->children[i]); + element->extra->children[i] = self->extra->children[i]; + } + + element->extra->length = self->extra->length; + + } + + return (PyObject*) element; +} + +static PyObject* +element_deepcopy(ElementObject* self, PyObject* args) +{ + int i; + ElementObject* element; + PyObject* tag; + PyObject* attrib; + PyObject* text; + PyObject* tail; + PyObject* id; + + PyObject* memo; + if (!PyArg_ParseTuple(args, "O:__deepcopy__", &memo)) + return NULL; + + tag = deepcopy(self->tag, memo); + if (!tag) + return NULL; + + if (self->extra) { + attrib = deepcopy(self->extra->attrib, memo); + if (!attrib) { + Py_DECREF(tag); + return NULL; + } + } else { + Py_INCREF(Py_None); + attrib = Py_None; + } + + element = (ElementObject*) element_new(tag, attrib); + + Py_DECREF(tag); + Py_DECREF(attrib); + + if (!element) + return NULL; + + text = deepcopy(JOIN_OBJ(self->text), memo); + if (!text) + goto error; + Py_DECREF(element->text); + element->text = JOIN_SET(text, JOIN_GET(self->text)); + + tail = deepcopy(JOIN_OBJ(self->tail), memo); + if (!tail) + goto error; + Py_DECREF(element->tail); + element->tail = JOIN_SET(tail, JOIN_GET(self->tail)); + + if (self->extra) { + + if (element_resize(element, self->extra->length) < 0) + goto error; + + for (i = 0; i < self->extra->length; i++) { + PyObject* child = deepcopy(self->extra->children[i], memo); + if (!child) { + element->extra->length = i; + goto error; + } + element->extra->children[i] = child; + } + + element->extra->length = self->extra->length; + + } + + /* add object to memo dictionary (so deepcopy won't visit it again) */ + id = PyInt_FromLong((Py_uintptr_t) self); + + i = PyDict_SetItem(memo, id, (PyObject*) element); + + Py_DECREF(id); + + if (i < 0) + goto error; + + return (PyObject*) element; + + error: + Py_DECREF(element); + return NULL; +} + +LOCAL(int) +checkpath(PyObject* tag) +{ + int i, check = 1; + + /* check if a tag contains an xpath character */ + +#define PATHCHAR(ch) (ch == '/' || ch == '*' || ch == '[' || ch == '@') + +#if defined(Py_USING_UNICODE) + if (PyUnicode_Check(tag)) { + Py_UNICODE *p = PyUnicode_AS_UNICODE(tag); + for (i = 0; i < PyUnicode_GET_SIZE(tag); i++) { + if (p[i] == '{') + check = 0; + else if (p[i] == '}') + check = 1; + else if (check && PATHCHAR(p[i])) + return 1; + } + return 0; + } +#endif + if (PyString_Check(tag)) { + char *p = PyString_AS_STRING(tag); + for (i = 0; i < PyString_GET_SIZE(tag); i++) { + if (p[i] == '{') + check = 0; + else if (p[i] == '}') + check = 1; + else if (check && PATHCHAR(p[i])) + return 1; + } + return 0; + } + + return 1; /* unknown type; might be path expression */ +} + +static PyObject* +element_find(ElementObject* self, PyObject* args) +{ + int i; + + PyObject* tag; + if (!PyArg_ParseTuple(args, "O:find", &tag)) + return NULL; + + if (checkpath(tag)) + return PyObject_CallMethod( + elementpath_obj, "find", "OO", self, tag + ); + + if (!self->extra) + Py_RETURN_NONE; + + for (i = 0; i < self->extra->length; i++) { + PyObject* item = self->extra->children[i]; + if (Element_CheckExact(item) && + PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) { + Py_INCREF(item); + return item; + } + } + + Py_RETURN_NONE; +} + +static PyObject* +element_findtext(ElementObject* self, PyObject* args) +{ + int i; + + PyObject* tag; + PyObject* default_value = Py_None; + if (!PyArg_ParseTuple(args, "O|O:findtext", &tag, &default_value)) + return NULL; + + if (checkpath(tag)) + return PyObject_CallMethod( + elementpath_obj, "findtext", "OOO", self, tag, default_value + ); + + if (!self->extra) { + Py_INCREF(default_value); + return default_value; + } + + for (i = 0; i < self->extra->length; i++) { + ElementObject* item = (ElementObject*) self->extra->children[i]; + if (Element_CheckExact(item) && !PyObject_Compare(item->tag, tag)) { + PyObject* text = element_get_text(item); + if (text == Py_None) + return PyString_FromString(""); + Py_INCREF(text); + return text; + } + } + + Py_INCREF(default_value); + return default_value; +} + +static PyObject* +element_findall(ElementObject* self, PyObject* args) +{ + int i; + PyObject* out; + + PyObject* tag; + if (!PyArg_ParseTuple(args, "O:findall", &tag)) + return NULL; + + if (checkpath(tag)) + return PyObject_CallMethod( + elementpath_obj, "findall", "OO", self, tag + ); + + out = PyList_New(0); + if (!out) + return NULL; + + if (!self->extra) + return out; + + for (i = 0; i < self->extra->length; i++) { + PyObject* item = self->extra->children[i]; + if (Element_CheckExact(item) && + PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) { + if (PyList_Append(out, item) < 0) { + Py_DECREF(out); + return NULL; + } + } + } + + return out; +} + +static PyObject* +element_get(ElementObject* self, PyObject* args) +{ + PyObject* value; + + PyObject* key; + PyObject* default_value = Py_None; + if (!PyArg_ParseTuple(args, "O|O:get", &key, &default_value)) + return NULL; + + if (!self->extra || self->extra->attrib == Py_None) + value = default_value; + else { + value = PyDict_GetItem(self->extra->attrib, key); + if (!value) + value = default_value; + } + + Py_INCREF(value); + return value; +} + +static PyObject* +element_getchildren(ElementObject* self, PyObject* args) +{ + int i; + PyObject* list; + + if (!PyArg_ParseTuple(args, ":getchildren")) + return NULL; + + if (!self->extra) + return PyList_New(0); + + list = PyList_New(self->extra->length); + if (!list) + return NULL; + + for (i = 0; i < self->extra->length; i++) { + PyObject* item = self->extra->children[i]; + Py_INCREF(item); + PyList_SET_ITEM(list, i, item); + } + + return list; +} + +static PyObject* +element_getiterator(ElementObject* self, PyObject* args) +{ + PyObject* result; + + PyObject* tag = Py_None; + if (!PyArg_ParseTuple(args, "|O:getiterator", &tag)) + return NULL; + + if (!elementtree_getiterator_obj) { + PyErr_SetString( + PyExc_RuntimeError, + "getiterator helper not found" + ); + return NULL; + } + + args = PyTuple_New(2); + Py_INCREF(self); PyTuple_SET_ITEM(args, 0, (PyObject*) self); + Py_INCREF(tag); PyTuple_SET_ITEM(args, 1, (PyObject*) tag); + + result = PyObject_CallObject(elementtree_getiterator_obj, args); + + Py_DECREF(args); + + return result; +} + +static PyObject* +element_getitem(ElementObject* self, int index) +{ + if (!self->extra || index < 0 || index >= self->extra->length) { + PyErr_SetString( + PyExc_IndexError, + "child index out of range" + ); + return NULL; + } + + Py_INCREF(self->extra->children[index]); + return self->extra->children[index]; +} + +static PyObject* +element_getslice(ElementObject* self, int start, int end) +{ + int i; + PyObject* list; + + if (!self->extra) + return PyList_New(0); + + /* standard clamping */ + if (start < 0) + start = 0; + if (end < 0) + end = 0; + if (end > self->extra->length) + end = self->extra->length; + if (start > end) + start = end; + + list = PyList_New(end - start); + if (!list) + return NULL; + + for (i = start; i < end; i++) { + PyObject* item = self->extra->children[i]; + Py_INCREF(item); + PyList_SET_ITEM(list, i - start, item); + } + + return list; +} + +static PyObject* +element_insert(ElementObject* self, PyObject* args) +{ + int i; + + int index; + PyObject* element; + if (!PyArg_ParseTuple(args, "iO!:insert", &index, + &Element_Type, &element)) + return NULL; + + if (!self->extra) + element_new_extra(self, NULL); + + if (index < 0) + index = 0; + if (index > self->extra->length) + index = self->extra->length; + + if (element_resize(self, 1) < 0) + return NULL; + + for (i = self->extra->length; i > index; i--) + self->extra->children[i] = self->extra->children[i-1]; + + Py_INCREF(element); + self->extra->children[index] = element; + + self->extra->length++; + + Py_RETURN_NONE; +} + +static PyObject* +element_items(ElementObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":items")) + return NULL; + + if (!self->extra || self->extra->attrib == Py_None) + return PyList_New(0); + + return PyDict_Items(self->extra->attrib); +} + +static PyObject* +element_keys(ElementObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":keys")) + return NULL; + + if (!self->extra || self->extra->attrib == Py_None) + return PyList_New(0); + + return PyDict_Keys(self->extra->attrib); +} + +static int +element_length(ElementObject* self) +{ + if (!self->extra) + return 0; + + return self->extra->length; +} + +static PyObject* +element_makeelement(PyObject* self, PyObject* args, PyObject* kw) +{ + PyObject* elem; + + PyObject* tag; + PyObject* attrib; + if (!PyArg_ParseTuple(args, "OO:makeelement", &tag, &attrib)) + return NULL; + + attrib = PyDict_Copy(attrib); + if (!attrib) + return NULL; + + elem = element_new(tag, attrib); + + Py_DECREF(attrib); + + return elem; +} + +static PyObject* +element_reduce(ElementObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":__reduce__")) + return NULL; + + /* Hack alert: This method is used to work around a __copy__ + problem on certain 2.3 and 2.4 versions. To save time and + simplify the code, we create the copy in here, and use a dummy + copyelement helper to trick the copy module into doing the + right thing. */ + + if (!elementtree_copyelement_obj) { + PyErr_SetString( + PyExc_RuntimeError, + "copyelement helper not found" + ); + return NULL; + } + + return Py_BuildValue( + "O(N)", elementtree_copyelement_obj, element_copy(self, args) + ); +} + +static PyObject* +element_remove(ElementObject* self, PyObject* args) +{ + int i; + + PyObject* element; + if (!PyArg_ParseTuple(args, "O!:remove", &Element_Type, &element)) + return NULL; + + if (!self->extra) { + /* element has no children, so raise exception */ + PyErr_SetString( + PyExc_ValueError, + "list.remove(x): x not in list" + ); + return NULL; + } + + for (i = 0; i < self->extra->length; i++) { + if (self->extra->children[i] == element) + break; + if (PyObject_Compare(self->extra->children[i], element) == 0) + break; + } + + if (i == self->extra->length) { + /* element is not in children, so raise exception */ + PyErr_SetString( + PyExc_ValueError, + "list.remove(x): x not in list" + ); + return NULL; + } + + Py_DECREF(self->extra->children[i]); + + self->extra->length--; + + for (; i < self->extra->length; i++) + self->extra->children[i] = self->extra->children[i+1]; + + Py_RETURN_NONE; +} + +static PyObject* +element_repr(ElementObject* self) +{ + PyObject* repr; + char buffer[100]; + + repr = PyString_FromString("tag)); + + sprintf(buffer, " at %p>", self); + PyString_ConcatAndDel(&repr, PyString_FromString(buffer)); + + return repr; +} + +static PyObject* +element_set(ElementObject* self, PyObject* args) +{ + PyObject* attrib; + + PyObject* key; + PyObject* value; + if (!PyArg_ParseTuple(args, "OO:set", &key, &value)) + return NULL; + + if (!self->extra) + element_new_extra(self, NULL); + + attrib = element_get_attrib(self); + if (!attrib) + return NULL; + + if (PyDict_SetItem(attrib, key, value) < 0) + return NULL; + + Py_RETURN_NONE; +} + +static int +element_setslice(ElementObject* self, int start, int end, PyObject* item) +{ + int i, new, old; + PyObject* recycle = NULL; + + if (!self->extra) + element_new_extra(self, NULL); + + /* standard clamping */ + if (start < 0) + start = 0; + if (end < 0) + end = 0; + if (end > self->extra->length) + end = self->extra->length; + if (start > end) + start = end; + + old = end - start; + + if (item == NULL) + new = 0; + else if (PyList_CheckExact(item)) { + new = PyList_GET_SIZE(item); + } else { + /* FIXME: support arbitrary sequences? */ + PyErr_Format( + PyExc_TypeError, + "expected list, not \"%.200s\"", item->ob_type->tp_name + ); + return -1; + } + + if (old > 0) { + /* to avoid recursive calls to this method (via decref), move + old items to the recycle bin here, and get rid of them when + we're done modifying the element */ + recycle = PyList_New(old); + for (i = 0; i < old; i++) + PyList_SET_ITEM(recycle, i, self->extra->children[i + start]); + } + + if (new < old) { + /* delete slice */ + for (i = end; i < self->extra->length; i++) + self->extra->children[i + new - old] = self->extra->children[i]; + } else if (new > old) { + /* insert slice */ + if (element_resize(self, new - old) < 0) + return -1; + for (i = self->extra->length-1; i >= end; i--) + self->extra->children[i + new - old] = self->extra->children[i]; + } + + /* replace the slice */ + for (i = 0; i < new; i++) { + PyObject* element = PyList_GET_ITEM(item, i); + Py_INCREF(element); + self->extra->children[i + start] = element; + } + + self->extra->length += new - old; + + /* discard the recycle bin, and everything in it */ + Py_XDECREF(recycle); + + return 0; +} + +static int +element_setitem(ElementObject* self, int index, PyObject* item) +{ + int i; + PyObject* old; + + if (!self->extra || index < 0 || index >= self->extra->length) { + PyErr_SetString( + PyExc_IndexError, + "child assignment index out of range"); + return -1; + } + + old = self->extra->children[index]; + + if (item) { + Py_INCREF(item); + self->extra->children[index] = item; + } else { + self->extra->length--; + for (i = index; i < self->extra->length; i++) + self->extra->children[i] = self->extra->children[i+1]; + } + + Py_DECREF(old); + + return 0; +} + +static PyMethodDef element_methods[] = { + + {"clear", (PyCFunction) element_clear, METH_VARARGS}, + + {"get", (PyCFunction) element_get, METH_VARARGS}, + {"set", (PyCFunction) element_set, METH_VARARGS}, + + {"find", (PyCFunction) element_find, METH_VARARGS}, + {"findtext", (PyCFunction) element_findtext, METH_VARARGS}, + {"findall", (PyCFunction) element_findall, METH_VARARGS}, + + {"append", (PyCFunction) element_append, METH_VARARGS}, + {"insert", (PyCFunction) element_insert, METH_VARARGS}, + {"remove", (PyCFunction) element_remove, METH_VARARGS}, + + {"getiterator", (PyCFunction) element_getiterator, METH_VARARGS}, + {"getchildren", (PyCFunction) element_getchildren, METH_VARARGS}, + + {"items", (PyCFunction) element_items, METH_VARARGS}, + {"keys", (PyCFunction) element_keys, METH_VARARGS}, + + {"makeelement", (PyCFunction) element_makeelement, METH_VARARGS}, + + {"__copy__", (PyCFunction) element_copy, METH_VARARGS}, + {"__deepcopy__", (PyCFunction) element_deepcopy, METH_VARARGS}, + + /* Some 2.3 and 2.4 versions do not handle the __copy__ method on + C objects correctly, so we have to fake it using a __reduce__- + based hack (see the element_reduce implementation above for + details). */ + + /* The behaviour has been changed in 2.3.5 and 2.4.1, so we're + using a runtime test to figure out if we need to fake things + or now (see the init code below). The following entry is + enabled only if the hack is needed. */ + + {"!__reduce__", (PyCFunction) element_reduce, METH_VARARGS}, + + {NULL, NULL} +}; + +static PyObject* +element_getattr(ElementObject* self, char* name) +{ + PyObject* res; + + res = Py_FindMethod(element_methods, (PyObject*) self, name); + if (res) + return res; + + PyErr_Clear(); + + if (strcmp(name, "tag") == 0) + res = self->tag; + else if (strcmp(name, "text") == 0) + res = element_get_text(self); + else if (strcmp(name, "tail") == 0) { + res = element_get_tail(self); + } else if (strcmp(name, "attrib") == 0) { + if (!self->extra) + element_new_extra(self, NULL); + res = element_get_attrib(self); + } else { + PyErr_SetString(PyExc_AttributeError, name); + return NULL; + } + + if (!res) + return NULL; + + Py_INCREF(res); + return res; +} + +static int +element_setattr(ElementObject* self, const char* name, PyObject* value) +{ + if (value == NULL) { + PyErr_SetString( + PyExc_AttributeError, + "can't delete element attributes" + ); + return -1; + } + + if (strcmp(name, "tag") == 0) { + Py_DECREF(self->tag); + self->tag = value; + Py_INCREF(self->tag); + } else if (strcmp(name, "text") == 0) { + Py_DECREF(JOIN_OBJ(self->text)); + self->text = value; + Py_INCREF(self->text); + } else if (strcmp(name, "tail") == 0) { + Py_DECREF(JOIN_OBJ(self->tail)); + self->tail = value; + Py_INCREF(self->tail); + } else if (strcmp(name, "attrib") == 0) { + if (!self->extra) + element_new_extra(self, NULL); + Py_DECREF(self->extra->attrib); + self->extra->attrib = value; + Py_INCREF(self->extra->attrib); + } else { + PyErr_SetString(PyExc_AttributeError, name); + return -1; + } + + return 0; +} + +static PySequenceMethods element_as_sequence = { + (inquiry) element_length, + 0, /* sq_concat */ + 0, /* sq_repeat */ + (intargfunc) element_getitem, + (intintargfunc) element_getslice, + (intobjargproc) element_setitem, + (intintobjargproc) element_setslice, +}; + +statichere PyTypeObject Element_Type = { + PyObject_HEAD_INIT(NULL) + 0, "Element", sizeof(ElementObject), 0, + /* methods */ + (destructor)element_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)element_getattr, /* tp_getattr */ + (setattrfunc)element_setattr, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc)element_repr, /* tp_repr */ + 0, /* tp_as_number */ + &element_as_sequence, /* tp_as_sequence */ +}; + +/* ==================================================================== */ +/* the tree builder type */ + +typedef struct { + PyObject_HEAD + + PyObject* root; /* root node (first created node) */ + + ElementObject* this; /* current node */ + ElementObject* last; /* most recently created node */ + + PyObject* data; /* data collector (string or list), or NULL */ + + PyObject* stack; /* element stack */ + int index; /* current stack size (0=empty) */ + + /* element tracing */ + PyObject* events; /* list of events, or NULL if not collecting */ + PyObject* start_event_obj; /* event objects (NULL to ignore) */ + PyObject* end_event_obj; + PyObject* start_ns_event_obj; + PyObject* end_ns_event_obj; + +} TreeBuilderObject; + +staticforward PyTypeObject TreeBuilder_Type; + +#define TreeBuilder_CheckExact(op) ((op)->ob_type == &TreeBuilder_Type) + +/* -------------------------------------------------------------------- */ +/* constructor and destructor */ + +LOCAL(PyObject*) +treebuilder_new(void) +{ + TreeBuilderObject* self; + + self = PyObject_New(TreeBuilderObject, &TreeBuilder_Type); + if (self == NULL) + return NULL; + + self->root = NULL; + + Py_INCREF(Py_None); + self->this = (ElementObject*) Py_None; + + Py_INCREF(Py_None); + self->last = (ElementObject*) Py_None; + + self->data = NULL; + + self->stack = PyList_New(20); + self->index = 0; + + self->events = NULL; + self->start_event_obj = self->end_event_obj = NULL; + self->start_ns_event_obj = self->end_ns_event_obj = NULL; + + ALLOC(sizeof(TreeBuilderObject), "create treebuilder"); + + return (PyObject*) self; +} + +static PyObject* +treebuilder(PyObject* _self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":TreeBuilder")) + return NULL; + + return treebuilder_new(); +} + +static void +treebuilder_dealloc(TreeBuilderObject* self) +{ + Py_XDECREF(self->end_ns_event_obj); + Py_XDECREF(self->start_ns_event_obj); + Py_XDECREF(self->end_event_obj); + Py_XDECREF(self->start_event_obj); + Py_XDECREF(self->events); + Py_DECREF(self->stack); + Py_XDECREF(self->data); + Py_DECREF(self->last); + Py_DECREF(self->this); + Py_XDECREF(self->root); + + RELEASE(sizeof(TreeBuilderObject), "destroy treebuilder"); + + PyObject_Del(self); +} + +/* -------------------------------------------------------------------- */ +/* handlers */ + +LOCAL(PyObject*) +treebuilder_handle_xml(TreeBuilderObject* self, PyObject* encoding, + PyObject* standalone) +{ + Py_RETURN_NONE; +} + +LOCAL(PyObject*) +treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, + PyObject* attrib) +{ + PyObject* node; + PyObject* this; + + if (self->data) { + if (self->this == self->last) { + self->last->text = JOIN_SET( + self->data, PyList_CheckExact(self->data) + ); + } else { + self->last->tail = JOIN_SET( + self->data, PyList_CheckExact(self->data) + ); + } + self->data = NULL; + } + + node = element_new(tag, attrib); + if (!node) + return NULL; + + this = (PyObject*) self->this; + + if (this != Py_None) { + if (element_add_subelement((ElementObject*) this, node) < 0) + return NULL; + } else { + if (self->root) { + PyErr_SetString( + PyExc_SyntaxError, + "multiple elements on top level" + ); + return NULL; + } + Py_INCREF(node); + self->root = node; + } + + if (self->index < PyList_GET_SIZE(self->stack)) { + if (PyList_SetItem(self->stack, self->index, this) < 0) + return NULL; + Py_INCREF(this); + } else { + if (PyList_Append(self->stack, this) < 0) + return NULL; + } + self->index++; + + Py_DECREF(this); + Py_INCREF(node); + self->this = (ElementObject*) node; + + Py_DECREF(self->last); + Py_INCREF(node); + self->last = (ElementObject*) node; + + if (self->start_event_obj) { + PyObject* res; + PyObject* action = self->start_event_obj; + res = PyTuple_New(2); + if (res) { + Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action); + Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node); + PyList_Append(self->events, res); + Py_DECREF(res); + } else + PyErr_Clear(); /* FIXME: propagate error */ + } + + return node; +} + +LOCAL(PyObject*) +treebuilder_handle_data(TreeBuilderObject* self, PyObject* data) +{ + if (!self->data) { + /* store the first item as is */ + Py_INCREF(data); self->data = data; + } else { + /* more than one item; use a list to collect items */ + if (PyString_CheckExact(self->data) && self->data->ob_refcnt == 1 && + PyString_CheckExact(data) && PyString_GET_SIZE(data) == 1) { + /* expat often generates single character data sections; handle + the most common case by resizing the existing string... */ + int size = PyString_GET_SIZE(self->data); + if (_PyString_Resize(&self->data, size + 1) < 0) + return NULL; + PyString_AS_STRING(self->data)[size] = PyString_AS_STRING(data)[0]; + } else if (PyList_CheckExact(self->data)) { + if (PyList_Append(self->data, data) < 0) + return NULL; + } else { + PyObject* list = PyList_New(2); + if (!list) + return NULL; + PyList_SET_ITEM(list, 0, self->data); + Py_INCREF(data); PyList_SET_ITEM(list, 1, data); + self->data = list; + } + } + + Py_RETURN_NONE; +} + +LOCAL(PyObject*) +treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) +{ + PyObject* item; + + if (self->data) { + if (self->this == self->last) { + self->last->text = JOIN_SET( + self->data, PyList_CheckExact(self->data) + ); + } else { + self->last->tail = JOIN_SET( + self->data, PyList_CheckExact(self->data) + ); + } + self->data = NULL; + } + + if (self->index == 0) { + PyErr_SetString( + PyExc_IndexError, + "pop from empty stack" + ); + return NULL; + } + + self->index--; + + item = PyList_GET_ITEM(self->stack, self->index); + Py_INCREF(item); + + Py_DECREF(self->last); + + self->last = (ElementObject*) self->this; + self->this = (ElementObject*) item; + + if (self->end_event_obj) { + PyObject* res; + PyObject* action = self->end_event_obj; + PyObject* node = (PyObject*) self->last; + res = PyTuple_New(2); + if (res) { + Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action); + Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node); + PyList_Append(self->events, res); + Py_DECREF(res); + } else + PyErr_Clear(); /* FIXME: propagate error */ + } + + Py_INCREF(self->last); + return (PyObject*) self->last; +} + +LOCAL(void) +treebuilder_handle_namespace(TreeBuilderObject* self, int start, + const char* prefix, const char *uri) +{ + PyObject* res; + PyObject* action; + PyObject* parcel; + + if (!self->events) + return; + + if (start) { + if (!self->start_ns_event_obj) + return; + action = self->start_ns_event_obj; + /* FIXME: prefix and uri use utf-8 encoding! */ + parcel = Py_BuildValue("ss", (prefix) ? prefix : "", uri); + if (!parcel) + return; + Py_INCREF(action); + } else { + if (!self->end_ns_event_obj) + return; + action = self->end_ns_event_obj; + Py_INCREF(action); + parcel = Py_None; + Py_INCREF(parcel); + } + + res = PyTuple_New(2); + + if (res) { + PyTuple_SET_ITEM(res, 0, action); + PyTuple_SET_ITEM(res, 1, parcel); + PyList_Append(self->events, res); + Py_DECREF(res); + } else + PyErr_Clear(); /* FIXME: propagate error */ +} + +/* -------------------------------------------------------------------- */ +/* methods (in alphabetical order) */ + +static PyObject* +treebuilder_data(TreeBuilderObject* self, PyObject* args) +{ + PyObject* data; + if (!PyArg_ParseTuple(args, "O:data", &data)) + return NULL; + + return treebuilder_handle_data(self, data); +} + +static PyObject* +treebuilder_end(TreeBuilderObject* self, PyObject* args) +{ + PyObject* tag; + if (!PyArg_ParseTuple(args, "O:end", &tag)) + return NULL; + + return treebuilder_handle_end(self, tag); +} + +LOCAL(PyObject*) +treebuilder_done(TreeBuilderObject* self) +{ + PyObject* res; + + /* FIXME: check stack size? */ + + if (self->root) + res = self->root; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +static PyObject* +treebuilder_close(TreeBuilderObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":close")) + return NULL; + + return treebuilder_done(self); +} + +static PyObject* +treebuilder_start(TreeBuilderObject* self, PyObject* args) +{ + PyObject* tag; + PyObject* attrib = Py_None; + if (!PyArg_ParseTuple(args, "O|O:start", &tag, &attrib)) + return NULL; + + return treebuilder_handle_start(self, tag, attrib); +} + +static PyObject* +treebuilder_xml(TreeBuilderObject* self, PyObject* args) +{ + PyObject* encoding; + PyObject* standalone; + if (!PyArg_ParseTuple(args, "OO:xml", &encoding, &standalone)) + return NULL; + + return treebuilder_handle_xml(self, encoding, standalone); +} + +static PyMethodDef treebuilder_methods[] = { + {"data", (PyCFunction) treebuilder_data, METH_VARARGS}, + {"start", (PyCFunction) treebuilder_start, METH_VARARGS}, + {"end", (PyCFunction) treebuilder_end, METH_VARARGS}, + {"xml", (PyCFunction) treebuilder_xml, METH_VARARGS}, + {"close", (PyCFunction) treebuilder_close, METH_VARARGS}, + {NULL, NULL} +}; + +static PyObject* +treebuilder_getattr(TreeBuilderObject* self, char* name) +{ + return Py_FindMethod(treebuilder_methods, (PyObject*) self, name); +} + +statichere PyTypeObject TreeBuilder_Type = { + PyObject_HEAD_INIT(NULL) + 0, "TreeBuilder", sizeof(TreeBuilderObject), 0, + /* methods */ + (destructor)treebuilder_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)treebuilder_getattr, /* tp_getattr */ +}; + +/* ==================================================================== */ +/* the expat interface */ + +#if defined(USE_EXPAT) + +#include "expat.h" + +#if defined(USE_PYEXPAT_CAPI) +#include "pyexpat.h" +static struct PyExpat_CAPI* expat_capi; +#define EXPAT(func) (expat_capi->func) +#else +#define EXPAT(func) (XML_##func) +#endif + +typedef struct { + PyObject_HEAD + + XML_Parser parser; + + PyObject* target; + PyObject* entity; + + PyObject* names; + + PyObject* handle_xml; + PyObject* handle_start; + PyObject* handle_data; + PyObject* handle_end; + + PyObject* handle_comment; + PyObject* handle_pi; + +} XMLParserObject; + +staticforward PyTypeObject XMLParser_Type; + +/* helpers */ + +#if defined(Py_USING_UNICODE) +LOCAL(int) +checkstring(const char* string, int size) +{ + int i; + + /* check if an 8-bit string contains UTF-8 characters */ + for (i = 0; i < size; i++) + if (string[i] & 0x80) + return 1; + + return 0; +} +#endif + +LOCAL(PyObject*) +makestring(const char* string, int size) +{ + /* convert a UTF-8 string to either a 7-bit ascii string or a + Unicode string */ + +#if defined(Py_USING_UNICODE) + if (checkstring(string, size)) + return PyUnicode_DecodeUTF8(string, size, "strict"); +#endif + + return PyString_FromStringAndSize(string, size); +} + +LOCAL(PyObject*) +makeuniversal(XMLParserObject* self, const char* string) +{ + /* convert a UTF-8 tag/attribute name from the expat parser + to a universal name string */ + + int size = strlen(string); + PyObject* key; + PyObject* value; + + /* look the 'raw' name up in the names dictionary */ + key = PyString_FromStringAndSize(string, size); + if (!key) + return NULL; + + value = PyDict_GetItem(self->names, key); + + if (value) { + Py_INCREF(value); + } else { + /* new name. convert to universal name, and decode as + necessary */ + + PyObject* tag; + char* p; + int i; + + /* look for namespace separator */ + for (i = 0; i < size; i++) + if (string[i] == '}') + break; + if (i != size) { + /* convert to universal name */ + tag = PyString_FromStringAndSize(NULL, size+1); + p = PyString_AS_STRING(tag); + p[0] = '{'; + memcpy(p+1, string, size); + size++; + } else { + /* plain name; use key as tag */ + Py_INCREF(key); + tag = key; + } + + /* decode universal name */ +#if defined(Py_USING_UNICODE) + /* inline makestring, to avoid duplicating the source string if + it's not an utf-8 string */ + p = PyString_AS_STRING(tag); + if (checkstring(p, size)) { + value = PyUnicode_DecodeUTF8(p, size, "strict"); + Py_DECREF(tag); + if (!value) { + Py_DECREF(key); + return NULL; + } + } else +#endif + value = tag; /* use tag as is */ + + /* add to names dictionary */ + if (PyDict_SetItem(self->names, key, value) < 0) { + Py_DECREF(key); + Py_DECREF(value); + return NULL; + } + } + + Py_DECREF(key); + return value; +} + +/* -------------------------------------------------------------------- */ +/* handlers */ + +static void +expat_default_handler(XMLParserObject* self, const XML_Char* data_in, + int data_len) +{ + PyObject* key; + PyObject* value; + PyObject* res; + + if (data_len < 2 || data_in[0] != '&') + return; + + key = makestring(data_in + 1, data_len - 2); + if (!key) + return; + + value = PyDict_GetItem(self->entity, key); + + if (value) { + if (TreeBuilder_CheckExact(self->target)) + res = treebuilder_handle_data( + (TreeBuilderObject*) self->target, value + ); + else if (self->handle_data) + res = PyObject_CallFunction(self->handle_data, "O", value); + else + res = NULL; + Py_DECREF(value); + Py_XDECREF(res); + } else { + PyErr_Format( + PyExc_SyntaxError, "undefined entity &%s;: line %d, column %d", + PyString_AS_STRING(key), + EXPAT(GetErrorLineNumber)(self->parser), + EXPAT(GetErrorColumnNumber)(self->parser) + ); + } + + Py_DECREF(key); +} + +static void +expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, + const XML_Char **attrib_in) +{ + PyObject* res; + PyObject* tag; + PyObject* attrib; + int ok; + + /* tag name */ + tag = makeuniversal(self, tag_in); + if (!tag) + return; /* parser will look for errors */ + + /* attributes */ + if (attrib_in[0]) { + attrib = PyDict_New(); + if (!attrib) + return; + while (attrib_in[0] && attrib_in[1]) { + PyObject* key = makeuniversal(self, attrib_in[0]); + PyObject* value = makestring(attrib_in[1], strlen(attrib_in[1])); + if (!key || !value) { + Py_XDECREF(value); + Py_XDECREF(key); + Py_DECREF(attrib); + return; + } + ok = PyDict_SetItem(attrib, key, value); + Py_DECREF(value); + Py_DECREF(key); + if (ok < 0) { + Py_DECREF(attrib); + return; + } + attrib_in += 2; + } + } else { + Py_INCREF(Py_None); + attrib = Py_None; + } + + if (TreeBuilder_CheckExact(self->target)) + /* shortcut */ + res = treebuilder_handle_start((TreeBuilderObject*) self->target, + tag, attrib); + else if (self->handle_start) + res = PyObject_CallFunction(self->handle_start, "OO", tag, attrib); + else + res = NULL; + + Py_DECREF(tag); + Py_DECREF(attrib); + + Py_XDECREF(res); +} + +static void +expat_data_handler(XMLParserObject* self, const XML_Char* data_in, + int data_len) +{ + PyObject* data; + PyObject* res; + + data = makestring(data_in, data_len); + + if (TreeBuilder_CheckExact(self->target)) + /* shortcut */ + res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); + else if (self->handle_data) + res = PyObject_CallFunction(self->handle_data, "O", data); + else + res = NULL; + + Py_DECREF(data); + + Py_XDECREF(res); +} + +static void +expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) +{ + PyObject* tag; + PyObject* res = NULL; + + if (TreeBuilder_CheckExact(self->target)) + /* shortcut */ + /* the standard tree builder doesn't look at the end tag */ + res = treebuilder_handle_end( + (TreeBuilderObject*) self->target, Py_None + ); + else if (self->handle_end) { + tag = makeuniversal(self, tag_in); + if (tag) { + res = PyObject_CallFunction(self->handle_end, "O", tag); + Py_DECREF(tag); + } + } + + Py_XDECREF(res); +} + +static void +expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix, + const XML_Char *uri) +{ + treebuilder_handle_namespace( + (TreeBuilderObject*) self->target, 1, prefix, uri + ); +} + +static void +expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) +{ + treebuilder_handle_namespace( + (TreeBuilderObject*) self->target, 0, NULL, NULL + ); +} + +static void +expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) +{ + PyObject* comment; + PyObject* res; + + if (self->handle_comment) { + comment = makestring(comment_in, strlen(comment_in)); + if (comment) { + res = PyObject_CallFunction(self->handle_comment, "O", comment); + Py_XDECREF(res); + Py_DECREF(comment); + } + } +} + +static void +expat_pi_handler(XMLParserObject* self, const XML_Char* target_in, + const XML_Char* data_in) +{ + PyObject* target; + PyObject* data; + PyObject* res; + + if (self->handle_pi) { + target = makestring(target_in, strlen(target_in)); + data = makestring(data_in, strlen(data_in)); + if (target && data) { + res = PyObject_CallFunction(self->handle_pi, "OO", target, data); + Py_XDECREF(res); + Py_DECREF(data); + Py_DECREF(target); + } else { + Py_XDECREF(data); + Py_XDECREF(target); + } + } +} + +#if defined(Py_USING_UNICODE) +static int +expat_unknown_encoding_handler(XMLParserObject *self, const XML_Char *name, + XML_Encoding *info) +{ + PyObject* u; + Py_UNICODE* p; + unsigned char s[256]; + int i; + + memset(info, 0, sizeof(XML_Encoding)); + + for (i = 0; i < 256; i++) + s[i] = i; + + u = PyUnicode_Decode(s, 256, name, "replace"); + if (!u) + return XML_STATUS_ERROR; + + if (PyUnicode_GET_SIZE(u) != 256) { + Py_DECREF(u); + return XML_STATUS_ERROR; + } + + p = PyUnicode_AS_UNICODE(u); + + for (i = 0; i < 256; i++) { + if (p[i] != Py_UNICODE_REPLACEMENT_CHARACTER) + info->map[i] = p[i]; + else + info->map[i] = -1; + } + + Py_DECREF(u); + + return XML_STATUS_OK; +} +#endif + +/* -------------------------------------------------------------------- */ +/* constructor and destructor */ + +static PyObject* +xmlparser(PyObject* _self, PyObject* args, PyObject* kw) +{ + XMLParserObject* self; + /* FIXME: does this need to be static? */ + static XML_Memory_Handling_Suite memory_handler; + + PyObject* target = NULL; + char* encoding = NULL; + static PY_CONST char* kwlist[] = { "target", "encoding", NULL }; + if (!PyArg_ParseTupleAndKeywords(args, kw, "|Oz:XMLParser", kwlist, + &target, &encoding)) + return NULL; + +#if defined(USE_PYEXPAT_CAPI) + if (!expat_capi) { + PyErr_SetString( + PyExc_RuntimeError, "cannot load dispatch table from pyexpat" + ); + return NULL; + } +#endif + + self = PyObject_New(XMLParserObject, &XMLParser_Type); + if (self == NULL) + return NULL; + + self->entity = PyDict_New(); + if (!self->entity) { + PyObject_Del(self); + return NULL; /* FIXME: cleanup on error */ + } + + self->names = PyDict_New(); + if (!self->names) { + PyObject_Del(self); + return NULL; /* FIXME: cleanup on error */ + } + + memory_handler.malloc_fcn = PyObject_Malloc; + memory_handler.realloc_fcn = PyObject_Realloc; + memory_handler.free_fcn = PyObject_Free; + + self->parser = EXPAT(ParserCreate_MM)(encoding, &memory_handler, "}"); + if (!self->parser) { + PyErr_NoMemory(); + return NULL; /* FIXME: cleanup on error */ + } + + /* setup target handlers */ + if (!target) { + target = treebuilder_new(); + if (!target) { + PyObject_Del(self); + return NULL; /* FIXME: cleanup on error */ + } + } else + Py_INCREF(target); + self->target = target; + + self->handle_xml = PyObject_GetAttrString(target, "xml"); + self->handle_start = PyObject_GetAttrString(target, "start"); + self->handle_data = PyObject_GetAttrString(target, "data"); + self->handle_end = PyObject_GetAttrString(target, "end"); + self->handle_comment = PyObject_GetAttrString(target, "comment"); + self->handle_pi = PyObject_GetAttrString(target, "pi"); + + PyErr_Clear(); + + /* configure parser */ + EXPAT(SetUserData)(self->parser, self); + EXPAT(SetElementHandler)( + self->parser, + (XML_StartElementHandler) expat_start_handler, + (XML_EndElementHandler) expat_end_handler + ); + EXPAT(SetDefaultHandlerExpand)( + self->parser, + (XML_DefaultHandler) expat_default_handler + ); + EXPAT(SetCharacterDataHandler)( + self->parser, + (XML_CharacterDataHandler) expat_data_handler + ); + if (self->handle_comment) + EXPAT(SetCommentHandler)( + self->parser, + (XML_CommentHandler) expat_comment_handler + ); + if (self->handle_pi) + EXPAT(SetProcessingInstructionHandler)( + self->parser, + (XML_ProcessingInstructionHandler) expat_pi_handler + ); +#if defined(Py_USING_UNICODE) + EXPAT(SetUnknownEncodingHandler)( + self->parser, + (XML_UnknownEncodingHandler) expat_unknown_encoding_handler, NULL + ); +#endif + + ALLOC(sizeof(XMLParserObject), "create expatparser"); + + return (PyObject*) self; +} + +static void +xmlparser_dealloc(XMLParserObject* self) +{ + EXPAT(ParserFree)(self->parser); + + Py_XDECREF(self->handle_pi); + Py_XDECREF(self->handle_comment); + Py_XDECREF(self->handle_end); + Py_XDECREF(self->handle_data); + Py_XDECREF(self->handle_start); + Py_XDECREF(self->handle_xml); + + Py_DECREF(self->target); + Py_DECREF(self->entity); + Py_DECREF(self->names); + + RELEASE(sizeof(XMLParserObject), "destroy expatparser"); + + PyObject_Del(self); +} + +/* -------------------------------------------------------------------- */ +/* methods (in alphabetical order) */ + +LOCAL(PyObject*) +expat_parse(XMLParserObject* self, char* data, int data_len, int final) +{ + int ok; + + ok = EXPAT(Parse)(self->parser, data, data_len, final); + + if (PyErr_Occurred()) + return NULL; + + if (!ok) { + PyErr_Format( + PyExc_SyntaxError, "%s: line %d, column %d", + EXPAT(ErrorString)(EXPAT(GetErrorCode)(self->parser)), + EXPAT(GetErrorLineNumber)(self->parser), + EXPAT(GetErrorColumnNumber)(self->parser) + ); + return NULL; + } + + Py_RETURN_NONE; +} + +static PyObject* +xmlparser_close(XMLParserObject* self, PyObject* args) +{ + /* end feeding data to parser */ + + PyObject* res; + if (!PyArg_ParseTuple(args, ":close")) + return NULL; + + res = expat_parse(self, "", 0, 1); + + if (res && TreeBuilder_CheckExact(self->target)) { + Py_DECREF(res); + return treebuilder_done((TreeBuilderObject*) self->target); + } + + return res; +} + +static PyObject* +xmlparser_feed(XMLParserObject* self, PyObject* args) +{ + /* feed data to parser */ + + char* data; + int data_len; + if (!PyArg_ParseTuple(args, "s#:feed", &data, &data_len)) + return NULL; + + return expat_parse(self, data, data_len, 0); +} + +static PyObject* +xmlparser_parse(XMLParserObject* self, PyObject* args) +{ + /* (internal) parse until end of input stream */ + + PyObject* reader; + PyObject* buffer; + PyObject* res; + + PyObject* fileobj; + if (!PyArg_ParseTuple(args, "O:_parse", &fileobj)) + return NULL; + + reader = PyObject_GetAttrString(fileobj, "read"); + if (!reader) + return NULL; + + /* read from open file object */ + for (;;) { + + buffer = PyObject_CallFunction(reader, "i", 64*1024); + + if (!buffer) { + /* read failed (e.g. due to KeyboardInterrupt) */ + Py_DECREF(reader); + return NULL; + } + + if (!PyString_CheckExact(buffer) || PyString_GET_SIZE(buffer) == 0) { + Py_DECREF(buffer); + break; + } + + res = expat_parse( + self, PyString_AS_STRING(buffer), PyString_GET_SIZE(buffer), 0 + ); + + Py_DECREF(buffer); + + if (!res) { + Py_DECREF(reader); + return NULL; + } + Py_DECREF(res); + + } + + Py_DECREF(reader); + + res = expat_parse(self, "", 0, 1); + + if (res && TreeBuilder_CheckExact(self->target)) { + Py_DECREF(res); + return treebuilder_done((TreeBuilderObject*) self->target); + } + + return res; +} + +static PyObject* +xmlparser_setevents(XMLParserObject* self, PyObject* args) +{ + /* activate element event reporting */ + + int i; + TreeBuilderObject* target; + + PyObject* events; /* event collector */ + PyObject* event_set = Py_None; + if (!PyArg_ParseTuple(args, "O!|O:_setevents", &PyList_Type, &events, + &event_set)) + return NULL; + + if (!TreeBuilder_CheckExact(self->target)) { + PyErr_SetString( + PyExc_TypeError, + "event handling only supported for cElementTree.Treebuilder " + "targets" + ); + return NULL; + } + + target = (TreeBuilderObject*) self->target; + + Py_INCREF(events); + Py_XDECREF(target->events); + target->events = events; + + /* clear out existing events */ + Py_XDECREF(target->start_event_obj); target->start_event_obj = NULL; + Py_XDECREF(target->end_event_obj); target->end_event_obj = NULL; + Py_XDECREF(target->start_ns_event_obj); target->start_ns_event_obj = NULL; + Py_XDECREF(target->end_ns_event_obj); target->end_ns_event_obj = NULL; + + if (event_set == Py_None) { + /* default is "end" only */ + target->end_event_obj = PyString_FromString("end"); + Py_RETURN_NONE; + } + + if (!PyTuple_Check(event_set)) /* FIXME: handle arbitrary sequences */ + goto error; + + for (i = 0; i < PyTuple_GET_SIZE(event_set); i++) { + PyObject* item = PyTuple_GET_ITEM(event_set, i); + char* event; + if (!PyString_Check(item)) + goto error; + event = PyString_AS_STRING(item); + if (strcmp(event, "start") == 0) { + Py_INCREF(item); + target->start_event_obj = item; + } else if (strcmp(event, "end") == 0) { + Py_INCREF(item); + Py_XDECREF(target->end_event_obj); + target->end_event_obj = item; + } else if (strcmp(event, "start-ns") == 0) { + Py_INCREF(item); + Py_XDECREF(target->start_ns_event_obj); + target->start_ns_event_obj = item; + EXPAT(SetNamespaceDeclHandler)( + self->parser, + (XML_StartNamespaceDeclHandler) expat_start_ns_handler, + (XML_EndNamespaceDeclHandler) expat_end_ns_handler + ); + } else if (strcmp(event, "end-ns") == 0) { + Py_INCREF(item); + Py_XDECREF(target->end_ns_event_obj); + target->end_ns_event_obj = item; + EXPAT(SetNamespaceDeclHandler)( + self->parser, + (XML_StartNamespaceDeclHandler) expat_start_ns_handler, + (XML_EndNamespaceDeclHandler) expat_end_ns_handler + ); + } else { + PyErr_Format( + PyExc_ValueError, + "unknown event '%s'", event + ); + return NULL; + } + } + + Py_RETURN_NONE; + + error: + PyErr_SetString( + PyExc_TypeError, + "invalid event tuple" + ); + return NULL; +} + +static PyMethodDef xmlparser_methods[] = { + {"feed", (PyCFunction) xmlparser_feed, METH_VARARGS}, + {"close", (PyCFunction) xmlparser_close, METH_VARARGS}, + {"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS}, + {"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS}, + {NULL, NULL} +}; + +static PyObject* +xmlparser_getattr(XMLParserObject* self, char* name) +{ + PyObject* res; + + res = Py_FindMethod(xmlparser_methods, (PyObject*) self, name); + if (res) + return res; + + PyErr_Clear(); + + if (strcmp(name, "entity") == 0) + res = self->entity; + else if (strcmp(name, "target") == 0) + res = self->target; + else if (strcmp(name, "version") == 0) { + char buffer[100]; + sprintf(buffer, "Expat %d.%d.%d", XML_MAJOR_VERSION, + XML_MINOR_VERSION, XML_MICRO_VERSION); + return PyString_FromString(buffer); + } else { + PyErr_SetString(PyExc_AttributeError, name); + return NULL; + } + + Py_INCREF(res); + return res; +} + +statichere PyTypeObject XMLParser_Type = { + PyObject_HEAD_INIT(NULL) + 0, "XMLParser", sizeof(XMLParserObject), 0, + /* methods */ + (destructor)xmlparser_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)xmlparser_getattr, /* tp_getattr */ +}; + +#endif + +/* ==================================================================== */ +/* python module interface */ + +static PyMethodDef _functions[] = { + {"Element", (PyCFunction) element, METH_VARARGS|METH_KEYWORDS}, + {"SubElement", (PyCFunction) subelement, METH_VARARGS|METH_KEYWORDS}, + {"TreeBuilder", (PyCFunction) treebuilder, METH_VARARGS}, +#if defined(USE_EXPAT) + {"XMLParser", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS}, + {"XMLTreeBuilder", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS}, +#endif + {NULL, NULL} +}; + +DL_EXPORT(void) +initcElementTree(void) +{ + PyObject* m; + PyObject* g; + char* bootstrap; +#if defined(USE_PYEXPAT_CAPI) + struct PyExpat_CAPI* capi; +#endif + + /* Patch object type */ + Element_Type.ob_type = TreeBuilder_Type.ob_type = &PyType_Type; +#if defined(USE_EXPAT) + XMLParser_Type.ob_type = &PyType_Type; +#endif + + m = Py_InitModule("cElementTree", _functions); + + /* python glue code */ + + g = PyDict_New(); + + PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins()); + + bootstrap = ( + +#if (PY_VERSION_HEX >= 0x02020000 && PY_VERSION_HEX < 0x02030000) + "from __future__ import generators\n" /* enable yield under 2.2 */ +#endif + + "from copy import copy, deepcopy\n" + + "try:\n" + " from elementtree import ElementTree\n" + "except ImportError:\n" + " import ElementTree\n" + "ET = ElementTree\n" + "del ElementTree\n" + + "import cElementTree\n" + + "try:\n" /* check if copy works as is */ + " copy(cElementTree.Element('x'))\n" + "except:\n" + " def copyelement(elem):\n" + " return elem\n" + + "def Comment(text=None):\n" /* public */ + " element = cElementTree.Element(ET.Comment)\n" + " element.text = text\n" + " return element\n" + "cElementTree.Comment = Comment\n" + + "class ElementTree(ET.ElementTree):\n" /* public */ + " def parse(self, source, parser=None):\n" + " if not hasattr(source, 'read'):\n" + " source = open(source, 'rb')\n" + " if parser is not None:\n" + " while 1:\n" + " data = source.read(65536)\n" + " if not data:\n" + " break\n" + " parser.feed(data)\n" + " self._root = parser.close()\n" + " else:\n" + " parser = cElementTree.XMLParser()\n" + " self._root = parser._parse(source)\n" + " return self._root\n" + "cElementTree.ElementTree = ElementTree\n" + + "def getiterator(node, tag=None):\n" /* helper */ + " if tag == '*':\n" + " tag = None\n" +#if (PY_VERSION_HEX < 0x02020000) + " nodes = []\n" /* 2.1 doesn't have yield */ + " if tag is None or node.tag == tag:\n" + " nodes.append(node)\n" + " for node in node:\n" + " nodes.extend(getiterator(node, tag))\n" + " return nodes\n" +#else + " if tag is None or node.tag == tag:\n" + " yield node\n" + " for node in node:\n" + " for node in getiterator(node, tag):\n" + " yield node\n" +#endif + + "def parse(source, parser=None):\n" /* public */ + " tree = ElementTree()\n" + " tree.parse(source, parser)\n" + " return tree\n" + "cElementTree.parse = parse\n" + +#if (PY_VERSION_HEX < 0x02020000) + "if hasattr(ET, 'iterparse'):\n" + " cElementTree.iterparse = ET.iterparse\n" /* delegate on 2.1 */ +#else + "class iterparse(object):\n" + " root = None\n" + " def __init__(self, file, events=None):\n" + " if not hasattr(file, 'read'):\n" + " file = open(file, 'rb')\n" + " self._file = file\n" + " self._events = events\n" + " def __iter__(self):\n" + " events = []\n" + " b = cElementTree.TreeBuilder()\n" + " p = cElementTree.XMLParser(b)\n" + " p._setevents(events, self._events)\n" + " while 1:\n" + " data = self._file.read(16384)\n" + " if not data:\n" + " break\n" + " p.feed(data)\n" + " for event in events:\n" + " yield event\n" + " del events[:]\n" + " root = p.close()\n" + " for event in events:\n" + " yield event\n" + " self.root = root\n" + "cElementTree.iterparse = iterparse\n" +#endif + + "def PI(target, text=None):\n" /* public */ + " element = cElementTree.Element(ET.ProcessingInstruction)\n" + " element.text = target\n" + " if text:\n" + " element.text = element.text + ' ' + text\n" + " return element\n" + + " elem = cElementTree.Element(ET.PI)\n" + " elem.text = text\n" + " return elem\n" + "cElementTree.PI = cElementTree.ProcessingInstruction = PI\n" + + "def XML(text):\n" /* public */ + " parser = cElementTree.XMLParser()\n" + " parser.feed(text)\n" + " return parser.close()\n" + "cElementTree.XML = cElementTree.fromstring = XML\n" + + "def XMLID(text):\n" /* public */ + " tree = XML(text)\n" + " ids = {}\n" + " for elem in tree.getiterator():\n" + " id = elem.get('id')\n" + " if id:\n" + " ids[id] = elem\n" + " return tree, ids\n" + "cElementTree.XMLID = XMLID\n" + + "cElementTree.dump = ET.dump\n" + "cElementTree.ElementPath = ElementPath = ET.ElementPath\n" + "cElementTree.iselement = ET.iselement\n" + "cElementTree.QName = ET.QName\n" + "cElementTree.tostring = ET.tostring\n" + "cElementTree.VERSION = '" VERSION "'\n" + "cElementTree.__version__ = '" VERSION "'\n" + "cElementTree.XMLParserError = SyntaxError\n" + + ); + + PyRun_String(bootstrap, Py_file_input, g, NULL); + + elementpath_obj = PyDict_GetItemString(g, "ElementPath"); + + elementtree_copyelement_obj = PyDict_GetItemString(g, "copyelement"); + if (elementtree_copyelement_obj) { + /* reduce hack needed; enable reduce method */ + PyMethodDef* mp; + for (mp = element_methods; mp->ml_name; mp++) + if (mp->ml_meth == (PyCFunction) element_reduce) { + mp->ml_name = "__reduce__"; + break; + } + } else + PyErr_Clear(); + elementtree_deepcopy_obj = PyDict_GetItemString(g, "deepcopy"); + elementtree_getiterator_obj = PyDict_GetItemString(g, "getiterator"); + +#if defined(USE_PYEXPAT_CAPI) + /* link against pyexpat, if possible */ + capi = PyCObject_Import("pyexpat", "expat_CAPI"); + if (capi && + strcmp(capi->magic, PyExpat_CAPI_MAGIC) == 0 && + capi->size <= sizeof(*expat_capi) && + capi->MAJOR_VERSION == XML_MAJOR_VERSION && + capi->MINOR_VERSION == XML_MINOR_VERSION && + capi->MICRO_VERSION == XML_MICRO_VERSION) + expat_capi = capi; + else + expat_capi = NULL; +#endif + +} Added: external/celementtree-1.0.5-20051216/expat/ascii.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/ascii.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,85 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#define ASCII_A 0x41 +#define ASCII_B 0x42 +#define ASCII_C 0x43 +#define ASCII_D 0x44 +#define ASCII_E 0x45 +#define ASCII_F 0x46 +#define ASCII_G 0x47 +#define ASCII_H 0x48 +#define ASCII_I 0x49 +#define ASCII_J 0x4A +#define ASCII_K 0x4B +#define ASCII_L 0x4C +#define ASCII_M 0x4D +#define ASCII_N 0x4E +#define ASCII_O 0x4F +#define ASCII_P 0x50 +#define ASCII_Q 0x51 +#define ASCII_R 0x52 +#define ASCII_S 0x53 +#define ASCII_T 0x54 +#define ASCII_U 0x55 +#define ASCII_V 0x56 +#define ASCII_W 0x57 +#define ASCII_X 0x58 +#define ASCII_Y 0x59 +#define ASCII_Z 0x5A + +#define ASCII_a 0x61 +#define ASCII_b 0x62 +#define ASCII_c 0x63 +#define ASCII_d 0x64 +#define ASCII_e 0x65 +#define ASCII_f 0x66 +#define ASCII_g 0x67 +#define ASCII_h 0x68 +#define ASCII_i 0x69 +#define ASCII_j 0x6A +#define ASCII_k 0x6B +#define ASCII_l 0x6C +#define ASCII_m 0x6D +#define ASCII_n 0x6E +#define ASCII_o 0x6F +#define ASCII_p 0x70 +#define ASCII_q 0x71 +#define ASCII_r 0x72 +#define ASCII_s 0x73 +#define ASCII_t 0x74 +#define ASCII_u 0x75 +#define ASCII_v 0x76 +#define ASCII_w 0x77 +#define ASCII_x 0x78 +#define ASCII_y 0x79 +#define ASCII_z 0x7A + +#define ASCII_0 0x30 +#define ASCII_1 0x31 +#define ASCII_2 0x32 +#define ASCII_3 0x33 +#define ASCII_4 0x34 +#define ASCII_5 0x35 +#define ASCII_6 0x36 +#define ASCII_7 0x37 +#define ASCII_8 0x38 +#define ASCII_9 0x39 + +#define ASCII_TAB 0x09 +#define ASCII_SPACE 0x20 +#define ASCII_EXCL 0x21 +#define ASCII_QUOT 0x22 +#define ASCII_AMP 0x26 +#define ASCII_APOS 0x27 +#define ASCII_MINUS 0x2D +#define ASCII_PERIOD 0x2E +#define ASCII_COLON 0x3A +#define ASCII_SEMI 0x3B +#define ASCII_LT 0x3C +#define ASCII_EQUALS 0x3D +#define ASCII_GT 0x3E +#define ASCII_LSQB 0x5B +#define ASCII_RSQB 0x5D +#define ASCII_UNDERSCORE 0x5F Added: external/celementtree-1.0.5-20051216/expat/asciitab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/asciitab.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,36 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, +/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, +/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, +/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, +/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, +/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, +/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, +/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, +/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, +/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, +/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, Added: external/celementtree-1.0.5-20051216/expat/expat.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/expat.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,1004 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlParse_INCLUDED +#define XmlParse_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler +#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler +#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler +#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg +#endif + +#include +#include "expat_external.h" + +struct XML_ParserStruct; +typedef struct XML_ParserStruct *XML_Parser; + +/* Should this be defined using stdbool.h when C99 is available? */ +typedef unsigned char XML_Bool; +#define XML_TRUE ((XML_Bool) 1) +#define XML_FALSE ((XML_Bool) 0) + +/* The XML_Status enum gives the possible return values for several + API functions. The preprocessor #defines are included so this + stanza can be added to code that still needs to support older + versions of Expat 1.95.x: + + #ifndef XML_STATUS_OK + #define XML_STATUS_OK 1 + #define XML_STATUS_ERROR 0 + #endif + + Otherwise, the #define hackery is quite ugly and would have been + dropped. +*/ +enum XML_Status { + XML_STATUS_ERROR = 0, +#define XML_STATUS_ERROR XML_STATUS_ERROR + XML_STATUS_OK = 1, +#define XML_STATUS_OK XML_STATUS_OK + XML_STATUS_SUSPENDED = 2, +#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED +}; + +enum XML_Error { + XML_ERROR_NONE, + XML_ERROR_NO_MEMORY, + XML_ERROR_SYNTAX, + XML_ERROR_NO_ELEMENTS, + XML_ERROR_INVALID_TOKEN, + XML_ERROR_UNCLOSED_TOKEN, + XML_ERROR_PARTIAL_CHAR, + XML_ERROR_TAG_MISMATCH, + XML_ERROR_DUPLICATE_ATTRIBUTE, + XML_ERROR_JUNK_AFTER_DOC_ELEMENT, + XML_ERROR_PARAM_ENTITY_REF, + XML_ERROR_UNDEFINED_ENTITY, + XML_ERROR_RECURSIVE_ENTITY_REF, + XML_ERROR_ASYNC_ENTITY, + XML_ERROR_BAD_CHAR_REF, + XML_ERROR_BINARY_ENTITY_REF, + XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, + XML_ERROR_MISPLACED_XML_PI, + XML_ERROR_UNKNOWN_ENCODING, + XML_ERROR_INCORRECT_ENCODING, + XML_ERROR_UNCLOSED_CDATA_SECTION, + XML_ERROR_EXTERNAL_ENTITY_HANDLING, + XML_ERROR_NOT_STANDALONE, + XML_ERROR_UNEXPECTED_STATE, + XML_ERROR_ENTITY_DECLARED_IN_PE, + XML_ERROR_FEATURE_REQUIRES_XML_DTD, + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, + /* Added in 1.95.7. */ + XML_ERROR_UNBOUND_PREFIX, + /* Added in 1.95.8. */ + XML_ERROR_UNDECLARING_PREFIX, + XML_ERROR_INCOMPLETE_PE, + XML_ERROR_XML_DECL, + XML_ERROR_TEXT_DECL, + XML_ERROR_PUBLICID, + XML_ERROR_SUSPENDED, + XML_ERROR_NOT_SUSPENDED, + XML_ERROR_ABORTED, + XML_ERROR_FINISHED, + XML_ERROR_SUSPEND_PE +}; + +enum XML_Content_Type { + XML_CTYPE_EMPTY = 1, + XML_CTYPE_ANY, + XML_CTYPE_MIXED, + XML_CTYPE_NAME, + XML_CTYPE_CHOICE, + XML_CTYPE_SEQ +}; + +enum XML_Content_Quant { + XML_CQUANT_NONE, + XML_CQUANT_OPT, + XML_CQUANT_REP, + XML_CQUANT_PLUS +}; + +/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be + XML_CQUANT_NONE, and the other fields will be zero or NULL. + If type == XML_CTYPE_MIXED, then quant will be NONE or REP and + numchildren will contain number of elements that may be mixed in + and children point to an array of XML_Content cells that will be + all of XML_CTYPE_NAME type with no quantification. + + If type == XML_CTYPE_NAME, then the name points to the name, and + the numchildren field will be zero and children will be NULL. The + quant fields indicates any quantifiers placed on the name. + + CHOICE and SEQ will have name NULL, the number of children in + numchildren and children will point, recursively, to an array + of XML_Content cells. + + The EMPTY, ANY, and MIXED types will only occur at top level. +*/ + +typedef struct XML_cp XML_Content; + +struct XML_cp { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + XML_Char * name; + unsigned int numchildren; + XML_Content * children; +}; + + +/* This is called for an element declaration. See above for + description of the model argument. It's the caller's responsibility + to free model when finished with it. +*/ +typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, + const XML_Char *name, + XML_Content *model); + +XMLPARSEAPI(void) +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl); + +/* The Attlist declaration handler is called for *each* attribute. So + a single Attlist declaration with multiple attributes declared will + generate multiple calls to this handler. The "default" parameter + may be NULL in the case of the "#IMPLIED" or "#REQUIRED" + keyword. The "isrequired" parameter will be true and the default + value will be NULL in the case of "#REQUIRED". If "isrequired" is + true and default is non-NULL, then this is a "#FIXED" default. +*/ +typedef void (XMLCALL *XML_AttlistDeclHandler) ( + void *userData, + const XML_Char *elname, + const XML_Char *attname, + const XML_Char *att_type, + const XML_Char *dflt, + int isrequired); + +XMLPARSEAPI(void) +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl); + +/* The XML declaration handler is called for *both* XML declarations + and text declarations. The way to distinguish is that the version + parameter will be NULL for text declarations. The encoding + parameter may be NULL for XML declarations. The standalone + parameter will be -1, 0, or 1 indicating respectively that there + was no standalone parameter in the declaration, that it was given + as no, or that it was given as yes. +*/ +typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, + const XML_Char *version, + const XML_Char *encoding, + int standalone); + +XMLPARSEAPI(void) +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler xmldecl); + + +typedef struct { + void *(*malloc_fcn)(size_t size); + void *(*realloc_fcn)(void *ptr, size_t size); + void (*free_fcn)(void *ptr); +} XML_Memory_Handling_Suite; + +/* Constructs a new parser; encoding is the encoding specified by the + external protocol or NULL if there is none specified. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate(const XML_Char *encoding); + +/* Constructs a new parser and namespace processor. Element type + names and attribute names that belong to a namespace will be + expanded; unprefixed attribute names are never expanded; unprefixed + element type names are expanded only if there is a default + namespace. The expanded name is the concatenation of the namespace + URI, the namespace separator character, and the local part of the + name. If the namespace separator is '\0' then the namespace URI + and the local part will be concatenated without any separator. + When a namespace is not declared, the name and prefix will be + passed through without expansion. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); + + +/* Constructs a new parser using the memory management suite referred to + by memsuite. If memsuite is NULL, then use the standard library memory + suite. If namespaceSeparator is non-NULL it creates a parser with + namespace processing as described above. The character pointed at + will serve as the namespace separator. + + All further memory operations used for the created parser will come from + the given suite. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate_MM(const XML_Char *encoding, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + +/* Prepare a parser object to be re-used. This is particularly + valuable when memory allocation overhead is disproportionatly high, + such as when a large number of small documnents need to be parsed. + All handlers are cleared from the parser, except for the + unknownEncodingHandler. The parser's external state is re-initialized + except for the values of ns and ns_triplets. + + Added in Expat 1.95.3. +*/ +XMLPARSEAPI(XML_Bool) +XML_ParserReset(XML_Parser parser, const XML_Char *encoding); + +/* atts is array of name/value pairs, terminated by 0; + names and values are 0 terminated. +*/ +typedef void (XMLCALL *XML_StartElementHandler) (void *userData, + const XML_Char *name, + const XML_Char **atts); + +typedef void (XMLCALL *XML_EndElementHandler) (void *userData, + const XML_Char *name); + + +/* s is not 0 terminated. */ +typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, + const XML_Char *s, + int len); + +/* target and data are 0 terminated */ +typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( + void *userData, + const XML_Char *target, + const XML_Char *data); + +/* data is 0 terminated */ +typedef void (XMLCALL *XML_CommentHandler) (void *userData, + const XML_Char *data); + +typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); +typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); + +/* This is called for any characters in the XML document for which + there is no applicable handler. This includes both characters that + are part of markup which is of a kind that is not reported + (comments, markup declarations), or characters that are part of a + construct which could be reported but for which no handler has been + supplied. The characters are passed exactly as they were in the XML + document except that they will be encoded in UTF-8 or UTF-16. + Line boundaries are not normalized. Note that a byte order mark + character is not passed to the default handler. There are no + guarantees about how characters are divided between calls to the + default handler: for example, a comment might be split between + multiple calls. +*/ +typedef void (XMLCALL *XML_DefaultHandler) (void *userData, + const XML_Char *s, + int len); + +/* This is called for the start of the DOCTYPE declaration, before + any DTD or internal subset is parsed. +*/ +typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( + void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset); + +/* This is called for the start of the DOCTYPE declaration when the + closing > is encountered, but after processing any external + subset. +*/ +typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); + +/* This is called for entity declarations. The is_parameter_entity + argument will be non-zero if the entity is a parameter entity, zero + otherwise. + + For internal entities (), value will + be non-NULL and systemId, publicID, and notationName will be NULL. + The value string is NOT nul-terminated; the length is provided in + the value_length argument. Since it is legal to have zero-length + values, do not use this argument to test for internal entities. + + For external entities, value will be NULL and systemId will be + non-NULL. The publicId argument will be NULL unless a public + identifier was provided. The notationName argument will have a + non-NULL value only for unparsed entity declarations. + + Note that is_parameter_entity can't be changed to XML_Bool, since + that would break binary compatibility. +*/ +typedef void (XMLCALL *XML_EntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity, + const XML_Char *value, + int value_length, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +XMLPARSEAPI(void) +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler); + +/* OBSOLETE -- OBSOLETE -- OBSOLETE + This handler has been superceded by the EntityDeclHandler above. + It is provided here for backward compatibility. + + This is called for a declaration of an unparsed (NDATA) entity. + The base argument is whatever was set by XML_SetBase. The + entityName, systemId and notationName arguments will never be + NULL. The other arguments may be. +*/ +typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +/* This is called for a declaration of notation. The base argument is + whatever was set by XML_SetBase. The notationName will never be + NULL. The other arguments can be. +*/ +typedef void (XMLCALL *XML_NotationDeclHandler) ( + void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* When namespace processing is enabled, these are called once for + each namespace declaration. The call to the start and end element + handlers occur between the calls to the start and end namespace + declaration handlers. For an xmlns attribute, prefix will be + NULL. For an xmlns="" attribute, uri will be NULL. +*/ +typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix, + const XML_Char *uri); + +typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix); + +/* This is called if the document is not standalone, that is, it has an + external subset or a reference to a parameter entity, but does not + have standalone="yes". If this handler returns XML_STATUS_ERROR, + then processing will not continue, and the parser will return a + XML_ERROR_NOT_STANDALONE error. + If parameter entity parsing is enabled, then in addition to the + conditions above this handler will only be called if the referenced + entity was actually read. +*/ +typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); + +/* This is called for a reference to an external parsed general + entity. The referenced entity is not automatically parsed. The + application can parse it immediately or later using + XML_ExternalEntityParserCreate. + + The parser argument is the parser parsing the entity containing the + reference; it can be passed as the parser argument to + XML_ExternalEntityParserCreate. The systemId argument is the + system identifier as specified in the entity declaration; it will + not be NULL. + + The base argument is the system identifier that should be used as + the base for resolving systemId if systemId was relative; this is + set by XML_SetBase; it may be NULL. + + The publicId argument is the public identifier as specified in the + entity declaration, or NULL if none was specified; the whitespace + in the public identifier will have been normalized as required by + the XML spec. + + The context argument specifies the parsing context in the format + expected by the context argument to XML_ExternalEntityParserCreate; + context is valid only until the handler returns, so if the + referenced entity is to be parsed later, it must be copied. + context is NULL only when the entity is a parameter entity. + + The handler should return XML_STATUS_ERROR if processing should not + continue because of a fatal error in the handling of the external + entity. In this case the calling parser will return an + XML_ERROR_EXTERNAL_ENTITY_HANDLING error. + + Note that unlike other handlers the first argument is the parser, + not userData. +*/ +typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( + XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* This is called in two situations: + 1) An entity reference is encountered for which no declaration + has been read *and* this is not an error. + 2) An internal entity reference is read, but not expanded, because + XML_SetDefaultHandler has been called. + Note: skipped parameter entities in declarations and skipped general + entities in attribute values cannot be reported, because + the event would be out of sync with the reporting of the + declarations or attribute values +*/ +typedef void (XMLCALL *XML_SkippedEntityHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity); + +/* This structure is filled in by the XML_UnknownEncodingHandler to + provide information to the parser about encodings that are unknown + to the parser. + + The map[b] member gives information about byte sequences whose + first byte is b. + + If map[b] is c where c is >= 0, then b by itself encodes the + Unicode scalar value c. + + If map[b] is -1, then the byte sequence is malformed. + + If map[b] is -n, where n >= 2, then b is the first byte of an + n-byte sequence that encodes a single Unicode scalar value. + + The data member will be passed as the first argument to the convert + function. + + The convert function is used to convert multibyte sequences; s will + point to a n-byte sequence where map[(unsigned char)*s] == -n. The + convert function must return the Unicode scalar value represented + by this byte sequence or -1 if the byte sequence is malformed. + + The convert function may be NULL if the encoding is a single-byte + encoding, that is if map[b] >= -1 for all bytes b. + + When the parser is finished with the encoding, then if release is + not NULL, it will call release passing it the data member; once + release has been called, the convert function will not be called + again. + + Expat places certain restrictions on the encodings that are supported + using this mechanism. + + 1. Every ASCII character that can appear in a well-formed XML document, + other than the characters + + $@\^`{}~ + + must be represented by a single byte, and that byte must be the + same byte that represents that character in ASCII. + + 2. No character may require more than 4 bytes to encode. + + 3. All characters encoded must have Unicode scalar values <= + 0xFFFF, (i.e., characters that would be encoded by surrogates in + UTF-16 are not allowed). Note that this restriction doesn't + apply to the built-in support for UTF-8 and UTF-16. + + 4. No Unicode character may be encoded by more than one distinct + sequence of bytes. +*/ +typedef struct { + int map[256]; + void *data; + int (XMLCALL *convert)(void *data, const char *s); + void (XMLCALL *release)(void *data); +} XML_Encoding; + +/* This is called for an encoding that is unknown to the parser. + + The encodingHandlerData argument is that which was passed as the + second argument to XML_SetUnknownEncodingHandler. + + The name argument gives the name of the encoding as specified in + the encoding declaration. + + If the callback can provide information about the encoding, it must + fill in the XML_Encoding structure, and return XML_STATUS_OK. + Otherwise it must return XML_STATUS_ERROR. + + If info does not describe a suitable encoding, then the parser will + return an XML_UNKNOWN_ENCODING error. +*/ +typedef int (XMLCALL *XML_UnknownEncodingHandler) ( + void *encodingHandlerData, + const XML_Char *name, + XML_Encoding *info); + +XMLPARSEAPI(void) +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end); + +XMLPARSEAPI(void) +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler handler); + +XMLPARSEAPI(void) +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler handler); + +XMLPARSEAPI(void) +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler); + +XMLPARSEAPI(void) +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler); +XMLPARSEAPI(void) +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler); + +XMLPARSEAPI(void) +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end); + +XMLPARSEAPI(void) +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start); + +XMLPARSEAPI(void) +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end); + +/* This sets the default handler and also inhibits expansion of + internal entities. These entity references will be passed to the + default handler, or to the skipped entity handler, if one is set. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler); + +/* This sets the default handler but does not inhibit expansion of + internal entities. The entity reference will not be passed to the + default handler. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler); + +XMLPARSEAPI(void) +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler); + +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler); + +/* If a non-NULL value for arg is specified here, then it will be + passed as the first argument to the external entity ref handler + instead of the parser object. +*/ +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, + void *arg); + +XMLPARSEAPI(void) +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler); + +XMLPARSEAPI(void) +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + +/* This can be called within a handler for a start element, end + element, processing instruction or character data. It causes the + corresponding markup to be passed to the default handler. +*/ +XMLPARSEAPI(void) +XML_DefaultCurrent(XML_Parser parser); + +/* If do_nst is non-zero, and namespace processing is in effect, and + a name has a prefix (i.e. an explicit namespace qualifier) then + that name is returned as a triplet in a single string separated by + the separator character specified when the parser was created: URI + + sep + local_name + sep + prefix. + + If do_nst is zero, then namespace information is returned in the + default manner (URI + sep + local_name) whether or not the name + has a prefix. + + Note: Calling XML_SetReturnNSTriplet after XML_Parse or + XML_ParseBuffer has no effect. +*/ + +XMLPARSEAPI(void) +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); + +/* This value is passed as the userData argument to callbacks. */ +XMLPARSEAPI(void) +XML_SetUserData(XML_Parser parser, void *userData); + +/* Returns the last value set by XML_SetUserData or NULL. */ +#define XML_GetUserData(parser) (*(void **)(parser)) + +/* This is equivalent to supplying an encoding argument to + XML_ParserCreate. On success XML_SetEncoding returns non-zero, + zero otherwise. + Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer + has no effect and returns XML_STATUS_ERROR. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); + +/* If this function is called, then the parser will be passed as the + first argument to callbacks instead of userData. The userData will + still be accessible using XML_GetUserData. +*/ +XMLPARSEAPI(void) +XML_UseParserAsHandlerArg(XML_Parser parser); + +/* If useDTD == XML_TRUE is passed to this function, then the parser + will assume that there is an external subset, even if none is + specified in the document. In such a case the parser will call the + externalEntityRefHandler with a value of NULL for the systemId + argument (the publicId and context arguments will be NULL as well). + Note: For the purpose of checking WFC: Entity Declared, passing + useDTD == XML_TRUE will make the parser behave as if the document + had a DTD with an external subset. + Note: If this function is called, then this must be done before + the first call to XML_Parse or XML_ParseBuffer, since it will + have no effect after that. Returns + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. + Note: If the document does not have a DOCTYPE declaration at all, + then startDoctypeDeclHandler and endDoctypeDeclHandler will not + be called, despite an external subset being parsed. + Note: If XML_DTD is not defined when Expat is compiled, returns + XML_ERROR_FEATURE_REQUIRES_XML_DTD. +*/ +XMLPARSEAPI(enum XML_Error) +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); + + +/* Sets the base to be used for resolving relative URIs in system + identifiers in declarations. Resolving relative identifiers is + left to the application: this value will be passed through as the + base argument to the XML_ExternalEntityRefHandler, + XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base + argument will be copied. Returns XML_STATUS_ERROR if out of memory, + XML_STATUS_OK otherwise. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetBase(XML_Parser parser, const XML_Char *base); + +XMLPARSEAPI(const XML_Char *) +XML_GetBase(XML_Parser parser); + +/* Returns the number of the attribute/value pairs passed in last call + to the XML_StartElementHandler that were specified in the start-tag + rather than defaulted. Each attribute/value pair counts as 2; thus + this correspondds to an index into the atts array passed to the + XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetSpecifiedAttributeCount(XML_Parser parser); + +/* Returns the index of the ID attribute passed in the last call to + XML_StartElementHandler, or -1 if there is no ID attribute. Each + attribute/value pair counts as 2; thus this correspondds to an + index into the atts array passed to the XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetIdAttributeIndex(XML_Parser parser); + +/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is + detected. The last call to XML_Parse must have isFinal true; len + may be zero for this call (or any other). + + Though the return values for these functions has always been + described as a Boolean value, the implementation, at least for the + 1.95.x series, has always returned exactly one of the XML_Status + values. +*/ +XMLPARSEAPI(enum XML_Status) +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); + +XMLPARSEAPI(void *) +XML_GetBuffer(XML_Parser parser, int len); + +XMLPARSEAPI(enum XML_Status) +XML_ParseBuffer(XML_Parser parser, int len, int isFinal); + +/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. + Must be called from within a call-back handler, except when aborting + (resumable = 0) an already suspended parser. Some call-backs may + still follow because they would otherwise get lost. Examples: + - endElementHandler() for empty elements when stopped in + startElementHandler(), + - endNameSpaceDeclHandler() when stopped in endElementHandler(), + and possibly others. + + Can be called from most handlers, including DTD related call-backs, + except when parsing an external parameter entity and resumable != 0. + Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. + Possible error codes: + - XML_ERROR_SUSPENDED: when suspending an already suspended parser. + - XML_ERROR_FINISHED: when the parser has already finished. + - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. + + When resumable != 0 (true) then parsing is suspended, that is, + XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. + Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() + return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. + + *Note*: + This will be applied to the current parser instance only, that is, if + there is a parent parser then it will continue parsing when the + externalEntityRefHandler() returns. It is up to the implementation of + the externalEntityRefHandler() to call XML_StopParser() on the parent + parser (recursively), if one wants to stop parsing altogether. + + When suspended, parsing can be resumed by calling XML_ResumeParser(). +*/ +XMLPARSEAPI(enum XML_Status) +XML_StopParser(XML_Parser parser, XML_Bool resumable); + +/* Resumes parsing after it has been suspended with XML_StopParser(). + Must not be called from within a handler call-back. Returns same + status codes as XML_Parse() or XML_ParseBuffer(). + Additional error code XML_ERROR_NOT_SUSPENDED possible. + + *Note*: + This must be called on the most deeply nested child parser instance + first, and on its parent parser only after the child parser has finished, + to be applied recursively until the document entity's parser is restarted. + That is, the parent parser will not resume by itself and it is up to the + application to call XML_ResumeParser() on it at the appropriate moment. +*/ +XMLPARSEAPI(enum XML_Status) +XML_ResumeParser(XML_Parser parser); + +enum XML_Parsing { + XML_INITIALIZED, + XML_PARSING, + XML_FINISHED, + XML_SUSPENDED +}; + +typedef struct { + enum XML_Parsing parsing; + XML_Bool finalBuffer; +} XML_ParsingStatus; + +/* Returns status of parser with respect to being initialized, parsing, + finished, or suspended and processing the final buffer. + XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, + XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED +*/ +XMLPARSEAPI(void) +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); + +/* Creates an XML_Parser object that can parse an external general + entity; context is a '\0'-terminated string specifying the parse + context; encoding is a '\0'-terminated string giving the name of + the externally specified encoding, or NULL if there is no + externally specified encoding. The context string consists of a + sequence of tokens separated by formfeeds (\f); a token consisting + of a name specifies that the general entity of the name is open; a + token of the form prefix=uri specifies the namespace for a + particular prefix; a token of the form =uri specifies the default + namespace. This can be called at any point after the first call to + an ExternalEntityRefHandler so longer as the parser has not yet + been freed. The new parser is completely independent and may + safely be used in a separate thread. The handlers and userData are + initialized from the parser argument. Returns NULL if out of memory. + Otherwise returns a new XML_Parser object. +*/ +XMLPARSEAPI(XML_Parser) +XML_ExternalEntityParserCreate(XML_Parser parser, + const XML_Char *context, + const XML_Char *encoding); + +enum XML_ParamEntityParsing { + XML_PARAM_ENTITY_PARSING_NEVER, + XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, + XML_PARAM_ENTITY_PARSING_ALWAYS +}; + +/* Controls parsing of parameter entities (including the external DTD + subset). If parsing of parameter entities is enabled, then + references to external parameter entities (including the external + DTD subset) will be passed to the handler set with + XML_SetExternalEntityRefHandler. The context passed will be 0. + + Unlike external general entities, external parameter entities can + only be parsed synchronously. If the external parameter entity is + to be parsed, it must be parsed during the call to the external + entity ref handler: the complete sequence of + XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and + XML_ParserFree calls must be made during this call. After + XML_ExternalEntityParserCreate has been called to create the parser + for the external parameter entity (context must be 0 for this + call), it is illegal to make any calls on the old parser until + XML_ParserFree has been called on the newly created parser. + If the library has been compiled without support for parameter + entity parsing (ie without XML_DTD being defined), then + XML_SetParamEntityParsing will return 0 if parsing of parameter + entities is requested; otherwise it will return non-zero. + Note: If XML_SetParamEntityParsing is called after XML_Parse or + XML_ParseBuffer, then it has no effect and will always return 0. +*/ +XMLPARSEAPI(int) +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing parsing); + +/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then + XML_GetErrorCode returns information about the error. +*/ +XMLPARSEAPI(enum XML_Error) +XML_GetErrorCode(XML_Parser parser); + +/* These functions return information about the current parse + location. They may be called from any callback called to report + some parse event; in this case the location is the location of the + first of the sequence of characters that generated the event. When + called from callbacks generated by declarations in the document + prologue, the location identified isn't as neatly defined, but will + be within the relevant markup. When called outside of the callback + functions, the position indicated will be just past the last parse + event (regardless of whether there was an associated callback). + + They may also be called after returning from a call to XML_Parse + or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then + the location is the location of the character at which the error + was detected; otherwise the location is the location of the last + parse event, as described above. +*/ +XMLPARSEAPI(int) XML_GetCurrentLineNumber(XML_Parser parser); +XMLPARSEAPI(int) XML_GetCurrentColumnNumber(XML_Parser parser); +XMLPARSEAPI(long) XML_GetCurrentByteIndex(XML_Parser parser); + +/* Return the number of bytes in the current event. + Returns 0 if the event is in an internal entity. +*/ +XMLPARSEAPI(int) +XML_GetCurrentByteCount(XML_Parser parser); + +/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets + the integer pointed to by offset to the offset within this buffer + of the current parse position, and sets the integer pointed to by size + to the size of this buffer (the number of input bytes). Otherwise + returns a NULL pointer. Also returns a NULL pointer if a parse isn't + active. + + NOTE: The character pointer returned should not be used outside + the handler that makes the call. +*/ +XMLPARSEAPI(const char *) +XML_GetInputContext(XML_Parser parser, + int *offset, + int *size); + +/* For backwards compatibility with previous versions. */ +#define XML_GetErrorLineNumber XML_GetCurrentLineNumber +#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber +#define XML_GetErrorByteIndex XML_GetCurrentByteIndex + +/* Frees the content model passed to the element declaration handler */ +XMLPARSEAPI(void) +XML_FreeContentModel(XML_Parser parser, XML_Content *model); + +/* Exposing the memory handling functions used in Expat */ +XMLPARSEAPI(void *) +XML_MemMalloc(XML_Parser parser, size_t size); + +XMLPARSEAPI(void *) +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); + +XMLPARSEAPI(void) +XML_MemFree(XML_Parser parser, void *ptr); + +/* Frees memory used by the parser. */ +XMLPARSEAPI(void) +XML_ParserFree(XML_Parser parser); + +/* Returns a string describing the error. */ +XMLPARSEAPI(const XML_LChar *) +XML_ErrorString(enum XML_Error code); + +/* Return a string containing the version number of this expat */ +XMLPARSEAPI(const XML_LChar *) +XML_ExpatVersion(void); + +typedef struct { + int major; + int minor; + int micro; +} XML_Expat_Version; + +/* Return an XML_Expat_Version structure containing numeric version + number information for this version of expat. +*/ +XMLPARSEAPI(XML_Expat_Version) +XML_ExpatVersionInfo(void); + +/* Added in Expat 1.95.5. */ +enum XML_FeatureEnum { + XML_FEATURE_END = 0, + XML_FEATURE_UNICODE, + XML_FEATURE_UNICODE_WCHAR_T, + XML_FEATURE_DTD, + XML_FEATURE_CONTEXT_BYTES, + XML_FEATURE_MIN_SIZE, + XML_FEATURE_SIZEOF_XML_CHAR, + XML_FEATURE_SIZEOF_XML_LCHAR + /* Additional features must be added to the end of this enum. */ +}; + +typedef struct { + enum XML_FeatureEnum feature; + const XML_LChar *name; + long int value; +} XML_Feature; + +XMLPARSEAPI(const XML_Feature *) +XML_GetFeatureList(void); + + +/* Expat follows the GNU/Linux convention of odd number minor version for + beta/development releases and even number minor version for stable + releases. Micro is bumped with each release, and set to 0 with each + change to major or minor version. +*/ +#define XML_MAJOR_VERSION 1 +#define XML_MINOR_VERSION 95 +#define XML_MICRO_VERSION 8 + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlParse_INCLUDED */ Added: external/celementtree-1.0.5-20051216/expat/expat_external.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/expat_external.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,92 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* External API definitions */ + +#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) +#define XML_USE_MSC_EXTENSIONS 1 +#endif + +/* Expat tries very hard to make the API boundary very specifically + defined. There are two macros defined to control this boundary; + each of these can be defined before including this header to + achieve some different behavior, but doing so it not recommended or + tested frequently. + + XMLCALL - The calling convention to use for all calls across the + "library boundary." This will default to cdecl, and + try really hard to tell the compiler that's what we + want. + + XMLIMPORT - Whatever magic is needed to note that a function is + to be imported from a dynamically loaded library + (.dll, .so, or .sl, depending on your platform). + + The XMLCALL macro was added in Expat 1.95.7. The only one which is + expected to be directly useful in client code is XMLCALL. + + Note that on at least some Unix versions, the Expat library must be + compiled with the cdecl calling convention as the default since + system headers may assume the cdecl convention. +*/ +#ifndef XMLCALL +#if defined(XML_USE_MSC_EXTENSIONS) +#define XMLCALL __cdecl +#elif defined(__GNUC__) && defined(__i386) +#define XMLCALL __attribute__((cdecl)) +#else +/* For any platform which uses this definition and supports more than + one calling convention, we need to extend this definition to + declare the convention used on that platform, if it's possible to + do so. + + If this is the case for your platform, please file a bug report + with information on how to identify your platform via the C + pre-processor and how to specify the same calling convention as the + platform's malloc() implementation. +*/ +#define XMLCALL +#endif +#endif /* not defined XMLCALL */ + + +#if !defined(XML_STATIC) && !defined(XMLIMPORT) +#ifndef XML_BUILDING_EXPAT +/* using Expat from an application */ + +#ifdef XML_USE_MSC_EXTENSIONS +#define XMLIMPORT __declspec(dllimport) +#endif + +#endif +#endif /* not defined XML_STATIC */ + +/* If we didn't define it above, define it away: */ +#ifndef XMLIMPORT +#define XMLIMPORT +#endif + + +#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef XML_UNICODE_WCHAR_T +#define XML_UNICODE +#endif + +#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ +#ifdef XML_UNICODE_WCHAR_T +typedef wchar_t XML_Char; +typedef wchar_t XML_LChar; +#else +typedef unsigned short XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE_WCHAR_T */ +#else /* Information is UTF-8 encoded. */ +typedef char XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE */ Added: external/celementtree-1.0.5-20051216/expat/iasciitab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/iasciitab.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,37 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ +/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, +/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, +/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, +/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, +/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, +/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, +/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, +/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, +/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, +/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, +/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, Added: external/celementtree-1.0.5-20051216/expat/internal.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/internal.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,73 @@ +/* internal.h + + Internal definitions used by Expat. This is not needed to compile + client code. + + The following calling convention macros are defined for frequently + called functions: + + FASTCALL - Used for those internal functions that have a simple + body and a low number of arguments and local variables. + + PTRCALL - Used for functions called though function pointers. + + PTRFASTCALL - Like PTRCALL, but for low number of arguments. + + inline - Used for selected internal functions for which inlining + may improve performance on some platforms. + + Note: Use of these macros is based on judgement, not hard rules, + and therefore subject to change. +*/ + +#if defined(__GNUC__) && defined(__i386__) +/* We'll use this version by default only where we know it helps. + + regparm() generates warnings on Solaris boxes. See SF bug #692878. + + Instability reported with egcs on a RedHat Linux 7.3. + Let's comment out: + #define FASTCALL __attribute__((stdcall, regparm(3))) + and let's try this: +*/ +#define FASTCALL __attribute__((regparm(3))) +#define PTRFASTCALL __attribute__((regparm(3))) +#endif + +/* Using __fastcall seems to have an unexpected negative effect under + MS VC++, especially for function pointers, so we won't use it for + now on that platform. It may be reconsidered for a future release + if it can be made more effective. + Likely reason: __fastcall on Windows is like stdcall, therefore + the compiler cannot perform stack optimizations for call clusters. +*/ + +/* Make sure all of these are defined if they aren't already. */ + +#ifndef FASTCALL +#define FASTCALL +#endif + +#ifndef PTRCALL +#define PTRCALL +#endif + +#ifndef PTRFASTCALL +#define PTRFASTCALL +#endif + +#ifndef XML_MIN_SIZE +#if !defined(__cplusplus) && !defined(inline) +#ifdef __GNUC__ +#define inline __inline +#endif /* __GNUC__ */ +#endif +#endif /* XML_MIN_SIZE */ + +#ifdef __cplusplus +#define inline inline +#else +#ifndef inline +#define inline +#endif +#endif Added: external/celementtree-1.0.5-20051216/expat/latin1tab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/latin1tab.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,36 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, +/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, +/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, +/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, Added: external/celementtree-1.0.5-20051216/expat/macconfig.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/macconfig.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,53 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +** +*/ + +#ifndef MACCONFIG_H +#define MACCONFIG_H + + +/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ +#define BYTEORDER 4321 + +/* Define to 1 if you have the `bcopy' function. */ +#undef HAVE_BCOPY + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* whether byteorder is bigendian */ +#define WORDS_BIGENDIAN + +/* Define to specify how much context to retain around the current parse + point. */ +#undef XML_CONTEXT_BYTES + +/* Define to make parameter entity parsing functionality available. */ +#define XML_DTD + +/* Define to make XML Namespaces functionality available. */ +#define XML_NS + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `long' if does not define. */ +#define off_t long + +/* Define to `unsigned' if does not define. */ +#undef size_t + + +#endif /* ifndef MACCONFIG_H */ Added: external/celementtree-1.0.5-20051216/expat/nametab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/nametab.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,150 @@ +static const unsigned namingBitmap[] = { +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, +0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, +0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, +0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, +0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, +0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, +0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, +0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, +0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, +0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, +0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, +0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, +0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, +0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, +0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, +0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, +0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, +0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, +0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, +0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, +0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, +0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, +0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, +0x40000000, 0xF580C900, 0x00000007, 0x02010800, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, +0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, +0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, +0x00000000, 0x00004C40, 0x00000000, 0x00000000, +0x00000007, 0x00000000, 0x00000000, 0x00000000, +0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, +0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, +0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, +0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, +0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, +0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, +0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, +0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, +0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, +0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, +0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, +0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, +0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, +0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, +0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, +0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, +0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, +0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, +0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, +0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, +0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, +0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, +0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, +0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, +0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, +0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, +0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, +0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, +}; +static const unsigned char nmstrtPages[] = { +0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, +0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, +0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, +0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +static const unsigned char namePages[] = { +0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, +0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, +0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, +0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; Added: external/celementtree-1.0.5-20051216/expat/utf8tab.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/utf8tab.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,37 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + + +/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, +/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, Added: external/celementtree-1.0.5-20051216/expat/winconfig.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/winconfig.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,30 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +*/ + +#ifndef WINCONFIG_H +#define WINCONFIG_H + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + +#include +#include + +#define XML_NS 1 +#define XML_DTD 1 +#define XML_CONTEXT_BYTES 1024 + +/* we will assume all Windows platforms are little endian */ +#define BYTEORDER 1234 + +/* Windows has memmove() available. */ +#define HAVE_MEMMOVE + +#endif /* ndef WINCONFIG_H */ Added: external/celementtree-1.0.5-20051216/expat/xmlparse.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/xmlparse.c Fri Dec 16 23:02:39 2005 @@ -0,0 +1,6183 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include /* memset(), memcpy() */ +#include + +#define XML_BUILDING_EXPAT 1 + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#elif defined(HAVE_EXPAT_CONFIG_H) +#include +#endif /* ndef COMPILED_FROM_DSP */ + +#include "expat.h" + +#ifdef XML_UNICODE +#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX +#define XmlConvert XmlUtf16Convert +#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS +#define XmlEncode XmlUtf16Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) +typedef unsigned short ICHAR; +#else +#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX +#define XmlConvert XmlUtf8Convert +#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS +#define XmlEncode XmlUtf8Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) +typedef char ICHAR; +#endif + + +#ifndef XML_NS + +#define XmlInitEncodingNS XmlInitEncoding +#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding +#undef XmlGetInternalEncodingNS +#define XmlGetInternalEncodingNS XmlGetInternalEncoding +#define XmlParseXmlDeclNS XmlParseXmlDecl + +#endif + +#ifdef XML_UNICODE + +#ifdef XML_UNICODE_WCHAR_T +#define XML_T(x) (const wchar_t)x +#define XML_L(x) L ## x +#else +#define XML_T(x) (const unsigned short)x +#define XML_L(x) x +#endif + +#else + +#define XML_T(x) x +#define XML_L(x) x + +#endif + +/* Round up n to be a multiple of sz, where sz is a power of 2. */ +#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) + +/* Handle the case where memmove() doesn't exist. */ +#ifndef HAVE_MEMMOVE +#ifdef HAVE_BCOPY +#define memmove(d,s,l) bcopy((s),(d),(l)) +#else +#error memmove does not exist on this platform, nor is a substitute available +#endif /* HAVE_BCOPY */ +#endif /* HAVE_MEMMOVE */ + +#include "internal.h" +#include "xmltok.h" +#include "xmlrole.h" + +typedef const XML_Char *KEY; + +typedef struct { + KEY name; +} NAMED; + +typedef struct { + NAMED **v; + unsigned char power; + size_t size; + size_t used; + const XML_Memory_Handling_Suite *mem; +} HASH_TABLE; + +/* Basic character hash algorithm, taken from Python's string hash: + h = h * 1000003 ^ character, the constant being a prime number. + +*/ +#ifdef XML_UNICODE +#define CHAR_HASH(h, c) \ + (((h) * 0xF4243) ^ (unsigned short)(c)) +#else +#define CHAR_HASH(h, c) \ + (((h) * 0xF4243) ^ (unsigned char)(c)) +#endif + +/* For probing (after a collision) we need a step size relative prime + to the hash table size, which is a power of 2. We use double-hashing, + since we can calculate a second hash value cheaply by taking those bits + of the first hash value that were discarded (masked out) when the table + index was calculated: index = hash & mask, where mask = table->size - 1. + We limit the maximum step size to table->size / 4 (mask >> 2) and make + it odd, since odd numbers are always relative prime to a power of 2. +*/ +#define SECOND_HASH(hash, mask, power) \ + ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) +#define PROBE_STEP(hash, mask, power) \ + ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) + +typedef struct { + NAMED **p; + NAMED **end; +} HASH_TABLE_ITER; + +#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ +#define INIT_DATA_BUF_SIZE 1024 +#define INIT_ATTS_SIZE 16 +#define INIT_ATTS_VERSION 0xFFFFFFFF +#define INIT_BLOCK_SIZE 1024 +#define INIT_BUFFER_SIZE 1024 + +#define EXPAND_SPARE 24 + +typedef struct binding { + struct prefix *prefix; + struct binding *nextTagBinding; + struct binding *prevPrefixBinding; + const struct attribute_id *attId; + XML_Char *uri; + int uriLen; + int uriAlloc; +} BINDING; + +typedef struct prefix { + const XML_Char *name; + BINDING *binding; +} PREFIX; + +typedef struct { + const XML_Char *str; + const XML_Char *localPart; + const XML_Char *prefix; + int strLen; + int uriLen; + int prefixLen; +} TAG_NAME; + +/* TAG represents an open element. + The name of the element is stored in both the document and API + encodings. The memory buffer 'buf' is a separately-allocated + memory area which stores the name. During the XML_Parse()/ + XMLParseBuffer() when the element is open, the memory for the 'raw' + version of the name (in the document encoding) is shared with the + document buffer. If the element is open across calls to + XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to + contain the 'raw' name as well. + + A parser re-uses these structures, maintaining a list of allocated + TAG objects in a free list. +*/ +typedef struct tag { + struct tag *parent; /* parent of this element */ + const char *rawName; /* tagName in the original encoding */ + int rawNameLength; + TAG_NAME name; /* tagName in the API encoding */ + char *buf; /* buffer for name components */ + char *bufEnd; /* end of the buffer */ + BINDING *bindings; +} TAG; + +typedef struct { + const XML_Char *name; + const XML_Char *textPtr; + int textLen; /* length in XML_Chars */ + int processed; /* # of processed bytes - when suspended */ + const XML_Char *systemId; + const XML_Char *base; + const XML_Char *publicId; + const XML_Char *notation; + XML_Bool open; + XML_Bool is_param; + XML_Bool is_internal; /* true if declared in internal subset outside PE */ +} ENTITY; + +typedef struct { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + const XML_Char * name; + int firstchild; + int lastchild; + int childcnt; + int nextsib; +} CONTENT_SCAFFOLD; + +#define INIT_SCAFFOLD_ELEMENTS 32 + +typedef struct block { + struct block *next; + int size; + XML_Char s[1]; +} BLOCK; + +typedef struct { + BLOCK *blocks; + BLOCK *freeBlocks; + const XML_Char *end; + XML_Char *ptr; + XML_Char *start; + const XML_Memory_Handling_Suite *mem; +} STRING_POOL; + +/* The XML_Char before the name is used to determine whether + an attribute has been specified. */ +typedef struct attribute_id { + XML_Char *name; + PREFIX *prefix; + XML_Bool maybeTokenized; + XML_Bool xmlns; +} ATTRIBUTE_ID; + +typedef struct { + const ATTRIBUTE_ID *id; + XML_Bool isCdata; + const XML_Char *value; +} DEFAULT_ATTRIBUTE; + +typedef struct { + unsigned long version; + unsigned long hash; + const XML_Char *uriName; +} NS_ATT; + +typedef struct { + const XML_Char *name; + PREFIX *prefix; + const ATTRIBUTE_ID *idAtt; + int nDefaultAtts; + int allocDefaultAtts; + DEFAULT_ATTRIBUTE *defaultAtts; +} ELEMENT_TYPE; + +typedef struct { + HASH_TABLE generalEntities; + HASH_TABLE elementTypes; + HASH_TABLE attributeIds; + HASH_TABLE prefixes; + STRING_POOL pool; + STRING_POOL entityValuePool; + /* false once a parameter entity reference has been skipped */ + XML_Bool keepProcessing; + /* true once an internal or external PE reference has been encountered; + this includes the reference to an external subset */ + XML_Bool hasParamEntityRefs; + XML_Bool standalone; +#ifdef XML_DTD + /* indicates if external PE has been read */ + XML_Bool paramEntityRead; + HASH_TABLE paramEntities; +#endif /* XML_DTD */ + PREFIX defaultPrefix; + /* === scaffolding for building content model === */ + XML_Bool in_eldecl; + CONTENT_SCAFFOLD *scaffold; + unsigned contentStringLen; + unsigned scaffSize; + unsigned scaffCount; + int scaffLevel; + int *scaffIndex; +} DTD; + +typedef struct open_internal_entity { + const char *internalEventPtr; + const char *internalEventEndPtr; + struct open_internal_entity *next; + ENTITY *entity; + int startTagLevel; + XML_Bool betweenDecl; /* WFC: PE Between Declarations */ +} OPEN_INTERNAL_ENTITY; + +typedef enum XML_Error PTRCALL Processor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr); + +static Processor prologProcessor; +static Processor prologInitProcessor; +static Processor contentProcessor; +static Processor cdataSectionProcessor; +#ifdef XML_DTD +static Processor ignoreSectionProcessor; +static Processor externalParEntProcessor; +static Processor externalParEntInitProcessor; +static Processor entityValueProcessor; +static Processor entityValueInitProcessor; +#endif /* XML_DTD */ +static Processor epilogProcessor; +static Processor errorProcessor; +static Processor externalEntityInitProcessor; +static Processor externalEntityInitProcessor2; +static Processor externalEntityInitProcessor3; +static Processor externalEntityContentProcessor; +static Processor internalEntityProcessor; + +static enum XML_Error +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); +static enum XML_Error +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next); +static enum XML_Error +initializeEncoding(XML_Parser parser); +static enum XML_Error +doProlog(XML_Parser parser, const ENCODING *enc, const char *s, + const char *end, int tok, const char *next, const char **nextPtr, + XML_Bool haveMore); +static enum XML_Error +processInternalEntity(XML_Parser parser, ENTITY *entity, + XML_Bool betweenDecl); +static enum XML_Error +doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + const char *start, const char *end, const char **endPtr, + XML_Bool haveMore); +static enum XML_Error +doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, + const char *end, const char **nextPtr, XML_Bool haveMore); +#ifdef XML_DTD +static enum XML_Error +doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, + const char *end, const char **nextPtr, XML_Bool haveMore); +#endif /* XML_DTD */ + +static enum XML_Error +storeAtts(XML_Parser parser, const ENCODING *, const char *s, + TAG_NAME *tagNamePtr, BINDING **bindingsPtr); +static enum XML_Error +addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, + const XML_Char *uri, BINDING **bindingsPtr); +static int +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, + XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); +static enum XML_Error +storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, + const char *, const char *, STRING_POOL *); +static enum XML_Error +appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, + const char *, const char *, STRING_POOL *); +static ATTRIBUTE_ID * +getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static int +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); +static enum XML_Error +storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static int +reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); +static int +reportComment(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static void +reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); + +static const XML_Char * getContext(XML_Parser parser); +static XML_Bool +setContext(XML_Parser parser, const XML_Char *context); + +static void FASTCALL normalizePublicId(XML_Char *s); + +static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); +/* do not call if parentParser != NULL */ +static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); +static void +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); +static int +dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); +static int +copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); + +static NAMED * +lookup(HASH_TABLE *table, KEY name, size_t createSize); +static void FASTCALL +hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL hashTableClear(HASH_TABLE *); +static void FASTCALL hashTableDestroy(HASH_TABLE *); +static void FASTCALL +hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); +static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); + +static void FASTCALL +poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL poolClear(STRING_POOL *); +static void FASTCALL poolDestroy(STRING_POOL *); +static XML_Char * +poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Char * +poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); +static const XML_Char * FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s); +static const XML_Char * +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); +static const XML_Char * FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s); + +static int FASTCALL nextScaffoldPart(XML_Parser parser); +static XML_Content * build_model(XML_Parser parser); +static ELEMENT_TYPE * +getElementType(XML_Parser parser, const ENCODING *enc, + const char *ptr, const char *end); + +static XML_Parser +parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, + DTD *dtd); +static void +parserInit(XML_Parser parser, const XML_Char *encodingName); + +#define poolStart(pool) ((pool)->start) +#define poolEnd(pool) ((pool)->ptr) +#define poolLength(pool) ((pool)->ptr - (pool)->start) +#define poolChop(pool) ((void)--(pool->ptr)) +#define poolLastChar(pool) (((pool)->ptr)[-1]) +#define poolDiscard(pool) ((pool)->ptr = (pool)->start) +#define poolFinish(pool) ((pool)->start = (pool)->ptr) +#define poolAppendChar(pool, c) \ + (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ + ? 0 \ + : ((*((pool)->ptr)++ = c), 1)) + +struct XML_ParserStruct { + /* The first member must be userData so that the XML_GetUserData + macro works. */ + void *m_userData; + void *m_handlerArg; + char *m_buffer; + const XML_Memory_Handling_Suite m_mem; + /* first character to be parsed */ + const char *m_bufferPtr; + /* past last character to be parsed */ + char *m_bufferEnd; + /* allocated end of buffer */ + const char *m_bufferLim; + long m_parseEndByteIndex; + const char *m_parseEndPtr; + XML_Char *m_dataBuf; + XML_Char *m_dataBufEnd; + XML_StartElementHandler m_startElementHandler; + XML_EndElementHandler m_endElementHandler; + XML_CharacterDataHandler m_characterDataHandler; + XML_ProcessingInstructionHandler m_processingInstructionHandler; + XML_CommentHandler m_commentHandler; + XML_StartCdataSectionHandler m_startCdataSectionHandler; + XML_EndCdataSectionHandler m_endCdataSectionHandler; + XML_DefaultHandler m_defaultHandler; + XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; + XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; + XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; + XML_NotationDeclHandler m_notationDeclHandler; + XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; + XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; + XML_NotStandaloneHandler m_notStandaloneHandler; + XML_ExternalEntityRefHandler m_externalEntityRefHandler; + XML_Parser m_externalEntityRefHandlerArg; + XML_SkippedEntityHandler m_skippedEntityHandler; + XML_UnknownEncodingHandler m_unknownEncodingHandler; + XML_ElementDeclHandler m_elementDeclHandler; + XML_AttlistDeclHandler m_attlistDeclHandler; + XML_EntityDeclHandler m_entityDeclHandler; + XML_XmlDeclHandler m_xmlDeclHandler; + const ENCODING *m_encoding; + INIT_ENCODING m_initEncoding; + const ENCODING *m_internalEncoding; + const XML_Char *m_protocolEncodingName; + XML_Bool m_ns; + XML_Bool m_ns_triplets; + void *m_unknownEncodingMem; + void *m_unknownEncodingData; + void *m_unknownEncodingHandlerData; + void (XMLCALL *m_unknownEncodingRelease)(void *); + PROLOG_STATE m_prologState; + Processor *m_processor; + enum XML_Error m_errorCode; + const char *m_eventPtr; + const char *m_eventEndPtr; + const char *m_positionPtr; + OPEN_INTERNAL_ENTITY *m_openInternalEntities; + OPEN_INTERNAL_ENTITY *m_freeInternalEntities; + XML_Bool m_defaultExpandInternalEntities; + int m_tagLevel; + ENTITY *m_declEntity; + const XML_Char *m_doctypeName; + const XML_Char *m_doctypeSysid; + const XML_Char *m_doctypePubid; + const XML_Char *m_declAttributeType; + const XML_Char *m_declNotationName; + const XML_Char *m_declNotationPublicId; + ELEMENT_TYPE *m_declElementType; + ATTRIBUTE_ID *m_declAttributeId; + XML_Bool m_declAttributeIsCdata; + XML_Bool m_declAttributeIsId; + DTD *m_dtd; + const XML_Char *m_curBase; + TAG *m_tagStack; + TAG *m_freeTagList; + BINDING *m_inheritedBindings; + BINDING *m_freeBindingList; + int m_attsSize; + int m_nSpecifiedAtts; + int m_idAttIndex; + ATTRIBUTE *m_atts; + NS_ATT *m_nsAtts; + unsigned long m_nsAttsVersion; + unsigned char m_nsAttsPower; + POSITION m_position; + STRING_POOL m_tempPool; + STRING_POOL m_temp2Pool; + char *m_groupConnector; + unsigned int m_groupSize; + XML_Char m_namespaceSeparator; + XML_Parser m_parentParser; + XML_ParsingStatus m_parsingStatus; +#ifdef XML_DTD + XML_Bool m_isParamEntity; + XML_Bool m_useForeignDTD; + enum XML_ParamEntityParsing m_paramEntityParsing; +#endif +}; + +#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) +#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) +#define FREE(p) (parser->m_mem.free_fcn((p))) + +#define userData (parser->m_userData) +#define handlerArg (parser->m_handlerArg) +#define startElementHandler (parser->m_startElementHandler) +#define endElementHandler (parser->m_endElementHandler) +#define characterDataHandler (parser->m_characterDataHandler) +#define processingInstructionHandler \ + (parser->m_processingInstructionHandler) +#define commentHandler (parser->m_commentHandler) +#define startCdataSectionHandler \ + (parser->m_startCdataSectionHandler) +#define endCdataSectionHandler (parser->m_endCdataSectionHandler) +#define defaultHandler (parser->m_defaultHandler) +#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) +#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) +#define unparsedEntityDeclHandler \ + (parser->m_unparsedEntityDeclHandler) +#define notationDeclHandler (parser->m_notationDeclHandler) +#define startNamespaceDeclHandler \ + (parser->m_startNamespaceDeclHandler) +#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) +#define notStandaloneHandler (parser->m_notStandaloneHandler) +#define externalEntityRefHandler \ + (parser->m_externalEntityRefHandler) +#define externalEntityRefHandlerArg \ + (parser->m_externalEntityRefHandlerArg) +#define internalEntityRefHandler \ + (parser->m_internalEntityRefHandler) +#define skippedEntityHandler (parser->m_skippedEntityHandler) +#define unknownEncodingHandler (parser->m_unknownEncodingHandler) +#define elementDeclHandler (parser->m_elementDeclHandler) +#define attlistDeclHandler (parser->m_attlistDeclHandler) +#define entityDeclHandler (parser->m_entityDeclHandler) +#define xmlDeclHandler (parser->m_xmlDeclHandler) +#define encoding (parser->m_encoding) +#define initEncoding (parser->m_initEncoding) +#define internalEncoding (parser->m_internalEncoding) +#define unknownEncodingMem (parser->m_unknownEncodingMem) +#define unknownEncodingData (parser->m_unknownEncodingData) +#define unknownEncodingHandlerData \ + (parser->m_unknownEncodingHandlerData) +#define unknownEncodingRelease (parser->m_unknownEncodingRelease) +#define protocolEncodingName (parser->m_protocolEncodingName) +#define ns (parser->m_ns) +#define ns_triplets (parser->m_ns_triplets) +#define prologState (parser->m_prologState) +#define processor (parser->m_processor) +#define errorCode (parser->m_errorCode) +#define eventPtr (parser->m_eventPtr) +#define eventEndPtr (parser->m_eventEndPtr) +#define positionPtr (parser->m_positionPtr) +#define position (parser->m_position) +#define openInternalEntities (parser->m_openInternalEntities) +#define freeInternalEntities (parser->m_freeInternalEntities) +#define defaultExpandInternalEntities \ + (parser->m_defaultExpandInternalEntities) +#define tagLevel (parser->m_tagLevel) +#define buffer (parser->m_buffer) +#define bufferPtr (parser->m_bufferPtr) +#define bufferEnd (parser->m_bufferEnd) +#define parseEndByteIndex (parser->m_parseEndByteIndex) +#define parseEndPtr (parser->m_parseEndPtr) +#define bufferLim (parser->m_bufferLim) +#define dataBuf (parser->m_dataBuf) +#define dataBufEnd (parser->m_dataBufEnd) +#define _dtd (parser->m_dtd) +#define curBase (parser->m_curBase) +#define declEntity (parser->m_declEntity) +#define doctypeName (parser->m_doctypeName) +#define doctypeSysid (parser->m_doctypeSysid) +#define doctypePubid (parser->m_doctypePubid) +#define declAttributeType (parser->m_declAttributeType) +#define declNotationName (parser->m_declNotationName) +#define declNotationPublicId (parser->m_declNotationPublicId) +#define declElementType (parser->m_declElementType) +#define declAttributeId (parser->m_declAttributeId) +#define declAttributeIsCdata (parser->m_declAttributeIsCdata) +#define declAttributeIsId (parser->m_declAttributeIsId) +#define freeTagList (parser->m_freeTagList) +#define freeBindingList (parser->m_freeBindingList) +#define inheritedBindings (parser->m_inheritedBindings) +#define tagStack (parser->m_tagStack) +#define atts (parser->m_atts) +#define attsSize (parser->m_attsSize) +#define nSpecifiedAtts (parser->m_nSpecifiedAtts) +#define idAttIndex (parser->m_idAttIndex) +#define nsAtts (parser->m_nsAtts) +#define nsAttsVersion (parser->m_nsAttsVersion) +#define nsAttsPower (parser->m_nsAttsPower) +#define tempPool (parser->m_tempPool) +#define temp2Pool (parser->m_temp2Pool) +#define groupConnector (parser->m_groupConnector) +#define groupSize (parser->m_groupSize) +#define namespaceSeparator (parser->m_namespaceSeparator) +#define parentParser (parser->m_parentParser) +#define parsing (parser->m_parsingStatus.parsing) +#define finalBuffer (parser->m_parsingStatus.finalBuffer) +#ifdef XML_DTD +#define isParamEntity (parser->m_isParamEntity) +#define useForeignDTD (parser->m_useForeignDTD) +#define paramEntityParsing (parser->m_paramEntityParsing) +#endif /* XML_DTD */ + +XML_Parser XMLCALL +XML_ParserCreate(const XML_Char *encodingName) +{ + return XML_ParserCreate_MM(encodingName, NULL, NULL); +} + +XML_Parser XMLCALL +XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) +{ + XML_Char tmp[2]; + *tmp = nsSep; + return XML_ParserCreate_MM(encodingName, NULL, tmp); +} + +static const XML_Char implicitContext[] = { + 'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/', + 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/', + 'X', 'M', 'L', '/', '1', '9', '9', '8', '/', + 'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0' +}; + +XML_Parser XMLCALL +XML_ParserCreate_MM(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep) +{ + XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL); + if (parser != NULL && ns) { + /* implicit context only set for root parser, since child + parsers (i.e. external entity parsers) will inherit it + */ + if (!setContext(parser, implicitContext)) { + XML_ParserFree(parser); + return NULL; + } + } + return parser; +} + +static XML_Parser +parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, + DTD *dtd) +{ + XML_Parser parser; + + if (memsuite) { + XML_Memory_Handling_Suite *mtemp; + parser = (XML_Parser) + memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); + if (parser != NULL) { + mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); + mtemp->malloc_fcn = memsuite->malloc_fcn; + mtemp->realloc_fcn = memsuite->realloc_fcn; + mtemp->free_fcn = memsuite->free_fcn; + } + } + else { + XML_Memory_Handling_Suite *mtemp; + parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); + if (parser != NULL) { + mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); + mtemp->malloc_fcn = malloc; + mtemp->realloc_fcn = realloc; + mtemp->free_fcn = free; + } + } + + if (!parser) + return parser; + + buffer = NULL; + bufferLim = NULL; + + attsSize = INIT_ATTS_SIZE; + atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); + if (atts == NULL) { + FREE(parser); + return NULL; + } + dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); + if (dataBuf == NULL) { + FREE(atts); + FREE(parser); + return NULL; + } + dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; + + if (dtd) + _dtd = dtd; + else { + _dtd = dtdCreate(&parser->m_mem); + if (_dtd == NULL) { + FREE(dataBuf); + FREE(atts); + FREE(parser); + return NULL; + } + } + + freeBindingList = NULL; + freeTagList = NULL; + freeInternalEntities = NULL; + + groupSize = 0; + groupConnector = NULL; + + unknownEncodingHandler = NULL; + unknownEncodingHandlerData = NULL; + + namespaceSeparator = '!'; + ns = XML_FALSE; + ns_triplets = XML_FALSE; + + nsAtts = NULL; + nsAttsVersion = 0; + nsAttsPower = 0; + + poolInit(&tempPool, &(parser->m_mem)); + poolInit(&temp2Pool, &(parser->m_mem)); + parserInit(parser, encodingName); + + if (encodingName && !protocolEncodingName) { + XML_ParserFree(parser); + return NULL; + } + + if (nameSep) { + ns = XML_TRUE; + internalEncoding = XmlGetInternalEncodingNS(); + namespaceSeparator = *nameSep; + } + else { + internalEncoding = XmlGetInternalEncoding(); + } + + return parser; +} + +static void +parserInit(XML_Parser parser, const XML_Char *encodingName) +{ + processor = prologInitProcessor; + XmlPrologStateInit(&prologState); + protocolEncodingName = (encodingName != NULL + ? poolCopyString(&tempPool, encodingName) + : NULL); + curBase = NULL; + XmlInitEncoding(&initEncoding, &encoding, 0); + userData = NULL; + handlerArg = NULL; + startElementHandler = NULL; + endElementHandler = NULL; + characterDataHandler = NULL; + processingInstructionHandler = NULL; + commentHandler = NULL; + startCdataSectionHandler = NULL; + endCdataSectionHandler = NULL; + defaultHandler = NULL; + startDoctypeDeclHandler = NULL; + endDoctypeDeclHandler = NULL; + unparsedEntityDeclHandler = NULL; + notationDeclHandler = NULL; + startNamespaceDeclHandler = NULL; + endNamespaceDeclHandler = NULL; + notStandaloneHandler = NULL; + externalEntityRefHandler = NULL; + externalEntityRefHandlerArg = parser; + skippedEntityHandler = NULL; + elementDeclHandler = NULL; + attlistDeclHandler = NULL; + entityDeclHandler = NULL; + xmlDeclHandler = NULL; + bufferPtr = buffer; + bufferEnd = buffer; + parseEndByteIndex = 0; + parseEndPtr = NULL; + declElementType = NULL; + declAttributeId = NULL; + declEntity = NULL; + doctypeName = NULL; + doctypeSysid = NULL; + doctypePubid = NULL; + declAttributeType = NULL; + declNotationName = NULL; + declNotationPublicId = NULL; + declAttributeIsCdata = XML_FALSE; + declAttributeIsId = XML_FALSE; + memset(&position, 0, sizeof(POSITION)); + errorCode = XML_ERROR_NONE; + eventPtr = NULL; + eventEndPtr = NULL; + positionPtr = NULL; + openInternalEntities = NULL; + defaultExpandInternalEntities = XML_TRUE; + tagLevel = 0; + tagStack = NULL; + inheritedBindings = NULL; + nSpecifiedAtts = 0; + unknownEncodingMem = NULL; + unknownEncodingRelease = NULL; + unknownEncodingData = NULL; + parentParser = NULL; + parsing = XML_INITIALIZED; +#ifdef XML_DTD + isParamEntity = XML_FALSE; + useForeignDTD = XML_FALSE; + paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; +#endif +} + +/* moves list of bindings to freeBindingList */ +static void FASTCALL +moveToFreeBindingList(XML_Parser parser, BINDING *bindings) +{ + while (bindings) { + BINDING *b = bindings; + bindings = bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + } +} + +XML_Bool XMLCALL +XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) +{ + TAG *tStk; + OPEN_INTERNAL_ENTITY *openEntityList; + if (parentParser) + return XML_FALSE; + /* move tagStack to freeTagList */ + tStk = tagStack; + while (tStk) { + TAG *tag = tStk; + tStk = tStk->parent; + tag->parent = freeTagList; + moveToFreeBindingList(parser, tag->bindings); + tag->bindings = NULL; + freeTagList = tag; + } + /* move openInternalEntities to freeInternalEntities */ + openEntityList = openInternalEntities; + while (openEntityList) { + OPEN_INTERNAL_ENTITY *openEntity = openEntityList; + openEntityList = openEntity->next; + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + moveToFreeBindingList(parser, inheritedBindings); + FREE(unknownEncodingMem); + if (unknownEncodingRelease) + unknownEncodingRelease(unknownEncodingData); + poolClear(&tempPool); + poolClear(&temp2Pool); + parserInit(parser, encodingName); + dtdReset(_dtd, &parser->m_mem); + return setContext(parser, implicitContext); +} + +enum XML_Status XMLCALL +XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) +{ + /* Block after XML_Parse()/XML_ParseBuffer() has been called. + XXX There's no way for the caller to determine which of the + XXX possible error cases caused the XML_STATUS_ERROR return. + */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return XML_STATUS_ERROR; + if (encodingName == NULL) + protocolEncodingName = NULL; + else { + protocolEncodingName = poolCopyString(&tempPool, encodingName); + if (!protocolEncodingName) + return XML_STATUS_ERROR; + } + return XML_STATUS_OK; +} + +XML_Parser XMLCALL +XML_ExternalEntityParserCreate(XML_Parser oldParser, + const XML_Char *context, + const XML_Char *encodingName) +{ + XML_Parser parser = oldParser; + DTD *newDtd = NULL; + DTD *oldDtd = _dtd; + XML_StartElementHandler oldStartElementHandler = startElementHandler; + XML_EndElementHandler oldEndElementHandler = endElementHandler; + XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; + XML_ProcessingInstructionHandler oldProcessingInstructionHandler + = processingInstructionHandler; + XML_CommentHandler oldCommentHandler = commentHandler; + XML_StartCdataSectionHandler oldStartCdataSectionHandler + = startCdataSectionHandler; + XML_EndCdataSectionHandler oldEndCdataSectionHandler + = endCdataSectionHandler; + XML_DefaultHandler oldDefaultHandler = defaultHandler; + XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler + = unparsedEntityDeclHandler; + XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; + XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler + = startNamespaceDeclHandler; + XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler + = endNamespaceDeclHandler; + XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; + XML_ExternalEntityRefHandler oldExternalEntityRefHandler + = externalEntityRefHandler; + XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; + XML_UnknownEncodingHandler oldUnknownEncodingHandler + = unknownEncodingHandler; + XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; + XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; + XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; + XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; + ELEMENT_TYPE * oldDeclElementType = declElementType; + + void *oldUserData = userData; + void *oldHandlerArg = handlerArg; + XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; + XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; +#ifdef XML_DTD + enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; + int oldInEntityValue = prologState.inEntityValue; +#endif + XML_Bool oldns_triplets = ns_triplets; + +#ifdef XML_DTD + if (!context) + newDtd = oldDtd; +#endif /* XML_DTD */ + + /* Note that the magical uses of the pre-processor to make field + access look more like C++ require that `parser' be overwritten + here. This makes this function more painful to follow than it + would be otherwise. + */ + if (ns) { + XML_Char tmp[2]; + *tmp = namespaceSeparator; + parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); + } + else { + parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); + } + + if (!parser) + return NULL; + + startElementHandler = oldStartElementHandler; + endElementHandler = oldEndElementHandler; + characterDataHandler = oldCharacterDataHandler; + processingInstructionHandler = oldProcessingInstructionHandler; + commentHandler = oldCommentHandler; + startCdataSectionHandler = oldStartCdataSectionHandler; + endCdataSectionHandler = oldEndCdataSectionHandler; + defaultHandler = oldDefaultHandler; + unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; + notationDeclHandler = oldNotationDeclHandler; + startNamespaceDeclHandler = oldStartNamespaceDeclHandler; + endNamespaceDeclHandler = oldEndNamespaceDeclHandler; + notStandaloneHandler = oldNotStandaloneHandler; + externalEntityRefHandler = oldExternalEntityRefHandler; + skippedEntityHandler = oldSkippedEntityHandler; + unknownEncodingHandler = oldUnknownEncodingHandler; + elementDeclHandler = oldElementDeclHandler; + attlistDeclHandler = oldAttlistDeclHandler; + entityDeclHandler = oldEntityDeclHandler; + xmlDeclHandler = oldXmlDeclHandler; + declElementType = oldDeclElementType; + userData = oldUserData; + if (oldUserData == oldHandlerArg) + handlerArg = userData; + else + handlerArg = parser; + if (oldExternalEntityRefHandlerArg != oldParser) + externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; + defaultExpandInternalEntities = oldDefaultExpandInternalEntities; + ns_triplets = oldns_triplets; + parentParser = oldParser; +#ifdef XML_DTD + paramEntityParsing = oldParamEntityParsing; + prologState.inEntityValue = oldInEntityValue; + if (context) { +#endif /* XML_DTD */ + if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) + || !setContext(parser, context)) { + XML_ParserFree(parser); + return NULL; + } + processor = externalEntityInitProcessor; +#ifdef XML_DTD + } + else { + /* The DTD instance referenced by _dtd is shared between the document's + root parser and external PE parsers, therefore one does not need to + call setContext. In addition, one also *must* not call setContext, + because this would overwrite existing prefix->binding pointers in + _dtd with ones that get destroyed with the external PE parser. + This would leave those prefixes with dangling pointers. + */ + isParamEntity = XML_TRUE; + XmlPrologStateInitExternalEntity(&prologState); + processor = externalParEntInitProcessor; + } +#endif /* XML_DTD */ + return parser; +} + +static void FASTCALL +destroyBindings(BINDING *bindings, XML_Parser parser) +{ + for (;;) { + BINDING *b = bindings; + if (!b) + break; + bindings = b->nextTagBinding; + FREE(b->uri); + FREE(b); + } +} + +void XMLCALL +XML_ParserFree(XML_Parser parser) +{ + TAG *tagList; + OPEN_INTERNAL_ENTITY *entityList; + if (parser == NULL) + return; + /* free tagStack and freeTagList */ + tagList = tagStack; + for (;;) { + TAG *p; + if (tagList == NULL) { + if (freeTagList == NULL) + break; + tagList = freeTagList; + freeTagList = NULL; + } + p = tagList; + tagList = tagList->parent; + FREE(p->buf); + destroyBindings(p->bindings, parser); + FREE(p); + } + /* free openInternalEntities and freeInternalEntities */ + entityList = openInternalEntities; + for (;;) { + OPEN_INTERNAL_ENTITY *openEntity; + if (entityList == NULL) { + if (freeInternalEntities == NULL) + break; + entityList = freeInternalEntities; + freeInternalEntities = NULL; + } + openEntity = entityList; + entityList = entityList->next; + FREE(openEntity); + } + + destroyBindings(freeBindingList, parser); + destroyBindings(inheritedBindings, parser); + poolDestroy(&tempPool); + poolDestroy(&temp2Pool); +#ifdef XML_DTD + /* external parameter entity parsers share the DTD structure + parser->m_dtd with the root parser, so we must not destroy it + */ + if (!isParamEntity && _dtd) +#else + if (_dtd) +#endif /* XML_DTD */ + dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); + FREE((void *)atts); + FREE(groupConnector); + FREE(buffer); + FREE(dataBuf); + FREE(nsAtts); + FREE(unknownEncodingMem); + if (unknownEncodingRelease) + unknownEncodingRelease(unknownEncodingData); + FREE(parser); +} + +void XMLCALL +XML_UseParserAsHandlerArg(XML_Parser parser) +{ + handlerArg = parser; +} + +enum XML_Error XMLCALL +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) +{ +#ifdef XML_DTD + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; + useForeignDTD = useDTD; + return XML_ERROR_NONE; +#else + return XML_ERROR_FEATURE_REQUIRES_XML_DTD; +#endif +} + +void XMLCALL +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) +{ + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return; + ns_triplets = do_nst ? XML_TRUE : XML_FALSE; +} + +void XMLCALL +XML_SetUserData(XML_Parser parser, void *p) +{ + if (handlerArg == userData) + handlerArg = userData = p; + else + userData = p; +} + +enum XML_Status XMLCALL +XML_SetBase(XML_Parser parser, const XML_Char *p) +{ + if (p) { + p = poolCopyString(&_dtd->pool, p); + if (!p) + return XML_STATUS_ERROR; + curBase = p; + } + else + curBase = NULL; + return XML_STATUS_OK; +} + +const XML_Char * XMLCALL +XML_GetBase(XML_Parser parser) +{ + return curBase; +} + +int XMLCALL +XML_GetSpecifiedAttributeCount(XML_Parser parser) +{ + return nSpecifiedAtts; +} + +int XMLCALL +XML_GetIdAttributeIndex(XML_Parser parser) +{ + return idAttIndex; +} + +void XMLCALL +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end) +{ + startElementHandler = start; + endElementHandler = end; +} + +void XMLCALL +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler start) { + startElementHandler = start; +} + +void XMLCALL +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler end) { + endElementHandler = end; +} + +void XMLCALL +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler) +{ + characterDataHandler = handler; +} + +void XMLCALL +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler) +{ + processingInstructionHandler = handler; +} + +void XMLCALL +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler) +{ + commentHandler = handler; +} + +void XMLCALL +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end) +{ + startCdataSectionHandler = start; + endCdataSectionHandler = end; +} + +void XMLCALL +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start) { + startCdataSectionHandler = start; +} + +void XMLCALL +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end) { + endCdataSectionHandler = end; +} + +void XMLCALL +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler) +{ + defaultHandler = handler; + defaultExpandInternalEntities = XML_FALSE; +} + +void XMLCALL +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler) +{ + defaultHandler = handler; + defaultExpandInternalEntities = XML_TRUE; +} + +void XMLCALL +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end) +{ + startDoctypeDeclHandler = start; + endDoctypeDeclHandler = end; +} + +void XMLCALL +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start) { + startDoctypeDeclHandler = start; +} + +void XMLCALL +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end) { + endDoctypeDeclHandler = end; +} + +void XMLCALL +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler) +{ + unparsedEntityDeclHandler = handler; +} + +void XMLCALL +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler) +{ + notationDeclHandler = handler; +} + +void XMLCALL +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end) +{ + startNamespaceDeclHandler = start; + endNamespaceDeclHandler = end; +} + +void XMLCALL +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start) { + startNamespaceDeclHandler = start; +} + +void XMLCALL +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end) { + endNamespaceDeclHandler = end; +} + +void XMLCALL +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler) +{ + notStandaloneHandler = handler; +} + +void XMLCALL +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler) +{ + externalEntityRefHandler = handler; +} + +void XMLCALL +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) +{ + if (arg) + externalEntityRefHandlerArg = (XML_Parser)arg; + else + externalEntityRefHandlerArg = parser; +} + +void XMLCALL +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler) +{ + skippedEntityHandler = handler; +} + +void XMLCALL +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *data) +{ + unknownEncodingHandler = handler; + unknownEncodingHandlerData = data; +} + +void XMLCALL +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl) +{ + elementDeclHandler = eldecl; +} + +void XMLCALL +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl) +{ + attlistDeclHandler = attdecl; +} + +void XMLCALL +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler) +{ + entityDeclHandler = handler; +} + +void XMLCALL +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler handler) { + xmlDeclHandler = handler; +} + +int XMLCALL +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing peParsing) +{ + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing == XML_PARSING || parsing == XML_SUSPENDED) + return 0; +#ifdef XML_DTD + paramEntityParsing = peParsing; + return 1; +#else + return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; +#endif +} + +enum XML_Status XMLCALL +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) +{ + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + parsing = XML_PARSING; + } + + if (len == 0) { + finalBuffer = (XML_Bool)isFinal; + if (!isFinal) + return XML_STATUS_OK; + positionPtr = bufferPtr; + parseEndPtr = bufferEnd; + + /* If data are left over from last buffer, and we now know that these + data are the final chunk of input, then we have to check them again + to detect errors based on this information. + */ + errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); + + if (errorCode == XML_ERROR_NONE) { + switch (parsing) { + case XML_SUSPENDED: + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return XML_STATUS_SUSPENDED; + case XML_INITIALIZED: + case XML_PARSING: + parsing = XML_FINISHED; + /* fall through */ + default: + return XML_STATUS_OK; + } + } + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } +#ifndef XML_CONTEXT_BYTES + else if (bufferPtr == bufferEnd) { + const char *end; + int nLeftOver; + enum XML_Error result; + parseEndByteIndex += len; + positionPtr = s; + finalBuffer = (XML_Bool)isFinal; + + errorCode = processor(parser, s, parseEndPtr = s + len, &end); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + result = XML_STATUS_OK; + if (isFinal) { + parsing = XML_FINISHED; + return result; + } + } + } + + XmlUpdatePosition(encoding, positionPtr, end, &position); + positionPtr = end; + nLeftOver = s + len - end; + if (nLeftOver) { + if (buffer == NULL || nLeftOver > bufferLim - buffer) { + /* FIXME avoid integer overflow */ + char *temp; + temp = (buffer == NULL + ? (char *)MALLOC(len * 2) + : (char *)REALLOC(buffer, len * 2)); + if (temp == NULL) { + errorCode = XML_ERROR_NO_MEMORY; + return XML_STATUS_ERROR; + } + buffer = temp; + if (!buffer) { + errorCode = XML_ERROR_NO_MEMORY; + eventPtr = eventEndPtr = NULL; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + bufferLim = buffer + len * 2; + } + memcpy(buffer, end, nLeftOver); + bufferPtr = buffer; + bufferEnd = buffer + nLeftOver; + } + return result; + } +#endif /* not defined XML_CONTEXT_BYTES */ + else { + void *buff = XML_GetBuffer(parser, len); + if (buff == NULL) + return XML_STATUS_ERROR; + else { + memcpy(buff, s, len); + return XML_ParseBuffer(parser, len, isFinal); + } + } +} + +enum XML_Status XMLCALL +XML_ParseBuffer(XML_Parser parser, int len, int isFinal) +{ + const char *start; + enum XML_Error result = XML_STATUS_OK; + + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + parsing = XML_PARSING; + } + + start = bufferPtr; + positionPtr = start; + bufferEnd += len; + parseEndPtr = bufferEnd; + parseEndByteIndex += len; + finalBuffer = (XML_Bool)isFinal; + + errorCode = processor(parser, start, parseEndPtr, &bufferPtr); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (isFinal) { + parsing = XML_FINISHED; + return result; + } + default: ; /* should not happen */ + } + } + + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return result; +} + +void * XMLCALL +XML_GetBuffer(XML_Parser parser, int len) +{ + switch (parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; + return NULL; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return NULL; + default: ; + } + + if (len > bufferLim - bufferEnd) { + /* FIXME avoid integer overflow */ + int neededSize = len + (bufferEnd - bufferPtr); +#ifdef XML_CONTEXT_BYTES + int keep = bufferPtr - buffer; + + if (keep > XML_CONTEXT_BYTES) + keep = XML_CONTEXT_BYTES; + neededSize += keep; +#endif /* defined XML_CONTEXT_BYTES */ + if (neededSize <= bufferLim - buffer) { +#ifdef XML_CONTEXT_BYTES + if (keep < bufferPtr - buffer) { + int offset = (bufferPtr - buffer) - keep; + memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); + bufferEnd -= offset; + bufferPtr -= offset; + } +#else + memmove(buffer, bufferPtr, bufferEnd - bufferPtr); + bufferEnd = buffer + (bufferEnd - bufferPtr); + bufferPtr = buffer; +#endif /* not defined XML_CONTEXT_BYTES */ + } + else { + char *newBuf; + int bufferSize = bufferLim - bufferPtr; + if (bufferSize == 0) + bufferSize = INIT_BUFFER_SIZE; + do { + bufferSize *= 2; + } while (bufferSize < neededSize); + newBuf = (char *)MALLOC(bufferSize); + if (newBuf == 0) { + errorCode = XML_ERROR_NO_MEMORY; + return NULL; + } + bufferLim = newBuf + bufferSize; +#ifdef XML_CONTEXT_BYTES + if (bufferPtr) { + int keep = bufferPtr - buffer; + if (keep > XML_CONTEXT_BYTES) + keep = XML_CONTEXT_BYTES; + memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); + FREE(buffer); + buffer = newBuf; + bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; + bufferPtr = buffer + keep; + } + else { + bufferEnd = newBuf + (bufferEnd - bufferPtr); + bufferPtr = buffer = newBuf; + } +#else + if (bufferPtr) { + memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); + FREE(buffer); + } + bufferEnd = newBuf + (bufferEnd - bufferPtr); + bufferPtr = buffer = newBuf; +#endif /* not defined XML_CONTEXT_BYTES */ + } + } + return bufferEnd; +} + +enum XML_Status XMLCALL +XML_StopParser(XML_Parser parser, XML_Bool resumable) +{ + switch (parsing) { + case XML_SUSPENDED: + if (resumable) { + errorCode = XML_ERROR_SUSPENDED; + return XML_STATUS_ERROR; + } + parsing = XML_FINISHED; + break; + case XML_FINISHED: + errorCode = XML_ERROR_FINISHED; + return XML_STATUS_ERROR; + default: + if (resumable) { +#ifdef XML_DTD + if (isParamEntity) { + errorCode = XML_ERROR_SUSPEND_PE; + return XML_STATUS_ERROR; + } +#endif + parsing = XML_SUSPENDED; + } + else + parsing = XML_FINISHED; + } + return XML_STATUS_OK; +} + +enum XML_Status XMLCALL +XML_ResumeParser(XML_Parser parser) +{ + enum XML_Error result = XML_STATUS_OK; + + if (parsing != XML_SUSPENDED) { + errorCode = XML_ERROR_NOT_SUSPENDED; + return XML_STATUS_ERROR; + } + parsing = XML_PARSING; + + errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); + + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + else { + switch (parsing) { + case XML_SUSPENDED: + result = XML_STATUS_SUSPENDED; + break; + case XML_INITIALIZED: + case XML_PARSING: + if (finalBuffer) { + parsing = XML_FINISHED; + return result; + } + default: ; + } + } + + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + return result; +} + +void XMLCALL +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) +{ + assert(status != NULL); + *status = parser->m_parsingStatus; +} + +enum XML_Error XMLCALL +XML_GetErrorCode(XML_Parser parser) +{ + return errorCode; +} + +long XMLCALL +XML_GetCurrentByteIndex(XML_Parser parser) +{ + if (eventPtr) + return parseEndByteIndex - (parseEndPtr - eventPtr); + return -1; +} + +int XMLCALL +XML_GetCurrentByteCount(XML_Parser parser) +{ + if (eventEndPtr && eventPtr) + return eventEndPtr - eventPtr; + return 0; +} + +const char * XMLCALL +XML_GetInputContext(XML_Parser parser, int *offset, int *size) +{ +#ifdef XML_CONTEXT_BYTES + if (eventPtr && buffer) { + *offset = eventPtr - buffer; + *size = bufferEnd - buffer; + return buffer; + } +#endif /* defined XML_CONTEXT_BYTES */ + return (char *) 0; +} + +int XMLCALL +XML_GetCurrentLineNumber(XML_Parser parser) +{ + if (eventPtr && eventPtr >= positionPtr) { + XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); + positionPtr = eventPtr; + } + return position.lineNumber + 1; +} + +int XMLCALL +XML_GetCurrentColumnNumber(XML_Parser parser) +{ + if (eventPtr && eventPtr >= positionPtr) { + XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); + positionPtr = eventPtr; + } + return position.columnNumber; +} + +void XMLCALL +XML_FreeContentModel(XML_Parser parser, XML_Content *model) +{ + FREE(model); +} + +void * XMLCALL +XML_MemMalloc(XML_Parser parser, size_t size) +{ + return MALLOC(size); +} + +void * XMLCALL +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) +{ + return REALLOC(ptr, size); +} + +void XMLCALL +XML_MemFree(XML_Parser parser, void *ptr) +{ + FREE(ptr); +} + +void XMLCALL +XML_DefaultCurrent(XML_Parser parser) +{ + if (defaultHandler) { + if (openInternalEntities) + reportDefault(parser, + internalEncoding, + openInternalEntities->internalEventPtr, + openInternalEntities->internalEventEndPtr); + else + reportDefault(parser, encoding, eventPtr, eventEndPtr); + } +} + +const XML_LChar * XMLCALL +XML_ErrorString(enum XML_Error code) +{ + static const XML_LChar *message[] = { + 0, + XML_L("out of memory"), + XML_L("syntax error"), + XML_L("no element found"), + XML_L("not well-formed (invalid token)"), + XML_L("unclosed token"), + XML_L("partial character"), + XML_L("mismatched tag"), + XML_L("duplicate attribute"), + XML_L("junk after document element"), + XML_L("illegal parameter entity reference"), + XML_L("undefined entity"), + XML_L("recursive entity reference"), + XML_L("asynchronous entity"), + XML_L("reference to invalid character number"), + XML_L("reference to binary entity"), + XML_L("reference to external entity in attribute"), + XML_L("xml declaration not at start of external entity"), + XML_L("unknown encoding"), + XML_L("encoding specified in XML declaration is incorrect"), + XML_L("unclosed CDATA section"), + XML_L("error in processing external entity reference"), + XML_L("document is not standalone"), + XML_L("unexpected parser state - please send a bug report"), + XML_L("entity declared in parameter entity"), + XML_L("requested feature requires XML_DTD support in Expat"), + XML_L("cannot change setting once parsing has begun"), + XML_L("unbound prefix"), + XML_L("must not undeclare prefix"), + XML_L("incomplete markup in parameter entity"), + XML_L("XML declaration not well-formed"), + XML_L("text declaration not well-formed"), + XML_L("illegal character(s) in public id"), + XML_L("parser suspended"), + XML_L("parser not suspended"), + XML_L("parsing aborted"), + XML_L("parsing finished"), + XML_L("cannot suspend in external parameter entity") + }; + if (code > 0 && code < sizeof(message)/sizeof(message[0])) + return message[code]; + return NULL; +} + +const XML_LChar * XMLCALL +XML_ExpatVersion(void) { + + /* V1 is used to string-ize the version number. However, it would + string-ize the actual version macro *names* unless we get them + substituted before being passed to V1. CPP is defined to expand + a macro, then rescan for more expansions. Thus, we use V2 to expand + the version macros, then CPP will expand the resulting V1() macro + with the correct numerals. */ + /* ### I'm assuming cpp is portable in this respect... */ + +#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) +#define V2(a,b,c) XML_L("expat_")V1(a,b,c) + + return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); + +#undef V1 +#undef V2 +} + +XML_Expat_Version XMLCALL +XML_ExpatVersionInfo(void) +{ + XML_Expat_Version version; + + version.major = XML_MAJOR_VERSION; + version.minor = XML_MINOR_VERSION; + version.micro = XML_MICRO_VERSION; + + return version; +} + +const XML_Feature * XMLCALL +XML_GetFeatureList(void) +{ + static XML_Feature features[] = { + {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), 0}, + {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), 0}, +#ifdef XML_UNICODE + {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, +#endif +#ifdef XML_UNICODE_WCHAR_T + {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, +#endif +#ifdef XML_DTD + {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, +#endif +#ifdef XML_CONTEXT_BYTES + {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), + XML_CONTEXT_BYTES}, +#endif +#ifdef XML_MIN_SIZE + {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, +#endif + {XML_FEATURE_END, NULL, 0} + }; + + features[0].value = sizeof(XML_Char); + features[1].value = sizeof(XML_LChar); + return features; +} + +/* Initially tag->rawName always points into the parse buffer; + for those TAG instances opened while the current parse buffer was + processed, and not yet closed, we need to store tag->rawName in a more + permanent location, since the parse buffer is about to be discarded. +*/ +static XML_Bool +storeRawNames(XML_Parser parser) +{ + TAG *tag = tagStack; + while (tag) { + int bufSize; + int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); + char *rawNameBuf = tag->buf + nameLen; + /* Stop if already stored. Since tagStack is a stack, we can stop + at the first entry that has already been copied; everything + below it in the stack is already been accounted for in a + previous call to this function. + */ + if (tag->rawName == rawNameBuf) + break; + /* For re-use purposes we need to ensure that the + size of tag->buf is a multiple of sizeof(XML_Char). + */ + bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); + if (bufSize > tag->bufEnd - tag->buf) { + char *temp = (char *)REALLOC(tag->buf, bufSize); + if (temp == NULL) + return XML_FALSE; + /* if tag->name.str points to tag->buf (only when namespace + processing is off) then we have to update it + */ + if (tag->name.str == (XML_Char *)tag->buf) + tag->name.str = (XML_Char *)temp; + /* if tag->name.localPart is set (when namespace processing is on) + then update it as well, since it will always point into tag->buf + */ + if (tag->name.localPart) + tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - + (XML_Char *)tag->buf); + tag->buf = temp; + tag->bufEnd = temp + bufSize; + rawNameBuf = temp + nameLen; + } + memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); + tag->rawName = rawNameBuf; + tag = tag->parent; + } + return XML_TRUE; +} + +static enum XML_Error PTRCALL +contentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doContent(parser, 0, encoding, start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result == XML_ERROR_NONE) { + if (!storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; + } + return result; +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + processor = externalEntityInitProcessor2; + return externalEntityInitProcessor2(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor2(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + const char *next = start; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(encoding, start, end, &next); + switch (tok) { + case XML_TOK_BOM: + /* If we are at the end of the buffer, this would cause the next stage, + i.e. externalEntityInitProcessor3, to pass control directly to + doContent (by detecting XML_TOK_NONE) without processing any xml text + declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. + */ + if (next == end && !finalBuffer) { + *endPtr = next; + return XML_ERROR_NONE; + } + start = next; + break; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_PARTIAL_CHAR; + } + processor = externalEntityInitProcessor3; + return externalEntityInitProcessor3(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor3(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + int tok; + const char *next = start; /* XmlContentTok doesn't always set the last arg */ + eventPtr = start; + tok = XmlContentTok(encoding, start, end, &next); + eventEndPtr = next; + + switch (tok) { + case XML_TOK_XML_DECL: + { + enum XML_Error result; + result = processXmlDecl(parser, 1, start, next); + if (result != XML_ERROR_NONE) + return result; + switch (parsing) { + case XML_SUSPENDED: + *endPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + start = next; + } + } + break; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *endPtr = start; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + } + processor = externalEntityContentProcessor; + tagLevel = 1; + return externalEntityContentProcessor(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityContentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doContent(parser, 1, encoding, start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result == XML_ERROR_NONE) { + if (!storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; + } + return result; +} + +static enum XML_Error +doContent(XML_Parser parser, + int startTagLevel, + const ENCODING *enc, + const char *s, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + /* save one level of indirection */ + DTD * const dtd = _dtd; + + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + + for (;;) { + const char *next = s; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_TRAILING_CR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + *eventEndPP = end; + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, end); + /* We are at the end of the final buffer, should we check for + XML_SUSPENDED, XML_FINISHED? + */ + if (startTagLevel == 0) + return XML_ERROR_NO_ELEMENTS; + if (tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + *nextPtr = end; + return XML_ERROR_NONE; + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (startTagLevel > 0) { + if (tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_NO_ELEMENTS; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_ENTITY_REF: + { + const XML_Char *name; + ENTITY *entity; + XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (ch) { + if (characterDataHandler) + characterDataHandler(handlerArg, &ch, 1); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + name = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); + poolDiscard(&dtd->pool); + /* First, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity or default handler. + */ + if (!dtd->hasParamEntityRefs || dtd->standalone) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->notation) + return XML_ERROR_BINARY_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + if (!defaultExpandInternalEntities) { + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, entity->name, 0); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + result = processInternalEntity(parser, entity, XML_FALSE); + if (result != XML_ERROR_NONE) + return result; + } + else if (externalEntityRefHandler) { + const XML_Char *context; + entity->open = XML_TRUE; + context = getContext(parser); + entity->open = XML_FALSE; + if (!context) + return XML_ERROR_NO_MEMORY; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + context, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + poolDiscard(&tempPool); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + case XML_TOK_START_TAG_NO_ATTS: + /* fall through */ + case XML_TOK_START_TAG_WITH_ATTS: + { + TAG *tag; + enum XML_Error result; + XML_Char *toPtr; + if (freeTagList) { + tag = freeTagList; + freeTagList = freeTagList->parent; + } + else { + tag = (TAG *)MALLOC(sizeof(TAG)); + if (!tag) + return XML_ERROR_NO_MEMORY; + tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); + if (!tag->buf) { + FREE(tag); + return XML_ERROR_NO_MEMORY; + } + tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; + } + tag->bindings = NULL; + tag->parent = tagStack; + tagStack = tag; + tag->name.localPart = NULL; + tag->name.prefix = NULL; + tag->rawName = s + enc->minBytesPerChar; + tag->rawNameLength = XmlNameLength(enc, tag->rawName); + ++tagLevel; + { + const char *rawNameEnd = tag->rawName + tag->rawNameLength; + const char *fromPtr = tag->rawName; + toPtr = (XML_Char *)tag->buf; + for (;;) { + int bufSize; + int convLen; + XmlConvert(enc, + &fromPtr, rawNameEnd, + (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); + convLen = toPtr - (XML_Char *)tag->buf; + if (fromPtr == rawNameEnd) { + tag->name.strLen = convLen; + break; + } + bufSize = (tag->bufEnd - tag->buf) << 1; + { + char *temp = (char *)REALLOC(tag->buf, bufSize); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + tag->buf = temp; + tag->bufEnd = temp + bufSize; + toPtr = (XML_Char *)temp + convLen; + } + } + } + tag->name.str = (XML_Char *)tag->buf; + *toPtr = XML_T('\0'); + result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); + if (result) + return result; + if (startElementHandler) + startElementHandler(handlerArg, tag->name.str, + (const XML_Char **)atts); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&tempPool); + break; + } + case XML_TOK_EMPTY_ELEMENT_NO_ATTS: + /* fall through */ + case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: + { + const char *rawName = s + enc->minBytesPerChar; + enum XML_Error result; + BINDING *bindings = NULL; + XML_Bool noElmHandlers = XML_TRUE; + TAG_NAME name; + name.str = poolStoreString(&tempPool, enc, rawName, + rawName + XmlNameLength(enc, rawName)); + if (!name.str) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + result = storeAtts(parser, enc, s, &name, &bindings); + if (result) + return result; + poolFinish(&tempPool); + if (startElementHandler) { + startElementHandler(handlerArg, name.str, (const XML_Char **)atts); + noElmHandlers = XML_FALSE; + } + if (endElementHandler) { + if (startElementHandler) + *eventPP = *eventEndPP; + endElementHandler(handlerArg, name.str); + noElmHandlers = XML_FALSE; + } + if (noElmHandlers && defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&tempPool); + while (bindings) { + BINDING *b = bindings; + if (endNamespaceDeclHandler) + endNamespaceDeclHandler(handlerArg, b->prefix->name); + bindings = bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + } + if (tagLevel == 0) + return epilogProcessor(parser, next, end, nextPtr); + break; + case XML_TOK_END_TAG: + if (tagLevel == startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + else { + int len; + const char *rawName; + TAG *tag = tagStack; + tagStack = tag->parent; + tag->parent = freeTagList; + freeTagList = tag; + rawName = s + enc->minBytesPerChar*2; + len = XmlNameLength(enc, rawName); + if (len != tag->rawNameLength + || memcmp(tag->rawName, rawName, len) != 0) { + *eventPP = rawName; + return XML_ERROR_TAG_MISMATCH; + } + --tagLevel; + if (endElementHandler) { + const XML_Char *localPart; + const XML_Char *prefix; + XML_Char *uri; + localPart = tag->name.localPart; + if (ns && localPart) { + /* localPart and prefix may have been overwritten in + tag->name.str, since this points to the binding->uri + buffer which gets re-used; so we have to add them again + */ + uri = (XML_Char *)tag->name.str + tag->name.uriLen; + /* don't need to check for space - already done in storeAtts() */ + while (*localPart) *uri++ = *localPart++; + prefix = (XML_Char *)tag->name.prefix; + if (ns_triplets && prefix) { + *uri++ = namespaceSeparator; + while (*prefix) *uri++ = *prefix++; + } + *uri = XML_T('\0'); + } + endElementHandler(handlerArg, tag->name.str); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + while (tag->bindings) { + BINDING *b = tag->bindings; + if (endNamespaceDeclHandler) + endNamespaceDeclHandler(handlerArg, b->prefix->name); + tag->bindings = tag->bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + if (tagLevel == 0) + return epilogProcessor(parser, next, end, nextPtr); + } + break; + case XML_TOK_CHAR_REF: + { + int n = XmlCharRefNumber(enc, s); + if (n < 0) + return XML_ERROR_BAD_CHAR_REF; + if (characterDataHandler) { + XML_Char buf[XML_ENCODE_MAX]; + characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + } + break; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + case XML_TOK_DATA_NEWLINE: + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_CDATA_SECT_OPEN: + { + enum XML_Error result; + if (startCdataSectionHandler) + startCdataSectionHandler(handlerArg); +#if 0 + /* Suppose you doing a transformation on a document that involves + changing only the character data. You set up a defaultHandler + and a characterDataHandler. The defaultHandler simply copies + characters through. The characterDataHandler does the + transformation and writes the characters out escaping them as + necessary. This case will fail to work if we leave out the + following two lines (because & and < inside CDATA sections will + be incorrectly escaped). + + However, now we have a start/endCdataSectionHandler, so it seems + easier to let the user deal with this. + */ + else if (characterDataHandler) + characterDataHandler(handlerArg, dataBuf, 0); +#endif + else if (defaultHandler) + reportDefault(parser, enc, s, next); + result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (!next) { + processor = cdataSectionProcessor; + return result; + } + } + break; + case XML_TOK_TRAILING_RSQB: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)end - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, end); + /* We are at the end of the final buffer, should we check for + XML_SUSPENDED, XML_FINISHED? + */ + if (startTagLevel == 0) { + *eventPP = end; + return XML_ERROR_NO_ELEMENTS; + } + if (tagLevel != startTagLevel) { + *eventPP = end; + return XML_ERROR_ASYNC_ENTITY; + } + *nextPtr = end; + return XML_ERROR_NONE; + case XML_TOK_DATA_CHARS: + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = s; + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + if (s == next) + break; + *eventPP = s; + } + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)next - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + default: + if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + *eventPP = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } + /* not reached */ +} + +/* Precondition: all arguments must be non-NULL; + Purpose: + - normalize attributes + - check attributes for well-formedness + - generate namespace aware attribute names (URI, prefix) + - build list of attributes for startElementHandler + - default attributes + - process namespace declarations (check and report them) + - generate namespace aware element name (URI, prefix) +*/ +static enum XML_Error +storeAtts(XML_Parser parser, const ENCODING *enc, + const char *attStr, TAG_NAME *tagNamePtr, + BINDING **bindingsPtr) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + ELEMENT_TYPE *elementType; + int nDefaultAtts; + const XML_Char **appAtts; /* the attribute list for the application */ + int attIndex = 0; + int prefixLen; + int i; + int n; + XML_Char *uri; + int nPrefixes = 0; + BINDING *binding; + const XML_Char *localPart; + + /* lookup the element type name */ + elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0); + if (!elementType) { + const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); + if (!name) + return XML_ERROR_NO_MEMORY; + elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name, + sizeof(ELEMENT_TYPE)); + if (!elementType) + return XML_ERROR_NO_MEMORY; + if (ns && !setElementTypePrefix(parser, elementType)) + return XML_ERROR_NO_MEMORY; + } + nDefaultAtts = elementType->nDefaultAtts; + + /* get the attributes from the tokenizer */ + n = XmlGetAttributes(enc, attStr, attsSize, atts); + if (n + nDefaultAtts > attsSize) { + int oldAttsSize = attsSize; + ATTRIBUTE *temp; + attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; + temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + atts = temp; + if (n > oldAttsSize) + XmlGetAttributes(enc, attStr, n, atts); + } + + appAtts = (const XML_Char **)atts; + for (i = 0; i < n; i++) { + /* add the name and value to the attribute list */ + ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, + atts[i].name + + XmlNameLength(enc, atts[i].name)); + if (!attId) + return XML_ERROR_NO_MEMORY; + /* Detect duplicate attributes by their QNames. This does not work when + namespace processing is turned on and different prefixes for the same + namespace are used. For this case we have a check further down. + */ + if ((attId->name)[-1]) { + if (enc == encoding) + eventPtr = atts[i].name; + return XML_ERROR_DUPLICATE_ATTRIBUTE; + } + (attId->name)[-1] = 1; + appAtts[attIndex++] = attId->name; + if (!atts[i].normalized) { + enum XML_Error result; + XML_Bool isCdata = XML_TRUE; + + /* figure out whether declared as other than CDATA */ + if (attId->maybeTokenized) { + int j; + for (j = 0; j < nDefaultAtts; j++) { + if (attId == elementType->defaultAtts[j].id) { + isCdata = elementType->defaultAtts[j].isCdata; + break; + } + } + } + + /* normalize the attribute value */ + result = storeAttributeValue(parser, enc, isCdata, + atts[i].valuePtr, atts[i].valueEnd, + &tempPool); + if (result) + return result; + appAtts[attIndex] = poolStart(&tempPool); + poolFinish(&tempPool); + } + else { + /* the value did not need normalizing */ + appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, + atts[i].valueEnd); + if (appAtts[attIndex] == 0) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + } + /* handle prefixed attribute names */ + if (attId->prefix) { + if (attId->xmlns) { + /* deal with namespace declarations here */ + enum XML_Error result = addBinding(parser, attId->prefix, attId, + appAtts[attIndex], bindingsPtr); + if (result) + return result; + --attIndex; + } + else { + /* deal with other prefixed names later */ + attIndex++; + nPrefixes++; + (attId->name)[-1] = 2; + } + } + else + attIndex++; + } + + /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ + nSpecifiedAtts = attIndex; + if (elementType->idAtt && (elementType->idAtt->name)[-1]) { + for (i = 0; i < attIndex; i += 2) + if (appAtts[i] == elementType->idAtt->name) { + idAttIndex = i; + break; + } + } + else + idAttIndex = -1; + + /* do attribute defaulting */ + for (i = 0; i < nDefaultAtts; i++) { + const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; + if (!(da->id->name)[-1] && da->value) { + if (da->id->prefix) { + if (da->id->xmlns) { + enum XML_Error result = addBinding(parser, da->id->prefix, da->id, + da->value, bindingsPtr); + if (result) + return result; + } + else { + (da->id->name)[-1] = 2; + nPrefixes++; + appAtts[attIndex++] = da->id->name; + appAtts[attIndex++] = da->value; + } + } + else { + (da->id->name)[-1] = 1; + appAtts[attIndex++] = da->id->name; + appAtts[attIndex++] = da->value; + } + } + } + appAtts[attIndex] = 0; + + /* expand prefixed attribute names, check for duplicates, + and clear flags that say whether attributes were specified */ + i = 0; + if (nPrefixes) { + int j; /* hash table index */ + unsigned long version = nsAttsVersion; + int nsAttsSize = (int)1 << nsAttsPower; + /* size of hash table must be at least 2 * (# of prefixed attributes) */ + if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ + NS_ATT *temp; + /* hash table size must also be a power of 2 and >= 8 */ + while (nPrefixes >> nsAttsPower++); + if (nsAttsPower < 3) + nsAttsPower = 3; + nsAttsSize = (int)1 << nsAttsPower; + temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); + if (!temp) + return XML_ERROR_NO_MEMORY; + nsAtts = temp; + version = 0; /* force re-initialization of nsAtts hash table */ + } + /* using a version flag saves us from initializing nsAtts every time */ + if (!version) { /* initialize version flags when version wraps around */ + version = INIT_ATTS_VERSION; + for (j = nsAttsSize; j != 0; ) + nsAtts[--j].version = version; + } + nsAttsVersion = --version; + + /* expand prefixed names and check for duplicates */ + for (; i < attIndex; i += 2) { + const XML_Char *s = appAtts[i]; + if (s[-1] == 2) { /* prefixed */ + ATTRIBUTE_ID *id; + const BINDING *b; + unsigned long uriHash = 0; + ((XML_Char *)s)[-1] = 0; /* clear flag */ + id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0); + b = id->prefix->binding; + if (!b) + return XML_ERROR_UNBOUND_PREFIX; + + /* as we expand the name we also calculate its hash value */ + for (j = 0; j < b->uriLen; j++) { + const XML_Char c = b->uri[j]; + if (!poolAppendChar(&tempPool, c)) + return XML_ERROR_NO_MEMORY; + uriHash = CHAR_HASH(uriHash, c); + } + while (*s++ != XML_T(':')) + ; + do { /* copies null terminator */ + const XML_Char c = *s; + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + uriHash = CHAR_HASH(uriHash, c); + } while (*s++); + + { /* Check hash table for duplicate of expanded name (uriName). + Derived from code in lookup(HASH_TABLE *table, ...). + */ + unsigned char step = 0; + unsigned long mask = nsAttsSize - 1; + j = uriHash & mask; /* index into hash table */ + while (nsAtts[j].version == version) { + /* for speed we compare stored hash values first */ + if (uriHash == nsAtts[j].hash) { + const XML_Char *s1 = poolStart(&tempPool); + const XML_Char *s2 = nsAtts[j].uriName; + /* s1 is null terminated, but not s2 */ + for (; *s1 == *s2 && *s1 != 0; s1++, s2++); + if (*s1 == 0) + return XML_ERROR_DUPLICATE_ATTRIBUTE; + } + if (!step) + step = PROBE_STEP(uriHash, mask, nsAttsPower); + j < step ? ( j += nsAttsSize - step) : (j -= step); + } + } + + if (ns_triplets) { /* append namespace separator and prefix */ + tempPool.ptr[-1] = namespaceSeparator; + s = b->prefix->name; + do { + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + } while (*s++); + } + + /* store expanded name in attribute list */ + s = poolStart(&tempPool); + poolFinish(&tempPool); + appAtts[i] = s; + + /* fill empty slot with new version, uriName and hash value */ + nsAtts[j].version = version; + nsAtts[j].hash = uriHash; + nsAtts[j].uriName = s; + + if (!--nPrefixes) + break; + } + else /* not prefixed */ + ((XML_Char *)s)[-1] = 0; /* clear flag */ + } + } + /* clear flags for the remaining attributes */ + for (; i < attIndex; i += 2) + ((XML_Char *)(appAtts[i]))[-1] = 0; + for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) + binding->attId->name[-1] = 0; + + if (!ns) + return XML_ERROR_NONE; + + /* expand the element type name */ + if (elementType->prefix) { + binding = elementType->prefix->binding; + if (!binding) + return XML_ERROR_UNBOUND_PREFIX; + localPart = tagNamePtr->str; + while (*localPart++ != XML_T(':')) + ; + } + else if (dtd->defaultPrefix.binding) { + binding = dtd->defaultPrefix.binding; + localPart = tagNamePtr->str; + } + else + return XML_ERROR_NONE; + prefixLen = 0; + if (ns_triplets && binding->prefix->name) { + for (; binding->prefix->name[prefixLen++];) + ; + } + tagNamePtr->localPart = localPart; + tagNamePtr->uriLen = binding->uriLen; + tagNamePtr->prefix = binding->prefix->name; + tagNamePtr->prefixLen = prefixLen; + for (i = 0; localPart[i++];) + ; + n = i + binding->uriLen + prefixLen; + if (n > binding->uriAlloc) { + TAG *p; + uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); + if (!uri) + return XML_ERROR_NO_MEMORY; + binding->uriAlloc = n + EXPAND_SPARE; + memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); + for (p = tagStack; p; p = p->parent) + if (p->name.str == binding->uri) + p->name.str = uri; + FREE(binding->uri); + binding->uri = uri; + } + uri = binding->uri + binding->uriLen; + memcpy(uri, localPart, i * sizeof(XML_Char)); + if (prefixLen) { + uri = uri + (i - 1); + if (namespaceSeparator) + *uri = namespaceSeparator; + memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); + } + tagNamePtr->str = binding->uri; + return XML_ERROR_NONE; +} + +/* addBinding() overwrites the value of prefix->binding without checking. + Therefore one must keep track of the old value outside of addBinding(). +*/ +static enum XML_Error +addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, + const XML_Char *uri, BINDING **bindingsPtr) +{ + BINDING *b; + int len; + + /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ + if (*uri == XML_T('\0') && prefix->name) + return XML_ERROR_UNDECLARING_PREFIX; + + for (len = 0; uri[len]; len++) + ; + if (namespaceSeparator) + len++; + if (freeBindingList) { + b = freeBindingList; + if (len > b->uriAlloc) { + XML_Char *temp = (XML_Char *)REALLOC(b->uri, + sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + b->uri = temp; + b->uriAlloc = len + EXPAND_SPARE; + } + freeBindingList = b->nextTagBinding; + } + else { + b = (BINDING *)MALLOC(sizeof(BINDING)); + if (!b) + return XML_ERROR_NO_MEMORY; + b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (!b->uri) { + FREE(b); + return XML_ERROR_NO_MEMORY; + } + b->uriAlloc = len + EXPAND_SPARE; + } + b->uriLen = len; + memcpy(b->uri, uri, len * sizeof(XML_Char)); + if (namespaceSeparator) + b->uri[len - 1] = namespaceSeparator; + b->prefix = prefix; + b->attId = attId; + b->prevPrefixBinding = prefix->binding; + /* NULL binding when default namespace undeclared */ + if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) + prefix->binding = NULL; + else + prefix->binding = b; + b->nextTagBinding = *bindingsPtr; + *bindingsPtr = b; + /* if attId == NULL then we are not starting a namespace scope */ + if (attId && startNamespaceDeclHandler) + startNamespaceDeclHandler(handlerArg, prefix->name, + prefix->binding ? uri : 0); + return XML_ERROR_NONE; +} + +/* The idea here is to avoid using stack for each CDATA section when + the whole file is parsed with one call. +*/ +static enum XML_Error PTRCALL +cdataSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doCdataSection(parser, encoding, &start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result != XML_ERROR_NONE) + return result; + if (start) { + if (parentParser) { /* we are parsing an external entity */ + processor = externalEntityContentProcessor; + return externalEntityContentProcessor(parser, start, end, endPtr); + } + else { + processor = contentProcessor; + return contentProcessor(parser, start, end, endPtr); + } + } + return result; +} + +/* startPtr gets set to non-null if the section is closed, and to null if + the section is not yet closed. +*/ +static enum XML_Error +doCdataSection(XML_Parser parser, + const ENCODING *enc, + const char **startPtr, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + const char *s = *startPtr; + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + *eventPP = s; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + *startPtr = NULL; + + for (;;) { + const char *next; + int tok = XmlCdataSectionTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_CDATA_SECT_CLOSE: + if (endCdataSectionHandler) + endCdataSectionHandler(handlerArg); +#if 0 + /* see comment under XML_TOK_CDATA_SECT_OPEN */ + else if (characterDataHandler) + characterDataHandler(handlerArg, dataBuf, 0); +#endif + else if (defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + *nextPtr = next; + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + else + return XML_ERROR_NONE; + case XML_TOK_DATA_NEWLINE: + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_DATA_CHARS: + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = next; + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + if (s == next) + break; + *eventPP = s; + } + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)next - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_CDATA_SECTION; + default: + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + } + + *eventPP = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } + /* not reached */ +} + +#ifdef XML_DTD + +/* The idea here is to avoid using stack for each IGNORE section when + the whole file is parsed with one call. +*/ +static enum XML_Error PTRCALL +ignoreSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, + endPtr, (XML_Bool)!finalBuffer); + if (result != XML_ERROR_NONE) + return result; + if (start) { + processor = prologProcessor; + return prologProcessor(parser, start, end, endPtr); + } + return result; +} + +/* startPtr gets set to non-null is the section is closed, and to null + if the section is not yet closed. +*/ +static enum XML_Error +doIgnoreSection(XML_Parser parser, + const ENCODING *enc, + const char **startPtr, + const char *end, + const char **nextPtr, + XML_Bool haveMore) +{ + const char *next; + int tok; + const char *s = *startPtr; + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + *eventPP = s; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + *startPtr = NULL; + tok = XmlIgnoreSectionTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_IGNORE_SECT: + if (defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + *nextPtr = next; + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + else + return XML_ERROR_NONE; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (haveMore) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ + default: + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + } + /* not reached */ +} + +#endif /* XML_DTD */ + +static enum XML_Error +initializeEncoding(XML_Parser parser) +{ + const char *s; +#ifdef XML_UNICODE + char encodingBuf[128]; + if (!protocolEncodingName) + s = NULL; + else { + int i; + for (i = 0; protocolEncodingName[i]; i++) { + if (i == sizeof(encodingBuf) - 1 + || (protocolEncodingName[i] & ~0x7f) != 0) { + encodingBuf[0] = '\0'; + break; + } + encodingBuf[i] = (char)protocolEncodingName[i]; + } + encodingBuf[i] = '\0'; + s = encodingBuf; + } +#else + s = protocolEncodingName; +#endif + if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) + return XML_ERROR_NONE; + return handleUnknownEncoding(parser, protocolEncodingName); +} + +static enum XML_Error +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next) +{ + const char *encodingName = NULL; + const XML_Char *storedEncName = NULL; + const ENCODING *newEncoding = NULL; + const char *version = NULL; + const char *versionend; + const XML_Char *storedversion = NULL; + int standalone = -1; + if (!(ns + ? XmlParseXmlDeclNS + : XmlParseXmlDecl)(isGeneralTextEntity, + encoding, + s, + next, + &eventPtr, + &version, + &versionend, + &encodingName, + &newEncoding, + &standalone)) { + if (isGeneralTextEntity) + return XML_ERROR_TEXT_DECL; + else + return XML_ERROR_XML_DECL; + } + if (!isGeneralTextEntity && standalone == 1) { + _dtd->standalone = XML_TRUE; +#ifdef XML_DTD + if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) + paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; +#endif /* XML_DTD */ + } + if (xmlDeclHandler) { + if (encodingName != NULL) { + storedEncName = poolStoreString(&temp2Pool, + encoding, + encodingName, + encodingName + + XmlNameLength(encoding, encodingName)); + if (!storedEncName) + return XML_ERROR_NO_MEMORY; + poolFinish(&temp2Pool); + } + if (version) { + storedversion = poolStoreString(&temp2Pool, + encoding, + version, + versionend - encoding->minBytesPerChar); + if (!storedversion) + return XML_ERROR_NO_MEMORY; + } + xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); + } + else if (defaultHandler) + reportDefault(parser, encoding, s, next); + if (protocolEncodingName == NULL) { + if (newEncoding) { + if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { + eventPtr = encodingName; + return XML_ERROR_INCORRECT_ENCODING; + } + encoding = newEncoding; + } + else if (encodingName) { + enum XML_Error result; + if (!storedEncName) { + storedEncName = poolStoreString( + &temp2Pool, encoding, encodingName, + encodingName + XmlNameLength(encoding, encodingName)); + if (!storedEncName) + return XML_ERROR_NO_MEMORY; + } + result = handleUnknownEncoding(parser, storedEncName); + poolClear(&temp2Pool); + if (result == XML_ERROR_UNKNOWN_ENCODING) + eventPtr = encodingName; + return result; + } + } + + if (storedEncName || storedversion) + poolClear(&temp2Pool); + + return XML_ERROR_NONE; +} + +static enum XML_Error +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) +{ + if (unknownEncodingHandler) { + XML_Encoding info; + int i; + for (i = 0; i < 256; i++) + info.map[i] = -1; + info.convert = NULL; + info.data = NULL; + info.release = NULL; + if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, + &info)) { + ENCODING *enc; + unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); + if (!unknownEncodingMem) { + if (info.release) + info.release(info.data); + return XML_ERROR_NO_MEMORY; + } + enc = (ns + ? XmlInitUnknownEncodingNS + : XmlInitUnknownEncoding)(unknownEncodingMem, + info.map, + info.convert, + info.data); + if (enc) { + unknownEncodingData = info.data; + unknownEncodingRelease = info.release; + encoding = enc; + return XML_ERROR_NONE; + } + } + if (info.release != NULL) + info.release(info.data); + } + return XML_ERROR_UNKNOWN_ENCODING; +} + +static enum XML_Error PTRCALL +prologInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + processor = prologProcessor; + return prologProcessor(parser, s, end, nextPtr); +} + +#ifdef XML_DTD + +static enum XML_Error PTRCALL +externalParEntInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + + /* we know now that XML_Parse(Buffer) has been called, + so we consider the external parameter entity read */ + _dtd->paramEntityRead = XML_TRUE; + + if (prologState.inEntityValue) { + processor = entityValueInitProcessor; + return entityValueInitProcessor(parser, s, end, nextPtr); + } + else { + processor = externalParEntProcessor; + return externalParEntProcessor(parser, s, end, nextPtr); + } +} + +static enum XML_Error PTRCALL +entityValueInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + int tok; + const char *start = s; + const char *next = start; + eventPtr = start; + + for (;;) { + tok = XmlPrologTok(encoding, start, end, &next); + eventEndPtr = next; + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + /* found end of entity value - can store it now */ + return storeEntityValue(parser, encoding, s, end); + } + else if (tok == XML_TOK_XML_DECL) { + enum XML_Error result; + result = processXmlDecl(parser, 0, start, next); + if (result != XML_ERROR_NONE) + return result; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + *nextPtr = next; + } + /* stop scanning for text declaration - we found one */ + processor = entityValueProcessor; + return entityValueProcessor(parser, next, end, nextPtr); + } + /* If we are at the end of the buffer, this would cause XmlPrologTok to + return XML_TOK_NONE on the next call, which would then cause the + function to exit with *nextPtr set to s - that is what we want for other + tokens, but not for the BOM - we would rather like to skip it; + then, when this routine is entered the next time, XmlPrologTok will + return XML_TOK_INVALID, since the BOM is still in the buffer + */ + else if (tok == XML_TOK_BOM && next == end && !finalBuffer) { + *nextPtr = next; + return XML_ERROR_NONE; + } + start = next; + eventPtr = start; + } +} + +static enum XML_Error PTRCALL +externalParEntProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *next = s; + int tok; + + tok = XmlPrologTok(encoding, s, end, &next); + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + } + /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. + However, when parsing an external subset, doProlog will not accept a BOM + as valid, and report a syntax error, so we have to skip the BOM + */ + else if (tok == XML_TOK_BOM) { + s = next; + tok = XmlPrologTok(encoding, s, end, &next); + } + + processor = prologProcessor; + return doProlog(parser, encoding, s, end, tok, next, + nextPtr, (XML_Bool)!finalBuffer); +} + +static enum XML_Error PTRCALL +entityValueProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *start = s; + const char *next = s; + const ENCODING *enc = encoding; + int tok; + + for (;;) { + tok = XmlPrologTok(enc, start, end, &next); + if (tok <= 0) { + if (!finalBuffer && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + /* found end of entity value - can store it now */ + return storeEntityValue(parser, enc, s, end); + } + start = next; + } +} + +#endif /* XML_DTD */ + +static enum XML_Error PTRCALL +prologProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *next = s; + int tok = XmlPrologTok(encoding, s, end, &next); + return doProlog(parser, encoding, s, end, tok, next, + nextPtr, (XML_Bool)!finalBuffer); +} + +static enum XML_Error +doProlog(XML_Parser parser, + const ENCODING *enc, + const char *s, + const char *end, + int tok, + const char *next, + const char **nextPtr, + XML_Bool haveMore) +{ +#ifdef XML_DTD + static const XML_Char externalSubsetName[] = { '#' , '\0' }; +#endif /* XML_DTD */ + static const XML_Char atypeCDATA[] = { 'C', 'D', 'A', 'T', 'A', '\0' }; + static const XML_Char atypeID[] = { 'I', 'D', '\0' }; + static const XML_Char atypeIDREF[] = { 'I', 'D', 'R', 'E', 'F', '\0' }; + static const XML_Char atypeIDREFS[] = { 'I', 'D', 'R', 'E', 'F', 'S', '\0' }; + static const XML_Char atypeENTITY[] = { 'E', 'N', 'T', 'I', 'T', 'Y', '\0' }; + static const XML_Char atypeENTITIES[] = + { 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S', '\0' }; + static const XML_Char atypeNMTOKEN[] = { + 'N', 'M', 'T', 'O', 'K', 'E', 'N', '\0' }; + static const XML_Char atypeNMTOKENS[] = { + 'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S', '\0' }; + static const XML_Char notationPrefix[] = { + 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N', '(', '\0' }; + static const XML_Char enumValueSep[] = { '|', '\0' }; + static const XML_Char enumValueStart[] = { '(', '\0' }; + + /* save one level of indirection */ + DTD * const dtd = _dtd; + + const char **eventPP; + const char **eventEndPP; + enum XML_Content_Quant quant; + + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + + for (;;) { + int role; + XML_Bool handleDefault = XML_TRUE; + *eventPP = s; + *eventEndPP = next; + if (tok <= 0) { + if (haveMore && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: +#ifdef XML_DTD + /* for internal PE NOT referenced between declarations */ + if (enc != encoding && !openInternalEntities->betweenDecl) { + *nextPtr = s; + return XML_ERROR_NONE; + } + /* WFC: PE Between Declarations - must check that PE contains + complete markup, not only for external PEs, but also for + internal PEs if the reference occurs between declarations. + */ + if (isParamEntity || enc != encoding) { + if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) + == XML_ROLE_ERROR) + return XML_ERROR_INCOMPLETE_PE; + *nextPtr = s; + return XML_ERROR_NONE; + } +#endif /* XML_DTD */ + return XML_ERROR_NO_ELEMENTS; + default: + tok = -tok; + next = end; + break; + } + } + role = XmlTokenRole(&prologState, tok, s, next, enc); + switch (role) { + case XML_ROLE_XML_DECL: + { + enum XML_Error result = processXmlDecl(parser, 0, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = encoding; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_DOCTYPE_NAME: + if (startDoctypeDeclHandler) { + doctypeName = poolStoreString(&tempPool, enc, s, next); + if (!doctypeName) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + doctypePubid = NULL; + handleDefault = XML_FALSE; + } + doctypeSysid = NULL; /* always initialize to NULL */ + break; + case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: + if (startDoctypeDeclHandler) { + startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, + doctypePubid, 1); + doctypeName = NULL; + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + break; +#ifdef XML_DTD + case XML_ROLE_TEXT_DECL: + { + enum XML_Error result = processXmlDecl(parser, 1, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = encoding; + handleDefault = XML_FALSE; + } + break; +#endif /* XML_DTD */ + case XML_ROLE_DOCTYPE_PUBLIC_ID: +#ifdef XML_DTD + useForeignDTD = XML_FALSE; + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (startDoctypeDeclHandler) { + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_PUBLICID; + doctypePubid = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!doctypePubid) + return XML_ERROR_NO_MEMORY; + normalizePublicId((XML_Char *)doctypePubid); + poolFinish(&tempPool); + handleDefault = XML_FALSE; + goto alreadyChecked; + } + /* fall through */ + case XML_ROLE_ENTITY_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_PUBLICID; + alreadyChecked: + if (dtd->keepProcessing && declEntity) { + XML_Char *tem = poolStoreString(&dtd->pool, + enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) + return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + declEntity->publicId = tem; + poolFinish(&dtd->pool); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_DOCTYPE_CLOSE: + if (doctypeName) { + startDoctypeDeclHandler(handlerArg, doctypeName, + doctypeSysid, doctypePubid, 0); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + /* doctypeSysid will be non-NULL in the case of a previous + XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler + was not set, indicating an external subset + */ +#ifdef XML_DTD + if (doctypeSysid || useForeignDTD) { + dtd->hasParamEntityRefs = XML_TRUE; /* when docTypeSysid == NULL */ + if (paramEntityParsing && externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!entity) + return XML_ERROR_NO_MEMORY; + if (useForeignDTD) + entity->base = curBase; + dtd->paramEntityRead = XML_FALSE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead && + !dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + /* end of DTD - no need to update dtd->keepProcessing */ + } + useForeignDTD = XML_FALSE; + } +#endif /* XML_DTD */ + if (endDoctypeDeclHandler) { + endDoctypeDeclHandler(handlerArg); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_INSTANCE_START: +#ifdef XML_DTD + /* if there is no DOCTYPE declaration then now is the + last chance to read the foreign DTD + */ + if (useForeignDTD) { + dtd->hasParamEntityRefs = XML_TRUE; + if (paramEntityParsing && externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!entity) + return XML_ERROR_NO_MEMORY; + entity->base = curBase; + dtd->paramEntityRead = XML_FALSE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead && + !dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + /* end of DTD - no need to update dtd->keepProcessing */ + } + } +#endif /* XML_DTD */ + processor = contentProcessor; + return contentProcessor(parser, s, end, nextPtr); + case XML_ROLE_ATTLIST_ELEMENT_NAME: + declElementType = getElementType(parser, enc, s, next); + if (!declElementType) + return XML_ERROR_NO_MEMORY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_NAME: + declAttributeId = getAttributeId(parser, enc, s, next); + if (!declAttributeId) + return XML_ERROR_NO_MEMORY; + declAttributeIsCdata = XML_FALSE; + declAttributeType = NULL; + declAttributeIsId = XML_FALSE; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_CDATA: + declAttributeIsCdata = XML_TRUE; + declAttributeType = atypeCDATA; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ID: + declAttributeIsId = XML_TRUE; + declAttributeType = atypeID; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREF: + declAttributeType = atypeIDREF; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: + declAttributeType = atypeIDREFS; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: + declAttributeType = atypeENTITY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: + declAttributeType = atypeENTITIES; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: + declAttributeType = atypeNMTOKEN; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: + declAttributeType = atypeNMTOKENS; + checkAttListDeclHandler: + if (dtd->keepProcessing && attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTRIBUTE_ENUM_VALUE: + case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: + if (dtd->keepProcessing && attlistDeclHandler) { + const XML_Char *prefix; + if (declAttributeType) { + prefix = enumValueSep; + } + else { + prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE + ? notationPrefix + : enumValueStart); + } + if (!poolAppendString(&tempPool, prefix)) + return XML_ERROR_NO_MEMORY; + if (!poolAppend(&tempPool, enc, s, next)) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: + case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + if (!defineAttribute(declElementType, declAttributeId, + declAttributeIsCdata, declAttributeIsId, + 0, parser)) + return XML_ERROR_NO_MEMORY; + if (attlistDeclHandler && declAttributeType) { + if (*declAttributeType == XML_T('(') + || (*declAttributeType == XML_T('N') + && declAttributeType[1] == XML_T('O'))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&tempPool, XML_T(')')) + || !poolAppendChar(&tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + poolFinish(&tempPool); + } + *eventEndPP = s; + attlistDeclHandler(handlerArg, declElementType->name, + declAttributeId->name, declAttributeType, + 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: + case XML_ROLE_FIXED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + const XML_Char *attVal; + enum XML_Error result = + storeAttributeValue(parser, enc, declAttributeIsCdata, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar, + &dtd->pool); + if (result) + return result; + attVal = poolStart(&dtd->pool); + poolFinish(&dtd->pool); + /* ID attributes aren't allowed to have a default */ + if (!defineAttribute(declElementType, declAttributeId, + declAttributeIsCdata, XML_FALSE, attVal, parser)) + return XML_ERROR_NO_MEMORY; + if (attlistDeclHandler && declAttributeType) { + if (*declAttributeType == XML_T('(') + || (*declAttributeType == XML_T('N') + && declAttributeType[1] == XML_T('O'))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&tempPool, XML_T(')')) + || !poolAppendChar(&tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + poolFinish(&tempPool); + } + *eventEndPP = s; + attlistDeclHandler(handlerArg, declElementType->name, + declAttributeId->name, declAttributeType, + attVal, + role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_ENTITY_VALUE: + if (dtd->keepProcessing) { + enum XML_Error result = storeEntityValue(parser, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (declEntity) { + declEntity->textPtr = poolStart(&dtd->entityValuePool); + declEntity->textLen = poolLength(&dtd->entityValuePool); + poolFinish(&dtd->entityValuePool); + if (entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + declEntity->is_param, + declEntity->textPtr, + declEntity->textLen, + curBase, 0, 0, 0); + handleDefault = XML_FALSE; + } + } + else + poolDiscard(&dtd->entityValuePool); + if (result != XML_ERROR_NONE) + return result; + } + break; + case XML_ROLE_DOCTYPE_SYSTEM_ID: +#ifdef XML_DTD + useForeignDTD = XML_FALSE; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (startDoctypeDeclHandler) { + doctypeSysid = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (doctypeSysid == NULL) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } +#ifdef XML_DTD + else + /* use externalSubsetName to make doctypeSysid non-NULL + for the case where no startDoctypeDeclHandler is set */ + doctypeSysid = externalSubsetName; +#endif /* XML_DTD */ + if (!dtd->standalone +#ifdef XML_DTD + && !paramEntityParsing +#endif /* XML_DTD */ + && notStandaloneHandler + && !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; +#ifndef XML_DTD + break; +#else /* XML_DTD */ + if (!declEntity) { + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + declEntity->publicId = NULL; + } + /* fall through */ +#endif /* XML_DTD */ + case XML_ROLE_ENTITY_SYSTEM_ID: + if (dtd->keepProcessing && declEntity) { + declEntity->systemId = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!declEntity->systemId) + return XML_ERROR_NO_MEMORY; + declEntity->base = curBase; + poolFinish(&dtd->pool); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_COMPLETE: + if (dtd->keepProcessing && declEntity && entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + declEntity->is_param, + 0,0, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + 0); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_NOTATION_NAME: + if (dtd->keepProcessing && declEntity) { + declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); + if (!declEntity->notation) + return XML_ERROR_NO_MEMORY; + poolFinish(&dtd->pool); + if (unparsedEntityDeclHandler) { + *eventEndPP = s; + unparsedEntityDeclHandler(handlerArg, + declEntity->name, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + declEntity->notation); + handleDefault = XML_FALSE; + } + else if (entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + 0,0,0, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + declEntity->notation); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_GENERAL_ENTITY_NAME: + { + if (XmlPredefinedEntityName(enc, s, next)) { + declEntity = NULL; + break; + } + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) + return XML_ERROR_NO_MEMORY; + declEntity = (ENTITY *)lookup(&dtd->generalEntities, name, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + if (declEntity->name != name) { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + else { + poolFinish(&dtd->pool); + declEntity->publicId = NULL; + declEntity->is_param = XML_FALSE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + declEntity->is_internal = !(parentParser || openInternalEntities); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + } + else { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + } + break; + case XML_ROLE_PARAM_ENTITY_NAME: +#ifdef XML_DTD + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) + return XML_ERROR_NO_MEMORY; + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + name, sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + if (declEntity->name != name) { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + else { + poolFinish(&dtd->pool); + declEntity->publicId = NULL; + declEntity->is_param = XML_TRUE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + declEntity->is_internal = !(parentParser || openInternalEntities); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + } + else { + poolDiscard(&dtd->pool); + declEntity = NULL; + } +#else /* not XML_DTD */ + declEntity = NULL; +#endif /* XML_DTD */ + break; + case XML_ROLE_NOTATION_NAME: + declNotationPublicId = NULL; + declNotationName = NULL; + if (notationDeclHandler) { + declNotationName = poolStoreString(&tempPool, enc, s, next); + if (!declNotationName) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_PUBLICID; + if (declNotationName) { /* means notationDeclHandler != NULL */ + XML_Char *tem = poolStoreString(&tempPool, + enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) + return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + declNotationPublicId = tem; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_SYSTEM_ID: + if (declNotationName && notationDeclHandler) { + const XML_Char *systemId + = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!systemId) + return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + notationDeclHandler(handlerArg, + declNotationName, + curBase, + systemId, + declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&tempPool); + break; + case XML_ROLE_NOTATION_NO_SYSTEM_ID: + if (declNotationPublicId && notationDeclHandler) { + *eventEndPP = s; + notationDeclHandler(handlerArg, + declNotationName, + curBase, + 0, + declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&tempPool); + break; + case XML_ROLE_ERROR: + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: + /* PE references in internal subset are + not allowed within declarations. */ + return XML_ERROR_PARAM_ENTITY_REF; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + default: + return XML_ERROR_SYNTAX; + } +#ifdef XML_DTD + case XML_ROLE_IGNORE_SECT: + { + enum XML_Error result; + if (defaultHandler) + reportDefault(parser, enc, s, next); + handleDefault = XML_FALSE; + result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (!next) { + processor = ignoreSectionProcessor; + return result; + } + } + break; +#endif /* XML_DTD */ + case XML_ROLE_GROUP_OPEN: + if (prologState.level >= groupSize) { + if (groupSize) { + char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + groupConnector = temp; + if (dtd->scaffIndex) { + int *temp = (int *)REALLOC(dtd->scaffIndex, + groupSize * sizeof(int)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + dtd->scaffIndex = temp; + } + } + else { + groupConnector = (char *)MALLOC(groupSize = 32); + if (!groupConnector) + return XML_ERROR_NO_MEMORY; + } + } + groupConnector[prologState.level] = 0; + if (dtd->in_eldecl) { + int myindex = nextScaffoldPart(parser); + if (myindex < 0) + return XML_ERROR_NO_MEMORY; + dtd->scaffIndex[dtd->scaffLevel] = myindex; + dtd->scaffLevel++; + dtd->scaffold[myindex].type = XML_CTYPE_SEQ; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_GROUP_SEQUENCE: + if (groupConnector[prologState.level] == '|') + return XML_ERROR_SYNTAX; + groupConnector[prologState.level] = ','; + if (dtd->in_eldecl && elementDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_GROUP_CHOICE: + if (groupConnector[prologState.level] == ',') + return XML_ERROR_SYNTAX; + if (dtd->in_eldecl + && !groupConnector[prologState.level] + && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + != XML_CTYPE_MIXED) + ) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + = XML_CTYPE_CHOICE; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + groupConnector[prologState.level] = '|'; + break; + case XML_ROLE_PARAM_ENTITY_REF: +#ifdef XML_DTD + case XML_ROLE_INNER_PARAM_ENTITY_REF: + dtd->hasParamEntityRefs = XML_TRUE; + if (!paramEntityParsing) + dtd->keepProcessing = dtd->standalone; + else { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); + poolDiscard(&dtd->pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity handler + */ + if (prologState.documentEntity && + (dtd->standalone + ? !openInternalEntities + : !dtd->hasParamEntityRefs)) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + dtd->keepProcessing = dtd->standalone; + /* cannot report skipped entities in declarations */ + if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { + skippedEntityHandler(handlerArg, name, 1); + handleDefault = XML_FALSE; + } + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + XML_Bool betweenDecl = + (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); + result = processInternalEntity(parser, entity, betweenDecl); + if (result != XML_ERROR_NONE) + return result; + handleDefault = XML_FALSE; + break; + } + if (externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) { + entity->open = XML_FALSE; + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + } + entity->open = XML_FALSE; + handleDefault = XML_FALSE; + if (!dtd->paramEntityRead) { + dtd->keepProcessing = dtd->standalone; + break; + } + } + else { + dtd->keepProcessing = dtd->standalone; + break; + } + } +#endif /* XML_DTD */ + if (!dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + break; + + /* Element declaration stuff */ + + case XML_ROLE_ELEMENT_NAME: + if (elementDeclHandler) { + declElementType = getElementType(parser, enc, s, next); + if (!declElementType) + return XML_ERROR_NO_MEMORY; + dtd->scaffLevel = 0; + dtd->scaffCount = 0; + dtd->in_eldecl = XML_TRUE; + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ANY: + case XML_ROLE_CONTENT_EMPTY: + if (dtd->in_eldecl) { + if (elementDeclHandler) { + XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); + if (!content) + return XML_ERROR_NO_MEMORY; + content->quant = XML_CQUANT_NONE; + content->name = NULL; + content->numchildren = 0; + content->children = NULL; + content->type = ((role == XML_ROLE_CONTENT_ANY) ? + XML_CTYPE_ANY : + XML_CTYPE_EMPTY); + *eventEndPP = s; + elementDeclHandler(handlerArg, declElementType->name, content); + handleDefault = XML_FALSE; + } + dtd->in_eldecl = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_PCDATA: + if (dtd->in_eldecl) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + = XML_CTYPE_MIXED; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ELEMENT: + quant = XML_CQUANT_NONE; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_OPT: + quant = XML_CQUANT_OPT; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_REP: + quant = XML_CQUANT_REP; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_PLUS: + quant = XML_CQUANT_PLUS; + elementContent: + if (dtd->in_eldecl) { + ELEMENT_TYPE *el; + const XML_Char *name; + int nameLen; + const char *nxt = (quant == XML_CQUANT_NONE + ? next + : next - enc->minBytesPerChar); + int myindex = nextScaffoldPart(parser); + if (myindex < 0) + return XML_ERROR_NO_MEMORY; + dtd->scaffold[myindex].type = XML_CTYPE_NAME; + dtd->scaffold[myindex].quant = quant; + el = getElementType(parser, enc, s, nxt); + if (!el) + return XML_ERROR_NO_MEMORY; + name = el->name; + dtd->scaffold[myindex].name = name; + nameLen = 0; + for (; name[nameLen++]; ); + dtd->contentStringLen += nameLen; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_GROUP_CLOSE: + quant = XML_CQUANT_NONE; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_OPT: + quant = XML_CQUANT_OPT; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_REP: + quant = XML_CQUANT_REP; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_PLUS: + quant = XML_CQUANT_PLUS; + closeGroup: + if (dtd->in_eldecl) { + if (elementDeclHandler) + handleDefault = XML_FALSE; + dtd->scaffLevel--; + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; + if (dtd->scaffLevel == 0) { + if (!handleDefault) { + XML_Content *model = build_model(parser); + if (!model) + return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + elementDeclHandler(handlerArg, declElementType->name, model); + } + dtd->in_eldecl = XML_FALSE; + dtd->contentStringLen = 0; + } + } + break; + /* End element declaration stuff */ + + case XML_ROLE_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + handleDefault = XML_FALSE; + break; + case XML_ROLE_COMMENT: + if (!reportComment(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + handleDefault = XML_FALSE; + break; + case XML_ROLE_NONE: + switch (tok) { + case XML_TOK_BOM: + handleDefault = XML_FALSE; + break; + } + break; + case XML_ROLE_DOCTYPE_NONE: + if (startDoctypeDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ENTITY_NONE: + if (dtd->keepProcessing && entityDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_NOTATION_NONE: + if (notationDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTLIST_NONE: + if (dtd->keepProcessing && attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ELEMENT_NONE: + if (elementDeclHandler) + handleDefault = XML_FALSE; + break; + } /* end of big switch */ + + if (handleDefault && defaultHandler) + reportDefault(parser, enc, s, next); + + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + s = next; + tok = XmlPrologTok(enc, s, end, &next); + } + } + /* not reached */ +} + +static enum XML_Error PTRCALL +epilogProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + processor = epilogProcessor; + eventPtr = s; + for (;;) { + const char *next = NULL; + int tok = XmlPrologTok(encoding, s, end, &next); + eventEndPtr = next; + switch (tok) { + /* report partial linebreak - it might be the last token */ + case -XML_TOK_PROLOG_S: + if (defaultHandler) { + reportDefault(parser, encoding, s, next); + if (parsing == XML_FINISHED) + return XML_ERROR_ABORTED; + } + *nextPtr = next; + return XML_ERROR_NONE; + case XML_TOK_NONE: + *nextPtr = s; + return XML_ERROR_NONE; + case XML_TOK_PROLOG_S: + if (defaultHandler) + reportDefault(parser, encoding, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_INVALID: + eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (!finalBuffer) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (!finalBuffer) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + default: + return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; + } + eventPtr = s = next; + switch (parsing) { + case XML_SUSPENDED: + *nextPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: ; + } + } +} + +static enum XML_Error +processInternalEntity(XML_Parser parser, ENTITY *entity, + XML_Bool betweenDecl) +{ + const char *textStart, *textEnd; + const char *next; + enum XML_Error result; + OPEN_INTERNAL_ENTITY *openEntity; + + if (freeInternalEntities) { + openEntity = freeInternalEntities; + freeInternalEntities = openEntity->next; + } + else { + openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY)); + if (!openEntity) + return XML_ERROR_NO_MEMORY; + } + entity->open = XML_TRUE; + entity->processed = 0; + openEntity->next = openInternalEntities; + openInternalEntities = openEntity; + openEntity->entity = entity; + openEntity->startTagLevel = tagLevel; + openEntity->betweenDecl = betweenDecl; + openEntity->internalEventPtr = NULL; + openEntity->internalEventEndPtr = NULL; + textStart = (char *)entity->textPtr; + textEnd = (char *)(entity->textPtr + entity->textLen); + +#ifdef XML_DTD + if (entity->is_param) { + int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); + result = doProlog(parser, internalEncoding, textStart, textEnd, tok, + next, &next, XML_FALSE); + } + else +#endif /* XML_DTD */ + result = doContent(parser, tagLevel, internalEncoding, textStart, + textEnd, &next, XML_FALSE); + + if (result == XML_ERROR_NONE) { + if (textEnd != next && parsing == XML_SUSPENDED) { + entity->processed = next - textStart; + processor = internalEntityProcessor; + } + else { + entity->open = XML_FALSE; + openInternalEntities = openEntity->next; + /* put openEntity back in list of free instances */ + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + } + return result; +} + +static enum XML_Error PTRCALL +internalEntityProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + ENTITY *entity; + const char *textStart, *textEnd; + const char *next; + enum XML_Error result; + OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities; + if (!openEntity) + return XML_ERROR_UNEXPECTED_STATE; + + entity = openEntity->entity; + textStart = ((char *)entity->textPtr) + entity->processed; + textEnd = (char *)(entity->textPtr + entity->textLen); + +#ifdef XML_DTD + if (entity->is_param) { + int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); + result = doProlog(parser, internalEncoding, textStart, textEnd, tok, + next, &next, XML_FALSE); + } + else +#endif /* XML_DTD */ + result = doContent(parser, openEntity->startTagLevel, internalEncoding, + textStart, textEnd, &next, XML_FALSE); + + if (result != XML_ERROR_NONE) + return result; + else if (textEnd != next && parsing == XML_SUSPENDED) { + entity->processed = next - (char *)entity->textPtr; + return result; + } + else { + entity->open = XML_FALSE; + openInternalEntities = openEntity->next; + /* put openEntity back in list of free instances */ + openEntity->next = freeInternalEntities; + freeInternalEntities = openEntity; + } + +#ifdef XML_DTD + if (entity->is_param) { + int tok; + processor = prologProcessor; + tok = XmlPrologTok(encoding, s, end, &next); + return doProlog(parser, encoding, s, end, tok, next, nextPtr, + (XML_Bool)!finalBuffer); + } + else +#endif /* XML_DTD */ + { + processor = contentProcessor; + /* see externalEntityContentProcessor vs contentProcessor */ + return doContent(parser, parentParser ? 1 : 0, encoding, s, end, + nextPtr, (XML_Bool)!finalBuffer); + } +} + +static enum XML_Error PTRCALL +errorProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + return errorCode; +} + +static enum XML_Error +storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) +{ + enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, + end, pool); + if (result) + return result; + if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) + poolChop(pool); + if (!poolAppendChar(pool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + return XML_ERROR_NONE; +} + +static enum XML_Error +appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + for (;;) { + const char *next; + int tok = XmlAttributeValueTok(enc, ptr, end, &next); + switch (tok) { + case XML_TOK_NONE: + return XML_ERROR_NONE; + case XML_TOK_INVALID: + if (enc == encoding) + eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_CHAR_REF: + { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, ptr); + if (n < 0) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; + } + if (!isCdata + && n == 0x20 /* space */ + && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + n = XmlEncode(n, (ICHAR *)buf); + if (!n) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; + } + for (i = 0; i < n; i++) { + if (!poolAppendChar(pool, buf[i])) + return XML_ERROR_NO_MEMORY; + } + } + break; + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, ptr, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_TRAILING_CR: + next = ptr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_ATTRIBUTE_VALUE_S: + case XML_TOK_DATA_NEWLINE: + if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + if (!poolAppendChar(pool, 0x20)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_ENTITY_REF: + { + const XML_Char *name; + ENTITY *entity; + char checkEntityDecl; + XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (ch) { + if (!poolAppendChar(pool, ch)) + return XML_ERROR_NO_MEMORY; + break; + } + name = poolStoreString(&temp2Pool, enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); + poolDiscard(&temp2Pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the default handler (if called from content) + */ + if (pool == &dtd->pool) /* are we called from prolog? */ + checkEntityDecl = +#ifdef XML_DTD + prologState.documentEntity && +#endif /* XML_DTD */ + (dtd->standalone + ? !openInternalEntities + : !dtd->hasParamEntityRefs); + else /* if (pool == &tempPool): we are called from content */ + checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; + if (checkEntityDecl) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + /* cannot report skipped entity here - see comments on + skippedEntityHandler + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + */ + if ((pool == &tempPool) && defaultHandler) + reportDefault(parser, enc, ptr, next); + break; + } + if (entity->open) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_RECURSIVE_ENTITY_REF; + } + if (entity->notation) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BINARY_ENTITY_REF; + } + if (!entity->textPtr) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; + } + else { + enum XML_Error result; + const XML_Char *textEnd = entity->textPtr + entity->textLen; + entity->open = XML_TRUE; + result = appendAttributeValue(parser, internalEncoding, isCdata, + (char *)entity->textPtr, + (char *)textEnd, pool); + entity->open = XML_FALSE; + if (result) + return result; + } + } + break; + default: + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_UNEXPECTED_STATE; + } + ptr = next; + } + /* not reached */ +} + +static enum XML_Error +storeEntityValue(XML_Parser parser, + const ENCODING *enc, + const char *entityTextPtr, + const char *entityTextEnd) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + STRING_POOL *pool = &(dtd->entityValuePool); + enum XML_Error result = XML_ERROR_NONE; +#ifdef XML_DTD + int oldInEntityValue = prologState.inEntityValue; + prologState.inEntityValue = 1; +#endif /* XML_DTD */ + /* never return Null for the value argument in EntityDeclHandler, + since this would indicate an external entity; therefore we + have to make sure that entityValuePool.start is not null */ + if (!pool->blocks) { + if (!poolGrow(pool)) + return XML_ERROR_NO_MEMORY; + } + + for (;;) { + const char *next; + int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: +#ifdef XML_DTD + if (isParamEntity || enc != encoding) { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&tempPool, enc, + entityTextPtr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); + poolDiscard(&tempPool); + if (!entity) { + /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ + /* cannot report skipped entity here - see comments on + skippedEntityHandler + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + */ + dtd->keepProcessing = dtd->standalone; + goto endEntityValue; + } + if (entity->open) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_RECURSIVE_ENTITY_REF; + goto endEntityValue; + } + if (entity->systemId) { + if (externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) { + entity->open = XML_FALSE; + result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; + goto endEntityValue; + } + entity->open = XML_FALSE; + if (!dtd->paramEntityRead) + dtd->keepProcessing = dtd->standalone; + } + else + dtd->keepProcessing = dtd->standalone; + } + else { + entity->open = XML_TRUE; + result = storeEntityValue(parser, + internalEncoding, + (char *)entity->textPtr, + (char *)(entity->textPtr + + entity->textLen)); + entity->open = XML_FALSE; + if (result) + goto endEntityValue; + } + break; + } +#endif /* XML_DTD */ + /* In the internal subset, PE references are not legal + within markup declarations, e.g entity values in this case. */ + eventPtr = entityTextPtr; + result = XML_ERROR_PARAM_ENTITY_REF; + goto endEntityValue; + case XML_TOK_NONE: + result = XML_ERROR_NONE; + goto endEntityValue; + case XML_TOK_ENTITY_REF: + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, entityTextPtr, next)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + break; + case XML_TOK_TRAILING_CR: + next = entityTextPtr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_DATA_NEWLINE: + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = 0xA; + break; + case XML_TOK_CHAR_REF: + { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, entityTextPtr); + if (n < 0) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + n = XmlEncode(n, (ICHAR *)buf); + if (!n) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + for (i = 0; i < n; i++) { + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = buf[i]; + } + } + break; + case XML_TOK_PARTIAL: + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + case XML_TOK_INVALID: + if (enc == encoding) + eventPtr = next; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + default: + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_UNEXPECTED_STATE; + goto endEntityValue; + } + entityTextPtr = next; + } +endEntityValue: +#ifdef XML_DTD + prologState.inEntityValue = oldInEntityValue; +#endif /* XML_DTD */ + return result; +} + +static void FASTCALL +normalizeLines(XML_Char *s) +{ + XML_Char *p; + for (;; s++) { + if (*s == XML_T('\0')) + return; + if (*s == 0xD) + break; + } + p = s; + do { + if (*s == 0xD) { + *p++ = 0xA; + if (*++s == 0xA) + s++; + } + else + *p++ = *s++; + } while (*s); + *p = XML_T('\0'); +} + +static int +reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + const XML_Char *target; + XML_Char *data; + const char *tem; + if (!processingInstructionHandler) { + if (defaultHandler) + reportDefault(parser, enc, start, end); + return 1; + } + start += enc->minBytesPerChar * 2; + tem = start + XmlNameLength(enc, start); + target = poolStoreString(&tempPool, enc, start, tem); + if (!target) + return 0; + poolFinish(&tempPool); + data = poolStoreString(&tempPool, enc, + XmlSkipS(enc, tem), + end - enc->minBytesPerChar*2); + if (!data) + return 0; + normalizeLines(data); + processingInstructionHandler(handlerArg, target, data); + poolClear(&tempPool); + return 1; +} + +static int +reportComment(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + XML_Char *data; + if (!commentHandler) { + if (defaultHandler) + reportDefault(parser, enc, start, end); + return 1; + } + data = poolStoreString(&tempPool, + enc, + start + enc->minBytesPerChar * 4, + end - enc->minBytesPerChar * 3); + if (!data) + return 0; + normalizeLines(data); + commentHandler(handlerArg, data); + poolClear(&tempPool); + return 1; +} + +static void +reportDefault(XML_Parser parser, const ENCODING *enc, + const char *s, const char *end) +{ + if (MUST_CONVERT(enc, s)) { + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + do { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = s; + defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); + *eventPP = s; + } while (s != end); + } + else + defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); +} + + +static int +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, + XML_Bool isId, const XML_Char *value, XML_Parser parser) +{ + DEFAULT_ATTRIBUTE *att; + if (value || isId) { + /* The handling of default attributes gets messed up if we have + a default which duplicates a non-default. */ + int i; + for (i = 0; i < type->nDefaultAtts; i++) + if (attId == type->defaultAtts[i].id) + return 1; + if (isId && !type->idAtt && !attId->xmlns) + type->idAtt = attId; + } + if (type->nDefaultAtts == type->allocDefaultAtts) { + if (type->allocDefaultAtts == 0) { + type->allocDefaultAtts = 8; + type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts + * sizeof(DEFAULT_ATTRIBUTE)); + if (!type->defaultAtts) + return 0; + } + else { + DEFAULT_ATTRIBUTE *temp; + int count = type->allocDefaultAtts * 2; + temp = (DEFAULT_ATTRIBUTE *) + REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); + if (temp == NULL) + return 0; + type->allocDefaultAtts = count; + type->defaultAtts = temp; + } + } + att = type->defaultAtts + type->nDefaultAtts; + att->id = attId; + att->value = value; + att->isCdata = isCdata; + if (!isCdata) + attId->maybeTokenized = XML_TRUE; + type->nDefaultAtts += 1; + return 1; +} + +static int +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *name; + for (name = elementType->name; *name; name++) { + if (*name == XML_T(':')) { + PREFIX *prefix; + const XML_Char *s; + for (s = elementType->name; s != name; s++) { + if (!poolAppendChar(&dtd->pool, *s)) + return 0; + } + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return 0; + prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), + sizeof(PREFIX)); + if (!prefix) + return 0; + if (prefix->name == poolStart(&dtd->pool)) + poolFinish(&dtd->pool); + else + poolDiscard(&dtd->pool); + elementType->prefix = prefix; + + } + } + return 1; +} + +static ATTRIBUTE_ID * +getAttributeId(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + ATTRIBUTE_ID *id; + const XML_Char *name; + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return NULL; + name = poolStoreString(&dtd->pool, enc, start, end); + if (!name) + return NULL; + /* skip quotation mark - its storage will be re-used (like in name[-1]) */ + ++name; + id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); + if (!id) + return NULL; + if (id->name != name) + poolDiscard(&dtd->pool); + else { + poolFinish(&dtd->pool); + if (!ns) + ; + else if (name[0] == XML_T('x') + && name[1] == XML_T('m') + && name[2] == XML_T('l') + && name[3] == XML_T('n') + && name[4] == XML_T('s') + && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) { + if (name[5] == XML_T('\0')) + id->prefix = &dtd->defaultPrefix; + else + id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX)); + id->xmlns = XML_TRUE; + } + else { + int i; + for (i = 0; name[i]; i++) { + /* attributes without prefix are *not* in the default namespace */ + if (name[i] == XML_T(':')) { + int j; + for (j = 0; j < i; j++) { + if (!poolAppendChar(&dtd->pool, name[j])) + return NULL; + } + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return NULL; + id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), + sizeof(PREFIX)); + if (id->prefix->name == poolStart(&dtd->pool)) + poolFinish(&dtd->pool); + else + poolDiscard(&dtd->pool); + break; + } + } + } + } + return id; +} + +#define CONTEXT_SEP XML_T('\f') + +static const XML_Char * +getContext(XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + HASH_TABLE_ITER iter; + XML_Bool needSep = XML_FALSE; + + if (dtd->defaultPrefix.binding) { + int i; + int len; + if (!poolAppendChar(&tempPool, XML_T('='))) + return NULL; + len = dtd->defaultPrefix.binding->uriLen; + if (namespaceSeparator != XML_T('\0')) + len--; + for (i = 0; i < len; i++) + if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) + return NULL; + needSep = XML_TRUE; + } + + hashTableIterInit(&iter, &(dtd->prefixes)); + for (;;) { + int i; + int len; + const XML_Char *s; + PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); + if (!prefix) + break; + if (!prefix->binding) + continue; + if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) + return NULL; + for (s = prefix->name; *s; s++) + if (!poolAppendChar(&tempPool, *s)) + return NULL; + if (!poolAppendChar(&tempPool, XML_T('='))) + return NULL; + len = prefix->binding->uriLen; + if (namespaceSeparator != XML_T('\0')) + len--; + for (i = 0; i < len; i++) + if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) + return NULL; + needSep = XML_TRUE; + } + + + hashTableIterInit(&iter, &(dtd->generalEntities)); + for (;;) { + const XML_Char *s; + ENTITY *e = (ENTITY *)hashTableIterNext(&iter); + if (!e) + break; + if (!e->open) + continue; + if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) + return NULL; + for (s = e->name; *s; s++) + if (!poolAppendChar(&tempPool, *s)) + return 0; + needSep = XML_TRUE; + } + + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return NULL; + return tempPool.start; +} + +static XML_Bool +setContext(XML_Parser parser, const XML_Char *context) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *s = context; + + while (*context != XML_T('\0')) { + if (*s == CONTEXT_SEP || *s == XML_T('\0')) { + ENTITY *e; + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0); + if (e) + e->open = XML_TRUE; + if (*s != XML_T('\0')) + s++; + context = s; + poolDiscard(&tempPool); + } + else if (*s == XML_T('=')) { + PREFIX *prefix; + if (poolLength(&tempPool) == 0) + prefix = &dtd->defaultPrefix; + else { + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool), + sizeof(PREFIX)); + if (!prefix) + return XML_FALSE; + if (prefix->name == poolStart(&tempPool)) { + prefix->name = poolCopyString(&dtd->pool, prefix->name); + if (!prefix->name) + return XML_FALSE; + } + poolDiscard(&tempPool); + } + for (context = s + 1; + *context != CONTEXT_SEP && *context != XML_T('\0'); + context++) + if (!poolAppendChar(&tempPool, *context)) + return XML_FALSE; + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + if (addBinding(parser, prefix, NULL, poolStart(&tempPool), + &inheritedBindings) != XML_ERROR_NONE) + return XML_FALSE; + poolDiscard(&tempPool); + if (*context != XML_T('\0')) + ++context; + s = context; + } + else { + if (!poolAppendChar(&tempPool, *s)) + return XML_FALSE; + s++; + } + } + return XML_TRUE; +} + +static void FASTCALL +normalizePublicId(XML_Char *publicId) +{ + XML_Char *p = publicId; + XML_Char *s; + for (s = publicId; *s; s++) { + switch (*s) { + case 0x20: + case 0xD: + case 0xA: + if (p != publicId && p[-1] != 0x20) + *p++ = 0x20; + break; + default: + *p++ = *s; + } + } + if (p != publicId && p[-1] == 0x20) + --p; + *p = XML_T('\0'); +} + +static DTD * +dtdCreate(const XML_Memory_Handling_Suite *ms) +{ + DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); + if (p == NULL) + return p; + poolInit(&(p->pool), ms); + poolInit(&(p->entityValuePool), ms); + hashTableInit(&(p->generalEntities), ms); + hashTableInit(&(p->elementTypes), ms); + hashTableInit(&(p->attributeIds), ms); + hashTableInit(&(p->prefixes), ms); +#ifdef XML_DTD + p->paramEntityRead = XML_FALSE; + hashTableInit(&(p->paramEntities), ms); +#endif /* XML_DTD */ + p->defaultPrefix.name = NULL; + p->defaultPrefix.binding = NULL; + + p->in_eldecl = XML_FALSE; + p->scaffIndex = NULL; + p->scaffold = NULL; + p->scaffLevel = 0; + p->scaffSize = 0; + p->scaffCount = 0; + p->contentStringLen = 0; + + p->keepProcessing = XML_TRUE; + p->hasParamEntityRefs = XML_FALSE; + p->standalone = XML_FALSE; + return p; +} + +static void +dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + hashTableIterInit(&iter, &(p->elementTypes)); + for (;;) { + ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!e) + break; + if (e->allocDefaultAtts != 0) + ms->free_fcn(e->defaultAtts); + } + hashTableClear(&(p->generalEntities)); +#ifdef XML_DTD + p->paramEntityRead = XML_FALSE; + hashTableClear(&(p->paramEntities)); +#endif /* XML_DTD */ + hashTableClear(&(p->elementTypes)); + hashTableClear(&(p->attributeIds)); + hashTableClear(&(p->prefixes)); + poolClear(&(p->pool)); + poolClear(&(p->entityValuePool)); + p->defaultPrefix.name = NULL; + p->defaultPrefix.binding = NULL; + + p->in_eldecl = XML_FALSE; + + ms->free_fcn(p->scaffIndex); + p->scaffIndex = NULL; + ms->free_fcn(p->scaffold); + p->scaffold = NULL; + + p->scaffLevel = 0; + p->scaffSize = 0; + p->scaffCount = 0; + p->contentStringLen = 0; + + p->keepProcessing = XML_TRUE; + p->hasParamEntityRefs = XML_FALSE; + p->standalone = XML_FALSE; +} + +static void +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + hashTableIterInit(&iter, &(p->elementTypes)); + for (;;) { + ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!e) + break; + if (e->allocDefaultAtts != 0) + ms->free_fcn(e->defaultAtts); + } + hashTableDestroy(&(p->generalEntities)); +#ifdef XML_DTD + hashTableDestroy(&(p->paramEntities)); +#endif /* XML_DTD */ + hashTableDestroy(&(p->elementTypes)); + hashTableDestroy(&(p->attributeIds)); + hashTableDestroy(&(p->prefixes)); + poolDestroy(&(p->pool)); + poolDestroy(&(p->entityValuePool)); + if (isDocEntity) { + ms->free_fcn(p->scaffIndex); + ms->free_fcn(p->scaffold); + } + ms->free_fcn(p); +} + +/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. + The new DTD has already been initialized. +*/ +static int +dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + + /* Copy the prefix table. */ + + hashTableIterInit(&iter, &(oldDtd->prefixes)); + for (;;) { + const XML_Char *name; + const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); + if (!oldP) + break; + name = poolCopyString(&(newDtd->pool), oldP->name); + if (!name) + return 0; + if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) + return 0; + } + + hashTableIterInit(&iter, &(oldDtd->attributeIds)); + + /* Copy the attribute id table. */ + + for (;;) { + ATTRIBUTE_ID *newA; + const XML_Char *name; + const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); + + if (!oldA) + break; + /* Remember to allocate the scratch byte before the name. */ + if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) + return 0; + name = poolCopyString(&(newDtd->pool), oldA->name); + if (!name) + return 0; + ++name; + newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, + sizeof(ATTRIBUTE_ID)); + if (!newA) + return 0; + newA->maybeTokenized = oldA->maybeTokenized; + if (oldA->prefix) { + newA->xmlns = oldA->xmlns; + if (oldA->prefix == &oldDtd->defaultPrefix) + newA->prefix = &newDtd->defaultPrefix; + else + newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), + oldA->prefix->name, 0); + } + } + + /* Copy the element type table. */ + + hashTableIterInit(&iter, &(oldDtd->elementTypes)); + + for (;;) { + int i; + ELEMENT_TYPE *newE; + const XML_Char *name; + const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!oldE) + break; + name = poolCopyString(&(newDtd->pool), oldE->name); + if (!name) + return 0; + newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, + sizeof(ELEMENT_TYPE)); + if (!newE) + return 0; + if (oldE->nDefaultAtts) { + newE->defaultAtts = (DEFAULT_ATTRIBUTE *) + ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); + if (!newE->defaultAtts) { + ms->free_fcn(newE); + return 0; + } + } + if (oldE->idAtt) + newE->idAtt = (ATTRIBUTE_ID *) + lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); + newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; + if (oldE->prefix) + newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), + oldE->prefix->name, 0); + for (i = 0; i < newE->nDefaultAtts; i++) { + newE->defaultAtts[i].id = (ATTRIBUTE_ID *) + lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); + newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; + if (oldE->defaultAtts[i].value) { + newE->defaultAtts[i].value + = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); + if (!newE->defaultAtts[i].value) + return 0; + } + else + newE->defaultAtts[i].value = NULL; + } + } + + /* Copy the entity tables. */ + if (!copyEntityTable(&(newDtd->generalEntities), + &(newDtd->pool), + &(oldDtd->generalEntities))) + return 0; + +#ifdef XML_DTD + if (!copyEntityTable(&(newDtd->paramEntities), + &(newDtd->pool), + &(oldDtd->paramEntities))) + return 0; + newDtd->paramEntityRead = oldDtd->paramEntityRead; +#endif /* XML_DTD */ + + newDtd->keepProcessing = oldDtd->keepProcessing; + newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; + newDtd->standalone = oldDtd->standalone; + + /* Don't want deep copying for scaffolding */ + newDtd->in_eldecl = oldDtd->in_eldecl; + newDtd->scaffold = oldDtd->scaffold; + newDtd->contentStringLen = oldDtd->contentStringLen; + newDtd->scaffSize = oldDtd->scaffSize; + newDtd->scaffLevel = oldDtd->scaffLevel; + newDtd->scaffIndex = oldDtd->scaffIndex; + + return 1; +} /* End dtdCopy */ + +static int +copyEntityTable(HASH_TABLE *newTable, + STRING_POOL *newPool, + const HASH_TABLE *oldTable) +{ + HASH_TABLE_ITER iter; + const XML_Char *cachedOldBase = NULL; + const XML_Char *cachedNewBase = NULL; + + hashTableIterInit(&iter, oldTable); + + for (;;) { + ENTITY *newE; + const XML_Char *name; + const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); + if (!oldE) + break; + name = poolCopyString(newPool, oldE->name); + if (!name) + return 0; + newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); + if (!newE) + return 0; + if (oldE->systemId) { + const XML_Char *tem = poolCopyString(newPool, oldE->systemId); + if (!tem) + return 0; + newE->systemId = tem; + if (oldE->base) { + if (oldE->base == cachedOldBase) + newE->base = cachedNewBase; + else { + cachedOldBase = oldE->base; + tem = poolCopyString(newPool, cachedOldBase); + if (!tem) + return 0; + cachedNewBase = newE->base = tem; + } + } + if (oldE->publicId) { + tem = poolCopyString(newPool, oldE->publicId); + if (!tem) + return 0; + newE->publicId = tem; + } + } + else { + const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, + oldE->textLen); + if (!tem) + return 0; + newE->textPtr = tem; + newE->textLen = oldE->textLen; + } + if (oldE->notation) { + const XML_Char *tem = poolCopyString(newPool, oldE->notation); + if (!tem) + return 0; + newE->notation = tem; + } + newE->is_param = oldE->is_param; + newE->is_internal = oldE->is_internal; + } + return 1; +} + +#define INIT_POWER 6 + +static XML_Bool FASTCALL +keyeq(KEY s1, KEY s2) +{ + for (; *s1 == *s2; s1++, s2++) + if (*s1 == 0) + return XML_TRUE; + return XML_FALSE; +} + +static unsigned long FASTCALL +hash(KEY s) +{ + unsigned long h = 0; + while (*s) + h = CHAR_HASH(h, *s++); + return h; +} + +static NAMED * +lookup(HASH_TABLE *table, KEY name, size_t createSize) +{ + size_t i; + if (table->size == 0) { + size_t tsize; + if (!createSize) + return NULL; + table->power = INIT_POWER; + /* table->size is a power of 2 */ + table->size = (size_t)1 << INIT_POWER; + tsize = table->size * sizeof(NAMED *); + table->v = (NAMED **)table->mem->malloc_fcn(tsize); + if (!table->v) { + table->size = 0; + return NULL; + } + memset(table->v, 0, tsize); + i = hash(name) & ((unsigned long)table->size - 1); + } + else { + unsigned long h = hash(name); + unsigned long mask = (unsigned long)table->size - 1; + unsigned char step = 0; + i = h & mask; + while (table->v[i]) { + if (keyeq(name, table->v[i]->name)) + return table->v[i]; + if (!step) + step = PROBE_STEP(h, mask, table->power); + i < step ? (i += table->size - step) : (i -= step); + } + if (!createSize) + return NULL; + + /* check for overflow (table is half full) */ + if (table->used >> (table->power - 1)) { + unsigned char newPower = table->power + 1; + size_t newSize = (size_t)1 << newPower; + unsigned long newMask = (unsigned long)newSize - 1; + size_t tsize = newSize * sizeof(NAMED *); + NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); + if (!newV) + return NULL; + memset(newV, 0, tsize); + for (i = 0; i < table->size; i++) + if (table->v[i]) { + unsigned long newHash = hash(table->v[i]->name); + size_t j = newHash & newMask; + step = 0; + while (newV[j]) { + if (!step) + step = PROBE_STEP(newHash, newMask, newPower); + j < step ? (j += newSize - step) : (j -= step); + } + newV[j] = table->v[i]; + } + table->mem->free_fcn(table->v); + table->v = newV; + table->power = newPower; + table->size = newSize; + i = h & newMask; + step = 0; + while (table->v[i]) { + if (!step) + step = PROBE_STEP(h, newMask, newPower); + i < step ? (i += newSize - step) : (i -= step); + } + } + } + table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); + if (!table->v[i]) + return NULL; + memset(table->v[i], 0, createSize); + table->v[i]->name = name; + (table->used)++; + return table->v[i]; +} + +static void FASTCALL +hashTableClear(HASH_TABLE *table) +{ + size_t i; + for (i = 0; i < table->size; i++) { + table->mem->free_fcn(table->v[i]); + table->v[i] = NULL; + } + table->used = 0; +} + +static void FASTCALL +hashTableDestroy(HASH_TABLE *table) +{ + size_t i; + for (i = 0; i < table->size; i++) + table->mem->free_fcn(table->v[i]); + table->mem->free_fcn(table->v); +} + +static void FASTCALL +hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) +{ + p->power = 0; + p->size = 0; + p->used = 0; + p->v = NULL; + p->mem = ms; +} + +static void FASTCALL +hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) +{ + iter->p = table->v; + iter->end = iter->p + table->size; +} + +static NAMED * FASTCALL +hashTableIterNext(HASH_TABLE_ITER *iter) +{ + while (iter->p != iter->end) { + NAMED *tem = *(iter->p)++; + if (tem) + return tem; + } + return NULL; +} + +static void FASTCALL +poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) +{ + pool->blocks = NULL; + pool->freeBlocks = NULL; + pool->start = NULL; + pool->ptr = NULL; + pool->end = NULL; + pool->mem = ms; +} + +static void FASTCALL +poolClear(STRING_POOL *pool) +{ + if (!pool->freeBlocks) + pool->freeBlocks = pool->blocks; + else { + BLOCK *p = pool->blocks; + while (p) { + BLOCK *tem = p->next; + p->next = pool->freeBlocks; + pool->freeBlocks = p; + p = tem; + } + } + pool->blocks = NULL; + pool->start = NULL; + pool->ptr = NULL; + pool->end = NULL; +} + +static void FASTCALL +poolDestroy(STRING_POOL *pool) +{ + BLOCK *p = pool->blocks; + while (p) { + BLOCK *tem = p->next; + pool->mem->free_fcn(p); + p = tem; + } + p = pool->freeBlocks; + while (p) { + BLOCK *tem = p->next; + pool->mem->free_fcn(p); + p = tem; + } +} + +static XML_Char * +poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) +{ + if (!pool->ptr && !poolGrow(pool)) + return NULL; + for (;;) { + XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); + if (ptr == end) + break; + if (!poolGrow(pool)) + return NULL; + } + return pool->start; +} + +static const XML_Char * FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s) +{ + do { + if (!poolAppendChar(pool, *s)) + return NULL; + } while (*s++); + s = pool->start; + poolFinish(pool); + return s; +} + +static const XML_Char * +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) +{ + if (!pool->ptr && !poolGrow(pool)) + return NULL; + for (; n > 0; --n, s++) { + if (!poolAppendChar(pool, *s)) + return NULL; + } + s = pool->start; + poolFinish(pool); + return s; +} + +static const XML_Char * FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s) +{ + while (*s) { + if (!poolAppendChar(pool, *s)) + return NULL; + s++; + } + return pool->start; +} + +static XML_Char * +poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) +{ + if (!poolAppend(pool, enc, ptr, end)) + return NULL; + if (pool->ptr == pool->end && !poolGrow(pool)) + return NULL; + *(pool->ptr)++ = 0; + return pool->start; +} + +static XML_Bool FASTCALL +poolGrow(STRING_POOL *pool) +{ + if (pool->freeBlocks) { + if (pool->start == 0) { + pool->blocks = pool->freeBlocks; + pool->freeBlocks = pool->freeBlocks->next; + pool->blocks->next = NULL; + pool->start = pool->blocks->s; + pool->end = pool->start + pool->blocks->size; + pool->ptr = pool->start; + return XML_TRUE; + } + if (pool->end - pool->start < pool->freeBlocks->size) { + BLOCK *tem = pool->freeBlocks->next; + pool->freeBlocks->next = pool->blocks; + pool->blocks = pool->freeBlocks; + pool->freeBlocks = tem; + memcpy(pool->blocks->s, pool->start, + (pool->end - pool->start) * sizeof(XML_Char)); + pool->ptr = pool->blocks->s + (pool->ptr - pool->start); + pool->start = pool->blocks->s; + pool->end = pool->start + pool->blocks->size; + return XML_TRUE; + } + } + if (pool->blocks && pool->start == pool->blocks->s) { + int blockSize = (pool->end - pool->start)*2; + pool->blocks = (BLOCK *) + pool->mem->realloc_fcn(pool->blocks, + (offsetof(BLOCK, s) + + blockSize * sizeof(XML_Char))); + if (pool->blocks == NULL) + return XML_FALSE; + pool->blocks->size = blockSize; + pool->ptr = pool->blocks->s + (pool->ptr - pool->start); + pool->start = pool->blocks->s; + pool->end = pool->start + blockSize; + } + else { + BLOCK *tem; + int blockSize = pool->end - pool->start; + if (blockSize < INIT_BLOCK_SIZE) + blockSize = INIT_BLOCK_SIZE; + else + blockSize *= 2; + tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) + + blockSize * sizeof(XML_Char)); + if (!tem) + return XML_FALSE; + tem->size = blockSize; + tem->next = pool->blocks; + pool->blocks = tem; + if (pool->ptr != pool->start) + memcpy(tem->s, pool->start, + (pool->ptr - pool->start) * sizeof(XML_Char)); + pool->ptr = tem->s + (pool->ptr - pool->start); + pool->start = tem->s; + pool->end = tem->s + blockSize; + } + return XML_TRUE; +} + +static int FASTCALL +nextScaffoldPart(XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + CONTENT_SCAFFOLD * me; + int next; + + if (!dtd->scaffIndex) { + dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); + if (!dtd->scaffIndex) + return -1; + dtd->scaffIndex[0] = 0; + } + + if (dtd->scaffCount >= dtd->scaffSize) { + CONTENT_SCAFFOLD *temp; + if (dtd->scaffold) { + temp = (CONTENT_SCAFFOLD *) + REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) + return -1; + dtd->scaffSize *= 2; + } + else { + temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS + * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) + return -1; + dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; + } + dtd->scaffold = temp; + } + next = dtd->scaffCount++; + me = &dtd->scaffold[next]; + if (dtd->scaffLevel) { + CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; + if (parent->lastchild) { + dtd->scaffold[parent->lastchild].nextsib = next; + } + if (!parent->childcnt) + parent->firstchild = next; + parent->lastchild = next; + parent->childcnt++; + } + me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; + return next; +} + +static void +build_node(XML_Parser parser, + int src_node, + XML_Content *dest, + XML_Content **contpos, + XML_Char **strpos) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + dest->type = dtd->scaffold[src_node].type; + dest->quant = dtd->scaffold[src_node].quant; + if (dest->type == XML_CTYPE_NAME) { + const XML_Char *src; + dest->name = *strpos; + src = dtd->scaffold[src_node].name; + for (;;) { + *(*strpos)++ = *src; + if (!*src) + break; + src++; + } + dest->numchildren = 0; + dest->children = NULL; + } + else { + unsigned int i; + int cn; + dest->numchildren = dtd->scaffold[src_node].childcnt; + dest->children = *contpos; + *contpos += dest->numchildren; + for (i = 0, cn = dtd->scaffold[src_node].firstchild; + i < dest->numchildren; + i++, cn = dtd->scaffold[cn].nextsib) { + build_node(parser, cn, &(dest->children[i]), contpos, strpos); + } + dest->name = NULL; + } +} + +static XML_Content * +build_model (XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + XML_Content *ret; + XML_Content *cpos; + XML_Char * str; + int allocsize = (dtd->scaffCount * sizeof(XML_Content) + + (dtd->contentStringLen * sizeof(XML_Char))); + + ret = (XML_Content *)MALLOC(allocsize); + if (!ret) + return NULL; + + str = (XML_Char *) (&ret[dtd->scaffCount]); + cpos = &ret[1]; + + build_node(parser, 0, ret, &cpos, &str); + return ret; +} + +static ELEMENT_TYPE * +getElementType(XML_Parser parser, + const ENCODING *enc, + const char *ptr, + const char *end) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); + ELEMENT_TYPE *ret; + + if (!name) + return NULL; + ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); + if (!ret) + return NULL; + if (ret->name != name) + poolDiscard(&dtd->pool); + else { + poolFinish(&dtd->pool); + if (!setElementTypePrefix(parser, ret)) + return NULL; + } + return ret; +} Added: external/celementtree-1.0.5-20051216/expat/xmlrole.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/xmlrole.c Fri Dec 16 23:02:39 2005 @@ -0,0 +1,1328 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "expat_external.h" +#include "internal.h" +#include "xmlrole.h" +#include "ascii.h" + +/* Doesn't check: + + that ,| are not mixed in a model group + content of literals + +*/ + +static const char KW_ANY[] = { + ASCII_A, ASCII_N, ASCII_Y, '\0' }; +static const char KW_ATTLIST[] = { + ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; +static const char KW_CDATA[] = { + ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_DOCTYPE[] = { + ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; +static const char KW_ELEMENT[] = { + ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; +static const char KW_EMPTY[] = { + ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; +static const char KW_ENTITIES[] = { + ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, + '\0' }; +static const char KW_ENTITY[] = { + ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; +static const char KW_FIXED[] = { + ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; +static const char KW_ID[] = { + ASCII_I, ASCII_D, '\0' }; +static const char KW_IDREF[] = { + ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; +static const char KW_IDREFS[] = { + ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; +static const char KW_IGNORE[] = { + ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; +static const char KW_IMPLIED[] = { + ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; +static const char KW_INCLUDE[] = { + ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; +static const char KW_NDATA[] = { + ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_NMTOKEN[] = { + ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; +static const char KW_NMTOKENS[] = { + ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, + '\0' }; +static const char KW_NOTATION[] = + { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, + '\0' }; +static const char KW_PCDATA[] = { + ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_PUBLIC[] = { + ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; +static const char KW_REQUIRED[] = { + ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, + '\0' }; +static const char KW_SYSTEM[] = { + ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; + +#ifndef MIN_BYTES_PER_CHAR +#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) +#endif + +#ifdef XML_DTD +#define setTopLevel(state) \ + ((state)->handler = ((state)->documentEntity \ + ? internalSubset \ + : externalSubset1)) +#else /* not XML_DTD */ +#define setTopLevel(state) ((state)->handler = internalSubset) +#endif /* not XML_DTD */ + +typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc); + +static PROLOG_HANDLER + prolog0, prolog1, prolog2, + doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, + internalSubset, + entity0, entity1, entity2, entity3, entity4, entity5, entity6, + entity7, entity8, entity9, entity10, + notation0, notation1, notation2, notation3, notation4, + attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, + attlist7, attlist8, attlist9, + element0, element1, element2, element3, element4, element5, element6, + element7, +#ifdef XML_DTD + externalSubset0, externalSubset1, + condSect0, condSect1, condSect2, +#endif /* XML_DTD */ + declClose, + error; + +static int FASTCALL common(PROLOG_STATE *state, int tok); + +static int PTRCALL +prolog0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + state->handler = prolog1; + return XML_ROLE_NONE; + case XML_TOK_XML_DECL: + state->handler = prolog1; + return XML_ROLE_XML_DECL; + case XML_TOK_PI: + state->handler = prolog1; + return XML_ROLE_PI; + case XML_TOK_COMMENT: + state->handler = prolog1; + return XML_ROLE_COMMENT; + case XML_TOK_BOM: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (!XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_DOCTYPE)) + break; + state->handler = doctype0; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +prolog1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_BOM: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (!XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_DOCTYPE)) + break; + state->handler = doctype0; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +prolog2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +doctype0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = doctype1; + return XML_ROLE_DOCTYPE_NAME; + } + return common(state, tok); +} + +static int PTRCALL +doctype1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = internalSubset; + return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = doctype3; + return XML_ROLE_DOCTYPE_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = doctype2; + return XML_ROLE_DOCTYPE_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +doctype2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_LITERAL: + state->handler = doctype3; + return XML_ROLE_DOCTYPE_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +doctype3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_LITERAL: + state->handler = doctype4; + return XML_ROLE_DOCTYPE_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +doctype4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = internalSubset; + return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + } + return common(state, tok); +} + +static int PTRCALL +doctype5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + } + return common(state, tok); +} + +static int PTRCALL +internalSubset(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ENTITY)) { + state->handler = entity0; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ATTLIST)) { + state->handler = attlist0; + return XML_ROLE_ATTLIST_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ELEMENT)) { + state->handler = element0; + return XML_ROLE_ELEMENT_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_NOTATION)) { + state->handler = notation0; + return XML_ROLE_NOTATION_NONE; + } + break; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_PARAM_ENTITY_REF: + return XML_ROLE_PARAM_ENTITY_REF; + case XML_TOK_CLOSE_BRACKET: + state->handler = doctype5; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_NONE: + return XML_ROLE_NONE; + } + return common(state, tok); +} + +#ifdef XML_DTD + +static int PTRCALL +externalSubset0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + state->handler = externalSubset1; + if (tok == XML_TOK_XML_DECL) + return XML_ROLE_TEXT_DECL; + return externalSubset1(state, tok, ptr, end, enc); +} + +static int PTRCALL +externalSubset1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_COND_SECT_OPEN: + state->handler = condSect0; + return XML_ROLE_NONE; + case XML_TOK_COND_SECT_CLOSE: + if (state->includeLevel == 0) + break; + state->includeLevel -= 1; + return XML_ROLE_NONE; + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_CLOSE_BRACKET: + break; + case XML_TOK_NONE: + if (state->includeLevel) + break; + return XML_ROLE_NONE; + default: + return internalSubset(state, tok, ptr, end, enc); + } + return common(state, tok); +} + +#endif /* XML_DTD */ + +static int PTRCALL +entity0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_PERCENT: + state->handler = entity1; + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = entity2; + return XML_ROLE_GENERAL_ENTITY_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = entity7; + return XML_ROLE_PARAM_ENTITY_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = entity4; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = entity3; + return XML_ROLE_ENTITY_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +entity3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity4; + return XML_ROLE_ENTITY_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity5; + return XML_ROLE_ENTITY_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ENTITY_COMPLETE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { + state->handler = entity6; + return XML_ROLE_ENTITY_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +entity6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_NOTATION_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = entity9; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = entity8; + return XML_ROLE_ENTITY_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +entity8(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity9; + return XML_ROLE_ENTITY_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity9(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity10; + return XML_ROLE_ENTITY_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity10(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ENTITY_COMPLETE; + } + return common(state, tok); +} + +static int PTRCALL +notation0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_NAME: + state->handler = notation1; + return XML_ROLE_NOTATION_NAME; + } + return common(state, tok); +} + +static int PTRCALL +notation1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = notation3; + return XML_ROLE_NOTATION_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = notation2; + return XML_ROLE_NOTATION_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +notation2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = notation4; + return XML_ROLE_NOTATION_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +notation3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_NOTATION_NONE; + return XML_ROLE_NOTATION_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +notation4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_NOTATION_NONE; + return XML_ROLE_NOTATION_SYSTEM_ID; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_NOTATION_NO_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +attlist0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist1; + return XML_ROLE_ATTLIST_ELEMENT_NAME; + } + return common(state, tok); +} + +static int PTRCALL +attlist1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist2; + return XML_ROLE_ATTRIBUTE_NAME; + } + return common(state, tok); +} + +static int PTRCALL +attlist2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + { + static const char *types[] = { + KW_CDATA, + KW_ID, + KW_IDREF, + KW_IDREFS, + KW_ENTITY, + KW_ENTITIES, + KW_NMTOKEN, + KW_NMTOKENS, + }; + int i; + for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) + if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { + state->handler = attlist8; + return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; + } + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { + state->handler = attlist5; + return XML_ROLE_ATTLIST_NONE; + } + break; + case XML_TOK_OPEN_PAREN: + state->handler = attlist3; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NMTOKEN: + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist4; + return XML_ROLE_ATTRIBUTE_ENUM_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = attlist8; + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OR: + state->handler = attlist3; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OPEN_PAREN: + state->handler = attlist6; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + state->handler = attlist7; + return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = attlist8; + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OR: + state->handler = attlist6; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +/* default value */ +static int PTRCALL +attlist8(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_POUND_NAME: + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_IMPLIED)) { + state->handler = attlist1; + return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; + } + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_REQUIRED)) { + state->handler = attlist1; + return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; + } + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_FIXED)) { + state->handler = attlist9; + return XML_ROLE_ATTLIST_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = attlist1; + return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist9(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_LITERAL: + state->handler = attlist1; + return XML_ROLE_FIXED_ATTRIBUTE_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +element0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element1; + return XML_ROLE_ELEMENT_NAME; + } + return common(state, tok); +} + +static int PTRCALL +element1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_CONTENT_EMPTY; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_CONTENT_ANY; + } + break; + case XML_TOK_OPEN_PAREN: + state->handler = element2; + state->level = 1; + return XML_ROLE_GROUP_OPEN; + } + return common(state, tok); +} + +static int PTRCALL +element2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_POUND_NAME: + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_PCDATA)) { + state->handler = element3; + return XML_ROLE_CONTENT_PCDATA; + } + break; + case XML_TOK_OPEN_PAREN: + state->level = 2; + state->handler = element6; + return XML_ROLE_GROUP_OPEN; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT; + case XML_TOK_NAME_QUESTION: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_OPT; + case XML_TOK_NAME_ASTERISK: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_REP; + case XML_TOK_NAME_PLUS: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_PLUS; + } + return common(state, tok); +} + +static int PTRCALL +element3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_OR: + state->handler = element4; + return XML_ROLE_ELEMENT_NONE; + } + return common(state, tok); +} + +static int PTRCALL +element4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element5; + return XML_ROLE_CONTENT_ELEMENT; + } + return common(state, tok); +} + +static int PTRCALL +element5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_OR: + state->handler = element4; + return XML_ROLE_ELEMENT_NONE; + } + return common(state, tok); +} + +static int PTRCALL +element6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_OPEN_PAREN: + state->level += 1; + return XML_ROLE_GROUP_OPEN; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT; + case XML_TOK_NAME_QUESTION: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_OPT; + case XML_TOK_NAME_ASTERISK: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_REP; + case XML_TOK_NAME_PLUS: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_PLUS; + } + return common(state, tok); +} + +static int PTRCALL +element7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_CLOSE_PAREN_QUESTION: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_OPT; + case XML_TOK_CLOSE_PAREN_PLUS: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_PLUS; + case XML_TOK_COMMA: + state->handler = element6; + return XML_ROLE_GROUP_SEQUENCE; + case XML_TOK_OR: + state->handler = element6; + return XML_ROLE_GROUP_CHOICE; + } + return common(state, tok); +} + +#ifdef XML_DTD + +static int PTRCALL +condSect0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { + state->handler = condSect1; + return XML_ROLE_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { + state->handler = condSect2; + return XML_ROLE_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +condSect1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = externalSubset1; + state->includeLevel += 1; + return XML_ROLE_NONE; + } + return common(state, tok); +} + +static int PTRCALL +condSect2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = externalSubset1; + return XML_ROLE_IGNORE_SECT; + } + return common(state, tok); +} + +#endif /* XML_DTD */ + +static int PTRCALL +declClose(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return state->role_none; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return state->role_none; + } + return common(state, tok); +} + +static int PTRCALL +error(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + return XML_ROLE_NONE; +} + +static int FASTCALL +common(PROLOG_STATE *state, int tok) +{ +#ifdef XML_DTD + if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) + return XML_ROLE_INNER_PARAM_ENTITY_REF; +#endif + state->handler = error; + return XML_ROLE_ERROR; +} + +void +XmlPrologStateInit(PROLOG_STATE *state) +{ + state->handler = prolog0; +#ifdef XML_DTD + state->documentEntity = 1; + state->includeLevel = 0; + state->inEntityValue = 0; +#endif /* XML_DTD */ +} + +#ifdef XML_DTD + +void +XmlPrologStateInitExternalEntity(PROLOG_STATE *state) +{ + state->handler = externalSubset0; + state->documentEntity = 0; + state->includeLevel = 0; +} + +#endif /* XML_DTD */ Added: external/celementtree-1.0.5-20051216/expat/xmlrole.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/xmlrole.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,114 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlRole_INCLUDED +#define XmlRole_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt +#endif + +#include "xmltok.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + XML_ROLE_ERROR = -1, + XML_ROLE_NONE = 0, + XML_ROLE_XML_DECL, + XML_ROLE_INSTANCE_START, + XML_ROLE_DOCTYPE_NONE, + XML_ROLE_DOCTYPE_NAME, + XML_ROLE_DOCTYPE_SYSTEM_ID, + XML_ROLE_DOCTYPE_PUBLIC_ID, + XML_ROLE_DOCTYPE_INTERNAL_SUBSET, + XML_ROLE_DOCTYPE_CLOSE, + XML_ROLE_GENERAL_ENTITY_NAME, + XML_ROLE_PARAM_ENTITY_NAME, + XML_ROLE_ENTITY_NONE, + XML_ROLE_ENTITY_VALUE, + XML_ROLE_ENTITY_SYSTEM_ID, + XML_ROLE_ENTITY_PUBLIC_ID, + XML_ROLE_ENTITY_COMPLETE, + XML_ROLE_ENTITY_NOTATION_NAME, + XML_ROLE_NOTATION_NONE, + XML_ROLE_NOTATION_NAME, + XML_ROLE_NOTATION_SYSTEM_ID, + XML_ROLE_NOTATION_NO_SYSTEM_ID, + XML_ROLE_NOTATION_PUBLIC_ID, + XML_ROLE_ATTRIBUTE_NAME, + XML_ROLE_ATTRIBUTE_TYPE_CDATA, + XML_ROLE_ATTRIBUTE_TYPE_ID, + XML_ROLE_ATTRIBUTE_TYPE_IDREF, + XML_ROLE_ATTRIBUTE_TYPE_IDREFS, + XML_ROLE_ATTRIBUTE_TYPE_ENTITY, + XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, + XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, + XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, + XML_ROLE_ATTRIBUTE_ENUM_VALUE, + XML_ROLE_ATTRIBUTE_NOTATION_VALUE, + XML_ROLE_ATTLIST_NONE, + XML_ROLE_ATTLIST_ELEMENT_NAME, + XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, + XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, + XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, + XML_ROLE_FIXED_ATTRIBUTE_VALUE, + XML_ROLE_ELEMENT_NONE, + XML_ROLE_ELEMENT_NAME, + XML_ROLE_CONTENT_ANY, + XML_ROLE_CONTENT_EMPTY, + XML_ROLE_CONTENT_PCDATA, + XML_ROLE_GROUP_OPEN, + XML_ROLE_GROUP_CLOSE, + XML_ROLE_GROUP_CLOSE_REP, + XML_ROLE_GROUP_CLOSE_OPT, + XML_ROLE_GROUP_CLOSE_PLUS, + XML_ROLE_GROUP_CHOICE, + XML_ROLE_GROUP_SEQUENCE, + XML_ROLE_CONTENT_ELEMENT, + XML_ROLE_CONTENT_ELEMENT_REP, + XML_ROLE_CONTENT_ELEMENT_OPT, + XML_ROLE_CONTENT_ELEMENT_PLUS, + XML_ROLE_PI, + XML_ROLE_COMMENT, +#ifdef XML_DTD + XML_ROLE_TEXT_DECL, + XML_ROLE_IGNORE_SECT, + XML_ROLE_INNER_PARAM_ENTITY_REF, +#endif /* XML_DTD */ + XML_ROLE_PARAM_ENTITY_REF +}; + +typedef struct prolog_state { + int (PTRCALL *handler) (struct prolog_state *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc); + unsigned level; + int role_none; +#ifdef XML_DTD + unsigned includeLevel; + int documentEntity; + int inEntityValue; +#endif /* XML_DTD */ +} PROLOG_STATE; + +void XmlPrologStateInit(PROLOG_STATE *); +#ifdef XML_DTD +void XmlPrologStateInitExternalEntity(PROLOG_STATE *); +#endif /* XML_DTD */ + +#define XmlTokenRole(state, tok, ptr, end, enc) \ + (((state)->handler)(state, tok, ptr, end, enc)) + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlRole_INCLUDED */ Added: external/celementtree-1.0.5-20051216/expat/xmltok.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/xmltok.c Fri Dec 16 23:02:39 2005 @@ -0,0 +1,1637 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "expat_external.h" +#include "internal.h" +#include "xmltok.h" +#include "nametab.h" + +#ifdef XML_DTD +#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) +#else +#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ +#endif + +#define VTABLE1 \ + { PREFIX(prologTok), PREFIX(contentTok), \ + PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ + { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ + PREFIX(sameName), \ + PREFIX(nameMatchesAscii), \ + PREFIX(nameLength), \ + PREFIX(skipS), \ + PREFIX(getAtts), \ + PREFIX(charRefNumber), \ + PREFIX(predefinedEntityName), \ + PREFIX(updatePosition), \ + PREFIX(isPublicId) + +#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) + +#define UCS2_GET_NAMING(pages, hi, lo) \ + (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) + +/* A 2 byte UTF-8 representation splits the characters 11 bits between + the bottom 5 and 6 bits of the bytes. We need 8 bits to index into + pages, 3 bits to add to that index and 5 bits to generate the mask. +*/ +#define UTF8_GET_NAMING2(pages, byte) \ + (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ + + ((((byte)[0]) & 3) << 1) \ + + ((((byte)[1]) >> 5) & 1)] \ + & (1 << (((byte)[1]) & 0x1F))) + +/* A 3 byte UTF-8 representation splits the characters 16 bits between + the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index + into pages, 3 bits to add to that index and 5 bits to generate the + mask. +*/ +#define UTF8_GET_NAMING3(pages, byte) \ + (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ + + ((((byte)[1]) >> 2) & 0xF)] \ + << 3) \ + + ((((byte)[1]) & 3) << 1) \ + + ((((byte)[2]) >> 5) & 1)] \ + & (1 << (((byte)[2]) & 0x1F))) + +#define UTF8_GET_NAMING(pages, p, n) \ + ((n) == 2 \ + ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ + : ((n) == 3 \ + ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ + : 0)) + +/* Detection of invalid UTF-8 sequences is based on Table 3.1B + of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ + with the additional restriction of not allowing the Unicode + code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). + Implementation details: + (A & 0x80) == 0 means A < 0x80 + and + (A & 0xC0) == 0xC0 means A > 0xBF +*/ + +#define UTF8_INVALID2(p) \ + ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) + +#define UTF8_INVALID3(p) \ + (((p)[2] & 0x80) == 0 \ + || \ + ((*p) == 0xEF && (p)[1] == 0xBF \ + ? \ + (p)[2] > 0xBD \ + : \ + ((p)[2] & 0xC0) == 0xC0) \ + || \ + ((*p) == 0xE0 \ + ? \ + (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ + : \ + ((p)[1] & 0x80) == 0 \ + || \ + ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) + +#define UTF8_INVALID4(p) \ + (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ + || \ + ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ + || \ + ((*p) == 0xF0 \ + ? \ + (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ + : \ + ((p)[1] & 0x80) == 0 \ + || \ + ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) + +static int PTRFASTCALL +isNever(const ENCODING *enc, const char *p) +{ + return 0; +} + +static int PTRFASTCALL +utf8_isName2(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isName3(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); +} + +#define utf8_isName4 isNever + +static int PTRFASTCALL +utf8_isNmstrt2(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isNmstrt3(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); +} + +#define utf8_isNmstrt4 isNever + +static int PTRFASTCALL +utf8_isInvalid2(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID2((const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isInvalid3(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID3((const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isInvalid4(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID4((const unsigned char *)p); +} + +struct normal_encoding { + ENCODING enc; + unsigned char type[256]; +#ifdef XML_MIN_SIZE + int (PTRFASTCALL *byteType)(const ENCODING *, const char *); + int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); + int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); + int (PTRCALL *charMatches)(const ENCODING *, const char *, int); +#endif /* XML_MIN_SIZE */ + int (PTRFASTCALL *isName2)(const ENCODING *, const char *); + int (PTRFASTCALL *isName3)(const ENCODING *, const char *); + int (PTRFASTCALL *isName4)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); +}; + +#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) + +#ifdef XML_MIN_SIZE + +#define STANDARD_VTABLE(E) \ + E ## byteType, \ + E ## isNameMin, \ + E ## isNmstrtMin, \ + E ## byteToAscii, \ + E ## charMatches, + +#else + +#define STANDARD_VTABLE(E) /* as nothing */ + +#endif + +#define NORMAL_VTABLE(E) \ + E ## isName2, \ + E ## isName3, \ + E ## isName4, \ + E ## isNmstrt2, \ + E ## isNmstrt3, \ + E ## isNmstrt4, \ + E ## isInvalid2, \ + E ## isInvalid3, \ + E ## isInvalid4 + +static int FASTCALL checkCharRefNumber(int); + +#include "xmltok_impl.h" +#include "ascii.h" + +#ifdef XML_MIN_SIZE +#define sb_isNameMin isNever +#define sb_isNmstrtMin isNever +#endif + +#ifdef XML_MIN_SIZE +#define MINBPC(enc) ((enc)->minBytesPerChar) +#else +/* minimum bytes per character */ +#define MINBPC(enc) 1 +#endif + +#define SB_BYTE_TYPE(enc, p) \ + (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) + +#ifdef XML_MIN_SIZE +static int PTRFASTCALL +sb_byteType(const ENCODING *enc, const char *p) +{ + return SB_BYTE_TYPE(enc, p); +} +#define BYTE_TYPE(enc, p) \ + (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) +#else +#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) +#endif + +#ifdef XML_MIN_SIZE +#define BYTE_TO_ASCII(enc, p) \ + (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) +static int PTRFASTCALL +sb_byteToAscii(const ENCODING *enc, const char *p) +{ + return *p; +} +#else +#define BYTE_TO_ASCII(enc, p) (*(p)) +#endif + +#define IS_NAME_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) +#define IS_NMSTRT_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) +#define IS_INVALID_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) + +#ifdef XML_MIN_SIZE +#define IS_NAME_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) +#else +#define IS_NAME_CHAR_MINBPC(enc, p) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) +#endif + +#ifdef XML_MIN_SIZE +#define CHAR_MATCHES(enc, p, c) \ + (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) +static int PTRCALL +sb_charMatches(const ENCODING *enc, const char *p, int c) +{ + return *p == c; +} +#else +/* c is an ASCII character */ +#define CHAR_MATCHES(enc, p, c) (*(p) == c) +#endif + +#define PREFIX(ident) normal_ ## ident +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ + UTF8_cval1 = 0x00, + UTF8_cval2 = 0xc0, + UTF8_cval3 = 0xe0, + UTF8_cval4 = 0xf0 +}; + +static void PTRCALL +utf8_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + char *to; + const char *from; + if (fromLim - *fromP > toLim - *toP) { + /* Avoid copying partial characters. */ + for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) + if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) + break; + } + for (to = *toP, from = *fromP; from != fromLim; from++, to++) + *to = *from; + *fromP = from; + *toP = to; +} + +static void PTRCALL +utf8_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + unsigned short *to = *toP; + const char *from = *fromP; + while (from != fromLim && to != toLim) { + switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { + case BT_LEAD2: + *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); + from += 2; + break; + case BT_LEAD3: + *to++ = (unsigned short)(((from[0] & 0xf) << 12) + | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); + from += 3; + break; + case BT_LEAD4: + { + unsigned long n; + if (to + 1 == toLim) + goto after; + n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) + | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); + n -= 0x10000; + to[0] = (unsigned short)((n >> 10) | 0xD800); + to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); + to += 2; + from += 4; + } + break; + default: + *to++ = *from++; + break; + } + } +after: + *fromP = from; + *toP = to; +} + +#ifdef XML_NS +static const struct normal_encoding utf8_encoding_ns = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#include "asciitab.h" +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; +#endif + +static const struct normal_encoding utf8_encoding = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +#ifdef XML_NS + +static const struct normal_encoding internal_utf8_encoding_ns = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#include "iasciitab.h" +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +#endif + +static const struct normal_encoding internal_utf8_encoding = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +static void PTRCALL +latin1_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + for (;;) { + unsigned char c; + if (*fromP == fromLim) + break; + c = (unsigned char)**fromP; + if (c & 0x80) { + if (toLim - *toP < 2) + break; + *(*toP)++ = (char)((c >> 6) | UTF8_cval2); + *(*toP)++ = (char)((c & 0x3f) | 0x80); + (*fromP)++; + } + else { + if (*toP == toLim) + break; + *(*toP)++ = *(*fromP)++; + } + } +} + +static void PTRCALL +latin1_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + while (*fromP != fromLim && *toP != toLim) + *(*toP)++ = (unsigned char)*(*fromP)++; +} + +#ifdef XML_NS + +static const struct normal_encoding latin1_encoding_ns = { + { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) +}; + +#endif + +static const struct normal_encoding latin1_encoding = { + { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) +}; + +static void PTRCALL +ascii_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + while (*fromP != fromLim && *toP != toLim) + *(*toP)++ = *(*fromP)++; +} + +#ifdef XML_NS + +static const struct normal_encoding ascii_encoding_ns = { + { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, + { +#include "asciitab.h" +/* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) +}; + +#endif + +static const struct normal_encoding ascii_encoding = { + { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +/* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) +}; + +static int PTRFASTCALL +unicode_byte_type(char hi, char lo) +{ + switch ((unsigned char)hi) { + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + return BT_LEAD4; + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + return BT_TRAIL; + case 0xFF: + switch ((unsigned char)lo) { + case 0xFF: + case 0xFE: + return BT_NONXML; + } + break; + } + return BT_NONASCII; +} + +#define DEFINE_UTF16_TO_UTF8(E) \ +static void PTRCALL \ +E ## toUtf8(const ENCODING *enc, \ + const char **fromP, const char *fromLim, \ + char **toP, const char *toLim) \ +{ \ + const char *from; \ + for (from = *fromP; from != fromLim; from += 2) { \ + int plane; \ + unsigned char lo2; \ + unsigned char lo = GET_LO(from); \ + unsigned char hi = GET_HI(from); \ + switch (hi) { \ + case 0: \ + if (lo < 0x80) { \ + if (*toP == toLim) { \ + *fromP = from; \ + return; \ + } \ + *(*toP)++ = lo; \ + break; \ + } \ + /* fall through */ \ + case 0x1: case 0x2: case 0x3: \ + case 0x4: case 0x5: case 0x6: case 0x7: \ + if (toLim - *toP < 2) { \ + *fromP = from; \ + return; \ + } \ + *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + default: \ + if (toLim - *toP < 3) { \ + *fromP = from; \ + return; \ + } \ + /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ + *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ + *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ + if (toLim - *toP < 4) { \ + *fromP = from; \ + return; \ + } \ + plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ + *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ + *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ + from += 2; \ + lo2 = GET_LO(from); \ + *(*toP)++ = (((lo & 0x3) << 4) \ + | ((GET_HI(from) & 0x3) << 2) \ + | (lo2 >> 6) \ + | 0x80); \ + *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ + break; \ + } \ + } \ + *fromP = from; \ +} + +#define DEFINE_UTF16_TO_UTF16(E) \ +static void PTRCALL \ +E ## toUtf16(const ENCODING *enc, \ + const char **fromP, const char *fromLim, \ + unsigned short **toP, const unsigned short *toLim) \ +{ \ + /* Avoid copying first half only of surrogate */ \ + if (fromLim - *fromP > ((toLim - *toP) << 1) \ + && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ + fromLim -= 2; \ + for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ + *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ +} + +#define SET2(ptr, ch) \ + (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) +#define GET_LO(ptr) ((unsigned char)(ptr)[0]) +#define GET_HI(ptr) ((unsigned char)(ptr)[1]) + +DEFINE_UTF16_TO_UTF8(little2_) +DEFINE_UTF16_TO_UTF16(little2_) + +#undef SET2 +#undef GET_LO +#undef GET_HI + +#define SET2(ptr, ch) \ + (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) +#define GET_LO(ptr) ((unsigned char)(ptr)[1]) +#define GET_HI(ptr) ((unsigned char)(ptr)[0]) + +DEFINE_UTF16_TO_UTF8(big2_) +DEFINE_UTF16_TO_UTF16(big2_) + +#undef SET2 +#undef GET_LO +#undef GET_HI + +#define LITTLE2_BYTE_TYPE(enc, p) \ + ((p)[1] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ + : unicode_byte_type((p)[1], (p)[0])) +#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) +#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) +#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) +#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) + +#ifdef XML_MIN_SIZE + +static int PTRFASTCALL +little2_byteType(const ENCODING *enc, const char *p) +{ + return LITTLE2_BYTE_TYPE(enc, p); +} + +static int PTRFASTCALL +little2_byteToAscii(const ENCODING *enc, const char *p) +{ + return LITTLE2_BYTE_TO_ASCII(enc, p); +} + +static int PTRCALL +little2_charMatches(const ENCODING *enc, const char *p, int c) +{ + return LITTLE2_CHAR_MATCHES(enc, p, c); +} + +static int PTRFASTCALL +little2_isNameMin(const ENCODING *enc, const char *p) +{ + return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); +} + +static int PTRFASTCALL +little2_isNmstrtMin(const ENCODING *enc, const char *p) +{ + return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); +} + +#undef VTABLE +#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 + +#else /* not XML_MIN_SIZE */ + +#undef PREFIX +#define PREFIX(ident) little2_ ## ident +#define MINBPC(enc) 2 +/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ +#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) +#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) +#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) +#define IS_NAME_CHAR(enc, p, n) 0 +#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) +#define IS_NMSTRT_CHAR(enc, p, n) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) + +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +#endif /* not XML_MIN_SIZE */ + +#ifdef XML_NS + +static const struct normal_encoding little2_encoding_ns = { + { VTABLE, 2, 0, +#if BYTEORDER == 1234 + 1 +#else + 0 +#endif + }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + +static const struct normal_encoding little2_encoding = { + { VTABLE, 2, 0, +#if BYTEORDER == 1234 + 1 +#else + 0 +#endif + }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#if BYTEORDER != 4321 + +#ifdef XML_NS + +static const struct normal_encoding internal_little2_encoding_ns = { + { VTABLE, 2, 0, 1 }, + { +#include "iasciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + +static const struct normal_encoding internal_little2_encoding = { + { VTABLE, 2, 0, 1 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + + +#define BIG2_BYTE_TYPE(enc, p) \ + ((p)[0] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ + : unicode_byte_type((p)[0], (p)[1])) +#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) +#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) +#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) +#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) + +#ifdef XML_MIN_SIZE + +static int PTRFASTCALL +big2_byteType(const ENCODING *enc, const char *p) +{ + return BIG2_BYTE_TYPE(enc, p); +} + +static int PTRFASTCALL +big2_byteToAscii(const ENCODING *enc, const char *p) +{ + return BIG2_BYTE_TO_ASCII(enc, p); +} + +static int PTRCALL +big2_charMatches(const ENCODING *enc, const char *p, int c) +{ + return BIG2_CHAR_MATCHES(enc, p, c); +} + +static int PTRFASTCALL +big2_isNameMin(const ENCODING *enc, const char *p) +{ + return BIG2_IS_NAME_CHAR_MINBPC(enc, p); +} + +static int PTRFASTCALL +big2_isNmstrtMin(const ENCODING *enc, const char *p) +{ + return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); +} + +#undef VTABLE +#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 + +#else /* not XML_MIN_SIZE */ + +#undef PREFIX +#define PREFIX(ident) big2_ ## ident +#define MINBPC(enc) 2 +/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ +#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) +#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) +#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) +#define IS_NAME_CHAR(enc, p, n) 0 +#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) +#define IS_NMSTRT_CHAR(enc, p, n) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) + +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +#endif /* not XML_MIN_SIZE */ + +#ifdef XML_NS + +static const struct normal_encoding big2_encoding_ns = { + { VTABLE, 2, 0, +#if BYTEORDER == 4321 + 1 +#else + 0 +#endif + }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +static const struct normal_encoding big2_encoding = { + { VTABLE, 2, 0, +#if BYTEORDER == 4321 + 1 +#else + 0 +#endif + }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#if BYTEORDER != 1234 + +#ifdef XML_NS + +static const struct normal_encoding internal_big2_encoding_ns = { + { VTABLE, 2, 0, 1 }, + { +#include "iasciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +static const struct normal_encoding internal_big2_encoding = { + { VTABLE, 2, 0, 1 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +#undef PREFIX + +static int FASTCALL +streqci(const char *s1, const char *s2) +{ + for (;;) { + char c1 = *s1++; + char c2 = *s2++; + if (ASCII_a <= c1 && c1 <= ASCII_z) + c1 += ASCII_A - ASCII_a; + if (ASCII_a <= c2 && c2 <= ASCII_z) + c2 += ASCII_A - ASCII_a; + if (c1 != c2) + return 0; + if (!c1) + break; + } + return 1; +} + +static void PTRCALL +initUpdatePosition(const ENCODING *enc, const char *ptr, + const char *end, POSITION *pos) +{ + normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); +} + +static int +toAscii(const ENCODING *enc, const char *ptr, const char *end) +{ + char buf[1]; + char *p = buf; + XmlUtf8Convert(enc, &ptr, end, &p, p + 1); + if (p == buf) + return -1; + else + return buf[0]; +} + +static int FASTCALL +isSpace(int c) +{ + switch (c) { + case 0x20: + case 0xD: + case 0xA: + case 0x9: + return 1; + } + return 0; +} + +/* Return 1 if there's just optional white space or there's an S + followed by name=val. +*/ +static int +parsePseudoAttribute(const ENCODING *enc, + const char *ptr, + const char *end, + const char **namePtr, + const char **nameEndPtr, + const char **valPtr, + const char **nextTokPtr) +{ + int c; + char open; + if (ptr == end) { + *namePtr = NULL; + return 1; + } + if (!isSpace(toAscii(enc, ptr, end))) { + *nextTokPtr = ptr; + return 0; + } + do { + ptr += enc->minBytesPerChar; + } while (isSpace(toAscii(enc, ptr, end))); + if (ptr == end) { + *namePtr = NULL; + return 1; + } + *namePtr = ptr; + for (;;) { + c = toAscii(enc, ptr, end); + if (c == -1) { + *nextTokPtr = ptr; + return 0; + } + if (c == ASCII_EQUALS) { + *nameEndPtr = ptr; + break; + } + if (isSpace(c)) { + *nameEndPtr = ptr; + do { + ptr += enc->minBytesPerChar; + } while (isSpace(c = toAscii(enc, ptr, end))); + if (c != ASCII_EQUALS) { + *nextTokPtr = ptr; + return 0; + } + break; + } + ptr += enc->minBytesPerChar; + } + if (ptr == *namePtr) { + *nextTokPtr = ptr; + return 0; + } + ptr += enc->minBytesPerChar; + c = toAscii(enc, ptr, end); + while (isSpace(c)) { + ptr += enc->minBytesPerChar; + c = toAscii(enc, ptr, end); + } + if (c != ASCII_QUOT && c != ASCII_APOS) { + *nextTokPtr = ptr; + return 0; + } + open = (char)c; + ptr += enc->minBytesPerChar; + *valPtr = ptr; + for (;; ptr += enc->minBytesPerChar) { + c = toAscii(enc, ptr, end); + if (c == open) + break; + if (!(ASCII_a <= c && c <= ASCII_z) + && !(ASCII_A <= c && c <= ASCII_Z) + && !(ASCII_0 <= c && c <= ASCII_9) + && c != ASCII_PERIOD + && c != ASCII_MINUS + && c != ASCII_UNDERSCORE) { + *nextTokPtr = ptr; + return 0; + } + } + *nextTokPtr = ptr + enc->minBytesPerChar; + return 1; +} + +static const char KW_version[] = { + ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' +}; + +static const char KW_encoding[] = { + ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' +}; + +static const char KW_standalone[] = { + ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, + ASCII_n, ASCII_e, '\0' +}; + +static const char KW_yes[] = { + ASCII_y, ASCII_e, ASCII_s, '\0' +}; + +static const char KW_no[] = { + ASCII_n, ASCII_o, '\0' +}; + +static int +doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, + const char *, + const char *), + int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingName, + const ENCODING **encoding, + int *standalone) +{ + const char *val = NULL; + const char *name = NULL; + const char *nameEnd = NULL; + ptr += 5 * enc->minBytesPerChar; + end -= 2 * enc->minBytesPerChar; + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) + || !name) { + *badPtr = ptr; + return 0; + } + if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { + if (!isGeneralTextEntity) { + *badPtr = name; + return 0; + } + } + else { + if (versionPtr) + *versionPtr = val; + if (versionEndPtr) + *versionEndPtr = ptr; + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + *badPtr = ptr; + return 0; + } + if (!name) { + if (isGeneralTextEntity) { + /* a TextDecl must have an EncodingDecl */ + *badPtr = ptr; + return 0; + } + return 1; + } + } + if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { + int c = toAscii(enc, val, end); + if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { + *badPtr = val; + return 0; + } + if (encodingName) + *encodingName = val; + if (encoding) + *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + *badPtr = ptr; + return 0; + } + if (!name) + return 1; + } + if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) + || isGeneralTextEntity) { + *badPtr = name; + return 0; + } + if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { + if (standalone) + *standalone = 1; + } + else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { + if (standalone) + *standalone = 0; + } + else { + *badPtr = val; + return 0; + } + while (isSpace(toAscii(enc, ptr, end))) + ptr += enc->minBytesPerChar; + if (ptr != end) { + *badPtr = ptr; + return 0; + } + return 1; +} + +static int FASTCALL +checkCharRefNumber(int result) +{ + switch (result >> 8) { + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + return -1; + case 0: + if (latin1_encoding.type[result] == BT_NONXML) + return -1; + break; + case 0xFF: + if (result == 0xFFFE || result == 0xFFFF) + return -1; + break; + } + return result; +} + +int FASTCALL +XmlUtf8Encode(int c, char *buf) +{ + enum { + /* minN is minimum legal resulting value for N byte sequence */ + min2 = 0x80, + min3 = 0x800, + min4 = 0x10000 + }; + + if (c < 0) + return 0; + if (c < min2) { + buf[0] = (char)(c | UTF8_cval1); + return 1; + } + if (c < min3) { + buf[0] = (char)((c >> 6) | UTF8_cval2); + buf[1] = (char)((c & 0x3f) | 0x80); + return 2; + } + if (c < min4) { + buf[0] = (char)((c >> 12) | UTF8_cval3); + buf[1] = (char)(((c >> 6) & 0x3f) | 0x80); + buf[2] = (char)((c & 0x3f) | 0x80); + return 3; + } + if (c < 0x110000) { + buf[0] = (char)((c >> 18) | UTF8_cval4); + buf[1] = (char)(((c >> 12) & 0x3f) | 0x80); + buf[2] = (char)(((c >> 6) & 0x3f) | 0x80); + buf[3] = (char)((c & 0x3f) | 0x80); + return 4; + } + return 0; +} + +int FASTCALL +XmlUtf16Encode(int charNum, unsigned short *buf) +{ + if (charNum < 0) + return 0; + if (charNum < 0x10000) { + buf[0] = (unsigned short)charNum; + return 1; + } + if (charNum < 0x110000) { + charNum -= 0x10000; + buf[0] = (unsigned short)((charNum >> 10) + 0xD800); + buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00); + return 2; + } + return 0; +} + +struct unknown_encoding { + struct normal_encoding normal; + CONVERTER convert; + void *userData; + unsigned short utf16[256]; + char utf8[256][4]; +}; + +#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) + +int +XmlSizeOfUnknownEncoding(void) +{ + return sizeof(struct unknown_encoding); +} + +static int PTRFASTCALL +unknown_isName(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + if (c & ~0xFFFF) + return 0; + return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); +} + +static int PTRFASTCALL +unknown_isNmstrt(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + if (c & ~0xFFFF) + return 0; + return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); +} + +static int PTRFASTCALL +unknown_isInvalid(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; +} + +static void PTRCALL +unknown_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + char buf[XML_UTF8_ENCODE_MAX]; + for (;;) { + const char *utf8; + int n; + if (*fromP == fromLim) + break; + utf8 = uenc->utf8[(unsigned char)**fromP]; + n = *utf8++; + if (n == 0) { + int c = uenc->convert(uenc->userData, *fromP); + n = XmlUtf8Encode(c, buf); + if (n > toLim - *toP) + break; + utf8 = buf; + *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] + - (BT_LEAD2 - 2)); + } + else { + if (n > toLim - *toP) + break; + (*fromP)++; + } + do { + *(*toP)++ = *utf8++; + } while (--n != 0); + } +} + +static void PTRCALL +unknown_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + while (*fromP != fromLim && *toP != toLim) { + unsigned short c = uenc->utf16[(unsigned char)**fromP]; + if (c == 0) { + c = (unsigned short) + uenc->convert(uenc->userData, *fromP); + *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] + - (BT_LEAD2 - 2)); + } + else + (*fromP)++; + *(*toP)++ = c; + } +} + +ENCODING * +XmlInitUnknownEncoding(void *mem, + int *table, + CONVERTER convert, + void *userData) +{ + int i; + struct unknown_encoding *e = (struct unknown_encoding *)mem; + for (i = 0; i < (int)sizeof(struct normal_encoding); i++) + ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; + for (i = 0; i < 128; i++) + if (latin1_encoding.type[i] != BT_OTHER + && latin1_encoding.type[i] != BT_NONXML + && table[i] != i) + return 0; + for (i = 0; i < 256; i++) { + int c = table[i]; + if (c == -1) { + e->normal.type[i] = BT_MALFORM; + /* This shouldn't really get used. */ + e->utf16[i] = 0xFFFF; + e->utf8[i][0] = 1; + e->utf8[i][1] = 0; + } + else if (c < 0) { + if (c < -4) + return 0; + e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); + e->utf8[i][0] = 0; + e->utf16[i] = 0; + } + else if (c < 0x80) { + if (latin1_encoding.type[c] != BT_OTHER + && latin1_encoding.type[c] != BT_NONXML + && c != i) + return 0; + e->normal.type[i] = latin1_encoding.type[c]; + e->utf8[i][0] = 1; + e->utf8[i][1] = (char)c; + e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); + } + else if (checkCharRefNumber(c) < 0) { + e->normal.type[i] = BT_NONXML; + /* This shouldn't really get used. */ + e->utf16[i] = 0xFFFF; + e->utf8[i][0] = 1; + e->utf8[i][1] = 0; + } + else { + if (c > 0xFFFF) + return 0; + if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) + e->normal.type[i] = BT_NMSTRT; + else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) + e->normal.type[i] = BT_NAME; + else + e->normal.type[i] = BT_OTHER; + e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); + e->utf16[i] = (unsigned short)c; + } + } + e->userData = userData; + e->convert = convert; + if (convert) { + e->normal.isName2 = unknown_isName; + e->normal.isName3 = unknown_isName; + e->normal.isName4 = unknown_isName; + e->normal.isNmstrt2 = unknown_isNmstrt; + e->normal.isNmstrt3 = unknown_isNmstrt; + e->normal.isNmstrt4 = unknown_isNmstrt; + e->normal.isInvalid2 = unknown_isInvalid; + e->normal.isInvalid3 = unknown_isInvalid; + e->normal.isInvalid4 = unknown_isInvalid; + } + e->normal.enc.utf8Convert = unknown_toUtf8; + e->normal.enc.utf16Convert = unknown_toUtf16; + return &(e->normal.enc); +} + +/* If this enumeration is changed, getEncodingIndex and encodings +must also be changed. */ +enum { + UNKNOWN_ENC = -1, + ISO_8859_1_ENC = 0, + US_ASCII_ENC, + UTF_8_ENC, + UTF_16_ENC, + UTF_16BE_ENC, + UTF_16LE_ENC, + /* must match encodingNames up to here */ + NO_ENC +}; + +static const char KW_ISO_8859_1[] = { + ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, + ASCII_MINUS, ASCII_1, '\0' +}; +static const char KW_US_ASCII[] = { + ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, + '\0' +}; +static const char KW_UTF_8[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' +}; +static const char KW_UTF_16[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' +}; +static const char KW_UTF_16BE[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, + '\0' +}; +static const char KW_UTF_16LE[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, + '\0' +}; + +static int FASTCALL +getEncodingIndex(const char *name) +{ + static const char *encodingNames[] = { + KW_ISO_8859_1, + KW_US_ASCII, + KW_UTF_8, + KW_UTF_16, + KW_UTF_16BE, + KW_UTF_16LE, + }; + int i; + if (name == NULL) + return NO_ENC; + for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) + if (streqci(name, encodingNames[i])) + return i; + return UNKNOWN_ENC; +} + +/* For binary compatibility, we store the index of the encoding + specified at initialization in the isUtf16 member. +*/ + +#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) +#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) + +/* This is what detects the encoding. encodingTable maps from + encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of + the external (protocol) specified encoding; state is + XML_CONTENT_STATE if we're parsing an external text entity, and + XML_PROLOG_STATE otherwise. +*/ + + +static int +initScan(const ENCODING **encodingTable, + const INIT_ENCODING *enc, + int state, + const char *ptr, + const char *end, + const char **nextTokPtr) +{ + const ENCODING **encPtr; + + if (ptr == end) + return XML_TOK_NONE; + encPtr = enc->encPtr; + if (ptr + 1 == end) { + /* only a single byte available for auto-detection */ +#ifndef XML_DTD /* FIXME */ + /* a well-formed document entity must have more than one byte */ + if (state != XML_CONTENT_STATE) + return XML_TOK_PARTIAL; +#endif + /* so we're parsing an external text entity... */ + /* if UTF-16 was externally specified, then we need at least 2 bytes */ + switch (INIT_ENC_INDEX(enc)) { + case UTF_16_ENC: + case UTF_16LE_ENC: + case UTF_16BE_ENC: + return XML_TOK_PARTIAL; + } + switch ((unsigned char)*ptr) { + case 0xFE: + case 0xFF: + case 0xEF: /* possibly first byte of UTF-8 BOM */ + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + /* fall through */ + case 0x00: + case 0x3C: + return XML_TOK_PARTIAL; + } + } + else { + switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { + case 0xFEFF: + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + *nextTokPtr = ptr + 2; + *encPtr = encodingTable[UTF_16BE_ENC]; + return XML_TOK_BOM; + /* 00 3C is handled in the default case */ + case 0x3C00: + if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC + || INIT_ENC_INDEX(enc) == UTF_16_ENC) + && state == XML_CONTENT_STATE) + break; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + case 0xFFFE: + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + *nextTokPtr = ptr + 2; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XML_TOK_BOM; + case 0xEFBB: + /* Maybe a UTF-8 BOM (EF BB BF) */ + /* If there's an explicitly specified (external) encoding + of ISO-8859-1 or some flavour of UTF-16 + and this is an external text entity, + don't look for the BOM, + because it might be a legal data. + */ + if (state == XML_CONTENT_STATE) { + int e = INIT_ENC_INDEX(enc); + if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC + || e == UTF_16LE_ENC || e == UTF_16_ENC) + break; + } + if (ptr + 2 == end) + return XML_TOK_PARTIAL; + if ((unsigned char)ptr[2] == 0xBF) { + *nextTokPtr = ptr + 3; + *encPtr = encodingTable[UTF_8_ENC]; + return XML_TOK_BOM; + } + break; + default: + if (ptr[0] == '\0') { + /* 0 isn't a legal data character. Furthermore a document + entity can only start with ASCII characters. So the only + way this can fail to be big-endian UTF-16 if it it's an + external parsed general entity that's labelled as + UTF-16LE. + */ + if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) + break; + *encPtr = encodingTable[UTF_16BE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + } + else if (ptr[1] == '\0') { + /* We could recover here in the case: + - parsing an external entity + - second byte is 0 + - no externally specified encoding + - no encoding declaration + by assuming UTF-16LE. But we don't, because this would mean when + presented just with a single byte, we couldn't reliably determine + whether we needed further bytes. + */ + if (state == XML_CONTENT_STATE) + break; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + } + break; + } + } + *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); +} + + +#define NS(x) x +#define ns(x) x +#include "xmltok_ns.c" +#undef NS +#undef ns + +#ifdef XML_NS + +#define NS(x) x ## NS +#define ns(x) x ## _ns + +#include "xmltok_ns.c" + +#undef NS +#undef ns + +ENCODING * +XmlInitUnknownEncodingNS(void *mem, + int *table, + CONVERTER convert, + void *userData) +{ + ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); + if (enc) + ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; + return enc; +} + +#endif /* XML_NS */ Added: external/celementtree-1.0.5-20051216/expat/xmltok.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/xmltok.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,316 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlTok_INCLUDED +#define XmlTok_INCLUDED 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* The following token may be returned by XmlContentTok */ +#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be + start of illegal ]]> sequence */ +/* The following tokens may be returned by both XmlPrologTok and + XmlContentTok. +*/ +#define XML_TOK_NONE -4 /* The string to be scanned is empty */ +#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; + might be part of CRLF sequence */ +#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ +#define XML_TOK_PARTIAL -1 /* only part of a token */ +#define XML_TOK_INVALID 0 + +/* The following tokens are returned by XmlContentTok; some are also + returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. +*/ +#define XML_TOK_START_TAG_WITH_ATTS 1 +#define XML_TOK_START_TAG_NO_ATTS 2 +#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ +#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 +#define XML_TOK_END_TAG 5 +#define XML_TOK_DATA_CHARS 6 +#define XML_TOK_DATA_NEWLINE 7 +#define XML_TOK_CDATA_SECT_OPEN 8 +#define XML_TOK_ENTITY_REF 9 +#define XML_TOK_CHAR_REF 10 /* numeric character reference */ + +/* The following tokens may be returned by both XmlPrologTok and + XmlContentTok. +*/ +#define XML_TOK_PI 11 /* processing instruction */ +#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ +#define XML_TOK_COMMENT 13 +#define XML_TOK_BOM 14 /* Byte order mark */ + +/* The following tokens are returned only by XmlPrologTok */ +#define XML_TOK_PROLOG_S 15 +#define XML_TOK_DECL_OPEN 16 /* */ +#define XML_TOK_NAME 18 +#define XML_TOK_NMTOKEN 19 +#define XML_TOK_POUND_NAME 20 /* #name */ +#define XML_TOK_OR 21 /* | */ +#define XML_TOK_PERCENT 22 +#define XML_TOK_OPEN_PAREN 23 +#define XML_TOK_CLOSE_PAREN 24 +#define XML_TOK_OPEN_BRACKET 25 +#define XML_TOK_CLOSE_BRACKET 26 +#define XML_TOK_LITERAL 27 +#define XML_TOK_PARAM_ENTITY_REF 28 +#define XML_TOK_INSTANCE_START 29 + +/* The following occur only in element type declarations */ +#define XML_TOK_NAME_QUESTION 30 /* name? */ +#define XML_TOK_NAME_ASTERISK 31 /* name* */ +#define XML_TOK_NAME_PLUS 32 /* name+ */ +#define XML_TOK_COND_SECT_OPEN 33 /* */ +#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ +#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ +#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ +#define XML_TOK_COMMA 38 + +/* The following token is returned only by XmlAttributeValueTok */ +#define XML_TOK_ATTRIBUTE_VALUE_S 39 + +/* The following token is returned only by XmlCdataSectionTok */ +#define XML_TOK_CDATA_SECT_CLOSE 40 + +/* With namespace processing this is returned by XmlPrologTok for a + name with a colon. +*/ +#define XML_TOK_PREFIXED_NAME 41 + +#ifdef XML_DTD +#define XML_TOK_IGNORE_SECT 42 +#endif /* XML_DTD */ + +#ifdef XML_DTD +#define XML_N_STATES 4 +#else /* not XML_DTD */ +#define XML_N_STATES 3 +#endif /* not XML_DTD */ + +#define XML_PROLOG_STATE 0 +#define XML_CONTENT_STATE 1 +#define XML_CDATA_SECTION_STATE 2 +#ifdef XML_DTD +#define XML_IGNORE_SECTION_STATE 3 +#endif /* XML_DTD */ + +#define XML_N_LITERAL_TYPES 2 +#define XML_ATTRIBUTE_VALUE_LITERAL 0 +#define XML_ENTITY_VALUE_LITERAL 1 + +/* The size of the buffer passed to XmlUtf8Encode must be at least this. */ +#define XML_UTF8_ENCODE_MAX 4 +/* The size of the buffer passed to XmlUtf16Encode must be at least this. */ +#define XML_UTF16_ENCODE_MAX 2 + +typedef struct position { + /* first line and first column are 0 not 1 */ + unsigned long lineNumber; + unsigned long columnNumber; +} POSITION; + +typedef struct { + const char *name; + const char *valuePtr; + const char *valueEnd; + char normalized; +} ATTRIBUTE; + +struct encoding; +typedef struct encoding ENCODING; + +typedef int (PTRCALL *SCANNER)(const ENCODING *, + const char *, + const char *, + const char **); + +struct encoding { + SCANNER scanners[XML_N_STATES]; + SCANNER literalScanners[XML_N_LITERAL_TYPES]; + int (PTRCALL *sameName)(const ENCODING *, + const char *, + const char *); + int (PTRCALL *nameMatchesAscii)(const ENCODING *, + const char *, + const char *, + const char *); + int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); + const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); + int (PTRCALL *getAtts)(const ENCODING *enc, + const char *ptr, + int attsMax, + ATTRIBUTE *atts); + int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); + int (PTRCALL *predefinedEntityName)(const ENCODING *, + const char *, + const char *); + void (PTRCALL *updatePosition)(const ENCODING *, + const char *ptr, + const char *end, + POSITION *); + int (PTRCALL *isPublicId)(const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr); + void (PTRCALL *utf8Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + char **toP, + const char *toLim); + void (PTRCALL *utf16Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + unsigned short **toP, + const unsigned short *toLim); + int minBytesPerChar; + char isUtf8; + char isUtf16; +}; + +/* Scan the string starting at ptr until the end of the next complete + token, but do not scan past eptr. Return an integer giving the + type of token. + + Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. + + Return XML_TOK_PARTIAL when the string does not contain a complete + token; nextTokPtr will not be set. + + Return XML_TOK_INVALID when the string does not start a valid + token; nextTokPtr will be set to point to the character which made + the token invalid. + + Otherwise the string starts with a valid token; nextTokPtr will be + set to point to the character following the end of that token. + + Each data character counts as a single token, but adjacent data + characters may be returned together. Similarly for characters in + the prolog outside literals, comments and processing instructions. +*/ + + +#define XmlTok(enc, state, ptr, end, nextTokPtr) \ + (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) + +#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) + +#define XmlContentTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) + +#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) + +#ifdef XML_DTD + +#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) + +#endif /* XML_DTD */ + +/* This is used for performing a 2nd-level tokenization on the content + of a literal that has already been returned by XmlTok. +*/ +#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ + (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) + +#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) + +#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) + +#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) + +#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ + (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) + +#define XmlNameLength(enc, ptr) \ + (((enc)->nameLength)(enc, ptr)) + +#define XmlSkipS(enc, ptr) \ + (((enc)->skipS)(enc, ptr)) + +#define XmlGetAttributes(enc, ptr, attsMax, atts) \ + (((enc)->getAtts)(enc, ptr, attsMax, atts)) + +#define XmlCharRefNumber(enc, ptr) \ + (((enc)->charRefNumber)(enc, ptr)) + +#define XmlPredefinedEntityName(enc, ptr, end) \ + (((enc)->predefinedEntityName)(enc, ptr, end)) + +#define XmlUpdatePosition(enc, ptr, end, pos) \ + (((enc)->updatePosition)(enc, ptr, end, pos)) + +#define XmlIsPublicId(enc, ptr, end, badPtr) \ + (((enc)->isPublicId)(enc, ptr, end, badPtr)) + +#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ + (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) + +#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ + (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) + +typedef struct { + ENCODING initEnc; + const ENCODING **encPtr; +} INIT_ENCODING; + +int XmlParseXmlDecl(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingNamePtr, + const ENCODING **namedEncodingPtr, + int *standalonePtr); + +int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); +const ENCODING *XmlGetUtf8InternalEncoding(void); +const ENCODING *XmlGetUtf16InternalEncoding(void); +int FASTCALL XmlUtf8Encode(int charNumber, char *buf); +int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); +int XmlSizeOfUnknownEncoding(void); + + +typedef int (XMLCALL *CONVERTER) (void *userData, const char *p); + +ENCODING * +XmlInitUnknownEncoding(void *mem, + int *table, + CONVERTER convert, + void *userData); + +int XmlParseXmlDeclNS(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingNamePtr, + const ENCODING **namedEncodingPtr, + int *standalonePtr); + +int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); +const ENCODING *XmlGetUtf8InternalEncodingNS(void); +const ENCODING *XmlGetUtf16InternalEncodingNS(void); +ENCODING * +XmlInitUnknownEncodingNS(void *mem, + int *table, + CONVERTER convert, + void *userData); +#ifdef __cplusplus +} +#endif + +#endif /* not XmlTok_INCLUDED */ Added: external/celementtree-1.0.5-20051216/expat/xmltok_impl.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/xmltok_impl.c Fri Dec 16 23:02:39 2005 @@ -0,0 +1,1779 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef IS_INVALID_CHAR +#define IS_INVALID_CHAR(enc, ptr, n) (0) +#endif + +#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_INVALID_CHAR(enc, ptr, n)) { \ + *(nextTokPtr) = (ptr); \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define INVALID_CASES(ptr, nextTokPtr) \ + INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ + INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ + INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ + case BT_NONXML: \ + case BT_MALFORM: \ + case BT_TRAIL: \ + *(nextTokPtr) = (ptr); \ + return XML_TOK_INVALID; + +#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (!IS_NAME_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ + case BT_NONASCII: \ + if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + case BT_NMSTRT: \ + case BT_HEX: \ + case BT_DIGIT: \ + case BT_NAME: \ + case BT_MINUS: \ + ptr += MINBPC(enc); \ + break; \ + CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ + CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ + CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) + +#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; + +#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ + case BT_NONASCII: \ + if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + case BT_NMSTRT: \ + case BT_HEX: \ + ptr += MINBPC(enc); \ + break; \ + CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ + CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ + CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) + +#ifndef PREFIX +#define PREFIX(ident) ident +#endif + +/* ptr points to character following " */ + switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { + case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + /* fall through */ + case BT_S: case BT_CR: case BT_LF: + *nextTokPtr = ptr; + return XML_TOK_DECL_OPEN; + case BT_NMSTRT: + case BT_HEX: + ptr += MINBPC(enc); + break; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, + const char *end, int *tokPtr) +{ + int upper = 0; + *tokPtr = XML_TOK_PI; + if (end - ptr != MINBPC(enc)*3) + return 1; + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_x: + break; + case ASCII_X: + upper = 1; + break; + default: + return 1; + } + ptr += MINBPC(enc); + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_m: + break; + case ASCII_M: + upper = 1; + break; + default: + return 1; + } + ptr += MINBPC(enc); + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_l: + break; + case ASCII_L: + upper = 1; + break; + default: + return 1; + } + if (upper) + return 0; + *tokPtr = XML_TOK_XML_DECL; + return 1; +} + +/* ptr points to character following " 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + break; + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr -= MINBPC(enc); + break; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CDATA_SECT_CLOSE; + case BT_CR: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + case BT_LF: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + INVALID_CASES(ptr, nextTokPtr) + default: + ptr += MINBPC(enc); + break; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONXML: + case BT_MALFORM: + case BT_TRAIL: + case BT_CR: + case BT_LF: + case BT_RSQB: + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +/* ptr points to character following " 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_LT: + return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_AMP: + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_CR: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + case BT_LF: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_RSQB; + if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + break; + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_RSQB; + if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr -= MINBPC(enc); + break; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + INVALID_CASES(ptr, nextTokPtr) + default: + ptr += MINBPC(enc); + break; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_RSQB: + if (ptr + MINBPC(enc) != end) { + if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { + ptr += MINBPC(enc); + break; + } + if (ptr + 2*MINBPC(enc) != end) { + if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { + ptr += MINBPC(enc); + break; + } + *nextTokPtr = ptr + 2*MINBPC(enc); + return XML_TOK_INVALID; + } + } + /* fall through */ + case BT_AMP: + case BT_LT: + case BT_NONXML: + case BT_MALFORM: + case BT_TRAIL: + case BT_CR: + case BT_LF: + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +/* ptr points to character following "%" */ + +static int PTRCALL +PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + if (ptr == end) + return -XML_TOK_PERCENT; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: + *nextTokPtr = ptr; + return XML_TOK_PERCENT; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_SEMI: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_PARAM_ENTITY_REF; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + if (ptr == end) + return XML_TOK_PARTIAL; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_CR: case BT_LF: case BT_S: + case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: + *nextTokPtr = ptr; + return XML_TOK_POUND_NAME; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return -XML_TOK_POUND_NAME; +} + +static int PTRCALL +PREFIX(scanLit)(int open, const ENCODING *enc, + const char *ptr, const char *end, + const char **nextTokPtr) +{ + while (ptr != end) { + int t = BYTE_TYPE(enc, ptr); + switch (t) { + INVALID_CASES(ptr, nextTokPtr) + case BT_QUOT: + case BT_APOS: + ptr += MINBPC(enc); + if (t != open) + break; + if (ptr == end) + return -XML_TOK_LITERAL; + *nextTokPtr = ptr; + switch (BYTE_TYPE(enc, ptr)) { + case BT_S: case BT_CR: case BT_LF: + case BT_GT: case BT_PERCNT: case BT_LSQB: + return XML_TOK_LITERAL; + default: + return XML_TOK_INVALID; + } + default: + ptr += MINBPC(enc); + break; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + int tok; + if (ptr == end) + return XML_TOK_NONE; + if (MINBPC(enc) > 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_QUOT: + return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_APOS: + return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_LT: + { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + switch (BYTE_TYPE(enc, ptr)) { + case BT_EXCL: + return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_QUEST: + return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_NMSTRT: + case BT_HEX: + case BT_NONASCII: + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + *nextTokPtr = ptr - MINBPC(enc); + return XML_TOK_INSTANCE_START; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + case BT_CR: + if (ptr + MINBPC(enc) == end) { + *nextTokPtr = end; + /* indicate that this might be part of a CR/LF pair */ + return -XML_TOK_PROLOG_S; + } + /* fall through */ + case BT_S: case BT_LF: + for (;;) { + ptr += MINBPC(enc); + if (ptr == end) + break; + switch (BYTE_TYPE(enc, ptr)) { + case BT_S: case BT_LF: + break; + case BT_CR: + /* don't split CR/LF pair */ + if (ptr + MINBPC(enc) != end) + break; + /* fall through */ + default: + *nextTokPtr = ptr; + return XML_TOK_PROLOG_S; + } + } + *nextTokPtr = ptr; + return XML_TOK_PROLOG_S; + case BT_PERCNT: + return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_COMMA: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_COMMA; + case BT_LSQB: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OPEN_BRACKET; + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return -XML_TOK_CLOSE_BRACKET; + if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { + if (ptr + MINBPC(enc) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { + *nextTokPtr = ptr + 2*MINBPC(enc); + return XML_TOK_COND_SECT_CLOSE; + } + } + *nextTokPtr = ptr; + return XML_TOK_CLOSE_BRACKET; + case BT_LPAR: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OPEN_PAREN; + case BT_RPAR: + ptr += MINBPC(enc); + if (ptr == end) + return -XML_TOK_CLOSE_PAREN; + switch (BYTE_TYPE(enc, ptr)) { + case BT_AST: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_ASTERISK; + case BT_QUEST: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_QUESTION; + case BT_PLUS: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_PLUS; + case BT_CR: case BT_LF: case BT_S: + case BT_GT: case BT_COMMA: case BT_VERBAR: + case BT_RPAR: + *nextTokPtr = ptr; + return XML_TOK_CLOSE_PAREN; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + case BT_VERBAR: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OR; + case BT_GT: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DECL_CLOSE; + case BT_NUM: + return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NAME; \ + break; \ + } \ + if (IS_NAME_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NMTOKEN; \ + break; \ + } \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NMSTRT: + case BT_HEX: + tok = XML_TOK_NAME; + ptr += MINBPC(enc); + break; + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: +#ifdef XML_NS + case BT_COLON: +#endif + tok = XML_TOK_NMTOKEN; + ptr += MINBPC(enc); + break; + case BT_NONASCII: + if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { + ptr += MINBPC(enc); + tok = XML_TOK_NAME; + break; + } + if (IS_NAME_CHAR_MINBPC(enc, ptr)) { + ptr += MINBPC(enc); + tok = XML_TOK_NMTOKEN; + break; + } + /* fall through */ + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_GT: case BT_RPAR: case BT_COMMA: + case BT_VERBAR: case BT_LSQB: case BT_PERCNT: + case BT_S: case BT_CR: case BT_LF: + *nextTokPtr = ptr; + return tok; +#ifdef XML_NS + case BT_COLON: + ptr += MINBPC(enc); + switch (tok) { + case XML_TOK_NAME: + if (ptr == end) + return XML_TOK_PARTIAL; + tok = XML_TOK_PREFIXED_NAME; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + default: + tok = XML_TOK_NMTOKEN; + break; + } + break; + case XML_TOK_PREFIXED_NAME: + tok = XML_TOK_NMTOKEN; + break; + } + break; +#endif + case BT_PLUS: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_PLUS; + case BT_AST: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_ASTERISK; + case BT_QUEST: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_QUESTION; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return -tok; +} + +static int PTRCALL +PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + const char *start; + if (ptr == end) + return XML_TOK_NONE; + start = ptr; + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_AMP: + if (ptr == start) + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_LT: + /* this is for inside entity references */ + *nextTokPtr = ptr; + return XML_TOK_INVALID; + case BT_LF: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_CR: + if (ptr == start) { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_S: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_ATTRIBUTE_VALUE_S; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +static int PTRCALL +PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + const char *start; + if (ptr == end) + return XML_TOK_NONE; + start = ptr; + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_AMP: + if (ptr == start) + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_PERCNT: + if (ptr == start) { + int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), + end, nextTokPtr); + return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_LF: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_CR: + if (ptr == start) { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +#ifdef XML_DTD + +static int PTRCALL +PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + int level = 0; + if (MINBPC(enc) > 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + end = ptr + n; + } + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + INVALID_CASES(ptr, nextTokPtr) + case BT_LT: + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { + ++level; + ptr += MINBPC(enc); + } + } + break; + case BT_RSQB: + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr += MINBPC(enc); + if (level == 0) { + *nextTokPtr = ptr; + return XML_TOK_IGNORE_SECT; + } + --level; + } + } + break; + default: + ptr += MINBPC(enc); + break; + } + } + return XML_TOK_PARTIAL; +} + +#endif /* XML_DTD */ + +static int PTRCALL +PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, + const char **badPtr) +{ + ptr += MINBPC(enc); + end -= MINBPC(enc); + for (; ptr != end; ptr += MINBPC(enc)) { + switch (BYTE_TYPE(enc, ptr)) { + case BT_DIGIT: + case BT_HEX: + case BT_MINUS: + case BT_APOS: + case BT_LPAR: + case BT_RPAR: + case BT_PLUS: + case BT_COMMA: + case BT_SOL: + case BT_EQUALS: + case BT_QUEST: + case BT_CR: + case BT_LF: + case BT_SEMI: + case BT_EXCL: + case BT_AST: + case BT_PERCNT: + case BT_NUM: +#ifdef XML_NS + case BT_COLON: +#endif + break; + case BT_S: + if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { + *badPtr = ptr; + return 0; + } + break; + case BT_NAME: + case BT_NMSTRT: + if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) + break; + default: + switch (BYTE_TO_ASCII(enc, ptr)) { + case 0x24: /* $ */ + case 0x40: /* @ */ + break; + default: + *badPtr = ptr; + return 0; + } + break; + } + } + return 1; +} + +/* This must only be called for a well-formed start-tag or empty + element tag. Returns the number of attributes. Pointers to the + first attsMax attributes are stored in atts. +*/ + +static int PTRCALL +PREFIX(getAtts)(const ENCODING *enc, const char *ptr, + int attsMax, ATTRIBUTE *atts) +{ + enum { other, inName, inValue } state = inName; + int nAtts = 0; + int open = 0; /* defined when state == inValue; + initialization just to shut up compilers */ + + for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { + switch (BYTE_TYPE(enc, ptr)) { +#define START_NAME \ + if (state == other) { \ + if (nAtts < attsMax) { \ + atts[nAtts].name = ptr; \ + atts[nAtts].normalized = 1; \ + } \ + state = inName; \ + } +#define LEAD_CASE(n) \ + case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONASCII: + case BT_NMSTRT: + case BT_HEX: + START_NAME + break; +#undef START_NAME + case BT_QUOT: + if (state != inValue) { + if (nAtts < attsMax) + atts[nAtts].valuePtr = ptr + MINBPC(enc); + state = inValue; + open = BT_QUOT; + } + else if (open == BT_QUOT) { + state = other; + if (nAtts < attsMax) + atts[nAtts].valueEnd = ptr; + nAtts++; + } + break; + case BT_APOS: + if (state != inValue) { + if (nAtts < attsMax) + atts[nAtts].valuePtr = ptr + MINBPC(enc); + state = inValue; + open = BT_APOS; + } + else if (open == BT_APOS) { + state = other; + if (nAtts < attsMax) + atts[nAtts].valueEnd = ptr; + nAtts++; + } + break; + case BT_AMP: + if (nAtts < attsMax) + atts[nAtts].normalized = 0; + break; + case BT_S: + if (state == inName) + state = other; + else if (state == inValue + && nAtts < attsMax + && atts[nAtts].normalized + && (ptr == atts[nAtts].valuePtr + || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE + || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE + || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) + atts[nAtts].normalized = 0; + break; + case BT_CR: case BT_LF: + /* This case ensures that the first attribute name is counted + Apart from that we could just change state on the quote. */ + if (state == inName) + state = other; + else if (state == inValue && nAtts < attsMax) + atts[nAtts].normalized = 0; + break; + case BT_GT: + case BT_SOL: + if (state != inValue) + return nAtts; + break; + default: + break; + } + } + /* not reached */ +} + +static int PTRFASTCALL +PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) +{ + int result = 0; + /* skip &# */ + ptr += 2*MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_x)) { + for (ptr += MINBPC(enc); + !CHAR_MATCHES(enc, ptr, ASCII_SEMI); + ptr += MINBPC(enc)) { + int c = BYTE_TO_ASCII(enc, ptr); + switch (c) { + case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: + case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: + result <<= 4; + result |= (c - ASCII_0); + break; + case ASCII_A: case ASCII_B: case ASCII_C: + case ASCII_D: case ASCII_E: case ASCII_F: + result <<= 4; + result += 10 + (c - ASCII_A); + break; + case ASCII_a: case ASCII_b: case ASCII_c: + case ASCII_d: case ASCII_e: case ASCII_f: + result <<= 4; + result += 10 + (c - ASCII_a); + break; + } + if (result >= 0x110000) + return -1; + } + } + else { + for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { + int c = BYTE_TO_ASCII(enc, ptr); + result *= 10; + result += (c - ASCII_0); + if (result >= 0x110000) + return -1; + } + } + return checkCharRefNumber(result); +} + +static int PTRCALL +PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, + const char *end) +{ + switch ((end - ptr)/MINBPC(enc)) { + case 2: + if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_l: + return ASCII_LT; + case ASCII_g: + return ASCII_GT; + } + } + break; + case 3: + if (CHAR_MATCHES(enc, ptr, ASCII_a)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_m)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_p)) + return ASCII_AMP; + } + } + break; + case 4: + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_q: + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_u)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_o)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_t)) + return ASCII_QUOT; + } + } + break; + case ASCII_a: + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_p)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_o)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_s)) + return ASCII_APOS; + } + } + break; + } + } + return 0; +} + +static int PTRCALL +PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) +{ + for (;;) { + switch (BYTE_TYPE(enc, ptr1)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (*ptr1++ != *ptr2++) \ + return 0; + LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) +#undef LEAD_CASE + /* fall through */ + if (*ptr1++ != *ptr2++) + return 0; + break; + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 1) { + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 2) { + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 3) { + if (*ptr2++ != *ptr1++) + return 0; + } + } + } + break; + default: + if (MINBPC(enc) == 1 && *ptr1 == *ptr2) + return 1; + switch (BYTE_TYPE(enc, ptr2)) { + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + return 0; + default: + return 1; + } + } + } + /* not reached */ +} + +static int PTRCALL +PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, + const char *end1, const char *ptr2) +{ + for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { + if (ptr1 == end1) + return 0; + if (!CHAR_MATCHES(enc, ptr1, *ptr2)) + return 0; + } + return ptr1 == end1; +} + +static int PTRFASTCALL +PREFIX(nameLength)(const ENCODING *enc, const char *ptr) +{ + const char *start = ptr; + for (;;) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + ptr += MINBPC(enc); + break; + default: + return ptr - start; + } + } +} + +static const char * PTRFASTCALL +PREFIX(skipS)(const ENCODING *enc, const char *ptr) +{ + for (;;) { + switch (BYTE_TYPE(enc, ptr)) { + case BT_LF: + case BT_CR: + case BT_S: + ptr += MINBPC(enc); + break; + default: + return ptr; + } + } +} + +static void PTRCALL +PREFIX(updatePosition)(const ENCODING *enc, + const char *ptr, + const char *end, + POSITION *pos) +{ + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_LF: + pos->columnNumber = (unsigned)-1; + pos->lineNumber++; + ptr += MINBPC(enc); + break; + case BT_CR: + pos->lineNumber++; + ptr += MINBPC(enc); + if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + pos->columnNumber = (unsigned)-1; + break; + default: + ptr += MINBPC(enc); + break; + } + pos->columnNumber++; + } +} + +#undef DO_LEAD_CASE +#undef MULTIBYTE_CASES +#undef INVALID_CASES +#undef CHECK_NAME_CASE +#undef CHECK_NAME_CASES +#undef CHECK_NMSTRT_CASE +#undef CHECK_NMSTRT_CASES + Added: external/celementtree-1.0.5-20051216/expat/xmltok_impl.h ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/xmltok_impl.h Fri Dec 16 23:02:39 2005 @@ -0,0 +1,46 @@ +/* +Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd +See the file COPYING for copying permission. +*/ + +enum { + BT_NONXML, + BT_MALFORM, + BT_LT, + BT_AMP, + BT_RSQB, + BT_LEAD2, + BT_LEAD3, + BT_LEAD4, + BT_TRAIL, + BT_CR, + BT_LF, + BT_GT, + BT_QUOT, + BT_APOS, + BT_EQUALS, + BT_QUEST, + BT_EXCL, + BT_SOL, + BT_SEMI, + BT_NUM, + BT_LSQB, + BT_S, + BT_NMSTRT, + BT_COLON, + BT_HEX, + BT_DIGIT, + BT_NAME, + BT_MINUS, + BT_OTHER, /* known not to be a name or name start character */ + BT_NONASCII, /* might be a name or name start character */ + BT_PERCNT, + BT_LPAR, + BT_RPAR, + BT_AST, + BT_PLUS, + BT_COMMA, + BT_VERBAR +}; + +#include Added: external/celementtree-1.0.5-20051216/expat/xmltok_ns.c ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/expat/xmltok_ns.c Fri Dec 16 23:02:39 2005 @@ -0,0 +1,106 @@ +const ENCODING * +NS(XmlGetUtf8InternalEncoding)(void) +{ + return &ns(internal_utf8_encoding).enc; +} + +const ENCODING * +NS(XmlGetUtf16InternalEncoding)(void) +{ +#if BYTEORDER == 1234 + return &ns(internal_little2_encoding).enc; +#elif BYTEORDER == 4321 + return &ns(internal_big2_encoding).enc; +#else + const short n = 1; + return (*(const char *)&n + ? &ns(internal_little2_encoding).enc + : &ns(internal_big2_encoding).enc); +#endif +} + +static const ENCODING *NS(encodings)[] = { + &ns(latin1_encoding).enc, + &ns(ascii_encoding).enc, + &ns(utf8_encoding).enc, + &ns(big2_encoding).enc, + &ns(big2_encoding).enc, + &ns(little2_encoding).enc, + &ns(utf8_encoding).enc /* NO_ENC */ +}; + +static int PTRCALL +NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + return initScan(NS(encodings), (const INIT_ENCODING *)enc, + XML_PROLOG_STATE, ptr, end, nextTokPtr); +} + +static int PTRCALL +NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + return initScan(NS(encodings), (const INIT_ENCODING *)enc, + XML_CONTENT_STATE, ptr, end, nextTokPtr); +} + +int +NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, + const char *name) +{ + int i = getEncodingIndex(name); + if (i == UNKNOWN_ENC) + return 0; + SET_INIT_ENC_INDEX(p, i); + p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); + p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); + p->initEnc.updatePosition = initUpdatePosition; + p->encPtr = encPtr; + *encPtr = &(p->initEnc); + return 1; +} + +static const ENCODING * +NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) +{ +#define ENCODING_MAX 128 + char buf[ENCODING_MAX]; + char *p = buf; + int i; + XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); + if (ptr != end) + return 0; + *p = 0; + if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) + return enc; + i = getEncodingIndex(buf); + if (i == UNKNOWN_ENC) + return 0; + return NS(encodings)[i]; +} + +int +NS(XmlParseXmlDecl)(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingName, + const ENCODING **encoding, + int *standalone) +{ + return doParseXmlDecl(NS(findEncoding), + isGeneralTextEntity, + enc, + ptr, + end, + badPtr, + versionPtr, + versionEndPtr, + encodingName, + encoding, + standalone); +} Added: external/celementtree-1.0.5-20051216/samples/simple-ns.xml ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/samples/simple-ns.xml Fri Dec 16 23:02:39 2005 @@ -0,0 +1,7 @@ + + + + text + texttail + + Added: external/celementtree-1.0.5-20051216/samples/simple.xml ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/samples/simple.xml Fri Dec 16 23:02:39 2005 @@ -0,0 +1,6 @@ + + + text + texttail + + Added: external/celementtree-1.0.5-20051216/selftest.py ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/selftest.py Fri Dec 16 23:02:39 2005 @@ -0,0 +1,664 @@ +# $Id: /work/modules/celementtree/selftest.py 1128 2005-12-16T21:57:13.668520Z Fredrik $ +# elementtree selftest program + +# this test script uses Python's "doctest" module to check that the +# *test script* works as expected. + +import sys, StringIO + +import cElementTree as ElementTree + +def unserialize(text): + import StringIO + file = StringIO.StringIO(text) + tree = ElementTree.parse(file) + return tree.getroot() + +def serialize(elem, encoding=None): + import StringIO + file = StringIO.StringIO() + tree = ElementTree.ElementTree(elem) + if encoding: + tree.write(file, encoding) + else: + tree.write(file) + return file.getvalue() + +def summarize(elem): + return elem.tag + +def summarize_list(seq): + return map(summarize, seq) + +SAMPLE_XML = unserialize(""" + + text + +
      + subtext +
      + +""") + +SAMPLE_XML_NS = unserialize(""" + + text + +
      + subtext +
      + +""") + +# interface tests + +def check_string(string): + len(string) + for char in string: + if len(char) != 1: + print "expected one-character string, got %r" % char + new_string = string + "" + new_string = string + " " + string[:0] + +def check_mapping(mapping): + len(mapping) + keys = mapping.keys() + items = mapping.items() + for key in keys: + item = mapping[key] + mapping["key"] = "value" + if mapping["key"] != "value": + print "expected value string, got %r" % mapping["key"] + +def check_element(element): + if not ElementTree.iselement(element): + print "not an element" + if not hasattr(element, "tag"): + print "no tag member" + if not hasattr(element, "attrib"): + print "no attrib member" + if not hasattr(element, "text"): + print "no text member" + if not hasattr(element, "tail"): + print "no tail member" + check_string(element.tag) + check_mapping(element.attrib) + if element.text != None: + check_string(element.text) + if element.tail != None: + check_string(element.tail) + +def check_element_tree(tree): + check_element(tree.getroot()) + +def check_method(method): + if not callable(method): + print method, "not callable" + +def version(): + """ + >>> ElementTree.__version__ + '1.0.5' + >>> ElementTree.VERSION + '1.0.5' + """ + +def element(): + """ + Test element tree interface. + + >>> element = ElementTree.Element("tag") + >>> check_element(element) + >>> tree = ElementTree.ElementTree(element) + >>> check_element_tree(tree) + + Make sure all standard element methods exist. + + >>> check_method(element.append) + >>> check_method(element.insert) + >>> check_method(element.remove) + >>> check_method(element.getchildren) + >>> check_method(element.find) + >>> check_method(element.findall) + >>> check_method(element.findtext) + >>> check_method(element.clear) + >>> check_method(element.get) + >>> check_method(element.set) + >>> check_method(element.keys) + >>> check_method(element.items) + >>> check_method(element.getiterator) + + Basic method sanity checks. + + >>> serialize(element) # 1 + '' + >>> subelement = ElementTree.Element("subtag") + >>> element.append(subelement) + >>> serialize(element) # 2 + '' + >>> element.insert(0, subelement) + >>> serialize(element) # 3 + '' + >>> element.remove(subelement) + >>> serialize(element) # 4 + '' + >>> element.remove(subelement) + >>> serialize(element) # 5 + '' + >>> element.remove(subelement) + Traceback (most recent call last): + ValueError: list.remove(x): x not in list + >>> serialize(element) # 6 + '' + + """ + +def parsefile(): + """ + Test parsing from file. Note that we're opening the files in + here; by default, the 'parse' function opens the file in binary + mode, and doctest doesn't filter out carriage returns. + + >>> tree = ElementTree.parse(open("samples/simple.xml", "r")) + >>> tree.write(sys.stdout) + + text + texttail + + + >>> tree = ElementTree.parse(open("samples/simple-ns.xml", "r")) + >>> tree.write(sys.stdout) + + text + texttail + + + + >>> parser = ElementTree.XMLParser() + >>> parser.version + 'Expat 1.95.8' + >>> parser.feed(open("samples/simple.xml").read()) + >>> print serialize(parser.close()) + + text + texttail + + + + >>> parser = ElementTree.XMLTreeBuilder() # 1.2 compatibility + >>> parser.feed(open("samples/simple.xml").read()) + >>> print serialize(parser.close()) + + text + texttail + + + + >>> target = ElementTree.TreeBuilder() + >>> parser = ElementTree.XMLParser(target=target) + >>> parser.feed(open("samples/simple.xml").read()) + >>> print serialize(parser.close()) + + text + texttail + + + """ + +def writefile(): + """ + >>> elem = ElementTree.Element("tag") + >>> elem.text = "text" + >>> serialize(elem) + 'text' + >>> ElementTree.SubElement(elem, "subtag").text = "subtext" + >>> serialize(elem) + 'textsubtext' + >>> elem.insert(0, ElementTree.Comment("comment")) + >>> serialize(elem) + 'textsubtext' + >>> elem[0] = ElementTree.PI("key", "value") + >>> serialize(elem) + 'textsubtext' + """ + +def encoding(): + r""" + Test encoding issues. + + >>> elem = ElementTree.Element("tag") + >>> elem.text = u"abc" + >>> serialize(elem) + 'abc' + >>> serialize(elem, "utf-8") + 'abc' + >>> serialize(elem, "us-ascii") + 'abc' + >>> serialize(elem, "iso-8859-1") + "\nabc" + + >>> elem.text = "<&\"\'>" + >>> serialize(elem) + '<&"\'>' + >>> serialize(elem, "utf-8") + '<&"\'>' + >>> serialize(elem, "us-ascii") # cdata characters + '<&"\'>' + >>> serialize(elem, "iso-8859-1") + '\n<&"\'>' + + >>> elem.attrib["key"] = "<&\"\'>" + >>> elem.text = None + >>> serialize(elem) + '' + >>> serialize(elem, "utf-8") + '' + >>> serialize(elem, "us-ascii") + '' + >>> serialize(elem, "iso-8859-1") + '\n' + + >>> elem.text = u'\xe5\xf6\xf6<>' + >>> elem.attrib.clear() + >>> serialize(elem) + 'åöö<>' + >>> serialize(elem, "utf-8") + '\xc3\xa5\xc3\xb6\xc3\xb6<>' + >>> serialize(elem, "us-ascii") + 'åöö<>' + >>> serialize(elem, "iso-8859-1") + "\n\xe5\xf6\xf6<>" + + >>> elem.attrib["key"] = u'\xe5\xf6\xf6<>' + >>> elem.text = None + >>> serialize(elem) + '' + >>> serialize(elem, "utf-8") + '' + >>> serialize(elem, "us-ascii") + '' + >>> serialize(elem, "iso-8859-1") + '\n' + + """ + +def qname(): + """ + Test QName handling. + + 1) decorated tags + + >>> elem = ElementTree.Element("{uri}tag") + >>> serialize(elem) # 1.1 + '' + + 2) decorated attributes + + >>> elem.attrib["{uri}key"] = "value" + >>> serialize(elem) # 2.1 + '' + + """ + +def cdata(): + """ + Test CDATA handling (etc). + + >>> serialize(unserialize("hello")) + 'hello' + >>> serialize(unserialize("hello")) + 'hello' + >>> serialize(unserialize("")) + 'hello' + + """ + +def find(): + """ + Test find methods (including xpath syntax). + + >>> elem = SAMPLE_XML + >>> elem.find("tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("tag").tag + 'tag' + >>> elem.find("section/tag").tag + 'tag' + >>> ElementTree.ElementTree(elem).find("section/tag").tag + 'tag' + >>> elem.findtext("tag") + 'text' + >>> elem.findtext("tog", "default") + 'default' + >>> ElementTree.ElementTree(elem).findtext("tag") + 'text' + >>> elem.findtext("section/tag") + 'subtext' + >>> ElementTree.ElementTree(elem).findtext("section/tag") + 'subtext' + >>> summarize_list(elem.findall("tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall("*")) + ['tag', 'tag', 'section'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("section/tag")) + ['tag'] + >>> summarize_list(elem.findall("section//tag")) + ['tag'] + >>> summarize_list(elem.findall("section/*")) + ['tag'] + >>> summarize_list(elem.findall("section//*")) + ['tag'] + >>> summarize_list(elem.findall("section/.//*")) + ['tag'] + >>> summarize_list(elem.findall("*/*")) + ['tag'] + >>> summarize_list(elem.findall("*//*")) + ['tag'] + >>> summarize_list(elem.findall("*/tag")) + ['tag'] + >>> summarize_list(elem.findall("*/./tag")) + ['tag'] + >>> summarize_list(elem.findall("./tag")) + ['tag', 'tag'] + >>> summarize_list(elem.findall(".//tag")) + ['tag', 'tag', 'tag'] + >>> summarize_list(elem.findall("././tag")) + ['tag', 'tag'] + >>> summarize_list(ElementTree.ElementTree(elem).findall("/tag")) + ['tag', 'tag'] + >>> summarize_list(ElementTree.ElementTree(elem).findall("./tag")) + ['tag', 'tag'] + >>> elem = SAMPLE_XML_NS + >>> summarize_list(elem.findall("tag")) + [] + >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) + ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] + """ + +def copy(): + """ + Test copy handling (etc). + + >>> import copy + >>> e1 = unserialize("hello") + >>> e2 = copy.copy(e1) + >>> e3 = copy.deepcopy(e1) + >>> e1.find("foo").tag = "bar" + >>> serialize(e1) + 'hello' + >>> serialize(e2) + 'hello' + >>> serialize(e3) + 'hello' + + """ + +def attrib(): + """ + Test attribute handling. + + >>> elem = ElementTree.Element("tag") + >>> elem.get("key") # 1.1 + >>> elem.get("key", "default") # 1.2 + 'default' + >>> elem.set("key", "value") + >>> elem.get("key") # 1.3 + 'value' + + >>> elem = ElementTree.Element("tag", key="value") + >>> elem.get("key") # 2.1 + 'value' + >>> elem.attrib # 2.2 + {'key': 'value'} + + >>> attrib = {"key": "value"} + >>> elem = ElementTree.Element("tag", attrib) + >>> attrib.clear() # check for aliasing issues + >>> elem.get("key") # 3.1 + 'value' + >>> elem.attrib # 3.2 + {'key': 'value'} + + >>> attrib = {"key": "value"} + >>> elem = ElementTree.Element("tag", **attrib) + >>> attrib.clear() # check for aliasing issues + >>> elem.get("key") # 4.1 + 'value' + >>> elem.attrib # 4.2 + {'key': 'value'} + + >>> elem = ElementTree.Element("tag", {"key": "other"}, key="value") + >>> elem.get("key") # 5.1 + 'value' + >>> elem.attrib # 5.2 + {'key': 'value'} + + """ + +def makeelement(): + """ + Test makeelement handling. + + >>> elem = ElementTree.Element("tag") + >>> attrib = {"key": "value"} + >>> subelem = elem.makeelement("subtag", attrib) + >>> if subelem.attrib is attrib: + ... print "attrib aliasing" + >>> elem.append(subelem) + >>> serialize(elem) + '' + + >>> elem.clear() + >>> serialize(elem) + '' + >>> elem.append(subelem) + >>> serialize(elem) + '' + + """ + +def iterparse(): + """ + Test iterparse interface. + + >>> context = ElementTree.iterparse("samples/simple.xml") + >>> for action, elem in context: + ... print action, elem.tag + end element + end element + end empty-element + end root + >>> context.root.tag + 'root' + + >>> context = ElementTree.iterparse("samples/simple-ns.xml") + >>> for action, elem in context: + ... print action, elem.tag + end {namespace}element + end {namespace}element + end {namespace}empty-element + end {namespace}root + + >>> events = () + >>> context = ElementTree.iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = () + >>> context = ElementTree.iterparse("samples/simple.xml", events=events) + >>> for action, elem in context: + ... print action, elem.tag + + >>> events = ("start", "end") + >>> context = ElementTree.iterparse("samples/simple.xml", events) + >>> for action, elem in context: + ... print action, elem.tag + start root + start element + end element + start element + end element + start empty-element + end empty-element + end root + + >>> events = ("start", "end") + >>> context = ElementTree.iterparse("samples/simple-ns.xml", events) + >>> for action, elem in context: + ... if action in ("start", "end"): + ... print action, elem.tag + ... else: + ... print action, elem + start {namespace}root + start {namespace}element + end {namespace}element + start {namespace}element + end {namespace}element + start {namespace}empty-element + end {namespace}empty-element + end {namespace}root + + >>> events = ("start", "end", "bogus") + >>> context = ElementTree.iterparse("samples/simple.xml", events) + >>> if sys.version[:3] > "2.1": # don't apply this test for 2.1 + ... for action, elem in context: + ... if action in ("start", "end"): + ... print action, elem.tag + ... else: + ... print action, elem + ... else: + ... raise ValueError("unknown event 'bogus'") + Traceback (most recent call last): + ValueError: unknown event 'bogus' + """ + +def custom_builder(): + """ + Test parser w. custom builder. + + >>> class Builder: + ... def start(self, tag, attrib): + ... print "start", tag + ... def end(self, tag): + ... print "end", tag + ... def data(self, text): + ... pass + >>> builder = Builder() + >>> parser = ElementTree.XMLParser(builder) + >>> parser.feed(open("samples/simple.xml", "r").read()) + start root + start element + end element + start element + end element + start empty-element + end empty-element + end root + + >>> class Builder: + ... def start(self, tag, attrib): + ... print "start", tag + ... def end(self, tag): + ... print "end", tag + ... def data(self, text): + ... pass + ... def pi(self, target, data): + ... print "pi", target, repr(data) + ... def comment(self, data): + ... print "comment", repr(data) + >>> builder = Builder() + >>> parser = ElementTree.XMLParser(builder) + >>> parser.feed(open("samples/simple-ns.xml", "r").read()) + pi pi 'data' + comment ' comment ' + start {namespace}root + start {namespace}element + end {namespace}element + start {namespace}element + end {namespace}element + start {namespace}empty-element + end {namespace}empty-element + end {namespace}root + + """ + +def getchildren(): + """ + + >>> tree = ElementTree.parse(open("samples/simple.xml", "r")) + >>> for elem in tree.getiterator(): + ... summarize_list(elem.getchildren()) + ['element', 'element', 'empty-element'] + [] + [] + [] + + """ + +ENTITY_XML = """\ + +%user-entities; +]> +&entity; +""" + +def entity(): + """ + Test entity handling. + + 1) bad entities + + >>> ElementTree.XML("&entity;") + Traceback (most recent call last): + SyntaxError: undefined entity: line 1, column 10 + + 2) custom entity + + >>> parser = ElementTree.XMLParser() + >>> parser.entity["entity"] = "text" + >>> parser.feed(ENTITY_XML) + >>> root = parser.close() + >>> serialize(root) + 'text' + + """ + +# +# reported bugs + +class ExceptionFile: + def read(self, x): + raise IOError + +def xmltoolkit60(): + """ + Handle crash in stream source. + >>> tree = ElementTree.parse(ExceptionFile()) + Traceback (most recent call last): + IOError + """ + +def xmltoolkit61(encoding): + """ + Handle non-standard encodings. + >>> xmltoolkit61("ascii") + >>> xmltoolkit61("us-ascii") + >>> xmltoolkit61("iso-8859-1") + >>> xmltoolkit61("iso-8859-15") + >>> xmltoolkit61("cp437") + >>> xmltoolkit61("mac-roman") + """ + ElementTree.XML( + "" % encoding + ) + +if __name__ == "__main__": + import doctest + failed, tested = doctest.testmod(__import__(__name__)) + print tested - failed, "tests ok." Added: external/celementtree-1.0.5-20051216/setup.py ============================================================================== --- (empty file) +++ external/celementtree-1.0.5-20051216/setup.py Fri Dec 16 23:02:39 2005 @@ -0,0 +1,97 @@ +#!/usr/bin/env python +# +# Setup script for the cElementTree accelerator +# $Id: /work/modules/celementtree/setup.py 1128 2005-12-16T21:57:13.668520Z Fredrik $ +# +# Usage: python setup.py install +# + +from distutils.core import setup, Extension +from distutils import sysconfig +import sys, os + +# -------------------------------------------------------------------- +# identification + +NAME = "cElementTree" +VERSION = "1.0.5-20051216" +DESCRIPTION = "A fast C implementation of the ElementTree API." +AUTHOR = "Fredrik Lundh", "fredrik at pythonware.com" +HOMEPAGE = "http://www.effbot.org/zone/celementtree.htm" +DOWNLOAD = "http://effbot.org/downloads#celementtree" + +# -------------------------------------------------------------------- +# expat library + +sources = [ + "expat/xmlparse.c", + "expat/xmlrole.c", + "expat/xmltok.c", + ] + +includes = [ + "expat", + ] + +defines = [ + ("XML_STATIC", None), + ] + +if sys.platform == "win32": + # fake devstudio compilation to make sure winconfig.h is used + defines.append(("COMPILED_FROM_DSP", None)) +else: + # determine suitable defines (based on Python's setup.py file) + config_h = sysconfig.get_config_h_filename() + config_h_vars = sysconfig.parse_config_h(open(config_h)) + for feature_macro in ["HAVE_MEMMOVE", "HAVE_BCOPY"]: + if config_h_vars.has_key(feature_macro): + defines.append((feature_macro, "1")) + defines.append(("XML_NS", "1")) + defines.append(("XML_DTD", "1")) + if sys.byteorder == "little": + defines.append(("BYTEORDER", "1234")) + else: + defines.append(("BYTEORDER", "4321")) + defines.append(("XML_CONTEXT_BYTES", "1024")) + + +# -------------------------------------------------------------------- +# distutils declarations + +ext_modules = [] + +ext_modules.append( + Extension( + "cElementTree", ["cElementTree.c"] + sources, + define_macros=defines, + include_dirs=includes, + ) + ) + +try: + # add classifiers and download_url syntax to distutils + from distutils.dist import DistributionMetadata + DistributionMetadata.classifiers = None + DistributionMetadata.download_url = None +except: + pass + +setup( + author=AUTHOR[0], + author_email=AUTHOR[1], + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Operating System :: OS Independent", + "Topic :: Text Processing :: Markup :: XML", + ], + description=DESCRIPTION, + download_url=DOWNLOAD, + ext_modules = ext_modules, + license="Python (MIT style)", + long_description=DESCRIPTION, + name=NAME, + platforms="Python 2.1 and later.", + url=HOMEPAGE, + version=VERSION, + ) From python-checkins at python.org Fri Dec 16 23:05:41 2005 From: python-checkins at python.org (fredrik.lundh) Date: Fri, 16 Dec 2005 23:05:41 +0100 (CET) Subject: [Python-checkins] commit of r41722 - python/trunk/Modules/_elementtree.c Message-ID: <20051216220541.A6E291E4002@bag.python.org> Author: fredrik.lundh Date: Fri Dec 16 23:05:40 2005 New Revision: 41722 Removed: python/trunk/Modules/_elementtree.c Log: updating to cElementTree 1.0.5 Deleted: /python/trunk/Modules/_elementtree.c ============================================================================== --- /python/trunk/Modules/_elementtree.c Fri Dec 16 23:05:40 2005 +++ (empty file) @@ -1,2723 +0,0 @@ -/* - * ElementTree - * $Id: /work/modules/celementtree/cElementTree.c 1089 2005-12-14T21:22:30.257830Z Fredrik $ - * - * elementtree accelerator - * - * History: - * 1999-06-20 fl created (as part of sgmlop) - * 2001-05-29 fl effdom edition - * 2001-06-05 fl backported to unix; fixed bogus free in clear - * 2001-07-10 fl added findall helper - * 2003-02-27 fl elementtree edition (alpha) - * 2004-06-03 fl updates for elementtree 1.2 - * 2005-01-05 fl added universal name cache, Element/SubElement factories - * 2005-01-06 fl moved python helpers into C module; removed 1.5.2 support - * 2005-01-07 fl added 2.1 support; work around broken __copy__ in 2.3 - * 2005-01-08 fl added makeelement method; fixed path support - * 2005-01-10 fl optimized memory usage - * 2005-01-11 fl first public release (cElementTree 0.8) - * 2005-01-12 fl split element object into base and extras - * 2005-01-13 fl use tagged pointers for tail/text (cElementTree 0.9) - * 2005-01-17 fl added treebuilder close method - * 2005-01-17 fl fixed crash in getchildren - * 2005-01-18 fl removed observer api, added iterparse (cElementTree 0.9.3) - * 2005-01-23 fl revised iterparse api; added namespace event support (0.9.8) - * 2005-01-26 fl added VERSION module property (cElementTree 1.0) - * 2005-01-28 fl added remove method (1.0.1) - * 2005-03-01 fl added iselement function; fixed makeelement aliasing (1.0.2) - * 2005-03-13 fl export Comment and ProcessingInstruction/PI helpers - * 2005-03-26 fl added Comment and PI support to XMLParser - * 2005-03-27 fl event optimizations; complain about bogus events - * 2005-08-08 fl fixed read error handling in parse - * 2005-08-11 fl added runtime test for copy workaround (1.0.3) - * 2005-12-13 fl added expat_capi support (for xml.etree) - * - * Copyright (c) 1999-2005 by Secret Labs AB. All rights reserved. - * Copyright (c) 1999-2005 by Fredrik Lundh. - * - * info at pythonware.com - * http://www.pythonware.com - */ - -/* Licensed to PSF under a Contributor Agreement. */ -/* See http://www.python.org/2.4/license for licensing details. */ - -#include "Python.h" - -#define VERSION "1.0.4" - -/* -------------------------------------------------------------------- */ -/* configuration */ - -/* Leave defined to include the expat-based XMLParser type */ -#define USE_EXPAT - -/* Define to to all expat calls via pyexpat's embedded expat library */ -/* #define USE_PYEXPAT_CAPI */ - -/* An element can hold this many children without extra memory - allocations. */ -#define STATIC_CHILDREN 4 - -/* For best performance, chose a value so that 80-90% of all nodes - have no more than the given number of children. Set this to zero - to minimize the size of the element structure itself (this only - helps if you have lots of leaf nodes with attributes). */ - -/* Also note that pymalloc always allocates blocks in multiples of - eight bytes. For the current version of cElementTree, this means - that the number of children should be an even number, at least on - 32-bit platforms. */ - -/* -------------------------------------------------------------------- */ - -#if 0 -static int memory = 0; -#define ALLOC(size, comment)\ -do { memory += size; printf("%8d - %s\n", memory, comment); } while (0) -#define RELEASE(size, comment)\ -do { memory -= size; printf("%8d - %s\n", memory, comment); } while (0) -#else -#define ALLOC(size, comment) -#define RELEASE(size, comment) -#endif - -/* compiler tweaks */ -#if defined(_MSC_VER) -#define LOCAL(type) static __inline type __fastcall -#else -#define LOCAL(type) static type -#endif - -/* compatibility macros */ -#if (PY_VERSION_HEX < 0x02040000) -#define PyDict_CheckExact PyDict_Check -#if (PY_VERSION_HEX < 0x02020000) -#define PyList_CheckExact PyList_Check -#define PyString_CheckExact PyString_Check -#if (PY_VERSION_HEX >= 0x01060000) -#define Py_USING_UNICODE /* always enabled for 2.0 and 2.1 */ -#endif -#endif -#endif - -#if (PY_VERSION_HEX >= 0x02050000) -#define PY_CONST const /* 2.5 adds const to some API:s */ -#else -#define PY_CONST -#endif - -#if !defined(Py_RETURN_NONE) -#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None -#endif - -/* macros used to store 'join' flags in string object pointers. note - that all use of text and tail as object pointers must be wrapped in - JOIN_OBJ. see comments in the ElementObject definition for more - info. */ -#define JOIN_GET(p) ((Py_uintptr_t) (p) & 1) -#define JOIN_SET(p, flag) ((void*) ((Py_uintptr_t) (JOIN_OBJ(p)) | (flag))) -#define JOIN_OBJ(p) ((PyObject*) ((Py_uintptr_t) (p) & ~1)) - -/* glue functions (see the init function for details) */ -static PyObject* elementtree_copyelement_obj; -static PyObject* elementtree_deepcopy_obj; -static PyObject* elementtree_getiterator_obj; -static PyObject* elementpath_obj; - -/* helpers */ - -LOCAL(PyObject*) -deepcopy(PyObject* object, PyObject* memo) -{ - /* do a deep copy of the given object */ - - PyObject* args; - PyObject* result; - - if (!elementtree_deepcopy_obj) { - PyErr_SetString( - PyExc_RuntimeError, - "deepcopy helper not found" - ); - return NULL; - } - - args = PyTuple_New(2); - Py_INCREF(object); PyTuple_SET_ITEM(args, 0, (PyObject*) object); - Py_INCREF(memo); PyTuple_SET_ITEM(args, 1, (PyObject*) memo); - - result = PyObject_CallObject(elementtree_deepcopy_obj, args); - - Py_DECREF(args); - - return result; -} - -LOCAL(PyObject*) -list_join(PyObject* list) -{ - /* join list elements (destroying the list in the process) */ - - PyObject* joiner; - PyObject* function; - PyObject* args; - PyObject* result; - - switch (PyList_GET_SIZE(list)) { - case 0: - Py_DECREF(list); - return PyString_FromString(""); - case 1: - result = PyList_GET_ITEM(list, 0); - Py_INCREF(result); - Py_DECREF(list); - return result; - } - - /* two or more elements: slice out a suitable separator from the - first member, and use that to join the entire list */ - - joiner = PySequence_GetSlice(PyList_GET_ITEM(list, 0), 0, 0); - if (!joiner) - return NULL; - - function = PyObject_GetAttrString(joiner, "join"); - if (!function) { - Py_DECREF(joiner); - return NULL; - } - - args = PyTuple_New(1); - PyTuple_SET_ITEM(args, 0, list); - - result = PyObject_CallObject(function, args); - - Py_DECREF(args); /* also removes list */ - Py_DECREF(function); - Py_DECREF(joiner); - - return result; -} - -#if (PY_VERSION_HEX < 0x02020000) -LOCAL(int) -PyDict_Update(PyObject* dict, PyObject* other) -{ - /* PyDict_Update emulation for 2.1 and earlier */ - - PyObject* res; - - res = PyObject_CallMethod(dict, "update", "O", other); - if (!res) - return -1; - - Py_DECREF(res); - return 0; -} -#endif - -/* -------------------------------------------------------------------- */ -/* the element type */ - -typedef struct { - - /* attributes (a dictionary object), or None if no attributes */ - PyObject* attrib; - - /* child elements */ - int length; /* actual number of items */ - int allocated; /* allocated items */ - - /* this either points to _children or to a malloced buffer */ - PyObject* *children; - - PyObject* _children[STATIC_CHILDREN]; - -} ElementObjectExtra; - -typedef struct { - PyObject_HEAD - - /* element tag (a string). */ - PyObject* tag; - - /* text before first child. note that this is a tagged pointer; - use JOIN_OBJ to get the object pointer. the join flag is used - to distinguish lists created by the tree builder from lists - assigned to the attribute by application code; the former - should be joined before being returned to the user, the latter - should be left intact. */ - PyObject* text; - - /* text after this element, in parent. note that this is a tagged - pointer; use JOIN_OBJ to get the object pointer. */ - PyObject* tail; - - ElementObjectExtra* extra; - -} ElementObject; - -staticforward PyTypeObject Element_Type; - -#define Element_CheckExact(op) ((op)->ob_type == &Element_Type) - -/* -------------------------------------------------------------------- */ -/* element constructor and destructor */ - -LOCAL(int) -element_new_extra(ElementObject* self, PyObject* attrib) -{ - self->extra = PyObject_Malloc(sizeof(ElementObjectExtra)); - if (!self->extra) - return -1; - - if (!attrib) - attrib = Py_None; - - Py_INCREF(attrib); - self->extra->attrib = attrib; - - self->extra->length = 0; - self->extra->allocated = STATIC_CHILDREN; - self->extra->children = self->extra->_children; - - return 0; -} - -LOCAL(void) -element_dealloc_extra(ElementObject* self) -{ - int i; - - Py_DECREF(self->extra->attrib); - - for (i = 0; i < self->extra->length; i++) - Py_DECREF(self->extra->children[i]); - - if (self->extra->children != self->extra->_children) - PyObject_Free(self->extra->children); - - PyObject_Free(self->extra); -} - -LOCAL(PyObject*) -element_new(PyObject* tag, PyObject* attrib) -{ - ElementObject* self; - - self = PyObject_New(ElementObject, &Element_Type); - if (self == NULL) - return NULL; - - /* use None for empty dictionaries */ - if (PyDict_CheckExact(attrib) && !PyDict_Size(attrib)) - attrib = Py_None; - - self->extra = NULL; - - if (attrib != Py_None) { - - if (element_new_extra(self, attrib) < 0) - return NULL; - - self->extra->length = 0; - self->extra->allocated = STATIC_CHILDREN; - self->extra->children = self->extra->_children; - - } - - Py_INCREF(tag); - self->tag = tag; - - Py_INCREF(Py_None); - self->text = Py_None; - - Py_INCREF(Py_None); - self->tail = Py_None; - - ALLOC(sizeof(ElementObject), "create element"); - - return (PyObject*) self; -} - -LOCAL(int) -element_resize(ElementObject* self, int extra) -{ - int size; - PyObject* *children; - - /* make sure self->children can hold the given number of extra - elements. set an exception and return -1 if allocation failed */ - - if (!self->extra) - element_new_extra(self, NULL); - - size = self->extra->length + extra; - - if (size > self->extra->allocated) { - /* use Python 2.4's list growth strategy */ - size = (size >> 3) + (size < 9 ? 3 : 6) + size; - if (self->extra->children != self->extra->_children) { - children = PyObject_Realloc(self->extra->children, - size * sizeof(PyObject*)); - if (!children) - goto nomemory; - } else { - children = PyObject_Malloc(size * sizeof(PyObject*)); - if (!children) - goto nomemory; - /* copy existing children from static area to malloc buffer */ - memcpy(children, self->extra->children, - self->extra->length * sizeof(PyObject*)); - } - self->extra->children = children; - self->extra->allocated = size; - } - - return 0; - - nomemory: - PyErr_NoMemory(); - return -1; -} - -LOCAL(int) -element_add_subelement(ElementObject* self, PyObject* element) -{ - /* add a child element to a parent */ - - if (element_resize(self, 1) < 0) - return -1; - - Py_INCREF(element); - self->extra->children[self->extra->length] = element; - - self->extra->length++; - - return 0; -} - -LOCAL(PyObject*) -element_get_attrib(ElementObject* self) -{ - /* return borrowed reference to attrib dictionary */ - /* note: this function assumes that the extra section exists */ - - PyObject* res = self->extra->attrib; - - if (res == Py_None) { - /* create missing dictionary */ - res = PyDict_New(); - if (!res) - return NULL; - self->extra->attrib = res; - } - - return res; -} - -LOCAL(PyObject*) -element_get_text(ElementObject* self) -{ - /* return borrowed reference to text attribute */ - - PyObject* res = self->text; - - if (JOIN_GET(res)) { - res = JOIN_OBJ(res); - if (PyList_CheckExact(res)) { - res = list_join(res); - if (!res) - return NULL; - self->text = res; - } - } - - return res; -} - -LOCAL(PyObject*) -element_get_tail(ElementObject* self) -{ - /* return borrowed reference to text attribute */ - - PyObject* res = self->tail; - - if (JOIN_GET(res)) { - res = JOIN_OBJ(res); - if (PyList_CheckExact(res)) { - res = list_join(res); - if (!res) - return NULL; - self->tail = res; - } - } - - return res; -} - -static PyObject* -element(PyObject* self, PyObject* args, PyObject* kw) -{ - PyObject* elem; - - PyObject* tag; - PyObject* attrib = NULL; - if (!PyArg_ParseTuple(args, "O|O!:Element", &tag, - &PyDict_Type, &attrib)) - return NULL; - - if (attrib || kw) { - attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New(); - if (!attrib) - return NULL; - if (kw) - PyDict_Update(attrib, kw); - } else { - Py_INCREF(Py_None); - attrib = Py_None; - } - - elem = element_new(tag, attrib); - - Py_DECREF(attrib); - - return elem; -} - -static PyObject* -subelement(PyObject* self, PyObject* args, PyObject* kw) -{ - PyObject* elem; - - ElementObject* parent; - PyObject* tag; - PyObject* attrib = NULL; - if (!PyArg_ParseTuple(args, "O!O|O!:SubElement", - &Element_Type, &parent, &tag, - &PyDict_Type, &attrib)) - return NULL; - - if (attrib || kw) { - attrib = (attrib) ? PyDict_Copy(attrib) : PyDict_New(); - if (!attrib) - return NULL; - if (kw) - PyDict_Update(attrib, kw); - } else { - Py_INCREF(Py_None); - attrib = Py_None; - } - - elem = element_new(tag, attrib); - - Py_DECREF(attrib); - - if (element_add_subelement(parent, elem) < 0) - return NULL; - - return elem; -} - -static void -element_dealloc(ElementObject* self) -{ - if (self->extra) - element_dealloc_extra(self); - - /* discard attributes */ - Py_DECREF(self->tag); - Py_DECREF(JOIN_OBJ(self->text)); - Py_DECREF(JOIN_OBJ(self->tail)); - - RELEASE(sizeof(ElementObject), "destroy element"); - - PyObject_Del(self); -} - -/* -------------------------------------------------------------------- */ -/* methods (in alphabetical order) */ - -static PyObject* -element_append(ElementObject* self, PyObject* args) -{ - PyObject* element; - if (!PyArg_ParseTuple(args, "O!:append", &Element_Type, &element)) - return NULL; - - if (element_add_subelement(self, element) < 0) - return NULL; - - Py_RETURN_NONE; -} - -static PyObject* -element_clear(ElementObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, ":clear")) - return NULL; - - if (self->extra) { - element_dealloc_extra(self); - self->extra = NULL; - } - - Py_INCREF(Py_None); - Py_DECREF(JOIN_OBJ(self->text)); - self->text = Py_None; - - Py_INCREF(Py_None); - Py_DECREF(JOIN_OBJ(self->tail)); - self->tail = Py_None; - - Py_RETURN_NONE; -} - -static PyObject* -element_copy(ElementObject* self, PyObject* args) -{ - int i; - ElementObject* element; - - if (!PyArg_ParseTuple(args, ":__copy__")) - return NULL; - - element = (ElementObject*) element_new( - self->tag, (self->extra) ? self->extra->attrib : Py_None - ); - if (!element) - return NULL; - - Py_DECREF(JOIN_OBJ(element->text)); - element->text = self->text; - Py_INCREF(JOIN_OBJ(element->text)); - - Py_DECREF(JOIN_OBJ(element->tail)); - element->tail = self->tail; - Py_INCREF(JOIN_OBJ(element->tail)); - - if (self->extra) { - - if (element_resize(element, self->extra->length) < 0) - return NULL; - - for (i = 0; i < self->extra->length; i++) { - Py_INCREF(self->extra->children[i]); - element->extra->children[i] = self->extra->children[i]; - } - - element->extra->length = self->extra->length; - - } - - return (PyObject*) element; -} - -static PyObject* -element_deepcopy(ElementObject* self, PyObject* args) -{ - int i; - ElementObject* element; - PyObject* tag; - PyObject* attrib; - PyObject* text; - PyObject* tail; - PyObject* id; - - PyObject* memo; - if (!PyArg_ParseTuple(args, "O:__deepcopy__", &memo)) - return NULL; - - tag = deepcopy(self->tag, memo); - if (!tag) - return NULL; - - if (self->extra) { - attrib = deepcopy(self->extra->attrib, memo); - if (!attrib) { - Py_DECREF(tag); - return NULL; - } - } else { - Py_INCREF(Py_None); - attrib = Py_None; - } - - element = (ElementObject*) element_new(tag, attrib); - - Py_DECREF(tag); - Py_DECREF(attrib); - - if (!element) - return NULL; - - text = deepcopy(JOIN_OBJ(self->text), memo); - if (!text) - goto error; - Py_DECREF(element->text); - element->text = JOIN_SET(text, JOIN_GET(self->text)); - - tail = deepcopy(JOIN_OBJ(self->tail), memo); - if (!tail) - goto error; - Py_DECREF(element->tail); - element->tail = JOIN_SET(tail, JOIN_GET(self->tail)); - - if (self->extra) { - - if (element_resize(element, self->extra->length) < 0) - goto error; - - for (i = 0; i < self->extra->length; i++) { - PyObject* child = deepcopy(self->extra->children[i], memo); - if (!child) { - element->extra->length = i; - goto error; - } - element->extra->children[i] = child; - } - - element->extra->length = self->extra->length; - - } - - /* add object to memo dictionary (so deepcopy won't visit it again) */ - id = PyInt_FromLong((Py_uintptr_t) self); - - i = PyDict_SetItem(memo, id, (PyObject*) element); - - Py_DECREF(id); - - if (i < 0) - goto error; - - return (PyObject*) element; - - error: - Py_DECREF(element); - return NULL; -} - -LOCAL(int) -checkpath(PyObject* tag) -{ - int i, check = 1; - - /* check if a tag contains an xpath character */ - -#define PATHCHAR(ch) (ch == '/' || ch == '*' || ch == '[' || ch == '@') - -#if defined(Py_USING_UNICODE) - if (PyUnicode_Check(tag)) { - Py_UNICODE *p = PyUnicode_AS_UNICODE(tag); - for (i = 0; i < PyUnicode_GET_SIZE(tag); i++) { - if (p[i] == '{') - check = 0; - else if (p[i] == '}') - check = 1; - else if (check && PATHCHAR(p[i])) - return 1; - } - return 0; - } -#endif - if (PyString_Check(tag)) { - char *p = PyString_AS_STRING(tag); - for (i = 0; i < PyString_GET_SIZE(tag); i++) { - if (p[i] == '{') - check = 0; - else if (p[i] == '}') - check = 1; - else if (check && PATHCHAR(p[i])) - return 1; - } - return 0; - } - - return 1; /* unknown type; might be path expression */ -} - -static PyObject* -element_find(ElementObject* self, PyObject* args) -{ - int i; - - PyObject* tag; - if (!PyArg_ParseTuple(args, "O:find", &tag)) - return NULL; - - if (checkpath(tag)) - return PyObject_CallMethod( - elementpath_obj, "find", "OO", self, tag - ); - - if (!self->extra) - Py_RETURN_NONE; - - for (i = 0; i < self->extra->length; i++) { - PyObject* item = self->extra->children[i]; - if (Element_CheckExact(item) && - PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) { - Py_INCREF(item); - return item; - } - } - - Py_RETURN_NONE; -} - -static PyObject* -element_findtext(ElementObject* self, PyObject* args) -{ - int i; - - PyObject* tag; - PyObject* default_value = Py_None; - if (!PyArg_ParseTuple(args, "O|O:findtext", &tag, &default_value)) - return NULL; - - if (checkpath(tag)) - return PyObject_CallMethod( - elementpath_obj, "findtext", "OOO", self, tag, default_value - ); - - if (!self->extra) { - Py_INCREF(default_value); - return default_value; - } - - for (i = 0; i < self->extra->length; i++) { - ElementObject* item = (ElementObject*) self->extra->children[i]; - if (Element_CheckExact(item) && !PyObject_Compare(item->tag, tag)) { - PyObject* text = element_get_text(item); - if (text == Py_None) - return PyString_FromString(""); - Py_INCREF(text); - return text; - } - } - - Py_INCREF(default_value); - return default_value; -} - -static PyObject* -element_findall(ElementObject* self, PyObject* args) -{ - int i; - PyObject* out; - - PyObject* tag; - if (!PyArg_ParseTuple(args, "O:findall", &tag)) - return NULL; - - if (checkpath(tag)) - return PyObject_CallMethod( - elementpath_obj, "findall", "OO", self, tag - ); - - out = PyList_New(0); - if (!out) - return NULL; - - if (!self->extra) - return out; - - for (i = 0; i < self->extra->length; i++) { - PyObject* item = self->extra->children[i]; - if (Element_CheckExact(item) && - PyObject_Compare(((ElementObject*)item)->tag, tag) == 0) { - if (PyList_Append(out, item) < 0) { - Py_DECREF(out); - return NULL; - } - } - } - - return out; -} - -static PyObject* -element_get(ElementObject* self, PyObject* args) -{ - PyObject* value; - - PyObject* key; - PyObject* default_value = Py_None; - if (!PyArg_ParseTuple(args, "O|O:get", &key, &default_value)) - return NULL; - - if (!self->extra || self->extra->attrib == Py_None) - value = default_value; - else { - value = PyDict_GetItem(self->extra->attrib, key); - if (!value) - value = default_value; - } - - Py_INCREF(value); - return value; -} - -static PyObject* -element_getchildren(ElementObject* self, PyObject* args) -{ - int i; - PyObject* list; - - if (!PyArg_ParseTuple(args, ":getchildren")) - return NULL; - - if (!self->extra) - return PyList_New(0); - - list = PyList_New(self->extra->length); - if (!list) - return NULL; - - for (i = 0; i < self->extra->length; i++) { - PyObject* item = self->extra->children[i]; - Py_INCREF(item); - PyList_SET_ITEM(list, i, item); - } - - return list; -} - -static PyObject* -element_getiterator(ElementObject* self, PyObject* args) -{ - PyObject* result; - - PyObject* tag = Py_None; - if (!PyArg_ParseTuple(args, "|O:getiterator", &tag)) - return NULL; - - if (!elementtree_getiterator_obj) { - PyErr_SetString( - PyExc_RuntimeError, - "getiterator helper not found" - ); - return NULL; - } - - args = PyTuple_New(2); - Py_INCREF(self); PyTuple_SET_ITEM(args, 0, (PyObject*) self); - Py_INCREF(tag); PyTuple_SET_ITEM(args, 1, (PyObject*) tag); - - result = PyObject_CallObject(elementtree_getiterator_obj, args); - - Py_DECREF(args); - - return result; -} - -static PyObject* -element_getitem(ElementObject* self, int index) -{ - if (!self->extra || index < 0 || index >= self->extra->length) { - PyErr_SetString( - PyExc_IndexError, - "child index out of range" - ); - return NULL; - } - - Py_INCREF(self->extra->children[index]); - return self->extra->children[index]; -} - -static PyObject* -element_getslice(ElementObject* self, int start, int end) -{ - int i; - PyObject* list; - - if (!self->extra) - return PyList_New(0); - - /* standard clamping */ - if (start < 0) - start = 0; - if (end < 0) - end = 0; - if (end > self->extra->length) - end = self->extra->length; - if (start > end) - start = end; - - list = PyList_New(end - start); - if (!list) - return NULL; - - for (i = start; i < end; i++) { - PyObject* item = self->extra->children[i]; - Py_INCREF(item); - PyList_SET_ITEM(list, i - start, item); - } - - return list; -} - -static PyObject* -element_insert(ElementObject* self, PyObject* args) -{ - int i; - - int index; - PyObject* element; - if (!PyArg_ParseTuple(args, "iO!:insert", &index, - &Element_Type, &element)) - return NULL; - - if (!self->extra) - element_new_extra(self, NULL); - - if (index < 0) - index = 0; - if (index > self->extra->length) - index = self->extra->length; - - if (element_resize(self, 1) < 0) - return NULL; - - for (i = self->extra->length; i > index; i--) - self->extra->children[i] = self->extra->children[i-1]; - - Py_INCREF(element); - self->extra->children[index] = element; - - self->extra->length++; - - Py_RETURN_NONE; -} - -static PyObject* -element_items(ElementObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, ":items")) - return NULL; - - if (!self->extra || self->extra->attrib == Py_None) - return PyList_New(0); - - return PyDict_Items(self->extra->attrib); -} - -static PyObject* -element_keys(ElementObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, ":keys")) - return NULL; - - if (!self->extra || self->extra->attrib == Py_None) - return PyList_New(0); - - return PyDict_Keys(self->extra->attrib); -} - -static int -element_length(ElementObject* self) -{ - if (!self->extra) - return 0; - - return self->extra->length; -} - -static PyObject* -element_makeelement(PyObject* self, PyObject* args, PyObject* kw) -{ - PyObject* elem; - - PyObject* tag; - PyObject* attrib; - if (!PyArg_ParseTuple(args, "OO:makeelement", &tag, &attrib)) - return NULL; - - attrib = PyDict_Copy(attrib); - if (!attrib) - return NULL; - - elem = element_new(tag, attrib); - - Py_DECREF(attrib); - - return elem; -} - -static PyObject* -element_reduce(ElementObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, ":__reduce__")) - return NULL; - - /* Hack alert: This method is used to work around a __copy__ - problem on certain 2.3 and 2.4 versions. To save time and - simplify the code, we create the copy in here, and use a dummy - copyelement helper to trick the copy module into doing the - right thing. */ - - if (!elementtree_copyelement_obj) { - PyErr_SetString( - PyExc_RuntimeError, - "copyelement helper not found" - ); - return NULL; - } - - return Py_BuildValue( - "O(N)", elementtree_copyelement_obj, element_copy(self, args) - ); -} - -static PyObject* -element_remove(ElementObject* self, PyObject* args) -{ - int i; - - PyObject* element; - if (!PyArg_ParseTuple(args, "O!:remove", &Element_Type, &element)) - return NULL; - - if (!self->extra) { - /* element has no children, so raise exception */ - PyErr_SetString( - PyExc_ValueError, - "list.remove(x): x not in list" - ); - return NULL; - } - - for (i = 0; i < self->extra->length; i++) { - if (self->extra->children[i] == element) - break; - if (PyObject_Compare(self->extra->children[i], element) == 0) - break; - } - - if (i == self->extra->length) { - /* element is not in children, so raise exception */ - PyErr_SetString( - PyExc_ValueError, - "list.remove(x): x not in list" - ); - return NULL; - } - - Py_DECREF(self->extra->children[i]); - - self->extra->length--; - - for (; i < self->extra->length; i++) - self->extra->children[i] = self->extra->children[i+1]; - - Py_RETURN_NONE; -} - -static PyObject* -element_repr(ElementObject* self) -{ - PyObject* repr; - char buffer[100]; - - repr = PyString_FromString("tag)); - - sprintf(buffer, " at %p>", self); - PyString_ConcatAndDel(&repr, PyString_FromString(buffer)); - - return repr; -} - -static PyObject* -element_set(ElementObject* self, PyObject* args) -{ - PyObject* attrib; - - PyObject* key; - PyObject* value; - if (!PyArg_ParseTuple(args, "OO:set", &key, &value)) - return NULL; - - if (!self->extra) - element_new_extra(self, NULL); - - attrib = element_get_attrib(self); - if (!attrib) - return NULL; - - if (PyDict_SetItem(attrib, key, value) < 0) - return NULL; - - Py_RETURN_NONE; -} - -static int -element_setslice(ElementObject* self, int start, int end, PyObject* item) -{ - int i, new, old; - PyObject* recycle = NULL; - - if (!self->extra) - element_new_extra(self, NULL); - - /* standard clamping */ - if (start < 0) - start = 0; - if (end < 0) - end = 0; - if (end > self->extra->length) - end = self->extra->length; - if (start > end) - start = end; - - old = end - start; - - if (item == NULL) - new = 0; - else if (PyList_CheckExact(item)) { - new = PyList_GET_SIZE(item); - } else { - /* FIXME: support arbitrary sequences? */ - PyErr_Format( - PyExc_TypeError, - "expected list, not \"%.200s\"", item->ob_type->tp_name - ); - return -1; - } - - if (old > 0) { - /* to avoid recursive calls to this method (via decref), move - old items to the recycle bin here, and get rid of them when - we're done modifying the element */ - recycle = PyList_New(old); - for (i = 0; i < old; i++) - PyList_SET_ITEM(recycle, i, self->extra->children[i + start]); - } - - if (new < old) { - /* delete slice */ - for (i = end; i < self->extra->length; i++) - self->extra->children[i + new - old] = self->extra->children[i]; - } else if (new > old) { - /* insert slice */ - if (element_resize(self, new - old) < 0) - return -1; - for (i = self->extra->length-1; i >= end; i--) - self->extra->children[i + new - old] = self->extra->children[i]; - } - - /* replace the slice */ - for (i = 0; i < new; i++) { - PyObject* element = PyList_GET_ITEM(item, i); - Py_INCREF(element); - self->extra->children[i + start] = element; - } - - self->extra->length += new - old; - - /* discard the recycle bin, and everything in it */ - Py_XDECREF(recycle); - - return 0; -} - -static int -element_setitem(ElementObject* self, int index, PyObject* item) -{ - int i; - PyObject* old; - - if (!self->extra || index < 0 || index >= self->extra->length) { - PyErr_SetString( - PyExc_IndexError, - "child assignment index out of range"); - return -1; - } - - old = self->extra->children[index]; - - if (item) { - Py_INCREF(item); - self->extra->children[index] = item; - } else { - self->extra->length--; - for (i = index; i < self->extra->length; i++) - self->extra->children[i] = self->extra->children[i+1]; - } - - Py_DECREF(old); - - return 0; -} - -static PyMethodDef element_methods[] = { - - {"clear", (PyCFunction) element_clear, METH_VARARGS}, - - {"get", (PyCFunction) element_get, METH_VARARGS}, - {"set", (PyCFunction) element_set, METH_VARARGS}, - - {"find", (PyCFunction) element_find, METH_VARARGS}, - {"findtext", (PyCFunction) element_findtext, METH_VARARGS}, - {"findall", (PyCFunction) element_findall, METH_VARARGS}, - - {"append", (PyCFunction) element_append, METH_VARARGS}, - {"insert", (PyCFunction) element_insert, METH_VARARGS}, - {"remove", (PyCFunction) element_remove, METH_VARARGS}, - - {"getiterator", (PyCFunction) element_getiterator, METH_VARARGS}, - {"getchildren", (PyCFunction) element_getchildren, METH_VARARGS}, - - {"items", (PyCFunction) element_items, METH_VARARGS}, - {"keys", (PyCFunction) element_keys, METH_VARARGS}, - - {"makeelement", (PyCFunction) element_makeelement, METH_VARARGS}, - - {"__copy__", (PyCFunction) element_copy, METH_VARARGS}, - {"__deepcopy__", (PyCFunction) element_deepcopy, METH_VARARGS}, - - /* Some 2.3 and 2.4 versions do not handle the __copy__ method on - C objects correctly, so we have to fake it using a __reduce__- - based hack (see the element_reduce implementation above for - details). */ - - /* The behaviour has been changed in 2.3.5 and 2.4.1, so we're - using a runtime test to figure out if we need to fake things - or now (see the init code below). The following entry is - enabled only if the hack is needed. */ - - {"!__reduce__", (PyCFunction) element_reduce, METH_VARARGS}, - - {NULL, NULL} -}; - -static PyObject* -element_getattr(ElementObject* self, char* name) -{ - PyObject* res; - - res = Py_FindMethod(element_methods, (PyObject*) self, name); - if (res) - return res; - - PyErr_Clear(); - - if (strcmp(name, "tag") == 0) - res = self->tag; - else if (strcmp(name, "text") == 0) - res = element_get_text(self); - else if (strcmp(name, "tail") == 0) { - res = element_get_tail(self); - } else if (strcmp(name, "attrib") == 0) { - if (!self->extra) - element_new_extra(self, NULL); - res = element_get_attrib(self); - } else { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; - } - - if (!res) - return NULL; - - Py_INCREF(res); - return res; -} - -static int -element_setattr(ElementObject* self, const char* name, PyObject* value) -{ - if (value == NULL) { - PyErr_SetString( - PyExc_AttributeError, - "can't delete element attributes" - ); - return -1; - } - - if (strcmp(name, "tag") == 0) { - Py_DECREF(self->tag); - self->tag = value; - Py_INCREF(self->tag); - } else if (strcmp(name, "text") == 0) { - Py_DECREF(JOIN_OBJ(self->text)); - self->text = value; - Py_INCREF(self->text); - } else if (strcmp(name, "tail") == 0) { - Py_DECREF(JOIN_OBJ(self->tail)); - self->tail = value; - Py_INCREF(self->tail); - } else if (strcmp(name, "attrib") == 0) { - if (!self->extra) - element_new_extra(self, NULL); - Py_DECREF(self->extra->attrib); - self->extra->attrib = value; - Py_INCREF(self->extra->attrib); - } else { - PyErr_SetString(PyExc_AttributeError, name); - return -1; - } - - return 0; -} - -static PySequenceMethods element_as_sequence = { - (inquiry) element_length, - 0, /* sq_concat */ - 0, /* sq_repeat */ - (intargfunc) element_getitem, - (intintargfunc) element_getslice, - (intobjargproc) element_setitem, - (intintobjargproc) element_setslice, -}; - -statichere PyTypeObject Element_Type = { - PyObject_HEAD_INIT(NULL) - 0, "Element", sizeof(ElementObject), 0, - /* methods */ - (destructor)element_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc)element_getattr, /* tp_getattr */ - (setattrfunc)element_setattr, /* tp_setattr */ - 0, /* tp_compare */ - (reprfunc)element_repr, /* tp_repr */ - 0, /* tp_as_number */ - &element_as_sequence, /* tp_as_sequence */ -}; - -/* ==================================================================== */ -/* the tree builder type */ - -typedef struct { - PyObject_HEAD - - PyObject* root; /* root node (first created node) */ - - ElementObject* this; /* current node */ - ElementObject* last; /* most recently created node */ - - PyObject* data; /* data collector (string or list), or NULL */ - - PyObject* stack; /* element stack */ - int index; /* current stack size (0=empty) */ - - /* element tracing */ - PyObject* events; /* list of events, or NULL if not collecting */ - PyObject* start_event_obj; /* event objects (NULL to ignore) */ - PyObject* end_event_obj; - PyObject* start_ns_event_obj; - PyObject* end_ns_event_obj; - -} TreeBuilderObject; - -staticforward PyTypeObject TreeBuilder_Type; - -#define TreeBuilder_CheckExact(op) ((op)->ob_type == &TreeBuilder_Type) - -/* -------------------------------------------------------------------- */ -/* constructor and destructor */ - -LOCAL(PyObject*) -treebuilder_new(void) -{ - TreeBuilderObject* self; - - self = PyObject_New(TreeBuilderObject, &TreeBuilder_Type); - if (self == NULL) - return NULL; - - self->root = NULL; - - Py_INCREF(Py_None); - self->this = (ElementObject*) Py_None; - - Py_INCREF(Py_None); - self->last = (ElementObject*) Py_None; - - self->data = NULL; - - self->stack = PyList_New(20); - self->index = 0; - - self->events = NULL; - self->start_event_obj = self->end_event_obj = NULL; - self->start_ns_event_obj = self->end_ns_event_obj = NULL; - - ALLOC(sizeof(TreeBuilderObject), "create treebuilder"); - - return (PyObject*) self; -} - -static PyObject* -treebuilder(PyObject* _self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, ":TreeBuilder")) - return NULL; - - return treebuilder_new(); -} - -static void -treebuilder_dealloc(TreeBuilderObject* self) -{ - Py_XDECREF(self->end_ns_event_obj); - Py_XDECREF(self->start_ns_event_obj); - Py_XDECREF(self->end_event_obj); - Py_XDECREF(self->start_event_obj); - Py_XDECREF(self->events); - Py_DECREF(self->stack); - Py_XDECREF(self->data); - Py_DECREF(self->last); - Py_DECREF(self->this); - Py_XDECREF(self->root); - - RELEASE(sizeof(TreeBuilderObject), "destroy treebuilder"); - - PyObject_Del(self); -} - -/* -------------------------------------------------------------------- */ -/* handlers */ - -LOCAL(PyObject*) -treebuilder_handle_xml(TreeBuilderObject* self, PyObject* encoding, - PyObject* standalone) -{ - Py_RETURN_NONE; -} - -LOCAL(PyObject*) -treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, - PyObject* attrib) -{ - PyObject* node; - PyObject* this; - - if (self->data) { - if (self->this == self->last) { - self->last->text = JOIN_SET( - self->data, PyList_CheckExact(self->data) - ); - } else { - self->last->tail = JOIN_SET( - self->data, PyList_CheckExact(self->data) - ); - } - self->data = NULL; - } - - node = element_new(tag, attrib); - if (!node) - return NULL; - - this = (PyObject*) self->this; - - if (this != Py_None) { - if (element_add_subelement((ElementObject*) this, node) < 0) - return NULL; - } else { - if (self->root) { - PyErr_SetString( - PyExc_SyntaxError, - "multiple elements on top level" - ); - return NULL; - } - Py_INCREF(node); - self->root = node; - } - - if (self->index < PyList_GET_SIZE(self->stack)) { - if (PyList_SetItem(self->stack, self->index, this) < 0) - return NULL; - Py_INCREF(this); - } else { - if (PyList_Append(self->stack, this) < 0) - return NULL; - } - self->index++; - - Py_DECREF(this); - Py_INCREF(node); - self->this = (ElementObject*) node; - - Py_DECREF(self->last); - Py_INCREF(node); - self->last = (ElementObject*) node; - - if (self->start_event_obj) { - PyObject* res; - PyObject* action = self->start_event_obj; - res = PyTuple_New(2); - if (res) { - Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action); - Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node); - PyList_Append(self->events, res); - Py_DECREF(res); - } else - PyErr_Clear(); /* FIXME: propagate error */ - } - - return node; -} - -LOCAL(PyObject*) -treebuilder_handle_data(TreeBuilderObject* self, PyObject* data) -{ - if (!self->data) { - /* store the first item as is */ - Py_INCREF(data); self->data = data; - } else { - /* more than one item; use a list to collect items */ - if (PyString_CheckExact(self->data) && self->data->ob_refcnt == 1 && - PyString_CheckExact(data) && PyString_GET_SIZE(data) == 1) { - /* expat often generates single character data sections; handle - the most common case by resizing the existing string... */ - int size = PyString_GET_SIZE(self->data); - if (_PyString_Resize(&self->data, size + 1) < 0) - return NULL; - PyString_AS_STRING(self->data)[size] = PyString_AS_STRING(data)[0]; - } else if (PyList_CheckExact(self->data)) { - if (PyList_Append(self->data, data) < 0) - return NULL; - } else { - PyObject* list = PyList_New(2); - if (!list) - return NULL; - PyList_SET_ITEM(list, 0, self->data); - Py_INCREF(data); PyList_SET_ITEM(list, 1, data); - self->data = list; - } - } - - Py_RETURN_NONE; -} - -LOCAL(PyObject*) -treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) -{ - PyObject* item; - - if (self->data) { - if (self->this == self->last) { - self->last->text = JOIN_SET( - self->data, PyList_CheckExact(self->data) - ); - } else { - self->last->tail = JOIN_SET( - self->data, PyList_CheckExact(self->data) - ); - } - self->data = NULL; - } - - if (self->index == 0) { - PyErr_SetString( - PyExc_IndexError, - "pop from empty stack" - ); - return NULL; - } - - self->index--; - - item = PyList_GET_ITEM(self->stack, self->index); - Py_INCREF(item); - - Py_DECREF(self->last); - - self->last = (ElementObject*) self->this; - self->this = (ElementObject*) item; - - if (self->end_event_obj) { - PyObject* res; - PyObject* action = self->end_event_obj; - PyObject* node = (PyObject*) self->last; - res = PyTuple_New(2); - if (res) { - Py_INCREF(action); PyTuple_SET_ITEM(res, 0, (PyObject*) action); - Py_INCREF(node); PyTuple_SET_ITEM(res, 1, (PyObject*) node); - PyList_Append(self->events, res); - Py_DECREF(res); - } else - PyErr_Clear(); /* FIXME: propagate error */ - } - - Py_INCREF(self->last); - return (PyObject*) self->last; -} - -LOCAL(void) -treebuilder_handle_namespace(TreeBuilderObject* self, int start, - const char* prefix, const char *uri) -{ - PyObject* res; - PyObject* action; - PyObject* parcel; - - if (!self->events) - return; - - if (start) { - if (!self->start_ns_event_obj) - return; - action = self->start_ns_event_obj; - /* FIXME: prefix and uri use utf-8 encoding! */ - parcel = Py_BuildValue("ss", (prefix) ? prefix : "", uri); - if (!parcel) - return; - Py_INCREF(action); - } else { - if (!self->end_ns_event_obj) - return; - action = self->end_ns_event_obj; - Py_INCREF(action); - parcel = Py_None; - Py_INCREF(parcel); - } - - res = PyTuple_New(2); - - if (res) { - PyTuple_SET_ITEM(res, 0, action); - PyTuple_SET_ITEM(res, 1, parcel); - PyList_Append(self->events, res); - Py_DECREF(res); - } else - PyErr_Clear(); /* FIXME: propagate error */ -} - -/* -------------------------------------------------------------------- */ -/* methods (in alphabetical order) */ - -static PyObject* -treebuilder_data(TreeBuilderObject* self, PyObject* args) -{ - PyObject* data; - if (!PyArg_ParseTuple(args, "O:data", &data)) - return NULL; - - return treebuilder_handle_data(self, data); -} - -static PyObject* -treebuilder_end(TreeBuilderObject* self, PyObject* args) -{ - PyObject* tag; - if (!PyArg_ParseTuple(args, "O:end", &tag)) - return NULL; - - return treebuilder_handle_end(self, tag); -} - -LOCAL(PyObject*) -treebuilder_done(TreeBuilderObject* self) -{ - PyObject* res; - - /* FIXME: check stack size? */ - - if (self->root) - res = self->root; - else - res = Py_None; - - Py_INCREF(res); - return res; -} - -static PyObject* -treebuilder_close(TreeBuilderObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, ":close")) - return NULL; - - return treebuilder_done(self); -} - -static PyObject* -treebuilder_start(TreeBuilderObject* self, PyObject* args) -{ - PyObject* tag; - PyObject* attrib = Py_None; - if (!PyArg_ParseTuple(args, "O|O:start", &tag, &attrib)) - return NULL; - - return treebuilder_handle_start(self, tag, attrib); -} - -static PyObject* -treebuilder_xml(TreeBuilderObject* self, PyObject* args) -{ - PyObject* encoding; - PyObject* standalone; - if (!PyArg_ParseTuple(args, "OO:xml", &encoding, &standalone)) - return NULL; - - return treebuilder_handle_xml(self, encoding, standalone); -} - -static PyMethodDef treebuilder_methods[] = { - {"data", (PyCFunction) treebuilder_data, METH_VARARGS}, - {"start", (PyCFunction) treebuilder_start, METH_VARARGS}, - {"end", (PyCFunction) treebuilder_end, METH_VARARGS}, - {"xml", (PyCFunction) treebuilder_xml, METH_VARARGS}, - {"close", (PyCFunction) treebuilder_close, METH_VARARGS}, - {NULL, NULL} -}; - -static PyObject* -treebuilder_getattr(TreeBuilderObject* self, char* name) -{ - return Py_FindMethod(treebuilder_methods, (PyObject*) self, name); -} - -statichere PyTypeObject TreeBuilder_Type = { - PyObject_HEAD_INIT(NULL) - 0, "TreeBuilder", sizeof(TreeBuilderObject), 0, - /* methods */ - (destructor)treebuilder_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc)treebuilder_getattr, /* tp_getattr */ -}; - -/* ==================================================================== */ -/* the expat interface */ - -#if defined(USE_EXPAT) - -#include "expat.h" - -#if defined(USE_PYEXPAT_CAPI) -#include "pyexpat.h" -static struct PyExpat_CAPI* expat_capi; -#define EXPAT(func) (expat_capi->func) -#else -#define EXPAT(func) (XML_##func) -#endif - -typedef struct { - PyObject_HEAD - - XML_Parser parser; - - PyObject* target; - PyObject* entity; - - PyObject* names; - - PyObject* handle_xml; - PyObject* handle_start; - PyObject* handle_data; - PyObject* handle_end; - - PyObject* handle_comment; - PyObject* handle_pi; - -} XMLParserObject; - -staticforward PyTypeObject XMLParser_Type; - -/* helpers */ - -#if defined(Py_USING_UNICODE) -LOCAL(int) -checkstring(const char* string, int size) -{ - int i; - - /* check if an 8-bit string contains UTF-8 characters */ - for (i = 0; i < size; i++) - if (string[i] & 0x80) - return 1; - - return 0; -} -#endif - -LOCAL(PyObject*) -makestring(const char* string, int size) -{ - /* convert a UTF-8 string to either a 7-bit ascii string or a - Unicode string */ - -#if defined(Py_USING_UNICODE) - if (checkstring(string, size)) - return PyUnicode_DecodeUTF8(string, size, "strict"); -#endif - - return PyString_FromStringAndSize(string, size); -} - -LOCAL(PyObject*) -makeuniversal(XMLParserObject* self, const char* string) -{ - /* convert a UTF-8 tag/attribute name from the expat parser - to a universal name string */ - - int size = strlen(string); - PyObject* key; - PyObject* value; - - /* look the 'raw' name up in the names dictionary */ - key = PyString_FromStringAndSize(string, size); - if (!key) - return NULL; - - value = PyDict_GetItem(self->names, key); - - if (value) { - Py_INCREF(value); - } else { - /* new name. convert to universal name, and decode as - necessary */ - - PyObject* tag; - char* p; - int i; - - /* look for namespace separator */ - for (i = 0; i < size; i++) - if (string[i] == '}') - break; - if (i != size) { - /* convert to universal name */ - tag = PyString_FromStringAndSize(NULL, size+1); - p = PyString_AS_STRING(tag); - p[0] = '{'; - memcpy(p+1, string, size); - size++; - } else { - /* plain name; use key as tag */ - Py_INCREF(key); - tag = key; - } - - /* decode universal name */ -#if defined(Py_USING_UNICODE) - /* inline makestring, to avoid duplicating the source string if - it's not an utf-8 string */ - p = PyString_AS_STRING(tag); - if (checkstring(p, size)) { - value = PyUnicode_DecodeUTF8(p, size, "strict"); - Py_DECREF(tag); - if (!value) { - Py_DECREF(key); - return NULL; - } - } else -#endif - value = tag; /* use tag as is */ - - /* add to names dictionary */ - if (PyDict_SetItem(self->names, key, value) < 0) { - Py_DECREF(key); - Py_DECREF(value); - return NULL; - } - } - - Py_DECREF(key); - return value; -} - -/* -------------------------------------------------------------------- */ -/* handlers */ - -static void -expat_default_handler(XMLParserObject* self, const XML_Char* data_in, - int data_len) -{ - PyObject* key; - PyObject* value; - PyObject* res; - - if (data_len < 2 || data_in[0] != '&') - return; - - key = makestring(data_in + 1, data_len - 2); - if (!key) - return; - - value = PyDict_GetItem(self->entity, key); - - if (value) { - if (TreeBuilder_CheckExact(self->target)) - res = treebuilder_handle_data( - (TreeBuilderObject*) self->target, value - ); - else if (self->handle_data) - res = PyObject_CallFunction(self->handle_data, "O", value); - else - res = NULL; - Py_DECREF(value); - Py_XDECREF(res); - } else { - PyErr_Format( - PyExc_SyntaxError, "undefined entity &%s;: line %d, column %d", - PyString_AS_STRING(key), - EXPAT(GetErrorLineNumber)(self->parser), - EXPAT(GetErrorColumnNumber)(self->parser) - ); - } - - Py_DECREF(key); -} - -static void -expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, - const XML_Char **attrib_in) -{ - PyObject* res; - PyObject* tag; - PyObject* attrib; - int ok; - - /* tag name */ - tag = makeuniversal(self, tag_in); - if (!tag) - return; /* parser will look for errors */ - - /* attributes */ - if (attrib_in[0]) { - attrib = PyDict_New(); - if (!attrib) - return; - while (attrib_in[0] && attrib_in[1]) { - PyObject* key = makeuniversal(self, attrib_in[0]); - PyObject* value = makestring(attrib_in[1], strlen(attrib_in[1])); - if (!key || !value) { - Py_XDECREF(value); - Py_XDECREF(key); - Py_DECREF(attrib); - return; - } - ok = PyDict_SetItem(attrib, key, value); - Py_DECREF(value); - Py_DECREF(key); - if (ok < 0) { - Py_DECREF(attrib); - return; - } - attrib_in += 2; - } - } else { - Py_INCREF(Py_None); - attrib = Py_None; - } - - if (TreeBuilder_CheckExact(self->target)) - /* shortcut */ - res = treebuilder_handle_start((TreeBuilderObject*) self->target, - tag, attrib); - else if (self->handle_start) - res = PyObject_CallFunction(self->handle_start, "OO", tag, attrib); - else - res = NULL; - - Py_DECREF(tag); - Py_DECREF(attrib); - - Py_XDECREF(res); -} - -static void -expat_data_handler(XMLParserObject* self, const XML_Char* data_in, - int data_len) -{ - PyObject* data; - PyObject* res; - - data = makestring(data_in, data_len); - - if (TreeBuilder_CheckExact(self->target)) - /* shortcut */ - res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); - else if (self->handle_data) - res = PyObject_CallFunction(self->handle_data, "O", data); - else - res = NULL; - - Py_DECREF(data); - - Py_XDECREF(res); -} - -static void -expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) -{ - PyObject* tag; - PyObject* res = NULL; - - if (TreeBuilder_CheckExact(self->target)) - /* shortcut */ - /* the standard tree builder doesn't look at the end tag */ - res = treebuilder_handle_end( - (TreeBuilderObject*) self->target, Py_None - ); - else if (self->handle_end) { - tag = makeuniversal(self, tag_in); - if (tag) { - res = PyObject_CallFunction(self->handle_end, "O", tag); - Py_DECREF(tag); - } - } - - Py_XDECREF(res); -} - -static void -expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix, - const XML_Char *uri) -{ - treebuilder_handle_namespace( - (TreeBuilderObject*) self->target, 1, prefix, uri - ); -} - -static void -expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) -{ - treebuilder_handle_namespace( - (TreeBuilderObject*) self->target, 0, NULL, NULL - ); -} - -static void -expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) -{ - PyObject* comment; - PyObject* res; - - if (self->handle_comment) { - comment = makestring(comment_in, strlen(comment_in)); - if (comment) { - res = PyObject_CallFunction(self->handle_comment, "O", comment); - Py_XDECREF(res); - Py_DECREF(comment); - } - } -} - -static void -expat_pi_handler(XMLParserObject* self, const XML_Char* target_in, - const XML_Char* data_in) -{ - PyObject* target; - PyObject* data; - PyObject* res; - - if (self->handle_pi) { - target = makestring(target_in, strlen(target_in)); - data = makestring(data_in, strlen(data_in)); - if (target && data) { - res = PyObject_CallFunction(self->handle_pi, "OO", target, data); - Py_XDECREF(res); - Py_DECREF(data); - Py_DECREF(target); - } else { - Py_XDECREF(data); - Py_XDECREF(target); - } - } -} - -/* -------------------------------------------------------------------- */ -/* constructor and destructor */ - -static PyObject* -xmlparser(PyObject* _self, PyObject* args, PyObject* kw) -{ - XMLParserObject* self; - /* FIXME: does this need to be static? */ - static XML_Memory_Handling_Suite memory_handler; - - PyObject* target = NULL; - char* encoding = NULL; - static PY_CONST char* kwlist[] = { "target", "encoding", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kw, "|Oz:XMLParser", kwlist, - &target, &encoding)) - return NULL; - -#if defined(USE_PYEXPAT_CAPI) - if (!expat_capi) { - PyErr_SetString( - PyExc_RuntimeError, "cannot load dispatch table from pyexpat" - ); - return NULL; - } -#endif - - self = PyObject_New(XMLParserObject, &XMLParser_Type); - if (self == NULL) - return NULL; - - self->entity = PyDict_New(); - if (!self->entity) { - PyObject_Del(self); - return NULL; /* FIXME: cleanup on error */ - } - - self->names = PyDict_New(); - if (!self->names) { - PyObject_Del(self); - return NULL; /* FIXME: cleanup on error */ - } - - memory_handler.malloc_fcn = PyObject_Malloc; - memory_handler.realloc_fcn = PyObject_Realloc; - memory_handler.free_fcn = PyObject_Free; - - self->parser = EXPAT(ParserCreate_MM)(encoding, &memory_handler, "}"); - if (!self->parser) { - PyErr_NoMemory(); - return NULL; /* FIXME: cleanup on error */ - } - - /* setup target handlers */ - if (!target) { - target = treebuilder_new(); - if (!target) { - PyObject_Del(self); - return NULL; /* FIXME: cleanup on error */ - } - } else - Py_INCREF(target); - self->target = target; - - self->handle_xml = PyObject_GetAttrString(target, "xml"); - self->handle_start = PyObject_GetAttrString(target, "start"); - self->handle_data = PyObject_GetAttrString(target, "data"); - self->handle_end = PyObject_GetAttrString(target, "end"); - self->handle_comment = PyObject_GetAttrString(target, "comment"); - self->handle_pi = PyObject_GetAttrString(target, "pi"); - - PyErr_Clear(); - - /* configure parser */ - EXPAT(SetUserData)(self->parser, self); - EXPAT(SetElementHandler)( - self->parser, - (XML_StartElementHandler) expat_start_handler, - (XML_EndElementHandler) expat_end_handler - ); - EXPAT(SetDefaultHandlerExpand)( - self->parser, - (XML_DefaultHandler) expat_default_handler - ); - EXPAT(SetCharacterDataHandler)( - self->parser, - (XML_CharacterDataHandler) expat_data_handler - ); - if (self->handle_comment) - EXPAT(SetCommentHandler)( - self->parser, - (XML_CommentHandler) expat_comment_handler - ); - if (self->handle_pi) - EXPAT(SetProcessingInstructionHandler)( - self->parser, - (XML_ProcessingInstructionHandler) expat_pi_handler - ); - - ALLOC(sizeof(XMLParserObject), "create expatparser"); - - return (PyObject*) self; -} - -static void -xmlparser_dealloc(XMLParserObject* self) -{ - EXPAT(ParserFree)(self->parser); - - Py_XDECREF(self->handle_pi); - Py_XDECREF(self->handle_comment); - Py_XDECREF(self->handle_end); - Py_XDECREF(self->handle_data); - Py_XDECREF(self->handle_start); - Py_XDECREF(self->handle_xml); - - Py_DECREF(self->target); - Py_DECREF(self->entity); - Py_DECREF(self->names); - - RELEASE(sizeof(XMLParserObject), "destroy expatparser"); - - PyObject_Del(self); -} - -/* -------------------------------------------------------------------- */ -/* methods (in alphabetical order) */ - -LOCAL(PyObject*) -expat_parse(XMLParserObject* self, char* data, int data_len, int final) -{ - int ok; - - ok = EXPAT(Parse)(self->parser, data, data_len, final); - - if (PyErr_Occurred()) - return NULL; - - if (!ok) { - PyErr_Format( - PyExc_SyntaxError, "%s: line %d, column %d", - EXPAT(ErrorString)(EXPAT(GetErrorCode)(self->parser)), - EXPAT(GetErrorLineNumber)(self->parser), - EXPAT(GetErrorColumnNumber)(self->parser) - ); - return NULL; - } - - Py_RETURN_NONE; -} - -static PyObject* -xmlparser_close(XMLParserObject* self, PyObject* args) -{ - /* end feeding data to parser */ - - PyObject* res; - if (!PyArg_ParseTuple(args, ":close")) - return NULL; - - res = expat_parse(self, "", 0, 1); - - if (res && TreeBuilder_CheckExact(self->target)) { - Py_DECREF(res); - return treebuilder_done((TreeBuilderObject*) self->target); - } - - return res; -} - -static PyObject* -xmlparser_feed(XMLParserObject* self, PyObject* args) -{ - /* feed data to parser */ - - char* data; - int data_len; - if (!PyArg_ParseTuple(args, "s#:feed", &data, &data_len)) - return NULL; - - return expat_parse(self, data, data_len, 0); -} - -static PyObject* -xmlparser_parse(XMLParserObject* self, PyObject* args) -{ - /* (internal) parse until end of input stream */ - - PyObject* reader; - PyObject* buffer; - PyObject* res; - - PyObject* fileobj; - if (!PyArg_ParseTuple(args, "O:_parse", &fileobj)) - return NULL; - - reader = PyObject_GetAttrString(fileobj, "read"); - if (!reader) - return NULL; - - /* read from open file object */ - for (;;) { - - buffer = PyObject_CallFunction(reader, "i", 64*1024); - - if (!buffer) { - /* read failed (e.g. due to KeyboardInterrupt) */ - Py_DECREF(reader); - return NULL; - } - - if (!PyString_CheckExact(buffer) || PyString_GET_SIZE(buffer) == 0) { - Py_DECREF(buffer); - break; - } - - res = expat_parse( - self, PyString_AS_STRING(buffer), PyString_GET_SIZE(buffer), 0 - ); - - Py_DECREF(buffer); - - if (!res) { - Py_DECREF(reader); - return NULL; - } - Py_DECREF(res); - - } - - Py_DECREF(reader); - - res = expat_parse(self, "", 0, 1); - - if (res && TreeBuilder_CheckExact(self->target)) { - Py_DECREF(res); - return treebuilder_done((TreeBuilderObject*) self->target); - } - - return res; -} - -static PyObject* -xmlparser_setevents(XMLParserObject* self, PyObject* args) -{ - /* activate element event reporting */ - - int i; - TreeBuilderObject* target; - - PyObject* events; /* event collector */ - PyObject* event_set = Py_None; - if (!PyArg_ParseTuple(args, "O!|O:_setevents", &PyList_Type, &events, - &event_set)) - return NULL; - - if (!TreeBuilder_CheckExact(self->target)) { - PyErr_SetString( - PyExc_TypeError, - "event handling only supported for cElementTree.Treebuilder " - "targets" - ); - return NULL; - } - - target = (TreeBuilderObject*) self->target; - - Py_INCREF(events); - Py_XDECREF(target->events); - target->events = events; - - /* clear out existing events */ - Py_XDECREF(target->start_event_obj); target->start_event_obj = NULL; - Py_XDECREF(target->end_event_obj); target->end_event_obj = NULL; - Py_XDECREF(target->start_ns_event_obj); target->start_ns_event_obj = NULL; - Py_XDECREF(target->end_ns_event_obj); target->end_ns_event_obj = NULL; - - if (event_set == Py_None) { - /* default is "end" only */ - target->end_event_obj = PyString_FromString("end"); - Py_RETURN_NONE; - } - - if (!PyTuple_Check(event_set)) /* FIXME: handle arbitrary sequences */ - goto error; - - for (i = 0; i < PyTuple_GET_SIZE(event_set); i++) { - PyObject* item = PyTuple_GET_ITEM(event_set, i); - char* event; - if (!PyString_Check(item)) - goto error; - event = PyString_AS_STRING(item); - if (strcmp(event, "start") == 0) { - Py_INCREF(item); - target->start_event_obj = item; - } else if (strcmp(event, "end") == 0) { - Py_INCREF(item); - Py_XDECREF(target->end_event_obj); - target->end_event_obj = item; - } else if (strcmp(event, "start-ns") == 0) { - Py_INCREF(item); - Py_XDECREF(target->start_ns_event_obj); - target->start_ns_event_obj = item; - EXPAT(SetNamespaceDeclHandler)( - self->parser, - (XML_StartNamespaceDeclHandler) expat_start_ns_handler, - (XML_EndNamespaceDeclHandler) expat_end_ns_handler - ); - } else if (strcmp(event, "end-ns") == 0) { - Py_INCREF(item); - Py_XDECREF(target->end_ns_event_obj); - target->end_ns_event_obj = item; - EXPAT(SetNamespaceDeclHandler)( - self->parser, - (XML_StartNamespaceDeclHandler) expat_start_ns_handler, - (XML_EndNamespaceDeclHandler) expat_end_ns_handler - ); - } else { - PyErr_Format( - PyExc_ValueError, - "unknown event '%s'", event - ); - return NULL; - } - } - - Py_RETURN_NONE; - - error: - PyErr_SetString( - PyExc_TypeError, - "invalid event tuple" - ); - return NULL; -} - -static PyMethodDef xmlparser_methods[] = { - {"feed", (PyCFunction) xmlparser_feed, METH_VARARGS}, - {"close", (PyCFunction) xmlparser_close, METH_VARARGS}, - {"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS}, - {"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS}, - {NULL, NULL} -}; - -static PyObject* -xmlparser_getattr(XMLParserObject* self, char* name) -{ - PyObject* res; - - res = Py_FindMethod(xmlparser_methods, (PyObject*) self, name); - if (res) - return res; - - PyErr_Clear(); - - if (strcmp(name, "entity") == 0) - res = self->entity; - else if (strcmp(name, "target") == 0) - res = self->target; - else if (strcmp(name, "version") == 0) { - char buffer[100]; - sprintf(buffer, "Expat %d.%d.%d", XML_MAJOR_VERSION, - XML_MINOR_VERSION, XML_MICRO_VERSION); - return PyString_FromString(buffer); - } else { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; - } - - Py_INCREF(res); - return res; -} - -statichere PyTypeObject XMLParser_Type = { - PyObject_HEAD_INIT(NULL) - 0, "XMLParser", sizeof(XMLParserObject), 0, - /* methods */ - (destructor)xmlparser_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - (getattrfunc)xmlparser_getattr, /* tp_getattr */ -}; - -#endif - -/* ==================================================================== */ -/* python module interface */ - -static PyMethodDef _functions[] = { - {"Element", (PyCFunction) element, METH_VARARGS|METH_KEYWORDS}, - {"SubElement", (PyCFunction) subelement, METH_VARARGS|METH_KEYWORDS}, - {"TreeBuilder", (PyCFunction) treebuilder, METH_VARARGS}, -#if defined(USE_EXPAT) - {"XMLParser", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS}, - {"XMLTreeBuilder", (PyCFunction) xmlparser, METH_VARARGS|METH_KEYWORDS}, -#endif - {NULL, NULL} -}; - -DL_EXPORT(void) -init_elementtree(void) -{ - PyObject* m; - PyObject* g; - char* bootstrap; -#if defined(USE_PYEXPAT_CAPI) - struct PyExpat_CAPI* capi; -#endif - - /* Patch object type */ - Element_Type.ob_type = TreeBuilder_Type.ob_type = &PyType_Type; -#if defined(USE_EXPAT) - XMLParser_Type.ob_type = &PyType_Type; -#endif - - m = Py_InitModule("_elementtree", _functions); - - /* python glue code */ - - g = PyDict_New(); - - PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins()); - - bootstrap = ( - -#if (PY_VERSION_HEX >= 0x02020000 && PY_VERSION_HEX < 0x02030000) - "from __future__ import generators\n" /* enable yield under 2.2 */ -#endif - - "from copy import copy, deepcopy\n" - - "try:\n" - " from xml.etree import ElementTree\n" - "except ImportError:\n" - " import ElementTree\n" - "ET = ElementTree\n" - "del ElementTree\n" - - "import _elementtree as cElementTree\n" - - "try:\n" /* check if copy works as is */ - " copy(cElementTree.Element('x'))\n" - "except:\n" - " def copyelement(elem):\n" - " return elem\n" - - "def Comment(text=None):\n" /* public */ - " element = cElementTree.Element(ET.Comment)\n" - " element.text = text\n" - " return element\n" - "cElementTree.Comment = Comment\n" - - "class ElementTree(ET.ElementTree):\n" /* public */ - " def parse(self, source, parser=None):\n" - " if not hasattr(source, 'read'):\n" - " source = open(source, 'rb')\n" - " if parser is not None:\n" - " while 1:\n" - " data = source.read(65536)\n" - " if not data:\n" - " break\n" - " parser.feed(data)\n" - " self._root = parser.close()\n" - " else:\n" - " parser = cElementTree.XMLParser()\n" - " self._root = parser._parse(source)\n" - " return self._root\n" - "cElementTree.ElementTree = ElementTree\n" - - "def getiterator(node, tag=None):\n" /* helper */ - " if tag == '*':\n" - " tag = None\n" -#if (PY_VERSION_HEX < 0x02020000) - " nodes = []\n" /* 2.1 doesn't have yield */ - " if tag is None or node.tag == tag:\n" - " nodes.append(node)\n" - " for node in node:\n" - " nodes.extend(getiterator(node, tag))\n" - " return nodes\n" -#else - " if tag is None or node.tag == tag:\n" - " yield node\n" - " for node in node:\n" - " for node in getiterator(node, tag):\n" - " yield node\n" -#endif - - "def parse(source, parser=None):\n" /* public */ - " tree = ElementTree()\n" - " tree.parse(source, parser)\n" - " return tree\n" - "cElementTree.parse = parse\n" - -#if (PY_VERSION_HEX < 0x02020000) - "if hasattr(ET, 'iterparse'):\n" - " cElementTree.iterparse = ET.iterparse\n" /* delegate on 2.1 */ -#else - "class iterparse(object):\n" - " root = None\n" - " def __init__(self, file, events=None):\n" - " if not hasattr(file, 'read'):\n" - " file = open(file, 'rb')\n" - " self._file = file\n" - " self._events = events\n" - " def __iter__(self):\n" - " events = []\n" - " b = cElementTree.TreeBuilder()\n" - " p = cElementTree.XMLParser(b)\n" - " p._setevents(events, self._events)\n" - " while 1:\n" - " data = self._file.read(16384)\n" - " if not data:\n" - " break\n" - " p.feed(data)\n" - " for event in events:\n" - " yield event\n" - " del events[:]\n" - " root = p.close()\n" - " for event in events:\n" - " yield event\n" - " self.root = root\n" - "cElementTree.iterparse = iterparse\n" -#endif - - "def PI(target, text=None):\n" /* public */ - " element = cElementTree.Element(ET.ProcessingInstruction)\n" - " element.text = target\n" - " if text:\n" - " element.text = element.text + ' ' + text\n" - " return element\n" - - " elem = cElementTree.Element(ET.PI)\n" - " elem.text = text\n" - " return elem\n" - "cElementTree.PI = cElementTree.ProcessingInstruction = PI\n" - - "def XML(text):\n" /* public */ - " parser = cElementTree.XMLParser()\n" - " parser.feed(text)\n" - " return parser.close()\n" - "cElementTree.XML = cElementTree.fromstring = XML\n" - - "def XMLID(text):\n" /* public */ - " tree = XML(text)\n" - " ids = {}\n" - " for elem in tree.getiterator():\n" - " id = elem.get('id')\n" - " if id:\n" - " ids[id] = elem\n" - " return tree, ids\n" - "cElementTree.XMLID = XMLID\n" - - "cElementTree.dump = ET.dump\n" - "cElementTree.ElementPath = ElementPath = ET.ElementPath\n" - "cElementTree.iselement = ET.iselement\n" - "cElementTree.QName = ET.QName\n" - "cElementTree.tostring = ET.tostring\n" - "cElementTree.VERSION = '" VERSION "'\n" - "cElementTree.__version__ = '" VERSION "'\n" - "cElementTree.XMLParserError = SyntaxError\n" - - ); - - PyRun_String(bootstrap, Py_file_input, g, NULL); - - elementpath_obj = PyDict_GetItemString(g, "ElementPath"); - - elementtree_copyelement_obj = PyDict_GetItemString(g, "copyelement"); - if (elementtree_copyelement_obj) { - /* reduce hack needed; enable reduce method */ - PyMethodDef* mp; - for (mp = element_methods; mp->ml_name; mp++) - if (mp->ml_meth == (PyCFunction) element_reduce) { - mp->ml_name = "__reduce__"; - break; - } - } else - PyErr_Clear(); - elementtree_deepcopy_obj = PyDict_GetItemString(g, "deepcopy"); - elementtree_getiterator_obj = PyDict_GetItemString(g, "getiterator"); - -#if defined(USE_PYEXPAT_CAPI) - /* link against pyexpat, if possible */ - capi = PyCObject_Import("pyexpat", "expat_CAPI"); - if (capi && - strcmp(capi->magic, PyExpat_CAPI_MAGIC) == 0 && - capi->size <= sizeof(*expat_capi) && - capi->MAJOR_VERSION == XML_MAJOR_VERSION && - capi->MINOR_VERSION == XML_MINOR_VERSION && - capi->MICRO_VERSION == XML_MICRO_VERSION) - expat_capi = capi; - else - expat_capi = NULL; -#endif - -} From python-checkins at python.org Fri Dec 16 23:06:06 2005 From: python-checkins at python.org (fredrik.lundh) Date: Fri, 16 Dec 2005 23:06:06 +0100 (CET) Subject: [Python-checkins] commit of r41723 - python/trunk/Modules/_elementtree.c Message-ID: <20051216220606.D5AF11E4002@bag.python.org> Author: fredrik.lundh Date: Fri Dec 16 23:06:06 2005 New Revision: 41723 Added: python/trunk/Modules/_elementtree.c - copied unchanged from r41721, external/celementtree-1.0.5-20051216/cElementTree.c Log: updating to cElementTree 1.0.5 (step 2 of 3) From python-checkins at python.org Fri Dec 16 23:06:43 2005 From: python-checkins at python.org (fredrik.lundh) Date: Fri, 16 Dec 2005 23:06:43 +0100 (CET) Subject: [Python-checkins] commit of r41724 - python/trunk/Modules/_elementtree.c Message-ID: <20051216220643.56B3F1E4002@bag.python.org> Author: fredrik.lundh Date: Fri Dec 16 23:06:43 2005 New Revision: 41724 Modified: python/trunk/Modules/_elementtree.c Log: updating to cElementTree 1.0.5 (step 3 of 3) Modified: python/trunk/Modules/_elementtree.c ============================================================================== --- python/trunk/Modules/_elementtree.c (original) +++ python/trunk/Modules/_elementtree.c Fri Dec 16 23:06:43 2005 @@ -41,6 +41,9 @@ * http://www.pythonware.com */ +/* Licensed to PSF under a Contributor Agreement. */ +/* See http://www.python.org/2.4/license for licensing details. */ + #include "Python.h" #define VERSION "1.0.5" @@ -2568,7 +2571,7 @@ }; DL_EXPORT(void) -initcElementTree(void) +init_elementtree(void) { PyObject* m; PyObject* g; @@ -2583,7 +2586,7 @@ XMLParser_Type.ob_type = &PyType_Type; #endif - m = Py_InitModule("cElementTree", _functions); + m = Py_InitModule("_elementtree", _functions); /* python glue code */ @@ -2600,13 +2603,13 @@ "from copy import copy, deepcopy\n" "try:\n" - " from elementtree import ElementTree\n" + " from xml.etree import ElementTree\n" "except ImportError:\n" " import ElementTree\n" "ET = ElementTree\n" "del ElementTree\n" - "import cElementTree\n" + "import _elementtree as cElementTree\n" "try:\n" /* check if copy works as is */ " copy(cElementTree.Element('x'))\n" From python-checkins at python.org Fri Dec 16 23:07:18 2005 From: python-checkins at python.org (fredrik.lundh) Date: Fri, 16 Dec 2005 23:07:18 +0100 (CET) Subject: [Python-checkins] commit of r41725 - python/trunk/Lib/test/test_xml_etree.py python/trunk/Lib/test/test_xml_etree_c.py Message-ID: <20051216220718.24D551E4002@bag.python.org> Author: fredrik.lundh Date: Fri Dec 16 23:07:17 2005 New Revision: 41725 Modified: python/trunk/Lib/test/test_xml_etree.py python/trunk/Lib/test/test_xml_etree_c.py Log: added encoding tests to ElementTree/cElementTree tests Modified: python/trunk/Lib/test/test_xml_etree.py ============================================================================== --- python/trunk/Lib/test/test_xml_etree.py (original) +++ python/trunk/Lib/test/test_xml_etree.py Fri Dec 16 23:07:17 2005 @@ -6,6 +6,8 @@ from test import test_support +from xmlcore.etree import ElementTree as ET + SAMPLE_XML = """ text @@ -59,8 +61,6 @@ """ Test element tree interface. - >>> from xmlcore.etree import ElementTree as ET - >>> element = ET.Element("tag", key="value") >>> tree = ET.ElementTree(element) @@ -108,8 +108,6 @@ """ Test find methods (including xpath syntax). - >>> from xmlcore.etree import ElementTree as ET - >>> elem = ET.XML(SAMPLE_XML) >>> elem.find("tag").tag 'tag' @@ -176,8 +174,6 @@ def parseliteral(): r""" - >>> from xmlcore.etree import ElementTree as ET - >>> element = ET.XML("text") >>> ET.ElementTree(element).write(sys.stdout) text @@ -199,6 +195,19 @@ 'body' """ +def check_encoding(encoding): + """ + >>> check_encoding("ascii") + >>> check_encoding("us-ascii") + >>> check_encoding("iso-8859-1") + >>> check_encoding("iso-8859-15") + >>> check_encoding("cp437") + >>> check_encoding("mac-roman") + """ + ET.XML( + "" % encoding + ) + # # xinclude tests (samples from appendix C of the xinclude specification) @@ -273,15 +282,13 @@ except KeyError: raise IOError("resource not found") if parse == "xml": - from xmlcore.etree.ElementTree import XML - return XML(data) + return ET.XML(data) return data def xinclude(): r""" Basic inclusion example (XInclude C.1) - >>> from xmlcore.etree import ElementTree as ET >>> from xmlcore.etree import ElementInclude >>> document = xinclude_loader("C1.xml") Modified: python/trunk/Lib/test/test_xml_etree_c.py ============================================================================== --- python/trunk/Lib/test/test_xml_etree_c.py (original) +++ python/trunk/Lib/test/test_xml_etree_c.py Fri Dec 16 23:07:17 2005 @@ -4,6 +4,8 @@ from test import test_support +from xmlcore.etree import cElementTree as ET + SAMPLE_XML = """ text @@ -55,8 +57,6 @@ """ Test element tree interface. - >>> from xmlcore.etree import cElementTree as ET - >>> element = ET.Element("tag", key="value") >>> tree = ET.ElementTree(element) @@ -104,8 +104,6 @@ """ Test find methods (including xpath syntax). - >>> from xmlcore.etree import cElementTree as ET - >>> elem = ET.XML(SAMPLE_XML) >>> elem.find("tag").tag 'tag' @@ -172,8 +170,6 @@ def parseliteral(): r""" - >>> from xmlcore.etree import cElementTree as ET - >>> element = ET.XML("text") >>> ET.ElementTree(element).write(sys.stdout) text @@ -195,6 +191,19 @@ 'body' """ +def check_encoding(encoding): + """ + >>> check_encoding("ascii") + >>> check_encoding("us-ascii") + >>> check_encoding("iso-8859-1") + >>> check_encoding("iso-8859-15") + >>> check_encoding("cp437") + >>> check_encoding("mac-roman") + """ + ET.XML( + "" % encoding + ) + def test_main(): from test import test_xml_etree_c test_support.run_doctest(test_xml_etree_c, verbosity=True) From python-checkins at python.org Fri Dec 16 23:49:29 2005 From: python-checkins at python.org (brett.cannon) Date: Fri, 16 Dec 2005 23:49:29 +0100 (CET) Subject: [Python-checkins] commit of r41726 - python/trunk/Misc/NEWS Message-ID: <20051216224929.C4CA11E4002@bag.python.org> Author: brett.cannon Date: Fri Dec 16 23:49:23 2005 New Revision: 41726 Modified: python/trunk/Misc/NEWS Log: Add the missing mention of the hashlib module. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Dec 16 23:49:23 2005 @@ -292,6 +292,9 @@ Library ------- +- Added the hashlib module. It provides secure hash functions for MD5 and + SHA1, 224, 256, 384, and 512. + - Added a subset of Fredrik Lundh's ElementTree package. Available modules are xml.etree.ElementTree, xml.etree.ElementPath, and xml.etree.ElementInclude, from ElementTree 1.2.6. From python-checkins at python.org Sat Dec 17 00:14:03 2005 From: python-checkins at python.org (tim.peters) Date: Sat, 17 Dec 2005 00:14:03 +0100 (CET) Subject: [Python-checkins] commit of r41727 - python/trunk/Misc/NEWS Message-ID: <20051216231403.DEE891E4002@bag.python.org> Author: tim.peters Date: Sat Dec 17 00:13:57 2005 New Revision: 41727 Modified: python/trunk/Misc/NEWS Log: More text about the pragmatic significance of hashlib. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sat Dec 17 00:13:57 2005 @@ -27,7 +27,7 @@ at ftp.unicode.org and contain a few updates (e.g. the Mac OS encodings now include a mapping for the Apple logo) -- Added a few more codecs for Mac OS encodings +- Added a few more codecs for Mac OS encodings - Speed up some Unicode operations. @@ -293,7 +293,16 @@ ------- - Added the hashlib module. It provides secure hash functions for MD5 and - SHA1, 224, 256, 384, and 512. + SHA1, 224, 256, 384, and 512. Note that recent developments make the + historic MD5 and SHA1 unsuitable for cryptographic-strength applications. + In + Ronald L. Rivest offered this advice for Python: + + "The consensus of researchers in this area (at least as + expressed at the NIST Hash Function Workshop 10/31/05), + is that SHA-256 is a good choice for the time being, but + that research should continue, and other alternatives may + arise from this research. The larger SHA's also seem OK." - Added a subset of Fredrik Lundh's ElementTree package. Available modules are xml.etree.ElementTree, xml.etree.ElementPath, and @@ -458,13 +467,13 @@ disables recursive traversal through instance attributes, which can be exploited in various ways. -- Bug #1222790: in SimpleXMLRPCServer, set the reuse-address and close-on-exec +- Bug #1222790: in SimpleXMLRPCServer, set the reuse-address and close-on-exec flags on the HTTP listening socket. - Bug #792570: SimpleXMLRPCServer had problems if the request grew too large. Fixed by reading the HTTP body in chunks instead of one big socket.read(). -- Patches #893642, #1039083: add allow_none, encoding arguments to constructors of +- Patches #893642, #1039083: add allow_none, encoding arguments to constructors of SimpleXMLRPCServer and CGIXMLRPCRequestHandler. - Bug #1110478: Revert os.environ.update to do putenv again. From python-checkins at python.org Sat Dec 17 05:38:34 2005 From: python-checkins at python.org (hyeshik.chang) Date: Sat, 17 Dec 2005 05:38:34 +0100 (CET) Subject: [Python-checkins] commit of r41728 - in python: branches/release24-maint/Lib/test/test_unicode.py branches/release24-maint/Misc/NEWS branches/release24-maint/Objects/unicodeobject.c trunk/Lib/test/test_unicode.py trunk/Misc/NEWS trunk/Objects/unicodeobject.c Message-ID: <20051217043834.99C891E4002@bag.python.org> Author: hyeshik.chang Date: Sat Dec 17 05:38:31 2005 New Revision: 41728 Modified: python/branches/release24-maint/Lib/test/test_unicode.py python/branches/release24-maint/Misc/NEWS python/branches/release24-maint/Objects/unicodeobject.c python/trunk/Lib/test/test_unicode.py python/trunk/Misc/NEWS python/trunk/Objects/unicodeobject.c Log: Bug #1379994: Fix *unicode_escape codecs to encode r'\' as r'\\' just like string codecs. Modified: python/branches/release24-maint/Lib/test/test_unicode.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_unicode.py (original) +++ python/branches/release24-maint/Lib/test/test_unicode.py Sat Dec 17 05:38:31 2005 @@ -611,20 +611,24 @@ self.assertEqual(u'hello'.encode('latin-1'), 'hello') # Roundtrip safety for BMP (just the first 1024 chars) - u = u''.join(map(unichr, xrange(1024))) - for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', 'utf-16-be', - 'raw_unicode_escape', 'unicode_escape', 'unicode_internal'): - self.assertEqual(unicode(u.encode(encoding),encoding), u) + for c in xrange(1024): + u = unichr(c) + for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', + 'utf-16-be', 'raw_unicode_escape', + 'unicode_escape', 'unicode_internal'): + self.assertEqual(unicode(u.encode(encoding),encoding), u) # Roundtrip safety for BMP (just the first 256 chars) - u = u''.join(map(unichr, xrange(256))) - for encoding in ('latin-1',): - self.assertEqual(unicode(u.encode(encoding),encoding), u) + for c in xrange(256): + u = unichr(c) + for encoding in ('latin-1',): + self.assertEqual(unicode(u.encode(encoding),encoding), u) # Roundtrip safety for BMP (just the first 128 chars) - u = u''.join(map(unichr, xrange(128))) - for encoding in ('ascii',): - self.assertEqual(unicode(u.encode(encoding),encoding), u) + for c in xrange(128): + u = unichr(c) + for encoding in ('ascii',): + self.assertEqual(unicode(u.encode(encoding),encoding), u) # Roundtrip safety for non-BMP (just a few chars) u = u'\U00010001\U00020002\U00030003\U00040004\U00050005' Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Sat Dec 17 05:38:31 2005 @@ -12,6 +12,9 @@ Core and builtins ----------------- +- Bug #1379994: Builtin unicode_escape and raw_unicode_escape codec + now encodes backslash correctly. + - Bug #1281408: Py_BuildValue now works correct even with unsigned longs and long longs. Modified: python/branches/release24-maint/Objects/unicodeobject.c ============================================================================== --- python/branches/release24-maint/Objects/unicodeobject.c (original) +++ python/branches/release24-maint/Objects/unicodeobject.c Sat Dec 17 05:38:31 2005 @@ -1981,9 +1981,9 @@ while (size-- > 0) { Py_UNICODE ch = *s++; - /* Escape quotes */ - if (quotes && - (ch == (Py_UNICODE) PyString_AS_STRING(repr)[1] || ch == '\\')) { + /* Escape quotes and backslashes */ + if ((quotes && + ch == (Py_UNICODE) PyString_AS_STRING(repr)[1]) || ch == '\\') { *p++ = '\\'; *p++ = (char) ch; continue; Modified: python/trunk/Lib/test/test_unicode.py ============================================================================== --- python/trunk/Lib/test/test_unicode.py (original) +++ python/trunk/Lib/test/test_unicode.py Sat Dec 17 05:38:31 2005 @@ -615,20 +615,24 @@ self.assertEqual(u'hello'.encode('latin-1'), 'hello') # Roundtrip safety for BMP (just the first 1024 chars) - u = u''.join(map(unichr, xrange(1024))) - for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', 'utf-16-be', - 'raw_unicode_escape', 'unicode_escape', 'unicode_internal'): - self.assertEqual(unicode(u.encode(encoding),encoding), u) + for c in xrange(1024): + u = unichr(c) + for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', + 'utf-16-be', 'raw_unicode_escape', + 'unicode_escape', 'unicode_internal'): + self.assertEqual(unicode(u.encode(encoding),encoding), u) # Roundtrip safety for BMP (just the first 256 chars) - u = u''.join(map(unichr, xrange(256))) - for encoding in ('latin-1',): - self.assertEqual(unicode(u.encode(encoding),encoding), u) + for c in xrange(256): + u = unichr(c) + for encoding in ('latin-1',): + self.assertEqual(unicode(u.encode(encoding),encoding), u) # Roundtrip safety for BMP (just the first 128 chars) - u = u''.join(map(unichr, xrange(128))) - for encoding in ('ascii',): - self.assertEqual(unicode(u.encode(encoding),encoding), u) + for c in xrange(128): + u = unichr(c) + for encoding in ('ascii',): + self.assertEqual(unicode(u.encode(encoding),encoding), u) # Roundtrip safety for non-BMP (just a few chars) u = u'\U00010001\U00020002\U00030003\U00040004\U00050005' Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sat Dec 17 05:38:31 2005 @@ -12,6 +12,9 @@ Core and builtins ----------------- +- Bug #1379994: Builtin unicode_escape and raw_unicode_escape codec + now encodes backslash correctly. + - Patch #1350409: Work around signal handling bug in Visual Studio 2005. - Bug #1281408: Py_BuildValue now works correct even with unsigned longs Modified: python/trunk/Objects/unicodeobject.c ============================================================================== --- python/trunk/Objects/unicodeobject.c (original) +++ python/trunk/Objects/unicodeobject.c Sat Dec 17 05:38:31 2005 @@ -1989,9 +1989,9 @@ while (size-- > 0) { Py_UNICODE ch = *s++; - /* Escape quotes */ - if (quotes && - (ch == (Py_UNICODE) PyString_AS_STRING(repr)[1] || ch == '\\')) { + /* Escape quotes and backslashes */ + if ((quotes && + ch == (Py_UNICODE) PyString_AS_STRING(repr)[1]) || ch == '\\') { *p++ = '\\'; *p++ = (char) ch; continue; From python-checkins at python.org Sat Dec 17 09:33:23 2005 From: python-checkins at python.org (fredrik.lundh) Date: Sat, 17 Dec 2005 09:33:23 +0100 (CET) Subject: [Python-checkins] commit of r41729 - python/trunk/Modules/_elementtree.c Message-ID: <20051217083323.395E31E4002@bag.python.org> Author: fredrik.lundh Date: Sat Dec 17 09:33:21 2005 New Revision: 41729 Modified: python/trunk/Modules/_elementtree.c Log: Fixed reference counting error when using the entity dictionary (reported by Chris Olds). Backported from the 1.0.6 development branch. Modified: python/trunk/Modules/_elementtree.c ============================================================================== --- python/trunk/Modules/_elementtree.c (original) +++ python/trunk/Modules/_elementtree.c Sat Dec 17 09:33:21 2005 @@ -1956,7 +1956,6 @@ res = PyObject_CallFunction(self->handle_data, "O", value); else res = NULL; - Py_DECREF(value); Py_XDECREF(res); } else { PyErr_Format( From python-checkins at python.org Sat Dec 17 10:16:41 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 17 Dec 2005 10:16:41 +0100 (CET) Subject: [Python-checkins] commit of r41730 - python/branches/ssize_t Message-ID: <20051217091641.7A84A1E400C@bag.python.org> Author: martin.v.loewis Date: Sat Dec 17 10:16:41 2005 New Revision: 41730 Added: python/branches/ssize_t/ - copied from r41729, python/trunk/ Log: Create a branch for patch #1166195, branching from r41729. From python-checkins at python.org Sat Dec 17 11:20:31 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 17 Dec 2005 11:20:31 +0100 (CET) Subject: [Python-checkins] commit of r41731 - in python/branches/ssize_t: Include/abstract.h Include/bufferobject.h Include/cStringIO.h Include/ceval.h Include/intobject.h Include/listobject.h Include/longintrepr.h Include/longobject.h Include/marshal.h Include/modsupport.h Include/object.h Include/objimpl.h Include/pyerrors.h Include/pyport.h Include/sliceobject.h Include/stringobject.h Include/tupleobject.h Include/unicodeobject.h Modules/_codecsmodule.c Modules/_hotshot.c Modules/_localemodule.c Modules/arraymodule.c Modules/audioop.c Modules/cPickle.c Modules/cStringIO.c Modules/cjkcodecs/multibytecodec.c Modules/gcmodule.c Modules/parsermodule.c Modules/posixmodule.c Modules/rgbimgmodule.c Modules/zipimport.c Objects/abstract.c Objects/bufferobject.c Objects/classobject.c Objects/fileobject.c Objects/intobject.c Objects/listobject.c Objects/longobject.c Objects/object.c Objects/obmalloc.c Objects/rangeobject.c Objects/sliceobject.c Objects/stringobject.c Objects/structseq.c Objects/tupleobject.c Objects/typeobject.c Objects/unicodeobject.c Objects/weakrefobject.c PC/getpathp.c PC/import_nt.c Parser/parsetok.c Parser/tokenizer.c Python/ceval.c Python/codecs.c Python/exceptions.c Python/getargs.c Python/import.c Python/mactoolboxglue.c Python/marshal.c Python/modsupport.c Python/pythonrun.c Python/sysmodule.c Python/thread_nt.h configure configure.in pyconfig.h.in Message-ID: <20051217102031.E3C591E4002@bag.python.org> Author: martin.v.loewis Date: Sat Dec 17 11:20:15 2005 New Revision: 41731 Modified: python/branches/ssize_t/Include/abstract.h python/branches/ssize_t/Include/bufferobject.h python/branches/ssize_t/Include/cStringIO.h python/branches/ssize_t/Include/ceval.h python/branches/ssize_t/Include/intobject.h python/branches/ssize_t/Include/listobject.h python/branches/ssize_t/Include/longintrepr.h python/branches/ssize_t/Include/longobject.h python/branches/ssize_t/Include/marshal.h python/branches/ssize_t/Include/modsupport.h python/branches/ssize_t/Include/object.h python/branches/ssize_t/Include/objimpl.h python/branches/ssize_t/Include/pyerrors.h python/branches/ssize_t/Include/pyport.h python/branches/ssize_t/Include/sliceobject.h python/branches/ssize_t/Include/stringobject.h python/branches/ssize_t/Include/tupleobject.h python/branches/ssize_t/Include/unicodeobject.h python/branches/ssize_t/Modules/_codecsmodule.c python/branches/ssize_t/Modules/_hotshot.c python/branches/ssize_t/Modules/_localemodule.c python/branches/ssize_t/Modules/arraymodule.c python/branches/ssize_t/Modules/audioop.c python/branches/ssize_t/Modules/cPickle.c python/branches/ssize_t/Modules/cStringIO.c python/branches/ssize_t/Modules/cjkcodecs/multibytecodec.c python/branches/ssize_t/Modules/gcmodule.c python/branches/ssize_t/Modules/parsermodule.c python/branches/ssize_t/Modules/posixmodule.c python/branches/ssize_t/Modules/rgbimgmodule.c python/branches/ssize_t/Modules/zipimport.c python/branches/ssize_t/Objects/abstract.c python/branches/ssize_t/Objects/bufferobject.c python/branches/ssize_t/Objects/classobject.c python/branches/ssize_t/Objects/fileobject.c python/branches/ssize_t/Objects/intobject.c python/branches/ssize_t/Objects/listobject.c python/branches/ssize_t/Objects/longobject.c python/branches/ssize_t/Objects/object.c python/branches/ssize_t/Objects/obmalloc.c python/branches/ssize_t/Objects/rangeobject.c python/branches/ssize_t/Objects/sliceobject.c python/branches/ssize_t/Objects/stringobject.c python/branches/ssize_t/Objects/structseq.c python/branches/ssize_t/Objects/tupleobject.c python/branches/ssize_t/Objects/typeobject.c python/branches/ssize_t/Objects/unicodeobject.c python/branches/ssize_t/Objects/weakrefobject.c python/branches/ssize_t/PC/getpathp.c python/branches/ssize_t/PC/import_nt.c python/branches/ssize_t/Parser/parsetok.c python/branches/ssize_t/Parser/tokenizer.c python/branches/ssize_t/Python/ceval.c python/branches/ssize_t/Python/codecs.c python/branches/ssize_t/Python/exceptions.c python/branches/ssize_t/Python/getargs.c python/branches/ssize_t/Python/import.c python/branches/ssize_t/Python/mactoolboxglue.c python/branches/ssize_t/Python/marshal.c python/branches/ssize_t/Python/modsupport.c python/branches/ssize_t/Python/pythonrun.c python/branches/ssize_t/Python/sysmodule.c python/branches/ssize_t/Python/thread_nt.h python/branches/ssize_t/configure python/branches/ssize_t/configure.in python/branches/ssize_t/pyconfig.h.in Log: Commit current version of patch 1166195. Modified: python/branches/ssize_t/Include/abstract.h ============================================================================== --- python/branches/ssize_t/Include/abstract.h (original) +++ python/branches/ssize_t/Include/abstract.h Sat Dec 17 11:20:15 2005 @@ -928,7 +928,7 @@ */ - PyAPI_FUNC(PyObject *) PySequence_Repeat(PyObject *o, int count); + PyAPI_FUNC(PyObject *) PySequence_Repeat(PyObject *o, Py_ssize_t count); /* Return the result of repeating sequence object o count times, @@ -937,14 +937,14 @@ */ - PyAPI_FUNC(PyObject *) PySequence_GetItem(PyObject *o, int i); + PyAPI_FUNC(PyObject *) PySequence_GetItem(PyObject *o, Py_ssize_t i); /* Return the ith element of o, or NULL on failure. This is the equivalent of the Python expression: o[i]. */ - PyAPI_FUNC(PyObject *) PySequence_GetSlice(PyObject *o, int i1, int i2); + PyAPI_FUNC(PyObject *) PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); /* Return the slice of sequence object o between i1 and i2, or @@ -953,7 +953,7 @@ */ - PyAPI_FUNC(int) PySequence_SetItem(PyObject *o, int i, PyObject *v); + PyAPI_FUNC(int) PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v); /* Assign object v to the ith element of o. Returns @@ -962,7 +962,7 @@ */ - PyAPI_FUNC(int) PySequence_DelItem(PyObject *o, int i); + PyAPI_FUNC(int) PySequence_DelItem(PyObject *o, Py_ssize_t i); /* Delete the ith element of object v. Returns @@ -970,7 +970,7 @@ statement: del o[i]. */ - PyAPI_FUNC(int) PySequence_SetSlice(PyObject *o, int i1, int i2, + PyAPI_FUNC(int) PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, PyObject *v); /* @@ -979,7 +979,7 @@ equivalent of the Python statement: o[i1:i2]=v. */ - PyAPI_FUNC(int) PySequence_DelSlice(PyObject *o, int i1, int i2); + PyAPI_FUNC(int) PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); /* Delete the slice in sequence object, o, from i1 to i2. @@ -1100,7 +1100,7 @@ */ - PyAPI_FUNC(PyObject *) PySequence_InPlaceRepeat(PyObject *o, int count); + PyAPI_FUNC(PyObject *) PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count); /* Repeat o1 by count, in-place when possible. Return the resulting Modified: python/branches/ssize_t/Include/bufferobject.h ============================================================================== --- python/branches/ssize_t/Include/bufferobject.h (original) +++ python/branches/ssize_t/Include/bufferobject.h Sat Dec 17 11:20:15 2005 @@ -17,13 +17,13 @@ #define Py_END_OF_BUFFER (-1) PyAPI_FUNC(PyObject *) PyBuffer_FromObject(PyObject *base, - int offset, int size); + int offset, Py_ssize_t size); PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteObject(PyObject *base, int offset, - int size); + Py_ssize_t size); -PyAPI_FUNC(PyObject *) PyBuffer_FromMemory(void *ptr, int size); -PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteMemory(void *ptr, int size); +PyAPI_FUNC(PyObject *) PyBuffer_FromMemory(void *ptr, Py_ssize_t size); +PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size); PyAPI_FUNC(PyObject *) PyBuffer_New(int size); Modified: python/branches/ssize_t/Include/cStringIO.h ============================================================================== --- python/branches/ssize_t/Include/cStringIO.h (original) +++ python/branches/ssize_t/Include/cStringIO.h Sat Dec 17 11:20:15 2005 @@ -38,7 +38,7 @@ int(*creadline)(PyObject *, char **); /* Write a string to an output object*/ - int(*cwrite)(PyObject *, const char *, int); + int(*cwrite)(PyObject *, const char *, Py_ssize_t); /* Get the output object as a Python string (returns new reference). */ PyObject *(*cgetvalue)(PyObject *); Modified: python/branches/ssize_t/Include/ceval.h ============================================================================== --- python/branches/ssize_t/Include/ceval.h (original) +++ python/branches/ssize_t/Include/ceval.h Sat Dec 17 11:20:15 2005 @@ -148,7 +148,7 @@ #endif /* !WITH_THREAD */ -PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, int *); +PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); #ifdef __cplusplus Modified: python/branches/ssize_t/Include/intobject.h ============================================================================== --- python/branches/ssize_t/Include/intobject.h (original) +++ python/branches/ssize_t/Include/intobject.h Sat Dec 17 11:20:15 2005 @@ -35,7 +35,10 @@ PyAPI_FUNC(PyObject *) PyInt_FromUnicode(Py_UNICODE*, int, int); #endif PyAPI_FUNC(PyObject *) PyInt_FromLong(long); +PyAPI_FUNC(PyObject *) PyInt_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) PyInt_FromSsize_t(Py_ssize_t); PyAPI_FUNC(long) PyInt_AsLong(PyObject *); +PyAPI_FUNC(Py_ssize_t) PyInt_AsSsize_t(PyObject *); PyAPI_FUNC(unsigned long) PyInt_AsUnsignedLongMask(PyObject *); #ifdef HAVE_LONG_LONG PyAPI_FUNC(unsigned PY_LONG_LONG) PyInt_AsUnsignedLongLongMask(PyObject *); Modified: python/branches/ssize_t/Include/listobject.h ============================================================================== --- python/branches/ssize_t/Include/listobject.h (original) +++ python/branches/ssize_t/Include/listobject.h Sat Dec 17 11:20:15 2005 @@ -43,14 +43,14 @@ #define PyList_Check(op) PyObject_TypeCheck(op, &PyList_Type) #define PyList_CheckExact(op) ((op)->ob_type == &PyList_Type) -PyAPI_FUNC(PyObject *) PyList_New(int size); -PyAPI_FUNC(int) PyList_Size(PyObject *); -PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, int); -PyAPI_FUNC(int) PyList_SetItem(PyObject *, int, PyObject *); -PyAPI_FUNC(int) PyList_Insert(PyObject *, int, PyObject *); +PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); -PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, int, int); -PyAPI_FUNC(int) PyList_SetSlice(PyObject *, int, int, PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Sort(PyObject *); PyAPI_FUNC(int) PyList_Reverse(PyObject *); PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); Modified: python/branches/ssize_t/Include/longintrepr.h ============================================================================== --- python/branches/ssize_t/Include/longintrepr.h (original) +++ python/branches/ssize_t/Include/longintrepr.h Sat Dec 17 11:20:15 2005 @@ -52,7 +52,7 @@ digit ob_digit[1]; }; -PyAPI_FUNC(PyLongObject *) _PyLong_New(int); +PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); /* Return a copy of src. */ PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); Modified: python/branches/ssize_t/Include/longobject.h ============================================================================== --- python/branches/ssize_t/Include/longobject.h (original) +++ python/branches/ssize_t/Include/longobject.h Sat Dec 17 11:20:15 2005 @@ -18,9 +18,14 @@ PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); PyAPI_FUNC(long) PyLong_AsLong(PyObject *); +PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); +/* For use by intobject.c only */ +PyAPI_FUNC(PyObject *) _PyLong_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) _PyLong_FromSsize_t(Py_ssize_t); + /* _PyLong_AsScaledDouble returns a double x and an exponent e such that the true value is approximately equal to x * 2**(SHIFT*e). e is >= 0. x is 0.0 if and only if the input is 0 (in which case, e and x are both Modified: python/branches/ssize_t/Include/marshal.h ============================================================================== --- python/branches/ssize_t/Include/marshal.h (original) +++ python/branches/ssize_t/Include/marshal.h Sat Dec 17 11:20:15 2005 @@ -17,7 +17,7 @@ PyAPI_FUNC(int) PyMarshal_ReadShortFromFile(FILE *); PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromFile(FILE *); PyAPI_FUNC(PyObject *) PyMarshal_ReadLastObjectFromFile(FILE *); -PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(char *, int); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(char *, Py_ssize_t); #ifdef __cplusplus } Modified: python/branches/ssize_t/Include/modsupport.h ============================================================================== --- python/branches/ssize_t/Include/modsupport.h (original) +++ python/branches/ssize_t/Include/modsupport.h Sat Dec 17 11:20:15 2005 @@ -9,6 +9,18 @@ #include +/* If PY_SIZE_T_CLEAN is defined, each functions treats #-specifier + to mean Py_ssize_t */ +#ifdef PY_SIZE_T_CLEAN +#define PyArg_Parse _PyArg_Parse_SizeT +#define PyArg_ParseTuple _PyArg_ParseTuple_SizeT +#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT +#define PyArg_VaParse _PyArg_VaParse_SizeT +#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT +#define PyArg_BuildValue _PyArg_BuildValue_SizeT +#define PyArg_VaBuildValue _PyArg_VaBuildValue_SizeT +#endif + PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, @@ -26,6 +38,7 @@ PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); + #define PYTHON_API_VERSION 1012 #define PYTHON_API_STRING "1012" /* The API version is maintained (independently from the Python version) Modified: python/branches/ssize_t/Include/object.h ============================================================================== --- python/branches/ssize_t/Include/object.h (original) +++ python/branches/ssize_t/Include/object.h Sat Dec 17 11:20:15 2005 @@ -92,7 +92,8 @@ */ #define PyObject_VAR_HEAD \ PyObject_HEAD \ - int ob_size; /* Number of items in variable part */ + Py_ssize_t ob_size; /* Number of items in variable part */ +#define Py_INVALID_SIZE (Py_ssize_t)-1 /* Nothing is actually declared to be a PyObject, but every pointer to * a Python object can be cast to a PyObject*. This is inheritance built @@ -130,11 +131,15 @@ typedef int (*coercion)(PyObject **, PyObject **); typedef PyObject *(*intargfunc)(PyObject *, int); typedef PyObject *(*intintargfunc)(PyObject *, int, int); +typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t); +typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); typedef int(*intobjargproc)(PyObject *, int, PyObject *); typedef int(*intintobjargproc)(PyObject *, int, int, PyObject *); +typedef int(*sizeobjargproc)(PyObject *, size_t, PyObject *); +typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); -typedef int (*getreadbufferproc)(PyObject *, int, void **); -typedef int (*getwritebufferproc)(PyObject *, int, void **); +typedef Py_ssize_t (*getreadbufferproc)(PyObject *, int, void **); +typedef Py_ssize_t (*getwritebufferproc)(PyObject *, int, void **); typedef int (*getsegcountproc)(PyObject *, int *); typedef int (*getcharbufferproc)(PyObject *, int, const char **); typedef int (*objobjproc)(PyObject *, PyObject *); @@ -197,15 +202,15 @@ typedef struct { inquiry sq_length; binaryfunc sq_concat; - intargfunc sq_repeat; - intargfunc sq_item; - intintargfunc sq_slice; - intobjargproc sq_ass_item; - intintobjargproc sq_ass_slice; + ssizeargfunc sq_repeat; + ssizeargfunc sq_item; + ssizessizeargfunc sq_slice; + sizeobjargproc sq_ass_item; + ssizessizeobjargproc sq_ass_slice; objobjproc sq_contains; /* Added in release 2.0 */ binaryfunc sq_inplace_concat; - intargfunc sq_inplace_repeat; + ssizeargfunc sq_inplace_repeat; } PySequenceMethods; typedef struct { @@ -239,7 +244,7 @@ typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); typedef int (*initproc)(PyObject *, PyObject *, PyObject *); typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); -typedef PyObject *(*allocfunc)(struct _typeobject *, int); +typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); typedef struct _typeobject { PyObject_VAR_HEAD @@ -362,7 +367,7 @@ #define PyType_CheckExact(op) ((op)->ob_type == &PyType_Type) PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); -PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, int); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, PyObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); Modified: python/branches/ssize_t/Include/objimpl.h ============================================================================== --- python/branches/ssize_t/Include/objimpl.h (original) +++ python/branches/ssize_t/Include/objimpl.h Sat Dec 17 11:20:15 2005 @@ -146,9 +146,9 @@ /* Functions */ PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, - PyTypeObject *, int); + PyTypeObject *, Py_ssize_t); PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); -PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, int); +PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); #define PyObject_New(type, typeobj) \ ( (type *) _PyObject_New(typeobj) ) @@ -291,7 +291,7 @@ PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t); PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); -PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, int); +PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); PyAPI_FUNC(void) PyObject_GC_Track(void *); PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); PyAPI_FUNC(void) PyObject_GC_Del(void *); Modified: python/branches/ssize_t/Include/pyerrors.h ============================================================================== --- python/branches/ssize_t/Include/pyerrors.h (original) +++ python/branches/ssize_t/Include/pyerrors.h Sat Dec 17 11:20:15 2005 @@ -156,15 +156,15 @@ /* create a UnicodeDecodeError object */ PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create( - const char *, const char *, int, int, int, const char *); + const char *, const char *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); /* create a UnicodeEncodeError object */ PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( - const char *, const Py_UNICODE *, int, int, int, const char *); + const char *, const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); /* create a UnicodeTranslateError object */ PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( - const Py_UNICODE *, int, int, int, const char *); + const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); /* get the encoding attribute */ PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *); @@ -177,27 +177,27 @@ /* get the value of the start attribute (the int * may not be NULL) return 0 on success, -1 on failure */ -PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, int *); -PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, int *); -PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, int *); +PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *); /* assign a new value to the start attribute return 0 on success, -1 on failure */ -PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, int); -PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, int); -PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, int); +PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t); /* get the value of the end attribute (the int *may not be NULL) return 0 on success, -1 on failure */ -PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, int *); -PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, int *); -PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, int *); +PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *); /* assign a new value to the end attribute return 0 on success, -1 on failure */ -PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, int); -PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, int); -PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, int); +PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t); /* get the value of the reason attribute */ PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *); Modified: python/branches/ssize_t/Include/pyport.h ============================================================================== --- python/branches/ssize_t/Include/pyport.h (original) +++ python/branches/ssize_t/Include/pyport.h Sat Dec 17 11:20:15 2005 @@ -85,6 +85,15 @@ # error "Python needs a typedef for Py_uintptr_t in pyport.h." #endif /* HAVE_UINTPTR_T */ +#ifdef HAVE_SSIZE_T +typedef ssize_t Py_ssize_t; +#elif SIZEOF_VOID_P == SIZEOF_SIZE_T +typedef Py_uintptr_t Py_ssize_t; +#else +# error "Python needs a typedef for Py_ssize_t in pyport.h." +#endif +#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) + #include #include /* Moved here from the math section, before extern "C" */ Modified: python/branches/ssize_t/Include/sliceobject.h ============================================================================== --- python/branches/ssize_t/Include/sliceobject.h (original) +++ python/branches/ssize_t/Include/sliceobject.h Sat Dec 17 11:20:15 2005 @@ -30,11 +30,11 @@ PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, PyObject* step); -PyAPI_FUNC(int) PySlice_GetIndices(PySliceObject *r, int length, - int *start, int *stop, int *step); -PyAPI_FUNC(int) PySlice_GetIndicesEx(PySliceObject *r, int length, - int *start, int *stop, - int *step, int *slicelength); +PyAPI_FUNC(int) PySlice_GetIndices(PySliceObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(int) PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t *step, Py_ssize_t *slicelength); #ifdef __cplusplus } Modified: python/branches/ssize_t/Include/stringobject.h ============================================================================== --- python/branches/ssize_t/Include/stringobject.h (original) +++ python/branches/ssize_t/Include/stringobject.h Sat Dec 17 11:20:15 2005 @@ -58,7 +58,7 @@ #define PyString_Check(op) PyObject_TypeCheck(op, &PyString_Type) #define PyString_CheckExact(op) ((op)->ob_type == &PyString_Type) -PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, int); +PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t); PyAPI_FUNC(PyObject *) PyString_FromString(const char *); PyAPI_FUNC(PyObject *) PyString_FromFormatV(const char*, va_list) Py_GCC_ATTRIBUTE((format(printf, 1, 0))); @@ -69,13 +69,13 @@ PyAPI_FUNC(PyObject *) PyString_Repr(PyObject *, int); PyAPI_FUNC(void) PyString_Concat(PyObject **, PyObject *); PyAPI_FUNC(void) PyString_ConcatAndDel(PyObject **, PyObject *); -PyAPI_FUNC(int) _PyString_Resize(PyObject **, int); +PyAPI_FUNC(int) _PyString_Resize(PyObject **, Py_ssize_t); PyAPI_FUNC(int) _PyString_Eq(PyObject *, PyObject*); PyAPI_FUNC(PyObject *) PyString_Format(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyString_FormatLong(PyObject*, int, int, int, char**, int*); -PyAPI_FUNC(PyObject *) PyString_DecodeEscape(const char *, int, - const char *, int, +PyAPI_FUNC(PyObject *) PyString_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, const char *); PyAPI_FUNC(void) PyString_InternInPlace(PyObject **); Modified: python/branches/ssize_t/Include/tupleobject.h ============================================================================== --- python/branches/ssize_t/Include/tupleobject.h (original) +++ python/branches/ssize_t/Include/tupleobject.h Sat Dec 17 11:20:15 2005 @@ -36,11 +36,11 @@ #define PyTuple_Check(op) PyObject_TypeCheck(op, &PyTuple_Type) #define PyTuple_CheckExact(op) ((op)->ob_type == &PyTuple_Type) -PyAPI_FUNC(PyObject *) PyTuple_New(int size); -PyAPI_FUNC(int) PyTuple_Size(PyObject *); -PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, int); -PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, int, PyObject *); -PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, int, int); +PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, int); PyAPI_FUNC(PyObject *) PyTuple_Pack(int, ...); Modified: python/branches/ssize_t/Include/unicodeobject.h ============================================================================== --- python/branches/ssize_t/Include/unicodeobject.h (original) +++ python/branches/ssize_t/Include/unicodeobject.h Sat Dec 17 11:20:15 2005 @@ -420,7 +420,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( const Py_UNICODE *u, /* Unicode buffer */ - int size /* size of buffer */ + Py_ssize_t size /* size of buffer */ ); /* Return a read-only pointer to the Unicode object's internal @@ -455,7 +455,7 @@ PyAPI_FUNC(int) PyUnicode_Resize( PyObject **unicode, /* Pointer to the Unicode object */ - int length /* New length */ + Py_ssize_t length /* New length */ ); /* Coerce obj to an Unicode object and return a reference with @@ -509,7 +509,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar( register const wchar_t *w, /* wchar_t buffer */ - int size /* size of buffer */ + Py_ssize_t size /* size of buffer */ ); /* Copies the Unicode Object contents into the wchar_t buffer w. At @@ -609,7 +609,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_Decode( const char *s, /* encoded string */ - int size, /* size of buffer */ + Py_ssize_t size, /* size of buffer */ const char *encoding, /* encoding */ const char *errors /* error handling */ ); @@ -619,7 +619,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_Encode( const Py_UNICODE *s, /* Unicode char buffer */ - int size, /* number of Py_UNICODE chars to encode */ + Py_ssize_t size, /* number of Py_UNICODE chars to encode */ const char *encoding, /* encoding */ const char *errors /* error handling */ ); @@ -646,13 +646,13 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7( const char *string, /* UTF-7 encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors /* error handling */ ); PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7( const Py_UNICODE *data, /* Unicode char buffer */ - int length, /* number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ int encodeSetO, /* force the encoder to encode characters in Set O, as described in RFC2152 */ int encodeWhiteSpace, /* force the encoder to encode space, tab, @@ -664,15 +664,15 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8( const char *string, /* UTF-8 encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors /* error handling */ ); PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8Stateful( const char *string, /* UTF-8 encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors, /* error handling */ - int *consumed /* bytes consumed */ + Py_ssize_t *consumed /* bytes consumed */ ); PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String( @@ -681,7 +681,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8( const Py_UNICODE *data, /* Unicode char buffer */ - int length, /* number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ const char *errors /* error handling */ ); @@ -712,7 +712,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16( const char *string, /* UTF-16 encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors, /* error handling */ int *byteorder /* pointer to byteorder to use 0=native;-1=LE,1=BE; updated on @@ -721,12 +721,12 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16Stateful( const char *string, /* UTF-16 encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors, /* error handling */ int *byteorder, /* pointer to byteorder to use 0=native;-1=LE,1=BE; updated on exit */ - int *consumed /* bytes consumed */ + Py_ssize_t *consumed /* bytes consumed */ ); /* Returns a Python string using the UTF-16 encoding in native byte @@ -758,7 +758,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16( const Py_UNICODE *data, /* Unicode char buffer */ - int length, /* number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ const char *errors, /* error handling */ int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ ); @@ -767,7 +767,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeUnicodeEscape( const char *string, /* Unicode-Escape encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors /* error handling */ ); @@ -777,14 +777,14 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeUnicodeEscape( const Py_UNICODE *data, /* Unicode char buffer */ - int length /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ ); /* --- Raw-Unicode-Escape Codecs ------------------------------------------ */ PyAPI_FUNC(PyObject*) PyUnicode_DecodeRawUnicodeEscape( const char *string, /* Raw-Unicode-Escape encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors /* error handling */ ); @@ -794,7 +794,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( const Py_UNICODE *data, /* Unicode char buffer */ - int length /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ ); /* --- Unicode Internal Codec --------------------------------------------- @@ -803,7 +803,7 @@ PyObject *_PyUnicode_DecodeUnicodeInternal( const char *string, - int length, + Py_ssize_t length, const char *errors ); @@ -815,7 +815,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeLatin1( const char *string, /* Latin-1 encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors /* error handling */ ); @@ -825,7 +825,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1( const Py_UNICODE *data, /* Unicode char buffer */ - int length, /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ const char *errors /* error handling */ ); @@ -837,7 +837,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeASCII( const char *string, /* ASCII encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors /* error handling */ ); @@ -847,7 +847,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( const Py_UNICODE *data, /* Unicode char buffer */ - int length, /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ const char *errors /* error handling */ ); @@ -875,7 +875,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeCharmap( const char *string, /* Encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ PyObject *mapping, /* character mapping (char ordinal -> unicode ordinal) */ const char *errors /* error handling */ @@ -889,7 +889,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( const Py_UNICODE *data, /* Unicode char buffer */ - int length, /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ PyObject *mapping, /* character mapping (unicode ordinal -> char ordinal) */ const char *errors /* error handling */ @@ -910,7 +910,7 @@ PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( const Py_UNICODE *data, /* Unicode char buffer */ - int length, /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ PyObject *table, /* Translate table */ const char *errors /* error handling */ ); @@ -921,7 +921,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCS( const char *string, /* MBCS encoded string */ - int length, /* size of string */ + Py_ssize_t length, /* size of string */ const char *errors /* error handling */ ); @@ -931,7 +931,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( const Py_UNICODE *data, /* Unicode char buffer */ - int length, /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ const char *errors /* error handling */ ); @@ -963,7 +963,7 @@ PyAPI_FUNC(int) PyUnicode_EncodeDecimal( Py_UNICODE *s, /* Unicode buffer */ - int length, /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ char *output, /* Output buffer; must have size >= length */ const char *errors /* error handling */ ); Modified: python/branches/ssize_t/Modules/_codecsmodule.c ============================================================================== --- python/branches/ssize_t/Modules/_codecsmodule.c (original) +++ python/branches/ssize_t/Modules/_codecsmodule.c Sat Dec 17 11:20:15 2005 @@ -35,6 +35,7 @@ ------------------------------------------------------------------------ */ +#define PY_SIZE_T_CLEAN #include "Python.h" /* --- Registry ----------------------------------------------------------- */ @@ -196,7 +197,7 @@ { const char *errors = NULL; const char *data; - int size; + Py_ssize_t size; if (!PyArg_ParseTuple(args, "s#|z:escape_decode", &data, &size, &errors)) @@ -284,12 +285,16 @@ int size; const char *errors = NULL; int final = 0; - int consumed; + Py_ssize_t consumed; PyObject *decoded = NULL; if (!PyArg_ParseTuple(args, "t#|zi:utf_8_decode", &data, &size, &errors, &final)) return NULL; + if (size < 0) { + PyErr_SetString(PyExc_ValueError, "negative argument"); + return 0; + } consumed = size; decoded = PyUnicode_DecodeUTF8Stateful(data, size, errors, @@ -308,12 +313,17 @@ const char *errors = NULL; int byteorder = 0; int final = 0; - int consumed; + Py_ssize_t consumed; PyObject *decoded; if (!PyArg_ParseTuple(args, "t#|zi:utf_16_decode", &data, &size, &errors, &final)) return NULL; + /* XXX Why is consumed initialized to size? mvl */ + if (size < 0) { + PyErr_SetString(PyExc_ValueError, "negative argument"); + return 0; + } consumed = size; decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder, final ? NULL : &consumed); @@ -331,12 +341,18 @@ const char *errors = NULL; int byteorder = -1; int final = 0; - int consumed; + Py_ssize_t consumed; PyObject *decoded = NULL; if (!PyArg_ParseTuple(args, "t#|zi:utf_16_le_decode", &data, &size, &errors, &final)) return NULL; + + /* XXX Why is consumed initialized to size? mvl */ + if (size < 0) { + PyErr_SetString(PyExc_ValueError, "negative argument"); + return 0; + } consumed = size; decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder, final ? NULL : &consumed); @@ -355,12 +371,17 @@ const char *errors = NULL; int byteorder = 1; int final = 0; - int consumed; + Py_ssize_t consumed; PyObject *decoded = NULL; if (!PyArg_ParseTuple(args, "t#|zi:utf_16_be_decode", &data, &size, &errors, &final)) return NULL; + /* XXX Why is consumed initialized to size? mvl */ + if (size < 0) { + PyErr_SetString(PyExc_ValueError, "negative argument"); + return 0; + } consumed = size; decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder, final ? NULL : &consumed); @@ -387,12 +408,16 @@ int byteorder = 0; PyObject *unicode, *tuple; int final = 0; - int consumed; + Py_ssize_t consumed; if (!PyArg_ParseTuple(args, "t#|zii:utf_16_ex_decode", &data, &size, &errors, &byteorder, &final)) return NULL; - + /* XXX Why is consumed initialized to size? mvl */ + if (size < 0) { + PyErr_SetString(PyExc_ValueError, "negative argument"); + return 0; + } consumed = size; unicode = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder, final ? NULL : &consumed); @@ -513,7 +538,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; if (!PyArg_ParseTuple(args, "s#|z:readbuffer_encode", Modified: python/branches/ssize_t/Modules/_hotshot.c ============================================================================== --- python/branches/ssize_t/Modules/_hotshot.c (original) +++ python/branches/ssize_t/Modules/_hotshot.c Sat Dec 17 11:20:15 2005 @@ -71,7 +71,7 @@ PyObject_HEAD PyObject *filemap; PyObject *logfilename; - int index; + Py_ssize_t index; unsigned char buffer[BUFFERSIZE]; FILE *logfp; int lineevents; @@ -526,7 +526,7 @@ } static PyObject * -logreader_sq_item(LogReaderObject *self, int index) +logreader_sq_item(LogReaderObject *self, Py_ssize_t index) { PyObject *result = logreader_tp_iternext(self); if (result == NULL && !PyErr_Occurred()) { @@ -610,13 +610,14 @@ } static int -pack_string(ProfilerObject *self, const char *s, int len) +pack_string(ProfilerObject *self, const char *s, Py_ssize_t len) { if (len + PISIZE + self->index >= BUFFERSIZE) { if (flush_data(self) < 0) return -1; } - if (pack_packed_int(self, len) < 0) + assert(len < INT_MAX); + if (pack_packed_int(self, (int)len) < 0) return -1; memcpy(self->buffer + self->index, s, len); self->index += len; @@ -626,8 +627,8 @@ static int pack_add_info(ProfilerObject *self, const char *s1, const char *s2) { - int len1 = strlen(s1); - int len2 = strlen(s2); + Py_ssize_t len1 = strlen(s1); + Py_ssize_t len2 = strlen(s2); if (len1 + len2 + PISIZE*2 + 1 + self->index >= BUFFERSIZE) { if (flush_data(self) < 0) @@ -643,7 +644,7 @@ static int pack_define_file(ProfilerObject *self, int fileno, const char *filename) { - int len = strlen(filename); + Py_ssize_t len = strlen(filename); if (len + PISIZE*2 + 1 + self->index >= BUFFERSIZE) { if (flush_data(self) < 0) @@ -660,7 +661,7 @@ pack_define_func(ProfilerObject *self, int fileno, int lineno, const char *funcname) { - int len = strlen(funcname); + Py_ssize_t len = strlen(funcname); if (len + PISIZE*3 + 1 + self->index >= BUFFERSIZE) { if (flush_data(self) < 0) @@ -1269,7 +1270,7 @@ 0, /* sq_length */ 0, /* sq_concat */ 0, /* sq_repeat */ - (intargfunc)logreader_sq_item, /* sq_item */ + (ssizeargfunc)logreader_sq_item, /* sq_item */ 0, /* sq_slice */ 0, /* sq_ass_item */ 0, /* sq_ass_slice */ Modified: python/branches/ssize_t/Modules/_localemodule.c ============================================================================== --- python/branches/ssize_t/Modules/_localemodule.c (original) +++ python/branches/ssize_t/Modules/_localemodule.c Sat Dec 17 11:20:15 2005 @@ -382,11 +382,11 @@ if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, locale, sizeof(locale))) { - int i = strlen(locale); + Py_ssize_t i = strlen(locale); locale[i++] = '_'; if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, - locale+i, sizeof(locale)-i)) + locale+i, (int)(sizeof(locale)-i))) return Py_BuildValue("ss", locale, encoding); } Modified: python/branches/ssize_t/Modules/arraymodule.c ============================================================================== --- python/branches/ssize_t/Modules/arraymodule.c (original) +++ python/branches/ssize_t/Modules/arraymodule.c Sat Dec 17 11:20:15 2005 @@ -3,6 +3,7 @@ /* An array is a uniform list -- all items have the same type. The item type is restricted to simple C types like int or float */ +#define PY_SIZE_T_CLEAN #include "Python.h" #include "structmember.h" @@ -23,15 +24,15 @@ struct arraydescr { int typecode; int itemsize; - PyObject * (*getitem)(struct arrayobject *, int); - int (*setitem)(struct arrayobject *, int, PyObject *); + PyObject * (*getitem)(struct arrayobject *, Py_ssize_t); + int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *); }; typedef struct arrayobject { PyObject_HEAD - int ob_size; + Py_ssize_t ob_size; char *ob_item; - int allocated; + Py_ssize_t allocated; struct arraydescr *ob_descr; PyObject *weakreflist; /* List of weak references */ } arrayobject; @@ -42,7 +43,7 @@ #define array_CheckExact(op) ((op)->ob_type == &Arraytype) static int -array_resize(arrayobject *self, int newsize) +array_resize(arrayobject *self, Py_ssize_t newsize) { char *items; size_t _new_size; @@ -102,13 +103,13 @@ ****************************************************************************/ static PyObject * -c_getitem(arrayobject *ap, int i) +c_getitem(arrayobject *ap, Py_ssize_t i) { return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1); } static int -c_setitem(arrayobject *ap, int i, PyObject *v) +c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { char x; if (!PyArg_Parse(v, "c;array item must be char", &x)) @@ -119,7 +120,7 @@ } static PyObject * -b_getitem(arrayobject *ap, int i) +b_getitem(arrayobject *ap, Py_ssize_t i) { long x = ((char *)ap->ob_item)[i]; if (x >= 128) @@ -128,7 +129,7 @@ } static int -b_setitem(arrayobject *ap, int i, PyObject *v) +b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { short x; /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore @@ -152,14 +153,14 @@ } static PyObject * -BB_getitem(arrayobject *ap, int i) +BB_getitem(arrayobject *ap, Py_ssize_t i) { long x = ((unsigned char *)ap->ob_item)[i]; return PyInt_FromLong(x); } static int -BB_setitem(arrayobject *ap, int i, PyObject *v) +BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned char x; /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */ @@ -172,16 +173,16 @@ #ifdef Py_USING_UNICODE static PyObject * -u_getitem(arrayobject *ap, int i) +u_getitem(arrayobject *ap, Py_ssize_t i) { return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1); } static int -u_setitem(arrayobject *ap, int i, PyObject *v) +u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { Py_UNICODE *p; - int len; + Py_ssize_t len; if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len)) return -1; @@ -196,13 +197,13 @@ #endif static PyObject * -h_getitem(arrayobject *ap, int i) +h_getitem(arrayobject *ap, Py_ssize_t i) { return PyInt_FromLong((long) ((short *)ap->ob_item)[i]); } static int -h_setitem(arrayobject *ap, int i, PyObject *v) +h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { short x; /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */ @@ -214,13 +215,13 @@ } static PyObject * -HH_getitem(arrayobject *ap, int i) +HH_getitem(arrayobject *ap, Py_ssize_t i) { return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]); } static int -HH_setitem(arrayobject *ap, int i, PyObject *v) +HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { int x; /* PyArg_Parse's 'h' formatter is for a signed short, therefore @@ -243,13 +244,13 @@ } static PyObject * -i_getitem(arrayobject *ap, int i) +i_getitem(arrayobject *ap, Py_ssize_t i) { return PyInt_FromLong((long) ((int *)ap->ob_item)[i]); } static int -i_setitem(arrayobject *ap, int i, PyObject *v) +i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { int x; /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */ @@ -261,14 +262,14 @@ } static PyObject * -II_getitem(arrayobject *ap, int i) +II_getitem(arrayobject *ap, Py_ssize_t i) { return PyLong_FromUnsignedLong( (unsigned long) ((unsigned int *)ap->ob_item)[i]); } static int -II_setitem(arrayobject *ap, int i, PyObject *v) +II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned long x; if (PyLong_Check(v)) { @@ -300,13 +301,13 @@ } static PyObject * -l_getitem(arrayobject *ap, int i) +l_getitem(arrayobject *ap, Py_ssize_t i) { return PyInt_FromLong(((long *)ap->ob_item)[i]); } static int -l_setitem(arrayobject *ap, int i, PyObject *v) +l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { long x; if (!PyArg_Parse(v, "l;array item must be integer", &x)) @@ -317,13 +318,13 @@ } static PyObject * -LL_getitem(arrayobject *ap, int i) +LL_getitem(arrayobject *ap, Py_ssize_t i) { return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]); } static int -LL_setitem(arrayobject *ap, int i, PyObject *v) +LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned long x; if (PyLong_Check(v)) { @@ -355,13 +356,13 @@ } static PyObject * -f_getitem(arrayobject *ap, int i) +f_getitem(arrayobject *ap, Py_ssize_t i) { return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]); } static int -f_setitem(arrayobject *ap, int i, PyObject *v) +f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { float x; if (!PyArg_Parse(v, "f;array item must be float", &x)) @@ -372,13 +373,13 @@ } static PyObject * -d_getitem(arrayobject *ap, int i) +d_getitem(arrayobject *ap, Py_ssize_t i) { return PyFloat_FromDouble(((double *)ap->ob_item)[i]); } static int -d_setitem(arrayobject *ap, int i, PyObject *v) +d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { double x; if (!PyArg_Parse(v, "d;array item must be float", &x)) @@ -412,7 +413,7 @@ ****************************************************************************/ static PyObject * -newarrayobject(PyTypeObject *type, int size, struct arraydescr *descr) +newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr) { arrayobject *op; size_t nbytes; @@ -449,7 +450,7 @@ } static PyObject * -getarrayitem(PyObject *op, int i) +getarrayitem(PyObject *op, Py_ssize_t i) { register arrayobject *ap; assert(array_Check(op)); @@ -459,10 +460,10 @@ } static int -ins1(arrayobject *self, int where, PyObject *v) +ins1(arrayobject *self, Py_ssize_t where, PyObject *v) { char *items; - int n = self->ob_size; + Py_ssize_t n = self->ob_size; if (v == NULL) { PyErr_BadInternalCall(); return -1; @@ -506,7 +507,7 @@ arrayobject *va, *wa; PyObject *vi = NULL; PyObject *wi = NULL; - int i, k; + Py_ssize_t i, k; PyObject *res; if (!array_Check(v) || !array_Check(w)) { @@ -548,8 +549,8 @@ if (k) { /* No more items to compare -- compare sizes */ - int vs = va->ob_size; - int ws = wa->ob_size; + Py_ssize_t vs = va->ob_size; + Py_ssize_t ws = wa->ob_size; int cmp; switch (op) { case Py_LT: cmp = vs < ws; break; @@ -586,14 +587,14 @@ return res; } -static int +static Py_ssize_t array_length(arrayobject *a) { return a->ob_size; } static PyObject * -array_item(arrayobject *a, int i) +array_item(arrayobject *a, Py_ssize_t i) { if (i < 0 || i >= a->ob_size) { PyErr_SetString(PyExc_IndexError, "array index out of range"); @@ -603,7 +604,7 @@ } static PyObject * -array_slice(arrayobject *a, int ilow, int ihigh) +array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh) { arrayobject *np; if (ilow < 0) @@ -638,7 +639,7 @@ static PyObject * array_concat(arrayobject *a, PyObject *bb) { - int size; + Py_ssize_t size; arrayobject *np; if (!array_Check(bb)) { PyErr_Format(PyExc_TypeError, @@ -664,13 +665,13 @@ } static PyObject * -array_repeat(arrayobject *a, int n) +array_repeat(arrayobject *a, Py_ssize_t n) { - int i; - int size; + Py_ssize_t i; + Py_ssize_t size; arrayobject *np; char *p; - int nbytes; + Py_ssize_t nbytes; if (n < 0) n = 0; size = a->ob_size * n; @@ -759,8 +760,9 @@ #undef b } +/* XXX should be ssize_t */ static int -array_ass_item(arrayobject *a, int i, PyObject *v) +array_ass_item(arrayobject *a, size_t i, PyObject *v) { if (i < 0 || i >= a->ob_size) { PyErr_SetString(PyExc_IndexError, @@ -773,7 +775,7 @@ } static int -setarrayitem(PyObject *a, int i, PyObject *v) +setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v) { assert(array_Check(a)); return array_ass_item((arrayobject *)a, i, v); @@ -805,7 +807,7 @@ static int array_do_extend(arrayobject *self, PyObject *bb) { - int size; + Py_ssize_t size; if (!array_Check(bb)) return array_iter_extend(self, bb); @@ -847,10 +849,10 @@ } static PyObject * -array_inplace_repeat(arrayobject *self, int n) +array_inplace_repeat(arrayobject *self, Py_ssize_t n) { char *items, *p; - int size, i; + Py_ssize_t size, i; if (self->ob_size > 0) { if (n < 0) @@ -883,7 +885,7 @@ static PyObject * -ins(arrayobject *self, int where, PyObject *v) +ins(arrayobject *self, Py_ssize_t where, PyObject *v) { if (ins1(self, where, v) != 0) return NULL; @@ -894,8 +896,8 @@ static PyObject * array_count(arrayobject *self, PyObject *v) { - int count = 0; - int i; + Py_ssize_t count = 0; + Py_ssize_t i; for (i = 0; i < self->ob_size; i++) { PyObject *selfi = getarrayitem((PyObject *)self, i); @@ -906,7 +908,10 @@ else if (cmp < 0) return NULL; } - return PyInt_FromLong((long)count); + if (i < LONG_MAX) + return PyInt_FromLong((long)count); + else + return PyLong_FromLong(count); } PyDoc_STRVAR(count_doc, @@ -917,7 +922,7 @@ static PyObject * array_index(arrayobject *self, PyObject *v) { - int i; + Py_ssize_t i; for (i = 0; i < self->ob_size; i++) { PyObject *selfi = getarrayitem((PyObject *)self, i); @@ -941,7 +946,8 @@ static int array_contains(arrayobject *self, PyObject *v) { - int i, cmp; + Py_ssize_t i; + int cmp; for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) { PyObject *selfi = getarrayitem((PyObject *)self, i); @@ -1079,7 +1085,7 @@ array_byteswap(arrayobject *self, PyObject *unused) { char *p; - int i; + Py_ssize_t i; switch (self->ob_descr->itemsize) { case 1: @@ -1158,7 +1164,7 @@ static PyObject * array_reverse(arrayobject *self, PyObject *unused) { - register int itemsize = self->ob_descr->itemsize; + register Py_ssize_t itemsize = self->ob_descr->itemsize; register char *p, *q; /* little buffer to hold items while swapping */ char tmp[256]; /* 8 is probably enough -- but why skimp */ @@ -1223,7 +1229,7 @@ nread = fread(item + (self->ob_size - n) * itemsize, itemsize, n, fp); if (nread < (size_t)n) { - self->ob_size -= (n - nread); + self->ob_size -= (n - nread); PyMem_RESIZE(item, char, self->ob_size*itemsize); self->ob_item = item; self->allocated = self->ob_size; @@ -1275,8 +1281,8 @@ static PyObject * array_fromlist(arrayobject *self, PyObject *list) { - int n; - int itemsize = self->ob_descr->itemsize; + Py_ssize_t n; + Py_ssize_t itemsize = self->ob_descr->itemsize; if (!PyList_Check(list)) { PyErr_SetString(PyExc_TypeError, "arg must be list"); @@ -1285,7 +1291,7 @@ n = PyList_Size(list); if (n > 0) { char *item = self->ob_item; - int i; + Py_ssize_t i; PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize); if (item == NULL) { PyErr_NoMemory(); @@ -1321,7 +1327,7 @@ array_tolist(arrayobject *self, PyObject *unused) { PyObject *list = PyList_New(self->ob_size); - int i; + Py_ssize_t i; if (list == NULL) return NULL; @@ -1346,7 +1352,7 @@ array_fromstring(arrayobject *self, PyObject *args) { char *str; - int n; + Py_ssize_t n; int itemsize = self->ob_descr->itemsize; if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n)) return NULL; @@ -1400,7 +1406,7 @@ array_fromunicode(arrayobject *self, PyObject *args) { Py_UNICODE *ustr; - int n; + Py_ssize_t n; if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n)) return NULL; @@ -1541,7 +1547,7 @@ { char buf[256], typecode; PyObject *s, *t, *v = NULL; - int len; + Py_ssize_t len; len = a->ob_size; typecode = a->ob_descr->typecode; @@ -1586,7 +1592,7 @@ return array_item(self, i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; PyObject* result; arrayobject* ar; int itemsize = self->ob_descr->itemsize; @@ -1640,7 +1646,7 @@ return array_ass_item(self, i, value); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength; + Py_ssize_t start, stop, step, slicelength; int itemsize = self->ob_descr->itemsize; if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size, @@ -1654,7 +1660,7 @@ if (value == NULL) { /* delete slice */ - int cur, i, extra; + Py_ssize_t cur, i, extra; if (slicelength <= 0) return 0; @@ -1686,7 +1692,7 @@ } else { /* assign slice */ - int cur, i; + Py_ssize_t cur, i; arrayobject* av; if (!array_Check(value)) { @@ -1743,7 +1749,7 @@ }; static int -array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr) +array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr) { if ( index != 0 ) { PyErr_SetString(PyExc_SystemError, @@ -1755,7 +1761,7 @@ } static int -array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr) +array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr) { if ( index != 0 ) { PyErr_SetString(PyExc_SystemError, @@ -1767,7 +1773,7 @@ } static int -array_buffer_getsegcount(arrayobject *self, int *lenp) +array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp) { if ( lenp ) *lenp = self->ob_size*self->ob_descr->itemsize; @@ -1777,14 +1783,14 @@ static PySequenceMethods array_as_sequence = { (inquiry)array_length, /*sq_length*/ (binaryfunc)array_concat, /*sq_concat*/ - (intargfunc)array_repeat, /*sq_repeat*/ - (intargfunc)array_item, /*sq_item*/ - (intintargfunc)array_slice, /*sq_slice*/ - (intobjargproc)array_ass_item, /*sq_ass_item*/ - (intintobjargproc)array_ass_slice, /*sq_ass_slice*/ + (ssizeargfunc)array_repeat, /*sq_repeat*/ + (ssizeargfunc)array_item, /*sq_item*/ + (ssizessizeargfunc)array_slice, /*sq_slice*/ + (sizeobjargproc)array_ass_item, /*sq_ass_item*/ + (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/ (objobjproc)array_contains, /*sq_contains*/ (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/ - (intargfunc)array_inplace_repeat /*sq_inplace_repeat*/ + (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/ }; static PyBufferProcs array_as_buffer = { @@ -1822,7 +1828,7 @@ for (descr = descriptors; descr->typecode != '\0'; descr++) { if (descr->typecode == c) { PyObject *a; - int len; + Py_ssize_t len; if (initial == NULL || !(PyList_Check(initial) || PyTuple_Check(initial))) @@ -1835,7 +1841,7 @@ return NULL; if (len > 0) { - int i; + Py_ssize_t i; for (i = 0; i < len; i++) { PyObject *v = PySequence_GetItem(initial, i); @@ -1864,7 +1870,7 @@ Py_DECREF(v); #ifdef Py_USING_UNICODE } else if (initial != NULL && PyUnicode_Check(initial)) { - int n = PyUnicode_GET_DATA_SIZE(initial); + Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial); if (n > 0) { arrayobject *self = (arrayobject *)a; char *item = self->ob_item; @@ -2012,9 +2018,9 @@ typedef struct { PyObject_HEAD - long index; + Py_ssize_t index; arrayobject *ao; - PyObject * (*getitem)(struct arrayobject *, int); + PyObject * (*getitem)(struct arrayobject *, Py_ssize_t); } arrayiterobject; static PyTypeObject PyArrayIter_Type; Modified: python/branches/ssize_t/Modules/audioop.c ============================================================================== --- python/branches/ssize_t/Modules/audioop.c (original) +++ python/branches/ssize_t/Modules/audioop.c Sat Dec 17 11:20:15 2005 @@ -1020,7 +1020,9 @@ cur_i[chan])); if (PyErr_Occurred()) goto exit; - len = ncp - PyString_AsString(str); + /* We have checked before that the length + * of the string fits into int. */ + len = (int)(ncp - PyString_AsString(str)); if (len == 0) { /*don't want to resize to zero length*/ rv = PyString_FromStringAndSize("", 0); Modified: python/branches/ssize_t/Modules/cPickle.c ============================================================================== --- python/branches/ssize_t/Modules/cPickle.c (original) +++ python/branches/ssize_t/Modules/cPickle.c Sat Dec 17 11:20:15 2005 @@ -339,7 +339,7 @@ int fast; /* Fast mode doesn't save in memo, don't use if circ ref */ int nesting; - int (*write_func)(struct Picklerobject *, const char *, int); + int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t); char *write_buf; int buf_size; PyObject *dispatch_table; @@ -417,7 +417,7 @@ } static int -write_file(Picklerobject *self, const char *s, int n) +write_file(Picklerobject *self, const char *s, Py_ssize_t n) { size_t nbyteswritten; @@ -425,6 +425,11 @@ return 0; } + if (n > INT_MAX) { + /* String too large */ + return -1; + } + Py_BEGIN_ALLOW_THREADS nbyteswritten = fwrite(s, sizeof(char), n, self->fp); Py_END_ALLOW_THREADS @@ -433,11 +438,11 @@ return -1; } - return n; + return (int)n; } static int -write_cStringIO(Picklerobject *self, const char *s, int n) +write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n) { if (s == NULL) { return 0; @@ -447,21 +452,26 @@ return -1; } - return n; + return (int)n; } static int -write_none(Picklerobject *self, const char *s, int n) +write_none(Picklerobject *self, const char *s, Py_ssize_t n) { if (s == NULL) return 0; - return n; + if (n > INT_MAX) return -1; + return (int)n; } static int -write_other(Picklerobject *self, const char *s, int n) +write_other(Picklerobject *self, const char *s, Py_ssize_t _n) { PyObject *py_str = 0, *junk = 0; + int n; + if (_n > INT_MAX) + return -1; + n = (int)_n; if (s == NULL) { if (!( self->buf_size )) return 0; py_str = PyString_FromStringAndSize(self->write_buf, Modified: python/branches/ssize_t/Modules/cStringIO.c ============================================================================== --- python/branches/ssize_t/Modules/cStringIO.c (original) +++ python/branches/ssize_t/Modules/cStringIO.c Sat Dec 17 11:20:15 2005 @@ -57,9 +57,10 @@ typedef struct { /* Subtype of IOobject */ PyObject_HEAD char *buf; - int pos, string_size; + Py_ssize_t pos, string_size; - int buf_size, softspace; + Py_ssize_t buf_size; + int softspace; } Oobject; /* Declarations for objects of type StringI */ @@ -186,7 +187,7 @@ static int IO_creadline(PyObject *self, char **output) { char *n, *s; - int l; + Py_ssize_t l; UNLESS (IO__opencheck(IOOOBJECT(self))) return -1; @@ -197,8 +198,9 @@ *output=((IOobject*)self)->buf + ((IOobject*)self)->pos; l = n - ((IOobject*)self)->buf - ((IOobject*)self)->pos; - ((IOobject*)self)->pos += l; - return l; + assert(((IOobject*)self)->pos + l < INT_MAX); + ((IOobject*)self)->pos += (int)l; + return (int)l; } static PyObject * @@ -324,11 +326,14 @@ static PyObject * O_seek(Oobject *self, PyObject *args) { - int position, mode = 0; + int i_position; + Py_ssize_t position; + int mode = 0; UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL; - UNLESS (PyArg_ParseTuple(args, "i|i:seek", &position, &mode)) + UNLESS (PyArg_ParseTuple(args, "i|i:seek", &i_position, &mode)) return NULL; + position = i_position; if (mode == 2) { position += self->string_size; @@ -362,8 +367,8 @@ static int -O_cwrite(PyObject *self, const char *c, int l) { - int newl; +O_cwrite(PyObject *self, const char *c, Py_ssize_t l) { + Py_ssize_t newl; Oobject *oself; UNLESS (IO__opencheck(IOOOBJECT(self))) return -1; @@ -372,8 +377,10 @@ newl = oself->pos+l; if (newl >= oself->buf_size) { oself->buf_size *= 2; - if (oself->buf_size <= newl) - oself->buf_size = newl+1; + if (oself->buf_size <= newl) { + assert(newl + 1 < INT_MAX); + oself->buf_size = (int)(newl+1); + } UNLESS (oself->buf = (char*)realloc(oself->buf, oself->buf_size)) { PyErr_SetString(PyExc_MemoryError,"out of memory"); @@ -384,13 +391,14 @@ memcpy(oself->buf+oself->pos,c,l); - oself->pos += l; + assert(oself->pos + l < INT_MAX); + oself->pos += (int)l; if (oself->string_size < oself->pos) { oself->string_size = oself->pos; } - return l; + return (int)l; } static PyObject * Modified: python/branches/ssize_t/Modules/cjkcodecs/multibytecodec.c ============================================================================== --- python/branches/ssize_t/Modules/cjkcodecs/multibytecodec.c (original) +++ python/branches/ssize_t/Modules/cjkcodecs/multibytecodec.c Sat Dec 17 11:20:15 2005 @@ -214,7 +214,7 @@ if (buf->excobj == NULL) { buf->excobj = PyUnicodeEncodeError_Create(codec->encoding, buf->inbuf_top, - (int)(buf->inbuf_end - buf->inbuf_top), + buf->inbuf_end - buf->inbuf_top, start, end, reason); if (buf->excobj == NULL) goto errorexit; Modified: python/branches/ssize_t/Modules/gcmodule.c ============================================================================== --- python/branches/ssize_t/Modules/gcmodule.c (original) +++ python/branches/ssize_t/Modules/gcmodule.c Sat Dec 17 11:20:15 2005 @@ -1272,7 +1272,7 @@ } PyVarObject * -_PyObject_GC_NewVar(PyTypeObject *tp, int nitems) +_PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems) { const size_t size = _PyObject_VAR_SIZE(tp, nitems); PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size); Modified: python/branches/ssize_t/Modules/parsermodule.c ============================================================================== --- python/branches/ssize_t/Modules/parsermodule.c (original) +++ python/branches/ssize_t/Modules/parsermodule.c Sat Dec 17 11:20:15 2005 @@ -55,9 +55,9 @@ static char parser_version_string[] = "0.5"; -typedef PyObject* (*SeqMaker) (int length); +typedef PyObject* (*SeqMaker) (Py_ssize_t length); typedef int (*SeqInserter) (PyObject* sequence, - int index, + Py_ssize_t index, PyObject* element); /* The function below is copyrighted by Stichting Mathematisch Centrum. The Modified: python/branches/ssize_t/Modules/posixmodule.c ============================================================================== --- python/branches/ssize_t/Modules/posixmodule.c (original) +++ python/branches/ssize_t/Modules/posixmodule.c Sat Dec 17 11:20:15 2005 @@ -1033,7 +1033,7 @@ int res; #ifdef MS_WINDOWS - int pathlen; + Py_ssize_t pathlen; char pathcopy[MAX_PATH]; #endif /* MS_WINDOWS */ @@ -1518,7 +1518,7 @@ /* MAX_PATH characters could mean a bigger encoded string */ char namebuf[MAX_PATH*2+5]; char *bufptr = namebuf; - int len = sizeof(namebuf)/sizeof(namebuf[0]); + Py_ssize_t len = sizeof(namebuf)/sizeof(namebuf[0]); #ifdef Py_WIN_WIDE_FILENAMES /* If on wide-character-capable OS see if argument @@ -2216,7 +2216,7 @@ PyObject *argv; char **argvlist; int i, argc; - PyObject *(*getitem)(PyObject *, int); + PyObject *(*getitem)(PyObject *, Py_ssize_t); /* execv has two arguments: (path, argv), where argv is a list or tuple of strings. */ @@ -2285,7 +2285,7 @@ char **envlist; PyObject *key, *val, *keys=NULL, *vals=NULL; int i, pos, argc, envc; - PyObject *(*getitem)(PyObject *, int); + PyObject *(*getitem)(PyObject *, Py_ssize_t); int lastarg = 0; /* execve has three arguments: (path, argv, env), where @@ -2429,7 +2429,7 @@ char **argvlist; int mode, i, argc; Py_intptr_t spawnval; - PyObject *(*getitem)(PyObject *, int); + PyObject *(*getitem)(PyObject *, Py_ssize_t); /* spawnv has three arguments: (mode, path, argv), where argv is a list or tuple of strings. */ @@ -2518,7 +2518,7 @@ PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL; int mode, i, pos, argc, envc; Py_intptr_t spawnval; - PyObject *(*getitem)(PyObject *, int); + PyObject *(*getitem)(PyObject *, Py_ssize_t); int lastarg = 0; /* spawnve has four arguments: (mode, path, argv, env), where @@ -2670,7 +2670,7 @@ char **argvlist; int mode, i, argc; Py_intptr_t spawnval; - PyObject *(*getitem)(PyObject *, int); + PyObject *(*getitem)(PyObject *, Py_ssize_t); /* spawnvp has three arguments: (mode, path, argv), where argv is a list or tuple of strings. */ @@ -2751,7 +2751,7 @@ PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL; int mode, i, pos, argc, envc; Py_intptr_t spawnval; - PyObject *(*getitem)(PyObject *, int); + PyObject *(*getitem)(PyObject *, Py_ssize_t); int lastarg = 0; /* spawnvpe has four arguments: (mode, path, argv, env), where @@ -4186,14 +4186,15 @@ char *s1,*s2, *s3 = " /c "; const char *szConsoleSpawn = "w9xpopen.exe"; int i; - int x; + Py_ssize_t x; if (i = GetEnvironmentVariable("COMSPEC",NULL,0)) { char *comshell; s1 = (char *)alloca(i); if (!(x = GetEnvironmentVariable("COMSPEC", s1, i))) - return x; + /* x < i, so x fits into an integer */ + return (int)x; /* Explicitly check if we are using COMMAND.COM. If we are * then use the w9xpopen hack. @@ -4219,7 +4220,7 @@ char modulepath[_MAX_PATH]; struct stat statinfo; GetModuleFileName(NULL, modulepath, sizeof(modulepath)); - for (i = x = 0; modulepath[i]; i++) + for (x = i = 0; modulepath[i]; i++) if (modulepath[i] == SEP) x = i+1; modulepath[x] = '\0'; @@ -4396,7 +4397,7 @@ switch (mode & (_O_RDONLY | _O_TEXT | _O_BINARY | _O_WRONLY)) { case _O_WRONLY | _O_TEXT: /* Case for writing to child Stdin in text mode. */ - fd1 = _open_osfhandle((long)hChildStdinWrDup, mode); + fd1 = _open_osfhandle((intptr_t)hChildStdinWrDup, mode); f1 = _fdopen(fd1, "w"); f = PyFile_FromFile(f1, cmdstring, "w", _PyPclose); PyFile_SetBufSize(f, 0); @@ -4407,7 +4408,7 @@ case _O_RDONLY | _O_TEXT: /* Case for reading from child Stdout in text mode. */ - fd1 = _open_osfhandle((long)hChildStdoutRdDup, mode); + fd1 = _open_osfhandle((intptr_t)hChildStdoutRdDup, mode); f1 = _fdopen(fd1, "r"); f = PyFile_FromFile(f1, cmdstring, "r", _PyPclose); PyFile_SetBufSize(f, 0); @@ -4418,7 +4419,7 @@ case _O_RDONLY | _O_BINARY: /* Case for readinig from child Stdout in binary mode. */ - fd1 = _open_osfhandle((long)hChildStdoutRdDup, mode); + fd1 = _open_osfhandle((intptr_t)hChildStdoutRdDup, mode); f1 = _fdopen(fd1, "rb"); f = PyFile_FromFile(f1, cmdstring, "rb", _PyPclose); PyFile_SetBufSize(f, 0); @@ -4429,7 +4430,7 @@ case _O_WRONLY | _O_BINARY: /* Case for writing to child Stdin in binary mode. */ - fd1 = _open_osfhandle((long)hChildStdinWrDup, mode); + fd1 = _open_osfhandle((intptr_t)hChildStdinWrDup, mode); f1 = _fdopen(fd1, "wb"); f = PyFile_FromFile(f1, cmdstring, "wb", _PyPclose); PyFile_SetBufSize(f, 0); @@ -4455,9 +4456,9 @@ m2 = "wb"; } - fd1 = _open_osfhandle((long)hChildStdinWrDup, mode); + fd1 = _open_osfhandle((intptr_t)hChildStdinWrDup, mode); f1 = _fdopen(fd1, m2); - fd2 = _open_osfhandle((long)hChildStdoutRdDup, mode); + fd2 = _open_osfhandle((intptr_t)hChildStdoutRdDup, mode); f2 = _fdopen(fd2, m1); p1 = PyFile_FromFile(f1, cmdstring, m2, _PyPclose); PyFile_SetBufSize(p1, 0); @@ -4487,11 +4488,11 @@ m2 = "wb"; } - fd1 = _open_osfhandle((long)hChildStdinWrDup, mode); + fd1 = _open_osfhandle((intptr_t)hChildStdinWrDup, mode); f1 = _fdopen(fd1, m2); - fd2 = _open_osfhandle((long)hChildStdoutRdDup, mode); + fd2 = _open_osfhandle((intptr_t)hChildStdoutRdDup, mode); f2 = _fdopen(fd2, m1); - fd3 = _open_osfhandle((long)hChildStderrRdDup, mode); + fd3 = _open_osfhandle((intptr_t)hChildStderrRdDup, mode); f3 = _fdopen(fd3, m1); p1 = PyFile_FromFile(f1, cmdstring, m2, _PyPclose); p2 = PyFile_FromFile(f2, cmdstring, m1, _PyPclose); @@ -4993,8 +4994,8 @@ static PyObject * posix_waitpid(PyObject *self, PyObject *args) { - int pid, options; - int status; + intptr_t pid; + int status, options; if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options)) return NULL; Modified: python/branches/ssize_t/Modules/rgbimgmodule.c ============================================================================== --- python/branches/ssize_t/Modules/rgbimgmodule.c (original) +++ python/branches/ssize_t/Modules/rgbimgmodule.c Sat Dec 17 11:20:15 2005 @@ -168,7 +168,7 @@ buf[1] = (unsigned char) (val >> 16); buf[2] = (unsigned char) (val >> 8); buf[3] = (unsigned char) (val >> 0); - return fwrite(buf, 4, 1, outf); + return (int)fwrite(buf, 4, 1, outf); } static void @@ -200,7 +200,7 @@ putlong(outf, image->min); putlong(outf, image->max); putlong(outf, 0); - return fwrite("no name", 8, 1, outf); + return (int)fwrite("no name", 8, 1, outf); } static int @@ -567,7 +567,8 @@ Py_Int32 *starttab = NULL, *lengthtab = NULL; unsigned char *rlebuf = NULL; unsigned char *lumbuf = NULL; - int rlebuflen, goodwrite; + int rlebuflen; + Py_ssize_t goodwrite; PyObject *retval = NULL; if (!PyArg_ParseTuple(args, "s#iiis:longstoimage", &lptr, &len, Modified: python/branches/ssize_t/Modules/zipimport.c ============================================================================== --- python/branches/ssize_t/Modules/zipimport.c (original) +++ python/branches/ssize_t/Modules/zipimport.c Sat Dec 17 11:20:15 2005 @@ -62,7 +62,7 @@ zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds) { char *path, *p, *prefix, buf[MAXPATHLEN+2]; - int len; + Py_ssize_t len; if (!_PyArg_NoKeywords("zipimporter()", kwds)) return -1; @@ -231,7 +231,7 @@ static int make_filename(char *prefix, char *name, char *path) { - int len; + Py_ssize_t len; char *p; len = strlen(prefix); @@ -249,7 +249,8 @@ *p = SEP; } len += strlen(name); - return len; + assert(len < INT_MAX); + return (int)len; } enum zi_module_info { @@ -807,7 +808,8 @@ PyObject *raw_data, *data = NULL, *decompress; char *buf; FILE *fp; - int err, bytes_read = 0; + int err; + Py_ssize_t bytes_read = 0; long l; char *datapath; long compress, data_size, file_size, file_offset; @@ -1023,7 +1025,7 @@ { PyObject *toc_entry; time_t mtime = 0; - int lastchar = strlen(path) - 1; + Py_ssize_t lastchar = strlen(path) - 1; char savechar = path[lastchar]; path[lastchar] = '\0'; /* strip 'c' or 'o' from *.py[co] */ toc_entry = PyDict_GetItemString(self->files, path); Modified: python/branches/ssize_t/Objects/abstract.c ============================================================================== --- python/branches/ssize_t/Objects/abstract.c (original) +++ python/branches/ssize_t/Objects/abstract.c Sat Dec 17 11:20:15 2005 @@ -648,7 +648,7 @@ } static PyObject * -sequence_repeat(intargfunc repeatfunc, PyObject *seq, PyObject *n) +sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) { long count; if (PyInt_Check(n)) { @@ -842,7 +842,7 @@ PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply), NB_SLOT(nb_multiply)); if (result == Py_NotImplemented) { - intargfunc f = NULL; + ssizeargfunc f = NULL; PySequenceMethods *mv = v->ob_type->tp_as_sequence; PySequenceMethods *mw = w->ob_type->tp_as_sequence; Py_DECREF(result); @@ -1148,7 +1148,7 @@ } PyObject * -PySequence_Repeat(PyObject *o, int count) +PySequence_Repeat(PyObject *o, Py_ssize_t count) { PySequenceMethods *m; @@ -1180,7 +1180,7 @@ } PyObject * -PySequence_InPlaceRepeat(PyObject *o, int count) +PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count) { PySequenceMethods *m; @@ -1197,7 +1197,7 @@ } PyObject * -PySequence_GetItem(PyObject *s, int i) +PySequence_GetItem(PyObject *s, Py_ssize_t i) /* XXX negative values */ { PySequenceMethods *m; @@ -1239,7 +1239,7 @@ } PyObject * -PySequence_GetSlice(PyObject *s, int i1, int i2) +PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) { PySequenceMethods *m; PyMappingMethods *mp; @@ -1274,7 +1274,7 @@ } int -PySequence_SetItem(PyObject *s, int i, PyObject *o) +PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) { PySequenceMethods *m; @@ -1301,7 +1301,7 @@ } int -PySequence_DelItem(PyObject *s, int i) +PySequence_DelItem(PyObject *s, Py_ssize_t i) { PySequenceMethods *m; @@ -1328,7 +1328,7 @@ } int -PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o) +PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o) { PySequenceMethods *m; PyMappingMethods *mp; @@ -1367,7 +1367,7 @@ } int -PySequence_DelSlice(PyObject *s, int i1, int i2) +PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) { PySequenceMethods *m; Modified: python/branches/ssize_t/Objects/bufferobject.c ============================================================================== --- python/branches/ssize_t/Objects/bufferobject.c (original) +++ python/branches/ssize_t/Objects/bufferobject.c Sat Dec 17 11:20:15 2005 @@ -56,7 +56,7 @@ static PyObject * -buffer_from_memory(PyObject *base, int size, int offset, void *ptr, +buffer_from_memory(PyObject *base, Py_ssize_t size, int offset, void *ptr, int readonly) { PyBufferObject * b; @@ -113,7 +113,7 @@ PyObject * -PyBuffer_FromObject(PyObject *base, int offset, int size) +PyBuffer_FromObject(PyObject *base, int offset, Py_ssize_t size) { PyBufferProcs *pb = base->ob_type->tp_as_buffer; @@ -129,7 +129,7 @@ } PyObject * -PyBuffer_FromReadWriteObject(PyObject *base, int offset, int size) +PyBuffer_FromReadWriteObject(PyObject *base, int offset, Py_ssize_t size) { PyBufferProcs *pb = base->ob_type->tp_as_buffer; @@ -145,13 +145,13 @@ } PyObject * -PyBuffer_FromMemory(void *ptr, int size) +PyBuffer_FromMemory(void *ptr, Py_ssize_t size) { return buffer_from_memory(NULL, size, 0, ptr, 1); } PyObject * -PyBuffer_FromReadWriteMemory(void *ptr, int size) +PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size) { return buffer_from_memory(NULL, size, 0, ptr, 0); } @@ -367,7 +367,7 @@ } static PyObject * -buffer_repeat(PyBufferObject *self, int count) +buffer_repeat(PyBufferObject *self, Py_ssize_t count) { PyObject *ob; register char *p; @@ -396,13 +396,13 @@ } static PyObject * -buffer_item(PyBufferObject *self, int idx) +buffer_item(PyBufferObject *self, Py_ssize_t idx) { void *ptr; int size; if (!get_buf(self, &ptr, &size)) return NULL; - if ( idx < 0 || idx >= size ) { + if (idx < 0 || idx >= size ) { PyErr_SetString(PyExc_IndexError, "buffer index out of range"); return NULL; } @@ -410,7 +410,7 @@ } static PyObject * -buffer_slice(PyBufferObject *self, int left, int right) +buffer_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right) { void *ptr; int size; @@ -429,7 +429,7 @@ } static int -buffer_ass_item(PyBufferObject *self, int idx, PyObject *other) +buffer_ass_item(PyBufferObject *self, Py_ssize_t idx, PyObject *other) { PyBufferProcs *pb; void *ptr1, *ptr2; @@ -445,7 +445,7 @@ if (!get_buf(self, &ptr1, &size)) return -1; - if (idx < 0 || idx >= size) { + if (idx >= size) { PyErr_SetString(PyExc_IndexError, "buffer assignment index out of range"); return -1; @@ -480,7 +480,7 @@ } static int -buffer_ass_slice(PyBufferObject *self, int left, int right, PyObject *other) +buffer_ass_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right, PyObject *other) { PyBufferProcs *pb; void *ptr1, *ptr2; @@ -596,11 +596,11 @@ static PySequenceMethods buffer_as_sequence = { (inquiry)buffer_length, /*sq_length*/ (binaryfunc)buffer_concat, /*sq_concat*/ - (intargfunc)buffer_repeat, /*sq_repeat*/ - (intargfunc)buffer_item, /*sq_item*/ - (intintargfunc)buffer_slice, /*sq_slice*/ - (intobjargproc)buffer_ass_item, /*sq_ass_item*/ - (intintobjargproc)buffer_ass_slice, /*sq_ass_slice*/ + (ssizeargfunc)buffer_repeat, /*sq_repeat*/ + (ssizeargfunc)buffer_item, /*sq_item*/ + (ssizessizeargfunc)buffer_slice, /*sq_slice*/ + (sizeobjargproc)buffer_ass_item, /*sq_ass_item*/ + (ssizessizeobjargproc)buffer_ass_slice, /*sq_ass_slice*/ }; static PyBufferProcs buffer_as_buffer = { Modified: python/branches/ssize_t/Objects/classobject.c ============================================================================== --- python/branches/ssize_t/Objects/classobject.c (original) +++ python/branches/ssize_t/Objects/classobject.c Sat Dec 17 11:20:15 2005 @@ -1103,7 +1103,7 @@ }; static PyObject * -instance_item(PyInstanceObject *inst, int i) +instance_item(PyInstanceObject *inst, Py_ssize_t i) { PyObject *func, *arg, *res; @@ -1112,7 +1112,7 @@ func = instance_getattr(inst, getitemstr); if (func == NULL) return NULL; - arg = Py_BuildValue("(i)", i); + arg = Py_BuildValue("(n)", i); if (arg == NULL) { Py_DECREF(func); return NULL; @@ -1325,10 +1325,10 @@ (inquiry)instance_length, /* sq_length */ 0, /* sq_concat */ 0, /* sq_repeat */ - (intargfunc)instance_item, /* sq_item */ - (intintargfunc)instance_slice, /* sq_slice */ - (intobjargproc)instance_ass_item, /* sq_ass_item */ - (intintobjargproc)instance_ass_slice, /* sq_ass_slice */ + (ssizeargfunc)instance_item, /* sq_item */ + (ssizessizeargfunc)instance_slice, /* sq_slice */ + (sizeobjargproc)instance_ass_item, /* sq_ass_item */ + (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */ (objobjproc)instance_contains, /* sq_contains */ }; Modified: python/branches/ssize_t/Objects/fileobject.c ============================================================================== --- python/branches/ssize_t/Objects/fileobject.c (original) +++ python/branches/ssize_t/Objects/fileobject.c Sat Dec 17 11:20:15 2005 @@ -1,5 +1,6 @@ /* File object implementation */ +#define PY_SIZE_T_CLEAN #include "Python.h" #include "structmember.h" @@ -854,7 +855,7 @@ { char *ptr; int ntodo; - size_t ndone, nnow; + Py_ssize_t ndone, nnow; if (f->f_fp == NULL) return err_closed(); @@ -967,7 +968,8 @@ pvend = buf + total_v_size; nfree = pvend - pvfree; memset(pvfree, '\n', nfree); - p = fgets(pvfree, nfree, fp); + assert(nfree < INT_MAX); /* Should be atmost MAXBUFSIZE */ + p = fgets(pvfree, (int)nfree, fp); Py_END_ALLOW_THREADS if (p == NULL) { @@ -1041,7 +1043,8 @@ pvend = BUF(v) + total_v_size; nfree = pvend - pvfree; memset(pvfree, '\n', nfree); - p = fgets(pvfree, nfree, fp); + assert(nfree < INT_MAX); + p = fgets(pvfree, (int)nfree, fp); Py_END_ALLOW_THREADS if (p == NULL) { @@ -1431,7 +1434,7 @@ file_write(PyFileObject *f, PyObject *args) { char *s; - int n, n2; + Py_ssize_t n, n2; if (f->f_fp == NULL) return err_closed(); if (!PyArg_ParseTuple(args, f->f_binary ? "s#" : "t#", &s, &n)) @@ -1457,7 +1460,8 @@ PyObject *list, *line; PyObject *it; /* iter(seq) */ PyObject *result; - int i, j, index, len, nwritten, islist; + int i, j, index, len, islist; + Py_ssize_t nwritten; assert(seq != NULL); if (f->f_fp == NULL) @@ -1752,7 +1756,7 @@ static int readahead(PyFileObject *f, int bufsize) { - int chunksize; + Py_ssize_t chunksize; if (f->f_buf != NULL) { if( (f->f_bufend - f->f_bufptr) >= 1) @@ -1792,7 +1796,7 @@ PyStringObject* s; char *bufptr; char *buf; - int len; + Py_ssize_t len; if (f->f_buf == NULL) if (readahead(f, bufsize) < 0) @@ -1818,8 +1822,9 @@ bufptr = f->f_bufptr; buf = f->f_buf; f->f_buf = NULL; /* Force new readahead buffer */ + assert(skip+len < INT_MAX); s = readahead_get_line_skip( - f, skip+len, bufsize + (bufsize>>2) ); + f, (int)(skip+len), bufsize + (bufsize>>2) ); if (s == NULL) { PyMem_Free(buf); return NULL; Modified: python/branches/ssize_t/Objects/intobject.c ============================================================================== --- python/branches/ssize_t/Objects/intobject.c (original) +++ python/branches/ssize_t/Objects/intobject.c Sat Dec 17 11:20:15 2005 @@ -108,6 +108,22 @@ return (PyObject *) v; } +PyObject * +PyInt_FromSize_t(size_t ival) +{ + if (ival <= LONG_MAX) + return PyInt_FromLong((long)ival); + return _PyLong_FromSize_t(ival); +} + +PyObject * +PyInt_FromSsize_t(Py_ssize_t ival) +{ + if (ival >= LONG_MIN && ival <= LONG_MAX) + return PyInt_FromLong((long)ival); + return _PyLong_FromSsize_t(ival); +} + static void int_dealloc(PyIntObject *v) { @@ -169,6 +185,57 @@ return val; } +Py_ssize_t +PyInt_AsSsize_t(register PyObject *op) +{ +#if SIZEOF_SIZE_T==SIZEOF_LONG + return PyInt_AsLong(op); +#else + PyNumberMethods *nb; + PyIntObject *io; + Py_ssize_t val; + + if (op && PyInt_Check(op)) + return PyInt_AS_LONG((PyIntObject*) op); + + if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL || + (nb->nb_int == NULL && nb->nb_long == 0)) { + PyErr_SetString(PyExc_TypeError, "an integer is required"); + return -1; + } + + if (nb->nb_long != 0) { + io = (PyIntObject*) (*nb->nb_long) (op); + } else { + io = (PyIntObject*) (*nb->nb_int) (op); + } + if (io == NULL) + return -1; + if (!PyInt_Check(io)) { + if (PyLong_Check(io)) { + /* got a long? => retry int conversion */ + val = PyLong_AsSsize_t((PyObject *)io); + Py_DECREF(io); + if ((val == -1) && PyErr_Occurred()) + return -1; + return val; + } + else + { + Py_DECREF(io); + PyErr_SetString(PyExc_TypeError, + "nb_int should return int object"); + return -1; + } + } + + val = PyInt_AS_LONG(io); + Py_DECREF(io); + + return val; +#endif +} + unsigned long PyInt_AsUnsignedLongMask(register PyObject *op) { Modified: python/branches/ssize_t/Objects/listobject.c ============================================================================== --- python/branches/ssize_t/Objects/listobject.c (original) +++ python/branches/ssize_t/Objects/listobject.c Sat Dec 17 11:20:15 2005 @@ -22,7 +22,7 @@ * than ob_size on entry. */ static int -list_resize(PyListObject *self, int newsize) +list_resize(PyListObject *self, Py_ssize_t newsize) { PyObject **items; size_t new_allocated; @@ -82,7 +82,7 @@ } PyObject * -PyList_New(int size) +PyList_New(Py_ssize_t size) { PyListObject *op; size_t nbytes; @@ -118,7 +118,7 @@ return (PyObject *) op; } -int +Py_ssize_t PyList_Size(PyObject *op) { if (!PyList_Check(op)) { @@ -132,13 +132,13 @@ static PyObject *indexerr = NULL; PyObject * -PyList_GetItem(PyObject *op, int i) +PyList_GetItem(PyObject *op, Py_ssize_t i) { if (!PyList_Check(op)) { PyErr_BadInternalCall(); return NULL; } - if (i < 0 || i >= ((PyListObject *)op) -> ob_size) { + if (i >= ((PyListObject *)op) -> ob_size) { if (indexerr == NULL) indexerr = PyString_FromString( "list index out of range"); @@ -149,7 +149,7 @@ } int -PyList_SetItem(register PyObject *op, register int i, +PyList_SetItem(register PyObject *op, register Py_ssize_t i, register PyObject *newitem) { register PyObject *olditem; @@ -159,7 +159,7 @@ PyErr_BadInternalCall(); return -1; } - if (i < 0 || i >= ((PyListObject *)op) -> ob_size) { + if (i >= ((PyListObject *)op) -> ob_size) { Py_XDECREF(newitem); PyErr_SetString(PyExc_IndexError, "list assignment index out of range"); @@ -173,7 +173,7 @@ } static int -ins1(PyListObject *self, int where, PyObject *v) +ins1(PyListObject *self, Py_ssize_t where, PyObject *v) { int i, n = self->ob_size; PyObject **items; @@ -206,7 +206,7 @@ } int -PyList_Insert(PyObject *op, int where, PyObject *newitem) +PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem) { if (!PyList_Check(op)) { PyErr_BadInternalCall(); @@ -381,7 +381,7 @@ } static PyObject * -list_item(PyListObject *a, int i) +list_item(PyListObject *a, Py_ssize_t i) { if (i < 0 || i >= a->ob_size) { if (indexerr == NULL) @@ -395,7 +395,7 @@ } static PyObject * -list_slice(PyListObject *a, int ilow, int ihigh) +list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) { PyListObject *np; PyObject **src, **dest; @@ -424,7 +424,7 @@ } PyObject * -PyList_GetSlice(PyObject *a, int ilow, int ihigh) +PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) { if (!PyList_Check(a)) { PyErr_BadInternalCall(); @@ -473,7 +473,7 @@ } static PyObject * -list_repeat(PyListObject *a, int n) +list_repeat(PyListObject *a, Py_ssize_t n) { int i, j; int size; @@ -542,7 +542,7 @@ * guaranteed the call cannot fail. */ static int -list_ass_slice(PyListObject *a, int ilow, int ihigh, PyObject *v) +list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) { /* Because [X]DECREF can recursively invoke list operations on this list, we must postpone all [X]DECREF activity until @@ -640,7 +640,7 @@ } int -PyList_SetSlice(PyObject *a, int ilow, int ihigh, PyObject *v) +PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) { if (!PyList_Check(a)) { PyErr_BadInternalCall(); @@ -650,7 +650,7 @@ } static PyObject * -list_inplace_repeat(PyListObject *self, int n) +list_inplace_repeat(PyListObject *self, Py_ssize_t n) { PyObject **items; int size, i, j, p; @@ -685,7 +685,7 @@ } static int -list_ass_item(PyListObject *a, int i, PyObject *v) +list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v) { PyObject *old_value; if (i < 0 || i >= a->ob_size) { @@ -2435,11 +2435,11 @@ static PySequenceMethods list_as_sequence = { (inquiry)list_length, /* sq_length */ (binaryfunc)list_concat, /* sq_concat */ - (intargfunc)list_repeat, /* sq_repeat */ - (intargfunc)list_item, /* sq_item */ - (intintargfunc)list_slice, /* sq_slice */ - (intobjargproc)list_ass_item, /* sq_ass_item */ - (intintobjargproc)list_ass_slice, /* sq_ass_slice */ + (ssizeargfunc)list_repeat, /* sq_repeat */ + (ssizeargfunc)list_item, /* sq_item */ + (ssizessizeargfunc)list_slice, /* sq_slice */ + (sizeobjargproc)list_ass_item, /* sq_ass_item */ + (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */ (objobjproc)list_contains, /* sq_contains */ (binaryfunc)list_inplace_concat, /* sq_inplace_concat */ (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */ @@ -2459,7 +2459,7 @@ return list_item(self, i); } else if (PyLong_Check(item)) { - long i = PyLong_AsLong(item); + Py_ssize_t i = PyLong_AsSsize_t(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) @@ -2467,7 +2467,7 @@ return list_item(self, i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; PyObject* result; PyObject* it; PyObject **src, **dest; @@ -2521,7 +2521,7 @@ return list_ass_item(self, i, value); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength; + Py_ssize_t start, stop, step, slicelength; if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size, &start, &stop, &step, &slicelength) < 0) { @@ -2601,9 +2601,10 @@ } if (PySequence_Fast_GET_SIZE(seq) != slicelength) { + /* XXX can we use %zd here? */ PyErr_Format(PyExc_ValueError, "attempt to assign sequence of size %d to extended slice of size %d", - PySequence_Fast_GET_SIZE(seq), + (int)PySequence_Fast_GET_SIZE(seq), slicelength); Py_DECREF(seq); return -1; Modified: python/branches/ssize_t/Objects/longobject.c ============================================================================== --- python/branches/ssize_t/Objects/longobject.c (original) +++ python/branches/ssize_t/Objects/longobject.c Sat Dec 17 11:20:15 2005 @@ -50,7 +50,7 @@ static PyLongObject * long_normalize(register PyLongObject *v) { - int j = ABS(v->ob_size); + Py_ssize_t j = ABS(v->ob_size); register int i = j; while (i > 0 && v->ob_digit[i-1] == 0) @@ -64,8 +64,13 @@ Return NULL and set exception if we run out of memory. */ PyLongObject * -_PyLong_New(int size) +_PyLong_New(Py_ssize_t size) { + if (size > INT_MAX) { + /* XXX: Fix this check when ob_size becomes ssize_t */ + PyErr_NoMemory(); + return NULL; + } return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size); } @@ -198,7 +203,8 @@ /* This version by Tim Peters */ register PyLongObject *v; unsigned long x, prev; - int i, sign; + Py_ssize_t i; + int sign; if (vv == NULL || !PyLong_Check(vv)) { if (vv != NULL && PyInt_Check(vv)) @@ -235,6 +241,52 @@ return -1; } +/* Get a Py_ssize_t from a long int object. + Returns -1 and sets an error condition if overflow occurs. */ + +Py_ssize_t +PyLong_AsSsize_t(PyObject *vv) +{ + register PyLongObject *v; + size_t x, prev; + Py_ssize_t i; + int sign; + + if (vv == NULL || !PyLong_Check(vv)) { + if (vv != NULL && PyInt_Check(vv)) + return PyInt_AsSsize_t(vv); + PyErr_BadInternalCall(); + return -1; + } + v = (PyLongObject *)vv; + i = v->ob_size; + sign = 1; + x = 0; + if (i < 0) { + sign = -1; + i = -(i); + } + while (--i >= 0) { + prev = x; + x = (x << SHIFT) + v->ob_digit[i]; + if ((x >> SHIFT) != prev) + goto overflow; + } + /* Haven't lost any bits, but if the sign bit is set we're in + * trouble *unless* this is the min negative number. So, + * trouble iff sign bit set && (positive || some bit set other + * than the sign bit). + */ + if ((Py_ssize_t)x < 0 && (sign > 0 || (x << 1) != 0)) + goto overflow; + return (Py_ssize_t)x * sign; + + overflow: + PyErr_SetString(PyExc_OverflowError, + "long int too large to convert to int"); + return -1; +} + /* Get a C unsigned long int from a long int object. Returns -1 and sets an error condition if overflow occurs. */ @@ -243,7 +295,7 @@ { register PyLongObject *v; unsigned long x, prev; - int i; + Py_ssize_t i; if (vv == NULL || !PyLong_Check(vv)) { if (vv != NULL && PyInt_Check(vv)) { @@ -286,7 +338,8 @@ { register PyLongObject *v; unsigned long x; - int i, sign; + Py_ssize_t i; + int sign; if (vv == NULL || !PyLong_Check(vv)) { if (vv != NULL && PyInt_Check(vv)) @@ -324,7 +377,7 @@ { PyLongObject *v = (PyLongObject *)vv; size_t result = 0; - int ndigits; + Py_ssize_t ndigits; assert(v != NULL); assert(PyLong_Check(v)); @@ -334,7 +387,7 @@ digit msd = v->ob_digit[ndigits - 1]; result = (ndigits - 1) * SHIFT; - if (result / SHIFT != (size_t)ndigits - 1) + if (result / SHIFT != ndigits - 1) goto Overflow; do { ++result; @@ -464,7 +517,7 @@ int little_endian, int is_signed) { int i; /* index into v->ob_digit */ - int ndigits; /* |v->ob_size| */ + Py_ssize_t ndigits; /* |v->ob_size| */ twodigits accum; /* sliding register */ unsigned int accumbits; /* # bits in accum */ int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */ @@ -612,7 +665,8 @@ PyLongObject *v; double x; const double multiplier = (double)(1L << SHIFT); - int i, sign; + Py_ssize_t i; + int sign; int nbitsneeded; if (vv == NULL || !PyLong_Check(vv)) { @@ -769,6 +823,30 @@ SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0); } +/* Create a new long int object from a C Py_ssize_t. */ + +PyObject * +_PyLong_FromSsize_t(Py_ssize_t ival) +{ + Py_ssize_t bytes = ival; + int one = 1; + return _PyLong_FromByteArray( + (unsigned char *)&bytes, + SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0); +} + +/* Create a new long int object from a C size_t. */ + +PyObject * +_PyLong_FromSize_t(size_t ival) +{ + size_t bytes = ival; + int one = 1; + return _PyLong_FromByteArray( + (unsigned char *)&bytes, + SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0); +} + /* Get a C PY_LONG_LONG int from a long int object. Return -1 and set an error if overflow occurs. */ @@ -856,7 +934,8 @@ { register PyLongObject *v; unsigned PY_LONG_LONG x; - int i, sign; + Py_ssize_t i; + int sign; if (vv == NULL || !PyLong_Check(vv)) { PyErr_BadInternalCall(); @@ -977,10 +1056,10 @@ static PyLongObject * muladd1(PyLongObject *a, wdigit n, wdigit extra) { - int size_a = ABS(a->ob_size); + Py_ssize_t size_a = ABS(a->ob_size); PyLongObject *z = _PyLong_New(size_a+1); twodigits carry = extra; - int i; + Py_ssize_t i; if (z == NULL) return NULL; @@ -1023,7 +1102,7 @@ static PyLongObject * divrem1(PyLongObject *a, digit n, digit *prem) { - const int size = ABS(a->ob_size); + const Py_ssize_t size = ABS(a->ob_size); PyLongObject *z; assert(n > 0 && n <= MASK); @@ -1043,8 +1122,8 @@ { register PyLongObject *a = (PyLongObject *)aa; PyStringObject *str; - int i; - const int size_a = ABS(a->ob_size); + Py_ssize_t i; + const Py_ssize_t size_a = ABS(a->ob_size); char *p; int bits; char sign = '\0'; @@ -1104,7 +1183,7 @@ /* Not 0, and base not a power of 2. Divide repeatedly by base, but for speed use the highest power of base that fits in a digit. */ - int size = size_a; + Py_ssize_t size = size_a; digit *pin = a->ob_digit; PyLongObject *scratch; /* powbasw <- largest power of base that fits in a digit. */ @@ -1197,7 +1276,7 @@ char *p = *str; char *start = p; int bits_per_char; - int n; + Py_ssize_t n; PyLongObject *z; twodigits accum; int bits_in_accum; @@ -1258,7 +1337,7 @@ bits_in_accum += bits_per_char; if (bits_in_accum >= SHIFT) { *pdigit++ = (digit)(accum & MASK); - assert(pdigit - z->ob_digit <= n); + assert(pdigit - z->ob_digit <= (int)n); accum >>= SHIFT; bits_in_accum -= SHIFT; assert(bits_in_accum < SHIFT); @@ -1267,7 +1346,7 @@ if (bits_in_accum) { assert(bits_in_accum <= SHIFT); *pdigit++ = (digit)accum; - assert(pdigit - z->ob_digit <= n); + assert(pdigit - z->ob_digit <= (int)n); } while (pdigit - z->ob_digit < n) *pdigit++ = 0; @@ -1384,7 +1463,7 @@ long_divrem(PyLongObject *a, PyLongObject *b, PyLongObject **pdiv, PyLongObject **prem) { - int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size); + Py_ssize_t size_a = ABS(a->ob_size), size_b = ABS(b->ob_size); PyLongObject *z; if (size_b == 0) { @@ -1430,12 +1509,12 @@ static PyLongObject * x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem) { - int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size); + Py_ssize_t size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size); digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1)); PyLongObject *v = mul1(v1, d); PyLongObject *w = mul1(w1, d); PyLongObject *a; - int j, k; + Py_ssize_t j, k; if (v == NULL || w == NULL) { Py_XDECREF(v); @@ -1605,7 +1684,7 @@ static PyLongObject * x_add(PyLongObject *a, PyLongObject *b) { - int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size); + Py_ssize_t size_a = ABS(a->ob_size), size_b = ABS(b->ob_size); PyLongObject *z; int i; digit carry = 0; @@ -1639,7 +1718,7 @@ static PyLongObject * x_sub(PyLongObject *a, PyLongObject *b) { - int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size); + Py_ssize_t size_a = ABS(a->ob_size), size_b = ABS(b->ob_size); PyLongObject *z; int i; int sign = 1; @@ -1749,9 +1828,9 @@ x_mul(PyLongObject *a, PyLongObject *b) { PyLongObject *z; - int size_a = ABS(a->ob_size); - int size_b = ABS(b->ob_size); - int i; + Py_ssize_t size_a = ABS(a->ob_size); + Py_ssize_t size_b = ABS(b->ob_size); + Py_ssize_t i; z = _PyLong_New(size_a + size_b); if (z == NULL) @@ -1840,8 +1919,8 @@ kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low) { PyLongObject *hi, *lo; - int size_lo, size_hi; - const int size_n = ABS(n->ob_size); + Py_ssize_t size_lo, size_hi; + const Py_ssize_t size_n = ABS(n->ob_size); size_lo = MIN(size_n, size); size_hi = size_n - size_lo; @@ -1870,8 +1949,8 @@ static PyLongObject * k_mul(PyLongObject *a, PyLongObject *b) { - int asize = ABS(a->ob_size); - int bsize = ABS(b->ob_size); + Py_ssize_t asize = ABS(a->ob_size); + Py_ssize_t bsize = ABS(b->ob_size); PyLongObject *ah = NULL; PyLongObject *al = NULL; PyLongObject *bh = NULL; @@ -1879,7 +1958,7 @@ PyLongObject *ret = NULL; PyLongObject *t1, *t2, *t3; int shift; /* the number of digits we split off */ - int i; + Py_ssize_t i; /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl @@ -2091,9 +2170,9 @@ static PyLongObject * k_lopsided_mul(PyLongObject *a, PyLongObject *b) { - const int asize = ABS(a->ob_size); - int bsize = ABS(b->ob_size); - int nbdone; /* # of b digits already multiplied */ + const Py_ssize_t asize = ABS(a->ob_size); + Py_ssize_t bsize = ABS(b->ob_size); + Py_ssize_t nbdone; /* # of b digits already multiplied */ PyLongObject *ret; PyLongObject *bslice = NULL; @@ -2346,7 +2425,7 @@ int negativeOutput = 0; /* if x<0 return negative output */ PyLongObject *z = NULL; /* accumulated result */ - int i, j, k; /* counters */ + Py_ssize_t i, j, k; /* counters */ PyLongObject *temp = NULL; /* 5-ary values. If the exponent is large enough, table is @@ -2590,7 +2669,7 @@ PyLongObject *a, *b; PyLongObject *z = NULL; long shiftby; - int newsize, wordshift, loshift, hishift, i, j; + Py_ssize_t newsize, wordshift, loshift, hishift, i, j; digit lomask, himask; CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); @@ -2657,7 +2736,7 @@ PyLongObject *a, *b; PyLongObject *z = NULL; long shiftby; - int oldsize, newsize, wordshift, remshift, i, j; + Py_ssize_t oldsize, newsize, wordshift, remshift, i, j; twodigits accum; CONVERT_BINOP(v, w, &a, &b); @@ -2716,7 +2795,7 @@ { digit maska, maskb; /* 0 or MASK */ int negz; - int size_a, size_b, size_z; + Py_ssize_t size_a, size_b, size_z; PyLongObject *z; int i; digit diga, digb; @@ -2958,7 +3037,7 @@ long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyLongObject *tmp, *new; - int i, n; + Py_ssize_t i, n; assert(PyType_IsSubtype(type, &PyLong_Type)); tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds); Modified: python/branches/ssize_t/Objects/object.c ============================================================================== --- python/branches/ssize_t/Objects/object.c (original) +++ python/branches/ssize_t/Objects/object.c Sat Dec 17 11:20:15 2005 @@ -170,7 +170,7 @@ } PyVarObject * -PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, int size) +PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) { if (op == NULL) return (PyVarObject *) PyErr_NoMemory(); @@ -192,7 +192,7 @@ } PyVarObject * -_PyObject_NewVar(PyTypeObject *tp, int nitems) +_PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems) { PyVarObject *op; const size_t size = _PyObject_VAR_SIZE(tp, nitems); Modified: python/branches/ssize_t/Objects/obmalloc.c ============================================================================== --- python/branches/ssize_t/Objects/obmalloc.c (original) +++ python/branches/ssize_t/Objects/obmalloc.c Sat Dec 17 11:20:15 2005 @@ -816,7 +816,7 @@ { void *bp; poolp pool; - uint size; + size_t size; if (p == NULL) return PyObject_Malloc(nbytes); @@ -1018,7 +1018,7 @@ if (p == NULL) return NULL; - write4(p, nbytes); + write4(p, (ulong)nbytes); p[4] = p[5] = p[6] = p[7] = FORBIDDENBYTE; if (nbytes > 0) @@ -1081,7 +1081,7 @@ if (q == NULL) return NULL; - write4(q, nbytes); + write4(q, (ulong)nbytes); assert(q[4] == FORBIDDENBYTE && q[5] == FORBIDDENBYTE && q[6] == FORBIDDENBYTE && Modified: python/branches/ssize_t/Objects/rangeobject.c ============================================================================== --- python/branches/ssize_t/Objects/rangeobject.c (original) +++ python/branches/ssize_t/Objects/rangeobject.c Sat Dec 17 11:20:15 2005 @@ -91,7 +91,7 @@ slightly faster than range() and more memory efficient."); static PyObject * -range_item(rangeobject *r, int i) +range_item(rangeobject *r, Py_ssize_t i) { if (i < 0 || i >= r->len) { PyErr_SetString(PyExc_IndexError, @@ -140,7 +140,7 @@ (inquiry)range_length, /* sq_length */ 0, /* sq_concat */ 0, /* sq_repeat */ - (intargfunc)range_item, /* sq_item */ + (ssizeargfunc)range_item, /* sq_item */ 0, /* sq_slice */ }; Modified: python/branches/ssize_t/Objects/sliceobject.c ============================================================================== --- python/branches/ssize_t/Objects/sliceobject.c (original) +++ python/branches/ssize_t/Objects/sliceobject.c Sat Dec 17 11:20:15 2005 @@ -80,9 +80,10 @@ } int -PySlice_GetIndices(PySliceObject *r, int length, - int *start, int *stop, int *step) +PySlice_GetIndices(PySliceObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step) { + /* XXX support long ints */ if (r->step == Py_None) { *step = 1; } else { @@ -110,12 +111,12 @@ } int -PySlice_GetIndicesEx(PySliceObject *r, int length, - int *start, int *stop, int *step, int *slicelength) +PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength) { /* this is harder to get right than you might think */ - int defstart, defstop; + Py_ssize_t defstart, defstop; if (r->step == Py_None) { *step = 1; @@ -230,7 +231,7 @@ static PyObject* slice_indices(PySliceObject* self, PyObject* len) { - int ilen, start, stop, step, slicelength; + Py_ssize_t ilen, start, stop, step, slicelength; ilen = PyInt_AsLong(len); Modified: python/branches/ssize_t/Objects/stringobject.c ============================================================================== --- python/branches/ssize_t/Objects/stringobject.c (original) +++ python/branches/ssize_t/Objects/stringobject.c Sat Dec 17 11:20:15 2005 @@ -49,7 +49,7 @@ parameter (for PyString_FromString()). */ PyObject * -PyString_FromStringAndSize(const char *str, int size) +PyString_FromStringAndSize(const char *str, Py_ssize_t size) { register PyStringObject *op; assert(size >= 0); @@ -154,7 +154,7 @@ PyString_FromFormatV(const char *format, va_list vargs) { va_list count; - int n = 0; + Py_ssize_t n = 0; const char* f; char *s; PyObject* string; @@ -235,7 +235,8 @@ for (f = format; *f; f++) { if (*f == '%') { const char* p = f++; - int i, longflag = 0; + Py_ssize_t i; + int longflag = 0; /* parse the width.precision part (we're only interested in the precision value, if any) */ n = 0; @@ -519,16 +520,16 @@ specified encoding. */ PyObject *PyString_DecodeEscape(const char *s, - int len, + Py_ssize_t len, const char *errors, - int unicode, + Py_ssize_t unicode, const char *recode_encoding) { int c; char *p, *buf; const char *end; PyObject *v; - int newlen = recode_encoding ? 4*len:len; + Py_ssize_t newlen = recode_encoding ? 4*len:len; v = PyString_FromStringAndSize((char *)NULL, newlen); if (v == NULL) return NULL; @@ -885,7 +886,7 @@ static PyObject * string_concat(register PyStringObject *a, register PyObject *bb) { - register unsigned int size; + register size_t size; register PyStringObject *op; if (!PyString_Check(bb)) { #ifdef Py_USING_UNICODE @@ -909,6 +910,7 @@ return (PyObject *)a; } size = a->ob_size + b->ob_size; + /* XXX check overflow */ /* Inline PyObject_NewVar */ op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size); if (op == NULL) @@ -924,11 +926,11 @@ } static PyObject * -string_repeat(register PyStringObject *a, register int n) +string_repeat(register PyStringObject *a, register Py_ssize_t n) { register int i; register int j; - register int size; + register Py_ssize_t size; register PyStringObject *op; size_t nbytes; if (n < 0) @@ -980,7 +982,8 @@ /* String slice a[i:j] consists of characters a[i] ... a[j-1] */ static PyObject * -string_slice(register PyStringObject *a, register int i, register int j) +string_slice(register PyStringObject *a, register Py_ssize_t i, + register Py_ssize_t j) /* j -- may be negative! */ { if (i < 0) @@ -1047,7 +1050,7 @@ } static PyObject * -string_item(PyStringObject *a, register int i) +string_item(PyStringObject *a, register Py_ssize_t i) { PyObject *v; char *pchar; @@ -1173,7 +1176,7 @@ return string_item(self,i); } else if (PyLong_Check(item)) { - long i = PyLong_AsLong(item); + Py_ssize_t i = PyLong_AsSsize_t(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) @@ -1181,7 +1184,7 @@ return string_item(self,i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; char* source_buf; char* result_buf; PyObject* result; @@ -1262,9 +1265,9 @@ static PySequenceMethods string_as_sequence = { (inquiry)string_length, /*sq_length*/ (binaryfunc)string_concat, /*sq_concat*/ - (intargfunc)string_repeat, /*sq_repeat*/ - (intargfunc)string_item, /*sq_item*/ - (intintargfunc)string_slice, /*sq_slice*/ + (ssizeargfunc)string_repeat, /*sq_repeat*/ + (ssizeargfunc)string_item, /*sq_item*/ + (ssizessizeargfunc)string_slice, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ (objobjproc)string_contains /*sq_contains*/ @@ -1734,6 +1737,7 @@ int n, i = 0, last = INT_MAX; PyObject *subobj; + /* XXX ssize_t i */ if (!PyArg_ParseTuple(args, "O|O&O&:find/rfind/index/rindex", &subobj, _PyEval_SliceIndex, &i, _PyEval_SliceIndex, &last)) return -2; @@ -3521,7 +3525,7 @@ */ int -_PyString_Resize(PyObject **pv, int newsize) +_PyString_Resize(PyObject **pv, Py_ssize_t newsize) { register PyObject *v; register PyStringObject *sv; @@ -3625,7 +3629,7 @@ (flags&F_ALT) ? "#" : "", prec, type); PyOS_ascii_formatd(buf, buflen, fmt, x); - return strlen(buf); + return (int)strlen(buf); } /* _PyString_FormatLong emulates the format codes d, u, o, x and X, and @@ -3832,7 +3836,7 @@ PyOS_snprintf(buf, buflen, fmt, -x); else PyOS_snprintf(buf, buflen, fmt, x); - return strlen(buf); + return (int)strlen(buf); } static int @@ -3865,7 +3869,8 @@ PyString_Format(PyObject *format, PyObject *args) { char *fmt, *res; - int fmtcnt, rescnt, reslen, arglen, argidx; + int arglen, argidx; + Py_ssize_t reslen, rescnt, fmtcnt; int args_owned = 0; PyObject *result, *orig_args; #ifdef Py_USING_UNICODE @@ -3895,23 +3900,23 @@ if (args->ob_type->tp_as_mapping && !PyTuple_Check(args) && !PyObject_TypeCheck(args, &PyBaseString_Type)) dict = args; - while (--fmtcnt >= 0) { + while (fmtcnt-- != 0) { if (*fmt != '%') { - if (--rescnt < 0) { + if (rescnt == 0) { rescnt = fmtcnt + 100; reslen += rescnt; if (_PyString_Resize(&result, reslen) < 0) return NULL; res = PyString_AS_STRING(result) + reslen - rescnt; - --rescnt; } + rescnt--; *res++ = *fmt++; } else { /* Got a format specifier */ int flags = 0; - int width = -1; + Py_ssize_t width = -1; int prec = -1; int c = '\0'; int fill; @@ -3930,7 +3935,7 @@ fmt++; if (*fmt == '(') { char *keystart; - int keylen; + Py_ssize_t keylen; PyObject *key; int pcount = 1; @@ -4187,7 +4192,7 @@ } if (width < len) width = len; - if (rescnt - (sign != 0) < width) { + if ((rescnt - (sign != 0)) < width) { reslen -= rescnt; rescnt = width + fmtcnt + 100; reslen += rescnt; Modified: python/branches/ssize_t/Objects/structseq.c ============================================================================== --- python/branches/ssize_t/Objects/structseq.c (original) +++ python/branches/ssize_t/Objects/structseq.c Sat Dec 17 11:20:15 2005 @@ -56,7 +56,7 @@ } static PyObject* -structseq_item(PyStructSequence *obj, int i) +structseq_item(PyStructSequence *obj, Py_ssize_t i) { if (i < 0 || i >= VISIBLE_SIZE(obj)) { PyErr_SetString(PyExc_IndexError, "tuple index out of range"); @@ -67,7 +67,7 @@ } static PyObject* -structseq_slice(PyStructSequence *obj, int low, int high) +structseq_slice(PyStructSequence *obj, Py_ssize_t low, Py_ssize_t high) { PyTupleObject *np; int i; @@ -200,7 +200,7 @@ } static PyObject * -structseq_repeat(PyStructSequence *obj, int n) +structseq_repeat(PyStructSequence *obj, Py_ssize_t n) { PyObject *tup, *result; tup = make_tuple(obj); @@ -286,9 +286,9 @@ static PySequenceMethods structseq_as_sequence = { (inquiry)structseq_length, (binaryfunc)structseq_concat, /* sq_concat */ - (intargfunc)structseq_repeat, /* sq_repeat */ - (intargfunc)structseq_item, /* sq_item */ - (intintargfunc)structseq_slice, /* sq_slice */ + (ssizeargfunc)structseq_repeat, /* sq_repeat */ + (ssizeargfunc)structseq_item, /* sq_item */ + (ssizessizeargfunc)structseq_slice, /* sq_slice */ 0, /* sq_ass_item */ 0, /* sq_ass_slice */ (objobjproc)structseq_contains, /* sq_contains */ Modified: python/branches/ssize_t/Objects/tupleobject.c ============================================================================== --- python/branches/ssize_t/Objects/tupleobject.c (original) +++ python/branches/ssize_t/Objects/tupleobject.c Sat Dec 17 11:20:15 2005 @@ -24,7 +24,7 @@ #endif PyObject * -PyTuple_New(register int size) +PyTuple_New(register Py_ssize_t size) { register PyTupleObject *op; int i; @@ -82,7 +82,7 @@ return (PyObject *) op; } -int +Py_ssize_t PyTuple_Size(register PyObject *op) { if (!PyTuple_Check(op)) { @@ -94,7 +94,7 @@ } PyObject * -PyTuple_GetItem(register PyObject *op, register int i) +PyTuple_GetItem(register PyObject *op, register Py_ssize_t i) { if (!PyTuple_Check(op)) { PyErr_BadInternalCall(); @@ -108,7 +108,7 @@ } int -PyTuple_SetItem(register PyObject *op, register int i, PyObject *newitem) +PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem) { register PyObject *olditem; register PyObject **p; @@ -286,7 +286,7 @@ return x; } -static int +static Py_ssize_t tuplelength(PyTupleObject *a) { return a->ob_size; @@ -304,7 +304,7 @@ } static PyObject * -tupleitem(register PyTupleObject *a, register int i) +tupleitem(register PyTupleObject *a, register Py_ssize_t i) { if (i < 0 || i >= a->ob_size) { PyErr_SetString(PyExc_IndexError, "tuple index out of range"); @@ -315,7 +315,8 @@ } static PyObject * -tupleslice(register PyTupleObject *a, register int ilow, register int ihigh) +tupleslice(register PyTupleObject *a, register Py_ssize_t ilow, + register Py_ssize_t ihigh) { register PyTupleObject *np; PyObject **src, **dest; @@ -346,7 +347,7 @@ } PyObject * -PyTuple_GetSlice(PyObject *op, int i, int j) +PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j) { if (op == NULL || !PyTuple_Check(op)) { PyErr_BadInternalCall(); @@ -395,7 +396,7 @@ } static PyObject * -tuplerepeat(PyTupleObject *a, int n) +tuplerepeat(PyTupleObject *a, Py_ssize_t n) { int i, j; int size; @@ -573,9 +574,9 @@ static PySequenceMethods tuple_as_sequence = { (inquiry)tuplelength, /* sq_length */ (binaryfunc)tupleconcat, /* sq_concat */ - (intargfunc)tuplerepeat, /* sq_repeat */ - (intargfunc)tupleitem, /* sq_item */ - (intintargfunc)tupleslice, /* sq_slice */ + (ssizeargfunc)tuplerepeat, /* sq_repeat */ + (ssizeargfunc)tupleitem, /* sq_item */ + (ssizessizeargfunc)tupleslice, /* sq_slice */ 0, /* sq_ass_item */ 0, /* sq_ass_slice */ (objobjproc)tuplecontains, /* sq_contains */ @@ -591,7 +592,7 @@ return tupleitem(self, i); } else if (PyLong_Check(item)) { - long i = PyLong_AsLong(item); + Py_ssize_t i = PyLong_AsSsize_t(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) @@ -599,7 +600,7 @@ return tupleitem(self, i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; PyObject* result; PyObject* it; PyObject **src, **dest; Modified: python/branches/ssize_t/Objects/typeobject.c ============================================================================== --- python/branches/ssize_t/Objects/typeobject.c (original) +++ python/branches/ssize_t/Objects/typeobject.c Sat Dec 17 11:20:15 2005 @@ -443,7 +443,7 @@ } PyObject * -PyType_GenericAlloc(PyTypeObject *type, int nitems) +PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) { PyObject *obj; const size_t size = _PyObject_VAR_SIZE(type, nitems+1); @@ -1529,7 +1529,7 @@ PyObject *tmp = slots; PyObject *o, *o1; int i; - intintargfunc copy = slots->ob_type->tp_as_sequence->sq_slice; + ssizessizeargfunc copy = slots->ob_type->tp_as_sequence->sq_slice; for (i = 0; i < nslots; i++) { if (PyUnicode_Check(o = PyTuple_GET_ITEM(tmp, i))) { if (tmp == slots) { @@ -3335,9 +3335,10 @@ } if (n == PyTuple_GET_SIZE(ob)) return 1; + /* XXX %zd? */ PyErr_Format( PyExc_TypeError, - "expected %d arguments, got %d", n, PyTuple_GET_SIZE(ob)); + "expected %d arguments, got %d", n, (int)PyTuple_GET_SIZE(ob)); return 0; } @@ -5286,7 +5287,9 @@ if (c != 0) return c; else - return a - b; + /* Cannot use a-b, as this gives off_t, + which may lose precision when converted to int. */ + return (a > b) ? 1 : (a < b) ? -1 : 0; } /* Initialize the slotdefs table by adding interned string objects for the Modified: python/branches/ssize_t/Objects/unicodeobject.c ============================================================================== --- python/branches/ssize_t/Objects/unicodeobject.c (original) +++ python/branches/ssize_t/Objects/unicodeobject.c Sat Dec 17 11:20:15 2005 @@ -119,7 +119,7 @@ static int unicode_resize(register PyUnicodeObject *unicode, - int length) + Py_ssize_t length) { void *oldstr; @@ -154,7 +154,8 @@ return -1; } unicode->str[length] = 0; - unicode->length = length; + assert(length < INT_MAX); + unicode->length = (int)length; reset: /* Reset the object caches */ @@ -176,7 +177,7 @@ */ static -PyUnicodeObject *_PyUnicode_New(int length) +PyUnicodeObject *_PyUnicode_New(Py_ssize_t length) { register PyUnicodeObject *unicode; @@ -225,7 +226,8 @@ */ unicode->str[0] = 0; unicode->str[length] = 0; - unicode->length = length; + assert(lengthlength = (int)length; unicode->hash = -1; unicode->defenc = NULL; return unicode; @@ -263,7 +265,7 @@ } } -int PyUnicode_Resize(PyObject **unicode, int length) +int PyUnicode_Resize(PyObject **unicode, Py_ssize_t length) { register PyUnicodeObject *v; @@ -303,7 +305,7 @@ PyUnicode_Resize(((PyObject **)(unicodevar)), length) PyObject *PyUnicode_FromUnicode(const Py_UNICODE *u, - int size) + Py_ssize_t size) { PyUnicodeObject *unicode; @@ -347,7 +349,7 @@ #ifdef HAVE_WCHAR_H PyObject *PyUnicode_FromWideChar(register const wchar_t *w, - int size) + Py_ssize_t size) { PyUnicodeObject *unicode; @@ -520,7 +522,7 @@ } PyObject *PyUnicode_Decode(const char *s, - int size, + Py_ssize_t size, const char *encoding, const char *errors) { @@ -588,7 +590,7 @@ } PyObject *PyUnicode_Encode(const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *encoding, const char *errors) { @@ -742,16 +744,17 @@ static int unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler, const char *encoding, const char *reason, - const char *input, int insize, int *startinpos, int *endinpos, PyObject **exceptionObject, const char **inptr, - PyObject **output, int *outpos, Py_UNICODE **outptr) + const char *input, Py_ssize_t insize, Py_ssize_t *startinpos, Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr, + PyObject **output, Py_ssize_t *outpos, Py_UNICODE **outptr) { static char *argparse = "O!i;decoding error handler must return (unicode, int) tuple"; PyObject *restuple = NULL; PyObject *repunicode = NULL; - int outsize = PyUnicode_GET_SIZE(*output); - int requiredsize; - int newpos; + Py_ssize_t outsize = PyUnicode_GET_SIZE(*output); + Py_ssize_t requiredsize; + int inewpos; + Py_ssize_t newpos; Py_UNICODE *repptr; int repsize; int res = -1; @@ -784,12 +787,15 @@ PyErr_Format(PyExc_TypeError, &argparse[4]); goto onError; } - if (!PyArg_ParseTuple(restuple, argparse, &PyUnicode_Type, &repunicode, &newpos)) + if (!PyArg_ParseTuple(restuple, argparse, &PyUnicode_Type, &repunicode, &inewpos)) goto onError; - if (newpos<0) - newpos = insize+newpos; + if (inewpos<0) + newpos = insize+inewpos; + else + newpos = inewpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", newpos); + /* XXX %zd? */ + PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", (int)newpos); goto onError; } @@ -887,13 +893,13 @@ } PyObject *PyUnicode_DecodeUTF7(const char *s, - int size, + Py_ssize_t size, const char *errors) { const char *starts = s; - int startinpos; - int endinpos; - int outpos; + Py_ssize_t startinpos; + Py_ssize_t endinpos; + Py_ssize_t outpos; const char *e; PyUnicodeObject *unicode; Py_UNICODE *p; @@ -1023,16 +1029,16 @@ PyObject *PyUnicode_EncodeUTF7(const Py_UNICODE *s, - int size, + Py_ssize_t size, int encodeSetO, int encodeWhiteSpace, const char *errors) { PyObject *v; /* It might be possible to tighten this worst case */ - unsigned int cbAllocated = 5 * size; + Py_ssize_t cbAllocated = 5 * size; int inShift = 0; - int i = 0; + Py_ssize_t i = 0; unsigned int bitsleft = 0; unsigned long charsleft = 0; char * out; @@ -1147,22 +1153,22 @@ }; PyObject *PyUnicode_DecodeUTF8(const char *s, - int size, + Py_ssize_t size, const char *errors) { return PyUnicode_DecodeUTF8Stateful(s, size, errors, NULL); } PyObject *PyUnicode_DecodeUTF8Stateful(const char *s, - int size, + Py_ssize_t size, const char *errors, - int *consumed) + Py_ssize_t *consumed) { const char *starts = s; int n; - int startinpos; - int endinpos; - int outpos; + Py_ssize_t startinpos; + Py_ssize_t endinpos; + Py_ssize_t outpos; const char *e; PyUnicodeObject *unicode; Py_UNICODE *p; @@ -1347,15 +1353,15 @@ */ PyObject * PyUnicode_EncodeUTF8(const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *errors) { #define MAX_SHORT_UNICHARS 300 /* largest size we'll do on the stack */ - int i; /* index into s of next input byte */ + Py_ssize_t i; /* index into s of next input byte */ PyObject *v; /* result string object */ char *p; /* next free byte in output buffer */ - int nallocated; /* number of result bytes allocated */ + Py_ssize_t nallocated; /* number of result bytes allocated */ int nneeded; /* number of result bytes needed */ char stackbuf[MAX_SHORT_UNICHARS * 4]; @@ -1455,7 +1461,7 @@ PyObject * PyUnicode_DecodeUTF16(const char *s, - int size, + Py_ssize_t size, const char *errors, int *byteorder) { @@ -1464,15 +1470,15 @@ PyObject * PyUnicode_DecodeUTF16Stateful(const char *s, - int size, + Py_ssize_t size, const char *errors, int *byteorder, - int *consumed) + Py_ssize_t *consumed) { const char *starts = s; - int startinpos; - int endinpos; - int outpos; + Py_ssize_t startinpos; + Py_ssize_t endinpos; + Py_ssize_t outpos; PyUnicodeObject *unicode; Py_UNICODE *p; const unsigned char *q, *e; @@ -1630,7 +1636,7 @@ PyObject * PyUnicode_EncodeUTF16(const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *errors, int byteorder) { @@ -1716,13 +1722,13 @@ static _PyUnicode_Name_CAPI *ucnhash_CAPI = NULL; PyObject *PyUnicode_DecodeUnicodeEscape(const char *s, - int size, + Py_ssize_t size, const char *errors) { const char *starts = s; - int startinpos; - int endinpos; - int outpos; + Py_ssize_t startinpos; + Py_ssize_t endinpos; + Py_ssize_t outpos; int i; PyUnicodeObject *v; Py_UNICODE *p; @@ -1896,7 +1902,7 @@ /* found a name. look it up in the unicode database */ message = "unknown Unicode character name"; s++; - if (ucnhash_CAPI->getcode(start, s-start-1, &chr)) + if (ucnhash_CAPI->getcode(start, (int)(s-start-1), &chr)) goto store; } } @@ -1962,12 +1968,12 @@ */ static const Py_UNICODE *findchar(const Py_UNICODE *s, - int size, + Py_ssize_t size, Py_UNICODE ch); static PyObject *unicodeescape_string(const Py_UNICODE *s, - int size, + Py_ssize_t size, int quotes) { PyObject *repr; @@ -2093,7 +2099,7 @@ } PyObject *PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s, - int size) + Py_ssize_t size) { return unicodeescape_string(s, size, 0); } @@ -2111,13 +2117,13 @@ /* --- Raw Unicode Escape Codec ------------------------------------------- */ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s, - int size, + Py_ssize_t size, const char *errors) { const char *starts = s; - int startinpos; - int endinpos; - int outpos; + Py_ssize_t startinpos; + Py_ssize_t endinpos; + Py_ssize_t outpos; PyUnicodeObject *v; Py_UNICODE *p; const char *end; @@ -2216,7 +2222,7 @@ } PyObject *PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, - int size) + Py_ssize_t size) { PyObject *repr; char *p; @@ -2284,13 +2290,13 @@ /* --- Unicode Internal Codec ------------------------------------------- */ PyObject *_PyUnicode_DecodeUnicodeInternal(const char *s, - int size, + Py_ssize_t size, const char *errors) { const char *starts = s; - int startinpos; - int endinpos; - int outpos; + Py_ssize_t startinpos; + Py_ssize_t endinpos; + Py_ssize_t outpos; Py_UNICODE unimax; PyUnicodeObject *v; Py_UNICODE *p; @@ -2359,7 +2365,7 @@ /* --- Latin-1 Codec ------------------------------------------------------ */ PyObject *PyUnicode_DecodeLatin1(const char *s, - int size, + Py_ssize_t size, const char *errors) { PyUnicodeObject *v; @@ -2389,8 +2395,8 @@ /* create or adjust a UnicodeEncodeError */ static void make_encode_exception(PyObject **exceptionObject, const char *encoding, - const Py_UNICODE *unicode, int size, - int startpos, int endpos, + const Py_UNICODE *unicode, Py_ssize_t size, + Py_ssize_t startpos, Py_ssize_t endpos, const char *reason) { if (*exceptionObject == NULL) { @@ -2414,8 +2420,8 @@ /* raises a UnicodeEncodeError */ static void raise_encode_exception(PyObject **exceptionObject, const char *encoding, - const Py_UNICODE *unicode, int size, - int startpos, int endpos, + const Py_UNICODE *unicode, Py_ssize_t size, + Py_ssize_t startpos, Py_ssize_t endpos, const char *reason) { make_encode_exception(exceptionObject, @@ -2431,9 +2437,9 @@ static PyObject *unicode_encode_call_errorhandler(const char *errors, PyObject **errorHandler, const char *encoding, const char *reason, - const Py_UNICODE *unicode, int size, PyObject **exceptionObject, - int startpos, int endpos, - int *newpos) + const Py_UNICODE *unicode, Py_ssize_t size, PyObject **exceptionObject, + Py_ssize_t startpos, Py_ssize_t endpos, + Py_ssize_t *newpos) { static char *argparse = "O!i;encoding error handler must return (unicode, int) tuple"; @@ -2468,7 +2474,8 @@ if (*newpos<0) *newpos = size+*newpos; if (*newpos<0 || *newpos>size) { - PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", *newpos); + /* XXX %zd? */ + PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", (int)*newpos); Py_DECREF(restuple); return NULL; } @@ -2478,7 +2485,7 @@ } static PyObject *unicode_encode_ucs1(const Py_UNICODE *p, - int size, + Py_ssize_t size, const char *errors, int limit) { @@ -2492,8 +2499,8 @@ /* pointer into the output */ char *str; /* current output position */ - int respos = 0; - int ressize; + Py_ssize_t respos = 0; + Py_ssize_t ressize; char *encoding = (limit == 256) ? "latin-1" : "ascii"; char *reason = (limit == 256) ? "ordinal not in range(256)" : "ordinal not in range(128)"; PyObject *errorHandler = NULL; @@ -2522,12 +2529,12 @@ ++p; } else { - int unicodepos = p-startp; - int requiredsize; + Py_ssize_t unicodepos = p-startp; + Py_ssize_t requiredsize; PyObject *repunicode; - int repsize; - int newpos; - int respos; + Py_ssize_t repsize; + Py_ssize_t newpos; + Py_ssize_t respos; Py_UNICODE *uni2; /* startpos for collecting unencodable chars */ const Py_UNICODE *collstart = p; @@ -2653,7 +2660,7 @@ } PyObject *PyUnicode_EncodeLatin1(const Py_UNICODE *p, - int size, + Py_ssize_t size, const char *errors) { return unicode_encode_ucs1(p, size, errors, 256); @@ -2673,15 +2680,15 @@ /* --- 7-bit ASCII Codec -------------------------------------------------- */ PyObject *PyUnicode_DecodeASCII(const char *s, - int size, + Py_ssize_t size, const char *errors) { const char *starts = s; PyUnicodeObject *v; Py_UNICODE *p; - int startinpos; - int endinpos; - int outpos; + Py_ssize_t startinpos; + Py_ssize_t endinpos; + Py_ssize_t outpos; const char *e; PyObject *errorHandler = NULL; PyObject *exc = NULL; @@ -2732,7 +2739,7 @@ } PyObject *PyUnicode_EncodeASCII(const Py_UNICODE *p, - int size, + Py_ssize_t size, const char *errors) { return unicode_encode_ucs1(p, size, errors, 128); @@ -2754,14 +2761,16 @@ /* --- MBCS codecs for Windows -------------------------------------------- */ PyObject *PyUnicode_DecodeMBCS(const char *s, - int size, + Py_ssize_t size, const char *errors) { PyUnicodeObject *v; Py_UNICODE *p; + DWORD usize; /* First get the size of the result */ - DWORD usize = MultiByteToWideChar(CP_ACP, 0, s, size, NULL, 0); + assert(size < INT_MAX); + usize = MultiByteToWideChar(CP_ACP, 0, s, (int)size, NULL, 0); if (size > 0 && usize==0) return PyErr_SetFromWindowsErrWithFilename(0, NULL); @@ -2771,7 +2780,7 @@ if (usize == 0) return (PyObject *)v; p = PyUnicode_AS_UNICODE(v); - if (0 == MultiByteToWideChar(CP_ACP, 0, s, size, p, usize)) { + if (0 == MultiByteToWideChar(CP_ACP, 0, s, (int)size, p, usize)) { Py_DECREF(v); return PyErr_SetFromWindowsErrWithFilename(0, NULL); } @@ -2780,7 +2789,7 @@ } PyObject *PyUnicode_EncodeMBCS(const Py_UNICODE *p, - int size, + Py_ssize_t size, const char *errors) { PyObject *repr; @@ -2792,7 +2801,8 @@ return PyString_FromString(""); /* First get the size of the result */ - mbcssize = WideCharToMultiByte(CP_ACP, 0, p, size, NULL, 0, NULL, NULL); + assert(sizesize) { - PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", *newpos); + /* XXX %zd? */ + PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", (int)*newpos); Py_DECREF(restuple); return NULL; } @@ -3485,7 +3500,7 @@ } PyObject *PyUnicode_TranslateCharmap(const Py_UNICODE *p, - int size, + Py_ssize_t size, PyObject *mapping, const char *errors) { @@ -3533,7 +3548,7 @@ else { /* untranslatable character */ PyObject *repunicode = NULL; /* initialize to prevent gcc warning */ int repsize; - int newpos; + Py_ssize_t newpos; Py_UNICODE *uni2; /* startpos for collecting untranslatable chars */ const Py_UNICODE *collstart = p; @@ -3650,7 +3665,7 @@ /* --- Decimal Encoder ---------------------------------------------------- */ int PyUnicode_EncodeDecimal(Py_UNICODE *s, - int length, + Py_ssize_t length, char *output, const char *errors) { @@ -3675,7 +3690,7 @@ int decimal; PyObject *repunicode; int repsize; - int newpos; + Py_ssize_t newpos; Py_UNICODE *uni2; Py_UNICODE *collstart; Py_UNICODE *collend; @@ -3965,7 +3980,7 @@ static const Py_UNICODE *findchar(const Py_UNICODE *s, - int size, + Py_ssize_t size, Py_UNICODE ch) { /* like wcschr, but doesn't stop at NULL characters */ @@ -5270,7 +5285,7 @@ } static PyObject * -unicode_getitem(PyUnicodeObject *self, int index) +unicode_getitem(PyUnicodeObject *self, Py_ssize_t index) { if (index < 0 || index >= self->length) { PyErr_SetString(PyExc_IndexError, "string index out of range"); @@ -5849,7 +5864,7 @@ static PyObject* -unicode_repeat(PyUnicodeObject *str, int len) +unicode_repeat(PyUnicodeObject *str, Py_ssize_t len) { PyUnicodeObject *u; Py_UNICODE *p; @@ -6439,9 +6454,9 @@ static PySequenceMethods unicode_as_sequence = { (inquiry) unicode_length, /* sq_length */ (binaryfunc) PyUnicode_Concat, /* sq_concat */ - (intargfunc) unicode_repeat, /* sq_repeat */ - (intargfunc) unicode_getitem, /* sq_item */ - (intintargfunc) unicode_slice, /* sq_slice */ + (ssizeargfunc) unicode_repeat, /* sq_repeat */ + (ssizeargfunc) unicode_getitem, /* sq_item */ + (ssizessizeargfunc) unicode_slice, /* sq_slice */ 0, /* sq_ass_item */ 0, /* sq_ass_slice */ (objobjproc)PyUnicode_Contains, /*sq_contains*/ @@ -6456,14 +6471,14 @@ i += PyString_GET_SIZE(self); return unicode_getitem(self, i); } else if (PyLong_Check(item)) { - long i = PyLong_AsLong(item); + Py_ssize_t i = PyLong_AsSsize_t(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) i += PyString_GET_SIZE(self); return unicode_getitem(self, i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; Py_UNICODE* source_buf; Py_UNICODE* result_buf; PyObject* result; @@ -6867,7 +6882,7 @@ fmt++; if (*fmt == '(') { Py_UNICODE *keystart; - int keylen; + Py_ssize_t keylen; PyObject *key; int pcount = 1; Modified: python/branches/ssize_t/Objects/weakrefobject.c ============================================================================== --- python/branches/ssize_t/Objects/weakrefobject.c (original) +++ python/branches/ssize_t/Objects/weakrefobject.c Sat Dec 17 11:20:15 2005 @@ -520,7 +520,7 @@ /* sequence slots */ static PyObject * -proxy_slice(PyWeakReference *proxy, int i, int j) +proxy_slice(PyWeakReference *proxy, Py_ssize_t i, Py_ssize_t j) { if (!proxy_checkref(proxy)) return NULL; @@ -528,7 +528,7 @@ } static int -proxy_ass_slice(PyWeakReference *proxy, int i, int j, PyObject *value) +proxy_ass_slice(PyWeakReference *proxy, Py_ssize_t i, Py_ssize_t j, PyObject *value) { if (!proxy_checkref(proxy)) return -1; @@ -629,9 +629,9 @@ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ - (intintargfunc)proxy_slice, /*sq_slice*/ + (ssizessizeargfunc)proxy_slice, /*sq_slice*/ 0, /*sq_ass_item*/ - (intintobjargproc)proxy_ass_slice, /*sq_ass_slice*/ + (ssizessizeobjargproc)proxy_ass_slice, /*sq_ass_slice*/ (objobjproc)proxy_contains, /* sq_contains */ }; Modified: python/branches/ssize_t/PC/getpathp.c ============================================================================== --- python/branches/ssize_t/PC/getpathp.c (original) +++ python/branches/ssize_t/PC/getpathp.c Sat Dec 17 11:20:15 2005 @@ -169,7 +169,8 @@ static int gotlandmark(char *landmark) { - int n, ok; + int ok; + Py_ssize_t n; n = strlen(prefix); join(prefix, landmark); @@ -302,10 +303,11 @@ dataSize--; } if (ppPaths[index]) { - int len = _tcslen(ppPaths[index]); + Py_ssize_t len = _tcslen(ppPaths[index]); _tcsncpy(szCur, ppPaths[index], len); szCur += len; - dataSize -= len; + assert(dataSize > len); + dataSize -= (int)len; } } if (skipcore) @@ -632,7 +634,7 @@ char lookBuf[MAXPATHLEN+1]; char *look = buf - 1; /* 'buf' is at the end of the buffer */ while (1) { - int nchars; + Py_ssize_t nchars; char *lookEnd = look; /* 'look' will end up one character before the start of the path in question - even if this Modified: python/branches/ssize_t/PC/import_nt.c ============================================================================== --- python/branches/ssize_t/PC/import_nt.c (original) +++ python/branches/ssize_t/PC/import_nt.c Sat Dec 17 11:20:15 2005 @@ -18,7 +18,7 @@ FILE *PyWin_FindRegisteredModule(const char *moduleName, struct filedescr **ppFileDesc, char *pathBuf, - int pathLen) + Py_ssize_t pathLen) { char *moduleKey; const char keyPrefix[] = "Software\\Python\\PythonCore\\"; @@ -53,13 +53,14 @@ "Software\\Python\\PythonCore\\%s\\Modules\\%s%s", PyWin_DLLVersionString, moduleName, debugString); - modNameSize = pathLen; + assert(pathLen < INT_MAX); + modNameSize = (int)pathLen; regStat = RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize); if (regStat != ERROR_SUCCESS) { /* No user setting - lookup in machine settings */ keyBase = HKEY_LOCAL_MACHINE; /* be anal - failure may have reset size param */ - modNameSize = pathLen; + modNameSize = (int)pathLen; regStat = RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize); Modified: python/branches/ssize_t/Parser/parsetok.c ============================================================================== --- python/branches/ssize_t/Parser/parsetok.c (original) +++ python/branches/ssize_t/Parser/parsetok.c Sat Dec 17 11:20:15 2005 @@ -185,7 +185,8 @@ if (tok->lineno <= 1 && tok->done == E_EOF) err_ret->error = E_EOF; err_ret->lineno = tok->lineno; - err_ret->offset = tok->cur - tok->buf; + assert(tok->cur - tok->buf < INT_MAX); + err_ret->offset = (int)(tok->cur - tok->buf); if (tok->buf != NULL) { size_t len = tok->inp - tok->buf; err_ret->text = (char *) PyObject_MALLOC(len + 1); Modified: python/branches/ssize_t/Parser/tokenizer.c ============================================================================== --- python/branches/ssize_t/Parser/tokenizer.c (original) +++ python/branches/ssize_t/Parser/tokenizer.c Sat Dec 17 11:20:15 2005 @@ -170,7 +170,7 @@ } static char * -new_string(const char *s, int len) +new_string(const char *s, Py_ssize_t len) { char* result = PyMem_NEW(char, len + 1); if (result != NULL) { @@ -206,9 +206,9 @@ /* Return the coding spec in S, or NULL if none is found. */ static char * -get_coding_spec(const char *s, int size) +get_coding_spec(const char *s, Py_ssize_t size) { - int i; + Py_ssize_t i; /* Coding spec must be in a comment, and that comment must be * the only statement on the source code line. */ for (i = 0; i < size - 6; i++) { @@ -253,7 +253,7 @@ Return 1 on success, 0 on failure. */ static int -check_coding_spec(const char* line, int size, struct tok_state *tok, +check_coding_spec(const char* line, Py_ssize_t size, struct tok_state *tok, int set_readline(struct tok_state *, const char *)) { char * cs; @@ -814,7 +814,7 @@ } else { int done = 0; - int cur = 0; + Py_ssize_t cur = 0; char *pt; if (tok->start == NULL) { if (tok->buf == NULL) { @@ -848,10 +848,10 @@ tok->lineno++; /* Read until '\n' or EOF */ while (!done) { - int curstart = tok->start == NULL ? -1 : - tok->start - tok->buf; - int curvalid = tok->inp - tok->buf; - int newsize = curvalid + BUFSIZ; + Py_ssize_t curstart = tok->start == NULL ? -1 : + tok->start - tok->buf; + Py_ssize_t curvalid = tok->inp - tok->buf; + Py_ssize_t newsize = curvalid + BUFSIZ; char *newbuf = tok->buf; PyMem_RESIZE(newbuf, char, newsize); if (newbuf == NULL) { @@ -1384,7 +1384,7 @@ letter_quote: /* String */ if (c == '\'' || c == '"') { - int quote2 = tok->cur - tok->start + 1; + Py_ssize_t quote2 = tok->cur - tok->start + 1; int quote = c; int triple = 0; int tripcount = 0; Modified: python/branches/ssize_t/Python/ceval.c ============================================================================== --- python/branches/ssize_t/Python/ceval.c (original) +++ python/branches/ssize_t/Python/ceval.c Sat Dec 17 11:20:15 2005 @@ -599,7 +599,7 @@ /* Code access macros */ -#define INSTR_OFFSET() (next_instr - first_instr) +#define INSTR_OFFSET() ((int)(next_instr - first_instr)) #define NEXTOP() (*next_instr++) #define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]) #define PEEKARG() ((next_instr[2]<<8) + next_instr[1]) @@ -637,7 +637,9 @@ /* Stack manipulation macros */ -#define STACK_LEVEL() (stack_pointer - f->f_valuestack) +/* The stack can grow at most MAXINT deep, as co_nlocals and + co_stacksize are ints. */ +#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack)) #define EMPTY() (STACK_LEVEL() == 0) #define TOP() (stack_pointer[-1]) #define SECOND() (stack_pointer[-2]) @@ -3856,7 +3858,7 @@ called by the SLICE opcode with v and/or w equal to NULL. */ int -_PyEval_SliceIndex(PyObject *v, int *pi) +_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) { if (v != NULL) { long x; @@ -3905,6 +3907,7 @@ return 0; } /* Truncate -- very long indices are truncated anyway */ + /* XXX truncate by ssize maximum */ if (x > INT_MAX) x = INT_MAX; else if (x < -INT_MAX) Modified: python/branches/ssize_t/Python/codecs.c ============================================================================== --- python/branches/ssize_t/Python/codecs.c (original) +++ python/branches/ssize_t/Python/codecs.c Sat Dec 17 11:20:15 2005 @@ -460,7 +460,7 @@ #ifdef Py_USING_UNICODE PyObject *PyCodec_IgnoreErrors(PyObject *exc) { - int end; + Py_ssize_t end; if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { if (PyUnicodeEncodeError_GetEnd(exc, &end)) return NULL; @@ -485,9 +485,9 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) { PyObject *restuple; - int start; - int end; - int i; + Py_ssize_t start; + Py_ssize_t end; + Py_ssize_t i; if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { PyObject *res; @@ -540,8 +540,8 @@ if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { PyObject *restuple; PyObject *object; - int start; - int end; + Py_ssize_t start; + Py_ssize_t end; PyObject *res; Py_UNICODE *p; Py_UNICODE *startp; @@ -652,8 +652,8 @@ if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { PyObject *restuple; PyObject *object; - int start; - int end; + Py_ssize_t start; + Py_ssize_t end; PyObject *res; Py_UNICODE *p; Py_UNICODE *startp; Modified: python/branches/ssize_t/Python/exceptions.c ============================================================================== --- python/branches/ssize_t/Python/exceptions.c (original) +++ python/branches/ssize_t/Python/exceptions.c Sat Dec 17 11:20:15 2005 @@ -910,27 +910,30 @@ #ifdef Py_USING_UNICODE static -int get_int(PyObject *exc, const char *name, int *value) +int get_int(PyObject *exc, const char *name, Py_ssize_t *value) { PyObject *attr = PyObject_GetAttrString(exc, (char *)name); if (!attr) return -1; - if (!PyInt_Check(attr)) { + if (PyInt_Check(attr)) { + *value = PyInt_AS_LONG(attr); + } else if (PyLong_Check(attr)) { + *value = (size_t)PyLong_AsLongLong(attr); /* XXX overflow?*/ + } else { PyErr_Format(PyExc_TypeError, "%.200s attribute must be int", name); Py_DECREF(attr); return -1; } - *value = PyInt_AS_LONG(attr); Py_DECREF(attr); return 0; } static -int set_int(PyObject *exc, const char *name, int value) +int set_ssize_t(PyObject *exc, const char *name, Py_ssize_t value) { - PyObject *obj = PyInt_FromLong(value); + PyObject *obj = PyInt_FromSsize_t(value); int result; if (!obj) @@ -940,7 +943,6 @@ return result; } - static PyObject *get_string(PyObject *exc, const char *name) { @@ -1011,16 +1013,16 @@ return get_unicode(exc, "object"); } -int PyUnicodeEncodeError_GetStart(PyObject *exc, int *start) +int PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start) { if (!get_int(exc, "start", start)) { PyObject *object = PyUnicodeEncodeError_GetObject(exc); - int size; + Py_ssize_t size; if (!object) return -1; size = PyUnicode_GET_SIZE(object); if (*start<0) - *start = 0; + *start = 0; /*XXX check for values <0*/ if (*start>=size) *start = size-1; Py_DECREF(object); @@ -1030,11 +1032,11 @@ } -int PyUnicodeDecodeError_GetStart(PyObject *exc, int *start) +int PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start) { if (!get_int(exc, "start", start)) { PyObject *object = PyUnicodeDecodeError_GetObject(exc); - int size; + Py_ssize_t size; if (!object) return -1; size = PyString_GET_SIZE(object); @@ -1049,35 +1051,35 @@ } -int PyUnicodeTranslateError_GetStart(PyObject *exc, int *start) +int PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start) { return PyUnicodeEncodeError_GetStart(exc, start); } -int PyUnicodeEncodeError_SetStart(PyObject *exc, int start) +int PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start) { - return set_int(exc, "start", start); + return set_ssize_t(exc, "start", start); } -int PyUnicodeDecodeError_SetStart(PyObject *exc, int start) +int PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start) { - return set_int(exc, "start", start); + return set_ssize_t(exc, "start", start); } -int PyUnicodeTranslateError_SetStart(PyObject *exc, int start) +int PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start) { - return set_int(exc, "start", start); + return set_ssize_t(exc, "start", start); } -int PyUnicodeEncodeError_GetEnd(PyObject *exc, int *end) +int PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end) { if (!get_int(exc, "end", end)) { PyObject *object = PyUnicodeEncodeError_GetObject(exc); - int size; + Py_ssize_t size; if (!object) return -1; size = PyUnicode_GET_SIZE(object); @@ -1092,11 +1094,11 @@ } -int PyUnicodeDecodeError_GetEnd(PyObject *exc, int *end) +int PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end) { if (!get_int(exc, "end", end)) { PyObject *object = PyUnicodeDecodeError_GetObject(exc); - int size; + Py_ssize_t size; if (!object) return -1; size = PyString_GET_SIZE(object); @@ -1111,27 +1113,27 @@ } -int PyUnicodeTranslateError_GetEnd(PyObject *exc, int *start) +int PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start) { return PyUnicodeEncodeError_GetEnd(exc, start); } -int PyUnicodeEncodeError_SetEnd(PyObject *exc, int end) +int PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end) { - return set_int(exc, "end", end); + return set_ssize_t(exc, "end", end); } -int PyUnicodeDecodeError_SetEnd(PyObject *exc, int end) +int PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end) { - return set_int(exc, "end", end); + return set_ssize_t(exc, "end", end); } -int PyUnicodeTranslateError_SetEnd(PyObject *exc, int end) +int PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end) { - return set_int(exc, "end", end); + return set_ssize_t(exc, "end", end); } @@ -1229,8 +1231,8 @@ { PyObject *encodingObj = NULL; PyObject *objectObj = NULL; - int start; - int end; + Py_ssize_t start; + Py_ssize_t end; PyObject *reasonObj = NULL; char buffer[1000]; PyObject *result = NULL; @@ -1270,11 +1272,12 @@ ); } else { + /* XXX %zd? */ PyOS_snprintf(buffer, sizeof(buffer), "'%.400s' codec can't encode characters in position %d-%d: %.400s", PyString_AS_STRING(encodingObj), - start, - end-1, + (int)start, + (int)(end-1), PyString_AS_STRING(reasonObj) ); } @@ -1295,8 +1298,8 @@ PyObject * PyUnicodeEncodeError_Create( - const char *encoding, const Py_UNICODE *object, int length, - int start, int end, const char *reason) + const char *encoding, const Py_UNICODE *object, Py_ssize_t length, + Py_ssize_t start, Py_ssize_t end, const char *reason) { return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#iis", encoding, object, length, start, end, reason); @@ -1314,8 +1317,8 @@ { PyObject *encodingObj = NULL; PyObject *objectObj = NULL; - int start; - int end; + Py_ssize_t start; + Py_ssize_t end; PyObject *reasonObj = NULL; char buffer[1000]; PyObject *result = NULL; @@ -1338,20 +1341,22 @@ goto error; if (end==start+1) { + /* XXX %zd? */ PyOS_snprintf(buffer, sizeof(buffer), "'%.400s' codec can't decode byte 0x%02x in position %d: %.400s", PyString_AS_STRING(encodingObj), ((int)PyString_AS_STRING(objectObj)[start])&0xff, - start, + (int)start, PyString_AS_STRING(reasonObj) ); } else { + /* XXX %zd? */ PyOS_snprintf(buffer, sizeof(buffer), "'%.400s' codec can't decode bytes in position %d-%d: %.400s", PyString_AS_STRING(encodingObj), - start, - end-1, + (int)start, + (int)(end-1), PyString_AS_STRING(reasonObj) ); } @@ -1372,11 +1377,14 @@ PyObject * PyUnicodeDecodeError_Create( - const char *encoding, const char *object, int length, - int start, int end, const char *reason) + const char *encoding, const char *object, Py_ssize_t length, + Py_ssize_t start, Py_ssize_t end, const char *reason) { + assert(length < INT_MAX); + assert(start < INT_MAX); + assert(end < INT_MAX); return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#iis", - encoding, object, length, start, end, reason); + encoding, object, (int)length, (int)start, (int)end, reason); } @@ -1427,8 +1435,8 @@ UnicodeTranslateError__str__(PyObject *self, PyObject *arg) { PyObject *objectObj = NULL; - int start; - int end; + Py_ssize_t start; + Py_ssize_t end; PyObject *reasonObj = NULL; char buffer[1000]; PyObject *result = NULL; @@ -1450,6 +1458,7 @@ if (end==start+1) { int badchar = (int)PyUnicode_AS_UNICODE(objectObj)[start]; char *format; + /* XXX %zd? */ if (badchar <= 0xff) format = "can't translate character u'\\x%02x' in position %d: %.400s"; else if (badchar <= 0xffff) @@ -1459,15 +1468,16 @@ PyOS_snprintf(buffer, sizeof(buffer), format, badchar, - start, + (int)start, PyString_AS_STRING(reasonObj) ); } else { + /* XXX %zd? */ PyOS_snprintf(buffer, sizeof(buffer), "can't translate characters in position %d-%d: %.400s", - start, - end-1, + (int)start, + (int)(end-1), PyString_AS_STRING(reasonObj) ); } @@ -1487,8 +1497,8 @@ PyObject * PyUnicodeTranslateError_Create( - const Py_UNICODE *object, int length, - int start, int end, const char *reason) + const Py_UNICODE *object, Py_ssize_t length, + Py_ssize_t start, Py_ssize_t end, const char *reason) { return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#iis", object, length, start, end, reason); @@ -1749,7 +1759,7 @@ _PyExc_Init(void) { char *modulename = "exceptions"; - int modnamesz = strlen(modulename); + Py_ssize_t modnamesz = strlen(modulename); int i; PyObject *me, *mydict, *bltinmod, *bdict, *doc, *args; Modified: python/branches/ssize_t/Python/getargs.c ============================================================================== --- python/branches/ssize_t/Python/getargs.c (original) +++ python/branches/ssize_t/Python/getargs.c Sat Dec 17 11:20:15 2005 @@ -15,21 +15,24 @@ int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, const char *, const char **, va_list); +#define FLAG_COMPAT 1 +#define FLAG_SIZE_T 2 + /* Forward */ static int vgetargs1(PyObject *, const char *, va_list *, int); static void seterror(int, const char *, int *, const char *, const char *); -static char *convertitem(PyObject *, const char **, va_list *, int *, char *, - size_t, PyObject **); -static char *converttuple(PyObject *, const char **, va_list *, +static char *convertitem(PyObject *, const char **, va_list *, int, int *, + char *, size_t, PyObject **); +static char *converttuple(PyObject *, const char **, va_list *, int, int *, char *, size_t, int, PyObject **); -static char *convertsimple(PyObject *, const char **, va_list *, char *, +static char *convertsimple(PyObject *, const char **, va_list *, int, char *, size_t, PyObject **); -static int convertbuffer(PyObject *, void **p, char **); +static Py_ssize_t convertbuffer(PyObject *, void **p, char **); static int vgetargskeywords(PyObject *, PyObject *, - const char *, const char **, va_list *); -static char *skipitem(const char **, va_list *); + const char *, const char **, va_list *, int); +static char *skipitem(const char **, va_list *, int); int PyArg_Parse(PyObject *args, const char *format, ...) @@ -38,7 +41,19 @@ va_list va; va_start(va, format); - retval = vgetargs1(args, format, &va, 1); + retval = vgetargs1(args, format, &va, FLAG_COMPAT); + va_end(va); + return retval; +} + +int +_PyArg_Parse_SizeT(PyObject *args, char *format, ...) +{ + int retval; + va_list va; + + va_start(va, format); + retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T); va_end(va); return retval; } @@ -56,6 +71,18 @@ return retval; } +int +_PyArg_ParseTuple_SizeT(PyObject *args, char *format, ...) +{ + int retval; + va_list va; + + va_start(va, format); + retval = vgetargs1(args, format, &va, FLAG_SIZE_T); + va_end(va); + return retval; +} + int PyArg_VaParse(PyObject *args, const char *format, va_list va) @@ -75,6 +102,24 @@ return vgetargs1(args, format, &lva, 0); } +int +_PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va) +{ + va_list lva; + +#ifdef VA_LIST_IS_ARRAY + memcpy(lva, va, sizeof(va_list)); +#else +#ifdef __va_copy + __va_copy(lva, va); +#else + lva = va; +#endif +#endif + + return vgetargs1(args, format, &lva, FLAG_SIZE_T); +} + /* Handle cleanup of allocated memory in case of exception */ @@ -120,7 +165,7 @@ static int -vgetargs1(PyObject *args, const char *format, va_list *p_va, int compat) +vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) { char msgbuf[256]; int levels[32]; @@ -134,8 +179,10 @@ int i, len; char *msg; PyObject *freelist = NULL; - + int compat = flags & FLAG_COMPAT; + assert(compat || (args != (PyObject*)NULL)); + flags = flags & ~FLAG_COMPAT; while (endfmt == 0) { int c = *format++; @@ -204,8 +251,8 @@ PyErr_SetString(PyExc_TypeError, msgbuf); return 0; } - msg = convertitem(args, &format, p_va, levels, msgbuf, - sizeof(msgbuf), &freelist); + msg = convertitem(args, &format, p_va, flags, levels, + msgbuf, sizeof(msgbuf), &freelist); if (msg == NULL) return cleanreturn(1, freelist); seterror(levels[0], msg, levels+1, fname, message); @@ -248,7 +295,8 @@ if (*format == '|') format++; msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, - levels, msgbuf, sizeof(msgbuf), &freelist); + flags, levels, msgbuf, + sizeof(msgbuf), &freelist); if (msg) { seterror(i+1, msg, levels, fname, message); return cleanreturn(0, freelist); @@ -325,8 +373,9 @@ */ static char * -converttuple(PyObject *arg, const char **p_format, va_list *p_va, int *levels, - char *msgbuf, size_t bufsize, int toplevel, PyObject **freelist) +converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, + int *levels, char *msgbuf, size_t bufsize, int toplevel, + PyObject **freelist) { int level = 0; int n = 0; @@ -375,8 +424,8 @@ char *msg; PyObject *item; item = PySequence_GetItem(arg, i); - msg = convertitem(item, &format, p_va, levels+1, msgbuf, - bufsize, freelist); + msg = convertitem(item, &format, p_va, flags, levels+1, + msgbuf, bufsize, freelist); /* PySequence_GetItem calls tp->sq_item, which INCREFs */ Py_XDECREF(item); if (msg != NULL) { @@ -393,22 +442,22 @@ /* Convert a single item. */ static char * -convertitem(PyObject *arg, const char **p_format, va_list *p_va, int *levels, - char *msgbuf, size_t bufsize, PyObject **freelist) +convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags, + int *levels, char *msgbuf, size_t bufsize, PyObject **freelist) { char *msg; const char *format = *p_format; if (*format == '(' /* ')' */) { format++; - msg = converttuple(arg, &format, p_va, levels, msgbuf, + msg = converttuple(arg, &format, p_va, flags, levels, msgbuf, bufsize, 0, freelist); if (msg == NULL) format++; } else { - msg = convertsimple(arg, &format, p_va, msgbuf, bufsize, - freelist); + msg = convertsimple(arg, &format, p_va, flags, + msgbuf, bufsize, freelist); if (msg != NULL) levels[0] = 0; } @@ -460,9 +509,16 @@ */ static char * -convertsimple(PyObject *arg, const char **p_format, va_list *p_va, +convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, char *msgbuf, size_t bufsize, PyObject **freelist) { + /* For # codes */ +#define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\ + if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \ + else q=va_arg(*p_va, int*); +#define STORE_SIZE(s) if (flags & FLAG_SIZE_T) *q2=s; else *q=s; +#define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q) + const char *format = *p_format; char c = *format++; #ifdef Py_USING_UNICODE @@ -544,7 +600,7 @@ *p = (unsigned short) ival; break; } - + case 'i': {/* signed int */ int *p = va_arg(*p_va, int *); long ival; @@ -582,6 +638,21 @@ break; } + case 'n': /* Py_ssize_t */ +#if SIZEOF_SIZE_T != SIZEOF_LONG + { + Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *); + Py_ssize_t ival; + if (float_argument_error(arg)) + return converterr("integer", arg, msgbuf, bufsize); + ival = PyInt_AsSsize_t(arg); + if (ival == -1 && PyErr_Occurred()) + return converterr("integer", arg, msgbuf, bufsize); + *p = ival; + break; + } +#endif + /* Fall through from 'L' to 'l' if Py_ssize_t is int */ case 'l': {/* long int */ long *p = va_arg(*p_va, long *); long ival; @@ -679,11 +750,11 @@ case 's': {/* string */ if (*format == '#') { void **p = (void **)va_arg(*p_va, char **); - int *q = va_arg(*p_va, int *); + FETCH_SIZE; if (PyString_Check(arg)) { *p = PyString_AS_STRING(arg); - *q = PyString_GET_SIZE(arg); + STORE_SIZE(PyString_GET_SIZE(arg)); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(arg)) { @@ -692,15 +763,15 @@ return converterr(CONV_UNICODE, arg, msgbuf, bufsize); *p = PyString_AS_STRING(uarg); - *q = PyString_GET_SIZE(uarg); + STORE_SIZE(PyString_GET_SIZE(uarg)); } #endif else { /* any buffer-like object */ char *buf; - int count = convertbuffer(arg, p, &buf); + Py_ssize_t count = convertbuffer(arg, p, &buf); if (count < 0) return converterr(buf, arg, msgbuf, bufsize); - *q = count; + STORE_SIZE(count); } format++; } else { @@ -729,15 +800,15 @@ case 'z': {/* string, may be NULL (None) */ if (*format == '#') { /* any buffer-like object */ void **p = (void **)va_arg(*p_va, char **); - int *q = va_arg(*p_va, int *); + FETCH_SIZE; if (arg == Py_None) { *p = 0; - *q = 0; + STORE_SIZE(0); } else if (PyString_Check(arg)) { *p = PyString_AS_STRING(arg); - *q = PyString_GET_SIZE(arg); + STORE_SIZE(PyString_GET_SIZE(arg)); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(arg)) { @@ -746,15 +817,15 @@ return converterr(CONV_UNICODE, arg, msgbuf, bufsize); *p = PyString_AS_STRING(uarg); - *q = PyString_GET_SIZE(uarg); + STORE_SIZE(PyString_GET_SIZE(uarg)); } #endif else { /* any buffer-like object */ char *buf; - int count = convertbuffer(arg, p, &buf); + Py_ssize_t count = convertbuffer(arg, p, &buf); if (count < 0) return converterr(buf, arg, msgbuf, bufsize); - *q = count; + STORE_SIZE(count); } format++; } else { @@ -777,7 +848,8 @@ return converterr("string or None", arg, msgbuf, bufsize); if (*format == '#') { - int *q = va_arg(*p_va, int *); + FETCH_SIZE; + assert(0); // redundant with if-case if (arg == Py_None) *q = 0; else @@ -883,10 +955,10 @@ trailing 0-byte */ - int *buffer_len = va_arg(*p_va, int *); + FETCH_SIZE; format++; - if (buffer_len == NULL) { + if (q == NULL && q2 == NULL) { Py_DECREF(s); return converterr( "(buffer_len is NULL)", @@ -907,7 +979,7 @@ arg, msgbuf, bufsize); } } else { - if (size + 1 > *buffer_len) { + if (size + 1 > BUFFER_LEN) { Py_DECREF(s); return converterr( "(buffer overflow)", @@ -917,7 +989,7 @@ memcpy(*buffer, PyString_AS_STRING(s), size + 1); - *buffer_len = size; + STORE_SIZE(size); } else { /* Using a 0-terminated buffer: @@ -961,17 +1033,17 @@ case 'u': {/* raw unicode buffer (Py_UNICODE *) */ if (*format == '#') { /* any buffer-like object */ void **p = (void **)va_arg(*p_va, char **); - int *q = va_arg(*p_va, int *); + FETCH_SIZE; if (PyUnicode_Check(arg)) { *p = PyUnicode_AS_UNICODE(arg); - *q = PyUnicode_GET_SIZE(arg); + STORE_SIZE(PyUnicode_GET_SIZE(arg)); } else { char *buf; - int count = convertbuffer(arg, p, &buf); + Py_ssize_t count = convertbuffer(arg, p, &buf); if (count < 0) return converterr(buf, arg, msgbuf, bufsize); - *q = count/(sizeof(Py_UNICODE)); + STORE_SIZE(count/(sizeof(Py_UNICODE))); } format++; } else { @@ -1061,9 +1133,8 @@ if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0) return converterr("(unspecified)", arg, msgbuf, bufsize); if (*format == '#') { - int *q = va_arg(*p_va, int *); - - *q = count; + FETCH_SIZE; + STORE_SIZE(count); format++; } break; @@ -1073,6 +1144,7 @@ const char **p = va_arg(*p_va, const char **); PyBufferProcs *pb = arg->ob_type->tp_as_buffer; int count; + FETCH_SIZE; if (*format++ != '#') return converterr( @@ -1094,7 +1166,7 @@ count = pb->bf_getcharbuffer(arg, 0, p); if (count < 0) return converterr("(unspecified)", arg, msgbuf, bufsize); - *va_arg(*p_va, int *) = count; + STORE_SIZE(count); break; } @@ -1107,11 +1179,11 @@ return NULL; } -static int +static Py_ssize_t convertbuffer(PyObject *arg, void **p, char **errmsg) { PyBufferProcs *pb = arg->ob_type->tp_as_buffer; - int count; + Py_ssize_t count; if (pb == NULL || pb->bf_getreadbuffer == NULL || pb->bf_getsegcount == NULL) { @@ -1151,7 +1223,32 @@ } va_start(va, kwlist); - retval = vgetargskeywords(args, keywords, format, kwlist, &va); + retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0); + va_end(va); + return retval; +} + +int +_PyArg_ParseTupleAndKeywords_SizeT(PyObject *args, + PyObject *keywords, + const char *format, + const char **kwlist, ...) +{ + int retval; + va_list va; + + if ((args == NULL || !PyTuple_Check(args)) || + (keywords != NULL && !PyDict_Check(keywords)) || + format == NULL || + kwlist == NULL) + { + PyErr_BadInternalCall(); + return 0; + } + + va_start(va, kwlist); + retval = vgetargskeywords(args, keywords, format, + kwlist, &va, FLAG_SIZE_T); va_end(va); return retval; } @@ -1185,14 +1282,47 @@ #endif #endif - retval = vgetargskeywords(args, keywords, format, kwlist, &lva); + retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0); + return retval; +} + +int +_PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, + PyObject *keywords, + const char *format, + const char **kwlist, va_list va) +{ + int retval; + va_list lva; + + if ((args == NULL || !PyTuple_Check(args)) || + (keywords != NULL && !PyDict_Check(keywords)) || + format == NULL || + kwlist == NULL) + { + PyErr_BadInternalCall(); + return 0; + } + +#ifdef VA_LIST_IS_ARRAY + memcpy(lva, va, sizeof(va_list)); +#else +#ifdef __va_copy + __va_copy(lva, va); +#else + lva = va; +#endif +#endif + + retval = vgetargskeywords(args, keywords, format, + kwlist, &lva, FLAG_SIZE_T); return retval; } static int vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, - const char **kwlist, va_list *p_va) + const char **kwlist, va_list *p_va, int flags) { char msgbuf[512]; int levels[32]; @@ -1327,7 +1457,8 @@ if (*format == '|') format++; msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, - levels, msgbuf, sizeof(msgbuf), &freelist); + flags, levels, msgbuf, sizeof(msgbuf), + &freelist); if (msg) { seterror(i+1, msg, levels, fname, message); return cleanreturn(0, freelist); @@ -1347,8 +1478,8 @@ item = PyDict_GetItemString(keywords, kwlist[i]); if (item != NULL) { Py_INCREF(item); - msg = convertitem(item, &format, p_va, levels, msgbuf, - sizeof(msgbuf), &freelist); + msg = convertitem(item, &format, p_va, flags, levels, + msgbuf, sizeof(msgbuf), &freelist); Py_DECREF(item); if (msg) { seterror(i+1, msg, levels, fname, message); @@ -1361,7 +1492,7 @@ else if (PyErr_Occurred()) return cleanreturn(0, freelist); else { - msg = skipitem(&format, p_va); + msg = skipitem(&format, p_va, flags); if (msg) { seterror(i+1, msg, levels, fname, message); return cleanreturn(0, freelist); @@ -1403,7 +1534,7 @@ static char * -skipitem(const char **p_format, va_list *p_va) +skipitem(const char **p_format, va_list *p_va, int flags) { const char *format = *p_format; char c = *format++; @@ -1435,6 +1566,12 @@ (void) va_arg(*p_va, void *); break; } + + case 'n': /* Py_ssize_t */ + { + (void) va_arg(*p_va, Py_ssize_t *); + break; + } /* string codes */ @@ -1458,7 +1595,10 @@ { (void) va_arg(*p_va, char **); if (*format == '#') { - (void) va_arg(*p_va, int *); + if (flags & FLAG_SIZE_T) + (void) va_arg(*p_va, Py_ssize_t *); + else + (void) va_arg(*p_va, int *); format++; } break; Modified: python/branches/ssize_t/Python/import.c ============================================================================== --- python/branches/ssize_t/Python/import.c (original) +++ python/branches/ssize_t/Python/import.c Sat Dec 17 11:20:15 2005 @@ -688,7 +688,7 @@ Doesn't set an exception. */ static FILE * -check_compiled_module(char *pathname, long mtime, char *cpathname) +check_compiled_module(char *pathname, time_t mtime, char *cpathname) { FILE *fp; long magic; @@ -803,10 +803,11 @@ |O_BINARY /* necessary for Windows */ #endif #ifdef __VMS - , 0666, "ctxt=bin", "shr=nil"); + , 0666, "ctxt=bin", "shr=nil" #else - , 0666); + , 0666 #endif + ); if (fd < 0) return NULL; return fdopen(fd, "wb"); @@ -823,7 +824,7 @@ remove the file. */ static void -write_compiled_module(PyCodeObject *co, char *cpathname, long mtime) +write_compiled_module(PyCodeObject *co, char *cpathname, time_t mtime) { FILE *fp; @@ -848,6 +849,7 @@ } /* Now write the true mtime */ fseek(fp, 4L, 0); + assert(mtime < LONG_MAX); PyMarshal_WriteLongToFile(mtime, fp, Py_MARSHAL_VERSION); fflush(fp); fclose(fp); @@ -1059,10 +1061,10 @@ #ifdef MS_COREDLL extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **, - char *, int); + char *, Py_ssize_t); #endif -static int case_ok(char *, int, int, char *); +static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *); static int find_init_module(char *); /* Forward */ static struct filedescr importhookdescr = {"", "", IMP_HOOK}; @@ -1370,7 +1372,7 @@ return fd->type == PY_SOURCE || fd->type == PY_COMPILED; } -/* case_ok(char* buf, int len, int namelen, char* name) +/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name) * The arguments here are tricky, best shown by example: * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0 * ^ ^ ^ ^ @@ -1418,7 +1420,7 @@ #endif static int -case_ok(char *buf, int len, int namelen, char *name) +case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name) { /* Pick a platform-specific implementation; the sequence of #if's here should * match the sequence just above. @@ -1889,12 +1891,12 @@ } /* Forward declarations for helper routines */ -static PyObject *get_parent(PyObject *globals, char *buf, int *p_buflen); +static PyObject *get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen); static PyObject *load_next(PyObject *mod, PyObject *altmod, - char **p_name, char *buf, int *p_buflen); + char **p_name, char *buf, Py_ssize_t *p_buflen); static int mark_miss(char *name); static int ensure_fromlist(PyObject *mod, PyObject *fromlist, - char *buf, int buflen, int recursive); + char *buf, Py_ssize_t buflen, int recursive); static PyObject * import_submodule(PyObject *mod, char *name, char *fullname); /* The Magnum Opus of dotted-name import :-) */ @@ -1904,7 +1906,7 @@ PyObject *fromlist) { char buf[MAXPATHLEN+1]; - int buflen = 0; + Py_ssize_t buflen = 0; PyObject *parent, *head, *next, *tail; parent = get_parent(globals, buf, &buflen); @@ -1974,7 +1976,7 @@ corresponding entry is not found in sys.modules, Py_None is returned. */ static PyObject * -get_parent(PyObject *globals, char *buf, int *p_buflen) +get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen) { static PyObject *namestr = NULL; static PyObject *pathstr = NULL; @@ -2042,7 +2044,7 @@ /* altmod is either None or same as mod */ static PyObject * load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf, - int *p_buflen) + Py_ssize_t *p_buflen) { char *name = *p_name; char *dot = strchr(name, '.'); @@ -2112,7 +2114,7 @@ } static int -ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, int buflen, +ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen, int recursive) { int i; Modified: python/branches/ssize_t/Python/mactoolboxglue.c ============================================================================== --- python/branches/ssize_t/Python/mactoolboxglue.c (original) +++ python/branches/ssize_t/Python/mactoolboxglue.c Sat Dec 17 11:20:15 2005 @@ -363,10 +363,10 @@ \ int routinename(PyObject *pyobj, object *cobj) { \ if (!PyMacGluePtr_##routinename) { \ - if (!PyImport_ImportModule(module)) return NULL; \ + if (!PyImport_ImportModule(module)) return 0; \ if (!PyMacGluePtr_##routinename) { \ PyErr_SetString(PyExc_ImportError, "Module did not provide routine: " module ": " #routinename); \ - return NULL; \ + return 0; \ } \ } \ return (*PyMacGluePtr_##routinename)(pyobj, cobj); \ Modified: python/branches/ssize_t/Python/marshal.c ============================================================================== --- python/branches/ssize_t/Python/marshal.c (original) +++ python/branches/ssize_t/Python/marshal.c Sat Dec 17 11:20:15 2005 @@ -181,7 +181,7 @@ else { char buf[256]; /* Plenty to format any double */ PyFloat_AsReprString(buf, (PyFloatObject *)v); - n = strlen(buf); + n = (int)strlen(buf); w_byte(TYPE_FLOAT, p); w_byte(n, p); w_string(buf, n, p); @@ -213,14 +213,14 @@ PyComplex_RealAsDouble(v)); PyFloat_AsReprString(buf, temp); Py_DECREF(temp); - n = strlen(buf); + n = (int)strlen(buf); w_byte(n, p); w_string(buf, n, p); temp = (PyFloatObject*)PyFloat_FromDouble( PyComplex_ImagAsDouble(v)); PyFloat_AsReprString(buf, temp); Py_DECREF(temp); - n = strlen(buf); + n = (int)strlen(buf); w_byte(n, p); w_string(buf, n, p); } @@ -395,9 +395,10 @@ r_string(char *s, int n, RFILE *p) { if (p->fp != NULL) - return fread(s, 1, n, p->fp); + /* The result fits into int because it must be <=n. */ + return (int)fread(s, 1, n, p->fp); if (p->end - p->ptr < n) - n = p->end - p->ptr; + n = (int)(p->end - p->ptr); memcpy(s, p->ptr, n); p->ptr += n; return n; @@ -939,7 +940,10 @@ pBuf = (char *)PyMem_MALLOC(filesize); if (pBuf != NULL) { PyObject* v; - size_t n = fread(pBuf, 1, filesize, fp); + size_t n; + /* filesize must fit into an int, because it + is smaller than REASONABLE_FILE_LIMIT */ + n = fread(pBuf, 1, (int)filesize, fp); v = PyMarshal_ReadObjectFromString(pBuf, n); if (pBuf != buf) PyMem_FREE(pBuf); @@ -970,7 +974,7 @@ } PyObject * -PyMarshal_ReadObjectFromString(char *str, int len) +PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len) { RFILE rf; PyObject *result; Modified: python/branches/ssize_t/Python/modsupport.c ============================================================================== --- python/branches/ssize_t/Python/modsupport.c (original) +++ python/branches/ssize_t/Python/modsupport.c Sat Dec 17 11:20:15 2005 @@ -313,6 +313,11 @@ return PyInt_FromLong(n); } + case 'n': +#if SIZEOF_SIZE_T!=SIZEOF_LONG + return PyLong_FromSsize_t(va_arg(*p_va, Py_Ssize_t)); +#endif + /* Fall through from 'n' to 'l' if Py_ssize_t is long */ case 'l': return PyInt_FromLong(va_arg(*p_va, long)); Modified: python/branches/ssize_t/Python/pythonrun.c ============================================================================== --- python/branches/ssize_t/Python/pythonrun.c (original) +++ python/branches/ssize_t/Python/pythonrun.c Sat Dec 17 11:20:15 2005 @@ -933,7 +933,7 @@ nl = strchr(text, '\n'); if (nl == NULL || nl-text >= offset) break; - offset -= (nl+1-text); + offset -= (int)(nl+1-text); text = nl+1; } while (*text == ' ' || *text == '\t') { Modified: python/branches/ssize_t/Python/sysmodule.c ============================================================================== --- python/branches/ssize_t/Python/sysmodule.c (original) +++ python/branches/ssize_t/Python/sysmodule.c Sat Dec 17 11:20:15 2005 @@ -1191,7 +1191,7 @@ if (path != NULL) { char *argv0 = argv[0]; char *p = NULL; - int n = 0; + Py_ssize_t n = 0; PyObject *a; #ifdef HAVE_READLINK char link[MAXPATHLEN+1]; Modified: python/branches/ssize_t/Python/thread_nt.h ============================================================================== --- python/branches/ssize_t/Python/thread_nt.h (original) +++ python/branches/ssize_t/Python/thread_nt.h Sat Dec 17 11:20:15 2005 @@ -170,7 +170,7 @@ long PyThread_start_new_thread(void (*func)(void *), void *arg) { - unsigned long rv; + uintptr_t rv; callobj obj; dprintf(("%ld: PyThread_start_new_thread called\n", @@ -186,7 +186,7 @@ return -1; rv = _beginthread(bootstrap, 0, &obj); /* use default stack size */ - if (rv == (unsigned long)-1) { + if (rv == (uintptr_t)-1) { /* I've seen errno == EAGAIN here, which means "there are * too many threads". */ Modified: python/branches/ssize_t/configure ============================================================================== --- python/branches/ssize_t/configure (original) +++ python/branches/ssize_t/configure Sat Dec 17 11:20:15 2005 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 39267 . +# From configure.in Revision: 41695 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for python 2.5. # @@ -6077,6 +6077,70 @@ fi +echo "$as_me:$LINENO: checking for ssize_t" >&5 +echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6 +if test "${ac_cv_type_ssize_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((ssize_t *) 0) + return 0; +if (sizeof (ssize_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_ssize_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_ssize_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_ssize_t" >&5 +echo "${ECHO_T}$ac_cv_type_ssize_t" >&6 +if test $ac_cv_type_ssize_t = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SSIZE_T 1 +_ACEOF + +fi + # Sizes of various common basic types # ANSI C requires sizeof(char) == 1, so no need to check it @@ -8978,6 +9042,420 @@ _ACEOF +echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6 +if test "${ac_cv_type_size_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((size_t *) 0) + return 0; +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_size_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_size_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6 + +echo "$as_me:$LINENO: checking size of size_t" >&5 +echo $ECHO_N "checking size of size_t... $ECHO_C" >&6 +if test "${ac_cv_sizeof_size_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$ac_cv_type_size_t" = yes; then + # The cast to unsigned long works around a bug in the HP C Compiler + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. + # This bug is HP SR number 8606223364. + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (size_t))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_lo= ac_hi= +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_lo=`expr '(' $ac_mid ')' + 1` +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_size_t=$ac_lo;; +'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (size_t), 77 +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } ;; +esac +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +long longval () { return (long) (sizeof (size_t)); } +unsigned long ulongval () { return (long) (sizeof (size_t)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + exit (1); + if (((long) (sizeof (size_t))) < 0) + { + long i = longval (); + if (i != ((long) (sizeof (size_t)))) + exit (1); + fprintf (f, "%ld\n", i); + } + else + { + unsigned long i = ulongval (); + if (i != ((long) (sizeof (size_t)))) + exit (1); + fprintf (f, "%lu\n", i); + } + exit (ferror (f) || fclose (f) != 0); + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_size_t=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +{ { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (size_t), 77 +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f conftest.val +else + ac_cv_sizeof_size_t=0 +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_sizeof_size_t" >&5 +echo "${ECHO_T}$ac_cv_sizeof_size_t" >&6 +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t +_ACEOF + + echo "$as_me:$LINENO: checking for long long support" >&5 echo $ECHO_N "checking for long long support... $ECHO_C" >&6 Modified: python/branches/ssize_t/configure.in ============================================================================== --- python/branches/ssize_t/configure.in (original) +++ python/branches/ssize_t/configure.in Sat Dec 17 11:20:15 2005 @@ -1073,6 +1073,8 @@ AC_TYPE_SIGNAL AC_TYPE_SIZE_T AC_TYPE_UID_T +AC_CHECK_TYPE(ssize_t, + AC_DEFINE(HAVE_SSIZE_T, 1, Define if your compiler provides ssize_t),,) # Sizes of various common basic types # ANSI C requires sizeof(char) == 1, so no need to check it @@ -1083,6 +1085,7 @@ AC_CHECK_SIZEOF(float, 4) AC_CHECK_SIZEOF(double, 8) AC_CHECK_SIZEOF(fpos_t, 4) +AC_CHECK_SIZEOF(size_t, 4) AC_MSG_CHECKING(for long long support) have_long_long=no Modified: python/branches/ssize_t/pyconfig.h.in ============================================================================== --- python/branches/ssize_t/pyconfig.h.in (original) +++ python/branches/ssize_t/pyconfig.h.in Sat Dec 17 11:20:15 2005 @@ -449,6 +449,9 @@ /* Define if you have the 'socketpair' function. */ #undef HAVE_SOCKETPAIR +/* Define if your compiler provides ssize_t */ +#undef HAVE_SSIZE_T + /* Define to 1 if you have the `statvfs' function. */ #undef HAVE_STATVFS @@ -757,6 +760,9 @@ /* The size of a `short', as computed by sizeof. */ #undef SIZEOF_SHORT +/* The size of a `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + /* The number of bytes in a time_t. */ #undef SIZEOF_TIME_T From python-checkins at python.org Sat Dec 17 18:14:14 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Sat, 17 Dec 2005 18:14:14 +0100 (CET) Subject: [Python-checkins] commit of r41732 - python/trunk/Doc/lib/libos.tex Message-ID: <20051217171414.4013C1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Sat Dec 17 18:14:12 2005 New Revision: 41732 Modified: python/trunk/Doc/lib/libos.tex Log: Bug #1106572: clarify os.makedirs docs wrt umask Modified: python/trunk/Doc/lib/libos.tex ============================================================================== --- python/trunk/Doc/lib/libos.tex (original) +++ python/trunk/Doc/lib/libos.tex Sat Dec 17 18:14:12 2005 @@ -875,7 +875,8 @@ but makes all intermediate-level directories needed to contain the leaf directory. Throws an \exception{error} exception if the leaf directory already exists or cannot be created. The default \var{mode} -is \code{0777} (octal). +is \code{0777} (octal). On some systems, \var{mode} is ignored. +Where it is used, the current umask value is first masked out. \versionadded{1.5.2} \versionchanged[This function now handles UNC paths correctly]{2.3} \end{funcdesc} From python-checkins at python.org Sat Dec 17 18:14:25 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Sat, 17 Dec 2005 18:14:25 +0100 (CET) Subject: [Python-checkins] commit of r41733 - python/branches/release24-maint/Doc/lib/libos.tex Message-ID: <20051217171425.8E3501E4002@bag.python.org> Author: reinhold.birkenfeld Date: Sat Dec 17 18:14:24 2005 New Revision: 41733 Modified: python/branches/release24-maint/Doc/lib/libos.tex Log: Bug #1106572: clarify os.makedirs docs wrt umask Modified: python/branches/release24-maint/Doc/lib/libos.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libos.tex (original) +++ python/branches/release24-maint/Doc/lib/libos.tex Sat Dec 17 18:14:24 2005 @@ -855,7 +855,8 @@ but makes all intermediate-level directories needed to contain the leaf directory. Throws an \exception{error} exception if the leaf directory already exists or cannot be created. The default \var{mode} -is \code{0777} (octal). +is \code{0777} (octal). On some systems, \var{mode} is ignored. +Where it is used, the current umask value is first masked out. \versionadded{1.5.2} \versionchanged[This function now handles UNC paths correctly]{2.3} \end{funcdesc} From python-checkins at python.org Sat Dec 17 18:31:06 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Sat, 17 Dec 2005 18:31:06 +0100 (CET) Subject: [Python-checkins] commit of r41734 - python/trunk/Doc/lib/libos.tex Message-ID: <20051217173106.9D8781E4002@bag.python.org> Author: reinhold.birkenfeld Date: Sat Dec 17 18:31:03 2005 New Revision: 41734 Modified: python/trunk/Doc/lib/libos.tex Log: Bug #1343671: clarify docs for os.removedirs Modified: python/trunk/Doc/lib/libos.tex ============================================================================== --- python/trunk/Doc/lib/libos.tex (original) +++ python/trunk/Doc/lib/libos.tex Sat Dec 17 18:31:03 2005 @@ -931,11 +931,15 @@ \index{directory!deleting} Removes directories recursively. Works like \function{rmdir()} except that, if the leaf directory is -successfully removed, directories corresponding to rightmost path -segments will be pruned way until either the whole path is consumed or -an error is raised (which is ignored, because it generally means that -a parent directory is not empty). Throws an \exception{error} -exception if the leaf directory could not be successfully removed. +successfully removed, \function{removedirs()} +tries to successively remove every parent directory mentioned in +\var{path} until an error is raised (which is ignored, because +it generally means that a parent directory is not empty). +For example, \samp{os.removedirs('foo/bar/baz')} will first remove +the directory \samp{'foo/bar/baz'}, and then remove \samp{'foo/bar'} +and \samp{'foo'} if they are empty. +Raises \exception{OSError} if the leaf directory could not be +successfully removed. \versionadded{1.5.2} \end{funcdesc} From python-checkins at python.org Sat Dec 17 18:31:09 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Sat, 17 Dec 2005 18:31:09 +0100 (CET) Subject: [Python-checkins] commit of r41735 - python/branches/release24-maint/Doc/lib/libos.tex Message-ID: <20051217173109.DC47A1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Sat Dec 17 18:31:07 2005 New Revision: 41735 Modified: python/branches/release24-maint/Doc/lib/libos.tex Log: Bug #1343671: clarify docs for os.removedirs Modified: python/branches/release24-maint/Doc/lib/libos.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libos.tex (original) +++ python/branches/release24-maint/Doc/lib/libos.tex Sat Dec 17 18:31:07 2005 @@ -911,11 +911,15 @@ \index{directory!deleting} Removes directories recursively. Works like \function{rmdir()} except that, if the leaf directory is -successfully removed, directories corresponding to rightmost path -segments will be pruned way until either the whole path is consumed or -an error is raised (which is ignored, because it generally means that -a parent directory is not empty). Throws an \exception{error} -exception if the leaf directory could not be successfully removed. +successfully removed, \function{removedirs()} +tries to successively remove every parent directory mentioned in +\var{path} until an error is raised (which is ignored, because +it generally means that a parent directory is not empty). +For example, \samp{os.removedirs('foo/bar/baz')} will first remove +the directory \samp{'foo/bar/baz'}, and then remove \samp{'foo/bar'} +and \samp{'foo'} if they are empty. +Raises \exception{OSError} if the leaf directory could not be +successfully removed. \versionadded{1.5.2} \end{funcdesc} From python-checkins at python.org Sat Dec 17 18:47:45 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Sat, 17 Dec 2005 18:47:45 +0100 (CET) Subject: [Python-checkins] commit of r41737 - python/branches/release24-maint/Doc/lib/libos.tex Message-ID: <20051217174745.A8D521E4002@bag.python.org> Author: reinhold.birkenfeld Date: Sat Dec 17 18:47:43 2005 New Revision: 41737 Modified: python/branches/release24-maint/Doc/lib/libos.tex Log: Bug #1373197: note that os.makedirs does not work with '..' Modified: python/branches/release24-maint/Doc/lib/libos.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libos.tex (original) +++ python/branches/release24-maint/Doc/lib/libos.tex Sat Dec 17 18:47:43 2005 @@ -857,6 +857,8 @@ directory already exists or cannot be created. The default \var{mode} is \code{0777} (octal). On some systems, \var{mode} is ignored. Where it is used, the current umask value is first masked out. +\note{\function{makedirs()} will become confused if the path elements +to create include \var{os.pardir}.} \versionadded{1.5.2} \versionchanged[This function now handles UNC paths correctly]{2.3} \end{funcdesc} From python-checkins at python.org Sat Dec 17 18:47:45 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Sat, 17 Dec 2005 18:47:45 +0100 (CET) Subject: [Python-checkins] commit of r41736 - python/trunk/Doc/lib/libos.tex Message-ID: <20051217174745.A95A01E4007@bag.python.org> Author: reinhold.birkenfeld Date: Sat Dec 17 18:47:42 2005 New Revision: 41736 Modified: python/trunk/Doc/lib/libos.tex Log: Bug #1373197: note that os.makedirs does not work with '..' Modified: python/trunk/Doc/lib/libos.tex ============================================================================== --- python/trunk/Doc/lib/libos.tex (original) +++ python/trunk/Doc/lib/libos.tex Sat Dec 17 18:47:42 2005 @@ -877,6 +877,8 @@ directory already exists or cannot be created. The default \var{mode} is \code{0777} (octal). On some systems, \var{mode} is ignored. Where it is used, the current umask value is first masked out. +\note{\function{makedirs()} will become confused if the path elements +to create include \var{os.pardir}.} \versionadded{1.5.2} \versionchanged[This function now handles UNC paths correctly]{2.3} \end{funcdesc} From walter at livinglogic.de Sat Dec 17 18:57:48 2005 From: walter at livinglogic.de (=?iso-8859-1?Q?Walter_D=F6rwald?=) Date: Sat, 17 Dec 2005 18:57:48 +0100 (CET) Subject: [Python-checkins] commit of r41728 - in python: branches/release24-maint/Lib/test/test_unicode.py branches/release24-maint/Misc/NEWS branches/release24-maint/Objects/unicodeobject.c trunk/Lib/test/test_unicode.py trunk/Misc/NEWS trunk/Objects/unicodeobject.c In-Reply-To: <20051217043834.99C891E4002@bag.python.org> References: <20051217043834.99C891E4002@bag.python.org> Message-ID: <61331.85.74.3.166.1134842268.squirrel@isar.livinglogic.de> hyeshik.chang wrote: > Author: hyeshik.chang > Date: Sat Dec 17 05:38:31 2005 > New Revision: 41728 > > Modified: > python/branches/release24-maint/Lib/test/test_unicode.py > python/branches/release24-maint/Misc/NEWS > python/branches/release24-maint/Objects/unicodeobject.c > python/trunk/Lib/test/test_unicode.py > python/trunk/Misc/NEWS > python/trunk/Objects/unicodeobject.c > Log: > Bug #1379994: Fix *unicode_escape codecs to encode r'\' as r'\\' > just like string codecs. I don't see how the patches to test_unicode.py check for this change. It just changes the check from testing one long string to testing each character separately. > Modified: python/branches/release24-maint/Lib/test/test_unicode.py > ============================================================================== --- > python/branches/release24-maint/Lib/test/test_unicode.py (original) +++ > python/branches/release24-maint/Lib/test/test_unicode.py Sat Dec 17 05:38:31 2005 @@ -611,20 +611,24 @@ > self.assertEqual(u'hello'.encode('latin-1'), 'hello') > > # Roundtrip safety for BMP (just the first 1024 chars) > - u = u''.join(map(unichr, xrange(1024))) > - for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', 'utf-16-be', > - 'raw_unicode_escape', 'unicode_escape', 'unicode_internal'): > - self.assertEqual(unicode(u.encode(encoding),encoding), u) > + for c in xrange(1024): > + u = unichr(c) > + for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', > + 'utf-16-be', 'raw_unicode_escape', > + 'unicode_escape', 'unicode_internal'): > + self.assertEqual(unicode(u.encode(encoding),encoding), u) > > # Roundtrip safety for BMP (just the first 256 chars) > - u = u''.join(map(unichr, xrange(256))) > - for encoding in ('latin-1',): > - self.assertEqual(unicode(u.encode(encoding),encoding), u) > + for c in xrange(256): > + u = unichr(c) > + for encoding in ('latin-1',): > + self.assertEqual(unicode(u.encode(encoding),encoding), u) > > # Roundtrip safety for BMP (just the first 128 chars) > - u = u''.join(map(unichr, xrange(128))) > - for encoding in ('ascii',): > - self.assertEqual(unicode(u.encode(encoding),encoding), u) > + for c in xrange(128): > + u = unichr(c) > + for encoding in ('ascii',): > + self.assertEqual(unicode(u.encode(encoding),encoding), u) > > # Roundtrip safety for non-BMP (just a few chars) > u = u'\U00010001\U00020002\U00030003\U00040004\U00050005' From python-checkins at python.org Sat Dec 17 19:41:18 2005 From: python-checkins at python.org (neal.norwitz) Date: Sat, 17 Dec 2005 19:41:18 +0100 (CET) Subject: [Python-checkins] commit of r41738 - python/trunk/Misc/ACKS Message-ID: <20051217184118.A636A1E4002@bag.python.org> Author: neal.norwitz Date: Sat Dec 17 19:41:15 2005 New Revision: 41738 Modified: python/trunk/Misc/ACKS Log: Add Michael Urman for work on SF patch #1365916 Modified: python/trunk/Misc/ACKS ============================================================================== --- python/trunk/Misc/ACKS (original) +++ python/trunk/Misc/ACKS Sat Dec 17 19:41:15 2005 @@ -607,6 +607,7 @@ Bill Tutt Doobee R. Tzeck Lionel Ulmer +Michael Urman Hector Urtubia Dmitry Vasiliev Frank Vercruesse From python-checkins at python.org Sat Dec 17 21:54:53 2005 From: python-checkins at python.org (neal.norwitz) Date: Sat, 17 Dec 2005 21:54:53 +0100 (CET) Subject: [Python-checkins] commit of r41739 - in python/trunk: Include/Python-ast.h Include/Python.h Include/asdl.h Include/ast.h Include/compile.h Include/pyarena.h Include/pythonrun.h Makefile.pre.in Parser/asdl_c.py Python/Python-ast.c Python/asdl.c Python/ast.c Python/compile.c Python/import.c Python/pyarena.c Python/pythonrun.c Message-ID: <20051217205453.CBF681E4002@bag.python.org> Author: neal.norwitz Date: Sat Dec 17 21:54:49 2005 New Revision: 41739 Added: python/trunk/Include/pyarena.h python/trunk/Python/pyarena.c Modified: python/trunk/Include/Python-ast.h python/trunk/Include/Python.h python/trunk/Include/asdl.h python/trunk/Include/ast.h python/trunk/Include/compile.h python/trunk/Include/pythonrun.h python/trunk/Makefile.pre.in python/trunk/Parser/asdl_c.py python/trunk/Python/Python-ast.c python/trunk/Python/asdl.c python/trunk/Python/ast.c python/trunk/Python/compile.c python/trunk/Python/import.c python/trunk/Python/pythonrun.c Log: Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines, simplifies a lot of error handling code, and fixes many memory leaks. Modified: python/trunk/Include/Python-ast.h ============================================================================== --- python/trunk/Include/Python-ast.h (original) +++ python/trunk/Include/Python-ast.h Sat Dec 17 21:54:49 2005 @@ -328,81 +328,79 @@ }; -mod_ty Module(asdl_seq * body); -mod_ty Interactive(asdl_seq * body); -mod_ty Expression(expr_ty body); -mod_ty Suite(asdl_seq * body); +mod_ty Module(asdl_seq * body, PyArena *arena); +mod_ty Interactive(asdl_seq * body, PyArena *arena); +mod_ty Expression(expr_ty body, PyArena *arena); +mod_ty Suite(asdl_seq * body, PyArena *arena); stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, - asdl_seq * decorators, int lineno); + asdl_seq * decorators, int lineno, PyArena *arena); stmt_ty ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int - lineno); -stmt_ty Return(expr_ty value, int lineno); -stmt_ty Delete(asdl_seq * targets, int lineno); -stmt_ty Assign(asdl_seq * targets, expr_ty value, int lineno); -stmt_ty AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno); -stmt_ty Print(expr_ty dest, asdl_seq * values, bool nl, int lineno); + lineno, PyArena *arena); +stmt_ty Return(expr_ty value, int lineno, PyArena *arena); +stmt_ty Delete(asdl_seq * targets, int lineno, PyArena *arena); +stmt_ty Assign(asdl_seq * targets, expr_ty value, int lineno, PyArena *arena); +stmt_ty AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, + PyArena *arena); +stmt_ty Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, PyArena + *arena); stmt_ty For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, - int lineno); -stmt_ty While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno); -stmt_ty If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno); -stmt_ty Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno); + int lineno, PyArena *arena); +stmt_ty While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + PyArena *arena); +stmt_ty If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, + PyArena *arena); +stmt_ty Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, PyArena + *arena); stmt_ty TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int - lineno); -stmt_ty TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno); -stmt_ty Assert(expr_ty test, expr_ty msg, int lineno); -stmt_ty Import(asdl_seq * names, int lineno); -stmt_ty ImportFrom(identifier module, asdl_seq * names, int lineno); -stmt_ty Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno); -stmt_ty Global(asdl_seq * names, int lineno); -stmt_ty Expr(expr_ty value, int lineno); -stmt_ty Pass(int lineno); -stmt_ty Break(int lineno); -stmt_ty Continue(int lineno); -expr_ty BoolOp(boolop_ty op, asdl_seq * values, int lineno); -expr_ty BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno); -expr_ty UnaryOp(unaryop_ty op, expr_ty operand, int lineno); -expr_ty Lambda(arguments_ty args, expr_ty body, int lineno); -expr_ty Dict(asdl_seq * keys, asdl_seq * values, int lineno); -expr_ty ListComp(expr_ty elt, asdl_seq * generators, int lineno); -expr_ty GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno); -expr_ty Yield(expr_ty value, int lineno); + lineno, PyArena *arena); +stmt_ty TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, PyArena + *arena); +stmt_ty Assert(expr_ty test, expr_ty msg, int lineno, PyArena *arena); +stmt_ty Import(asdl_seq * names, int lineno, PyArena *arena); +stmt_ty ImportFrom(identifier module, asdl_seq * names, int lineno, PyArena + *arena); +stmt_ty Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, PyArena + *arena); +stmt_ty Global(asdl_seq * names, int lineno, PyArena *arena); +stmt_ty Expr(expr_ty value, int lineno, PyArena *arena); +stmt_ty Pass(int lineno, PyArena *arena); +stmt_ty Break(int lineno, PyArena *arena); +stmt_ty Continue(int lineno, PyArena *arena); +expr_ty BoolOp(boolop_ty op, asdl_seq * values, int lineno, PyArena *arena); +expr_ty BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, PyArena + *arena); +expr_ty UnaryOp(unaryop_ty op, expr_ty operand, int lineno, PyArena *arena); +expr_ty Lambda(arguments_ty args, expr_ty body, int lineno, PyArena *arena); +expr_ty Dict(asdl_seq * keys, asdl_seq * values, int lineno, PyArena *arena); +expr_ty ListComp(expr_ty elt, asdl_seq * generators, int lineno, PyArena + *arena); +expr_ty GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, PyArena + *arena); +expr_ty Yield(expr_ty value, int lineno, PyArena *arena); expr_ty Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int - lineno); + lineno, PyArena *arena); expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty - starargs, expr_ty kwargs, int lineno); -expr_ty Repr(expr_ty value, int lineno); -expr_ty Num(object n, int lineno); -expr_ty Str(string s, int lineno); + starargs, expr_ty kwargs, int lineno, PyArena *arena); +expr_ty Repr(expr_ty value, int lineno, PyArena *arena); +expr_ty Num(object n, int lineno, PyArena *arena); +expr_ty Str(string s, int lineno, PyArena *arena); expr_ty Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int - lineno); + lineno, PyArena *arena); expr_ty Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int - lineno); -expr_ty Name(identifier id, expr_context_ty ctx, int lineno); -expr_ty List(asdl_seq * elts, expr_context_ty ctx, int lineno); -expr_ty Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno); -slice_ty Ellipsis(void); -slice_ty Slice(expr_ty lower, expr_ty upper, expr_ty step); -slice_ty ExtSlice(asdl_seq * dims); -slice_ty Index(expr_ty value); -comprehension_ty comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs); -excepthandler_ty excepthandler(expr_ty type, expr_ty name, asdl_seq * body); + lineno, PyArena *arena); +expr_ty Name(identifier id, expr_context_ty ctx, int lineno, PyArena *arena); +expr_ty List(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena); +expr_ty Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena); +slice_ty Ellipsis(PyArena *arena); +slice_ty Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); +slice_ty ExtSlice(asdl_seq * dims, PyArena *arena); +slice_ty Index(expr_ty value, PyArena *arena); +comprehension_ty comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, + PyArena *arena); +excepthandler_ty excepthandler(expr_ty type, expr_ty name, asdl_seq * body, + PyArena *arena); arguments_ty arguments(asdl_seq * args, identifier vararg, identifier kwarg, - asdl_seq * defaults); -keyword_ty keyword(identifier arg, expr_ty value); -alias_ty alias(identifier name, identifier asname); - -void free_mod(mod_ty); -void free_stmt(stmt_ty); -void free_expr(expr_ty); -void free_expr_context(expr_context_ty); -void free_slice(slice_ty); -void free_boolop(boolop_ty); -void free_operator(operator_ty); -void free_unaryop(unaryop_ty); -void free_cmpop(cmpop_ty); -void free_comprehension(comprehension_ty); -void free_excepthandler(excepthandler_ty); -void free_arguments(arguments_ty); -void free_keyword(keyword_ty); -void free_alias(alias_ty); + asdl_seq * defaults, PyArena *arena); +keyword_ty keyword(identifier arg, expr_ty value, PyArena *arena); +alias_ty alias(identifier name, identifier asname, PyArena *arena); Modified: python/trunk/Include/Python.h ============================================================================== --- python/trunk/Include/Python.h (original) +++ python/trunk/Include/Python.h Sat Dec 17 21:54:49 2005 @@ -113,6 +113,7 @@ #include "pystate.h" +#include "pyarena.h" #include "modsupport.h" #include "pythonrun.h" #include "ceval.h" Modified: python/trunk/Include/asdl.h ============================================================================== --- python/trunk/Include/asdl.h (original) +++ python/trunk/Include/asdl.h Sat Dec 17 21:54:49 2005 @@ -23,7 +23,7 @@ void *elements[1]; } asdl_seq; -asdl_seq *asdl_seq_new(int size); +asdl_seq *asdl_seq_new(int size, PyArena *arena); void asdl_seq_free(asdl_seq *); #ifdef Py_DEBUG Modified: python/trunk/Include/ast.h ============================================================================== --- python/trunk/Include/ast.h (original) +++ python/trunk/Include/ast.h Sat Dec 17 21:54:49 2005 @@ -5,7 +5,7 @@ #endif PyAPI_FUNC(mod_ty) PyAST_FromNode(const node *, PyCompilerFlags *flags, - const char *); + const char *, PyArena *); #ifdef __cplusplus } Modified: python/trunk/Include/compile.h ============================================================================== --- python/trunk/Include/compile.h (original) +++ python/trunk/Include/compile.h Sat Dec 17 21:54:49 2005 @@ -25,7 +25,7 @@ struct _mod; /* Declare the existence of this type */ PyAPI_FUNC(PyCodeObject *) PyAST_Compile(struct _mod *, const char *, - PyCompilerFlags *); + PyCompilerFlags *, PyArena *); PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); #define ERR_LATE_FUTURE \ Added: python/trunk/Include/pyarena.h ============================================================================== --- (empty file) +++ python/trunk/Include/pyarena.h Sat Dec 17 21:54:49 2005 @@ -0,0 +1,42 @@ +/* An arena-like memory interface for the compiler. + */ + +#ifndef Py_PYARENA_H +#define Py_PYARENA_H + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct _arena PyArena; + + /* PyArena_New() and PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory. Once it is freed, all the memory it allocated + is freed and none of its pointers are valid. + + PyArena_New() returns an arena pointer. On error, it + returns a negative number and sets an exception. + */ + PyAPI_FUNC(PyArena *) PyArena_New(void); + PyAPI_FUNC(void) PyArena_Free(PyArena *); + + PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t); + + /* The next two routines aren't proper arena allocation routines. + They exist to experiment with the arena API without making wholesale + changes to the implementation. + + The two functions register pointers with the arena id. These + are externally allocated pointers that will be freed when the + arena is freed. One takes a pointer allocated with malloc. The + other takes a PyObject that is DECREFed when the arena is freed. + */ + PyAPI_FUNC(int) PyArena_AddMallocPointer(PyArena *, void *); + PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYARENA_H */ Modified: python/trunk/Include/pythonrun.h ============================================================================== --- python/trunk/Include/pythonrun.h (original) +++ python/trunk/Include/pythonrun.h Sat Dec 17 21:54:49 2005 @@ -37,10 +37,12 @@ PyAPI_FUNC(int) PyRun_InteractiveLoopFlags(FILE *, const char *, PyCompilerFlags *); PyAPI_FUNC(struct _mod *) PyParser_ASTFromString(const char *, const char *, - int, PyCompilerFlags *flags); + int, PyCompilerFlags *flags, + PyArena *); PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile(FILE *, const char *, int, char *, char *, - PyCompilerFlags *, int *); + PyCompilerFlags *, int *, + PyArena *); #define PyParser_SimpleParseString(S, B) \ PyParser_SimpleParseStringFlags(S, B, 0) #define PyParser_SimpleParseFile(FP, S, B) \ Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Sat Dec 17 21:54:49 2005 @@ -254,6 +254,7 @@ Python/modsupport.o \ Python/mystrtoul.o \ Python/mysnprintf.o \ + Python/pyarena.o \ Python/pyfpe.o \ Python/pystate.o \ Python/pythonrun.o \ @@ -520,6 +521,7 @@ Include/object.h \ Include/objimpl.h \ Include/patchlevel.h \ + Include/pyarena.h \ Include/pydebug.h \ Include/pyerrors.h \ Include/pyfpe.h \ Modified: python/trunk/Parser/asdl_c.py ============================================================================== --- python/trunk/Parser/asdl_c.py (original) +++ python/trunk/Parser/asdl_c.py Sat Dec 17 21:54:49 2005 @@ -249,8 +249,9 @@ if args: argstr = ", ".join(["%s %s" % (atype, aname) for atype, aname, opt in args]) + argstr += ", PyArena *arena" else: - argstr = "void" + argstr = "PyArena *arena" self.emit("%s %s(%s);" % (ctype, name, argstr), 0) def visitProduct(self, prod, name): @@ -265,6 +266,10 @@ self.emit(s, depth, reflow) argstr = ", ".join(["%s %s" % (atype, aname) for atype, aname, opt in args + attrs]) + if argstr: + argstr += ", PyArena *arena" + else: + argstr = "PyArena *arena" self.emit("%s" % ctype, 0) emit("%s(%s)" % (name, argstr)) emit("{") @@ -280,7 +285,7 @@ emit('return NULL;', 2) emit('}', 1) - emit("p = (%s)malloc(sizeof(*p));" % ctype, 1) + emit("p = (%s)PyArena_Malloc(arena, sizeof(*p));" % ctype, 1); emit("if (!p) {", 1) emit("PyErr_NoMemory();", 2) emit("return NULL;", 2) @@ -655,7 +660,7 @@ c = ChainOfVisitors(TypeDefVisitor(f), StructVisitor(f), PrototypeVisitor(f), - FreePrototypeVisitor(f), +## FreePrototypeVisitor(f), ) c.visit(mod) f.close() @@ -671,8 +676,8 @@ print >> f v = ChainOfVisitors(MarshalPrototypeVisitor(f), FunctionVisitor(f), - FreeUtilVisitor(f), - FreeVisitor(f), +## FreeUtilVisitor(f), +## FreeVisitor(f), MarshalUtilVisitor(f), MarshalFunctionVisitor(f), ) Modified: python/trunk/Python/Python-ast.c ============================================================================== --- python/trunk/Python/Python-ast.c (original) +++ python/trunk/Python/Python-ast.c Sat Dec 17 21:54:49 2005 @@ -19,10 +19,10 @@ static int marshal_write_alias(PyObject **, int *, alias_ty); mod_ty -Module(asdl_seq * body) +Module(asdl_seq * body, PyArena *arena) { mod_ty p; - p = (mod_ty)malloc(sizeof(*p)); + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -33,10 +33,10 @@ } mod_ty -Interactive(asdl_seq * body) +Interactive(asdl_seq * body, PyArena *arena) { mod_ty p; - p = (mod_ty)malloc(sizeof(*p)); + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -47,7 +47,7 @@ } mod_ty -Expression(expr_ty body) +Expression(expr_ty body, PyArena *arena) { mod_ty p; if (!body) { @@ -55,7 +55,7 @@ "field body is required for Expression"); return NULL; } - p = (mod_ty)malloc(sizeof(*p)); + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -66,10 +66,10 @@ } mod_ty -Suite(asdl_seq * body) +Suite(asdl_seq * body, PyArena *arena) { mod_ty p; - p = (mod_ty)malloc(sizeof(*p)); + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -81,7 +81,7 @@ stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * - decorators, int lineno) + decorators, int lineno, PyArena *arena) { stmt_ty p; if (!name) { @@ -94,7 +94,7 @@ "field args is required for FunctionDef"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -109,7 +109,8 @@ } stmt_ty -ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int lineno) +ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int lineno, + PyArena *arena) { stmt_ty p; if (!name) { @@ -117,7 +118,7 @@ "field name is required for ClassDef"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -131,10 +132,10 @@ } stmt_ty -Return(expr_ty value, int lineno) +Return(expr_ty value, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -146,10 +147,10 @@ } stmt_ty -Delete(asdl_seq * targets, int lineno) +Delete(asdl_seq * targets, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -161,7 +162,7 @@ } stmt_ty -Assign(asdl_seq * targets, expr_ty value, int lineno) +Assign(asdl_seq * targets, expr_ty value, int lineno, PyArena *arena) { stmt_ty p; if (!value) { @@ -169,7 +170,7 @@ "field value is required for Assign"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -182,7 +183,8 @@ } stmt_ty -AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno) +AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, PyArena + *arena) { stmt_ty p; if (!target) { @@ -200,7 +202,7 @@ "field value is required for AugAssign"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -214,10 +216,10 @@ } stmt_ty -Print(expr_ty dest, asdl_seq * values, bool nl, int lineno) +Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -232,7 +234,7 @@ stmt_ty For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int - lineno) + lineno, PyArena *arena) { stmt_ty p; if (!target) { @@ -245,7 +247,7 @@ "field iter is required for For"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -260,7 +262,8 @@ } stmt_ty -While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno) +While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, PyArena + *arena) { stmt_ty p; if (!test) { @@ -268,7 +271,7 @@ "field test is required for While"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -282,7 +285,7 @@ } stmt_ty -If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno) +If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, PyArena *arena) { stmt_ty p; if (!test) { @@ -290,7 +293,7 @@ "field test is required for If"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -304,10 +307,10 @@ } stmt_ty -Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno) +Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -321,10 +324,11 @@ } stmt_ty -TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno) +TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno, + PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -338,10 +342,10 @@ } stmt_ty -TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno) +TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -354,7 +358,7 @@ } stmt_ty -Assert(expr_ty test, expr_ty msg, int lineno) +Assert(expr_ty test, expr_ty msg, int lineno, PyArena *arena) { stmt_ty p; if (!test) { @@ -362,7 +366,7 @@ "field test is required for Assert"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -375,10 +379,10 @@ } stmt_ty -Import(asdl_seq * names, int lineno) +Import(asdl_seq * names, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -390,7 +394,7 @@ } stmt_ty -ImportFrom(identifier module, asdl_seq * names, int lineno) +ImportFrom(identifier module, asdl_seq * names, int lineno, PyArena *arena) { stmt_ty p; if (!module) { @@ -398,7 +402,7 @@ "field module is required for ImportFrom"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -411,7 +415,7 @@ } stmt_ty -Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno) +Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, PyArena *arena) { stmt_ty p; if (!body) { @@ -419,7 +423,7 @@ "field body is required for Exec"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -433,10 +437,10 @@ } stmt_ty -Global(asdl_seq * names, int lineno) +Global(asdl_seq * names, int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -448,7 +452,7 @@ } stmt_ty -Expr(expr_ty value, int lineno) +Expr(expr_ty value, int lineno, PyArena *arena) { stmt_ty p; if (!value) { @@ -456,7 +460,7 @@ "field value is required for Expr"); return NULL; } - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -468,10 +472,10 @@ } stmt_ty -Pass(int lineno) +Pass(int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -482,10 +486,10 @@ } stmt_ty -Break(int lineno) +Break(int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -496,10 +500,10 @@ } stmt_ty -Continue(int lineno) +Continue(int lineno, PyArena *arena) { stmt_ty p; - p = (stmt_ty)malloc(sizeof(*p)); + p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -510,7 +514,7 @@ } expr_ty -BoolOp(boolop_ty op, asdl_seq * values, int lineno) +BoolOp(boolop_ty op, asdl_seq * values, int lineno, PyArena *arena) { expr_ty p; if (!op) { @@ -518,7 +522,7 @@ "field op is required for BoolOp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -531,7 +535,7 @@ } expr_ty -BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno) +BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, PyArena *arena) { expr_ty p; if (!left) { @@ -549,7 +553,7 @@ "field right is required for BinOp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -563,7 +567,7 @@ } expr_ty -UnaryOp(unaryop_ty op, expr_ty operand, int lineno) +UnaryOp(unaryop_ty op, expr_ty operand, int lineno, PyArena *arena) { expr_ty p; if (!op) { @@ -576,7 +580,7 @@ "field operand is required for UnaryOp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -589,7 +593,7 @@ } expr_ty -Lambda(arguments_ty args, expr_ty body, int lineno) +Lambda(arguments_ty args, expr_ty body, int lineno, PyArena *arena) { expr_ty p; if (!args) { @@ -602,7 +606,7 @@ "field body is required for Lambda"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -615,10 +619,10 @@ } expr_ty -Dict(asdl_seq * keys, asdl_seq * values, int lineno) +Dict(asdl_seq * keys, asdl_seq * values, int lineno, PyArena *arena) { expr_ty p; - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -631,7 +635,7 @@ } expr_ty -ListComp(expr_ty elt, asdl_seq * generators, int lineno) +ListComp(expr_ty elt, asdl_seq * generators, int lineno, PyArena *arena) { expr_ty p; if (!elt) { @@ -639,7 +643,7 @@ "field elt is required for ListComp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -652,7 +656,7 @@ } expr_ty -GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno) +GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, PyArena *arena) { expr_ty p; if (!elt) { @@ -660,7 +664,7 @@ "field elt is required for GeneratorExp"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -673,10 +677,10 @@ } expr_ty -Yield(expr_ty value, int lineno) +Yield(expr_ty value, int lineno, PyArena *arena) { expr_ty p; - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -688,7 +692,8 @@ } expr_ty -Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno) +Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno, + PyArena *arena) { expr_ty p; if (!left) { @@ -696,7 +701,7 @@ "field left is required for Compare"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -711,7 +716,7 @@ expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty starargs, - expr_ty kwargs, int lineno) + expr_ty kwargs, int lineno, PyArena *arena) { expr_ty p; if (!func) { @@ -719,7 +724,7 @@ "field func is required for Call"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -735,7 +740,7 @@ } expr_ty -Repr(expr_ty value, int lineno) +Repr(expr_ty value, int lineno, PyArena *arena) { expr_ty p; if (!value) { @@ -743,7 +748,7 @@ "field value is required for Repr"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -755,7 +760,7 @@ } expr_ty -Num(object n, int lineno) +Num(object n, int lineno, PyArena *arena) { expr_ty p; if (!n) { @@ -763,7 +768,7 @@ "field n is required for Num"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -775,7 +780,7 @@ } expr_ty -Str(string s, int lineno) +Str(string s, int lineno, PyArena *arena) { expr_ty p; if (!s) { @@ -783,7 +788,7 @@ "field s is required for Str"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -795,7 +800,8 @@ } expr_ty -Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno) +Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, + PyArena *arena) { expr_ty p; if (!value) { @@ -813,7 +819,7 @@ "field ctx is required for Attribute"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -827,7 +833,8 @@ } expr_ty -Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno) +Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, + PyArena *arena) { expr_ty p; if (!value) { @@ -845,7 +852,7 @@ "field ctx is required for Subscript"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -859,7 +866,7 @@ } expr_ty -Name(identifier id, expr_context_ty ctx, int lineno) +Name(identifier id, expr_context_ty ctx, int lineno, PyArena *arena) { expr_ty p; if (!id) { @@ -872,7 +879,7 @@ "field ctx is required for Name"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -885,7 +892,7 @@ } expr_ty -List(asdl_seq * elts, expr_context_ty ctx, int lineno) +List(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena) { expr_ty p; if (!ctx) { @@ -893,7 +900,7 @@ "field ctx is required for List"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -906,7 +913,7 @@ } expr_ty -Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno) +Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena) { expr_ty p; if (!ctx) { @@ -914,7 +921,7 @@ "field ctx is required for Tuple"); return NULL; } - p = (expr_ty)malloc(sizeof(*p)); + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -927,10 +934,10 @@ } slice_ty -Ellipsis() +Ellipsis(PyArena *arena) { slice_ty p; - p = (slice_ty)malloc(sizeof(*p)); + p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -940,10 +947,10 @@ } slice_ty -Slice(expr_ty lower, expr_ty upper, expr_ty step) +Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena) { slice_ty p; - p = (slice_ty)malloc(sizeof(*p)); + p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -956,10 +963,10 @@ } slice_ty -ExtSlice(asdl_seq * dims) +ExtSlice(asdl_seq * dims, PyArena *arena) { slice_ty p; - p = (slice_ty)malloc(sizeof(*p)); + p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -970,7 +977,7 @@ } slice_ty -Index(expr_ty value) +Index(expr_ty value, PyArena *arena) { slice_ty p; if (!value) { @@ -978,7 +985,7 @@ "field value is required for Index"); return NULL; } - p = (slice_ty)malloc(sizeof(*p)); + p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -989,7 +996,7 @@ } comprehension_ty -comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs) +comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena) { comprehension_ty p; if (!target) { @@ -1002,7 +1009,7 @@ "field iter is required for comprehension"); return NULL; } - p = (comprehension_ty)malloc(sizeof(*p)); + p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1014,10 +1021,10 @@ } excepthandler_ty -excepthandler(expr_ty type, expr_ty name, asdl_seq * body) +excepthandler(expr_ty type, expr_ty name, asdl_seq * body, PyArena *arena) { excepthandler_ty p; - p = (excepthandler_ty)malloc(sizeof(*p)); + p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1030,10 +1037,10 @@ arguments_ty arguments(asdl_seq * args, identifier vararg, identifier kwarg, asdl_seq * - defaults) + defaults, PyArena *arena) { arguments_ty p; - p = (arguments_ty)malloc(sizeof(*p)); + p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1046,7 +1053,7 @@ } keyword_ty -keyword(identifier arg, expr_ty value) +keyword(identifier arg, expr_ty value, PyArena *arena) { keyword_ty p; if (!arg) { @@ -1059,7 +1066,7 @@ "field value is required for keyword"); return NULL; } - p = (keyword_ty)malloc(sizeof(*p)); + p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1070,7 +1077,7 @@ } alias_ty -alias(identifier name, identifier asname) +alias(identifier name, identifier asname, PyArena *arena) { alias_ty p; if (!name) { @@ -1078,7 +1085,7 @@ "field name is required for alias"); return NULL; } - p = (alias_ty)malloc(sizeof(*p)); + p = (alias_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) { PyErr_NoMemory(); return NULL; @@ -1089,454 +1096,6 @@ } -static void -free_seq_exprs(asdl_seq *seq) -{ - int i, n; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_expr((expr_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); -} - -static void -free_seq_stmts(asdl_seq *seq) -{ - int i, n; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_stmt((stmt_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); -} - - -void -free_mod(mod_ty o) -{ - if (!o) - return; - - switch (o->kind) { - case Module_kind: - free_seq_stmts(o->v.Module.body); - break; - case Interactive_kind: - free_seq_stmts(o->v.Interactive.body); - break; - case Expression_kind: - free_expr((expr_ty)o->v.Expression.body); - break; - case Suite_kind: - free_seq_stmts(o->v.Suite.body); - break; - } - - free(o); -} - -void -free_stmt(stmt_ty o) -{ - int i, n; - asdl_seq *seq; - - if (!o) - return; - - switch (o->kind) { - case FunctionDef_kind: - Py_DECREF((identifier)o->v.FunctionDef.name); - free_arguments((arguments_ty)o->v.FunctionDef.args); - free_seq_stmts(o->v.FunctionDef.body); - free_seq_exprs(o->v.FunctionDef.decorators); - break; - case ClassDef_kind: - Py_DECREF((identifier)o->v.ClassDef.name); - free_seq_exprs(o->v.ClassDef.bases); - free_seq_stmts(o->v.ClassDef.body); - break; - case Return_kind: - if (o->v.Return.value) { - free_expr((expr_ty)o->v.Return.value); - } - break; - case Delete_kind: - free_seq_exprs(o->v.Delete.targets); - break; - case Assign_kind: - free_seq_exprs(o->v.Assign.targets); - free_expr((expr_ty)o->v.Assign.value); - break; - case AugAssign_kind: - free_expr((expr_ty)o->v.AugAssign.target); - free_operator((operator_ty)o->v.AugAssign.op); - free_expr((expr_ty)o->v.AugAssign.value); - break; - case Print_kind: - if (o->v.Print.dest) { - free_expr((expr_ty)o->v.Print.dest); - } - free_seq_exprs(o->v.Print.values); - break; - case For_kind: - free_expr((expr_ty)o->v.For.target); - free_expr((expr_ty)o->v.For.iter); - free_seq_stmts(o->v.For.body); - free_seq_stmts(o->v.For.orelse); - break; - case While_kind: - free_expr((expr_ty)o->v.While.test); - free_seq_stmts(o->v.While.body); - free_seq_stmts(o->v.While.orelse); - break; - case If_kind: - free_expr((expr_ty)o->v.If.test); - free_seq_stmts(o->v.If.body); - free_seq_stmts(o->v.If.orelse); - break; - case Raise_kind: - if (o->v.Raise.type) { - free_expr((expr_ty)o->v.Raise.type); - } - if (o->v.Raise.inst) { - free_expr((expr_ty)o->v.Raise.inst); - } - if (o->v.Raise.tback) { - free_expr((expr_ty)o->v.Raise.tback); - } - break; - case TryExcept_kind: - free_seq_stmts(o->v.TryExcept.body); - seq = o->v.TryExcept.handlers; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_excepthandler((excepthandler_ty)asdl_seq_GET(seq, - i)); - asdl_seq_free(seq); - free_seq_stmts(o->v.TryExcept.orelse); - break; - case TryFinally_kind: - free_seq_stmts(o->v.TryFinally.body); - free_seq_stmts(o->v.TryFinally.finalbody); - break; - case Assert_kind: - free_expr((expr_ty)o->v.Assert.test); - if (o->v.Assert.msg) { - free_expr((expr_ty)o->v.Assert.msg); - } - break; - case Import_kind: - seq = o->v.Import.names; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_alias((alias_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - break; - case ImportFrom_kind: - Py_DECREF((identifier)o->v.ImportFrom.module); - seq = o->v.ImportFrom.names; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_alias((alias_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - break; - case Exec_kind: - free_expr((expr_ty)o->v.Exec.body); - if (o->v.Exec.globals) { - free_expr((expr_ty)o->v.Exec.globals); - } - if (o->v.Exec.locals) { - free_expr((expr_ty)o->v.Exec.locals); - } - break; - case Global_kind: - seq = o->v.Global.names; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - Py_DECREF((identifier)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - break; - case Expr_kind: - free_expr((expr_ty)o->v.Expr.value); - break; - case Pass_kind: - break; - case Break_kind: - break; - case Continue_kind: - break; - } - - free(o); -} - -void -free_expr(expr_ty o) -{ - int i, n; - asdl_seq *seq; - - if (!o) - return; - - switch (o->kind) { - case BoolOp_kind: - free_boolop((boolop_ty)o->v.BoolOp.op); - free_seq_exprs(o->v.BoolOp.values); - break; - case BinOp_kind: - free_expr((expr_ty)o->v.BinOp.left); - free_operator((operator_ty)o->v.BinOp.op); - free_expr((expr_ty)o->v.BinOp.right); - break; - case UnaryOp_kind: - free_unaryop((unaryop_ty)o->v.UnaryOp.op); - free_expr((expr_ty)o->v.UnaryOp.operand); - break; - case Lambda_kind: - free_arguments((arguments_ty)o->v.Lambda.args); - free_expr((expr_ty)o->v.Lambda.body); - break; - case Dict_kind: - free_seq_exprs(o->v.Dict.keys); - free_seq_exprs(o->v.Dict.values); - break; - case ListComp_kind: - free_expr((expr_ty)o->v.ListComp.elt); - seq = o->v.ListComp.generators; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_comprehension((comprehension_ty)asdl_seq_GET(seq, - i)); - asdl_seq_free(seq); - break; - case GeneratorExp_kind: - free_expr((expr_ty)o->v.GeneratorExp.elt); - seq = o->v.GeneratorExp.generators; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_comprehension((comprehension_ty)asdl_seq_GET(seq, - i)); - asdl_seq_free(seq); - break; - case Yield_kind: - if (o->v.Yield.value) { - free_expr((expr_ty)o->v.Yield.value); - } - break; - case Compare_kind: - free_expr((expr_ty)o->v.Compare.left); - seq = o->v.Compare.ops; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_cmpop((cmpop_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - free_seq_exprs(o->v.Compare.comparators); - break; - case Call_kind: - free_expr((expr_ty)o->v.Call.func); - free_seq_exprs(o->v.Call.args); - seq = o->v.Call.keywords; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_keyword((keyword_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - if (o->v.Call.starargs) { - free_expr((expr_ty)o->v.Call.starargs); - } - if (o->v.Call.kwargs) { - free_expr((expr_ty)o->v.Call.kwargs); - } - break; - case Repr_kind: - free_expr((expr_ty)o->v.Repr.value); - break; - case Num_kind: - Py_DECREF((object)o->v.Num.n); - break; - case Str_kind: - Py_DECREF((string)o->v.Str.s); - break; - case Attribute_kind: - free_expr((expr_ty)o->v.Attribute.value); - Py_DECREF((identifier)o->v.Attribute.attr); - free_expr_context((expr_context_ty)o->v.Attribute.ctx); - break; - case Subscript_kind: - free_expr((expr_ty)o->v.Subscript.value); - free_slice((slice_ty)o->v.Subscript.slice); - free_expr_context((expr_context_ty)o->v.Subscript.ctx); - break; - case Name_kind: - Py_DECREF((identifier)o->v.Name.id); - free_expr_context((expr_context_ty)o->v.Name.ctx); - break; - case List_kind: - free_seq_exprs(o->v.List.elts); - free_expr_context((expr_context_ty)o->v.List.ctx); - break; - case Tuple_kind: - free_seq_exprs(o->v.Tuple.elts); - free_expr_context((expr_context_ty)o->v.Tuple.ctx); - break; - } - - free(o); -} - -void -free_expr_context(expr_context_ty o) -{ - if (!o) - return; - -} - -void -free_slice(slice_ty o) -{ - int i, n; - asdl_seq *seq; - - if (!o) - return; - - switch (o->kind) { - case Ellipsis_kind: - break; - case Slice_kind: - if (o->v.Slice.lower) { - free_expr((expr_ty)o->v.Slice.lower); - } - if (o->v.Slice.upper) { - free_expr((expr_ty)o->v.Slice.upper); - } - if (o->v.Slice.step) { - free_expr((expr_ty)o->v.Slice.step); - } - break; - case ExtSlice_kind: - seq = o->v.ExtSlice.dims; - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_slice((slice_ty)asdl_seq_GET(seq, i)); - asdl_seq_free(seq); - break; - case Index_kind: - free_expr((expr_ty)o->v.Index.value); - break; - } - - free(o); -} - -void -free_boolop(boolop_ty o) -{ - if (!o) - return; - -} - -void -free_operator(operator_ty o) -{ - if (!o) - return; - -} - -void -free_unaryop(unaryop_ty o) -{ - if (!o) - return; - -} - -void -free_cmpop(cmpop_ty o) -{ - if (!o) - return; - -} - -void -free_comprehension(comprehension_ty o) -{ - if (!o) - return; - - free_expr((expr_ty)o->target); - free_expr((expr_ty)o->iter); - free_seq_exprs(o->ifs); - - free(o); -} - -void -free_excepthandler(excepthandler_ty o) -{ - if (!o) - return; - - if (o->type) { - free_expr((expr_ty)o->type); - } - if (o->name) { - free_expr((expr_ty)o->name); - } - free_seq_stmts(o->body); - - free(o); -} - -void -free_arguments(arguments_ty o) -{ - if (!o) - return; - - free_seq_exprs(o->args); - if (o->vararg) { - Py_DECREF((identifier)o->vararg); - } - if (o->kwarg) { - Py_DECREF((identifier)o->kwarg); - } - free_seq_exprs(o->defaults); - - free(o); -} - -void -free_keyword(keyword_ty o) -{ - if (!o) - return; - - Py_DECREF((identifier)o->arg); - free_expr((expr_ty)o->value); - - free(o); -} - -void -free_alias(alias_ty o) -{ - if (!o) - return; - - Py_DECREF((identifier)o->name); - if (o->asname) { - Py_DECREF((identifier)o->asname); - } - - free(o); -} - - #define CHECKSIZE(BUF, OFF, MIN) { \ int need = *(OFF) + MIN; \ Modified: python/trunk/Python/asdl.c ============================================================================== --- python/trunk/Python/asdl.c (original) +++ python/trunk/Python/asdl.c Sat Dec 17 21:54:49 2005 @@ -2,17 +2,18 @@ #include "asdl.h" asdl_seq * -asdl_seq_new(int size) +asdl_seq_new(int size, PyArena *arena) { asdl_seq *seq = NULL; size_t n = sizeof(asdl_seq) + (size ? (sizeof(void *) * (size - 1)) : 0); - seq = (asdl_seq *)PyObject_Malloc(n); + seq = (asdl_seq *)malloc(n); if (!seq) { PyErr_NoMemory(); return NULL; } + PyArena_AddMallocPointer(arena, (void *)seq); memset(seq, 0, n); seq->size = size; return seq; @@ -21,6 +22,4 @@ void asdl_seq_free(asdl_seq *seq) { - PyObject_Free(seq); } - Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Sat Dec 17 21:54:49 2005 @@ -7,6 +7,7 @@ #include "Python-ast.h" #include "grammar.h" #include "node.h" +#include "pyarena.h" #include "ast.h" #include "token.h" #include "parsetok.h" @@ -20,51 +21,10 @@ - syntax errors */ -/* - Note: - - You should rarely need to use the asdl_seq_free() in this file. - If you use asdl_seq_free(), you will leak any objects held in the seq. - If there is an appropriate asdl_*_seq_free() function, use it. - If there isn't an asdl_*_seq_free() function for you, you will - need to loop over the data in the sequence and free it. - - asdl_seq* seq; - int i; - - for (i = 0; i < asdl_seq_LEN(seq); i++) - free_***(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); / * ok * / - - Almost all of the ast functions return a seq of expr, so you should - use asdl_expr_seq_free(). The exception is ast_for_suite() which - returns a seq of stmt's, so use asdl_stmt_seq_free() to free it. - - If asdl_seq_free is appropriate, you should mark it with an ok comment. - - There are still many memory problems in this file even though - it runs clean in valgrind, save one problem that may have existed - before the AST. - - Any code which does something like this: - - return ASTconstruct(local, LINENO(n)); - - will leak memory. The problem is if ASTconstruct (e.g., TryFinally) - cannot allocate memory, local will be leaked. - - There was discussion on python-dev to replace the entire allocation - scheme in this file with arenas. Basically rather than allocate - memory in little blocks with malloc(), we allocate one big honking - hunk and deref everything into this block. We would still need - another block or technique to handle the PyObject*s. - - http://mail.python.org/pipermail/python-dev/2005-November/058138.html -*/ - /* Data structure used internally */ struct compiling { - char *c_encoding; /* source encoding */ + char *c_encoding; /* source encoding */ + PyArena *c_arena; /* arena for allocating memeory */ }; static asdl_seq *seq_for_testlist(struct compiling *, const node *); @@ -86,63 +46,14 @@ #define LINENO(n) ((n)->n_lineno) #endif -#define NEW_IDENTIFIER(n) PyString_InternFromString(STR(n)) - -static void -asdl_stmt_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_stmt(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ +static identifier +new_identifier(const char* n, PyArena *arena) { + PyObject* id = PyString_InternFromString(n); + PyArena_AddPyObject(arena, id); + return id; } -static void -asdl_expr_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_expr(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_alias_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_alias(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} - -static void -asdl_comprehension_seq_free(asdl_seq* seq) -{ - int n, i; - - if (!seq) - return; - - n = asdl_seq_LEN(seq); - for (i = 0; i < n; i++) - free_comprehension(asdl_seq_GET(seq, i)); - asdl_seq_free(seq); /* ok */ -} +#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena) /* This routine provides an invalid object for the syntax error. The outermost routine must unpack this error and create the @@ -269,7 +180,8 @@ */ mod_ty -PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename) +PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, + PyArena *arena) { int i, j, num; asdl_seq *stmts = NULL; @@ -278,17 +190,18 @@ struct compiling c; if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) { - c.c_encoding = "utf-8"; + c.c_encoding = "utf-8"; } else if (TYPE(n) == encoding_decl) { c.c_encoding = STR(n); n = CHILD(n, 0); } else { c.c_encoding = NULL; } + c.c_arena = arena; switch (TYPE(n)) { case file_input: - stmts = asdl_seq_new(num_stmts(n)); + stmts = asdl_seq_new(num_stmts(n), arena); if (!stmts) return NULL; for (i = 0; i < NCH(n) - 1; i++) { @@ -314,7 +227,7 @@ } } } - return Module(stmts); + return Module(stmts, arena); case eval_input: { expr_ty testlist_ast; @@ -322,20 +235,20 @@ testlist_ast = ast_for_testlist(&c, CHILD(n, 0)); if (!testlist_ast) goto error; - return Expression(testlist_ast); + return Expression(testlist_ast, arena); } case single_input: if (TYPE(CHILD(n, 0)) == NEWLINE) { - stmts = asdl_seq_new(1); + stmts = asdl_seq_new(1, arena); if (!stmts) goto error; - asdl_seq_SET(stmts, 0, Pass(n->n_lineno)); - return Interactive(stmts); + asdl_seq_SET(stmts, 0, Pass(n->n_lineno, arena)); + return Interactive(stmts, arena); } else { n = CHILD(n, 0); num = num_stmts(n); - stmts = asdl_seq_new(num); + stmts = asdl_seq_new(num, arena); if (!stmts) goto error; if (num == 1) { @@ -358,14 +271,12 @@ } } - return Interactive(stmts); + return Interactive(stmts, arena); } default: goto error; } error: - if (stmts) - asdl_stmt_seq_free(stmts); ast_error_finish(filename); return NULL; } @@ -589,7 +500,7 @@ || TYPE(n) == testlist_safe ); - seq = asdl_seq_new((NCH(n) + 1) / 2); + seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; @@ -597,10 +508,8 @@ REQ(CHILD(n, i), test); expression = ast_for_expr(c, CHILD(n, i)); - if (!expression) { - asdl_expr_seq_free(seq); + if (!expression) return NULL; - } assert(i / 2 < seq->size); asdl_seq_SET(seq, i / 2, expression); @@ -609,11 +518,11 @@ } static expr_ty -compiler_complex_args(const node *n) +compiler_complex_args(struct compiling *c, const node *n) { int i, len = (NCH(n) + 1) / 2; expr_ty result; - asdl_seq *args = asdl_seq_new(len); + asdl_seq *args = asdl_seq_new(len, c->c_arena); if (!args) return NULL; @@ -627,15 +536,16 @@ ast_error(child, "assignment to None"); return NULL; } - arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child)); + arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child), + c->c_arena); } else - arg = compiler_complex_args(CHILD(CHILD(n, 2*i), 1)); + arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1)); set_context(arg, Store, n); asdl_seq_SET(args, i, arg); } - result = Tuple(args, Store, LINENO(n)); + result = Tuple(args, Store, LINENO(n), c->c_arena); set_context(result, Store, n); return result; } @@ -660,7 +570,7 @@ if (TYPE(n) == parameters) { if (NCH(n) == 2) /* () as argument list */ - return arguments(NULL, NULL, NULL, NULL); + return arguments(NULL, NULL, NULL, NULL, c->c_arena); n = CHILD(n, 1); } REQ(n, varargslist); @@ -674,10 +584,10 @@ if (TYPE(ch) == EQUAL) n_defaults++; } - args = (n_args ? asdl_seq_new(n_args) : NULL); + args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL); if (!args && n_args) return NULL; /* Don't need to go to NULL; nothing allocated */ - defaults = (n_defaults ? asdl_seq_new(n_defaults) : NULL); + defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL); if (!defaults && n_defaults) goto error; @@ -706,7 +616,7 @@ if (NCH(ch) == 3) { asdl_seq_APPEND(args, - compiler_complex_args(CHILD(ch, 1))); + compiler_complex_args(c, CHILD(ch, 1))); } else if (TYPE(CHILD(ch, 0)) == NAME) { expr_ty name; @@ -715,7 +625,7 @@ goto error; } name = Name(NEW_IDENTIFIER(CHILD(ch, 0)), - Param, LINENO(ch)); + Param, LINENO(ch), c->c_arena); if (!name) goto error; asdl_seq_APPEND(args, name); @@ -747,15 +657,11 @@ } } - return arguments(args, vararg, kwarg, defaults); + return arguments(args, vararg, kwarg, defaults, c->c_arena); error: Py_XDECREF(vararg); Py_XDECREF(kwarg); - if (args) - asdl_expr_seq_free(args); - if (defaults) - asdl_expr_seq_free(defaults); return NULL; } @@ -771,29 +677,24 @@ id = NEW_IDENTIFIER(CHILD(n, 0)); if (!id) - goto error; - e = Name(id, Load, LINENO(n)); + return NULL; + e = Name(id, Load, LINENO(n), c->c_arena); if (!e) - goto error; + return NULL; id = NULL; for (i = 2; i < NCH(n); i+=2) { id = NEW_IDENTIFIER(CHILD(n, i)); if (!id) - goto error; - attrib = Attribute(e, id, Load, LINENO(CHILD(n, i))); + return NULL; + attrib = Attribute(e, id, Load, LINENO(CHILD(n, i)), c->c_arena); if (!attrib) - goto error; + return NULL; e = attrib; attrib = NULL; } return e; - - error: - Py_XDECREF(id); - free_expr(e); - return NULL; } static expr_ty @@ -808,36 +709,31 @@ if ((NCH(n) < 3 && NCH(n) != 5 && NCH(n) != 6) || TYPE(CHILD(n, 0)) != AT || TYPE(RCHILD(n, -1)) != NEWLINE) { ast_error(n, "Invalid decorator node"); - goto error; + return NULL; } name_expr = ast_for_dotted_name(c, CHILD(n, 1)); if (!name_expr) - goto error; + return NULL; if (NCH(n) == 3) { /* No arguments */ d = name_expr; name_expr = NULL; } else if (NCH(n) == 5) { /* Call with no arguments */ - d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n)); + d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena); if (!d) - goto error; + return NULL; name_expr = NULL; } else { d = ast_for_call(c, CHILD(n, 3), name_expr); if (!d) - goto error; + return NULL; name_expr = NULL; } return d; - - error: - free_expr(name_expr); - free_expr(d); - return NULL; } static asdl_seq* @@ -849,20 +745,17 @@ REQ(n, decorators); - decorator_seq = asdl_seq_new(NCH(n)); + decorator_seq = asdl_seq_new(NCH(n), c->c_arena); if (!decorator_seq) return NULL; for (i = 0; i < NCH(n); i++) { d = ast_for_decorator(c, CHILD(n, i)); if (!d) - goto error; + return NULL; asdl_seq_APPEND(decorator_seq, d); } return decorator_seq; - error: - asdl_expr_seq_free(decorator_seq); - return NULL; } static stmt_ty @@ -880,7 +773,7 @@ if (NCH(n) == 6) { /* decorators are present */ decorator_seq = ast_for_decorators(c, CHILD(n, 0)); if (!decorator_seq) - goto error; + return NULL; name_i = 2; } else { @@ -889,26 +782,19 @@ name = NEW_IDENTIFIER(CHILD(n, name_i)); if (!name) - goto error; + return NULL; else if (!strcmp(STR(CHILD(n, name_i)), "None")) { ast_error(CHILD(n, name_i), "assignment to None"); - goto error; + return NULL; } args = ast_for_arguments(c, CHILD(n, name_i + 1)); if (!args) - goto error; + return NULL; body = ast_for_suite(c, CHILD(n, name_i + 3)); if (!body) - goto error; - - return FunctionDef(name, args, body, decorator_seq, LINENO(n)); + return NULL; -error: - asdl_stmt_seq_free(body); - asdl_expr_seq_free(decorator_seq); - free_arguments(args); - Py_XDECREF(name); - return NULL; + return FunctionDef(name, args, body, decorator_seq, LINENO(n), c->c_arena); } static expr_ty @@ -919,27 +805,23 @@ expr_ty expression; if (NCH(n) == 3) { - args = arguments(NULL, NULL, NULL, NULL); + args = arguments(NULL, NULL, NULL, NULL, c->c_arena); if (!args) return NULL; expression = ast_for_expr(c, CHILD(n, 2)); - if (!expression) { - free_arguments(args); + if (!expression) return NULL; - } } else { args = ast_for_arguments(c, CHILD(n, 1)); if (!args) return NULL; expression = ast_for_expr(c, CHILD(n, 3)); - if (!expression) { - free_arguments(args); + if (!expression) return NULL; - } } - return Lambda(args, expression, LINENO(n)); + return Lambda(args, expression, LINENO(n), c->c_arena); } /* Count the number of 'for' loop in a list comprehension. @@ -1028,12 +910,10 @@ if (n_fors == -1) return NULL; - listcomps = asdl_seq_new(n_fors); - if (!listcomps) { - free_expr(elt); + listcomps = asdl_seq_new(n_fors, c->c_arena); + if (!listcomps) return NULL; - } - + ch = CHILD(n, 1); for (i = 0; i < n_fors; i++) { comprehension_ty lc; @@ -1043,35 +923,20 @@ REQ(ch, list_for); t = ast_for_exprlist(c, CHILD(ch, 1), Store); - if (!t) { - asdl_comprehension_seq_free(listcomps); - free_expr(elt); + if (!t) return NULL; - } expression = ast_for_testlist(c, CHILD(ch, 3)); - if (!expression) { - asdl_expr_seq_free(t); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); + if (!expression) return NULL; - } - if (asdl_seq_LEN(t) == 1) { - lc = comprehension(asdl_seq_GET(t, 0), expression, NULL); - /* only free the sequence since we grabbed element 0 above */ - if (lc) - asdl_seq_free(t); /* ok */ - } + if (asdl_seq_LEN(t) == 1) + lc = comprehension(asdl_seq_GET(t, 0), expression, NULL, + c->c_arena); else - lc = comprehension(Tuple(t, Store, LINENO(ch)), expression, NULL); - - if (!lc) { - asdl_expr_seq_free(t); - asdl_comprehension_seq_free(listcomps); - free_expr(expression); - free_expr(elt); + lc = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena), + expression, NULL, c->c_arena); + if (!lc) return NULL; - } if (NCH(ch) == 5) { int j, n_ifs; @@ -1079,20 +944,12 @@ ch = CHILD(ch, 4); n_ifs = count_list_ifs(ch); - if (n_ifs == -1) { - free_comprehension(lc); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); + if (n_ifs == -1) return NULL; - } - ifs = asdl_seq_new(n_ifs); - if (!ifs) { - free_comprehension(lc); - asdl_comprehension_seq_free(listcomps); - free_expr(elt); + ifs = asdl_seq_new(n_ifs, c->c_arena); + if (!ifs) return NULL; - } for (j = 0; j < n_ifs; j++) { REQ(ch, list_iter); @@ -1112,7 +969,7 @@ asdl_seq_APPEND(listcomps, lc); } - return ListComp(elt, listcomps, LINENO(n)); + return ListComp(elt, listcomps, LINENO(n), c->c_arena); } /* @@ -1198,13 +1055,11 @@ n_fors = count_gen_fors(n); if (n_fors == -1) return NULL; - - genexps = asdl_seq_new(n_fors); - if (!genexps) { - free_expr(elt); + + genexps = asdl_seq_new(n_fors, c->c_arena); + if (!genexps) return NULL; - } - + ch = CHILD(n, 1); for (i = 0; i < n_fors; i++) { comprehension_ty ge; @@ -1214,59 +1069,35 @@ REQ(ch, gen_for); t = ast_for_exprlist(c, CHILD(ch, 1), Store); - if (!t) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); + if (!t) return NULL; - } expression = ast_for_expr(c, CHILD(ch, 3)); - if (!expression) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); + if (!expression) return NULL; - } - - if (asdl_seq_LEN(t) == 1) { + + if (asdl_seq_LEN(t) == 1) ge = comprehension(asdl_seq_GET(t, 0), expression, - NULL); - /* only free the sequence since we grabbed element 0 above */ - if (ge) - asdl_seq_free(t); /* ok */ - } + NULL, c->c_arena); else - ge = comprehension(Tuple(t, Store, LINENO(ch)), - expression, NULL); - - if (!ge) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); + ge = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena), + expression, NULL, c->c_arena); + + if (!ge) return NULL; - } - + if (NCH(ch) == 5) { int j, n_ifs; asdl_seq *ifs; ch = CHILD(ch, 4); n_ifs = count_gen_ifs(ch); - if (n_ifs == -1) { - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); + if (n_ifs == -1) return NULL; - } - - ifs = asdl_seq_new(n_ifs); - if (!ifs) { - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); + + ifs = asdl_seq_new(n_ifs, c->c_arena); + if (!ifs) return NULL; - } - + for (j = 0; j < n_ifs; j++) { expr_ty expression; REQ(ch, gen_iter); @@ -1274,13 +1105,8 @@ REQ(ch, gen_if); expression = ast_for_expr(c, CHILD(ch, 1)); - if (!expression) { - asdl_expr_seq_free(ifs); - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); + if (!expression) return NULL; - } asdl_seq_APPEND(ifs, expression); if (NCH(ch) == 3) ch = CHILD(ch, 2); @@ -1293,7 +1119,7 @@ asdl_seq_APPEND(genexps, ge); } - return GeneratorExp(elt, genexps, LINENO(n)); + return GeneratorExp(elt, genexps, LINENO(n), c->c_arena); } static expr_ty @@ -1308,28 +1134,28 @@ case NAME: /* All names start in Load context, but may later be changed. */ - return Name(NEW_IDENTIFIER(ch), Load, LINENO(n)); + return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), c->c_arena); case STRING: { PyObject *str = parsestrplus(c, n); - if (!str) return NULL; - - return Str(str, LINENO(n)); + + PyArena_AddPyObject(c->c_arena, str); + return Str(str, LINENO(n), c->c_arena); } case NUMBER: { PyObject *pynum = parsenumber(STR(ch)); - if (!pynum) return NULL; - - return Num(pynum, LINENO(n)); + + PyArena_AddPyObject(c->c_arena, pynum); + return Num(pynum, LINENO(n), c->c_arena); } case LPAR: /* some parenthesized expressions */ ch = CHILD(n, 1); if (TYPE(ch) == RPAR) - return Tuple(NULL, Load, LINENO(n)); + return Tuple(NULL, Load, LINENO(n), c->c_arena); if (TYPE(ch) == yield_expr) return ast_for_expr(c, ch); @@ -1342,16 +1168,15 @@ ch = CHILD(n, 1); if (TYPE(ch) == RSQB) - return List(NULL, Load, LINENO(n)); + return List(NULL, Load, LINENO(n), c->c_arena); REQ(ch, listmaker); if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { asdl_seq *elts = seq_for_testlist(c, ch); - if (!elts) return NULL; - - return List(elts, Load, LINENO(n)); + + return List(elts, Load, LINENO(n), c->c_arena); } else return ast_for_listcomp(c, ch); @@ -1362,46 +1187,37 @@ ch = CHILD(n, 1); size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ - keys = asdl_seq_new(size); + keys = asdl_seq_new(size, c->c_arena); if (!keys) return NULL; - values = asdl_seq_new(size); - if (!values) { - asdl_seq_free(keys); /* ok */ + values = asdl_seq_new(size, c->c_arena); + if (!values) return NULL; - } for (i = 0; i < NCH(ch); i += 4) { expr_ty expression; expression = ast_for_expr(c, CHILD(ch, i)); - if (!expression) { - asdl_expr_seq_free(keys); - asdl_expr_seq_free(values); + if (!expression) return NULL; - } - + asdl_seq_SET(keys, i / 4, expression); - + expression = ast_for_expr(c, CHILD(ch, i + 2)); - if (!expression) { - asdl_expr_seq_free(keys); - asdl_expr_seq_free(values); + if (!expression) return NULL; - } asdl_seq_SET(values, i / 4, expression); } - return Dict(keys, values, LINENO(n)); + return Dict(keys, values, LINENO(n), c->c_arena); } case BACKQUOTE: { /* repr */ expr_ty expression = ast_for_testlist(c, CHILD(n, 1)); - if (!expression) return NULL; - - return Repr(expression, LINENO(n)); + + return Repr(expression, LINENO(n), c->c_arena); } default: PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch)); @@ -1423,7 +1239,7 @@ */ ch = CHILD(n, 0); if (TYPE(ch) == DOT) - return Ellipsis(); + return Ellipsis(c->c_arena); if (NCH(n) == 1 && TYPE(ch) == test) { /* 'step' variable hold no significance in terms of being used over @@ -1432,7 +1248,7 @@ if (!step) return NULL; - return Index(step); + return Index(step, c->c_arena); } if (TYPE(ch) == test) { @@ -1477,7 +1293,7 @@ } } - return Slice(lower, upper, step); + return Slice(lower, upper, step, c->c_arena); } static expr_ty @@ -1504,7 +1320,7 @@ if (!operator) return NULL; - result = BinOp(expr1, operator, expr2, LINENO(n)); + result = BinOp(expr1, operator, expr2, LINENO(n), c->c_arena); if (!result) return NULL; @@ -1522,7 +1338,7 @@ return NULL; tmp_result = BinOp(result, operator, tmp, - LINENO(next_oper)); + LINENO(next_oper), c->c_arena); if (!tmp) return NULL; result = tmp_result; @@ -1538,7 +1354,7 @@ REQ(n, trailer); if (TYPE(CHILD(n, 0)) == LPAR) { if (NCH(n) == 2) - e = Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n)); + e = Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena); else e = ast_for_call(c, CHILD(n, 1), left_expr); } @@ -1549,40 +1365,32 @@ slice_ty slc = ast_for_slice(c, CHILD(n, 0)); if (!slc) return NULL; - e = Subscript(left_expr, slc, Load, LINENO(n)); - if (!e) { - free_slice(slc); + e = Subscript(left_expr, slc, Load, LINENO(n), c->c_arena); + if (!e) return NULL; - } } else { int j; slice_ty slc; - asdl_seq *slices = asdl_seq_new((NCH(n) + 1) / 2); + asdl_seq *slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!slices) return NULL; for (j = 0; j < NCH(n); j += 2) { slc = ast_for_slice(c, CHILD(n, j)); - if (!slc) { - for (j = j / 2; j >= 0; j--) - free_slice(asdl_seq_GET(slices, j)); - asdl_seq_free(slices); /* ok */ + if (!slc) return NULL; - } asdl_seq_SET(slices, j / 2, slc); } - e = Subscript(left_expr, ExtSlice(slices), Load, LINENO(n)); - if (!e) { - for (j = 0; j < asdl_seq_LEN(slices); j++) - free_slice(asdl_seq_GET(slices, j)); - asdl_seq_free(slices); /* ok */ + e = Subscript(left_expr, ExtSlice(slices, c->c_arena), + Load, LINENO(n), c->c_arena); + if (!e) return NULL; - } } } else { assert(TYPE(CHILD(n, 0)) == DOT); - e = Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n)); + e = Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), + c->c_arena); } return e; } @@ -1605,24 +1413,17 @@ if (TYPE(ch) != trailer) break; tmp = ast_for_trailer(c, ch, e); - if (!tmp) { - free_expr(e); + if (!tmp) return NULL; - } e = tmp; } if (TYPE(CHILD(n, NCH(n) - 1)) == factor) { expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1)); - if (!f) { - free_expr(e); + if (!f) return NULL; - } - tmp = BinOp(e, Pow, f, LINENO(n)); - if (!tmp) { - free_expr(f); - free_expr(e); + tmp = BinOp(e, Pow, f, LINENO(n), c->c_arena); + if (!tmp) return NULL; - } e = tmp; } return e; @@ -1663,7 +1464,7 @@ n = CHILD(n, 0); goto loop; } - seq = asdl_seq_new((NCH(n) + 1) / 2); + seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -1673,10 +1474,10 @@ asdl_seq_SET(seq, i / 2, e); } if (!strcmp(STR(CHILD(n, 1)), "and")) - return BoolOp(And, seq, LINENO(n)); + return BoolOp(And, seq, LINENO(n), c->c_arena); else { assert(!strcmp(STR(CHILD(n, 1)), "or")); - return BoolOp(Or, seq, LINENO(n)); + return BoolOp(Or, seq, LINENO(n), c->c_arena); } break; case not_test: @@ -1689,7 +1490,7 @@ if (!expression) return NULL; - return UnaryOp(Not, expression, LINENO(n)); + return UnaryOp(Not, expression, LINENO(n), c->c_arena); } case comparison: if (NCH(n) == 1) { @@ -1699,12 +1500,11 @@ else { expr_ty expression; asdl_seq *ops, *cmps; - ops = asdl_seq_new(NCH(n) / 2); + ops = asdl_seq_new(NCH(n) / 2, c->c_arena); if (!ops) return NULL; - cmps = asdl_seq_new(NCH(n) / 2); + cmps = asdl_seq_new(NCH(n) / 2, c->c_arena); if (!cmps) { - asdl_seq_free(ops); /* ok */ return NULL; } for (i = 1; i < NCH(n); i += 2) { @@ -1713,15 +1513,11 @@ operator = ast_for_comp_op(CHILD(n, i)); if (!operator) { - asdl_expr_seq_free(ops); - asdl_expr_seq_free(cmps); return NULL; } expression = ast_for_expr(c, CHILD(n, i + 1)); if (!expression) { - asdl_expr_seq_free(ops); - asdl_expr_seq_free(cmps); return NULL; } @@ -1730,12 +1526,10 @@ } expression = ast_for_expr(c, CHILD(n, 0)); if (!expression) { - asdl_expr_seq_free(ops); - asdl_expr_seq_free(cmps); return NULL; } - return Compare(expression, ops, cmps, LINENO(n)); + return Compare(expression, ops, cmps, LINENO(n), c->c_arena); } break; @@ -1761,7 +1555,7 @@ if (!exp) return NULL; } - return Yield(exp, LINENO(n)); + return Yield(exp, LINENO(n), c->c_arena); } case factor: { expr_ty expression; @@ -1777,11 +1571,11 @@ switch (TYPE(CHILD(n, 0))) { case PLUS: - return UnaryOp(UAdd, expression, LINENO(n)); + return UnaryOp(UAdd, expression, LINENO(n), c->c_arena); case MINUS: - return UnaryOp(USub, expression, LINENO(n)); + return UnaryOp(USub, expression, LINENO(n), c->c_arena); case TILDE: - return UnaryOp(Invert, expression, LINENO(n)); + return UnaryOp(Invert, expression, LINENO(n), c->c_arena); } PyErr_Format(PyExc_SystemError, "unhandled factor: %d", TYPE(CHILD(n, 0))); @@ -1793,7 +1587,7 @@ PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n)); return NULL; } - /* should never get here */ + /* should never get here unless if error is set*/ return NULL; } @@ -1838,12 +1632,12 @@ return NULL; } - args = asdl_seq_new(nargs + ngens); + args = asdl_seq_new(nargs + ngens, c->c_arena); if (!args) - goto error; - keywords = asdl_seq_new(nkeywords); + return NULL; + keywords = asdl_seq_new(nkeywords, c->c_arena); if (!keywords) - goto error; + return NULL; nargs = 0; nkeywords = 0; for (i = 0; i < NCH(n); i++) { @@ -1853,13 +1647,13 @@ if (NCH(ch) == 1) { e = ast_for_expr(c, CHILD(ch, 0)); if (!e) - goto error; + return NULL; asdl_seq_SET(args, nargs++, e); } else if (TYPE(CHILD(ch, 1)) == gen_for) { e = ast_for_genexp(c, ch); if (!e) - goto error; + return NULL; asdl_seq_SET(args, nargs++, e); } else { @@ -1869,7 +1663,7 @@ /* CHILD(ch, 0) is test, but must be an identifier? */ e = ast_for_expr(c, CHILD(ch, 0)); if (!e) - goto error; + return NULL; /* f(lambda x: x[0] = 3) ends up getting parsed with * LHS test = lambda x: x[0], and RHS test = 3. * SF bug 132313 points out that complaining about a keyword @@ -1877,19 +1671,18 @@ */ if (e->kind == Lambda_kind) { ast_error(CHILD(ch, 0), "lambda cannot contain assignment"); - goto error; + return NULL; } else if (e->kind != Name_kind) { ast_error(CHILD(ch, 0), "keyword can't be an expression"); - goto error; + return NULL; } key = e->v.Name.id; - free(e); /* XXX: is free correct here? */ e = ast_for_expr(c, CHILD(ch, 2)); if (!e) - goto error; - kw = keyword(key, e); + return NULL; + kw = keyword(key, e, c->c_arena); if (!kw) - goto error; + return NULL; asdl_seq_SET(keywords, nkeywords++, kw); } } @@ -1903,19 +1696,7 @@ } } - return Call(func, args, keywords, vararg, kwarg, LINENO(n)); - - error: - free_expr(vararg); - free_expr(kwarg); - if (args) - asdl_expr_seq_free(args); - if (keywords) { - for (i = 0; i < asdl_seq_LEN(keywords); i++) - free_keyword(asdl_seq_GET(keywords, i)); - asdl_seq_free(keywords); /* ok */ - } - return NULL; + return Call(func, args, keywords, vararg, kwarg, LINENO(n), c->c_arena); } static expr_ty @@ -1941,7 +1722,7 @@ asdl_seq *tmp = seq_for_testlist(c, n); if (!tmp) return NULL; - return Tuple(tmp, Load, LINENO(n)); + return Tuple(tmp, Load, LINENO(n), c->c_arena); } } @@ -1967,12 +1748,11 @@ REQ(n, testlist); if (NCH(n) == 1) { expr_ty base; - asdl_seq *bases = asdl_seq_new(1); + asdl_seq *bases = asdl_seq_new(1, c->c_arena); if (!bases) return NULL; base = ast_for_expr(c, CHILD(n, 0)); if (!base) { - asdl_seq_free(bases); /* ok */ return NULL; } asdl_seq_SET(bases, 0, base); @@ -2000,7 +1780,7 @@ if (!e) return NULL; - return Expr(e, LINENO(n)); + return Expr(e, LINENO(n), c->c_arena); } else if (TYPE(CHILD(n, 1)) == augassign) { expr_ty expr1, expr2; @@ -2010,12 +1790,12 @@ if (TYPE(ch) == testlist) expr1 = ast_for_testlist(c, ch); else - expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch)); + expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch), + c->c_arena); if (!expr1) return NULL; if (expr1->kind == GeneratorExp_kind) { - free_expr(expr1); ast_error(ch, "augmented assignment to generator " "expression not possible"); return NULL; @@ -2023,7 +1803,6 @@ if (expr1->kind == Name_kind) { char *var_name = PyString_AS_STRING(expr1->v.Name.id); if (var_name[0] == 'N' && !strcmp(var_name, "None")) { - free_expr(expr1); ast_error(ch, "assignment to None"); return NULL; } @@ -2033,20 +1812,17 @@ if (TYPE(ch) == testlist) expr2 = ast_for_testlist(c, ch); else - expr2 = Yield(ast_for_expr(c, ch), LINENO(ch)); + expr2 = Yield(ast_for_expr(c, ch), LINENO(ch), c->c_arena); if (!expr2) { - free_expr(expr1); return NULL; } operator = ast_for_augassign(CHILD(n, 1)); if (!operator) { - free_expr(expr1); - free_expr(expr2); return NULL; } - return AugAssign(expr1, operator, expr2, LINENO(n)); + return AugAssign(expr1, operator, expr2, LINENO(n), c->c_arena); } else { int i; @@ -2056,7 +1832,7 @@ /* a normal assignment */ REQ(CHILD(n, 1), EQUAL); - targets = asdl_seq_new(NCH(n) / 2); + targets = asdl_seq_new(NCH(n) / 2, c->c_arena); if (!targets) return NULL; for (i = 0; i < NCH(n) - 2; i += 2) { @@ -2064,17 +1840,16 @@ node *ch = CHILD(n, i); if (TYPE(ch) == yield_expr) { ast_error(ch, "assignment to yield expression not possible"); - goto error; + return NULL; } e = ast_for_testlist(c, ch); /* set context to assign */ if (!e) - goto error; + return NULL; if (!set_context(e, Store, CHILD(n, i))) { - free_expr(e); - goto error; + return NULL; } asdl_seq_SET(targets, i / 2, e); @@ -2085,12 +1860,9 @@ else expression = ast_for_expr(c, value); if (!expression) - goto error; - return Assign(targets, expression, LINENO(n)); - error: - asdl_expr_seq_free(targets); + return NULL; + return Assign(targets, expression, LINENO(n), c->c_arena); } - return NULL; } static stmt_ty @@ -2111,21 +1883,19 @@ return NULL; start = 4; } - seq = asdl_seq_new((NCH(n) + 1 - start) / 2); + seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena); if (!seq) return NULL; for (i = start; i < NCH(n); i += 2) { expression = ast_for_expr(c, CHILD(n, i)); if (!expression) { - free_expr(dest); - asdl_expr_seq_free(seq); return NULL; } asdl_seq_APPEND(seq, expression); } nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true; - return Print(dest, seq, nl, LINENO(n)); + return Print(dest, seq, nl, LINENO(n), c->c_arena); } static asdl_seq * @@ -2137,24 +1907,20 @@ REQ(n, exprlist); - seq = asdl_seq_new((NCH(n) + 1) / 2); + seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!seq) return NULL; for (i = 0; i < NCH(n); i += 2) { e = ast_for_expr(c, CHILD(n, i)); if (!e) - goto error; + return NULL; asdl_seq_SET(seq, i / 2, e); if (context) { if (!set_context(e, context, CHILD(n, i))) - goto error; + return NULL; } } return seq; - -error: - asdl_expr_seq_free(seq); - return NULL; } static stmt_ty @@ -2168,7 +1934,7 @@ expr_list = ast_for_exprlist(c, CHILD(n, 1), Del); if (!expr_list) return NULL; - return Delete(expr_list, LINENO(n)); + return Delete(expr_list, LINENO(n), c->c_arena); } static stmt_ty @@ -2190,32 +1956,32 @@ ch = CHILD(n, 0); switch (TYPE(ch)) { case break_stmt: - return Break(LINENO(n)); + return Break(LINENO(n), c->c_arena); case continue_stmt: - return Continue(LINENO(n)); + return Continue(LINENO(n), c->c_arena); case yield_stmt: { /* will reduce to yield_expr */ expr_ty exp = ast_for_expr(c, CHILD(ch, 0)); if (!exp) return NULL; - return Expr(exp, LINENO(n)); + return Expr(exp, LINENO(n), c->c_arena); } case return_stmt: if (NCH(ch) == 1) - return Return(NULL, LINENO(n)); + return Return(NULL, LINENO(n), c->c_arena); else { expr_ty expression = ast_for_testlist(c, CHILD(ch, 1)); if (!expression) return NULL; - return Return(expression, LINENO(n)); + return Return(expression, LINENO(n), c->c_arena); } case raise_stmt: if (NCH(ch) == 1) - return Raise(NULL, NULL, NULL, LINENO(n)); + return Raise(NULL, NULL, NULL, LINENO(n), c->c_arena); else if (NCH(ch) == 2) { expr_ty expression = ast_for_expr(c, CHILD(ch, 1)); if (!expression) return NULL; - return Raise(expression, NULL, NULL, LINENO(n)); + return Raise(expression, NULL, NULL, LINENO(n), c->c_arena); } else if (NCH(ch) == 4) { expr_ty expr1, expr2; @@ -2227,7 +1993,7 @@ if (!expr2) return NULL; - return Raise(expr1, expr2, NULL, LINENO(n)); + return Raise(expr1, expr2, NULL, LINENO(n), c->c_arena); } else if (NCH(ch) == 6) { expr_ty expr1, expr2, expr3; @@ -2242,7 +2008,7 @@ if (!expr3) return NULL; - return Raise(expr1, expr2, expr3, LINENO(n)); + return Raise(expr1, expr2, expr3, LINENO(n), c->c_arena); } default: PyErr_Format(PyExc_SystemError, @@ -2252,22 +2018,24 @@ } static alias_ty -alias_for_import_name(const node *n) +alias_for_import_name(struct compiling *c, const node *n) { /* import_as_name: NAME [NAME NAME] dotted_as_name: dotted_name [NAME NAME] dotted_name: NAME ('.' NAME)* */ + PyObject *str; + loop: switch (TYPE(n)) { case import_as_name: if (NCH(n) == 3) return alias(NEW_IDENTIFIER(CHILD(n, 0)), - NEW_IDENTIFIER(CHILD(n, 2))); + NEW_IDENTIFIER(CHILD(n, 2)), c->c_arena); else return alias(NEW_IDENTIFIER(CHILD(n, 0)), - NULL); + NULL, c->c_arena); break; case dotted_as_name: if (NCH(n) == 1) { @@ -2275,7 +2043,7 @@ goto loop; } else { - alias_ty a = alias_for_import_name(CHILD(n, 0)); + alias_ty a = alias_for_import_name(c, CHILD(n, 0)); assert(!a->asname); a->asname = NEW_IDENTIFIER(CHILD(n, 2)); return a; @@ -2283,11 +2051,10 @@ break; case dotted_name: if (NCH(n) == 1) - return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL); + return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena); else { /* Create a string of the form "a.b.c" */ int i, len; - PyObject *str; char *s; len = 0; @@ -2310,11 +2077,14 @@ --s; *s = '\0'; PyString_InternInPlace(&str); - return alias(str, NULL); + PyArena_AddPyObject(c->c_arena, str); + return alias(str, NULL, c->c_arena); } break; case STAR: - return alias(PyString_InternFromString("*"), NULL); + str = PyString_InternFromString("*"); + PyArena_AddPyObject(c->c_arena, str); + return alias(str, NULL, c->c_arena); default: PyErr_Format(PyExc_SystemError, "unexpected import name: %d", TYPE(n)); @@ -2341,25 +2111,23 @@ if (STR(CHILD(n, 0))[0] == 'i') { /* import */ n = CHILD(n, 1); REQ(n, dotted_as_names); - aliases = asdl_seq_new((NCH(n) + 1) / 2); + aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!aliases) return NULL; for (i = 0; i < NCH(n); i += 2) { - alias_ty import_alias = alias_for_import_name(CHILD(n, i)); + alias_ty import_alias = alias_for_import_name(c, CHILD(n, i)); if (!import_alias) { - asdl_alias_seq_free(aliases); return NULL; } asdl_seq_SET(aliases, i / 2, import_alias); } - return Import(aliases, LINENO(n)); + return Import(aliases, LINENO(n), c->c_arena); } else if (STR(CHILD(n, 0))[0] == 'f') { /* from */ - stmt_ty import; int n_children; const char *from_modules; int lineno = LINENO(n); - alias_ty mod = alias_for_import_name(CHILD(n, 1)); + alias_ty mod = alias_for_import_name(c, CHILD(n, 1)); if (!mod) return NULL; @@ -2370,7 +2138,6 @@ n = CHILD(n, 3); /* from ... import x, y, z */ if (NCH(n) % 2 == 0) { /* it ends with a comma, not valid but the parser allows it */ - free_alias(mod); ast_error(n, "trailing comma not allowed without" " surrounding parentheses"); return NULL; @@ -2383,7 +2150,6 @@ n = CHILD(n, 4); /* from ... import (x, y, z) */ else { /* XXX: don't we need to call ast_error(n, "..."); */ - free_alias(mod); return NULL; } @@ -2391,36 +2157,28 @@ if (from_modules && from_modules[0] == '*') n_children = 1; - aliases = asdl_seq_new((n_children + 1) / 2); + aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena); if (!aliases) { - free_alias(mod); return NULL; } /* handle "from ... import *" special b/c there's no children */ if (from_modules && from_modules[0] == '*') { - alias_ty import_alias = alias_for_import_name(n); + alias_ty import_alias = alias_for_import_name(c, n); if (!import_alias) { - asdl_alias_seq_free(aliases); - free_alias(mod); return NULL; } asdl_seq_APPEND(aliases, import_alias); } for (i = 0; i < NCH(n); i += 2) { - alias_ty import_alias = alias_for_import_name(CHILD(n, i)); + alias_ty import_alias = alias_for_import_name(c, CHILD(n, i)); if (!import_alias) { - asdl_alias_seq_free(aliases); - free_alias(mod); return NULL; } asdl_seq_APPEND(aliases, import_alias); } - Py_INCREF(mod->name); - import = ImportFrom(mod->name, aliases, lineno); - free_alias(mod); - return import; + return ImportFrom(mod->name, aliases, lineno, c->c_arena); } PyErr_Format(PyExc_SystemError, "unknown import statement: starts with command '%s'", @@ -2437,20 +2195,17 @@ int i; REQ(n, global_stmt); - s = asdl_seq_new(NCH(n) / 2); + s = asdl_seq_new(NCH(n) / 2, c->c_arena); if (!s) return NULL; for (i = 1; i < NCH(n); i += 2) { name = NEW_IDENTIFIER(CHILD(n, i)); if (!name) { - for (i = i / 2; i > 0; i--) - Py_XDECREF((identifier) asdl_seq_GET(s, i)); - asdl_seq_free(s); /* ok */ return NULL; } asdl_seq_SET(s, i / 2, name); } - return Global(s, LINENO(n)); + return Global(s, LINENO(n), c->c_arena); } static stmt_ty @@ -2481,7 +2236,7 @@ return NULL; } - return Exec(expr1, globals, locals, LINENO(n)); + return Exec(expr1, globals, locals, LINENO(n), c->c_arena); } static stmt_ty @@ -2493,7 +2248,7 @@ expr_ty expression = ast_for_expr(c, CHILD(n, 1)); if (!expression) return NULL; - return Assert(expression, NULL, LINENO(n)); + return Assert(expression, NULL, LINENO(n), c->c_arena); } else if (NCH(n) == 4) { expr_ty expr1, expr2; @@ -2505,7 +2260,7 @@ if (!expr2) return NULL; - return Assert(expr1, expr2, LINENO(n)); + return Assert(expr1, expr2, LINENO(n), c->c_arena); } PyErr_Format(PyExc_SystemError, "improper number of parts to 'assert' statement: %d", @@ -2525,7 +2280,7 @@ REQ(n, suite); total = num_stmts(n); - seq = asdl_seq_new(total); + seq = asdl_seq_new(total, c->c_arena); if (!seq) return NULL; if (TYPE(CHILD(n, 0)) == simple_stmt) { @@ -2541,7 +2296,7 @@ ch = CHILD(n, i); s = ast_for_stmt(c, ch); if (!s) - goto error; + return NULL; asdl_seq_SET(seq, pos++, s); } } @@ -2554,7 +2309,7 @@ /* small_stmt or compound_stmt with only one child */ s = ast_for_stmt(c, ch); if (!s) - goto error; + return NULL; asdl_seq_SET(seq, pos++, s); } else { @@ -2564,12 +2319,12 @@ for (j = 0; j < NCH(ch); j += 2) { /* statement terminates with a semi-colon ';' */ if (NCH(CHILD(ch, j)) == 0) { - assert((j + 1) == NCH(ch)); - break; + assert((j + 1) == NCH(ch)); + break; } s = ast_for_stmt(c, CHILD(ch, j)); if (!s) - goto error; + return NULL; asdl_seq_SET(seq, pos++, s); } } @@ -2577,10 +2332,6 @@ } assert(pos == seq->size); return seq; - error: - if (seq) - asdl_stmt_seq_free(seq); - return NULL; } static stmt_ty @@ -2602,11 +2353,10 @@ return NULL; suite_seq = ast_for_suite(c, CHILD(n, 3)); if (!suite_seq) { - free_expr(expression); return NULL; } - return If(expression, suite_seq, NULL, LINENO(n)); + return If(expression, suite_seq, NULL, LINENO(n), c->c_arena); } s = STR(CHILD(n, 4)); /* s[2], the third character in the string, will be @@ -2622,17 +2372,14 @@ return NULL; seq1 = ast_for_suite(c, CHILD(n, 3)); if (!seq1) { - free_expr(expression); return NULL; } seq2 = ast_for_suite(c, CHILD(n, 6)); if (!seq2) { - asdl_stmt_seq_free(seq1); - free_expr(expression); return NULL; } - return If(expression, seq1, seq2, LINENO(n)); + return If(expression, seq1, seq2, LINENO(n), c->c_arena); } else if (s[2] == 'i') { int i, n_elif, has_else = 0; @@ -2651,30 +2398,25 @@ expr_ty expression; asdl_seq *seq1, *seq2; - orelse = asdl_seq_new(1); + orelse = asdl_seq_new(1, c->c_arena); if (!orelse) return NULL; expression = ast_for_expr(c, CHILD(n, NCH(n) - 6)); if (!expression) { - asdl_seq_free(orelse); /* ok */ return NULL; } seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4)); if (!seq1) { - free_expr(expression); - asdl_seq_free(orelse); /* ok */ return NULL; } seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1)); if (!seq2) { - free_expr(expression); - asdl_stmt_seq_free(seq1); - asdl_seq_free(orelse); /* ok */ return NULL; } asdl_seq_SET(orelse, 0, If(expression, seq1, seq2, - LINENO(CHILD(n, NCH(n) - 6)))); + LINENO(CHILD(n, NCH(n) - 6)), + c->c_arena)); /* the just-created orelse handled the last elif */ n_elif--; } @@ -2685,33 +2427,27 @@ int off = 5 + (n_elif - i - 1) * 4; expr_ty expression; asdl_seq *suite_seq; - asdl_seq *new = asdl_seq_new(1); + asdl_seq *new = asdl_seq_new(1, c->c_arena); if (!new) { - asdl_stmt_seq_free(orelse); return NULL; } expression = ast_for_expr(c, CHILD(n, off)); if (!expression) { - asdl_stmt_seq_free(orelse); - asdl_seq_free(new); /* ok */ return NULL; } suite_seq = ast_for_suite(c, CHILD(n, off + 2)); if (!suite_seq) { - asdl_stmt_seq_free(orelse); - free_expr(expression); - asdl_seq_free(new); /* ok */ return NULL; } asdl_seq_SET(new, 0, If(expression, suite_seq, orelse, - LINENO(CHILD(n, off)))); + LINENO(CHILD(n, off)), c->c_arena)); orelse = new; } return If(ast_for_expr(c, CHILD(n, 1)), ast_for_suite(c, CHILD(n, 3)), - orelse, LINENO(n)); + orelse, LINENO(n), c->c_arena); } else { PyErr_Format(PyExc_SystemError, @@ -2735,10 +2471,9 @@ return NULL; suite_seq = ast_for_suite(c, CHILD(n, 3)); if (!suite_seq) { - free_expr(expression); return NULL; } - return While(expression, suite_seq, NULL, LINENO(n)); + return While(expression, suite_seq, NULL, LINENO(n), c->c_arena); } else if (NCH(n) == 7) { expr_ty expression; @@ -2749,17 +2484,14 @@ return NULL; seq1 = ast_for_suite(c, CHILD(n, 3)); if (!seq1) { - free_expr(expression); return NULL; } seq2 = ast_for_suite(c, CHILD(n, 6)); if (!seq2) { - asdl_stmt_seq_free(seq1); - free_expr(expression); return NULL; } - return While(expression, seq1, seq2, LINENO(n)); + return While(expression, seq1, seq2, LINENO(n), c->c_arena); } else { PyErr_Format(PyExc_SystemError, @@ -2786,31 +2518,24 @@ _target = ast_for_exprlist(c, CHILD(n, 1), Store); if (!_target) { - asdl_stmt_seq_free(seq); return NULL; } if (asdl_seq_LEN(_target) == 1) { target = asdl_seq_GET(_target, 0); - asdl_seq_free(_target); /* ok */ } else - target = Tuple(_target, Store, LINENO(n)); + target = Tuple(_target, Store, LINENO(n), c->c_arena); expression = ast_for_testlist(c, CHILD(n, 3)); if (!expression) { - free_expr(target); - asdl_stmt_seq_free(seq); return NULL; } suite_seq = ast_for_suite(c, CHILD(n, 5)); if (!suite_seq) { - free_expr(target); - free_expr(expression); - asdl_stmt_seq_free(seq); return NULL; } - return For(target, expression, suite_seq, seq, LINENO(n)); + return For(target, expression, suite_seq, seq, LINENO(n), c->c_arena); } static excepthandler_ty @@ -2825,7 +2550,7 @@ if (!suite_seq) return NULL; - return excepthandler(NULL, NULL, suite_seq); + return excepthandler(NULL, NULL, suite_seq, c->c_arena); } else if (NCH(exc) == 2) { expr_ty expression; @@ -2836,11 +2561,10 @@ return NULL; suite_seq = ast_for_suite(c, body); if (!suite_seq) { - free_expr(expression); return NULL; } - return excepthandler(expression, NULL, suite_seq); + return excepthandler(expression, NULL, suite_seq, c->c_arena); } else if (NCH(exc) == 4) { asdl_seq *suite_seq; @@ -2849,22 +2573,18 @@ if (!e) return NULL; if (!set_context(e, Store, CHILD(exc, 3))) { - free_expr(e); return NULL; } expression = ast_for_expr(c, CHILD(exc, 1)); if (!expression) { - free_expr(e); return NULL; } suite_seq = ast_for_suite(c, body); if (!suite_seq) { - free_expr(expression); - free_expr(e); return NULL; } - return excepthandler(expression, e, suite_seq); + return excepthandler(expression, e, suite_seq, c->c_arena); } else { PyErr_Format(PyExc_SystemError, @@ -2887,11 +2607,10 @@ return NULL; s2 = ast_for_suite(c, CHILD(n, 5)); if (!s2) { - asdl_stmt_seq_free(s1); return NULL; } - return TryFinally(s1, s2, LINENO(n)); + return TryFinally(s1, s2, LINENO(n), c->c_arena); } else if (TYPE(CHILD(n, 3)) == except_clause) { /* try_stmt: ('try' ':' suite (except_clause ':' suite)+ @@ -2905,7 +2624,7 @@ n_except -= 3; } n_except /= 3; - handlers = asdl_seq_new(n_except); + handlers = asdl_seq_new(n_except, c->c_arena); if (!handlers) return NULL; for (i = 0; i < n_except; i++) { @@ -2913,9 +2632,6 @@ CHILD(n, 3 + i * 3), CHILD(n, 5 + i * 3)); if (!e) { - for ( ; i >= 0; i--) - free_excepthandler(asdl_seq_GET(handlers, i)); - asdl_seq_free(handlers); /* ok */ return NULL; } asdl_seq_SET(handlers, i, e); @@ -2923,25 +2639,19 @@ suite_seq1 = ast_for_suite(c, CHILD(n, 2)); if (!suite_seq1) { - for (i = 0; i < asdl_seq_LEN(handlers); i++) - free_excepthandler(asdl_seq_GET(handlers, i)); - asdl_seq_free(handlers); /* ok */ return NULL; } if (has_else) { suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1)); if (!suite_seq2) { - for (i = 0; i < asdl_seq_LEN(handlers); i++) - free_excepthandler(asdl_seq_GET(handlers, i)); - asdl_seq_free(handlers); /* ok */ - asdl_stmt_seq_free(suite_seq1); return NULL; } } else suite_seq2 = NULL; - return TryExcept(suite_seq1, handlers, suite_seq2, LINENO(n)); + return TryExcept(suite_seq1, handlers, suite_seq2, LINENO(n), + c->c_arena); } else { ast_error(n, "malformed 'try' statement"); @@ -2966,14 +2676,16 @@ s = ast_for_suite(c, CHILD(n, 3)); if (!s) return NULL; - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n)); + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n), + c->c_arena); } /* check for empty base list */ if (TYPE(CHILD(n,3)) == RPAR) { s = ast_for_suite(c, CHILD(n,5)); if (!s) return NULL; - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n)); + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n), + c->c_arena); } /* else handle the base class list */ @@ -2983,10 +2695,10 @@ s = ast_for_suite(c, CHILD(n, 6)); if (!s) { - asdl_expr_seq_free(bases); return NULL; } - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n)); + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n), + c->c_arena); } static stmt_ty @@ -3015,7 +2727,7 @@ case del_stmt: return ast_for_del_stmt(c, n); case pass_stmt: - return Pass(LINENO(n)); + return Pass(LINENO(n), c->c_arena); case flow_stmt: return ast_for_flow_stmt(c, n); case import_stmt: @@ -3204,7 +2916,6 @@ static PyObject * parsestr(const char *s, const char *encoding) { - PyObject *v; size_t len; int quote = *s; int rawmode = 0; @@ -3259,7 +2970,7 @@ encoding. */ Py_FatalError("cannot deal with encodings in this build."); #else - PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL); + PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL); if (u == NULL) return NULL; v = PyUnicode_AsEncodedString(u, encoding, NULL); @@ -3271,9 +2982,8 @@ } } - v = PyString_DecodeEscape(s, len, NULL, unicode, - need_encoding ? encoding : NULL); - return v; + return PyString_DecodeEscape(s, len, NULL, unicode, + need_encoding ? encoding : NULL); } /* Build a Python string object out of a STRING atom. This takes care of @@ -3300,13 +3010,12 @@ } #ifdef Py_USING_UNICODE else { - PyObject *temp; - temp = PyUnicode_Concat(v, s); + PyObject *temp = PyUnicode_Concat(v, s); Py_DECREF(s); - if (temp == NULL) - goto onError; Py_DECREF(v); v = temp; + if (v == NULL) + goto onError; } #endif } Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Sat Dec 17 21:54:49 2005 @@ -23,6 +23,7 @@ #include "Python-ast.h" #include "node.h" +#include "pyarena.h" #include "ast.h" #include "code.h" #include "compile.h" @@ -148,6 +149,7 @@ struct compiler_unit *u; /* compiler state for current block */ PyObject *c_stack; /* Python list holding compiler_unit ptrs */ char *c_encoding; /* source encoding (a borrowed reference) */ + PyArena *c_arena; /* pointer to memory allocation arena */ }; struct assembler { @@ -243,7 +245,8 @@ } PyCodeObject * -PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags) +PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags, + PyArena *arena) { struct compiler c; PyCodeObject *co = NULL; @@ -259,6 +262,7 @@ if (!compiler_init(&c)) goto error; c.c_filename = filename; + c.c_arena = arena; c.c_future = PyFuture_FromAST(mod, filename); if (c.c_future == NULL) goto error; @@ -292,12 +296,13 @@ PyCodeObject * PyNode_Compile(struct _node *n, const char *filename) { - PyCodeObject *co; - mod_ty mod = PyAST_FromNode(n, NULL, filename); - if (!mod) - return NULL; - co = PyAST_Compile(mod, filename, NULL); - free_mod(mod); + PyCodeObject *co = NULL; + PyArena *arena; + arena = PyArena_New(); + mod_ty mod = PyAST_FromNode(n, NULL, filename, arena); + if (mod) + co = PyAST_Compile(mod, filename, NULL, arena); + PyArena_Free(arena); return co; } @@ -3404,7 +3409,7 @@ switch (e->kind) { case Attribute_kind: auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, - AugLoad, e->lineno); + AugLoad, e->lineno, c->c_arena); if (auge == NULL) return 0; VISIT(c, expr, auge); @@ -3412,11 +3417,10 @@ ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); auge->v.Attribute.ctx = AugStore; VISIT(c, expr, auge); - free(auge); break; case Subscript_kind: auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, - AugLoad, e->lineno); + AugLoad, e->lineno, c->c_arena); if (auge == NULL) return 0; VISIT(c, expr, auge); @@ -3424,7 +3428,6 @@ ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); auge->v.Subscript.ctx = AugStore; VISIT(c, expr, auge); - free(auge); break; case Name_kind: VISIT(c, expr, s->v.AugAssign.target); Modified: python/trunk/Python/import.c ============================================================================== --- python/trunk/Python/import.c (original) +++ python/trunk/Python/import.c Sat Dec 17 21:54:49 2005 @@ -4,6 +4,7 @@ #include "Python.h" #include "Python-ast.h" +#include "pyarena.h" #include "pythonrun.h" #include "errcode.h" #include "marshal.h" @@ -773,13 +774,14 @@ { PyCodeObject *co = NULL; mod_ty mod; + PyArena *arena = PyArena_New(); mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, 0, - NULL); + NULL, arena); if (mod) { - co = PyAST_Compile(mod, pathname, NULL); - free_mod(mod); + co = PyAST_Compile(mod, pathname, NULL, arena); } + PyArena_Free(arena); return co; } Added: python/trunk/Python/pyarena.c ============================================================================== --- (empty file) +++ python/trunk/Python/pyarena.c Sat Dec 17 21:54:49 2005 @@ -0,0 +1,133 @@ +#include "Python.h" +#include "pyarena.h" + +/* An arena list is a linked list that can store either pointers or + PyObjects. The type is clear from context. + */ + +typedef struct _arena_list { + struct _arena_list *al_next; + void *al_pointer; +} PyArenaList; + +/* There are two linked lists in an arena, one for malloc pointers and + one for PyObject. For each list, there is a pointer to the head + and to the tail. The head is used to free the list. The tail is + used to add a new element to the list. + + The list always keeps one un-used node at the end of the list. +*/ + +struct _arena { + PyArenaList *a_malloc_head; + PyArenaList *a_malloc_tail; + PyArenaList *a_object_head; + PyArenaList *a_object_tail; +}; + +static PyArenaList* +PyArenaList_New(void) +{ + PyArenaList *alist = (PyArenaList *)malloc(sizeof(PyArenaList)); + if (!alist) + return NULL; + + alist->al_next = NULL; + alist->al_pointer = NULL; + return alist; +} + +static void +PyArenaList_FreeObject(PyArenaList *alist) +{ + if (!alist) + return; + + while (alist) { + PyArenaList *prev; + Py_XDECREF((PyObject *)alist->al_pointer); + alist->al_pointer = NULL; + prev = alist; + alist = alist->al_next; + free(prev); + } +} + +static void +PyArenaList_FreeMalloc(PyArenaList *alist) +{ + if (!alist) + return; + + while (alist) { + PyArenaList *prev; + if (alist->al_pointer) { + free(alist->al_pointer); + } + alist->al_pointer = NULL; + prev = alist; + alist = alist->al_next; + free(prev); + } +} + + +PyArena * +PyArena_New() +{ + PyArena* arena = (PyArena *)malloc(sizeof(PyArena)); + if (!arena) + return NULL; + + arena->a_object_head = PyArenaList_New(); + arena->a_object_tail = arena->a_object_head; + arena->a_malloc_head = PyArenaList_New(); + arena->a_malloc_tail = arena->a_malloc_head; + return arena; +} + +void +PyArena_Free(PyArena *arena) +{ + assert(arena); + PyArenaList_FreeObject(arena->a_object_head); + PyArenaList_FreeMalloc(arena->a_malloc_head); + free(arena); +} + +void * +PyArena_Malloc(PyArena *arena, size_t size) +{ + /* A better implementation might actually use an arena. The current + approach is just a trivial implementation of the API that allows + it to be tested. + */ + void *p; + assert(size != 0); + p = malloc(size); + PyArena_AddMallocPointer(arena, p); + return p; +} + +int +PyArena_AddMallocPointer(PyArena *arena, void *pointer) +{ + assert(pointer); + PyArenaList *tail = arena->a_malloc_tail; + assert(tail->al_pointer != pointer); + tail->al_next = PyArenaList_New(); + tail->al_pointer = pointer; + arena->a_malloc_tail = tail->al_next; + return 1; +} + +int +PyArena_AddPyObject(PyArena *arena, PyObject *pointer) +{ + assert(pointer); + PyArenaList *tail = arena->a_object_tail; + tail->al_next = PyArenaList_New(); + tail->al_pointer = pointer; + arena->a_object_tail = tail->al_next; + return 1; +} Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Sat Dec 17 21:54:49 2005 @@ -12,6 +12,7 @@ #include "code.h" #include "compile.h" #include "symtable.h" +#include "pyarena.h" #include "ast.h" #include "eval.h" #include "marshal.h" @@ -36,9 +37,9 @@ static void initmain(void); static void initsite(void); static PyObject *run_err_mod(mod_ty, const char *, PyObject *, PyObject *, - PyCompilerFlags *); + PyCompilerFlags *, PyArena *arena); static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *, - PyCompilerFlags *); + PyCompilerFlags *, PyArena *); static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, PyCompilerFlags *); static void err_input(perrdetail *); @@ -697,6 +698,7 @@ { PyObject *m, *d, *v, *w; mod_ty mod; + PyArena *arena; char *ps1 = "", *ps2 = ""; int errcode = 0; @@ -716,12 +718,14 @@ else if (PyString_Check(w)) ps2 = PyString_AsString(w); } + arena = PyArena_New(); mod = PyParser_ASTFromFile(fp, filename, Py_single_input, ps1, ps2, - flags, &errcode); + flags, &errcode, arena); Py_XDECREF(v); Py_XDECREF(w); if (mod == NULL) { + PyArena_Free(arena); if (errcode == E_EOF) { PyErr_Clear(); return E_EOF; @@ -730,11 +734,13 @@ return -1; } m = PyImport_AddModule("__main__"); - if (m == NULL) + if (m == NULL) { + PyArena_Free(arena); return -1; + } d = PyModule_GetDict(m); - v = run_mod(mod, filename, d, d, flags); - free_mod(mod); + v = run_mod(mod, filename, d, d, flags, arena); + PyArena_Free(arena); if (v == NULL) { PyErr_Print(); return -1; @@ -1155,9 +1161,11 @@ PyObject *locals, PyCompilerFlags *flags) { PyObject *ret; - mod_ty mod = PyParser_ASTFromString(str, "", start, flags); - ret = run_err_mod(mod, "", globals, locals, flags); - free_mod(mod); + PyArena *arena = PyArena_New(); + mod_ty mod = PyParser_ASTFromString(str, "", start, flags, + arena); + ret = run_err_mod(mod, "", globals, locals, flags, arena); + PyArena_Free(arena); return ret; } @@ -1166,33 +1174,36 @@ PyObject *locals, int closeit, PyCompilerFlags *flags) { PyObject *ret; + PyArena *arena = PyArena_New(); mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, - flags, NULL); - if (mod == NULL) + flags, NULL, arena); + if (mod == NULL) { + PyArena_Free(arena); return NULL; + } if (closeit) fclose(fp); - ret = run_err_mod(mod, filename, globals, locals, flags); - free_mod(mod); + ret = run_err_mod(mod, filename, globals, locals, flags, arena); + PyArena_Free(arena); return ret; } static PyObject * run_err_mod(mod_ty mod, const char *filename, PyObject *globals, - PyObject *locals, PyCompilerFlags *flags) + PyObject *locals, PyCompilerFlags *flags, PyArena *arena) { if (mod == NULL) return NULL; - return run_mod(mod, filename, globals, locals, flags); + return run_mod(mod, filename, globals, locals, flags, arena); } static PyObject * run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals, - PyCompilerFlags *flags) + PyCompilerFlags *flags, PyArena *arena) { PyCodeObject *co; PyObject *v; - co = PyAST_Compile(mod, filename, flags); + co = PyAST_Compile(mod, filename, flags, arena); if (co == NULL) return NULL; v = PyEval_EvalCode(co, globals, locals); @@ -1236,43 +1247,45 @@ Py_CompileStringFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags) { - mod_ty mod; PyCodeObject *co; - mod = PyParser_ASTFromString(str, filename, start, flags); - if (mod == NULL) + PyArena *arena = PyArena_New(); + mod_ty mod = PyParser_ASTFromString(str, filename, start, flags, arena); + if (mod == NULL) { + PyArena_Free(arena); return NULL; - co = PyAST_Compile(mod, filename, flags); - free_mod(mod); + } + co = PyAST_Compile(mod, filename, flags, arena); + PyArena_Free(arena); return (PyObject *)co; } struct symtable * Py_SymtableString(const char *str, const char *filename, int start) { - mod_ty mod; struct symtable *st; - - mod = PyParser_ASTFromString(str, filename, start, NULL); - if (mod == NULL) + PyArena *arena = PyArena_New(); + mod_ty mod = PyParser_ASTFromString(str, filename, start, NULL, arena); + if (mod == NULL) { + PyArena_Free(arena); return NULL; + } st = PySymtable_Build(mod, filename, 0); - free_mod(mod); + PyArena_Free(arena); return st; } /* Preferred access to parser is through AST. */ mod_ty PyParser_ASTFromString(const char *s, const char *filename, int start, - PyCompilerFlags *flags) + PyCompilerFlags *flags, PyArena *arena) { - node *n; mod_ty mod; perrdetail err; - n = PyParser_ParseStringFlagsFilename(s, filename, &_PyParser_Grammar, - start, &err, - PARSER_FLAGS(flags)); + node *n = PyParser_ParseStringFlagsFilename(s, filename, + &_PyParser_Grammar, start, &err, + PARSER_FLAGS(flags)); if (n) { - mod = PyAST_FromNode(n, flags, filename); + mod = PyAST_FromNode(n, flags, filename, arena); PyNode_Free(n); return mod; } @@ -1284,15 +1297,15 @@ mod_ty PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1, - char *ps2, PyCompilerFlags *flags, int *errcode) + char *ps2, PyCompilerFlags *flags, int *errcode, + PyArena *arena) { - node *n; mod_ty mod; perrdetail err; - n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, - ps1, ps2, &err, PARSER_FLAGS(flags)); + node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, + start, ps1, ps2, &err, PARSER_FLAGS(flags)); if (n) { - mod = PyAST_FromNode(n, flags, filename); + mod = PyAST_FromNode(n, flags, filename, arena); PyNode_Free(n); return mod; } @@ -1309,10 +1322,9 @@ node * PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) { - node *n; perrdetail err; - n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, - (char *)0, (char *)0, &err, flags); + node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, + start, NULL, NULL, &err, flags); if (n == NULL) err_input(&err); @@ -1324,10 +1336,9 @@ node * PyParser_SimpleParseStringFlags(const char *str, int start, int flags) { - node *n; perrdetail err; - n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err, - flags); + node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, + start, &err, flags); if (n == NULL) err_input(&err); return n; @@ -1337,12 +1348,9 @@ PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename, int start, int flags) { - node *n; perrdetail err; - - n = PyParser_ParseStringFlagsFilename(str, filename, - &_PyParser_Grammar, - start, &err, flags); + node *n = PyParser_ParseStringFlagsFilename(str, filename, + &_PyParser_Grammar, start, &err, flags); if (n == NULL) err_input(&err); return n; @@ -1351,8 +1359,7 @@ node * PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start) { - return PyParser_SimpleParseStringFlagsFilename(str, filename, - start, 0); + return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0); } /* May want to move a more generalized form of this to parsetok.c or From python-checkins at python.org Sat Dec 17 22:33:48 2005 From: python-checkins at python.org (neal.norwitz) Date: Sat, 17 Dec 2005 22:33:48 +0100 (CET) Subject: [Python-checkins] commit of r41740 - in python/trunk: Grammar/Grammar Lib/test/test_exception_variations.py Misc/ACKS Python/ast.c Python/graminit.c Message-ID: <20051217213348.B50EE1E4002@bag.python.org> Author: neal.norwitz Date: Sat Dec 17 22:33:47 2005 New Revision: 41740 Added: python/trunk/Lib/test/test_exception_variations.py Modified: python/trunk/Grammar/Grammar python/trunk/Misc/ACKS python/trunk/Python/ast.c python/trunk/Python/graminit.c Log: SF patch #1355913, PEP 341 - Unification of try/except and try/finally Modified since ast-arenas was implemented. Modified: python/trunk/Grammar/Grammar ============================================================================== --- python/trunk/Grammar/Grammar (original) +++ python/trunk/Grammar/Grammar Sat Dec 17 22:33:47 2005 @@ -67,8 +67,7 @@ if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] while_stmt: 'while' test ':' suite ['else' ':' suite] for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] -try_stmt: ('try' ':' suite (except_clause ':' suite)+ #diagram:break - ['else' ':' suite] | 'try' ':' suite 'finally' ':' suite) +try_stmt: 'try' ':' suite ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite] | 'finally' ':' suite) # NB compile.c makes sure that the default except clause is last except_clause: 'except' [test [',' test]] suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT Added: python/trunk/Lib/test/test_exception_variations.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/test_exception_variations.py Sat Dec 17 22:33:47 2005 @@ -0,0 +1,180 @@ + +from test.test_support import run_unittest +import unittest + +class ExceptionTestCase(unittest.TestCase): + def test_try_except_else_finally(self): + hit_except = False + hit_else = False + hit_finally = False + + try: + raise Exception, 'nyaa!' + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertTrue(hit_except) + self.assertTrue(hit_finally) + self.assertFalse(hit_else) + + def test_try_except_else_finally_no_exception(self): + hit_except = False + hit_else = False + hit_finally = False + + try: + pass + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertFalse(hit_except) + self.assertTrue(hit_finally) + self.assertTrue(hit_else) + + def test_try_except_finally(self): + hit_except = False + hit_finally = False + + try: + raise Exception, 'yarr!' + except: + hit_except = True + finally: + hit_finally = True + + self.assertTrue(hit_except) + self.assertTrue(hit_finally) + + def test_try_except_finally_no_exception(self): + hit_except = False + hit_finally = False + + try: + pass + except: + hit_except = True + finally: + hit_finally = True + + self.assertFalse(hit_except) + self.assertTrue(hit_finally) + + def test_try_except(self): + hit_except = False + + try: + raise Exception, 'ahoy!' + except: + hit_except = True + + self.assertTrue(hit_except) + + def test_try_except_no_exception(self): + hit_except = False + + try: + pass + except: + hit_except = True + + self.assertFalse(hit_except) + + def test_try_except_else(self): + hit_except = False + hit_else = False + + try: + raise Exception, 'foo!' + except: + hit_except = True + else: + hit_else = True + + self.assertFalse(hit_else) + self.assertTrue(hit_except) + + def test_try_except_else_no_exception(self): + hit_except = False + hit_else = False + + try: + pass + except: + hit_except = True + else: + hit_else = True + + self.assertFalse(hit_except) + self.assertTrue(hit_else) + + def test_try_finally_no_exception(self): + hit_finally = False + + try: + pass + finally: + hit_finally = True + + self.assertTrue(hit_finally) + + def test_nested(self): + hit_finally = False + hit_inner_except = False + hit_inner_finally = False + + try: + try: + raise Exception, 'inner exception' + except: + hit_inner_except = True + finally: + hit_inner_finally = True + finally: + hit_finally = True + + self.assertTrue(hit_inner_except) + self.assertTrue(hit_inner_finally) + self.assertTrue(hit_finally) + + def test_nested_else(self): + hit_else = False + hit_finally = False + hit_except = False + hit_inner_except = False + hit_inner_else = False + + try: + try: + pass + except: + hit_inner_except = True + else: + hit_inner_else = True + + raise Exception, 'outer exception' + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertFalse(hit_inner_except) + self.assertTrue(hit_inner_else) + self.assertFalse(hit_else) + self.assertTrue(hit_finally) + self.assertTrue(hit_except) + +def test_main(): + run_unittest(ExceptionTestCase) + +if __name__ == '__main__': + test_main() Modified: python/trunk/Misc/ACKS ============================================================================== --- python/trunk/Misc/ACKS (original) +++ python/trunk/Misc/ACKS Sat Dec 17 22:33:47 2005 @@ -357,6 +357,7 @@ Christopher Lee Inyeol Lee John J. Lee +Thomas Lee Luc Lefebvre Kip Lehman Joerg Lehmann Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Sat Dec 17 22:33:47 2005 @@ -2597,66 +2597,78 @@ static stmt_ty ast_for_try_stmt(struct compiling *c, const node *n) { + const int nch = NCH(n); + int n_except = (nch - 3)/3; + asdl_seq *body, *orelse = NULL, *finally = NULL; + REQ(n, try_stmt); - if (TYPE(CHILD(n, 3)) == NAME) {/* must be 'finally' */ - /* try_stmt: 'try' ':' suite 'finally' ':' suite) */ - asdl_seq *s1, *s2; - s1 = ast_for_suite(c, CHILD(n, 2)); - if (!s1) - return NULL; - s2 = ast_for_suite(c, CHILD(n, 5)); - if (!s2) { - return NULL; - } - - return TryFinally(s1, s2, LINENO(n), c->c_arena); - } - else if (TYPE(CHILD(n, 3)) == except_clause) { - /* try_stmt: ('try' ':' suite (except_clause ':' suite)+ - ['else' ':' suite] - */ - asdl_seq *suite_seq1, *suite_seq2; - asdl_seq *handlers; - int i, has_else = 0, n_except = NCH(n) - 3; - if (TYPE(CHILD(n, NCH(n) - 3)) == NAME) { - has_else = 1; - n_except -= 3; - } - n_except /= 3; - handlers = asdl_seq_new(n_except, c->c_arena); - if (!handlers) - return NULL; - for (i = 0; i < n_except; i++) { - excepthandler_ty e = ast_for_except_clause(c, - CHILD(n, 3 + i * 3), - CHILD(n, 5 + i * 3)); - if (!e) { + body = ast_for_suite(c, CHILD(n, 2)); + if (body == NULL) + return NULL; + + if (TYPE(CHILD(n, nch - 3)) == NAME) { + if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) { + if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) { + /* we can assume it's an "else", + because nch >= 9 for try-else-finally and + it would otherwise have a type of except_clause */ + orelse = ast_for_suite(c, CHILD(n, nch - 4)); + if (orelse == NULL) + return NULL; + n_except--; + } + + finally = ast_for_suite(c, CHILD(n, nch - 1)); + if (finally == NULL) return NULL; - } - asdl_seq_SET(handlers, i, e); + n_except--; } - - suite_seq1 = ast_for_suite(c, CHILD(n, 2)); - if (!suite_seq1) { - return NULL; - } - if (has_else) { - suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1)); - if (!suite_seq2) { + else { + /* we can assume it's an "else", + otherwise it would have a type of except_clause */ + orelse = ast_for_suite(c, CHILD(n, nch - 1)); + if (orelse == NULL) return NULL; - } + n_except--; } - else - suite_seq2 = NULL; - - return TryExcept(suite_seq1, handlers, suite_seq2, LINENO(n), - c->c_arena); } - else { + else if (TYPE(CHILD(n, nch - 3)) != except_clause) { ast_error(n, "malformed 'try' statement"); return NULL; } + + if (n_except > 0) { + int i; + stmt_ty except_st; + /* process except statements to create a try ... except */ + asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena); + if (handlers == NULL) + return NULL; + + for (i = 0; i < n_except; i++) { + excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3), + CHILD(n, 5 + i * 3)); + if (!e) + return NULL; + asdl_seq_SET(handlers, i, e); + } + + except_st = TryExcept(body, handlers, orelse, LINENO(n), c->c_arena); + if (!finally) + return except_st; + + /* if a 'finally' is present too, we nest the TryExcept within a + TryFinally to emulate try ... except ... finally */ + body = asdl_seq_new(1, c->c_arena); + if (body == NULL) + return NULL; + asdl_seq_SET(body, 0, except_st); + } + + /* must be a try ... finally (except clauses are in body, if any exist) */ + assert(finally != NULL); + return TryFinally(body, finally, LINENO(n), c->c_arena); } static stmt_ty Modified: python/trunk/Python/graminit.c ============================================================================== --- python/trunk/Python/graminit.c (original) +++ python/trunk/Python/graminit.c Sat Dec 17 22:33:47 2005 @@ -841,15 +841,26 @@ static arc arcs_39_7[1] = { {22, 9}, }; -static arc arcs_39_8[3] = { +static arc arcs_39_8[4] = { {95, 4}, - {91, 5}, + {91, 10}, + {96, 5}, {0, 8}, }; static arc arcs_39_9[1] = { {0, 9}, }; -static state states_39[10] = { +static arc arcs_39_10[1] = { + {21, 11}, +}; +static arc arcs_39_11[1] = { + {22, 12}, +}; +static arc arcs_39_12[2] = { + {96, 5}, + {0, 12}, +}; +static state states_39[13] = { {1, arcs_39_0}, {1, arcs_39_1}, {1, arcs_39_2}, @@ -858,8 +869,11 @@ {1, arcs_39_5}, {1, arcs_39_6}, {1, arcs_39_7}, - {3, arcs_39_8}, + {4, arcs_39_8}, {1, arcs_39_9}, + {1, arcs_39_10}, + {1, arcs_39_11}, + {2, arcs_39_12}, }; static arc arcs_40_0[1] = { {97, 1}, @@ -1754,7 +1768,7 @@ "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"}, {294, "for_stmt", 0, 10, states_38, "\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000"}, - {295, "try_stmt", 0, 10, states_39, + {295, "try_stmt", 0, 13, states_39, "\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000"}, {296, "except_clause", 0, 5, states_40, "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000"}, From python-checkins at python.org Sat Dec 17 22:45:17 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Sat, 17 Dec 2005 22:45:17 +0100 (CET) Subject: [Python-checkins] commit of r41741 - python/trunk/Misc/NEWS Message-ID: <20051217214517.DA6991E4002@bag.python.org> Author: reinhold.birkenfeld Date: Sat Dec 17 22:45:17 2005 New Revision: 41741 Modified: python/trunk/Misc/NEWS Log: Added PEP 341 to NEWS. We still need a change in the reference manual to reflect the new try statement. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sat Dec 17 22:45:17 2005 @@ -12,6 +12,10 @@ Core and builtins ----------------- +- Implementation of PEP 341 - Unification of try/except and try/finally. + "except" clauses can now be written together with a "finally" clause in + the one try statement instead of two nested ones. + - Bug #1379994: Builtin unicode_escape and raw_unicode_escape codec now encodes backslash correctly. From python-checkins at python.org Sat Dec 17 22:47:07 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Sat, 17 Dec 2005 22:47:07 +0100 (CET) Subject: [Python-checkins] commit of r41742 - python/trunk/Misc/NEWS Message-ID: <20051217214707.6A7341E4002@bag.python.org> Author: reinhold.birkenfeld Date: Sat Dec 17 22:47:06 2005 New Revision: 41742 Modified: python/trunk/Misc/NEWS Log: Fix leftover word. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sat Dec 17 22:47:06 2005 @@ -14,7 +14,7 @@ - Implementation of PEP 341 - Unification of try/except and try/finally. "except" clauses can now be written together with a "finally" clause in - the one try statement instead of two nested ones. + one try statement instead of two nested ones. - Bug #1379994: Builtin unicode_escape and raw_unicode_escape codec now encodes backslash correctly. From python-checkins at python.org Sat Dec 17 23:24:13 2005 From: python-checkins at python.org (neal.norwitz) Date: Sat, 17 Dec 2005 23:24:13 +0100 (CET) Subject: [Python-checkins] commit of r41743 - in python/trunk: Doc/ref/ref7.tex Misc/NEWS Message-ID: <20051217222413.D224D1E4002@bag.python.org> Author: neal.norwitz Date: Sat Dec 17 23:24:12 2005 New Revision: 41743 Modified: python/trunk/Doc/ref/ref7.tex python/trunk/Misc/NEWS Log: Doc for PEP 341, needs improvement Modified: python/trunk/Doc/ref/ref7.tex ============================================================================== --- python/trunk/Doc/ref/ref7.tex (original) +++ python/trunk/Doc/ref/ref7.tex Sat Dec 17 23:24:12 2005 @@ -195,26 +195,25 @@ code for a group of statements: \begin{productionlist} - \production{try_stmt} - {\token{try_exc_stmt} | \token{try_fin_stmt}} - \production{try_exc_stmt} + \production{try_stmt} {try1_stmt | try2_stmt} + \production{try1_stmt} {"try" ":" \token{suite}} \productioncont{("except" [\token{expression} ["," \token{target}]] ":" \token{suite})+} \productioncont{["else" ":" \token{suite}]} - \production{try_fin_stmt} - {"try" ":" \token{suite} - "finally" ":" \token{suite}} + \productioncont{["finally" ":" \token{suite}]} + \production{try2_stmt} + {"try" ":" \token{suite}} + \productioncont{"finally" ":" \token{suite}} \end{productionlist} -There are two forms of \keyword{try} statement: -\keyword{try}...\keyword{except} and -\keyword{try}...\keyword{finally}. These forms cannot be mixed (but -they can be nested in each other). - -The \keyword{try}...\keyword{except} form specifies one or more -exception handlers -(the \keyword{except} clauses). When no exception occurs in the +\versionchanged[In previous versions of Python, +\keyword{try}...\keyword{except}...\keyword{finally} did not work. +\keyword{try}...\keyword{except} had to be nested in +\keyword{try}...\keyword{finally}]{2.5} + +The \keyword{except} clause(s) specify one or more exception handlers. +When no exception occurs in the \keyword{try} clause, no exception handler is executed. When an exception occurs in the \keyword{try} suite, a search for an exception handler is started. This search inspects the except clauses in turn until @@ -232,6 +231,8 @@ If no except clause matches the exception, the search for an exception handler continues in the surrounding code and on the invocation stack. +\footnote{The exception is propogated to the invocation stack only if +there is no \keyword{finally} clause that negates the exception.} If the evaluation of an expression in the header of an except clause raises an exception, the original search for a handler is canceled @@ -277,12 +278,13 @@ \stindex{break} \stindex{continue} -The \keyword{try}...\keyword{finally} form specifies a `cleanup' handler. The -\keyword{try} clause is executed. When no exception occurs, the -\keyword{finally} clause is executed. When an exception occurs in the -\keyword{try} clause, the exception is temporarily saved, the -\keyword{finally} clause is executed, and then the saved exception is -re-raised. If the \keyword{finally} clause raises another exception or +If \keyword{finally} is present, it specifies a `cleanup' handler. The +\keyword{try} clause is executed, including any \keyword{except} and +\keyword{else} clauses. If an exception occurs in any of the clauses +and is not handled, the exception is temporarily saved. The +\keyword{finally} clause is executed. If there is a saved exception, +it is re-raised at the end of the \keyword{finally} clause. +If the \keyword{finally} clause raises another exception or executes a \keyword{return} or \keyword{break} statement, the saved exception is lost. A \keyword{continue} statement is illegal in the \keyword{finally} clause. (The reason is a problem with the current Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sat Dec 17 23:24:12 2005 @@ -14,7 +14,7 @@ - Implementation of PEP 341 - Unification of try/except and try/finally. "except" clauses can now be written together with a "finally" clause in - one try statement instead of two nested ones. + one try statement instead of two nested ones. Patch #1355913. - Bug #1379994: Builtin unicode_escape and raw_unicode_escape codec now encodes backslash correctly. From reinhold-birkenfeld-nospam at wolke7.net Sat Dec 17 23:32:53 2005 From: reinhold-birkenfeld-nospam at wolke7.net (Reinhold Birkenfeld) Date: Sat, 17 Dec 2005 23:32:53 +0100 Subject: [Python-checkins] commit of r41743 - in python/trunk: Doc/ref/ref7.tex Misc/NEWS In-Reply-To: <20051217222413.D224D1E4002@bag.python.org> References: <20051217222413.D224D1E4002@bag.python.org> Message-ID: neal.norwitz wrote: > +\keyword{finally} clause is executed. If there is a saved exception, > +it is re-raised at the end of the \keyword{finally} clause. > +If the \keyword{finally} clause raises another exception or > executes a \keyword{return} or \keyword{break} statement, the saved > exception is lost. A \keyword{continue} statement is illegal in the > \keyword{finally} clause. (The reason is a problem with the current [implementation]. What's the status of this? Could this be addressed here, too? Reinhold -- Mail address is perfectly valid! From hyeshik at gmail.com Sun Dec 18 02:17:09 2005 From: hyeshik at gmail.com (Hye-Shik Chang) Date: Sun, 18 Dec 2005 10:17:09 +0900 Subject: [Python-checkins] commit of r41728 - in python: branches/release24-maint/Lib/test/test_unicode.py branches/release24-maint/Misc/NEWS branches/release24-maint/Objects/unicodeobject.c trunk/Lib/test/test_unicode.py trunk/Misc/NEWS trunk/Objects/uni Message-ID: <4f0b69dc0512171717p34927120maebeab4253895558@mail.gmail.com> On 12/18/05, Walter D?rwald wrote: > hyeshik.chang wrote: > > > Author: hyeshik.chang > > Date: Sat Dec 17 05:38:31 2005 > > New Revision: 41728 > > > > Modified: > > python/branches/release24-maint/Lib/test/test_unicode.py > > python/branches/release24-maint/Misc/NEWS > > python/branches/release24-maint/Objects/unicodeobject.c > > python/trunk/Lib/test/test_unicode.py > > python/trunk/Misc/NEWS > > python/trunk/Objects/unicodeobject.c > > Log: > > Bug #1379994: Fix *unicode_escape codecs to encode r'\' as r'\\' > > just like string codecs. > > I don't see how the patches to test_unicode.py check for this change. It just changes the check from testing one long string to > testing each character separately. The test have been succeeded because escape routine decodes '\' as '\' itself. Therefore testing it with joined string '....\]^....' will pass the test because '\]' is decoded to just '\]'. But, when we change it to test by each character separately, just r'\' can fail because no other character followed the escape. Hye-Shik From python-checkins at python.org Sun Dec 18 02:27:38 2005 From: python-checkins at python.org (barry.warsaw) Date: Sun, 18 Dec 2005 02:27:38 +0100 (CET) Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.tex Doc/lib/libsys.tex Include/pythonrun.h Mac Makefile.pre.in Misc/NEWS Modules/getbuildinfo.c Python/sysmodule.c Message-ID: <20051218012738.591CF1E4002@bag.python.org> Author: barry.warsaw Date: Sun Dec 18 02:27:35 2005 New Revision: 41744 Modified: python/trunk/Doc/api/init.tex python/trunk/Doc/lib/libsys.tex python/trunk/Include/pythonrun.h python/trunk/Mac/ (props changed) python/trunk/Makefile.pre.in python/trunk/Misc/NEWS python/trunk/Modules/getbuildinfo.c python/trunk/Python/sysmodule.c Log: Expose Subversion revision number (calculated via "svnversion .") to Python. Add C API function Py_GetBuildNumber(), add it to the interactive prompt banner (i.e. Py_GetBuildInfo()), and add it as the sys.build_number attribute. The build number is a string instead of an int because it may contain a trailing 'M' if there are local modifications. Modified: python/trunk/Doc/api/init.tex ============================================================================== --- python/trunk/Doc/api/init.tex (original) +++ python/trunk/Doc/api/init.tex Sun Dec 18 02:27:35 2005 @@ -272,6 +272,12 @@ \withsubitem{(in module sys)}{\ttindex{version}} \end{cfuncdesc} +\begin{cfuncdesc}{const char*}{Py_GetBuildNumber}{} + Return a string representing the Subversion revision that this Python + executable was built from. This number is a string because it may contain a + trailing 'M' if Python was built from a mixed revision source tree. +\end{cfuncdesc} + \begin{cfuncdesc}{const char*}{Py_GetPlatform}{} Return the platform identifier for the current platform. On \UNIX, this is formed from the ``official'' name of the operating system, Modified: python/trunk/Doc/lib/libsys.tex ============================================================================== --- python/trunk/Doc/lib/libsys.tex (original) +++ python/trunk/Doc/lib/libsys.tex Sun Dec 18 02:27:35 2005 @@ -27,6 +27,12 @@ \versionadded{2.0} \end{datadesc} +\begin{datadesc}{build_number} + A string representing the Subversion revision that this Python executable + was built from. This number is a string because it may contain a trailing + 'M' if Python was built from a mixed revision source tree. +\end{datadesc} + \begin{datadesc}{builtin_module_names} A tuple of strings giving the names of all modules that are compiled into this Python interpreter. (This information is not available in Modified: python/trunk/Include/pythonrun.h ============================================================================== --- python/trunk/Include/pythonrun.h (original) +++ python/trunk/Include/pythonrun.h Sun Dec 18 02:27:35 2005 @@ -108,6 +108,7 @@ PyAPI_FUNC(const char *) Py_GetCopyright(void); PyAPI_FUNC(const char *) Py_GetCompiler(void); PyAPI_FUNC(const char *) Py_GetBuildInfo(void); +PyAPI_FUNC(const char *) Py_GetBuildNumber(void); /* Internal -- various one-time initializations */ PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Sun Dec 18 02:27:35 2005 @@ -349,7 +349,9 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - if test -f buildno; then \ + if test -d .svn; then \ + svnversion . >buildno; \ + elif test -f buildno; then \ expr `cat buildno` + 1 >buildno1; \ mv -f buildno1 buildno; \ else echo 1 >buildno; fi @@ -444,7 +446,7 @@ # Special rules for object files Modules/getbuildinfo.o: $(srcdir)/Modules/getbuildinfo.c buildno - $(CC) -c $(PY_CFLAGS) -DBUILD=`cat buildno` -o $@ $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CFLAGS) -DBUILD=\"`cat buildno`\" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Dec 18 02:27:35 2005 @@ -12,6 +12,10 @@ Core and builtins ----------------- +- Patch #1382163: Expose Subversion revision number to Python. New C API + function Py_GetBuildNumber(). New attribute sys.build_number. Build number + is now displayed in interactive prompt banner. + - Implementation of PEP 341 - Unification of try/except and try/finally. "except" clauses can now be written together with a "finally" clause in one try statement instead of two nested ones. Patch #1355913. Modified: python/trunk/Modules/getbuildinfo.c ============================================================================== --- python/trunk/Modules/getbuildinfo.c (original) +++ python/trunk/Modules/getbuildinfo.c Sun Dec 18 02:27:35 2005 @@ -21,7 +21,7 @@ #endif #ifndef BUILD -#define BUILD 0 +#define BUILD "0" #endif const char * @@ -29,6 +29,12 @@ { static char buildinfo[50]; PyOS_snprintf(buildinfo, sizeof(buildinfo), - "#%d, %.20s, %.9s", BUILD, DATE, TIME); + "%s, %.20s, %.9s", BUILD, DATE, TIME); return buildinfo; } + +const char * +Py_GetBuildNumber(void) +{ + return BUILD; +} Modified: python/trunk/Python/sysmodule.c ============================================================================== --- python/trunk/Python/sysmodule.c (original) +++ python/trunk/Python/sysmodule.c Sun Dec 18 02:27:35 2005 @@ -1003,6 +1003,9 @@ PyDict_SetItemString(sysdict, "hexversion", v = PyInt_FromLong(PY_VERSION_HEX)); Py_XDECREF(v); + PyDict_SetItemString(sysdict, "build_number", + v = PyString_FromString(Py_GetBuildNumber())); + Py_XDECREF(v); /* * These release level checks are mutually exclusive and cover * the field, so don't get too fancy with the pre-processor! From python-checkins at python.org Sun Dec 18 02:36:45 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 02:36:45 +0100 (CET) Subject: [Python-checkins] commit of r41745 - in python/trunk/Doc: api/init.tex lib/libsys.tex Message-ID: <20051218013645.941B51E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 02:36:44 2005 New Revision: 41745 Modified: python/trunk/Doc/api/init.tex python/trunk/Doc/lib/libsys.tex Log: Add versionadded info Modified: python/trunk/Doc/api/init.tex ============================================================================== --- python/trunk/Doc/api/init.tex (original) +++ python/trunk/Doc/api/init.tex Sun Dec 18 02:36:44 2005 @@ -276,6 +276,7 @@ Return a string representing the Subversion revision that this Python executable was built from. This number is a string because it may contain a trailing 'M' if Python was built from a mixed revision source tree. + \versionadded{2.5} \end{cfuncdesc} \begin{cfuncdesc}{const char*}{Py_GetPlatform}{} Modified: python/trunk/Doc/lib/libsys.tex ============================================================================== --- python/trunk/Doc/lib/libsys.tex (original) +++ python/trunk/Doc/lib/libsys.tex Sun Dec 18 02:36:44 2005 @@ -31,6 +31,7 @@ A string representing the Subversion revision that this Python executable was built from. This number is a string because it may contain a trailing 'M' if Python was built from a mixed revision source tree. + \versionadded{2.5} \end{datadesc} \begin{datadesc}{builtin_module_names} From python-checkins at python.org Sun Dec 18 04:16:23 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 04:16:23 +0100 (CET) Subject: [Python-checkins] commit of r41746 - python/trunk/Python/ast.c python/trunk/Python/pyarena.c Message-ID: <20051218031623.9BF261E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 04:16:20 2005 New Revision: 41746 Modified: python/trunk/Python/ast.c python/trunk/Python/pyarena.c Log: Cleanup a bit and make things more consistent. Don't double check for NULLs and don't initialize if not necessary. No functional changes. Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Sun Dec 18 04:16:20 2005 @@ -578,9 +578,8 @@ /* first count the number of normal args & defaults */ for (i = 0; i < NCH(n); i++) { ch = CHILD(n, i); - if (TYPE(ch) == fpdef) { + if (TYPE(ch) == fpdef) n_args++; - } if (TYPE(ch) == EQUAL) n_defaults++; } @@ -668,9 +667,8 @@ static expr_ty ast_for_dotted_name(struct compiling *c, const node *n) { - expr_ty e = NULL; - expr_ty attrib = NULL; - identifier id = NULL; + expr_ty e; + identifier id; int i; REQ(n, dotted_name); @@ -681,17 +679,14 @@ e = Name(id, Load, LINENO(n), c->c_arena); if (!e) return NULL; - id = NULL; for (i = 2; i < NCH(n); i+=2) { id = NEW_IDENTIFIER(CHILD(n, i)); if (!id) return NULL; - attrib = Attribute(e, id, Load, LINENO(CHILD(n, i)), c->c_arena); - if (!attrib) + e = Attribute(e, id, Load, LINENO(CHILD(n, i)), c->c_arena); + if (!e) return NULL; - e = attrib; - attrib = NULL; } return e; @@ -702,7 +697,7 @@ { /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */ expr_ty d = NULL; - expr_ty name_expr = NULL; + expr_ty name_expr; REQ(n, decorator); @@ -739,7 +734,7 @@ static asdl_seq* ast_for_decorators(struct compiling *c, const node *n) { - asdl_seq* decorator_seq = NULL; + asdl_seq* decorator_seq; expr_ty d; int i; @@ -762,9 +757,9 @@ ast_for_funcdef(struct compiling *c, const node *n) { /* funcdef: 'def' [decorators] NAME parameters ':' suite */ - identifier name = NULL; - arguments_ty args = NULL; - asdl_seq *body = NULL; + identifier name; + arguments_ty args; + asdl_seq *body; asdl_seq *decorator_seq = NULL; int name_i; @@ -855,11 +850,10 @@ else return n_fors; } - else { - /* Should never be reached */ - PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors"); - return -1; - } + + /* Should never be reached */ + PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors"); + return -1; } /* Count the number of 'if' statements in a list comprehension. @@ -1004,12 +998,11 @@ else return n_fors; } - else { - /* Should never be reached */ - PyErr_SetString(PyExc_SystemError, - "logic error in count_gen_fors"); - return -1; - } + + /* Should never be reached */ + PyErr_SetString(PyExc_SystemError, + "logic error in count_gen_fors"); + return -1; } /* Count the number of 'if' statements in a generator expression. @@ -1475,11 +1468,8 @@ } if (!strcmp(STR(CHILD(n, 1)), "and")) return BoolOp(And, seq, LINENO(n), c->c_arena); - else { - assert(!strcmp(STR(CHILD(n, 1)), "or")); - return BoolOp(Or, seq, LINENO(n), c->c_arena); - } - break; + assert(!strcmp(STR(CHILD(n, 1)), "or")); + return BoolOp(Or, seq, LINENO(n), c->c_arena); case not_test: if (NCH(n) == 1) { n = CHILD(n, 0); @@ -1587,7 +1577,7 @@ PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n)); return NULL; } - /* should never get here unless if error is set*/ + /* should never get here unless if error is set */ return NULL; } @@ -1601,8 +1591,8 @@ */ int i, nargs, nkeywords, ngens; - asdl_seq *args = NULL; - asdl_seq *keywords = NULL; + asdl_seq *args; + asdl_seq *keywords; expr_ty vararg = NULL, kwarg = NULL; REQ(n, arglist); @@ -1732,11 +1722,9 @@ /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */ /* argument: test [ gen_for ] */ assert(TYPE(n) == testlist_gexp || TYPE(n) == argument); - if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) { + if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) return ast_for_genexp(c, n); - } - else - return ast_for_testlist(c, n); + return ast_for_testlist(c, n); } /* like ast_for_testlist() but returns a sequence */ @@ -1752,15 +1740,13 @@ if (!bases) return NULL; base = ast_for_expr(c, CHILD(n, 0)); - if (!base) { + if (!base) return NULL; - } asdl_seq_SET(bases, 0, base); return bases; } - else { - return seq_for_testlist(c, n); - } + + return seq_for_testlist(c, n); } static stmt_ty @@ -1813,14 +1799,12 @@ expr2 = ast_for_testlist(c, ch); else expr2 = Yield(ast_for_expr(c, ch), LINENO(ch), c->c_arena); - if (!expr2) { + if (!expr2) return NULL; - } operator = ast_for_augassign(CHILD(n, 1)); - if (!operator) { + if (!operator) return NULL; - } return AugAssign(expr1, operator, expr2, LINENO(n), c->c_arena); } @@ -1848,9 +1832,8 @@ if (!e) return NULL; - if (!set_context(e, Store, CHILD(n, i))) { + if (!set_context(e, Store, CHILD(n, i))) return NULL; - } asdl_seq_SET(targets, i / 2, e); } @@ -1888,9 +1871,8 @@ return NULL; for (i = start; i < NCH(n); i += 2) { expression = ast_for_expr(c, CHILD(n, i)); - if (!expression) { + if (!expression) return NULL; - } asdl_seq_APPEND(seq, expression); } @@ -1915,10 +1897,8 @@ if (!e) return NULL; asdl_seq_SET(seq, i / 2, e); - if (context) { - if (!set_context(e, context, CHILD(n, i))) - return NULL; - } + if (context && !set_context(e, context, CHILD(n, i))) + return NULL; } return seq; } @@ -2015,6 +1995,9 @@ "unexpected flow_stmt: %d", TYPE(ch)); return NULL; } + + PyErr_SetString(PyExc_SystemError, "unhandled flow statement"); + return NULL; } static alias_ty @@ -2030,13 +2013,8 @@ loop: switch (TYPE(n)) { case import_as_name: - if (NCH(n) == 3) - return alias(NEW_IDENTIFIER(CHILD(n, 0)), - NEW_IDENTIFIER(CHILD(n, 2)), c->c_arena); - else - return alias(NEW_IDENTIFIER(CHILD(n, 0)), - NULL, c->c_arena); - break; + str = (NCH(n) == 3) ? NEW_IDENTIFIER(CHILD(n, 2)) : NULL; + return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena); case dotted_as_name: if (NCH(n) == 1) { n = CHILD(n, 0); @@ -2090,6 +2068,8 @@ "unexpected import name: %d", TYPE(n)); return NULL; } + + PyErr_SetString(PyExc_SystemError, "unhandled import name condition"); return NULL; } @@ -2116,9 +2096,8 @@ return NULL; for (i = 0; i < NCH(n); i += 2) { alias_ty import_alias = alias_for_import_name(c, CHILD(n, i)); - if (!import_alias) { + if (!import_alias) return NULL; - } asdl_seq_SET(aliases, i / 2, import_alias); } return Import(aliases, LINENO(n), c->c_arena); @@ -2158,24 +2137,21 @@ n_children = 1; aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena); - if (!aliases) { + if (!aliases) return NULL; - } /* handle "from ... import *" special b/c there's no children */ if (from_modules && from_modules[0] == '*') { alias_ty import_alias = alias_for_import_name(c, n); - if (!import_alias) { + if (!import_alias) return NULL; - } asdl_seq_APPEND(aliases, import_alias); } for (i = 0; i < NCH(n); i += 2) { alias_ty import_alias = alias_for_import_name(c, CHILD(n, i)); - if (!import_alias) { + if (!import_alias) return NULL; - } asdl_seq_APPEND(aliases, import_alias); } return ImportFrom(mod->name, aliases, lineno, c->c_arena); @@ -2200,9 +2176,8 @@ return NULL; for (i = 1; i < NCH(n); i += 2) { name = NEW_IDENTIFIER(CHILD(n, i)); - if (!name) { + if (!name) return NULL; - } asdl_seq_SET(s, i / 2, name); } return Global(s, LINENO(n), c->c_arena); @@ -2272,7 +2247,7 @@ ast_for_suite(struct compiling *c, const node *n) { /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */ - asdl_seq *seq = NULL; + asdl_seq *seq; stmt_ty s; int i, total, num, end, pos = 0; node *ch; @@ -2352,12 +2327,12 @@ if (!expression) return NULL; suite_seq = ast_for_suite(c, CHILD(n, 3)); - if (!suite_seq) { + if (!suite_seq) return NULL; - } return If(expression, suite_seq, NULL, LINENO(n), c->c_arena); } + s = STR(CHILD(n, 4)); /* s[2], the third character in the string, will be 's' for el_s_e, or @@ -2371,13 +2346,11 @@ if (!expression) return NULL; seq1 = ast_for_suite(c, CHILD(n, 3)); - if (!seq1) { + if (!seq1) return NULL; - } seq2 = ast_for_suite(c, CHILD(n, 6)); - if (!seq2) { + if (!seq2) return NULL; - } return If(expression, seq1, seq2, LINENO(n), c->c_arena); } @@ -2402,17 +2375,14 @@ if (!orelse) return NULL; expression = ast_for_expr(c, CHILD(n, NCH(n) - 6)); - if (!expression) { + if (!expression) return NULL; - } seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4)); - if (!seq1) { + if (!seq1) return NULL; - } seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1)); - if (!seq2) { + if (!seq2) return NULL; - } asdl_seq_SET(orelse, 0, If(expression, seq1, seq2, LINENO(CHILD(n, NCH(n) - 6)), @@ -2420,25 +2390,20 @@ /* the just-created orelse handled the last elif */ n_elif--; } - else - orelse = NULL; for (i = 0; i < n_elif; i++) { int off = 5 + (n_elif - i - 1) * 4; expr_ty expression; asdl_seq *suite_seq; asdl_seq *new = asdl_seq_new(1, c->c_arena); - if (!new) { + if (!new) return NULL; - } expression = ast_for_expr(c, CHILD(n, off)); - if (!expression) { + if (!expression) return NULL; - } suite_seq = ast_for_suite(c, CHILD(n, off + 2)); - if (!suite_seq) { + if (!suite_seq) return NULL; - } asdl_seq_SET(new, 0, If(expression, suite_seq, orelse, @@ -2449,11 +2414,10 @@ ast_for_suite(c, CHILD(n, 3)), orelse, LINENO(n), c->c_arena); } - else { - PyErr_Format(PyExc_SystemError, - "unexpected token in 'if' statement: %s", s); - return NULL; - } + + PyErr_Format(PyExc_SystemError, + "unexpected token in 'if' statement: %s", s); + return NULL; } static stmt_ty @@ -2470,9 +2434,8 @@ if (!expression) return NULL; suite_seq = ast_for_suite(c, CHILD(n, 3)); - if (!suite_seq) { + if (!suite_seq) return NULL; - } return While(expression, suite_seq, NULL, LINENO(n), c->c_arena); } else if (NCH(n) == 7) { @@ -2483,28 +2446,25 @@ if (!expression) return NULL; seq1 = ast_for_suite(c, CHILD(n, 3)); - if (!seq1) { + if (!seq1) return NULL; - } seq2 = ast_for_suite(c, CHILD(n, 6)); - if (!seq2) { + if (!seq2) return NULL; - } return While(expression, seq1, seq2, LINENO(n), c->c_arena); } - else { - PyErr_Format(PyExc_SystemError, - "wrong number of tokens for 'while' statement: %d", - NCH(n)); - return NULL; - } + + PyErr_Format(PyExc_SystemError, + "wrong number of tokens for 'while' statement: %d", + NCH(n)); + return NULL; } static stmt_ty ast_for_for_stmt(struct compiling *c, const node *n) { - asdl_seq *_target = NULL, *seq = NULL, *suite_seq = NULL; + asdl_seq *_target, *seq = NULL, *suite_seq; expr_ty expression; expr_ty target; /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */ @@ -2517,23 +2477,19 @@ } _target = ast_for_exprlist(c, CHILD(n, 1), Store); - if (!_target) { + if (!_target) return NULL; - } - if (asdl_seq_LEN(_target) == 1) { + if (asdl_seq_LEN(_target) == 1) target = asdl_seq_GET(_target, 0); - } else target = Tuple(_target, Store, LINENO(n), c->c_arena); expression = ast_for_testlist(c, CHILD(n, 3)); - if (!expression) { + if (!expression) return NULL; - } suite_seq = ast_for_suite(c, CHILD(n, 5)); - if (!suite_seq) { + if (!suite_seq) return NULL; - } return For(target, expression, suite_seq, seq, LINENO(n), c->c_arena); } @@ -2560,9 +2516,8 @@ if (!expression) return NULL; suite_seq = ast_for_suite(c, body); - if (!suite_seq) { + if (!suite_seq) return NULL; - } return excepthandler(expression, NULL, suite_seq, c->c_arena); } @@ -2572,26 +2527,22 @@ expr_ty e = ast_for_expr(c, CHILD(exc, 3)); if (!e) return NULL; - if (!set_context(e, Store, CHILD(exc, 3))) { + if (!set_context(e, Store, CHILD(exc, 3))) return NULL; - } expression = ast_for_expr(c, CHILD(exc, 1)); - if (!expression) { + if (!expression) return NULL; - } suite_seq = ast_for_suite(c, body); - if (!suite_seq) { + if (!suite_seq) return NULL; - } return excepthandler(expression, e, suite_seq, c->c_arena); } - else { - PyErr_Format(PyExc_SystemError, - "wrong number of children for 'except' clause: %d", - NCH(exc)); - return NULL; - } + + PyErr_Format(PyExc_SystemError, + "wrong number of children for 'except' clause: %d", + NCH(exc)); + return NULL; } static stmt_ty @@ -2706,9 +2657,8 @@ return NULL; s = ast_for_suite(c, CHILD(n, 6)); - if (!s) { + if (!s) return NULL; - } return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n), c->c_arena); } Modified: python/trunk/Python/pyarena.c ============================================================================== --- python/trunk/Python/pyarena.c (original) +++ python/trunk/Python/pyarena.c Sun Dec 18 04:16:20 2005 @@ -40,9 +40,6 @@ static void PyArenaList_FreeObject(PyArenaList *alist) { - if (!alist) - return; - while (alist) { PyArenaList *prev; Py_XDECREF((PyObject *)alist->al_pointer); @@ -56,9 +53,6 @@ static void PyArenaList_FreeMalloc(PyArenaList *alist) { - if (!alist) - return; - while (alist) { PyArenaList *prev; if (alist->al_pointer) { @@ -105,7 +99,8 @@ void *p; assert(size != 0); p = malloc(size); - PyArena_AddMallocPointer(arena, p); + if (p) + PyArena_AddMallocPointer(arena, p); return p; } From python-checkins at python.org Sun Dec 18 04:19:51 2005 From: python-checkins at python.org (barry.warsaw) Date: Sun, 18 Dec 2005 04:19:51 +0100 (CET) Subject: [Python-checkins] commit of r41747 - in sandbox/trunk/emailpkg: 2.5 2.5/MANIFEST 2.5/NEWS 2.5/README 2.5/moredata 2.5/moredata/crispin-torture.txt 2.5/setup.py 2.5/testall.py 3.0 Message-ID: <20051218031951.294031E4002@bag.python.org> Author: barry.warsaw Date: Sun Dec 18 04:19:13 2005 New Revision: 41747 Added: sandbox/trunk/emailpkg/ sandbox/trunk/emailpkg/2.5/ (props changed) sandbox/trunk/emailpkg/2.5/MANIFEST sandbox/trunk/emailpkg/2.5/NEWS sandbox/trunk/emailpkg/2.5/README sandbox/trunk/emailpkg/2.5/moredata/ sandbox/trunk/emailpkg/2.5/moredata/crispin-torture.txt sandbox/trunk/emailpkg/2.5/setup.py sandbox/trunk/emailpkg/2.5/testall.py sandbox/trunk/emailpkg/3.0/ Log: Add standalone email package infrastructure, with svn:externals to grab the acdtual email package code from the appropriate Python tree. Added: sandbox/trunk/emailpkg/2.5/MANIFEST ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2.5/MANIFEST Sun Dec 18 04:19:13 2005 @@ -0,0 +1,113 @@ +setup.py +testall.py +NEWS +README +LICENSE.txt +email/_compat21.py +email/_compat22.py +email/Charset.py +email/Encoders.py +email/Errors.py +email/FeedParser.py +email/Generator.py +email/Header.py +email/Iterators.py +email/MIMEAudio.py +email/MIMEBase.py +email/MIMEImage.py +email/MIMEMessage.py +email/MIMEMultipart.py +email/MIMENonMultipart.py +email/MIMEText.py +email/Message.py +email/Parser.py +email/Utils.py +email/__init__.py +email/_parseaddr.py +email/base64MIME.py +email/quopriMIME.py +email/test/__init__.py +email/test/test_email.py +email/test/test_email_codecs.py +email/test/test_email_torture.py +email/test/data/PyBanner048.gif +email/test/data/audiotest.au +email/test/data/msg_01.txt +email/test/data/msg_02.txt +email/test/data/msg_03.txt +email/test/data/msg_04.txt +email/test/data/msg_05.txt +email/test/data/msg_06.txt +email/test/data/msg_07.txt +email/test/data/msg_08.txt +email/test/data/msg_09.txt +email/test/data/msg_10.txt +email/test/data/msg_11.txt +email/test/data/msg_12.txt +email/test/data/msg_12a.txt +email/test/data/msg_13.txt +email/test/data/msg_14.txt +email/test/data/msg_15.txt +email/test/data/msg_16.txt +email/test/data/msg_17.txt +email/test/data/msg_19.txt +email/test/data/msg_20.txt +email/test/data/msg_21.txt +email/test/data/msg_22.txt +email/test/data/msg_23.txt +email/test/data/msg_24.txt +email/test/data/msg_25.txt +email/test/data/msg_26.txt +email/test/data/msg_27.txt +email/test/data/msg_28.txt +email/test/data/msg_29.txt +email/test/data/msg_30.txt +email/test/data/msg_31.txt +email/test/data/msg_32.txt +email/test/data/msg_33.txt +email/test/data/msg_34.txt +email/test/data/msg_35.txt +email/test/data/msg_35.txt +email/test/data/msg_36.txt +email/test/data/msg_37.txt +email/test/data/msg_38.txt +email/test/data/msg_39.txt +email/test/data/msg_40.txt +email/test/data/msg_41.txt +email/test/data/msg_42.txt +moredata/crispin-torture.txt +docs/about.html +docs/blank.png +docs/contents.png +docs/email-dir.txt +docs/email-mime.txt +docs/email-simple.txt +docs/email-unpack.txt +docs/index.html +docs/index.png +docs/mimelib.css +docs/mimelib.html +docs/module-email.Charset.html +docs/module-email.Encoders.html +docs/module-email.Errors.html +docs/module-email.Generator.html +docs/module-email.Header.html +docs/module-email.Iterators.html +docs/module-email.Message.html +docs/module-email.Parser.html +docs/module-email.Utils.html +docs/module-email.html +docs/modules.png +docs/next.png +docs/node1.html +docs/node10.html +docs/node11.html +docs/node18.html +docs/node19.html +docs/node20.html +docs/node4.html +docs/node6.html +docs/node7.html +docs/node8.html +docs/previous.png +docs/up.png Added: sandbox/trunk/emailpkg/2.5/NEWS ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2.5/NEWS Sun Dec 18 04:19:13 2005 @@ -0,0 +1,594 @@ +Copyright (C) 2001-2004 Python Software Foundation + +Here is a history of user visible changes to this software. + +2.5.5 (13-May-2004) +2.5.4 +2.5.3 +2.5.2 + + Lots of bug fixes. + +2.5.1 (30-Mar-2003) + + Bug fixes and improved compatibility for Python 2.2.0. + +2.5 (21-Mar-2003) + + A few other minor bug fixes. + +2.5b1 (11-Mar-2003) + + - Message.get_payload() now recognizes various uuencoded + Content-Transfer-Encodings (e.g. x-uuencode). + + When passing decode=True to Message.get_payload() and a + low-level decoding error occurs, the payload is returned as-is + instead of raising an exception. + + - Header.__init__() and Header.append() now accept an optional + argument `errors' which is passed through to the unicode() and + ustr.encode() calls. You can use this to prevent conversion + errors by e.g. passing 'replace' or 'ignore'. + + RFC 2822 specifies that long headers should be split at the + "highest level syntactic break" possible. This can only really + be determined by the application, and the current API doesn't + support arbitrary break points. As a compromise, + Header.encode() grew a `splitchars' argument which provides some + control over splitting at higher level syntactic breaks. + + Header.decode_header() now transforms binascii.Errors into + email.Errors.HeaderParseErrors when bogus base64 data appears in + the header. + + The header splitting and folding algorithms were completely + reimplemented, especially when dealing with ASCII headers. + + We now preserve spaces between encoded and non-encode parts in + RFC 2047 headers when converting the header to Unicode. While + the RFC is technically ambiguous on this point, this is the + behavior most people expect. + + - email.Iterators.body_line_iterator() now takes an optional + decode argument, which is passed through to Message.get_payload(). + + - The MIMEText constructor used to append a newline to the _text + argument if it didn't already end in a newline. Now it doesn't. + This could theoretically break code so it should be considered + experimental for 2.5 beta 1. But it's the right fix, so we'll + keep it unless there are howls of derision. + + - The quopriMIME.header_encode() maxlinelen argument now accepts + None, which inhibits line breaking. + + - Support for Korean charsets was added to Charset.py. Also the + Charset class grew a __repr__() method. + + - Various and sundry bug fixes, improved RFC conformance, and + improved lax parsing. + +2.4.3 (14-Oct-2002) +2.4.2 (10-Oct-2002) +2.4.1 (07-Oct-2002) + + Last minute patches for the Python 2.2.2 backport. This includes + case insensitivity of character set names, patches for Windows, + and some fixes for non-splitting of unspecified 8bit header data. + +2.4 (01-Oct-2002) + + - Updated all the documentation. + + - Clarification to the semantics of Header.__init__() and + Header.append() when it gets byte strings and Unicode strings as + its first argument. When a byte string is used, the charset + must be the encoding of the string, such that unicode(s,charset) + succeeds. When a Unicode string is used, the charset is a hint, + and the first of the following to succeed is used: us-ascii, the + charset hint, utf-8. + + - A new header encoding flag has been added to the Charset + module. SHORTEST (which cannot be used for body encodings) + returns the string either quoted-printable or base64 encoding, + whichever is shortest in terms of characters. This is a good + heuristic for providing the most human readable value possible. + The utf-8 charset uses SHORTEST encoding by default now. + + - Message.get_content_charset() is a new method that returns the + charset parameter on the Content-Type header, unquoted and RFC + 2231 decoded if necessary. + + - "import email" no longer imports some sub-modules by side-effect. + + - Fixed some problems related to RFC 2231 encoding of boundary and + charset parameters on Content-Type headers. Document that + get_param() and get_params() may return values that are strings + or 3-tuples. + + - The signature of the non-public function _structure() has + changed. + +2.3.1 (13-Sep-2002) + + - Minor update to the distutils package. A file was missing in + the email-2.3.tar.gz file. + +2.3 (10-Sep-2002) + + - Added support for RFC 2231 encoding. Patch by Oleg Broytmann + (previous patch was for RFC 2231 decoding only). + + - New method Message.replace_header() which replaces the first + occurrence of a header with a new value, preserving header order + and header name case. Patch by Skip Montanaro. + + - RFC 2045, section 5.2 states that if the Content-Type: header is + invalid, it defaults to text/plain. Implement simple checks for + this in get_content_type(), get_content_maintype(), and + get_content_subtype(). These will no longer raise ValueErrors. + + - In non-strict parsing, if no start boundary can be found for a + multipart message, the entire body of the message is set as the + payload. Strict parsing such a message will still raise a + BoundaryError. + +2.2 (23-Jul-2002) + + - Better support for default content types has been added. + Specifically: + + o The following methods have been silently deprecated. At some + future release they may be unsilently deprecated: + Message.get_type(), Message.get_main_type(), + Message.get_subtype(). + + o The following methods have been added as a consistent way of + getting a message's content type: Message.get_content_type(), + Message.get_content_maintype(), Message.get_content_subtype(). + + Note that none of these methods take a `failobj' argument + because messages always have a default content type. Usually + this type is text/plain, but for messages inside a + multipart/digest container, it's message/rfc822. + + Also note that .get_content_maintype() and + .get_content_subtype() can raise ValueError exceptions if the + default content type doesn't include exactly one slash. + + - The Parser constructor's `strict' flag is exposed to + email.message_from_file() and email.message_from_string(). + Also, non-strict parsing is now the default, since that seems to + be the most useful behavior. + + - email.Header.Header.append() now allows the charset argument to + be a string, naming a character set. It will convert these to a + Charset instance automatically. + + - The test procedure has changed. See the README for details. + Also, a new torture test has been added. + + - The non-public function email.Iterators._structure() can now + take an output file object (which must be suitable for print>>). + +2.1 (09-Jul-2002) + + - Support for RFC 2231 by Oleg Broytmann was added. + + - Fixed some representational, parsing, and generation bugs with + multipart/digest and message/rfc822 messages. Now we guarantee + that the structure of such messages is something like: + + multipart/digest + message/rfc822 + text/plain (or whatever the subpart's type is) + message/rfc822 + text/plain (ditto) + + The encapsulating message/rfc822 object is a multipart of + exactly length 1. + + To preserve idempotency, the concept of a "default type" is + added to Message objects. For most messages the default type is + text/plain, except for messages at the first level inside a + multipart/digest which are message/rfc822. This default type is + not described in the Content-Type: header of the container. + + Message objects thus have new methods get_default_type() and + set_default_type(), the latter of which takes a string argument + that must be either 'text/plain' or 'message/rfc822'. + + (Some changes were also made to the non-public interface for the + Generator class.) + + - The Header class now knows how to split long non-RFC 2047 + encoded headers (i.e. us-ascii charset) in the RFC 2822 + recommended way. Splits are attempted at the "highest-level + syntactic breaks" which we define as on parameter semicolons, + followed by folding whitespace. No errors are raised if long + headers still exceed the maximum RFC 2822 header length of 998 + characters after splitting. + + - Other Header class API changes: + o All __init__() arguments have default values now. Also, a + new argument continuation_ws has been added (defaults to a + single ASCII space). + o Rich comparison __eq__ and __ne__ operators are defined + o __unicode__() for Python 2.2 by Mikhail Zabaluev + o guess_maxlinelen() method has been removed + o encode_chunks() is no longer public + + - The email.Header module has grown a function make_header() which + takes the output of decode_header() and returns a Header + instance. + + - A non-public function email.Iterators._structure() has been + added for debugging purposes. + + - MIMEMultipart.__init__() doesn't attach the subparts of the + tuple is empty (i.e. there are no subparts). Fixed a bug + related to passing in explicit boundary. + + - Anthony Baxter's patches for non-strict parsing have been added + to the Parser class. There are currently no test cases for + non-strict parsing yet. Other Parser class API changes: + o Parser.__init__() grew a strict argument, defaulting to + true for backwards compatibility. + o parse() and parsestr() both grew a headersonly argument + which tells them to stop parsing once the header block is + parsed. The file pointer is left at the start of the body. + + - For RFC 2231 support, added the following functions to the + email.Utils module: decode_rfc2231(), encode_rfc2231(), + decode_params(). + +2.0.5 (02-Jun-2002) + + - Two new class/modules MIMEMultipart and MIMENonMultipart have + been added. The former is useful as a concrete class for + creating multipart/* parts. The latter is mostly useful as a + base class for other MIME non-multipart subparts. For example, + the MIMEAudio, MIMEImage, and MIMEText clases now derive from + MIMENonMultipart. Note also that MIMENonMultipart.attach() + raises a MultipartConversionError. + + - The message structure for message/rfc822 subparts has been + changed to be more consistent. Now message/rfc822 payloads are + defined as a list containing exactly one element, the + sub-Message object. + + - The callable interface to the Generator class is now silently + deprecated in favor of the Generator.flatten() method. + __call__() can be 2-3 times slower than the equivalent normal + method. + +2.0.4 (21-May-2002) + + - Fixed a bug in email.Utils.getaddresses(). + +2.0.3 (19-May-2002) + + - Fixed some limitations that caused the Parser to not work with + CRLF style line-endings. The parser should now be able to parse + any email message with consistent line endings of \r, \n, \r\n. + + - Fixed a bug related to the semantics of the Header class + constructor. If neither maxlinelen or header_name is given, the + maximum line length is 76 by default. If maxlinelen is given, + it is always honored. If maxlinelen is not given, but + header_name is given, then a suitable default line length is + calculated. + + - Implemented a simpler testing framework. Now you just need to + run "python test.py" in the source directory. + + - Merged with the standard Python cvs tree, with compatibility + modules for working in Python 2.1 and Python 2.2. + +2.0.2 (26-Apr-2002) + + - Fix a Python 2.1.3 incompatibility in Iterators.py, + body_line_iterator(). + +2.0.1 (10-Apr-2002) + + - Minor bug fixes in the test suite. + + - One minor API change: in Header.append(), the charset is + optional, and used to default to the empty Charset(). It now + defaults to the charset given in the Header constructor. + +2.0 (08-Apr-2002) + + - Message.add_payload() is now deprecated. Instead use + Message.attach() and Message.set_payload(). The former always + ensures that the message's payload is a list object, while the + latter is used only for scalar payloads (i.e. a string or a + single Message object in the case of message/rfc822 types). + + - email.Utils.formataddr(): New function which is the inverse of + .parseaddr(); i.e. it glues a realname and an email address + together. This replaces email.Utils.dump_address_pair() which + is deprecated. + + - class Charset now has a __str__() method, and implements rich + comparison operators for comparison to lower case charset + names. + + - encode_7or8bit(): If there is no payload, set the + Content-Transfer-Encoding: value to 7bit. + + - Fixes for bugs in generating multipart messages that had exactly + zero or one subparts. + +1.2 (18-Mar-2002) + + - In the MIMEText class's constructor, the _encoder argument is + deprecated. You will get a DeprecationWarning if you try to use + it. This is because there is a fundamental conflict between + _encoder and the fact that _charset is passed to the underlying + set_payload() method. _encoder really makes no sense any more. + + - When Message.set_type() is used to set the Content-Type: header, + the MIME-Version: header is always set (overriding any existing + MIME-Version: header). + + - More liberal acceptance of parameter formatting, e.g. this is + now accepted: Content-Type: multipart/mixed; boundary = "FOO" + I.e. spaces around the = sign. + + - Bug fix in Generator related to splitting long lines in a + multiline header. + + - In class Charset, __str__() method added, as were __eq__() and + __ne__(). + + - Charset.get_body_encoding() may now return a function as well as + a string character set name. The function takes a single + argument, which is a Message instance, and may change the + Content-Transfer-Encoding: header (or do any other manipulations + on the message). + + - Charset.from_splittable() added argument to_output which is used + to specify whether the input_codec or the output_codec is used + for the conversion (by default, the output codec is used). + +1.1 (unreleased) + + - No changes since 0.97. Only the version number has changed. + +0.97 (unreleased) + + - Message.set_charset() can now take a string naming a character + set in addition to a Charset instance. In the former case, a + Charset is instantiated by passing the string to its + constructor. + + - The MIMEText constructor now passes the _charset argument to the + underlying set_charset() method. This makes things consistent + at the cost of a minor semantic change: the resulting instance + will have a Content-Transfer-Encoding: header where previously + it did not. + + - A fix for a crash when quopriMIME.encode() tried to encode a + multiline string containing a blank line. + + - New module Header.py which provides a higher level interface for + encoded email headers, such as Subject:, From:, and To:. This + module provides an abstraction for composing such headers out of + charset encoded parts, and for decoding such headers. It + properly splits lines on character boundaries even for multibyte + character sets. + + - New RFC compliant base64 and quoted-printable modules, called + base64MIME.py and quopriMIME.py. These are intended to replace + the Python standard base64.py and quopri.py modules, but are + geared toward their use conformant to the various MIME email + standards. + + - The Message class is much more character set aware and RFC + compliant: + + + set_payload() now takes a new optional charset argument + + New methods set_charset(), get_charset(), set_param(), + del_param(), set_type() + + Header parameter quoting is more RFC compliant + + get_param() and get_params() now take a new optional unquote + argument + + - The Charset module now knows about utf-8, gb2132, and big5 + codecs, the latter two of which are available independently of + Python (see the comments in this module for downloading Chinese, + Japanese, and Korean codecs). + + New Charset methods get_body_encoding(), get_output_charset(), + encoded_header_len(), header_encode(), and body_encode(). + + - The Generator now handles encoding the body, if the message + object has a character set. + + - The Utils module has new functions fix_eols() and make_msgid(). + It also includes a workaround for bugs in parseaddr() when used + with Python versions before 2.2. + + - A fix for a Parser bug when parsing multipart/* parts that + contain only a single subpart. + +0.96 (19-Nov-2001) + + - A fix for email.Utils.formatdate() for "uneven" timezones like + Australia/Adelaide and America/St_Johns. + +0.95 (09-Nov-2001) + + - A new implementation of email.Utils.formatdate() which makes it + more RFC 2822 compliant. + +0.94 (25-Oct-2001) + + - A fix for SF bug #472560, extra newlines returned by get_param() + when the separating semi-colon shows up on a continuation line + (legal, but weird). + +0.93 (17-Oct-2001) + + - Fix for SF bug #471918, generator splitting long headers + produces dupliaction. Bug report and fix contributed by Matthew + Cowles. + + - If a line could not be split on semicolons in order to produce + shorter lines, an attempt is made to split the header on folding + white space. One deficiency still: it won't try to split on + both semis and folding whitespace. Oh well. + +0.92 (14-Oct-2001) + + - Iterators.typed_subpart_iterator() should use a 'text/plain' + failobj in its get_main_type() call. + + - Added class Parser.HeaderParser which just parses headers and + leaves the message as a string payload; it does not recursively + parse the body. + +0.91 (09-Oct-2001) + + - Added the MIMEAudio class/module for audio/* MIME types. + Contributed by Anthony Baxter. + + - Fixed a bug in Message.get_all() where failobj was never + returned if no matching fields were found. + +0.90 (01-Oct-2001) + + - mimelib has been integrated with Python 2.2. A compatibility + package called email 0.90 is being made available here. It is + significantly different in API from the mimelib package. See + the README for details. mimelib as a separate package is no + longer being supported. + +0.6 (17-Sep-2001) + + - Last minute bug fixes. + +0.5 (17-Sep-2001) + + - New methods in the top-level mimelib package namespace: + + messageFromString() to create an object tree from a string. + + messageFromFile() to create an object tree from an open file. + + - New methods in the address.py module: + + encode() for encoding to RFC 2047 headers + + decode() for decoding from RFC 2047 headers + + - New methods in the Message class: + + asString() to get a flat text representation of the object + tree. + + __str__() same as asString() but includes the Unix-From + envelope header in the output. + + __contains__() for use with the `in' operator. + + attach() is a synonym for add_payload() + + getcharsets() + + getfilename() + + getboundary() + + setboundary() + + getdecodedpayload() + + getpayloadastext() + + getbodyastext() + + - Message.preamble and Message.epilogue default to None (they used + to not exist by default). + + - Changes to the Generator class: + + New optional argument `maxheaderlen' for __init__() controls + the maximum length in characters of any header line. + + write() isn't the entry point for doing the text generation + any more. This lets us make this method compatible with + file-like objects. Use __call__() semantics instead. + + Calling a Generator instance creates the plain text + message. This is the same as the old write() interface + except that the optional `unixfrom' argument now defaults to + 0. + + There is a new, undocumented semi-private interface for + extending the MIME types Generator can handle. UTSL. + + - New Encoders.py module contains some useful encoders for Image + and Text instances. + + - Text.__init__() has a new _encoder optional argument, which has + the same semantics as _encoder for Image.__init__(). + + - StringableMixin.py module has been removed, and its + functionality merged back into the Message class. + + - MessageParseError doesn't contain line numbers any more. + + - Lots of bug fixes; lots more unit tests. + +0.4 (09-Jul-2001) + + - New module/class called RFC822 which represents message/rfc822 + MIME types. This takes a single Message instance. + + - Message.getmaintype() and Message.getsubtype() will now return + failobj when the Content-Type: header doesn't have enough + information. + +0.3 (20-Apr-2001) + + - In the Image class, the _encoding argument has been changed to + _encoder. Also ImageTypeError is removed; if Image.__init__() + can't guess the image's minor type, a TypeError is raised + instead. + + - Message.getparam() and Message.getparams() have grown a new + optional argument `header'. + + - MsgReader class has grown a new method readlines() for + compatibility with Python 2.1's xreadline module. + + - The ReprMixin module and class have been renamed to + StringableMixin + + - New exception MultipartConversionError can be raised by + Message.add_payload() + + - Bug fixes + + - mimelib has been moved to SourceForge. See + http://mimelib.sourceforge.net + +0.2 (14-Feb-2001) + + - Generator constructor has a new optional argument `mangle_from_' + which is a flag. If true, the generated flat text has From_ + lines mangled in the body of messages by prepending a `>' in + front of the line. This assures that such lines are not + mistaken for Unix mailbox separators. + + - Added a new class ReprMixin for adding convenience methods + get_text() and __str__() to Message subclasses. + + - RFC 1341 (MIME) calls the blob between the closing boundary and + the end of the message, the `epilogue'. Change `postamble' to + `epilogue' in Message and Generator classes. + + - Much better conformance to RFC 1341 in the Generator. + + - Added __all__ support for "from mimelib import *" + + - Added LICENSE file, currently BSD-ish. The copyright will + eventually be transferred to the Python Software Foundation when + it is activated. + + - Bug fixes. + +0.1 (24-Jan-2001) + + Initial beta release. + + + +Local Variables: +mode: indented-text +indent-tabs-mode: nil +End: Added: sandbox/trunk/emailpkg/2.5/README ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2.5/README Sun Dec 18 04:19:13 2005 @@ -0,0 +1,95 @@ +email -- a mail and MIME handling package +Copyright (C) 2001-2004 Python Software Foundation + + +Introduction + + The email package is a library for managing email messages, including MIME + and other RFC 2822-based message documents. It is intended to replace + most of the functionality in several older standard modules such as + rfc822, mimetools, multifile, mimify, and MIMEWriter, and other + non-standard packages such as mimecntl. It is compliant with most of the + email related RFCs such as 2045-2047 (the MIME RFCs) and 2231. + + This version is identical to the package available in Python 2.4. It is + being made available as a standalone distutils package for use in older + Python releases. A minimum of Python 2.3 is required. Because the email + package is part of Python, it is covered by the PSF license for Python, as + described in the LICENSE.txt file. + + +Testing + + To test the email package, run the standard unit test suite from the + directory that you unpacked the source in (i.e. the directory containing + the setup.py file and this README file): + + % python testall.py + + You should see a couple of lines of dots followed by the number of tests + ran and the time the tests took. The test should end with an "OK". If + so, you're good to go. Note that the exact number of tests depends on + such things as whether you have the Japanese codecs installed or not. + + +Documentation and Examples + + The documentation can be found in the docs directory: + + docs/index.html + + If you're looking for examples, you might want to check out some + of the tests. There are a few examples in the documentation as + well. + + +Installing + + To install simply execute the following at your shell prompt: + + % python setup.py install + + If you're using Python 2.4, you've already got the latest version. + + +Acknowledgements + + A big thanks goes to Ben Gertzfield who implemented the bulk of the + multibyte support in version 1.1, as well as the RFC compliant base64 and + quoted-printable modules. + + Many thanks to these other fine folks for providing code contributions or + examples, suggestions, bug reports, feedback, encouragement, etc. + + Anthony Baxter + Martin Bless + Oleg Broytmann + Matthew Dixon Cowles + Jeff Dairiki + Quinn Dunkan + David Given + Phil Hunt + Sheila King + Martin Koch + Jason Mastaler + Andrew McNamara + Skip Montanaro + Guido van Rossum + Thomas Wouters + + Apologies to anybody I've left out (let me know!). + + +Contact Information + + The email-sig is the mailing list and community of users and developers of + the package and related Python email technologies. For more information: + + http://www.python.org/sigs/email-sig + + + +Local Variables: +mode: indented-text +indent-tabs-mode: nil +End: Added: sandbox/trunk/emailpkg/2.5/moredata/crispin-torture.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2.5/moredata/crispin-torture.txt Sun Dec 18 04:19:13 2005 @@ -0,0 +1,25876 @@ +From mrc at CAC.Washington.EDU Mon Feb 8 02:53:47 PST 1993 +Date: Mon, 6 Feb 1993 02:53:47 -0800 (PST) +From: Mark Crispin +Subject: Multi-media mail demonstration +To: MRC at CAC.Washington.EDU +Mime-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary=owatagusiam +Message-Id: +Status: RO +X-Status: +X-Keywords: +X-UID: 1 + +--owatagusiam +Content-Type: TEXT/PLAIN +Content-Description: Explanation + +This is a demonstration of multi-part mail with encapsulated messages. This +is a very complex message whose purpose it is to exercise software using the +new multi-part message standard. + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Rich Text demo + +Received: from dimacs.rutgers.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA21889; Tue, 24 Dec 91 05:52:04 -0800 +Received: by dimacs.rutgers.edu (5.59/SMI4.0/RU1.4/3.08) + id AA09350; Tue, 24 Dec 91 08:14:38 EST +Received: from thumper.bellcore.com by dimacs.rutgers.edu (5.59/SMI4.0/RU1.4/3.08) + id AA09346; Tue, 24 Dec 91 08:14:33 EST +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id for ietf-822 at dimacs.rutgers.edu; Tue, 24 Dec 91 08:14:30 EST +Received: by greenbush.bellcore.com (4.1/4.7) + id for ietf-822 at dimacs.rutgers.edu; Tue, 24 Dec 91 08:14:29 EST +Received: from Messages.8.0.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.41 + via MS.5.6.greenbush.galaxy.sun4_41; + Tue, 24 Dec 1991 08:14:27 -0500 (EST) +Message-Id: +Date: Tue, 24 Dec 1991 08:14:27 -0500 (EST) +From: Nathaniel Borenstein +X-Andrew-Message-Size: 747+0 +Mime-Version: 1.0 +Content-Type: multipart/alternative; + boundary="Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk=" +To: ietf-822 at dimacs.rutgers.edu +Subject: Re: a MIME-Version misfeature + +This message has been composed in the 'multipart' format for extended +mail bodies. If you are reading this prefix, your mail reader probably has +not yet been modified to understand the new format, and some of what follows +may look strange. You may wish to look into upgrading your mail reader. + +However, the first part of this message (immediately after the funny-looking +boundary line) is the text-only version of the message. If you read that part +and skip the rest, you will probably understand the gist of the message. +--Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk= + +I have no problem with changing the BNF to permit the period, as Mark +suggests. However, I disagree violently with the following comment: + +Excerpts from internet.ietf-822: 23-Dec-91 a MIME-Version misfeature +Mark Crispin at cac.washing (429*) + +> All in all, it's starting to look like MIME-Version is not really all that +> well thought out and is in danger of being superfluous baggage. + +Some kind of version number is, in my opinion, totally vital -- getting +rid of MIME-Version without some similar versioning mechanism to replace +it would be, for me, a real show-stopper. + +By the way, this message is being sent by an experimental version of +Andrew I'm playing with. I'd be interested in any comments you have on +its formatting, etc. -- Nathaniel + +--Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk= +Content-Type: multipart/mixed; + boundary="Alternative_Boundary_8dJn:mu0M2Yt5KaFZ8AdJn:mu0M2Yt1KaFdA" + +--Alternative_Boundary_8dJn:mu0M2Yt5KaFZ8AdJn:mu0M2Yt1KaFdA +Content-type: text/richtext +Content-Transfer-Encoding: quoted-printable + +I have no problem with changing the BNF to permit the period, as Mark +suggests. However, I disagree violently with the following +comment:Excerpts from internet.ietf-822: 23-Dec-91 a +MIME-Version misfeature Mark Crispin at cac.washing +(429*)All in all, it's starting to look +like MIME-Version is not really all thatwell +thought out and is in danger of being superfluous +baggage.Some kind of version number is, in my opinion, +totally vital -- getting rid of MIME-Version without some similar versioning +mechanism to replace it would be, for me, a real show-stopper.By the +way, this message is being sent by an experimental version of Andrew I'm +playing with. I'd be interested in any comments you have on its formatting, +etc. -- Nathaniel\ + +--Alternative_Boundary_8dJn:mu0M2Yt5KaFZ8AdJn:mu0M2Yt1KaFdA-- + +--Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk= +Content-type: application/andrew-inset + +\begindata{text,1672608} +\textdsversion{12} +\template{messages} +I have no problem with changing the BNF to permit the period, as Mark +suggests. However, I disagree violently with the following comment: + + +\excerptedcaption{Excerpts from internet.ietf-822: 23-Dec-91 a MIME-Version +misfeature Mark Crispin at cac.washing (429*)} + + +\quotation{All in all, it's starting to look like MIME-Version is not really +all that + +}\quotation{well thought out and is in danger of being superfluous baggage. + +} +Some kind of version number is, in my opinion, totally vital -- getting rid of +MIME-Version without some similar versioning mechanism to replace it would be, +for me, a real show-stopper. + + +By the way, this message is being sent by an experimental version of Andrew +I'm playing with. I'd be interested in any comments you have on its +formatting, etc. -- Nathaniel + +\enddata{text,1672608} + +--Interpart_Boundary_AdJn:mu0M2YtJKaFh9AdJn:mu0M2YtJKaFk=-- + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Voice Mail demo + +Received: from Tomobiki-Cho.CAC.Washington. (Tomobiki-Cho.CAC.Washington.EDU) by Ikkoku-Kan.Panda.COM + (NeXT-1.0 (From Sendmail 5.52)/UW-NDC Revision: 2.22 ) id AA12299; Tue, 8 Oct 91 07:29:39 PDT +Return-Path: +Received: from thumper.bellcore.com by Tomobiki-Cho.CAC.Washington.EDU + (NeXT-1.0 (From Sendmail 5.52)/UW-NDC Revision: 1.60.MRC ) id AA27545; Tue, 8 Oct 91 07:28:25 PDT +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id for mrc at panda.com; Tue, 8 Oct 91 10:25:41 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id for mrc at panda.com; Tue, 8 Oct 91 10:25:36 EDT +Date: Tue, 8 Oct 91 10:25:36 EDT +From: nsb at thumper.bellcore.com (Nathaniel Borenstein) +Message-Id: <9110081425.AA00616 at greenbush.bellcore.com> +To: mrc at panda.com +Subject: Re: multipart mail +MIME-Version: 1.0 +Content-Type: audio/basic +Content-Transfer-Encoding: base64 +Content-Description: Hi Mark + ++Pv/d3RydWlnbGtnYWJiaWxqaWxucHrx7erk7X709Pfx6eXo5uXe3Ojw+Px1cXZra2dsbGdr +Z2t5bG1wbWxtf+/v8vPq7O3ue3B19efk8vz3fXl1c3RqcHFsb3x6dnZ5anf4+vb+8nt2+vL4 +8ej5+vN7/vH2dPzweG3++23y6vn6eGlneP37fHB+dm1yevt7ev39d2518evs+Pzw/Hr67np1 +fn7+evp8fP3ycmxucXxtaW58/m94/HNtfOji6e/y8vD67+Xm7P/x+G5naXBwcnl4dHx/c3Bx +eXt3bmJfY2/29v3v6+rj4e3t5eno6/b+8vBxc3JubnNzeWxpaGRnZGZz9vbt6e/8+fr4+vfr +6/bw7PXw+fj3/Pl3a2x5cXFwfnhra3r5em98/Pv0/Xt4fHn/7env7+vt9/748Ozq7ntpZmln +ZWl9fvn7enVu+fH4/3R2fHZv9+v5dnB8//76/fr+fn/4+n3u6u59fHlxem5t/vl3dvl89+/q +5u7n7Ph1aGFjZ25wam13/nt++374e35/+/Lt73lsZnB+/fP38OHj8PL0+nX17vr4b2tnX2dx +dW5x9PB7c/z9fPTvf/9+dP39ePXn9nN6fHV4e3hydv799f9veXtxdOrk8O/i6/vr6u/49nvx +92l1925lZWdoaW5sb3FtcXX9/XF1fXd3eHh47+Xt7ejp9fHu7uvx8vH2+vjv63l98/D4/HRl +YWFhX29+/Xhvb3Bu/+7s8Pn3+Xhs9+bl6vJ+7Ob++Ozv9PDk7G5veWNla2lxcmtqd25ueXx8 +8/J79O7s5u38enN8/HpsbXz87fDr4+jr7u/6+Hj27Hl6fv52cG5ueGxrfff+cf/3eHFvffZ6 +e/Tv8/v7/Pnx+3X/8ft+9ejs7uvx8+/z/Hl3dW14/HVzffv5/v56/PH8b3Fxa2prcXl5/fx2 +8+zs7uzt8fPt93BtcXlwd/708n7q4vLx7Phwcn/y6/Z5efh9efj8+nVzam10dP7+/vjv7fhv +a2xxfPL9eHJ58vlucO7p8vz9+v379/T5/fn3d2hw/fTz7fP6/fr6enny7O3s+P3/dnXu9n50 +cndtb3l8fP/09PHu8X1sbGpvdnx6/fHv7uzyfPz2d29++X5vaWJv8Ojn4+92/O3yfPr7eHx9 +dm1vefn4ePPu7O3x/Gxtffr+a3H++XFq//X6/n54eff3dW94/vv9/Xb66+599/T57Or6eHv2 +7PR2df9ubG5wd/f+cX31+np5evh9dXRvbnB6ffr39O7s7/Xr5N7h7/5ue/n9c29w++97bWtn +Z2tqbmxoZmduaWr76eTn5uXx/ffy+nZ29vP57/119u7v7/r15+nr8Hd4e3p7cGlta2tycG95 +fHb4+3hxa2dlbP72fv15anN9bm/68fXt7/Xs5Onx7+jr7eTw+/X+ffz+b25ua290dW5qZWJn +cHz3/fv++O3u+//0/Pv6fW5oaXX78u7r5+/s6uv8b3ZufH95dXX++O3ufG5ubGty/nh2bW1v +bWpqZ2187uPo7/Lq4OLq7v10eH57fvt+fnx79O3wd3h4a3H5/XlyamNibXVvcm50+Pf5fH/6 ++vz//PTq6+/6d/3u6/Lw6e/48+r1cn16aGx4b29rbX74/H31/2xueHRucnl1cnt4df198uzq +6ufk6O3u7vp6d/98bGZxefrz7X1oZW37dm1oZ2t5fvz3f/vt6uXn5eno8fd+d/r3/HFzdm9x ++3ptanN2bm97fnZ+efjz+n5zb29vePPs/33r5uXe3uj09/l9cXFzb3Bxc3Z0a3F1cHV2en15 +dnZtbG91+nx5fX7v6+ji4ent7/bs73x0fXl4e3lsb/90cvfyfHt+bGZv93tpbHv18nz9fH/0 +8/P48u328/b07+73fHVzdXv+bmZqe/x+8vL0+HtmZG5we/z8dnv08XZ4+/v99/Dv7vDv7u/4 +9fP6+/r6cG7+/W9namlyfHJ+fnduevP+c335fvn6+u/x8vj5/vn1+P57++3t93lyamtsam52 +9fj6fHzy9Hd5eXpubnpxePx/c3j37evo8/7x7fP2+fPy7+/8cHN//3h3d2tmYWZrbPd9f3r5 +8Pv5fPvv7fz87vDr5+78dnx9cmlmam1jZnV67+vr9Pz37u37/v91fPr4+/Xw7vv49+7q+3Fw +/nxwb2hsbHX3d29z/nh1/Xx8//f+b3r19X396e7v9nhvcX72/fh7e3d1bmhr9Pb38vx9/vf+ ++/fu7X13fvfxdm968uzx9X93/37+cm1ufPl3cm9xa3R6fn58+vj29P379Pj79PH5eG1tb3h+ +bn/9/efs7OvyeH79em9ycmpx9/H29P//+O3z9/Jzb317dX78d3Vxd/rt+2/68u3v8O/6+/f7 +e3d5eXFvcX56cnJrZGt9//b47urydG92+unr7O718fT3fG5+8vPw+Pz9dXVxcmZlcGtiaHZ+ ++vLk5urp5uPr6uzv9Pl2dHt0eXhybG5rZ21wfXx9eHx8eW9yfPv68er0dHf2+fPl5ers+fX0 +fHvu7Pj2/HRsb/v9cnBtaWpqdfXt7HZrdX3u7X56fvT5dGr77vD5eG5tanTz8Pbx7fbyfv3y +/nh3+fvz7vl3eOru/Xl6+3x7amRqb3l0cnZ5/+/1+fr89P14e/h9eOzo9v/49XF5fP9xbHx3 +cHT89+zx6vdy/vH0fX768+/u7PZ+/nlwbWpve/R+bnZ5+PX2eX7z+npxeX12cXB/9e339u33 ++fru7Ozo6/D+bW1sbm9tcnZwdWtt9/Hw8/L7/O/w7+35/v7u9/j6c3J5b254fP/+8vH6+vZ2 +cvTq6/1ta2VpbWx1/fvt6vb47/P6+PL3eHd4bH7p6efn6vh/dWtz+/10c3L48P91bHT5//x0 +cvfu+m1tbG1wdfj+8Ojyemp29PLx8/vy7+3xf/fu7XtveHV4bm55+uzs6/xpc3P+7Pvv6Ov2 ++v1ybm30831+e2xjbnhzXmRrZ3F49vh19Obl6+vk6OHk4uzx8e/vev55d3Nwa2hsb21zdv/7 +e/1wdn54eW92bGZpdPT39Pj39PLv7Pdx8ufq+f18f3r58fjv+Hl1b/rq/nd5+/r6+3J29/n/ +/HVlZnFua2pwbG1ra3L88eru+evg3eTt7Onq8nlsbHv67vj6/37+cnFncH3+fHR6b3JpbX56 +evz2/fLq7Pv0/HZ8dWlseXv0ff3v5u339PN2evL+c3J+dG5sdHT/8fj07ejr6+7z7/v5fvnv +/XJzbmt+eG1tZWpvc2pjd/vy7+3r+vr2fPn78urx8e/t73Fvffx1b3lw+uhva3V0bu7s+XN5 +/Pn0ant8//bu7nr79Pn3635oZF9ZbvTm6vXr7ez/3djy73pyWFZeaWZbafj07Ovn8evc8Hll +bv54fert397k7+ro+3xxeW36c/VxZWds72Jia2tgZG/7/fvv3+Dh5+br7/L37+7vc3d4YWZn +eXprdndjZXz//nl1+ur2ffvl7vXk7eXx3t3h83ptbPnxce/yXWJma2Zq9P//a/98aHdt6vJ6 +++jndOvtav/q6vv48ulvae/67/NybXb7ev5oc3Xt6/l0c/R5dmBj+e91+vR0eu/s8n5q7+97 +dOnc6e7t/Xbq7W5obHL4f/Z4efLq82JkYWBlaHr8fX177Xp98e3u7+v55exz5fLtbGd0d/fy +5/12+f9yamJlZmtfe/b9+291b3V67fHh2Nz529/k4G9oYWFqbe/xX29qYmRiaGhsau3ffeXh +8Xdx7//6aPfv7+Pk39/vfHp0Y11tZF9le/pt+nT3eXfi+G5sd+Xt7t/h3+p2bn5wbe7xZXFt +c2pcd3xuevz56+v06vRqcvDpaWFl/f/02OL/dvFsWVxoeP9sfurx8+zw4+/5/mVia3rucm3v +3+f+cnno7H3ofGtja/f4dXPv9HFzY3F2Z3b2/mp57vRveX3w/3h0bGRedN7g9Xfo5/jt8Pp7 +9PX4+Xd+7uz+aGru83Fob2xgb/7zeG58aWRjbfdxb3Ti4e755+Pq9u3n+Xl2cWRhdfjn83l7 +cvbu9e90d2l4b2Np/elpcOrofWv+fvxubvDy39/x7+59fHVraGz46vly9PNzbvX/b3Z3/nr4 +c2tva2757v396+d4bX7v9W98ev9ya+/q7/Lm5vp6fHZzfWxrenByc/h2bG956fP59H77bPvu +c2JfeHV33+bn6ezn6PX86vl8f3l1bnNvbmdld3Zw7vtveP53fPx/c2l+8vj6bGps+37v3uTt +c/Po6+/x+vl+a/J5Y3P2eHP+7e1wX2zzdnbk+Gpm/fRod+/v7fTxf/btfHX08mn6emto/Ob5 +ZvXm7/P17fnwfPPueG1u6PBu+nRxanp5bWtp7uxgavPue3Dr9/By/+5/emjv73Pw3ulv7t3g +7vh/83Jf9+P8anT4dm9zfft1aXJrbmhfa/59eu/p73j25e3n6PHqemlq8HZu+Org+X7tdnBq +be77bnXs6XJv5/dr5+X5ZmzraF198Oz4/eLw8e92/Wxp9X1sbH3mcl1sd3RyZ3bsfO7n+Hrw +6vfu6/Zn/fdq8PHr4+n6cnn7c/j0fXZ+/Hb99fRzc2Zj/vZmau3md2h5dGb2/OTl/ff482v+ +7ejx/+Htb294emt5c2pudPt5cm9t7O5zbvzq9Xh85u537ufh7ufa7GZ39/dvau7x/n1pZ15o ++f1x+fdqbHdyZ29la+/n/Gvy5/p829h89/zu8H3z9uX5efD69G1p/m9pa+v1cPj+8Xvw6ft5 +bfTnd2lo+vhleHN1/nHs5Pr+7+17dvtpZnb+a3Hs7PHq/Or5fOtz/nTu82NxY2vucHxxe35p +b3ns4ujv5+Dz+fJ+fvv1+2tr8vxvdOrufXFxb2r7dWzwb29wdHhnb/Rz/u7w6uzu+ez9Z3z1 +7vrw4OX5aGv8a2n75WtreGhseHzv9W7m2979f+7zfnzr9GljeX1dYnL5aWnu8nB8+nNtff3o ++F7+4fJv6OPl8Pfd82x3/e90a3ri4nVvc/lsX196fFps8f5tbezl+3bi3PD44O/1835sam/6 +9G5rfG9ob3H6dWv99ert6+bj/Gt9fmxoeft46/Ts53tw7OloaftuZ3H59f3q/G364uL6++J4 +/e70/2t8fnd58H5tanN2Z3JtbHp+7P1v8u7ke/3l6vx4e/t5aXZ9bW939e/17uvm5/X3/fj7 +eXt+bHR5a/59Z/Tq9m1w731y9/X+8fP49n929+b/a/Dv93p8e2d67Xl4f/x2fvB2+/bz9Px5 +fWtxe/b2dnnu9WJpfG14fHx+cujh5vZ18Xl58fH37Ozt+n1+a2dq+/n77vdq/fDr/Wd7+XBq +amVnbWt39/r0dmt4d2n36PDr6d7q9+bs8uvuePjxfWNmam12bGhxdG9xbWdqcGx+dP3s6/T8 +4uLp4N7j7357b29oendjafz6+HhuZWFrbWxyfm7293v1+eHl/+rj6/lv+3p2aGv6+/xucO7w +eeXx9exybHv+cvHrfvH2bnJ8fm52cXF9fez6b2/t73FrYnl4ZnTt9Xp7/HNq7+Tu//n+391v +dOTq+Xju7m149XpoZnz29WNn8npnZujrbXb/9nZndOpzXmn983555+p2++fqffD27OL2/+n7 +dvdx8vpsY2j4b2f67XpobnV0am/q/m76fXL8fW9ye/jvff3h6nz15fb37Onpfnzm6Plnc/dn +YW1uZGvl6GlrbflyXGz0bGl+7W/v3Pnx5+zd4+vx5u1rc/T8fG52729ycnr1X1txbXd6eHJ0 +9e/s3+t0fe78c3r35Xpp8+jxZml8b3Fw+nhrcfji6fbn4eZ69O52+nV2/XN4fWps/m5sc3T4 ++mZs/W5pZ25mff326O/q2Nbn7Onq++/3cm9mZ3n7eGBt5/drbeXoYWT0eWBifntqZ+7m83T7 +6W9obW70fvzr7PHq6errcW7p6n129u7/+vHz7ebyb2hgbvz7al5xdHJtb31uc/59/3lvenBo +d/Dydv7r6/p7/ebffX7h5np14eB7aWvj6mdnY29zanT5dWpqaGzu5Ot99+ry/HTz8XN5bWr7 +93B6/nL8f3L15vBy7+V4am/3+XB3fPft//fzZX3q9O16/nttd2lmb2lt++/1ZG/3b3D/5uLp +7erh8vn+7Onq6X5oYmVnbP95eP92b35oa3xtfPZ7cu/m/n/d2/N1++vr+W3+7HtiY3l6aHt9 +Y2Nx+nVrdG599u/e5e37efDv5u978ez8enNudW9uaHh1d3n77n5vd+z1ZG/v8Ht07v18b3ng +7W5rfP5ubvXn7/TpfGtv9O1lXWdy+3x97vXi5fLu7O35dWxvdWtvc27t7n3w4t/rd2/z/HBt +e+9tZnrveXLr6ezvbmhqZGJoenZs/Or3/u3x9Ojv/PL8/f3y8+ni7H579X54eW9x/mxl/en7 +cnL88W17+3l1a3jufGNo9ez58PHq7Orq7OXt6vlwdG9peP14fX/y93pu+Xtobm1udvbybGty +b3hzbnB17Or//O/u6u3t4ebp7e3q9/rt/Xd1fHFrZmN3/m9tbPv3Zmf+93Vu/uv5bPbo92t1 +5uPp/u/r6Of4+PlyY2Bscmtvb/bybPXld2lz/fV8/3vt6Xp3/fD08u3q+P745+t5a3Xq+29r +/vF6cW91ePf3cWxy9uztd3Hw925kaXp5b2x57PR++Ovz9vTu+vz+dHn96e/39O3o/m779P9z +cnBr9Hpuc255dXN8fXxxbHN4//7t6nX87vf1+/ry7+7t9PZ0bm1scfj2e33u6e76eHv4fnB3 +bmZw9PLx7+7ucmRnb3FycGdv7e/v7uvl93fxfHBzef3x+fjy8PRz+PP0eGdpaWdqeO74cHrv +eHZ2c3327nx5e3Tx6Ozs5d/n8353bXP6fnl1bm59+fr47vb4+XRwbHJuZGdfXmZrdHrx9H7z +83x7/PDp5/L46/D68+3s8vb48e33fvPp7n389f14fv12d21pbXFqXl9qbndtcPft8/5+fHx6 +fvj28P/z63pmdfr9dXjq6vf27ufr9fXt6/H4fv/5fXvw9Hl6fPR7aW5+9nh5fX5waWtrZmlv +cXRvbvPl6e/07vZ9/v707nb/93d7fP38+XZ19+98bvro5er0+Pr8dGv473J3+vt99flvdH// +/3h99vr4e3h2cnV2bGp0fXV6+nx1+ers8/T07eXo+nV8fnd3e3hucXhta294ff338O/q5Ot4 +aGlucGt59e/s+Pby9+7u6Ofq6fV3c/zz//r0dmpqa2tsam52dGZpeHB2efjr7Pf++Ozy8/Dz +6ur0eff+cmVkem1qcu3o/v7u8f9tZG/v9H76+HP06vPw9u3qfXFycXFrdP7+/3trZW357+x+ +evv9dnP79/r78PB9dn7y7fPs9O7yenN5/X13bG51+HpscHd7cmxxcWtr/PL07Ovv+Pf//Pv4 ++/339/t///jp7PT9fnt6eW568/v49Xt6/vTw+H/19nxvaWhua25zcvnu8Hz37fD07e92enn+ +7uno73p6d/rz/nZsaGZscmZt//18fHtveu72fenq9/jz9n/v4+bm6vZ5dGhjbnF7+3Fqb31x +anBvd/Lt73t0fu/y+vX3e3v48vPt6e16d/x/cHp5df707PTx8fp+dGtsfflubnxzbm91+Pt4 +d/798+3q5/xvc/x+cHVta3X87+3s6Or8/vDzcGRqcXfy9Hxx+/P++/jv7/T5//Tz/X/9fHX5 +/Hx9bXj9fHb7fm9saWtucfj8amtxffR/+/Pt9e3k5efi5vn+9fhzam1ycXJ6fXx//P17a2d0 +cnH//vb58fp9+vX6dHFpaXzu+frs/fr1+nxvdPXv/nvy7/r67+rv9+17bHJ5b2Zrd/19eHJs +Z2Nren95+u74+unl6/T++fP28ezy+vDv9e7v9u/+dnf/eG9tdnpxe3JsYl9kaW5rcHdrb/19 +++rm6O3r5+3w6+z7eGxqd/r16+js7e9+/f90evv/a2hraWpsbGlteXx4cnF88Pf88e3t6+v5 +/e/v8ff17fDxemtucXt6en359vf3d3JzcGxoa3D7fHP+/Hjw6evq6+739/Lz7/D08+rwfXFr +bW92e21pamt0++33+e7r5ejs+Pj3+v5wamlsd/v6cG93d21udWhs/O/x7e72+/729Ors7eft +9fb07/75+f10c3t9cmlrb3NpbHV4amz5+v59+X577/T7cnN6d313efrq6+nm7/Do6vD27+n8 +c3Jydm9teHZvdnJoYWlvbGlpdnt1//57/e/p7PZ97Of+bm92+uji6Ovm5Oz39vLw8nt5ffR5 +amdfanFsc3FxdGxrbnZ6cG//dmhtfXv+8Obk5Onr7/3+/vf7+Ovn8Pf2/O/weGVueXp2cG5v +aWx4+Ovr7vh9bWhqb3dvcP59eHh7ff92b/nu9Ojo7/L59PR+fnr/8+/2eX1w+u19/vv38u56 +cXBvamFrcGtmZW1t+/h89uvu9PJ5fe/w8Ors9Ht4+fPu8/X9ffr+8vtvcfR8bW1ndPt+dHP+ +++/t+vn8+/f+/Hh5enttbHf79HtobXh5+/Hu7+bq9Xlscmx58vh/8Hx16ufr9Ozq6OLqfmt0 ++m5eXGRtc2VZX3L253xmcPrk2edZVF753Ojt3NDM0N7g29zo7l9Yd/H8XFRdbVxVRUFV+eDu +aGDe1t57VV/l2dnb2MrCxMjR9Wtq/u5kSUlobuNNOD5R5tfvVHfb3t1mUVf51tpz98/CvsDL +1t7g5GNe+PxOS01MRDk+T+DP0t/u3+vq82ZRSVD22MnJy8jBvL7WaGpw1tLdaENAQTowN0jV +wMvj9eXd3GNYTklU793FwsjHycO8xXlnaNrEyutMPjYyLDFUx7vA2evX4vxUS05LWtx8z8PD +w8zOwMDo8urMvcfnVTkxLSgz/ry3vt3jzuZfRj5ER0/e18e/wcfNzL/B6djHu7XCVz00Ligk +Ns61s8Dw3MzpWz04P0BK1sy6t7/Gz9DEyfXHvLW12D8+NigeJFG0q7nXb8vI7kIzOUlDSuHO +sbS+zuvavsPnv7Wrr9dDMioeHCvYrq6618rB2lI5Mz5URj9cwq+vv+pf+MjIyruuqKvEPS4o +HBcp26umtc/OxeZYNS4/b1hOTuayr7bIVE3bysKzraipvT4xKB0UHVGrn6u+z7rNZDQpL1Nm +bWNMurOyv1Y+XtHDr6ukpK9QOCofExU1tJ+ntcq1vmw2JStH2t/VVb20uMFXQVHWz7Kqo6Op +0TosIRcQI9Cjn6q+vLhfOyUjMmrmzNG8sLK9YEFCcN+8qqGhpbVDLSEXDxxbqJ2nr7Ouy0Am +ICpI8d7fwq+uuf5DP1FgyK2in6GrbS8kGQ8UMrOeoaqvrr9KKh8mOVXf0sWurLLNSjtKWNmv +o56fpsoyJxwQECbAn5+qr663cC8fIS9L5PXHsK2wylQ8P0Z8tqWdnJ+2OSweEg4bYqOdpaqu +sM0zIB4qStlu2ruxq6/TPy81VLmooJ+iqso2IhQNFTiqnaOqq6m4PyIdJT394N3Bsq60wGQ5 +NTzPq5+fo6qzzS8bDQweuJ2dp6+pqWAtHh0uS+zOwLavrbbXOi85a6+in6OvtqmyIxALDkOn +oaiusaKpPCMaHz7C6Eu7q6Ssczo4OETBrKGhqayqp7wbCQkYuJyfsrmtqLMtGiIwSkc5wqSf +rMs8OjwzUq+fnqrLvaqjpDoKAA7Ik5S6Rr2pr/0gGyQxT9bHqp+tw0A1SFLZr6Wor7+3pJ6o +WQ8CDCyglqfoxLTH1S0jKy04UsinprK+0nFNOkG5pqWzy7ypoKW6NBAEDz6ima5sy8RERy0s +NTFBuLu4sb6srus6OU6wp7C0tK6oq8JSOi4PCia6m6M/L3BYOzwmL23FveBXtayst1lHVOG3 +pqertsu6tstJQ+7cGg4ix6ewLipCNy47OsyqwlZMVLKsusHW9sO7r6WotdtN6tt04c28uE4a +FCh5sUYfHzNhP1nApKZlKy/OrLDDuq2tt7ivrLxGOUpazLi/tbtbZDgbHSEmPDEvTu9P2r2s +rVsuL0+xp6ikpa7aSlHLw+tZYcq9xd/Jw8tMMyUZHixS3U1Abtc5U83IwU1Ku6yjpbTFa0dK +z7+ys8vYaFnVx8DcOi4uNEE4Kyw7XeZONjQvObenqLHFxcjP5cfAyNLPta+0yU5ubVdRPjdM +anPc8+BOLiowOUU8PkTxv6+wvdZFQ1rWvLu+uLi5wcvebk9JSkVf2NPfVf7Szko1NTI5R09e +Xc3IxF87U8rLf3rHtrzOeMvBy19JZu7O39bjb05GTEzMwt5JXVNVRkbZ4zUsP9K82O3Du8pH +P2zEzOrb1dHZ5s65vlw8QGjO2N3X2/LX0dJdPTo7Pzk8ZtLN0+PYbU5IX8zK3W/8yMnP1si/ +wmBS09912cnL01Bc/Eg6PU9qQDRF+9TZVEdWV2vVxrzA4HHxZ9LUyL3Dz+LJy8/5bnnf7FY6 +R0k/STgwPWRnz+Rj7X7uz93l282+vutuybi3w9vVy9p659HrX1w3LDk/QT4vL0lZ4sDEyNpx +z9Tr0b65uNTbuLjCz+PazF/v0svLNCs1Ojk1MDtIQE7OwLzPWt/jzr++ub3Uybe6zfvVwcXR +wsY9KSsyPTgvPPlFPGHawMdVUdPLxb64r7vbzL26vcTQ1NG/wDYiJzjkVCsnR/7y3d++s+I7 +SdCxr7fG1eXLv8G8ub7Q39MvHCA5xMYzKUZsT+u7ub1SOGa6r6yrt89Zb7uyvcvlarxGHBwo +UsNGKjno2M7hu7jsPD3frqmtrbnU7dC/t7m7v8A2FBYwusw1LT5oOzzNqqvXPEnGr6utrLTG +Xt64sbCwsj4NDC61sFMkPas6Jl2ypLUpK7yppKmsqrZSTb6vp6q5HQYRs6PLKyTIqSwiSqug +ySArrp6graulr0RFt6WdpiEEDN+isjMp260qHTS2pcAnK7ukoqmnoarvS7qpn6IlBQ2+o7g2 +LrCiJRotUbK2LC65qaesrKSpVkC9p5yeHQMSsKjEOEqfqRwbOmLRVTHqra2trKShsT1Ot6yf +xAsIVaDHLC6mlU8UJr3uOTFEraq6r6KgqtRGvayqtxMHIaC1OTezmbsXHcdrKS5jq6nOv56c +p7rbvq2tsiEIEqerMzmwmqYdF0rBIRteoKfoXKaZqV7FrLHJuEwPDFefzzTeoJw7GzLNKRkr +pZ687queqXHerKvAvu0VCiijyTTNoJxZHTPAJxUlp53CdqGYqUZorKzHycweDR6vyDbPoZ7O +JjzDJREfrZ+37KaZpFltra/GwGsdDh+x2zDRop/wJ96vKREbvabEu5yZp9zhr79LuL0eDh2y +0i7Lnp59J+urLRMc3KvI152XpL7Fsr5BXGEfECG9PTGvnaRUL8WuJhUk5L/ouZmXqravr9o/ +5NcfDh+0PCa+nKBMLL6oKBIjz8dNvJqXpbCqq+I85XcdDiOyLyOymaNDMbmsJRUn4nM7t5ia +qKmjq+w8WVgcDiW2LCKymaRFNrawIBYs0VA2vJmZqamepdVC7esjDhyzPB7hm6FSMMOpLRQj +02wvXp2Zp62fn7lU2MwpEBbH6B84npzGNGip5RkaPck7M6+ana+uoajNesxJGxAovzImxJ+o +00DJrzkbIUbyTu2unp2psKyttLppKhgaOj4oMbqrsL1vz8o1JiYwWbu1va2hoqy8ua2tXSAY +IEFALiw/vauqv1pOVUc1MDzNtba0sbCxsa6vttc5JyUzPzQpKjVqtrbCyf5Z4s/O0u9r6t7u +6MvCwr60rrfIytlINy0oJiguP1FIVcq7trW6wMvdfNXIxsm/sa2wus9TPjgvKiYlLUdVTmPh +0sW/v835aOjRz9DHua6ppqq+VktPQTIqJiYrNU1uWV9r28jJzt3qbV3ty7u1rqqssLe/b1F4 +VDwuKSouNjs9P0hRZNPIz9vaz8vHvrS3x8C0sLS5wtv0YU8/LyooLDE0Nj1NTlTcv7m8vbm8 +0eHMx8q9sa2vu8PL129URzIpJCYsLy8zQvTNvrSxu8rL0u75ybi6wL2zrrK8xs/Y/U00JyIh +Ji45P13NysrCvb/Ix7/A0drIyczGurKvs7rDaElHPzApKSkrMDtCTGTgzL22tbW5w9jq5tfR +08i9u7q3u8fiW19lSDUtKScnLjpFWN/Lwbu5uLa4v87mY1/95OPZxrextLzG3/7jVDcsKScp +Lzk/T+/Qxbu3t7q/ze5eXXnj9OfMwbq0tbq/zODhfEMxLSsqLTY+QE7jzMO+u7q8y/tdVE1W +aGzfx7u0r6+2vMji6+JLMy0rKSw2P0dn2dXMvby/wMruUlNeX2Jv4MW6tbK0uL3L3NvfTzcu +KygrND4/TeLT08K4t77L5FxfcF9SWc3Cva+qq7/2z3E8PEQ+MywnKz3dura/4VrnyMHPTj06 +RWzU1OzJr6ehn6OxWycYFh4sOUVPXr6knJ6tTysnLz5FQztDy6+suNpOdraopqipr9I1Gw8U +Ij3fvLS0qZ2dq0wnHyM1U1RSe8Kuq7dUPlDEraWjpam6PRsODx5Gv7Ctrqqem6o8HxsgN9PM +YX6/r62+Py46yquioJ+ksGYgDgsWO7mtqquso5ugTx0ZHzbGuutFfretukEtNcyqoqCfn6rD +LxIJDCmtp6moqaqgnbkfFRsvzrjHRUDGqqx5Ly5OsaKen6CjsVQeDAgR55+hqaioqqOlRRgS +H+u0vl9Iabamr0ApMcuso5+enqKsYBkIBhW7naCop6mqpa8sExAlu63FVVzNrqWyNyU0uqah +npydoq5MFwYEFa2Zn6mko6qtuioRDyeqpts2Tr2uqrU8JC63oZ+fnZuiujoWBwQTqpSdq6Sf +qbrRKxMPJqSezC5BvbOxuksoLbygn6WhnJ2tPBoKBQ3Uk5arr6Kkt1IuGhAbtpmmNy3SrrbX +WDwzTqyeoaafnKY/HA4IDCuak6W/qp2pTCkeGBg5n53ILEWsqc8+Q0dIyKWeoqagocMjEAoL +HKmWnrq1oJ+8LR8aGiiynao+McGotj8zQlfUq52do6elsTEVCwsW35ycq7GknqpKIhkWHt6f +oX0vbKmqXjA878OvoJ2gqamtWBsLCBFHnp2tsKGbo34mGRQaP6KexjBTp6XqLTJlw6+fm5+q +rKvHHgsHDz6fnayuoZuhyCsZEhYypZ68NVyno88sLU/Er6KcnaSqrfMaCQcUxJ2ktqmbmaZl +JhcQF0Oio9s6vqGnSycuW8Oun5qbo6mtVBUGBhmtna24oJaZqPwmFA4XbqGsSFSnna45LDx8 +ya+fmpygpbEoCwMLOJ+m0rWakpq0NxwQDx+6qdo9s5ue1Ss02cvRsp6Zm56iyhQDBRqrpWJc +n4+Pn2AiFhEZOL9fOLqambcsM8G9TUytnJucm58uCAENYas5Ka6Oi5a5Lh8XFh8zNS7Jmpas +MTuwrFUzyKOgo5yXrxEDCSXBMR5PkomOplczJhoYHiMmVZ6Xp0t+qKlKMMGirMWkkpgkBwcb +TigVIp2KjJ27vccrGRYYHTOonKrVuKCoQC+6n7Yz2paNpBYIDiMvGxUvmIuSq7mlpy4UEx83 +TOnBr6ensltXtqe3OTysmJquKw8MGF/jHBe9jI3BJLuYuxQQP5+/Hyijlq4oLKycsTEztJ+k +sLlHGRAcTDsaHa+SnT06pJ1HGyawqzglXKKnUC/dqq30PWi2rrK1vEkgHC3aOx0ivJ6zNUym +pEMkN7CxPy7/rro+N+O5ykVIx7K0vr7DXzg5X+Q/M0u/vmpWxbteLixB4FtCUsnB313ev9lE +SdzCxMG5tsdSSHLXVz1F387m9Me3wT8tMk9pQTpRyMtZTte/zko+ar66wsrEwc94Ym1ZTU5l +fl19w7nNPjM+W1FAQWrQ23Tdxcb5SErpw8DGysnM3XNcUkxNUlxSTu6/utFJQEhMREBKavn4 +08G+zmBPVvXazcO/wszV5XRYSkdGTFJh4MzHzu1USklKSEdMWuPLxcveXlBacu3ezL++x9LV +1vJOQkNOV1Zd68vG2FVMUFZOR0tY7c7Kzd9dVGJ//nfbxr/H0dLO31JESV90WlN5zMvuUFZu +Yk1IU2/k2dHS5F1XeexvWGbYyczW2tPgVUZKX21dW37X1/JiaHplWFRf7t3V09Xle+3d8FpV +Z9/T0Nje2uBnUFBeb2ZaXnjtdltZX2xlXmPw4uPpfW/44t/pe2Vu5dPO1ePj3e9cU2Hn6FtU +bN7mXU9Zev5fXvvp8G9qd+fsc33k3+fi19HW6fro4WlWYfLwXlRn5eZkVVtoZVxm69/+YWN8 +8m5pc+vj4t/a2N7q7eXh7nBz6up1Y2h3eWpeX2Rma/vp7/9wbv9+Z2Fpc3/06+7y7Ovs5eTy +bnDv4upvZW93al5cYfTf6Pv06+v3d33+e/v5fH9+8+zz9fry73tqeOTa4G1ievRmV1dj/vNr +XnXk5HtnbnPv5+zyf/bj3+3+6tbZ9mBfeuftbWv7fmtcVWH54u93+O3zfW9v8v/37v71bm1+ +fm9sbltoeuje7vLt7+Xs9vL+6+bua2vk1tr6bHz8/ltPVGX7b3R07O1/Z196eHRqYmlrbnfw +7e3c2t/j7eLd6PJibOzh6OLven76Y1taXmZy+Pd3Yl5uc2Ry//ntfW3y6e/e3evraV/56uf0 +5eLv62peZvbr+PbvcXJ7efpmUklW0MTWY2Pn2e1sZ1tOR0/e0N778tjS2uHh/ndsWmB06+/1 +9e/v8PDp92jo09X4WlBd5P5MR1/Rze9XZN/sb2hfbGpsdPp2bPLs6+nm7fni2tnk6vtxb2Vk +YV9t9d7W2t/d5ndpdft+f+Xk7ntzbmBXUVJVVFRVVlRYWltdY33r2c/KxMjKw7/BytDg1NDr +6N3halJAPUU9MzQ/QUFKXN/IwMXIvrzH3drX9ldLVO3pY3nIvcHFurG1xMzPSDI0NConLC8u +OlfYwbSusK+vtMLP6UU5OTk3PE1wxbSvsKuoq7a8wUIoJy0gGh8sLjZnvKyko6iloK3dXk4u +JCYpKzJE5rWop6iinqOstr9uLhwaIh8WGSxEQtWqnZucoqajrkYrLCgeHiYuPc62qp+doKCe +pK+70zooHhgbHxkXJ/7ox6idmpufqquyPyMhIB8iJjDdrqupnpudpamrscFbNywnGxYdIxsd +P8PAraOem5ypt7TRLh8dISorLFyrpaupn52ksbq2vlpDRjclGR0wIBckzN92vaudnai7q6jQ +LCcrLS0oNMKssbWooKSytbKy1URN3H41JxweLCQaIFXZ3sesnpyotqyt1C4pND8yLkq6sb24 +qqSsvLy3vlY/SONuRjEeHzQsGyBF287Uv6efrfq+qbc8NE3PXjpIua69ybWpr9xkysloPThY +1mj4Mxww0SYbNO7gzzhVqajg7biutGpA5rnPXeq5sLvXyLjITD9s3G0/RcfB604vK1RAJytD +SFw+L2W0w1/JuK204Oi1s8vNwrq83Ejz201ATmN97l7f0cz451A8QkQ6MTY1NjU2SO3Kv7u4 +sLK6v7y/wcr36+NtSEpJ+PhWa9XPzu1y29nY6GxPVUY5MjU8PD5BaMm/08y6vs7OxMTG2Wro +7VNSWFb/6Vluz9Luy8jb0NbpcFReTjw8UktNWFL51Ob+3ex95eNb6ODr39luY9njamtp+Njn +8dnPz+Tez191dUxVUlBMYGjw8d3c2c/fWnHeXnN2+WpxZlpbak5S6ubsd+XT0uPW2PLw9lBT +VmlUTWHW2t7M2szDd1zP205R+3JYUlVaXFNNXupiWerW2dLP1czI3G30X0xYXlNmW2Tl32bb +1NvX++vxYufqalpeXfxPSWZ7VVtq7cnM29zCzf9l7l9OUFVgc2Rp7e3xaPnf4ebp6ezf1Ofx +3XJeWlpMVGxfY3fyb+fT1u7f1G1dclxa+/hb/Nfxct1veOjde9rT3N3ffmBmWV9dV1tdZ1pv +7Gxk/tPm/+Pj8OrcamzU22By9G5v6nNhb+RsYunW9O/p9F9dflxdbmVxbG1q9u5r7dHPc2rX +3XfiatfqcHLz+WZXXm5x62tjYNnwX2v94PRUaPxubFzp7Xty+efs5+Xr53zl9X3W8drcdfXe +al9o63NmempvbF9k+etZX25+aGx+cvp7eWjz9X1eb+7x53nZz+h41tnb5e1fdt37ZO3weOx8 +Z1x6YF1ga1xm7mTd+uxv7ltd5uheXOzi2Httc9Xu5lnk0Ol+6dzY3WBn/XprUktn2FdSYt3k +9+Pi7NZyUOnVXE3ubuzY4mnh5d53at7p5G3o8u5oZfFqVfFjWmRS2GjecuDP7HxKz93mU+rl +7mVNeXvtWlrm0Vx8dMzZbm/a0nxgbd3pV15t72pV3eD3Xfbx33Ve5O3ucV9reHBjWVnX0WRX +5MzbbnHa0dNtX+nka2RbXWn+W1NcaPpST17gXV5v/n7p2eLd3s3LzsvIzNbT7c/J39zN0Eo8 +OTs7NzEyP0xYYt7LvLzCx8a9vcr+49XW7+3ezsbCxMe9v9hEMzI5MSopLTpKXu/GuK+vusfK +ztP/T1Nm79bt0r+9t7m8vbe8ejstLS8sJyUrPHDnz72wqquvvMruWE0+PENKWerdxriysrK1 +tLjLUzUrLC4pJiguP/nTxLeuqau1wct2U0Q7PEBJWmvVvbWzr7GztLrHUzgsKysqKCgrOm7P +wLyzrKy0vctcTkU+Pj9FW9vOvbaxrq+ztLjE7j8uKiwqKSkqMEjuz8G7sayutsHcY19NPz4/ +S3zazLy1sa6ytrm/y2s/LystLCspKy9BbN/JvbKusLnBzu90VkhCQ07nzMbBuLKxtry/wMv4 +QjIvMTIuLS0zQVVe5Mq8s7W+w8fN0mpLSE5f6dzWxb65ucDBw8TL505AOjo6NC8uMDdDRlHs +y765u768vcPO52/7dG1+e9jGwsbOys3GzdPreE8+Ojk5NTMzNz5GW//dy7++u7u9wMnPzNz+ +eWFr+Ojr1OjV2u/Y1srf3VFGRUhAOTg3PEJNVWf1zsG+vr/AwsfT0upwb11UXl30ZN/44c/W +yM3K3uxcTU5IQD08PUBGSVPrzb+7vcDLytLyWEtPTk9GT13j0s3KzcTHxcvKyc3WcVRNTEM9 +Ojs+Rk5bbt/MxsbO3fF2X01KTlJgZ2nczMfCwsjCxMPJysrO3XBXTEpDPTg6PUZNVmj31M3O +3fVhaGRWUFRZb+rf183GxMbJxMXDxsjKy9p1T01NRj88PUBITU5SX+vZ3XpmX2pdWVVaaunj +4dXLwb69vr7AwMTGy9psVE5JPzo5Oj1ARUhOXevd5vZ1ZWdiX1hf/eLWz8nCvbu6u7y7vb3B +yu5MQ0FAODExNjxCREdOb9bP1ON7bmhrY1tb+dTNyse9ube4uLu7vb7E4kw7ODg1Li0wOEBM +UVzpysPFzNn4eWZZT09d38/Kxr+6trW2uLu5vMHXTjgzNjMuLC41QU1ZaN/Hvr/I2mlbV1ZR +SlXyy8TBvre1s7K4ubm6v9FNMy4uLywqKzFDY9/Yz7+4ucDdUU1MSkVGT9/Evr28s66ysLO6 +usDCfT4sKi0uLCksNU7Xzc7HubO3xG1HR0VHPz9P2MC9vLmvrKywubu6vcxzMyYkLC8rJys+ +3cXFyb+yr7jbRD1GRT05P3XBvL69tKmorbS0s7jK2lIuISAoLCkmLUnIvb6+t6+xwk44OkNE +P0Fqwbu+wrmtqKqxt7e4wONtZTEfHSQrKycsUr23u726sbXMPTJAVlJES8y2tr7Etquqr7y6 +tLnPYGLVaSYbHysxKSMyxbO8z8eyrr4/Mkvd3kVA0La3wsu5rKuywcG5u9FqcM/GzjAcIy4w +KB8txLjeW9+vr89DTce76z9My7e/xsC1rrK/y8C7xfR12tLjbNk7HyUsLi0mL9vC0NLSvL/N +eHjQyudgfc+6v7+/ubS6v8HGz9p06Pbo7lz94TckJy46Miw407/Lc1HMvsdaTNe7xO1oxLO0 +vsq/ur7kbvLU111b82VkU0xf8UQxNjtGPTc+T11MQEPWyuD+0L25wsvFuLW+y9nIxNxXY+bi +a1Nx3tvqYF/k2/5NSEdAOjY0NDxGSU1d4s3O0crCv8PEv72+yuHU0ehrVmr929Lc5s/M3u7/ +/3taS0I/S0o+PEhZYFJKUmZkVGDt0s7LzczKydDq3dbQ2dTNzNTg283jYXvl62RNTl9vXFRS +XF9QR0hOT11o9Obt9tz1Z29rduT+atzT1NHU1tXW3OHl3N/3WGP7ZlhZ9Ovu+Ozc7V9eW19e +Z19dbF1UVlpZWW/Y2eDh29rZ19rZ2eZtb2JWZ2Vabul4cvzo5+Plenzv3+z07nF2aFhYXVlb +YV1i/9zj4t/b5vbwb1da+HJ0697i4uju7P1vfevd5vDs3u1qX11ZWV1mYGBpbvf07eju+N/u +Zv7zZ2Lf32lp3uT67/J9+ub/bXPr7e3t6XViYl1bX21gb+3j7f7z6u7xeWt1a2lv+fTq393o +6OZpXml3aXB+bXzi3/x97OZyaHzx++z3e/nzY2RpZGRtb2xzcP30ce3n937v6Ots89jtZfn7 +/OPf9/js529ifm1ka2pm/HJdb3L9bWJsd+fm7+vg7Wj63Ol39+d+b+3rfvf7TlzSXVDaz/R+ +eXvxflln9+NsXHvib2/f5fJz+3nsbmJobuz6ae/db3bd5u/rbXjmbGZ1dPD8dP3ud29qbnts +Z3dveff/3+dvZ+nv9fD36d/r7+ba2XBj5t1fW2JuWk5PYv1dV17u6Wpg8el/aXTl5+976dne +49PKxs7dz8rN1OPUydJkT1xrPi0vOTYxNkXr1+TOv8HL0szDzOTWycjJyL65vcO+u7u9v7q9 +KhozOBwcLmq4RD+moc1GYL3MKy7Dv1BNx6uwWcipsMnJta65yrixOxgfPB8YKGu3y0iqnbJP +9OJCLS1H91Hmu7a7ycCws8O8r7K9xLWuyiUYKDkaGj+5vO/ToJ7ORsLJNR4ozEwtda2uvd6u +pr3Kra21x8msrk8lGiYzGhpduNDqyaSi4Ei81i8nKTxNOlOvrLa8tKy1xLKtt7m9ta/EMBwd +MSQYLL3CXWmtnrc817s+KCkyUz46u6axvbCqrs2/q7LSv7OzvT8fHS0lGCbTxWLrsKCvS+XB +PyouMztFR8OqsrusrrrFvq2y07+utsJyJxwlKBwiScbM17qkqOZnzlIvLTI/P0TOtLa6s7K5 +xr6vr7+3rbi+yiscHycfHi/Hve/Dp6TFTOviNSsxSV1Lf7iyuru1tr2/tK65v7Cvu78+Hhwj +Ix0mfLjM1q+ntlJP7EAuNktRS+C+t7m7tbfHxrewtbuyr7q85SYbHicfHjy0uuW5p6riPnP4 +NC9AX1BWz727vru7xse7s7K4ta6yubw5HRojKR4nw67O1K2mtkJEz00vN1VZSFXMt7zLu7zM +x7evs7qyrbe81yQYHywfH1Kvu/+/pqleOt3ZNjBFXExW7r2ywMS6xcy9trG0uLCyuMYtGhso +KB4wtbDh2a2mwDlPzUMvOlBYXmrDsbvGu7/Hvbiusbuzr7a+Rx0XISsfItKsvFW+pa1FOtLZ +NS5Cb1tdzrOxyMm9w8u9rq65t6+1udoiFh0tJB9IrK785amm/TFlwkQuMVO/VkW3rMD1yL26 +zrmosb62r7PHKhUaLSYePayr0EuxosUvSMRfMS9AwctDy6yy/f/Dt7zBrKu2ubOuvy8WFiks +Hiyvpr5Hw6OxMTjM3TcqMLq6QMerr89R3rK5x6qqtbi2r7kxFhQoKxwrsaS9Q8qjrjE5zdM4 +KTS5ukrLrLDOUdOyvL+rq7O3uLO1NxQULCwcKrCkujjhoa8vNM/TNSU7rL9Eu6qy4UrGr83D +p6u0ubSuvC4UFS0pGy2rpsQ9y6C3LjzJ5y0kTKnLP7WouFNJua7pv6aptbyuq8YjExsuHxtI +p6v4Sa+i9y5fyD8oKeWsWVCrrNRY2rW4XbOkrriyq61tHRUhLhwezqayUW+pqzs3z9EzIy24 +tj++p6/fVcex1neqp7C7saizORoYKSgZJLSrwU3BpbozTb9UKyc9udNOr6i8/NW7uN6/qay3 +t66tvjQbGikjGSm7r8pWtaS/OuzERiooRrRbWaqpwvDHs7xTuamyvLmtr9QvHR0qHxovw7/b +7q6n1EfFzDssLWPCSNaqrcnYubDD26+rtry4rrnxMx4eKR8aL9jK7OKtqdJevtI+Li983T7J +rrjIw7Oxx8Csrru9tbC+ZD0kHykiHSxW7Fdes6vI17zMSzU29Vg22rXC3sexsci6qq68vLG0 +zeluLB8pKB4lPFxLP8Wuwt+7u9ZMQ+t0OErK3W/Qt7G8uKuruLyzuM737j8pJSwpIyw/RDlC +x7rOyrq5xd3TyVw7TGFOV823tr2xq7O8urzPYFnwSi8sNTQsLz09MzZUzebou7G1u7u90kVA +U05IdczJxr23uL7AvsTO0dPoTz9DQzYxMzEtLTZKXeDGuLK2vL/OTUJKTUxO98nGwrm4ur6+ +vL7Ky8jWe1RDOi8sLSwrMD9k6s+6try+wNFoTU1RSklt083Fvru7v725vMDBxMbL5k47MS0t +LC0xOkZkz8fFwMHI093lXE5OU13s2tXMyMS+vb2+v7+9vL7Kf089NC8uMzY2O05lbO3Y0dnW +ycn1UlNXWFdo393fz8jFwL67uLi5u77E1ltFPjw2Mjg4NzpBTlRa89XT19TW4nRWV11UXvDc +zcbCvbu8u7i8vL/ExMjTcEM7Ny8tLi8xOEFb7t/LwsXEyNbjT0hRR0pYatDEvba4ubW6u7zB +vsLL1l5NPTMzLiwxMjQ8RV/Z0cW/yMjL3eRVUVlJUnx+2cjCvLy6sbe5tb2/ws3SU0E6MC4s +KS0wLzlJa87GurS6vLzS3lVFVkNAWVh5zcG3s7Susbq4vsTCzeFPPzUsKyolKC8vOE7Ru7ey +rrC4vtLqSTRBRThNedvExLavubavubq7xMDE51hMMyopJyUlLDY9VMGxr6+usLfNVU9GLzRO +QEfdxbm+uq2vurW1u73LxLvUSE06JiYkIyQmME1vxK2pq660t8o/NT05LTxsX8vCt622ua+1 +vb/FvLvLw7TPPDwpIyMeHyguP9C4q6aoq7LB7T4uLjIyOGzIvba0r7G6vr7FzMvCuri5tr1Z +Ri8eHh8gISg+vrCtpqKmsOxGPzIqKDFN0MzAr6yyv8/JxNRv076zsbKvrrxMMiIbHB0fJjfO +rqakpKesxTsxLSwtMD/eu66vt7m7z1ZBRN/GxLyuqKipr79KLiEYFxohLELEq56eoau8bzUt +JycuQN66tbaus81hQzxJUPTBs62oqKipr75KKSAbFhshLli7rKOfpKzAQTIrLC80TNe4rq++ +z3dFRTw6U9O6rquqqayvssJkPiomIBseJTPiua+qqa2wxEs2LC02Q/jNx766vcnrRD5GTtjC +urCtrKyvub7HdU86LSUdHiMvUs+7s66rrrj1PC8sMjxcy8S+vLq9y+9NSkxe08m7sq+tr7a8 +xtLrUDwyJR4fIi9Jzrm1s7GyuN1ALSsvOubFu7e6vcDF2mdNQkxvxbKura61uL3M2edLPC4j +Hh4iLUvJtq6vr7G82EMvLC4737qxsrfB0OhOSEJBTuG+r6qqrLO/0Op16FE7LCAcHSU17byz +sLGxs7vURjItMkLVubO0vtRuTk1MSlVwy7eurK2yu83lfdrQekQrHhscJDXhtq2tr6+yu89H +MiwtOX3BtLO8ye9VWF792s7BubSwsbi9xM3S2l9KMCAbGh0pSrqrqKussLvKVDkuKi0967mv +sLjE2/5kZP7cyr+4tbO1ub7Fztb7SDUkHBocJDnJraanq6+8z1c6Mi0uOV2+r62xutBlWFJd +9tnHu7Swsrm+yM/Q1mo9Kh4bGx8ubLSpqKywusnsSzszLjRJz7eusLjFe1tVUWH40L61sK+2 +v83e6NvaaD4rIB0dIjBuuKyrrrW9yNdbRTo2O0zcvre2usbfZlhaaOLLvbe0uMDP7HR739HN ++zYlHRseKUq6rKqtsrvAyM/ySz03OEfiwLq8xtl7bvbfzsjBvLu8wczmfnLt0svNVzAkHh0i +Lm61rq6zvsnJyszmTUI9RfrNv73DzN7649XMx8rIxcnLz9vs9X3q3u5dRDktKCgpM0nZvbq8 +wcbHxs7e7F9eafze3NXU2dHNysjN1drg5ODc1tDU3nJcU0tEPzw6PT9ETFNeZvzh3dLKyc7Z +/WZkcurc1NHT2tfUz8vT3XtgZffYy8bJ1m1ORUJCREhMTldw/3F3enFlYml85ujxbFtefdvO +zM7V293Wz87Zb1VNUXjSyMbN7lNJR0ZLVFpgbn3i2d/g9W90ee/u/3h4aWv559/c2+Dr8PDw +9WxnZV1cZP3f29/lfWhZUlVVYH3g29nb4Op4ev768f12a23z7Ovp5eDe3N3j7m9hYWBhZmlv +cW1ufP1rZV9XU1hfb/Tn3Nja4u97a3bs39zf4OPt/u3f39zd4fVdVVFSV1hbZHvw5d/vaWdv +//Z+fHl88+fi39/h7GxgZXD+8e/1b3L27d/d2drneWddWlVPVl1u7d7c6XpnX2Bn/ertb3Lu +6uXi5vL27eno73pwen51f+Xb4+fi5+7r6f1nWE5OUFdq7N/g7HJfWFtleO7y9O7v6+nm5/rv +4t3d2+Dv/P39+vLl3t/sfXdua2VdV1RSVlxod+rk8HdtdvP48ejl5uno9nx7+v5ubXnr6+vt +7vd99uri4+Dn8XFobGllZGZsbnJ++3Ftd/13/Ofn7v52amhpZmt2fvf37+nk3d/o7u/z7urt +739vbWhoYF9rcHFueXZ3fn9+eXN68erk3t/q6ur0+n17d3ZyZ2hyd3Z0d/7w6uv+/npram5t +bvLxeH3x/v3q5PL7+G9ybWpreP11c21uaGh4fHv2++/w7N3b3d/b3uzx6+51dW9tYV9lYG1s +aW/9e3t1amdlbHBkZXn2dW386+jn5uPpfu/s8Ovk5Ozt+HpwaGVmbP15fvX6efr9cmx37vP1 +6vVqbntudWpocXD3/O/ve2ttcnp6efLzfe/u+P159+x4bH9+fW9rb3xtaGlzd/fl5u7t6Ofj +5n78+np1dXFnau/+ePzz83t3f/xsX2V1b21scnR79e7u7vttbXlqdHV18+7r+m/25enx8On0 +8OTudm5tbmp0eX3yenP36ur+//726/j1e29veXtmaXFybWtvb21+fW9sdfv2d+3t+e3s5ev0 +fHb0fXFwcfn8cO/v7evs8fn0fHh1evl7aG98bGtqbnn6/P7q7fnu6W9oanRsbHhubfn+bX5+ +/O/r5X799e/t7vDx8/d47vxtfXZt//H1+npwdHdyenZ8bv1rYmx/7+3u9vDv7+339/nw7O71 +e2/+8XFvcHBtZWz1bWlrc2948+7s+uzp6/Lu8O/s8vPz7nV8fHFvbft8dG1ydu7y/ejueXJ3 +cWVqbWBif/7n6uzn+P7o6ursbPl4b3tufW9zb/71b2px+fv67+/+bv76e3J+7fr/5e5+9/Lt +e/f79/x2++77aW9tbW5sb2hebXd1d359/vPz7uDm3+v+9u3z7uz09210+f387vxtb2t2enBy +bmpuanB2Zmr4ffzz7/B/eH33+OHk7/L9+vTp+3Z3dnhvb3zxdP/79nb35/H+9eb8bfP6ZmBp +Z19x+Xz8fvHm4uTw+Pn2/nF6+29r7/d08/N0cnZvcW9vcmxkevz28Xv+8/H+8fbw6+339Pru +4u/s5O3y+Hlxb2tibHFyf3VvbXZ0b3F6fvvt/3h88fr46vd77vl+6/h88nf6eP7n8Xzyf/7z +fnRpanZqcHZ5dvb5f+3n/Hb58m/76vb+dHXv+np5bXjz5eXq7/T1eXZucPV9f3n4/f3+/Gxi +bG9oe/P7+Or+8eLx9err83d8+XdmaX12cXb3d3p6cW92+e7wbvb07Oju6/fy/Xvv7vx27npm +b/VvZnR5bmtvfvZxbnf08Oz27Px37fnr7fnvevlvZ21rYGvw8/7n5vXw7vHr7e75d2dkb292 +bfR+ZnZz8O/tdmt/cnl5/nz/4ubp5+Xj7fRua3prd/1wbnj6+vl+/Wz7/XF2+3Fr9fxsaXdv +a3rw/vn36e93fHb4fPz16evw6+z1cG56c3b78vp8e/70c2129nJlb3NveHfv7Hn85+nq6en7 +eHZ+9nxwcmlgbXJsdnD7eX3s7e7y8vr4+3p6/W16+vbt5u/s7fl4eX19ff9tbfv2/HB+fPx0 +c3lybGlucPH57/Dv/fjt8Pt58+n5fvf99/N0bm1zcHJ9/vT9en729O/o8/f76/N2b3lnb/v2 +92xkZXb+dHX28/r48Hx+9vJ+efzw+HH39Pf2+u/ufPjpemz2fXtxamlx/vj+a2pndv54bfjr +9vzz9fbr+33q9/bm6fv+9e7u6+77dWhrbGpuaXR6aGNrdm1zfv10dfvt6+/p6e/s5ubsfPzv +/fH++PHw82p6enRqa2ppfvz0dHj47e3ky8hYTmtmSlRu5tzhaezQ8VFRXVXl/1Ba2tbv3sTH +38nUeHH7SU1bVGne7WPl1ujp4nZuZWhpYl1qaWpmanvf51lT7+rs99HO82h97W5MVNbO1m/U +xtVJVm5dU1tUadTacvvZ3W9ya3pcZmth4O9h89t0dN7o7txg8OdZS1zt9mB46ttpbeLzbGvt +19h+29HYY2J852FXVGbtYmbh6337bm1kW3N7YGfi9Hp97eXm6ubjanba5Gtw7edja+HfZ2p7 ++H1zZWp2a2/s3HJleWZgaGd6/Gx46vT24uv2d/l7ZGt+b+/g4+7m5/3u5Xxob+zjdGz95H5f +de5qYWFoXWF24+L/bPn9aGRu5Xn+59zi9efte19de3JeZ+Lrd3fp5Pth7t3ubHbj73h09/5s +Y2/d1vNt7uhyalxed296bO5sYXrwbm/1ceje5u3s+Ojq6nlnbH9hX2tw9Of9Zv7u7n1q8vL+ +/+fr9WtueHFoaW9ndGvr+3T17er27N7k//jv8e77dvj2+v5ianJlX2Rv8Xdt9+r4Zmn9/mb9 +7uNwduji+mJ7+Xpeaufrbmjp8u3s7ePkeWxy8Ol0euryfGRf+/NcaOjwaWb0fG1lc+z9a/fu +8XX/8u18bvPv7n3j3eVnYG79Zl76+mhf9OTu+PHm919k+/J0bnfv6vh66uvz9/HsdGn4fml+ ++PDrb2J76nlbWWx2Yl9z/HH78Obn+Xrh4WRb79x8Y/be6HF83+pnb/f5cmrv6Ph7e+xybV9q +aGhucn75/350cer09/xrdvPy+X117eRtcnpkYmdv7e5+/vb06+/9+uj4aXL0cnv47+fm5uXv +bWx/7v1saWxvZWR16vthbvjtd3f9dm1sbebrZXn9/X1sZvH4a2r53e396uP3++/zbHvj8/p/ +cPLd7WZ69e58Z2hpbV9fbfj7bXXo9mPv3vF2ffNyannve2997Ov0++ft7vF26fh0e3Lv62li +a2V8/nH8dGt08/x2b/zlevXr7PTs7Pzr+nP25up3b3Ztce72cG9xdvfw9vp6aGt1b2tt/nny +7e3vdf75fHJv9/T+bnJ+bXNs/unw7OXr93t66ep27ePwe/Ll/m598+3wem1zbmdeZ3pya295 +amx36/R3bWzu5vX98eXp7+Xl5ntv+3VocfrveGtvcXf4dm/u73V3fH349PP5en7k4vZ2/fP7 +cm10dXV4dG99+Ht7b3X29/jwfv7v+Pnr5/z27e3zdnp9/W1kcfb5bWhsfe3xfHFpaf7q+Pfr +4uN1cunvffX56+Tz8+bsfmtoeH5sbG93bWFp+HZsdmh47+7vcHP8fG917+Tl7Oro6eLl5e15 +e3x9bWhw9f1ra3H/dmVjb3B3fXXr4fp5fnj67unh4+r29/hvb/f0fWls/XttcP/8dmtraG12 ++ubj7/787+v9b+/s9m/8/Gr99+/jf+7o9353/P9xbn5waG9vbHv8ePvu/Pnv8/Lt8/jo4OPv +8Pp/9nFqbG5vbXV0c3zxemtxcmhobH7v8/54fX7u6+ns+e7n6/Tr5u70+3v2fXb57e32/HJp +YGJubGtzfvX+evf05uvufHb17O39e3VzaGppcu9+6uP3fvn0+Wts/fr79fn+8uzu+Pfs8ndu +aGhrcW9v9/D7e35+fO/l6PBv++v7efz1+/Lq7fh7eXh9/3J1cW5vb/ns7urzd/HvfGlncf/9 +cWtt+3Nzcnb6+/Ds8vLu+Pv4fPDm7/zu6fX/8+ro+3h2cG1pb3dwZnn1eHx7e3d2bWxzeHB0 +fPN4cury6+nx9fPzc3p5d/pwdPDn5evr7vh8/vl6dX75bG10e/V6dHf99Pb6eXR7dnhxanj9 +fnj76ens6+f2fnX6+XF0dXhtamptem50/fn9ffp0bvrt5+jw6N/t8vX38fx0aWxvd/x1dHv/ +enZubXz+dnB3+PXy6fL17+3t8fHu7ftvZmBfam9paWt57u36e3359/d3bm939vDv9PTw+v7y +5+bxe3j1+vnt+ndy+vtvaWhta2pxcG1oZm5ub3v/dXjz5ujs8enh6/Lz7fv//vx0cPrufHP+ +dnF1cWt99vv/cXZ7ff15bnbt8nt2+PR0dO3t9O3vfm9393ttb/338fB9bXr99+3vbmZxfnVm +anN9+Pb6fXr28Pj+/vV8cf/s7O/s8v728/Pw8fT//3Rsev10aWZlam58/29udvz6dGp07O/1 +7Ovr5t3j+f51cG1ranl8bG9+9/Px9vf3+v52cW9vcf19fffv9fbs8npzfXFxeXZyfPTv8/1+ +8ez2/X9+bmlub3Jsbv/19Hh/7vF8/Hdy9vZ5d3R78vZ+fPf7/Xt6/fv39vt9c37r8fvq4ep9 +b2tvb2x1a2JocnBv+u/w9Pby9HtpZmp0/fv4dXN67ePm6Ovm6vhvcXB19vB6cn17b3NxbG9t +ZWd77+/u929u9Ozx+Pjs6On/cnpvenhtc3z9c2hnZ2hpa3F0ff/57e338u3r5+rq4eHt6+3z +8vj48HpucWxkZmhhYmhpa3JuaXzx7uru7u/89/d/9+/y/nx3+3ht//Lt6+fp+HT3fmZnaWx3 +/3x4dPz6e3Fz/evw/nz76+/8/PXy+P5/e252/G9mb3/9dn12bHJ57Obl7fZ8bG568+fm5un+ +a2ZsbW/77XpeW1xdY333eX58/uzm6ent7fTx3uHs7eTf2t3m7nRoamFdaHP5d11WUlBWX3/g +2trg821pbXv9/uvo8nJmbHv77d3p+PTq4+v4e3bz6uDY7Gb382nq4378aWhyXkxHS1jl2Nvi +eHFtbG9rbeff721fVl3jz87T3d7f5uHk7Orb0dHrWU1SamdXTURCTGXi2tjU1NvzW1FXbN3X +3epsYFha8+HUzNXZ33zo1s3L097kfGVeVEpHRUBDTWzTyMvV5mJbYG78+/Ps9v9sVFjy4ODl +fnzh1Mi/vb3F2mlPTE5LSEI/PkBLYuLRyMvQ3XFqb3vf19z4ZmBkXWjt39Tb6dzWyL2+xdJx +ZWRPTEg7NjM2SuLFvcXS9lVTY33bz87P4V9RT1N0zsrM12Vp2sK6vcXO6PlpTEQ/NjEvNlDQ +vbrC1GtMSlJn1MrM0O1YU1tWds3Ky+xTbNC9tLa+0GljaExEPzYxLjNM0b68w89oR0VPYdfO +xsbsc1JKX9nBv811W2vNuLK0u9ViZVFEPTkyLCozUsS3ub/OZkxKS13by8bH6ldOR1fdycPP +bFhk2byyr7G+2npYRD06MisoLkfGtra8zGVMSUxi3MvAw21IQz5R3s3H0HJiatu8tK+uus50 +Wk8/PTkrKC09yra2u8dfR0A+THHPwL7UUD44S9nBustaTlHuv7SsqrC+6E5EPTw3LScrON63 +t7vE7FBIRUlV7r+8zWE+OUbgv7nFeVJMaMe2rKquu9VVRDo1MysmKjfkt7O5w/5NSUdW9dG8 +vMhpPTY/5r63xmNHQVnHtKyqrbvaWD42MS8tKSs55rq1usLcU0pKW+HNwr/OYkU5P+rCuL9a +QkFWwK+qqK2821NCNzEvKSUrPM20tr3KbE9KRE79yrq6yWU/N0PcvrfFWUI/V7+vp6auvt5N +Oi4uLiknL0fHtbm/z2RTTUZS5Mi7vcxmPzlPzb64z1dKRXi7rqmqtMHaTzouKygmKDVqvra8 +y91rUlFOYM7Cu77mTj07asi9u9pVTErdt62oqrbKWEY2LS0oJCo37ba3vcL0a2xLT2PmwLvC +1Us9Ql/IvMPkUkdN57usp6u2y39INispJiMtSMu3uMHI3WdiTVbgzb28y/5KPkvjx73NXEpE +Uc+4q6est9FXRDErKyUkLknBs73EzXVtXlBh6su8v8l8RT9Szry93k0/P1vEsKmnrbzUej4v +KygmJjBOxrq/x8/hcVtWfNXIwcbPZEVBWcu9v99MP0L7va6oqrC+4F49LionIyYzYrq2vsXX +83dZT2bcxb3Bz2dFRu3Fu8JiQjs/57itqKu1wNZfOSspKCYrOfu7ub7G3nRnW2h9483Mz9pX +Q03fw7vHYkU8SNG3q6ittsbfazwvLSgmKjJYwr67wtvjZUxUV3vNysfPX0dL3b+7yGBAO0jT +tauorLTC51Y4LS0sKystQc+8t7vM315SZFxs6N3Lzl5DSuK/usdlPztG07asqauyw9fgQzMv +KykoKTZqxbW3vstgT1pRW97Sw8hwS0vfvbjGXT03Q9y3rKmssL3dVkE3MC4qJiYvU7+ysrfE +81hRSk1o28TE3k1P3MC5w2lAOD70u66qq664zPJOOzMtKSYlKTzdurG1vdJWT1JNcNrOws5f +XtnGvMVzSTo9Y7+vq6yutcfeX0U4LywmIiQwWr2wsbjJa05OTFXr1sjJ3l94z8S/0FE9PE7O +tq6srrC5x+RMPTErJiEhKULBrq2xvdthU1NUX3/WzM/eYuLLx8xgRT1E9byxrq2vsrzQe0My +LSgjIiQy4LiurrfG4FZiY1hgXvLSz9rd2M3I31JEQVfLurOvr6+zvMtYOy8qJB8gKkfEs6+y +ucPN1vhWS0dKVvHm/dzMxcfcXkxP7cW7uLSxsLW+0U86LykjISUvTsu8t7i5uru/y+VSRkVI +TlFVaNzLys7o+dvNw8HCvry8v8ncVkE8Ni4sLzlEUl5qcODIvru7vcXO3fBrU0tMU1pWTk1Y +99fPzcnDvbu9xc7a4/BiTEJCS0tEPzw7P0pZfOrc0c3Kyc/d7fHq8WtZU1vu2dfZ1MrGw8PG +ysvN1udaSkpKQj07OjtAS1JWZ+LOyMbHzNXe29nqYVNYaO/e3N3b0s3Nz9LOy8rO23VfXlZH +PTo5PEVNUVl83M3HxszkcvTzeHRdVWri083P0dDR0tPY2dLT0tr0aGhmWktBPz4+REpMU2Xc +zMvQ2unu3dzl/GVf8dfUz8/Pzs7P0dne2tvlcl5ZXWJVS0Q/QkdIR0tX7tHNzdrz8uXd4/lx +c3Ds2NXPzMvJx8vP1dve7HleUk9XVUlEQkFDRklMU23YzcvP2tzZ293sbF9jeOTY29bOy8nG +xMnO0dnuX1BNUExGQ0A/QERGTFdo4dTT09TW0dHS2ex2d/7v5N3b1tXPyMbIyszT4m1OSkxJ +RUVCP0NGR0xYbOHU19LS1NLP1t3e7P9uafvm3tjRzcbCyMvP2+VnT0tKQ0FDREdJSk1ZbOjW +1dHP1t7g5+rk82xsbHLz5t3e287GxMXHzNXqYVRNQT5AQkVKSUlSbunc2dLOz9bk/W/07fJ7 +e/nj2dXOzs3Jys3Oz+FnWE9JQ0NDQkZMTk9aanjk2NfRztTd4uHc3uj79O307N/U0M/S0dLZ +3e54Xk9KRkRDR0tNUl1oce3i3drV09PX2tzi8Hhv/+7o5N3U0dfb2N7n9HRlXFdOSUdJTU5O +WWh+6eXi2tjY193f4uDe5P555+js6+Hd3Nzg3t3o9m5dWFdSTUpJTVFWXGvv5eDd3t7d2tjd +5+bn3+Xu9PDy9+jm6ODZ2+f5bGReWFhVUk5PUVVYYXf+9uPd3t7j59/Z3d7b2t7m6vpyduzs +/fDm5ubuf21mZF5cWVZTUFFWWmBsbXXx4d7e4N/c2tnd6u7l5uz19ejm6eTt8enn8XRpY15b +XlxaVlZaWl9sbGl6fnjq39/l39rb4eTtevvw8ujh4+Lj7/v1fnBqY15dXFhcZWlna2xpa3rn +4ufp4+Ho7PD7+376/Pf0+PPy8erk7Ovr/25rb2pkZGRlaF9ebPr/dvvu9vru5+jt5ubveXZx +bHFyfv727fTz7Orn5Ov9e3ZsY2RrbGBjb21rc/r5+unp7u3y7evw+3d0cG9zc3J2eezp6efk +3+Xu7vJ9d/5xZGdqYV1iZmltbWt3+fXy7/n+9Ovp7/Py6Ojs5t/f5ejs9Pb5eW1dW11cWlpc +ZGNka3d9/uri5Ofl5+fj6Onq8P797vH77ufl3t/n8XBqdX58Zl9dWVlaWlpdX2RlaHfw5ODe +3t/j6+Xk6evm4ufs6ubo7vLu8XRqY2JoYF9dWFlcX11fa+/y6uPe29ze4+j5+PP+e+3k6+Pg +4d3d4/dqYmNfXFhVVlhZXmhx+nZtbf748Ojr8vLk4ubq5OXn5ubf3N3h5O3v6e12ZF1hXl9e +XWBoaGVmYV5lfHhy+e3v+/v88ens7Onk3uPf3d7Z2+X6eG9tZV1aW11dXF5gaHH39Prz7ezz ++nV+ff3s6eTj3drX09PY4uv9aVxYU1RaWlhZW1tedfH08uTl8f5+cHN59Orl4d/b3NvX1tje +6393aF5bWVlYWl9gXmB2fW5xfX797fF0eunf397e3NnY2Nrc4ux7amdjX1tYUVFXW15eZG55 +/e3r9O/n7u7o39jZ3Nzb2dfa3Onu73liWlJPUU9PVFxganf97u3w8X10+Ozo6ebi3NjX1dHQ +09PW4vLzbVpXVE1NTkxRWl1eZG54eH3v+Xh78uzr3NbV0s/O0dLP0Nbc7n5tWlRXTkhNT1NW +XGVmYWxta3n0/e7a4uri2tnU0M7R0tDT3Nzg++xjV1hYTExLS05QVmNcXGxo+e3o4tjn5d7c +2tnZ09XRysrOz9Pf23pYT09LSEtISklTUVRXbF1v6/B3393f2tnT0s3Ly83Fys3Ozd7f9FlN +SklBR0BFP01JUk5nZ2jv5OTez9TRz8rMy8jGycPDycvL3u1uZU1DSD0+PEA9QUpLVFP9Wvjs +29zOzMvLx8bHx8HGwcHBzsXO+NlYTD5FOT03Ojs9RkNMT3JX1erW0cPJxMjAyMLCwcS+wL/F +xNR490s/O0cwPTM9NEA/REdYc27P1srGv8DCw7+/wLy/vr3Dv8jMYOVJRDk8MTQyNDQ5RD5Y +T9dnxs2/w7y8v8G/wsXAv8G7vcLB2mxSQjo4Ni4zLzYwPT5HU+LN1L2/uL21ur2+v8nGwcHE +vcXKaG9OOjk1Nyo3LTcwSUBO9czAx7S6t7azvMG8ytnfxtXRx8zlRdw/OzU/LC41MDU38z/z +y7jcs6+4uK+3wry96/fN2mjK2Fc//0EvND0sKUIvODzLP867tMirqriwrbnMvspXXNteSO5n +PztZMi4yPikzOzs37NP+v664uamsta+uvsbG0kp46VhN10EyPzkqLjMtLDg6QUnF276wrrep +qq+vsrnBytBgT2pWV+1DM04xKC0vJSo1MzxmvNa4qa6ypKexqq26xcPjR1BsSUzaPC9QLiUo +MSIpLjc2b77ItKerrqOprqyut77FzVtP8FlcXzA6PSUkLiQgLCwxPs7Luamlq6OjrKustr3G +zdxo5uR35zgwSyggLCkdKisvNfPYvq6lqqWhq62vuMHL5c7s3MnJzEE0UiggKyocKy0uOebc +vK6mqaahqq+vvtXX62ni2MXIzTc8RCUgLyceLy8xQMjOuaukq6SjrLW1y+j/6PNyzbzE7TJO +NB4fMh4iNTY4a8C2sqqiqqmmsL+8zOxZ28/cyLLAPTRnIxsnLRopPDk/urWuraKkrKqsytHT +b1llzL7Iua3FLz1JGxkrIhkuRUFnsKmqqp6lsKyyXmrva1vMu7i4rK88K2gfFCArGiZH3FS1 +qKeuo6S3vLlYPlFgY86yrq2rqLYsKTsXEiMmHDPIt8Kpn6ezpKvQ4tk8N0nRzbmqpqeqrE0d +LB8PFiwhLd+oqa+knbO9rss/PkM6POy0sKijn6aswB8ZJREOIC8txamcpKifp17M3T41N0BV +ZbSop6KhpbHPRBcTHhIOK2FqsZ6YormosDE4VT82Psi1xKqepKekq8w8KRITHBMXUMGvqJ6b +qPbG0i8sRNZTWrGpt6uhpq+xuFg1LBQTJhkXfrG1q6WeqTtRwjIsUr/F+a+muK6jqrG7zl8/ +ORsPJSQVLa+6rq+hoVk1vdUvOL67X7uqsK6qqqq8cmBlSSoRGTUZGNq1tbCrnKo9PtJuLjC6 +uNa3q6epsaiq6kVn604mEB43FRrDsK6vqJurMDXNOyYwrqvJs5+muburrkY198ZDHw8iOxUd +r6elsamYryMmVEYjM5+ivq6kqcBer64/NH3DviwPG1EYF9Kjn7Sul6koIi9bMCqrnqyvr6yy +a76u2T0616q9GA0zLg8hrJ2esaWaxyQdIMtAJaSYqLPSs6lHU67JPzrEo7UdDic2FBq3mZe1 +t5quHxUguEQlppWhvFOvqjk2uL1ANr+cph0NIjYUGLyVlLW8nKsjFBrLvyyzlZy9SMquTTLW +wdJexJyZRwwNLR0QL5qOmcisoTMYEx+11U6fmqC3QMG0PTlg1ru7p5mbPAkKJRgVVZeKkc7X +ryoQDx+1rbqdlp7FNDtPNjRdvKahpZ2fzRMDDCIhXJyNiZ8pMycXFRrpm5yen6m+KRwt6s28 +rJ6aqczFvk4SAg/Dz8+llIykGRwvKiIksJScvt9tNyEhyKCjrKmmsT4rXrO+NxkRITssX6Oa +m7MyLywsPWK0q7VbMi442q2moqS6OyctWcuwn5meLgkHHDI7q5SLkzwcJCEfJmafo+ZKPFXO +b7CkukgxLD/BqJqZnaU/FAYFIqmelZGSnh4MEiBDt6SVlvIeGRs12LidmaVnJSy9qqWkqqy3 +OhsLDG2gp6atrbEjFiherKu/srIvGRYivp2Xl5usLhkcP6ufnp+eoas8EQYJKK2kpKOcoS8U +FybLtL2soK8tGhvmnJiYnrouGBYss5uRkpipSywXBQMTqpSZqKSe5RcOG+umpqefosEkGB/B +nJyhqtMtHiA/rJqUmKpBJi4sDwgTsZWcvcuosSoVGDulnKOrq7A7GhYmppSbsUQ0LCIm052S +lapZOTYyGQwPK56YpLi2vDMZFC+lmZqhqr4tGRUd3JuXna1EJyEkNrKcl526SljLRxoNDiui +qbu8q6OyJxwvu56hts9kLx4bI76alpyxPCQdHCfDm5OYo7XgPSARDg8kn5mbnKKvWRgPHEqf +mqGsr1olHBxDpJufuz4rIB0rupmSm6z6ODU0IxsZHq+bpK7DYUMlGi67n5ulv2szHhwhe52X +nro4IR0dJtWelJSfx0YyLi4sLCMhxKissVAzTTstXsmuprVQNSorOk+yn5+tQyEbHSnlp5mT +l6ZMJSIv7ra5SB4dPkhGSV2un7w5MS1N90VbvrisuGBPSE9LMzBgvLK1vrOstuBOarSoqr8u +Gw8TLm6voqSnrDkkJSY/vbKsqbW78zo5P1DR4FL63trN18exsbi4wr2+XDYmHRYcZLClo7C7 +vTInLDLEqq+vscfXPSw2U2rK02tuVlRo+82zr66uuM5WOzEyLx4f4LSqrXVkumo9OTHYr7nF +2lfdUDg+WF/Yztzd1fhVS2C8sLC2wc3P7VU+MSAfRMqyrsLFs+I7NS9fucfMdFLT9UBET2XL +0crKdEpGRdS7x8jIzcDCwK68NiEbJ9S9uLGvqrI8Kio06txf1r+8v1U4Q2XSyebyydBROTRO +zMnBtq6w0js73LC7LB8t07jYP+6urMk2KzZSSjxNuqeryj47bs9MNjzMs8BJO1e8t95LTGfg +ZFDqv7Wvt8HNRCIfKzrFtLqytPZAODRTz8m9u7vITjk5PE3u58/Au79nOz1MWWVbzLGxvdpI +Pz41O/m4q67HXEMrJzRIxLS6tLDHTzoyQEpCXM69t8haT0pXUkBI3by0vOtZX1JIRlLVxNF8 +Wk9hcFz0zca/zWZeUkZIS1F+dmB65tTO5WFVSkxl383HycfI2G1OTFpeUE5m0cTHz+xrTTw+ +Sm7QzM3Fx9llS0JDTGnQxcHG2WRPSUhV79bQy8rO511PSUpKSFfez9Pf+PjqZlxd9s7PfVxd +89fb187O22FJQklbdNzIvsHVTj4+RFJj39DKx9LxXk9QWVtq6djMzuJoWVRYY2nez83M3Wh0 ++G1ZVG7c4mRST1lkX2fh0MzUb1pVVllXcNzb29PS0dtdVFldeevv2c/Y3npcXFJScez35ePp +3ex9cGBdW2Dq2uH+am71dlpRXeLT3vd9+vZrWVly5N3Z19jqWE5TYe3X0dPW3OdrV1hjcuTa +4d/ldV1PTVRh8OXh3N7ofWBYXF9w4dba3/F0dG1pX1xp9uHc3uDi4/NoaGhucvPf4/BoYmBm +bX3+9+Xd3vBtY2Fka3j46/xnYGVu/uvv8Ofe3uvz6+71937+9/z+6ebxf2tdYXL3/Hh+/nFs +aWV2dmhv/nX87fp+/v7u7evj4NfX5/p2aW1xaXHs5uZ9aXBtYmVpZW/+/vF2cO7q8/j27+js +9nprfXlvamv85t7sdm11fG518/Ht4u5sa29wbWZk+t/c4/p/+fz+b2Fea3f+fX7p53lv+vj9 +/v39//Xv9+73/uvn6ujzamp1fHpwa2praGVkann17e95ePt2dXZ67+7p4N/o8nx2dnx+cGlr +//b0cWt8/H5ybHjr7Pp89/Z7+/d5fPl7+uje3eDrb2JcV1dcZnzq6fl89vj8/XNy+e7y+PHv +7urg4+7z9P59enH+9fxxbW1vef14b3RuZ21ud/n7ff17/f317vDp5eDrc21qbnFvZWp8ePnp +6Onr7npu/vb1fW9sfvH27e/5/Ozt/n14a2ludXt6dXd+eXR4enV4/u3t+Xr97vDv73739/Xv +f3V9/X54bnD97/Du6u75enNxbG58dW1x+v/9enNyfvXz8vLz7Or2dXBzb2p0/H7+/3j9eGz5 +6Ojt6+5vb/vz9O7t9fN9dHZ0cW91fnBu8/J3bXF6a2ZnZ258+u77cfXq8/Tr5uXm6u73em19 +/n389+r5b3b8fX73fXZvb2plbGx4e/z0+fL2+vT/dW9se3Rwfn13a2f++fLj4eXp6ejt9+/v +9fLv5efufm1pZmFhYmdkX2lxanf7eX1ubX739vfv+H3u5+rt4N7g4Oft8PL9eHx2bWxvbGxi +XmVnbnn2dmdpb3Bv++rm6uvq6+vn6e35/X56cXB7//T59Hxzdv30+Pt+/fn6e3v8fHpwampy +fXt9eXv07fJ7f/d3dnl3eXX9d2Rld/z4+Ovj4OPp6fD37Obs+v5zam5udfT2/Xh5fHVtbWZk +aWRkZGFu9/Xz7uvt9ube6+3d3vxub3r+eXF8fn12fm508/bo7f14bWls+uvo7fX6fW9sb21r +b35ua2397Pj37/Pu8vN+cX3s7Xxwevl87/N1fHx6cnt+d371f337fHhtbfz5//n0+3739Hxr +bHj39vPu7ubq+ff/e31+8vfx8X1sb/ru9nv8eW5rdW9naWhtdnHw7Pl0dPnt7n77/P757+ns +8fPv8Hl4fv///HZlZnD9d2xv++/16On1/Pbu9PX/cXr7eHn7f318+e36eP3+dG9qZ2Vne35z +cHR9/P/48PHy5+bt6uXk4+bs5en5bWFfYGBfZWpxb2xsa33y7u75efbp9Hn8+PLq6uzt9u/u +eW789nx3cnFyfu3wd/v09fd0anB6cWpvfHl1dHRu+unh4/Lz/Xd6d/p+cHZ5d37x7fdub/75 +//18+PH+ffTw/X59+Xt1+/R+dPvn5+zs+XdvcH92a298fHJ98u57b3V4cf3n5/V/+XdnaXf+ +dG5ueXZ1f/Tu9fHt8P569PHz/vbi5vX78ff1/fb+amlsaWdodndrbXP6+3J+8/h79+v4cXvt +7e3r7Ofr8f14f3R8/29tbmZpbXjq6fN2fu7v7/b1c2729Hl1+/Z7dXD+dG16e25p8ujs8PX7 +8uLt+/j7cWtzaF9teP58/O/6e3n49/jz7u78+e3u8Ovj6Pdvb3t6eHl1Z2Nkb3Z0d/Ls+Hh3 +f3t+/HVz9+7v9P777vj69v51bW59/vl4/fp6++vj7vb39/1vfP1rbG9wcPrueW5zfe7p7fp6 +cGxue/x8++/2+np48/F7fu7q8/328nlsbmllav3s9n51+vt3cmluf/Du6u749/v18/Lo5+32 +89/n8Ovr+Xp5cGlfXV1gX1xicGtoefX06d/ue/fy8fHx8evl6ufe3N7e4fd6d3NtZV1lbWJe +XWZsaXN+/vXj3u17+/D1d/zzeG1v/+3u7ujv/vfv7vn9d3hvaWVpb299+vb9fPX6eG/85d7n +9P12b/7k5unl6O94b3J7d29nZ2RhamZgbfp6dnl2+vHz8+7q6/L3f/jr6uXj8u7h6ffv5uvu +/3ZsaGlpZGJpbnVpanD2/Hr1dHR2bGtna3bv6evt6N/i4+Hc2d3kf2doa2hjX15nb3327+zv +fP90Zmhsdv397+h9d+vl6+Pe5/5tcWpqbW78fnRv7+vr9vr19vV2cGhgY2x3bmx68u7o393c +2dvd6PT9bGFeX11bWVxmb/79/PXw9/x0a21z9+/s6+Hb2trc3NnZ3/luX15bWVtaXF1bXmlx +fvV4bW58/3Fzce3k6OXg3NbRz9PR1PD+cGZdXGBeW1pcXFdqeHD8fmV+Y19vYV1jfOze2dDO +zcvMztTlfGtaT0xNTk9TWF5q/ezp7ff98f1rc3x97uTa1dPRzs7Pz9Pa6P1vXE9LSkxOT1JX +Xm77+3JkZWpramhv9+Db2tfUz87Nzs3Nz9Tc6vxgUUxNTExOUVFRVl5eXmBoaml0d+jZ2Nva +0c/OzcvLycbIztbm/mJVTkhGRkZHSk5TVllaWlpbXV5k/N3b39fU1c/My8rHxMTGyc/Y4O5v +XFRQTEtJRkdKSkxNTlVVUFFZWlTW3dzN4F3Kxce+vL2+vsLKxdPp9FRVSD8+Oj48PD8/RUxO +V2T969/f2c/JysrFx8bEw8LJxMbJx8/a5PR4XEhLQzs8PDo7Pj9BSFZdYt/a5tTN0NDLyMzL +xsfMxb/Hw8LKxdPY7FppUD5JQDY8PTc7PkNITGTsaNvM4M3Czs3HzsvJxcfKx8C/w8K/08/X +WH5POEE/MTY5MTU8PENUXtnc3cTG0cG+zcS/zM3Kx8PGvL7Gv7/NyFZL4D0uRTopMzosMUE9 +QejY18vCubnEvLXEzrzI38i/yci+wr7A1dBlQFU6LDU3KSo4LzBDSlbLx7+2trezu767xNXW +3+rSy8u/u729ucFtRlc/KSswKCQpLjI7QGS6ur+0q62ztrW4xf7y3OV10sG7v762uMlPPVg1 +JCYqJiQnLDxXReiurLGyqaetvca/yEY6S87Y4se0rq61tbdROj0rIyIeHyUkKT/90rOqqqim +qaywv95fRTc5QV/Ovbetqaeprto6PC4gHh0bICEjN+y/raWlpKKjqa/RS0U3Li81SMe5saqk +oqKnujoxKSAdGBYaISc3aLynnZ2fn6Korso8MCspKzA817Onop+enqGuRywiGxoXExUbIzrQ +sKScmpucn6m3bTMrJCElLUHGrKGdnJmanKhNKR4YFxQSExcfOr+qn5uZmpqeqLpHKiQgICQs +PsaqnpqZmZqcp1UoGhUVExMUGB86u6OcmJmanJ+pukInHxweJzRPvaqemZaWmZ6yPCQZFRQS +ExUZJE2yn5qZmZudoazCPScfHB4nOd+2qJ+bmJmbosM0IBgXFRYYGhwnSbKgm5ucn6Opr8NG +LSIfIitDv62no6CdnJ6oyzcjHBwcHB0eHyg7w6mhn6OorbK4w2w5KygqNVzCtK2qp6Wkp6y+ +WzYqJyUkJSYmKjNHzriwr7K6v8bQ+Ew9Ojk+UN7FubGtqqqrrK+3x2FANjEtLSwtLzM5QFHz +0svU9V9VTUtLS09j48+/t6+tq6ytrrO5wt5XRDo1MjM1ODk5PUJNWVxUTUxLS0hHS1jw1ce9 +t7Ovr7CxtLm+y+RkT0pFQkBBQUFGS1BOS0U+PT0/QUNKTlhv1sS8trS1tri5u8DP9F9TTkpL +TVZfb+fd1NbhaE9EPTs4Nzk7P0hb3se8urm5ubu9ws/4WE5KSk1SYPHZzcrIx8fL22tPRD48 +PDw8PkZPbtrLxMPDxMbL1u1jVE5MTlZeaubWz8rFwb/BxMvfa1ZNSURDQ0VKUFtu8OTc4fR1 +bmdaU05NUldi7NvWzsbBwcPHys/V2+X4b2ldYGRv6vptZ2JYUUtJSUdGSU1OT1dp+9/W0c3O +09ja3NfQ0tTPzc7KxsrMz9rzaFtMRkNAPj89P0lMSlb+cvXV1tPO3e/g7//T023JsbnKvrCv +v1Vw0Uo2Ly4yMSwtQFRMX9jLycPDxr/D1dLM6HzLw7+4s6+vr7XNRlVHKCcqJSMmKC1BP0m5 +r8e1oq64qrK/wHdLwdQ9vavDyaqvTErGPiIpKh8eISUtNDTqu8Cxp6eqpaetsbzK2vNi28O+ +vb2wyDLdyR4jSx0XLiocNlw05664raCmoqCvrKvfaL5FPbvKX7u06DnYyiEpVh0ZLykbM1Yu +SbOys6SgoKSloLPEuNQ7Ut5J5cPPvvkusDkYwywTOzMXNNAmQbG2vqqcpqyeosi4tTo8Tjg5 +XV7bvrKsVFGhNh2sMBJHLxQvOh479ma0r6GeqZ6durOrWk7UPj5NR+PZvatFO54uG6csFXQr +FjIzIjdTv8Kxm6avmqPWqLVA3l03QEZFZeC6tbCtS8CuIzHNGx41GxwtKCk+vLzDnp2wnp27 +rKlf4ds9RkM98XC/tL+pr3K+4DEvLh8gIB0fIyszPr+1r6GjqKCnsa242tVUTExJ7ufJsre8 +rLXG0n87Ky4kHiAfISAsOzbdrryuoaqspqqzu7W/T97RTtzFwcC8ucDDwW1jQCwzKh0qJR4t +LS1Xac23u6+rsayts6+5xMLO287SwsLPvsDk0V9SWzk/PSwvLysuLzE5N0NiYMi8wLezuLay +tLu3tr++zd7HePDY6/ZuaVdGSD02PzQvPz45Qj5aWz/f1GjNwMzNwsK8wLS0vbi928nbYP1Q +SlJFPkxKUFFydFrbdkxNQDgxOks1SM1rY763w7art7+0u19nz0Q6YUg97ujSz8e90W7I7URf +SzE0PTc1Mn5KQr2+67q4x8nMzd3gz93/yGJQ7cvR4sW84c/mWPXYX+xxSDg8UC8yQ0c/PGzL +2Mq/xsPd1b9VeMRTWMrm3tTIu8q8tsrOz3XvY05cQTZBOy8wNEdMPVy/cWzFy8Xe2MTtWsHP +3cfVvcDIuL7CyuvJ5kvwaVtFMU9EKkJnMC9LWD4+xsZHwbflzsTKysPMy8m+xMO7zdK+u9nT +xNxeSEw/LTI9Lys+RDZES05PxcVyvr3k0L7Jvbi+xLS5/c2509fEysbP4MpWLy8vLC0sQUAz +R2ZH/PhOy8rDwMa3u8S/uLm7wba/RM+4dvm92dDHPzM7NCMrMik0RT9I+tfNzbnG3Lu7zryw +usC1sLbPVsG7dkh2yEpNukIvQi0nKSY3OTRORta73sC1vOPVu7TBxK+ts8fFvMtozszRTmLM +SkU/MSwlJC88PW3mUU9nVePEvLy7xsm5tLK6rKzFQNi2SD7R2szTQVw7KykqKig4Rj++5Te9 +uF2/t8+/6NGwv7ymqrbK9r7ZSNDhVG1HNC87NycjLj1HSN7T29hOaLS6c7q/0MPBuK6qrMJN +vcc6W7/Czt1CLyQcKTpFOS7fxjo8vrW+y/TS+eu4r66tt7Wu2D9fxM7OvdrOxS4lKSYsLjZP +elY+Vb68R1G4y1vetq2zvK6vx9F83tZe0bbOZsZGJSoqJEBEMspGLtLL6r/N2vlD2bO6tayr +q8M96LrLW82vttM3JSc/Oh8qRjhb0mO82FFnQXXG37uzzLirsLbD4c1sS8a3vskyLzw1OC0t +QmhDPFTGw2FP3tFx6MiwwGC1qrfk08ffQ9mtsUIkKUE+Nzk1SdA7Sbe+3lw/dsTZybGzx8u7 +s8710GBE97+56yUoYTwlJD+sszVCv7nISuK/3Vfot6y7wLK8911HfbS7Ty4mLTg4LC1Rxbvi +SNe8ws/i2MTDxbmttcK7wtrea/2/vzobHjQuTjsp+8dI2si9tMpYz7a4urWvsL7UtKzGYsK+ +1jIZFyg9Tkg3Oj0yT8G8tstHYb6zrKmpsb7Dv62sz82/vbsgDBParMwsKUk6KDuro8IsMs2w +rqqlprtQ0a+jq9+3pLQfBw26obkyJUc0HjmintwfJsutraukpMM+1qigruO+pKApBAq3lqAm +GUlVHiqplq4aHGynpa+qoLczNaybqW1JqZksAAenkJ4nGHP1Giqhla8ZGsmjpbGtnrYuOa6c +otPZoqAPABOVkJ8fGF8qGcaVljkQIKyeoLSsoGMnR6OYplW/nEEAAqWOk00RMckXJJ2RqhYU +ZJyaq8mprTcuvpudxbyd0QAAzo6OthMhyBscopCgHA8tm5SjwLO2TTzFoJ6usp1XAAC7j421 +DyDLGx+nk50bDSqckZ7Lt7dDPMCenKqpnhEADZyKjSYNLTkeX5+XuBEQSJWPplfB1DhCrJmf +rqAwAAPLkYekDhcuJMCen6ofDyKokJS0TmdeUMGln6KceAAAN5eJlxUXKRpVm5ukJxAhr5eV +p77RSUfAoZujoEIAADuVipsTFiwcSp2dpSYPIaiUla7xyGdLvKObnKIaAAe7jomsERgdHqua +ob4ZEzakkpOuST881Kabm5/WBgAbnImNLBIZFzmbm6MuDxnKmo+Zx003M8CimZWqDAAMrYuK +txobFR6nl5nXExMxo4+Uqb0xKFasmZGhDQAKyouJrR8cFR63nperGxIeto+Qo7Y9Kka6nI+m +CQANvIuLtScdEx60nJq9HRkltpORm7QuKTq7l5AzAgMbnoyZTzsjGSbPm5jCHRYnppSUma81 +KDCyl5wQAAxYj4+8LCslKDe+oaK/Ixo0ppaRmrdKKjGqmcwHAhSrjJPlJx8dOL22rKy/MiUt +tJiQlqVOLT6woCIGCRqpjpi7Lx0eM1/MuKmwbjgt7p+VlJ3EN0G4sh0NDhZYoZ6gtjYsLi03 +WLaqrcxBWLSfnKW/T1HEuD8gGxkfTa6otUszNUBZxLi+0U5B77uvrb1IODtXvre6y0Y1QMiu +rc8vKDRYyNNDNDNAzbCvu+VCRV9q3b26xl8+SNDBzFQ2OU3nvMFUNTFNva+yyVNDVe/1V+/T +42pf3s7VW0E8RFDpwMNqPTdYuq632ExF+8/yWldXb/l1083qXFBb3dXW0edNOzlF0Li830c+ +UNnhYFZW8crK0NpfTlT2zMXL1OhfTUZEX8rC0VRKXfbxbmBVUenLz2hLSVTmzcrJz+lnXF5m +79nT4mtrenZVTlJPTmPdz95WTE50z8nK0d9mWWbu3+Dj8NzOz+1WTlhdX/vq6XdeUlFs1srQ +fmNbWV1ia2ZbXdzIyexMSVVp6ODn7fb6fOnV0NHZ6nVeX3vva1BNYNjGxtxbS0hX5t9wXV52 ++vnr3+xsd/bo3eDh5GRVaNnJyudRSU5bYmhmZGpqfNrV42tdbPXl3t/d3OxmZ+zV1+5lVFhn +amhfXVpn59zb4nRkZW/q6Ht839Xa8Xbu3u5lZXzm5W5dYmdveX71cFtVW/XhdVdb+9/b3d/f +3eJ8aXvf2exOa9BW8+the1tF58xw3etp7+ju1d7wflxNUk1pv25V2PBXWWTdz2ZfVUlq1evc +4tfI32Dv2dvh7vrd4PZZYG9ZX3T7b2NQZPz2ffR5fV9WaGl+6eTv3ejj2Ovv6vtp5+x8dGFm +YF9u5t3xZnbu8Ojl2tf4au3s9GxfaVlVau3y8m5w2t3i2u3+5fpu+m5+719ZX11cYl5cWlZc +7t3b1NTOw725ucjMvr/mS0Q+Ni4sKywtLjhMY9u8tLCtrKuop6mrq66wrLgxGygpEBYgHyMk +NKu64qGepqSknqC5rKe8vK+yyh4ZTxsOHyYfJibXrD65n6uqpaOdrbWgs8Wrr7G0KRs9Ig4d +JB0kJj60Ucmiq6umpZ+ruqOu0q+vtq/aIyJCGhMlIyAmKvHJPrOmr6qmo6O2rKC5wKyvsLPt +LCMzHBUgHx8nK07ZSLGosamnp6e0rKW7tau1sLPQMCE7JRQgJyQmKlnOO8OptK+sqai2taWv +vK+vsrTBQCctMBkdLCMlLTLcTz20r7ivrqaosqims7Wyuru+5TolKzQeIDIpKi8vfVY2wLvH +r6+tqLW0rr67wPjA7WrMQkh4RVlPOkY/Ojw5Ozs5R1dj29vQwMXEwsW/xdDOycvIw8bEx87V +3HFPQjo6NjA2OTdGX2Z8X/LPdtrCysO8u7i7vrjAyLzE8XxYRz07Pjs5OD0+OTxMTVXta9TD +3sy7zb2817e0v729vMHe8Gp4Rzg5NTQzLS89PztE1s3OxLyvuNa0sci+18S62srN185ORmpD +MzEuNzktOltMTEzTtsrIsrW2wta4wFnS6MvFaNPA1lRLReNFMjs1NzwxQO5VU1XEtczDt7i2 +z2+4v0baeNfHS8fJ6V8/flo7ODY4ODc8XPlYTHu4xd+4t7S3a8i2UuTLT8TY28Pe10tNbD43 +NzMyNC89al5lXMKz3sixvLvG2brGYtLD6MPCy7ptZ0tRRS0xNzIyMj3sblpi4LrIVbq1wb3h +wbdf3MTMxcHBvMvqRlBbMy4vNDMwM0blaGHezLjIc7e2xsPfyrxx88rLvLvJu79bT1I9My0t +LS8yOFX+8tLfzLbK4bi8wL/mxb33zNO9tMO4vsrsSj84LisqLTAyOk/m2szY2L/G3se+vr/a +zb/VzcG9srK7xMFqREEwLC4qKjI3P/fhzb/MzsPDxs7Nv8hyduPSzta/tLO4wMfOTEI3LC0u +LS80PnLt0L/Czsa8ydDJxMbzU+fjetPBuLGyuMTJckQ4LS0sLDAzOlBp3MbFzs28vM/OxMnb +WF3Z+ObIvbexs7vA1nFINS4uLS8xNj5MdtTOysfKxsbS2tbmYlZZ+9nPwrmyr7G3v9lmTzwy +MTIzNDY9SVhw3tDU1svM5uvee25bWvbayb64sq+xtr/eaU06MjExMzU4PkdPf8/MztDLyuBn +entwaVzy08q9trKvsLW7z3JPPTQxLy80Nzo9Rlrj1dbZzcbb/u3/4/Fk79TIvLaxra6yusx/ +TjwyMS8uMjQ5P0de3trX2d/O1F1dXGPzYXrQybyzrqursLjJ7l49MjEvLjE0OkFGWuXa1dbp +0MxuXlpe/Vdc1cq+sq6rq6+4zVhOPy8tLjAyMzlIVP7Pz8/Q8OvL1GpOT+5rUeTGurGvq6iv +u91CPjctLC0wPD1DY93GvcPK2UY8TVdLRUnPymHfvq+npqOkr79KKCYpJSMmMVf1zLm1srC7 +0Fc0Ky4+SUxM2LrGxLSpn56foq/2NR8bHyAiJzDqvLisrK2tue43JSErPEx737uwvr6xpp2c +nqe6UCoZFx0fJSs5yrWtp6uvr8BVLx8eL1/Qxt22rry6tKacm56s9jghFhkdHikxWLm0qqar +r73mQCcdITTaur/Hubu+u6+inJqermcsGxYcHyQsN86wrqyqrrTGTjAjHSNBwrC6xLu+v7qt +oZyan7JKJhcVHB8oMD/Crq2qq7K6zUouHxwoXbStvci/vri0qqGbmqK6OR4UFh0hKy9Lt6yq +qa23vdk/KR4dK+WwrLrIyb+3r6egm5ulujEaEhcfJzEwT7Spp6iyx8v5PiccHS7Bqaq609W/ +squln5ydpsQrFhEZIS43NFu0qKOnuuHoWjomHB40uKamuuTwyK+nop+doavaJRQQGCM6QTz3 +tqegpLppSUE2Ix0gPLCipbjnVc2vpZ+en6awTSASEhknRUlL2baln6W7Vjw5LyUfJEqwo6e7 +cE3RrqKenaCrvDkdExQbKkZT3cWwpqGovk43LighIC3jq6OtvmhmvauhnZ2irtosGBMWHS9C +VMu6q6Ghq8xAOC0lISE2wqmksMta67Wmn5yeqLdDIRUSGCI1S37Dr6Sfoq9nOzIqIx8nTLSl +qLfaXsetpJ+epK3IMxwSExkpPFDVu6qfnqW8PzUtJyMgLd2spKm53d64p6Cen6m2XScYEhQd +LUBvxrKlnp6p1zsvJyMfJTjDqqetwdvKrqSfnqOsvj8fFRIWIDFI5b6toJyerHc5LSciHyc+ +uaqpr8PXvaqinp6nstsyHBQTGCIwQ+C5qp6cn65jOS0nICEqT7errLfHwrGmoJ6fp6/iLxsV +FBkjLDZOv6udnJ+u2Ek1KiMhKEHFsLC8ysKvo5+eoqqxzjgeGBcaIyouOGK1oZ6fqrzWTzsu +Ky08X9PO9WLRuq2oqa61u8XcTDQvMTc4My8wOU3ZzMnQzsnGyNDU0t1cSD06P1jNvbm6urm5 +vMDFwsDF1VI9Nzk5OjY1Nz1DSlBTf9TK0HdJTF3lzcnKz8i+u7q5trGusbvRWk1NST0yLi8y +Nzk8Pklk3ORlT01e3c/V6m3y2MrEv7qxraywub/Fy9J0TkA5NjIwMjU6Pj9BQkhUc9ve92Ne +buzb1M3BuLGxtbq8vLu9xtH6Y15aT0M9Ozg2NTQyNjxHVmVjXmHq2NTOycO+vb/Bw7+9vcLI +zszLy87Y6n5pVEY7NjU3Ozw4Nzc8R1f42M/Evb3Ax8vNzczO2d3XzcS/vr6/wcfTd1dTUUtB +OjQxMTQ3Oj1MetXIx8nJv8DH0+lpXWT31s3JxMC/vsHCw8PI1GNJQT8/PDg1Nzk8PUJKXdjE +v8PLz8jP3uryavng29DQzcrHx8nP2ODe4OVtW1NWUEY/PT4+RkxPUF/ay8/Y2Nza4N/rZEnG +w/PV3mhpYOO8ydPGyMfI7HFVTk9IPjk4O0ZNUWDr0cjFz87Yz8ruX11XWGFQSD3rwdBiya+3 +wLezt7tSOjs7My4nKTNH3cvHua6xtLzaX1NGOzkzPlJMZdTKvrq5srG1s7nAvtBIMSssLS0q +LDvywbq4tq+vuMxuUUE4MS4yOkJT6su5sLCvrquqr7O7v8FKJx8kJigoKDnFsa6sraytv1s5 +MDItKSs5TvfFvbGtrrCxtq+qsbu8xe1EJR0jJSUrMEK2qqyqqrG1zzcwMi8tLjBHzMG8t7Gu +r7q+ubOvusTA02w9JR8pKSYtMUy2r7Osqq+21DYxODAtMjRLvsbAsK+urrvKwL+8usbKy9tJ +KyUsKyksL0S/tLWyr7G0xUc7Ozc0MzZF2sfIvbi3s7nDxb++uLvP8+lQMi0yLi00NTrsxsa6 +trq4uM9fYks9Pj47RF1r5sq/wMC+v8TCwcW/wOJVbVo+Oz02MzpBSFVq68zGzc/P2N/zaWBt +6djX6+HY4V5QVF9lX23dyMC/wcC9v9JsVUpGRD46PUNHSEhOaPPt39fPyMXM1dje6mJNTVda +Vl7608K+wMC+vcHVbFxRR0I9PD9CQURLWfXh3tDIx8XK2+fpa1FKS09VVFBi49LKw7+9vL7C +ztzibktBQj89PT0/Slde7drUycjO09be62dWXGVaU1RWbdrUzMK9u7u+wcbS911JPz89OTk8 +PkdPWfjYz8zM09LO0/BkWldYVlNXet3Uy8G9ubi6vcHK31hIPzs5ODc5P0VNW2ru1s3Ozs3N +ztduW1tQTk9PYdrQy8K/vLi5ur3CzG5JRUE7OTc1NztASVFd7NHLyMfKy9Dmb2NYVVdZXnXe +ycC/vLm6vLy9xNhVSkc9ODUyMjU6QkhPaOnXycLAv8PM2/ddV1pgZWp839LJw7+9vby8vsbU +91JLRDw2MjI0NztFT2Hp1MrEwcHFy9Xrb2JgY2xqa2ry0srHxL66ury9wMx5TUY+ODUyMTI1 +PkpRb9bMysjIyMnMz+JtZmJmaGBpbubMxcC9u7m5urzF1GVEPjw4MzIyMzQ6R1Bs18/LxsDC +yMjK1u1vY11qfmNg5dDKw7y4uLi6vMLO/kc7Ozk1MjAwMDU/R0z5z8rFv77Ew8DK2upnVFNc +Y1/11s7EvLm2tba5ur7LXD07OjUwLi4tLzc+QVXazMbCvsHCwcrV3P5ZWGFha+LPy8S7uLe0 +tLi8v8f8QTo7OjIuLiwsMDk9SO7Lxb+8v8TCxsvP3GxVWFpm3dHOx7+7trO0t7q8xe1EOTo4 +Mi8uLCsuNz1H8s3Iv7y+w8TDxcrdZFlbXnjdzsjCu7aysLG2u7/RTDg2ODYwLiwqKzA3PlbZ +ysC8vMHEv8DK1v9kXGPf0s7Hwby4tbKzubzA1kc3OTo3MzAsKSoxOURu08jAvsDHycPDxs9v +WF1y3NHNv7iysK6srbG30jUkICEkKTA4OD9vx7qwrq+5y1E1LSw3SvfKxL22sq+vrq2tqqms +tNE/JRURFR03u6inr7i5t7W9fjYjICUvS72tra2vuL/Gzsm9sqyqqKuywEwiEQ4SHlKnn6a3 +z8WxrLpEJhwdKD7Er6ytrqustL3KxbWrqKquueBIJxENER1Qpp6ov9zFsKeyQCUcHixMyr62 +r6uprLvc2LipoqKor8D6PR0ODRMkwaGgr+54vKmoxS4fHitI0MrXxLCoqLPaV8uqnpygq8Fb +SSkRDBAdTqafrlJNvqqjsjAdGypdv7nQ07aopK3SQku1oJ2eqLtqSCsSDBEh1qSfsD49vqej +ti4bGytZz9d9za2fn69jPlawnpyjr77LZiIOCxQurZ2hzy4+rp6j5SAXHTnZ3WFTxqecn7xK +TsGnnqCtwcnLMxMMESW9oKG8LzK7oqPALB0eMEtEQE2/qJ+iuezCrKGgqbre0r45EgsULbGg +ossrMbWjqmcpIio9QDMvRrSjoa3XzKqcmp+t3jxEOhoNECa8o6CsSzF8sLk+KSw/ZU84LjnA +qae19OSunJaapLdcQCoTDBEpvaqorL/MsKv0IBonT+1USVDPsamyTzrVp5uZnKOyvPMeDQwa +Rbq0tLm7qp+oNhobLT4yLj+8qKOr2Dc+t6CdoKWrr7gyEw4aP8VoV8a0qZ+jXh8gPEMmHy/M +rKSnvkBVrqGkqauuvFMjFBUpvLVfQdiupqe6MCApVV4tKEG7r7W+0lzRq5+fpaqyaiUUEh4/ +xs3WuamhpLU/Jyk2MyUmXqqjrcpuY9i9ta6nn6G2LhQNFzzBTDLRoJicrEkmJ0n6Kx0ovKCh +r8lo7bisr7mvoqRqGg0PIU9YMjyumZaeySojNNxEJyrDoqW41sjDv7awr66npLkmDw0cODQh +J7KZl565OSs87j8tOrKgqMlQ1Le6vr+4rKakqkwWCxIsTCoaLKWWmrk9UcG8Sy48v6emuH5u +vrnVW82ro6myxysTEh4uMyQmX6+su8q4tbvMWVjuvayuxfbMvcjdxLWtqamuyy8XEB00MR4c +RKeq7UG7qK/IZ+K4rq2+RlC4rsdF56ymr8R2RTUqHx4pMC4qLmS9x9vLtK++zsa3rbLLV1jf +yc9p4r+5t8FbODVKWUI3LzVNWj4uM+23u29Yx7Ozzz9qtbh2WF1NzLfJaElAx75AM/K1w1JD +SU9LT1FDRem7zUbnv/5H7VtGxMRLYMPpSeZZPcXBPdutwT9usb06Ms26Uzk7xbw/Pk9XVk/u +WtDKxVhPv2s7R/ba09LP67W/P1S5vV8+NL6xPzRLfMdJP1p2uMs3TMfoRDvg0OdPT8Wzzzjs +t97n2tbazdJcQ/69OkjyUtdJPsD9RXpN8kPe20rY3c3J/VTf1MO5Sk+0XEm/TUfcfd88aN1a +eHJETsBBP+5c69E+17fFaVjYxORs1tjNzHdPvkh52D9R0OpPQmDUXDpNwlZE/3PS2G7TY7xx +PPHPzPre2Ly/PcTXVt8+789LWEJN2klM73d90FVOwM/MQFq6X1pO0udbwOZfytbHZGDAXF74 +Tcw+Q09lZz/M+kTL89lpTr9vS9jPTkzN4XPK6WDPvehd491w+19jUm3VSGF1WnpKyeI/w8xB +ys9CVMnhR+3LSODHddJj9XvO60Lt5VDM+0DOaVPbW/3QRN3EaO1L+8tjXOTaWXvJ6091zFLf +a2tWP7u8QUG1X1jOSOph3M1XeGlRV/vMVT1sv3NJXM9o3MxU3Flhydxa39Hk//TdalfTW9zb +TWRpeWnVSFTha2lg7EzX8XXxR83gd8DcYd/J2tpTbMjRWWRpdfBDalVO2VJLZ+JmSt7OR1zc +V8vPa+/C69i+X0XUuF5Wannv5Fhf+ERrzUlg/Evv90rR/D7R1VbZXdzCUvLF6f3f7c/oRNTN +Vm5iUXnu3edGWOJtY2NmSdTVTMxqUMnUy89HXfPfwE1V2vvo2tBbTGvt1+9OUVlibF1s0llN +2sfsXGvY11x22nZVfs3abGPi7mPcde73TGnN5WlbTujvc9llXGR42tbvYl5e595kZWrt0NVs +Yul+3dR/dFZm7n14an5fc/D2bVlrWlvt7vLtbe/a8PHsbuxset9+f+b2annu2utp8e7b8mrn +7u7mfW1kUGt9XnJ9eW5dfedkZnDrcG3u5t3z/XV36/n62fVk4uv8dm7l39vd1/pz6XN1/Hdt +YldYUE5dXl1kZ299fu7hfOro/e3v5dra1MvMycjMzszZ28vV2vFfSjMsKysvOUrn0t/Lvrq2 +uL3Dy8nFy9Tt7tjSzMXFyMO+v/UzJyMhJCw5TvLZw7m2s7O6xcvO1tHU52RNX9fIvru7u769 +ub71MyMfHh4mNUrWvrewrq6vtMV7XlJPau1qWFV4y7qwrq+1ur7D2kYtIB0dHiY1Usa1sa2r +rKyvvfg+MjI5Q1j85NLEt6ypq663xc3WfkUtIB0dHiU3Zr+zrqurrKyvve4/LyorM0btwbez +sa6rq66zusPQ+UcxJR0dHiErQOq/ta+rqqussL9dOy8rKzBC3byxr66urq2usba8yf9EMCYe +HR4hKDJG3ruwqqeoq6+5zUo0KygqMkrHs62rq6ysrK6wucXnRzkuJx8dHR4kLkvFsqqmp6ms +r7fIVDgtKSw0SNG5sK2tra2tr7O7yelWQTYrIR0cHyUuRc66s66sq6usrrfNSjYvLzZCZtDE +vbiyrqytsLe/ydZtRjMnHhwdICk1TM+/ubKtqqmqrK+73kk4MC8xOkzqxbq0r66vs7m+xNBl +PzEoIh8hJiw2RP3LvbOtqaamp6y30kUzLS0wNz9Mdc2+t7Gvsbi/yM7fWkQ1KyYkJis0QV3Y +w7myraqpqq22ylU7MS4wNz5LcNTJvrm3uLq8wcjS6VVBNi4rKiwyOkNQ+8q9t7Gvr7K6xuZW +SERFSU9VWlxu3szDw8TFxcfHydd+UUE6NDEzNjo/RlJv59PKw727uru+xc7pXlJKSEVFSlnp +zsbCv7+/v8LGytNrRDgyLy80OT5FTFZx2ci9uLa2ub/O7llMRkE/QUlZ5cm/vby8vL2+wsTJ +4FI9NC8uLzQ5Oz0/Q1Dgxru1srS5v8znXlZTUFBOTld+1cjBvry6uru7v8rtSTcuLCwuMTU3 +Oj1Ha8u7s7Cvs7nAy99rXlNMRUBBTHHMv7u6ubi6vb/H3VY9MSwqKy40ODo8QlTZvbGura6w +uMTS9VtMQTw6OkFX07+4tra4uLvAwM5bPjErKSotMDU6PkZezbuxrausr7fAz3RMPzs5Nzc+ +Utu/t7S1tbW2u8LI5Ec0KiYnKi80NjpAW8u5r6upq660vM5pSTw0MDE2PlPVvraysLCxs7a6 +xPdGMygjIiUqLzM4QWjDsquop6eqr7vPVz40LiwtMj1b0L22r6urrbC2vMPUVDcqIx8gJCov +Nz9nwa+npKOlqrC93Uw5LiknKjFCfs7At66ppqersbrDz2k/LSEdHB8pMTpDY8OupaGhpKmx +wmlANCwmIiUtQ9S/ubOspqOlqrC7xNBgPy4iHBodJjI+R1XGrKKen6Oqs8tLNy4pJCAkM+K2 +sLa2raajqK+6w83Xb0YxIhsZHSk6REVbvqmfnZ+nsMNiQDcuJR8fK1S2rbC4tKulpau1x9rU +ztxJKx0YGyMyPTw++7KinJyhrsteTUEzJx4eJ0K2qaqwuLGppaq64l3dvrzcMx8YGB8xQjs1 +SLagm5qfrvA/QEY1Jh0dKuiqoqevubSrp6zAT0L9vbnVMB0WGCQ5TD86WrKfmZmivzkxOT0v +Ix4gNrOenaW2v7OpqbHfOzhZvrlcJRgWHS9PWkxYxaqcmJ2yPSstMzApISAtwp+anqu6u7Ct +sMZALzj5v9otGxUaKlbP1tK9qp2Ym61DKSUoKykhHyy+nZebpbO6ta6vyz0vNk72TSoZFBor +bcO/vLGkmpedtjgmISImJiIiM7acl5mgrrq1rbDQPjQ4PkY3HxUUHS5zurCuqp6XmKHELyAd +HyIhHyj7ppuYm6SvsKqpteM/Nzk+OiIVEhgjOcewramfmJidrUklHh8iHx4lQ66dmp2mr7Cr +qKy8Xj48PjklFxIVHjPJsKynnpmYnaxPKB8gISIiJDe2n5uep7K5raaptdZJQD80IBYTFh0y +w7Cqo52am56vOyQfHyAjKDDtq5+eoau3ua6qrbjWSj06KxwWFxkhPcKupp6bm52n2i4iHRwf +Ji93raCen6e1vLWvr7bGZEI5LB4aGhsgMnW4qJ+dnJ2mwzonHhwdISparKGdnaOts7KztrvT +S0E4KR4bGxwkOWG/q6OenJykvEMqHx0dHidNsqGbnKKqrrCwsL1bOTItJB0bGx0oP9Cxp6Kf +nZ6nuUsoHhwcHy3drqCcnJ+kqq6zutVFMywkHRscHSMyTcatpJ+enaKuyDskHRoaITu+pp2b +nZ+jp6qvxE8zKiQeGxsdIS1B2LaqpaGfoKew1DAfGhcbKFGxop2cm5ydn6a08ToqIRsXGBwf +K0Pfu6ukoJ+hqbLARyoeGBcdLs6qn52dnJqZm6O6QSkeGRUUFxslPs+wpqKgn5+nr71KLCAb +Gh4pSbemn52cm5qanafEMh4WERAUGCAwVLajnJubnqm0wk4wJRwaHShFuamloZ6cmZiaobc+ +IhYQDxAVHitIt6ScmJebpLPpOS0iHBsdJT66qKCenp2amJmer0IfFA8PERYdKD+4opqVlZqi +tk0vJR4bGh0nQrilnZybm5uam6K4MhsRDw8UGyEtWbCelpOUmqfIOikfHBsbHyxcr5+bmpqa +m5yhsD0eFA8PFBogLUa+pZqVlJifs1ovJB4cGx4nPrymnZqZmpueqL80HxgTExYaIzRzsaKc +mZmco7HtMyYgHh4iLES+qJ+cm5yfqL4/KB4aGRkcISxIvKifnJyfp6/CWjgqIh8hKj/Jr6ei +n5+hqsQ9KiEeHx8hJi5PuKihn6GnrrzXTjkvKykqMUTRs6mmpKevykkzKiYlIyQpL0fGr6ag +oKWsuNJOPjYwLi82RuK8rqmnqK7JPy0lISIkJy03ScqxqaSho6ivv2Q9MS0sLjVH1LmtqKem +qrpQMCUeHR4fJS5Bxqyjn56fpauyyU81KSUmKzlzv7CppqSlrck9Kh8dHR0eIys+u6aem5yf +pau2zE4zKSQmKzzjuKyopaSot1o0JR8fHh4fJC1QtqaenJ2hpau5z0YvKSgqNEfnu62oo6Wv +2DssJSMhHh4iKDzBrKShoaOkp66+ZjctLS84RV7Lt62npKzMPS0nJiYiHyEnNs2vqqakpqam +rLxvOi8vNDlCUt25q6alrMRCMy0oJiEeHyc37LevrKikoqOqvGxBOjk2MzQ/6reqpqeruWU9 +MyojHx0eJzNTv7SuqaOhpKq31U49ODIvMTxmwa+pqKmtvkw4LiciHx0gKjratq6ppaKjp6/B +bEM5MS4uNUzMt62qqqqx0kEzKyUhHh4kL0vDtK2noqGkq7jOXD41LSwvPfrAs6ypqay5WTov +KSQfHR8qNmDBtqujn6Gnr7zLZj0wLCwzRt6/sqqoqa7HSToxKSIfHiYvPF/JuKqjo6issrrJ +VjozMDI5SPHBsayrrrXIVj8yKSMhJCsyOljIt6ynqKuss7vHVj47ODc8SujEt7GxtrrIVj82 +LSknJyw2PFHVwLStrrCwtbzD4lFNSERHTvzIvb27vsHFb0E9NzAvLi43PUNh28q7t7u4uL2+ +xNrua05PXmDcz9XGxL/HzWxTUEU8Nzc0PD09Q0xk0srOxL29u73HzdHjf1JVZGz36tvIw8vL +18/k309GPTw5Ojo4P0pUXufSwLy+wMbExtd/U1dZXVrkdsPDvri/v8jR9WVGPDczNDQ1OT9L +YunPwby8w8zI6thPWlhZaejRxb+9u7y5w7/tYUdIOjg1NTo7PT9LVerV1dnLz8rL+Odn2u/V +18+9w7zKv8rD1tvtXllESEBDQ0FAQ0NERklLVWZjb+nPy8rJysDGv8bCysve29543/Ltaext +22FmV1NKQz06PTw+RElPZOLbzsK8u7u/wcjc6+1y7Ofl5Nnn1NXa9edm+FZHQD9APz88QEhc +Xmfq3MjIz8/Nzc/O4dXTy9TQ2dPO09r2aFlfSlVNV2ZvXFpgZfxdTk1TUlJPTlB5393Xysa/ +xc7SzNn5WmBeZVhZXVzf38/gy97J73FJUktMQ0FDSl5e/G7RzMbR39XW1O1sa2V47/5y2czG +1M/i2fbzWlpmbmRMSVBaYVZWT3z8dlxeaufv/Gty293b9tjWztbo6eXX3+9me/dp5v3l2c/n +cVJtW1tIRkhTWldYXObX2N7n1s7T7GZ9fG9mVHrs2t/k4dnP2M7Xy87NZ1tRV0xHPT5JWGBW +XO3Uz9d3bG/X6O5Z5+3nX+jmzc3Tx9jEysDKycnJ9EdAPkM4NzM8Sl9OXHTSw8bUeG/i3d9j +ftrP237U2rrHv86+v8DKyMXUVj83OTYwLS01RGvr28/CvL3I3FZfV2BWY/zb183Jxb26uLy4 +urq+vsr7PS8sKyooKS05WNPGvbi1s7zT7ks/P0RO7tfMv728ubu6tbm/vb2/w9dHMSoqKyom +KC9I0r+6t7CwtMTvSz44OjxO6c7Dvbu4tLe1tri5t7q7xV40JyQmKCcmLUHLuLKzsrG0vGNH +OjkvLjh9wry+vLKvsbm8vLa4uby+zkwuIyImKCcpMFS9srG0trW2xlE8ODc1OT/evbi6urmz +srm/wLy5t7u+zU0vJSMlKCcqL0zDtbG2uLe3v/VEOTk6PUVezL26uri3tLe9w8G+vr7DyvFB +LScnKSwsLjhev7e1u726usFtQzs+QEJFVNjAu7u6urq8ws7Sz87R1c3X9UM0MC8yMjM3QvvK +w8nIwLu7yHBLSUpLS01f383Gx8TFytPd1c7P2tPLxb/G3Eg8PT49Nzc6QU1acOXYzcnHzNvu +dGVdX2NoX2v6+vzt3tPLxL/Aw7+8u73D205ERUU8NC4vMzxKWmnlyr+9xNDs6u9rUkpKUFdg +d+HOyMK/vLu5vLu4trrKbUI4NTMvLCwwO0ho0cvFwL/Byt9bTElJTE1KSlvPw8HCv7y6u7y8 +vr23uMDfRzQsLC0uLzM6UM68ur3FzM3O3k89OT9OY3ZgYN7Lwr/CwL28u7u6vMC9usJnOisl +JiswNjxM1LqvsLzPdlxVSDw1OE3PwcTN39vIw8bO1cm+uru9vbq2t8VHLCEfJC05QlfQt62t +ts5XTEtIPTY4Scy3t8bmbuXU2d/r28S6ury9vbi2vG4xJB8iKz9Y+Ni/s6+zw2lJSUdFPjtE +5r61u+9GQ0965unhz8C6ury6trO1vlUvJB8lM1nb09LGuLO4ylhBP0A+OTlF27u1v2A/P1DZ +ycfNz8S7tba4tre5wlQzKCAjLlnPy+Tlwrm2xlo6Nz1HRkVcyrexvGM+OkrYys7b3c29tbO2 +ubvAy3o+LychJz7XydR4z7m0vO06MDhJVlli2b20t9BANjxmx8PM29O/tbC0vMLGx9JROi4l +Ii1Wy8Xdbc+8uslOMzI+ZOXg7dO9uL9eOzhI18XK3+rNvLS0ur7Aw8XOVTosISU8zb7KUE7V +vr3QQDM6TufyZ2fLurrQRDY7XsrAyNjRw7mztbq+wsPF4kYwIx8rXMPEW0FSyb2/Zzg1RP/j +4fbavbS8eDw1RNfDw9L/1ryysbS5vr6/0kwwIR0oYLq6XDxKyri7cTQvPF1yZlfpu6+21jwy +PVHOvcre07+xq6yyur/Izlw0IRwjUbS28zU5eru51zUtOGvb8V1tv7Gyzj0wOtu4uMtcbryt +qq23vsTH3z8sHRon4bKzWTVJyLS2WS8vRdXVbE//tay0/y0qPcu3vHxQ1LOqq7C4vr/A3UAq +Gxsuw666QDROwbO9Qy0yT9nnVEnbsauyTikrWLavwFFUxrGtsru/v7/F3EAkGR08tK3JODrZ +s7DLNy074M9hPj/IrKrFNikx1rS4005fva+usbm8vL3JeTQdGCBWrrDiOkrCsbhVLzFQ1elG +Ply1qq3lLykv6La2xG3/vK+trrO5vsvk8zweFx5NrrFdMkO8rbRNLC9dyO09O/GxqrlGLzBS +w77BzdbIv7eurK++yttoWysZGizBrMQ+QMiurtsyLEPQ9T84S7ers+A8NztP28a4t8bQybOq +q7jO3OneSyMXGzazr2c6YbGqu0AvO9LPQzQ8y66wxU4/Pzw+Xr2utOVOy6ulrMpvyL3cOh8X +H025xkRAvaiueTc3Td5MNDt6vLbH29vnRDQ71K+uzU/hsqmuwMvAub5NLyQdIjnsbk/quKy2 +Zz0/SFRGPEnQyMvGwMJ6Ni9HwbbC79m4rbC8v7q2u8xMOjMkHiY+1XBlx66tzDo5SH1hQD9Y +z8HFw8hhQTtF18fe+M63rq+5vrazvvNKQkEwIiAsTfxM1bGruUw4SfNWOzlMzb7Iysn0S0xi +5uxRTM24t7q7ubCwv+ZfV1VFMyklKjxWT8izscFbR27xPjM5Y7671XJu3MzNak5PS1rNvrm1 +s7OussdaSufjRjInIiw9PkTHtrO/dfnUSC4xT8a+1lnhxcLO3GdNSUdazby2r66trbvpXfnW ++DwvJyMqNjU4zbKvuMnY2D8sNfLOaWTcw7W+2s/oSkdGS868ubGsrbTG3dbOc0xUOCghJS4u +LlyurLe/vslHLTJPTzdptbe7vb283DxG5Vtov7Svsri3tcpSUHxdac85JCkpIik3cbSzxLSz +bDs3NFXLP0yvseDJvcDNQT3KxFPetK+1uru4ykRKVzZxrNFZvC0WKjseKOa9rb43vaw9LtO+ +wchOy7JaP7m2UlTQw7/W4re06G2+v9PTybu+SD3DzjEYG9o3Gy+stts/3qp7K86saUDAscJU +W7ixTEC5tevvvbjBY8mww1HJt+Q4N1r9OzdBIiBaNCM9vtrMTFeuzTfPrsHSxL29+0/BsM7+ +u7jT89HBvuLfv8XdbkxHVDgzTl1DKidBPicvy8rrTc2zyUbXuszdzrzLUnu7utTKtrnqatPH +yNfCvNH/11VDTT85SlpbPC0wNDEvPVzLXX7By2tTzMfE2sW/x+ryv7/EvbjAyNHUw8va09pp +12I/UutRRmhbMy0vKis7QUVbcc7MeNC/ydbGvcTe7cnDw8W9ucPXxsbY1tbQyuBd09xJPnXi +RkNFOi4qLTI4QUlpxs1iz8nQzsa9u8PPysXN18rBxMjKzMfS/dTE5Utt50xP9Xb1+Us4Lysu +Liw749xwys/N0vfXusbZvr7J2tLKwdjjw7/P3cfD0W7qyuBMWNt9VWdrXj8sKzAsKzdP+uzf +xMjU2srExMu/usnWy8bQ3NfN09jIy8/Oz874V+XuSVzuceTbTzYsLCwrLzznzXbSusxmz7/A +xs7JvdZezr7L2tbOzubny8PK1d7My1hY0NROTNjwMSMsOiwpOc+/Yku/teJSzLi96ti4u/71 +vrzaZdjEz1p6wMHW28/ObUZQ5HZc0/QvJy8vKio37b/8Xriz3lbJuLrGzLy78lvMvtV05MjG +9lzLv8zl1L/UREjg3G/pOSIuPSMhOGXLyli5q8pMyrzEz+PEuc5bxbjLdPbQyuJX38PF0NPI +xORj2+xb+zkeKUAlIDlsyLj5v6e9PtzI7c7v/7a3b8e2y9zXX+nKYFnRz8/Gy8rH+XLc+Ghe +Jh02NB4lQ9O0vOSspMU/8cjO2VHlsrphz8HP1W5M08hTVdjMxsrh0czvaXTvz1UlITYxJSo6 +6bS2ybKqt+VXWc3IUVLGv83fbNTB6U3jydXq5tjK1GBc/Pxda9LFxOA5LC81Li0xP9a8yti+ +trvCydTGv99cdGty4lRI7M/Uz9fayMx7XltgdFxX787R8mb7dEY7Pk5cTkdDS2Dx/HDcyMPE +yc/U3PP1ZlVVXfDe39XJzNxzX23o4ejc1eFqYlpPVGN79H1jY21dTUhFS2vi9Hfy69/f4+Xv +9G5t6N/o7H/y3N/6/dvNys/S1eF1XlVUXWNk7+De4XJeZnVubWBbV09LTFFPTFRr+Ozr3s/N +2urp+vbf3d7c19PX63J8e2tt8Obg39ze3tva2uLwdmtoWk5KTUxKS0tOVVZWZevp69/u8+bk +4NfU1tXW2Nrj8evg4+/w6NnX3+7s4OHq9nd4alxbXlxYVlFSWlVQUVNVUVVo6+n58+zq5OHc +19XS1dfY2tjU1t7j5OLk6u18YF1iZGlkX2Bmam50YlpecXNiXl5fXVhUV2JsZ2dw8eXh39rb +3dXZ3trV1dfV2Nbb7Pt5aG7x8XFjbX1kX1tXWmBubWJeXF1dWVlZWl5n//Lw7evf3+Dh6enf +2NbV2Nvc3uDi5uzv/25ycl9gYF5eX2JobWtxff19bmJdZW5oZHZ+fvb9/f/9+v717evn6Pfx +7+vn4t/e5eri5/BtanBoX2VoYmZscn306ejg6u/sfGllZWdmZF9mcHl79ezv6+/7a234+378 +/v3y9XJ0fHr67PJ9+PDw8u7o5uvq4url5Ont/nh2fnhra19bXV5cWmJgXWhvcXv0+//78+nl +5Ofl3t/g4+zv6unu/ndueff07e71dm1ua2xscnx0dGtrY19ta2x0e/f3/XVvb3Tv7Ovu8e/u +6e/q4N3f7/v7fPF1aG/7fW5tZmd+8HttbXl+8X1taG1sV1d65P9n7tzW6Wnk1uD2cXZsc2Bc +bmz65uLu69zq7+vm8+zsd/zvdnPxdmv783Jtb2pjYlxQTFBWUE9TXH7o597QzMvLzc3P2N3e +3dPP1dnPycnN093zVTsvLi4uLjA6V8u/ubGtrrG6yd5YQDYzNz5HTvzIvbi4uru8ws/f6t/i +9+jOz2tRRDIsLS0sLzdIzb26sayutL3WXEo7NDY5Qlj21MG4tba6vL3B0Obe3eLd0M3Q5VdB +MisqKystN0zPvLexra20wutYSD43NjtFW/TVwrq3ub2/v8TM1Nba2NTS0dPdZEYzKyosLS0y +RNG8uLOvrrG81mJVQzg1OUFPXHXUv7m5u76+v8bQ09bZ1trW0dbuVT8xLCwtLS43TtXCu7aw +r7W/0ehdSDw5PEJITl/bxLu5urq6ur/L1eZyam5w9e71Z08/ODc4NzU4Pk5t5dPMxcLBwsXI +0eRlUkxKR0pX/drMycbDwcLHys/P0Nfg3t3o+2ddTUM+PT49PT5ARlBhe9zPycTFytDa6m9a +UE1TXWrk1NDMycnJx8jJyMvMztbe4XtbVVFLRkRFREE/Q0ZLT1JcYvnb1tXa3eDb3/P37uDg +3Nre3NjPzcvIxcbKzdHW3Oj5YVpUT0xHRUJBPj5AR0tPXW7i0M7P09TPz9bj9vh0bG5scuvY +09LRzsnIy9HU1trb3+Di7m5aTUVDQD09PkFFS1Ff7tnT0M/OztHZ8V5ZXmZpYmvn2M/Kx8jF +wsPGy8vMz9fe63ZhVUxCPjw6OTk9Q0ZMWPfWzMnLzM7Y3eV8ZmNtamJdf9jOysjFwcDCxcvR +09HU2uhpVU5MSUQ/PDs6PD9DS1d039LMzM3O0NPc9WpmbmddZO/XzsvIyMbAvsHIzNHY5fNz +bm9eTUZGQz88PDw/RkpNU2nq2tLOzdDR0t71cW5ka+/j3trPyMXEw8LGys7S1t/6cGtfXWBd +TUVIS0Q+PkFGSk5QVV332tnb1dLV2eh8a2z/6NzX1NLNyMbFxMfJyc3Z4fRvb2hcWF5maVZH +SFBNQT4/Q0hJSUpRZe7j39PNzM3Q2dzX19XRz83Mzc7P0c7P1dnb4+5xYV5cW1pbXWRpWUxM +V1lOSUdJSktLS05c+OTd1s/MzMzMztDOz9PT1dTV2/BtzMjwfNHZ6/xiZ2RWTlFYWVRQUE9a +XVdTU1lbXl5cX3b78uTa1tzf3djS0trf3Nnb5uHb49/e7O/q7/P4dXJo/fZpbGxhXVtWVltd +ZGBZWmNqXfvR5n7s3ezx+HpsZPfu5+bl9d7b6dzl4OPq6eT+XHTwaWBv7u58d29sc3VubXVq +ZF5fffD15/L/8+x+fnZofP7t/ffvemh05O31+Gv67m/u5ntrbnf18Ozc+Wt+anzx+ObqZnrX +XV/laX5yZV1vYXXhZ+7y2dDb9N3eamplb1Ra9n90fuzg091mZmlWTlHfaExpytPs9ODc6Gxa +7W9hZWb82+3+3d7Z39/u3+r4X1hiemxhY2rr42lq1ttq4uR5cmhqbGFfYmZdcelqZG717HZp +aevu8vPk3+763tLf3nV33vJ3d+v16nx0X2Z+aWhpeG9ZYO33a2r3b/5jcOX87H3o5u3gffju +/+r2aGd5dnH533ns+2Dsb2vq3Xhq7PT96n1y4eftdWv8d3xacGn5bmLqcut89u11+3x3YWDr ++2vx497z7+Xj7nXx5eT6bffmbF5nd2Fhbu77amj03vvr+3rp5vJmb/Do7P305n52X2Z6Y2p7 +7nbw/Gf47+5safr08/945uT48+jk8+7i/PpxeGlp/V7+e2V7dmRh6u548t3ueHpvdOjpb93d +cG917+7ra2D23/lmZuvodV5deHZcX2nvfXB17u7u3t/t3tv15t/o5G9vZPNtXlpq7W/7+25s +5d5j6+DvZmR88OF8bm/xf3RiaXdtf/byc2rz9HD5433w8mp45Ovw633q6Xbt9Phzbf7g9vDj +b2v263tub+1uY2JmZmbg6XVteWVp82xtdvry9Xpk8t/jeuzs7uf46998aeTj92lf4tZtbfHk +929gdvhva2ltYXplZPj2+Wp9a2xg+996/Hrl4O57697m6O7o+2zs3N5yaON6a2L763xybXlq +bF1lXGNt6f9cXl50fm1nau/Z3ezn09zb3ejo9OTc5u995fV0d2JnYGVlX2h0ZGXxZnbodP73 +alpqd3V5dujteG/g6ezx79vm+n7u+ndwaPb+e+jy+3Vq/3ltbHZrcOby9/N4cn3e6fDl3fFv +dG18YmBm+WBfaXt99/Fw++Do7+v1/W966Ozo7XP54vv8+/Z27PZ7/WjtaV9q5Hxu5+re9Wxo +cvlxbH15bWRvbvPsafjm4vh2afvxd3Tn3uja9f336+1s/vLrZ21kXGNubXfyfW985e723ul0 +Z/7/++Hh6e3o8WFgdXn2/WVffnBk3fX8fuP+dvF77X5mb3Noc/72b/ru5+j4eH507PLocH70 ++et26+7k82n49v1fZPpzaV9fa3R+8Hh4fWfr5u923d7u+1/ZXmjU6ORueGH4SFbL7W3m3evd +fWnt6G1x6lBQ6934atzczdhq9W5fY3tOTlvl22585Obf1Wfo6Vt4cldPb/Py2fJg2dT9ZO/+ +5eNdZubwYfT6U2vsZ+HP6d3N2nxsZldpY1BWa2xy8mdm7ntiXWhvX2Jf5M/W1svJxMrWzMfE +zszKzd88Kio3OTQzMTzcubW1trm5tbzyRjk4P0hQYtrKv73Av73AxMHGzsnIzF8zJyo2Ny8t +MDvft7C1uLe3tbrXPzIzPUdJWd7Jv729wsLCxcjJycjHx8dXLikzPzguLC481raws7y8tbO8 +9DwxM0FUU1Fmz728vcHP1c3HxMjKxb/C6jcqLjw/MSosNlTEsrG5vrevschHNjU9SVNVUWPO +vbe8zM/GwMHL19THv8tNMCswPzwtKC0/4L+2srS5tK603UA6PkI+PERa38i9uLvEw76+x9HP +yMPJ3z4rKDM+NSooMlDMua+tsbeyrbTfOi8zNzlAU1plyrWvtsbMvrq/zdDJyNNVNSorNDov +KSs5872xrKyvtLGvvE0vKy0xOUhi/dO5ra24xsa8uLzFyc7nTDQrKy8xLCgrOW+9rqqprK+x +tMo9KygoLDhczMfDs6mps8TEvLzDxsLMXToqJCcuMComLFO6railpquwtsRGKR8fJzh7x763 +r6mnrLvX18G7vsnU4E0uIyIoLCkmLE25qqOfoamzvt06Jh0dJTjNtLCwq6ensMlsYt3LxcLG +x9g6Ix0gKisnKUO0pJ+eoKq83E0zJR0dKV6xrKyrqKeuwmhMSVbVxL67trZPIBgcKy8lI0Oq +nZucoK7dSj0pHBkhQrqtqaWjpq/GZFBNQz5Rv6yqrbZGHBMaLi4dH8KZlpyforZGMyocFh09 +urStop2grs5MR1ZPODThqqOprrM9Fg4aNCkaJ6SSlp2fqe0wKx8XGjPHy7yhmqCwvcxNQ04+ +LTmyoKSqp6w6FQ4WJScgMqaTkpqlu0ovJBsZJEfQwq2fnaWwyk0/SEIvLE6upKSho7M5HBIS +GB8rT6mYlJeiu0ApIB4fLFPY1bOgnqrEy8dyPDIvMkq8qaGeoa/ZLhcOER4tQLeclZeesjwl +IiMjJz+/vb+toaW61sfJUTMqLD/ErqWenabDPh8QDRcoR76jmJidrUkpJScoKDjHs73PtaWp +w+LByD0pKTjasKafnZ+2RiwYDQ4eVLisnpibp+opISUqKzPOrazB8r6urrzPz+k7Kys/t6Wf +np+r/zYjEgwSMLarqJ6an7kwICItMzRPs6m1SEO3qbbZzspJLCcxyaifnp6kyTksGg8OHb2f +o6ehn6w9Ih8qP1FevauvTzFEvK+xu85TOS0rSK2fnZ+ltvo+Hg4LGM+mp6ihnqhLIh8rQ0pN +vqmtTykvu6auv8DIRisnP6yenp+ltPE7IREMFEmmpKmmoKlPIx8tUXBiwqqo1yciRKefrtPY +azEkLrScm5+osr9AIxMKDz2lpKqnoqflIx0t+9tvyKynzyclbqWjsct3SC4lM7CdnJ+mtvM7 +JRILEkemo6eopqn0Ix8x+9vlv6uo5h8f9qSistDpTC0jN6mbnZ+mt3g5IxAKFcWlpqeopqpP +Hx8732Vfya2pSxwmq5+qsMRWPysl+p6cn5+oy0gvGg0NHL2jpaqop7U5IiZC1m9hv6yxNB0v +pZ6su9lHNCgttZydoJ+p00UkEQwPJ66jpqejp84tJC5T90/+sqtdHyuvpairvWI3JCXcop6e +nqW76TIXDQwY7KuopaChsz4qLUJTQkvFscssMbisq6WtyD4kIkSvpp+bnqzUQywPBw8uvbOr +o52fyysuRlA8NU67aTFcu7CnpamxViUiM8+soJycosxM4B0HCB3JvMCtnJenNyxI4D4sMDFe +s1k+rpudqsJiPigfNaueoamqpanvGwgFE86r2cucj503KVXEPyQcLKSnODunmJ+/z7HGJBss +sqWxr6Ohp+UoGgsMJUM90aGZn8BZzMFIHx7GrU883qujrK6gn8gnICs6VMOxo5ujUjctEw8a +ITHVs6ekruPWvUUy38f7fmBZybWvo52js1MnHytC/bamqbzHxz0fFRkuJiHerLbTzrmtrMHm +v80+QU9Ox62qpZ+m5i0qKStCv7zOt6vNLSQtQTYhJca8OTl0tqu+z7Gt1TpK22pFbbGorbO1 +yDwsL0J+WV6xtUEzPWpSLy9g/D9LRVLEzMe6wsfKfU9SRE7MzMKxrbfFWTY1Rlrc0dreTllG +N0FNbsDndsnWRDbpyHXOvMbkXkNAPz5iyLa+w7r1PDxNcca79Li+Pj5OOjfNa3qz2EvFSTzD +vtLRzddCSEI/YdfH1MC5QjBKRi5dus3ZtsRAeX8yQsrJXsXByrpIdbvnvb0+wUREPjRw5b5d +1rZNOHJBOFxQxNvEYcx3Nbs+TsrKTkurZ0m1cdl4vVPCRE/ONDm7OdW1Sty8SjLcQkXNa8DK +3U7Uy0HN80S8yDrHeMlfT8PE3WDHRUc4UTnZyD212utlUjPESDux+sS/S0yvUV/gW8FaT75D +a9s/wcPVR+bJMzpoQljlUte42EjYa1DdScvK1f3nw+9e+M9x9tVOX0DDL8fBQMLPyy+8OEpW +fEjHy3a9TcFbX2DF6lXFU+Vn00fXxV1tbMxC6D9OzkntwHzn1kD45VQ8v1lwxUrYzMY7wepN +4VTXUMlOyFfJWdVc73NCwi61RerWwkvpujlNwDhNvVBezM5XwV1gzUjPRtljXthOzF3aacVh +Zt3xQlTLTcRDv2pc3k5lV9tJyk3c02DQ6dFFxEbAQuHPVr9FyEnK6nVfSMpUWF3YScRKXdze +V0/MRsVO1WPJX+nUTMhgSsdf6tZd5NT/Rr9aUupnS71AUMXfXXH4195NWclB29pAzcxTdcll +UtFI4/5a0U/ETclOy+dA4M5V2l9ezF5rZMRhd3p5Ze9SzlDRZM5I5ODtRNvJOs/fXUnV3199 +7/PNTcNYd8lTzNz+W8ZWT+fwPsTVNr16SVq2OFvBQN9QdmDa4F1s29rhR8/RUcFOabpWSOrC +WlXtftLjPMNLvT5i0WLwSebs1kTa1lpZx0bP4D7MdcdAUsN+60nOyU7OR9zFSdVNwW1JuURc +4VtkSL03wXVEykXDTs5t2ljc6FLQ1k/L2kzFVH73WfHf+kLM1kpV+sY7zFZayVNV/79Ecm/a +y0zt0r9cT9HT60Te1FjUPfG3PmdbwetG5N29QevkdL9Hb9DuR1DnRW48PshGQWZ41lXjz8rG +Y8vMxNXfvMHNy7zSy8PzwLx2KSpyMh8oSeNFNMqowTjsrso6TLa4R022ruJZs6/G2MS3w2C8 +stcoJuQtGSBYXC85vKTEPsC5zjlAuMNEfrW83cm5tcHKsrPFy7q0xz4mLzkeHTVONTrSr7Zq +x7HkMUi9SDPYt9pXybO64Lmqsb+yrsLMvMAzITQ3HR9BSy48xrfHZb62Vzlg0z4628Xg8rex +wbevsLe4srnHxLzNNi86LiAlODErOuju1cG9yOHuak9CTllM0rq/uLKztLa1s7a+wcPCw009 +QzAoKSwqLC41SvjNvL/Ew8hjX1I6UuHtvrK4uLS7uLvGu7jGzc3L0UlAPy8nLC0oLDI+Y8/I +vL3Gvb/0XGFKWNrbv7vAvrjAwr7FxsLK0M/U3fVWQDMtLCwrLjA6W9TFvLq8vLm+3mNRRk1Z +YNfM08W+ys/FwcPHysPL6tjN6kM5ODEuLjQ3Ok3ZxMHCvbzDys9jR0VLWFtr2cvKzMjKzcnH +xMXLzM/U2OZVQDs2NDY3OUBV7M3Mxr/IzNHdalRQU1FPX+ze2c7L1NfOysXEwcDH0NHR6VtG +QUM7PD9ARkxVbOj77tfY4eLyWE1KS01VcNzRzc7KxMXEwL+/w8bHy8TAzm5LPjk0MjI2PUpZ +deDc0MzP3HlXTk1PT1r+4NPKycrKycLBwLy8vcDExMXQWkE6NTIyMTI6Q1Ju+9/VzMvO0+xe +T09PU1z/2cvEwsTDv7+9u7q7vsnN0tp8STw3My8vLzE3RE9m3dPNy83Oz9t3YGBdYfbe0s3I +xsjIxr+9vLy+wsrS5fVrTz43NjMwMjY5P09139bOycbJysnWdWBeVVBb+N7QzMrJycW/v8LE +xszW6Pzu9VZBPDs3NDU6PUpr5tnOycfGyM3XfFNMST9G3NP36Ma/x9PHvL3Jz8jC0X3bydlL +Qko+NDI2PT9AUtLN1s7Jz97uX0xHR0xa+d/Vdv+5tczqu7S/4s28vtx9xrnmNzpJOSstN0BA +PVHCvtjayc3vX01IR0ZKYdrQy8bAwcTGx8TDw8PAvr/DycTDVjQzOy0mKzc/R070u7fHzL/S +WE9HPD5PVmbNxMO/xMjAwc/IvL29ury9v8jG2TcrLjEnJS47TWn7yLG1zNnQZ09MPjlJ6uzd +xb68vszXycnSx76+u7e4uLu+xEorJiopISY0VtPFxLivuNliT0JDRDk4Xb+/wr25ub/rUPzQ +zsi9uLKvtL3Bv8k3Hx8pKCMqO924s7u5tLziTTw3Q1Y+Ona9uLe7x8fD21pj3ci6tLWyr7O5 +vcdfLx8dJCUkLD/huK2tsbjD7k8+MjM8QEfXu7i2tLzO3nVZbNjJvbWxsK+zvMrT6z0nHyAi +Ji48R2TEsqyts8PpUUY/PDs6QWzIurW3vsvOy8XEx8vHvr7G1WpUVl1fW04/Ozo8PTw7Ojo/ +TVz+3NrPyMTGysfIztvlc1xWUE9g3szDvru6u7/N2dbZ3d/Z0s/lUUI7ODY1NDEyOD5GVPnZ +0snCwMLDxcvQ1+V7feLZ1NHOx8PGztfWzs3MzM7Z4eRxTkE9Ozk3OTo7Oz5KWvHb1tLOy83U +1tbjfXjj08vJysvKyszO0tTRzsvN19rfbV9iXlVLRUJHSUNAPz5ASVNXXGd0ePTd19DPzcnI +ysvNztXa2tfX1dLT1tfS1uZpX11TUllebXJmYV9dWVZSS0dEQUNIU2Ft797TzszKzdfg4NzX +z8/PztLUz9HfbmRcVldcYGN/5t7U0tjg8m5dVUxEQUFBREtVYXf77+Tf29fU1NXY2djW0c/W +3ef5+vn/+3169+be397b5PL48n52X1RTV1ldYFZQT09SVFhaWmFvfPHm3drd3d/g3uTr4drX +09LW2dre6urk5uLi8Hj37O7q6vN7bWRlXFJOSkhFSEtMTVVfaPfk3t3e4d/e29fT0dTY2dPV +2tzi7PHt5+nu6uDf5Ojl5uXn8W1dVE5JRUVERkpNU1llbG/z4Nvb297e2M/S1NTV19nY1dna +3Obr6uvu/WtpcPrs5+9zZ11aWFVQS0hFREdOWVpfafzi2NHP0dPRz9PW1tXZ3t7k5eLl6vDq +4N7j5ubq5ur9bWhgWlZPTUtLS0lJSk9VW2Rt9+vh2tjW1djX087NztTa3eXo5d/f3d3l7vLu +8vx5fnJqaXJoYV1ZVE5MSkZER0hKX3lu6ODa0sjIzc/P1eZXW93T3OfOysHGzMrCvr28vLzK +OR4aHSUtPvrUuqWeoKrBOiotMS0rLkyyoqGtyl5ZdeJ7VG+/sK2vt769tbk1Fw8SHC/Gs7Kp +nJqgtzMeHCo9SXfKvaujq8dIOz/n0VA/S9O5rKurqam3+FY0HBMVGyNNraeknp6qv0EkHCAw +Tb6rq66vs89HPzg4S+9747yxrKenrLfOPjQ4KhkTGilarKSprKanuE8qHh86wrizr6+1vHI1 +MUTm2OhPQ2O4q6ioqKy4VTA2QCgWFB4yv6elrq6lrc4vHxsnv6moqq+72lQ3LTRNzMjbVk/C +raamqa278jc3bUMgFxklPrWutrSoprVmKB0iTbGura+6vNIzKjtr18HKQj7cuq6npqyvukgs +N+w0HBkfLXetrrmwqa7GPyQeLMStra+50tTnPDFPxsPG8zo487etp6esttA8LkTNNRwZIjBY +tba9sqitzDwlHy/FsK6ts8TCxzwsO97RzuQ9Os2vqqSkrbvSOytBxDweGh8pQbu1uK+orcJB +JB0p466npq7EzNRMNzo+QF76VVTEraWfpLLcQjEtUNEzHx0oMVK9v76zqa7OOCIfL8etqqmw +t7jWOCwwOETg3/vSuaukoKm9XzkuNsvGMR4dJS1Yv766rqmwzjMfIDa7qKWrvMveRDg2Nz3u +wtPd1cewo6CsvV00MVe/SygdHSY428q8r6ursv4qHyQ3w6mlqrTAfT41NDhC7cfKzcq7rKKj +rcRGMjNtyDwlHR8mPM/Ku6+qrLRaJx8mPb2opay0wVM8PTgyPf7WysDGuqmhpa3GPjA46HYy +IBwgLGq7tbKwrbC/QSUfJUC2pKGqtc1OOjMyLzvgvba7wb2upaeuzTsuOt1fNSEdIC1yvbOy +s6ysuEgmHiE6uqWhp7biTkA5MSwzXrmts7m8sampsNw6LzzacTQgHB4q+7etrK2trbhCJh0e +LsSknqGsyVBDNy0oLUe5qauvt7Wtq67LOy02WU0vIR0cKuexqaesr668PycdHSvGpZ2erNHo +YzgtKCg4u6upqbC3sK642UMwMjg1KyQgITDfsaalqa631jwqISEsbqyfnaW0zUozKScpNset +pqWprrG1wWs5LSsrKyorKSs90rOopqyzwFE3LCYmL+qwop6lsclFLiopKz7HsKahpKmuueBL +OisjISElLTlK2bywqaitu182KyorL0TPsqeipK3FQC0pKjRQw66noqKlq7piOSsfHBweJjfx +v7aurKusstU9LScoLjpXwa6ln6Gt0DgpKC082LWrpqGhpq7IPikcGBkdJTfUu6+oqaqst/48 +LygoLDJGzbSnn6CpuU8vKiouRMexp6Gho6m44jMbExQZID6/tqukpKSltU0yKSMmLC857rKl +np6ovGA6MTIyN2O4qaKhpq2xvT0cEREVHkS8taujoqChsUovKSMlLCsufK6lnp6qvMlaOjg1 +MUm4q6emqrCytVsdEBQYHUO+2Lain6CgrEkwNCskKScoTq2jpaasu72/TjIxOVa6rK22tbCy +tLwyFxEZIjLfxMm0pJ6jr848MDk3KiQpRL+tqKu1trO67T04PGG8srm/wb28vsT4OyUbHSkw +OUjevLWsqLHNe2pMOTxURj9rxry2sbTH9vt2a3HtysLGxMTcTktbV01n3kApKTtKPDQ9YuHN +vLjKUHa2sc1OWtPIwr3JTjs/7sreaNy6r7jKz1M6PkxMRUhoztROPUJGPDU2P1dv9N7QyMnJ +w726u7+/xmQ/O0Fs5lrav7zAv8VnSlVXTkxKSU9aaf1fTktKSk9VVVrz0cva9NfGw8fWflpS +TUdGR0/uxr7Bx8nM1dnedmZnZ+7c/FpUVVJLREhOVnHe297h59vMxsneXVRRUFJMRUdT2r++ +x9DY2+Pr8WZYY+nb1tXqWUxJS0ZCSFvXyMnZ9evXzM3Y8mhmXFFVVVFae9vOz9DY5vh8em5t +/u3z6eDi5V9RSz8+Uupy/tbOz87N0+z/3df5W15gX2fj+GXq9Hjc1fNbZv3r7V5benlpb87Z +SUF921Jd537g2uDg3e956WJv8nxg8tzg7OzxcXFu4NhpS9nBVUjKyU1fzlpIblhFYnlZ7dTv +7d7x79bT8+vm7vTsZm1dStbDZFnKzFFs215XYlFN1dVXX+RhYudfVXZoUd/UYeTS9v3S2/Te +8HR52uly3N1e3PVYduJadu1Xc+ViXOliXvVwaGJlXG1pU2Pp3V3n0fLg3N774/n32vnb1fD4 +4G9fcd/0ZXNsYWjd6OjtZv5oVlJeXmRsZXHodG7v7uvo5fHudWBi53Lq3uXc1vVy5Ontbvj5 ++2Pv83F48PBfYWBgXVtxZF7k62vk1vff2/z83n5r8uJpaOj1ZV/tcPpyaXFme3f63dp8e+L8 +/WZSWW1hfPPp7uPv2+t6fu5qeN1rZndnY+t27enwfvf3a15jb2r42Nnj3tXbdHBrWmL4YFp0 +8/T64eNxdntmX2tjamBs+vP65eDg5On6aGv1+Wxx9Ozn5+Xn/X5tYV1eZ2Vmanvq7t/f5+zn ++nrq6/r8/W13+Pr77+92/nFlZF1eYmz24+Hf6HhsY1xcY2hw+ubm5ODp93d88etyYfvg4OT2 +3+D4a3JtZGp1/G5raHnt4uDi6XpfWF9dWGL95O583Nxz+PpqbmtmcnJv6+3v4tra6nnr7mtm +9XJlbft8/OLz8uh1amxpZWlqZ/707+vr7v55a3J2cmxr7+/n3N/o8nZtd3/ud3BzaWNxdnX2 +fXz8+HNtfnD45e7z7ff0eGR88evq7O/7e/tvaHpuaW1z//7wf33w7ers6+x7bv/1c21sb291 +/3Vv++p8dX5rdO/ta3P2dHd9f3n3f33p7uzr+P9te/jy6+vn9f92+255e21senVoenh2fff0 +6uz4/mxreHl9/X/8emdzbmppbvv77e/y8e3t6uzq6Oz4fnlsevP5eHJ0ePH1+vZuZGxzbfHq ++Pbz+3l2d3FudXl7fPn6++/s8+/xfXd0cXh0fPn9/fN7a296env3/nf57Ofy/vP59+jk7vlv +YWR3/e30ePjufHfw+Hr9+X5uY2FwdW1qbnn3/Hv9fHb47u7x7urq6enl9vv1e2xseHh4dv71 +8/j78PD9fP97/vV0bm5tanl5bmZeXWRrZ2p6++3u7u/x7Ovr6+Tr7Ofq6erl4uff3uHj3+Pd +3N/odltOTU5JRENFRkxRWXbj29XOzc3S1Nzu4uDm3uPu5+Lf3dbMys7Oz9nZ3OTd411LQj88 +ODU3PENIVO7OyMbAvb3CzvNobl5NTlhdbHb01MrGw8G+vsHGx83e2tFoRT45NDEuLjM6Pkt1 +yby6t7Oyt73K6VhEPz89P0ZPa9nNwLm4trS0usHI0NjiVTw2MiwrLCsuNjxS0b+3sK+trbG4 +wNxOPTg4NDQ6Q1Lyzb21srCurrK5vsbUflQ+MS0sKSgoKzA3Qu/BurKtq6qssrbBakU+ODEu +MjtBSHTEurWvrKuus7O5x95kRDYtKigmJSctMjxX0r2zrqupqq2vuc5WRz0yLi81NjlK3cS8 +s6yrrKytsrzEymY9MywoJiQkJyovPlHYvbStqqmpq663xeNUPDQyMC8yOUZe2L6zr6yqq62x +t7zOUD8zKicmIyMmKi86TM68ta2qqamqrLK9yvFGOjYzLy81PUVxxbu0rqytrrCzus9eSTQs +KycjJCgrLzhL4Ma1rayqqaqts7zK9Uw+ODIwMjc9R/zJv7evrq2trrO/yug9MC4pJCQmKCow +P1LmvbGurKmqq66yus9uTzw1NDQ0OD9SdM+8trOura+zuL3tPzoxKSYmJiYqMTtC6ry2r6qo +qqqrsLrA1E4+OjYxMjk8P1nVyL21sLCwsbe+4U5BNSspKSYnKzA3QurFu7Crq6yprLS5vdtT +S0A4NDY4OUNd7M++t7Oxr7O4vtlbRjctKykoKSwwNj9e2MC3sK6tq62ytLrO9FxHPTs8OztG +VmPWwr66trK1ubzPYk49MS4sKyosLzQ9UfHKvLaxrq2usrW5x9ftT0NAPzw+SE5W4MnFvLe1 +uLq9z2tQPjMvLiwsLTA0PEph1L+4tLCvr7O0t8PN2F9OSkU+P0lOVOfNy766u7u8v9JjWEQ0 +MS8rKy0wMztJWOG/urexr6+ysrW/xcpzTk1LQ0NNUVD60tPIvb2/vcDXZ1NANTEwLSwvMTQ7 +R1Pxxbu5tbCxsrG0vcfL6ldVTUJDTE5OaNfRzL6+v7y7xexfSzk0NC4sLjAwNT9KWNG/vbix +sbOzs7zExNdfXlVHRUtOTmXf3c+/vb+8vcjjbU09NzQvLC4vMDc/S1jawb25sbG0sbS7vsnc +f11RSEdLSkxcZejPyMHBvr7ByuNfTD43MC4tLjE1OUFPbM7Bu7e0srK0uLvC1O9oT0tJRkhL +WmZ+1srEvLq7vb/G71hLOjQzLy0uLzI2P01X1L+9uLS0tLa3vcfL2G9fV0xJTFRcbN/PysS+ +vby+w8nrVkc6NTEuLS8wMjlDT2XPv724tLO0tbm+yNPpYFROS0lMTlZr6NLKwry8vLzDyNdR +ST41My8uLy80OTxIXeHDvbq1tba2ubvBzNb9V1BOTkxQX2/u1svIwL7AwMDL0X1KQDczMS4u +MDA1O0JV+su8uraxsrK2u77K1+hjU01ISUtRXHvbz8vGwsC/vsXN11ZKQTY1My4vMDM5Pk1q +48a8ura1t7a4vMPQ4GtVTUtLTVNdcOzazsbDv7/Cw8jT2l1JQjg1MS4wMTM6PUn/2sO6ure0 +tbe8wcjZ6v1eVVJMS05VZ+fUysfEvr/Dw8nP3lFEPjc1MS4vMDU8QlHu0L+5uLOytbi9wMrd +7l5NSkZER0tWc+bVysW/vLy/v8fO2lFBPDMwLy4vMDU8QE7pzLy3trKwsrW5wM3fa1ZJQUJC +RkxQaN/Qxb+/u7q7ucHR2Ew7PTItLiwsLTE6QEzVxLyxr6+ur7K3v8vdVkhFOzo8PUVPZ93O +wrq7ubS4u7vJ2Gw9OjgrKiwqKy82PUnsv7iwqqusrK62v8xsQz86MTI1NTtIXNfEvLOys7Cy +uLu81FtVPDAyKyYqKSowN0ndybatrammqqyvus9WQDcuLS0rLjg/YMi9tK6sqqyvsbvF0G1J +PDkvKCopJyktMztPz7mxrKemp6mss8Z1PzAtKicqLS8+X8y2rqunp6mqr7nD21lGODE0LyUp +LicrOD9N172vrKympauvtspUOy4qJiYoKTJHcbyvrKakpqaqs73PXEY+OjMwNzAoLzYtMkNa +4Mm5rKyuq6uzwNtNOi8pKSopLTxL3rmvqqampqiwuL/tTUI8Ojg5PkM2Ljk4LzU/WPPTvK2t +sK2tuMxpPzUtJyktLDZl07qtq6emq6ytvtl6Rzs6O0NPSErnTzQ6Oy8xOEXuzMGvq6+ws7zX +RjEtKycpLzhFzbSuqKanp6y4wtRLPjs6PkRM3cDN7NdKMS8sKy41P9C4sKqnqa+97j8vJyQl +Ki4927mqpqelpq+80k9DPDQ2Q1Nnzbu3tLrLXjMnIyQmKjrVsaqmo6Oqvk80KSMgIio7/byt +o6Clqq+/Xj41Mjk/RVrMu7ezr7G4xkwzKiAeIyoxT7ipoqOnrLpXLyYiIyYuSMKup6amqK/E +XEA5Nzc6Us3Cvru3t7zBxM/xUTwvKiUlLDM/2LatrKyyu9tCMi0tMTxRzrWtra+7ztRYPD9I +T33f7cm5vMnIwsPDz9/Q3Uk7LyclKSwyTcezq6qttMBfOS8uMDtS172vrbC7zltYRjo+Ve3W +zs29trzHy8bGyczVz+RFNSwjHyctNFu8rqinr7rJSjEsLTFH1r+0rKy2ylxGSUJASunJwsTK +wLq7xtHRys3u++XzWDcoIyInLTZTvKunqK66z0w1LS44T9G9s66uuN1FQUU/RFPvxLzFyr+6 +vMXT3dvqfGz6ztg+LighIywxRryrp6asudNFLyorMErLurKtrbLPPDU7Q0pi0762t8POwr3E +5lhPb+xm3L262DwrIx8kKjL0r6ejprDCYTgrKCw59r61r6yvv1E5OERbXejJv72+zM6/vsz5 +VFTp5P7IuLzZOicgHyMqON6upaSottNFMSoqMErIs62srLPOPjI4Q1/g0MG5vMfN0MTC2VtO +Tlhe9MW1tPAvJyEeIyo1y6umpam1zU40LC46abyxra2xw1k9MTdQcdLEw7+8ydnNx8LVTkFL +XG/Kta+9Si0jHBsjLUy0p6KgqLvsOSwqLj3VtquprLjYTTQvN0vOvbu/vcPMfmzf0OFYS0h+ +z8O2r8JCKh0ZHCUv0ayhnJ6qxUgtKSktPsSuqKeuvd5CLiw2Tsi6v8K8xdzqZ+TL2k9HTt7D +u7Kvwj0oHhocJjXMqqCen6rLPyslJy5GvauoqK/FTzkwMz1M0rq9wMTT2M3j3sroUk9U8MO4 +rq7KPCYeGhwmOcSonp6grd85KSUnMVS5qqapss0/Mi4tNEvDtbW5v8fL1H3cz9huTUznv7Wu +rcgyIx8bGyg4wqSen6OwVDopJCo74bGoqau0djguLDI/3bu1t7/N7Gpp3c/Hz19QVv7Gtq+v +xTUlIB0dKTzDpp6hprVONionKz3es6qrrrxVOTIuM0vZv7K2vsTdbtvW2MTPZG1s5sG2sa/H +OCIcGhspPb+lnZ6iskQvJiUqPdWupqisu1E1Li0zSsq4srrGz+P049PIvsdnTE/qw7extdMy +JB4aHStJuKSfoaa6Qy8nJi5Ey66prK/DTzsyMDhF27azucHR29Ha4snD0mpMS9O4tbW48jEj +GhYeL2+soZ+eo8U8KSInM0zAq6iortQ8MCwtQ9y/srXBzN5f7M/IubvdT0lL47+5sbRnLiMc +GSAuVK6joKCozkEuJys0TMKtq6yy1Ek6MTNN1r+2vcvP6l3a0Ma8zV9JQ0zVvrOvvV8wIx0b +Hy/qraKgo6vFRC0oKzVWvq+trrXdQTMvOV7NvbvBxtH5edrMv73J51RGTfPOuq+3zVgsHxwb +JD3ErKKiprBrNSspLj/4va+us77yPjY7TPrLw8PDy9zSx767w9xoTkVJXMy3tbi/fUo9KBkY +Ijy/rq6sp67dOy0uQ//Ovbi3ucxNREhKb+Pdxst/eezXvbq+wNJYRTs9ZcC1sbrqWUs1MTs5 +JyU3XL287N29xNf+SGLJy9b4VGfbb+zDvb3C5FZYTlHvy7y4vcjXXEQ/RmnHw8/5Y0pAPjpJ +1b23bCUlKS5LWd2upq63+DxDPjtKzLmvtcbIy99tXF7Y0WxUUnTLxczS23VdUE5ZU0dNZtzO +3tTK4+rtPy4sLTlPYOG/tr9jRURQ1Nb11MbAwNLjxLq4u89wXk9LV+DGvsbhX09HRUpPTVRe +WmJn6+L3WVBqZFdPTUlLSVLb2djZfGfubV5uevng1tPIvr2/zNx7ZG1taXfr3tTfcGVofe39 +Y1NNXHJdTU9q3d91cufZ51dTWFZbTUtc69nX5ejoZlJIT/vb0MjHytPxYm1uXV1v18bH1+Db +2d5tXWhpa3n/5t3zXVZaYvzyZ1ZNSkpNTVf50cbJ1/prX1NGRlPozs3P2/NoY27p2tzZ0c/Y ++W9w9Ov569va5v1tdPl7bvfi3vZdU1ZcVk9RXv/u6uHgfV5aU1hgW1ht697V2tnZ3+fm5enw +dHD87N/d2trpdGlvbWxu/vDo5e34dHZtYWh67+9zamZ27uvu6vD2bVdUVVNabXF95+Ho9H1s +aHnx9+zj3tbW3u3t7fT+fn10fO/4dPDg4en0b2ZhW1ldZXvo6PH+/vjtc15bYm387+nm7vT7 +a2RpZF5aXnfp3NfV2d7l7G5iX2Nx7ujr6Obm6XtyaV5eZnPu5ufn5el+bXJ+/ndqZWNvcnzz ++Pbq8WtiX2Jocfbs5uDi8nFoaG1xc/rq5+ru6e7r5u53b2xmbvzu5uLo6Ofr+Hp0d3V6/355 +b2Rja2plZ2pqefHu+Pbs9/zy+ff09fn6ffHu7fVucP76+fP9c3Jxdfrq7O3s9vHx/25ueG9w ++/n2+H5rbv//+/j09vV5dnN4fXv77+rl6f5ybnBnZ3J8e/Xj3t3f5/TyfmhgZ21sbXRub3Ju ++/h+cW54+Ors6+no73L8fHBubm187+35fvn++Pjy8/NubHBz/ezn4d7m+XJvbWtqb3vs6O7t +8nx8a2huZWJdXmp3+fH8/3n+8PJ8+ujq8evk6PT7fnN9/vzl5fL17fD26fVzcmZeXmhscv16 +efXx8fXr6/X5env77+3+evx7aF5jYWFkZ2/79Ovt+ubl9vZz+OTp5uPj5/Du9Xl0b3Z2eHBv +fn11aWd1+v1++P3+9/t8/P96a2Nmbfbr9/X07e3v8/P9dmtpbn//dPPs8ezp7+9+d/L2fG98 +eP55dvh/dXxtbWx76/V7/HF48/z38Pn27fH7+fb8dHZraX32++fm8nVycWdocWpeZm177P50 +9vDq7P/08Pnn7eni6Oru+H34+ezo8nxnZ3f2dXJsZF5YXWlvePfn4+Tr8O7v7+z1fHVucf7w +fvx9++91bnn9cW135uLo7np5/XVsefl5en12fPhubvbx8O757en7e3V+9WxrbXZ5ZmtqbO3k +6ebq7vl++Ht7+35yZml3fvN0a/Xn6vTx9nn1/Wz8+2x97H7r4X1vcG1vaW7s7fl2d3psaWVo +ZmRqcXv68PHt4uHk6nN88e36fOvo/WdgcPj68e7s6XtvdHBud/lzZXf8e+rrffnx9unq+3J4 +c3tqaXFqbmxpcO7t+/99fX93dvjwcnXv9fL86+Hn4/l2+X16bWn26fr79+rtamdqcv1tav16 +cG1oc/T8++39cerofO/i7Pl+c29ybvvreX5xcnpobnF8+PXv7+98fXZu7+v7ffbq6/Nvcez8 +f357dWZ5+fr2cfTg7WFg/XlvZGxrdPZvbu7u8ud08eL37t/t6Xtn7PVu+2Vn7GhaXmR87O7l +9Pvm7/L39+t8Y3L5cvh7bu3m9XZldvlxcV5daG9s9vbj23Fu9u/z+fvo4+V7bOXi8u778etw +Y2xoYWJhdv7/d23082h4a2jr7/v78ent6/14735k6et0fGlu7/hv+fHw92l47PJ1bvLqdHF3 +9f18/Hd7/PNpfN/4avt8evFhW3R2a3fz3OXsfOrc7HJseezuY2H7+Phxeebtb2b76mpmafjn +cGFv+fp+afvxcGxu/eHfb2fo7GRs9Xvl4f/55uv3cvtt9edreO35YGvh19t7a+rofGxhd21b +XF9db/x8+G1kde99cnf/6v1kb+Dk5uXu3tn3d+/08+/wcfrp7/nodWNucm/x/Vhi/G1ncm5p +7epnfm1s5O5ud3b249748+L5fv1dZO59be9x/+X4dfBwb+TrbG11bXZiY+zo9npoXFxs//Tn +5ebc9Gh+4djV7W716f333OLj6ldWYF1fXWTz6m5ha/tnYlxh+/7r3N99821gb2p98erc1dbX +zMnX9fvs5Nrg5dnia1ZJTVdXVmvh7WJXVVNXV2R96eZrWvPtan3r6djX5tfL13ze2NTbX2Ln +719aaOjm9/t3YmNtaXHm4ePW2ONzcW54e2lsXFpdW191b3hxeXNYYP51fGZj6P5lbvfvXE5b +7d3c2Nff7Oz14NfX4G9s73t2+fXX3l5dX3NeVGhubWZfa+zn+V9hamJt8vzv5vZ77f9z+nl1 ++HFs+XBn9uXt7fBufPb29Wl96+t1ft7n5O7u29/pd3Lw92VdfHFaWFto83dq/P7vdmB54OHr +7ene5PXp/2tvbfbj5e3v395vbfFtdWthbmRmbv3r5+v5fmlpe/nv9f/zfvLu5uPr5u7t+O/q +7+jpc2lucnv1dmN/+m9qX2ZfW1tlam588+jq7vHf3eDg49zS2eTd6vjvenz6ZF9uY1xgX2B5 +b1tmfn/88eXj6/Ty9G1eVltgYmhsend7dfjq8H3y3tfV2t3p8edxa+z0eX1v++br6+P5/XFj +a3vr5u73fvtzW1VZVFRhZmzu5vl0cW5wa11e/+7v6ebc3unse+/e3d/d5PTu6+fo5eXq7/9j +X2ptZV5daWpdXmh1fPbs7Ox8cPnk5vFrbnZ0/vHg3Nzf5OTi7Hp3bGJga/30fGVhaHby5+3p +5fl0bXj0/3BxfHX85ufq6Orr5fX/7PNzb29sffhqaWlscG1sb3J3dWxpduzs7fz87ePl6+fq +9H9zfPtobXl9/3JqbGVdWFhiXlxfanlubPvh3t/d3t3Z3/Lq6n5vdOz2bGZuevZybu3xdnr+ +bWhyam90c/vtfGNp/vBnYXZ8dndu/OXo/Pnr7u30/Xl18/1td3r44+//+f7s92pjZvz0dWFu +c2xpb3r95OPw9ubq8Xxy7n199PHl59zd5uTyeG52fmtpfuv5fPT5b2pqZXJuW15nY2798PX8 +d2VgaXByfvvy7fT+dv368+fo5ep8cvhv8Ojp3OLy9+Dl9Ozh3uv1+Obtem9qb2hfYWxpZWts +ZnJkaXppZWvx6vdsb3bs5nHv2d7ufnDs6nVtbvD9Z2Ry/XD//n389n7y7WJt3+h8bHHl2eTo +5enf+2d24+d7evf7/n9odv5nWmRqW15ecftuXXfvdGpfY2/+avvs5eb28+zh3OLi5ur8e/H7 +/mNo+fn8/+rn5/N49+5tbf7w7vDk5fNxbv7t+29maGxlbG5z/31zb2lf+vducmdu+XZpbHJz +dGtwfHDu7ujf6Ozk4ux+fPDvb2pqbnzy/vn9enf/7fl7/Op4bvHt5uR7b3t0aF5eZ25vdnv5 +7e9uZ+33a3Fta2xbVnP5Yn3xdXRlZO/tY2z8dvp6a3h3aWx9dvnm8/rr6vX18fLl6evj3t3s +5ubw9Oz5+e13+Pz0+nhwcnduc19ebm9kaGJr7vj75+bu5vbw7HRoZF1hZV9eanhvdX3p4vp3 +7d7c7O/f3uLh3eLo4+Tj4u7+5ed6amRrbnNtbXJvcnB38vHu6ejm6fd4e3Nu/vt2dG5fYWNi +YHjx/Xtyb3L07e3m5uv0e399bnl2aW5tfHzy8/nk4uPe5ern+P3v6erwcv7w7+z/bm/3/3l5 +e/H4ZGZvbnV1a2duff736u72b21zcHpyb3dxZGVufn50ev7y59/f5OXs/f/xd21sZm17fvX3 +eXr38e/27OLm4O34/v70/PDr+/j3cmtqbnBqZm1+/W9wbmlqYWh1b3t1bnF5b2ludXf77e7r +6fXy6unv8fD8eG94/f5y+3lxbGp98/H9+H3/7uvt+PH4ev9ybnv+8PT3/HZ7cn779O/6ef15 +eHFlX19fY25vb2xxdfn3+u7v8XZpcXd6+fn+d/l5dPbo5unf39/e3+jt7/x2f3lqcnVzeXN3 +b2ZfYmzx4fdx/XRqbWhibfv9+PHr7vjz+e7yeXz8/fzp7XhycnZ2c25tcu/ye/Ly9frze3j3 ++Ozr6uno6u/u9f3w7vd0bmxkZmxvb2ppbnV59vd4ev72fH74/3xwc3N69vL/b252/Xh6fP75 +7u97fHz48Ozp7vL9cH3u7OXj6vvz9vLt+H1ud3l3b2RqbWhqbGxvbWhwb331f3VxeXt99Pd6 +e/T5+PXz4uLt6+ft7+32cXR8/f11ePV4am1vbn705+L0d+7q7Orz+/Zyam988PX28vx3evpy +cG5vd3n3eGt+9PD4+Hh+dWp0eGlja236+v3v9vz9bfzr9O/yfPrt9nl8dnjs6ers7e/z9e7w +ffX7c21tbnF0bnn+cWt5cWxxcXv5/vvr8fH0/3307/f39Pr4cXN4c294/3h7cv36/fd8fH12 +bGlnbHN88O/u8Pl+/Pb7+fV1cPvr5Ofm6Ofo8npxZ2VraG31/XZ0fXb46O77/e/o6e/8fH73 +9H7z7n58e2xpa2tqa3NvdG5neO3r7Orx9PX09nR69Pbz9PHr6urv9+ztfvz4em10fXJubW9+ +fnz38/54dn368+bl6er4+/5ufX12b2hsb21vbWxvf+33/vfz9/P7/vl4bnt/dnr18/Ho6u3x +9ntxcG91dHb7fWtobHr89PDv6/j8929pbXl5fPbx8evv/nr38fbz9vP19Hp193hsZ2lnYWVn +a21ydXJ2d/nv9vf17vb+7ur9enxy++3y9vX0/PP2e3F5eG5qbXd4b2VoaWpz9Ozy59/o8ff6 +fX36++3r/nzw9Pv1b2ZhZ2lwa2x4ffb7fu/x/v5vZXX19Gxq7+/59Pr+8evu+vl4e3x2bW71 +7vP17O3s6ujr8e/u6/Vw/u59cm9raHn3e3V0cnV++vf7eXlvanF57uzy/fHw7PhvfO3q7u74 +/nX+9Xd1+/H6eXp2f37y/Pt8dfX8cWxpbfz59e7r5ODh4eLr7ut8bHB0cWdeWl5na2138/L0 +6Ov48O7z+PZ2enl4/fT1cHBucWtrbnJ7d3Fy/PTw6uzr6ubs+u7u7O/v9XZ8d3Bvanp2eG5k +aGxsfe18aW5vdHBlaGRt8+78cHV99urm3tfV19ba4etvZGdlX1pXW15hX1haXWJlZG/z4Nzc +7f3u+P/78+ja29/j5t7Y0tLa9mtwd/xtYV1cWE9JQTw/U3LVyc7My9J/Z1pXbfnl3Nzb2+tn +XmpwcHts/vHt5vD38+zo7OXe4eXV3ODf+PP4aVRVTUM/Pk5z3dHe39jeb1xPTV7263hu+dPN +z9fc2NTY7PTq1srIyMzY4fRZUlhOOy8rMEjRvsG/v7/KbEc9SGPd09LLx8bYUEVFSlj+2MzG +yM7U3t/e3+fu7Ozb1tfMy9t9X0g4KyUuQue8u7y6vdBdRDxN/tzMysvL3FlPSk/jysfJzt3g +6fzk08nGytb9XftcUtbP1vE5JyQqONC5u7W0usVdOjc+Vc7CxcC/0llBOT1gycDAxtHP2HVj +7s/JzNz/e+DS19DFzthRLSMfKka/srW1urzaQjY0QfDBvb2+xuBOPThG38a/wsrN1Hxke9HF +xMvZ6OrV4XPQ2dp/NiofHi51tq6vtba9YD40NU3LwL6/x8z3Rjo9Wcu9v8zW4vRzfN3HwMPN +9l9m9NfPxL7MTy8kHR8verCrrrC1zUs7MTdN0r23vMbZSzw7QFfJurzA2V9dZ+vKvLm9yehn +ZFlv1MrG1UQtIxwfNs+vq6+2udBLPTM6fcS7usTbdkg/QE/SvLW9zPFTUVjvy7y6v877XFVW +d9jHw85RMSUcHi/ur6uvtbrMVkE5PXbEu7zM5l9GQD5K0L24vM/8ZFtj1MO6ucr+WktV99nH +vcDIfDQkHB0t6LKtsri7yFQ/Nztqwru+y+RvSkI+P+C/ubvN8nByfs++t7XB2VtMUmZ94snJ +ydg3JBwcLGm0ra+1u8hWPTU5WsS5usHT2etMPkFcxr3E0HJeXu/Vx7y7wM34WVV43szByc7X +RiwhGx412q6rr7e6wGlIOTxsx8XG0tbI01hERWDKxc7f83393tfKwcLJ4VlOZdHEwL2/z9pC +Kx8ZHjLLrKuyuLjE+kI1O/nFwsfZzsPPUDw+YsjEyNDUzM/Oy8fCxNRbSk3nysG6vsnYTjMk +HRoiPMisrLCyutFPPTdK3ci/vr67v/JKPT1g1srFy83V2tvYz8rJ31BCSHbNvrm5v9JaNyYc +GSI8vKeprrG5zVk7MT5ty768wb/HdkU2NkvRwr7J1Nbe3NnPzc/bYFV+zLy5vsHJ2vs1IhoY +JUqxp6msrrTSRTAsOWrKvry+u8daOjA5cb+4vcfL3Gtga9vKzOVgVufCure3vMTNXjQjGhYd +NMWnpqmrsslTOjA7bcq7ur/C0kg1LzVuvre2vcna7Obg2tDN3FlRZ+LOwLu4uMB8NyEXFSBA +r6Omqq+8/T0tLD/Ks66zu8TuPi8uOt27ucDR2u7l2M/BvcTZVExq2se9u7vA+kQtHhcYJ1ur +oqeqscFmPC0vR8q3sra6vn46MDFEybq5wtbd7f/pz8K+x/lOTGLY09G/vMTWPioeFx4xyqak +p6u13j8wKzRXx7ezubq/eT8wNFq/t7vTYFxcWWfbx7/G2eTazb+9vre2w1gwHxUVHzyuo6ep +rbvqQi8uPuC8s7e8vdBTNi44csC/1GFm7NzTyL67vcz8X+/Jv7u3u8HLQykfFxcmQrWmqauu +vXpGNjE/37+1ucTF4kg3NU3KuLnL+u/o2c3KwL/G7FJNUPPNxb68v89CKx0XHS7GpqSorLXP +SzYtMUfSvLrBw8d7RzI32Lqxtsv03dzo1dTKwtpMQUJYzL28ubzLVy8iGxsoRremp6isvndA +MS85TdfEwcbHz15CO0PUt7W82mby5N3SysK+yO9XWt7Jx769y9tFLB8WGCZDrqWoqq662E04 +NkfYvrW4vb3YSjsyLkbIwbzPUXLV3NDO18zK4W/jzLuztbe71UYsHhUYJ0iso6eqsMZYOy0s +PHbCtbi+wuBNPjc87r+5vczd3s/GxcTFzNldSk/fwLi5v8TWPiwhGRklPLmlp6quvnhGNDJA +dcW2tbvDeUU9Oz5Xyr68xORgad3QxsLGzeRhfc3JwLq7vs4+Kh4WGilTqaGmqbLLVjksL0De +ua+zvMpeQjw0PdC+uL1pVVxu4dDLxb/LXEtL9L+1s7e/XzQlGhcfMr2io6aruN5GMCsxUMCv +rra920Q5MjBBxbOwudpdX/vZ1MrDvspcRErhx726v9JELB4XGSdSrKGkqK+/ajouLjvUta2u +u8lkPzcxOVDLuLnG4V9j3s7Kx8TB1WVYVt69tLS20zkoHRccLfiooKaqttpJNCssO+u4rrO9 +zlVAOTY/+sG1usnsWPTOycnIxcXtUUhLz7qwrr5OLyUeGx4v0aefpK29a0I4LzE+1rausLzP +XUU8OTtK5r65wM1pXfDYzMnKy+Brb3HVwri0uu4vIhsXHzPQp6Omp7DMSjMsMEXLta2vucNR +OTU0QuLLv73L3G9efdvMycrP3/zv1cm9t7W5dC8mHhkcKUysn6OotNJNPC8uOFy9ra24x1o9 +Ojg/5L20tcDkU1Zp2crNztTfc2Bd6Lu0trxgNCogGx0pVa2ipKq43FI8MTE937atrrvSUzw3 +Nz95w7u2vdb9UGHj08/T2dXlbPXevrW1u903KCAbHi1hraOmqrbpRjUuMEHQtq6uudNKNTQ4 +RXzHubq/02NVZefPzNPb39fZ3dXDuLe6xkMrIhscKUm1pKass9BNOS4uO+25rq661lQ7NTY3 +S8m4srnO9/p94c/KxcbN42v96c68uLzLSC8nHhshNsWopKmwxlc9MzA6Yb2vrbPJXD02Nz1U +0cLCvcDY6lte18zLz+Po4+Hb1b22ur9gOS0kHx4nRbampKy86UI6NTVA37qwr7ztSDs5PUn3 +zMa6usfPcGXZzMnL4uHV3N/n3cfDxNRNOS0oIiAoSbqmpa+8+UVAPTtJ7b2xsr12Qj4/SW5u +6b+7vsZgU3fjx8fU3eDd3u3d0MjDy/NQOC0sJyYnO8qtqK++9FNNW1Ba78a4t8H2SEFHT2np +xry+yPVSS1Fi0sjEwcnaYl/21cnJ0+ZNMzAtKy8qOMmzqa3IaU5LaltY/9G7usbjR0FOVWH8 +fM69w8rhTFdz5MnExsXQ5+Lu3tPMxvRKODEwLi0oL+a3qqzA4XpfZVBETeW+vMbbU09ZVlRW +bdnGw8bL4/394cvJzNDY7d7d3tfb293+SjouKi0qLUrRta60vcbdfllNTljTyMfE1vL3WVFP +T3HMys3Q/2Rja9rMx8vN0tvmW2Tnzr7G4kcvKykkKT3lsKuusbvQbkc7PUfvzMLDzdnvWEtI +TVVNXGvJvcrLzsjBx+l349TP1NXSxb7JUzgtKiwqJTD6tqquu77H21o+OkR2zMrJzszJ71BK +PkTq0MvHzMzH0OLV0M/R1tXS0tvZ2dbPUjwxKCglKDzZt62usrXC7kg7PERh38vAwcHKa1JR +TU1RedbKyMzT09TY6Gxv6NLR29rQzMLB10s3LyghJTBet6+vra60yU02MjlHWd3IvLrAzOpe +ST08Q17OxMC/wcHK3GVWXHndz8rFv8THxHc9MCcfHis+zLSvq6mtvmg7Njc5P1jOvLe6wcra +aUs9PlPdzs3Qyb6/zmZVXWhfatvYyMDJxsl4TDEoIiAtO9W5saqoq7XORzs0NzhD9MK6ubzE +1WxJOjs+Tn7Vx765vMXealZTUl7fzr+7vLnKWU40KiAdKknJuLSup6m1+DkzNDc2O2y+s7K7 +wcXWTzgzOEju2sa4sbTA425TSkZHeMS8vLu+wMhMLSYeHSw6aLqvqKOot9BGNy8tLTvsvrOw +tLW85kc3MDdETty9s66zwdhpSkVCR27HvL26uL/LRywjHR4rO+67rqeiqLLKSTUtLC08fsK0 +sbCwuM9ENC8uOUr+urCusLnL/Eg/PERkzb67s7a70kAuJB0eKjjpva+ooqaxyUc2LisrN0/L +ta+urbPJWzkvMTU9asm3rq60vc9WRT09VNrSvre6vtVLOCkeHSk0T8q6qaCjrLjvSDUrJyw6 +Wsi7sKqttcdIOzczMzthw7Szs7S7y19DRk1MWdjIwL3Lb0MwJiQpLTpNzbGopqesuMtONSwr +LTVDZL2uq621vdFOOzIyPUv8zb+6ubzH1+Hh+frt2djbeE48LigsMTM6TNG3rKysrrK84z82 +MTEzNT7lvrmzs7S5zF1IRENHSVXoz8jCyMjEzNbS1+9jV0o+NSsqMTY5P07cubCwra2vtMRp +SDw3NDM4RVniyL68uLvGzdHc4+5oamdZXFlSUk1Pae3u3tz39fpdVFdbWFRTU1txf3f76d7b +43NcW19lferg1cvMz9nc4/Zybfzp5t/d3uZpXFlVV2j25dnW1tLV2d/rZVNPS0ZHTVRZYG9p +ZWZhX2FiYWny3c/JyszT5Onz7ufm4N7b2tbU2+l0XVtfaHrt397f5/D1b1xQTEZFSkxNVmvy +7Pl4bWdnXlxi8djNyMnJy87W3ux4c/nx7ufh2934YF5cWVlj8erp2dTW2upfVU1FQ0RHS09Y +c+be3OPj6fr+efPb0dTVz9DU3OZ/enx3fvPn393e3efq6GVVV1tcXWJhanb/eWtfV1NPTVJZ +X2jv3t/e4OPh3uHf29vd29jY3OT9Z19hX2Vy++XZ1Nja3ef6dHJfWVdTUlZcXl9eX2RmbGpp +bnz34Nra1tfd7nd0aGlrbezh4N/h4OHq+mxhY2Ntdf15c/H39PH0eWtsbnj+/O3u6ufre2Nh +Xl5hbXl5d3V1ePf8d3d2+fbr3t3n8vZ3bnN2bWptfO7n3tzf6e3t7vZxZ2RdYmNgbPn1/vf+ +9Xp38uvk73Z6e3h1cHj+8uzs93hvdnhsdP1ya29udPjs63z+8vHo4+9sa2hkZ3H/+fl8+PPz +6ut7e/Ln4+Df5fdscHr9/fP0d2pramZocG5ubGt+/fP8cG9//mhjZWdu/fj17Ofr+PDl5u/1 +fvPq7urq5+nv9Xj+e3Zwa2pseXn47vd3ZW1xcXV1bWRpb313/3x4dW599ufm5unr7+7zcnv/ +c3759/fs5+707er2efx2bW949fpwaGhobHZ+eGxka21ufu7t9/z77d/c4OPn7+3m4ujt+W9j +Y2plX2Bqbm/76+vze3Zvb3R6b3NzcHvx83t6dG5x/PH39/r79ujg5uXm6flwcnd9fHn+8fD2 +fHNwa2Rna3R1dvz9/fnu8fl3dnBz+Pt99+73/O/w7X1ramppaW14+2xwb235729vc/Pd3+Dn +8trY9+nqeWxnbWf983FzZl5XW/fv9O7s397h4+Lc4nR2eHH89vt3bnV5eWxeZGpkbXhyaG15 +Xl5vdG16/fz06+jp6fHq3+Xv7OHg4uPh6nz/7O718/LxcmtnbG94/PN4bG1oaG59enNuY2h5 +bmxnZl9hevL7ee76fHZ+5+vm3+Pk4+Lp+G5oamdxbWxzcXz57e307+r8bX13aWRlYVpfbm5z +8Ofq7ejf3Nzf5evt7Onq6vx4dHBzaGdqaGJpdXRw+H59+nBsePp6bGhkX2tubG5ucfn9/u7p +6Ojp5OTu5+Ld29vf8nl6/fnz829ma2pu+/1zeG9maf7u5+Po7Or4//f3fnR3e3FvcGlsc25y +fvv4/HhsaW93/n9yfP5udv7z9n75+37s39/p9ez1cPvs9f7/eGt2evvu8/Pr7fjv6u18b3p/ +eW1ramxy+O70/fLy9P93/PX/9vZ5fX5vaW1vbm1udW5mampx+nt7/np1/fTu8Ozq7/f6fX7+ +9vLn5OPh4OXp6/Z47+fwdmloc/vv/WxlX2BfXF9qZ2Fobm947u79bWx2+PDy++7t7eXl6O7t +6uvo5+jveGBdXV5obWtsaXbz9fLs6efk4+Tk7fr5+3hvdXZlXmRoam9++Pb/b3r+cXJ0a238 +5ujx/vl5/O7r7fJ5df91fvf9eW1qam9xdm9yb2dt/ejo6+55anbv9fry8u7y8PR4/fP89/Hv +6+n0dXNybnBze29oZGdjZG5tbGxwcWtsffb47ev4/PX3dnv6fHBvb2p1eHj66+/s4eXi4ez5 +9O7v9/vy7/bz93n6+Hh1d29xemtmbnV1c29xeXNuY2ZscP74+3z57Pn38PDyffbu9P59+XN2 +fn17cnV4+fPt7evh6O3s7u7n7nlwaGxsbP75a2RqbXL7/3z9/Pv97e7zdWxtbf399/50bnj5 +8+vp6Ovw8P5vdnFycGhlb3NyfOrn7e39e314d3h1dXx6cHj7/ff39/jv+HR4+vP5+3v+d250 +en1+7vV8/fR2X19laGlkeHFrb3jg5OXi3d3r+33+b2tgXmJ1fvH269vh5ur9fXl+dWhpdfv1 +83P97/1xaWxsaXh2aWz7+vnx+fH3fnhsevXr4d3g39vkd11ZYmptfPzq2dXZ4nNpZltUUVRb +bX/v4Nnc/F5UVF1rcv7g1c/S2+j+fG9pY11f8NnX19fc6vJwWlNZYl5ke+/f0s/X4v5tYV5e +XWBy6+Xo72taVFBPUFJd8eDb1dPW3uj8bnhvd+/j2NLS1dne4X9dXFxdaW/53NPY7WJVT1Zk +dn196t/e6FRFQ0z+z83Y3uHd33dXTE5d6ODtbmzj2d/d1tfPytHpbV1ifPN99evk3NbZfkg6 +PUFP99/k3NLTzddqT05Td97t/Xzm2NbzXl1i5dXb5/R839LeZlxe8czFxtJdSkE6PD9N7cjB +wMf2bFhMTVBXftLMytDvXlVY+djOztv0cm/0293sb1tWX3Ju9trX29PiQzAwNlDDu7rD12Xv +/lxNS17cx8fQaFBY3crGzW9WVmTf0drxb9zJvru+zUUqICQt5K+qrb/2TVNQST4/X8Oys8hK +OTpK3szR2OXWztLhaWvaxsTLaERJ4rqvte8qHh8q2a6ssMTuY/RPPzI1Tr+sq7hZNTI+e8LG +1N/Xx8LH4Ftc2svGxMjM21A6Jh8jL72npKzNPjpHXOhaVn3Gt7jKSDY3TsW6vutDP0/RvrzA +yMXBwsvN20MxIhsmO7KfprJMMTNK+9TrUt/Ft7jZQzY6/L+4vmdAP1bKtrK0ub/R5eLLz0Yr +GRckSqCbo8AtJy9iw75xWNi/sL1cOTFDwbGyzDguMla2qqestb/hTFDyTjkeFR0yqpabqjQe +IDbGr7tabOq4sto8LDHZraiyTSsrPbmmpKi2zllS8MzOPh8QEyS/lJSd9B8dKfe3tmFezLas +wjwrKlmtpqp4LCgyzaiipKzCaUVdwdI9GwwTJ6uNkZxKGhkr4K+yRPbPsKvuLSIrup+fry4f +IUKpnJymu01DTr68OBsLDyytjJCfPRoZLruvqz9UyrmudSYjL7yanq4uHB88q5uZoK1MMTV2 +wPAtDwwdWpSOnM8eGSW8r6fLOmlow2EsLFysmJ7IJxkeOqublpymzDEvNz4rIBUWLrCXlqU+ +IB4uvq6rt83SSzQoIjutmpaoNx0aJ/SpnZueqNc9SD02KBoSGkKnlZqvNyMmN//LuLmstU8r +HB9Un5OWtCkaGy/JqJyanafPSDkwLB4PECevkJGkOx4eLtHWyMa0qbJCHhsnrpWToT0eHSpS +sqWdm6O6XTUtJBsUDyaslo+gRyclLVJPWLmtqa87IiMss5ybpVkoJTJWtqyooqqvuT0gHRYN +GU6hkJiySy4qOzk3zbWqptgsKCVIqJ+eqUcoKC+9pqSgq7zCSCAcGQ8WRKmXl6vKTS4sKyrc +p6Wr6SstNTy8qaOgszgrK0qrop6esd82HBoWDhdXp5iar7i+Oy4kIE+pp6vIND86NM6vpqK1 +Qjk88rKqoJ2nzi4dGhQNEzaklZemr7ZJLCEeNLq2u77Hw9g5P7+uq7VvT+LTvauhnaJmJyId +EAwUK62anJ2bpdYrHB40UE3auLCuxF/Atb/RV1vGv8m5ppydsDsqIxUMDxo5raOdlZek0ywf +JCknLny3r6+6tquwyN5VR0pT26+fnJyoTSYZDgwTGi29p5aOk5urRigfGxkeLD+6paGdnqiu +vE06NDAzT66enaS6LRgUExIZJD2wnZqWlZynvzwsJyEdIC9fuayvqqCosb88LSooN+LCsq61 +wOlJPTw+QEZOVF3q1tTybWtaTD01OEBO8ci3rauwxFw/OjpC57ywrK+5yGhLQT5AQ0FAPTo9 +SGDU0e1YSERFQT5H/sCzr7K6wdlUSE7hxsC9v8viT0NEUdrHyuhLP0U/M0XWXFBHPEtOSExH +wLHHvLG8U0dAXLO8yKmqt7fEXjsuKS8vISIpLDlbwKWdoqWjrshqPC0rJyMqMDZP0L+upp+b +nKClrcVEKx8aGRoZHCUvTLupnJeZnJ+v4UkrHh4eHicyWLKrqZ+dnp6fo6zLRjcpHBgcHRgc +MVFdv6WcnaCeo7xcMyglHiAsLzvBsKqhnp2dn6GluGJKLBsZHRoWGSg4Nuaon6Gdmp+ut9k3 +KCImJSIvXd68qaOfnpyeo6q0zTolHh0ZExceHidUu6+jm5mcnZ6u1E8vJSMgJCctUci4p6Cf +nZ+ipbPN8S4jIBoZFxgeIylfua2enJqYnaKp3EQ1JyYlJy44XL24q6Sno6OssL1LOysfHhsa +HB0kMES/q6aenJ2dpK66ZTwxKywtMkt8zrOsq6mqrLtvcTkmIiEeHR8mLDX4vLSooaKfoKat +udZEMi4uLTdR98Oxr6qqq6/KZkAsJCEfHiAlKy9Dz76yqaWlpKKor7PHUj00LiwyO0nZuLGs +qaqtuNN0OComIB8eISYrNlPYu66qp6SipKmsss5dQjItLTI4Q9y/t6ypra65y2E1LSYhHx8i +Ji09a8q2raelpaWlrK645lI9My8vNT1G1by1rKqusL/wTjIrJSAfHyEnLT32xLGqpaOio6Wr +s7vnSzsxLS40O0rpwLivqq2vss5fRywnIh8dHyMpMk7FuKmhoJ+eoqevvNY9NC4pKiwxPV7N +t66qqKmrsMRPPishHx4cHiQqOHG6rKSenZ2eo6y02UM0KCcmJSszROW9r6qnoqOpq7ZbOC4h +HBscGx4oNUy/qaGem5udoai47josJSAgIyYtRNS8rKOhoJ6fp6+9UCwlHxkYGhsdKDv4sqSc +m5mZnaKqwz0tJRwcHR4lMk3BrKSenJycnqWqu0M1JhoaGBUZHSMveLumnZuXmJyfqr5LKhwe +GxYeKSxJr6mim5qbnJ+jr8brOCckHBkcFxwlJTHFr66dmpyanaW44TkhGxwcGyQ6Xbuqn52e +nZ2hq667UkQ6LCUfHx8dGyU4LUatpaefm5+krcRPMyIcIiMfL9i7raShoKKpq6y+zb/4R2E/ +LykiIyAcHiszOcapo6CfnqKuzkk4Jx4gLC0y0a+qp6emp7DBuLv628TfWN38NSIkKRwZIzI2 +TrimnZ6loKG5PDkzIx8nMj5pwa+mqrOvr77QwsjDuL/Qyr9JIx0jHxgaJjvSt6qblpujpq15 +LyUgIiMjMsu9uKuoqqy74s7H2tvCtq+5x7vPLRwbHRoZHi7HqKKdl5adqb9DLSQcGiAnMGu8 +rqWkqauvxdrT1czBt7G0vcfoMhwYHBsbIC/XpZycmpedqcM0IyAeGhwoNdCtqaahpKuyx09Y +7OfOv7evr7zIXy0cGRsbHiU1y6Sbm5uco6zZLB8dHBwjK0K0pJ+fo6mttutBPkNuzMG9trW9 +vu0uHRscHSAoNtCmnZubn6iy3DMiHBwfKjRls6Wfn6SsuM9UPDk8TOK/sa2wuLvjMiAbGhwg +KDjVraCcm56ouF4yJh8eHyk53a+moqSorrnZRDg5QF7KuK6rq620wEsmGhgXGR8qPMCnnZqZ +nqi4UC4mIh8hKTJqsKekpKevuslpRz09UNO8s7C0t7jATyodGRgaICs9yaugm5mcoKzPOSok +ISAgJzber6aipqyxt7zG3WZd6szBvLq7wNVILB4bGBkeJzfPraOdm5udpbVXMCcfHh4jLUu+ +q6SipKirsLrH2fRWSlBs0cC7xG00JB4bGhwjLUO/rKCbmZufqLtOMCQeGxwgLVS4qaKgn6Ko +rbK82E46MjQ8WMi8u8NaLyIeHR4jKjRTwK6jnZucn6nBPiceHBwiLk6/raaioKOmq7PDcT8z +Ly82Q2HRwb/Gx8DDTCwhGxoeJzzOtK2opaWjpq28TjApJiozT9e/uLm1sK2ttL/Vb1xaVEpD +Pjo7P0xaU09Zb+nUy8bCzl5EOC8vMTU/Tlvq0s2/uLW2ubzD0uvq3NHLy8nGy9DiVklGRURH +SUpPa9zNyc3e2dza32NSRD5ATFROVmVaaHt3ZlpffON5dvdsbeLS0tzm2urrzcTDzdnl39XQ +y8TF221qTUpZX01GTlFZZV5fYXXzdm9damtga+NqZGpXVk1MYfxfYuz04uTYz9HR08HI2tr6 +7mFYWtvx7tbc1dRaXObebE9k7uFVTV/cfklgcUxSZlVNTl/t1szNx87Y4fHoX1NGTXdsdFd5 +1s/O1srI4fdoX1pbUU1iXm101tV80M306mlbYOhXTvjh52bY3n5udXzsWVfs43ln2+be8+Zm ++OpOUe/xVlNe+P7v8Hn3/u3q9u75Zt/c6tzb/dzb3F/7zs7x+t5cVV1579/b71pcSUFKVlFQ +ZHr35e3e1OPf6u1WYetv+/fW1dfVz9vZ0vhbb2Vldmzo197g1tjZYVNWWE5HTUpITvfS2NPY +0eNbc+BlT11bWWrs3tzOzdPR5Xj9c2vubm/vYOrX4GpvXFx5dW9aXl5UXnx94s/T+Ord/P39 +7+9rYlxfWmrudu3199jX6OPf5vrocm31bV9fX1NPX/Dp7ODe9fXp5/leZ21sZWpkafTz7eHf +4ePi5ujp6/z83uB5duvxbWRsX19eZGZsa2N55/Lx4uDnb/59Z2Vp9WhkfXNz7uLf4Nflfvt8 +9W/05fZrZ2Nvamr3/Pvs2ef3fvZ8aWxtZV1odX/59/798efpdHh+eGtn+9/n7ODi7O9vdf1f +Z3F6dmlfbHp66evy+HFy/HRoYWdhY/fo8O/p7vF74d17/Ofk6+78eW1vcmtsaXn8d/f26elt +anJ0dGt6cHJp+u118PPzfe/x++ttYm3w+3n8+vr1+f5yeXtqcPTycXn8bffm+ejkfm94+/tq +afD4e93d933y/n97ZP3f9GFr7u9tZ+rrfnVtaW5oa2r6e3t3fvz7dHX0afnq+23y7lxr43// +3d/e5dzm4O5s8uR+ZO5qbvJe+25fXfJmXWtlXVzr3+x5cnPmZ+LSaWdvd+za4PPt6upueeHj +Z3t4a+j4dexoWuTga11YV2/feGVw6F1X291mVO7P7FnSwF5L6c75W1hs7F5Z7dz7X2/Y/uxo +4tlcWXbecHTu4njxcXd1blhRWHPbdv/j+encdvXR3GPj32pjV2xocvv95vtfY2leV2rb6O76 +9f5w4u7p/Xjw5/BZWl/o6mV55eNnW/rW7Pre0t/l+W/5Ylhg7mJQXmX44XH71dpnWuPiZ1hp +6PteYNnYb3N5fvZt8+x8d3Jo9t3o+Nzd3/lcaffvc/f7aHX5cXNu8ejv5/NgaHxlX+92ZmBb ++WVx5e7edfzj6+Hs3djn3eLo4G34YFxtaXNYbV5VYVpnXF9zWV92bXr03tLWz9XW09bHy8jK +2dDb29HOyNNdOiwpJSYtPM+5raqutctfRDw+QE/uy76+u73GyM/Ny8S8u7u9ye08KyIeHyQv +VbysqKitvXM+NjAxOEZ7x7q1tbm/yc3LwLi1sbK2vu48KR8cHSIuV7ippaivwFQ7NjU4OkBP +6Me+uLe6vcPGvrm0sbG0ushTMyYeHR8nN9yzqqmtvPBDOjg5OTk+TG/KvLSxtrvBw723sa+v +srfCWzIlHhweJznataytts5ZQj0+REc9P1Hsxbmxsba7wcC+ubSys7S5v/I4Jx4bHCM15LWv +r7vZXk9YYFVJOzhBbcSzrKywusTNy8G6s7OytLrNPScdGhsiM/i6srfGf1pt1s3qSjgyO+y7 +rquttMHP08u/urWxs7S0vF0sHhkaHixXxLu/zdvRwbu//DwwLjrPtK2tsbvHzsvJyL+6tbKx +r7DENh8ZGR0oPe/U3dPBuLO0vlY0LjNEzbOxtri5u7/Hz9/XvrWvrrCxt2sqHRkbHyk5V+DK +ua+vtcVgPDM6T+HDury+uLa5xdrn+sy3rqyusbO8SiYcGhsfKTtrz7+zrrG7y11BPEdv/OLM +y8G0r7XKb/nYv7Gtr7W2tLtLKBwZGx8oOVzQva+rrbrOfEw/QUlDQvK9sKyut9RQbMy+t7O0 +urasrNMnGRcbHyc3WtK7q6SputlkSz08Pzw6Z7WrrLbGZUhlw7y+vrmysayqvysZFxwiJi5L +zLmso6W4fmJjRzk6OzhPuKqtwuX6af/JvsPKva+trq21QB8YGh8lKTzRuq+opa3HbWJLOTY6 +PEHbsq660NHN08/EwMnCtq2ur7PSLBwaHiQmLUzHua6oqLPR5+RNOTU4NTjqta+4vr7G0MzE +w8e+s7G3t7TcKx4cHyQnM1/NwbSpqLG/yuBFNTEyMTjqsqyyv8zOz8m9v87Nu7Kxr7DZLB8e +IyYnLTtP0rOmpa25xudFNTEvLTFZuK60vcHHxLu3wt3Wv7i2trjOPCsoJygnKS47Z7utq660 +u8ppQTgxLzJA0r28v8K/ura1vdLd1snHxb++z0s3Li0sLjA2Pk3uyL27vMDO7ltQT1dhaO/x +bGjxzsPCx87c08jBvbu7v85kS0VEQTs4NjY3OT9KUlVd9dLIwb/Ez9zpbl9j79bW3NvUysa/ +u73AwsDCzd7oXkY6NTEuLjI3Oj1EW93GvLu+ydXe4e/y5tza4t7XzsnIx8fGwbu3t8DQ3mdN +QTgwLSssLjE5RF7XycHAv8PJz9PS1Nnm6trW0czT1M7Hvru3trm+zellUkQ4LisoKSswOkNQ +6crBvbm5vsbMz9Tk/Wr66uDV0M/MxL68u7m5ub7a/1Q+Ny4sKSgrLzlFVd/Ivrm5ur/M3O7p +5On2ZW7l3dXW1MzGv7y5tra2uM5LQTsvKissLC42QlnnzL+8vL/Fydbtbmjz+Hft6+7239zd +zL+6t7a0tLS3y0QyKyoqKSsuN0/QxMbHw768w+NTSkxXU1bz3Nzc0c3OysK8t7OytbW3vLvF +OSMhJigkIy1OvbW4t7GvueRFPURKQT5Py8C+w9PIvtJRacG3ubq6s661xsLMMCIkIiAkKDXI +srm6ra/F5FdIRkE3Pt3HyMS4tMdhTlftZ2jGsa2ys66uuL3OLiAgHR4lKji9rbe2rbjcXkVC +Tkc6UsDGw7y6uM9BP1VPQ/24rq+ysa+wvM/KSyUgIx8mLDPbrrPGtbTVWEZHZl5BRca908fA +ycpMMD51Ul2+r6uqsrevtszQyTwmLSQbKDUxZbS5vLLH5chSPWfrREnf2cvFzdrP5zo/b23e +v7GrqrS6tLrL3eJlLycnHyc1M0O9sL3Cwc/USjpRfElFXNW+xNbCyGpCO1Td6NO1q6ywvLy7 +yOx6wMIvKjUkIzEuNb6267+8bvNTOk7gRD/dx8C/vbjcT1E9P2XWxLGtrqu4zb29296/vzoo +KB8hKyk5vrbKw8Pf108/bt1fZNa+ucXMvtFBNTdFddbArKeqsL3ExdnhzM7PPykpHx0uNy37 +rb7Jv8zCzDxEv85GYcW+xnXV0DouSWhRxrGqqbC4uslc5768xN5JPi4bGy40Lke/rq7XTLy7 +Qjxa39RPR8K27FjIeDk7T9q7trOsrbbDz9DMyMS9v+I8LCQaHCw0Pti2ra/XWsXjQUBZzMTy +aMK50Gja50s1Nce0w7aoqrfdVsjI5MW3u10vJx8XHjI6bLWsrLVpV89YQVnezMfracm+03Ld ++0g7QXe+sbGvrrfRc+3Xx767vVYwLyATGjpMT7+poqxCOcfLOzn2tLLvRsq5+Uxsbmc6M9+5 +urGsr7bNVNfL1bqwvnI6LSMUFjRiR8Wno6pZLlzHPzfTr67HQ1+9cDlO3XVJO1K2t7utrLXK +VE7+dcyur9dHOC0fFBk7weC/pZ+tQS1G1kE31quqykBQ1k87Q9fA7T9Mu7LAuK2uwEs9WNxs +u6u20TssIhQULcnBs6SfqE8nMVVERMisqLhFOFVZPULcu8VPS8a4vLu2s75XPEFOZb2qrL5P +LiseERlisLuuo6KsNCA41UZFu6inwDc6d0cxPM68zlD/vLbCyrmywUg+Ze15v62suzwrKxsT +JOzOsaSjpLYuLUY5MlG7ra7OTGdLLy473b7LyrKwwMzOv7jTSuHaTFnFsa2/e9ktEhQnP0XK +ppmcyzVFPSckNryrtsi8vGw0LkPbWlu8sLnDv7Wz0FHZ2EE517S4zN2/vjsaESC7NSepmJ+2 +TErELxssvsTU1bmovi890U47S8GssMu4rb9Z/MzRQzjXulo52L1o6PknHTk2IzHLs629zayx +PzpvYz4uOcLEZNOyrbrhzbvMWW7T09jPxsxfSVPpUDpUzE078cXLyk0zTlApL0lKb+pXy7xq +Sv/QxM3XvsJ+cXtkaX7LvMfZxL3F2mnx4VQ/SfLiX1jx1N5PQ0lRR0BR5dXV0tDsTT8/RERS +3szH1eJuTUdEX9LExMq+v9vle1re1GdVxsLK3cu/4U1TUUdDP1zR3tm8vdxQSD02Mjx0Z+i/ +xe5LNzY/P1nFu7W40NP1TOvL0sjGx8dt9cHE1MvG3URDTj5CYMrHf1f0VjlDTFN2fG3C3T9R +Ois+2FZiuq6/UtvIaklbvLfNyrzLbWzdzt3e12VERERa5GrFyU5PPzhIXX/M5WFdWTw5RfZi +c8DCcOzHd0/fxtDQw73G3dLH3UdQWkVET+rOc+rA1k9x2XFVT+FgQE5LREdDSebbcuvZyNVD +679hYsPI49jLv8v74stiRmTOV1DP0ubw/vxUUONaTVFNWEg6U8vzW83ZPDx/Qz/IxsO45fDE +XEzPwsPCycPSTVH1WH7W0spiSF5uU3zh08tOTVxANz1NQj3ev9tHa8JLOd3BaPG7xtjb08rU +1L/J2MnhV1h71OhkzcpMP1tYP0/GxvhUe2A/Rkw+Rz063M3x7M7I+D9I4dPuybe3ysvD1Wfz +z83Xd/LL2Gbi/URc7UpBf85UUFvnTT5zfDk/WGZ2QDtaXkncwcK7xs/P8GHlzL7Axb7D9G/d +3+HZ3kZA2ts/arXaNkrSWTIv/Mk5S7vOOjBBSzdEtK/KybtvPT7ZwdC3rLrh0sLMYl/gXT49 +TUlatbLJxH08NS4350xJyVYyO09FRtC3xOjL1VNV2L+9wLm7ytrSztLfWeXQQT9oS03Ry8nh +PDU7LjNM8n5NWt1CRszJxra+xtNW+8vHt7S4v9vyW0LRuVJFzOM7MUe7SSlG1DQrPHY+OeDO +4sK6u8HRzdhY3ru6vbS0vszX7PlYQlTe1P5CQlQ5Jyo5PTk/bMrNT++6v9W7s7zf3r/A1May +tdHx1dtdRVu7utM6JR4lKSIwta/v17nKPTvStcDFrKu+dcOxu8u4udZb6PZCabe9LBYlORoZ ++aarzcKpxSQsvrzovqWl3E61sM3QuLbZQWjB0M+x2hkZLB8ZLqqeq8KtuyojNOm/xq6fr1bM +tsZk6Li3ZkHGr7/FuSoXHR4cJ9qhm6q1uTcdJDjwuK2kpb7oxNJa7b23xuPFr6+0uR4UJh8W +Ka+dm62yrC4VHUJq76+bnctGvb5ANtitvErJpKetvh4YJBkVMa2dmaesqTEVFiVkzsadmKxZ +YexPMDa0rM7Nq6GhvxwTICEYJqqVlqavqkEVEBxEw76jl5/ZQV9NLCraq7DKr52dsB8NFywa +Ga+Pj566rboZDRU3u8qtlpm8R1pOKx82q6vArJybpiULECsdFtKPjJi8sKsfDBAqt7rFmpKv +OUxNMiIosKC6tp6aoDgODiUfFC6XjJOrtKkuDg4d3LHIo5KeUDxBNSYh35+quKOanV4UDhsh +GCKijY+frqlvFQ0YNL+6rZiXtzw+MiUiM62ir6mcnLIeDxUeGh3PlY2Yp6a1IxASIUvDsZ+X +nsk5MSgjK/Cqp6ignag3GBMXGx4sqpKSnKCpTx0RFClfwqqcmJ/MLysoJi/YqaKjoqGwLhgT +FxsgNaeUk5mfr0ofExQkTtCvnJaezS4rLCcp5qSfo6OfrDsaEBUcHyqylpGWn6vCKBUTGytK +wqCVmbFLNzAoIjaso6qknKDMJRUTGRocQZ+VlJidp3MgGBYXIEW4oJqdqLhKLywtP76uqJ+f +r9ctFxQZHCVFsZ2WmqOouDwiGBkqRj3NpaGovGbJyjg6uKemrLjB1y4ZFyIuMTjgq6GnsLW6 +2jwuLjlo8kZVytNlX+nFvsCxpaaxx1Q3LisnKTlt6lFTyrvSQjxiw8XQwLm+0D8uOVA/Qdm6 +rq+5sa/PSVhcXe19T0Y/PDQtLTI5RWnKsqmrtb9hPz4zLkTJysW4ubvB28ayt72ys81XNCIe +ISIhKku3qqipqKe1SjQvKSw7R2y0rLfBvL3Cw7+vp6y8v888KR0YHikrLlytpquxt7e6Vy8z +PzY4W+nfv7vDuq+ztrOzsbPB9WlENTAlHyw8Mis6xbi/vbOtq7lUQ0cvJCo7T8eup6Kkr73B +2Ug9SW3Sx8e93SshKCYdHS7MtK+ooJ6lwTouLykfK8mvrqmhorBsQkJEQkXQrqmxxb3WJhoe +Hx0eK+6xqaWjpKWv+zo5Py4lNb61vrqtrMBl68vLeHvBuLvEzMToKBseIx4bIk6zq6Wempui +tl05MyoeIES5wsyrn6rbWNXVRTlZvrq9vrm+Nx0bICAcHzy0qqaempqgrss/LCYjHyQ/v8PO +rqGp122/xEw/2Lm9zcS7w0YmHSEpJR8qxaamq6Odn6/kSjsuKiclLErfXO6yp63Dvq+3fEzY +yl1DWca+y1o6NDk0Jh8pWcHOxamdn66/w+wyJCAiJjFYyLSnoqm5w8ZvNzd0xdTPr6OltNpM +LR8dHh0eKlfCvKyem6GutLd3LSMlKSkrO+i+sq2srq+yv+Pnysp77Lqus8PcYTchGx4hHx8t +x6yrqJ6anq69yFAtIB8jKTBF1Lmsp6etsrG67kFCX/JSUsmysMLs9UcnGx0lJyIr06moq6Kc +navC0GYzJSMoLCw0XMC2r6yrrLS+zv9WRz9CUenEuLO2vc1QLyIfIiQjJ0K1qqqnn5+mt8bV +SC4oKSoqLDlS4MOzrKurqq++3v13Sjs+UPTRwrm2vuRBLSMfICAjK024qqSem5yirsZKLiEe +HiAlLk3EsaegoKWrrrjkQjo4NzpJbtnEubnLYEk6LCMjKS8yOX61q6qqqKisuNlNPDIsKSku +O1bYva2mpKirrbjqPTMuLS0xPFfGsq6ztLLHOSgnKicgJDnPvbmsop+kq7G/azwwKiUlKzlL +ZsSup6esr7C55jwzMzMyNkTZuq+sq62zw0wtIyEjIiAnP8W4tKmenqWvucJULygmJyktN1XF +s6upqqyvtclNOTY3ODlDbMm5sq+usLvYPislJCQiIipEzb2zp5+fpKuvvF0yKSYkJCk0Sdq4 +q6eoqamtv1g+OjYvM0Fgzbuwr7O2vOk3KSYoJSAiLlvKwbKln6GprK67WDMrKScmKjJA+MCx +q6ioqa6802RGOTY8SFP6ybm2vcjN8jsrKSsqJSUyYdLOuaihpq2tr71QNjAtKSktNkBsu66r +rKqprr/a61lAODpASWjVzcq/vdc+MTMyKSImM0ZKZbqppqmqqay1zk46LysqKy84S824r6up +qay0v9ZUQjw5NzxO7tXS1dLWSzMvMzEqKTh12tm7qqarr66uvGtDOzMtLC0zP3XHvLKrqay0 +usDnRz4+PT9HYu7w0MbiRT08Ni0qLThASu68r62trKyvucxeQjgxLS01Pk7lv7Kurq+ytr3O +/lZKQ0RRaGFe39hNODU5Ni4rMUFMTfm8r6+wrqyvvNdbSDkvLjM4PlDYvLOvrq6vtMDWeFJB +Oz9OXl5gfNjzPDI6OywpNktBRcu1tLSurK+4wtdlPzMyMzM5R3PIu7SvrayuuMLSYUQ6NThA +Pz1NzMTySUXw2DcqOUw7Nz/qv8PMu66vvcq+wV49Ok5iOznXucnfva6zysm+yk89SFc9OEtu +U2/Iw8viSEBSPCwuPzwvN2/M2c67r666wbm601Vv2GJETu57YPLHvMjZvb1fX81bSVxEOkvw +QD7ZzlXawltD7lE1Oz82OkQ+S8/Rz7mwt7u1tb3U1M1PTk5LSO9cV8zMccq76ujR3Ul9S0VK +UkRNbPTp8Orf/VNPVkg/RUJLT2Ff1svDx8S+x8jJ3OV7SnNrZl9izNLS3Lve0ddfb19TP9xD +Xj/YTt5O8exd6UjaRtpJWnXubVa/9szdztXV527lTvlLalB152Pa39DT2tVn2tlWYON4Wmnm +d2neUdBd51Zs4EbeRs9J6Fnd31vJbsVd0+/zamBs6lb0Ud9Mz1DZV9xw5PVWyUfJRb5DvUy+ +T8pO5XBX4D7CPcU4u0LCWtPZ7sdJv0zFQs5PX1Rd2UnTUc9W3Fjn9VbjV/JZ5GPp6vrf2vPl +/Pps5W18W3tfeGL43O7V8MhmymjSWOZmWOFO90zZWv5a6Pz8YO9tfG1t43DkX+b98X5l/l5z ++Gxd4W9zZO162vbf0NrV69Jz31TqXW1O8VbgXfpi5uls5nPr8WR8etxT0F3SZv/tZtlS3FPW +U19pW2Rj8Gjid9r00/vX6+P1fHtdZl5kZuPp6efw2Ovo4ujna/tgc11mam7xauhy3lTrXWpf +XWBrbWD77uzn19fQ5d3641xtX2N4Zvl58mHyZdl+6Ofo92j3XHZrbnXtb9710e7abdlf615g +W15fVuBV3m/VXthn7WzsdGb3XOVW5mfcZ9zu2e7j6OjfdOxvcGb2YX7qZeNm5VjoVORRZXFf +72Dcbdl35N/03Ojd/e5mXXtT3Vntc9xi6PbaeOBq32TqaHLvdW7u+/l293j9XHpl62HyZeh7 +duxu317uaud2Zf5q6W55dnp88v777e/83/bf9//u5/75/+dvbPT1aHtma2Vuant8e2d0+9ze +5uf15HRp4HNuXPlsfWx+aOld/1/9efrr+Hf6Zu5833z37nTf8dd75Hh3dmvxYOhi4V/mbPf5 +c3Rs+FziXepg7XRt3fDke+X+33PmeO9cfmZudfJg21/kW9dU11DTTNJI00zSUttjz3jZ5uTd +/d5h1mDbTtVM3VLcVuRbbett6mDcWe1nd13edHF24/Pp3OPf8OlwZvdo6lpzZut5/9jy7fdv +f2n4WWdmX2Jpc+3jY+je4X7r9e3fbelv4Wp3YvhvX21u22T4ZNLp3vvd53Z5buZwaFv9cHVs +6+3i9fhp3u9oVFtcW1RUWnZtX37d1Nfa1c7Z5+7ibWpaX3FuXmT76ebd2tPV3tvm6vxlUVJK +SUdHTVp2e9fUy8/R1tHi6GliXFtRV1led+nb19TQ19zY2up9eGdfV1ddaWFhZnRu+P3pfmtj +aWt+bXLzf3Zu+Wxwb/D27PLd4Orn29fP0djp5/FkUVFUVE5NWPrs2dXP1d36d3puUk5YWVZa +fuLZ3tjY2uzo+n1eXV5jY27x+OXd1dfQ2NrscmNdXWdqaHhvc35qbWpqY15iXFpcV1d+3+je +0tja3ejf0+b1+PXv/Gz79Gtr7+jta2Rsd2RebvXvfm/96/5oYnX9al1offH28/jr83D029t+ +cPHm7nx1+HV9e+z1+WxqdfDy9/Xp83N38PV2b3lxbW5qZW/3e3fx9/zt4+DofXj483Zva2Fh +YHDu6/bu5+nu8Pn8+XP//m9se/n6/uvg7e7t7vTy9nd3eG1mY2Bobm5senB28O/2+3p7+Pnz +6+jh/Gf/7fj87/V7dHvw7n1md+/vfPj2/WRfanVvbfPnfG/9fXxvenx8dX7s/vrv8PPt6u/r +8ff3fe7l6fD5/G9mYm9mYWFpdu3t+vh+enR3al9eZWdv6tva3+bm8Xp5+PZ2bu7o5vHr5PB4 +a21ra2FjbG5t79/i9XR6cGFs7Wxh7OV6e3j99Wdh7ON58OXv+2946/BsaXZ7bmt89XVrd/N+ +9unk7f5rb/H3/vT4d33x+Xz19XZubG95eHdtcXlybnNvb2ps7t/h5t7ob217e2prePHv/PPh +4v7y+mtgX2t8cGX03XZd5dh5Yv7o5X504+VoXnFtVU9ldG733dHZ7urg62RhaGZbXOfa+X7V +3Wnn3Px0c2huYlzu2+pye+X3aH7k/15oe2xaVXDqZF7s43r93934a/jjfmN36O/15t7fdG7u +4+/z4N/w7uZ4TkptW0FQ2Of+08zP52rm21hMaGhNT/nfff3Y0ed629l5buLd9eXR1ezr09Zz +5+JGQFA/OlJ8XuDNy8XN9eVvSElVVldw283N08zN6mJva1Nb5evuz8zU2d/qb1dWXFpcbOr9 +++H6e1NGX1c8TNtgXs3IzNLe1d9VUHVeTGrb5NrR1NLaddrhUF7gbGLe2eTb59zOcGLR7VZT +SEA/Pz5MbP7Yx8PJztPkbVhOVF1gbNzQ1M7Q3upvXF9mY+bT3NvP1uXi8G5pYfzc5uLaVkdB +O0BBP1vQ3tG/xs7V6GtXTlNcW2bl19vY0Nni7G37+W7b0d/Z2uvkflzi0V/myN1lVkw8Nj1A +QlLUy8nCw8nTd11VSktXZl/o1NbS3dnbXW7hbG3W0dfP0czaZdLMY9/I9FtNPzg0NzxFU9nD +v8LGy9txW1FJSVr259fJyNbs9XFaT/HQ4tvCwtLMxt5t6urxYlxbSD02NDs8PF3Gysa5u8nU +8lVJQUZPVnbPysvIz9fcXF/b7eHFy8/Dxc7O3OjSZE9wRzgyLzY3Nk/Kz8S2ucTI12lOQERL +SlHYztnIx9rX7Vby23HRwMXEw8bEzeXVz2VIRkIyKjI5Mz/PwcO6trvMeV5QPz5MTE7vy8rO +zdbd/Vz84dXJw76+xMTD0ObPzmpQTEc2LCw0ODNNvsDGtrTF3XZURTxEV01ZzMfbzsfX6nTo +3+7OwMLAv8jHy/HZ1WZ4X0A+OisqNzc1Z7q9vbK0wt9kWkM7Q09IVczL2dLO12Fb2+L9xb3D +vrzBxM7j2e3oakFESC4oNTkvPsW8v7evts30d0k4O0ZFSOfGztPIxOxS7d5d7b/AyL64vc7M +ze9qbURESDMsLjo3Nme5v8Kwssjd7FBBPEBIR1POx9zSvs1LcM9gU8y8w8a5tr/Lzs/6VkxD +QDotKzk4Mk+8wMO1tb/Q6WVKPUBMSEjsy9HUy8bZW+bQe+zDwcO9vr7D2NzPX0dKQTgtLTMz +NUzMw7qxsrnF22ZKP0NFQ0lk4trY2s7WWGLa+/zHw8G9u7zAzdzW6WBSR0c5LS04NzhfxsC9 +t7W+3O5mQjxAQ0JN7s/W3c/L31ni0OnUv73AvLu8xt3Mz1RLSTs1LSgwOjJGvLy/sa+6yOBh +Sjs9RUJH+M/U1czK6V565Pjjyr/Av7q6xNDM2WZTRUdCLyowNzM6zrm/u6+zyNfrTj07QUZE +T9vQ4NbI0mJc3dxq2Ly9wbm3vs7a1uxVT0Y/Oy8rLzs4Q8i4u7izucpzWUw/PEFIR1nX1eva +x9lW38zu4MLAxL67ucLa0dFXTFFBPDIrLjY2PtO+u7a0uL7XaE8/PEBDRljf1ejhxdNMdc5y +7cO/v726uMDYztFRTVJCOTgvKjI9PUrAtbi2s7nSXVBNQT1HT01lzc5+3slfS/7s8NnIu7m+ +u7XG6NBvTVZKPjw1LS42O0nnv7e4ubnA311NREJARU9Tec/c7tHPWlTf3d3Jvbu8vLm9493I +blFPOz88Kio0OTlevrS1ubS52VhXST8/RE9PWs/Mbe3Te0xizs7Txra4v7u6zXvX6VZPQD0+ +LiovOz5Gy7O0vbi3y1hOTEY+QFhiVuTL4vXN401f49rNxbq1vL62wHLe111TQjg/NigpOEI9 +X7euuLy4vftGSU9DO0zta2rOzfxg5vVKX83Exb23t7u8vtZ++V9bTTw/PCwoLkVAQ8Cttr+5 +us1MP05WPkH77FrlzeFbWvFRT+DJwr+6uLi+xszc4OtcYVQ7OzwrKzo8PtG7ubO8wMF7QEpO +RElOZej12s5pW+JrT3rLwsHCurXAysHVZX5nf2pEPDsvJys8RE/Esq+1vsLIWT5FTUpKWdze +79bqXepYRGXS0MO5uLm9v7/YVePdVWr9Rzs4LCguOUjXu7CutcXM20xAQ0pMS1Xi29bSblpd +WklP1cG+vri0u8XGz2df8e3ba0E9OSwkLktN7LqtrrrZ09ZANkBVU01c1MrV7PftZElJ2sK/ +vrm0ucnNwdtSZ+rvakw/Oy8mJTNLVM+yq7C/2tPvQDxMa15Z4sXE0XRaX1lFSdnAv723tr7U +1s9lTWvPzk9DTjgoJC4/RmS8q626ycrWSDlBXFxRYs/Hzdf+VVJKQVLGvLy7uLnH7NrRaVz6 +18zkTD02LCQpP13Wua+uttlbfks9Q1N45e7QwsngXkxKSkhbyrq0trq9yPxr+lln0s3N6kpB +NykkKj/x1bysqrjbW2JROzlO9mhc3cTH31VFSlFCWb6zsrW5vMhiatj+Zd7Ov8dUPTcrIiM0 +9tTBr6qw2UZPWTw2RuLO2+DEvMpjSEFET1PSsq+0u8TO/E9a/33VyMjR4Us0LSUiLlPbvq6r +r8NSTVA9OkNi0s/TwLzOcUM5RUlI2revsbrCxm1IW/t+0MLBvsVONi4nIShA7L6xra25XkFG +Pzo8S9fL28u+xdxPOTtJTei4rayywszZT0pg7NjHwr7BXDUvKSAlO2fGtq6rtO9HST85O0nX +xs3FvMTaUjg7SUj7vbKutMbK1U5NeufQx8O7wO48MiohIjFsyLatqrHZRUJBOjlF38jNzb7A +6009PEFNcb6vrrG7yO5SSlrm3ci/ur5pOTMuIx8u4tDCsqmqxT5BWD02Ptu7xNnCus1NODdN +SkjLsayyyNDNWT9M2MrKy7y3yUMyMCYfKUzKuLCsq7tNQEZAPDxWw8PSyMPQZj02PkNM47uu +rbnK0nxLTejPxry7v8xaNi0nISo8Wr+vray4cElEOjk+T8/N0MO/z2xJPT8/UMq5sa+1vspp +Tljr39rCvMHNajktKSAkOFLRta2rseVLSz85PEzRxtnIvcntUkBBQ0jevbKvtLzMfFJQaOHP +w7/BxN8+NCsiJC8++76wq67GXk5EOzpE48vPyb7C1FtERUpETcW1s7W6v89cUHzs6M3Fvslf +RTouJSUuP2LItaytvO9fTz05PmbP19vKx9JlREpRQ07Qu7W2vL7I5ffl7d/OxMfQ1kUwLSUm +MjxYvbKursLe80U8Oz1WfnDNwsjOdU1TSERg1by2t7W3wtLg4+1w3MzO1VM6NSwkJjRFZcq2 +rK7A0tlfQTo/XHFf5c7GyllWXU5MWtW8uLu5u77E3uvU093j6+lINTIrKi4zPuPEuLC2u8Tx +UUU+R0pP++vfzONr5lZVcvnMwr+6uby8wtXR19vVdl9KOTcuKS0yOVLZvrGzubnG6FdBQUhG +TVZV3dlj39tk63XvxMPDvLu7vczPzeLg62pPRDwxLi8vNz9M0L27t7i8v9hVTkhFSEJEV2Nj +9N/Uy8vJwL6/wMLK321US0xPWHfi3dna5G1PRUFCREhPZfb36+bt9X1tc/L7ePvt8WteXF5w +++fTzcfDw8TJ0NnueuTa2Nfj62pPSUVAP0FCTFJRXfft73lt9XFma3nt5PDy5nhpe/Pg183E +wL/ByczN1d7n4dfed3NaSkM8Ozw9P0dNXH324N3k4e94fnZ/7Pj/9fTx6eje1c7KxsPCxMrO +1tvd4N3g+l5STEdFPz0/Pj9DSlt46drZ19TV3uXj3uZxamNfZmZv7d7TzMfBv8HHys7Z3+rt ++2phVExIRT8+QURJSk9cdOng2NXZ3N3h6fJyZl1bWl9ufOnd1s7Iwr/Dx8jO1tnd3+lvZVxR +S0VAQUA+Q0lOWW979uTd19bZ2uju9mFYVlVXX2zr29PMxsTAv8DCxMjN1uPsbVpQTEU/Pj5A +QUNJUFtz5tzc2tjY2NvudGpeWFJXXl9s6drPysbBwsTFyMnL0tvmd2xcTktIRURDREZITVVa +XX7u8+Db2dTW3OT0fmlVUlddaXTk19XPycTFxsfKzMzR2+T+X1dQSUZHR0VER0tNUl1sev3s +5tjY2Nfd5PN3XVZVXWZq897Wz8/KxsXGyMrKztnj+2tdVE9MSkdGRERJTk9VY3Z7fOnb3Nvd +6fH193hnaHnu6vh469za09HOz8/Nzc3O1+Xm6nloW1JPTUpISktMTE5WXG/25Nre5+z3fX1t +Z2Vree/o4tjT09ne29fX29zb2tLX4O7+/3ZrZmJdWE9LTE9OTlRaX2h78PXs5+/s6Oj3fX56 +6+zz7ebm6Ozm3d3b29jS1tXV29/n6XdpZ2RcVk9NT1JVWVlaW1xaW11jYGr58+/o4ebi3dzb +1tba3uPd3drV1tjd4Ofk6ebl/Pn7aWhkX1pST09QUlRSUlddXmJseH78+PHt7d/b2uDp3tzf +4eTo39/b2d7f4N/l5Orn5evue31+dm5gWFNQT09NTlFVV1pOR0/03+TPwsPLysjQ3t34ZFhS +T1lhb3bby87PxsXP2dfxVktFQEFDQ0VLVGHg08/PzczP1tzo+2ZbXWFXVV977OPSzMrIysrM +093k+FtTTEdFRUZFR0tXa+Xa1dLSzcrM1eD//mteWVZVWGBqbu7bz8vOysfJzdPd91tPTUZD +RERFR0xVbebZz8nGyMnM1+P4bF5WVVZTT09UW3Tg0czKyMTEyMzY/15SSUZGQ0NESE5SbeHZ +z83KyMjMztbg92leVFBVWFpibfzh2dHMysvQ1+JsWlFMSEdHRUVITFht8tzUzcvJyMrLztPc +73RkWllZWmNw9eHW0M/Q0dnpfV9TTktJS0lISktNVmd85dfSzs3Nzc7P1eF3dnxtbXF5c+7c +2NLOzdLa4flkVEtJRUNGSUtNVFphb+7e1M7O09ba5e59+vr47OTd2dTQzc3LyszU6W9aTUdF +QkNERktQVl998+zf39rb2dXZ2t3k7Hdoav/v6uTd2dbNyMnLztj0XE1HQ0FBREhJTVdibHfh +2tbS0NHV297m6+7m73Rqdejc1tPU08/Pzs7T3vtjUUY/PT0+RUtLTlhpe+/h29fPysnKzM7U +3OZ+al9fYmz34djQysjJys3S3nlaTEI9Ojk7PUFLVmjq2NPPysjIysrJztzkfmJaVVRZW2H+ +5NfQzMjGxsjN1uduWks/Ozk3Nzs/SVjv1czIxcHBw8TKztbi/mFaU09PUlhh59fPzcjCwsPH +y9X6XUxBPDk2NTY5Pkpc6s/Fv76+vr/Eyc/X7WldVlFPUVRaX/fZzcfEwMDDx87daVFEPTk1 +MzQ2OT9NbdrJv7y5uby+wsbK1OtdUExJR0hKUWLiz8fCwL++v8bM2mRIPDYxLi4wNDxKdtHF +vbm1tbe5vMPM2HtXSkM/P0JIVHLYy8S+vby6ur3H2Fo/Ni8sKysuMztIYdPDurOvrq6vtrzK +c01BPDs8PT9IWuDLv7m0s7W3usPQdkY3LSglJScsNUR4yLu2sq6trK2xuspeQDk4OTtAR1Fq +2cW7s6+vsLS5v89kQTIqJCAhJCkyQ3vHuLCsqKioq7LEZ0E3MzM1Oj9GUPfJurCrq62vtbvG +1mJALyUfHR4hKjdWy7y1rqmlo6SquN8/Mi8vNDg8P0VV1bquqqmqrrW8wMjSZjkpHxwbHiUv +PmzJvLCnoZ+fprTxPDIwMzU2NTc9TdC2rKmqrLC1trW4x2M8LCEeHh8iJy44VcOwp6Cfoqix +yF1FOzUwLy82RHDNvbWysa+vsbGyt8HqTTstJR8eHiAnL0HZt6ynoqCkqrLGYUA6NDExNT5T +387Eu7i2s7Cxtbe4vttRPS4mIR8fISgyRtO3rKmmpaest8pZPjk2ODs/SFV03Mm8tbKytbq8 +uba5x3g/LSQhISIlLDVDcMCvqqenqbDD9E1APkFGRkZMXfjTwry8vbu8vLq1s7nF5kcyKSQi +IyUqMT1Uz7murKqrsL3SbldNSU1QT1Bm5tPJyMfJyMnHwb+8vcLM7k08Mi4tLi4wNj1IXNjD +vLq6vcbNz9HX4PtmW1haXGZ76+TVy8O9uLW2u77J5ltLPjc0Mi8wMzg7QElWaurUzMvJxsPE +xMbL09fY3d7a1dPNxsO/v8HEyc7X61ZDPDk0Ly8yNTg8Q0pTdtXLysnGw8XHx8jN09HR0tTP +y8rGxMHDxsfM1eR3WUhAPDczMzU3ODtASFJv4tbPy8fJzMvKzdHQzMzMycXEw8DAwcXJ0OLv +clZIQDs1MDA1ODo+SE9Xd9bNzMnGyc/QzMzSzcjKycO/wMC+v8HHzNhxVUo/Ozo3Mi8xNTg+ +S1pw4M/LysrFxszR19fW1c3LzMnEwb+9u7u9wszfXUk9ODQwLi8xNTo/TmXm1snExsjIytLX +0dDU1tDR18/IxcC+vLy+wsjTbU0/ODMuLC0vNDk/TF/qy8C/wcHDydDTztHTzcvLy8fFwb69 +vb/HztXuU0E6My4rKy0vNT1LW/fPwLy8vL7FzM/O0tXOzM3LxcPBvry6vMXM2GRKPjk0Liws +LS80OkRY7s7Dv768vL/ExMbJy8zQ1c/Jx8bAvLu+xcnUa0s9NzAsKyssLTI6Q1Tjxr++u7m7 +v8LCxMrKyMzNy8rKwrq4ur/Bx+BRQjoyLSoqKisuNT1IZtnLx7+7vb6/w8fHxsjDvbu4trOw +r7G7x2s6LSglIB4jKTBE5MCzqqivvMfbSDUyNT9PUOe5q6mpop+foKjHTVgjEBMcGRQfT7qp +pqGZmaxP7XQjGiIvOj/XrJ+mr6aeprOto6xNOUkjFBkcGh8pP7SnrqabpM5XVC8hISpCVmWv +oqeuqaSstLCoqds69ToWFiQdHClDuayyq5uk0dthMiEfKjg+Ta2iq6ukpKuuq6eryURsORcV +IRsZJEO4s7Kimaa/vN4yISAoMDBIramtp6Klqquop6y3Xz47GhIcGxgdOsO3raKao6+z3jkp +JCkvLUqws7Klpqmnp6SmrKy1PC8jEhYZFhkqVNCtpZufqq3KTzglKTMwP8O1taqnpaWmoKOr +rrXkMh8UFxsQFi9CO7SdnqSoqbFOKkFDJi7OzE6/rK2vp56ipKKtuW5IORIPKBwKH6srNp+a +r7ujpT41uFYsRcdXO9qwxL+ioKefnqy6ukooGxgeFRAqMib7p7O5qau00rq1XN++ZFHiWlnI +ta+rpaClraarXCcYKxkIHi0XJqrN/J6ht7WitlqyujxGz0o3V7rFu6akpqejqLrHLhoyGAwl +HxYuwUS5pK2rqqi4vK/JQ89fN0hQ78q4r6akqaSor8JIICUiDxwmFiTPMU6lubaoq7q6rbhQ +wL05TOJf6s69raysqKistsxlQB8gLBgcLiMi+E0zt7XivKy5vbG0vrzD7MzSZNi3v7upr7Sw +vdhVPjMuKiopKDEvLDxMNjzfWmLEwb2ysrSyub29xcO8vLe2sb7Sy04+Ojo2MDlGOz1OOjw/ +OjVASDtXzdfKu7u9ur6/uLi5tLG3w7rMTUdCNjc6OEFLe1lKX1M/PkI5RUVO98rT2LrG2cK7 +x7mxuLa5wNpkSjs6QDQ8WT1i01Fj3ERGU0c6TV9W1dPM0MjQ5LvDx7ayvbu50VlUQDc3PDpA +S1BdZFlsZUReT0Rfb9vd0c7F5NnE4c/Eu8G8vMLL21xVQDtAOTxVTUN29ExcXktRTWPcb/TM +zXTN1vja1srGwr2+u7/Z3e1FP0xDOUJNO0ttRV7lXnDdaNbS2u/OZnfoTuPufc7Axr26yb/G +Svd0QD9GQjpIUz5WX1pbftZvzPHU2tfeXc5a99nvzcbDz77G2c1rc1NNSktMQ1FOPlBORlRJ +eVD239vP2cnN1t3P1tbRytDEzNDW0F9veWFSWldJXkVGSklETklYWFX28Nr3z83S2M3S49DN +zsvM19TM6nndUVlnTFRmSk5mQlJVTE9c/W3m2XTb7nLk3+Lh39vO19/IzePL5t98ZHtRXVhP +TmRSUmhZUWRgXul4dtxt9efb6/Pe4d3T0s3T3dLbcNlubGtdWVlaRltSUVtYVWVbaXZ96Hnf +6tji6NF609LayNbQ1uPb/+r37GhdfFRVW0xNVU9OW1BXWV1oaGfm8fTg3e3U0dzP0dfQ0djY +1eXk3nLZ5G3X63jY7mlyXUNBRjM7PjY+SkZV29/MvMG9t7y7ur/ExMrOycvMy89bVU8vMDsp +LT0uO+JHfMN5z77Zwr3Mwb/Kwr/IvrzDvLu/vc9OWDcrOCwnNy8vYk1Lwtbmw8TPw73Pwb7X +x7/PvbrBubq+udFaWjAsNCYnNC02b1jiv9HOyeDRy9HJys3K08zHyb65ubW0uL/bXzstMCwn +MDMzTmleyszuzdL81tTrzczWy9PfysfCubi2s7W902o+LC8vJzA5MU3oWMnKa8/bW9Le/s3k +etnk7cvIxre1tq+xubrUVTwtMy8pNTkzVftPzc9c0+Ra3v1m4Oh36vNs18nFuLO2sLG4tchx +ZDIuPCorQTE42FZnylht31Pp5HLh+OPhbd7b0r+8t7Czs7K6usZOTzsqNTQpNT0zSndLW+pc +WuPV4NrO6+7Z/dzMyL25tbO1tbi+vsPMaElELi47Kyw8MzVQS0NZc1zyyc/axM3ryMnPwby9 +vLa3vbq/zcHI1M10Q0M4LTMzLDA4NjxES01Q2czawLzMwL3Fvby/vL29u8DEw87Uz9r59PFb +SDw7MywvMC0zOzxBSlz75ce/v7m1uLi4ury+vr/EysjH0dXadmBmVlBLQz85NDMxMDM2Oj5G +UF7l0Mi+u7m3uLq7ub3Dv8TIydLb3X5ZVlNTTkpRSz8+REFAQEdJRkZQWk9o2c3Hw76/xcPF +yc/l6drZ7fx49XhabHNfWl5XX2tNT2FgSFP+3uZp3MjR7N3U0l1S8ehVUnfdaU9xz/loZs/Y +VlDy501DbM5UT+nAz/vNv8Lc7sLOUFLd9UtJX9tRQFziWj5U3NlMT9nZSkfp1VxUbsfOZna/ +vt9tv77qadXJ41xd3O5LSfljSkJcaE9IVNtpUF7gelle9u1x59vO1M/Oxs7izM7d+eTa9VVg +b11bTFJhUl1OV2BdXmlsZ2xd9Nvc+uTQz9zZ1dLS7ODa2f755X1vWVlTT01NWFdbX3X1ZGr5 +6Hro29DX3dre5Ovg4uzd3N7n293pbmN1XVVMUVhNUF1cWV1ncfdu/dzP2ezZ0dbu4dTQ+mrd +2epgcO9uXFxp6F5bbHtzXl9/alBWZGlgc/fp3NzZztDd4uDd63h1fPxoV2ZzZl55dGhmXGZ3 +bF9i/3Zr+/Z/dunk3djd19jU29vl8Pbr9W1yYl5eYGNiXlNdamFaYWZlal969/xj5+Te5eDY +3ffs1dfj4ubZ6HNx4eplZVtqZ2RYWmtoWFhh7mxhbO/aeffv5OB6dn7d3O358Nz4bfTn6Gls ++d7vY/zf9WdhbW9zVVhk7GVcZfZxaWr86d/s+fXy7Hx66eHg4dvq3d/f+3r//3BkeGtrXWZ8 +929fcPPsX1x29nVabPfqdfbv4uXr+PTW5P9h/P59eHDwb3hiavng/GL/49/5cHro+WVz5uPp +8v326HNu6d9kWV1taV5eYPP0b2rr4nd8/nv75uf85t7e7+rg6nNz+fp9a3N0eWlzb25na2Vi +Ymlsd3Nr7u54bufc6Prz6O3s7ezk3+Ld1dbZ3Njc3uTd6ObnaUo8ODs9OzxGW/HsfN3KytPW +0cvGztzUysjHyMnCxMvNxsPEy1Q1LS8yLy40SOTW3M3Avsh8SktebGFg5sa+x9fSyMHDxcK9 +vL/FxMLPQSomKy8vLzZNy7/Cv7y9xNJWRUhOUlhi28XDztfKwLu8v7+/vsPFxMPlNigpLS8v +LzZMz8O9vb/Ax9lfRDxATl/eyL++v8TAvr/Dw8XIytDQxb/GTy8pKy4vMDM8T9jEvr6/w8rY +dVVLTFly1sbGyMrIw8TM1Nba2NXSzsnGydtNPDw9OTQ1OTs9RVBw18zJx8fKz9XY1+ptbvDe +1M3Q2NbUzcrJxsTFytLW1+9LPDg3Nzk6OTtIaeDUzc3Ny83W4OLmbmF54t3d4uHc1tfa1s7K +ys3NyMfIy+xKPz89Ozs8Oz1CTVr02M7Mzc7W397U2ux7ZWNqd+vh6OPVzMjFwL/DxMXHzNZd +Qj08Ojc4OTk7RE9k3s/Nzc/Pz9LX4XFdYWxxd/3q3NLLw768vb7Aw8rV2uZqTj85ODo6Ojw9 +PD9IU23azs3Ny8zP2uDl6+7r4t/WzcnIycfExszS1+Du7XNdV1phWkpAP0A/Pj9DREdRaPDa +z8zMztDT0NHX2t7i497b3d7Y197m49za29rY3+7u9W9jX15PRERKS0ZGTExKTmFxcu7e1M7O +zs3LzM/T3nxjYGtx8t7U0dXT1tne4+Xwd2NiYFxdX15eWFhSTk9QT1JXW2BldvXu6O318OLm +7OHd5eff2tjX1NLR1tbV2ePf4u97al9aW1ZTU1VZXV9dYWx5dW1zdm9obW1oamhqaXrs3dfb +3uDh4N/c3N3j83l4bGdnX11eZWhhZnD9+/jr39ve3+HudXJ9f294++7s8fPwfHFzbWZgYm17 +cWxzfG5vaWJhZmxsZWj85N3c1dLZ2t3i6OjvfHttZF5fX2d+7/Z4f/X9bWhubXHx9HRsa3Vv +YWNjaHB47uTh4Obl6f797Ojs7ufq7/73/W1tb29rdHh4fHj77/doZHh7bnF7eG798fH7eHj+ ++/337vL98url6Orq9/z0+3duam52cGx0/HN09+7y9vZ+fHNz/PZ7fvf7dGpsa2hse/57dHbx +7Ovp7vDp5e3v5+bm3+ft7/L5c3lzcHZ0dHdvcXRvZ2RjZF9fYl5fYmhsdnH77enk4uXn4OXo +6Onq6OLf4uTj5vDv7X5wcGhhXV1jZ2RfZWdfX2RnYmFzffLo4+He4OHf4eb19fT9/nn79PLq +7vdwcX15cGtvaWZoaW1nY2h2d3P35ODe3d/k6+fsfW59/P94a21w+/5xePrveXlpYHD48/f9 +bW1vbHR9eXv273Rw9ft88e3r5efs7/V0bHr+dXh6e3x7e/3v7efp7PN9+3lua3B1ZWBncGxs +/v5vdXb+9+/r6efn4eXj5ubl7vl2ampoYGFpem5pc3V0/vt3bW159355eHh2evDo7fL09vb8 +7+jud3B1+/Tt7n5tbfb3b2pz/vnt7/Dr8PTf5/j49/1tbG1ta3Frb2lfZWxfWmvu929q/fdr +Zurb6OLd4ePuW2jT1N/e3vHv6Onr/W9sb2ddW15UWX1oXHTo9WxrZWV16en8XmnYzsrPbWPn +7Wt1a1pt6tvkXmvxd+/b8F5eXXJfceNyYX7a73bf+lxv4+1gWPrwY3Pj2dn+ft7c5GpccG9k +ce5vfuP1XFvt1+hy3Nb6VE1Xa/fl2d7pf2x6X23g51xt2v5sY2Dp1Obo1+VyamRVW2f97uLq +Zmds+3fw7e/tem5saGbv7Whv6OTm5O/6+/Ti4vJ86OxiWFhfbOzf6mtv+Pf5aXZmdPp7dWxs +Y+jY2dvd5nRz8Ov6/3ZmXGXv4v1hYnnt93t7bWFhb3t+eerqdn3m3N96X1pcXm/u+3H24NvU +1Nnd2dDU4Xtib9/V1NvvWk9IPzgwLzU/VerNv7/DxcTGz9fWz83PzcvKxsG/wcTDxMTEwME7 +GhIYJC9Tt6qtvruqrWswMj9X0ri0zU/ZtbS+xsLJ3s++wNvTvbKv2R4PDhgpbq+lprG4qKKw +SisiJTi8rLZ/eL62tbW94FfeurvV5sm9sqmuKw8LEyNEtKKhrrSknahkKx4ZHTuyrrmwqKmw +uL9RN0q9t9B5z7+2qJ+4GgoLFSX9pp2jraacnrQ+IxgVHkyvq6ukoKavxkIvNmnGx8rFx7up +np7gEwgJESW2nJqfpqGepL4yGxIWKNCtpqOhoqazTSsrO9y9usHb2relnZ9PEQcJEiytmpuj +p5+dpMQsGhUbMMuvqaSioKO1OyYoO9O7vdtfy6yfnKM6DwgKFjapnJ6mpZ2cp9wmGBUdO72u +qqikoajJNCktSr22zEtbvKmenKgqDgoNGUGmnaCinp2hsjscFRknWrKrrK2npbBXMCov2a+4 +cEn7uaadnbEjDwwPG0uon5+enZ6nwC0bFxsre66pra6pqrlVMSs5yLTAYVjOr6Kdn7YmEQ0P +GzusoJ2cnaOv+yobFxsq5Kylp6qtscNIMCw+wrW//WXOsKOen68tFw8RGSu8p5+cnKGwaikb +GR0u06ykpauwvdNNNzNDyb3SW1jQrp+dpLM3GhIRFh9gqJ6ZmaC3SCgbGR4r3aien6q1z05H +QkFP08x6VVnYrp+eprhEIBkWFhopvKGZlp2wRSkfHB8qSbCgnqa6ZUFAUXTj5ObvXm7Uu6mj +pq7IOCAZFBQbP6ialpmnZSwjHh4oO7+lnZ+w3D82P+zO1dHMZ07pxLKppaq8YC4dFREVKLOb +lZeg0S4jHh4kNMmlnJ2sUjAuOta+vcDF1UtGb8Oup6etwz8lGhMSGk+ilpObtDYmIB8mNX2u +n56ozTIrMXK5ubzE3k8/RXG4p6SnsNMyHxYQEiitmJKXpj8nIyEmLUG8o5yguzYlKT67r7S5 +xnhAOD1rsaSip7VbKx0UEBc5opaTm7guJCYnLDdat6KdptYsICz1rquzuNJNNSw21qien6W2 +PSMcFA8Z7p6VlJ3SKSYpKS49c7OioK9AKCk7vaqsuMljOCsvSbafnJ+qwjYeFxERH7OZlZim +TikqLCssOsurn6PPLCcy4a6or8DTSi0nL+Cnm5qgr1gnGxMOEi2kl5SbrjssLysoLD+7p6Gs +SCwvYrKqq7zYVjUqKUGxnZqdpsEzHhUPDxrGm5WYosI3MS8mJCzoq6GkxTAqRbasrLPE50Uu +Ji7NpJqan61pJhgRDhEnp5eWm6jaOzcqHx8xv6iksEs7X7yztLfG21s4KyxSrZ6bnKa+LhwU +Dg8a0J6ZmZ+s2kQvIB4nULOrrsTdy7u3vsHK3l09MS5BvaeenqCsSB8YEA8WLqyempufrdU7 +JR4iL2LAuLW2s6+1vcfN3lVBNjM867Gknp6nyCgZEw8UH9qonZmaoLJeLB8fKDZKd7isqqqu +tsLI0FpCOTc6UsOuoJyfsjEdFA8SGzXLpJmXmqK2PiklIyQnMc+vpaeqrrW3yN9PPTg1O0i/ +pJ2dpHQhFRITFyM5tZ6Wl52nvU8xKCEcHjPQrquoqqyprrvcVD40MjVJuqWdn7E0HhoYFxsh +OLqfm52fp6687jMfHCMvU866tqukpaqxvvhGOS0sPMetpqa4PykkHx0fIy5Ltaqqqaenqa/a +MiwvMjY7Rlm9rKiqrbrPVUM3Mz1ywLOvtuU/My0pJyorNELy3L6yrKuutc/fVU0/PENRy7qv +s7rLZkQ5NjM+X8G3s7S4vtZSODAtLi8yNj1b0b27ub7CydpmT1fwyL24ub3H6009NTI1P2nI +vLezsre9z1s+ODQyNTc7Pk1jz8nK13pjVWnjy8W9uLa3w+JMPjc1Nz9Z0L64tbm9wsjWbk5A +PDk6PUpebHRYWVFORUVNb8u9t7e6v8TPYEM6Oj1MbtPIv7u8wcvbcWtjW1NQT1rv2OdcUUQ9 +ODc5P1Xdxbu4ubzG3lpOS0xPX+DPwsC/xs/hdl5MSkhRXd3Kw7/FzG1JOTQ0NTk+TnHNv73A +y9Pmd1tda9zNxsHFytHW6WRMQz9ETWTVyb+/vsPPYkhFP0A+P0FIXfTjc21pZ29+3dHGwb/A +xMnS3mNORUJARk1y2M3Hx8fKz939bG9fWFlTT05QTUVCQkZNXHrg0sjAv7/Ey9LlbVFLSEpY +dN7TzMzNztPT19rf3trb3O5kUkg+ODc4Oz5FUGTbyL++v8DHy9DafmhuaWtqePTr6+Xc29zY +1NLMyMTJzdxxSjw3NjY0Nzo+SGPRyMO/vLy+v8XL1uR5W1FNTk9XWmby2crDwL/AxsrO2fJf +U0o+ODg5NjM3PklYdM/Hv7u2tru9wc58W1FIQkFFR01l1sa+uri5u73DyM/ob1pLPC8sLS4t +KzA8VNfAtq+sqqquucXcTjs1MzQ3P0xl0b+4t7e3uLu/yNPh5+d9U0E0KykrLCosOmHLvrGr +qKiqrr3kU0Y3LiwxPEZS5cW7t7e5uri3vcvU19bY3fJVRjUpJyosKSo3ccS7rqmpq62zyVlK +PjMuMDg6QOrGwb2xrbK5ubvJ2+RpWnrQz+5dZ0gsIycrJyMtVMa8r6ajpaaqt/BIPC4nJy44 +PEXPtq+ura6zucDgTUVJS0teyrq8yNPyOiMfJSgjJT28rqqinZ+lq7pQLyonISEpOlrNuK2p +qKqvt8DaSzo6P0VIWtG/uLO3zWNeNx8aICwpJkWsoaOhnqCqvFQtIyMkICRBurGvp6CjrL/e +b0MzLzU+SU1kzr66ubm7vL34OTQ2Kx8hMUhATrSlpausr75gOywoKzQ4O32vp6qtrK27b0Ex +Ljo7ND7QvMrewrq9w8TV1r/BUEL9YS4hIy82LjLZrqmrq6qrt2gzLjEzLzRhurOzsrC1wWg5 +MTs8Mz7Iur64sLXDztxSS15UTNa/zW11cC8dITc1KTuuoqeppqm0/i8lJywrLEe1qKipqq24 +YjEsMjYzQM65t7e4wtz8UkFCUGHtyr26tbTHSzwqGx0uMypLp56kpqivyUIpIScvMTvDqKKk +p669YjMmJCs4QeGyqauxvsj4OS0zRVRgzLWvsLS6wcs+JBobLTEoOaicn6qqrLs7Ih4nMi83 +vqKdoamwvWArHyMvPUzUr6aptsbeSjIrL0ffzr6uq6+6yeFhQi0hHyk6PULGp6Orur3AbS4l +JzM+Rv+ypaOqt8pkOiomLD91y7WqqbDHcUc2LjRHcs67r66zvMzk5U4tJCEoNzw9z6eiq7q9 +yVEtJic0RlfNrqSkrb3ZTjUqJy1G3sGyq6mvxF5DNy8zQFjPvLOvsrzR6V9ONiooJCs7S1i4 +p6attb/XRS4oKzlDWsSup6iwxGVDMywsOF7GurGtr75sQzgyND1Uz7mxr7O60FlMTUU3KiYq +Pk9J6a2mrLvI0m01KCkzS/rIs6ejq791RTYrKS5D1Ly3rqywy047NjY5QHG+sbCztr3eUEdA +Pi4gJkBPQW2zpqa01ObtOykmL0rdzbyro6m+W0M6MCsrPce2s6yqrr5YNzAyNT3zu6+ur7O7 +2U9ENiMcIzY4P8qsoqKuwshwLyUmLj5d0beopKu51k84LCctRta+r6morsJPPTcwMj30u7Kx +rq+61FEvIR4gKS480qyjoqistNM2JyUoLjlSv62nqKy2z0g0LC41ROy+sq2uu8vbRjY4PEBY +1L2ytLy+0UIuJiMqMzhNvq6qqq60u9s9MjAxLzNXx721sLG0xlRGQzo2O1DJvby6uLzOak1C +PT1FXNLKyL/G2eJPPD5KT0c6StnuVX/OyM9sctbtTkZKWmdw1sO7u8LNzdxTSExb6+Hp08fK +2OT2ZlNNWP7p5dnR2ltNU09GOjdFV01Nat7N1u3bys71WVr7YVFpz8bKycLBzOf85vlYU2vW +0NbTztF7U1ZhXFRWaenqaVdYW09FSFpZSEhMT1JRWuzb4NrMzdXg4dvX1c3Fw8jNztHcclxY +VVdk7vji2ut9Y1ZYXVxeavjg815bY1tVUFFYY2tmXGX88N/k393qfPt5bXVqftvc19LQ1tjm +e2l3eevj3Obi3vtsX1dcVFNdbW7h593c1+11ZF1ZUVhf+9/c3dvX5nV0XE1NT05ZaG740tXW +2dr8fGptd3zo3tfR1d7d7/txZmJ4/XLk2Nnr8G5XXldQTl5iZu/f29vZ1+VzX1RRTU9cfW3p +2Nvm42xia1xi/fLs19XY2tfl8d3Y52vt6HDv337s32ZbVFlYWWRl/P74eXR9Z2VgZ19i7mz8 +4m134+jb3nDq62h64+Dma+/VenZkdF1eaPX66uTo5N7scPtsZmhi7n/n8/B67fF0aGv5cGhp +6ex/8W53aGlkant1X2n15d7f7ObteGVfWFxm/PN729r68en/9Pnq5Ojy69/f4uDk4ndscW5r +cGxnXmZgX2drZF9ifX1ubXLt7vD34uTh7mp5/3L59+nr8ubi6/v1dV19aW3153V37d3o4+nq +7ffx6W5lfGb78mZoZV5saVhebl9v6m53+evp49/wbvr5furj493Z4Obv/vN+d29sb2Zkb2Je +Z2lwZ3Fybfv46Hz3b/71/PLi397n6uzq+f389PL28n1nfmdqaHdr8/P39PN6enR5amBmZGJp +b/nt7uXl/e58dev2bP334t549uX7fX3z7vhj7n5teufh72j16XBeX21iYWB1fup7duv47ufn +8O1w/OV/8O599nVpbn/+/23u7ul6e2j8fl13c2J5efLu9ezv6fZtZ2RrXXvs7uPm7PTp9Ob4 +cnlrbfh+enJz8OTlfXX2dXNhcuzvd2dv6eN+e+ZyXmR1+HV67/J+X1547XF67Ozzff789ndu +aHnk5e/54eHv7eDg7ndka+/5bXvk9nPz6nReXV9fXF5eZnZ0fv1/+P3s5OHo7urs6Hxobvzm +3+Hj3uP78Orj9GxtZVxYW2RoZF9jbXzy8+r0eXx4d3fr93H79fPx5uPr49/e5O93cXRua2x3 +dm1ubHL6fXFuaWZre31zfPz2/3z8d/v28O7p5ert8+/393V6+X14em9vbmdoaWppaHvv7uzm +8/d+9+7r8PD3/f1+9n5xevrx+3lqbW5vcn3v93Vva3X79O/v8P78cXh6eX/66+jn8O/r83Rw +cnZuc31ubHN3eft/8vR8/fL4dmprbnrz5ubs9f39+f5veuzx9+34eXFt+Pl++PH4enJvc25m +ffpxe/t7/fnt7ff37+rzfHt+fPjv8fDv7Ox8b29yfP77f3lzaGx5bmp19fPz/nl1cnH98e/y +9vH19O7m7Ori6f90bW9xXl9se3Vz9n5yfPHy7+7s933+fvN1ef/z9XNyfH94dnFtZ2x7ffTu +7vHy5/N0dPz9dG1vf3x2fu7k5e/s6+99eP33fGhobmZfYWVnZG/5eH368v3z5uPi8Obg7fr/ ++fT5ffbw/3j6+X72dHN9b2ZnaWZfXm52aW19Z3H+9/Dv6+7x6+Pk6/h6+PZ77u749+/s8HD7 ++Xrz+Hb0+WtxeWRfbnR+bmhzeHhrdunybfzn//Pt8uzpff7ua2Fq+nZ9fPnv73psfOf5c/Xq +63NqfvL1/vTp8nr3fW99eG73eGh0dfV/YGzc63R39+h2XW/tZWf49G5sa/XwaGX03/Fkftzn +bfva4O124+X1efzo6l9f9HdfeHBzfmJt5H1l8vhvbmhe//5l7t3gfHXz2upj++Dvb3rk6XNo +8fP5aG12/G5x7OnvaXRtZWt2fv/q8/vr9G14+X5ke9/09O5rbHNpaPt89OHm+G375+3j4X19 +82tgdv/849/q/Gtfb/thX39sX2p8aGjt9G5t8Xzk3Xfp3e/n8Gp24u97bWb172Fu325s4v1p +5/lr5Ptid+X6Y/58aut4Xfvda2399/rqd3Dk82pmefh0Zujp/O5tY+D6Xf7mev/t3+Pk7Gl6 +7WFX93Z/325e5+1f+91vXnZ59Xdd9939cfDj8PJ55Xli8+jq+Xv97e54ZPPuZF1nW2n3bXLy +6+vn7Hhxdm597H556vP+e/1vZW/uZmng5PTu7Xf3b2Lv72no2/Ntef/f71nu4mNlcnP6b2Zp +b19fbuV9Xubc+XTseWb0/HvY52Xj2uvw4fZu7nd55mpp+m1ZXnl8bGh2fP7v7fnrcvx+aXTu +4ulrduXkblxtefZ2ZezoaWf1c15t+fR67fvv2vR13uLq9uh89d9tbuxed/5dcnFtdWhx7GBu +3mdq52547G9k8uVrdNpsZOn0/dpvZ/DtenHy9W9obHbf5Wj33vn9/GtqdXZ87Otq7nhf7uZt +79hmZfRtaW/v4nNe/X14b2Dm0Ohm7ODq/GdiePpqbm1oXmn2b2bu6vHuaHHe5Xvf3Xlq+v1k +aHno4Oh57tPxZO7mcX5lXHNlXG3kcmhs8PtqdvTwdHlv+Xlv+9/g9u7k+nx35Nx0bH378mlY ++/xWW3P2fWJp1d1a7tF1YeLyaO959uBrYePbc1/r5+5zbNn1bW1662tkcfN7aPpwbPJxX232 +ZGrt9/fwbfZ2be/v/nXu6/x6+e/b32163evs/mH4enRjX+/9Y3xueuNz/uZoZP3v+mBs6fXt +73v25/ry6ev0b/Zvavf0cPfnXmD3bejza+7iXF3pdntxYOHfaPbndmJ93/b54en19/bx5Xle +3O1UY/tfXG3t3/lm2tZ4XGff5l5d79t1XXbt/WV8eOPnU3PdamZteerzW+fTXVba2Wv73+7p ++2H+5+t4Y+LjVmfcf2rp621gdO//aGlseXhfdeB7a/Xd5XN48uLyb+7ra3xtYfF4ceLya2fw +22Rn3+d9bXDc5lxifm9faezxaPntbnFtdtnoW/fvavrx7OHhY+/Vb/vc5urxbP50W216a3pq +amtgZGxpc3lkbftvd/J64tffdd/X8uXjanheXfV7bXX+7+1rfdbhc+76XPztZ/5qXOzkZGzn +7PFqbN3rb2x+7V9e+F9ieGvi5GDo0u9o/uX6dmdg3OFfb9vq6+h4ft3jbWj4fnVgVuDdUl30 +YmJqZu/tc/nj8W56697/fdjraeh79+JpbN/uYubgYW/9ZPLkaV5acnhlcGZ13/Rd6dD9aObp +6vNsaep5VnHb/P5t+3lie33w8GNu3/do6PBp9urseW3q4Otl8Np6/+Py9WZXc21e73lqc1tf +5m9t6OvufPL2aW316+Hx7dnj7nl0dG53dPn4feznam/w82dv9fBsXf7tfnvj33tZZt9gVXPk +b2by8Ov7XXPU+l/s6+3r4fdkZ2tu+Prk3dvs5/5162dt831sam5uamBr7Gdp9PltZnhybnxm +3txs79zq/Xfr4+JsduXiafXmb/hxbeToXWttemtfbHpy+3ZpdmDu8XTl5+bo8ervZv3vb/ns +ZWv7a215+nPs+nTr8nh5b3ziX1rX2mzs7Xje6mry4ntiZnZze25v+mJYfndq7u/v+nh3+2xu +bvPr7uvm7uzueOfq8uTke/PuW2b3bWJqfOz//Ph1dW9f+uZfdO9obXduc+DwZe7bb2Tz8fXv +afzf8+n+e+vp/vDf9Wv17V5u/fTv93T1fmppbnBYXezpXW3Z5ltp3/h3f37p3n114fVcXvb7 +/d7n++/6b/XoanblfWv7dml7fPpnYerxbvPpaHzx8+PlbnXzcW5s4ux67fJrcnH35XFobe57 +WnbdYV7u9O3ubPbuZm/06vRn+ud2+/j59fDx+f1udud3XvzgdGno8Xn+7e/y7f1oeeh1a+35 +aHTzZGTr9F1iYGr3+vbk82l56u5t/ejo/nLq5W12e/zudvTr6PRy/999bvHx7ndhbe9paXZx ++3dx83hz7Xtt7ultaHj78+ruc+5vZ3795OJ9eX779nht8vdpcG9iYfbo4+L77ur4bGx49vf1 +cWpw8fZpeu3q8XVub/hza3fs4vxq++t+eHHv/md56+zt7nxz6nZbaW9taGVufPHo4+ftfXjs +7nh8+Pj8b2pscG9janPu6/3s5fT3dujgb3bj5/F4a/7zcG3w7Px3c2/1cmByfWppbHr1cmx2 +8Ppo9ed1d+bs/nl17uhv7tzl/vjl7vtxdPH6cmdxfvFsc3ltdPT98e/++3V29en9f/bu7Hf6 +7HdubGpxY2VtcHp9/25u7unx6nt763347O/w+fvv7ejq5eL6+2xmeG1iY2l7+fl49/h98u79 +ZGNkd/x98+DnbXj17fxtcu73dG365PR/7+Dlc337fvR2cnFva213dnp8fnl0c/5zdf11dG1q +/e7r/Xt7+Pp29N7e8Pfy+v3r5nxy+XZ2eXp9/XdtbXN2cX19cGllaGxtfPj9evHu7+zj4Pdv ++vd5/Xh193ptfP53f/z5cXF1b//18fb/ev7r+nT+7ntyaHjzfvty7vD1fern+W9t/vP+c/v1 ++HhjaHT18+zr7PF0bHz6aV908XFqanbwfWlv9flyd/T6/vb5fPny8O3yfm53+n7z7O3r6f55 +++7v/Xx+/G9r++77b2/6/nJv/fn9fm5obW5kbHX89+7rfv7z/nf88PF/dvvw8vPq6/H/bW1v +aWhtcWtxd3n17Ojj5ezk5/Hv6u51ZnB/b3J+8vh6dv19bGVta2dqZ254cHp6b3Z2ePv3+fD7 +eOzf5ebm5u729f95dn/9fn/+fHx7bW57e/vt4/B4eGpjY2tsaW1tbHR78+j2efn9/f12/vH1 +/X758Pny731tdPbr6+75ffL7f/d2eXd7dG1ybnFxcHr8+u7s6PRyePX7+O7w/W5jYWhve2xu +dHz08PLz8/t4/Pb39fbs7fV7ePXq6vz19fv6/np5efnwd3Z6cnBubG/8f3psaGtua2v98e7t +6uf08+/9+fLv/vvu6ezp6fd2cm5nZ2dsd2xubG57bXl+/H1+9evs7uzr7vLr5+vq7Orq6v5v +dnJzcXlxaW1tbm97+/p5evl2bXNvenhuefd+//V9/vTm5uLl6+12cG909u/s7PF4cv/99/lx +bHFubPt+efx/cnzy7Oz5ePp7b25rb/jr6OXn+XR2bGt0emtscn7y83p08+/v8/t5bXrz+m93 +7/p8ffnw7Ozo6/B9dW9qdfr+cnn9//Ty8enn83dqZGV88PptYmh5eP/1fHX69fr7+/r3e37n +3+736vLx73hubWxreXFnZHDn5unj6f959/52/fL6cmdrfPLo7X1ubnj8fvpvY2ltbfXq/Xp4 +a2lqeeXq/fvv6+ru7+3w/X3z8fnw7vT/aGt0c/HvfHBsaWlreX359WxnaWdqefttaG50++7v +7+bn8Xn9+uri5fh3cWx37+ri4fdiXGV3e/Z3bXv6bXF8a3Lv3tvpbO/R095+XV94bXPyWkU9 +R3TRzM/X9F1MTmHZysvZbU5LU2/NwsnfZ1NVb9rFvsbc5HRe7OBlTz0vLTvlvLS7zl1FOj9p +xLa3y1A/PEVry769y1s/O0Ne0sG/xNdNRWfa1s3Oz83dZFhd/9nP5dnVMx0s0L+0scfP1C4r +Qcq1rL1dSjYvOu+4q7HeRDs+UM66r7THXkhN6czIt781IRwhX6ysq6m/PCgiMbysrK/ASzQq +KkS4rK6+Szc3OEq9ra242E9DOj/Grqy40tjjQC4oJyQvuqy0sbb0Py0nPru1s6+61kItKTlp +v7W3ucJTPUhg0L62sLxSP03iwbu9uu8pHhobNa2mop6rai0eIUbDtKWirfQqHyg5U8e0ra3E +PELVyM/MvbC03E5g1c7P1+NULR0XHUK6raOdo74tHyQyR7ymoanNNSorKzHrraexv8DPRj1x +tq69zcPOTEbvvuUoOWIhGylJvqy4qaG/LS0yOTdJqKO7ZXRJOi4wza+40LyvuXhkxLrH2sbA +0Es+Q1XvOiIdJjMvPLGfpLTIxn8yLEDZxcrHtMI8Ps7JVEjPuMBs17ezu762ue09PT8wNG3N +zrzPHxksKihmqp6fu8W+OSYsQM/O1K6qwFBW2ms+SMa4vMK9tLvMx7zMR0s2Lzw7TcC6vy4c +LSodMLenorC5r1IpMPm+y8atrcxQXXZfVNm/v768vbrUWNJKQ1AvTLpITMpiMh8fMTMtTq+o +uMKwuE1F683Wase2zvW5ssdPT95nRuS5s7fAfUw/Mz93VFVa30cvNjosLTU6Zfzjtq63t7zE +3ktd0Nzfvbi7xNbT7VdZ+czFz9rsWk48OOXXTFFrV2Q5L1FOLj7dU01ly7m/x7m711VVdO9u +3MrNzsTF6Fv0aFtu0MC/ytLdZT43RmNQU+DXX0FHUUg+R/R4Q1HJw9/pw790TFtrY1/SvMDS +y8f4SVPb1uPNv77ZYWhTQD1LTVRcVWleXN7uW2V5cXle2sjR2db1WFRMSEhUadDL19rQf1lb +U3ne3srCyc/bZV1JTGfb1dPL6mJbWl5kY3zqcFh09257c9/bV0lOVU1a8dXS5+TcaF3p32t/ +2dvbb+feVE5eX2xu39rMYOLK4efU2N9efetqa2xqXk1IUF9W7eR44XBpX2zncml87ufu5NrZ ++3xuam5fdO3Xzc3U3X13XVH+dPL/7+9fVu9SSVlSWNrf/9zYdWB4/fV7c2/r4G7t6/7meu/v +bnnf6unk6OPm+GTr2e/mYP5yTFVTWF/2fnHqbWloa2Re7fT75+Lo+W/e7XHc5N3X2vfp2vlc +52FRXWnj6+bf0/VYXl5cUFVkZ+/sbt3cWnv3eeddfNdxdmvs3l934+rc3d7e8d7lYW9y/H1d +/t7s+1plYk1PXGpvbPvX3eD08+dkXWpi7v5o191x++DY2Obb4t16+mrxek5Ob25bYPHZY+7n +3V9bYFpe4v7673thZOb17NnX0dXyb/BnWGhfU1x+9t/c5d/e7Ovd82vx9VtgZV5WaXJiaOP5 +/ebv+uLiaefpa2J99mpo7exr9fV049/e2d766OpmY2VYXnNaXvvq8t/f4OXddFpvXVVedf98 +auncdXnf3+fj6udubf1/Z+P1bN3yeGBs5ndoZn5092dp425bb3Fqem94d357697a3+zf62J+ +523j4/j2b2lnb29pdG/77+3s6ef1+F9bXmdbX23raWHl4vduf9/edurr6fNoffb+aOXc5ODz +3dvs7PF0YlNVVl1lZ2ns4N/obezrbWVt43Vbberq//fe4HPk3OX0a279Y1t18flraGrnYmD+ ++Gpt++l67vDx6ftf7OFk3vP96+N/cOzf63jy9Plse/R7/nRqYHlnV2Z89m9/5/B2dnvy8mx9 +4u796vFuZO/vfubh8PLpa2Ru/nDh53P57/77dmT26+T1799sZ25qZXJrYW5taGX87e199ePo +715sbXtmeeDy9HDs6vvp3dvb2ePt9WRpb23+YXb5Y2ZzfnZ+/fXsd/dnW29sdml+92le/fp4 +4N/h7ejoemT54PP5597zcWry5/zz++l2dWlWb35baPt1XV9tcvT96urq2ud2cO3j/vt3evL1 +7+vi6n7v7/tkZ2hjY3JrY278/v76eP51/f749vX1/Ovz8u3t63Tp4WleZ3Bzf+Lo4+ly8+1r +/25u/WVebWJo6/fz6vf3+n11d/3n9XfsfGRmfWxl9e5xcOvq+/Lo8PDt7e3tfmZvbmxq9+h7 +eubu+uDs3eZ9eG5rZWthaXN3+29xfm7l5F3v5/l2a/5xdXZraG11ePfm4ujrafXc7fvj3u91 +av/7fvPq7fF7c+/2/117fmZmaW99b3Lr7u51bHtoYm9ucvPt6ebj5O308eLyc3h1bWtlYmxx +6d/p8vPo6ufr4eX+d29wY2ViamxmaWl18/J/eOnq/Xrs+nnyeXlweXx8fmhteHdtc/j+8ezs +8evj5ebq6e3u73Ft+Hx+/nJvb3N3a2RhXV9dZmdoZmRtZm348Ork4eXc1dbTzc7Pzc7U7VxZ +WUtERkxNSEJIV15h+tzT0dPRzcjKz9DLyszO0M/eTklPRD08P0lLSFvl/WDu2dvc1czL09PL +y9nMxMjHwcj0P0BQNS85REZARc7KY2DKyOxgz8XS07+2t7+9ub3C3D0sMzEkJzpQVFHCrbl8 +1b7lO0HOymXIray2tq6wwd48JygpHSI1XNfLr6WvztnSRC0zXGVavqinrKuor8RYKyAnHxso +RtnQuqSkuN3dXS0qPU9OzqujqKijqLvrNSIjIBoiNFTNuaemsMHdVi4qOUJHyqylpqWhqLjK +NCAkIRohNVfquqSnucXQVywqPT89zqmmqqOfqLzaMiUmHh4sOEzTr6autsH8PSouODVLvaup +pqChr75YJickGiY5PVLAp6q2tchPLyw7MzbLr66roJ6qtsQuKCgbHjA8Q+2sqrWwvX46Lzoy +M/63sq+loaqtuTYsMx0cLzo3Ua+tvrGw0D82RDEucr++sqejrK2vPDE+Hh82MzNPtLbMr7HZ +T0VJMzN9y8i0qamtrL89STcdKD0rL9m5zsauu17i1UI7deZjwLCzua6xSkTPKiBGOihBv9/y +srNkbcdYPeXFeM+1ub22tGE6wTshV08oPr9RRby9TWPCXD/Iv2/Is7rKvL1JO+M9JlXqLFG5 +S067zkxczFxFyL7Su7S4vL2+TjdvOiZPci9euk5cvfFFT2tKQtXI07myt7m3wFg/TTAoU0cw +yr5ZwLnhZ15MPT9jac63trW3trxbR1AtK0k2NNPY77q8z9jcVT9GWkxyv7q8u7O+XuJZLTJJ +LjXfV/+8vsvMw9xXaW1YYMy+y8a3xF/mVDA6STE3VkdayMjNzsTL+tXP/ujOydfKvMvi3lI5 +Q0k2PklAVOjm6OXNzeHOytvWztDd0MTO29tQPUlIO0ZPRlb8/+X618/gzMnZzsjU2MnFytDU +X0dKRj5BQkRQU05YU2je4tTL0MzGzc7JxMfMznFPSkJAP0RKUGJfX2V939/Syc3Oyc/QzMrD +ytZ3SkhBPD0+SFBWamFYZe/cz8vJxcbJzc7KxMPL31hGRj88PURNTlFbVll45tDPzsXIzc7P +z8jDw8v1UUc+PDtAS05VVlRdcurTzsvHyczX3dDLx7++xvNNPjk9P0BIU1ZPUFpi9NvNycvO +1tva0s3HxcjEymVKR0FAQEZLSEtQXmt12tbW1tve2c/NyMbFw8TDz2BMRTw7OzxBR1d+/PPo +3+bl3NPOysbKzs3Pz8zLz/xUS0E8PD9DTmBnffxubGzu3NXLycvJy83O0tLR1djzU0tFQUFE +SE9bXFZVVltr3dPNy8rHydDX1dnV1NrY4PhsWk1ISUhGSU9PWGxtd97V1tHR19zf3Nzn4NvW +2NzheF1QTEtMTldkaXPz7/D9++zi3NfW2Nrc3t3j6ufxaVxXU1Nba37u7+/zdXNfV1heZmz1 +4tjQztHQ0+NsXFlUVFJWau7n5uPtb2BiaWlmdfrf1s/O0d3v+WtbVVVUV2Nt6t/f9GxubWZc +X2lrdOPX2d7c2trk9XZyePnu+HlybmlkZWJhZ290YG70dHjr8/rn7Pf08/j4fvzv8v94bXf5 +7vZ8bmhtcXh+7PDn3e35/HlqZW1uaW1vXVLz09/55e59/fXr397v7O5nWlVYZH3w59jX5vh+ +d3BsXGJmXWl87ezv9O/t7fX27/bv7fPu93lyffx9enRvZ2ZjX3x1c/Pt9n98e/j58efj7Ht6 +fvv7+e71+3j7+3z4en16++/q7Pp+fmtmbWprffp8+n9ucnl9fm/28vbp7vbu6evn7Hx2/vV8 +/vp7c/fu9v9vW1tnanf5735+7ufw7Obl6P5rX3H07+/p7fj18fJ2aHB4aWxsa21yamJubPDe +5+/g3u7j3+Tp8vx6fHljYm1iYGd1bGNtbHP27ubk6ezo6O7x6ujt9HtudXBz/nJ2enb/dm9t +bHz/dPf4dHz/8PHr5Obt7ep5cHlqamr4fHhubnn5ePPn+3BlX1tdZv3i3N7g29re5fxsamln +YV1bYGlx7uvl39vf7fT8bGRhXWJrcPLq393f5P/w6X1uZF9canv97O34/OP8Z29zdHB3dPnr +fnf37/T+8e306/T67v9v+e/z+H98a39xbXh5b2t3bm59a2348ff69PX76ezq4/Dw7PX7d3J+ +cGtne+/u/fl+Z3f2+3J7fvTzc2/9/331cnjr6/X5/vzq6uz68+r2aWlpZHjx6/fq7Xt0bGxr +7O55cnd0cWlw9fZ893Nu/Xj77P1yd3zq/unu9eh+9O78b218cm7t53z37nt5/G5vbmZpc311 +8Oj0bnF1aG12eHN4b2/78PHh3+bu9v7zdW55b3FtfP9vevXv/vDq8XJvb/76d/v4f+rk3upu +ffhvbWV693l0XmpzZ3X0d2t79/71/e3t7+Lf5/F4725kbvt5//92dXRvdvD1+P54ffL37/Z5 +8npe389fZtnhe2x282piUXzQZFfmeep+YujR5Xp+3+Jna/5vaWpr+/d2em16cG9nbG5Ybtpq +ZtHP5v107nxiXN7dVVjb2W9g6dr7Y3zk3vFffOBkZm138GliefdmYl9fc2t43tze3OXf0tPS +ysbM1+pfUEE3MDAyNj5Q0b65trm7vcbOz8m+ubmzrq60Sh8fLhsUIkXVv7yfmq3Wu8FBKSv0 +1kDZramxzbalrsPBeT4hGCMlGynZuqmtrJ+tSks7LyspW7S+r6SlqLO7rbPVXzYrHxsnIRs0 +xcywrqifsErYTy4uLl63ybSlqq+7w7XLUcTIPjgjHjMjGjTL2rexp52tZ9tWMyopUsDPtqiq +sM/bt85IzbG43jggIigaGTnMwK6lnZyv7d8+Jh4kQtDGqp+muHtQWT89w6qotMs8IyAfGR4+ +zrKloJyeu1s8Jh4eKG+6r6Ohr95CQURIyqukoaq3ThwXHRgXL8Gon56amrg5MiceHCT6sbSq +o6rFPTxOUsyspKCpu9UkExgeGh9sp5yeoZyiTSgjIh4eMbSpq6imr04vO+jNuKaen6zDRhsQ +FhoXJbeempubmqotHyAfGx9Iq66vpKW2TDVV2W6yoJ+iqrr1Gw4XHRkhvp2Ynp+drCkcHiMf +IUOtp6yspa1IMEB01LynnJ6orcUyFg8aHxonrJuan6OjvR8bIScmKt+lqK+trLtCLUvO1ryn +oKKsrbBHHRMZHhodwJ2coKCksyscJC0mKUmvpbG/rrFRMTzMusK0pKSvs62xTiQZGx4bHE2m +o6upp7E6JCcsKytDtquysausv1JSzt5U1rivr6+opLFOKRsYGBgcOrappaGkrU0rLCspNGu5 +qqysprJRPD9JR03Gra60r66tr8RYJhcYHBgcSqyioqSfpkooMDUsLD+4p6uxqKvpP0Y/NS41 +1ry5p52coLE7HhEPFRgfy56ZmZyfqTkdICcnM76gmZ6pr+cqHh0lM0S+p6CenqOrvkYuHRET +HiUs0KObnaesskwoKDlUTm2ypq/2We08Ki1KxsLFtKuyw7uyv9pWLyMcHSctNL6jn6Cmrbo9 +JykuNkFmuquuwsjLTjg0O0dDTcm9vLavrrW90DomISMqLjm8pKSnqrTWNigsNTlJzbKss8LN +6Uc2MzhBSmnFu77DwLizvMG81TInKi0sMvmvqa+3uMc+LjE7Pj1Jy7a7w7u2wU41NDo3N1LB +trS2sq+2vrW7RDExLSstMlHEy8u4tr3VUFZbOzU9R/3Lx7q3xvBQQEFFQVXIvLe2ube6vrO7 +NC08LSYpKD/KXsOoqK24e29eLys0O1fPzLOqsLzJa04+MDVJWfLKvLCvvdT/RTgzMjpNd9TL +x8DPST8/P1R90Liwt8DaXlpJPERYZvRveNPbYWRaWmlr9tTW53Bo7dzc2N5+bmllYWr41sfF +z+hfST48P1Ds1ci/xs3fYFJIPj9HUebLycnN2vZgW2zsfmby2tLMy8nAxNpZQjs7OzxN4se8 +urzB2VVHPTg9Q01s2cnEyM3R42FZVldodvDUysjExtDlV0dCPjxDU/7YzMK+x9Teak9MTU5b +bv7b0NXV2OhyWExNT1Nl5dLIxcbI1WlVS0JARExt29bPy8vY9WlnZFlYYHzr6OXh3eF6bndu +b2pgcPjt3Nzg3ej28WFVWVZWXWr14OPj4PVvaVxZZvvr5d7f2+P8+f9ze3x17uvv7/Z7a1tR +Vl5gcOzp5ujq6u7s7vdwYl1ifPTf1tPV1+l1YVRUW2fv2tLU2+lvWktGSUxUbt3OysrN0+lj +VlBOTlh33tHMys7b6GZWUE9RWmP729PP0+H2a15bWVdcfd3Z2dja5XtkWllaX3H45+Db1dfq +al1ZVFhfa3L15uXl5el2Yl5l9uPh3OH09X1gYGZnbXfu5+Lc2Nrh73RfXWFeaHF79+/r9XBj +a/9zfOrm39zb5HtqZmJia3ns39/t/m9mZ2VhYmtu+e99fPhzZ2dpbnf27Obe3d/e3+Tq8f18 +fG5iYWJgaHn77O93dXVudnt9+nj38Pr5em92em1sdP3y6+nf4enp7vprZGFlZXXxfG98+vXv ++vPu/XNnbX36+u7j5e3u/mVaWmJu9O/m6/Hq5+n1/XVqZnLr6+3r921rZmZyff/27/L8d3h7 +b2Nha3ZtbX3t6N/c3+Xt+n1vZWl59H737O/08P1vcf35d3l9dG12+vL1+Pl6eHZ0e/Xw+X38 +/XVubnt1aG50b3L783BxfP7y//j0fv726d7f7PF8ePjr6uzw+3RvcW9rZGdsdnZ2dm1lYGNt +8+rr7fPz6OPd3u9vZ2BgbXv58erm6OHj8WxfYmVkbP/t7e7zffj+dm5vd3n5fnlvdfv9dWz/ +ffz5+Pbu4/NsYmd37OTt+3BpZ37r4d7j92ZdX2589ezxff73+HRpaGp/7ero7X17dm1wevfz ++nZvbWptdPrs5tzZ3uxuXFZaafXj2t7s/XFrampvd/Tv7uz7dXFye//p6HJWVFJRZtrHytXi +XE9SX+/W1OT5bGD529jc5HRbW2T739rb6GRPS09WXvre2tbV4H51XFBXXWfey8rR51xOTVBc +7t3l6uni18zO7VNISFrUw8DH5E5GSE9+0MvQ3G5XWFpgXlZPTlVo4dDN1fxaVVdbbff45uTg +1tHX63leUVzjzsG9xeBPPzxHcc/FxdJrVE9Y99rb5WNIPD1BSXLJv77C1lhJRUhZ2ci/wNFg +SUNIaNDCv8fXW0pKV+vRzM3T/llb9M7IyedCLikrOc+up6m1XDEsLjzmurS4vt5KPjs7QV/J +u7a5yl1EP0/Tvbm8z1xGRW7Cur52MiQgJju4paGnvjspJy1EwK+tsb7mSz46ODtI3LuxsLrd +Rz0/YcW3tr7aV0z7xsXZQCceHylwqJ2eq34qISUy2K+prLXQSj88Nzc6RN63rq610kM7P1vF +uLe7y/T03drgRysfHR80tZ6anbA4IB0iO7emoqi7UTgzNTs/SufAta+wvm9FPkbkwLm6xN9x ++uH8SC4fGx4wuJyWmqw7HxshObmjoKi8SzEuMTY9SvvDtrG1wepVWvDOw7/ExcXL1OlPLR4a +HSy/nJWYpkIeGh8zvKajqrlYODQzMTZH78C1uMHPePXGubi8z1NN48bDxE8iFxcePqKVlZy+ +JRseLcamo6u8VTY1Ojk3Qf7Ju7zVYWHbuaurscVMPk/lyLraJBYVGjOllpadyiEaHjC6n5+o +ukgvNDg2ScvCvMNGNz1VuqShqLRZNDlQ6sTcKRkYHTeomZmgzyUdITC/pKGntkotKyw9t6Wk +r0IgHCfanpSWotgsJCo4STYhHCE+q5ucrjceHSzDpJ+nwkY1MDhEb7yspqm/MiEgL7edmJup +5S4kJSYeHCE1tZyYnbkqGRklaaacnq5LJx8nRK6dnalUJR4qy6Ocn67Kakk6LR4VFSO6mJGa +xx8VGTarnJ2uTS0oKjNIx6uho7c4IyE8qJiXn7VALS0rIxkVHVCdkZWqKRUTIMmemJyvPSUc +Hza1m5ae4x4VG1uckpSfwTwvKyYYDhElp4yKlfMVCw8qrJaSnLY3HBggP6OTlqsuFxYvpZSR +m7swIB8lHBceOauVladCHBUfVK6enaa2PR0YHkWdj5SnLRUXMqmXkperLxoUDw8d1JyPk7Ql +FhUotKGepb7fUicfKlWhlZqvMhocO6uZkpWkQB0TDAsX4JiMjqkmEw8beKSYlqC2MBYVIsiZ +kZy7Lx0myaSalZzDKRkPDBU+oJGRpi4XDxQst5uQlKI8Ew4cxZaOmL0sHiFqo5iSmbslFQ0J +Ek2ZjIudLxUNDx9cpJWTmrYdERczo5SVotAqJkKwn5mezisZDQwWTJuNjZxHGQ8SHj+qm5qe +wSYgJjizn56lwzI/sZ+an2kjGA8OFzumko6YtikWExwtxKSfoLU9Oj89RvrDrKm7w7Wnmp3D +LRsPDBEns5aOkqFKHBMXIk6rnp64PT9ETtXOy7zL77OknZqm2S8ZDg4ZNaybmJupTB8aHSpU +t6apydb7RWDPzLu+bMSon52kv0clFBAYKFqpmpibrisZGR4v06umrbLIPzk/RNu8vratrqed +nqwsEg4PHDK5l4+UpU0kGxgXIcOfm5yp40MwJzBZuaamr6ukrcQsFxcdHB9dnpGPm7xWKRQP +FSm4nJmamqwrGxwn462on5uht/ohEBQcIC+/n5WUm6avOxkSFB06xqeXkpu2OCIeHy+wnp2e +pb8iExYcHiVJqJqZnJ2guikaHCAfKsWinZ+nseAqITB32Lumn6s7HR4pIR86r5+hrK6ruz4v +OUU+NTpqwrKuvU04LywvP9isoaavuuE4Kik0aL+9uq+uvks0Ly8uLjVN18jExsO9w/JKQk7R +xMa7sLPFVTw7PDxIzre3w+VfZk86MTE3PUlkzry4vs/y+epzYu7Hu73Dy8zaTT49P1DzafDc +aFBGOj9GPVLXy8u7rt5St9k/YcTG3cS9wsbeQDxKNCoxOzw9RcvC18K6vL/KvbS/zs7UTjY8 +b+nTt62uu18tKCYdHy04Sty4rbCup6zC0MrCc0Hx0Ovd2c/abdG+7dTNNzctHyIlJjBOtqmn +o6WqsLm/eUVKTlfvzL3AzMTSTkcsKTInJi4xOUFYy8e2qqimpaervuZtPjc8StvBtK252F0q +KCgcHyotNELNusi2sLOurqussK60zM9nQT9DUmhpwuE8+DAgJyUiKDbszLSjqq2psbu9xL7F +vrfIzcvZ/ENJSiouPycrPjMuMkE+OsOxvamhqayruPNe5VRVwb7Hv8LWRS46LyAsLyguQU9J +0rC6u6mtuq+tvr+zwFz8+Edc1O1o9z8+NCcrKiotNkZT3cC/t62tr66tsre70HvoX03q41nY +3Tw/Ry4rLy0nMEE7XMK+ubGttLOtt76zuM3N2E1LT0tHbmU/X0swODgrLDY1OF/QyrmtsLas +ssK4vdDWyt5Z4fFRVl8+OV4/NUE+NDNFOjdlY/a5travrLC1tcPQ3vNWV+JZZf5eST1LPS88 +PTA6Szw/635iwrrEuK61tq65xb/PYF1lTUlUZVVJW0w5OjozMzw/PGjW/Mm4vruxtr23vM7F +yOLy411OXFdUS01uRTxCNzA0ODY/anzdure+s6+6urXDz8bTY/j3VV/v9VVSZVM9Pj0wMDc1 +Nkxv9Ma1ubevtr24vNXOymlb8l9UX99/UGNbPzo+Ni82ODVCX/fVt7K5rq68vLnN8MrkT/jk +XnDR3lxVXU43OjstLjYzNkt36sSztbSsr7u3vejl4lZQ9d19z8HRX2tmOS84LyoyOjE+5urc +ubG8sKu3vLTHatlxR1Pc7W3Ev3Vz1E0xMjcpKTY0NF3N1cKusrutrsG7t91b31VEVtxt+7rC +YO3gQS4zNCcpNjE138DIuKmutquuyMO+WktpT0BQzt/Tt7r2bdxAKSwwIyU2NjTVtry1pqm2 +ravI5MZaOkdYREjFxs+ys9Nve0EpJSwmHy4/Ot6urq+no663r71PWFU5NUNRTty4ubWtu+RV +QSwfIyYgJT1R4K+lpaejpbfCwEwyOToxNU7f0rWrrKqtw0s+Lx4bIR8eLWfIsqOdn6Whqc5b +SzApLDA0Ove5saunpaWtyTksKBoVHSAfML+ro52ZmqOtsfAtKSgnJyxC4sywo6OkpaWnxyoi +JRkQFiQoLsCempualpy6UkYrHBsmLy5Dtqusq6Cfp6+urtsfGCQdDxUvSEu8nJGZopydzCUg +Jh4YIGG9xbSin6y5p6K04bu6MRkaJxsSH1+4sqqZkJywrLIvGRojIiA2taaqrains72vrLW/ +uscqGhwhGRgp4a6poZiUn7PBRiYZGB4nMd6wpqGnr7a3sKyzuLK1ZiYZGh8aGizKqZ+dm5ie +uUQtIRsYHCtQt6ymn6Kxzsq0rba+uLHALhoZHx4cJkyrnJyfnZ+wSSYeHhscKFavpaSjo67K +68axrbC2tLdcIRYZHh0iMMigmZ2foq3NLh8dHRwjPb+poqKkqbvf1berqq60srs7HBMYHCAp +N72fmZyfqrxZLh8cHB4sYLmrpKChqbzVybWrq7S/v8M8HBQWHSYxPMqlm5ugr9xAMSgfHB4t +2LCoo6CiprPpWMmvqa7IzsRkJxcVGiIwP1a7o52dqc1EPDIqJiImP7yppKirqa7Dcmy6qaqz +wsnXMR0WFhsmNkrGrqOeoKu+Xzo0MSokJzy+rqyrq6yxucC7ramuve9OPScbFxkfLEB9xLWq +o6KpuuhQQDUsJiYuU7ysqKioqa2ws7O3yFlCPT4xJiAfJy47P0RUyLCpp6y1xnZJOCskJC9k +sqaio6ess7zE2FxOUOu/v1guJSEhISIkKTfNqZ6cn6evxFAzJh8gLFewpKGlrra7v8bS3sa5 +tLG9QygcGBgaHSMuUa6fmZaaoa7YPi0jHh4lP7anpaiutbu9u7e2trrCyes4JRoVFxwiLDtq +sZ+alpifqsFMNikhHyAqSbmpqK20t7evrK62ylxXZEUsHxkYHCApM0bLrJ+ZlZierM1NMyUd +Gx0rVbKnqKyvsq6rrrfJW1b15UssHhkYGyIrNU29pJmUlJmjt1YzJR0aGh8wy6qjqK60s62r +r7vM2MjDz0onHBkYHSYsNl29pJuYmZ6rvOs9LSMcHCM1zrKyubuzqaSlq7jN4nZrcD8uJiEj +IykuLDZOxKmfn6ClrbPKPSwhHiYwTMvBurGspqSps85KQUNDT2PPvOY7LyQgIyMnM0fEqqOf +o6y2xWZINy4yP27Gws/IvLezvelSTnfKxdV21MXDxFwtJSQkLTczO1jQt7HB0dvNurW4vMTN +zdfvcmJu/v9wbOfPwbu6wsvX5u53+ttdLikrJycoJy1BV9y9tq2oqKmutbu/zvlRREhRZPht +8+nu4c7JxsjSyb7A2FRDOywpKykqKi45VNnDurOura2wtry/ydtXT1lq71FBSu7NzdS9tbnM +6W57d0QxLTpLRTo4RV9eREBW09Dc0NjIwL6/ytfOvsvpZGVj7Oj31c7CddvhbzxFTUpKT0Lw +wtPj9MFu+UXtRkhJRGrX62HdfG1RWtXW2s3Iv7zVaVZgWz88Q2971enOyL/Ov8LGv2JGTk5K +P0NLY3dFUFBK4FNt3ta5Y719vsFKZ0FWT0BFR9901/XDvrnUytvC4kNXSlhM30bUUW9YT2Z0 +XnlP3dXAw8zD68lCXT1PSkRhRMlhvOPB5sZgTFxa/VLcctL9x0fjSmVAVE7Vb9fTysHfxkjD +RXFCaX/V6+HX2WnY7floamdJdl7N49p33lJdT1ZS70hZ7Mb4b9JX00p4XdVv3NTN2sTbW9Na +3lFaSu3uT9395cpfWvlbYVnmWM9h6Fn5699W2ldfUPhyz/Hk4M7h42zVeHD+Y91lXmxhw0z2 +U89U1U3dX+JudGt83EpxTdtaW1j83t3p0ufZ8G7v8N338lvZaOh6497f3vpt2OTwemvxXlpp +WmpOZlFmW3HefHns7V1sbXrw7WjQe9Tz5NX8z2rTXsxb0VfXZfruSdJBxzzbX1DSUMhPzV36 +fUzmQ8dGymPtzUi+Prc8t0vT0mnBRLg7tjO/Ocs9ZuxAuTm0OLU/x0flek7NQsE+wT7IUe3e +R7s8tT6+Wc/NS79Auzi9PMhD0lNZwju4PLk+vlNkzj+7NLw/0FZLyzq7OMJIz+xrvUm3QrtA +x1FSfkbPObg7wFDKaGLCPbQ6tT2/T2/XQ8I5vDq/P9P0S789tTq4PMFL7u9EwTm9OL8+yF9f +xUi7PbtCxGN91WfOSs1Px0fISMxT3VRi3k7JRMpEyUPMRthMz1LVW2/bWc1Ov0vBTsNJyk3O +U9hs1PPl62z1am1Pz0LPStNP2Gtg10vJRsNAxUTJS85addRY1FrlXtxi+eXlfNFjx0/FQshF +zUPVSf/eTtJIvjy/P8JNz+Vh0VDEP71CwkTMUN3zUMlIxUHERMhX2fVo407aTuFJ01roV91g +eW3wfdJmy1vSeObiXM9Sz1XPUdZm417iYV/fT9VG11rlXV7ZTctN2FDbXHjrZ+T+3GfSfNl4 +1tlazVLMT9Jd/X1c203aT91L5l9ja9nnXnB71k14btXmXOzvz2P14PfXXuFw935t7WHZVtpX +9VLYRnrvzWJj2dbfSOty2FX8Y9zoeGfw4t/hW9x201jYXGvvZVf7deZZ7GV731bNStRPy1np +52rZ6n3f799l3+li21TeXF1r+mB2cGXv++Fa3l/hbfJY8Pt5W9xt/dj/a+Ln52nhatx9XNxT +6V/u+XbbXdVU3GH4a2V2YfBa42Lv6+Tu8vRw5Fvq8/X3deRu6F3cXunjX2xkf1t4aF/t+1vg +ZeXz7e392XHfaed7cX5l+m1ve+777+318uBn/Hn2+XB2/mZ4emxrYXxm4Hb6bur+/e189+Z+ +8nTn+3Xrbmrx6Wn38XHybOVi/mX78HxyXnf+altd4eBp4M7Y+/3ZY1pt4vNe+nTveXHd+eJ8 ++WH7WWxdc1xu6nBuaetv5Hnqbent4nj44vz2/Nt7/3Xw+fvuaelrcXpy+mtoePVp7l5d1l/z +1X3l4mvj8mVpbe3r/mDYV2XIY1L91WBXX+77X13scVh+YuHbV9fef+Fk6N77de3g9+rd29PZ +2tbe3NDOzs7iUT01MDE3P0tX8dnIvb2/ws7b+G/3cHBq69jWz87LyMjJycfBw9xGMSspLC87 +Rlhy18O6tLW3wNVxUVFWUFNaXO7czsjGw7+9vb2/wMTkQC4pJycrNEJl39fCubGvsbfCd0xA +Pz4/R1TpzsO8vL29vby/v72+xmU1JiAiJSs7YcnEv7ewrK20v186MC8yO07qwrm0s7S8xMzO +x8C9v77JUS8jHh8mMUrRvLmzrqytssRPNSooLDdPxrSurK+6xd1m99PDvLu8vMJTLR8bHSU3 +z7axrq2sq7DJRS4oKS493r+1rrC2w15KXti/tLS3ubi3wzofFhQcL8ysp6ipqau3TyceIC3l +sa2tsbi4xFk9OD/RuLe6wb+xqqq/LRgRFiE/w6+qpKCksUIkHSM8vqytur+9xNlOPEbWwL/P +XWDLtaqoq7w/KBoUFx44tqCdnaS07DUnJS1Ovq6wwtHd6O1cTm/PztZaRmW7q6WlrMY6JBcQ +EyD8o5qbn6rDQiwiIi/YsKqxzWZnTkVJWce3vu5JR+i1qqaosMc+JRgPEiW2npqdp627SCke +Hy+9qaix+Do5Pz9ay7ivt/0+OELCqqOiq8hAKx8WEx1Vpp2do6u4TCkfHy3Oq6mxzkk3PElf +vq+uuGIvKjThrJ+gqbnrPy4eExMjvZ+cn6mtvTkiHSNCtaitvvhLOUB0yrWuum44Kis/vaad +n6q4z0ArHRQUJbyfnqCrr8YxHhwnW62lq7vVXz0yP3q5rrdbNy0uSrqmnp+rt8VGKyAZFB/l +p6GhqbPJMh8eK2qtp6690GJALjPgsKmv7TYvLjfPrJ+do7PVRDEnHxkZKsClpai2xlIuIyhG +uKustsjWVzsuQLaqrc47MDMzPcKmnJyn2TMuMS8sIR4r3bS3usTAxkwzN/6/u8TO2M3XXj5e +r6y7TS8qLzRFs5+cn65vPTxCQjkgFhw1wbKtrqqs9y0nMErEvbu5trrKRDnSv+tANjNDW2y0 +op6ir188PkxJOigYGSnWr6qoqqnNLiEmO8Ovr62wuNU8KTBf19ffU0liUditoqOqwEY+TeBP +Mh4WHj+zrKSlqLczHx41yK+ur7K31jspJj3Eur/JfltPRs+qo6auzT82QHn/Nx8ZIlOxrqyt +sdEvJSplt6+ztLbCTC8mKWuvr7zJXUM7OdWpoKWzXzk7f8HlMRsYJWa2taysq8I0Jy7mu7e9 +v8PZPzItN8Grr7/gPTU0PryjoKq4cUJVzr9+KBcWI1+zsKijpcItIClnvb3Gvbq9VDUuOr+s +sdBWODI4R7ujn6ezcD5J2clPKhkWIWCvraajpr8sHyhPwb+/tK+1UzAsNcqutdtfQzk2O82l +nqWx3UA+YehMLx4ZI16ysKuoq78uIytixcnLurK6TTIwO82zuM7eTTczPMeln6avxlI/S+h0 +OCIZHTa8s66mqLE9Jic8eGptwrKzykU9OkzJusDNaTo2P9asoKOruWI6NVHFei4dGyVdu8Ov +p6nGNSkuTUs9c6+oq8FHNTVG7s7QznZDQFDAq6SnrsdANkjLx08sHR0uVlzXraSnvzcuODgt +McinoarLPzQ6REdVzsdvRUJqtainqq7DRj1Jar/KKxwcJjE5XqubnrRKMSwnIiu/oZ6ltmhC +PTEuQdjS42fft62vr6212kM7Ozlxra0wGx4lJC5jqpueul9MLiQmN8Cnp7S5tMs7Kys8b/XX +ta2vtbu7vc9cVU89YK+osx8OGS0oL7Gdl59JN3A0ISdAv62wuqmsXTw7OkJIRtG0tbu2r7G9 +705MPTzFs7m3VhgUJSgkP7Ojna5pvr4vJC1Rvba7r6i7REREOj1nvLK+y7e20U9txb/O49Fc +Qj5ISi4bJDstLdawq65m17ZtMz68rL9nvbTOQjhPvshyxrvUTV7Vzci+trXSQDxCNTZOyNws +KTo0LjpG3bzVvqu32MvL3WlJT9LJ19HEvsTP+FVLUtjEvry9wcpVPkE/OD1GRdLJTkdGOC4u +MT/NtrG3uL3qSUZX0cTIysfDyN7z9Nzv39Rru8fH1mXbRkI6Nzh6TNrWYdpnRT9OUEbfzczj +bF5VTFXZzcbPbcjcd1XWwHztzl7D8MHWV8NLWl1OUnB+bVReSljNaOlk41/f81HZV9BTTllk +cHb37m1x2kze3drO19VvwEfdX1DWP8lS7NBKzD3U3vbCTMHgYOJH7mRjeUW5P8XdWMxqWXJj +Tldl2uPa4d5dX0ddYWhP3/nqy0LdXlngatrJ29/R32nfUufT7l3DVMZP4t1R00zTRORgU8VU +bFXYR1dMSlzfW2a0P8JhVU3QTt+8YcbKTMxcR9fbUsXXUctMzE7MR+3aRe5H3cZU7M3xRk1p +PdJNz9zIdXTY50Dk5uDY781twk92eW//aGjc6e/Rfs1h51BeQlBO+XvfVMFPXd44uTbU4uu/ +WrxOvj3IQdbcVL9+yWhAwe85v2ftx15OxEZI1j7ITz7AXk3dxUa+Vz69U1VPvkv2zEG5R1PL +U/js4le4aEjP1Wr1YbhO231HyENQ5u9k3kzny0TlXMpRZ1Dl2VB8adFJWdFmac9L1sQ/xH7N +Y+5rzG7z/cvaSsZDxj/VTPvTPcRDzXxExlZmYNBOzF3iZNJN79tPvj9s1/1dfcdGxlpvxEvT +TsVQ991S0mZM5PVi6W9Hxl9MyVTi5FjNTNruSsvXWGLNXm/dWN3c5EK5XVPJSM1V2zzF3Dm+ +PMPfTMzr5F1uWXHSTeXVdmDvblTNTV3KcW//xlR462f5Sbo/e71H62a+NMO/L7rtP86+QlO5 +Oky5P1nHRctaaOb5TNPoRs/LTNfW/V3hYMzzTMB+Yc1eXMNST+TuUl5bZ89KauNxeknZZ9rQ +PsHURMhPY9ngP8bLVtblZezXVWff6Et1x1Jo1W3aZ3HfWdVS1krjzUDh0H5d5fBX1mFKx3lO +39JRYMhO59B78mPPSurcWGvq7VTr7Vvs0FFtx05n3WVcdelkb9h/Wu7d7X/r+/LVbPXl9N3x +b2XbeFhczmRPbN56R+LVW0/j6lXy+edv83Tk6nRubddhd+ns5Ojv59Z/6vjmbG/za+lealv4 +9lpqcGX/8V5oduVfZOz03m7o1eL+/utkbfVyc2/37nfr5mn57fDtdOlq93V8a2/yXO5bePln +9nzt9Xr26m5qdvLgc+nk6+146nB59nbpZ3T8XHZ7c2lv+WH8ZnxmX2xbb3Pnfejc/dzn1Nnc +2tzW5+bf7Of77PL+bWNWTVVLSEpGSk1QWW5q7tzk19TP0M/O287e2s/b0tPR2N3Y3t/d6ePp +5u1XTkY/Pzw6PT5ERl5od9XazM7Nzc/Q29jc29ra2drU3NPNzdTPydHS0djo395rT0VAPjs5 +OTk6PkZQa9/Uz8nJzdDW3Ojk3ePi393Y1NPNyMnFwsTFyMzU3unk8VFEPjk2NzU0OT5IVG7d +083KxMnJy9TY9PLx++/m5e/azs3Kx8TFyMnM0tTb3NxuTD48Ojc3Mzc8Pk1h8NvNysfFzM3S +3eZx9nx+9fnm29bMxsO/vr6/wcfL0d7h8U8/OzczMTAyNztDUWTt1s3GycvL0NjZ3t7Z3t3c +3NTQzcnFwb+/v8DHz9bb3uFaQjs3MzAvMTc7P09o7NnMxcXLy83e5ubo5urr4NrY0svIxsC+ +v8DCwsrS19ndY0Y8NzUyLzAyNTtJXnrezsbGxsLGy9DV2+Tu5eDn4NLNy8O/v7+/v8XM0Nrf +9lhDOzkzLy4uMTM5SV/+2MjEwb++wsrKzNLb2Nvn7+jc3dTJw8LBwMPHyczV3OhZRT46NC8u +MDI1PUpUadzKxsW/v8bMzdHX19bX4uPj3tTPysjEv76+v8PHzNpfRz04My8tLi8yOEBKWt3I +wcG/v8PIys3R19jY3t7b2tbQzMfBv769vsHHy9xYRD05Mi4sLi4xOT5GVuPMyMO/v8PFyM3O +zM3T1NHU1M7NzcnCwMC/v7/G0N9SQD86LywtLS4xNzxKatzNw77Aw8HCyM3OztDR0c/Ly8vI +xsnHv8DEv8DR7PFLOjc0LisuLy40PENU3srCvr28v8bEyNnSztzk09LXzcjGxcK9vcC/w87p +dU09ODQvKy4uLzQ6RU/rycXEvbzFx8LKzs3N2OPQ0NfOxMPDvb/EwsDH19dpRz03NSwsLi0w +N0VKW9fKyMS8v8fCxM7Zztbv2M/Tz8G/xb69vr++wdThZE87NzUrLS0uMTVER1vZyMjCu8LE +wsbU3M/e7dzS0s7DwL+7uru6vMPLfEs/NDQsLC0sLzQ7Ql3fyMPDu8PCvsjOztHe3drU1c7D +xr+7vLm6vcLO/U49NS8rKyorLjM6RWDjw7+5try6vMTFydTf3urr29DHxb68u7q9vMtyXj85 +LysrJyosMDVJbN6+wre4ubK7wb/E29HS6tTRy8nGv7+9xcTPU29BODIuLCctLDE4QGVnxcW5 +uLmyvLu8v8vIxt7Ix8W/vbq9u8bMd0hGLy4rJyYoLSs5PlXfyry8tLqytb63v8jKxdHSwci7 +ube0uLm/5lY+LyomJCAjJyovOU34xL+1srWtr7a1uMnFwtPMxMK6tLW1tLnifVgwKyomHyMm +JSwxPkn8zb20uaystK+vvMm6xs+8uri2tbi2w2nXRiwrLCQfKikoMjxCS3vVvb66rbS6srPD +wbnAv7exr7a3sMpCf0UmJjMnHysvLDJATlttzba6v6+uu7y3v86/u7q4srC1sr9ZVjwqKC0l +HyotLTVEVOXMxra0trGus7u6wc/PycG6t7q3tdJdYDssKislJCksMjc9XsjCv7Kur7GvsbrB +ycrM1su+wL/C811cOC0wLigpLjE6PUN1x8PFt7CysrGzt7zIxsDI1MrG9EQ/RjcsLC4tLTA5 +TGr0xbeys7Kvr7K4v8PJ2v7v2d3rYkI4PjkrKiwrLC8zQt7KwrWtq6qrq6qstLy+y9jsZlRU +TzUrMTMoJScnKi4uN2TJvK+qqKOipqalq6+yvs3P+kY/OCspLSgjJSQkKSwtO2DVva+rqKKj +paWmqquwube6zfBUNCosJyEjIh8jKisvPUzsvLGspqOjoaOoqaqzur7K3Wg8LS8sJiYkIiYq +KjE9P1rAt7GrqqilpqiprbCxuczhVDYwMywoKSYmKy4wO0RN2b67sKytq6irrq21t7fB02Y+ +MDEtKSknJSguMz9XW9W7s62qqqqprK+vtbu8xNX5RjEtKigqKSYnKy02S1/iwrivqKWlpair +rK+4u8PUfUc1LSkmJiYkJCgsNURP9cW6s6unpaWnqautrq+3wNJONy8qJScnJSUnKjFBSm7R +w7asqqmoq6ytr7Gxt7zLUjoyLCkpJyUnKi04R13Mw8C1raqoqa2usbi3uL3A0kc1LyooKyko +KCktO1Lhwr25sa6qp6irrbS6t7q8wOc+LyslJScnKCkqLz9szLi3s66tqqipq66zu7q6ur3b +Py4oIyIlJSgqKi89bcW0r7Cur62qq62vtbq6uLm2vmk4KyUgJCUmKCgsNkrVuq+ura6wrayv +sbi+vry6uLfMQjAoIyQoKCorKzRJ3ryvrq+usLKusbe7xc7Ivru4vWw4LCYkKCopKywuO+q8 +sKysrq+vsbC1wM3V5828vL3ETzErKScqLisqLTA+zbWwrq6wsa6us7rG6V1p39PMy95bQzc0 +NzY4Ozk2NjxN6MzCw8zV1L2ws73DwcXKy8TCyMTA1ExBRz41Ly0sKiktOElx29jMvLKtq62u +s7q9vbu8v8vU4mRENzAvMC4rKisuOERzx76+ureyr7C0ur/Ew76+w8nKytFyRzcyMS8tKysq +LDNE7MG5trW1s6+ur7S5vsnW19fOysjNXj80MC4tLCooJik0Tcm4s7Cwr6yqqay0vt5gaP7d +zczR2f5LOjQwLCknJycqNUjdvbSvraupqaqttL/ab2FXX+vY1NLZcUk4Mi0qKigoKSw2S8mz +rKioqaqrrK+5ymdHPz9FTmPk0s/Vdkc8MSwsKikrLThPyLStqaiqqqyvsb3ZVD87Oj1KV+PF +vrvAcEQ4LiwrKSkoKzdQv6+rp6ipqqyvtcV1QzUzMjZCXcq6tK6xvOhCMisnJCUmKTBD27qt +qKWlp6yvuMbuRTYuLS47Wsi0rKqprK67LSIuIhokJSAwUsimnZ+dn6qy2jstJSIjJzBMv6qg +nJiYnKK8KhYPDQ4VHjG3pZqSj5CWpGcmGBQUFBooV6abmJeeqq+6tK23xlwuIRkUFhkhPsal +nJmXmaGyRiIbFxgeKD62p56doqm9X17fuquqq6y88ioXEA8UIVqqm5mZm5+s1yoaFRMaLOar +n56fpK6940hK3LesqayvtNMzHQ8NDxlLqJqWmJygqu0tGxIUGzKzop2fqa+5wNlXRUntu6un +p6iqt0oeDwwNFTaqmpWYm5+vdCoYExUeV6idmp6prsNYPC8vOmrDtbOxq6KcnapNGQsHChMx +p5qVlZqdqlAkGRMaK8CemZmcp7hbLSIfIS7ptqqqrqqknp6sPh0TDQwSH0SlmJWTmKCxRSQd +GxwtbKucnJylxDYmHyEqN+a9uq+zsKyrqrXcPS4vLiUbGiA4qZqXm6rMPS8oIyEiMsejmZme +rVYqHRkZHzHCopuboK7D0srPeTwzU7+6Sx0WFx/RpZ6hsOP72k49KCIxxp+YnKxDJiAiIiUs +Qa+empyr2T5D2bSvuLm1r7E9EQkJDTeaj46VqLzNNiUZERo6o5GSnc0pHyYqKjZLsp6anKpf +Li43SeVb1rGkm5yzHAgEChutk5CUnKy8+ScZExY6nY6Nlr0mHBoeIyQ8sJyUl6lKKCAqPlbJ +u66fnJ6qPhQIBg0ko4+Okp7AQC0fGhoku5iPkaI6HBcaJDdWxa+loKW5Py4vSL6xsrvEvK2l +p7kuFQoKFzqfkZOapLj7Ox8YGB/anZmdtDUoLz9WTDo76bKmpbPc37+vq707KCc7taGepuUf +DgsQHr6YkpOarzQiGRkhOq+bmJuo5yoiISQtSbaim52q6CsmKzhc7VhW37amoqSowzAbDQoR +K6OOjJKkPyAfICAoOb2dlpmoPR0ZHy7rtKypqrDNOSopOcutqrdVNjvLq6OhqcMvGA0OG0md +kZSctDQkIB4hMNSlmZmhxCkbGyI5tKSfo7dILCYrUbepp7ZrPztUt6qop7NOKBcOER/fmpCU +n98hGRsgNb+mnJidsi8ZFRsyspyanq9AJiAlNr+qo6W0XDQsMv6uo6CktEYhEgwQI7aUjpao +Qx4dIypJuaqgnqjKLh4dK/mtoqm8XDUvNDzfr6moskkqJSpZqJyboLRNNCMVDg8ftJGMkqsp +FhglQr6ysKmiqLwvGxgj66KZna5LKycsOuq1qKSqzjEmKEetn6Ct1j9EUzIaEBUls5eVn9En +Hy/WuLncV8Wxsco1JClvrKGnyjQpLUXKwb60rau0SSYeIkWpnJ6ou9vdeCsQCg8io42Ml7km +HCg4Ozw77aOZnLQpFxo1s5+ivT83OkxoSuizp6W3Lx0cKbmblpqnz0xBLBcLChi5joiNpyoV +FiM4UsqwoJiatCUUEySwm5qmZC8uMjxK7rWloa09HhkgW5+VlqDINC0uKRwPEiylj42aTB4Y +H0m5t7avqaOtOx0ZH9+em6PKLyszPUFDUbqloa4+Hx0sv5+bobROMjdJYj4fFBxFqZmcvTgu +L92yzkZP77eqxTIpLFGpo6/XODJBSTtAWb2lo7JDJB8s366mqrW6u8bR6E82HREYLrycmqrJ +aDtOcC8oNuKroKx1OTRAy9VEP1TEr7hZQ1HArbRfMi02fr+9x8q8rq/LPzdFa0QiFR06sJue +st/tR/JMKytMt6SkwDovMj3zXk7PuLG03zc9Y8rGcklxx8XhOjJKtqanu0Y+5rWyQxcNGT6m +mqPEyrvJxjMeJFOtnqXeNzU4TnA9T72wrrpCMj9Ib8rFt6y9OiYjNrKipK7PWsi1vUwcDhMw +r5yfuMCwtsg8Hx40v6mow0hk83JYNTbauLK4Wz9ZXWbRyr+zwz0sKj21p6mvv9O8ts45HREW +Lr+op7Cvpq3+Lh8hPb2ytMHHuLpjNCovbrazu87d0/ZKP0rQt7XOPjI49rq0tLS3trjLOyIY +FCBLuKilpaKn4i4kIjD7zMK4r6qt4C8pLULIv8W+u7zDZjs8W8i3v1E7PVLFuLe2tri9zj8o +HBYaMsyup6ejobFFLSUoNj5ZvKuiorg/Ly82PTo+17Ksrr5NQEha2d1XSEvivbW3usG7vMxI +KhwWHjj3ua6nnp60SC8oKy0tOsGpoqa5fEo8NTAuPsy4srK4v9NMRlRpaEU+e7iwsr3JvrrQ +Nx8XGyk84L2rnpyowkQxLiklLFS2qamvtLxkOC0tO1Ne17murbfqTV5jTEFBacG4t7W0trpZ +KxwYHikvVLKjnJ6ss8U/Kh8fLVrMu7KnoKfUNS0uMSwuW7Goq7W8udI7LjBGzMPFt62psek1 +Ix8fICEteqyfoaSlqLZLKCEnLDM8U72moqauwW9ALCQqOOK+vLGpqrXnPUBTTk9d07avt+Is +HSIrJyox4aagq6qmqrVCJyotKywsQrKprKytrrNlMS4wNDtDfLqwtLe5ubnSUlhQVFRHRTgm +JzAtNkzls6qysauus807PEE0LiwyXcXBurOuqrXeZ1tEODE2XNLXz8a3rq+8wL/TTzQrJSAj +Kiw0arepp6ysqrC/bz48PTUuLjdU5NvHtKustb/Axu1GOTpCRUVV0Lu2uLi0tr9fMCUjJCIg +JjTpt62moqChq7rJaD0uKSsvLzI/b7+4uLCsrbC8zNF5SD48PUlUa8/Fvr3UQzo9OS8qKjI+ +Slbcu6yprK6vtb79Rj86NDMyOERm0cbFvrq8vL6/wcjX61xMST49RU5ffGhYZl9ORD48Pj5F +Uv3Pwry4tri9xMzqUEY+PURNZ93NxsbJzNjt6e3u3tnS2NbkZFZMSElST1BXVlNMSUxOR0ZN +beHPyMTAv7/Ezd3mb1NJSE1TatrNycXK2WNYWF1nbtbMyc7P3upmVUxFSUlIQkhNT1FaXV1y +2MvM09HO1NHM1N7p62lWTWJeaufZzc3P4OtxXGFZVffhzs/X29zqX0xGRENAQEdPYXnj2dDO +z9Tf59/ybn7n3uTc1tns62hpaHD49Nje1PjseXlrZvb62ufT5Ndvd1tPSENHSU9OWWnr3dLY +2uLtbl5kYG9+4dnNzsnP293e7GRhWnhie+/h5+bc6eFz6PHu925dVldNTEtPWF1nfObl4+7u +7OXta2t+dWNod+PZ183QytjW9PZ5VmRaennr7djV1dns5+3ra1tSW1hYVEtRT2Jgamvt5+zp +6N/p9F9oXlxuZOTc1NDMytnc3eJfWVNmYP3r3szQztrrdlhcVFtZXGBoYWVeYFxsZmfu8914 ++3l5b3xhXltw9e7j3c/OzdfZde14aGph7HHe79Xb5N3uZVNUVVhdam19bHNlX2tedGFsf//p +9vh2e3p+bXRt7OLZ3d/f3tjp7PV7cXd0d3vs4+Lj5/pqZFpWV1deb3x1++/u7Pl88XJvbmv8 +eP388n91/3Vvfvbh3dra4uLzaGtqYGBpbPfu5Nzm4+ToaGRcWl9eZW10e97f+314bGhiaHl+ +9ffx8/N/dXx79Pr57Ont6OLq+Pl1dnx+/m9ZYdbM12tafdzuVUtVd+P4dPvrblhr5N57WGjf +09nkfXn6/nt4Z2N2fXz87nhnZ+rY7G3+2dDfdnD77XVgWGVuYlpk9PRgXPre5HZo9dzdbWRz +6/h6ZHT1/mdw8+/q4d7i1tfb62l372JadHhsbl9ZVmXm6F5r5dXce3rY1XtqXmpjWE9m+2hr +8OLzdfvg6Wp85+tsfuPS1vHq3NHX3+rc193k7eXqZlJNSEI9PD0+Q0tT9tLRzsnFwsrWzMXP +3tza1+1kZ93O1dTSx7y9yMbG3lk6LiwsKSctN0540Lyvra+0ub7RVkQ/Oj0/RFffzMC7uba2 +t7q+v8C/wdFURDYsJyUmKS44U827sq2tr7fE304+NjQ3Pktrz8K7urq8u7u+wsDBwr67vcxt +SzUpJCIlJys3a8C1rq2tsbvWTz08OzlAUNjDvsG+vsTM39nNysW/vriys7xrQzYoIR8jKTA+ +47qxrK2wusp9UT02Oj5FXNHDvL7Bxtp07dzZyr+5t7ayr7PHVDwtIyAgJSw1S8+4sK6zucLc +Wkk9PEFQctfHxsDJ3PleXW/ZzMO6s6+vsLC1x005LiUgHyQsM0PaurOvsbm/021TRT5ATPro +3dHJydTsaune08rBvLe0trq8vsLlSkU3KSUlKC80PGnDua+vt7vG4FxFOzxFUnFld8/JzNDX +zsjIx8XAvr/J0NPZ3994ZlhEODMvMTY2O0hs2MbDxcPEx8nP1+Xr6XRcTktLRkZPaOvPxcK9 +vL2/xsnJy9PZ1drrYUo/PTo4NTY7QElYZH7XysO/wcbQ5HVZSUFETFNf7dLKxb+9vb/AxcbF +yc7P1ub7XUs/OTg5NTQ4PUVT+9jNysTAxc3fX1pZVlFOUnPf39rY08zFw8K/v76/xMrU3+9h +VlBMRT89Pj48OzxDUGNsbXbo187O1dfb2dXY7l9UW3FsVkvmvcXHtbK5vMDMztjk+GRQSDwu +KisyODtEZcm6trm8xMXK7EhAPT9JVFRYds7Bw8vNxr++y9fe1M7O3tjFvcHaXUw7LCYlKjU7 +TtW5sKywusLPbk09OTxEWObp+NjEyd/t2MTBz9TIv77Dz9DFwsbhS0k+KyMjKDQ/SteyrKuw +vsrNXz45Oj5Pefvmy7/D4Vhi3NDY5Mq5tbm/wLu7yPRPSk43JCAmLTY4Q8Ssq660ubzNRDQ6 +Qz8+UP3Nv8jb6eXd13Rpy7u2t72/vL7GzuReTkMwJSMnLTM4Vrusr6+ws73uPjpAPjo/TVzN +xtDRztHP1PXcxLy5ur++vsXL0OBpRTkvJSQqLCw82rqvra+trr1rTkI8ODk+SHPg2dLOzcvO +0s/Jwr+9vr7DyM/a3N97WjsvMyskLDg1Ssa+tayytLLIVFZHOjw6N0hoY93LycC+xL+6ury9 +yMrJ3l9UTU1OSktbYkU4NTI7PzdCzr/HxMK8u81o8/ddTElUet/s4NXPzNDRy8rR2drV2PdX +Tk9KR0hNWWJnb+jd3NXQ0dPQ2e9tZFtTTUpLTExLVW/s5uXm5+bj3tXT1NHZ29La+mBVU11b +WGT869rX29jU0dPX5/xxZ2ZkX2BdVE9NT1Zgav7o3eHo7vLs8fd3a2pmX2Fia2v04+3q2dPR +z9Lc3eTv7GRebWthbnlqd25ZXmFdY2967uXo4OPs7epuY3JlWltcXWhsbX3r6unh3dzZ2d7s ++vx2b3r5e3f6fXFza2NqeG9xfXj8+Xd+f3lwa2hnbHRwfPnv7//w39zc3N/k5fx+e/v/eP7+ +enp4amRXUldZXHLz7e/t7n5vbGtrePTu7ern4err6e7l4uvm3uDk7/x7b3d+eXHy7XZlXl5c +WFxfX2N48ezo5uz5fXRyb290fPjr6fV5bW5+8GZgyMxuXt7QalXW2GBRbN1vU/TR91ZSTtDU +Tn3Kz2Fc9etmTU1n2vdZbWpT18tmWerO4l9e29V4XG/X1XFd/dvc63p8+3ZlYGFsenFq/ep7 +ZnXk6l5d+H9gXXPm+mr429rheHLj3+Te6XL68+PI0zMsy6hrJDmopkkqV6y6Mi3stWgwRbOx +SzXossA9OmHM3VtVSWPKw8zQz8nVak5ebmRKRlLp6XRf79LY9/z/Vk1VYPLxZe/bys5pYurj +5l5ZXuTR51VrzdVoVuPXX1ZlfnhYWG/i+k151OHf19ze2+ze+ExO7uJORPDJYEzfwMtLStbH +bkRVeNXdX/3TzPh8eGf6Ylv53e5YVvba83Tm3dnqXGJuWE7f1lNPfczaVVffzWdSWt7TcUvj +xN9WZNfPaUtd3NhlV+zK2F5u1NZeS1jv6FJV5dnlbmr+5F9gc+9uXFl829nj7/vg2PJUU+LS +aWh079pzXH3jfer1Ymbbe2RXY93Ybk9Y1c9rUnfl8/1ZcdTP32Rb19tbV/NkXlJa9+3x++T2 +8d1+WPrYy8xkTV7Q4U9H79Dhcm3nzdpcVn7YaEtP/+HuYv3X8GVo6+JkXVz63+twZODO4F1a +X3Xd5HFreWz72vZq3cvNdVlx29feXnPX/lFPWO5lT+5oSENJ/Nh1Ymdh83Nc+dfOytf65cm/ +wc/X0Nbvf+rm1MzYdczEdTImJzE+Q01o7NniXXjezMPO8NfEv7u+wby+ydLi4srKz87Xyr2/ +VB8bKDpCPTrkuMtDNT/Twdps3MK2t7q8v8XG1vHjy7q5ws3Syb/BVyAVHj753E9mrq/bRTMy +TdDS1dTAtLjE0NrX2GlPfL+yrbHCzsa+wEMdFRwyz8Z20rKxx0Y1PF9aRkrlvLW1vcXL0NpZ +S3O9r6yvur+6s7oyGBMaL8rA58+7tb5PNTpS6Fs+O1W6q622ws3N41FdyLOsrrm8uba6OBoV +HC/e01Blw7q7zkg7P1bqVT4+brywrrG6yPlQU9+8r7C4u7i0tvcmGh0pNjk1Pti5sbPEYk9P +VFZJP0BTyLOsrLHHWkZL4sK+wL64sa+z3S4hHyEkKC5GyratrLTJdE1NSkA9P07Ot66rrr30 +RkNb3c7Du7Swsra9XS4gHB0iLDxtxbevr7S6v8z9Qzo8QlHqybu1tb7aXGDWxcPJ1NfOwbi7 +cDAnKCwvNTk+RFbZvrSvsr3L0s7ZXEVDTu/S3Xxz4MzEyeBiXv7UysjIze1XTU9RTUU6MzU+ +S1ZkdtvHwcXM0NXo7N/yZWRkdeHU0Nbo38zIysvJxcbXd3jrcU9CODMzNjo+R0/51szJzs/L +zM7V5v7o3uHl5ufv8eTVzMnJysnEw8nS4WNLPjUyNDg+REdIS1d/0MfFxczV0s/a5dzo6uXv +9/Lp2MrDvr2+vb3MeVhWTkQ9NzQ2Ojo4OD5O9NTKysa/ws3X19ja7l5bY+LOycS/u7q+w8rJ +w8n4U1FOQzkvKysvNTo/TPDIvr3Cx8fJ09TR3+3f2tLLys3T3NzPycPAwr+9v9FWQj03MC0r +LDI+S1deaOjRx8LFxsHBxMTIz9Ta62taVV/p0ca/v76+wMPG1lM/PTw7OTY0NDk9QEVMXtzH +v76/wMDAv8PVXE9PUFplbPvcy8K/v8DBxcjJ0XNUTUpDPDYxMTY8QENHT3LMvbq6vL/HzdHc +Z1RUUlRZZH3fzsjFxsfFxMTGyNH3WFFPRz44MzM3PEFJUWvXyMfGycnJztPbdVteZWtub37t +4djOysnHw8DBwMHJ2/9eTUY9ODc3ODk8P0dZ6tDLzc7Kyc3R1eHv8O3ve/ns5t7Yz87OzMbE +ys7P2OPxaFdMRkM/Pj0+Pj5AR01c9tzSzMjIx8jJzNXg8W9ucX/n2NLX2tze29nW0c/Rz8/Y +7GxZSkA8ODg5PUFIT1hs6dXV1c7LysvO19bR0dXb6fj+fOvf29jUz87MzM/Y6HtrYVxPR0RB +QUA/QkRGS01TYuXSysjLysrN0trh6vB9fvzw6uLc2tTS0NHU1NLU09Xf/V5RTEhCQEBBQ0hO +U1hbYHfs39rb3NjV0tnd5Obg5ujm3tfTz9HU19nd5OPm73Bpdn52Y1hPSkdFRUZJTVRgdfXi +2+Dj5ufg3tzb2tzZ19bU2Njd6O70+vPm6+7q5+Pm8fH/ZV1aUExKRUNGSkxRV1df69TOzMrL +zc3Q1N3y+untbHHn29jOyca+vcLCvsXvQSshIiYnKjZ2sKSiqKywvlYzKio0PUTRr6qrssjw +XkA3PWLCtLKxrKuvvkgmGBUYHSc7uJ6XmZ+t4y8hHR4sbq+noqWqslcuLDM6S+q/r662ubGy +t7rIRC0jGRccJz7Dq6CcoLJSNCooLDNqr6Slrb3OdD4vMUri1+7OurCxsayss8pYNysjFhId +Os64qJ6bplsqKispLuuqn6CsvFUvLDE2Vbi0u8LmW+fNu6qmrrnFXjIlGhIbPs/Ur6Cdpkon +LTgtL9+on6S51kosKDTuv7rH53BBNE2voZ6irbvSRisnIRgaNd/Pt6mkp+YpKjMvMtWon6e/ +fFIuIi2/r7zO1dNcNkatn6GptcluQDMyMx4YJ0NO/ryqoK44LDw8Nka9p6e8T006KzO7pq7N +UE08LjO7np2msbzWPi8xPCcZHzvd1s21o6lHKi87PkjQq6a1ZkY+NjLLoqjPRDkzMjXPn5qj +ss1hSzQvQjAdHjJwzufMq6jdLi88TFbQsqy17UlAOUC1o6zVOyspLTu8npqgr9hIOzQ4VjEd +IDjay9O+qalkKiw5RVHltay5XT9EQUy2pKzlOCooME+1npuhsPA4OUVTTikbHjHTxcKsoq0+ +JiczQk/FqKa2aEE+Pj+/pq5dNS0sOtqunp2qy0o2M0DN9CQdLDxLw7mtqL8uKTU7RNSzqq58 +Oz88Pe6wp6zgNS0vOt+toaKuxlo8QO26VBwYJjzWurKjot8nJjFGXcusp7dELzA9T9OoorRP +LykuRsOmnqa31kY2PN3ALhseK1q5u6+gqkAnKDjXzb+ssNw8MTFGzLKorMo/Lis15bSnpbDI +9Es8SMj8Jh0hLdWzuKqjvDMpK0TEvbmzwlk9MDRauKqtwnE+LSxCuqajrrzHWTk7bdAwHh8r +Ybi6r6WuRCsrOs67u7m++zwuMUnCray9204xLT7HqqSsuMFlOTde0TUhIi1JxsO1p6xXLiw4 +2Ly9vbrDPiwuPb+str+6XzAwPM2qp62vvkw1NlL4OCgnMFjfdr2rr944LzzNvcTAvcVJLio1 +vq22u7p6ODA6xamrr6y5RzQ8Wj8qJS9O3Wp2uq6/Rjk888LEysK/ZzIqM82yvLy41zwyOc6r +rLKur8s8L0lHLS0uLm26Z9Wwul9MNznKu83As8dBLS1SvMfJt79KMS9brqy3rqq7RzQ8TzAk +KULd0dzMtbVbMzdKzsTZwa24Piw44szkzrm9TDNCxrvCuaupvj4/engrICY0SGXrv6uubjQy +OmXfXr2ksTxC5WlcV+25xjo628PLzLuustd3SjrOwyofKjE6T+awo65PNzo8Oz3Sray8zMTU +WEhbxsxJPlbW0My8trvMeEE/T1u/sS8PHqs0IaWWo9QoK1csIrqan9VUudgtM7mqvTk09uNE +2qyru2hEZE4sVKmqMg8buTUguZmbzyIoU0g1zJ6bvzdqzFVD0a2xRjBL2FJMvK3OQN3JPzfr +uK5LFxxbNSPrnaDuN0v/ST2/pKnoZcXmR0fKsbx63NZIR3jh5d9ZRMa9TPC95C4eJDMvM9qo +p8RHW85YTb+rrMlXfupRXb63vc/o1GpBQU5HRdK4ucneRSciLjIuN9O4vsW8uM1S3L29z9bE +z1puxsbNx8fQXl7k9WJKRlRzbFZ16T8xODY3QERP2djMvb7Cvr3DztHOzu5f8NjncNLMbH7t +Xm71cepiP0ZVSkhW5OJPSE9NSFH62/Lzzc7Rw7y/z+rf6lhQZvBtX19bWXbU1tbM11ZFRVBy +afLU2WlYdN/wX3PebE1b8tfX1MzVbk5Vb3hnaHZmT0xs0cjK0+ZXRkVVctzLydRsWWvj2Nzg +291pVmz4/+rX22tPSFbveFpXWldOTF7WyMrP4mVUW37i2dPP3GRWfNLR2tzdfl1jZmxvYF5j +XFJd6dzialRWT0pT7M7Hx8/nY1Rf4+Df1dv7ZV9pbnr16er7dXttXl9odG9peuTm6+14aV9Y +WWnf1NLQ3HJcWnPi6H3p/VtVVWBocO/b2OL2c2NkdX7t6ubn4u15dvD7cWdnb2x97eju8OTs +/nBrYmNfWmBu7vh97+rs+u3f3/L87Ot7+ubm+mdfa21lYmhpbvvu5ebt5uP1bWtsbWhn/+vt +6+De6fn8dHN/e3jq5/V3cv5vXl5oa2RbXmz+6d/f8Pd2aWhueHvy/XJx8OTl3NXW4f713t3f +3tzvXlVZXFhYYWlrY1tkZmBt6+v6b2xz7+Xf3ePv7uPe3NjX2+l+b2x+5+Z8X1RQT09bY2R3 ++vXub33v9/Pm3uN/c/v56+Pn6/f04d7n6ODp9nJoX2x0c2teXmFeaf5qbe/y7WdWd85pYdrm +/fJx5ub15+t/bnBu72jx2Wrd7Vj6fV3t6ml8eHZ8eHf4cHz+9+rv+mVsa2xuW01y1mjT0v7f +ZV3hS1LNYePP9dfYbNXq7vRG/M9G9+pc31hl02XjamToeul7aXxk8+1+eHXodPl+cfvwb3xy +b+Zl79pJ5u1M2f1p2t53e+v37eB6a173/F3r5+7Y5e5+/WZdbWNu/ONtfm/qbndkVdteYOfz +3d7k0HTq7Wh2aWNmZ2xiavVt73z05WznfnjzfOn9/fpo62594fj14HN4cl1qcf96Ye9taN92 +/3lz6XrW6OPN5dHX99j9XmJVTEk/REI9TU1KfuLeycXEv72+wb/Ez8vG2dLM1NpTTlA2MTgw +LTM5Ok7d7Mm7v7+6u8TJy+Tw3/dp5t/hy7+/v7e6ysfnQjYxLCsrKy83RFvbx7u6tLe5usPL +zd/z7Gdic+/Zvr26s7zI3E43LSwrKSsyNkb2zL+4tra5t8TV1l1QWE1KXG7gxr+2r6+ttL3X +SDoqJiknJS82PenDvbSvsrm6v15uXkFCS0RJadrJurGtraysu8diNi0nIyYoKTY/YMW4s6+2 +tsbS7EJAQz1IYl7dx7y2sK2rra2wy9c7KywiHicrKT541Lyur6+2t9xGVjsvP0U9/cfLvrKu +raypra+wy1M9KyckISMrLD5yyrqxsa+5xNBDPz8wOFVL5Ly8ubGvrq+trrS4vVZCMCkkIyIp +Ljhez7y3sbS3zeFPOTg+MUHb48OytLGvrq+vsbC5vtJKOSooJCIjLzI7+8C/t7K3wfDtSTc+ +STZew82+sLK0tK+xt7SxvcLdQDUpKCUlJjEzPubGwLu5vMX66U04Qlo68Lu/u7Gytrmys7q4 +tb7EekM8KCgoJCQwOD5Zyby+uri/YPZfQDnoTlm7trq2s7W9vri8x727yNlWQi0rKCYnKjU7 +StO5vre8vc/5X2I4StlOyrS5u7m8vdHOusPLvLm+dmxIKysnJiQsM0VLybe4uba3y+dw3zpM +y/DZtrzCzM7FdXjEwMC4tbDAbUkvKCEhIyYuRWvFsa+utLW+3E75PTnc5XDBvcPL4NHdcMm8 +ubWyra/iVzYkHx0eISk5zr6uqKess7zOSjlPOzjvyezGvMHOaN/MX9e6trWxr67NQjUgHRwe +Ii5OuqyooaWsvMxfPC83PDo+yL3PwbzE8VV30fXct6+ytK+x/jYxJB0eIi45c6+mq6eqs9dE +PjwvMEZPS2G4udvMvtdYUP7M29G2sbe5vbjMODgwIiQnMUNzvqmttrO/cj83PD8zP+DdXtC2 +tMzeyO9GPkrp1tm9ra60sayuUjw7IR8hJTZKVLCsvLW95005OFE8O97Ayse3r8RGTVc9OELV +uLexqKasr6+z2TArKRwcICw6SMusrby9wstKOUnbTUPdur9jzLLKPUhoak5JvqyzuK6rsMnG +tl8rLiodHiAqT0zTqKe5uL7Oajs56U46+L61usPJudcvNFJYSGC8qay6s6y46U/RXystMiIk +Jir30mCuqLu8zGvKSjNo70j0xbmww0x94zctQs/K0sKtq7rOvbnYTGq80zMxLSUmJC/rzr+r +rri9dUpRODleVujCwLS6Zn7qMy45SOHNvqqnsLO6wMlneb7cQFM7IyYrKTlARryy3cG92dVh +Qc/JR/nCzMVdPu5gLzf+x7y7sKatwcPHy9lax7XNT0k7KB4eJC81PcKpq7a3tLlfNj39Qzpa +w7nDYFjJ+zY8zbe9w7aqr87awL/fS3LE1kk2LCwiHCNDRF64qqarw8S+TDE6TVpWT72vvexi +4W83NNm6wsS5rbLX4b/NUkfpyepOUT8zJR8nLj1Oy6+lrrm9wXw+MkrrRk3HvLzTU2ZLPUZF +zbW6urGxtMdr9+xTUPPN2k9EPiogJis4TfyzqK+8u8HaSThAeUVBbsC8zlvSxVg8Ur65ycq1 +sMhf+NDyREfLvdFo3fk7KCIpMi031LCttbuus+s/P0JANDjPucjWxrfEPz7NxeVlyrS65NO8 +xl5T48zoUmZeRDouKi0uOU94wa6zu7jBz2E5PEs9QG/Kv87sw8dcTvTPyefivbzPzcvJz2Rq +zNfnzNhQPi8pKi01QljJtLa7vL7MYUBJVkhFWO7O417YyP1g58vByNXFws/V1NPLyc7OzszI +60k9OTAqLDZCR03dwcHKzMfE03ReX1xPTVFMT2N608W/uLa6vsXV3/FcT01TWllf9eHh6N/Z +2+b9b2VJPTw8Ojk8SF537+Hb08zMzdXa1dbv3s7O2ORydvfh0szPx8PM0M/Q19/r5uLwXE9K +Pzc0NTc4O0Vb49jZ0s/U4N/c5efa09Ta3dTX7Xjq3tHOzMO+vsLKysjN3OxrXE9HQT04MzM1 +NzpCWOzZz83Nz9Xf1954cdnP19nQz9ns7+fa1c/Mx8LEys7Pz8/b7PlvVElBOjc2NjY5PEZX +7NLLy8nKz93l6mtgbv378dza293XzcnFwsLDw8bJz9jY3u91XVhQSEI8ODc3ODs9RFb34dfP +y8zV4OTxc23o4Onk1M/Oz87Jx8XDxsrLztLU1dzj6e5kVU5FPzw5Nzc6PT9FT2nhz8vIyM3U +3m5cYXV6dfHa0s7MyMXExMHBxMjM0NPU4O3udVpORUE+Ozs7Oz1AQ0hSY+/d1M/P1NfZ73F9 +5ed899nPzszLxsbJysrLy87W1dfi5+11XlFNSUM+Pj08PUBER05f69jSztDU1Nv9X2Z4bGL5 +2dbTzsrJxsPGycrN0dTU2d7j531fVk5JPz0+PTw+QERKVmf23dLQ0NHW5nf3+Wdmbuvb1MzI +xsPBwsTDxsvU2dvk7/puWU9JRUA9Ojs7PD5BSldn9+Pb1M/N0dvo29jtanzk3dfT38rEyMG9 +uru/xcbO521rXkY8NzU1NDA1P0pSWeDLw8rOztXk5/9TUmF+YlJmzsrPx764u8HAvcDN3d3O +2l5acPxTNi4uMy8sLkHm2NO/srC6yszO30o6PVRZTFzOvsfkzby7xtLGvMDW7NfJ4lFcfV1L +Qk1ULiowMz9DSMG0vr/Dvr1+Q0ZJU0pE/MvMy9PLx9/x08rFzNHCw8/i3tDZYE5YVktGS0tN +OTFDTUdJasjDfG/R0lxCS+HiZebLwM951MfP59zEvcvTyMLKcljt/E9GS2BfUUxOXVRDQ09d +UFBkfHJeYO56W2H4bmt03MvP2c7JytLczsfM0Nvf42dq83JiWFZsYmVvYF5ZUV5lXF7t3flW +WHt6W1NddGNTT23Y2d/c1NTkf+jj8frw6X1u6u3x737k3/D6f9/Y6Obb3OR6et7f/m5hXVpP +UVhVUVFZYV1geO/vbGfs6vzu6+XscnDt5e/x5tnY5OTX0tXa3Nve8PLtfG5lW1tZUlJZWllV +WmFfaWt7/Pjr4Ojp3+bl6vPs7vTw7+3f3+Xm6OHjfmttcXp5dHr3+XVvcWZobG1jXWJkXWVo +evV37u397OXp6ff+9PXy+f3v6ezu9Pbs5+PnfG367uft7v9rbHNoWlteZmhtbXJ1b/18a2Rk +ZW386uXm4+nu7fDv5d7d3+3r4uPo7/P5dnJsamZgYGBja2psdXlyefnu9mxnamZgXmBoffz2 +497l5uPj5+vd3ODo+PTt9X789/Ht+W9ja3FqZ2FhbHhsa21vdG9tcXh2a2tqZHnv93p86u71 +6OLf3dzb3d/l7erqdmv+83hlaXVxbmtgYGdrbGxvdHBx9/53fvPtenz5//14/enq8/Hs7fHy ++n55dPTf5Pz793Jrann0em159/977/5oamds+O1+cnZvZGNx7u/v7Px68vDq5e/r7urueu7q +5ubr7e75cmVeZnVnaXNrfHRqbm1lYGz+cHVzeez/ePLq4+f0+eXl5uTj4On+dPPs+Pnv7/L/ +bGtuZFpfbHdbXHr6b2Ft9H1t/uvm6+jf7Hhodfbs7PXt9Pbn3+rs6fFqa2t1bmbx3up3Y2z2 +aF1662xgZf1zXFt863hu/ev8a//f6/Tp3eR47tvo5N7p8ef2eWtndu91ZHfucV5qb2BqdmRc +XWl9cmlv7uXu39/49N/ucXB8+O7w7u3u7PPy8Pn8cnD5fezt/f7v9PFxbHNpY/36aXJ1bW1j +Zm9sYmFv73966t3uePbv6HNq6uro3fvp4nd73/Nv7eXzbnj8/Gttc/H3bHD5aVtcd3xcYO9+ +Xl13fW128t3h/PDv7+996d1+7djm7/j69n9jYHZuYHPu+3P/9+b0a/XldWlse21kavT5amv4 +cWj79v789m149/N49+vl325y4ux7ferwaHh5d2xq+m1ndXnv/Gv++H50d+36anvl4/vp7Gz9 +f3X6e3n9ZV1t8ff55uR+au3oY1j05HRdbeZnXuzr8PLg4/VmauN0Wnbh+Wz57fnv/G1lXWxv +df90d2//5vDu6Ofh83T38/NobG918H/66/34eO57ZXtv8O9v/O95a2N47XNoaXpfWmxyc3f5 +8vtp9OTf4ODv3+doeurv9n567PN0fvR0b2hte25s+HVranf5aWNp6+dv7+np72ht5Gpl7P1o +Xujl8vb82+FfZubuZPX5b/lr5ulbX+rtZF/23u9naeDjbWre2mVo7fJ8f+7u/n5xdv1haONn +Wnb8+HJtZ2z0dXH89+Dpf3r47u1x+Nfb9mfw7mp5ZmntZGLs4G5rfvl6Zv34cnVybnL0/O3s +/+jobmlt7OPxbPbZ6Xb3c2xjYnb++m/963pda/RuYH/meGj27OZq+eRxZHHl9mx86eH+8d7/ +bvzx/P16au3l+nZ9bfL2XWzsanDvYXLtb2xv8e5fcH5s93L06mVc5tz76+TmeWh39H5sfNz/ +b/DqfXzg9G1r7u1jXPng/F5h+H1lauje83Fy9+9+Z27vdG/98vn8eXXsfm7p7mL132hffHF1 ++/vf5+z57+v05up9X3P2Xlrt+mJ4au/pXXHmZG/qdPJtZXnk3uHt4+f44ft54/bxam9uXf/s +bft5X/j/ZHhlcW9nbHr8dX76Zufi7edi8+vu7v7t6PJ16drq7/Te6V1o6m1dW19rWmh7anfq +4ezscf3wZ2T9/vHi4+3/4uLj7ffvfG1bWXNsdm5o+fZga+x0Xu7dfOje7Hx37+798+vr+W7i +6/tuc/FuZl7z7nxhZ+VrZ+r68+75e/xub2Zo+uzr5/fx6Wz29nrubWLy92B77urz9vbu91x5 +8WZpaXXx6Onu83jm7Wbu63N9dXBl9fthbvLjbn7l7PV89v5+/vbt6O13fu5pZn1jeN/t92xv +aV9ibfz+dXBoa3N07dzmZPLm/urs5Nroe+nif2/n621oeHJoY3L3735pdvdtaHR7aXbhfWt8 +c/Lz5+r333xm+/bt+3Vq62pq6m5ydWh942dmdX/36+3p6frq+Hjs3vFq7npva2nyem9+bWxg +WfL3X23i73Xp8fHp8vHl7Hby4OV6//Hrc2RvfH1se+1hVXfsemT24+9++ur3fO/l+mtme/Rv +bvXtbWFx+Gdy9ebq8/Lv3HVm8en0am9+c3Vs6OX+eunjb2h9clxhdW76+vDv73dy7fL2dfTp ++Gj24+/5//vp7vP/eu5ybnZhWmxwZ2l6/HX6bW7uefjh8Hzt8/H37u396uT98urp8/788vd6 +fWJgaF9tamnq5nf+cm36+fHw+vp9/vj77fHm8XBscWxo9fFue/Nyam/s7Of5Znf7e2x4+fTu +8PLn8u/k5nJy9vh7bvnv8G1se3Npce51ZWZ38WxhbXliY+x5aP7y9Xd8593o8uvqfe7l83jy +6/rr8PTx+HNqePVzbmlsfHJx/v5gY/ptX15pdPL1/eTo8/ft73vu4uH7evB8ennv5/J1d/xz +/vX9eGt0/WxpbP72b2t1eG18f3RtbHB6bXPt6/j9925y/vHt7eXi5O1y+O/8f/vy9Pbw8H5+ ++fN4Z2NjaXBoYm1oZ3Nvam1/8fF9fPLr6+7x7Ozs5vN19evt9fh6+Ptud3l2eP13b3h0ev18 +bm/+cmpreXpvc29teP18e3d77vl6e3j15uLl6uvp7O/7bXP8fXF3efp2cvn5+31+fXv/dnl0 +ZWl2dm5rb/r/efj0emxvdXP98+bh8m91d3F87ezt7PF+dX368evm5ObzcWhneHVpY2/3ff53 +b25u9vltbfp/amhqc3X37PTy9O7tfP95+/j3+/7t6Or+df947+zyfXf9dmlt+O/v7fF6a2xt +ZmJo/e7u8vH4enL6fnZ6fO/t8fLy+nFpde/0dnx7bmhscW9vdv5wa297eXf9+/X47+br7enq +7/b39ez6/fbs6O76cWlmbW1laHX++3t39Ovx9Pp8fn76+XVreHx8dGdmZmRhbPr57+3u/H/4 +9vT07u3t6+7x7/L6ff/88/P2e29/+u/0enf99Pbv8HpxcnNmaGpscXf89fP9/nV8f3/0/nz9 +/2lncnn/+fJ6fuzs6ujq8Ovp/mhncP3u9H789np89/z293n/f3p2fHRw/3tvbHBvbPPo82tu +6O57dfPq+G1z93Z58vp8cnD2/WtmdPv++u7s6fNoc/X77Ofn6e/7bm9+cXz4bW9sYWJv+Xv3 +4+t+a2Nv/Xn56Xxvcnvv+/7f2+5s/+xvdup6bvt//H52cGxoZml7e2Zpcnrv7O/2+frv4Ort +7fDzc2Zq9ux1Zm1pY2ht+/rz7vJ0ZXTw7+jm7vPu8np+cW19eHJz/e7y5t37bvf8deDZ59zd +Z2ReU1VneV9UXmZSTF3n4Pfr1NltY/7r5+re2OF7feDd5ebg4PPu19DX18/O0uJvXVBFPzo2 +NEB07M/Gx9RtVmj5/uLUztLi7+Hp5+Pu8mZdXl5i3tTV2d/jc2Be+OPf3t7Z4f5s79tv5MnP +7k9QQyUr81Z0v7a5zD5F5FdLXc7C2l7e29bZ4dPcW09WZ9TNyL/G0eNuZ2/l0crMy8nQZiwg +Jy5BbcCtqb5RR0hEOz/Pvc7h38THYUzz5kQ+RdW+xL62u81dTk5ESOzIv72+wtBoV158WT86 +NisnMljbzbqxttlOT2dfTl/W0ubv1sbM2NnnVkNCUO3MwL69wtltU1dj/tPLxMPEvr/WVDQu +KyQmNVrXv7WvuND86F1GPkdj/nnVv77I2m9vUkdPddbGvru8wsjP5GtYbN/p3svNz9JTPTwv +JSkzNjpbwLS1vru4wORdae9cSUdNaG171MjGycrK03BeZmxlafTb1dzf2Nvt7N/Y0tnu6utf +UE1KPzo5PD9FTWHr2dDRz9DX3ejs4+Lh299+fPfw493X087Pz83R1tPS1dPPzM3T6n1uT0E9 +Pj45ODw/QkZHTmjn2czFxsvPz87R3ODh5v1fY/ne083Jw8PEx83a4OPe3+Tf5PFfT0tGQT06 +OTs9P0NJUGHi19DKw8PIy8/U4PR2c15YZfDh1s7QzMnJx8XDxcrO1eR3YFldW05FQkI+Nzg9 +Pz9BTF5y993NyMjJysvS3O7v397e29XX3OLc2NDKxcHDx8zW+G9wY1xiW0xEQT45Nzk8PEJP +YvvYy8nL0NbV197m5uHf5OLa19bX1tDPzsvFxsjJys7X33doX1VKQj89Ozo7Pj8/RU1VYO7a +zsnIys7O0d3q5+30697Y0s3Ix8jKzc/S2t7b29vY3OpwWUlDPzo3ODo6PkhRXe/c1c/NzM/R +0tff7unk4+ro4t7c5vtnw7i9t7C1wMXNbEQ7NDEuLi40O0BP+8vFwcnIxMfqXFBSTEVKcPpn +4svHycnEurq+vbi7vsG/vcRlQTYpICMpKSlBw7W3sauqu2VYakMwLTx1Y1/AsLbP6MzRTUjJ +tLW3rquwwsbGRyomIh0fJixBu7Ctq6y0w0s8Q0s9OWPDw8S9tr1aQko/OT/Msa6rpqOptcTZ +RiQZGBwfJja0o6WurrXVMCs6bE8/1qqx89u3uT4wS3A9Nl6xr7aro6i4x8HDWDgtIhgaHytI +wqifp7zNUTwvMU7Nzse9r8j6xsBLOTZDSEL4sKamqKervvtZYVc0JxsYKCcsbaqmqNPWwkcu +OV6/z0/KrchB2bfKPzVJYj9Bv6Wkqaalrt5Pbi4lKBobNTM7tK+qrFpH2zg1PVW9wEjLrN1L +x7a5UDZRYTY+u6GiqqSkv1s5KSkjFxxMPj62rq6wPj/PPzVJcMHiScW+ybu5s7biTEA1Pd6z +pqajn6pJKSAiIBghzcJexLWvyjE1zt5DR+/Jdjs7wa6zubW0yT867bewsqulqbxLLCMfGhw9 +y/HCs7rCSDjvylNc5e5cMi1SvrmxsLLDOjBNu6qmopyexisgHhkVH+mvsa6rr+IsKD5qZtO+ +uNoxMW2+u7u5uW4uM9ayraidmqpsLiIZEBcwzremoqOxOCkxNztM37m9ZGDNvbe7u7l+Oj5r +xbmrn6OzRSUbFRkhNdOpoaGqzT8zLS03WtfQtrG+w8fIxs9rxLnEv7SrrL7Mvz0aDhpLJh/G +npyrS8irSyEnM0JbVrmfn7W9uclIOV6yq7q9r7TG0VMxKBwYHCIpPbyrqK65v8dGKy9fy8++ +ramvv7+7yNa/r7LcTl/15dHHQyssKh8eJzZMZ+W6r7zfzsLJzse9ucTh3M/P1827uLm+50lH +UU5Pd8e+az9CMigoKzJGTVu/u9XOv769w8e/wsvc9+tdZ9fOyt94e/P9U13rzs7dX0hEOjU5 +SFzW1dXYalVbb+vRxLy+xtHqT0FBTWb/2sa/xttQTk1JTFxYTk9LVu/dzMXJ22nk12hf1MjK +xMncflpCOz9EUfnSxcHO+VpOSEFETmBjYH7h2NjVz8/M0+nZ1dfPxcHH0m9MPzw8P0dc3czJ +zOxZS0dJTFVu3uppY+PPz87Kxs3c++7b1dfUzNXzX05GQkRMX3hmd+duVUxRWl5aauzt3dXT +ysjMycTJ3PdiXm9xceje/lpRTktOU1xu8+jwbV1ZV1pfY19ad/Lr5NPGw8LCx9b7/Htja33p +2+VdTkpIR0dMWPPp3d7y9G1sZGBha2tx6dfMycTKy9HpZWJYXvjq1M7YeVlKRD89R1Zv69PN +2epxdGxkYfXa29bNzM7N2ej0YlNVXV9c/tnW1OlqVE5ISEpSat7Uzc/uaP13bGl82M7RzszT +5eZtUE5WTVRabPzh4N3yaV5XWFRj8+rO0d7u73lkX2Lm29LP0s/b6N52ZF9dVmFZVVx2YmRi +W25sa2bx6eTY3ud4dW5cXe7v2c/O19bZ3N7vaX39anNvaWd2WU9UWU1cXmrk6uTd7ObvaFhg +afXr//XUy9fs2Nvg6e9iZuvlZ2vu+21fbGNRT1vt3H3v6OV1aXBgWF5xbfjc2t/j6ebq8Pxp +aXJpYWdsdOvf5/Hw9XdudX707enf5fXu6fP+ZWL9f3r9/nh0ef10a2diX1lbaf3o5ubp8n5x +amFsfOzf39vU1dXZ4vR1Y15qa3T07Ph4enBcVFJcX2NtdvTo5en17e78//7y6eTh393f6O/5 +b25kZGtwent/eftxYmFfWVpmde7g3tnb6/J2YmJ5fO3t7N7d5H3/emZeZGhtcnrv5+fv+3Vx +ef9ye+7q6/t8cvvycF5n+/Pxf/XY0vtMS+DM/UlO3c/+V3jP1mhVXvB+XWLr293r+uTb7lpi +9G1gb+rc3+3t6X7u615Ybet4XGDg6Flm5XpZZ9PXbGrY0upfYn5sTFLn4Wr408nQVEjSxUk5 +973dQU/FxVtK9snfRlPV6ldh39Pfbe3P0vtn7+9eVFph+nx8afDg725zdWBOXuTjaGDr0Nl3 +9t7ja1tr3O5x7/Zv1uNTatbdXFTkw+tMaXdxZU5a3+5ZVfXZ7GLv3ebs79jW0s/f2tHh9vRh +UEc/PTk6Pj5Hd9jOyMS/vr7Bxb+9wcXEwL++vru/NyQtLB4gKjX+aVavp7O9xs/JZj9K5c/b +f8y5uLu6sayutLOx/SQeJSMdHilXxvfIraqx0j9S70I8SNe1tsvFurm3vLqtrK6ur8MqGx4i +HBwmTrS1v62mrsBSNjY8ODxWyLKzxc/Jxb25tayqq6urvisZGyMgHyM7uq+7uK+vtMw/NDlI +UkthyLm3xvDdwrOrq6yrq6yuZSIaHSYnISQ4zbe5xsS8vMdONDM/UVtf7cGxsrvCu62oqK61 +uLq+6TIlISYvLywwPU/n5/Xe3M/Ezm5dbG1cXX3c2dDRzbuysbW9xb+9wL/D1fxhTjwvKyop +KCowQHve7Mu9urvOce7SyMfMy8W+urzCw8G9uLi6vMp1Sjw0LikmJiguO0NKUXDKvr6/w8rJ +wL3Azc/Fvbu8v8G9ubm+w7/JYkQ7NjEqJSQoLTc9QlHfwbi1usHCwMHFz97bzcfGyMnEvrq3 +ur6/vsXyRTgvLCgmJigsNkNLX869t7S5vr28ws3W3dfQzczS1MzBu7i4ub7ExdVJODMwLCgn +Ki4yOkBP3ca8t7W1t7m8ytrh6v1hYPXXx727urm6vsXKz18/OjYyLysoKy41P1Hhw7qzr7O5 +wtTvVkxOVWvb0MjDwL2+v76/w8bGxNFYPzc3LSYpKy0/XHbKvruzusbN9vt3TVFj7c7a5cjD +y8TDs6+0srO3u1IuJyMoJiIoNUbGwcGvra+vz2/WPjc7NEh4SP3IybS0ua6tra27xsvWxVst +KCQpLSMjNk7Pws2ypquzyVzUQSstMUPeWfm5tLG0v7avtbe9vrS7v8o7KiUiIB4gLEjkv7Kq +pqm0yWlYOCgqNU/b2M61rrW5vbuzuLm2tbKwtsJGKR8hHx0eKDnqw72tqKqwwllMPysqNUva +zM22rK+0uLivr7e6urSyvMRjLyUhIR8fISs7Ws68rqqssb/sTjktLjlK38u9r6uqrLO0tLvA +y9PLytPVWzouKSopJiYqMUP0zb+4tLK3yPRQTVRVY+7Ovru7vcfNz+Z4/9nCvL2+wb++10xB +PjkvKyosLzY8QU95187IxMDCw8XJzMrKzNLX2OTy5NjKv728urq4ub7OWUA4LyspKCosMDlE +VPfKvri5vb/BwcjO1Nnc3uF3c+XXzsrFwby6ury9vclmPzgyLSopKi0zOj9O4ca9u7y+vr/E +ztrc5XhkX2R/3dXKwb26uLe4ury+zltBOTItKSkqLTM7Q1ffyMC9vb/DyM/W3vb+/e/j5d7R +y8a/u7i3tri9w83aWD01MzAtLC0wNT5GTmbhzMPBxcnIxMfUdGd2eW5969jIwb26t7S1ur/L +5H1kRzo4Ojc0MjEzOT9BSFvcycTDxMTDxtRsV2T8+2553cvCvry7uri7wtHg4t5vRj8+OjQy +MDE1PD9FVOzJvr2/wsTHzuZdXmvw7X3v2cjAvb6+vL/Hz9nb2NtcQT48NTAuLjI7QEVS78u/ +vL3Bw8PJ1m5dY2l7++zczcfGxsfDvr7BxsjIzOZMPzw1MC8uLzU9RlBv28rDwcXMy8/V3nxy +/Ovk4d7VzMrHw8C9vLy+xcjK2VhAOjYwLi0uMDpCTGTfzcW/vsTGyM/a+nNlZHb66+DPyMS/ +vLq6vL3Bx87mUz86NTAvLi8zOkJLXOvUyMC9wMbK0918Z2hnZWx4693Pxb+8uri4ub2/xNJj +Qzo1MC4uLzE2PUZPZ9rJwL7Ey8/Z3vFeUWzf8e7Xyr+6urq3trW4vL/J+kg3Ly0rKSksMDhF +Y9HBvLq6ucDT3HFWTk1OWnb71MjDvbm1tLOztLi9w9tPPTEuKCUoKSovPk3dv7+4tLe2wc7X +Xk1WUURa73PMyMa8uLa0sbO1tr3E4FI4MC0iKCojKzk4Qr/Dx661ubjGyvJaYldJYuhL1sfj +v7u7tLGysbK4vMt9TzAwLCEqKCQtOzdMwdK8rre0ucDGaWVuTUxdVlfQ29a+v7u3tbSzsri8 +xthMNjkoIiwkIjA0MnnB0rWuuLK2wMzg6lpOWFRQavj7zcfGurq5s7S2uL3K2VE0NykkKyQl +MTQ45cbQtK+4sbi+xt54V05PT09ZbPnPxb+6ubSytLO2u8/dWy8zLCEnJyMsPDlcvMO3rbGz +u73NaX1VRExeTV3X786/wbu3tLOxsbi8x+JBNDIjJCkhJjExPMrEx62vuK+4yMzgSlJYRlxo +YNrQyMG8ubaysbK2ur/haz4uLiUiKCQlNDs9yLrCrq62sbnG3XpRS0xPV1p83t7Fwb62t7Sx +srW5vc94PS4vIyIpIyQ2Oj3CusWurLezuMfvd1xJTE9SUWTh6Mi/vre0s7Kyt7q9x3ZKMi8q +ISknIy5CNnW3yLqrtrq1ydJyUkxNSFpeT9TP1b26u7Ows7Gzuby/70U+LSsnIycoKDJBRs67 +u7Sutbe8y9tWTU5LSV92Z9jLyL+7t7S0tLW2vcPKVD86LSooJicrLTRKYs25t7WxtrvBzf5Z +TUpWTk/65NzLwby4ubi1u8C+0OniTkE+My4yLy44NztSYN7Ix8q/vsjI0uzsXFNYU1VsdW3c +0svCwLy6urm8v8XM0d5tST49ODQxMTU3PEBHU3PazsvKzMzU5Xdnb3/s6eXa0crFw7+9vLy+ +wMTHzM7XeU5EPTkzMDEyNTk/SVb12M/HycvJz9nj/njw8u/a19DKyMbDwsPCw8PFx8nHy+5S +RD05My8uLzE3PUFRe9nLxMfGxszP1uTh2tnU1NbVz87LyMO/vr/AwcbJzNZ2T0Q9NzAtLS4v +NDxHUG3d0MjCxsTDyczLzdLT09bZ3tzXz8rGwcDAvrzAxcTK4VhDOzUvLSwsLTM5QEtZ9szB +v8DCwcTFxcnR3mxa9MzH0N3Nvbi8w8G+vb/Fzf9IOjAtLS0rLC42SGB438u+ubm+yc7S1dne +82xwf+nZzczMyL+8vLy+vsDIzcvPXDwvKystLSwsMT5Z2Mi/vbu6vcTM2vJqZ2pu/vnt4NDH +v7y7uru8vL/HzMzM029DNS4qKSkqLC84Q1/Nvbm3ubu9x9jtdGZkYl5q79zOxsC8ubm4uLzA +xs7X2d7mX0AxKicoKSouNj9P5sa6tLOztr7O8mhiXl1bUFJg9NXFvLe1tre4u8HKz9rq6+9W +PTEqJyYoKy86RGPSxLy3srK2vtFsU09VWFhbbPvmz7+3srGytbm9xc3X63/3bEg2LCgkJCcq +LzpKdsy9t7Cur7K3x+pbUVNXVlJVV2rZw7izs7O0ub7G0er0fXRtTDktJyMkKCw0QlndysG6 +s6+ur7jKdU1GSk5TWlRQVPrJuK+urrK4vsjX4ubo5W9EMikkIiQoLDVCXdjFvbWura2vuMxr +SkFDSEpLTFJe38O3r62usbe+y9fh4+XjfEs2KiMhIyYrMkBW2cK8ta6rq621w/VIPTs+QUVJ +TmXOvrWurKyus7zL3uru+vdlQjAnIB8hJis2SvXJvLavq6mqrrjVTj05Oz9ERUhOas28sqyr +rK+2vMbX7372/VY6KiEeHiEoLz5dzb21rqmnp6uyxVo9NjU5PD9CR1Ldv7Otq6uts7rAytLb +5PRgQC4kHh0eIyo1S9m+sqympKSpscNcPDQzNTc7PURc0byxrKurrbK5vsfV6OrvZEUxJh4c +HB8nL0TbvK+poqChp7DJTTkwLzI2O0JS5cC2r6yrrK+0ub7J3O/j2uNKLyQcGRoeJjJO1rus +pJ+eoKq7XDYtLC42P0le0r+2sK+vsbS3ubzCzNjQxsPQRyweGBcaHys/3Lqtpp+cnaW6Sy4n +Jio2SW3SvbOur7K4vsfKxcDDyszBubSyvEUkGRMUGR8vabyvpp6am6CySikgHyQvTcy4rqqp +q7C+6U9Ob87Bv766sq2qrc4tGhEPExwsdLetpZ6bmp6vQiQbGyEvbbesp6WlqbXpPjIyP+q+ +tK+tq6mnqLE/HhENDhUjT6+mop6cm56tRCEYFh0t1qmfn5+jrL5FLikqNPq1qaWlpaeoq7Fr +IxQNDBAeQK2fnp+go6eyRyQZFxwuv6Kbm5+ot+Q7KyUmL2axpZ+foqaqr79iLBsUDxEaLdKm +nqCjqLC+TiwfHB8v0aecnJ6ovlg2KiYoMWC0pZ+en6auuNxNOiUaFRIXJUytn5+msMRxQTMp +IyUy1amdnaGtykQ3LywuNla7qaKfn6astshgPCofGhUXHy++pJ+jrMdRPTIsKSoyda+in6Ks +yE45MDI0OEzJr6eioaOpscLhTi8iHBUVHi2/op6kr985NDAtLjE70q2lpKi11V9HPTw5ND/h +uqumo6OmrLjKUTYnHRcTGynOo5yerNgxKywsMThHxq2kpqu7Zl1OTEc8NTdZwKykoqKmrrvQ +WUApHRcRGSfDnpqdr14tJiwtNj5RvKukqbTFUV/f3ftBMy9Cya6ioaOnr7zXd0opHhYPGCi7 +m5ectT8mICovOUr9u6mkrbzeP13QzNBGMy9CwqygoKSqt8vUz2QyIRYOFie4mJWctTMhHykx +PVnbu6umr8xjP2e+wMtHLy0/vaefn6auv9ro2OYzIxgPFym5mJacui4gHio5TN3OvLCqs2dN +P1+4uchMMC5BvKaen6i47lbexbxPJhcOFCG1l5SZuC4fHio9XOvYwLOsuGJCP/m4tMZILy1C +u6Sen6m8bU7bvrb+KBQMESKpko+ZyyIaHi1pxc3p3Lu2wmdRWsWwt904KS5ZsJ+doa7KVE/L +u7fTJhMMESSoj5CZ0R4YHS/Xsr3q3NLL00ZS1LqssnkwKCtzq56corRkQErJr63OLRcMDyC3 +k4+ZvCYYGy1wsq/IbeDY70xH2birrug0JilPrJ2cobVQPEDHray7NRwNDhxKmJCWqy4aGClW +sqq+aVBadEtux7eqruAzJiY/rp6boLZKN0DGraq3PyISDRgso5GUnk4eFiFCuaawbD9AVk1e +yrysqsA7JiEvuJ+Zna9LMzzTramyTSccERYnUJ2YnbI1Hx0yXq+qyU9BQj9cubisqchBKCAq +06Wcm6njPDhvtKqvVigfFhcrQKmboLFEKB8xZb6txU49Pj5DuLKtpb8/KiAnbaiem6bMTD57 +tKms2SsdFxUkQ6ybn64/KSErWsqyvFpHREQ52bCtoq1RLSAkQ6qenKPFUkXwta2v3i4hHRce +NNShn6nuMiUoUdC3tPBKUFNCTbyyp6bLNCMhL7egnqC5WEpjuq+wyTYmIRwcKkSuoKS4Pyok +NW6/tc9bbFtQP1+7raWySykiKmuon56qyWhSyLSvsGgvJRwXHi/CoJ+tWy4kLVLVvsb938l1 +PTvnsqWmxzElJzq4paCjsMPm38LBv81JNSUaGiI9rKOqvUk1NklIU1xSyrnJTDlAvqqotkYs +KzNUtqmkp6270tH37sPxPzMfGh8v16mqvM5YQEVCNjpIfLi2+z8/3bOstOo+NTc9dLaooqWt +v9PvUf5xVkwvHhshLcasr7TE50tMNS82PsextcxfT8q0u8RmQT44OFi3pqCirLvhQT5ay9JI +NyIcJClHv7yxr7PPZTQrMjVlv767u8bEvdrgWz4+Nz7itaiho6ux0k0/OlH7Tz0oHyUpNU7o +v7Csr7ZbNi4qN0/gvr21rK++5EE1NzdB0rmqpaepsshsSUVXbU5CLiEjJSkxPGi+rKWmrsw/ +LSwvNkdywq6prbjlQz8+RFPgvLGrqq61v8/Pzu9QPS0lJSMjJis76bOopqSsvV83MS8xNkbh +wbm8wMbGxMbOy8fFvL7H0d7g28vLxsfWajsuJyIgIyo2dbyuq6+1vsLDwcfTXEE8NzU6QmnL +vLe2tba4vcfZXlNTYtXBu7zLVjsyLi0tLzhIbd5qS0RL7cK5uL3GztfuVUtOYejXzczKxsXE +y87Pzsa9uLa5w+xMOS8tLC0wOUNGQD49RF3Yxr6+v7/Ey9nl+vv/7N3Z09HNyMrMzcrBu7i5 +u7/Qc0k6NDQ1NTU1NDM3Oz9JddTKxMPDwcLHys/W297j3tvc3OHa18/EwLy5uLq+xt9QRT89 +Ojc1MzIyMjM3Pklp0srDvr6+v8DBx87Y39/t7PBx8uLXzsjAvry+v8bN2PteT0pDPTo2MjAx +MTM4P056z8jBvr7AwsPIzMzN1NzqaF5q7tzUy8a/vb6+v8TL0dtoU0xCPTo1MTAwLzM5P076 +0MrEv7/CxMTHycrP2uDu7+nj3dvTzMS/v7/CyM3P19zta1ZHPzkzLywtLjE3QU95z8jAvr2+ +vr7CyM3Q09bY4uz17+XbzsbCwsLAxMfO2N7wZE5EOzUwLi4tLzM6Qk9y1ce+ubi5ur3CxsrM +z9xrVlZaaPraysK+vLy/yMrMztb3Wkg/OjQwLy4vMTU5QE5v1ca8urq7vb2/wcnT4nZhVlZV +ZeTVyMC9vL2+wMTIy9l5UkQ+OTMvLi4vMTY7RlncysO+vby9vr7Ax8/c82hcWWVv49LJwcDB +v72+wMTJzdd1UEE5NTAtLCwtMDU8SWLUxL27ubq6u73EzdTh8mdeZG3x3dHLxb+9vb6/wsXK +ztRnSj44Mi0rKystMjpCUejMwb65tbq9vb/L1uXn5WRXbevr18i/vru5u7y+v8LF5ExENiwq +KSYmKi8yPlnnxLmzrq2vsLfAydxtWUlMTUhPW/7RxLy6uLe5vL7Eyc75Tj82LSoqKCcrLTY+ +VdfEuLGurq+wt73G221OTEdCR0tbfdbDvbm2tLe5ur/D019KOzErKSclKCsvOETszb21r66v +r7W7wMvYXVRLQ0lMT1zmysK8uLW1tre7wc3UUTk2KSsoIygnLTI/XeS+ua+ur660tb3J0Whd +TkdMTFJk387EvbiztLO1ub7O7kg7LykoIiIlJSw0QG/NurOurKyusbO8w9BxbUpJUU1detzK +wry4t7e1t73J6086MCwnJSUkJiswPU7TvLivrK6ur7W5v8fdZ2RPTE9XaOnJwr+4tLS0tb3R +4U02MCslIyQjJysyP0/Vu7aura6tr7a6wM/dcmFeUVhrdNjIw7m0s7C0ucPYXTouKyUjIyIl +Ki88U9a9uLGtrq+xtrrAz9r5WVlaXHrUyMG9t7KzsLS/xfA9MywlIiMiJCkwPE7bvbizra+y +trrC0NPhYmR8Y2nZycG8trKvrq+5vNBAPTIkISQfHyktL0jTx7qwrq6wtLjE2NXmTVNmT2rN +x723sa2sra+zv1pINygjIh8eIygsN1zPvK+tq6yusbfF1exXSk9QS2PYycC1rqusra66a04/ +KSAkHxwhKCs0aMe5raupqa2ztMLv+l4/QlRMWNPBurCrra6utvVLPiwiIyIeICctNU/Quq2s +q6irs7O40m9dSkdMTXLLwbmtq7Gxr89AQDEiHyAeHyUqNmzTv6uorKmmrbK3zOZlQ0BUTVLL +u7euqqyusMlJPy4hHh4cHSAlLkvWvq2np6Wkqq60x993RTxGTFzIu7Ssqaytsc5aQiwhHx0c +HR8kLkRgw6+sqqanqquxvsjdUlNbW9O+urKsrq+30ldELyUjIB8hJCcwRVbVvLaxrq+2s7a/ +xsvVzsrIvLWxrq2vtsdXPzMoIiEgIicqL0Bsz725tK+xuLzAz9t/YvvRwrivrKmoqq+/aT4x +KCEfHh8kKS89X8q3s6+urrG2vc71V09ZddO8sqynpqmtvXBCLyUfHh0fIygxRG/GuLKsq66x +s7rG2VlITmnYvrWuqqmpr8JgPS4nIh8fISUrNUJvyb61rayurrS8w9RsU1Vrzby0rqytssH3 +RTUsKSQiJSkuOUdc0ca+uba1trvEztzzcGV8zr21r62us8L4RzUvLSknKCs0Ql3cycW+ube1 +t8DS/U9GSlJi5ce5sa6vtclfRDk0LisqLC85V9PCu7u8ube2uL/aW0g/QkZO98y/t7KzuMxN +OTAuLSsrLTE+98G2r66xr7C0t73TVDsyMzg/X8y/t7CwtcFjPzQsKSgpKy05WsS0rKusrKyv +s7jNX0MyLjE2Qe3GurKwsbneQzkuKSgnKCs0Rde3rampq6usr7S9e0M3Li40PE/PvLaysbS+ +YzwyLCkpKiouOVjFr6moqq6yub/OWUE9OjY5PENm0Ma/uLGwtLnKX0Q6NzIvLi0vNT5T2sS+ +vby6uLe4vcfZfV1VW2Fm/9rIvrm5wd5OPDc1MS8tLS40Q3PMwbu6urq2s7S5wthjT0xOVWnf +yLy3srG2xWQ+Mi4sKyknKCs1SN/Buri3trSwr7K8zmdOSklPctXHvbawr7G4yVU5Ly0sKicn +KCsxRdvDu7i1tbSwr7bC31xPTFNy2s7Fvbawr7K3xWQ8My4qKCYmJiguPGTKvbe0srKvr7S8 +yd9gVFdj99vLwbqzrq6yucdaOS4pJSQiIiMnLj17v7SvraurrK6yusx1UkdERU1a5Mi8s62s +ra+54T0uKCMhICAiJCs4WsKzq6mpqaqsr7XC31RDPj0/SWvLvbavrKytsr5yOiskHx4eHyIl +KzZVv66no6KkpquvtL7ZUz85OTo+SGHUwriwraytsb1wNyojHx0eHyInLj3puKujn5+foaet +uMhkQjYuKywuNUR3wLGrqaqppqy+Yy4bFhoZGB8rM2GxqJ2Xl5iapLpTLyQfHh8lLkbJrqig +nqWoq7zL6UdDPC8pHhcXGR49vamcnJyanaGo2C4eFhgcJ1+3qaSmp6qxvm06Ly0vPHPCta2q +qKq14SoZFBMYKdSonJmZmZ2nsz0gGBIUHC2/pJ6epa6+2k08My4vPOy3q6Wlp6eqrrtYKhgR +EBQlz6ebmp+krb9TLh4ZGRwvvJ+Wl5ytSS4oKTE4UMu3rKWmqrPK5PbRw8xgOiYZFBUXIkyy +n5qbnaKuyDwnIB8mPr+poaKrw0QwLC5EzLSopqq2Uy8pKDBNw7Osrra88TsfFhQVI8Sek5GY +o7w4KSQfHiIoV66emJymxzYoJikuOUPkvLKuscH4RkfdvLCxt7q8urrMPh4QDxIfs5qSk567 +UzEvMykiISVDqp2ZnrozIiUx1bCttMPYzL7GzUs0MzlJyb3AvMO9sK2ywkMiFBEXH86knZuk +tsfPVVs1KCkuVauenaG7Pi4qMz9GQUA/Xr61sLvMWEhNSFNQR1DYvKuora/IRzkuHxgcHjSr +nZaYo84+KCUsKC06T7WkoKSyPygiJDLntauorbS/Xj4yLDI/7by0trq/wb/DzOJMU2Fp2DUd +GRohzaCamaPbNSomMz0+a9G2p6KntE4qKCs6zrWwsbrKzGBCNy4uOVnNvcfc1ce5s7jEZj4/ +6bqxwC8YFBgupJWSmrMrHx8jNj5GzralnZ2sTSQaHSviqZ+hq7lnQDYtLjE9dr+2tre9yNBc +RDUyPOy1qaWps9QjExAUJKuWkZSmNyEdHSw8W7Won5yftjUfGR41vKKfqb9FMTM/RV/y5MrI +1HdNSvTDt7S+7EpARFT2yby8vMMvGhoYKq6dl52zLSgoLdHVzcLItq6vyUYxKz/Ir6m5aDcx +O32+v7/fRD46PFTbwbKvtsdILiszXa+kpK5nKBcUGii5npmaptEwKycsPmS5rKmqtGIvKSg0 +zq+psMlOOz1LftjIzP5lRz4/SXPJuLS2wWhHRFrPxMLQT0RGSn7SRSgjIC+/qaCrwzcwPGa1 +t7/WSk1kz8zK2V7bzcS8y31KPz5P7NbI2ltSR0hmy7qytclYODA74rqwvz4gGR8stp+epMc/ +LT5i0b9eWfjMur3hOC81WbGpq7pELzNSv7S2zkk7OUJQaN/Swb/E1Ug3MDl6uKusuVw0Ky06 +a7u5SC8pLfiyp6y7QjNG6Lq2xmRGTuW+vNFcQUP1xL3GYz07R1Tazs3N53tXTklR38a5ub3T +Zl5u1VU5IRokMa+cm6LKMB8pO96vtru/zdtgRDEyRdSuqq/CSDY3TNy/vtH5T0ZEQ0ddyLix +ueo7MDA+2LivtMNROzc4SG7K1jcxMDnMs6y3zD86X9a5uMxfR0hT1tDq2+DVwcjcV0A/V9nM +xt1oe3FnXk5O68y+tbfA0EkwKyEeKES2oJ6owDsoKjtvvbe8u7vD2UgzLzpus6equU4uKzNf +vbO4zWNDPz9CX+XKyc3fXl1SXHrZzc7bZVNSV93Evr3LPiIhIzW4pZ+ntT4vMTb8yr+8xMre +eUU8P0nUvLvA11JDU1/91NvW0tbm83Rt2M3Kx9DU2U9BNyYfKDq9pKKrxTsqL0P7v7q+vsLQ +/Es3NkPVsqmsvU0wLTldxbm6y/pVQD4+TNjBu8HiSj1CV8q7u7/cVj85P07SvLm82TAfHyVE +rZ+fqME2LzE6Xs/IwLq8y2w7MThMwbKyvWxHPkt118nLxcnZa01S78m9u7jMRTUpHxwrTq2d +n6rwMSIoPPOyrK60v3Q9MiwwWbysp63FQzEsNk/RvLm/0GNCOjtOzLi0u+JDPUNb0cfEx9Jt +UEM+U8++trlQIh0eKr6knqa1RjI5PVnd4M+9t7i/ZjkxN0vFubu/0G5YVFNe6dPIyu1MQ07b +v7u6vsxYOyscGidJp5qbqWkqHyk+2bOtr7O40z4uKS1atKekrdw3Li04Ysa5t7zXSDUvN2y4 +rK6+UzYxOlrGtrG3yF1CPEBa2FMoJis8tKeovk8uL+jAubzbZ9vAyNhONj3mwLvIUj5D/7+2 +vM50TkxLS01kyLWvtMZOOzY2LiAiLu2mnKC6OiQjPcSyscP868XKcz4uNOayqKzLOC8zR8G5 +vcfmXlVLPTxF67mvt89LOj5hzL+/yNTX2M1YIBkeK7CbmafHLR8tOlfMv7esp7ZVLCAnT7Cn +q8BJPj9Nc3XTwba2xVU6OUbauLK0vtZfPy8eGB0xr5uYpM4uIyo7Y8e5s6ysvT4pIilqsKeq +uvJHPjk/Uc20rrbRQDI1Qe+/ubvJ3+1rTUZKX85rLSgtNuWvqbK8WT5KTkhRW0tp29fIwcbF +zWZSR0daz8G2sbjHVTgwNkfQvr/Cz/tMRUVNY2nayc7O2UIsJzBVu7G6w+dMPT5JXMq+w81c +SFvLubW96FFOW/Z8Z/rOw77NTj9EU9zO23NOT0xe1s7W529IPzw4RevY09dmfOJUUVdZ287f +3Nfw2tLWx769v9RKPj9E8L22t8VdR0I+R1JPaeDOzNFmQD49TtjKxtV9Uz88RVzfyMPLyelK +RUNM7sjAvsHMdU5NSlvUx8DA5k1HSV7i19njeOTgZ0xDS/bSztDifmFbVFRaXmlz+3VldW18 +9uHa395hTEhNY9DAwsvbdFxWT1Bg3szHxsveX1JRV1hYZv3e0crfVUtFTWJq/trT0/JXU09Q +Yd7SysrT8VpZYWdlXmju397n8H56++Dd82lbX+/k63dxdvTt6epiUVJg3c3V6/Lk6W9YUVlg +b/Tq5uTb2tjfb1dNTlBSWu/Tztfq9XpgVVps6+Xl3tLQ0drs+WlWWWF06+nn4enu8nh2Z1ha +ZPfa2uP5ZVxdZvHn+PX5aW1nWFZZa9/V2O1lXmFhct7a2trf6e7/bm91/OHg7vZycXzt3+Pu ++/xmZF1j9ev3dXNnYV5fa2VnZGBo+Ofk4On+9+np6vVsaHHy7err7u3z6+Tj92Rnbnzu5up8 +bm99cGtpbPz58vx4b2ZjXl9q7N3e3t/tfGNcZO/q8/NyaG/u7/357Ovu7/Dv9Hpz+/j2fGtn +aHvl4Ojp8Pd7amFfX15kbnL97Obm6/Xv5ubo6O77f3Z6cGdzfGpobXvq4uX7bWtkan/3+Pf9 +dvns8/H39Ojm929nYWVy8/b3/Pjy/e3p7fX1eG13b3J3cnf6em9oa3/z7PX97u3m5PVvYmJp +dHFyeHZ6b3R1dPfs59/i5On29url6O/1fXNvZmJiZGdrbG51dH13d+7k4eX2dn3y7fl2dHV9 +fm9yevru7efpfmlnbnV79/V2aGNoa2r57enk3eX9+/dzfu/38+vr++vj7H1oY2JkZmppZGZ1 +8fZ8f/F8e+/t7PLzfm5zdnj17vDj3uvv7vl9cnT19PN5amdobnFxcnjz83pvcH53eHRxdWxq +9e9zdevm5uXm9HV7+/H68OTj6Pj57vV+e/b9eHtsbG9ubm1uaGZ0/XF4/Wtsc3ZpZmp17uji +4OLr7+nh4+3r63t68P9zd/vz8HtvdnR6cHZ4dXv09nn+end6b3BxcHJuevr8dHhzaXPx7fDp +5u728ffx8PLu/f3v7O3x+vj19np0efx8bnt+cHF3dGNodW5rbGttfPDt8evq6+vy/vPn5vR8 +f/nv9vfy/np+/X198vhqZmVnaGh0ffjx7O/09nz67urv9PttZmp1+vDy+Hh5/X/57uzl5vZ7 +eXhzef98eu7xfXJuc3z9fHX7eWlubG3/9/v+9eru7fZvc3htcPrw9vn48/f19ff++Pnz8npv +c375fXf67ufs8e9vbHB8dGtwfX59c2hnbW1qcHx4cXlub/7s5uzp5u7o5Obn6Obw7vh9+/N2 +aW95bWpoaW96fXZ6cmpubmZod+9+c3d1c/fq5OTl3+Xu8O3s6vL18v55cWxjX2dz/nFoa33u +/W5sdG5v/nH+6efo8vT19vT6+ft9dfrt/n7w7/1y/evo+GxufGlpdXt1cH17b3/z7vD9e/fw +dG9sdWlu9vh4e/T08+/18fz37/HyeXzz9vLt8Hh3/Pvw9HVz/vtsZXBnYW1xbmv96e348vXw ++Ht5dPrt4OL+bvjr9m1sdPv6b219cm7z+/bq6+7q6ur2+/VucX53bv5ubHZqbWRydHhxaWtp +aP3k6u7y6uXt6+jn6Hz26uzq5fX9+3N683tvcmtdXmNmc215fXZ3cnft9/787uXu8/fv7Ppo +bH36dm5ve3L7/Prz73197/L3+Pf68eTr4+hxb3l5anH19XpuaHZ8dm/97m9udWhla/fu8X/+ +9/768u32fuzycWx19/B7cnR8+vzu8vFz/vH+7ezh5P337PHw7npsam1nYmFz7vdqX3Xy8/j4 +bGl1e3xwe+zq93x9+fTp5+3u6d/q+vv4cHf2bmr7+G5raGtveX5y/nb88m9mb/jv7fP89/X6 ++vx359/3evB67O1ybHb9dnRoam54/nnt6vPr8HBpbHb48m9t+PprZXTu639t/evnfmd67fX1 +7OPk6e/m5X51eff5cnhuZ3lna2NteWv7dWpia/xsZnJ6e33x7ejl6eHZ4Hxx/ebubn3u9m1z ++u93Znjs82t+8XBv/vz6fGt8+PHx8fl8a2htdGxebvt3c3ly+f797n/2/fTx+Op/ce3p83lu +++Tk9e3g7HViY29/cn7q5+zt631qanZqaWJl+XFoa33x9nF08n37+fv/ZGVv+et76enz+HZy +7u/m7+3o7nNz7+rr7+zm7nZ9+/J4Z2h5fG9y/fN/Z2R6amBqem9ub2109Ozp6Pfn7Pbm5nxz +cu3ybfrm6evv/Obl73VmbP1bYGRaYPpsZ3Fr/O3o5+Tv6u34fHD08+5+/+Xs5ery7fL49fhm +W2vu9vxs6+hyY2xoa3d+eGZgYXNzdXPt6/3/9+bp/f31fP30evjo3+Pe53h0evh1dHf96PRy +/XNsb25nbO98aW9wbnRpZvfq/mt4cunpfOjse3p+6+js9/nmbG3s4uvv8nvuamP49mpgYWxs +aXfw9nR9//jrfv344+1q8vvr4/dtdXhocnJ39fH77eb6cv/v63pqa2dicXl0b3r07eT5+unt +9Pfp/mNpaHLwcfbj9G948PHs9G///nRtcf5+aV9u/v/v6P37eG5v+vDx6u769+v0evDubWRq +eHlqavfwdWtv7H3q393md3b1dmn34uz48nZ1aHvqfm9pfHBla2Zsc3129ujg7fzw/mVfafPu +c2/97e1/7OPg5Ht48fF6aXXpf3Frc3t5+Xt7cHPr9n12+Pb7+O7ua2r68v11Z3X4enx1/H7m +6PX0b+vvc27573h+d3h8bGx6bP9z8+Pv5/Xr8XJseP9vdH5mc+b7+OrscP36eHl79vn6bXDv +7Xl1+/L4fe/f6vZ5dnBpeO32fXZ6729w/ez4dvP6dn38ePd+ffnseG16a2BeeXX65+7t+v10 +dPb39ebl6+3v6/707fzy8nlr+flsaWhnZm13cf3rfWVp9ujq6ff9+mdl/Xxv/e309e36dO/8 +d/Ti7nj2cPf1dWj+6PZ0b/7+Z2f683N4fu/teP76d2dkYe/xaWz75uLq5ufz9+vp/f1rcHNm +Z3zt93p97/H99Pd1c/NsZXV7f3t++uzvd+3r9v97/P/0e358e/35fXtzaWJsem16+X7q5/Hq +4u3t8evv7+Lw73xkZW5uZ2tze3Bqde77ZWbz8XD+7fdta/zx7/x+6Oft+fv48vf3enp67e35 +fvn1/nx59/55b3T6f/js9//u7vp0eXx1ZmBnbmpqevj+cXfx6OPf4/D5e21qcvrx6fdvfXN4 +9Ovo6fv473Jxd3z4b2p4/nF08fd8/W1vcnL97vbv6vTu7PD39P5/fnt4f3VxbXXw/G1od39y +evTz8fl+8PLv8/X5eHL++W1//Hh0a3T7e3z3+3Rsen56+n347/bu5+ny7/l3b/ry8+3wdm52 +cXd2amp+93h77fF0eHJwbmpmYGVufPXsfHHw4Obq6urt+/3z5er4/nN79/v4/Pr9aWl9dG1x +Zmpwa23+8PlsZvPp7PJ+/Pny8ent7vd5e3vz7/xzc3n493t5eP//fHx9dX55aWNnfO7p7vjz +cm53+er5+O/2/unu7+l9fn54ev15fXB47/l9f2tlaGz+8/f5fPvu9PHvfnRrbXp/+Ojs7+/5 +7unv+fZ/d/vudGhz+3pyenR0fW1laHH8+n5tfPPv7/jw7+/z/HVxdv/0fHT26u11anJ59OHn +6/Z0bmx6eXv5fG5wc3r49/nw83x/+f537+1+dPPuenBva2twdHBvc37t6eXp7fJ5ev3z+ffu +8XFvfG9xd3318P16e2trb2lpdXv9/X716ubl+nVzampy+fn/fP5+/Ono9P/97vP6+vHu83lt +bGptd3FwbP7v9Px+eHp7d358e/j3cWtvff71+P/v6Ojm5O5+dXh5efv6fG5qcHpxbG1vc//w +7vn49v15eP9+9Pr99e/r7fh9/nf97O/r8PxybnFzeXZzcGxsfn78dm9wc/73+f317+/t6Ozu +7O98fH16cWlreHn9+/x7e3d/8u/t8P1ta213+/v8+Hx3cv/t9vL0fG98fXl8cH7v8vd+//18 +/vX57fd8eWtre+79bW1xb3D88u/3/npvfO7u9e3u/vTs7v18dXR3fvV98vJ0/PHy8fhvbXtv +bHn7aWlvbGtqc3x6dH339/Tv7vH57OTi7Pr07+/v+X53b29yb3ru7+/7dHBtcmxpd/l0cX38 +/3vu9Pny8/5vbfru7+nv/XV68npnbfZ7b3V3dnzr3+f1fnVvdXRsdXB0/vDwevrq5+zw7/N8 +ff75+3P9/mlkaW989O/4emtqfXp2dHt5c3p6/H727PFwa3p+/H766ufp5/Dv7fHt6ezs7vb9 +cP769/Z+b2dhY2pnY2hrZWRucHZ7du/p6e32fnVxf+/9+ezs7vH37Ons7vjzfnD7/Xj37fP0 +9v5zamZkZ3X+fn13bnf1+Pn6dXZ8bGpsbXj98uvm4+Xn6erw9Ph7fX16c290fH1+9ft3fP3+ +bWhtb3j09u7zdmxqbHFvcXl99PD7+3519Ozn5Ofm7P9++XRz7Ox/e/73/P1wbG92/fj8b2pt +bnB6+vbvfm/99m5ue3X66+b4ePr2+Hz29+/s+3R8fHjx6/589Pfy9vXz+Pn28/x1ffd5b3Bu +ZWFqZ2pta2psc/DxeXd68+rt9/787ebl4d/f5/D9fXvy7O/t4d3g3drd4ujvemxkW1dPSkhF +QkFDSFV22czHxMXGx83X4vRqXltbXWBs+Orf2dHNysrLzNLc4ePr+H9zXEtAOjQwMTQ8Sm7L +vbq4ubu/xc7b7GVUS0RAP0ROZ9zKv729vb/Gys7Y7nJoYmBlaWxhT0I7NTExNDtI8se9uru9 +v8TIy9HjcVlJPTs8QE7wzL65uLi6vL/Izth8WE5UWV1pZVVBNi8tLS87T9e+uLe5u77AwsPJ +1G9IOjMyNT1S2sS8t7a2t7i7vsnhXkxDQkpY9dfP3Vs+Mi0tLjZGatPFwL69u7i1trvKXz4z +LzA2P1XgyL66tbKxsra+0VxHQEJIVv7f0tHhYEk4LiwsLjZIb86+ubWxsLK2vdFROzIvLzU9 +SfHGurKura6wuMfzUklDQkVMXeDMxcXWVTksJygsM0Jn18S5sa2rrLPGWTwwLi4uMjxO2Lqu +q6qrrrW+z1pDPz09SfTNv7i6yXxIMSckJigtPXHJt6ypqamtu+1GNSspKiwySc67sKuqq62x +v95XQjs8Q0tnyry4trXETDQoHx4kKzJNwbOqo6GmrbnpPC8rJSQpM0rEr6uqqamstcVaPDg6 +P0RX2cW5sK60xU81KB8cHiQtSL6spaGgo6q37DgqJCMjKjhpva2npqirscVqST48QlBh78e7 +trKxuM1FLyYfHB0kMk7Aq6Kfn6OtxEkxKCMhJCxExbKppaiss8B8SEJEQ0zoyL65tbW3uL3f +Pi8pIRwbIzVWxayhn6Glr+E5LichIis82Lasqaiqts9hSz8/S2Xdx7y7vby7v8vR6EUyLy8o +Hh4teM7GrKCgp67FRDIuKSUoONW3s7KurLTfRUNLWG/kz763ub/Cw8rY4NnvSzkxLiYcHTXS +88ymnaKuts09Ly0nJTPWvLuwqq/B7Uk7Pk5Zfb+zucK8usXe6t3NzPVLPDkwIxwfON1eyaSc +oq++3D0tKCUpPcu5ta2qsMpNOjc/TVPWt6+5vrm5y3Zu1sHHa1lSOy8lGxsv2k1gpZqitL3L +Py0nJCtIybyyqqq53048OEBLXL6usb+5s8FaT2zgyMTr+9g+LSofGSJd7EWzm56tucRJMCol +Jz7Bu7WqqLb5UkI3NkL2u66yvbixyUdK5dnUx87ayngtKCofHCdK8c2qn6Oqt+Y+MSsoLkvH +t66ssL/kTTw7P1bLt7S7ubXBX1R06OPbzcbG5DsxMSUcHy5L5r+poKOvyHM+LSksNFG+srCv +s8hvSjw9Sue9tbi6tLfOY2np3tbayLrQRTszKx8dJS060rKoo6Wuv2w0KiorLk64r6+sr77T +VT08T9XGvrq0sbvT39zcbVFU0r1lPD0wIh4iJitZt66moaWuwEIuLSwmLfu4tq+qrLbRSj9I +VFrZua+zt7e90HVSTUpLXetGNjUlHSUtKz+3qqajqK20cC4pLCkrQsa0qaetsrxbOjk+VcvA +uayrtcTMz2E/NTpKOS8uKigtLjP8tq+sqayxu180LSsoKzvct6yoqa6830tCSmLQurGvrq63 +zdZeNS85LiYqKygqLz7ewbispqmvvMlkOi4qKy89Xcm2q6uvusfL12h+y728wL24u8nW7kY3 +MyojIiQnKjFauq6qp6aosMxaRDQsKi44Rl3OuLCxtri3usLHwb7G1NnZ3eTY2mBRTzgtJx8g +KSgtX7mtpqSlpq7CaEA2LCktNjxN1b+3uLq0sbW1tbW4xetfTEBDTElJYXlIOzYtKysrMEH4 +wLKsqqqut8TnTTs0NTo7PEdo5NrSwbm2sq+trrfIekk5MTM8QkhxzcbH1GpJQjw4ODs/Slrz +39POzc3U0cvHyc7R3WFNSUVFUefIu7a2t7zH7VJIQj9KYvXsz8TL6fhxTENFQj9ESUtKPz9F +SU5e2sW8u7u9xM/pXVFYaP/c0cnKyc/b9WZeW2d22s7Iz9J26WFaSUlMUE1NTktGQkNDRlD6 +18zJxMDI0dp+ZFlcbOTl3dLU5Ph8aO9p7tbIw8G/w83Y5FZMSk5KSkhISEZGSEtNT1x76+XX +09zf7Oj3eOzw2d3X29z3/fzk9OPjzc/LzcbMztTe5GtuXF5NTENFQkxGSlBaamdfdOtwbWt0 +++Lm2t3a39rl4frj5uLf6tPZz9HS1NTT0N/a4t9sX1dRS0ZKSVFQV1VaU1FPUVlZfXfi5tDQ +0c3U0tzm7N/u6frfft/p6ujX29jV08zb3e51TVFGSktOREtUT15WXPz1feLa3dvZ7N3j3ev2 +YPnl+uvz3und5cva09nP0dbQ3M178VJMP0Y9Pj9ARk5hYNfTyc3M0M/l8vxjWFxbVmX939XR +z8nIy8jHyMbGyNpmYUg9NzY0Nzo8SGPUyb27ubu9x9hcR0Q+Pj9GTV7q0Ma/ure3uby8vcZc +SEA4MC8tLjg+WtLHvbKxtrvL4GRFPTs5PUhX58zEu7e+xMva3ex+1sxaSEw7OD86PE1T2b7C +wbrExspeSkM6P01KX8/Iv7zGy9JwdFlMVnPfv7nHZFc9NTkzMj5T3ry5ube6w8phQz05PktP +cNLLvrvBzntQTlRSZNjIurK0zUw6LSstLTRJ2berrK+51FtFNS8wN1PJu7e3ur3KZkU6OkVb +0r+6t7O0tsc8LigjKjI82bqwqau510QzMzY5SvnGtbCzvN5MQTs7P0vdvraztbzJ09HuOy0s +Ki9K4MG3trW4z0w4LzJAY8y+vbq6v8ttQjg3QWLXysK/wMTM2uDPxNBPPDIsL0Viybq6vMDZ +UD05OkR0xr28v8zXfEc6NzxM3MG8vcDIzM/PycPOck06LSs2Tc64tb7KekdAPDpG2r6zs8B/ +Sz03Oz9Jb8m6uL7SbG/Ww7i1u81XNychKDVvsamttcxJPjo0O27Asay220MyLzY/V8y7urzK +X0xZzriur7fLQy4eGiM1w6Odp7VpLiwyMUTArqenslIwKCczV8a2sLfFdDw5UcCtp6m20T8v +JBUYKmGhlpuuUygeKThFuqekoatYKiAfLdKvq6y7VT43N1m6p6Cks+4/NjcuGBMiOqaUmaxG +Ih4sXcS2rKmor3UoICIwtKaqu0kvMD9cvayloqnEOzI4ZbrfGRAcKKmSmKlaISE4WtzJvaqg +p70sHB0uvaOmyjwuL03Jtamkpa5sLy08u6irMg0NGTaYjpqtOR0lNDdVt6mcnLQwGhQe0KCa +odguKCxCvaqgn6rRNS1Fv66r0hoMEh7GlZSfsy8fKDA5v6ehnqw2HhkbQKGZmqswHRwmZKec +mp6zPy4yVr21uUMUDRgnqpKWpMQmHSgvT6ufn6TjIRwcKquYmaU4GRcgV6KXl52xNyYnO7iq +pqwrDgwVK56Pk57jHhoeKHqkm52oPiAcHEOhmpy3IxgcL6+al5qnTCglL8CnqapBDwwTIaiQ +kp28IhkeI0CnmpeeeSEYFyymmJekLxsZINyfmJaf6C0lLr+nqLkjDA4efpiQnL0uHB4tNuSm +m5mjQBkRGE+ZjpOtJRQUH8eakJShTyIiMEu2rSoVGyNtnZ6v1C4kO/Rqv76/qq5EJR8pwZ2a +nrQuHh8tv5+bnaO2Mx4fKSksPkZF0bixscc9Ly85zaqnsk8pIzm6qqm9RkBUzrautbi4x8rI +USwxPhwXL96vnKg0Kyovsaa4vc9DTlEvL1DBp6CyRy0lMbWem52qwkksISQqGBdOrp+Xpjkq +Ix4yzrifm6fPKRoeO62dnbBBJx8tuJ6bnarCZDQnKCcVFUG3pJqpTVI4IytA8aSbqOApHinu +raShq9ovIydfpp6dorJSLiAfKRkVRbqpmaN0XzUcJU7Ln5qozS0iKC9fqp2dqTscIEqrnZ2i +q+QrHhwqHxMncsKcmqyvyiIdJynGm5yeqy4kJyE9qqSmrkA1XOS+rqWdouYmFxslFRc/xKqd +pKys3iklJTS8sa+sr7DDNSo6dMnA6863sq+zr6ap2zYqJSgaDhg/sKSfn6WvVCclOl9a68e9 +q61sQ82zwUsxMF65rKahn6i+NycgIB0SFzLTvKyenJ+tPisvLyosOc2trLm1qKi+PC85Xs++ +tKifprLYLicoFQ8eKSJJqqGZmKWwr9YuIyEhJzzgvqugo6mw5UNi2dvOxsLrOC0zQfXORTxU +Oy0zPU3Iu8a9tLvMalJe2NduY+LRaUVCV87G1M2+u8hIPEvex8LJyb3ITz0+SVpNPENsUT85 +NUReWXHCt7vNTT5KeNrLu7CttdJdT1Nsd+3X1ehq/9bJzWJFSlM/NC8tMT1I+cG9wMTT/mZO +P1evrb2utk5NTj5O6unVxcPCyc/OfVxMSVRHPDQuLjQ4RtfDwLq/yshvXtDHytHbyt5FTNnD +u7m3rau1vcBLLSwnISQkJy4uOMu2r6ein6GwxcNELS0sLTIxPV9vvaupqaeko6uvsck/MSMc +Hx0YICknN+68qaejnJ+nqLPNOigwLiQrOT1O3Lyxr6efo6alp67LUTYhHh0XFxweJTN9sayn +npyeoqWry0FJMycsMi8uN1rY0rKnp6Wjoqe6ycosHiUdFhofJCo1ybSyo5yfoZ+lr77STDQv +LisqLjc/V8Oyrqqmpamvtsk4KyoeGh4gISk1X8i6p6KkoKCqr7O+7kY+Ni0tLy81S87CuKup +qqqutMVAMiwfHiAgIyk2Uuu+rKypoqKmqay2y/JNNC0sKywyQGXOt6yqqaqut8o9Ni4iIiMi +JSkyRk3Br62ppaOlqaqvx+FKMi4tLS82RVzUu7GwrKqwtblaOjcpIyEjJSQqOUNhuq6ppqOg +payrteNOOjArKy4uNlToyLWvq6qrrbW8fDo3JiIkICElKjREd7atqKKgoaSqsb9TPjErKCkt +MD1lxriuqqenqq2ywlg3MiceIx8fJCswRte2q6efn6CjqLfNSzMsJygpLDVI1ryvq6inpqev +tchVMC0qGx0hHR8sNk/BrqOin5yfp6m8Tz4uJiUmKi48Zsa3rKinp6apsLjNXTIlKR4ZHiAe +KTxkua2hnJ6enqezvj4tLSIgKSswUs26raqnpampqra9yU02JyMkGxgmJx89vsSwoJ6en6Sm +suE1LC8hHzE5MfW1urGpqKerrqm05MvcMCImKBwZJCsnMsqvrKifnKGqqbVIMycqKSAtW05r +sK6zra2srLa3rcJQ2WUpICgiGxwjLzlFuaKjpJ6dpbPBVTcqHyYvKzLQu7qvr62rtrmttci/ +wd9PNygoKh4aJy8oOLqvqqGgn6CuytA+JycqKzI/VMGwtLevr7e4ubi0ucTadFguHiYqGhwv +MznBsaqdnqmmpcE9OCsoKicu5MjWtq20ur6/urnFu7G7yMjpMyYoJRwcJS071LaqoJ6ip627 +3DwqJiosLTvjwrqztLi7xca+vr+2sLe8u9Y6JyEhHBwgJzjBrqeenJ6irb9hOComIyIsPlfV +uq+trrW/w8G9u7y5tbK40k01JB4dGhwiLEa1qKGbmp6iq8s/LiQfHiEpN2a7sK2rq6+5wb65 +ur68tLW+1EgrHhwcGh0kL/mupJ2Zm56hrto6Jx0cHiEqPs6zqqipqq+7vry9wL69v8PM9Dsm +HRwcHCApN82qn5uZm56ms/kyJB4cHCEsRcGuqaWlq7G3xNPOztPU1cfB0186JR8dGx4kLEyz +pJyZmp2irs09Jx0aGR0qRsSspKGgo6qzv9loWE5KU+LLysrXOSYjHh0hJi5ps6admp2gprTo +NiMcGxwlOdWwqKSho6qyw/ZTSkdIUvDFuLW+3zknIB0cICcvYrOmn52fpKq47zQkHh0hLEbD +r6mmpaetvNZcTlFZXWnVwbi0trteKx8eHR8kKTfgs6ijpKivub9YNi8uM0XtyL27u7u9yN1p +YO7XzcrHwLu8vsLUaFJMV0kqHh8jJi4xN/u5raqstbi3tbfG2utrbFJCQkZM/tDJv7mxrrG3 +v8/xUj42MjE4QlRodF5ZTzszNzc5QUvzxL68uri4v8nR525aSkdKTvXLurKvsbW9ydNmTzw7 +OTk9Tmpe329HRn5qPz5R8cnMYUhLaHxZTElTdtvb3svAtrS3vc3d5/FabeJeW+jU0eRjXH5X +T0RDTU48Tv3tzM584sDdRE5T+1xmSU5cyNH60eTI1+hfa+3Ybv7PynXK3k/kQfJWXExO5+vc +2se/V8fq5mM9fETeVk3P1stv1PNlXF1aV0rYWeXYesLJ2WXdRms+TF1CWeBd38/RxsrlycNJ +22TazUvk31XZXd1N7Vxh0UHaYO1X3GHJ4EzMQtY92UR0V0/bVcBOvE/Dz/rSV+t6y1rMY9vZ +XsxbbEHtX1HrWchoX/Z02/NPQcM8yDfTUU/JUL1Hvd7J1W7N+N1V3FXXUXVX1WrR1lfIS8hC +b0x4Y0nNVctS51xYbVBeS9xjeOrSWsHken3NxWHcbdrYVlj769le5/3EWtfr82NnTvtPUuFU +WXp9S9RL72VJ11rYX+nq2PHSW71Kzell0lrt5OLh9ezWW8x64nHm2V/dRdpFaENI2UnhTdZn +vlTU8ObXStVN61h6Y/vJRcBOyOZy3Nvb9W/W+dNS2Wv57F9N6l9t6UvaUmNm/tpfeH7Maftf +6fhZTl9eX2Buau7eWb5hzfnL1u/T39d+3GH+aU/4S2tV5GPtXfxe3Fr+Vtle0FZ4Zd7bUstI +ylTjXdt85WPpeN/Lac5d0nH3alfpTPNS/lhsa97ve9pu1GTb6Fvtc/Vwd2Xu32TaUs1f4OBe +9WPPX+NS/m/XW1rhYHRN2k/tX+H78dd029/841bqbm5Z4fBv1nnk7ubc7F3YVNZV1l/n7X3p +fGlU+F5Rcl72W/lo4N7/y1vZd+xi4mdZz0nRT99bzfLf8lnQ7mnZY2Xu52tj7mDbTfZd3lrn +aGfc/91Y2Gbaat9s99xX3FnnYuFg2v5q/nBl/+xlbGvfe+Ze61/ZXmHdbelr9Xbs7WDY9HRl +dO5e5lzZW2bcX/d+7GzP/ert63Lu3lXman1o+GRpaP3tYuBu/2hd4/nk2uJ25Vnn5FhfXuhv +fPLtdOvf83To3vl6XfvzWW3+Zmpv+F/8V+5ffHZw4+vm7Obn7uPu5G3u8eZycPn/cnbg+Oj5 +5eNxdmr8dmtycGNddWRtX29senLu7PHrad7p8Xh9/G/vc/T+6+ju5nT2bOtsdm19bfR0+Hd7 +b//q83/r7mVl7vxp+n3vZPNfbPd/ZfbybtvY9fj07Gnk+WfhZV5162D63e7d+XNqamN8X3Be +6+Nz+upmdXFf8F1Y33db2+vYzN7Pz+7o23vt32x4XlFJRURCR1ReavP739fa09fa29nc1t7i +393V5tDY5NzSycbKw81qPzMvLS4yOEJO4sC2sbGzvMPeW0o/Ozw/Sl/g0MvHwsHAxsvHyMvI +yMXI70gzKicoKzE9UNa/ta2qq6661k45NDIwMz1N4MC8ubq9vsLFw8nJxsO+usH1PCohISQp +MT9zwbStqKitt9ZHNzIzNjlDc8u7t7q+yNLQzszGxsXCu7W3x0wsHx0dICxE17esp6OmrsJH +My0tNURQ2r60r7PGX0ZBW9vPx766s7Gxr7hOLyIYGBwlQLqpn56lrMs3LCgpOFjIr62vs8Bz +SDg4RFDbysjFvru1sre1tLlcLSEZGB4qa66noJ+puE4sJygrRcq5q6ivv209Ozk4SGHcxL+8 +trWvra+1vMNpLyEZFR0u662mpqOqvUgqIig126+trKu5XTouMz9L78nHx8zTwLauqamvvNP2 +OyQaFBgqTrWnpaChsU8qHyQ26LCqra2xXzEqL07e1s7SyMHNxrSsp6m31VBJajskGhYeONm6 +q6Sfo8IvIiEu/7uvrK+zwzYoLEjDvc3m1czsTX2ypaOrykpLcc9KKR0ZJDxG3K6inqVuKCIm +NuPEs6msuO4xKTfQucBqS1lZQ0PPqJ2hsWc+TF/Pz0ErHRskKTuzoJ2fuzEnJClByq6io7Nz +QTEzWs3hTUFDT1FXwKieobNdOj1K3rq5fy0ZFBsp5KKanKTXKB4fKXKsn52kxEQ4Kio6UGXq +7u/X4dKxpJ+oyTovOFS/q6a4KBIPGC29pZ2cp18mHB81uKOdn6rdMyskJT+9uLvFd+fj5rSk +o65NKixKvauips0lDwsVLb+fmJugviMaHzW2n56jqu4qKCUm8Kmvw/w7P1dss5+gtT8pLeqw +p6CqYy4VCQ4rw56Um6W0JxcdLcWdmqCozCkiHyFspai54jw9TlS7o6O1TC811bGso6HEKBkM +Ch7BppaUorM9GBcsyqKYnaq/LB0eJFOgn7pcOS45Q9OmnqnTOjRVuKynpb0uHhILFU+qm5ef +tWYiGSfcqJydrNUzIR8r4KagtkU0Li49w6Obo8s5NEPGsKmlyiYhGg0VTaydmanT7SodLMSm +m5+8TTQoKDF3q6O5OiwrNey3p56kxzs0OOGvqKSrNhwbEw8ntKSbnLpTOyIm6ayjn63mRi8m +KUC9qa1OLjM7TcaypqGxRDM8YrWop6rZIx0cERZIqJ+bp99cNiIq2K6jobVXRC8mLUu8qrNK +Oz9CX72spKXEOjlVyrerqsMrIh8TEi2zpp2ht8JNJCNFuKeirt1qRConMcmorl89QkNLbr2m +n65YO0Fex7Cps0QrIBUQHuisn52pt2gnITLMrKSqvMhWKSEvx6ywzlJQRTtMu6afqeE9QEZV +vKiuNyotFw8eSrqfnausty0kM0XEqa29t8sxKzVVvrvrU19EPV69qqCozV1bPkS/rrBKLTAa +DxxEzKaep6esNSMuOmyvrrmttT8vOkJYyuBScFFF3720qKi6zt48PMC0wkw7Nh0SGzdxsqOk +o6lNKi83Ps+9u66v40dOP0FXRELu39+/t7OrrcDJz09dvLroPzs7JxcZLUzuuKumpbZJP0I7 +PlnXt7DI0sFcQEs6Olpe4q+surWxxNvuSGe9z1ZlNzq5ThwfOi0oO1+vnqrErq9JMzc3a8pl +y7PCV0s/SFxNy660v72+xcx91re8YUZHOjU5TrrKHho5MiE5uaicpse3vi8qPkhZxr+6ssZY +YO7j52Hkv77K1tLBur/Ne0VEOy0vTbu55s7fIh40Li+/t6+kvkPL7DhM73/HxurdzdPJwc/U +2mH1zM7NwL/J515JOTs9SmLuetZ9UE1oWkvQ1k1MQjZLdFVs/OjJXzlnvLa3yse0zjxG5dS/ +u/S9/to6Pck6Vt5ibdZMZd18SmnZSltEylfi22vH/W4/P0xZQHa+0c+8SeTcRlnFcsfk/tdK +Zt1aXM9+1M5Py9nRZ9Vtb25T+9bV3/xd3kRQQXZsYuNo715bSN9MembczdJm2mL6SeZd6Phe +y8/721nR2mhT0+jTz8LQzdNLYkg/VU3Y3c3c1HZKR0FPTk3Zz83O0HvcW1JO10vf1trQzNBd +01Jcat5Kzcf/w/Bb7l5BSlVO3/DL2NheXEdeSvhH1sFav87xW74+2/bm4s57zlTn7FXvXl7O +V+NPw1L21U74Tto72kTwSL9U7dze7FneRchIzd3M38neV/1NWGLMU8Xced7kae7XT8ZK3VTc +VMpJxkPQTFBiTFj7b2PIYOjrSu9O5kzH2+rO5c9R1WtP4990zm3eznXkdlrZXVvt10vW9Gtg +TVtHXE9xec7m6tLY1+NY3WVQ6eP7cNf/WPb3Wdn0Z+3N6/HQWe/kVudJ0WL/5WhczUvRUPBf +X+9wb3V25v1q3mnIV3Jy6EvfZ2vNaODf7t3ia23lXlLN/1nQ9GvPVNtV6ETUQMV13/3h71lj +X2zYb+Hc3nDtWl/oUmB0yVjTZdNq3FvUV/BO1Vzu6n5sx1DeUdhG33ZaylnIUtNNYFToW9Vn +x1jbcWP9+uNodvds4eXycNtMzk3jYOda0mTq/eBeWv9saGxe03XUVtH7TctKyVj87XDYcnTi +bNBY5PRr+E984mVp+PRXy0tt0m5s1VFv31hczHj64VXZ+F121VPTdmvb4Fxp/mp7WVjpb358 +6/ri4nPYbW7mauBobfd76/PZfOz+bOPt6e5pVlhXYk5defDpb9vdz9/g4eN2+WXmdmdc7+5e +5Xvy5GdiXWJTTVFT7fPfz8rLy9nR5epUWE5PWU1v2+/e48nd2PfX1XlvZu9vXVROSU9NUV7f +1NfX2cnY6Ghwb1lPVHjvfvfd1dF89vB9XWFu6uj439Hj8e5s3/9gZ3R4altkbG5kbXlkYltb +Y2r739fPzt946ulTT1v+fvz2z8jX4e3dbFdUX2VUYXl8c33SaeLa2ePr5t9rSUpwW1pl3MrY +4tjP7FJSWWVWVOre0uTg0tBtWVxfX1xe49fk8t3maFJWcmpq+9rO2ePj3vJdWmJsZmlz+X1u +8/f5anny7N36eN/rb2Z19/p3fubu//P06mlqa2ZdYvpkftTq9+Jy+3pee+fs/ODf4epq92xi +XFtfam/u3t3z9238Z2RoavZ27ezk4uruenv49uz68+fn7/T8ZlpbY21oa/Xk8fhuZGhrbfjt +6eLZ3ef49PltX2hvY3ni3e3x4fpdX3B5b2xx4upsZ/jsaWz+9v5w9N7jb3fy83VmdPN0eevs +8m9+9nts+fLq/u7oeGtqdGx1/XJv5e9q6OBlamj+7HBv6/dxfPft+Xjq5u7q5/J0ZV9janFn +euLd7Xt1dG1hc/Ry/NzY5nvz+mZv6n5ydl1mbV514OHh5OrhdVtfa2ZiYHre5Pfi4vXv3Nhp +TF7kT0/QxsbObXl4QT5c+Xjez8nWXVtvWE5o3/P929nvX23deU9n1+tn7M7SZ+jP+lZ36fdv +UExNS11k58nJ0t7uZVdWaurq5NvW6lxZW2R+6+Xm9OrgXU1rfVVi1cvM1tndXk1Yb+TQz8jQ +RThAQTxZw7q9ydPqRztEa9vPycjOYUlMXVZR0cbVzczcWkZPZ+3JwcjIyPg9KS1OPkO6rK/F +aXBHMDRuvry+t7xROjc8S1fLu8DeX1xQS2XPwsHN1dFtT3PMv9EyJjxCK0GtqLbNy8w5KjnT +xMq7r7pJO0I+OEXLwNHCvtnyZ1VjXuC+w97JwcvGVDAqIS5IP7uiqLvTSjwtKki7tLCwt9k6 +MDY+P3DGxbzLb/vf72vgxbvF3cy+xtnVSy4eHUg9NqqdqbvvTzokJ2e3tK+treYuLjUxNXG6 +rrS+vM5USFjZyMfBvbi71uM+KhoXSUssqpehuepNPyIfTbKvraqlvi4qLSorSrqqq7e5xUs5 +Sce7u7awtcO/Oh8bFyc6LrOXnLC61DsjHji/xLKhoLQ/NzMmIjLbta+yrLVlTc+/wb65tbvP +cVQwEw9KPhm9kJq0srH9HxgsxdXYo5enP0hDJRwnaMm/q6Kvz8q8v8vCuLfTQt/FHQwluhgd +mpGstqWqPhkcTkUrvZedzdOx9yAhP0YvSaypu7alpbnBxXRLPVBGGhFbXxEvlqPboJyuRiQo +Oycfy6Ozrp+v2V4+LigtO/HPsp+fpqWqvlstJjQhDyGyJB6jnd+zoK7GRS89OB8m4c69pqCm +rb3uOCcoNj1jsKKen6CrvEcqKRcNIiwYPpqot5ygt7xSMjYpITRCPrmlqaeosLnfOjc0MErW +1bOjpay94swuFxkmHxkxrrS9p6Ktusfr2kUtPk88SMK5trCysLXH7VY+NTpAXc68t7fG9l0+ +NDQuMVBHQL3CPvPsOEraaM+/y7u54OrZa2J84M3L1HlUT0Q9Scy9u6+ww9pOOTg1NlLXzb+4 +vtxNPz4+PURj2tnOyedST1ZSXdLN19HhYElETlxjyre4v77KYUc/QUtQe7+9w8LTT0VAPUNR +WPfP2eHX5VtXb/f34ePvfF9RTk5Pbs/BwcXG0WFOS0hLWt/KxMbR3/tPRURESFZWWtDI2t3P +0ebv29f8d+hhSklgf/zbzs7V2u5iUU9gduHW3tPW9mBbST5DSkhL/tDPyMPI0NPT3X5dYF5N +UHzi7+DP1/fm4F9dbGVkbnr+5OHq7/5dT1JNRklf7NzMyMnP1tHdaFpdVU5We+Pw6tbV6H3v +cVpeXl947t/W3Pjv9l5SXOZ/TV7R5VfbyfxZ9ePudmBZXGJvau/Qz9jd2dt0XFteVVJp4tfU +1Np4YGBbUU1XdeDg7uHf6m5aXGNmdPju3N50feZu7NfY2d3c2flSW9biUE3autI1P7q/Ojbj +vV43UsHcRErazG1N8srO73fXzuFbX+zT1e/cytdqXGlvT07f3GFPT+vZXVvnc0pPzMF+RUpv +znpAVcHEWEjGt9JMV9DI/klZ2uhcT2V5c/nzz83iYnvtVEtX/lVV5+Zq8nDd2mlO5exaYvHX +2mjrz85OacrJR07c2XNL89PPZVXcx3FNSc16Plxn8OVqaMDi51H7y2dK6vDX7lxr4u5i4ljY +4VZ4dtrtS17OX+9GzsziP/nMUXVVWc3TU1LDx2hByeNlXslP5+pU3thqTc5YaG3sVufOXFbv +ZN1tWdbjzlxd02r4XlrdYGh/62PdY1/eeWH6zGFY4VrP6FFv1dxrWPPJ6U5bxc3fSeV9zl5G +Xu/9T1he2XFd7tLaXFTL3Wli5nvv4ORa59NQYVnW/Fxn5eHhVO7J73D901/nXG1VeGds3GvZ +X/1X1d/oZFzmX19MzmXlXXTj/t9b4nbjaWvje9Xa2mTd1fN0VHJ99Et8fNRoUfXZ7lDoXNJO +WmT9cPFt2Pve2mrk5dFk7Wvc83pt7Ph0fGd9bn9S7GnpX2T96etn3m7ebFxbdd7e6e3e83z7 +d2v7+2BwZXDrcVvt6Odr+9jXaGbd62pg/OV7+Vvj7/D0ZmF6YGXva/P6ZOx28nV71+zr6Xrc +7fdyZeptdmp+4mVtXWZgZWPudPZ86t7fffj59/n79fRy3n7W7OPe7W77Z2tfaGtvbVtsaWtp +Y2pl/n708nJw9Pr86PPa/eDj2+l16Xbl7vLy2+Rr7eX+3Pjw2Nzc49XsVk5WSkBBRUtOTExo +4+v028/MzNLO08/a3drn2N/j4eneft5t7PLi89fz5N3Z8lZRTFM+Pz9EREJLWdrf19HMzM3b +1tXd3W/k7Onn8ebq3O3Z0tjT3tnS2+je6t7q+mtWU1ZRQkA/QUFDSFRq7eHSycjJ2tTM6tZW +X/th/1LieNZu187ZydnNzdjX2N7V/trvYWxOWlpdTUhMRkxESEtYY2Tm39rb2Gls72r1b3b+ +4vPZ09fIzc3LztHLx9Po8udbb2hfX1xlVmhSTUhMSExPUVlmcG53fenq7PHx7u386+Pn4dvX +3t7b19PX09La2eHk5v186+7n9+v5fmx2WlJOTExKS0pKTFBSaG379fv3aPzs4uPg3Nra19HN +zdjc29PV3eLr7OXh/u3i3dzh4uV5c2VbUkhHRUNAQklKT1RbZGz96tza4NfUz9LW0tXU1NjU +19rW2djb19vg4d3keXP9a2JfW1pVTk5LSkpISUpMT1piYm7y3tvY3dzb3Nva29XRz8/W29vh +3dTW1t7d5u3yeHRvb2tpcm1eYWljW1RiWEpNTU1NTlJaZWpu7d/m39rQz9DW1NLY3+3f3mPX +yObf2Nl0SVTDcVjTx+Zh9+DYaVtsdV5JRkhFQ0FARk9OatrZzsPGxsXYZGReSFJZbNLIzb68 +yc3V1cjUdtvR4tXHw8LQY049LiooJiYrMj1lx7OppqinqbPFXzYvLyopNkdXzbmuqKqsqa28 +ydBrT0VKSz5ERCghLyceKzY9xLO0oJ2qqqjDSD8qIScpKT/Nvayoqaeosra7ytZzYs3M48tp +P0wtGh8oGRozU3avpZyXnq2nsS8kJyEhIi7Cs7amnqayu8TSPjjbxWfIrq+1t8BQNyEWGx4X +G0W6taKal5mktbtIHxsfHyMu76aiqaGfsmhGPDk0P8exr6qlpqy04y8mHxQQGyIgOamdm5qb +m6hELC0hGx8uRce2qp6kwMHJMigtNlPKsqGfp6erweZVOSsiISQbGTBMMuCenqWmqq/eKSU6 +LyY/tre5sbe5zzI3VDk5yLOwrKuprsf1fUlFcFtGQzs5IxkjNikpsZ6nqaKhtD0qNjcmK864 +z8W6xtdINF3NVMOrrrGzvLzWSmTh7MvE30c8NycXGS0yLdeamKKppq42Hh8vLipPqqi0vb7X +SDE50sXDs6uwu8zh4lRIV97PyL7OQjc1HxYfPEBKqpeaqry+Qx8aJUNR6ayfpLrkSTExMkC7 +rrCursZcT0NLaHf839LCsr1GTz8fFx42R96rmpquXUYyHhwrz6+spaCq5C4qJypH4LCip7S/ +Yzg4O0XMvcTHwbyysMZJOSscFR5L772gmqG8PCwrJSVLrKarq7FpLycmL0G7qKqss9s3LTRK +5ci1rbLP3bu2uLbgMigeFho7w62em6C3Mx8gIyhGrJ+hqbpMKR8oOnK2paKy2Uc4Nz3msq+6 +x9RqTHS/r6yyzDQiGhAazLWunZqlVh4dKS46tJyYp908KR4cLK+lp6Gn4S0jKUjHsqiquks1 +PVDYs6qorMAwHhkQGMGsq5uaq0ccGCg3W6mbmac+KCQfIT2mnaSuxD8oIy7DqKeqs+MzKTTa +sqmmpKzbJhoXDxuwp6aanrU1GBgvW76gmpyvMSEgISrbop6ms+o1Kys7tqepr8pCMi9Evayn +qa29NR4aFA8vn6efm6fOJxQbTcSsnZqevyQcICgxwJ6dpsBCNCsrRK+kqb37SDEwXrirq7i2 +yjEgGhIXsZ+yn5yvPRoTKcbCp5mapjsdHiUpP6ibnqvuOiwlK3OrpKzDeD0uN/q2p6mvtVgo +HhYPL56uq5ukxSgSGlzGtJ6YncEkHSIoL76fnaC8PDAnJTe9pKCwzV40Mj3zrKGrt8MwHRIM +J6CxrJibrS8TGUBK+qSYlqosIicmJDusn6Cu0kkvJitjraSruchKMjBAuamqr8wvIxkOHK2r +rp2dpfkaGDBKS7afmJ5RKSwpJS5LrZ2mwMVaNC0u26quuri9/Dg137O1u9s+LxcQKMjIs6Gc +nu8fIzQ1NmWpnKbeR0k4KiM8q6i2trHCPSszzL3Itqu0+T9L18jCw8lbHhAdRDhRrJ2aqTYu +OyomL82lp7W6wFk4KzDMwM22rrbsPEnx6826tLpxQ0xDPE7Szvn6ynVAKyJI4DNJxMXISUK2 +r8XDx9JOKy09Rf2+qqKsusBUNCwtUb++s6quy0E7Nzc8Rs3HfOTV2M/HaDU4NCcnLDrduq+k +pbPPRD02Lz/VuK+yr7X9RUNATH3VwcTW21pIWvj4ftlQVEk9UVPMytDCyE8/Pi4+SE/Pur/e +TD8/PVL8vLa4tLniUT9EXVXDvby/79BIQ05tV9O/QHHYQD5oztTMeNddOj5AOXu547G6TmVQ +NT9PSbfBw713WmYzSdZBxrnayN1PZuvo12zL8kZ3SkjKzlO3y1LNSTlJOEfG+MKyw3ppQDw9 +ZFnNsuK/0us2Xj9MyvLdu2Rd5U/mRlvvbmrNU8pk6NHGWNndSmxMVGjd1Wu729FIRnE7Tutp +wMPRX8zuOdZYVdHe6uLVXX155l81uUhHwjq9w1POwFZSZ0TJTj7Fzk6/VE7HPUXuyGruxrvM +WWz03T9T0t3L723H10Y+zz9PWlv22WPG5s9TVW5RRnVg6ODjxdLfT89OQtJqWLlDucrs8OBb +7Dpz0Nxb4sFg2WH5f0o+RvTNO8HJS79R0eNWPcpQT3jDVc7KWM9cakjMW1DEadjZ69lf6mxp +Xl3RTtltXctX3WtOw0XnZGhZ28lMzfZfaXxh2lfZd13XbndN31D3anzMVcjNVuvjRspK1dff +attZzNI/0PhZaVtf1UvSUelwVE/BTml43NvpUsjpa9FWTtdIeevV2/rNv1HY3T/KP+5vZmTO +X9j9aGps8VNW3lNm3mXRdNtPwWZkdc5W60rHS9VgXM5mWF3Qbe/63dBd2HLh7eBd9WF09vHv +5lfaT/1ifE/qW1pp4l1h1FzLU+LQVeTw9ctHyV/NbHrj89ZjctpgVF3z/U/wVs56UNJaYOhc +3UzNVc5azmFh29pTxlTpbudi/u3oXORG1+BiU9JqZGru29pO4tH+X1jLVNRZ1F3UStxjdE9q +VdR99ebdWNdWUM/zTdZh11bT8tX3b+Bu9WTi3OVfz23NWmfjXmhUX115Yl/PV9ZM4VlfVOLu +5Ol+2d1m7mxf72jtz/Dl4ufhYvBZ3FP0WfLeX29v3u/ye+xS3lzSXNBe3uHoa+l7d19eYXpZ +fPr7bmnyc3Js62rh7PHl6Gb2fOZ02VnYdWXs7Ot55nf4X21+al/u+27uWd587Gn25WjdW93+ ++F3Vfehy6XxvZm1k+2L7XOl19/5h4nlm8+ll3WPd79tn1mn2+O5f6GzrbW3d71nzXO5zb2H0 +ZOL7Z+V8dWfnaO97den7bvLm+fZk3fHTZmfpbflt72b9al/y/nJo/f5lc+ls5eVu9Nz3dur1 +6u15bO1rYnxq62Vzdmn2dO5m7vth7ulydvv/Yfna7vft3fB97/h7bHZ3bHlh+n5993llduts +d/Ppfv1u+/ln7fzx5/Z6cHd4eHDv6u/x/P7u+nbwbnVx+2jxavVub+p9f/JnafppZevm5fDf +7+zqenvr+Plv5HhXcl5ecmxb8edpbvbod/nr5fXn9Wru7WBt9t/offLl53947e3jX/V3cm9z +/V1XbeP+ePTcdf3naXRs8Proe+5o+f1XZuXja2fQ1nBsbNtvd/jp5W9tZOplYltyXXJ1e957 +6Nvp7fX79exjf3lcd/J04953+W3i3vFe1nn07vz15GtX8G9tZ2p531174n5m9lpobW52b2bg +/2zt3/HTzd7P0M7r8HTe/O5dXE9MQT08PTxDSVvdzsa+u7u+vsbGy83KzsrFxMG5s7s2IiUt +KCIeI0K8vriupqGnv+JYRDYtLDv1zsi/samprq+urrO8wtQ1HxobHB4eIji3pp+fn56iuEUp +ICIjJzbPsKalqKiqs7i+vru8xNE7Jx0bGhwgJj+5o56bnZ+nwy8fGxwiLE20pqChqa6zxdXG +vbi8vbC1OB8YFxkeIyvhp5ycnqStyzcgGx4tRc+0p6CkrsfZztTNv6+rrrCrqz8ZDxIdJCYt +y6CZnq7L8ko0Ih0qzK+xurKlqMVIXb+7zt66q6qusau9KBUPFiItNVKxoJ+u7z5BRTYrLlG0 +rb3JuKqsv3XVvMBrVsSsqa62rapQGg0OHjM/QNCpnabIOzRGXzs3SOe4vMm6qqetzktYVkZC +366jo6qvqa8sEwsOITZM1bmnnqzbPjRNzU08Qk66sbu5r6yzUi81RNrAtqefoaq7xrk2FAsN +HUu7vraroqjTNi5DycxDQknYur2+s6+5ZzA1Zb61ta6mpa/PXMvUKRQNFTG7rrvMs6ev1zg2 +zbbUOC8zVcDBua6vulI0Qsu5vMm7qqq1zNe1uSwUDhYzv7fIvaefq+ozNPbTPCYmNN6wq6im +r9k4LDjyz8m+sKeptr3Cta87GA8QJbyqq62vq7U/Kik1YPA5OVHMrqqvsspAPDE19sKzrK6t +r7mzt7q44CgWEBtHsqm3yMHETTguOtDHXzY1Pl69tK+tve9JOU/Iv7u+uKyrq6uutcYtGxYX +KErKsbe8xVA6Pj5VaTs2SVpd0rippLBtPzk+U+m9s6+rq6mpscfhWioZExkzx7TM6NnJ005D +T9PSTi4vS9evqaypu0Y7NEbNy766uq6rq6ewwdE9KB0VGio2yMfTtLm8v1ZGSzYwMT/Eu7Cp +qqvCPjk2PlNsybetpqWmp7LFQCogFxceLlG+vbe0xslqTU1BPDk+58G6sK2rsHk5NDpMX+fA +sqimpqetu8lBJhsWGSMxTcW5ra+7xHlZTz42MDnlwrmwrqmzXzYxPEph3L6tpaOkqK222z8m +GRUXJTvsv72vr7bKTkBBRzszN1m9sK2tr71MMjE8WMy/taumpKass7zOQyUZFhsrPEn207my +usXpW2liQjQ0R8i1sLK4v2xCPkNW38e6sKupqauutc49LCEcHSQvPkVM3ry2tr7V4OdjSjU1 +TOG8usPEy+h2ZV3dyL+3sq+trrK2vtVXOCYeISouMS8xT8O2sbjBw8XPUzo5RVn519DMyMnM +ycbFxcW/vbi5wcnf5flXTkQ8NDM2MzM2OkRg29Xh4M7Iwb7FzM/bcU5BQEhVcWb8z8C5uLi4 +ub7G3OvbzcPKbkQ8Pz43MjAyODo9R13Tw8XJ09ze9VdVYO/a/2/41MK8vb/Bv72/v7++vMHU +a1BFPT4+Ozo5NC8xN0Rc/vH11cnM0dLQzM3rVk5d28zKysfFyMfCvbi3u8je7tvT61lPTEM4 +MC0tLzU6PEBOdNLFv7/Bydbr6trRz978bG/22si9uLa3vL/Dys3Qz8zWWkQ5MzEvLi0tLzY+ +SV7bxbu6vcDDxcrO1t/4Y1dUXuLIvbq6uru9v8TJycvP12hHPzs2MC0qKi0xOkpp18rEvbq6 +ur7L5GJTUlVp6NjRz8vIwb26u7y9v8TKy87V5lA+NjIvLSwtLzdBUF/kzsjAvsLGzNrobmh4 +7/R6/vXw1L+3s7O2ur/Eyc3S193xVj4yLCkpKy43Pkpd6tTHvLm6v8vX719VVl985uTh3dLG +vry7uru9wsnNztDPztRpQzYuKikqLS82P1Lt0Me/u7m4vcfad2BcWltgZ3fk08a8trO0uLzB +ytbf4NrRztxNNy0qKCgpLDI8SV7byL22s7K4v890U05YaXf36+jZyr+4tbW1t73G1ePo6+Pd ++Ew4LionJigsMT5X48zAu7aztLe9yuVbTEtPVl5sfeTNwby4tbO0ub/N4vDu6+LoWj8wKicl +JisyO0/jy7+7uLWztbnH6VhJRUpOUl5659HEu7WysbK3vsvg+nfz3dlqRDQsJyUnKjA6SGjV +xLy2srGyt8HoTUI+QEdOXHLr1Mi9ta+vsLa9x8/c3+Pk43xPOy8pJSUmKzI+VODHvbi0srG2 +vc9dRz8+RU9cc9/Rxbuzr66usrvI2/N18+ni6lk9LyomIyUoLTVCZ8++t6+srK62x2dHPz5A +SVRp/eXPwbiwra2wucTW/Wp3593b+006LSckJCYqLztN68S3r6yrrLC94Eg8OTxBSlNv3c/C +urOura+0vs3ncGl74tnZYEEzKyYkJScsMz5fz7yxrKqrrrbFckU7OTo+RlBo3cq9trCurrC3 +wM7rZGzo4NzcX0AvKCQhJCctN0rbwbWuqqiprbnQTTkyMTU8RlJz1sW6sq2srbC5xdxrYnPj +1s/WXz4vKCMhJCguOE3XvbGsqKirscB+QDYwMTY8SF7fyr62r6yrrbG6yN9kWF/l1M7eUDks +JiEhIykxQHTItq6qp6irtMVcOzAuLzQ+TWzWxLqzrqurrrS+z/9dWmzczc3mTDUqJCAhJCo0 +ReTEta2qp6msuM9MOC8uMThDVuzLvrixraurrbO/1WxYV2bk0MzfSjMoIh8gIyozRte+sq2p +p6iststOODAuMTdBV/LOvravrKqqrbXC41pOT1384N9tRzUqJCEiJSs3TNjAtK6rqaqststX +PDMvMTc/TnDQwrqxrausr7a/zvZbUFJcf+D1TDouKSUlJyw1QWjMvbavrayts77lRjo1MzY8 +RlL+z8C2r6yrrbO8yOReV1xfY2puWUc7Mi0rKy0xOEFU7M2/ura1trvC0WpORUE/Q0xe5MzB +u7a0tbi8wsnW+WhkX2BjYFxLPzs3Nzk7PUBFSk9WYHXm0crJy83V3N7e4+vl5d7a083Hw8LB +wcHDxMjO1OPscF9YTEU+PDw8PD09PDw9PkRLV3rVy8XDxsnKyszMy8zO0NXX1c3Kx8fGys7P +1dvh63tiX1ZNSUdEQT89PTw6Ojo9RlRw18nFxs3Ny8vOzcvOz9TZ29vSzMfHxsfKzM/Z397i +3+9kV09LRj8+PDk1NDY4PEFNZ9zMyMXGx8bGyMvLz9TZ5urb0s/LysjFw8THy9PW3ersbFZM +R0E8OjY0NDM1OT9LZ9nKwb/CxsjL0NXX3d/f6Oro3tTMxsPCwMDDxcjMzdDZ43BURj88ODQy +MjEzNjo/S2TZx8HBxMXLzc3R1NLZ3t7g4NTJxcPDwcHAwcPIzc/R2OlgTkQ9OTQzMS8wMjY7 +Rlrlz8S+vsDCxsjM1d7j3+Df3+HZzsnDwMHCxcfKz9PV1NTcak1FPjg0MjExMzc6P01u3c3F +wb/Cx8zR2d7p6evq3tnX0szHxMHAwMHGy83PztLZ41lFPzw3NDIwLzI3O0NX6M/Gwb++wMjM +09/r9nd9dfjr3s/Iw7+/v7/AwsXJzc7U32tQRz45NDEvLzE1OT5KYuTNxsO+vsHIzdfl9HFo +YXHs2s/PyL26vL+8u7y/w8fFzGZAOTAtKykoKi41PUv3yLm1s7Kzt7zPZ1lLQUBCR1dx6Mq6 +tbSysrO1u8HCy93fcEg8Ni4pKCgnKi0zQW/YwrWzsK+zur/P6W9NQ0VJSVrr0cO7trCws7W3 +vMHEzdrZWjs4LyYmKCQlLC82T9rGtbGyra63ub/XdE5HQz8/TFv4y724sq6vr7G2ur7Ezdta +PjctJyglICcrKjdZXMqws7Grr7e3wdlzSklIPkRRT37FwLyyr7Cvr7W5vcbM3klDOisoKSQg +KSkpO1xewK+1r6uvtbjBzWlMUUA8TEtF3sfMuK+zr62ytrm+x8vfTEE0KSknICUqJi5GQGq3 +uLaqrbSvuMnMZk9UQEFNQE/U38m2uLStsLOyuL6+wvxVSi4rKyQgJiclMj5A67q7taqts6+5 +y8xbTU5ARVFEV87cw7O3s62xsbK5vMHLYUw9LSsqISAoJCY6O0LBt72uqrGxrr7Sy11LTkZA +SUxf18y+t7SxsLKzt7y9w87uVj0vLSgjIyckKTY2R86/va6ssa6uvsbFUUtYQD5RS1LQyMC1 +srKvr7a5uL/Mx2JGQi4sKyQjKCUoNTVG0Ma7r62urq65wsD6TlhEPE1LRt7IzLmytrGvt7m6 +v8bB3ExRNystKR8nKSMvPjdbvMa5qq+yrLPJwdNJVlk6P1hDWcPIvq+zta60vLi+ycPLZ1M/ +LS0pIiQnJSk6OkjOwr6vrbKurr3Dw1ZMXkI+VUpSysvJtLO3r7G7ubzIx8npVVI5LS4pIyYq +Ji08OlDHxL6urrOuscLGzE5MVz9AWEhSyszFs7S1r7K6t7zIyMn3VFQ6Li8pJScqJyw6OVLK +wr2vrrOvssXNzEZFWT1AfU9bwcfEsLK2rrO7ub/Ozc/pT1M+LTErJCgrJSw9NUvIyr+vr7Su +sMHLyktCVEA9ZFRNyMPHsbC3r7C5ubzKzdPsX0dBMi0uKCYrKik4PD/eyMq3r7Wzs7vLyPZH +V1A+Uu5R2b/KvLG5t6+6vrvJ29LkaFRKPC8wLCgrLCkuPj1Ux8S+srG2s7TC0c5XRVpFPFhU +TcvCyLWxuLO0vr2+zdPX715PRjgvMispLS0sNkI+dcXIvrO1ubW5zNrRUEhdRD9fXVjJxMS1 +s7eytL2+wszS3OdkSkc3LzItKS0vKzhHQHbHyb2zt7i4u9Te30hGWUdG72lvwsHAtbS3tLe+ +wsbO2t3dWU1LNi8zLSovLyw5Q0Bgysy/tba7ubvT499ORVpOSHzr9si+vriztri5vsfKzNbl +62hMSD00MTAuLTAwMj9HTODGx7y0ubu7yOTxW0tPUE1acd/Lw7+6uLe3ur7Ezt3udf76aU1J +QDc1NTEvNDQ5P0ha3s/FvLy8vMDM419UUVBXYm3w1snDv7u5urq9xszZ9HVwZXP1Z1JIPjo5 +NjQ1Nzk8RFFm3c7Jwb/Dx83leWtkYnzx7t/X0MvDv729vsHEzNTc5O/683zzblpPRz47OTYz +MzU4PUdTa97QycPDxMfL0tXb7PXv6+HVzcnDwMDCwsbKzdHa4OPu+/P0bFtPRj46NTIzNDc7 +P0ZPaOPRzMnGxcjLztXa3d/f2Nvd0s7Lx8PCwsbJy9DY2t/j4d3ceVpORT05NjIzNTY5PUBL +Yu7WyMLAv8HIzNDW4ezr7Ond1tHMyMbEwsPFyc/X6Pz38O/1alxbTEE+OjU0NjU3PEBKXuzU +xr+/vr/IzdPd7nd5ffHl2dDMxsPAvr7Bx8zT3ef3fG1oX1ZMSEE9OzYzNDY3PENJWd/Nx7++ +v7/EzM/X5fJ7bXrv5djPx8HAv7/Dx8rT4O36fHF3929YUEk/PDk1NDQ0OT5FTmnhz8S/v8HF +zNDX4/1tb/7p3NPLxL+/wcDAw8jP2u7x7O34+v5eUEpCPTo3MjQ2NztASVXt1cvBv8DAxM3Y +2+V6d3j969zOycfFw8PDxMjL0dvj6ubp6uPvZlZLQT06NzU2Njc6PkNQdeLNwr/Bw8XM1dze +4urk3ePf1c7Kx8XCwsTHzdfj7e/29fvwelxTTUdBPjo3ODg4O0BET/jZzMO/vr/Cyc7U2Njb +827+5t7d29rOw8PI19LL1OH+z87c+W7iXkI/Pjg1Nzg4NTpGREJYzcS+vL27wc3M0dXr8G9k +cHR6b+PJwL/FxsTFyszP3OP4+nZPRkU+PDo4NjY5PEFETWFz18vHxL69w8vV1NTncGttanP2 +6NzRysPAwMPIzc/X4Ot0Wk5MRT06Ojo6Ozs+Q0lQX+7e2tPJxMPEzd3e293q/Wv25dvSzcnI +xMPDxMjMzs/X1uJ4alZIPzw7OTc4PEBESlRu5NXPzMnIy8zP1NrsaW1taHjp5N7UyMXFxsjG +yM/S091+al1PSUQ/PTs6OzxAR09cZe3Y0M7Ix8vO09fZ4uPi5eDa2+Hd1dDLy8rJyMfKztLT +2t/i/VpKQD07Ojg3ODo+Rk5j5tjXzsfHy83P1+DpfXnz5N7b29bOysnKys3NzM7X2Nvi621c +UUc/PTs6ODg7PUFIUHTaz8rFw8jMzM3U2d3r8Hj2+33r2dTTz8rMy8zLztHP0NHc9G1dT0U+ +PDo4OTs9P0hPYPPZysfHxsvO0tjk7X5jbnNvf+/e2drWz87NysvQ1dfZ19nb3fdgU0lCPjw6 +Ojs9P0hSY+rPx8O/vsHGy87W4/VtYmNmZ2z+7N/d2dDOzcvLzc7P09LX5HpmWEtFPzw6ODk6 +PUFKV2vr2c3Hw8HDyMvO1+f6d21ucW3y4t7a1s/LycfJz9bY3N7l+GlcU0pCPjw6OTk5Oz9H +T1r41crDwL+/wcXJ093l6vV/dmly7+vo3NPRz8rMz8/V3uTi5Ol+a1xPRj89Ozk5PD0/RExa +bd3OyMTCw8jKztjf5u757+3q5t3a19PRzsrJys3O0dXR1Nvl629aTEE9Ozg2Njg7P0hVXfjS +ysW/vr/BxMrV3t/t9vb67uvh2tTPzMjGx8rMztHY3+d7bVxORj86ODg2Njg8P0ZUcePRyMXC +v7/CxsvT2d3o7e7s7Oje2dLPy8rJyszMzdDZ3el7X1NJPzs4NjQ0Nzo9Q01bdtvNxcG/v8TF +xczX3tzZ3ufh19LT0s3LysvNycnLzM7S3GtNRT85My8uLi8wNj1IXtPDwLu4ubq6vcPK0O5t +c11bb2/22c/NyMLCv76/wsbK0ORlTkY9NTIvKywuLTM6QVfhyL+7t7S3urm/ysvga2piXV9t +c+TSycHAvru9vr/J0N/xYj86Oi4tLSkrLi43Pkzky721s7Gvtrm7xs3aaWROTlJPWunUyL+8 +u7i5urzAydbrV0E9NiwsKiYqLC42PlDexLq1srCxs7a9ws30clxOVVlj9NrOxL66tre3trvD +xtxOPjozKCkqIyYrKzA+VufFuLKvrq2utbe5yeTccktSVE9b6dHJwrm2trOzvMO+5EJCOiko +KSMiJiktM0Hmyryyrq6tra+6ur7a9u5ORlBfYvnNw8C5sbOzsbi+vuw/PDcoIiUjHyQrLDJJ +3sm6r6ysrKustbi5z2puTkBGUE9Z08bEurOwrq+7uLhJN0cvHiEqHhwpLik218zIr6uqqqqp +q7i6utdUXE4+P1NYW9TEv7ivrq+0tbdyNUk4HR8tHxolMikt78nOsaurp6isq667wsN7QEVM +QkVi+9vEurawrrC3tLZcNEM0HR4rIRsjMi0vbsrJsK2tpqeur6uyzs3MSkBSTEZU7NXDuLay +q7G+tL8yL0IoHCIoHh0qMy9Fz8u1qK2tpqaxta24/On3QkldSUvXydC9sLCvr7q4uzsrOC4e +HSUkHiMvM0DUzLqop62rpai0s7bP82ZFRVhWSvy/wcOzrq6yurbINC02KB4eICAiKC01bsDH +taalq6qnq7W2vWhcZz86SmJTccK8uq6qrLS6tcswKzIoHh4fHiIrLjBau7q1qaWnqKittLfA +XUhKPzxBTVvdwLm0rKiprbi8xToqLCceHR4eHykxOFe6s6+opaeoqay3v8RfPj89OTtHWd/B +ubWtp6WosbfAPyosJx0cHh0dJS85Vr2yraajpaeoq7O9y1I9OzU0Oj9P2L+6tqympKattr1F +KCknHRocHR0jLjpaua2qo5+ipKasucXeQTU0Ly01PkvWu7SvqaWioaazvmsqIiYeGBocGx4r +O1+4qaijnZ6io6i1ynQ/Ly4tKCs1P2e9sK2ppKKgoKq3wjohISIZFxsbGyMxRMaopKOcm6Cg +oa3C5z4tKikkJS43RsGvrKegoqCeoq/DTykeHhwWGBwaHi5C1qqgn5yanKChqb/yQCwnJyMj +KjJAzbKrpqGhoqGhprbtPigcGxsXGR4eIDRfx6ien52bnqWlrM5MPiwjJigmLT9S1bStraqn +q6+sqq+6yVI5KyQkIh4fIh8mN0XlsKmrpaCmqKauvspVNTAvKiswNkLXvLOrqKimpqaosMhT +MyYhIR4dHx4fKDRFvqupp6Gjp6Sntr/UPTIzLSsyNjhXyr2uqauppqiqqrbVYzckIiQeHiEf +HikxPsKvrqqmp6emqa+5zEs9OzU1OTY5S+nDtK+tq6urq62yveo/LigkISAgHx8kKDJaxbWr +qKinpqeprrbIaUc8NjUzMzpFY8a2r62sra2srrO87zktKCIgIB8fICMpO/q9rqmnpqWlpKmt +ttVNPDQwMTE0OUbiv7Ssq6yrqqutsL4/LCokHBwfHR0hJDPXsaqkn6Cio6SqsLxONS0oKC02 +R+zaxq+opqWpqqutrLR7Mh4VExYaHiInNFOynpmWl56nuV89LCIdHB8rU7mooJ+fnp+ip7d0 +PjhI1dlPNh8XGBceLi5I1b2mnJmZn707KB4gJCQrNFWsn5uZn6288HDbW0hEPl60pJ2fsVAd +EQ8NExsjRbahlo+PlKBaIhgUFhogOb6flpSWnrZQLy00PEjoxLGknpucsUMeDQoLDBs0vpyW +k4+SnK4wGBAPER47rpuUkpWeuzsmICQvTL2so56dm52myioZDgkKDhpypZeRk5mer00mGRMU +HDKvnZWVmaTINiIeHypFs6Sdmpyeoqu9QyIZFhUTFh4pvqObmJ2qyEksKyUjKjjQqZ+eo7hm +LyopLT/Sr6WfnqGosMDzTj4uJyoyLiEcGR89sp2cobttPTk7LCoqPLqgm56vPisoLkbYva+r +q6qvu8bQ19bb3mHdz8tYGg8NEiusl5qbufxsPD4nIiREqJuXn/stJCtB08fNu76zr7Svr7G4 +zk9ITs+urVoYCgkOLqKTlaG+P2NaPy0iK8+flpmpOR8dLVzAuczMxLi1rqmsq7dGNTRzqqao +0hoJBwwcqJaTmqzdP1gxKCYuxZyUmKM+HhwdLGDGs6+srK+wtq+yw0ItK0SmmJerKxMFBQ0e +ppOQl5+/PC0gJSpqopqXndQmGhgfP7epn6etuVxg/8e+00A4SbeakpauIA4FAgseqY+Mjpiz +LB4YHCzOn5aXofMiGRkkS6uhpKvURDxDzK+qrb5OQeavnp22MxwODAwVOKSPjpOmMRoXHzG2 +n5ybo78vHxodM8yhnKe1Pi443a+kpLVvMSw7yaahq8gnGhEMEiW1k46TpUQdHSg2v66noqS1 +OSAbH0Sqn5+zPSwuTbKlpazLNywqNs+tn56rajIZDgsPK6WMjJKuJRYYIzu1pp2co80kGBsn +waGiqdU3N1HJsqyvuV8uKStFr56Zm684Jh0SEBEftpKMkqkgFBYmy6ekqaqvwTYhICZYpqGn +wjMsPcyxqbDCYjYwOF24pZ+gq0wqIhsVFB1BoZOVoUgfHSdJv7Gxrautzy4jHy28q6m2SjpP +yLetuth0Qj9DS82soJ+jwC8lHBQPFyuuko+ZtiobHy8+1762pp+oeCgcHTu5q6m9VFzFvLO8 +VktDPlXfybGmo6e5OS0lGRIRG06bjo+cVB4ZHSU01q2dlpmtKxYTHEypnZ+twGhNPDo5Tb2y +rrjYeMatpajINyQaEw8ZNaeTj5m7KxkZHy34qp2YmKc0GxMYMrOdnKK0bEAwOD/msqmotGYy +NsWqo6tdKhoTEBkqtpmVmKlIJB4hKEO/p5ybo90nGhooWauhpKu//kVDRV++sau02T49vKaj +rkEfFhIUHjbSo5udnrI+KiMgK1e8pp6jrustJSMpP72qpqWvvudBQlHVuLK4xse9tbLOMx8W +EBYiO7Gen56jutg+KiUoLmOspJ+kvFgvJSctO86tpqCktuc3Lz/curK1t7i5vOIyIRYRFx40 +raGem6aut1g3KyEhLUqyn6CjrksyKSYtP8+toqKksHI/Mzx1y7WvsLS/WTMjGRUVGCjHqZqZ +nqKyyFU1KiEfJTfEp56eordKLyYsOWW2rauts7/da09W2b60sbhdLx8XFRgeLdGuo56fo6eu +vvw7KSMhIy5Mvamioqi04kI9P1nLwLy8y+JvWHrGtq6rr9I3HxYTExgkSrWjnJyen6arstU6 +KR8cHSEub7Kkn6Cmr8Ln5+TUy9xaRz08S+e8r6urstgwHxkWFxwnQMGspJ+fnp+iqblZMCQe +HR4jLUrAraalp6qtrayutslPNy0qKzNHzbavssNTMiUhHyEpMUfOvbKqqKakqK642EY6MCws +LTA6SmvWw7qwqaWlqK687T8yLS41RXvSyNFZQDMsLCssNDtM0L21r62vsre9v8rcZ0Y8Nzc5 +PD0+SHLEsKmnp6u0x21GPj09RVN83d9pSjsvKyopLDRBace6s6+ztbe6vLu+xthdSD84MzEx +Nkbgu66qqKqvuchzSUJDSlVcYm51YUs7LyooKCwzQPXCura2t7i2tLSztbnC7UM1LSkqLTla +xLKrqamssr3L2m5gU0xKSU5YZVlFOS4rKSovOkhy2MvFwb26tbCtqqywvWY4LCgnLDNH172y +raysrrS6v8zzUEQ/P0JOXGJTPzQtKysuOD5PcuXPyb+5sKypqKuwvlc5LSkqLTQ/XtC9tK6r +qquut8lzTEI/P0ZMUEtANi4sLC4yOj9JWGrgyryzramoqay2y086Ly0tLjI8UNS8sKyqqqyx +vdFhTUtGRUNCQ0NEQTszLi0uMDpCS1z20MC0rKimqK69eEM5My8vLzU/bL+vqaiprbK4vctr +RjcwNDgzNT9KccjMZkk8MjI7Ojk8Oz/iuK+qqrC1uMHXZUE4Oj5T1snEvru7trW7xtpoWVlN +Qj46PEpt7+PXysT+NSooKCswMTRB9burqKyur6+vttBJPD1Pb1xZX9i9trrJ1M7IxdNOPj5D +SkpHRVB89N/V1NjVXi8oKywuNDY78cHCt6+vrKuvt7zJ4nBPSEtNTmnm38y/u7m7ws/lX05J +Pjg5PD5DTV/v6WZeTTw4Ni4wPD5J4NDAtLKwra2vs7vH3lRGQ0ZMVG3Rwb25u8XO0+tZRTg4 +Oz5BPz9YcUxLR0FDRENGR1Dv2trPxL26vLy4uL/M197tXU5SedjQ19fQ0c7M3HdhVUlEQT5G +Rz9NaX3+ZGVwWUA/S0xJSE/oy87Ovrm6vb++v8nb3utqdG5v7fVhXl1aXV1aaV1OTU5QU09U +Z+Xk3+Rsb2dncvdeVlxdYfLj39jU0tPb19bb3+dtZ2ZibWzn7O3f29zf3nVeWVZUWFtm6+jx +9u7s8XFpYWJaU1dTXnLw49HM1Nnb397e7nxkWFVcZ291YWRrdHrv59/g6fx49f5yfvvx6+js +6OTrfHtqaWlfX2Rqeujc3NfW5+jb3uh2Y1hVW1hUX19deOv7/Phxal1veHL28urn3tzV1djd +7H9vb2d1b2pleHBg++LZ427o2f5z4vVfanhxYWNeWmNeZvb3aXzsd/p0burx9vb429nZ2uF+ +Z3ZoXGdiWl5eXHXf4t3W2NfeeO3hd3t0aGj/bmxybnpu+/v6b/v0c/7/bmp3bXP3c2Bi+Op+ +bG1sZ2xvffjt79zY293Z3ePc4ORvZ15eZ2Rqbmly+fLo73v99HZ2bW5nYGp38ezr6Phydmpl +bH1xamz5+HXz6u3m6+vu6Pjtf3d3aGVscfzf7fx47vn6fGtwbfvq3OLi3N3f6nZtal5bVVJV +VlpdYG7c2+jl6N/a3uTf3+xgXFVSWnDp4N343tj3+e5+b21fZWxma/L07e/s7v/77Od67fJ6 +dHD8bnJ+/Xr8bF9uT2DX1lxf1uBpbnx4bWZiaW9gau7yfHbn91ZK2sha4sLO29rk8eVqa2BV +TFjw5HZI7r3XVvvS1P1OUP9eT1FJUdjyaO/b0tXvZ+h7b2ZeeOt9bd3h6Oj19Pjr9OrucP/o ++Prl3Njd7Ojd3t3e6ehuW1NDOj0/PURLUuLLysG9v8DD12RYVk1ISFFq6d/bzcO/v7++vr7A +zM/X7Vk9NC4qKSstLzxZyrixrqyssLrJbkg7MzExN0Vg2MK5tLO3vL3BzeDxfurf4NLNzMTQ +QzArJyYmJio6bMO0ramkpau0wnpDNS0rLDE7SurBta6srrG0u8xqTExWWV1v2cXFx8JfMiom +IyQlJzNlw7GqqKWjqK+9dUM3LCgqLTZHecKxrKurrrK6z1xMQ0BDRlfh19DKxMXIz0ksJygn +KSsuRca4s66sqaqxvd9OQDUtLC87W+bGs62rrbS7vcp8VUQ/QkBDTmncy8vLytp8d/PpSS4q +LS8zNDQ/6si9ubmzsLS6zWRgWEpMUm/OysvEwMDBydXgbVJOR0lJSVFf9d/S0M7PdVpbXlhL +R09jX0xFSEpMTEtVet/e49jOy8rR1M/T09je3NPY397c3NvV08/e1tH0XlBYXlZOTllfYlZP +WWRfWWhx3N1scPju6VtSVFBPVlZUd3dq/XHez83Pz8zKzc7S1+zh0uH3enPt4fx8bV9rZFNZ +6H12amBxWlxXWn9qa3fr+mlYVlp+5n505N57X2xnYXlmat3h6u/b2tjQ4NTice/sa1di/W5r +5+bc0+nd/fL+cHFdXWNfbm36b/92dOddbub3ZntwYGpcW11qX2Zu6Pb+2tn/ee/t3PtdX/P7 +6fj25N7x+dLc4+3c9+9wZNt67+3lb/tpUl9hZl5bZvpnZndcbuhrXPpmcXhZcGjmZuj459zm +59bP4fH+2+pq7/xoZdvm7/v639n3dGbkXVVPdVtRZlhk5tXh2+3e7WJoVFheWlRf9eTa49PP +1958127fYHhmfWBieXvtWeF+3f/n42xzXPNk43zraOricfLr5/HkaXRqa2BbWPp9ZeXf733o ++nXwa35s/mVman9+7ev3+NLh3fnf6m9oYWB0eGrhffr26P328ebhaHNvX19pdvdd49xmY3jv +3eX05etlXlNw/Gpa5N7x3n7X7nxeZlzlaV3qbvDv2uvn4vV+fuXte2r0bnxc89htYPH67fjs +8mp462hlbHlrcWdp7u9+/evu/G3v+ebxefX06+3z//To6v59ZnBnbPF0Z3jn+ntlb+zt8Xvz +7Ot9fGJteHdjdfno3ur7bHF47evcZ+PqZGT+8Gzs7XBtdV97cHNn29z27Ptva/5z73bs8HP9 +eH9o/3z6emZ7+Hl3amZt/evp5fLtfnr9ffH6+PJ8+XZn8u3zdNnp6/RsbP59Z2Vk7W1nXH7x +ZWf34eTrb97+8Hvte/lpb297c2bv4+1t5ex3d1x94un7bHjm8nTo3tx9eHZ+emJpaWV5ZnXo +82Nl8/tqWnRzZW9p7uHf7f7l2Obi6vNx8e94/ez9bOp+fvVn62v2am5taGV1e238YHRvc2Vg +anhv8t7e5Obs6N3t6f7d8u954XRnc3d+c31gc2d1evjudXH3cG9t9fd85+3/Y2Tz33T4ePP2 ++GZs6Hvtetvx8GvmeXf5cG5742bq3+h2cnp8al92/PNs9m5ndfT0a3j0/mjofe/+a2t27PTv +7NhzfN7xaWP/bvf1ZWrl9f5r8u7uaH7qZ2hwfPd47Ovy7vh6Xuf9Xm5l8e/3ffj+/25y5Pf8 +ee3/dXvr5n5se27j/vpv+3nv3/V0d/9nYGXwae3+6Obi6fbteWxa8ltbVOxubnbv2NnTYu96 +1Ft98ORtaXRd1+rkatbj1/7/7mddT11Y6m1tYmFdWFdZZlpdXWVr9uLRy83KxcrQzMbIzMzK +ycrJxdVWNykpLS0sLjRWvbKvsba1tcDyRzk1Oz5MWu7HvLq5ury8vL2+v77AwL7kOisiHyIn +KC9By6+oqaquuchnPC4uMDtK6MO8ubq8wsrY3dnVxru2tK6tsNM2Jx8dHSQpOnS4qqaqsb9a +SDk1MTxI586/tbO4ws12XktUdc68s66trK+0v0cqHhoaHys57b+vqKixyUo7Pj5AQk3bubi5 +t7vB3ks9PkBZy7uzrq6ytrq+xGIyKB8dICo+/MG7sbC5x1lDP0lNXV3kyri5xdLy+Uo8Nz1W +ybixr7K2urzCv8LFXDUtIx8kL1HZxce7vMbeXUhQ+v3gZfbYwcLaWU1KPzs+Zcazr66us7rD +yc7NxsLPRzMmHR4pQW/f27+3tb/cUUxnWE9DSt68uMJxT1ZTSUNdxLSvsra7wM//XvTJvba6 +5T8lGhwlPWZ017mvr7v2RD5NVU9IWsqzr7vfTEc+OjtUw7Ows7i5vdpi/cm4tbzG1E8wHRYb +LOzL1dC4rq/CTz5G6NLcc+rEtrrTSDs7Oj5LzLavr7a5v9NcaNTCv8TGvrzxMh4XGyhK0drJ +sqqsvFlFSmTpVT5F+7+5yGhaXFJJRWq9srG2u77G2OTaz87Y39vDwD8nHBsqPlBxzrOnq8BL +OUJmY0k6PdS4sbjKYU5JPD5OxbCusbi+xN1ZTlBffuvPvK+3PikdHSs1PEXcr6euy1VR0s5T +PTdCyLu/wszR5Uc7QG69tba2vcHPb2P45dnazsPIwds2KR8gLDRBZcavrbfM/WvuVT8+RGu/ +vcG+x9dhQj5K5b+7ubrByNXoe2Nf5s7GvsO8zD0uIx8nLT1lxrKtsr7Q6mxJPj4/T9zAu7m+ +3FtGP0dky7+8vb/DzdHX+mx31svHwL+++zovJCAoMEhp1by0tL7ZbV5XWEtIT9/HxMXWem51 +aW/50MXEyc/LxsjU5OfXzMzMxMTMXjkvKScvOEBFX8u7vMbMzczYYUlETV3i71tcaNfQ0dHJ +wMTO1dvMyMnO2drY2dzQztLbc0xGQD09Ojg1NTxGUF3rzsrN3OHWysXL2Ovp6/f5bf7g09jo +1svDw8/me/32eHjezs3N0NDT42JLQUI9ODg9QkdFQ0FHWerPzcrFwL/I23xfZ1xMU3TVxsLB +wsLGy83Q0tXW19nX19naa0lCPTw7OjxBRkM9Oz9NXnns1cS9vL7DzNnf71NKVu3X1NTMx8LC +y87Pz9Lj6djPz+D6Z1ZMSEJBSEg/PD08PkFAR09u08vGwcLDx9T2cHh2denX0tHQysfK0dXV +0s7S08/N0OpmVk9XUEpNTk9ORj07PTs6PENW7NnQysS/xM3W5+ra3Xtu4dTU18/MycjN0s/L +y87U1t1qWVNSX/d0XV1dUUU8Nzg6Oz0/R2Lj18/LxsXKz9rf1tLZ3d7T1d7k2s3Mzc/LxMTJ +1uXyZVdWYWz86N9sT0xNRTo2OD4+PkNObd/m7+/XzcvR1czIy9vi39/f4ODVyMbIxcnHvtNi +6u9pW2/r3utrc3pPPTo/ODQ2Nz9IU1tw283Ky87JytxjadXP62vWxcXQzsG8wczJxdD7XnLk +6Gpv2c9+RlPP5Vo0JCc3LyoucLPAT8uusXFB07nDT1q7schey7fATUvGvOxM373HU1DOzFNE +XORPO1XZS0VQ49tUVsVAJTdHOTM1ybZVSL+1vlXZsbtfX8W5zF++sr5ibMPGXU/Nx3dPa93t +Y2htS0xOR05MTlRQSV1PNTo4Oz48QWRv+dfCtry+v8PIzt3Kv8fMzL++yM3IyO5h+fFlYnXy +b1xaR0VNPj9GSEZPTkk+PEI/PUPz083Zy8PLzs7Cw9LHvsnLysvI52bf4O/67dja8trdXV9o +U2tuT2JMRXtQO0pWPjxJbnx5Zs/VT1Hr1t/bw73V6dbI1lzlytV30svXbXTR3Ors7/JdWvZe +UHVeaVlIWP9MSkZGWUhN8NTU19vsZmnY2evWysjeedzS3eHSzd5s3NNuU1z+7ldMZ25SW+rq +WmDfZFlc5ttPVfxYUUz902j6zt5dVenXdO7IzN/Z0ehl9NXTemnV03x2z9NiYuxZTE5SV1Bg +7Vht1d5sXfZ6SERUe29Q99Xebn7a5WHh1Nzt6cnV7tHM2X/Uyull3d9gWezmV1vl3GFGX3JM +SmjvYVZgcVBKXdtaSu3RbWfl319p2d/j19DT1+Xj4+3j0MzS0dbxbmVndmNnePn1Zm1d9PpW +bUpJTExKZNn2Wml+TFFv3OLu4trdaF/mz9rj1dHg3d3n3Ozaz9hrY+ztX+nN4O3r+GlOSFtv +TU7e1VFb0XRP8FRLTk5SS1zedeft49FhWNvR4dzN0t7Sys/Z0dbf2uj03err5lpf3GhHUltP +XujtXFJOSkxLY9f2cVlLT2xTXNzQ2+Xd2N/x0c7U7N/P1/ney83PzM/b+F9xbFDrUkviS07N +6Wd5TlE/OmJYU3Pw4E1CWmtVZdbEz/naz+X008vO49jL1ebTycfL0tHsaGT+dOxlTH1dPU7W +/1c/TUkxOVVXXnzh03tYZV5gzsPOz9LZ4fncx8HN1dDR3NrAxM/R7OhORVFez99a7u1FODA4 +PDZK92/7dmprXWHk3NPPysrLysbFy87P3fHRyMvIxMDOWVzoTDVavWdG2M8/Ly03OCw60uxR +07y/Z2TBzGzhx7zJ1ry3w8vBvupT7M3Vbc2580NW9s9HQD8tKSovMTrjyt/9zcdtWdbHv8bA +vMLRy7q4v8m/x+Jz29n22NLO0GphxtgaGl8tIS64p80vyLBJL0ewuUvNq7pu67Ou52rBvl5J +y7bHY8S8y/3cxz8VF2ouHjmon8UxvbQyK0G0t0/HqLpX0LCt40zHzklPy7W20MW/2XnTyikQ +G1UpIPment8+srYqHUSpzzqwn7M+dqmsQjfDuz43v6m02bavz2XISxUOJUsjKqqUnzs/rcwe +GzuouEStna1HXK2uPS5svX1Fvaquxb+3vbw5Ew8hLyAvpJOdaU+zbR4aMLm//q6fq25ptLBJ +NFHmZnS7qKq2uLa4Uh8UEh8uJV+dl5/BXMU7HyA0ybvIraKxd2G9uE01WdNZermpqba5r8cq +FxIaKyw0q5eaq8zfVCYdKUvDurarqL5Z3MDLRjvowt7PtKeqt729NBUPGystMrOYmazb0E4o +HivSubmvqqzCTVvIz01DYsPCz72vrbG5zSwZFxwkLkC1nJ6tvc9IKCAx2My7rKmxcU3MzXt9 +2L/J7L+xtby9srspGRofIyYzuaClsby77SsiMP3QzK+kq8lsy8NeP2rAvszDsa6zt7/PMhsY +HCcsMt6joK7GyNU0JSpNxM29qam45+TF7D0/07u5uLGrrra/9yodGh0kKjTOpqSsub70NCUr +QerSvqqps8PDxOs9OmvGv7uvqau1u9cqHRkbIyks26Sip7K6wjsiJjZY5M+soqy+wsbaPi9E +zMW9r6qorba7MR0aGh0fKEinoKKlqLNOJSEsNkFVsqGksre2yT8rMl/V27yqpamvr/YmHRkY +GiEvxaOenp+nvjYlIigxOHytn6Spq7njMigxR1Dltqijp6uuUyceFhUaHyy+ppyYnKW2PSYi +ICQySrmfn6Okrc43Jyk3Pku9qaOlpai/Mh8WEhYZH0CunJWWm6K0OyMcHCMrN7efnp6hrMI/ +KCkvNEbKr6akpKSySyIXFRYWGyvBn5mYmJifujcoIiEfHi7EtrWppqeryeTIUjg5P/DI0b21 +xWIyJiotKy03TMu8vLSur7CzvcPOWEI8PUVEPlHRyMziV1NNQkNW3cnCxsnIy8rExsnbWElG +QkJJUfjb5GFORT4/SU9i5M/Aw9HfalZdWmjX0NXS19XPyr67vb7J1/FQQ0lVUUhAPzs4ODk+ +UOvczsbCvr/S3M/Z69t+UldQSU1bTl27uc24r7u6sLi/wuE6KCImKSIkMV7Au7+0p6eutri5 +zT0uLC4xLi5Mt7a/r6aptsnWx947OVNdT/u7sLXMPyolJB4cITjDrqegnJ2mvlxDMichKDz8 +zb+xp6i65N/qPS0vRX7gx7asrLa8uMBYOisfHB8mKCtYq6Cfn5+hq9E2KiknIyY8xba0tLCv +vldFUUw5NlPKx8e+ta+1wsW9wm1GQjQkHiApNDlMtKOfpKqstHwvJiUqLzU/0a+qsLy7uMlL +O0Jk9FveurjNWF/qaElK8cW/ycm8x0EwLCUjKi8zUrWpqqunqrncRzcvLzAxPtK2sa+trbTZ +RT42LzE4RfXLvrm4trzN7Hnv+O3W0dztTjMoKDEvKTHPrqyuqKWsw1I5LisqKzNeuK6vrKmu +xE47My8uLj3LuLm1rau10OrpUEBEZcrNYF5YMSIjLi4oNLunqamioa3YPzEpJCYrNGqzqaip +qK3CTjw4MzAxPl7GubzCu7jJUlHd5F3cubPCWU9GKh4jLy8sQ62ip6upq8FFNC4pKC89Tsis +pamvs7jcOzEzNjxP7NC+tr7T1NJYP0R51vLnxbexut9KPCwhICouLz+5paWrqqmzWzUwLSkq +OGfAr6ekqbC71D8uKywvOVTPvri1ucb0UElBP0hf387Du7Svsr9eNychJSsrLVCtoqappqe7 +OiopJyQoONq2qqOiqLDBTC4mJikuPtm2rKmqr7rWSzo1NDdCaMq4r66ytrzxNCQdHygsLTu+ +paGorKy0dDIsLS0wQNi7r6ilqrfJbzssKSwyPWnDt7Kvsb7kU0Y7NThFXd7DuLO0t7nJTDAl +HyYvNDRSrqGlrq+wyDssKywsNl7Btq2np6/F7Ew1Kyw0P1XMuLOys7jJX0g/OTc9UfTbzL63 +tba71TomIiwyKSU5tKitr6motWM+OC8tNEZc1LWqqrK5u88/Ly4zOD5X1cK4s7W/2GJNPzk5 +Qlb/zr63tLe6ur8+Hx0uQCkfNK2irLGop7dfQDMoKDZLQ0+2pKezurfFSDc0NDdEft/Tuq6z +zl5zXz42PFB03ce+vr29yHQ8KyctNzMvQL+urrCur772UUE3ND5Vbti9srS8v8pgQDs8PkRW +3M/Kv7q/3lZSTUVES1vu1cvGw8DD02ZQSDgvNUFBPEfcwL2+vcTZ5OhbQkFX+H7gx76/yM/d +dGBYUVNn29fm28nF0VxMUldORUhm39vf3NDM1HdPRkdHPTlDan1o28O/xs7S3vxuXE9SYuPW +zsrKztPdbVdXXF9l7N7l3M3M319QTU5NSUpZ59bb283L129YUU5PTk5UaeTd4uDY1t78aWhu +bmRfbeTR0NTW5vH9b2VjY2f549je69vPz+VoXFxXTk1XcuTe6N3X2uxeTUlKTU9SWe7X19/h +1tPZ4ej6eHNsa3zd0tbc3+bwdGdhWlhkd/74+/v05OpvZmRiXFpf8d7d29vd3udpVU9SWVpa +X3jh2d/s49ze7H1uav3t9m51597f5uv4cm5lWVRbanBvduzc19rj7PD2dWFdYnDw8vno29vf +82tmenleVlRfbm5nY3bp6f5z9ujp6vTu6Orx7evt5+b4b3n98+7s6/Pw8vP2b2l0c2hkYV9k +d313ffrxel9caHfy8e3k4eDo8H//fG1hYmlucn3u3tvf5+7zfvv9eHR7+/Z5bn776+Xl5ubu +9O78a2VkaG5kZnBrZWJgY219+/zt5+Ho7+ro937/9e/n7W5panjw+PXv+HBqZ2Nq/u7u7unk +5Ov/c2168/99fvTo5urn5vZwa2ZdXl9laW305N/k6unuf3Zva2t0fX5vcPfy/vf7/fR+bm93 +f+/q6/Hs5+bs9fp8dGtscW1te/r88+7z+W1ueHFub3BxdXd3enhvcXX19O7v6ur27/Lu7fV7 +f/Ty7/R3bm5vcG19/Hv76+317vd6bW17d29rb/x+eGxpZWxtc+3r6u3r4d/f4+54/nRubmdo +dPp4fPPx8+vyef9va2tpdX999fV8bHr3fnpte394ffbq5uHl6/T/cW1sYWFtbm9veuzt7+3y +6vJ1cHlucf14eP71e3bz6+zr9vn0c3r/c/78amp4c2pyfXN6eHz9+Xz87/T28O9+d29/9Pfu +6e7s73l1eW1sc2txdHVyb397fv3z+3zw9HtzenR7/H18ffX4dXd4eX57e339+O76fvP5dvv4 +/u/s6Onp7PDx/W1rcGxmX2Blb31wdX//d/Hu/n756/T4df7u6OLf4+jm6fP8921nZmFnamF4 +7ft59Ppwa2Jlbnpu+Onv9e3t9Pj25un8e/57/Pz/+n7y8PN3b3Pz83j38/T+cnJ8b2v8+m50 +8vVyanv9dHrz7fH69u90bXj5+v777+7v7PtxfvX07/t3+/J4b3x+eWx7+3j9evl//PL8+vrz +9HVxfG9vc3V0+vvy+3D8ffz8/W1t7u9zdnZ37+3k4ez5+PF8bG39eHLzdXz5fXlq+3Z5du3q +am1+cW789H/7a2/9eW15/PLn7O34evTl8Ov7/e57cWt0dGt3dHd/d21qd2xsfXD58+rt8Pxt +dnvn5vvz9fP8/u3x9/PwemptbGpr+3t3+fFydvlqbG1v8/Pt8n7u8/J0bHl3bP37bm99efDu +5eDu9Xh1cXJsZW1udPF+9vrw/f7q/PbRylBOeHdNX9j0f/nm4drpfu3PzE5hcV9KVfpo6F7t +wtBHT937SV7tfmb7xNVcVexeU3LV2fTUyc9qXl5fW9vKy19N+WhYUuxaS09h7+todN3P3Pbq +729ZYfXc4N7c5Hb96+zsbHnp6Ob5ZV9fXmxxfGjo+/5tX2FWY3Vzd+7U0dfy+O/s6+FvaOne +ZlZ4d25TZu3rfl/+8ejd2e9ta21kXX5v/vbZ8O7nbP/v6WRs7+R6Z3rneWX43O5c6/N+Zmxb +aFxa5vfvb9re6Pvy3uxyZ/rsf2luf+Fzd/ro5nb2XWV0bnfy7nv+5uB0/uvc+F9lZ+ZjZ3t4 +b15reXn1f+1waff08e3j8u7h+mZ862lr/unvcevc7WN7/+35a+P353ju5HtqWnFxZ2hqaV9t +Y/5rdnjk3+zxduD8bmz32efq99zsc21q6Wxi/uV9a2hyfPppYv71eG979vtu9Njc8fp+aVNq +9fR8b+Zx6/f9d2vkbnB8+vN47P7+anPrffZs6OlnafXzeHnz3fZxcO1zX2vt2HNp+2ZramH+ +9Gpl5udr/fDc7XTq7958/vL5fWR8Zmxxaurr+XPp5mJfePN7cn/t/mVmZuPqaX/j2Gpv3eVv +Wmbi+mxk6dj0bnne3/1fbu5iZuXsdF9pefZuX37ldW147fP96Pdt7ux2Znbr4PPv3ulwZWrt +Zln13+JvbOPga1d7721fXfXv7mvy3nb83uZeY+3ocX7/3dvr/mne13Nm79n3TmXfelhMXuZg +U31xadtkXt/a5ezq/ODZen/vePrg6HLb22ZfdfNiX2/m32Fa9eH7XmH55d9kWOnaeldm3eVr +Xnz8X2t86un9aXnY5WNm69v1bXj74e9hZ3dy/PVoYunbd3P34NLhXWrX5WFederuYFbx23Nb +a3l0X1hf5Hlc3uD88X7s4Gxf++bud37a7GTn393uZ+rt6upsbPX3ZmJ0bXxqbm1g/ebqYlj4 +62Rfbm1qeG5i4eLi2dfa29Z2duLebF5r+/piWGh+9OX8cV9h/G1lX27w+/Jv6uFv6e34emTe +3X9r8e958W1ueGx43Od78fj26Wlf8OjZZlFu3uNcbd7tcV5eb3bs7G1ic/r1cFZr3O71Y2XZ +0G9e9v7a1OpdfupmdPBx8fpfXvx5YO7l5Ov04OfudFlu2epmXWDu33lba+/p+2Zo+/tiZPf0 ++nr62thtVn3cemVqcNvYW2fT1e9eW23e71ZWeejxZl356Xb66Pdz/drX9FVf3OljX37e7HBq +7t7tbXDp4uhraujr8/N+efN4b2VtcHhuavTvXVZ+7/N8Xmze/W14Y+nd/H3mee7W5+NsYOv7 +7eFmau3s7vlyXWvr8l1j7fZsXWnu4mdY89jjaHP06ehqZ/fg8G3n6XD+8Op0b3b373hmXefU +91xy5+Z2ZGJo9HFqdf7xafvncGVo93jya2fl4PRi++bk3+7p7Xt4dnxucHNd/XpeaO/aenpt +fdnfdVxq6mxt4X1reePrduX8c+nibXBmZvF2XnLo/Ov0Xn7cc2ZwfvJteW37+WVo695oXmvZ +1Wtg9ebm6F9m1tz1cmzvfG5oYv/y8WR932lZau/pbmXq4eL78uTuel525WZaX3fi7nxu6uPt +/mdwZ3l0Z/T03dt5cXru3u59fv317O1bUWDi3W11+e/9b/lyaXH5737weWXy6Oj1Zv37Ymdx +Z1/o2/lpZt/V52xw5OjpfmV87H1s7eVkXvntfXXyfFla3NpbV1/r2G9aXXDn6Hv+8nv75/h0 +8ujl8evgd/Hj+enp8XB29G5eZ/358W5navfe5l1d5e1eXfn5a2Fh7epnbPLp8P5qbvf6fufo +7+zq6efb8Wz59/b6+vjv+3N8fHP8/e7vYl5ec/lpaG7u5uh3eHJmcXN3fWhdYvXh8G7r2Nnm +6/by7PDwfF9ma3x+eu7xcWlubHt8YWbo6mFZYnn0/e/j6O7o3N3wb/Tq729od/Z+aWV3/fP2 ++v54dWZpdnFka+/j5mti7dzkdHLu+HV0+25pcPPt6uXr+PDv9HhlXGf0fv3w9fvz7fhvanb7 +/nZrc/f68uj+eu13aW9+e3xxeebr/fT7bm55/Ofi/Pv07W9eX3bt929v6Oh6cf706/H/7evx +9fh+dPz47Pt4eG1saWNpanH093FqaWz+4t/l7Oj3eXhpZ2l28e75d+7g73hxcvny9HhkX2r9 +5un9dn/l3uHvcWFkeHz073dlau/s9nl4d27/7X9gX27w8356cnf18HNnaWh77evv9vHt6+rf +5/Tp/Hx+/v39b3N19nlmbX59aWl/+/1+dmVib/Tu/Pvx7e3x+W//8nxsc/Ln6vLz5eXr8fZ3 +bGhkbm9waGtwb3z59P1xbG18+HlrbnZ5+e/l4N7k5ebg3/N78u98a2ZkY2V4+XNvd//8+3dh +Ymxve3Rzd3Rxbmh16+rt7uvk3uTt5+Pk5OXr9P766vJ5bmRma25jXl9jZGRwc3h9b3T88PT1 +7/jt4+js6ev/fX39ev/ydnl4fW5tfHJ2/PL08fb4+Xp27+3y9uvp7+3u+H5xcG1sZ2hwa2dv +bnfw7urs7vl9cW52e/jv+fLr8O3t9vzu6O36c2lmYl9jaHjv7fl1dvbu5unx7/L2em9wc3/w +6OXp9nFraGdmamlrZm179/H56+nv7OXi3t7k63V3+3psb3NpcPnt/mxsb2tgaGprcW5vdXV4 +ffjp5+rl4erk4et6fvt5bnZ7eP12fX5xb3ZzaWl3+Xx2cW56+Pfs9H307uzu6ub7eHRy+ezu +9/L7ffb0e29pa/58d377fXf++21t+PT9fn/47/D+dGdnbG5vcG95cXFvc/3y7/fw6+3z7Ph0 +bGVpcXr4+nt0+eLj6+zt7uvu7u3w+X94e3Ruem9w9Pjt83h4cHd6eXn++/zz+/zv6+75dXZz +aWpqZWNobnJ1cnV3dff1e/35+vn5/vvv7/Z6fvX39+zyentuaWluevf3fvf+eHj07v315eLg +4ObveXR//nt9c3n+em9v+Pb3+vv29/H0fG1ueHJpcnBnbG9yfG9xent9d3x0cnf+9PHm5+v1 +/v19dXN1c3hybGxtevf+d//u6ev1fnzy+nl/9+/u8vj09fb2+3157eX1dHx7cGp0dWtzfGtq +d/7v8f31+v55fPt4/3t3b29yfPN6aXDz7u/0fvr58ufm4NvU0dPW2udvYl5XUE1LSEZGSExU +ZfPa0tDPzc3NzM/U2uH4fvDn2c/LzM/R2eJ4XVBFOjQwLzI6SHXSxL26uLa3ub7OY0c7OTo8 +Qk9t2s7Gv7u3tre9ydHc+3x1YVBGOzAtLi81PUhW58i8s6+wtr3RWUU+Ozs8PkROddC/ube0 +srOztLi+yvBPPjcwKygmJyovPFLOuq+qqKirs73bTDoxLi4wNj9Y1cO6tLGvrayutLvF2PxX +PjIrJiIkJysvPFbKs6uop6issbfITTcuLC0yNzpEX825rqysq6yur7O7yPBWQC8oIyAgJCgr +M0rPtqumpqanq7LGTDk0Ly4uLjNB7ca6tLKuqairrbG6w9VfQzQpIiIhHyEmLDvuvrOrpqSj +pay6zOpCMy8uLzg/RFLOvLOsq6upqq+1u83uWT8uIx8iIB8gJi0/5sm4q6Wkpamtr7nkS0c+ +Nzc5PEZZ78u7sq6trbCwt8rPaU0/OCsjKCsnIScyQEdOzLKsr7GurK2wv2LMy01CelZHQ0bl +/E5fwsPJxMDHytDvXV1gSURFQ0E/Q0tVU09f7er7693b4fn56uHc6v3/9+5iW2Tu0crMyMLC +wMXKztHeblJLQUBBQUVIS1BVWWNve+nX19vTzczT1d9kUk9KSUpJS1VbaeHPx8bEvb7Fx8vY +6nRcVE9MSU1MT1hZXe7e1tvv0Nrc2nXo8WJPTVNKSltXW/zwzdPQys7Mzsra9PtrW09IUE1D +TFFTc/z+5NHNzMfKx8bM2+NtWFJPRkhZTVZZ+ex03Nbb3dnk3fV4/PZzU1RaTk9kZlP28+Ts +2NrOy9DK1OHZ21lr6k1SXF1OXWN06mDS7ezt/9zzbVr7bHVTbmFt1kzZfH3ZX83Z39ht7d/c +V3HgaGNV6WNR3WR52/ZT49N6WuBu4O5Mz15a2Uvr815g6NhZ/c1p8djp6t1w999Ra1fN3DzP +z0nawFL8wkZg0OdVUNRmXlr/W0/sXl994v973XPb6WXR2uNmzfne623w8NtN0+1R2/v2Wcpy +Qs3cRe9e6FN9XE7HQl5s+P5N3VTa1U3R297e59Ta2vvZxkzgzGpT1G1Vz1pK089DWclnTmzd +UmteSuD0RO/KWE7fy2f69XnAYFTIzWNJ0tteX1rWzkxx29/JP+/D0zrTvj3y7lDMSkrp6V9M +1vHaT33Ca0i61UTK9XrcUkW8Ri7HtDVPtm7ObGK/00fnYM3eOmnW91VPVr/FLN64V2w+07tf +PsnbaMhEPbB+Nc5+3HRfTNPE4EbjucQ3cbzoU2hK3b9ANc7CQktW3Mtdb9bfy+xYV8paU9lC +z+xKVMFL6chJacPEWljAvT/t0vFWXExd6kFV1E9O2Hzj31vV0mbtX9vvWmHe3FdN2NhdcPJJ +vL5JSLy5QEXMyURi9UJO2XBAXM7e5m1qV8nLUm3Sz9NC3M5R6nJkV8dOSuFr+Gdw3Ndo5d/S +XVndzWZF199ybltu1/dy4Vxa19rdX+7XVu/tTVRtdWbheE/x8e1jZefO3ktkz9BzW3fjcm5e +9W9jbu7M5Gtv38zZ79Pg7d3e4uLpX9/QbG5PSU1KPjs5Njg9TV1d3MfEtbK5uLK3t7bGz9DP +X13/W+/ZXjovNTMtMDEuMD1M+crHv7i5s7Gzt73CzdfO+VJcauXRwsrEur++vnw8LSclKCkn +KC06T8q3tLCurK6srrjE4HVUSkc+SG/Vx764uLi3tLrqPS4nJiUlJSgrMEbNt7Ctq6yur7W8 +yulXRkFCSFf1x7u1r66usbS4x08tIx8fHx8jKCw3abuuqaipqq6zu8p+V0xGSEdezr+2sq+u +rq+xtb3tOSgeHB0eHyMqLz/StaulpKaqr7zM7VdIQkJCSnnIurOvra2srK6xt9g8Kh4bGhse +JCszR9i4q6Oho6izyl9HPz09PkVR4sS1raqpqq2vtLm9y04uIRsZGh0kLDlO276up6Ohpa7B +Vj03ODo/TnHfzbyzraqqrK61ubzD1kctIRwaGx8nLztUz7mspqKjp67FTTkxMTQ5QU5pzryy +raurq66vtLvD0kswJR4cHR8mLjtWzrqtqKSkp66/VjgvLS4zPUx5y7yyrauqq66zuL3F1Vo6 +KyIfHyInLjlK6MW3rqyqq6++/j80Ly81PlXhyby0r62trbG4vcLI03pKOC0qKCktLzM4P1Pc +wrq2tbi/01tIQD5CS13lx726trS0t73DxsfEytHfWkU6NTIxMjQ1Njk+TG3dycLBxMvd7vH+ +9OfZ0svGwcLIztXY08rCvL2/w8rnV01FOzYyLi0uMTY8RFTv1szFwsLBwcfLysbEx8nP2uPd +z8jBvbu6u77F129URDkyLSopKiwuNz9O7cu/u7m6u77Dx8fIztPb4u7t28zFvrq4uby+xddu +VUE3MCwoKCotMTtHXtLEvbq4uby/x8zP19/g63nt3tXIv7y6uru9vsTRe049NC8sKCgsLjU/ +TnrOwLy4t7u+xszX2dba2+Hq39TOxr++vLy+vr7D0nRKOzItKygqLC82QVPrxr27ubq8v8PM +2Nvc4uPi39/d1cnDvru6uru+x9VfQzgxLCkoKi0xPE1o08G8u7q6vcLK5uba4e7a2uDMysrC +vbq2tre7yFxCOzUtKCUlKC43RGrNvLOvsLa6v8r/UUdFUW/z18nAurWyr62tr7jMbT4sKCcj +HyAjKDBA/byvraurrLC2w25PRDs8RVTfxL65sK6tqqqsscDmPykjIx8cHiIlLDppu62sqaSn +sbm//VRHPD5JR1XDubatqqqpqKy2vuovJSQeGRwgISUzS9G2r6mjpq2usthMUEA5PkVQ38S4 +rKmppaOqs7nIOSgmHxkaHh8iLkbsva+ppqeoq7TJW0g7NztBR3nDubCqpaOkpqq0yFAuJSAb +GRsdHig5Scqtqaijo6uvtdRSQjg2OjxM2cO2rKimoaKorrPZLismGhccGxolMTnjr6qoo6Cn +ra+9XEQ+NDM8Q1TMua+qpqKip62vyjEvKhoYHhoYJi8taK6uq5+fqKmru+VlRDY0Oz5C3723 +rqalpKaqrcY8NSobGh0ZGSMrLFO3saygoailqLrL10E2Ojk4Q+7Huq2mpaOjqqzAOjkqGhse +FxklJipvubmroKSnpKm6xM1MOz09OELmz76tqKijpquv1D87JRodHRcdKCYvyr65p6Kop6Wv +vLzeQkREOj5X+tO5rauopamssGU9OiEbHxwXHygkOsTHtKOjqKOlsbq9b0JGQjxEXvnLuK+r +p6qpqr5MSjEdHR8YGCUiJVjHzqygqKifp7eyvE1LXzo5V1Vcwra1q6WurqjCPWE1Gx8kFxoo +ISTzyNOroKionqe4sblKS2o5OVxNTsS6uKynrK+rvERMNh4eJBkaJiQkUMrerqKnqJ+ntrC3 +VlLoPTpZTUzLvLiuqqytrL1vTzUjHyAbGyAjJT3s3bGnqKehpa6ust5a7D43TkhF0cPAsqut +rau1xmJCLiAgHxsdJSMrVfzHrKippaKpsq++WXNYN0BTPU/MzLyurK2rrbjOWDwpIiIdGyAk +JDVk3raoqKikpa2xtd9X/D83Sj8/7M3Ita2urayzv+JQMyYkIRweJSQrR2DKr6qpp6Wpr7G+ +am1SOz9IP1DZz7+yr7Ctr7nH8kguKCUhHiIlJzJH68Cwq6qpp6y0tslgWkc7QEFEXdzLvbWy +sK+zucVsRjcpJyciJCosMkvkybatrq2rr7y+yl1UU0RCTlJb2cXEvLO2trK6ytlTPDItKign +LC4yRFzpvrW2tLO3vMHRcFBIREhQV2nWycW8t7i0sre7v9tRQDgvLS0sLjM6P1Tkz8O8vL6+ +ydzuVEZGSU1c7NPKwLm4trO2uLi+yt5YRDo1MC8vLzQ4P0lf3svEv8HIzudlVUxKU2D008vE +vry6ubm5uru8ws79T0A5NDEwLzI2OkBMX+fSzcvN1uPsYVZXX2zsz8jCvry8vLu8vb28wMXM ++U5AOjYzMTEyNjk9R05h4tPPztLj4/Z37djTz8fFyMXAwb68u7q6vL/BzHVOPzYxLywtLjA1 +O0VR69DNzMTKzsvQ2dXNzszJyMrIwcO/u7y9vL7ExddsTTszLy0qLC0uMjtGU+DMyMK9wMO/ +xs3Ny8/NyMnKwb/Cvr2/v72/ys9lTDw0Li0rKiwuMjdFVPnLv7y7ub6/v8nPzs7V0dHPzsbG +wb69vby7wsnfV0c3MS8sKSssLTM8SV/NwLy4tbu+vcnY0NXk28/X3c3JyL66vLy6vcTKbVNB +MDAuJygtLC46Slfdvby+t7S/vbrP38/fYe/W6eXIycy+ury5tr7Cz05JPC0tLicoLi0vPlJe +zbm1ubKvvcK61GXX7VFt3fjnyMXHvre5urm8ymNORjIrLyskKjEtMlNtdb2ztbWuscHHvuZM +5uJJUNt3Zsm+vrqysbe5ucVRQkIvJSkrISMwMC9ZxMq7rauwsa+50dPWTkJRX0tZz8nLvLKy +s6+wuL3LRTo5KR8lJx4hLjI1c763rqyqqa64t8NcU1RGQUxabtfEvbiyr66sr7u7vz8tMioc +HSMgISo0TMm9sqWlq6qqtsTbUElCOTlKVFTYvLezr6yqqqy2v8FLKykoHhodHyIqMEa/r62m +oqOmq7jE0EU5OTk3PUpmyrqzsKuqqampr7/OSSkhHxwaGxsfKzZKvaqnoZ+go6exweBBODYy +MDlJX868sa+tq6mpqq2+1UgpHx0cGRobHyk2Wrqpo56cnp+kr8DhPC8vLCwxPEjYvrWuq6in +p6iptdlPLh8dHBgXGxwgL1W+qZ+dm5ucn6m52EYwLCkpKi88Vsm5r6yopqSlpqu+5j0nHhsY +FRgaHCY46q6gnJmYmZygrMFVMiknJSQnLTp7v7KrpqSjoqOlrL5nOSUcGRYUFxkcJz3Lqp2Z +l5aZnJ+rv0suJSEfHyMqNVPGsqmjoZ+foKKntOU9JhsYFhQVGRsjN9qsnZmWlZebn6i7XDEk +Hx0cHyYuQdS3qqOfnZ2en6StxU4vHhkVExQXGx8uTbmjm5eVlpqdprHLPyoiHhwdICg0VsKv +pZ+dnJ2foqez2kEpHBcVFBcbHiU1VrqlnJmXmZygqLbSRy8mIR4fIyk0TsevqKSioqOkpqy5 +2j8tIx8dHR0fICYuPtO0qqSfoKKjqK65zk06MCwrLS84Q1zZwbixrq+ytrzAz9xqRzkxLi4v +MDE1Oj9O8c2+t7W2ub/K0tz4YFpXUU9RV2X138/Ix8fFwsK/v8PGzNX8V0tDPjo3NjY4PD1C +SU9deejg3t/b083Jw8HExsrP0tXb3t/h3trT0s7JxcDBw8fWfFFHPzs3MjAvMTY7P0RPXXza +y8C8uLe6vcXM0N37YVRUWGHs0srGwb28u7m6v8zlXEk9NzIvLSwtLzM7RVjpz8S9uLa2t73F +z+VoWFJQVFZe+9vOx767ubq9wcfR5XFXRT05NDMzNDc7PkZa/dbHwb69vcDI0+tlU0tKTE9W +beDSycK/vr/Bw8bL1uJ+W09LSUtLSkxOS0lKTFJebf18dnxnYWNiYmFgYGr+59zUzMrIxsfI +yMvO1d7te2xmYGtvb/3v73hpWlVVUk1KSEZGSk5TWFtmd+/l3/3TytvV1dHa2dzY1d3a2dPV +3Nrf39/p6Ofq6vP1allWVlFLSUdGRUlOU1dg9O1/5+fu5/14fn3v8PHkzczk0ci9y+LEv9Ps +z8rN1vLX1FRIRkM7NDU3ODg6Q1di+82/wsbFwcDGxsjM2ur0dm1u7t/f2s7GwsC+xcrE7UBM +Sy8uNy4qLzg0PVpt076/vLGxt7Kyvb++z2liVElNT0pV7dXGvb3DubtUX903LDItJikuLjM7 +SN/SwbS0ta2ss6+vvL7F0elWVldNTFptb9LE2sq6S07WNi05LygtLy40Okd+Z8e0u7asrrWt +rru5u8PWXu9aQlVlVPLLydDRvP887kEqMjQoKS4vMDRJa1DLtL64rK6zrq21vLi70N7Mfkpt +cU1zy8/PzcHrO29BKjIyJycsLi4yS2pSwrC9t6uvta+tt7+7v+rr1VVM+vVV68C/xsC4yz5f +XiksNSYkLC0sLkhtSceuu7uprbmvrbnDvMZTXe5IQV15UNm6vLu3sblS2s8tLTomICkqJik8 +Tz/Jrb65p623rKu6xrvNR09cPDtQWEzlubm5r6ux3cjDLiw8JB4oKCMpO0k+y629tKSrtKms +vL+73UFLSDM4TEdH0rm3tK2psdXDvy0rPiIdJyYgKDtGQL6ru6+fqq+kqrvAvWM6Rj8uNUk+ +Qsi5u7SrqbjWv9knLTgeHiklIS9LTF+uq7Sln6yrpbDDxMk/ND40KzhEPF25tLOtqKnG8bo7 +IDIpGh8pISQ991m9pKmqnaCsp6q73uZWLi04LC1FVU/IrauxqKK5UMnfHyAxGxgnJx8wx83O +o56qn5qorKa4/kpIMSYvMSk47W7JrKaqrKGqY0vYKhglIBQbKiEozbG6ppmdoJqdrq+0Vy8u +LiIjLy4z3ru1qaCgpqKlyDk8LhgXHxYVIyknYqurpJiXm5ycpr/NTigiJiAeKjc+yK+ooZ2b +n6SlvDEpKRgPGRcRHC0vcaadnJaSlpyepdE5MiMaHB8dJ0HqtqWenJuYnKeovCsfHhYOEBgT +GDFPx6GWlpSPlJqhrmcoIR0VFx4fKuG3qp2amZiZm6e3vi4ZGBcNDRYYFzG+taCTkJKRkZuq +uUUeGhsTEx4lL8CmoZuWlpiZm6jb7jIVEhcOCxUdGCuvq6KSjpKSkZuu0TseFRkXEh4uNL2g +nZqVlZmcnahlSDsXEBgQCxQfGieyqaaUjpOVkpu06kUeFBkXEx4zPLqenJqVlJmcnapoRDYY +DxgSCxMhGyaxqaeVj5SWlJy1Zj8fFhsYFSA1QLafnJqWlpmdnqpJRTYTEBsPCxghGC2srKWT +j5aWk569yT0cGRsXGCU1TrGenJqVlpudoL1NRx8RFRYNDh4dHdmprZuPlJaVmqrKYioaGhoX +HCs9z6ecmpiVl5ufrehLJxQVFg4OGRwcSLCsnZGTl5OXqrnJLBwdGxYbKC9cqp+cl5WYmpyq +zGYmFhUUDQ0YGxs+sK2dkJKWk5anvckuHB0bFhsoL0+soJ2YlJaZnKrDTh8VFxILDxoUHs+2 +rJaPlJKQmam13iUcHhkVHSkscaegnJWTl5meq8UtGhcTDAwUEhcy57eckpGQjpGdp7Q0Hx4Z +FBkfJja6pp+Yk5OXm5+uNB4dFQsMEw4RLD5en5SVkY2QmJ6m5SYiHBQXHR8pfrGkmpWTlpqc +qzMnJxILExELFy4qaZ2amZCOk5mbo/QzKxwWGh4dKua8q5uWmJiXntw1PxsNFhULEyUfM6ij +npSRlZeZnrNuQigdHR8dJDhXvKSdnJuZnsJV0R8QHRgMFSMbKrGtppiWl5mcnqvYXTskIici +JjhX0ayjpJ+dpMFbzCgWHx0PFyceKsK3q52bmpifo6XBSEQuJSsrLD//yq6nqaWjqcI9STMX +GiMXFSUqK+m1qp6dnZqeqqm1Tzs0Ky0tL0ze1bClqKinqrM8KjohFBseGR0nLc61uJ+YnqGb +oK6300g4KyszMThuxraqqKalrLHCMSUpHRYYGRwmLDS5qKifm5yenqm5xHE6LiwtMjhH3buv +qqenqK653TMjHxwaGhoeJzJRtaqnnpyfoKCtvsZvPjk2MThJb9LBv724ubvQWFA4KyoqKCsz +ODxKdtLKu7C3wr2+ycO/yMa+wcTBxdh7XlRJPj9CQUxpZd/EyN3Tz2FQWEk5ODo3NztDUe3O +xr+7uLi5ub3EzeZlVk9PTFNzcWTcys/Pw81oXVtJRUQ7Ojw+QE5818zCvcHHydH9amFPSk5e +Z3Lh3enSw8fNys/9/tz2a+huUlleVlx96+bf3OprbFlKRUA8Oz4/QU3zzsjBu7u+v7/I2t7i +al9iXvXZ08nAv8HDydZ3U0U7NTMwLzAzNz5OZ+DKwL27ubq9w8nU8WdhdPjw2MzHwL27vL7E +zN5dST44MzIyMjM4PUNPetrMxcPFx8vS3ODw9uHl693OyMK/v72/xs7gaVZLQ0FCPz9CRkxY +X2x59N/f7Hp9e2ZdXF9dXmrk2tfLxMLDxMrP2vdyaFlQTU1PT1pmbHbr3dbSz9Lc5OpxV05M +S0tOU1RaavTl6OPg5uzv+nRtaWx87e3m3trUzs7Qz9nY1tze8HzvfF5gZW15b/1eUUtKSkpJ +SExOUFJXb2td2tTpVmm5usrMwsDDxsrI2XjwfNza7dLQ6mhNPjo1NDg2OT5DVfHc0M7MzszG +yMTFzNHUzsvNzcrHw7+9vL6/wMXtQS0jIB4jKi07SG+6q6aipq255lFAOTk2NkFW07q0sbCw +sK+yuMLl69z+TTQlHhscISo2R3a/r6SenqGqu1o3MS0sLi84T9O2ra2srK6usbzC1/fq5f09 +Kh8bHB8nMDtD5ruqn52doq3AVTo2LywtLjVJ6cG2tLGur6+zvMXS1szO3EQuJB4eIictNjpU +w62hnZ6hqrnOWEQ5LiwsLjdFas/JvrSvrq6zub2/vL7GajYoIB8iKSotMThhuaqlo6astLjF +9VA9NTQ3O0NFTW3Uxr21tLe4t7m3uMTMXTwxLCoqLSsrLzhI6Lu1sK+wtLe8xtR/V01KQUNC +QkdObVVOvbrFs7a3s7i9vcpuTTs1Ly0uLjI3O0NSb8vAvLq6ur3DzNHxXVNKR0lIVmBv3NS+ +ubm8vL3GxtDb7lNCOzs5Oj08PDs9Q0533c3NzcvKx8nR2/103trZ3NXb29DRz99pU93mauHk +2/Db29PS9GhTSEE+Pj0/QENLUmPw2s3NyMbGxcXIy9Pjc11aTkxSVF7d3dfMz87Ox8nN0dpv +U0xMTk9MSkdHRkZOVlxjfNzPyMXFyc/Z8WVPSUhIT13619HOzcfFxMbKzNzwb2BXVE9NTU5Q +UFFTWWL77+Hb3t3i8HlkWFlQSUc9ZcJc3MXMxsnLy8vPzNjhc1tiZFxaUk5FRuX4Xl3ZytHK +0d15Wk1KRkZLT1pRWHfz1c/N0Mrd18t70G3m4WnX9d7ee9ti0HDM5tLTbNo/SD06PDo6OkhY +0cnIvr66uL3Fz+b4XVZKSEpPVWHn1dnT0tvZ5dXQ1tfl29bJ2NxQOTczNzY0Nj1Q3MC8trGw +sLbBzm9XQzozMzk9TFfiz766trW6vMLGytDZ3uvcVkY1LS4uLi0vNU7Uvbayr6ysr7nM8UxC +NjEuMztEYN/GuLGxs7S5u8bf/l5iavBTSTcvLi0uLTE0RvjDubGtq6qvtb/YXEk4MC4tNTlC +X8y6sK+vr7O2vNTfc+12ZVVCQjIwLC0uLjQ5Ttu+ta+trayvt8DcTz40Li0vNDhJdse2rq2t +ra+0xMdi11dbUUNMOTgsKywuMDM9SN6+ubCtq6uutr/RW0M2MC8vMjlFb8K4srCtrbG4xcr2 ++1tMUEdHPTYxMDI0NTY7SGXQxb21sq6us7rD1lQ/ODU1NzxCW9XFvLa4ube/wczR619QT0dQ +SkVLPkdETU5JS0laVnnh4dLMw8TK1t9jW1NKTlJVb+DZzszIxsXJys7P1OLnXlVMSUtMVWrm +49/X1N3ie2FZTEhFQ0VHSkdJTlp57tvQysjGwsTGx8vM1Nfa4P9iXVpZWF1iaW356t3Z2tje +4OX6ZFZNSURAP0BER0xVau/d1M3Ozs3MycvO0tff6/h+dHBram1w9Ofe2tvc3OHo9WphWVpS +T05OTk9VWWNydOrk4t7a2drd4uTt9Pt1b21iYl1eY19pbG/3593d3NnW193f4+fq/mdoZmz/ ++3pqbG1wcn9wb29ra19jY21uZmprb2ptc25+9Ozy7e738+zl3+Do8Hzz6+bh4+fn+H53Z2tq +a2Jlb3R5bm9xe3l2+nv+e25qb29+fnF0++fg3+Tv+3d8eXx7/vD8cm1uev37+nRubnP9eXVy +a3F4+e95cXX78/b2+319/Onk6uff4/Du5unvfm5haHN8+/72c2xsZmVqbmllaWxpbn54b3nt +6O39bGp7b2/88+fk49/f4+Hj7O3r6e/6+Pj+/Pl+fnx3cWZjZGltZWdkZWpsfH99e/3x8vx4 +enFtaW738fHq4+rq5+zq8/Lr7Xtv/PH/c/v17Ovo8W9rcHBvc29qbG99+fj8ef37d25pZmJj +bnZ69vPn4+bk3uTi5O5+fHprb2xpcHt+ef7z8u7s8nh2d3lpXmVvfv378/bz7vpxd3p68358 +d3z07/B/e+/o6/L8e250dHL86+726urp7fL6b2NiaW1qZW1zaWz7+/ns8X/5e3vw7/Pz8+zr +7/Hy+3398/j17Ozv+Pn7+/78/vv+cHNtYV1dXVteYW52dvDp6ebk4eTm6+no8f/8/nX77+3w +8eri5e76+XpvcXh6aWVlYU87zrw+4npRyOlfyd1L8tBMWV97wkdV68NYZmK6VDSwfElb6cLa +5szB3kxbbPo+dvvh4Fri1uZQzNtN2EZrX+5D0ml0YETBR8tvZtTLQc7NTdbMRsD/Uenu31xx +/8dc2e3jZtJT9WPVUU7aUFTXeN/cStDd/k7KSNBOyk2+bOt1Ztv56Erc1lD5ccxJ6m3GS8g7 +xV3fT1/HVHVO2dxmb2TLTEjQ5lfkXM3XUd7az0/KTsNK5XBi0Vx51FxeyvBJvz7j2kdsy0tj +61vJakza1k/q+sdlSvnKVUzPyUddcsVzVubD2EJzwE472Ndkel7RvTd0v+pedVbKZT/sxVpe +X8XsV//CXETWzUhG3MnaP3e/2UPv2cpHR9nTSFHbzdJJ9cz2Tl3O10pfzt5uUeTKfVDvzutg +XeLmXVHb0E1c2kpY/GLP4FzG3Wz7WeJXYdHnUs3ST9rXb/lJb+5KXW3ozFhe1+5V5F7a3FZ3 +U1nZWGbK1dbWY2r2VXHk3dJebs1WVs9Y7NtW2XFJ6G5O4Vx7z0VS1vJXe83GXVvM0FtLVstn +TPLQ3N9f9NriYdDYU1TwUknmfOr83ddx5OjfzVtc9HRYSVTk9ml6+tHbcW/dXUlUcV3y2+79 +0dDfZNjV6OnfyuRozMthUG9NOTzh2uzd0cXdO0njTkl2xN9ASdZSTMXBw2NJw9BEwLnczd3u +9UxUzMZ46mZZTTk61s5DTNxjRjc+yWxY1k7h00ncuMDH08u7+1y8usNt78BWRtDbe1E57kwv +PkBLUDg7ZFVPT1XBzenDz9rCzc2+v8O9vbnNfclePvHIUc/AT1o+LTEuLT0/P2Jp29ZfyL2/ +vODkxd/exr63t7evyFfKVz7tyMb/NkdEIR4sPDIvS8G51mq4rsRdwbHFaMe2ucbMtKu+UMe2 +2EJdvc8sGhkkIB0yx66rvMO630t1zri1v7ayvL24r6y1z+TExExcsq0mCRU9Gxgto5O2LbWj +7yMtqKNJTq2osVG8nqnYU1rI1MisqboSByQlEiTUl49zK6mwMSQtpqU+W7KprVy1oLdWUFvG +u7qpo7oVBxcpGSLLl42oLPWxPxwgtZ+0TnWqqGJks6+9UkfTrqanpLQQBRQgHDK8lYqdOz04 +MSEZSp6gr2fKqbw9SL+uvUj7qp2cokMJAhckIsuhjoieKy0nGxgZPpuWpb/AuM48LVSsteLD +qp2XnCgCARoyN8KhjIWbKSQeFhYXMJiPnLbVcNY9Ijitqrq9qJyUnhUAAxtKx7ifioeaLBkU +FhseNZuOmK89L+DhKS3Cq6irqJyUrA4ABRj6qaOZjYuZOxUOESFAcaWUl6dWKDbcOjRUw6ee +oJ2Zxw8EBRJOppuSj5CbZRkODR3Zq6GcnaW+LykyO2HJw66jnpycTw0FBhF+npeSkJObzRwO +DBnLn5uep664RCcmM8OttLSspZyZTgwDAhKwl5GSlpqexx4OCxi2lpSfwV3GyjkpK/mqqa+4 +sZ6ZzBADAQ/KlY6Smp6itS8TCxE+mo+Ztz1Sws49KjW9pqGqrqSjcxgIAgssnY2MlaGz4Tgd +EBAhs5WSntA9THplODJtr6Sjop6jVhgJBAshqI+MkZut+TcfExEbRKCUmKjLSkE/MzJqr6em +o52duh8LAwgZuJCLj5mnyU4sGREVI7uYlJyq3TgxKy56r6ajo5+erywOBAUPR5SKjJan1Uw2 +HxUUGzihlZedsjsrJipfrqahoaKiq0IVBwQKH52KiY6fWTExJx4ZGB/TnJOTntUqHyNFsaSf +n6SnrNgfDAYHENKPiYmSry8nIR8hHh4uuZ6UlqdFIh0sxqacmqCsulgnFQsKDR+ljomLl74t +HxsdHyApTK6cl5y1NiIjPbKfmZuktU8oGQ8NDxhFnY6Ljpy9LRwaGx0hLs+lmpqlzi8mLfWq +nZqdp8IyHRIPDxQjwZyPjZCctTEdGRcZHi+4npiaqOkwKjXNqZ6cnqnXKhkQDxIYL7ackY+S +m64yHhcTFRsytJyWmqXNNC872a2hnqCq5ikaERASGi+5nJKPkJeoPR0UDw8XLrSbk5efuDwt +LkG7o52dptApGRAPEhouvZ6Tjo+UoWAgFA4OEya7mpCSmqtGKSYv1KWbm6C+KhcPDhAaLcSf +k4+Pk57EKhYODBAd1JuQj5SkaisiKl+rnZqerzUYDg0OFCjJnpKPkJSeujUcEA0PGTqfko+Q +nsg0JihHuKOam6fcHw8MCw4ea6GSjpCVnbFMIxUPDxQprZiQkZyzSSwrP8mqnZufszIXDQsM +Ey6smY+OlJmj0TEcExIUHnykmZabqcg/NkHfsqWfnqfWKRUMCw4XN6qakZCWm6f+KhwYGR4z +vqugn621wk7ru7mro6eqr2QoGRAOEhksvKKal5qfq+0vJyUmLkfgw7S1vr7F0ruwrqimq7TL +QzIrIBsdHhwqWteqnaesq+47aUI2b+1I58pc+cLJwK2pq6eqx0c6LzHwvOZHNR8aHiMr67K0 +rKq+zsRyTt/Z7tfV4trKw7qvrrS9z1dKZ9zezsnqUTstKCUkKTZNzcTU7Hxx0b68u7m+w7/B +ys3X3dLJvr2/xmtCPjk6TF3qx8PL3Uk0LSorLzlN7NTMx7+7u7e6xsPDz8S9wb3F8Eg/QT0+ +V2NuwsTNz1w8ODQxOkFN5MbAx83uX1xr0MG6tbvO4GJNSE1MS1Je58i/xMjaSj05Nzk7Pk72 +x7a1usPwYFRO0by8ubvYUUA9Oz1BQ09718G8yc7PRjw8MzI8SUvLtbm6u8puYWdkyLezu7zB +6Ew8LzM+P13GyMrJ2WtNRTw4OUFM7M2/usLY2FxNXerUyb+6vL3Nb0M2ODtBXdDNxbrH8FpF +Ojs+PlbFv8PEyt1OVVBKZsnFybS+181yQz5NQkFh7vLe2P9fY1ZRS0Zd4NjFxsDJ6lhQTT5M +ZOfIvbrBx9xSRUZaVvzV0M9iR0tIPT9OYWrV0s7EzvDi1O9Wdmdk1c7bx8jb9ltXRUxP683N +yd/ge00+OzxFUHnTxM3b3P9YUGfq3OnPy8rEy9Xd3VdNU0hKY+Pn3tHcXlpSTUdJUlrVydrb +1lZKW19ufd7LyNLKx9N47e9XXmZPVPtgYnj4W1RQfG1ed+jW2eBr8PNUUV3j08vO0svU63Bb +W3ReYWro6m1gXVdbW1FabV57e3Ds4/TzW2ruX1/RytbFytvR2lJt7WBebubielppXU5ZXFRW +aedZVNvZ7WP823lY/M/s3OD03s70Yc/pVe/b6mFh629WU2htcHZS9fNnYl7Q2PNd79TgWW3M +2VZR7NjSWmPS0FRI1N9QV2Rs6l1g4dDrVF7p5uR1aOndbVXg1fBgd93ifGpj+25ee+Ld+nbc +Z2p85F1n12Bp5Ohi++xYa9b4X9veXG3xXlJf1NflX2rg51hs4fb95vR27FpZbOr8XNzc7fBo +V2BoWXPj3Xr63t972NxzaOvlbmpf79fqftraaF5edWVj+Pbsb2Xq3lxWam1tX3/mbF5gXldY +XV5SUWnk0srIyMzOy87JxcXFx8W+ubm/TCYaGR8tO0b4wbaspKCqy0E6Ozs+S1pry7Sus727 +sbG1s7C5QCAZFxsgLD5vybKln5+nuVEvJykvO0Tgs6iqsb3Fxbuvr7S4trxDIRgVGB4sU76z +qqGen6nHOSomJis4asK1rauvvs/KwLy1sLGys78+IhgVGSM27764rqWfoq36LygoLS81SM+6 +rqqstMLDu7i3tLW4tbPENx4WFx0sRO7KvK+opKm8QCwoLDE0NkjHsauqrre+vbe3u7u6urax +u1EpGxcbJTRJds27rqWlr941LC43PjkyPc6wqKittLu6usTZ3c+/sKqv7SwcGBsjKzA6Wbuo +n6CrxT4vNDg0MTA+yKujpq+9x8nJ31dS27quqKe4QSUaGBsfJy9Jvquhn6Wvykk8PDcyMTZJ +xa6prbO8yNT8U1Lrv7Gtq6y5USscGBkdJTFPxbGooqOpsstRQzw0Ly81Trysrra+xcC9v8vf +6c6/ubS22jgoHx4hKC0wOlHFrqWipq2702tOOy8rLTnwvru5tK+us8VeR0/szcjHx8ndVzwt +JycpLDRD6r6wq6qttsxdQjk3ODxEX9DGv7y9xNRfUVzlzMS/vr28vMTfSTczNzw/PDk5PEhg +59rY0cnCv8DK715kaXNuX1dVWmhvamvmyby1r6+ytrzG4E8+Ni8uLi0uMThGbM/Kzs7P083H +xcbJzdxpV1BLSU5m1sO6tbS4vL28u7/O91BAOjQuKiotNDtDTV7u0MG9vb6/xczV8GBYYu7g +4uro2s/IxL+8uri4usHcUD83MzIxMTM3PENGSU1XctXLxsPBv72+xc79VlFXaXRv3szCvLq8 +wc3c3+98bGhmZGhZSDkxLi81Oj9IXdrDvLu9x9Tf7HX+b2dz59bPzM3P1uDs5NfPx7++wMPI +zN1fTT83Mi8vNDk9RVBf3tHOy87NycvN0dbO2OTmeGFfW1xv6s/Ewb25uLi6vsnjUUQ/OzUy +MTM3Oj1DR09p4NbOzcS+v8LI1OtrVlRPTlx+2Ma/vLm5uru/xcjO1epeTUI8NzMvLi8zNz1D +UvjXy8S+vbu+zOx6ef9zeurg2NLPzsjEv76/wsTDwsbO3WFLPjo0Ly4uLzQ7QUxf5NDKxr+/ +wb/Cztna4XddXV9jb+zb08rCvr69vsDEy8/fe1tJPjs2MjMzMzg8P0la3snCvru7vb/I1/xk +VU1MUV5w3tPNycO/v8HCwsPFyc3fb1VHPjkzLzAwNDs/S17ozsXAvb3Bw8fR2OVlWFdaXGNl +ed/OxsG+vby9vsHIzudqWkpAPTkzMjMyNDg8RlbxzcPBvru/zLvVfvxmXmz8a+Hh2c3Lx8fG +vr/AwMfKz+JoT0Y9OjQxLy80OkFIUWni0cjBvr6+vsPK2PJyXVVWWltr6dbKx8G+vr/BxszP +3m5dU0c/Ozg1NTQ1OD5IWfLUxb69vL3AxsvZfGJZV1NWXWJw7eDb0crHxMPCxMnN0dz3Z1pO +RT89Ozo6Oz9GS1p479TKycjHyczP1Oh4Y1pbVFlhZ+nZ1M3JxsXFx8jKztDY4/pnW05IQz48 +OTc5PEBKWPLVysbDxcnLzdHedWZeX1dXZW7439jWzsjFw8PGx83U2eLudllNR0I+PDo6Oz5F +TFx53tDMyMbHyszS3vZlXVlbV15peO3d083Lx8bHxsfKzNfn9G9nVUtIQz08PD0+Q0pSYvPZ +zsjFxcbKztbsYE9QT1BTX3N9623qvbvBvrm8w8zR0d/6XEc6NzQ1NzY6QFV80MrGwL6+xs3h +eGFZT0dCRExXZXne0cvK2cy6ur6+vcDJ2dXX6WdYRDcwLzExNTpJ8sq9u7i4t73Jf05EPT06 +PD5GUeLKxb69u7u9xMXIz9Hf593R0NXg+2hGNy8wMjE2O03myL66ube3vct2VEc+PTo6PkdT +5c3Cu7q5u77EyNDb3vHy8d7Z1N35bEw7MzEzNTc9TunHvru5uLm/znFSRz49PT1CSUhgzcK7 +uru7vcjM0N/f3uXi1NDMztrkVTw0MC8yMzdAV9nFvbu5ur3H31tORz8/Pz9FT3XOwru4uLq/ +x8zQ3fTz4ef30srO2tjfSTUuLi8vMDhQzr24t7Wzt8JySkM9ODY4PUlTZM+7tbO0uLy/zflu +eerd3NHEvsTK2nlINCsoKiwuNUXbvLKysbO1v+ZEPTs3Nzg+SGnZwrm3srG0u8TY5Hhic+ja +0MfDvsPO9UUxKScmKCswP+K8sq6srbG93VJCOjMwMztIc82/trCvsLa6wMvdYlpy/+rSxL/B +yuJXPS0oJiQmLDZQyLmwrKutsr3gTTs0MjEyN0P2x7uzrqyutb7HzuNbUl9t7M/JxL2/1lE4 +KycmIyYsN2G9tK6pqayzxGRGNi4sLTFBdtO9sa2srbS5vMbfZ15gcGbuy8PI0XxOOSsmJicn +LjxpwLSvqqmutb71RTkwLi4zP2LPvbKvrrG2t7rH2uZya2xy68/N2e5XPzEqJygpKzNOzLiv +rKurr7zRUDs0Ly0vOUriwrivra6xt73C0e9wam3x4tjIydVqRTcrJSYnJyw99ruurKmmrLfD +cEE2LywsMT1b0760rq6wtbi8xtfxcf3p39XOycfWUT8yJyMlJygzTciwq6qoqK+93kM1Lisr +LzhO0L21r66vs7u9wc3Y3e7e3eLSyMbNbj4vJyMjJSkyS8Svqqemqa+9Zj0xKikrLzznwbiv +rq+xusbIzNHS2djLzM3MzMPNSjcqISEiIixBfLKnpqOiqrPEQy8rJictM0bEuLOtr7S2xdnP +1NnLy8vCxczHwuNDMyYhIyIiLkbOrqimoqOrt+U6MC0pKi83XsC8tq+zuL/e28rOzMPCvLi+ +w8BqNSwiHiElJzb0vqylpqWlr8VhNywsKy06Stm6t7u7wc/W/uzFvbq2trOzv+4/LCIfHyEo +NlG9raqmp6y0yk07NTEyOEbsybu3ub3PXkpHSmjKv7aur7K310AvJCAkJis6/L2tq62tssdc +PzQ0Oz1Nzry1s7m8wNtOPjo+UeXKvLCvtr3KTzAoJCYqLz7duK6tr7S/20s5MjU9RWvGurOx +t7/F50s/PD9a1cW6tLW+y/pINyooKy84S9a6rq+0ucZvQjcwMTlDWsy6tLGzusfdU0M+PUdw +zL24tLG30V1KNyonKi89VeS9r6+0ustxTDkyMzY/ZNbMvLO1usPZdFhHQ0hb4M/Iwr25t7/m +V0w9MCwtND5NbMm5tri+zu9cRjs4PERSY+HLwLy8xNDT1OFlUVru497VzMbBw8PD50lGPC8u +MTZCW33Kubm9v851WkY6Oj9IYdjKwLq8wcTP8V9NSU9dZ+3PzsnEx8nJy872Qj0/NzQ6P03i +09bIwMfO2V9SV09IT1hr3tzfz83Y2Nfn69zj+PDw8ujg5dzS2eXf4HxgU01LSEZFRUtf7dnN +zszGy9rzXFBNS0tPXv7j2tLNycvV2Nje4+vt1svO3XRaUUo+Ojs+Qk972cW9vr/Cy9xkSj8/ +QURNZdjHv7/AyNf3YVJMV2Bn5dTX08/W4XFXTk1JSE5YZ+nX1tfa4+70aV1eXVtlenVv+vbv +6vLr4uLj3dvc1tbe6PdqZ3NhW3Pt6OTq+XNeT01OT1VebfDVzcvLz9nqblZQT1BWXWt859jS +09bb3upyZ2JbV1VdaW368Ori6uvt9P1udH387+Tl5+Dg5u98c2dfXVxgYWru6+/17Obt9314 +c2tnZWleXGBpZWzo4eTg3uPn7+vq9P11efr06uPt/3VtbW5mZW958ePe5PZzaV5bYGZqbnNz +eHZ67eni6Ovv7ebr7erq+/3ycWdkaGhve3d6/n76fnr97erx+fp3a21gYWpqc+nl6eLo+P/9 +dm1rb33n5efl6+30fW1tdnBqamhtdXZ3e/rv9W5pY1xham5sc/Dm3t3d29/k5ujxfvrw8+7v +/f5uYlxZXWZtbG557uXi7Ht+/G9kZGNhZ25ze+vk39/g4eLteWRiaWlub3b+7+rm7fX07+57 +c/zv/vvt7O7u8v90bnh+cWtvfXZvd3VubGxxb29z9+7z9+7v+vrw7vl/8+3t7+/z/frz9Pb8 +dGlgXFxlY2hz/fPq6OXl8Pvt5fB2bnN0+u/9evn39vz7dXvx+3r07359fn17dm9sZWZrdnZo +aHR1fOzh6fbp4uju+vjw/m1w/fD28/d+dXv27/r/9fv0eXV6bmpoZ2Zmbv/+fvry+XX+7Ort +8fn7cnjt8n/38/l0cGxqZ2hu/e3w6+rr6vTx7/d1cWtqdnV89+7t5uju+fT1dnR1dG13fPfy +f/z+d3F0/npua2dhYWp5+/Dq6enp6+/w9Pn6dHJ1d/Tt7+zq6er7e3lzdnNzaWJpbGtud/To +6+vr8/ry7e34ffn5d290cnF1fm94eH32+Hz8fnJ7bmx3/X1/+vbx7+/67+/q7P/99u7q9Xp7 +dXp4/n5ye/n59e35e3l1fnp4cnNsbv55dXBx+/T9cHf7fv769+7t9/L8a25+/v5+/fH5evrs +9PPp6Pf9fXzz6/L4fnZpZGhpcXl6dWx1d3xzfPD5/PbxeHL+9vf7ev9+bm5w7up/ffD2+vV8 +c3x5+fP38e30fHd+6/t7fX57dvv1f3FwfHxsbXBoYGFla2597OLm7vLs6+/w5e51dHz4/v78 +emxv+/T08n1ua2xreP1ucvn+dfTo8frk3t/o/n30+fL4e3JscXVtaXFzcG9tbWxvdf5+cXX7 +9frv5uTx9+3u8+/k6vX58O3v/W52eXN1fHNvdmxhaG51e3dxcX329/ru9Pnt6+3r6+/u6/d6 +/nhubWxpaf/08XxudvLq7evwdXV6e3t++H92bm//9vR7bnZ8+/n8dG95+vt9efXo6+/u6u73 +9vF4fvP0e3JzbnP9fHBvYmRsanD67+30eXL6+nd2fHt+8u32+fbx8/X7+u/w8vn08fXx/G5p +d/X5fPrw/21ubnb9+v91bXj5enFvbnh6/vHu9P/2+fr6+fDze3328vR99/F7dvr59/r8fnZw +ePH2ffh8enN0fHtrZ3P7+/Tt8v1xdPD1fvX1/v767+jr+3Jtb3t9b1xSWWj76ufe2djW1dzr +7vhvY19iYWFgbH1xd/Hq7+708n5ufPL+amlxffj1/nltdPHo6/zv9nFx7+9wb3Fza3N59vZ2 +fPh8fPDx7e9+euvn7vTn9Hh783hvdnN0anby6fdyd29rbv77e2trb3X/e/vz/nl69fl5efpx +b/x9+/l6efP7+Pr7b3jv7e7n6O73fn3w7vt++n59fH5ub21taGZsbm1sePnw9/x0bm9wavjt +8vDw9mv4/ent6urt/fH89/fv9XR1a/52/XR3fHv5anBeY254e395+Hzu9ezs7/Ly8Xt3dex+ +end+fPR9+HtxfXN6ZnNvcnz4+Ovf5Xhr8/D56+10fGxpb+3z7urz+21xb/1u9mtuefh+cX19 +8mjw/e5xcWx0ffnyb3x9fHpveOTq+2l38fno+ez4dmrv8f975vp6/e/3fHVqdm5lYGRvbnLq +4+Pl7vZ8/2x9/fd4eHzt8vd1Zn18dXD/e31w/Xx5be/ve3JpbP/x/fXr7/v97+576+vq/HJ9 +e/9qZ3Lwc/5ya2Jv+Xd5+err9Hn57/p75vZw+3d6cG587ff47OB7aG1uZG937/V3Zmf3/u7u +7nXp6eF4d+9t/HT2cfdnbmdta/Fs+eft63n7+Ovv7nvy8Ph2fO/yfXv6aPL5/HR5fHJ8Zmpy +/2787enq73dzb/Rwbf5o8/j37+/9dnn06nh3cnnufmfz5/7u9f7f+Pnqc25sbXJ09vfubnT4 +cPx89m1scH9+d35ydv/6fnb77X3z9ursePp3d2997Pn+9vTu9fXrfnVtam5sa3TnfHnwd/d4 +8/j3cGbv+nxocHFsdv/q/fn76vJ7/+z473728PLp+fzv/vp3fXhraGRmXm54/fzu/HHv7vf4 ++vd8fP/49n1t/O/t/vLh7vH76PV9/u56fe/5cXJ1a3h++HhuZHBiaf/6a3B1aW7w6/Lq7eR9 +d+3w6/rx8+d95/trbHdwb2h55nd39e7t8efq6XV9+W1oa/Vzdm/9/fP5an1ram3z+2dpbHv8 +9vXn7eLr7/Tu9X1/eux3cP7++XJh9uj3fHf4e3n7bmlvf3Z/+fP24+p2bXj67Pjx+Pn68vJw ++3NzcGx1bHxm7/Lu9e3n7O3q9vb2cnVmdmtm+nT0be5zfH3+eOztbmtrb2d+/Pbp9+b18urf +7/r2+Op6cPt4++/3fG90cXt+bG/q7nZod3btdv1wfXN4+/zw/H9ufvj+cHzo7O7td3x1fe/4 +7nL7ZWFlbPpnd+rm5un4+e75fO3q8+jx7vf8/nv97PVzanl4b2Rlb/BxZ3pq/3b89PFxcvX1 ++m/u6H538evr9vfp6ep3fX5q9Hh87frz/m5ubF9wa290am/17+3p7urzff7q5fD4fuh+anXv +9fb17Oxwbfbqd2dkc3ZkYntuZ/xz8+18a/VsY3/z8unpauZv7+7ffvHo59fl7O/obG7q7Wli +d2hr+e9RZ2hj1+376/Nzb2d6alxuafLOzeng4XxdcF9ud+9kamp+YnLrbODz3m1j/3Ro8mvm +3+BeY3xwUXbVzcvb4N3dWVxa+mt2b/hsc3htcXtuY25QVnJgZNHm299s//5QbN345tHX3+vl +3mdTWGJ43uXcy7/Fw8PL0t5qRCwnKi0vNjxTwLezsra4trvAydLKxNDTxr+5t7i3u0ggGxob +ICYtY66ln6GorsA/LignLkbXtqyqqa21ta+sq7K6uMcuGRAPFh8qQbegmZidqsY2JRwbHjK2 +npman63NPDZMvKqmqK3ZLR4WEhIYK7+impeanqtSJRgUFyBKp5qWmaPKMyct9auem5mfWB8U +DQ4RGUGhlY+Qmq08HBQSFiHeoJeXnKvjMCgqP7KfmZeZsSoWDg0PFzOmlI6PmLAxGRITGSZu +oZeYn7g/LS0yWrGgmZaYpTMZDgoNGSmzlo+PlK8sGxQXIDHjqp2dpcU6MDM+37OknJiYn08b +EAsNGCe0lo+PlK4qGRIWIj+2pqOlr3gzLC9Nv66knpiXoGIeEQwPFyiumJGQmLcrGRUaKPeu +qqSlt2IzLDFNv66lnpqdsDUcDw0UH2melZSWokggFxYfP7atrquuu9g7N1LLt62noaW1TiAS +DxYhy5+amJqlzCwbGSA7vq6npq/HVDk7Zb6wqKSqs+omFg8RHVCkmpicpLw6JBweK1qvn5yh +r3szMUTRtKuprLRYIRIOEyHbopybnaS3RiUcHihCsJ2Zm6O6Sjk4T761v8vdNx8VEhkutKCe +oqy5yU0vJiAkQ6qcm52lrrXCzsn7OTUyJiAdGyVZtaimscz2TDw3MSkqTq6hnqGrrq2vrKq2 +VjMjGxgXHS/Lq6KircVPODAvKiUx1auenaSssbm5rq21yT8gFxUXIEi1p6Ops8dWOzMrJCs/ +ya2in6GkqrCzt8PfPSUcGBgeLt+uo6Clrcg+LyojJzdZvKynop+gpqistso/IxgUFRolOdav +pZ6cn6zSMiUkKS8/6Lqonp6mr7/Gvb5vMSQeHiEkJik0ZrOloaOrtsTnVUdDT8uwqau6VTMt +Lz1+wbq8y3ZALyspKzRI1722srK78z0yMj/SsamprsB+TUxZ2sTAws5kRTkvKyotNlLKvLm+ +1VlEOzpF772vra+1vcze73hs7NrQy9VZPTUyNTxGT1ZcaGtfTkdGTWbXyMG9u7m3uLvB0eXn +2trnZEtDQD8/Pz49P0NOZO1xU0xPZ+DPy8e/uLKwtb3N6G1sb2RcUUlEQkE+Pj5BS1dcVVBT +XXZxcPLYxry3tri8v8TKzdfuZlVQTUtIREBAQkVISUdKVW/tdGVk99XHxs/Z0se/vL7DzNHW +2d3pbFxUTkhBPT0/RU1PTU5aa/z0b2lt79nNycnGwsLAvr/Fy9LX325USkdEQ0JAPj9FSUtN +VF/15+Pe3tvX1M/LyMPBxcnMzM3P1NztaFdOSUVGRkVHR0dHSlJg+/Dv/33y4dXPysjHxsbF +x8zY+V9XWmBx6OLlb1RIQkBDSk9bYWNeXF9n/eXYzsnFwcDH1HRaVFvt1MvJzdbsX09JRUZL +VWd+e2FQSkhHSlFu2s3L0OxscfHZzcnFwr++v8jZcVtWWl9neHBcT0Y/P0JHS0xPUlJQT1Jc +bubTy8O9u7y9wsrP0tXX193k7XVeVlRPTUlISUhIRkZHR0lMU2Dx2s/MzMvKx8TCwsbM0dXW +0tno1fVRQUnuWEpMUUxKQTxETU8+RcrKdMm7v8PD2P3Kv9DiycDV4M/abnzpUUZPWEU8PkJE +Pjs8R2BnZNrAusDKwbW52Om/t+l02v36+EdT7kxCRl9MPj9VUD9O7FdAb89mcsjI4tzKzNbN +ysrHysvKzNXe6m5aU1FTUU5PS0pOT09WXGFld+rt6e5zc+3t6N3a1djZ19vc4eff3u72dHv9 +aWpoYlxdZV5ZVVZYV11rdvvm29nY3eHi3d3k3tzb6O3v9fHo6HZueGVYUFFRT1BTWl9t7PF0 +7OTq5+Dr8Ong2NjU0tfb1djh4u3yZ15bVlJYXFhYXltYW2Bqcfj7e3/w7Ozf3d3e3Nzd393c +5/Xo+G1nXmBoZFpfaV5ZXWBiZ2du/ezr8vTm5e3m3N3e2tnc29zo+//5bWVjamZgYl9aV1la +WVtlfu35f/vs3+Hq8ufn6ubk4OLg2dXZ3uDpcnF5XVVXWVpZWlldZmtsanFzbv7w5ejn63Rh +ydRSysvo4Od45v1fanFZSM3XPX3LUFXtYWZoWmt0dm3/3ufu5tzdz3nh3Ftf3NPz5d34+Plb +Z1paVVZCPdpo1lxdt27f2Ml84v/o6FdHdslR8FC/4UjU4vpfeF902U1pTdZPTnDPZGzYWs9r +YeHUUU/T8rtD7sHcy0fm3MxKQVxfXzzJOezZR8i723y7YNxRRd9O20fJW9BKxfHNzUzDXV5i +Ss9M10Pc6UTQSclf++/QdEzbPMBTWHXUU9Hkfb5n3uZjx0nXYf5sdVpfzExO0+xZ1l342FVc +x0p45ErBWUzLbVfORM3kW89nzMpfd8dB0Vk/4eRF3vfV8mP76mlbbnnedVtmy99U5uH06E73 +xFpZzWDYUFHQ6E17ae7MSNS+ZPxXaP5eSNrv32BN089kePZu6U9b6P3W7l7jaupi9erO1N/j ++mJPS15m2t/e4thkWmJjbm3c5NNRUOZa9VDay+n3YPFu6+Rv3eRrXflrWF3463VhW+/fXHXb +29tdXNbiXu72y8tq7eDn421j2t9rSkVKUGtl3dJ5a1lKT1Vd7Hfz0n7o1+vh0trN4e/P0M7N +6dnOcnzme9VeVfNm/E9S2Ek8RDk5Mi08W3DEurq1wdzVeOLJxby9w7/EyMjG0NdmWFM9S+5s +z7u7QygkHyUuMk29uL3C017gzsO9u7e6w9HPw7+9xMXEzmNXeFlg4lj5ur3AzxoOGyc4yrSk +nK8wJy5Tv7uxpqq/RTpQwbC0uMHdT0Jezr++xtRZP1/F1xoOHy1Hubmvnas9MiwtR72rpKiv +yUlAVsO6vM7kW0VMZMGwrrbIXD05W80jDhMs+K2stqekxDwsKT+9tbW4u7+8us7O7U5LP0Rb +1MzAtK+vucPbTDUsQVIgFh81xaqys6euyEgpJjfYr6auv85dUD0wPdm5uO4+QnDBtbSwr71a +QEBUuquzMhcRGi/JqKKhorFBIxwhQa2jpa22xjslIDDHrKvLPDpZ08G4rqq07Ts4TMawp6au +TSIYERMhaqaZmqXILx8eIz2qm5qjxS8kIiYzyaqlqr1KOD3WsqutudhGODpXwK+nqr8wGRUR +FS+wnJSZrFcjGRwn/5+Wl5/zJRwcJk6xoJ2p0zYsNFbLuLK2xFg6N1DBraquvk8oHBoXHGqo +nZqkzT8qICk6vZ+boLYyICAmNNevpqW2Ry0rQb6rqbDPPi8wP8quqKmzzksuISImIDC4rKOj +v0Q3KCgwP7qko6vKNCwuMkDdvq2mrs49LjjNtbK5300+MzdSwayps8DS3dg4JiMcHku9r6aw +yM47KS872quqr7XuPzwzOP23rK7aOissRuC6q6y11DUqLT2/qqmvv/xdbs7rPT49JR4pNc6r +ra+tx0U4Ky9kuayszUA5Nz1T6cGytcNGLDFH2rStrq7BPDEzPsWvrq+7z9H9as1cLCYdFiBP +waegqq27NioqLm+1r6uuyF8/Lzl4wrGw0mFHNnTAzb+7yt8+Ki086rWsqqu5aT83O1FwTD8v +ISc7RtOvqKSpXS4rLT7NwLSssb5VNDE/bsSzr7XFSygpPE6/sLGtuzouLS9Zx7WmqbnMV0ZU +SDo0Jx8tS03Fraairz8uLi83Ql+2qauvvexINCwvRcuwrbK32TEtLzf2xb+4vnhPTVDZwb66 +vs7Iu7rISjEmGh4vOseinqCpUCwrJiAsXbKjo6uvxDcsKitOvbmzrbvZdDguOkRbyr27ub/t +Xl9VZd3Lwbm1srLNPi8gFxsvRdSpn6Kq3y8tKyIpW7SnpKeorlcuLS81Q2fAr7bFv8tfSD46 +PkvsysG/wclzSklnz760s7rFRy4sHRg70S/hnqCssNZYViccL8vjzqmgoqzcSksvISc+W9a3 +ray0bk/9PC078dzNwb65v3F1z+Pdwr7B5z5ILRgoWCMpqqS0qKe0vzkfK0ouLLqkqqilrb9N +LSktKipYu72vqa+92UE+QTIxUPDjvbW2tra5u8djQzwzHRpCNh1Fn6q3paOtzywoPCwgOrK4 +uKajqLV+UUgqIi06P3u1qKeutbxcNjI0NDlOzb+5rauut8xdPCgaGi8nHE+irrOfnaW7SkQ+ +JSA2Uz1qrKerrauuyDktLygmNlvJt66srb7Sy2Y5OUlMTOfDubfDy8pFJygzJR8422DFqqap +sLe1zjQxOzIrOGHbxLmuqa67vdc7LzA0OUBjxre2urq8xdlqXG77WV3Mz0s+Mi8xKCpAYF68 +q6uvsrjKTTg3NC41W+7dvLK4vbi4v9r+3lc4ND4/PVXKvLi0sLC6ytVuPjk9OjUzNkg+Lzxv +R0TCsbSwrK235EI7LigsNj5dva+trK61vNJPR0M/REdGTmXn39LHvLe5uLW4xls9NisgJC4o +Kl+/yLSoqayzvMJ4OjpBNC45Pz9ZzL2zsLGsrsnZ00c4OTo6PUFY2M/Et7a4uLrBzFxAOSol +LCkjL1le0aympqWmq7PaOjEtJCYuMTv5xryvrK6ur7nE2lI+PDg1O0hUbNfLwbm2t7jD3mAz +KjcuIitAPTvhu7Osra6oqbjcaUYzLSsuNT1Ccr+9vLeztLrAzOtbTUU/Q0xRYOjUysnOz9Hz +W0g+QUNAQ0td6uLd2NbX3dva4/P+al9YT01PW2/mzcG+vb3AyuFdTkhBQ0lRXnTh1M7Lyc3T +1uNmWldPS0tJSlRbZ+HW3NvY3uj5ZFpVTU1XWltqe/Tg3dTMy8zKydPc4XpaT09SWF5839jP +zc/R3PhjWlZOTFFbX2JhaXvt4+fo3dro+XxhWlZSUlNcavnt4tTR0M3R3Obk83dzal9ZWFhi +b3Xq3tjT0tPV2+1sZV9WVFtbW1xeX3Ds4d7c293e9W5iV1FQUFl76d/Yz9PZ19vsbF5fX1tZ +WmBgZXPv4OHd2Njb2tfd8P56bGdfXFxhan7m3drTz9btb2NTUFVUUVBQVmV07dzV19nY4v9l +X2ZsaXT2dW999fZ98ODb29na2Nzh4ut3Z2lmXl5mbnz06+bseW9sbmVeYFlUWFtbZH3r5enk +3uT17+/+/vXu/Orc3uLi6Ojp9Pf2dmt7/3NpaWZjbv78/fj9+P90b2dmaGZlbG138O7s7Onm +8X/t5ujp6Ov2fv50X2V+fPru7vn6+fl7Y2NrbGp0c//+furl6+/r93draG1xbW38+/3v6ufn +5/L8fHN2bm5/7+nt7+3y+Xl3Z2ViX2VnaW12+/nu9fd5aXD39fDq7PDu7e3w8vTs6e/t7e/6 +8/v+/3VoX1tZYWdkbGts7uXo6vF9evr9eHN4+3pvdvbr6eTi5eXu9X51dXj7fnN7+X1vbHP2 +8/Hw/m1rbm9jYmtwbm5ud3n65d/l6uXl5fh0+vv3enb2/216+n798eTqdW5ya2lt/Xlwe/bt +8/b6+/319vD9amhobW139v599u7y9/Hv9Hf37vd7c/99fXtoU+vcYmnh6nz5+NzoZt7oXurp +ZGFhXmjufG91/ubs6e56cWdz+3xnXGT54uLp5Ob44tzf9+/q7fNnXVdaYmluanL3eH316OL1 +eHz1fW52em575+fr+3/k3/f7dGVpamJfaGlncvP29/Hp5e59+evt9vn19fbt6ujufn3r6nVq +b3X5/mxjX2h8eGlvb2/36+/9/vbt8vn7bvzq+fns7+/o6Oz5eXN1a2hmYWpvd3V1dm18f/Xw +8v97+vHwb3Bvdvz58u36eu/w/f76fP55fvjw6+ft/nFobG9vffn07e7u/HRqbX17bGloamdr +amx48+jt+Xv99Ph98vr7/fDl5+ji5u39+vd0e25mYGZrbvv7dnl7bmhsdnJmZvnwffDw7O7x +5u/79Orzb291+e71eWxpc/719HJucP39fv1vcHL55Ofz+/Z+eH13a2p8+H1+evXw9Pb5d2xt +cXZzbWx0+vj56vB4+O/3/Pnt7fry731wfHxtaW93/PltaWhrdHv7/3T24+Do7O3u7/P2e3z9 +/Xt1am96dGZocHFudfZ8cXV2dG92/P1yb/z39+vk6O/w9Pr4/Hr/fntydXVwdHJ6+XFvdXd8 +8ero7PP7d3z59Ph4b21rbWdndXv88+no7vN8dXV29frx7n1xb3d3+n1xdv/y9nz78nZ2/HFt +cXRyd3J6+vvx8ff1+PDr6+z7/P/79Xt4cG51/vr29Ph/fm1laGx97u789f74/W929PTy6Ot9 +bnBvbnd9+f1zbm97c2508Pp66ePp7PPx8/f3+n54eX57cXX1/mxvbGZteP16fHp+8/T18fP7 +7+/t/W589Xt7dPnwfHJ6fG9sfet0Z2lu/3h3ffbz+ezr8vju73X/6eXu8/b//nl2bWVhbP19 +aHT7d3R/+//26erw7n9sc/h6e3prbndycXB1e/l0be3sd3nu8H7/+O3o7P326+73f/94e/p2 +a2prcXFsffx0eHX4d2zz73v59fn17Oz0+ezk6nRfau7pdl9t5fd4e374bnf77/F7cnRuanHv +8nLx6u/w8nj/7vlzdGt1eGR97/J6b/j8+Wxh++t/fuz09HZi7uDv8+fv9+vy8fX1/3V9b2xt +fHlra2xkYnFvamZu8PDd72F08d/c6vLf3nv9d//+a/Xj8XJsbvHvc11bbnNpZm178vZyd/Bw +ZXt57eP6++t7dP9ofeV5cfn47fDv9n/r3+lw9ufq5e9v7u/z+WVpZ11cXFtz7XBgZfDje2R3 +7+z6c3Hs6f/17+ff5/V8cP18amzs9Hfs5eTn/mx4+Xhob/Nzc/lv7+N+b3H5eXJvXGtuWl54 +6eZxWnDb61xn7drb921v5dzg5e/v3PBobnBydu/zfnB18/lpXF1kbPl9aWhld97i/nrn+Wlk +ZW3v4+nZ19zd7Wdy/XxzdXn1/GFg+e318Wlda2tnc2p76On4ePt8bm9z8fN39ebnfWj14O7z +dGp97Ot5a2z9eWr7/n/1/W165unm5uz5d/1tdvxhaejrdXRrbOr6aXn9cn5+e3Jtdn3t7fLv +7/5ucOfe7mJl7urqbXXtdfDmeGP23u53a250c3Rtc3b+63hp+O9tam92+uzs9uTs+e99feve +6vT7b3P5fGdx7Pl6c33ne19w3exzbWT66mtmZ/vj9mZ093dscfv093V17eXrc3Hm43Z4///3 +eHn0aWP36vJmaPnq4OptfOr3fHBs7OJ0/nFndnp2aHr6bvP2a//n62774PtuXmft7vv+dWN4 +8Pv0fm3m3n5kbOf6eWxlanTg6Gdibuzb3Op5/P1193xpZPrz7vFgY/nt9XprafPj/m1pau74 +amFv7vv2fHdubPPn8e/z7ebm/H3t7efqcWJz/WZfduzvbGVr8vR0cW1o/+Hybvz/8ej+bW/r +7PTwZ2Vz7Od3ZWVx8ul9bHX76OZuXHvk8Hdv8eXh7P14b29u/fn9cm757/ZyaWJfa//68XV4 +7Oz3+Pj17/Du9Hn16/T9eH729PX9cWpmanN6fnVre/B+b2tmeO58burp+PD7ffTk6ujne3H2 +73p/b2Ts53n7/mVrc2FgfvV0bnR7dnPj3/5uePv592pr+X3x7ffx8fvr5vXo4ervb2lvd3Jp +bG5scmNea/75em9mbeXm5ObxfnjveGds9vHw8ft4enp6cXX+7+Poemr06Hl+4uh9ZmJx8vlu +ee77dfx/aWx+bnFxZWVoZmb76Pj36vHo3+52f37u5/H9++7y8Hlucnh0fHhra2p2dXVve+n3 +9/b29//7dG76/XPn2+Pu7/Lx+XRla31sYW37cm1obHj7eWt1d3n9dHPv7nv75uHo7fHw93z2 +5vR0a2ttevJ/fP7t8HR+e/vv83BmanF1dfTz8vZvb21veGducnJsbmtq/Ozj6evy9e3h5+7r +9u/+bm/36+76cG1rbHJ1Zl9qbWlycHvu6urs7/Px8/328/386/NyeP517O17/nZsam9hXGVz +f/d0aXz7d2x18uno5+j09Ort7On29fDx/fv3fXRpZmxw+nlsdXb7eHBtc/11b3vv6+/v8vby +7+jte35qY2Robm5tdX59/fP+8+989uzo6vf/d3V+dX57cXD59Pj59/rz6ur0fX1+fHFse/pt +bnv6eGJkc3hwbmduef7zdXb18Ovg6vn09f757O3t4ODy/3h9+vn4/2Vfcv9vYWdxbXx+bv70 +dmtqb/nw/3T6f/vq5evt5O367u70dWtzanF9e3L8/HZ9dP/5f2ppe3dvePX6e3p0dPTs6/P+ +9e/v7Ort9n5yfHxqa355bWv88vp2ZWlwcmx5+W9kan718/Du4OPw7ezr9nhz8/n883RtfXll +aH72829qe/n59PR2bvrv9H5z+e3t6un79u/zem52/nx7cW12e3hvdHxtaW947vh3dHF+/W9p +/O12ePfp4+fu7fL49ern6/l6/vb8cXJ4+vh+dnBzdG5ucnR9d3Jzb3F79+3r8PDw9vP/7/58 +b2NibHp3fnz76/R3fvz68Onr9fp+dW9oZWd49fn+/P3x7O7u6+Xf5/n8ff7++/54cW9sa3Fy +bG53bnNpaX5ubHh8eG9ufu7q7vD3f3Z5/vPo5uvr7fHv5+rz7fTw83VwbnNteHdqaGxva3Pz +9Xt6b3/+b25vePD58Obp6+z1cWxu/O3p6vr29XZyc21z/Hxxev5ucHZt9ujv9vXwfHf5/Xf3 ++f7zenB7bm52d292+fl9b25z/H1wcH33+vXt7evp5OXk5O7s7f9uY2h99u95YV5iZWVsb2lq +bW53efX47OLj5eft9Ovv9/Dp6fLq6/Tt/29vb3FqaWtrb3Jta311//l7dGptfH1ydH7u7PL+ +/nZ2+fXu6+Ll6en2/PT7+/Pv/mx1e3x7+Pv9fHp9b2hoeXNpcfz2+PPq93l9eGx4fGhpeHr9 +6u/+9+fi6/t9/f1xfH1+fvPn7vPu9/xwZ2pxcXR8c3J5f/Ls8Xh0d3Z4eHd87fhy+HVy9/1z +eW5u/3d39e7v7ers9PDxeXp5fvrt5vt2e/jv8/X7fvT8bGZnaWprbG14dm59/vz9/vh6++3t +7+/p7f77+H5+/ffu93B2+Xt++m94+vnv9v98cWttdnR5dnJwbHR59f35+e7n6vPy8nx8/PNz +amltbGhy9PH4+fT2fn31/Pvt7/Ly9+nu+uvwdHFydv98d3Z2/HNqbm9vcHJuZl5pcm908Ojo +5ujm6O/56+388u7+e/v/d3p+b21vbm5wd3r+/Htwcfj7+/f38/P78u708u3xe23++nv3+vhq +YGRvfWxs9Ofq7nZ3eHZ2fvLz6fN6+u3zenZ1bmZfZmtyfHjt6uvw8u73+fPu9m989fXx7vV1 +dHVuaWZpbXp5enxufPN8ePbu6OPv+v54fH14fPx8en54bXD8entvbHt7fn75enV3c2118fd5 +fP58e3r+6ujm6Obo8fP39vvzfWpoZWNncXN2+n10bm92dGds+fju+Xt9+/Tx+u7s7Ojo7Px4 +a2p49+/v7Ojr8nRvdXhvZ2RnZmltdXf68/Ps7ezt+nx3cWxxenV6dHh8fnd67+vn+HF4+315 ++PXx6+br+P3/e3d4eHV79vd9b2tveHBze3R8d3t8cG138/Lv6+33fP39d3R2evr6/n3z8O3t +7/j7+vh9dnp5bG/v6Ot4cXt2c3Fxbmx1//99fXd7fHn3++3m6/l7dnF+cG12+vP/eXf78efg +4unu7Oju/377e25uZl9ganl0cnR+fXBzffv89/D4/v3v8fXv9e3s8fr5enn29+r27+54c3J7 +eG92bW1xdnt4b2x5ef35/X58dXn09vfv6evq7vHz8fH8dnp+f/ru/XFub3Fud3Nyf351b3/x +6vJ88+7z9/Ps83t3+PxrbWpgY2dzfnx3cWt1+XpzefH39O7u8e3m5OPk4ubv8f389/z2+XRq +bWpmZWdvb3l1c29scGttbnvq4OT09+ja231QRUhf183Lz+FtYF9f8tzT1PBhT0pNXeDYfVhh ++3lv6tjNytPleWxoWVdn7t94UUdGTm3d19nVy8nJy8vO3m5eW1NYYFxQS1Voe2lfaXH8b3Bz +aGz64ubq6f1jXHHf2d9oTk1OXO3d3NLQ19je/F5bWllfd+fp9uXPys3W63RramprdvP2+et0 +YWlvYlhdanx9c/3u2M3J0P5bUE5QWV5eZm/99HpjY2NfXVpaXF1jbW7r2dXU2dfT1t/6ZlZS +U1dn9ubg3dve5d7W1tba29re2+hxaGBgX1xXUFJZYnhvZGRo8uDZ1Njc6nhvbW9va2NfXllb +Z2tpbWlu+Obh6O77/Pf5d2Ribfnu8O7zZlxifuHZ1djrbWx8e3x2aXF9++/u93R69/3v6+vz ++evc2uD+XVZaantrZ11daGt+9e3l5ez6/PV/f3373tzm+2tcWmRyaWxpZmZq8+fr/3v46efq +5e1x++5+fW9ha/3y6+/x7+7v7OLf5v1iW2Bo9u31fXP56Oh3YlxaXGBqcm1ub37p3tvkd2Vl +aW7+8nt68ebd3N3f5evv8PdsX19kc/zv7vl4eGtmev1+c2htcvjt+P15/XF57ezi3t/j5u30 +/2xpb3J9dWx1fvvu6u16fHprY1tcXlxdXFhZaPn3dXf47eru6N/d29zf5vT36ePi5efo7n5z +bHF6ev77cn7wcXv9e/t/cWNdWmBt9ev3b3Z0dPLw8uvi2tnf6Or4dn73+ndrbmlfXVpYWmJ2 +6vV08u3ybWh38u3k5/f46+Ph3NfPzc/U2+pjWFtgX1hYT0tJQD9OcNHBx9HcaVtgXWrp3c3K +0+tnV197+e3o9Wv/fX3m593W2d7p+W95/enedF1gXF92am1rXl5jSUFOW+DIyc7dblhdWVZs +cOjb7f/z49zW3N/e/Pfj4tnNyMjM32pkXmdsSz4/OjU7SXm/ur2/1lRNS058183FytjrWU5P +VW3d3npcVmbf0srJztd9VVBXc9XKys3X63VfV1Ja5NzuSy4sNkPGtLe7wuFkUz0+UOS8uMTa +VkZVZFNy3dzK0WtlVmbLwMTMfU9XX+TNzc3K0O1OMSYiKUO+q6qvv2A+NTU6Xb6vrLXYRTg5 +QV3YyMbHxNVqVU1d08K/y11JUWzOwsDEzt5NRlJMSjwuKS1Cx66vucxlX1lLQkfuvrS500o7 +QmzNyNzn2dvifVtd2MW/xmBKS1TlzcjHycvWe05BRD8+NyosPdKzrLfP+ExRX0pO6sW3t8tS +Pz1U1dLX533f0dbe3t/OxcvvTEJLdczDv8PO4GRZX008NCwkKUPJrKmyxWY+PkVCYMa6sbXM +TDg3R+bFvsPad1xUXu7OxcXO70w+P07Rvbq8xeFidNP6PDMuJSU347GmrLXDSTg4Nz3swbay +w20/NjpO3cK9xc3abnD+5cvIyc1uR0JO3r+3usXgVEpg5E47My0kKT/Tr6itt89EOz49Tc++ +s7XMTTozPd/Jvb7fdX5dZnxxzb/HzGw/P07dvbm+x31Q69LWVzQsJB4rY7mlpLC9aDc4ODdh +wbSstvA/NjRKz8i8xezcfFxfYOfAvtF5QDpFY8K0tr7N+F/Rz086LispJzXetaqrt85MODo/ +SOC/t7bHVT86PGzGv7zRZ3RVVHLtzr/ByeFDO0VyvbO2vcr88d1kRS8pJyAseLqoprHCXzY1 +OzpYybuwt9lGNTQ/2by5vtXlXlJdX+vEu73MTjs/T8+0sbrJ5fDb2VYyKSYfJVW+qqOuveQ5 +Mjc0Rsi4rK7JTjcwPF/LvLzN1dxfZV5mzb28yGY+PEjaubG4wtZdZOd4Ri8rJx8sXL+op7O/ +dDg3OTddw7Wss9BLOTQ++sq7vdDP5V5dXe7Hv8PQSjk/Usu2trvH+mfd6VU8KyomJDzOs6er +ustMNTg4POS+sq68X0E5OFXPw7nE8GxaXvnmz76+ye0+OEJfwbOzutBdUm/sUzguLCgmMF27 +qqivvlg6NDY8ZsCzrbPNUjw5Q2HMvsDfZVVQYmzix8DD3UU7PkzKtrW4wNfm/GVNPjcwLCcs +Psytqa267D83NzhH1rqusb9ZOzo7VcfAv878aHFy89XLv7/XTTo4ROm+trO6yuBvXUo7Ly8s +JyxFxq6orbzkQDg5O0zNurCxv1g8ODxY08a+xuldWlx508m/wtxPPztAer+1sba/4UpCSV9O +PzUpJSw80K+sr7XLVkI3NUPtu6+0v+VNRkBLdOPR0dXT2Nzh39rP0XxMPj9P3buzsrfHbEg+ +Pjo6PDQuMEDQta+0wNlZTkhGSl/MvbvF8Ec+SV7WytDieOnT0trn39TP1f5MQEjsv7i2ucz/ +VEhdT0Q8LSYpN1q2rbGzvt5lQjg6RvG9tbvGakQ/QlT/1c/RyszR2/V67NPX3nVLSFzZwbu5 +u8xeTU1JSTovKiYvUsGvrrnB0mZSRzo/V8+5tb3VWUpUdfTm+V7/2c/O3Hp53djcX0hGTOfD +vLu8xc/bYEZESD03LCYtQ8muqq+5zFpPQzc5P12+tLe/50hIVl92Y1Vwz8O+xNr5cfXdc05J +SmfMvbm5v8zkaG1aPS4lICc41bCtr7S7xNZKNC4wP9G3srbA0dzddVBBPEBjw7i4v8zqaVlQ +SkRFVdnBurq8wMx1TUhDOzQsJSs7/7Srra+5zN5ZOjIxMkTRu7KwusHI8VVDNjQ8Uci3s7S9 +z2dIPTw/S9/CubS1u8XkXFZHOzMrJScuQsewq6qtuMllPzYwLS87bbmqqKqxy088My8zPFnB +sayttc5LOzc7RlrTvri0tbzOX0s/NS8pIyYsOdGvqaapsb3aSDozLiwvOmW1qKKhq79MMCss +MD5oy7mvra+8djwzMjtZybm2usDM3eZcQzcpISEmL2+0qqSlq7G94046LSknKTTys6Wfn6e4 +TzItLTQ/VdjCu7e4vs1nSD9FV97Hxc3iYE9NRz0yLCkpLUHKsKilp6y3x/pIOTEuLC45WL6t +p6eqttpGNzI2PU3+3M/Ly8vM0Nne3tnQzdHfWD82LywsLS84TdC0qaWlqbHDZ0A6NjAuLzI6 +U8q2raqqrrrdSjw4OkFNX3r03dHKxcDAyMvN2O1WPS8pJCQpM03Br6qnpqirsb/mRDUuKyos +LzhI476xrKqqrrfIaEM6Nzc8SWXdysLAv7y/yd1SPjYvLCsrLDND57yuqaeoq6+5yHxFNy8s +KywxOkzZvrSurKyutL7UXUQ7ODk9S3PQxL+/wsrUbkU6MS0tLjI7TO/IurKura6zvM77WEtF +Pzs4Nzc7SGnPvreyr6+zusbkUUI7ODo/SVbu0srFxcvyTDw1MC8xNz9U2cC3sK6vsre/1G9S +SENEREJBQkNIWuXJv7u5ubq9xM3jWUlAPT1BSlZi89zQy8vYX0M4MjEzOkNd0sG5tbKxtbrC +029SSUNAQERJTllu3s7Fvby8vsXQ6GJTTEhCQEFIUmLm1c7P0NtgST84NDM2Pk/exLmyr7Cz +ucLTbVBFPj0+QkdTc97TysK/vry9xtZ2V0xEQD9BRE1f69TOz9bjX0pAOzg3Oj9Mb8y9t7Gv +sba+zXtQRT8/PkBGUWTt183KxsK/v8LI0eZiT0dEQUFJWu/Tys/qVkM7NjMzNz1M68O4sK6u +sLnF3VpHPjs6PEBJVXjdz8W/vbq3t7q9yeNcRTw6Oj1HWHvb1d5rTD00Ly4xOk/Quq+srK6z +vMt/T0ZAPj4/Pz9BSFfixLevra2vt8f7Rz06Oz9IWvXd2utPPTUuLC4zPWfEt7CvsbO3vL/E +zuhVPTMtKysvPu66rKalp623yV1KSUdKUE9PV1pmbk05MCkjJSs34bGqpaOor7bF3+lZPzku +JyYoLki+raWhpKqwv9bf/mj3WEdISVDq2mQ4Jx4cHCY+waefoqSnrq+vvek7Jh4dICpJv7Gt +rK6tqquutddFPz5M0crKxNBsaEEoHhsYGypctqCcn56eqa62QCchGxojLkG+rKuloaerr8xN +S0dTycLHwsbMwsJjNSEWExgfMrqsp56bm5mduDsjGhsgJSxDYsapn6KjrM5oV0NM/O/Fsa2v +sbvRYDsqIBcQFR0qxqWfm5aYm6C9Lh8dGx0lKzvEq6GepbXWT0dMU1X5vq+ppqqyvNlKLiEd +FxIZIyzrqaCalJefrc8wJiMdHCQwWrGpqaiuvdRbPjpAYcCspqWmq7G+60UuIRsVEBckM9+r +oZyVlp+rxzUnIx4dJjlztaeoqqu421g9NUDvvq2mpqaruc7tPiYcGBETHSg6u6SclpSbpbNK +KyIeHSMvO9+tpaSlrs5WQDc7W8izqaSlqq297UYrHhgSEhkfKk+tnpaTl5yjt0EpHxscHiQ5 +vqujnqGqtd9LUlhez7i0r62xur99LyEaFRcaHCQ+wKicmZmZnKa5SiogHBsfKjrIrKWjpauu +r7jGysrT1d5fbmhCODEmHyInKCsxPt+2rauopamts8VnUkc7ODtCYc/f/+Pd29fJwb6+xMnJ +0u1kTkZDRkZBPT9DQkVIR0VLU2Dq0MjBvL7DytXjbllJPz9HW9nLx7+5t7e5vcLO/FdUVlhk +eFxPTUU9Ozg3Oj1ASlru08fFyc3P1eVcTEdIVvnazsW/vbm4u7/F0uzl4NnU331rW09NRz49 +PTw9QkNGTmD04t7o4dnlalhVWnLt4drTy8W/vr/Gz9rf3NTV29zX0tj6WUtCP0FESE5UVFhm +a3B9a2FeWFhYVldfZ3jf2dTMx8jMz9fk6OPk3c/MzMzR3OdlTkdEQkdPX+7XzcvN0ehnWU9M +SEVFRUdMVGRz59XP0tDV3urs6N3Z0s/MysrM1/xmX2FeW23s2c/M0NTa6XZWSkNBQD9AREtS +X/jf29nY3e99d2xnbHTe0M/Nzs/U3eDl4fDP0Nl+1cXT7PDRa19PS09MSkRKSktNUVdadHZ5 +evv57vH05Gpc38/d3tDR0unYw8Lc1MbGy9PGwL3L1PFZPy4pKiwpLDE/5by4s6uprbO/ZUtE +NC8zOkBW8c65sbGyr66xucXMxspePDo6LSIfJCksLTrasKmopqSlrLtZMiwqKCYsQdK7ubKq +p6uzsrK4wNPXz85oOzMrHx4hIiEqPeizqKein6SuuNc9LSYjKjI4UryvrKutrqyzw77Ayc7Q +xcXYTDwpGxwgHh4pPciqo6SenKOwwk80LCUgKDtMW76tq6uwubi2wunLvsvbx7u91k00JB0f +Hx0hL028q6ajnp+pus5VOC4nIys9TF/Fr6ywtrm5ucDZz7y8w7+8v8bkOCgfHR8fHiQ7xLCr +pJ+fo6zEdk43KiQjLT1GTs+xqq2ysq6wusfGvr3I08zK0GE8Kh8dICIfJDq/rqumn5+krcJX +PDMqISMvQEhiwq6prK+vrq+2wMjExdzu2vpZUTklHh8mJiIqWLawr6mjpay30kg9OzIqKTzp +5vbIsKuxvby5uLvDzMi+u77ObGBYMx8aHScoIilyramrqaWlq7jfRDs6NiwqNujH7ny6q668 +w7y1tbvFx721udhOVk0uHhoeJiUiL9+wqqmmpKesttxBODc0Kyk0XO1c7bmtrbO4t7Kvtb7H +vra64kNGSjEfGh0mKCUscLCpqKalqa61z0EzNDMsJy5VzNDKt6uqsLm5trW5w87NvbnQR0BF +NSEZHCcqJSx/raiqp6Sor7zOSTEuMi4qMmfDyMezqquyt7a2uLzF0c/AvfI8OjwsHRofKisr +Pbysq6qnqa+6v947LjE6ODI83b7Exbmvr7i8u7m4usDHxb/F8Eo9MSYeHSEnKi9Mva6rqKeq +rrS+dDszNDUxMT30y8nAtrCwt7q6urq9xMvGv8FuPTw+LR4bIy4uKze/q6utqqituL/NRy8t +Njo0N1jFwMO7sK61ure1u8LFx8nP325MOi8oIiAlLC8zP8uurLGxraywwfVPQDk2NjY8Uu3b +y7yyr7G2t7S4wtX19t72Tj88PDUqJio0OjQ1Wry2vLyyrK66y9TkTTs2Nzo/R1TZvri4u7y7 +vL7E0eDp6+5wV0tJS0E3MDU+Pzs8R2Taz8/Ivrq9xMzW3mtMR0xOSkxo18vMy8O9vcDDxsfK +ztnwX1hVSkA8PD49OztBS0pMZODXy8fNzsjL3mhfYWllXHLXz9Xc2c3Ix8nKycfGydLe6f1c +VVFJPz08Ozk5PUFIWfPf08zLysbJ0dXX3vZpZ3fu7Hx76tvX1c7JxsTFyMvP2/VoW1FIPzo6 +PkE9O0BR/e3k29XLw8jX3drZ6V5TW3n/YWX12dnd1snAw8fHw8PM5f7q7WtSRj02NTc7Pj4/ +TejPzdPOvrm+z+Pp7WNKQUVVYF1y3s/KxsS/vsLJyczX08/X82dhVD8wLC85OjQ4WcO6vb63 +sLPA2GhPPjY1Nzo+UtLEwL24t77FvbnBz87BvMLcVVpIMSUfICs4OEe+rKmorba+0WRLOC80 +O0jpz8m7u8TU/VddYO7EtrKytba0vO1IOi0mHhsgMUvou6yoqK253khDSD48R15v0MLDy83c +UkNGVGvWvbKsqq24wMjZVz0vKiggHSQ7+Mu5r62us8hMQUtaWmXwz8jP5mtZW1hGQ1rVwbm1 +sq+vs8Hd5dPPeT8xLCkfHSU6ZcSxsK+vuNZVTkxX4tjaz9BvXGZRTE9PXNjAu7axsrm+wd5e +bt3Gwc9TNSYbGB80bL6tqqusuftHRElQ89/n0dH2fPNTRVFVU9rFvLOutb3F3Xv76d3Et77j +Ry4fFxkmQ72uqaqsscpaQjtJ3MfT73xeaeFqRkRUXfnSybmtrbfG817t0NfavrW9YTcpHhkc +K/uyq6mtsr7rSDs8St/O6l9ccN3X+VZXZ3rdyr61rrG93FJPfdPT1cm8tLxGKB4YGSvbs6yn +rLG7TzQ1PE/TzGpX5c7Ewd1IQEtPXNnEtKutu+JLQ0/k2dnOvLCvvj8nHhkcMcivp6iyw146 +MzpK3cbHdE5l3cjEdUI+RVbZvrWtq7PUQTg8TtLBwb21rrDAQCoiGRgn/q+kpbLFWDo4PVDc +x8PgT1ncwrvKSDY0P+q6r6+vuN5EOTdF1bq0usO9tLTKRSseGRovvqmjq8J5PzU6P1fFvsto +SFXNurzePzI3Uci0rq+1x1E5OD94vra0u8vKurW86C8dFRcyuKehr8jsPC4vNV61r75fPkrJ +usFrQkVTfdDFurO5zEo6P1Hry8G8t7rFxcK7tvQnGxMcxqyoqcdu/TMqM0y2qLRaPDxrv8j3 +7tTO2kQ/esK2uMzr3exYSEvaurK40ODEt7dhKSAaGkS9va2zv79GLThew7O+aG506NFsbczC +zFw/O07WyL25vcxcPTpQ08G5trO8yMXI5DgpHxkm1r+uq7jBbDMvPvLAvszKzt54QEXYx8rW +ZUxj4t/Twrq8y1NAR2bhy7q0tb/V00suKCAfNb25tbTB5VQ4M0/HxcnIz9LXVkJWz83R4G3/ +81BO3b+7yOFwZu1fV9S/uLrP/M9eLyglKEbN1MCwt95cQUDf31Pyxcrc3mv+1e5YdtPccVpQ +bdzn39TP2Otva+3d2dro18PCwPYwKy4wNkXTubO6ysrL70ZAUFJPUGfCu8Xc6dziWERJYP5r +e8rFzszQ0MtfP0pbT1nLu7e0vD4nMTYoK1G8srG6ubHBQDtGOjM9+MG6w8i5u+lKT1lPQUFh +y83OuK+9Z0pHQTs88Le1v/V1ejIlLT5BQ+24rrPCwbrPOjM/S0xO3r69zNLEwdFnYmVNPT1T +79nOxcPO5+flX05PZN7a6vrxdU4/Pk5eV2L7c/jXztrr4tLL2WRXUkhCU93MxL66urzEztpW +QDw5NjU6PkVO8MW7trO3vtFRPz4/Rk1RWm3t3dPT0srHyMzY7WFOR0dKTE9b7dHMy8vS3npe +YG1nWFJTVlFT7tDKyc/X4FxRXnnwZVNRXnNrZWbv39zY1tfX3+v7Y1plaWJ86un+aWdzePLe +0s7Mz+L9Wk5TVExHREJETGja0NPPzcrN19jZ5v1x/e53ZmNYVlpUX+re1tPX2+hxZ2Zw5NTP +1dbc7/9oan9jWFdKSEpKTU1KTVtccNfP0NLMyNbi2t3e9G/z6fLo4NrV4eX8WFVbZ+XVzcfL +0d5pWlNLR0A+P0BDTl937PXh1tTPzMnJy8/V2/P6allWU1FRWvfa087O1eD7aXrp2s/MzM3R ++GleSkRCQkE9QE1SXXbw3tza0M7Pzc/R1N3a2ubn/2liXFpfZPjZ29nZ3tzZ29bR19zf/19S +SkZBP0A/QUhNVGvk1c7KxcHDxcfN2O13cVtVWFxeZ2Z36Ovp4eHb2NbPzs/M0eDo+11SSEFA +Pj4/QUZLUmVteOTUzcrHwsHHys7V4vj7alxdZmFidP7q7ObX19PP0c/R2eD3bl5PR0I+Pj08 +P0VJVWV95NvRzcvJxcXGxsnO1+Lp8WxqaV5cXF9fae/m4N/a0tLWz9He4PVgWE1FREI9PT5B +R0tQXnPt1c/Mx8XCw8fIy9Pa3+x3cXZwaWZucmdt9erh2dPPztja2OxsXVZLPz5CPDo+Q0RG +TV545c7Ew8bAvMDJyMrY5+79aV5qfWZj/3Zga+/o593PztPNzNXb5GNOTUM7PkA7Oz8/QUhU +ZuHQysLAwL2+xcvJzufv5Hxhb3xkYXT2cm/q3d3h187U1M7R2uhlVE5IOzc+PTY7RkRAUe/8 +5ci+v8G9u8DJxsXU8uDgY1ds815XfvBhZeTb393RztfZ1tvc9FpNTUc4Nz89NDlKSz9O09Xq +ybq9xby4v8rFxM/i2txrWVxeV1ZbX21sb93T29/OydXh0dNcTlNNQjo3Ozo2N0NXUFTXxs3O +vrm9v7y9wcnP0Nj+XV1mV0tOWVlVctfZ29DNztHSz9LZ52JNR0w/MjY8NzI7U09HdMbFy8K7 +ury9vbzB0N3R2VtNYWtMSV1wXFzk09rUzszJy9DS0eNeTENEPjIxOzsyNElbSlTKvsLBura5 +vL2+wMjd9fVgTUxaWExPa/Xy3s/LycvIxMfP3998T0M9PTsvLjY4MzVFWl3zx7y6ubiysri+ +vr/K8mltV0pJUlJOVnbr39bSzMfK1NvOzftaVkNDPjI3PDQwOU1JQGLKycq/u7e5vby7vs3g +1NZdVWNoXV7t5d3c9tvP2H114u1ZVmtUSlVVSUpZ92BES+BmPUNoWUZKanpccNrTycvOwr3D +zcW9yOfTxtZdbXBp9VRFec1QSc7SRdvLPVfBUDr/40VPX0ZXzU04074+PMvISz/ext5qesy+ +zl3TusH4YcG2UD/JyU4/Wc/eS07WwlxC57zaOk27bDBMwe06Q9DVSFp63MVEScG/Tk3TwmNF +2eNk6lxb1/ptZG/a3NzV8HW60zzMtmE63L1YQVZs1FpESsVjTEvMxlZf+cR+TE7dwkNV4nLm +SUvwv1I7zsJyTEjEwkp83dzQa0/RyUZmvllEzsNNS8jiTFHGW21h5V3y1F1d28pO3tp+/Nlq +al5y4EXt2UlQ1E9U0/A5z787TbVkPbzaS8FzX9/Ke1DOztY6usc69b1ZNMDHPk68VD282jra +rzU7q0Iuu7wsXLFEObRXM63EKtOoOzPKvmE+zFFfvT5HxcFHTc7CaFLC21DO52fSVXnGTEi/ +TU27OubKTEjY0j9wyk5V1OZCy9FLdNlwdOlJfM73RNbMbnLg0mzJ6kK52Dbfsk85xsVDTVa7 +Qz2+/VppSmKtLUKwwzRvw37TOtDMvjRMrPMuzbZLP8xv98NBPrTQLeuqOTKsaja8X0HK0zfP +xU9LcrE8P7H/N7FVNaxlM7fSPtVPwts0xcs90k5Csvstt7oxzcw1sE84tlo9u01SvD7VvTlu +sjpPsztuvUZFuGM8w3pLymJJ4MRYOrhsUHlr2VldvT3ovT/P6XJf3dJMYNvEM9e9RT+xOkqw +PUXFyTzM2VDJTM1P2NVIyNw9vT7KS1rTTbw+TMC+Me/MvD9Dskhjwjrmrzg5vbg0OK/GLc26 +OM3HNtq1Rzy9uzlOvtY/4H3x31RPyuNSS8rCNtLNSWPNTtvMP+rU7FNgd8PmQ2Cz8zHEwGY7 ++b1Jbc49wb01Pq7LL2W/bULXU0u6ZzfCtTlgvXptVNnPSlrHR33DO9rN8T/NwUM/sU00r0FK +wWI4xbo3V7ROU3jLbP3q4+/fzED5ymBIzU7FSUjNzj7GekK9TltexNg42q83PK9HRrpNO7jG +Okq6xThOtE9PzT9Zv1s3zLw/bNBYu0Vvulpdxl5my0p24HjcQdjPPGnVUONC5b8+XrxKY9NI +zNVWWv3FVmLpwUdywlPZ/Va/R2VFat7I8kbB10D2zlDyRMzYTOB47MdPV8TbW17LUOBgVOdi +1UPkzVJO59R0UcxLzdRCYb5gTFXfyEzcTtXHXkPJvl5QWcRb/kHLvjlNxOVAwU1Ju1Y/ztft +SH3DTM9HzNVSXW7PWdNJ97g67749zcw7W71jO8fWQrtPMq3HKby6K8a2MUusXDS3vjLbszhA +tto12LpS/NzJTL/8Qs/I50zs2ttnWl7XU0hCOVFANztWYk/W78y0vOW2s8LDvsDLuuvZxNbV +47vCNCU57SUdKjs0LzJEtqvE1Kejtry7ycDLPjdS1ExtwbKzrqyuq6+6OCgpIxsYGR4mLzdV +rKKioqOdobHKYtw8KCksNj9Dx7GkoaOfoKWtfCoiHBkXEhUfKzV+rp2ZmJqdnqXBNygkJB4d +JjzYt6qhmpeanZ+ksT0gGxYRERIRGy9IwaKXlJKSmqOr8SobFhcaHyQys56cmpaTlJqiqrc+ +HRYUDw0PFBgo6bOhlZCRkZahtUomGhMTFx0oW7Cfl5SWlpeao7C9VCAWGRIOERMXKFbEqpiT +lJSXobDRKhoXFxgcKUS1npmZmJaanqOwzOU7HRcaFhMVFBw47sOom5aWl52ns1grHRgaHSQw +X66em5ubnJ6jr7/PzkciHB8XFRgXHCtUzq6dmJiXmqOrvy8fHRoaHy1AvaSfnZqdoaKpucrA +zy4hJxwRFhgYHzNKwJ6ZmpaVm6SvSyEdGhYZJDd3rqGfm5mepKWsvMTMTSYiJBYSFhkdJTvX +qpmXl5SVnKnJKxwaFxUZJ0PCqKCcmJqfpqixw9ldPyohIBgUGBsfJz2+ppmXl5WWnrFZJxoY +FBQbK1i7ppyZl5mfpai4+UtHPCYfJRsUGiEhKFW9p5mYmpaWobpWJRkYFBMcLU65oJqYlZig +pKrHUUI6NS0iIiIdHyEfLUtus6Kdm5ibpa7KKh0cFxYfKjq6pqCbmJueoq3GbUU4OjgyMioh +JCEdJS0ydLCqopycoKOtXS8oHxkdJCg+wLGknJ2en6awus9LSmVPRj0rKCYgHh4lLzhlt6ui +n6KlqLPPOy0nISUnLUnXu6unpqOmq6yzws3e4v1hQC0wMSQjJCUuLyw80MG4sa2nqbW7usPi +emld3txjbFM+QUE5aVs/vbbZv6u3xrS52NDpOTI5LyovNDM/WGF2xsTHvr/Lycl3W11KSEQ/ +SGLu4Mq/u7SysK6vtLzMeUo+OTIzODw9P0pWWFhZX/xfU1VWWV9bWVplb15aZuvc3c/Aure1 +tba5v89pTklGRUtTfNjLyMvIyutRSUI9OjIvOTs6Q0VJdGxW2svKw9y7rc3DtV9J09BD7MpW +1bm/ua23yM7FxVs82MctJkY1JCkiKFQwKNqyuq6uq52mw76/YD0qKDo8L0a5rqqrq6SowtzH +9D0tLj45Lzjnv8k5JEJRICU7SddrPbWn4fO1t7K/6bWu3VPSzedTX7uzxcKxsr7P4XpHMTEz +LDU1OMrGd9U7MlcsHzA5MT9G1q2vuaehqK20uL5dPkdXR0favbW4u7C44k5OQjI0PDtCRjlB +31IyMjk2KiUvVW9btaanrK+srMNkzcTeSk7Hv33dvb3I08C+Z0ZPOj47MDpOQjlFMy8+MS5Y +YlW7u72xuL62u8K7wsvSZ37O/uHIxcXb8NzwT0heY17tRT5BNzAtLTphSV/X187ZdsrEzsK3 +uL29vL3T1MHG61rgcEFOSVu+y0dOxfw4Lzs/MzU8ec1LPtTWQEPdvcLLvLC4zsW6vr66wMb8 +T+reTj9rvz0w59VUPzNQVCEqX0I+/cK3yTtYvMtW0a6wz9S4ssdguq/ITU7j6TY+t7xLQbvI +NDc/My8wLT7nS1XKb1fR12Taw8XJzL+3wsy8vsnka91UWdLOwtfNustY63k5NTArPC8qUfVW +2+xVblJK08LPur7Lu7/azbvM3szH0mh7zr3Ebsa3zUdO7UIwL0s3JC5dPzE85LjJSc6xvkxG +yLnfY8CyutvWwMZtcc3D38+9vcnUv9A9OUEsLT09Oz5t5TsvOD5OSV21rb7szsDPX9K2sr/L +v77QW9y7wFtvz9dN/c1cTFtCSfYsJjssIzlMX73PS7u192/Rv7fF1721x+vSxMHNz766ynXa +1NjX7tDVU2tOb1wUDjpWJECnnp9iJs7FJSW8o6y9zLWzQDm9r89NVdzSTWqyqKu2wmxFOCxJ +z97CuKwzDRQ4JiraqZmfLiu+/ikpXKKfzmausEs8VMO1XjzKt8bBsquux1poRy47V3m7rr0V +DCE6LS+xm5m6Jz26Rio5va27zca4utTZ2FdPXU1c0riurqyvxlhDOj1BPr+qsrIfBxM9NDu3 +m5amJiDoxC8rvaSpvi5DrLx26sa73TY6xLGur62sv040OWBOV724vLM1CQgnVt+0npeaShsq +8/I7/aiepkYqPnXk6My3t946Qta1rq+uvVlDPEblyrqxx87FIggJKcimpKCZnzwdJjj0zcGn +oa1hKStF5t7gvrjIPzzBqaiwyFlQQkFgx7OvvOxTQikSDh3+rqOkqqW8LikvPOG5rqy370Qt +LGW5tsFfYm9LbLGlp7pGOkNDQ2++rKvVRGBaKBEPIsCqp6ulptkrJCxLtauutdFNQCssxqmu +yEg0PmDMr6mqs3gzLTNPx7qxq633Mk1KGhIbO7ajo66mui4lKjvIrrW5u089PTJRr6/LTzo9 ++cy7ramwbzAsN13Fuq+stddBOsS6Hw8VL7mjpq6or00nJC1tsq+xvNToQC89zLzXTkJqvb7E +vLbGVj45YsTHw7u7vs9KX7q4SxsOHFW6qKmnp7woHiYwwKqrr73NSDEsOM2+vsDCwM7wUHjN +v7jC3mrWyfdvysG/vtlUVVEtExUvwKerucnKPyg0Tb6srr7T6DUsPcWvsbnCyN88NEy9rq21 +y9t3RD9E/cK88UtuV+fW1ugmGSM5/snDv7C0QDE6UMjDcVm3tPpPWMuzuNfjx9T8WE/RurfG +2tXsXUU6PuvF0GNZduDlUCcfLztAS0XbsrJ9WdDv1M/j3MG4zuXm2bq2u83ldU1IQVfJvL3P +8FhKRjtBT0tKQUZWzLu/yHpMPi0pNXTDvMDd5NtdSVjLvLrGefjU19fMxL/M715VUFFdaevU +zNdfRkNJQkRi3crG21pFPz1GVfXGvsDOdlVKTEtU3Ma8v8xnR0hMaNDKztPdd09QWmb119He +bVRHSWbdw73Ez91cPjxFS1/T0dzY2+xqWVZce//UxMXH1VxPT0xU79/Y3VVJSExX9tbZ53hf +XHx4687Nx83fZUtHTXTNys7h6f1tbPnga1hSVuPV0djqaFRRVn7k3Ohw7e5gWuttT0tb/ODd +68/N+F5ufeL3U2jk7OXsan7+e95/4dr+XV9r7Mrc5t9lWWFhauDgeOlsT1JOTmjaycvT721Z +UUxP3NXe4fx+/uhr7NxmWGRhXfve7NrW9Xp44G9hefzW2vD53eRpfmVTTVJY7dXf187rUlZm +ZXn96915VFNiaujm3+v76u3689bi43RWZWz+/X5+5n1cbWds4tnp3N1eXmJgW//ebGnwXFjs +597r7f9q+9vra+DZaVHe0ktPwH5O7d3S637a2Uvf6Uv1xVRE18r9Pk3GSS/OvT8817h8Q87B +4V5f1MJjQ+PGbEnpzu5b6Nfkanfc62nr5GxeXe3sXmp6Z2daV2lub/v7d21rc/Pq49Hfbf7o +eWt9fPL48+5lWnLr6uPd2e9menNtb/BqXW90bGtnaXVn9uN7d/NvfOzi4Ors5e5z9n9reep3 +cu7u6+9ze3Vn8+9r8+5vb2hzdWNpbXBgYXFr+OXm7PLm5WZ64/Lk29ve/nP7e/Tz8nV77WRi +aWt5fXpvbm3272ZrfW9+eH338fb79u72fH1sYWJ66u/u7/N9cO3i7u7q59/n8OtxZ3N1fnVt +eHloanh1bHTu7nF38u9zdurscXvzdm97c2Jfbuzv5t7id2n8/nzy5vZ1b2psbn7z7fT6dWt3 +9P3z3dvh93x1dmhvfW9uam9qYGf/dmppbG979G987Ovy7OHtdXb5+fvr3+Tv7er6bnV7cW/6 +7n56/W5oaWZnZGZkZm14enX28vHq6vP59PZ+dPTf5O3t7+7s7nt2dm5ybm5uen5tb//7bm19 +fG1ybGpwcPDu/v718O7z8fDwfHr+b2dsc3r2/fjxfW/48Hx4eHlxbW5zd3N88PV/ffPr8PPq +6Pb9+vX2dfXvdWx0em9rbXv++u3+bGlpam5xcn39fXR9fVPazErO7Wv8TFvDxVd7v9pkXlvq +TF5r92R0aVzadu3NUV3d7V5ay1fiaFrYWdxjzdTg7vHdZWTVTvfuU+JgZmHldV7rb+ZX9V7w +atVlbNtX2ljaXuja7dbq3eN53frrau7hXtlW6ltwflXSXFj3Zmrmal547WZS1GVmz03d/O7Y +XdJo1Ovu6dZgyWLY4FrMRcdMW+tNclBWT1NRUFx0Wf5q/Nfm19rV5MjrzdXgzOTR2drN2dTc +3cr+y194RDkxLzgvNzhD5crBubOysbrEz/1GPzg5PEFIWtzKu7y6vL/Gytz1XFVfXnN+09XF +vdDeXDkvLiwsLzM7X86/tK+ura+6w/ZKPjYyMTQ4RvvPvbWxrrG5vNRtT0ZFTVtZeNfLwbu9 +wkw+MiksKikuOUfVvLiuq62us8POYD87NTAzNjxR1MS5srOwtLvF2F9OR0JKTld35dTEx8nF +yc7VSjAwMC4uLS8/Xu3Fvbeur7S3wddzRz4/PkFJUXrNwL67vcC/ytdyWU1PSENYXGjU6uHF +5N/ecu9bTU9nZGRFPkdHSkdJW9/m4OTYztPb5O/87dzh4tTd08/azd3M5Nbb5td0eOpw92bz +fW7sR/FPbF1ba179Tl1YX2hd/2FfXl9ccmh8cu5t/Xhz+G/d49PZzc/wzezd017ddOtb4Oti +cWhg33F43+zcdtxX3u5k3VnmXG5RZmRbX1jfWGv9a2L+UnFYb2li1XXN7NjY3c5s0nXvX2T7 +Xlt8X2ziedPf0urU5e9gaW9lcV1iam9n7Hnr5v3xdXL+6PpeXmNYYVxj4Fzy6eXu99xwZHp/ ++3JrXen06OX83X3ieOTv3O1ye9/nbvBv+Ohpfe1sZWx3bG/t8t/rfeRsdl1scPxXXV1fXFlt +X+tqdPze6+Ll4+fq2urgbNjf6uHl/ObY5959/3Z3X1xdXF1oc/h37Ofo8v37aGZaWlNdX2lb +aXzo4tza2ubb5XlwavZ7eW/v8d3z5tzv/efqevlz/HJseGxsb2fqfWXi8nVt42N3bmtdanRx +cv19/+/r4N/vbfXsZF9ranhtb/fq7uf+//N3eP30YHL5f/nu+Nrl3njz7Gr8+3xmdGzreWfr +7+Zt423u8t7r/Wx0X2hdaGR6aGvmZFx4ZGzteH7e7m32b+jg9uDc9XXq9O7lavx4a3tkent2 +4X7429/m73Dwc/xda1pfa21lbG559X5l6ffwb+7/YOR17N/u+f7n6eF87njf/W93b/5ecGf9 +dnd05mr+ZHJv+tx07uj472Bz6m586/FufXtb5nZqfPVf9n9eed9+d+Fv6uR0ZebjbPTh2//f +8ej3/WFqalp6XWT5V/hlY17m7Pxy+uvn7mHe9ORz6edz4ftwdfHn9Whv7n7qbXbj8Gru/O5t +aHFibfX+bfTranf/6P9ofmpt7HVlbn3xbvx9+ufq7Pni+3399O7oZd1iZu593+ft4ejtYO9i +c2xmcup6YGh8Zv3u9N7xaW35Y2jwYffrfF98XeP1ddzlduvX9Pj4cOB24PPp9HJd517mV938 +7vlofWbPXu5e32Fq+1tnd1lo4Ptr6ubve+vu6fn9+H3i+GPreXB87mb++/ni//zp713ha2R5 +aGvtfHxj9u5c2mXZbdj9cNpl7mLk9Wj+4llzfWnaad9efmXrZm1/W+Zt6/b3X+3vcHp+9vHf +e2948nlpdWfkW+J37OfudW3peN3tXt7j32BPzW7ezu7O32/tc2V3SV1jSmNWXUvs4O3S5NNj +VmRYVeNy9Nzo19vU2N3U6+7OafT4S9dX9t1qX/d8dPlmYV9eVf5cZWJcfWFj5W395Pv97+fb +6/v55eLe2tba2M3i6cvVdO3PXHpgRj86OjpGTF5u7dnXysPBvsPN22xXT0tNT1Vdb+fb1s/M +zMrOxc3Ozd3Q3+NnTjw0MC4xN0JR5NDGvLmzsrS6yPRIPTo2OTo/SlPlyr25uLi8v8PL0dvk +4+Pb62ZPPDAtKiwyPlbXxr24tbSys7vGaUA4NDQ2O0FOZtzJu7SwsLW7yM3lcW9ibPzucVk/ +NC0qKS04U8+8uLWzs7Ozt8HxQzYwMTQ8SFR918i+uba4u8LM193f3+bg0MfDyeU+KyQhISg1 +cbqvrK2tr7O4wvFANC0sNET2ysbHycjEwsPIz93o7tzMycjIxsG8w+09IxsZGyZTraKeoqmw +vMlfOSslJTBkt6inr9JANDY/VN/Kvrm1uL7P5OTXy8PCyNBSOSobGBslXaadnJ+ux145LSon +LEy6p6KnuVAuJyowRsq0q6mtudZMRVzQxcjRzsKzrcEsFA0QH76blpuir7/MOyIaGyyznJul +5DMwNzUxNkW5pKGpxj88asrC1ExH5Lisqa1LIBUOFSjCn5ean6TIOSUaGirRo5qgtEkwMDMv +LT++qaOryFJKa8zJ6W9qesq4r6urfioaDQ8jxZ6Vm6Wp1TQkGho0r5yYpO0vJy08OTjxr6ur +xUhP68K8v+dwY1nlwbewqrM0HxAMHPKjmZioqrsvIRwcOqabmqVLKiYpP1NXzrCvutk9UM23 +r7PMRTk1RMesp6qt0CgYDQ8orJuWm6mzOh4ZHS+pmJqj3ikiJDBWx7murclGPEXIsK2xxD0t +MEe9qaWmrMI/Hw4KFWGck5ais14iGRsrsJiZpNMtJSMoSb+sqLD5NDBCva2orME8KSpJuqqm +qKmz5ioYDAshpJWUnLdkMx0ZJmehmJ67PCkjJz/Eq6e8SDEuSbWrp6i9PiglObyuqqenq8NH +KRcNDCudk5eizkc2HhwsxJ6ZpXAwKict6rWprFYuLTbPq6enre0uIydTrKWlqK+9fEAuHA0M +LZqVmqhqSkAfGy6/n5mmUDQsKC/ZtqqxOSowV7OmqKy4RCgjL72lpKuwudBxSS8aDQ9fmZic +rFVGMxscObKdmqpGNComM8irqcMrKEHEraerr8QwISdYqp+mtr3ISFTNOyobDhyrnp6hyzVP +LB4qz6ianMUuKSYr1LK1tVEzVMvCr7C+3zwsNc2vqK7I2dBXW7jCOB8QEUOhnZ2rU0c5Hx9D +rp2arDUmJSdLtrazzj1T1uS+srzGdjc43bqytMjYzGVSrqxIKxQLHqmenJ/XO1QnGiy7oZid +TSMnJjS7s7ayyUlBQvOxrLnoSkFa08vIxcXI10vKpbctGw4RRZ2do6p/QDkhHT6onZyrNCMo +L0nGtLKxwToxTryztL7a1dlORF/Kt7TJb7uqwCweFRAlrp+fpck5OyskN7iooaXPLSkuOdy0 +tLa7QjFKxrautMvW70E+WdO5sLzNu7b7Kh0XEyatnp+lzTM4MSo7xK+mpL0xKysu27Kvr8E8 +MkXpuqyuusP5OzU/4rOss7e6zjMjHRAXvqCenq8vL0EtNdnNu6KkXzAuKDS7rrS2zT0/VV/E +rKuxvkUuNEbyvrGztMUyJly7KBchPM2lp8tj2lVS00k437W/0947LWavu8rTU27F907Btb/E +w9plXEg/XNfX1uRSVM/Ju7gzGhwkL9evrKipwEE1LzBIxrSvtddGQ1D/z8C6t7jTSUBEYMe+ +vsHQW0k/PEBM4M3o9W5STEpGSti6veZJPDMwOEFgu6+2wNZPP0NSctXAubzI401IWvTY1exx +2s3W2Nrn5+bf51ZGRD9CWNjFwMlkQDo9R1TlzMbH1l5OXODW33RfT1T229bW3vt3ZV5s6dbL +ytXzWVvj09prSURT7tDIx8/vTj06QWHSwr/J61RKSlN529ngc2Vw6tvT0eZfWl9fbeTc4uz1 +8tvZfU9CPURk0cW/xtthSD0+S/rFubnC02NHQEVV9NbNyczkWU1MU2js29Xd7XdaT1Nj6tXS +411KQkZc08G9wNZOPjs/T/DJvr/N+VVNTl16993Oy83Q61lUYGZr7OPo6XtVT1vy19LhWktG +R1nt08rM311OSUVIZdTFwsrgXlJZ7NXW2+X9euzsePvt9W5t9+bc5HFgW1xfZWpmX11dZezd +3OZ7bGVhXmVlcOfc2Nv8Xl5v7uDZ3Pt3cvve2tzobV5bXm546+V9fOzqeGtfWl984t7e521k +Yl9eYW5++Pt3feni497h73FlX2j9+u/e3ebufGVudHTz7Ozr6Pjs5uxpXV5gdfHr5+r6alxY +XGvq3+P8amZm+ufq6u3+bHPs397e3/ZpZmNkanJ4/e/s/m9qZGBue29y+e97dvr38PHx7/jv +5ebz/Pj17OnueGJjY2j07Ovt+21oZWVtbnBwbXn6+nZv/PTv7+/u/m9sa3B+9ujj6e3w/3Js +b3v08u/xaGNxe2568urw+Hdud/nr7P74em5uZm735+zuc2RmZV9eX2D/6/x67Of689zb3+Ln +5OZrYHP/9fb2/Hh5+XhlZfrwcG/v7fd/cmxiY3Xsem9qfuzx9vv/bfFwcOjpfHH359/r8OXv +6P5q9t/m9vrt4X1z/fVxX2JnX2z7cP5jXFdfWVtkeOfl5uzwfOHY19jb2eHp6+3l5HNmbF9X +X2hgbn77+Ovx7O7+/vbq6fR+b3V6fXB7/Gr6fm549nZ6+Hv673lk6uRlZv17c+99fPh2cHX0 +8vvu7erv9/z49Pfs9Xv6f/ttdPZ/+v9zZWpqdPj76O97d3F4+n707PT7fnXz6/jr7+zvdm5r +dnn48u3+b2xmZG33+fNvcW739W9xefl9cfZ+7+ju8/Ht//p++u7s7+7v+/T18vR593ltcmt8 +dWxsamxuanB4d2tt/35+8/B7c29re+zm4eT48/X69errd/x8dn/9+fDs+W5oZWNlbm33e25+ +e/1+8/jy8PT5fHV+fnX5e3zv8+38fnJvcm5sZG5ycHdxeuXx7+nu6unq7ejo5Ovh19vf3+xu +X1NLREZHSU5VZvjf3NXT1tba29zf5Ovy7fLn28/JyMnLyMbIzdldRj44KycrMj1P4b2tq661 +v9BfPTMyOEZc8cq4srS8z2pQSD09SfjNxcTAvMHReu3V1/nlwr7HWzkvJSAqLC1IzrClqa2q +tc5ILSwzNDtW0bOsrrO70ls+NDc+U9zJv7q6xddrXPTg7NzNx8LKUT40JR8rLjdnx62kqK2u +wWU3KSsyNT/1vaysr7fE9EEzNTtH3M2/uLi9zGZlfWLp4NzMxb++0GI8LyAbKS40dr6pn6Ww +rb9ONCYpMzI+yrOoqK+1vk82Ly46Rl/Kt7Kzu8ziV0NDTVrs1sC5urq71TstHhsnKy3ytKWf +p66qvkUwKC0zMD7Ita2ttLjLRjcwMj9J+MK2sra+xttYSkBOXnDUwb++vsTMTkw9KyEgLjg9 +9bKnqLK+vd45LzQ/SEfuvLS3ur/L5UM8RVhnacy5t7/O0dBjRkdfc1ho0sPK8c3NXFpd4843 +HiM7KitEuqSszriu3jgyTsxbR8evt7/AvcRaRFN2UU1r0MnV0sC/3E5ERz86QebGzsnG3llH +Wuxy3MXC/Uo2Ki4wMUhrvrS7x8/kWkpL2MPBu7i7xmxm8Vhtct/X33Xfz83IzsXKX0VKPj5F +Q9HPTnXYbHBNTuJKOn7d38ZVSUY8NzZP32bcu8nFyNS6vMzBwtrkbOrS6uvN2dvPX39uT3Bi +VFpTUFFZbXZ81OBabGVSRUJZXE/+zN3v6ks9MjA/WH3CubS0vcnSfF37etfQzsfTz8vJ0elZ +SFRPRX3Wyszc2l1RTD5ATUtNVG1n9M3Lv8rV20MxNjUyM0PEury6tsRuTUxeV3DHub7Ev77J +823e0m1adWVUWWbez9Tx73lOPjk8SlRayr/O4OZeYl1GUVg+QGhMPEvVw8zd2tJVQEfsyMK9 +uLPE1dJvS01+2NTbzcXSc3zn815TaF5OWU5KWWdpXeB7T01lUUhlTE5XVVxYZ2FrTUdJSF3i +3Ma8u73HwMTS+8/I4tXLydPi0c/vbV9UVExLXFxU/O5dTEdESkRK1dHj4PTlU0Fc31FR2GRb +TzxDS0Nzvb+7uMra3m/q08/Dws7Q197T1c/L1mZOUFBHUtfPb1lgVEE8UeFm6OZm30hAWlV3 +1m50YEA9RF3c5dTS3O9NYdDHwsS/wN1adPXXycS8wetfWVFdZ23OyN9+XlJYRkF4205RYUxR +Tl/ZX9fmSVdHP09zZ1JTS1h+TWrQ0s3LycXAysvGy83X3eFp+9jUyszN0ef1XU1KTVZ5X1vg +8kRIZltNTd52UD9L4dxfQ2NJMzpMXunky7a82dLJy8/ezb/MztHfzeZnzdHezdDg9V1ZZGFt ++lpLVfFXQ+rSTlRPS1ROTm0/N0s8N0dc5OvnxcHN0s/QyM7VwsfOycrIys/Pytbo39bM2dnO +9GlrUUlSREVeTnlUSldnTUs9Kj89LzzowsLL3LvGT0/hytTWv7rEzMnBxdv41dv9YN3I0sXC +xMx3V11GNU//Tk1r2drQzyofUiwiSMm2scrNrNo1YV9gUE6+utjPvbrEZezD/Eda4Mfa5bm1 +w8/X1F89SHpST9zHvjkcJzwoKE2zqa/UurBmNTx22FtfxL3fTujBz1BwvsT8XuLN6FzbwMPK +w8PQ615t0t5PYt06IB4sMC5Iuaels8C2zTozOlFtXtm5tcNZSlxLQ1rpzsLTy7zH09Dk7Nlg +XMnMzr3Gvb1SOi0nIiIsOma8rauttM57SjY2PlnTx727vsbaTj1KT0rmyr+7v8nK21daWmHf +1tHGwszGvOE1LS8oJicx47u5samuv3tBPj05P9m9ubvCwc5KNz5eWWXOu7bA4/LaXEthzb/J +5M/Axs7OQzc5KCMlKkS+v7WkqbXKRzw/NjRiwbqzusvOYTowNFLp7MCysr3fVPbwSVDavrvP +48e9x9xbPy4nHx8xRHu2qaaosW5KOS0xQG29srm4uGFLRzU2T9jPu7q6vOJQV1xTbdvDvMnU +xb++xEgzLyYcHS9YwrKpoqK0Rjo2Ly40X7Stt7i6zmo9MThe2NHBubG52FdYXE1N+8m+xdXF +u8LPcDUtJxsaLUpwsKagnq1NQjwsKzFJt6y2trS7zUYwM01OTdu7sLTM5c5/RUJP0cPa3b+6 +v8DIPysnGxopOE+zpqGep9ZaPSsqLTjNs7awrbe93Tc0OTxDV9G1rrjCx9N+SkBO5djh2L+3 +ubzKOCsiGBwqLkivpZ2bp7rBQionJy1Ie9iyqqqque1SRTIuND7nwLuyra+5zldMTT07T93F +uLa65T0pGx8nIy72uaWepaemtNtLLikrKSg0W7+pqKyoqrvrPC42OTNDzry0tsO/wl5IQj5M +UExZXlZnVkBIW05OVUxU3+Hgxb6+vsx0UklIUVpt2MzHxc3Z52tdUk9aanPt5N7X4nP1enTn +e2p1aVxhau7SzcvL2XxVR0hVU05dWEtKRUVbfXDh1tXLz+HW2N3R0dLP1+Tm/lpjXlVofN7U +297vaWRrbfrXzs7LzuNmSj9JTz47QkNJW2H1y8PJzNLe2+lfZmVk6uhmYm/24urz29bbzcvb +1c53TlDs0eLawb7Ey87M1WlCLCQxPiooQc26r7Czrq2z5z4+PDMxLzJQy8nFvLKtsMHc6vpQ +PDlDWvTp0ruytLzDwsPRYkc7NiwhIS87Mj3Lsayrq661u8VSNS8xMzEyQsm3tbOxrq+931hI +Pjs4OkZm1sa8tbO4wcrK0lE7NzQpIChHSzhMtqqssrCutsfcTjYvMjgzMUfDu8O/tK+4y+f0 +V0I9P0RL/M3Hv7WutMLCu8o+MDMtIB0qSEE536ukqq+sqrpoTD8vKCo4PjpNu62xuravtNBU +UU0/Oj5KUlrcwry6uLm9wcXaSDcyKyAfK0JDPX+toaWtrKu13z82LigpM0BHab2tq7O7uLnP +SkBGRjw8T+/8/cm4t77Ewb6+z0s3MCkhISw4OT7Rq6KkqaqsuHE6MSwmJi5GdNS7rKitt7u9 +00s8PT88PE3r4+rNurO5xsi/v8xTOS8nHyErNTg92qyfoaiqq7TeOy8rJiUsP2/Uv6+nqLG9 +v8pdPTg5OTtGYfxx2byytL7Nyr/A2k06LSQgJzM3NUDAp5+jqauuvVg5MSokJS9N2c7Cr6io +ssjW3Fc9NzY5QVTq2tbGt6+yvcnIw8TQVzcpIiEnMTc4R8SqoaOpr7nFYzwvKCMnN3fKyb6u +pqevxvlgTzw0NDpDVPDNw7y3tba8yuDk3ORdPi4kHyU2SEM+c66goKiyvcl9RTQqIyQwar68 +vLGopazCUkdDOjc7QUZKdMG3ub2/vb3J4/x4X11RPiwfHi1QXD5BvqOfpa66yWVAOTEpJSpI +uq6yt6+qqrhVNjI0OUBKTVTjvLG1w9rUxMTYXlhl6+ZpQCsfHy9YVz9Lt6Kgp6+850E4OTQr +Ji7Vraqvt7Swt9g+LywyRuTX7d7AtbS9311l7dzX2u3i08zcTTEhHSY+Y1ZYwKihpq28VzYw +NTkwLDjNraaorrnO/nNKMCgrRcK5vsC/wcbM6kY7RNW/wszEuLfA20UnGRkpTlVKyamfoqaq +yy8mLTgzLDXes6mioq5jOj9INCorOeK2rK2829zPbj86RfzKvLW2u727wWk3JxsXID/ZzLWn +oqWprtcrICQrMT7auK6noaW2VzYuLjI7RVHMsKqvwOxLOzc9THLZyLuzsLa/ydhQNysiGxwu +3rqroaStsrjnMiclJStNu6+sqamuvO09LSktOXa8s7a6u8LqTD0zN1XEuru8v8LBv8TYakQ1 +MC8nHydG1LCgpLS/zUo4MismLFS3qaGjrr/jPjMxLi463rWurbbWWVFIPj5ATtS8tre9ytvX +0NbncVREODEoHypA5a2jq7vKTDU3NS0vR8OtoKCrv1AxLTE0OU/RvK6qr8VOOTQ6S1/73cy9 +ub3I4F5Z88zO5X1eRz0wHx8yRruiprjMSjY8QDc5W8OvpKSx1z8tKzREbMW5trK0y04/NTE/ +b+DFvsbIxsvW2XZUVWn53cvAv9ZKNiEaJzjjp6Suttc/PD06OEnZvq6or8dVNDA/asu7u83b +5WNSTEtMTe/JycveX3bn383P4/X24tHDvcHTSTIrHhwtP7ygoqmxVTExLzJG2r6wq6y11EQ0 +MzxQ2MC+xsvO0eVWXFtNW15MTVXyxru3ucf8VEpO7s3CxN5YPS8lHSQ31qSepbFLKCguPsm1 +sq2us7v2Oi0tOPK2rq+72U1ER0NOY13d409JTmnJuLO40UQ4OELnwbq4vM5YRj0pHB4tW6ec +n6xdKScxSsa0t7y5vc1mPzY8ZsGxsr/uPzpEWOTW4uv9bllGP0T9u6+yxEs1MDztuq+vutNT +OS4sKCIr/rajn6/mNScrRcy0rbW/yupoT0VHWNG9ur3RT0FATvHY0GFHSU9h9W7bxMPI9EA6 +OkbOubS5ylZEQEVX+dLKy0EoKi08uKussM89OUBP08LKyMfOz/9KSFjVvrvJXj85P17OvLzL +Sjg5PEnWv7u6v9ZgRz5L+Mu8uLvFTTUsHh431aedpr4/KSg5a8y6vcG7v8rtSD5J2cC6vexD +Oz9qxbzA3kY3NjtM0762tcL+QTY2P2vIv7/I3V9XWldjeGnx3eTTy9VwNiUoMV2up6u130FA +TVPpz8u+vsx2ST9HYtzHx95oUE1RYOxoTv7P29ZbP0hf2L68yNbpdu/5X2b80cDFUikeJz22 +o6i8TDI1W8jHyNnaxMvZVj5J78C6wOtCPD5P1cjFxc3jeU89ODxlvbS52UM6PlvLwMbbX1VP +TVVj3cbBzOxLPkpv2thMLi5A7rSttsduR0pk99/P0MzTZ01MWN/GyORaSElj3tTT4GddSUBO +WPDN2tPG0/ppUFTn3tLI1dzjc+HyPzQ0LjzJu7S521BRSkv3eta/wMLPV0ZLY9fDzXhURUpa +b9/OyMvRXj87QWXIvcLTbktISU1r2MrFxtxYSkRKV2vZz8/M0v5bTkhV/OXP0uNiUF3o9EZI +XPbGx9fvX2TTx9PmYExOVFl32s7IzelbTUdMW2vXzczM3VhAOD5WeMnAy9PqanHz7tbLzcjR ++efU2FI+QUA3P1Zc08nNyMTfbmRITm581dDa3dzY19tsVkxMaN7U0Nr8X19YW2pcYGFw39bZ +eFtUW/3Zzc7V4vp2aGp69+z3enRub+3d2tThY1RLS1///e1qVWNxX21scdzO0+ZoVVlqc/p+ +b+rZz8vUfFBHTu3OysjO3n1tfOro5Ofx9+3azs5UPTYrNVtpzsXJv7vZXVlGVulkcerexsHO +2+hmZ1hFSFbsy8fR3+TzW09NTV7v4t3Z1NnvV0tMVfvZ19rk73pjYG/h2dvuYVhceOj3fe/4 +dF1fYmdxfPD7em1obmps5Nfe7PBybW1lYmBv4dXT1t7ne2BjZ3Po4uDf5N3Q1tnW7Ug4MjhG +Tlzy0sG9xtPrdfhuUU1SadfP0s/W295tXlxYYGhr897c3+Df3+9dWFhXYXBx+v7//nf35tna +6XdeV1to++7m3t/p6PtoZFpXXF9bXGX1297q8G9s/Xt28uvf2Nvf3+z68O3o5u/5e3d7/+zp +49/g8mdjY2r14dzV7VlaVkxKS0tSVVFbaPvY09fR2NrV4Ozp7+jn8nl3bXD5cmZ65NfQ1Nrn +9Hx2cW/37vZrXl9fZGFbYHfl4erw6eDk7XNgW1hcZV1bXF5qemxpavzk3NXQ09nf6fLv6+Pn +c3r1enNzd/js7+95ampqevLx6/Jya25oZ2tq9ud9YW71bFxXVVRaXmNoc+Lc4+Dd29rZ3+38 +9Ofl5Ort6e3o5uTe3uXs7Xl0cWFgZm5/+/37cGpzb2psdXf07XZeWmddT1RUT1FSV1teeejr +597n5uXf3NvW0tXc3uDj6e30b3D67+nh3tze7O7z/3JtZ2pw/+/y7+72fnFrYVhbYFRRWFRP +T09UW23w7/Tn4+bn4N7g4tzd5uPf3dvc4OPo8fh3e/Lp5ufv+vx0+/t2/3r89X5sbf13Z2Jd +XV1fX2FkZl1cXVtbXmNqce3e5enl5OTr7eri3N7l4t7Z19/t9///cGxxfX58/nVvcHX99/p1 +dPX5/n5+bG92Z2BeYV5gY2BhYWJmYmdocvvq3+Xm39/h3dve3Nze5u7n5+vv9/z8fnx3bmNg +ZWxqaXj6+X95dGxkaWxqbGtsbmhkcXBsc/b48O75e3P29u/r6urn6vX36N3f3Nne6Orx/nh8 +dnt9e3p4dHV4a2lu/Xh6/np3ampnY2Voa21vbGtnZ2dodHVwb2tsd+7l4Obv6ero4uLv8eno +5efk5Ofq7fJ9b2pqa2xuaWp1bnd2dP32/m9obHh9eGxnZGZpbWxqcvXw7fVzeX718nxydXL7 +8PTp4+Pm7ex/cXp+d3358e7v5uru/v7vfG1xbmltcGpkaW169vrw7/p+dm9iW11nb2xud/51 +dH199vfz7X1zb3B49e/p4eLi39/f5d/i7Pj7+3hvbHd1amt4dmdoamBNWNlsb93t8PBtbHht +avvy7Ot8evT38e3rd3r+9Xtv8+x1cfNuevPw/ffvfev7cXFx8P3v6nz77XT3+Xz5+3ZdcPn3 +63lwd3BveP55aW15fmdv9Gzmenb4b+Zu/PXp5Pnl+HPtfm54d2h7/m17ZnH/deH36uPu6vTj +8On7731tfmrsZux0/etj9G1gam5ta2fybW5392xvfGzu/u91f/b/5n7472/h+fn0/vN56vdq +41rk6Hjo+fP37nT8ZltnX2NtaWt7bv7dcPF57H9v7+zhdc9f53N96mH9X2tmbXjubN9p3/p5 +5vrjbOZm6WjrZvB+fV3tav/vdtle3HP942HvZ23uYtxp89xd53lq6VrvX3Fp92nobe5f517i +eeRj4/Rp5/nv53nw5Wnf72ffYn3491Hu72/Uftne591aZ2tZRlpdTuB03tfZ2tfjbelkZn1e +Vvpe+fBj3mzaYuL56eVe8WRvdvrx8W7nc+z1eOpj4F335WL/7GFk8/Jv7O9m2XJc3+Rd6mhU +5/xn4nB55Hlz5Pdm4F9b4G9361r65V5+f+nu/mR93nDpZFjf+mDsZ+vk7Wrm3eDtXv56/m1m +XOrm9e/p8+h4YHNlZ3VqanhnffNra+Pw8f1memxw63785n9m+Hf87frz3t7j3+715+vq5n7z +/W93amNbW1NLT0xOYmXu/d/Y3NPe4t7r7efq4+Hd3tnZ29Xd2c/O0dPV1PFOQDgwLi4xOkzx +yLizsbK5wtlcTUM/QUdV99HHw8XK0OJtY1ZYbnDr6NzY297d3+LX2+H67uvn1ug0JSswN1NZ +Vr+wrqyyzXtgTEc9NTlPzb26v8jLzdlpTkdMbt3Z297f1M3Q4uzez8vQ71hDLiYpMz95xr2x +rK61y0c3NDM3P07cvbSzuMXtUUY/PkJez720uL7PX0pBPUFV3MW8u8LHxcPKWjEfHCY2TMi+ +uamkqbVNLCkvP2bs48CxrKy5Zjw1Nzs7Q3a/srK70VhHRkNBSmfWwLm8vru4vlwvHhokOv66 +trKnoqq/OSYnL0fi3tK7r6yzbDQyOU18V0zevLi73E1UetjiWVFp0sLG1NHAt7K/QyodGidD +br6xrKOjslstJCk0R2vPuq2qrsVEMzpGUF5c/r+1vt1VTWvZfktDSnDQysfBubKyuNc8LyUZ +GzNiuaiqqKOsfS8iIi5rvrezra633TMqOExfzcnHtrf3RkhS289dQ0Rd4vDv17yvrrjF2V9L +PyYUGmi4sau3r6CsOiQgJ1O5vsO2rrPLOyw0T+DWzsS7vfNESeTN13hcX/JdQEPftausutLe +9VxEODQfFjewy7y0uaWlPyQoLEa+ztOyq7LZPTRJ4mNW4r22xko5RtLPa/bTzt1HNj7SurKv +s77SXkJITT4/LBozrWZVuLaopjojNURHbFHXrarATEhN12U0PMe0vm9JXcfHRjtixM9KO0HL +t8LDtbG+WEJS1r7KQCgaLMc3NL6poKVGK0M/LjJBwquvzeLD2kg3NFO9u8vKvsJ1QjpB9Nde +XNfVz9Ns1cndaVp2zsK9sq+9RB4VIDk666idnalAKy8pIypHrZ+msrm/TS0kKmK6trazsr1I +LzRFUW/Zz76730lLZ+DnZ3DLvsHL1MvFTiYeLFdc3bWqqrw/ND44LDTVraeuv8PJQiwrN+a7 +vb+3ufE7OUhRTk7ivbrOWFnw+FtR7sXG09rTz9jYxMg5KTRFOTNHxbC00/fWTzUyR8G1vMXD +wuI8NkPfyc/Lu7rmRkJCTmRi3L++01JDRE1OTeDDzON0dtXWaOjHwcp+VmJdMyY20dvZwsK9 +zD45TVxqy725u9ZLTFpOSVHgv7vE2Hp+Y0I+TFh+2d/q3eRlWF3kztRxVWTXdFvWx87nXltb +T0xk0dHq7tTJznU6KzluSU3FuLS9VUZaS0FayLu6xd/k8Uo+Q2DSysrKzN1TRktf7+ff1s/j +VUxNUlBSa9vS32thbHh/elNK6Mt3Z9DK0WJHVdbcbt7JxNhectvPz/VlYzs3SkxRzsjLxNxR +Uko/RmnOxMPL3O1bSktk1MnM1N95Y1hQV2/ezcnaVkVGSlB72M3FyvNVT1VeX2vUyNDqXlhd +Xm/czsfJ32ZRSk1g5NbU419IPj9CTO/Nwb3B0mZLRUtb5Mi/wsrpU01NUGb79drb7uLtXVxc +WXDse3f659bc8u7c2PhDRG559tbazsp2TEtNU2vx2c3M1GxVUlBNUtjIXnDF71TZ4mTT1WT1 +3v5mX2FgXl5ueGZy7evf2eP5bV1bWVZj9eDa3/R1amdve/Lo3NbX3nhZUlZi++Tl6eb7YWN6 +4uDr6t/rY1tXWWv16t/W3WlVU1RWXG/k2Nbb7nb3fGVu/fDq5u1//ez3aGx1bG14bXL06+73 +f3drZG1vZml8/Xr97ujqeWl35t/b1tjX2/VhXVxYXWRoZGRgWV1qd/3s397j4+HsfmtlaW1z +7+bh3Nvj59/d4u79bV9UUVVca/1+cvp4Y19fXnLj2tjY3ep8YV9qdvPj3uft7vf+/vj+enlp +ZGVoaGl4+fv19n12bGh0+e/m4ebk6flvb3N5cWt88+39c2977O/9+vZ9e3Bna2t5/Hf47ut4 +Y2RkanBubnV8e/nu5uL0+355dnd9+eXf5OLe5nFlYWRz/e/v8vpvY15gZXL28enueGJfav7u +fPnu8/T47+rt6ePn6+72dG5sb2xnZWFjX2VxbWz+5uHg4eHl7+/z9/n4dHNxb/7+8O/3/vr7 +d3VrZ21sb25naGNnYGBx+vDv5uPm5uLg5Ofp7vH57vJycWlqaWpyamlpbu7k5Op+bGljYmVl +andycvfp6u/1fXb26ezs5enwfnFwaG96bW98//Z8Z2V47+fo7vT+eW1wc3vr5/T7fvv7/W9z +fHX4+f5ydnZvc3n7dGp0/XV47fJxZ19jaXX//+vk5OXf4Obtd2pnb338fHl7/v7++Pf68+zr ++f3zeWVlaGhoaW78fHR4/vP17e3o6urr6uvv/nl5dW5taWdtbmpqd/91cHZ4/n769uvq6eXs +eHR8/fP9/u/u+vp7cv/u7n/0fG1zbXF6//n19fb1c2dqcWtncvv4ffX3ffbw9f5+fvfu6+z0 ++XVy+n96fP949O7y7Orq9ndtaHV4b3RyfPbz+PPx7fl8+fv7fvduYmhtb3N2//Hp7Pj3+HRq +amv++/v0bWh19XtvePXx9f58+One4uzu7Obw9/x2eGxpZmVt++z+/3l6en3+dXR0dm1yZmL7 +8+3p6uv0/fn3dvvueu/k7+rxbmpoaG5qZ2Rmc2x+7+/l6en4d/d68vb+9fZzb3t+8PN8enbz +7f74+vP7eGhdYWlocOLo5+3x/m7v+vLt/vp5eXnw6Pn38HZpbF9gbmNn+P1tbfL66Oj//e3t +6On9fPP48m9u8/90+en0+PHu7XlobnRuZ2ZobGxzb2xxamhta3Hv+33s4Ojy4Oft5+rk6O5/ +bHH29HR89m9vc2Vxcv9+emtlZGNpcHt5ffp3ceztbnP6/XJyfO7w4erz7nzu8u7vfPj5+Ovp +9PL7cv7++nxlYGJrcmpeYmlteW9v++r67+348Pf2d2/47vHl6efm9vDx8uv1dGdudGhtbW5u +bG51dG/8fH3v8Ozo7u7r+Pn38Hpw8vv8/37993NjX2Flb3T583747X92++vs9vxyb/br6ePo +8Ofk/GVkcW5tfPlvaWh5dGT/8H57efnx+H9z9+3m3+fj73P//2pnbW/78251cXfx7Xpq/O9+ +b21ia3Fpbfru7Ov6fe3e3er0ff75ZWPx7nxxbXf+dHD1eHH88O1pX//n6uji+2nf3fh6XGDy +b1lZXFxpbG1+69zaem7f297mdvji6u94bXv4cePfY17+fGRhZvZ0Xmv15Odyfvh26PVv6PBt +dn1t+H1p8eR7cGVadenv/n599u/3fvfq3t/w9/Z1d+jo+2VecnNob29faP7t7m746O37W1vj +7f3k79/b+0tIWubLzdnfVEvp7NrM0+3yaEtWfe/e52NZV1Rd7ene3P1sYW/z7Ofv7fV9/Oje +297pdm5sbP7s+G9xY11gbn92bG96bmltbnRvU1bLzfbxaHPc32Xy3PTi9Vpm6+bg4Pb9fWRl +Z2xkVOHM3XhaV2rofnLj5fpeUlv33eXua11sZ2/s+Ofe62566evb4HllZvvxfWzv3uR2YGXn +2Plvd2J7725xempqaFhWX2pv/Xz97vLz7ezv6url6O38eXlxe97kVmD+bertbP7Y3t3ceWtp +Y2D57fvvc2JiZV9o8ubra2lkafLf5PbrbXjzZXXc3eTf915aV1d77f3v4e5uaGX+4t7ramRh +/e7r5eXpc2x1/e3o7P5vamdxbn3qaWloYvLm8/vteW3x9eve6ftya2Jhe+rr9X9mXmjy6Xlt +aGF3fmpq9uv2+WVm4Obr0tP8Y1pT995obt3f8XVYWOba5PxwZm3xeWz+d3J6Z1lba2n84uVv +6tt2Y3jueu33ct3g8ejq93Z9cP7u6e90Zl5fZGdlY29wcH7w5vXv4OxydG723WxWYXNx89/f +39t8Xnbv9e3lbWdzcX7n7Xzv7XNpZ2ZkXl5k7exvbWdYZN3a4eLw89/a3+Lk+P3u8WpfZmNg +Z19ebOzk3+Dk3NvleU5BSFvrz83mZWhaVv/X29vZelxaWmLl2Nrf9WFbaPnl19PY4W5WUU9i +3tbZ715ZY29s++Hf3t/oe29dWGtvXmd6fPjq7Xb/6d/Y09/072lNRUlPdszG0m5WTlT26OTU +0dnnb1ZRa9fNztpnUVBYbenc3eduXVVXd+na199+ZmRbXG3kz8zXblVRU2Xu7n35dnnl3uTf +19re4PlaRzs8Se/EvcToVEpNd9rX2tXW6l5PSk540svN4FxTWHLj29rd3/BcTU1a6NHN319X +WFxmdvfk09Dde1VMUF3739nc4ub7dHL03tjV2GZBO0JT3cG+zW9TTUxad+jVzM7fZU9LU3fX +zdHjbV1Yaunf3d3m92RVVFr13N/l+GpeWVte+dvV0N13WUxOXvfd0dDS1+V3aXbo3Nvi/l5P +TlFSWPnY1uR1V01QYe3f3Njc5vVyYV302tLV3/1eXF9w7+Pf4elvXFVd6uDZ2u5gVV5u+NzU +2eLvdltSUVhs39nkdGVhZHjq6e3weHfv53lXWGP46vPy+/fx5N/vbGzr6PLuemdy6dzc5O18 +cHl1bWRi/u30cWdeZnh1bmBfbO7o6v5t/npv//v759zV1+J0X15pffLr7vb8fXd0bWz25eHo +/nZuZ3jo+mJfb3ZzY2Fs+eXc3u1tZWZr8ujq8HdrbmZfb/Pk3t7tcWpx7+Tn7/f88fZ3bG55 ++/v2/2xqaGlubW10eP7x8PVzaWZt9+73+O/p5ufk6Ozp6PJ5ZVhVZuXvYF3p1tvmc1JGSW7a +1978X1/02tve5Ojj5OXq9vv08Gtpb1xVXGxu9N7jem75fGZjfung3+prWVtgb//48/l/fHdw +d+vh6O/5cm/29Gdifejt9W9daOjVzdHtVkxSYfri5e/27+bh5ebp5efqb15191FJWGhm9Nfd +e2x+dV5t5ubr+2VXWHDu5dzV3fF2Xl565N7jeVRZ2MTOT0pu39jU7Vlk3N5mTUhY08TOaUtI +XtPJzupqavPqbFRNT3Tb+2nw4Ot8e1pQ8tDd5/BcWPDe7+fh/Gz8/GJhVkzpxsjXbVpf89ze +7PHd2eBYPz5exr/LZ0hN8dPT09ZfOTZKYMu5wHVMS0xm19rMydpPRkxezr/D21tJS1/k6U5O +yc176mN5y81v89n4/fxMP0JO4MbM6fzq6eza6UM3P2+/uctiTVJXcNri287cZVpQTd7J2Nn8 +UE5cWFlPaM3LyNX05+x+593v0cvc70A2RuTEwupp73pfWk02N+PExMR4T1lXTGPPz8vK41Na +7d3p4snW2mtHR0o+WM/JvcbjW1FZ1srP1eZ1Z31YS09Sb8vK2d9KLipE2s+0u87TTjg9Zc27 +usjgaU1EWMS97tDRQ0c5ONTQ58TEystsP1HcyLvNZHNYWGH82dl36NtHLCM2wMa5vc7Bzz0x +QGC+r7vReEtER1rCs81HSENFR0/PurjC2VxLTV/jyby6wmpLWUlLa2lqQzIsL0zYvbS5v89U +PDpBXMm7vMTMZ0FHTV7g3s3J3nNeXdzIx8TOd2l5/OHHyXjrxc86MjorKjtL2K6uu7vQPDc6 +OE3DvLu4x15LPzpL3d3aztLRzvNu2dzYz97fzsfGy9Tex79UMDArIipC67ysrK+xzT44NTVI +18q+tr3U/EQ6QUBDbd3Pwb/Jyczh5+rozsTFyM3Nv7rcMy0lHic4PtCuqqinuUw8Mi44R07N +s7Czt89HPjw6QU9a1b26vMHaaP3qfuvNx8jJycbHbTssIR8oMkrBsa6qqbC/8jovMzg8Tv3a +v7W3u8DYUUpFPkVW+Mq7ur3F2fPRwsLK035OQTo3LioqLjlbyL24tLO1trnLXEU5NDlASVvk +zb61trvF709JR0xTWFZl2sm9tbS4vMHcSjw2LSclKC9Fzby3s7S2t7i8ws1ePDQvLjRAWdu/ +uLWytbzE1GNOST8+RE/wxrq2tLS4wNhMNCkiHyEnNmC+r6ytr7GztLS60k03LCkpLDVNzrqv +ra6vtbzC0mBHOzU1PE/Qu7Kvs7nMTDUsJiQnLDVK28C3sa+urq6wtL7sQjIrKSksNEffvrOt +ra6wtr3L7U4+OTk+Te7Lv77CzG1BNy8uLzM4RVzmy7+9ubOwr7O7z1E7Mi4vMjpHZtXDu7e1 +tLW3vcjjU0dDQklWa+HP1vlgSz45NjU3Oj5GU/DMvreyr6+zuspaPzg0Njo/Rk9q3szCvLi2 +trrC2V9QTE9UW2nw6OzxblJEPjk0MzM3P072yru0sK+xtrzKfUxAOzk6PD5CSVXkyb23tra3 +vMTN7VlNSkpRZOLR09p5SDw2Ly4wMjlGXc+8sq2srbG6yGtGPjw6Ozs7PUFQ6cW6tbK0t7q9 +x9pkUEtHSFB13uv3XD84NjIxNTY5RWXMuK6srK20v9NaQDs3NDQ4PEdr1sa7trOws7m+zfBb +Uk1NU1db4t5qXUU3NDIvMDQ1Pm3DtKyrrK2vusd/PzUxLi40OkBkzL60r6+vsrnB1F1LSEdJ +Tljt0dfyXEY5NjMvLzQ4RuXGua+trKyvu8phPTcyLS0yOEbqxrqwr6+usrvF31RNS0hNVnPS +31plUjs3NC0uMzU/fs6+sK6vra+7wttIOzcvLjQ5Qm/NvLCtr6+yvMPcWE1JSExYcs7QbPNf +OjIzLi0wLzde1sq2r66tr7q+yVpAOTQyNDc9WNLAtq+ura+0vMjdYE1HRUVFSlVSV1xDOz0/ +PTs8P1Bs/NnLyMXJ0M/O0NPT1NXSz8/Q1NzsfV9ZWFheZGRod+zf2t7m7PT2bmtu+Obd2uTt +e2BVTEdFRENCQUNIUGvo3NPNycTExsbIzdXe/W5ybXzv5trSz87P1dvocmhkWVhdWlhbVk1L +SkdFREhNT1Vieenc1tHOz9PQzs/P0tzq7nhsa3Ps39fV0M3Nzs7W6ntfV1dSTUxPUlhfXFxX +VVdWU1RaYGdteu3b2dvb2tfU1djh9HVvcnT38PXu3NjZ2dve8X91bGpjX19fZG344u3u9Phr +Xl1hbGhtfX1ua2dmYV9mamxpaV5ZXGFjaf3v5tzY1dPU1dTW3OPp7urq6erp7/t5al9aXl1b +WVhZW19hZGl19+7m5ufg3+v0+/52dHhwcG5x/nVpZGRnbvbx/PPu6+Li3tzh5eb2+Ptpan35 +eH79fXl0fPft5uXvc3dwZmZlZ2Rrb2ts+vtvcXV5fH19c3F2+u7r6uTt6u55cm9ycHhtdHn0 +7O/t497c2NbZ4vtnXVxfXl5gY2x5+vl9dv57aWVpa33o4fJ/8O37cHJrbXr3fGhocG5naX3u +6ePh5OPd2tzj7vz7/mtkaHZ4/fZwbmRpa2NrcXJoZ213d3X//f18fX/zfXfp4ux1e/tub/Dm +5+7r4t3n7erz/3xxaWdnanX8fHv2dXF2dHd8eWlzc2/w73Zwffz/eH5+dXtxbHNpY3B7fu3n +5OXf3uno4ebt7PZyZ2VdWmZqbHX+cv7s6+/+//37bGl97/v07e369PxzcmlmdfRwbX7t5eLo +7/R8dv3+am19b2dvbm169u3p9HF1/nFrbv/3+/bt8fZ4ffHs6ejvd3J0Zl9u7Ojv6+Hl6O94 +dGxue3dtbWRhZ2hmbH5tc/34+fzs7+rp6t/m7+jq+Xv9+H32f318bGxnY19kb3jr7u/t+nt0 +dW52+3h5bm9vdXt+8O/t9Pb3fXn0/vfn6efp9nn+7/b+eW9nbm9la2xxe/bw8O/y9HNqaXb7 +f3N9cmlsXm9tbXBWXMbjYdrT6+rf5Nn1a3P2ePJubntsbGJqZWprcnp0e+9++/zzc2dpe3Bt +eGFc0dB6X9LieG/nzfJXS8/bS0bCvz9YzUxI+1La11zRzO/edXfO307k3FNbaflndWvubFJZ +ZmNUXVVgc2dhec/W2tbL2t7P083QztHLysXLztB5PzU4Ny4qMT4/Qnu+uby8s7TB4N3TUDxH +cVpLYci/wryvrbK0rq3FRkouIB4eHB8mKEW9s6qfn6Kmrb1KMjIuJi09SlHMtKyrraalrK+w +t9ZDMCIeHxscJi441rSsoqOnpqzOSTosIyctL0XLtq+sqaiqsK+wt76+vd1IPCkiJx8cKDEs +Qr23rKmrqavVVlowJSw5M0HAsrGvrKmtu7awvL+1tsBIRUwjHSceGikuLeW4uKWjrqer2l5Q +Kyo1MTnzw7ivsa2tuLu1ury0t7rESDw3IB8pHRw0NS/Isbaopa2rtGz5RiktOzI61MS9s7Cu +sbu2tsC9s7/HvkE9ViUeNCoZLfkrQK20taisrrBmW+0tK0g5MnbD0L2xsre8t7rOx7q+yLq4 +bExxLiEvKBwrPys9uMK9rK2xtcPH7Dk4RTo5Xc/ZzLy8ysy+xcy8ury2s7S20PLdLSQ1Jhos +NiE6t2/Mpq67rLPX5VE9Pjo7VE5Iz9BhxrvGvK+0s66ws6+14mXsKiEwJBoqOSM5s+HeparK +r6z+W81DMz5ANz5SV3TOvbq5sq+zsq+2uri+zfREOy4mKyYjKjUzPMrHyrSuubyxv/7TXTs/ +RTk9V0xkzsy+t7azr7W2uMzc5EtFXEo8T0o0PD8wMkA7PG3je8W7xcW8xd7R6UtMUkVCWmRu +0MXDwsHFxs/ZzdTdy8nTycXW4fhTQDw5NDQ3OTxDS1Rq8tbLy8K+wsXJ3GtaSkJEREladdXF +vLq4tbm8vcTa4PpZVl9lVE9OPzs5NzQ1Oj1GV9/Nxb28wcTMfE1JRD4/SFt/1b+8vLe0t7m6 +vsfN4GJYT0hGRkRJT05MSUVCRklGS1JPU15jYXbi2NTRzdXg4Ox4eN/b08jCwsDCysvM1+lt +VFBPS05UUVNnffPVz91vXVBGQkE+PkRMTFNt997OycrMysvU4+3t797c1tPX1tbZ4Nzf6+fu +b2rv6/jj5O7q6n5ua11PSUhLS0ZHSUhMWFtYa/Hv2MzN1tLT2tnV2dze4t/m5tzW1tTV3t3d +6H13dmxveWpsem5oZmVhaGxraV1ZWFlVU1NQUVNWWVxibHV56N3g2NTV1dDP087N09ra2Nvf +49/f4t/nb2NhWFVaV1lha2JcX15fZWFeXl9iZ19bWVxgav3t6+3x7uXe3NrY1NXV0tnb3+9d +W9DI4kpH3MXUXmFtZ1RWbl5LTFlcYGNjZv3k4u309/zr29fa3e3v6fD6e3n89X138ebafmL3 +eWdfYl1lW1pjaXRzZGh+9N/o/ujc2eTo3PN76fNw+2xjYlhf8eLq5+nj4Onf3fVtdWdYWVhU +VV9cXuTjeu7X4Hne0+5e4t9aVXb/X1pm4tzd59ra6nr40tx55/hu7HRfWlVpa1tcYWJvaGTs +7G9t3eN6aWb7b3Vu7uD1evLW3m7a4HP97Hjt2vblf2l77u1ubnFxff1zZFpdd2ZeaGdfdnd7 +6v33cnJ9e3VxbG7r5uPj19jd3OHg7m/1+F1ZZ2Jca2NcZm9hbuz0/ObrfPPt5vh1eW1v/vzv +5+377eZ+ffD9eXfq+XJz/GNjY2Bma25iZn9yeO7q5OTt+PPw/Hp2/Hl743724ufu6+Pwdmps +ZFl8aWhqZHl6+fx8evn5+3Z48u/3a/1xfeHdbWjmbE5Y1PFb7NHmeepv1uZcbc7eU2nqY2Ne +WtB7at7UaFX/bW1kWlxtXFXf2+rt3dvpbml9YGRtbl9k1dd55s7N2O7m0dR758jOb/XOzX5C +MC05PC80X8TAwb+7tbt9TFteSD5D3L/K1sO6wdjjyb3C18+8vsbJwsozHBolKB0jdqqmqaqj +oLQ6Lzs3KCg31rGvs66quVZNV05MWuzBt7u8tbK6vbVlKSMXEh4pJz+hm5+gprLWOR8eLjo6 +7aukpae561M4LC9Abci1raussb7CxXNIT149LiEXHjQvML+fnqWuuslDJx8s78G6sKiltUoz +LzIzNEm2q7C0tbW7z11cbF7/yLm/3EgdEB06LS6vmpmfuExIMB4ePK+oqqywuv8nHShGe860 +qaSr00pm3W5e79PAvL28u8BKHg8UNU03u5qVmq0xJSojHjCvoaCltmU5LCQkMsutqaqtts4+ +Mj3qx8jDvLq+wr++2zYmFhEnx2XJnZeerEEgIi4uNLmkp6iwSDAxKyo+zrmrqbXJaUI+WOTy +2cnYbuPQyLu0uuM5HhIaZL6/pZyfqLwpHCMtME6yq6agrz4uLSktSceyqKm8XktAPkA+TMm7 +wczNyr+6ur29y0QkFhw6Tl22qqqork4tLi4vTry9u7C938z2PkzPz3tPPj5hy87Nw8XIwdRR +T1JY3sm8ta2pyigZGCM33rm3squpsdg7Kyk0Ys3JznTzuay030E5Qn1PODpcwbOtsL/VWUZI +S0hR3L+vqquz6yobGx4jO8O7s6qloqW7NiknJi5ASlu/sKymprXYRi8sLS42VsW1raqstM1G +NTA2PmjJwLqwrLHZLyEeHyc1TMuyqqWlqrHESS0lJCgyT8u1q6mrra+/WzwwLC41OkjRubG0 +v87Sy8TNUzw4OUXewb+/y11EOy4qLDFB1LarpKOosuc2KygnLDz2vrOxs7a6vcDNUzguLC46 +UtTAure6xN1WUV5y5NPNyb+9zV4/My80OEBSYPzf2cu9tbCzvNpIODAvNj9dzsK9u7u/x83Y +Z0k9ODpGX+ba2NnPxr+/xtDtZHXOv77NTjctKCkvP3fGvLq5t7S0u85TPDQyNz1LetTMxsC/ +vbzB1HROPz5CRUtYZHfayb64tri8wc77V0U6My4rLTM+Xs/Auraxr7G5xulKOjIuLjI7Td2/ +ta6srbPAZz84NDM3O0j7yLq0tLe9w8jQ2+B3TD01Ly4vLzE3PlbCrqeio6q56j0vKygpLThP +y7SqqKmuu9hNPjc0MzQ4RG3Lu7a3uLi7wcnMz99aPzEpJygrMTxL2bmspqKlrLjWQzQtJyUn +LT7TuK2pqKqss8ZQNy0rLjM7TebEt6+usLe9xtXe4Fo/MSgmKSsvOUbvu6ympKetucdfOy4o +JCcwP+S7saunp6uzzEw9NzIxMzQ9XM+/uLW1tLe9yNd4UUM4KyQoLS86RlTEramnp6y2u8pE +LyklKDJBVc25sauorLa/4ks+NzI0OkRUedXGu7e3ub2+xdT0UkA2KSUsLiw2RF64qaqrq660 +uM08Li0qKzU5PtG3sq2ssLS4ylpGPTg4OzxAYdnOw728t7K3wMzvVEo0JScwKyg1PUa9rbGt +pqqusMBNPj84LzA2OkbszMq+tbW5wM7Y22xLPz1HU0xIVfHZ1s/Mz9TT0dPcbV1v+WJPSklM +T05NTFFcX19gYmrv393e2s3Hx8zMztDP1fhhX1RPUlRdbW7x2MvGx83a531lYFtXXGFpXVVQ +TUlISUpNUF795+Dl6vtvYW7z7NzSzc3JxsnIydTqa1xWWWVrbvTq6d7Z2uDi3+toWltkc2Rc +VU1NUU5JS05VW2Ro+t7f8HBiWmHx3dXPy8fDwcPH0OZvXFxWT1JXYXbq5OLa1dPT2eLr83Zv +Y1hPTEdHRENHTVNj7OHb1Nff8GlcW2Nt+t7RzcnGxsvO1eV5Y1xaVFVbaW1s9ODc2Njn7uHh +5OLvY2VmVkxLSkhJTlVZbefc3N/mfHFmXF5dXmT74dnPzcvLzc/V3unl7vn0+Xx6fv57eX76 +8+99f+be3uf7aFdNSUZDREZFSVJhbvTp5t3d3uTj3tva2tXPzM7U3t7f4N7b3Obj4ePi4e1/ +dG1rZWFeX21vZ2ZhWE9LSkZFSkxOWnf36d/Y09HV2d3f4N/d4OHj5ubo+Pbv+O7c1dra2NjX +2N7o5fh0c3Z4/O78YVNSTUVBRENBRkpNVm7u2tDNzczLzc/S2N3f7nhmYl9haX3o39/Z1tXR +09PU19zf4+bv/O/6b2ZYTkpGQD4/P0JJTldp79zQzczLzdHV1t7s7f1wZmz4+n3s39vW0M7N +0tLQ0tfa3eHub2xrYltTS0VISEVEQUJGSk9dbPnc08/NzM3Ozs/X3uj6amp3bWZu9ubj3Nvd +29TO0NLV1tTW2uXs7/ptX1RIRUdFPjw+QkZMWGZq5tTNy8nJzc7P1eN+YlxfYFlbe97Tzc3T +087O0+Dq5eLf39nZ39XacVdHOTQ7Pjg6R1b+zsXDwbu7x9ToXVVQRkBETEdO5+XPwsXDvr/G +z+FsWlZSXO3YzcW/v8fO1mBHOi8lKD8uK2W7uriyq6qzf1DqSjAuOlJXWNy5tL3JxcLsRUta +T0hL9cvS7trAxN3bxcXY1eDn+klLQC0kO1UmNry+yb6xrLJtTcNXLjNHYEVHx6273rS0z1hN +WGI/O9bMUXnGyNLi2cnhZM7Hzvx74G1AMCovRigqxsN7vKqrssXWwU4tNUI6N0rFuLq/sK7N +9ttgPTxKTVFb3cLL4MjG5Ove4t520sLnauDxOiUy+SQly8hIwKytrb/ItVwuOUYwLknOy8O2 +rrHBysVpPT5HPT1U79DSyrzJ0MTJ29rN5drVZeP4TDQpPTohMstJR7Ovta64ubxHPkg2MDxB +WsvNubK8u7zT5HZJRkVET05O1s/jx73IzMnFx9Hg0dxMe1AtKz4yITnnOle3srSvsLK8alxH +NTY7P0Jp0My9u7u+w8nlZmZPSEZOXU9b6tfNycS/vMTJv85s6GtCMSw/Lx49VS5Us8S8qrGy +uMbJRTpCODU7T1Rfy8S9vry6xMPN2eNmVUtNS09ja/bbyMDDwb7NycpKPjM0MiAvOyk6x9DW +rK20rbK4zn18Pj09PUVDVVXpztLIwLzMv7zX0t1lV09KTlRa6+DLw9O+wW3AUzJLRCMvVScw +cExMwLW+ubG3x7+9euzdaV5MbFJCVlJEXttf0cLVxb/DytDN4F9uelBsfljv33nl2mNJQ2gz +L2szNXVVRuvH8dfFxMzNucjZu8jfy9BdW3tJR1hKTnnq6t3Jy97KyePY0Hb+3O9jbHhYYmFo +Wk9VR0tMREtLTU1SWU1dX1t66uDXycPBvry/xcXR3e33YlpuWVdpX1Rr6mR91d/p3NPgfO9+ +WVdPT1NLT15QXXxgb957a3ReVk1UT0xZXWjc1M3IyMXEycnIy87P7Wl1V11bU1RUYGNjb+Tb +3OHb73n/bVpUV1BYY1xedfbg7fzwdW1aXFVOWFVjYmn189rf2NLPz8zP0Nja3+59bnJmcHN7 +/+nl7+fb4W3sa1ZWXFpSXG9jYvrre+3h7fh6YV9VVlNTWVZbWGhp6ebX2dbO09LV2N/h7n1r +dGh38+3k7ODc3+Lg3eJvbn5fWmxcVVtfWldbXVleZV1eem909e58cPvr7ezd4+na4+Pg7OPr +7vB+b2Fkb/fp8O7x5Nvk5uj7+G5iaWRnant0b2x4e31tbGt8fXD9aGlvZmVsduz0e+Xu7/fv +92l+evj/7OTr697i7+tzb3J8fevs5OHj4eju7Pb37XNfX2NgYm9nXWNhaWFqamz9b3556+j6 +7eXu6+Xv9Hz44ex7a/j27Obo3+rr5+pu83JzaG5zeHBt9276+vDy73vxfn5ud2plXV1aX2du +eXx7eOfq/Hnv7/D49+fu3+Lk6+rw+Pd99mlfb3b44u3+cG74/vp3b2FqZGVzbX717vDm6Xb1 +bmxpcXHy7Hz7fP5hbWr8bmltZXZu6+/o8+/x8Ojm7P7ye3xx9n17d2H5fvXw8Ofn5vLz8v9r +Zm9tbGhqeXF7d3v+7efk2+Tx6/lvamNeVlRcUk5RVldefOjg3NbWz87OzM3U2ODq5GpiZ1xc +XVtcX2Z97Onk3tnX3d/g4unq5VpQ9EY+UT89SUpHUWlxd9/MyMy/vMfEw83T1uFcWGZLSVVS +S1n6WmvU1tbOytDWzdbp4t/scnZmSERWQjQ+Sjc6WlRG4sHRyLW4v7m4xc3K1GZNT0o9PkVB +P01UWf7az8nFwsDAxcfL1evr9WV09l5id0I9bz4tPlAwMOz1PfO5xs+4tMC9ucTNzeFgX08+ +RFNDR1tXXt/V18nDx8fI1Ojf52NqcGD83OXq50o/dEcuNUU5MEN3Xd3Fw7u0ub+2ttXo0HxJ +R0pCQ0I+TfBxfsi/xcK9w8jM33JzXU1TX1/93eHezOU/SWc4Ljg8OD1MTuO/wsK2sr3Fwc3n +6lxGQ0dEQ0tNVtzOzsC5u76+xc7X9lpOTExNVlzwzsrNy85hPz08MC0wMzZCVGDPuLe3sLC2 +ur7RemRNPzw8PT1CS3LMxL+6t7m9wNF9YE5IRkRHVP3czcK/wMbPYkQ4MzAsLC82QmfTw7au +rq+wt7/K50o8Ojc2ODtAVtPAu7i0sbS7ws9tS0M9Oz1FT3nPyb+5u7/I2Vk+Ni4qLCwtNUFg +ybexrqysr7fC4U5AOjY2NzpJZNvAt7OwsLa+yudRQz06PEBHT/nNwcLDvb7I2ldGPTYwLzAx +MzxJX9G/ubW0tbvC0PdZTURAS09f2MrDvbu8vcPP32xRTkpGRkxXW2Xr2dLP1N/v+2pbWlBL +UVZVRj1AQj9BSFHu0s7LxsbFydTa1d1tb+Pl29fUyMTIy83S5f5dVVZST01QWWN9dvLZ0dZ+ +bvBWR0tNW2lt29TY3nlOREI9OTk8SGXt28e/v7/AwsHGzdDP09rV2uPe6vbg2NXW9VdTV09K +XO906Hxb91RAQkhMZPBt087T0+/yXjw1NDM6Rk/bu7m6uLrAyNHa1szO08rJ0t3ua1Zf5X9j +83Nk519PamtQSlBJREtJZN3u+tHH2O5ra+ZPNzM6PT1EacC1uL6/v8vpdefT0NDMyMnK0vDr +0NxfWVlWW0hH69PZZk1NUkw8Qlrn2mnly8nORC8/Xjw9b8/IzHzpxdBa48jMyMPNy8Xk/MzM +09PwYmpNR13X1/b038/dTkhNTEVBVN/o1c/pXzoqMEE8Ssq6tbnN3N9YQ0pf0cbSx73I1dDM +zs/ncuHo8+fbz8x2UmxQSE1KbO5PYdlkTe7T5XxNOi4uNztSyrqztcXl42JLVW7OxNTl7PJv +/97Oxs3e3+J0XmTYwb/I1PlYRDtEVFTvzs7Yz85bTl9FNDI3NjpTyru5vcPK+0dDU+jZ08zL +1f1aV/f8W+TNz8/Y2s/N2ePZ2nNffftcZtjb2szO119NeUg7XE04OjEpbLXwzrO63VA7PG91 +Ts+6vs/Z/lv/b2nTws1g2srU1N7XyNNaUVlSV+XLw8nM22dsSkJ91kdCYUAiHMqxQsWsrrpS +KS7UXjvNrq670kdNzVVF3Lu8y+FX8nk+WbvC2exVTEtDT76zvc3tWkc+VdDKw8heRzUYGbS3 +Va2jr8U6HyrIcEGypK29YzE69kZIvrC6xls9TnBQbMTXz8hCOlrYyb7Gy8V/RUpc0bu+SmjL +NjpUKxcon7VYr7TNyy8ePq3Bz6ysu9E5JzvD1My2tMPWPDBP2dHHxc/rPzxOY8/AvsTiSk3e +09fNyMjlSEpQWW1YLRkkq7pDwa62xTojOq66Wryuu8dLKjy4uszCv8DeOS9BzcTKw8TnRTg6 +Ss+5vMPJVkJb/W7Ov7/dRz9Sb0AyPzseLai35LO/T/w8KVaut7quunZROjBetra7vdBl8zwt +UL3AxNZAPlM/OeG3s7xsQk/6XvvXzcF/OjlhwlpMcDkkJMy0ybu8wMFSLTPNu7+4ucbWWTk7 +zrm7vsnebUAxQMzAx87fVUc+PlrFusDmY1xVVF9+zsLlRujbPjxDPjYnMa+ru8DB03xELTy6 +sru+yursVDdFwre/evHsXkU2RtPIzdHjY1NJSvjGv8HbXGL372TsyONc21Q7QmpNOSYmw6y8 +wr/Az1YvLuu7urm+zsvRPTVTw7q9zXXtUDk9Te3NwcHfZE5HUGjZwLrE4t59TUdOVXXL008/ +PEs6IifOsbKwwdO/3y8uSs63rbfNxsxHOD5hwbe/1uZOPUVIQnjFxMfuR0VUT07Qu7m8zWNV +TUpdeNjAz0o/SjgkJkfSt624v7nFPzY2OGi8u8G+uMDSaUpOXW5famhgz8bcW1VealRISmXQ +z8/LycfO719cVFv282zp6FpKQTQsMT5T1MfFvrm6v8vxT09i+2Fl6OHMwMPM1d59Xl1kcWxP +R01aWVVx2M3P7l1YWlNQWF/tz9Di+e3x8+Hf3dfzV1ZXUl3ve2l3aV1cUlV9397pc37d2N79 +bfv65dXRz9v/a21uX2Pw19T1aG5vZ2d9fXLg5lpOTVBc797j2t9uY2FaWm/o59zZ539eVlZc +df/u393a3eP7b3Jv79/W2fV1aF1ZXHPf2d/s7nFbXWl1693f5/JpWFNceu7i3+r3bFtWVmTz +4d/l4X9cV1hcY2l169fP2Nzkemp67Ojl4ufweXR49eju73xyaFtZXm3u6/JuZmddWWB069nX +3ud8X1xkannj4eXe52ZaXWZocHd349fd4eTqd2dhYGptffH5Z2vx7e/zd37q7n1vbu/f5Ptu +cnlpYGRs/OXg6+75cW1tZGRudHn57/R7bG1sYl9kbvHm4Nve6v5wbW12++rj6e/r+mhjZ255 +7+v5ff7z8W927OxxZ2px+evu8Xtvef50ZWZzd3717u3s73pfYWp68+ze3fbj5WVjWmN85uf0 +9O3u+WZgdHh7+f9ueejh6vbr6e35aWVqevXt9Pzv4/FlXWR6YWPc2ezx6OZ6XVVdZ27v5ezx +7PBya256+X11dunq+/Pn6fLu/25oZWpucXDt5n3/7OLl5+Xvfnttand8bnP19urm3Nvo2tX2 +UEZERkNDSlTwz8zJxMHDydLvaFxNRkpPV19oaXTaz9zaz9PT3Pb86v9cauTm8+Paz8nKzM3l +VTovNzctMEFV38S7ta2tur6/6EE6NjY7Pj9cv72/uLW5v+BZUEk9NztITFPqyb++wsXFz2lY +X1xWVWrg08vX7nA6PFUvLElUQ17Bvbe0v7qxyFPt+zw4P0BHVVF8vMLzvrjdXd35UE1FTGZL +UNDM1su/wczX2s7fUtPNQ1T6NC5IOys8VkJpycu5sr68ssVsz99FRk1HS09Q6c/dy7zE5NfM +eVJXT0tJSlRteeXOysrGxcrK0Pjh01ZTb0Q0N0gvLEdGPmjJxL23t7S5yL/LUU1XRj5MUk5i +/dzKyMfCxc3O1mBPV01GR05WWWPo08zKx8fK09PNXU74Ti44eCoqf0E0dsXWwLS1tLu7tM1m +2mc/QFZDQVxwdfLLxc/OxMjq9+JYSEpMR0dXaX3czsrPysHP3cXfSdZlL0BYKjFeODfw3evA +u7a0vLa1z9jNVj9JRzxDTkxQ+c3Vy8DFyMrV6WpXUkxGTVpXXena0MzJxsnPz9B0X1o7Pkov +M0I2OldlZci9u7i6tbfDvsdcT15IPEVEP0xfavDQysTFycTK3d5+VVFRUk5NXPjq4dHOz8nG +ytzpaT8+Qy8zPTQ6SE9qzcO9t7i0tb68xu/rYUQ/R0BBSlH1dtjAyMy/xNjQ2lhWVk1QVl1b +Y/L/4dfX1dTW5eBlMT/MJzK/LjPDc0W+udG5uLnAzrbTTsxwPkpzPT93UVvoy8/RvsTY1tBn +TW1TRFpqWF7m8u3P2OTc5WltXVFOSkpDREhLVlhc7+De0s3WycLNy83Y2tvq+P53/Gzz6vPW +29/b8GBnb1FTXVpaX2xcYOju7N/b7njhbVZja1VWW1ZXW2dzbmze2fXk2fLg3X7n5Gz/42n+ +2/vX2ezO2NvU4uzo+F5gV09XVVJaVlr1dmfu3+7j2ON5afxqWmtuXWlmXnDs+OzZ39/c5+/v +cmpuXlxkWVpqavTe3trY2trZ1dr4+PJhXV1bXV5odG//9P3e4nnl5313dGJZXV9fX215Znf1 +bn7i4+fv8O9nY2hmaXT1c3br6d/h4drW1dbX5unobG5pXlxcYF1dZnV5fPD3fXhuYlxmXF52 +aGJr/fXx39jc29ve4Ofr9vlybm1fXF1hZWt7ePHn7unm4uj37vhtd/tyamx57u/w7fR+dnV/ +bHD4e/R0XmNoXWN2bXT97+jv6Obu/Hb5fvp7bnp8b2xqZ21669/t+P3t4ubj4eXu8f1rZmRm +X2Nra3dwbHV4dXX9+XluenJgY2py+Pfv5+jq6ezu6evq7Pb69uvxbm/7eGlteWxrevv5bGZt +YGJub31+cXn98e717Ont7Oj3fPDv83n+eXV4c3h3//3+9Xd4fft7cnv/9HZudv9+fPr9b2lv +fXpx//b3dGlrcnl9//jt5+fz/Xr76+/x7ebo9Pf29P5+8P1sbvXte212/WlhdW1hYmZqbHB6 ++Wdsd3zm6ePe5+3w6u/17+nuYmZ4aXXp6OLnf+7ufHj79nlxZXNvYGJhd/nv8/T7ePTl6Pp1 +8/RtanN79OXtc3v9amp7//P0+vJzffb7/3X5f3VuZ2Zibnl97vX77evx6+zq5fRsa2hr9vv0 +4u/87X/8/PPt8Pf8eGpjaW94bW1mX2htcWxv8/J1bu/7bf3s7fXs6vf7++70+/B39O9v/u3t +/Pj3cl9faWr35Xdz8urj7P7l3+r7endtbW5nYWhvcWliZP3ye2/0/mp2cXF6bWbv8Gn35uzm +3+vu9Xb9+X7z5+91/OrufPLz8OP+aXB6aWRtZHFuZmxjY2R46XJv7OXzdu3t7W1x6/j49vRu +c3t47nr+6npk6uL9eGJz6/1x6+36cGR9f3B+7Pxma256dGj07Xd17Nvi7uHzanX5+HP06vP3 +dW9r+mljfW5ma+TwbXHudV58/PTsfGl/+G/p8Gxue/DwYXnr6uj4ffTx7fX56ejv5OV8/Wz5 +8HV4eWNYZ/VpZGvy7W727337b/Tdfnz0cGr1a1/29G7p/md4cGvm3m/vb25yXfnsft7S52rd +623c8Pvxamt+b3X2cmVdaW5oZXLu4/VgaOZ8ZWv67Hfl2e91bHDu+/Ls63Rr9fl7+uvv6+ru +c2/t6X/7eWFdXGl3dez6++7o7mJ89v7xfXjq7Hnp6W7h911++/l8+/FuW1vxd3zzaX7q+fjr +4vvu3uXr8nbtaWJ0/ut7Yufub2hoa3R8bfNq8t/7du/jemhzfPJ9+u/n7HHxc3XyZmlieO/m ++3R7am5gZmtuZXLj8e3sa2P8/WFg+fDf8Hr3d/j06+Dg7uDU6Ovva/PsbXn+Y2r0f2lfYWhg +ZmZldfV6bvt0YWJfZ3F7avjl5+Ls7O/m4dza5uDd7WBebVxUa2xmfPLf3ft95d59/d5xcWlg +bXB0dOLf5uPr6ffyaWN3XFdhYV5fam14+X7t8+n26dvp9v31dWpsX3b7ae3r7uTf7O3j5u5+ +72RoeXpvY25ne+HvZ+bR52vq7G5iaWFeZV3r6XJz/vVv9+j17O1s7/VkX2ZxdHL+8uff9PDq +X2LveG10enZ5fXj49Obs5d3e9n3rcGv48Xb6521x/H7t7PZpZl9dZHT1/nF9aW1oZ3pr7uLi +6uzq7PZ4b15idPNxYP3o7PT8/Pjq/fzlaHB4c2Rddnj/8Ozl3dbb7f57+mJpbGTtcWhvcnlx +ePLvZ2Xv7mh27mteU1l0X27c5Ob47dzX3fzj3HNldW5sa2ptae/wdO9q6+V4d33/bGxwZGdu +fG/p62Le3Onp6N/uZ2BweGtkcvT9aG/u7vLobXj5X3h9Y314b/j9bGf+6eXl5uHzffZue+1h +ae1zbX38cvp5cnluZmfvcWPo6Xnv7Ovk5nR96OV/anJ8al70em3g83Hqa2dqYv13+PN58H32 +82zt+21s+/ZuePHm7/L98PJvdP/s82n/7/50/+Ld7/vyZ1xfX21vZWv78PDo5N/oefvi4vBz +em92a2Rxfmx+63P06O3idW/0bnJmZW9ncHf67e/o6+1+7+v9a25sZGx+bWTv8O7n3d/g53zs +73FeY29pbWB34e79++p4fOr073tueHJlXmxwb2hifOz07eje2+hubHdsaHBv/fFpburt9/Pl +5ex6bXthWGv09Glu9/p5eeTe4Ont9PlmW2Bsbl1fdOjs++nl6f1u8PBsZm54amJn6+x2fu/c +6fv67vNvaWBvdmlo9O7vfujh7unt3/Jr8HBfW1xdZv14b2/66+zu6uXc3fRqaWdiZGt07/xs +9O/77+Xq8eb38vlcbGltdWVibO3+e/bn4Hxx5+l4fXNte2Ffef7xaO7f6N/d2+p+aPn8XmJt +bmllavf08f578ORvef50b3ByXm38bH7f3OTj4PPseXVxdPJoXmloaHd06+b7297v8+zd/W9q +ZX5mYHDiZWBybepwbfV3bHL6a3FwbG905e3u3eDo9HX45fP5dWp5Z2zs+ft5aW1tfO7pd/rj +4m9eXmDs6nX27fzt5+5vY2ZsYl1t7+3r6Ontc23+/XX7efLvZXHsamBqdfp8/vnr53H37Plt +bOHoZmn97u/0b2Xy6vJ79vXu9Wh1bWBhdO33aXLc4Xfl63N7XV/q82507etjWnHyd//97enx +duvnfnb692x0bmr8aGr9f+rn7fDd4mVgcP5ue/ny6XZv+ejub3L+cmty9Gtm9uz1amj15uz+ +8u3x7/B1bWpnam5zafp1Z//4cm51d+7m6u/37Ozu9W9q+evy5uLu6uTl+v5uZHj6aWp+Z2vy +fl9eX2Bwc2N45/d1dnT24+/r5d7i7eP28//86ezg6HJubG1tbXhuav99939vb3L6cWl77vZt +8Ot4cXf5/3jy7ON9XmX17W9vffL/eO7v7ufq5uT3fHR89flx+un3fnpsZmr/b2drbHh+9fN7 +cm55ffbp7vLr7n5783119n3y/Hn66OHv9XRpb3Z9d354fvz98P5tcff09vT57X50+nVtZm5v +a2dfbv326u59fvju6uvp3u7u6e7l73lvbGlqc3r8/PXy83VoanR4Z2ZpfHVvfmt68uzo9Hx9 +7uXleWvr7PX3dW5ydnj57fx3bmppZGlubW598vJ+8evy7nxvfPj3/Onwc/Ht9ft3e/Tx/nn8 +9O3yent4a2hsb2lrbG9ubnh4bnj4+/Ln7vv97d/h6/n49WppdXRtb3FubnH99+/v9/n+/nBw +//r7+fN/dv56dfjs5/B8+unn5urz8vj6+v1rY2ZoYltfb2ZpfPn2e/rx9fl7c3duc/Py7+jn +7u3r6Ort5+Pk7n9rZ2xmZmdreu/u9vjr4+14bm/16Oz2+3dobHN+e3V0a2Vqd3597enu9fp8 +b3N4+n5ubHT6dm1rbvjv6+/y9O/x6+js7O/v+H7x9Hv+en17fHh8fHZ4d2Vjb/fzeW9ue31z +bW1ta3T7dn3+eXj/6OLh5Onn6PX97+vx+nxrX19ka2lpamz9+fr0/Xzx5+r3d/nx8+zv+3p4 +enh+fvbz/PL07fp0a2tpY2ViX19fYmp1e/Pp7/717u/j5ejs7Ojt+vPo6Oz69+jm7Pp8dGdj +Y19dYmVjYmZse/T+ffx7/vPq8nZ1+fDt7PDu8P1/f3t9fnhtdHp2eXhrbXR4fHd/fnrt6ezv +6unv+ft+e/748fh1cXH9/3l+amJpbHRqZmt18fV//fr2/ff49O/z8Pd6endxb3jy8PTw7vz3 +9nx6fvPn9XVqanZ0fPj4fvju/mxnbHd1b3n78/p4d/Xz+PF8bHj9dXZ5fvX3dG1x9H366PT4 ++vTucWhsbWxrbf3x+/vq6Onq+Hx3b3f++fp3dXNscvbr7/rw8fT++Xttc3p2bWpjZmdkb/36 ++O/r7O3o4OTr7e/0dHN9fnRubmRlb3l+eXJ7+e/x/nxydPn0/vvv7ezwfHz47vRyb/1tanN5 +enr29H1ub/f5fH56cnN2cHV4/u3q8uzl7H379v5xbF9dX2Fvev939uXf5OLf5ut/b2ttbWhq +aG14/Xdod/7/8vX87ur2dmhs//bxdWp49n13bm9wd/Xm6Ozn6fp89fTx+XVqaWRjaW1vc35/ +8/Ds6ux3bvv9+3x2a2pydG50e+/o8v3z8O5+b3FsbX71b21yefxvcvry+nvw8fDn5+389u7s +8nxtbP5vcPf1dm9vdHP77/p/cnp+bW1tbndtb3t7ePP5fHZt8/L/+PTs7PX5/H/05uj3/flt +aGlp/PTwfnF4dH3wfnR7/PR6bG7w6fj67ejr6OXweXB5cmt3bWNdXF9leHhvc3b36vL2+vbm +5OXq6u/x9f3z8/r89vf37ufs+XtzeGtod/32fm1sYl9we3FxdHV8fvv18+ro6e35+n78eX3v +6u3ye3l3fPf07fj9/WxlaHZza291e2xrefj28u3v+Xt8+/fy5uLd3OLw+u3+fP15dHB6bmp+ +/vxtbG5teGpkYF9oa3Bva3r19/Dr6N/c3uTo6ejk4+Pq6ex5b2tqZF9fX19gbG9qbHfw7/D7 +8+97+uzn6/Lu8PT2+vx5bnrv7vn98O3u7Pz+ev12bGddXWFeXmVr+/Hj3uTvc33x7OLg5Ort +6/B+f313+u37fHb96Ofs+XdvaFpQU11kaGJhaHLx5OHs6N7f7PX4fu/q6+zr5unt8PPq6ep3 +bHBtaWlnYWdz9/R2bmx1cXhvb/15/3dsZm/t8PXt7fH+b213bnH6+fXv6fD9f+/s9/j17ev2 +9u7q6uzm3+TzemhfX19dW1dTWV5k/erk6ejufnFudPHu69/j8Hp2b2xtcfr2/Ozi3t/f4Ojm +5urm6fPu8XdpWUk+O0Fb387LzdPdd1JOUF/czs/X3ev27/fv5uft7/P79Pr06ez0dF1SUE9T +YHTr4+d6Zl9hbuzd29ra3uj6ffHl5+zramJq7uN9XlRWXWh3c2NleW9hXV9y//zq5ufj3N/t +8P3t3drc4uDe49vY3eXr8Hh98/lnTj42MzpO1r6+w8ziXk1KSlzXxsDI315bYnLj4vHv7u9/ +cGx56OLs/2xbYXb57fp+6+bxcGJmfePZ2+P58enh5O33SDAvOkrJuLrDz2FMU0lN4Mi/v85d +SkxOat3b2OB8YGVvfdvLxsncWUxSYOXR0dnj5vNgWllvfVtfXU86LjU/3rm1u81pSU9aTFnn +zb67xv1YWmfk8Hb6dG7y6vDf3NrU2mZNS0ti19HP0tPY62xYXuLc72dXam05LC83+7azvtRk +Um5rSUlc1Lq2vulSTVJt+nhuZ3zZ1Nrb1dLQ21tLSVXfzcvP3et7bVtZeebV2l5NVlY4LCw1 +6bOvuNBVS19jR0NUybOvu+JNR1Xo2OPw6uXb8GJt5szF0Fg/PUh719DQ293T31pUd9bCvtVO +SFpONSsrNdy0sLzWXVdyTTw8Vb6urrtlQkFY3dba6OjOx9dbTmXLw9VbR0ZU7d3s8OjY12dN +SlPYv7vDYkdHVTolLDjZrKu012JDP0w5P9G6r6+/Uz09QfjK1etmatXH0N7T0NPgUUVLWujP +z83O0dPfblxr2svTSiwgJjrLrKyyx1w7Mzk/a8O8usPsUUhR3L+7yHlNTGD/7dzMwr/E3Ew9 +O0vTvbvMXUhIVWJ94M6/wMn9SENGXz0jKDBMrKisx0c0MlFJTMy9raq3WzUyPNi6wtNfTeLG +ydlmXdvF100+P3K9u8hiRE7cysrR3NHZTzQkHyxXsaesvlJCOTpCPVXAtK66Zjw/9sS5xFxM +U+vL2U9O1725w1Q5NULXwMTuV13h0PFTTl7IvL7KV01NVzkgJC1Oq6WqwFg6NEk/Q866rKm2 +UzIyPtm8x9v1bsvG5VlOXs++zkk6N1XAvcdnSVTaytDR3tHG+T0oHiY/uaWlrtlFOzdAPUrJ +ua+zzkI6RWnGxN76aF91ak9Q3MK6vnxEOj9uysTVZmHuz+FhXXzCvL3IVUY/YV8lISw0uKep +ufdJNEVCNFPJrqSqwjovMknCw8rL2sjA30s9Q3+8udNRPULn0M9vTFvNxdXbc1/Ux811Pywh +JDJtrqirt3s+MzQ4P9W4rKu210M8PUzPxMbN3fHo715g28nC1Us9PU9j897ZwsLPbEVKfMe6 +yOFaRUo6KSIqPsKqq7XJb0I7NzJBxaykp7pHMjI/2snDxsnByPVBOD7vwMHRVkdITlhXYd/F +v853W2Xnyr/Ya009MyYnNv2vqq3BWUc5Ozs+5rytq7bcPTU6U83KzdDZychrSElmzMnTXU1b +XWVYZNnKv8TWb1Re08zTaklFQi8jKTPorKmuxGw+OkA2POq3qKeveDUxOWPKxMbOycLTTTs8 +W8K6w+xMRkZMT1nfwbq+12JKU9TLzd1cRTsuIyg51a2pr8lgQDo+OUDbtquqs3I3LzdbxsDJ +zsjDymFCRmnNxMruVk9LTE9p3MrEze1STXPaztFrU0g3JycwRrKqrbnqTT1COjVRx6ylq75E +NDRB5M7M09bEwdROP03mzMjfV0lJTE1VctDDwM3vZVt+0snRWEhBNykqOF6yrK28d0g8Qjo6 +XMSuqq7GQzMxROHQyNLTx8XaS0FCYszFzOVyUkxQW+HLwL/P719dfubP3elfSD4pJS0+uq2s +tstnODc0M1G8q6itxUAzMz1zzcnIw76+2Ec/RmfNwspvT0VGT2bTxsG/zOhZT2Td09Xfb0cy +JiYvTbisrLjKXj03MTZQvKyprL9GNDM+ZMzGxsG/v9tGPD5az8HI5GRJRElQ6Me9vtFwSkhQ +ZMzDx8x8OygiKDXLramrtdQ9MC0uP8Wup6i2YzcvNUrUxb+8vL3NTT07Q3fJxNV6TEJKVe7Q +xsTK21ZGRlTbwbzD1l02JiQpN8Krpaiy7TQtLDFeu6ymq75NNC40S9nDu7q8x2pHPDpI4cTD +01A/Qkt+zcTAxc3tTkdLcMa7vsxzPSgkKC/nsaeorb8/MSssQM6xqaq03z8yMTtUzry6ub3X +Tz89RGbNx8jeUkxLU37VxsTM51ZLSV7Ow7/K00opJCUtdbWpqay6UzorKDRrtamosMxINzY7 +RF7Mu7Kxv1k7Njxb1tXW197eb05JV9e/vcZ1R0VX18bF1GpKLScpLVe8rKuuuFw+MCszT72s +qK3BXz45PEJL98S4r7jbRDk6RXHl3tbi3f9RSkt1z8XD03FbadrKyNX8Sy4oKi9Ov6+srrbv +QjEqL0q/ramtvfBFPDw8P1bPuq+0zks7O0FYe9zMzM3bWk1OYdnMytbu/XPi19LT7UQrJysx +7bqwrrG53EsxKS9Gvquorb3nRT48NzhJybOrr8dUPDo9SVJp0cvI1VdKSl/h1MvP29vX1djc +6G85KCktPsS1r7Oyu91NLSgvSLysqrDA205CODEzQsyzrLLE8khAP0BIaczFxc9tUU9ZZ+vZ +2c7Nzs3V1eQzJSgpPMCzr7Gwu8xvLygsOMmuq6+4wONVPjAvN1a8rq64xuBMPjc1PnPDvsLP +7u72Y1Zb+9e/vsnc7lAsJykrTMW1r7KywctZLywtOtm1ra6vus90QTIuNUfNtLK1u8ntSTYx +N1XQxMHL0dTff1VPZ9PCv8LNPSopKi9M0byzrrG7xks0MC84U8e4sa2vuMtNNi40PVbLvLW0 +uMB/PTEwOlXRxcPHxsviYEpNYNjHy8vePywrLTRM07y1rq22xE81LzE6T827tbCwtsZdOzAy +N0d81L23tbrOVz06PUJf3MzEv7/Hzdfp2OJNOy0oLDdPzry1trK3yH4+MjE1PlPMu7Wvr7nK +aUI7Oz0/V9K+t7W7yW9DOjk8RVXtz8fCxM3Z7/xoXFxw2s98NSwuL0Dfxby1sbe9zUc5Oz9M +79rdyr26ur7oQj0/Q0tVWXLNvLrC3F5abvLpbld308jCyfpLOC0uMThJ9MvBuLa6usLhWEA2 +LzM9T867tK6vtb/RWEA8OTo/TuvOwry+wcvtWktDPTxEVevOxsPBv77Dze9ZTTotLC0vQPPL +wbmzs7O72VNHQ0ZRTkdQe9PFwszl3NHO0HRMSE5v4+Xy9NPGv8HP6X3r3PRTQzgyNz0+RUpW +btTBvbq4vL7H80Q6NjM3QVjXv7azsbS7wtJjSkI/QEZKT2X439LT2ulzd3ru9GpnZ+3V0c7O +1N9fRDw4Njo+R1Ft18rAu7y/ytHX19Da5vhhWVJLQkBJWOjRysbEv7/F0nJaWWV0bF1VV2Jx +cGNXTE9bX1ZMRUFDT1/12c3Gv73D0OFnXWhsb/vl4tvT2eF+W1RRVVlk9+HXz87T3/1mVVJb +ZWp09fLf1tDR1dnf5HlUSEM/P0BBR1BccNrM0tXT19fOy9La3uDd4exsbHj76+zv9eXb4Hhe +WV775ePi8Xl883547urq7vX/ZllOSUdGSUlNWGfr19nk8ff7+vXx59vRycbIyc3W5/htYFhU +X27x5OLj635kXlxZXWpze+PZ2uLu8fPxeW1mW1FNTUpJTE9SWl9h/uTd2NTS09PT1tnX2Nzf +2tba5uzu+/j2fm5tc/f2b2NhWlhbXGZxd/Hd29zc4elvXFRNSUpLTVdib/nq5N/d4fP15uPk +2Nbc3Nvb3t3j7f797ujm7XxzdWx/9m1jYWp58efn6fRvY2h3dXZ1bWpmX1pSUlRWWVxdZHF2 +/ene4une2NjW1dne4uLk7Wxhcvnu6ufr7eLh5e79+O7r7+zi5ev2+nhrZltOTE1NTk5NTlFY +W2Z48ubm3Nzd293g6+ni3d3a2+Pi3d/h29vb29ze5ezpfWtnaGJgaWtsZmp3bnV9Z1pST0xK +TUxNVFtdbOrd3tnU19jV09XY3d/a3ePc5f5/ev11bnZybHL46uDf4eTh3+Dk73Zub2pfV1BO +TE1NTVBVWl9mZW346+jc2Nvg3tvZ2djc4ODj4uPvb3js9f3v6Obn5+Pu/nb+eWhtfHp8f/x6 +bmVdXlRLTE1MT1NYXGh979/b3tzV0dTU1Nvg3t3v+vt6en35+v/27+3h5fT7dmxufv17dXt7 +fvh+a2VhYmdkZWlua19bWVtaWlpZZXzn3t/l4NjT2Nvb4eLh5+fp7PHv/nh3e/3+5+t97u7x +9fd+b2dlZF9rdWhofG5namFmZ11eXV9gXl9fX2V7+uve3Nrb3Nzb293d3t/f3uTxfn14ev7+ +fHJ1c3BucnP78fZ3enxubmllaF9iYVxcX2ZiZG98a2doaW5tbG786+Pg497f3dne6u7i3t7g +5eru6ef3+/Xx8W9ta2xlYWhlZ3Fydvv7e/D9Yl9gZGNhX15ja3V1a2/1+P96+vl2/+3i4+Pm +5uDm6uXp7O/t7e7z6+Tv9vzqf25wampgZ2JkZ2Jt9/dsaWht/O3r9/zw7v5ra3Bzb2Joamhm +bnd0fnh2/e3r5+Xp6+jg4+vm6ffp4+p8/Xh99vf++uzz9fZ3ZGJtZl5dYWBjYmhyem1vbmZi +aXJrbv3v8+zi4uPk397g5urs7Ovs6+jw/Prt7vl9fHR0cW9+d2x7d2NfX2BfXltofHl+fv91 +aW1ta3bt6u/p4Nzd4ufs6fF2dHt2f3/+dG9yd3ZkX2dtb/fy/v7v5fDz4uTl7Pl6/f57aF1f +Z3V9d3Zye3x/cXFtamxvbnP18Onsevrr7Ovq8f59eH19fnf37PXt7vh9+u7r8m1qcnB4fHv7 +enR6cW7/8u/6dHV5fHByc3X6enFxa3Xv7Hl2+/P6/vd2dndzbnh4+uvvfPbs5uLn5Ojv8+32 +eHVrZmVm/f35dXju+Hhwa250c/p7aW5zdm9sfnt9+O33de3o7fp9+/X1+/n+8vZ9e21obnt+ +fnF+/mho/+z5d3p+/Hb68n/46+Pn7/Xt6/H08u97cv53aWpxcHpxaHF+enZzbm5783tsbWVi +Y3N9+fb89+nf3+fl6v15eX5xcf77/+zp5+Xy+Pv47e38bWdv/3Vv/vbu9WtscW108HhnZ2pp +anD56eXsenr69/jy6u7x7u91bHV99fn9+nRna3b9emx6+Pvw8P3//vn37vDu7/d6dnn87Ono +6P9v/u3w+nlva2NiZmx2eHBoZnN/8vR3a3D8fP3+/vnq5fDq5uv1+ezn7fV3Z2lnbnZvbHLv +5+35fnt49v91dXR9b3F8eHzw7/f2+Xxtand0dfh/dvzu7+/t9u7q7u7x+3txZ2dvcW5wc3B6 +/H188/H+fHn8f/34+nd09Pv9eXf07+z5dn/y7e/o6f15fntpZHH/eGxufXZ29/tzdndvbm1y +d292/Org4eXo7fb37uv1end1b2ZqfPj8+H979e/r9XNwanh8dvl0al9v+3tubnh4e3f0/mhy +d3r08enm4+Df6e/u8Pd3eGptd3f+8PD58u7s7f5va2hobXJyZ2RnaWVrff/6+f1++fTp8f9+ ++evo6+7r6urn8XpqZ2lqa2x7/m1ucnl9/Xz2f/zv8v737Onu+Xp+7/L6fXVxfvtzam50bnNu +ZmtzbGRmdPfy9v1wfPDo6ezo6OPm6Onm6e3v+W969HxqbnFvcW91amloZGdvd3FvaWv+6+Tk +4+3u6u3s9Hxucf/17/Ls9mxmc/T+e3t7e3Jyb2198u/88u719Plyb3f+/nx7cWp0/Pj27+76 ++PP6//z7/v5/c3V2dXN+fnZwfnxzdGxx/Ojg7Xz+/X54fvz9dW15fPLu8vfw9ezm6fN0evv+ +aGdpaXX8e29vfPb+bWFibW95/nz48ezi3uTr7vZ0/+/6bmx5//70/ndxdHJtdnd4em9lY297 +efv19Ovp5ujx8u3n+W9zfnFqdXBscXZ1bnR87+z7+fr8+Xl7+vh+c3Z0efr6fXBvbG1wc318 +e2/+e3j99Pj88u7s+nb88X//8+rz/H5vamVrbXBtfPf4fXF0d3z97u74+H3/c2xvd/rs7n35 ++PPr6vP5e25veXv59n12fPH2fP35enp3ef79/vx0bvnx9H1+fX7/dnVsaGxybW978uzu9PTv +7/P+eGpndfn4/fr08+rn8Ozv/nN1f3Jxdn5tbHnw8fr5fXdvc3Vuand9ffvv6ezv7PB9+/v+ ++vd9cW9vbnn5/XZ0enNvcX54cHv5+XxvcX379Orq8fl4ef9/9fLxfm96fnN2931tdft8/3pv +bf348u/zfXL08X787ez8cGdrd3t6/HFsfPT+cn/5/f79fH58cG/8e3vy+mxz7/L78Ons7fPv +9H3z9/H5b21udHFveHt7fvz1/3349nFqbW1wa2z7+Xv39PLt7fT5+337/HVvd+/xfHl3cHJ9 +8Pl4cf/3e3zz9X178evu7O9/fe7u8vF5a2tmYV9ocW5saWhufPf2fvHo5eft7+vq6+jq8vj8 +e2hlbXj5d3b58/dxb3x4d3t1bmtsaWlmanL87/Hr5evu+fvu6Onyfnn47ev1dnn9+X99ent9 ++/xzc21qZV9fZm5va2x2/nv07PXq397f6Ozp6/J+fXh7fm9sdHJ1+3tz+PD2fv/s6fpwbWZk +a2xnZHnv+n5zcf7zem5ud/l+fnvx6OHl8evq6+/9dWtqb3BuaGl5fvry8O/9cHF4fHd2bW93 +evj0+Pnu6+zu/vXu6+39d29nZF9ham91fPft7vP4dn369ezz+HR/7fJ5b3p7dXVuc/12b3t3 +fvbtfmz58vnv6ev28O/u6+vq8PtybGtua2RmbXRubm1rZmhlZ2Fgc/p0cvDm5d/i6Ojf3ODn +6enn5fF5/f9vdW9mZGNteG9tdnxwa3R9dnB3cGlrdvRy/fDr5/N9d/T6+u3u+m1vcnN5dO/t +6+3v6n1+8PLz7+rs7OrvfnFtbW1uY19qZ2Nud3hqampsdn7393n66OXk7e7o4uHj6fj9dHFv +bnhydXFsdfbvfW5pZmVrem1z7+7s8O7o4+Xs+HZsbG9wZWhwampsZ2lwb33v6eXk5/T+ffft +6+7x/Pp8e39tamdoaW90/v14d/Hq7Ojv9HtwdHx+/fv57n79/HZ0bHNvbnBqbnN4dHf6/e7u ++urv/O/qfXd6c2pn+ft29+vx9evr+WtjbXR7+n1//fx0e355b3Fua3r87+58fvH3+fP+eHL7 +7/Z3ev5yc2xncHv48Px3/u7s9f789H57ePzs7fB+/XJ09u52a29sbHB5ent+fPz0en31f3b6 +9Xt7cXr5+fry9/vt5uzwdnl1bW9wdmtqcfrx9vr5fW90fnx0dO/t8vl7+O/v6uvw9n7//nx/ +/ntta25sbXZ5dm54fn7/bG/08fj28fp7ePrv9fv4eGlpa3r68+rp8/x++/78++719u7q9GVk +Z29z+efw+H57dmxwd/1+fvzv7vb5ef5va25rdWxpamn47eXt/fDk5u7n6Hh5+/z+bHH07/X7 +enZzcn5zeHNqbGpvdHbz9ffs7fZ9dnr5+3x7bXrv8/l893388fh3+PF6dXd1ePn1/v7z+nhv +evp6cHJ0fPTu6vv78efk7/P7b3t1bHlpZmx0dG11+XN3eXnv7/Pp6+/3+O/z5+X6eWxy+Pv8 +aWRmaW16+3x1+3xx+Ozvent5fvnv9/16e/x3/vvw5ePrf/d99+t3bWlse3Rwc330+Pf9fXx6 +bm1ufn5scHd96N/tcnV/evR8d3tv//708+rk7f9samhqY2j77+bt7PB8//f5b2hz9Pv1eGVo +bv7xeGtz+Pf18+3o9f3k5/12eP56bGp3cWxxfXp1+ebvdnh99vHo7Xt4dXx1/v/49/5xc+rp +7/lvamlu9PNvaW55c3h++3j58vh7bu7r7/h+bG/v/Pby++zy/PdzbG9sb/Dt+HF17PV4+/38 +fHt++/3r7/11cvvw7e3/dW1mb3N7cmhycW/9+v7+d/359fP/evl49+jw7+38bWlsef367+/z +9Hj++Hz08fh3cnbw9nR98uh+ffd78Pt2/X9z7+/+d2l2b2NfanJzcmxya27u6+/4+uni7G9t +8ubq7/Pn5+He6PdubnxzaWxvZWptcXn+/HVqbGpp/3z6+vvy6u/r83zz9v/37e3s+397dXF7 +bGhsbv98e3hy9+Xg6v3y7/BtZ2995vZ19Ptqc/5+f3Vu7/h9729xePjt7eri7v5+bnLs+nj3 +bW5qYW9uavb2bG9ue/xuZ3Tu6+ns5Ofu5ef3cXl5f/Tr5vNpZ2lx7/P6fXh7enFte+7i9XFu +dG9qb3R9a3vq4+v39PPu7nJsb3X393Fmcft7bmp3eX33fnJp/Ovi6+5+ZGxu6ub59Xvz6en6 +cX/98vf8a3T6eW9ocHf/9Ppybnv76u9wbHTu8fl8enz9735pamFhbF9tcW94/379/3z36OHi +5Ojq8eHd4ebq6ul6YW93b3ZoYWFs+XJhXGBtam1sfmxz+n3s/f7+/Pzn3+jvcHrs9fR1/PNs +dPf3+Xx3+vx68Px6fHr+9+3u83V4/XR3dmlpeP18dG9rY2ZtZXnx7ubl7err+vt0ff11+/t+ +7+39+P306ntvb3t1X2JjaH7t6PTy+Onn/H5+++55fff+7/d2dHr37+9qaW9pefzv+XRtcvv4 +/2pv+fXj53T98fbv8H5v/v7q7O/8bunqd212cG5sZmxqcvLp7H1+5eTw7fVyaW725vFz+fT3 +9HhtYV9x9PljXmn+6/rv7OXm5ep5bHTw7OP0bm1p79zmcmp66/JqZW1rbvf2Z15m9/R4fG90 +9u3ufXZ09Ovp8Xno3t/5dG1s7/ZtbXB99PLv/Hl2bW56bGh0eXhwbW50d/re3uPn7fN99fp9 +dfxvcftxcf318fb37X1vbW3//nN2aGTw8Wlvdffr+e92ZvLf4O1lZ/L/8en+fPJ9++n5/nVl +/e//7HVhcWt/emhzaGP+6n1z/O7n7v3v4uXm8n3k9Gp4dv37cWt0Xl1vb2VnaFxr+O7mePjo +6uPj3ex7fXD79uTi73hwbm197fl7/HJeaXdnZnT1+P/59fz+cHr5b2j46fV8ZVxk7eHl+nzr +5uzu7/B9b3bxfnp9aXj++fFyann58vj57vz+b3Xrfvvldmpxc3z76eJ0ZW1uff5obHl+8PHv +8nXx8HBua2717vftdWlpdX3p4O7k6uv5den/duDjeWxpaGZldG1ma2r8/v/9fXdtfnl5+Xv9 +9/F/c/fm5ebr7vrp4ODuc/75/Hj3fmp1dm9t/31xbGluamFeXm/y+m9t7+3y7unq5uDo+n/y +/e/6fP57bv3p9u7we3JzbnN3/vv7/3n8+/n9e35uYmJw/PLv9uzy8+vt8u/o3+x/aWZtc3L7 +8fX5bWVjZ3H7/vn8fHz78PDt9fZ3cP71+fv8dft+e/lsa3R69+7z7+fv/fr++fbz8PLs+f9y +ePN8c3BtZmRrevv39e/y/ffz/W5tbWx2bnNtavz77Ojp8O/t+Oz4f+73/fF1ffNxe3p++f97 +/Xh2b29nbPzu4uzq7nd78H939v74eHz4/vl3bWx3+X1vb3j3em988vl8/Hv7/fDr9u/06+t4 +fXZyem76fWpxeHN/e3z493596+z18XZ0+nx8+/r//X19eX7y+HpsbHR5fv7xfmz8dWFmcnp7 +/Ojg5O3yfH359nxub212eHJ8eH1vaHzt7Xp8eG51evbm7Hp2/u/t9PN5cvTq/nJtdnxranVu +bXVvfX1qanb98Oro+nTp5/Py7/14f/Dq6PL/a2NqePHw7e3t5+b7Y1xTWGJmb/rs6vpoZV9q +euvf4Obr9HX+6drZ3drX19vk6/Ph3N3oXExISEU/OjxK3bu0t8lWPjpG37+7vtVeTExUZenc +297c62ZWT1Jv2c7M2nlVUlx72dHW2tv3YGd73dDO1OZnWVI4Kiwy76+mqLpDKygy6LOrr81E +NzU+eMG3ucHpSkJM27yztLvTWVzVwMo/HxQYKK+VkJrMHhMZL6qamqdUKSMrPc68tri7w2Q9 +LCswXa+ioq5UKyYu/q2kprL/OjZJvqut1yYPDhc7mo6QojAUFB/enpmetDopKzVa0MK8u7nO +SjIuO8CooqnPMCUqR7SmqK27y+5PJQ4OEiyYiYiQ7g4ICyGfjYuUvx4VFSFEs6iprL9bNDA4 +1a2mp7s+KixEtKOhqLxaNDElEBEXKp2MipDFEAgKG6eNiY+uHxEQHmmmnqOv6kI1OlLHta2v +wlI1PuSzqquyzzovIRAPFyefjYqOqxkMCxbGlY2PnzgaFBos16qhpa7XMisvWK2gn65IKCYz +waiiobFKJhELDxnHj4mKlT0RDA4grJeSl6w/Jx8hJjjVrJ+jskcpKEKvn5+uQycnNLafnaRf +GQwJDiqejIqPrCMTEx5Qqp6fqr1pPzMpIic+r5ycp00gHjGumZWe8iIbI+WinKNJEwoKEWOU +i4uXYRsTFynBpZ+hq7ryNygfICvZopuerT0kJj2vnpymvzkrNF7Qws0nFxYTILKckpKlQyMb +Hz3Br6mttbt2NCkmKUazpqKq1D00PcCooKKwUTAwQNbNPR4SEBg9npGQmsMmHB4vy6+tsLm8 +u8lFKSMnPLOhoKnTMCsyfKqdnaO6NissN005HBITGV+Yj4+bSB0bIjm3r7q8wbmwu1UtJCIv +2q+jpKy46URJ2LqtqrHLWjsuKxwTExYrqJOOkaE3HRoeNMy1sK+ztrTLRzgsLTdD3byvqqan +rLTLWEdFS1rR4EEkGBIRHEqhko+WpfIsISIkLEPJqqCepLhJKyYoMEvWt66sqqqrr7jHajwr +IR8hJi45P0ZJ37iqpKSrv0cuKSw39bepqK25ZjkwLTE8WMWxqqinqrPK7WJJQDcwKyMhIB8o +OeevpaOkpqy91T8tKSoxV7itqq261WdQTlNeec26uLe6wcTP+Us5LScjIyMlLTpfuqymoqKn +rbpmPjIsLDA9XMm/v728uba4v8/p6tPFxcxoRD9DXXRPOysiICYvQ9TEvbm0rqqprrjPTkVH +XW9ZRz07PlTKurSzuL/Fy87TaUxGRUlc6WlENSwqLDVDY9jT0M3JxcG8ubm6vcXT6VlHQj1A +T2rMvry9v8PGyNvraFhOaNPQ3lQ+NC4sMDpEUmzr6Oje1c3Du7e2vMrpU0U6PFjbxb6+xs9y +UGzX0snHytDa4NrU+VNHPDk6Oz5JTlVXVU9PWGjVy8fAws7mXk5MWfbOwL7AzOFx99/QysXI +yc/oW0ZFRD9CSE9f5NXQ13tYTEdISk5QT1Rb+9zT1OpuZ+/Qw8DG0ehmYPXUycbCxc3eYU5J +SE1TaPd7dGFfbeng3uVjUExMTlVaVVFQS0tZ/NTLxMbO3XZfa3fp0tHX2d93ZGludvfo4OLj +3d7U0NTV1c/X6GVZT0tMSUZEREZJUl1peGxeWVtk7tnQzMrL0+huYXLu49zW0dXhatvA2+7W +yc/LzM/N5mxZUUxFPz8+Pj9FR0pUVVxt7dzQz9ja5fr4bU1D6NN41sLHxrq7vb7Bw8bGyM7d +6N54TjsuKikqLzU7QVrLubCvr7W9y3xKOzIuMDtYz8C9urezs7i+x8nBvLi7wcv6RTsuIx4d +HSY66LeqpaKfoqq4TS0mIiAiKTXtsKagoaivvuRPQjxG+sSvq6+zvmozHxgUFRsoWq+hnJmX +m6K4OSMcGxwfLEi3o5ybn6nBTDguLTFDyq2ko6asu1MpGBIQEx02vqSbmJWWnKxNIhkYGh4s +ULmjm5qdp8g6KyUnKzfbrqKcm6GqvTofEg0NEiBcqZuVlJSYos4qGhUXHChGvaidmpuhtz4o +IB8kLUq4o5uZmp+uzjomGQ4NEBg0rZ6YlZeZnbI5HxcVHCc+vKuknZygrGkrIR8jL1q9qJ6b +m56nv0AsIRsUDxIcMrGem5qanqKtSiMaGBwtYbmqpaKfo7NRKx8fKTfos6minp6iqrxJMy0q +KB4XGB4q06qnoqCkparMMCQeIC9UzretqaWnuE4uJSYwSs+3raeioKWuxlE5NT87KBwWGCA1 +xK6qpaKhoKreLiEfJjdczLmwrKitxUMsKC08eLytp6Sgo6y8fkE4ODEhFhQZIEevrKafoqGf +rk4sHx0oPPu8tLmxq7TMRCwoMEXOsauooaClrLpZPTYrIRgTFh0vv6umn56fnqbMMSQeIS9H +27y4s6utvOs5LC88aL2wraikpqqw0Es/LyMaExUaJV2yqJ+dnZygtj0mHh4oN03Qu7Gppau7 +Ty8sM0HpwretpaKjqLX0QC4fFhMUFyNStKObmpqan7dEJBobHyk9z7qsoZ+jrdc0KyovQt+8 +raSfnqKuzjkkGhMRExkmWqyemZeYm6O+NSEaGR0oPsivpp+fpK3VNyspLj7qvK2moZ+lr8o8 +IxkTEhUcKmOtn5qXmJujuTojHBodJjVvu6yjoKKrvk41MDZEfMCyrKinq7THTCgaFxUVHCs/ +uKKempeaoa5cKB8dHCEsOOqupaCfpbPQTT0/T/fIuLKwr7TBWzMhGxkZHCY1abOmnpuanaa6 +QikiHyAlKzbls6ehoqq2zGpdbXjdxru0sbTA+T0qHxwbHCErPMqupp+dnaGpvz4sJiMlKSoy +Wr+tpaarsr7Jx8LGyMbFvri5yk0zJR0cHB4kLUDIrqSfnZ2irMBELiglJigrM0/Crqemqa+7 +w8O/wMHCxcbCyl89LyYfHh4fJi4/xa2noJ6fpKu4XjctJyUmKS9Gy7OrqKmtsLW6urq9v8DH +32pINy4kHh0dHig2aLerpaGfoKWtw0YvKigmJys1TMayrKmqra+0t7e4vMLExuVQQjUqJB8d +HSAoN922qqOgoKKnss5GMSonJSgvPfW6r6yrrbCxs7O0uL7Cw9FcRDgsJSEdHR8kLVS/r6Wg +oKGkrLvqOywoJSYsOVjCtK6tra+wsbK1trq/v8PTWT8wJh8dHB4jKTfouKujoKGkqrbaQjAq +Ky0yQ3jRv7m2tLKztbW1uLm6wMTG31E9LSQeHR0gKDFIyrOqo6GiqK/EVjsyLzA3Pktg4M3B +u7i1s7KztLa4vL/F2GlKNi0nHx4fIicxROW3q6ejoqWsuF0wKikrNEvlwrm3tbGvr6+xtbnB +7lBOQDk/S05aRy8qJyQpMTc/WPnItKupqrHOT05UX9rbdGBiadjDv8LCv720r7S7x19CQEA/ +SE5ISz0pJCclKjtBQ/nWyrOqrbCwusa8vc/WYkBAS09p0s/MvLOvrK241VlEODI1NjlNW1ha +OionJikwPUlU+c/AsKmop6mts7nB2lU+NDM5Re2+t7Sysra5vt5NST46PDo1LigiHyEoL0LN +vLSsqaelpamtsr3aaks7NTQ3RefCu7m7wL/BysvnRTAmHx4fJS07/cG3rqyqqqussLW8x9hZ +Pzs8R+zFvL7L31tOWlRHOi0pKCkuO07dxrmxrauttL/TdVxSVFBOWGbexLewsLa+3VJKSEQ9 +MCciISMpOFjMubGuq6mqrbC4wMrZY0c7MjI8Wcu7tLe+y9z4fXNSRTsvKCQiJS0/8b60sK6s +rK2trrW7wttXRj06QF3by8HH71dPVWFYSDkvLCknKi41Q/e/squoqamqrrO2vsngWUY+R1vx +zsfQ4+h1aWBJOCwkISAjKjFA+ce5r6qmpqanqq2zvdlOPjo/Unncy8nP0NntaE06LSgkHx8i +KC9G0LerpqWkpKaqrbK+1XJLP0dj3srAxcbC0HVPOCkgHRwdISkzS8y4rKSgn6CkqrC5xuVP +Pjk8RlTiw7q4uLvGWDQnHxwdHiMrN1PBraWgnZ2hqK+6zl5EOzk+PkJY28C0sr5XNisjHx8g +ISgwRsaup6Genp+fpK270kw5Nzk4OUBPft9MODQvKywvLi4yOkzJs6yppaWmpqmxvMl8VFxT +Qz9ESDwtKCopKi81ODtK+8CtqKimp6qrrLLE/01DS25xUk1JPzMqKCYkJiouNkNpxK+moJ6c +nZ+jqbfoRjkzNDk5Nzk3LSkoJyYmKSsuOEzZt6iinpuanJ2fqLLEb0tJSkU7NiwkIB8fHx8f +IycvP922qqKenJubnZ+mrbnRXVhs/WxSOy8pIh8eHRwdICcyUMKwqKCdm5ucoKevv+FbTFDp +0/BPRDkuKigkICAhIigwPmi8q6Sem5yfo6u2xNxXR0tXYVhJQjwwKyonJScpKzFAZMeyqKOh +oKSpr7nOY0xFQUdV+9nU3d/1RzUtKCIhIyYsOGC+raOfnp+iqbC710o6MCwtMTxhw7i1sa6w +v1UzJh8eHyIpM0jVtKiioJ+jqa+83EMzKiYlKDFLxLCpop+gpKq7RSwkHhwcHR4lMVC7qJ+d +nZ2iqrf8NSgiHx8iJy9GxayinJmYmZuhr+UvHxsYFhYXGh4sTrqnnpubm52krss6KCIfHyMq +NEjMsKaem5mZm56ovkUpHRgVFBQXGyEuVrinnpqZmpygqr5FLCQhISQqM0fQtKignZubm5+q +wT4mHBYUExQXHCU20q6inZmYmZugrMY+KSAeHh8mLz/Qr6WenJubm56nu0YrHRgVFBMVGh8t +cbCknJmYmZufq8dBKh8dHh8lL0bPr6Odm5mZmp2lu0ApHRcTEhETGB8sXLGjnJeVlpmdqLxN +LSAcGx4jLEDXtaeenJuanJ+ovEcrHhgVFBQVGiI00aygm5eVlpqfqsNCKx8bGhwfKTlsvayj +n52dnp+krco9Kh8aGRkZGyEuU7yqop2ampyhrMZBLiUdGhwfKDZcv66knpycnZ+iqLdjNykf +GxsaGh4nM1K+rqihnp6jqrXYRTEmIB8kKzdP07qtpqOhoqSlpam16UAxIhwcGxocJCw72rWr +pJ6doKWpt+1DLyUiJiktOlDbvK6ppqSkpaaprb9MNi8mHh0fHyAoMDdTvK+spqKlqq21xlg9 +NzUyMTY7Pkrfv7i1trKur7e4uL/N7EYzMzo1KyktMDExOFPPyce6srO3t7S4wtV+Wkk+NzY5 +PEVty7+5r6qqq62vuclePjIrJiQjJCgtN0J0xby2sq+urrK8yNxZSUQ9Oj1GS1vbxbuyra2t +rbC7yvhGMywpJycoLDA5RFzWxL27trS3u8LO4G5PREFDRUtd682/ure0sbGytLvJb0M4ODQt +LDI2MjdJVlXnxsnLv7/R2thjTVlbSk3+3dvKwb22tLi5t7q/xNBzWko1LS8xLS87Pj9s1Pje +wsPJwMfh2N9JP0xKSWvn69LBtLO6sq2xsrS6u+BGQTEnJCEiJCQqPVrHr6qmoqOqr7rmQC4l +JCcpLTt4uKumo6KhpKmzv8PLSzEsLCofGyAoJixD77alpKWhoKm5z0QuLCgfIS07Tc63raSh +qa+ur7zN7ei/uv4+TlkuHR4jICUsLlyrpqmjnqOvv0UtLSsiICo4Tci4sqiiqLG0ub/BytXG +s66+eGdbOR4WGyEeIS9qrJ6fo5+erOA6KiYoJyUrSMS2r66sp6q78H3Yz8vTzrGkp75w200g +ExUaGx8uU62bmZ2en63iNSIeIyknLVm3q6ertK+w1z9CXsu2s7SonqCw9T4tGxAQFhslSLmj +mJWaoKvdLyUdGyAvQuO0qKKirMR5VkA1NUrBq6Skop2fs0guIxgODxgeLcKonZaWnqzGMSAe +HB0s9LapoqOmqr86LSwtNEbasaKen6Cip7FTJx8dEw8YISvHpqSdmJ+11zUhIyclMcKrpqCn +ucdrLiQmLDzMs6uhnJ+mq7XAzD4oJx4REh4pNb2rp5yZp8lkMSUpKilJrqilpbhZTzYkIyw5 +zaunpZ6fqbTC9trLRTNGORoTHSIoa8jCo5qjs786KTU2LD+6rqajukZENScpLjbKqaamoqaw +u9BZ2b3F1/Y/JBURGCIyebemm5ies04vLC0sLki3p6SszUAzKygrOPuvo6Chpa/D2WNa0r3E +3dNNHxIRFyE53rmimJierk8sLC4tME+9raiv2zksKzI9TMuvpaCjrshtYvvcxLm1t849IBEO +FR8zyKygmJWbrGArJCcpLDvWs6enukk2MzdDTWy7q6Wmrsbl1MzKu7nG1Wo8IxQPFSEzxayl +mpWapswtISYtLDVvu6ijslY+OztFRD5xtKmmqbjIw7/Hyc3xQjczJBcUHCtKtKmonpqeq9Ys +IykvMD/vwK2rvl1JPT9XXF7LtKuoqrXGztHKzPs/MS4qHRcYIT68p6Sjnp2luUAnIys1PmzE +tKyvx086NDxMYNzAsqmnrsLh9d/MyvdLPzgtHhgYIDvAqqWinp2kuD8nIyo0PVfLtq2vwFY7 +Nj9PYePEta2qsMpncdO/vMbqW1I4IRgWHC3ysqmknpyerU4pISYvOj9av62pseo8NjpMZlx6 +wa+prLx6W9e/ub3M3+pmOiQaFhssT8CuqJ+bnatxLyYnLjQ3Q9eyqKq+Uz8+RUtAQOq4ra22 +ztzIv77Czut2/0ovIhsaIzRYvKylnpygsHoxJygrLC8/2rSqrbnMXEZEQUFU1b2zr7O8x9Tc +ycnX5lhEOiwfHB8pO8asp6Gen6m7PygjJSgtPFvBq6asudw/PERMU/LOvrGtts9bTWjFvMPT +2OpJLh4aGyM+uqqjnp6fpr8yIR0eJjA9/rSln6OwaTc1OUFPVe+9r66210lP0Luysb9dWGsx +HRgaHza7q6ihoKOntTkjHyEnNkxsvKmlqK7PPz9MTmF9UmTEvcree3DFsKytsspOPSsdGBke +L8SrpZ+gpKi0SyskIyg1R1bOtq6tsb/6Y25bVk9BQmHX0M7Gv7etqqyxxUg+OyYaGhwiPbqv +rKaoqamyXTcwKy46OTZLzr6zrrK4t8J0Tj4yMz1K47qyr62sra61ykk6LyUfHRsgMmS5q6mq +qKituuE1KCgqLDZGasCspaWptN5MPjUyMTRCzrOur7K1tLK4w/JCPTotIx0bHy1KxbStqaOf +pK/cOCooKSsvOWC6q6eorbjLZUQ4MjE2RerEura0srCvs7fCbEw6KB4bGx8rSMqxp6Oio6i1 +2UAuKCgrLz1dyrWsq6uvu9BcRDs4ODpCc8i6sq+vr66xuM1DLyYeGxweJjjPsKmko6Slq7h7 +NysnKCsvOVTHs6qnqK22xW9IOjAuMz5iyLixrqyrrbPGUzksIh4cHSIuSsGxq6eko6SqulMz +KicnKiwyTcGvpqKlqq+97EMyKigsOVjEtq+rqaqstM1POiwhHBocIi5KzLispJ6dnqW3WjQq +JSMiJCxDxK2kn6GkqrbXPi0nJys1Tcy5r6qpqqyzwek+KR4bGhwhLDzftaiempmcpbdPMCcg +Hh4jLk66qqKfn6Orunk5LCgoLTZH47+2r6uqq620zjomHBkaHCErO9OsnpmXmJ2qxEAsIx4c +HSMuTrqpop+foqizz0IwLCssMT5VzrmvqqiprbtOKh4bGhseJzNqsqKbmZmep7XsOSsiHh4i +KzhwuKukn6Ckq7npQTUuLC0xPF+/sq2srK66Zy4gHh0dISgvTLuonpubn6aux0w1KCIgJCoz +S8+2qaOhpKq1y1w/NC4tMDpPy7mzr6+wu2MvJCAfHyQqL0m9qqCdnaGmrLxtOiokJCgqLjtg +wK2lpKeqsL3RTzcuLTA8WNS/uLOxsLh0LyYkIiMmKC1Fv6ykoKCjpKm4+jssJicpKSszRsmu +p6epqq61wF03LzA2P05tz721sK+67zcsKScjJCYsQMmwqqWioaGntuc+LysqKSYnL0rKtK2s +qqiqsL91RDw5OTg9U9XBuri5vtw9LywmIyUoLT/OuKyloKCiqLbVUDsuKycmKTFCecCyrKim +qbG901VDPTc0PVXhzca+vML1PDIuKicpKzBA372xqaSio6m2xntBNC0pJyozPEzSua6pp6uv +tb3SYkM4OD9OVl/22szQTDg4NS0sLS42T9vHtayop6etuL3NUDszLS0xNTdC+Ma5sK+yr7C5 +wtVaRUNER09TXOfX+E1EQjw0Ly4vNj9Kc8W4r6ysr7Gyucn/TUE+OjQyNj9Nd9bKwLmzs7e9 +xtHqYFNPT1Ra9NnkVEVDPDczLy8zO0RT3cO5sq6tr7O5vsfVaEg9OTk8PT5DT/3PxL++vb7A +xM3oXlteZ2323drhbVZPSUA6NjU2O0FKXdzJwr69vb29wMnY9GZeWVBNUV5w9dzQz87S2d/t +eGVqYGt14NzX1Nrh3ndbTUtJQ0JCRkpTXF1259vS0Nbf6+zu8/Py7vbi3d7Z19XU2ePn7Pdq +bPt+5tjZ3eTt73dqYldUWFlYW1tq6uHtbm1mYFtVT09PU1lfY2vk19XV0M3Oz9re6uXp+fz5 +6eHV2N3e4/78X1NST09SUlZu4tzUy8zLzdPiemBSSkRCRkdISlBedePd39jZ39/l6n/q3NfY +0s7Tztfc1uJ6a1xXW11QYmvu6OHe1NLY1t7u+nNbV1RNS0lPU1JZXFVXYF5fYGR2buff2NDQ +zM/N1M/T1eXb63xoY/B+6GTi7Nvo59/wb2p1XWBWWFBWY2X86+nraWNdXFBTS1FRVF/yfuLd +29jc09na2+nnctvz39/Z1ezQ3NLX291p5WBeUVVXU29UcWnvb2/9/Od2cGN7WlxmaWNaaFVj +Ymdebu5m8H7r79ze69Pj0OLN4NbP5t5r+W5k/VdyYHVvatxY0V3e23PYVX3wXPZ3YvRpb/D+ +WV9PUlhKS1dQVlnzftnVy9XS0NXc197w2uxz7fT94WrXXvnu2XTV4V3Wa99W21L1a2DbR89c +XNpK8FRRUVtNTGVM+F56fO/y2d7e3O/p5ep0y+L7xtva5NDzzevoadN/9nvtWulRXv1fculH +0Edf51N5WvRaaXVgTGtWb1nsSdFc99VQznvsxlrJcM/u8shb189c3dxlYdnmbtZv2t9b2/hW +3HZO2XpP0fpc2lhseU5cTUlRQkxQRf/4Wcvg4sbP0NPa1N9b3t1g29xwbdnjX9rYXN7c/Wz8 +3e711+9t3c55atB8c9/uUUpHQkU8PkVBTFdg8NrHy8nF1M3L4NrtXnXbXWvY4ePa2unPyN7a +7tjaXu52aGxsa3P319bya35YSzw7RDo6QUJPbM7Nyb/CurzMzu7qUk5NQk9OVWtt08jDxcLA +xsjT2ONbcmFbbnjc1dTX3uNkTzguNz4wLjpKeNHLvbW2s7C5zt94UEQ7ODs+TGv75sO4uri3 +vb/Ncl1QS01cWG7f0MTJ0dlxQy0qLzUuLDlTzry1rKyurq+55Us+OTMtLjE6VNbAubOurrC3 +xORRRkJCQkNR38K4tbvGz18xIyQuLyosP8y0raimqq6vuOE2Li4sKywyPWC9r6usra2yvdtO +PTc5P0tZ7si1raywwmRDLB0cIScpMV24q6WfnqWvutM8KiQlJik1VMy5rKWlq6+76kU5MzEy +PFnPvLayrq2stNc9LCIaGSErL0q4pZ+fn6Ct0ks1KCAhKTE/ya6qqqmqsMhWPjIvMztBUMy3 +sbKztru7v8pPMy4oGxgmPkjrtKaio6Clxzs3MCklKjlRy6ylqrC5x3xANzEvOmDSycC8ubu/ +wdF728jFzu5XRS0cGic5PVu8rKahnqfUOzUuKyotOE63paWstMdWPjkyLTNewLq4t7m+xMxt +TVnk08S8vsn+OiAWGy03QcSup56cn7w6LysoKi41WLKhoaq13T8zLy4uONOzrq2xvc30Tz06 +U97Pu7Gytr52LBYPHTM8z62lnZibsDQpJSIoLzX1q56fqbdqMi0pJy5JwK2pqa6+11A6ODtS +z8K1rK2vtNwyHQ8PIUR8s6OdmZqoPyQjIiQvPeyrnp6ouf00KywpMOm5sK2sr7/vRjY5Rk/i +xLmtqq63yTsfFA8WMcuwo56amaLoJx8hIy1A6q6fn6m7ZDcrKikv6rOvr7C0veZFNzpSX2/I +uLCsqq/DPCYbEhEffrGknZycn7osHx8hKT/OsKCep7jzOiwoJy7+sq6ysrG5zE86OkhdX9a+ +tKyrr71MKR0WDxlasqmcm52fry8dHiMmOsKwoZykvVU5LCUmLF+vrLGzs7nEaj07S2di+sa3 +rqqutdAtHxoREyu5rJ+anKGqSx4dJCYt3q+lnZ+1XEYwJSIoPLeprbaxr7xnPDpES0hPy7Gt +rq2uuk4oGxMQH8m3q5uZnaXWJR4kJSU9tKWenq3ZZT4oISYz3LKztqyps9hIP0g/OD/PsK+v +q6y3dzEiGRIVLb2zp5uanq5DJSUoIydMsaahp7a8wT8nJSw/z8XJsaWouu1eWkQxLUe8tLiw +qau1TiYcFRIbPde1npibobU/LSkgHivetKqjp6qrxjIpKCkzRmW7pqOrs7vQRjArNV7UybKp +qq/EPCkaDxQuREKtmZebo8FBOycZHTVtxa6no5+n4TUzMyonMe21rq6rqa7RPDU7PTlIvKyw +t7nNPh4RFywtKsKdmpyfrLXALhwfLS4z3K+noaa0w9U/KyozO0jww6+prr3DzmtKPUnPwMTM +yslCHxYgNCQnvqChpKSlp7suIy4xIiZbt66srKutvkw7Pj02O1zRwry7t7vM3tTV29TLzldG +SiwaHDMsIk6noqSipKSqSicuMiIfMs6/uK6pqbPQY1M/MzVHYGnPubK5xL+8ztnDvs5PR0It +Hh0lKigvyailpqGepL9BODAlHyU4Zsq4qqWqrrjPVjsyNDtAUs+6tba0t72/wsnXV0A8Khob +LiYcN7OtqaGdmZ2/Td42HBslKStKvKmgoqikpdE4PzcpKTRE2b21q6qusrS/Xj05Lx8YHSkf +IlG0rqiem5mfsr7dKxwdIh8iOMmtpaKenKO40GQwIyIqMzxftqemqaent14+LSAeHBsfJy9W +taihnJueoanBOighHxscJDL7t6ufmpyipq7fMygmKCktPsOuqKeopa9ILysgHR4cIDJDbq+g +n5+dn6ex6DstIR0eICg3VLqln5+en6i1zEYyLCkqMj9UxLSur7rOTTMpJiUkKC85Wr2uqaSi +paiuvmo6LSUjJiouSsG2raaio6euu8xVNjE1NDVBWNLBxMbaSTk1LCktLjE+YtC7sK6rqa20 +ucdLODcyLC46SmbRva+srayrrrvNekc8NzY7PDlg5D1xzz5ATTg0UD4x8MZf3ra3vLbAwLzi +UmpaQEpYTe/X2cW+xcS5vcrK1WdSSz4/QkJGT3rz1tNeYN1TPD0+ODg8QVPfzsW5try9vcHH +z+f16W1ba3pWXWxga3fv6djS3tjP2u5uVFJeVk9k4ufz5uL/W0pESUdFTF3q3+HWy9Dl5OH+ +W1ZWWXD8dPvl4N7W09HOy8fFxsvW42dWU05LTVZbYejd5fBrXU1ISExWY+jWz8zJy9joc1JP +T0lIT1ZTZufy7Nrd39jX2dnT1uh1a2RfXXfk3NDPysfO5PZkT0tLS1VYYufW09HW1/FeT01O +S0pOXFrz5Pb82dva3tb9dHZbTV1WZmvO3vHT/L3Q1MvV2E1ST2RRR+Lr6fjJy83b/d9iXkpF +WmJCS/bW3+XSz8x3WOZ3UUhU8l9bXPPV5WDlzehbdenrX1VdXFtUX9TVzMjDvsvK6d7kT1FP +ak9l3l/N0vXZ4NxSVGZJTlRTZFhGTV5KP05VU1heeNzN5N/Dw8vLwMTLx9bZz/pcZuxuW3rs +08/S0czI2HbebVxQRzovOTwvMDtERlFl1Ly8wbu0t8LJ1v5pSz9FU1Vd38/Fvr69u73JzMne +X1ZSVFZRUH3a6E01MT88Kys4QkRJYcCvsryxqrC/0/BbSDQvO0Y/QeW9uLe2sa21ydTO7kQ8 +PUdPRkzSv8LMXz06Oi4oKzE2PEnfta2uramqrr16Rz81LCswNz5ixrWtrK6trrvUbE0/OTQ5 +T/Dtzruzsb1aOzIuJyAjLDU9Vr+rpaapqKmy3T0yLywoKDJK3b+xqqaorra+10c4NDU4OkXc +vbW0r6ywzDwrJiQfHCAvR9+5qqCdn6mut+80KCQkJyozZbutp6SkqK/HWj82Ly82QXHMv7Cq +q6+zx0cyJB0eHx4mPtaxpqKfnqOxxFYvKCQhJjFE0rOqpaOosLzcRDYwLzZEVdK4r66usrm/ +4jwtKiUfHyQuQ9u7rKOhpqy0yUwxKSgtND9rw6+qrK6yu89MOTQ4Oz1M2L22tbe4t73VXUo/ +Ni8pJCcvN0PuwbKrq6+1vNdNOi8xOkNU1r2zrbG5vcfnTz88QkxOWdrCvLu9wMHRdFxNPzky +KiUoLzxUz7uuqKmvuclrQzYuLztQ5Ma6tLG0wNpkT0U+PEZu2c7IxL+9vsTO3eruaFlXTDUl +IiwzN0V6vamlq7G5zV4/LioyR1/Ru7Gsrr7YaVFIPDU7VdzHwr+9ur/fWV94+fhpbtnTazMg +Ii84PEzqtKOirLfC60w4KSk4Uty+uLKts9NWSj89OzlJz768ur3CxdpSSU1Z59nRvre88i0d +HystNUjtr56eqK/AVT0uJCUzSc61sa2qsdFVQTg4OTtUxbq2tb3M1WNDQEti3M7CuLe8+jMi +HiEqNEHXr6KeoavATTctKCcsO9m1rayttMP/RjczOEFkx7q1tLrL900/RFrmz8jCvr/K5zwi +HCArPHXMt6WeoazLOy8wLSktPsytqaywuc9tSjg0O0Zry8S/ur3N3FxJUnB42cTM3MzJ3T8l +HCIxStjJu6mfo67NPTE0MSwwQtGxq661vutQSjo1O0f3w72+vL3H12dFRl7s4tvPysLAzUMl +HSMuQubTvamhpK7NPDMzLy0zQN6zq62xvN5aTTw2OD5jw72+u77JznBEP0pV+M/JysK9wvUx +ISAqOVLey7Smoqm4WjUyNTEvNUnDr62yu81yb0w5NztNz72+vbq+xtlMPUJWeNbO1MS7xe0+ +KSAnMkL4ybuspqiyzz80NjYyNkPguK+zu8LpV1xHOz1IdMe9wL68xtZcQEBY6NrLx8S9wc5W +LSAhLDlR4M21qKWsu1c4ODk0MjlNx7OxuLzI5uZbPTxFWc2/w8O/xdH5SkFOcODOxsnGvcNT +KR4iLD5ZZs+xpaSqvFE8OzgwLzRHx7WytLrDzuZXQDxAUNrGw8HCxs/mUUNGXdvHx8zDu7hg +IhwgKz9dWOCsn6Cnu0k5OzErLTFLuq2ur7S+xfA+NzY5RXXOv7a3vcbkVExMT3Xd1Mq9trlB +Hh0lLUBPSM+nn6KpwEhBPi0pKzBWt6+urbG6vd84LzMzPnDbwrOyur3STktLR1V8XefBvbq7 +Oh4hLDFGTULEo6CkqcpCTEUvLC4vVrSyt7W7vrjUNzAyNErf/M64trm9+URZ7WFsaW3LvLq8 +UyUgKjA7Pz9mrqKkqbhzU1M3KyssOsu3t7W1t7S6Vzc1Nz5baO3Ft7W5zU9P+PZubVte1MbG +ykIlJS81PklF7q6lpqu7bl9kOy0tLjzMu726t7ezuVg3NztFWllT2by3usTvY+LeZU5LTurK +zMldKyk1NjtHRFqzqKmrtd1k9kAvLi42a8XCurS1s7lzPT4+PUZJTNi6t7vG7GrZ0X1jZmXp +y8jgOiosMTpERU7PsKmprsDtZ1M7MC4uOnjFvLm3tbS+/kc/P0VQWmnTwby/zOpt7N7md2JW +ZtbYRCsqLjlXYlPzu6ypqrt0T09GOzUvNFDJvLm5vLq92E8/PD9NY2rnyr+9v8zo79zb5urq +49RMKygqLj9mXF/Br6qmrcpQSUE7OC4tO968tLS8u7e810k2Mz1SaO/e1MG3u8vsW2Df2Xhe +WVn06DstLzM//eNq2bqxra7FVE1RTEI3Lzdcyby8xse/vstvSUNPe+Lj7/rYxL6/w8bH1kw0 +KScqMT1IYseyqqirtsr+Tj0zLS00S8y9ubWztrvE90M5Nzg8RFPly7+6u8DL1nRZUUtQY/3e +09XY31c6Njc4RVtf78q6trO51WJaUktHPzxGauDPy9DOxsPK1eJpXW397fPt28zGx8bfPDMy +LzU8PUFazLuvrbTAyN9iVUU4MjhFb83DxcW9u77KbUhGS0tIR01d2sW/wsjO1dvwWU1GRk9t +7fv67m1MSU1KVGpiW1/fy8K/y+fo7PX6b1NIT1tefu3gzsjKzM3a4NjT2+nn39zV7kU2MjA3 +Rk5XbdbEu7W4xNLoaVtUTEZESk9b/ePTzMjIyMzX53thWVFPT09YceLWzMrJy9PoaFRJSExU +WV9x8t/oYVhbUE1UVVVp3dXLxMfMzdHe+G5fXFxcWmDt3tPP1tvX0M3MztTY22hDNC8uMz1M +WurMv7ezs7vL5F1PTEU+PkJNddbP0s7LycXHz9zwalpWWFdUVFtr3M3JycrP2u1fT0lGSUlH +QUFJS1L53dvPzMrDv8TP3PllbWdVSkxVXenQz9HMzc7P1Nnl/nFt+9/c5VxCOTU1OT5ETFzZ +wbavsLfB0OpeTUU9OTxEVf7YzcfDw8bN3fxoXVlWV11jae3c19DNzMvO2uXueV9ENzIvMTpH +U+zKvLawrrK7xd9SRT04NTY6QlzRxb+8u7u8vsXVe1pMSktTbeLaZkk/Ojk+Q0dPW3DUvra2 +uL3N3/BeTkc/PD5JXffVzcvKxsLFzdxyU05OTVBXaeHRysbHyMzV1eFJODIuLjU8QlLix7iu +rK2vt8XfWz83Mi8vND5X17+5uLa2uLvG21xKQ0JFTW/SycreUkI8Ojs/QUhW9s28trS3vMvx +WktFQD09PT9IZNPHxMfHxcTAxdT5UklGS1x5283LyMG/vr3EYDovKyotNDpEWd6+r6qprLPE +7E8+NzQwLi84SNm8sq+vs7i5vcnwTkA8PkRT78zBwtVQPjg2Njo+PkFU3MC1r7G3vs19WUtA +PDo3Okd+zMK/vr+9u77I21lHQUBGWuLOx8TFxcC9vsxFLysnJy42PlfeyLarpqeqtd9IOjEv +Ly4uM0L6vK2qq662vsjZaU8/OTc9Tt6/ubi7ylI3Ly0sMDY4QGLKtqypqq63ymJHOjQzMC82 +RG7Huba1tbm+w91RRj89Pklj08K+vru7ubq/2TsqJSAiLDhF4sO7saeipKm3VzYuKysuLzA7 +Xcewp6aqr7/ZdVRHPjg0N0J3yLexs7S+/j0uKCUmKjA/77+wqaamqK+/ZD0wLCwtLjdRyriv +ra+0usjiT0E8ODY8S3XIuri5uLu9v8zpTS8kISAjMEvgv7Stp6GgqLZ1LyknKC00OkXiu62m +pau2zU4/Pzw9PDs+UNO9sq+ytr3JZTkrIh8iKTn2v7KrqKWlqrd9NiknKCw0P1/Jt62rrbC+ +6E5BOzs8Pkhpyru0sra6vsbQ5F5HNCcgICQuT8q7s6+rpqSquVUuJycrMj5Nasq0rKiosMZj +Pjk9Pj5ASVjZv7q3t7q+v83qWj0sIx8iKjzZvbOtq6inq7lnNSspLDA7S+/BsqytrrrbVklA +PT4+QVTVv7i3vsPGyszbXEtEOzApJSctQ8+7sa6tq6msu1ozKiktOERU9ca0rq2vu+VRRT49 +QEZR+NLIv7+/v76/xthbSUU6LSUiJi9Oybmxrqyqq7PMQzAsLTI7Sn7Dta+vs7vI6k9BOjg+ +TuvMxMHCvrm7xd1SSEpLPi8lIic1c8G8uLCqp6ey7DkwLy8yNTtevrGutby+wcn3Qzc4RXbV +1dzYx7u3u8vvaGV+X0IzJyMnLjxnzb2vqKapr8ZePjYvLjI8XMe7ury7usDNbUQ+QEld6eLd +yL69vL/N09f1ZVRANSwnKS89Ws28s62sr7jIXj83MzI4Q2bNwsC+ubm+zGpKR0pLU3ngzcTE +x8XBw8fQeVtbRDYsJyovOUn6w7WurK+1vs1uQzMvMjlJ78/Mv7a4vcTadWNTRkZTYuPMy8a9 +u7y+zd3nVj4xKigtMTY+TN67r66vs7e/zlw7NDc7P01efcy+u7m4u8LN61JMT01OTk9acOjh +0srR3NnkbVxSSkA9P0NFSFX/28rCxMvS3N/qaFhYbubp+Xt33s7R619ebufc3uLd1c/R297d +3eLo6uPkaExDPj0+Pz1AS17v3NrXz9Ha5O7r39fY3efe1NHZ7mpfa+3p39XPzMnLzc/S1+V6 +aF1aVUpCPjs6Oz1BTFr92MzIxcbO2+j9c3ZybXrt5eHe3+bl5ODm6ufe08/OzdDV0s/T3OX1 +Xk5JQTw7Ozo7PkhY+NLKxcLHzdXld2xsa29/8unj29bU19zf3t/g3Nzb3NfW2+Hk5ODd6mZV +S0U/PDk5PUFMXuvSyMPDwsbL1/JsXVhZXF1meubj3NfZ3NjV1dbZ2Nvm/Pfq2tnZ3ex2YltP +Rj8+PT0/RUxZ79bMyMjM1Nrc4+zp7erl3Nzf4ejg5PN3amhy7+Xo7uTd29jT0NPX2+hfTUhD +Pz9AQUVMV2jx39HNzc/X5Ov07fN5dvfh4N/d3eLi4vJ5dvjo5O5+7d7Uz8/Q0tbc3/FcTUhD +Pz9BREZMWWru3dze3dvc3ub19Ofc3+fh3tjZ3uxua294+XVudvzm3Nva2dnY2tnd8m5gWlFO +T01MT1JQWGNod+fd7vfq7uzr6e72/Ozm7vPu+2hgam5scPjo3tbT1tPPz83O1t/yb2trYFJL +R0lLTlFOTFNdbtzT0tXY3NzW2+Li7GpdXV1kbG5rbPzr4eTp4N7d3ODv5+Pt9Pnt5uTi7mha +VFBMTVBSU1laXnvh1M/O0tfY3ePse29kW1lfaWpfYWpy7N/e4tvW3OHj6/v67Pjt5+bpdlxX +WVNUVVFRUFdebOrZ2NfR0tfc5u3v9/5pXlxfZG14dvz8/Pb17+ni4OTn5+zs6Ojk4OPm729h +XFhQTU5OU1xiZ2t3/e3c29vZ2+fw7PV6eXxtbPfx9O/p4N3b3NfV2eDu8vTu+GZYT1BOTU1L +S1Jeav35/Ojc1NPS0NDS1t3o+21ma2ldXV5dXV5eYmZ+6N7a3N7c2tXS0tnd3+5+d2tcV1RO +S0tNTlVbW2N1+uvf4N3c3N3f4e39e2xt9+3s5ePm5ubf3trW19jc3NjZ3+9uYldOS0ZER0xO +VV9sdX379O3m3NzZ1dXY2N/ze3j7fGppamJhY29xfezs6N/b1tDS19fa4OXp9W9jWE9MS0tK +SkxPV2Bv+/Dm3NvZ1tfW2t7j6/n3dmdia/r17Ovr5N3c2uDn3drd6fHq6ObsallTTkxKSUpN +T1dYXXrq6Ovr7u/p8Orj6Ojm7e7r93x28+Hf3NfW1dLR1NTW3eHq7vDz/HhvbWxeWFFNSEZG +RkpPVVtke+Xb2NjX3N/i3+Hl4+bu+PXt9vZ+dn5weO3o497c293f3Nrc2tjb3uLp/mRaUE1M +TEtJSUxVY37m3NXY29zg5enxdmlganJze3z05+nr7Orj4ujq7PPr5unt7+7+9/Ht6PD0dVxR +S0dFREZNWGnp1szKx8fKz9nc8W5fWFZXWlteYXL35trW1dPT193j6+v4+fn98eXd3d/j8V1L +Qj05ODk8QlfjzMG9vL3AyNDialxWTk5OT1decuLSy8XBv8DHzNbncGNeZ2x56eDe3uL5W0U6 +NC8vMTdEbMq8trS1ub7J3mdVTEVAPTw9RVXfxbq1tLe9x9j+XVVVV19+59zTzcvO3Vo/My0q +Ky86Vse4sK6vs7rD0P5WRz03MzI3P1/Gt6+usbe+zvVaTk1OUllk8dbJwb2/ym88LCUiIys4 +a72xrq2vsrS4vtZOOC4rLDA+472xra+zuL/Kz+FhTUA9QFDewri2t7zNWj0uJiQjJi9G0rau +rKurrrXCez0wKyotN0vOubOwsra4vcjeWkY+PUJP3MO9u7q9vcLjSTQnISEkLkzHt7Cvrq2t +sL1vOSwpKzJI4Me8ureysbW+3UxBQEZWdeTazcK9t7a8xWw7LikiIykwS8u8tK6tra+55EE0 +LS00PVHaxbqzsLG2wNhfUlBVXVla786/t7e+ydh0Xks5LSYhJi9Ezby5trSwsLjNRzYxMz1M +W+nNw7q2ucHR/WT08mRYTlH7zMXDwMLJys3f9ls/NS0mJy896ry6uLW0s7jGTzgyMjhGUWPS +x765u7/Hztt6Wk9MU2Xiz83Nx8HAwsfS9VZDNy0lJCw5XsO+u7SvrbDBUjg1OD1FR0r7xry3 +uL7Jzdl/W01KU3bk2tnXyr25u8TZb2dYQzUqIiQuP/vGwbyxra+41kU7PT8+Pz1G3L65ub3G +y8fObVFKTu3W29vczr+4uL/P53NuVj4wKCMnMD5b0cW5rqyuu+BNQ0M+Ojk6Stm/u7y+wcDF +1GFLS1Jl6OXn0MO9ur3Hztze22hENSwoKC47S+DGvLWytbrD5VNHPjo6PUhezr+9vcHKxsni +XU5LVXTr49vPyMPDyM/U2+fk7VtCNSwqLz5Pe93hybeztbrLbFdRSEI9PUdc2MfIy8nKyczt +XF1h/uN6XGndzMXEy9XU1tzo93hONSosMTlNaVBfxrqzrrfK1+JsXE0+O0FPd9fY28/IwMDL +53JoXmJmYFx83dnPzMzKyMzV7Uw4MDAyNTxGTWbOvbi0t73G0+x4XUk/PkFIUmjs2c/KxMTG +ytLnal9eX15jafncz87O0OH78m9URT49RE1dcmZdauvi2+ZjXvDQyszhZlxmd3RzYVlabu7f +3eHZ1dDQz9Pc29TR1d12Y3P0c1tNSU1UXF9aT0tLTE5TXGd83crEw8jS53ZsZV9TTU1Xa/Dd +4Ovo3tjW19rd3NXR09noeXRvZmBkbH77dXJoXVpTSklLT1dg8uPf3ebw//fr7H5fYHvo5/tp +X2F44tva3NXOy8vM1OpqY2x5b2BbVlhebWxaUlFSVFpsb2166ujf09Xb6XlpbHBnZ2NjaHF+ +fPbi2dja2NTR1NrpeGhmcndwcXBteOzk7mlWTUpMUFlcW19fdN/W0NXj/HPt2tbY4/5jZ3V5 +e3ru5d7b2NbZ2dztcHBwb29iV1FMSk9eZ2ReWVhw2s/LzdXc4OLo5uP2al5TUVdcXFtkcffm +2tXPy87T2t/i7PZ4Z15fbXNwee/t93JcT0pGRktVaXBueO/c0cvM0dnoe2ZfYmNlbHr26trT +0c/Q09TZ3ut5bWFbV1JPS0hJTE9YZWpveeve2tHQ0dXc6PF8cm1hW1dbY2JeZnfu4d/f4t7e +3Nze3drY293b3+jzfW5mX1BIRENHTVBQV2V57+fe29TS1tna3unp+GpraGhscW7y39rT0c/P +0tjd4/F+b1tPTUpHSUtNVWP95uTv6t3b2dfV3/J7cPr3+P5zZGRvcG1vdezh5eLf3tjZ3d7l +4+Hi4u3n625eVE5OTEpNTE5UX2Vq9eDb29rW2dfV2+HofV9dW1xp+uvq5dzW09DP0dLU2uLq +7vTzdmlaTUpHRkZITVhlbPTn4N7f4uHf4Obp5vNzZl1fYmZrfe3g2dzf3NbS0NDW2tbU2N3e +3+Po5nZYTUdCQUNHSk5YXWb34+Lm4NvY2tzmc2ljXlVRW2hy6d7c1M/Oz8/Nzs/T197d2+Ds +6uLnZU9HPzw9P0NJV2/15NjU0s/OzczO0N1xW1JNTE9fe+XTzMzNztTb3N3kfmxiWlpidO7h +4uh8V0g/Ozk7P0pd5M/JxMPEw8LFxsrXeFBEPz9FTV/q2M3IxsfKzM3P2ul0XVRSV2Tu1c3N +0eNbQzkyLzM6Q1rdysLAv769vL3D1FpDOzg4PEVa5c3FxcW/vb7ByNLrYlZUXf/Yy8fIyszP +8kw8LyspKzND8ce8vL29u7m7wttQPTUzN0FX2cfBvry6ubq9xdleS0dLU3jXzsvGxsXByPZA +LSQiJSw9bsi/v7y2r62uts1CMi8yPExe9eTUv7ewr7bG/kpITFRhWlFa8ci6tri+1FM9MCom +JikvQuO+tbCurq60v99INzExNTtHZdTHvbe2uL/N5GlfWVFSV2HhzMW+vsDFz/lKNyslJSkz +SdXGv7myrq2yw10/ODY5PT1DWNW8srK4wdLh4+9hUE1NWODLyMbFx8jHz1k8LyglKTA6TPHO +vLGtrrK92FlJPTk5OTxP18C4trm9v8bX+1pPV3nr5dXMx8G9vsPSVjwxKiYoLTRBX9a/ta6u +srrLZUw/ODc4O07Xw7y3tbW3vM1tXFpcamFf6c3Cv7/AxtBpPzMtKCguMj1a27+zrq2vucbx +T0A3Njg6SH7Uw7y6uLq9xNji9lZRU2jXy8bCw8LAynFBNS0nKS4vOk//xbWvrrC1vdZeRTo5 +OjpFXObJvry5ubzDzdLca1lUTlnr1snDxcXNdEo7LyoqLjA0PlHWu7Kvr7K5ym5NQDs3OD1I +ZNXHvrm5uby/xMrW625oX2z458/IzN5eSj82Li4wLzE5Ql3Mvbi2tba8yNlfSUJDQkRTedrI +vry7vL7Dy9HZ+FxQUltj89fQ5GZgTTsyNjgyMjpATuLHvru2t73Byd9dUkpDRk5Zat7MxL+9 +vL6/xczR2e5sXVtiaGhub15MQTw5NzQ1NzpATvrPxby6vL/Cxc/e8mZcXF5o6NfNysnIys7X +3OxoZ19ZWV1iYGZwd2lnZFFHR01MQkVPTUxe18/e2M/a39nb8vvh7mZ329XX0M7R0s/R3uHe +4+3o7PxzdmdcXFZVVE9NU1lWVFNST09ZXFVbbGxhbezm3tnR0M3HxsjNz9TX2eLr5+R/Z2x8 +7+3rem5lY2RcV1daW1hdYGttZWlpYm15a2hiYGlpY2Vx7u7q4tjR1dvk8vDm3+fh4d7Z293d +4+rt7flta21gW15wcWdoamFpb2tqbvxyYl1gYmvx8PXt4ePn5/NkW1xqaGZyevbr393b2N3p ++Pd/bm1y/vLn4d/k4uPr/mtqZV9fX1lcZmz+5N/l6u/4+O/0/m1paWlubWZt9+rr+m1qbmdg +Ymh1+O/x/e/i3Nvc3uTm+HR0bWlqbG7v5unq7/Dw8fZ1Z2BfaWpse3xudmppevj3cHFvanT8 +7fHs6+zv7+vt9/j6e3X+9nhma31tcXj8/fv6+n357e/v+/fw8OXk6fr77/txYWRlX2FncPfu +6+/t5+DqeHFramxtd3j99nloZWt3eXVxde3n4fB1TUC7t2FESsbHY0rvwPhXac/+S19xeVtp +2G9ZaPnpYVZd2n523eRnXePd91pmcFRK2M/W4tzN2N5q1/BiW09MSFDcWk3fztnfy8nS9VDb +z/5QTvBgTVb2/Utb1uzg2uPx4Hh92HhbWFBSVV5fYtzQy9fb5Mzc/Ox9eGdqU09cY0xc6uXy +7tjT2ubv693tXlllXl9fYPvtam/r1dpx7+14ZGJv+GNXYvNsaG3v6Ovt5+Pm5ut4aGdfevFp +/vD06uvi5OV8bPf1ZF55fm5ic9zbdWvo1Nd+YX3pdFtt6m1uYFxeb3JbV15lXF92bF999t/W +3d7d3Nze3ubf29na4Ofl2NnYzcjR4trb719sXkc7MTA4Ozs9SWNr+t/Kv7/Cxr++xtbr39rk +4NfIxMbLzsfEyNTd4+TuWE5UZFUwIyk1MzI3QmjLyNzItbfI2dPKxNBZVM/CzNbJvr2/zObS +yeBab9vf4u936c/O1tZMLScrLi0vNTxWzsO/t7CzusXlZGZgTkpSYNnLysm/ubzBx8zQ0+Fc +UWT06d/e2dnhe0U0MS8vNDc4PEd5y8G8u7q5vMDLeE1NWVZTWG3lz83Z2tTPzs/T3Nrd5dzg +4uPl4nBZZ21SRkNHSkhGREBGUVdeaH3v4NbV0c3O0c/Q197n49zkbmP43OTs3tnRz9fp6uT6 +dHB18uHZ7lVIRktKREFCRkxRWGTh0s7PzsrN1uRtXGhuWlhp7t7a2d3e1NPY2uDc2t3U3NrO +zcvK1Oz9Tzo1NTI0Oz1BWeHQv7i5ubvC1HpOQD4+PUVbe9rKw8G/xM3X7GNdaWzz1sq/urm9 +vcVbPTAkISYqNFPZxbWtrKywv3xMPzg4OjxL58u9uby/x9T5V01KT27k18XAwLy9xMfK23NO +OCwkHyUxU7+2tbSwr7PBWTo0OT9JVnPWw7y8v8z0Z19YUlBd3cnBv7/GyczNycvo99r0Wz8t +Ih8mMuy3srS2t7m93D8xLzhM283QyL66u8jzUE1WcO707NTEv7/H3v7s3d/d29rHvL3PSy4f +HSIv+bWwtbi+x812PjQ0OlDIu7/DxcW+xf9JP0Jox7/Dx87Px8vrWEpFVdXGvrq/w7/aRi0d +GR4uy6ijrb/V39HMVjcvMkq8rrC/bkthyshcOjM57bavtshhWt7X5VpHRvu9trW8zt7KwGsv +HBYaLLufnqvLS1TIuss8Kig2w6urvUU1Qcu0t+80Lj3Jrau5eT88UdLL6lBO47qvsLvTYuXa +QCkcGB07rp6dqtlCR9u+x0IrJy5psauwyVBGa8bDdDswMlC6rKy4dT9AW8q9wuFf88m1r7XF +Uy0hHR0kPMauqKu2v8nU2XtALywuPdC1r7G6ydriY0U7ODpVw7WwuNFXVGXZyc7taF9u0sK7 +trxYLR8aHSlurKSos83nyri1zjgmIihCu6mpr77Z59veUjszMz/QtK2uu+ZKP0Vb39Ta9WD0 +w7Wvs/IrHBgbKG+rpKevwsW5sLHGOycfJDHkr6mqsMX7U0xOVlBMUmjZw7y+y2tFQU7avri5 +v87e1M1mNyUdGyAzxqukpq66w7+5vNg9KyQlLle6rauvvdJkWW3d2eVqTkdLV3TazszLycPA +wL/Hz9rpVDssIx8iLEm+rqyutLi3tbW+bDYqJicuQtm7tLW4vMDDxcXNdk9BPD5GVe3Qx8G9 +uri3ub/L3l0+LSMeHSEuVLyurK2urKurrsFDLCMhJS5F1ry3uLe1s6+vt8pRPDQzNz5KX+HN +v7iyr6+1vstpOiogHR0hLUnGtK6tqqakpKq8SS0lIiUtN0jxzcS5r6yrrbXHX0M6Nzg5O0JP +7MO1rq+yucTKytdHLSEdHSMzZsK7urivpqCgp709KiUnLDI4ODtMz7KopqmvvtPj+VpCNS4u +N1DKuLS3u7u2sLLHPicdHSAqOEZIU82voZyboLJoOTIyMCslIyg407Cqq66wr66vufY5Li0x +Pk9YWGrPvLKusrm+y04wKCIhJy43PkvZuKienaGrvW9EOzEpJCMoMU3NvbeuqaemrLnXUj86 +ODY1OUrfxLm2tbO3xHw7KyYlJyksMTtcva2mo6KlqrPITDUtKigpLDI++r2xrKmoqq63zks8 +NzY3Oj1FV9LBu7OwtcdMNCwsLSwrLTNBdMKyq6aipay4xnU/MiomKC00PUnqu62qqamssr7m +Sj06Ozk7Rl7cxr65ucHVRjEvMC4tLjY+Tte/tKuoqq6xt8tZOy4tLi8vMDxfyrqyrqysrrnB +zWxIPz5AR0tSfs7DwsnMXTcxNDIvMDg7QWnOv7StrK6usr3ZUzw1NTMuLztEU8q3srGurrK0 +uc9cTkc9PktKSWba2NPOVzI0PjQvND0+Rt3JvrKwtbKtssXWe0Q7OjYwNz87RNXBwbqvsLSz +uszR401EU1FET298dXFmSDo5OzgzNDo/TG/Pvbe0tbGus7zK7VZGPDY1OTo8S2vcy765t7S2 +u77F2GheWkxLT1lhXFJUTj04Ozs2NTxDTHLUwrq2trSxtb7K2n1OQTs7PT4/Rlfv59fHvru7 +vL/Aw87d7WlUVl5dW1NTT0A5Oz05ODw/RE9u2si+u7q1tbrAxMznZk9JSEdEQkpVVFz518nB +wMHBwcXN0t1iWmFeWFFNTU1FP0NFPz5ARElTZuvQxcLGw7/Bx8rQ4+1+XVJWW1VTXmf93tPO +ysbIysrN2O1fUVFRU1JVYmZdWldRUFVMRkdLTU5cXmHi0tbXy8jO0NHPz9Ph8eTg6Xz88Pfx +7eXk2N/v7PR2W19nX1pYbfPs8unk6/ZwX1VNSklLS0xPVV9ha/Lh18/Pz83Ky9Db2N3o9W36 +8+vs8Off3t/p8np1XV1taF9kevH69e/q6u9uY2ZfWlFNTEtMTk9XXGZz8d7Wz9HOz9jb3tbc +4t7b3Nzc393qc3piX2RkXF1kZm557OPg3d/f63h4cHpfWFpcVVJRV1VVXGF17Od++ujp7Ovq +5N/i7evh5Ovl5uPz/ebt9PX/fe3f397s4N/n5nro/G5xXWpiYVtZXltgWl1jV1xiX15n/Gt6 +cGl2du537vfq4+bs+OPk4d/V19Tc4OTl3tbY3uJ88X56b2V5am1vY2FeX1pdX11eXl1cW2Ff +YWdy/HF8bGh2+3lpa3b86eTg3t3f39rd3NjU197b3+Xe3Oz5+mxdYVxYW11gX2d2cHl5dnj5 +fWZoaWtqaGZqaWloaXH++vn+e3bu6OPf4+De5/fx4+Xv8n568nxnaGhma/fv7uzq7fZ+fPTx +8vH7//n4/HFlZ3FhXmZkZWViZW91/Ht4eH9//e9zbHZ2e/PxfvTt7PPv39/k6Ovt5eTv6u3u +7PlvaGprbXdqaGpta2RkZGhrb2doam1ubG9vbnt5dvnt4uPo7vD27+vq6e7q6n356unm7X3+ +eHBuZmpvdHRuaWdqaGRq+ezp8/9zdvHp8HpzfHd19/r0+3f5dW98dm1oa3b/fvf1/O3u/u7l +6vP27/L58OnteXR+e3v7eGpvdHpvZnFua2tz+e3s7/t9+n1+/PH7fXJqYWJxeHt2/vzu5ubx +fHr+/fz19vvy8vz97ebs7ev5/3Zta2l+8fX9emxqbGpqdPrw73lnb25qbG97en15/evo8P7y +7vR+/Hhyc37y7uzu+Hd3/PTy7+/4cG94/e5+/vn8dGtsd31ub3Bpanz5eGxz9/J7dX1tcX7i +5vvs7u7+fOzu+3Bydnl5f3plZnN5dG568u7v6err5ul5amZu//B4b3VrY23193v28vpvbvPz +/Xv7aOPjeef35Ofs9fZ4cGZmcWpw9PlrYnrsbG549H9pX+nedHV9cHr09nfi33H88+Xw/vN9 +amxran/wem1+9XN77/j7/fb08uvyee9/aGr7fGZs+e306OT3cuz5cd/X1c/W2Nvf33hYVVFH +Q0VDP0VJSU9i/t3OzMrEwsXIyM7Z2t18a/15ZGr78eLa2c/Oz8jIzt1aSUk+NTc6NjQ6QUNM +b9rIw8K7t7q8urzDytPqYU5HR0M+QElKSFBw6NvNxb/Bv7q8vr6+wctlR0RCMy41MCwvNTxD +TurHv7+6r7K5uLW7yc/c/0s+RUQ6OkVIRU/12tHMxL2+v727vcK/wsrfXko+PjItNTAtMTc7 +QFrvyr2+t7G0uLe1vMfP4HNMQkRDOzlDR0FKa+Dez8K+vb67usLGvr/O4eNZPDw+Ly8zLi8z +Nz1QbO3FvLq0sLK2tbe8wtXnfEs+Pj47OD5CP0li4tbMwr26u726vMXExtb7bFtFOj05LzMz +MjU4PElv69G8ubu3tLa6urzDz3xvWEM+QUM8QE1PVWrg0cvGwb2/w7/Cx83P09t5YVQ+Oj82 +MDQzMzY8Q1J6+su9vry2tLm7ur/Hz/RzWkdKS0FCS1NVXujXzczKxcTGycbJ1trZ6GldWkc8 +PTw2Nzs5OT5ETGrs2sS9vry4ur++v8/e5GhZUUlKT1NUcN3z4cvGysnGydDb3+NzW1hYTk5X +VU5ESUk+QEVHRUpSVWrs4c7Dx8zDwcrKys3Z7u92Z2No+HRu69PV3dPS3ufwb1dSUExMT1pW +bejt79jU3N7R9Gj8YVBPVEpJTktPWFpcf+L82s/a28/P29Da2NPf3urw3e7v82R88V1e+H5j +cebo9/Xf3tzm7d3dbGJyX1VWW1hPTk9TU1RaYfxcYOxv4dzc5PXg3tvr59jj3/7mc+vj/drm +3N7k4nLu3Pjd6+PifnJlW2VVVlxXWVpWWGdgbHfq92rt8vrq+ezh8ev8/m366On4a2xaaHtr +cft6cPju9+HZ4uDV3Nzk6uPv9npkcXhaXl9dbG5z6vJo7XBt8WVseGpeWmf4+Gl6d2326P9t +8fhw4PZp7Oju6OTs7t/d6Pvr4uTifvJxZnxjbWheY2luX2l1dP3u5+/w73ZjbmlubF5tcWpx +ffjr4uTt6+bg9P7l7G1h6XBqc/fm7v9q6/Rmb2x3Z/h5aOvo3eTo63z47vPwbWl5629hcGJf +X2BkX/5uYml1/fnx8eff5d/w7nf95ebs8+Bvb+Xi8evz9ex7dX5cZmTu6mlpaub+W2T5a3Nv +bm5+aWX7fnp649r6bWrt8fTpfOt8fndrfmb+Z3v0+/Htf25zet/p6efs7uPuceb0dnn0b3V3 +avJf63Rqc/17aGhlVFlgbGL+0NTT7PPob/3s++5lZGx+bP/3e+7r3/T4b3Rf8nXma/tuXPNw +9XXwcWjoenteYv5m7PHw2vTl8Ozh4fF/3mlnemHudfRvXehqdXnl8OP0ZPFkZ1NiW1tmYXlu +2GXa9ePZ3dRq6XpvemTceedh9+li+nrz8nDdZPnuYvFk31t+bFZ3duJd5PpmznFrc3Z1WeBe +6OJv7vfP7n7Zatl8fWll6E/r92tnWvpl3vdf6F9rWm3tX9327d/y6n/b7vbq8e/sfGNu/2Rn +Z+vq+3Zg7vB+9e/0bvT1e+557ex3anBrZFxcVVlbWlxnbvvq3+zn3d7c3tnW1dba1dfi3tDY +4+bm39neeFVWRDs+Ozk8P0NK+93Pwr+9vLvDy9HqUkQ/P0RJSVH9z8vHv768wMbJz9Lc5+rz +3+DfZFFHOTQzMjI1OT9Od82/urS0tbi8xdlrTT87Ojs+RU9r0cO/v7y7vcDFz9/tb2FZXn7l +2+BqXEg5NTY3Nzg8Q07zy8S9uri4usHK1PpYS0VDREdKU1v51cjCwMLGx8rQ435sW1pZYmtn +fuvr7H5gU01KSEdGQ0RITlpdaOnZ0MrLzc7V2eP1en3z/Ord3dvc2Nnc2dzmd29mXl9cYmz+ +9nd4+97i+XZ07PZ8Z1xbVVdWWVlWWVpeX2x6dH9kYPzc6/Xe3N7g4dvY3t7W1dvc3N3rZ/vn +8HNgX2hrXGfn7/5tfu15anPm921jZ3RpYF1qaFxcV19oXF1ne/jy8t/a7uzf3tnl7d7f9XL7 +7fBsbXt1d/vh2trf4t/k9HRxeW5nX1lbWlRVXXLy/vrh73v+9et0X11ncl5favTt79/d3/Hz +6t/jff3p5PxvfO3j6vPu7+zr7PXxeWNsaWNdW2lwbGFre3T/d3p9cGxscPH5b/nf2+Le3Od0 +bn1+cWhhaG9pX2n38XJse/Tn6OXe4+np6/x4cXT18fR7dPXzc2z57vn+8+37cGzx7nJgXWtn +VVRfY2dlfefj93vl3uDo5uLl+H3s6u758uPl8u3g4+v/d/lxYGFoa2VkYXJ9/Pf9+nt5fnlt +aGpub2588+vm5Ov87+/0/m9z+fl2e/x+fnJ+8vZ+ef79bGn67fl49uvt3+Du6unl9f5va3Fi +ZXD/d3v8bWb35+3+9PrsemZqbmlfefpvdPn07GZtcGp3aHR1b/nk7m7x5fzv/fLi4+Tg9vPi +7PRuae99bHv65P14/nt29utgXmVoe2dt83Zt+nhvafbs5nJhdWF45HFz7uzm63/83XVt3fll +Z2vv7OLi+3ju6fl89nnw/G9sZF9rbX3xam11bW7z9+ft7/X+dV9j++zm8W5t7N3ubnX1+H32 +7XRp8OjyeHlnXmju8WppbPvve2tqc/nf6vfj6vH+ZFpi/uXb3evq6ebf5u55bXL56+5rXl1c +ZF1QTEpQXF9jc+3h2NfX3uXb1tzm7e/n3+Pf29nU19XOys7V2Nzd6fP+aUIqICMuRmby1Ma9 +tK6tt9JiXlhFOThAVtjBubi9wL6/z2FOTlNRV2b72srAvsLP2M7XRCsfHSAsRNLBvLKrp6mx +wXBGPjo3NTQ6Wca5tbe5u8LSZElES3PW1tvRwru5u77Hzu5VST8yJx8eJTbhvbexr66sr71s +Pjg3NjY5Sdm+ubm+xcXL2mNNTl/czs/X2M/JxsjP2NHMzczUZkg7LiMeIC9mwbawsK+ur7h9 +NS0uMztCZsG0r6+6zeJzY1JNUlnz0MnR6+nVz87O0M7Hwr7GdkM0KB0aIjvJs6ypqKiprtUw +JSUsOlrLvbaurLPMSzcwNkNf3869uL3L+l1i8dvg8tzJw7+6ubvOOyMYFiBAu62rqaimpbI+ +JR8lM07SzMayqaq4ZjsyMzg6SM61ra64zVtLTEc/QmDKvru8vbq0ssguGA8WLb2oqK2spZ+m +VCMcHy9vx9bcs6OirmIvKS4/SkBNxK6qrsVNQk5TS0hU2cC6usLPxb7BxkciGBgoerassbiv +qazRMCYmNPbJ19+9rauy4zQtNk/vaVRpvq+vvPpLSElIPDtPyrq6v7+8uLnMakIjFhoqXK6m +qrSvqK/vMiMiMOHCy8W2rau0SCkoMUrZzNTGs62vxkw2LzY8P23CuLOztbS0vlY2OksvHx0l +S6+jq7++s7PNMyIiNse5v8fAtK6+OicqQc++v8vKvba/TTMvOlLl1c+/tbCzvMLMb1BHRtNh +IRkkRLmnr+jYr63KOSYjPL2+2ubMt627Oyw2Ws7G0tvFvstpQTtL++jj1MvAur3Mz8W/yNnd +5es9IBkfOtGytcK1qavIOSoqPP5hTPm5ra29SjpFXFtPWdu/vMTM2erfdklBTmXqysPDv7y9 +xM/oVVtBHxgiPMuvtsm1p6vMQS8tQFU/Qte4r66/TEp3ZEM/S9W6vc3IxM3eSDU3RVjovra4 +trS7xvA+PT8pHh4oVryxuLitrLTVPTI4QkFFYc25srrVW1hoX0lDWdHOz8nKys1vRD4/SffI +vLm5ury+zFxOTTAjHyEx3r64sq2ssLxQODk4NThI3r+1t77H5F9tTj9FTm/NwMHKytV+VkE9 +S9nDvr29uLK4x87uMCMcGypH1L6wqKeptl48NS8uMTpkvLOztLnN+lpFQEA9Ss26uLnA1N/l +Sjg7T9fCwL+4srO/zeo0JRwZJThTxbKnoaKsylc6LCotMELPvLKsrr3VYEg/OjY7Y7+6u7zA +xc5aQkNR89TOx7y0sLG/Si4iHB4kLEbEraahpKu02zcoJyktO1TNsqmpr7vI7kg3MzdG6s/G +ura6xupnaVxYW2vez8O8vMhNMCMiKCkvQcuwqKepqa/ASjArKy8zOE/Crqywt7u90FE9PENK +TlHiysjO28/BvMPb5enl3GpEPTkrKjA3PmTLuayrsba4xlY8Mi83OztG+MO4uL7CwcjS5mNY +VFNWW2l+anvezL67vMTBvsvoRDMoIykqLjlPxK2mqamqscNjOy8vLi0xPWbIvbq0tLnBytXd +7V5NTFZjYFRU+8y9ubm7vLvJTzkvJyQlJSo2SNeyqKakpau1yUc1MC0rLTZEZs2+uLOytbi9 +xNLtXk9HRENCREhd0L66t7S1vNtFLispJiYpLTrnva+opaWnq7fLWzkuLCstMjlO3MrCuLSx +sri9wcPSelZMSEI/PkhbdN/Tz9DsWVFGOzUzMTU5PlfPvrevra6vtsHdVkVCPz0+R1BefN7N +x8HDxMLDxszS43xcTkA9Pj9BSFFf79/e2+VyWkpAPj9BRk1tzL66ubi6vcLO5W1cUVFVU1df +eO/i3eDb3f3v3urv5nJiXFBLSkxKTGHl0MrFxMfO5mxVRz48PkJLV2Tt1c/Q2Njb5O51fnrp +4NrW2tTSz9ba3Obb3OHy+nppXlNMTFFYYerc2dDKzdPlb1dKR0ZFRUhLV2vv6+bl3dzram5r +af145djWzM3PztHY493a3uDmb2ptZVBOUU9UX3zd2dbOzMjY7GpPTEtIS1BSXnZk+dbc3Oln +aGNfcXl593d4b33q8+/y5dbP0c3S4eDp719cU1RvZ/Xa1c/O0Nh4aFZWT0xLTk9ZVGf5e9/f +9+Xc5Opnc21ueGdhX2lea3/619bT4NrR6OtoZWBjW251+dzm2NfU2eDld/BgZ1JaTlZTUfVs +6nzg5+rg8fBt9WpvXGdgXmde+vHr3N/b2+Ls+mpob15eWWBke+v039za1dvY5d9ubmFca2Rr +bnN0fWzvZnnqaXxfYVpaWmRe/3Do6vT68eDa4d7v4urzc2xnbnrzfnzt6d709nh2cm1uYGdf +ZGl89Pbo+ubs6X73bGVlYGtmZWZve3P6fO3v+Ozv9X3+dXZ0Z2RnaHR4/+zv6eHh5eTr9f99 +dHJ1+Pj7d//+b/14eXZ8+Hl8e/n/+/H4d2VnX1ljae/u7Xdwbm79bnhv+v36a3p39/F+8v32 +8X967vTf3+zgd/Ln8+b08vH39mtlX29YX1tcbmd7ZnJ6XO1y7dXn8d1sfOxn53l88W3h337n +7XDl82Xtd11qcGjs+vHoZe3qbe7sY/fmXmHrbWDzZ2lzbfPwbPLvevlmb27+7PPq6O/g5ffr +/H15bGxtbHJuanrs8vXu/nP6fXJ7cH33+XZ5/vnv7u3q/Xvw+fHu/fl6anRxb3x4bGx0fnxr +ePjx7ufr7PB9dWx4f3b4+nt0dnn4+/fv/XFzbGVtc/309/Xs6vHo5u38/Pn1+m5rbnp89+39 +c37/fvz57/b4dmlmefv/+Xd09PHt7/7r7fZ8bWtqY2h2cHP0/Xf58O7v7+vs7+zu+vjy9Ph8 +bnf6/P3xfHJ7fXN2b2tvc25oZmltb/7y8+3q7ezs9fr7+/Hx8X93/X1++PX9+3hzeH97++vy +fPj58v5wbm547+7y+P769vV4b2dtaGBve/j5+Hp773/t7vXq6Pt4bGzy5fbr+fXi6ufv9/bl +8mllal9fWlxmXG/o7Pl/7+n7//Zvb3t+397h4Obd3er29WRaZu9eXXt1c/t67vToeVl5fHrg +3t/f2d3+e/JlXmNhW19kZ3D75uvm5/R9eP5oaf5yeeXh7uzl3+Lm+nbs6+vo39jc2dXc3uVp +VEI7PD0/SE9c8cy+vLy+xc7afVNJREE/SV352MrDwsLDytnn/2pjXGngz8rIx8zlTjcrKCwx +O0diy7WrqKqxwHVKPTItLTNF07y1sa+vtMB3PTIxNjxIXNrAt7S3vcnY6lpGQUdLYdXL4jAo +NDY8aUxNwa2nq7O/UU1XNi0vNUjPuri+u7a9yOhEPD9GTlNf69K/u7/CwsTJz+ZbSzosJSUt +OlzLwLWrqKu220I2NTIvM0HeurGwtLrA0E85MjQ6RvnNwrm3u8PXW0hITVZ6z8jEv8PBwM5v +NR4eKy894sy5qKGlt9ZPNDAwKSk617q0rq2xtb9JNjU3Pkxxy761sbvJ1nllZFFNU2T379PO +WTsuKCw3Pkf/wrKsq6++1lxCNjAxN0Lovbe0s7q/yO5JPjw7P1rTysTBxdT39W1cWlRQcczD +xcvMx8LGQyIeKi82S1jcsaOgqrnFWj88LSUpOGbIubCwr660zVU/OztBT1FY28fBvb/M1drd +8V9hXk1COC0qMkRc7dDJvbKus8DYVkNAPjo7RV3Twb3Aw768x+FbRD5BR0lOYOTWysfLzMzS +2/teXmb23Onsz8jyNCswNjpUbVfduqyrsLbLT09POjAuLzdPxru+u7S2uLvWRjs+RkdIS0zy +vLKztr3FzNPeUjktJyQpM0Bp0cm8r6mnrLnYRDs8OTQwLzdPy7m0tbOztLfGXz83Njk7QU1i +2se9uLm7vs72b19YTkZJTz82NTM1Q+XHwcbGxb+2t8TsRjg5P0tKQUZR7cG3t7m9xMTM2XxO +RT89R2Tcwru9vr++vctaOSsmKCktOUvjxr22sq2qrLTEVTw4Njc5ODc4QfLCt6+vs7W6v8vn +UD83MzI1QVzSvre0tbi9xczVVTYsJyQoMD5mx7m0sq+usLK2w2k/My0sLzY7Q1fdwrWurK2v +tb/pSjozNDlCVd/Ivru5ubzLUDgtJycrLzxZ0r64tbOzsrK2vdRMPDg2ODs9QEdY5cq9uLi3 +t7q9wdhPPzs6PUVOYd3Mx8LAws/8VTwuLCssNUrYwbu1s7Oys7i8yetdRzs2MTE1PEpx08e/ +urOys7a+02NJPTk5PUhk1srHw8PJ2l9CNzEvMDhHY9zJvbm3tre7vsfYXkQ8Ojk6PURLX9nG +vbe0tbm8yNx4UEE+P0ZQaOXf3M/N0+hRPTQxMDM8S2XRwLq2tLO1ubzG3ldBOTU1ODxGWOPI +v7y6ubq9wMvsXE1CQklUZXvk4dzU095YPzk0MTU7RHHOwbu4t7a4vMbZfks+OjY2O0NPedTF +u7i3uLq+yd5bRD0+QU582MzBwMLEyNZWPTIrJyksM0vVvbCtra2tr7fF9z8vKykqMD1eybu2 +sa+usLa91048MzE2PVHVw7y4tri7vspZNigiHyEqPNy2rqyqqaiprbpfMiciISYvQ9i/urKu +q6iqsshNNy4uND1LcNzKvbWurK+820cwJyIgISg0VcCvqaWio6etwkYtJCIjKDFF372xq6io +q7faQTEtLzU/VPjWxru1sbG1wfFFOTg9QTovLC0zVr61sLG3uba2vnk7LCgtOk7Wyc3HurGu +ssJNNC8yPWfm7+LYyLu1uMXgX1NVVktKTV3QZTk3Mi9G183Bv765s666bEMxLjpBRVBc272v +rbfMYD07SUpHSUtkzby5wtTsZuXXXkY/Q1zNvbq9yUMxNDM0QEdL9L2vra600ldPPDc4NjtP +zby5t7rDw8Z1Rzw3O03u2eTm6NPAv839TkhX4MjAv8xZPTY2OT5CQ0/Ru7CtsL/iUUA6NzU2 +PlzSvra0tba801E+NzlEU11k7M/Fv8PR+VVGQ0dNaNzX09TOy87Q6lVMSktVbOXgblpdWFZc +WFdo6dzc3djSysXL415RUVlocXF6dHHf1dTW3/V78NvPysjkRzs5ODxESU7nv7i2ub/N3XhQ +Pzo5PEdYfNTAuri6wNFrUEc/PT9FT2Xj0cW9vcXXZE9NTUhDRk1f08fLy8/Sz9h7U01MS1Bf +aurT09LP1uP3ZlZUWl9aYXJ069nS09v3ZF5dWlxpaFhZZ2702tfa0s7S3ePo7ujqZFNPT09W +Z3B56d7U0Nbc629eVldXUVFUV2Ds1c3LzNPb5HVjW05OWF1fburY0NDV2tzY1drf6vhpV1FU +V1VUUk5UYXH87+Xl39nd+nB6+Onl3uDf2tza33JeVlBOUFlfbeve2tXU1trl821ZUVVbafLp +6OPh4+LrcWdlbnb+9Px9+uvh3+bzdWllZ2lrbG9yfH1saXRwbP73/u7p7fv56ufvb1xYXnnp +4t3f39za3efyfG9vdnb+f/Lh3+n6a15aWl1ZWFpj/fb39ujremdmcXvs7O7s5t3c3un1+/H1 +/P5uZmtycW9oZ2Zqb/bl4uDd2dXR193pbFtWVlRTVlthZnPv7Pl5bmdrdHr9/fTm4uTf3t7n +9G9tdnhxbnJy/ert+fju8Xn8+ebf3eDo8PX1/HJraGZob21rZ2NhWlNQVVhdYGNz693b2trd +4+Pt6+rs5uns5uXm5Ofs+PTt+vju6u3j3t3f6fhpXVlVT0xLTE1SWFxfYGh3/Ozd29zd29va +2Nze5ezxcm5z+Ozn5uPe3N3j5Ofo7Pnx7PPz6e97Z15dU05NTExPUlZWV19rb3vr4d3d3trY +19na4uvi3+T2bmx49ujj6e7w6ePi3t7l+/zx6uXm8HtuZl9VTkpISUtOVFtpdn3s5N/a2djZ +3d/k5evx9Pp0bm989v99fn3w6ebk4ODj3trZ2NXZ3OP0/WlbVE5LSktKSkxPVl586tzZ2t7n +4t7f4+nv7vHw8/Hx9fX48O3s5uXp6+LZ2Nfa3uLk4Ofq925kXFlTT01LSUdKT1ddZXzk3NfX +2t7e3d7h4+jl5+3zc/z5fX95eXvz6+Ha1NTZ29nZ2NjY2ebzblhOTElEQkNGSUxPV1/83t7V +zM7Pz87P3fV1YVlYU1BXX27q2c7HxMbIyszS2t3d5+3r49ndYUs9Njk6NjY7SGrVw724tLi/ +y+RgTUA8Oz9KTl3czMPByMjEyNV5X19cX2du4szHx8bBv8TK3VVEOC0rLi8wOU3av7azs7C1 +wt5ZRTw4NjlFXuzNv7q4ur/M1ehMQklLTVJe6sq/wsO9vszZ319KPzctLTU1N0b3yby2tbOx +u9hfTkE6OTtDXm/uxru+wMPRfmFVSExdVlfv2M3Hw8TDwMrc5PxpWEM7NjM2NjZAXdrKwLm2 +t77O2nhKPjs9QElc6My/v8O/w83Y62RYVlRTYXx369HMysnM2n/o6GJeUEI6NTY2OENOeM7A +ube5vsTK6UtDQT8/RFB638/Cvbu/ys7U8F5STk9OTVrt3NTKyM3MzNjh4OlaQDg0NjMyO01c +68O3tri5u8HVV0hDPjs9R1Jd4MO9vb6+vcXdb21bSkZMU1lj3cnKzMjH0NnT3WRDNzM3NTA6 +TlNdy7m3uLW3vs9nT0lAOz1ITE3+ysnHvr3ByczP415MR0lKTV/h1tTKw8XHycfLWEFBOjQw +NDw7P2PNwb63sre9w835SkBBPzw8R1de28S/v769wMvR3mdVSUZKTFP81tTNwb7Cxcz+TD47 +NDA3OTtDWdrMv7i4uru+yN5nVUg+Oz5ESE/81NDMwb3AxsbJ3GJeX1JPXWtt7tTNzMzZ6mJP +SDw6PTs8QE9l/tLGw8C/vsTO2eR7WE1KSEZGTllf69DIxcTAwcnP1eJ8bm1gWVxgX2X56vdj +XVxHQEhIQ0FMXFZf2s3Oy8HBzMzJz/Bqc1pKSlBSUFv57uDPysfHy83T2+doWFJPT09TXm/r +3d3q/d3yTVJiTUFLfVpM+tHqbM/H3fnW0n5t3+haVXV5XWrtfN7T09rb0dbe7ntfUU9PT05X +cPvp2dDQ1trf+WVdWVFNUVhVWGl2evvp4ujs4ur39ev5d/J7dfXo39nT09rb2eH+bWJWT09S +U1leb+vf2trV193g7HloYVpYVVBRWF1mbfjn7+re3eDn6OxubHb9fPnr9urk4N7g5ezudGJZ +W11YWV9odunk6uLa19jZ3/BzbWNZXF5eXmJqcOzg5+ni3+ju91xVZ3pnWGfxeGVw5N7d5vbw +fmlmbP5zbnb28u3f3tza3+bi5ef1bGBjampdW2V2cGjx3tvkfPfudV9jXldaXF1gc+vn6PPr +3Obw6vJ8dGhq9Obm5+Dc4Ojm3N78bmdsXVtbWWNraGx26d/59+vl5nZ4YWxrcfNbe/h8993p +2t/w63h39Vt0ZWdpU/lr6OVb299q6N/j7ep972DgfFzpdPL6efvi9fxi79lg5WpcafZaXHd2 +bG937eva8nfgfW15/Hn25Xts+fvueGjd/n707Xxf+2r/X/VwffTs92xx597x+e/s9HL2bXL5 +Z21x9m/z8/7+6PhkdWNoaWl0d2585+d35/3n2e/9bHxrbXT67+l67m3m93Rx//p+6PNsZ31o +bv756mxua3j99vj8cX77Z/j143by5+7feu5+fX9tdX7te/9ode79efXmb2vseeX36vRce15t +cn79/Pbn7+lreWr4+3P7cOhf/W/v5Oji7PXx+Ofu4XjmdHFva2l8dGlmZmz7cGhtemr6//Xv +eezv6f3m3u3uaOP7999p+19wcXdqeGvucnjrevh0aPFmZ29ycH1z7t/j3enr7H717O/p8H1t +ZmptfW9sbWhxbnXs7/f8f3Bycf53b3x89fv49vP9fe7v6evyc3J57+n3/3d17e/3+/5yc21k +aG93+Hp4+ubodnR59/jzcnBtdnRucHP68vZ6fu3p6PHv+/Tz9Ov+8Ox+e2hyfnhubW9oZmRu +eXl87uft5OPi53359O/5+Xlqa3B5+Hhv8G5+fnh+dXRvc319/fp2bGhzeXj3+nX2+Ovh6/P3 +cXF9/enqcm56b3F7+fTwe378/fDufGtqcXRucf39+fv78Ozq7fl5cnd3bGllZW/+8vDt7Pxw +b2948fF+cW98fXn+//Tz7vDt83Ju/ndxf/Hye3JydvD1+fh3c3Zwb3JubWVlanj79/R4+fB6 +9fn67e7u7uzk3+bu9fj1/v9uaF5gbm5qbG9pcXFtbHJ4bWdodnv/e2p47vX47ODd4Obo9n17 +dHZ2/ebg6vV2dHNpbWplbXVub2tpcHpybG12/nr89XFy9PTw6PR3evjp7O3s9nVsb3d9+Pf4 +fX709vTv/21qbnp9b3Jtbfj4fW5zevf9c/Xu9nRsam148erp7fR9+/H29uzufH16fvTz/vf+ +/fF+cG5zcWllbHZ2bmxscf727fdz//Pz++/w93f48XBpePbt7/5++vp6eHX88u9l59V+4uzz +6d5yYWRob1NH7udNX+bi/s7fXNHicOnq7ndw9WZ+3XN16910Yup8ZG7semnl3v7/4/BscG5q +ZmhfXmheXffuaHfe7nH1+m9renZ86HB46vDu4t7n6OT0dufj6ubg6tvT49rT1tzh2OJtXEpD +RDg2PTs3PUtSatfKx8G9u7u+wL7F2N7vX1paWFhmfurWzsnCwMHEzdleRDw1MC4uLi8zOUJY +5sW8tbOys7W2u77H3XNfTURCQUJFSU9f6M/JycC9vb28vsvN0GNAOjoyLSwvLy82RE9fzby4 +t7Gtr7S1t8PW4FdBPj08Oz1AR05r2MzGvry7vb29v8bM2l9HPjw4Ly82MjA7Qktc18XAvrmz +t7q4vMfP3WNQRkRGP0BKTU1YdunRyMG/wL29wL/CydHdaUtAPzovLzQxMjo/Rk1+zcnHvbi6 +uri6vb/E0vxnWk5JR0RARExOV2/n3M7Hw7+/v73Bx8jS8lVEPjg1MjIyMzc6P0xr1Me+ure0 +srO3ur7M1t9tTUJCPzw9P0JHUGXj1Mm+vby4uby9wMbQc11JOjkzLy8uLzU3Pkxm5se8ubSy +sLK3ur/M3OxbS0U+Pj4+RU1VZ9rPzMO/v7/Av8TN1OH6ZFZQQz09OzY1ODk4P0lOXN3Jwb67 +t7i5t7m+xc3gWk1LREBCQEBIT1h43dHKxsPCwsTEyNPX1/NqZExBP0A7NDk7NzpCSU1t0MrE +vLe2ubq7v8rR1PdZVU1GQUZKSU5Za+7ezsjHxcTHyMrV4uN7WFJQTEQ+QD85Oj5CQEhjdfLV +x7++vbu8vsHHz995XVFOSkdJTVBbcufVzcrJysvLz9fuX1FMS0lISU1OVF5nd+nf6ufh3+Xy +8v5lYGNjXV1mamZfYnjq5t7a19fV0M/Q0tTS1tvp/mhZWFlVUU9RV1haYGv44dfX19XY1NTd +7HJoW1hWVE5PU1RVWV1bXGh96dzZ1NPV1tTOztTX3Ojz/v9/bWBfX1tfbWllbnz17OXl6ODc +6e/7e/xxZl1cXVpYVlVXXGx/8uno5OHg393d4unm6uTm7f11dXF1/ftydnVvbnnw6OTn6+rl +6/Hr+Xr9fXVtbGphXF9ma3Rta2xuePLr9fXt6ezx7+vq7fp7/X5+/m9ma//69f55/vrw6+jl +6PT++v9+fnhpZGp3dHH9+nJ9eH34/ufe5PPx5ut5a2hrZ2Vsbm987u738O7r+f1uZ19dYV5i +bvvz6eXi393d3dva3ufs+WhnbWxvcm1re31tbGtobW5pa3BuZWFkZG/8/frq7vfs5ubj393e +3tvd5e/6e/L2f3h3bWdtbm1wbWpoX15nbnBze3p7fvr08Orr7eji5OLr/Hb69HZtc29wdP/x +fnrw9G9ucnV5bGZqcHh89+3l5+Xf4uXp7XlsbHV8+e7q9m5z+nhwd3trYlxLX9xq7+3p4ujq +6vBsWHLV9/l89ujt5OPyZ19PVdjma1Fe0tjV5d7Z4nVjdWZgX2ZibXj5eWlgXO7y+/H65Ozo +dP/r6/lubHf7fHBzef3z8Gxt8+rldmdvfvZ8cHD47O3w7Ojq4/dlXW33fGtv7+nn9HFpZ3L4 +em9ofu7+eHNxdv9zbn99d3VvbHb06+Lb19vi6vDv5O12amFma3n3fu3sfWxaTUZDRElSYd/P +ycXHxsjO4mdWTEpNT2Tb0MrHy9LW2eF1am5ubvjdz8vK1GA9LyspKzVKyravrrC0ur/NZUI2 +Ly83Ss+5sa+1wNleRz48OTg8SGbHubOzuMXjV0hHTE9Zbu3VxL25usdEKyMeIC1LuammqKyz +vsx+PzErKCs71K+lpKq26j42MjM3PEZmybqwr7fHY0VET3Pay8jExNH3Si4lIiErS72qpKas +ssH+RzYtKywzXLqsp6iwwnxCOTcxMThJzrOtrrrzPzk9VNfM1PJq7Mi5sbC9VTEhHB8mPrms +p6aqsrrWPC4mIyk52q+mqKuyxmpGMiwsLj7FrqensM9IOTlEUV1649LBvLq6wc7WYT4tHx0i +Ld6sp6est8fZTjYuKSw82basq7K8yN9pRDQvMUPCsayxyVxLTFh9al1YXtXHx83Qz9XQ1VdE +Pz04KSUuPbump6y+SDg+QUNDOT1dw7Gtr7vJX0E+PEJtz8jE0Prr1M3I1VxLRk/jycPM4WZR +W3H+6t93Tkg/Pkk/OT9M9r+6vcxZPTs9RvvHu7a4wNDwWV1uaXh18NjT2ed3+ObZzt1tU09a +Z/Dn39/u7/fc61ZGQEFGXGniyMjbTD89P0NFVnrVzs7PzsbDxtN4U09YcNLEv8PPeVNKTn7Q +yMfL2mVUT0tLVfnS0uVtXlFVT0xp4910X1hPVk9HPjY4R+rDuLi+xd5XSkpU4Ma7t7nEe05M +UnXZzszW2uBfXVxs5GtNTE9OTExb58nFzXxORUpaTl9lWEs8OD5c0Lm2u8ZfPzk/acW7ur2/ +xNhcTmLSw8DOZUtNXuPKxMluQzw8R1ZXas/KwshTQEFAREZHWtvaXEtPWvDkaG3SydbpeN7G +wMHDw8rcaVRedG3p083IyeFbUFdqbl5PSk5SVVhe+tbNzdVvQzU8S1nPzfBZPzhF7c3Fx8/Z +31tT3L+5uL3K605CTOXFvsXV519YWlZd9uJsbmBJP0Rsz8O9zGVENy0rOlvfysS+v+w/Pk57 +2MnDv7/O9+vUycfQ3Nh1TExb18G8v85gQDxGWV7nxsxhVG996NT7RS8pLTxS0L23t8VaQ01u +5enc1t7f4t3KxNDk4ufyal9639XNxMDH3mBTTkxOXnzVzd9edtLeTzgxLzM+S9q9usbnXFFW +XmvrysHL3/5qX1pQ+cnCxtluW2zq0MLBwc1lSEtt3szEytdkTExcUkJGPTMvND1gxsDAws5s +WFta78vIy87U4XdXUl7u6HV+1NDb2t7Y0959Z1xOU+bGvL7H2mZc7t9USEtCOC4uOnfGwL29 +wt5IOz1P9s6/vMTZWUE/S2jWxsPK4F1aYPLPxcbUb1JPWHvZyb6/zHZZd87CyV86LCYoMlC7 +rq2yxFo5MjM+dMC3uL7iST06P2vIvbnA+EpHTevEvb2/z1A+PUrcwL2/v8HlR1HNyfxHNSso +LTVZt62utspGNzU5Ss+8vL/NW0dCRl7IvsDI0n5NSVPcxMLF0vRVRkJM3L+6vcjbZVd9x7zM +QC8nICk+zrGpqrrmOS0uPWTFtLfC11RAQVPbwLy/z25ORktlzL+/yutOPjxBaMe6uL3JZ0hP +zbi72kU2KB8mPcGsp6271zstLTtuvrO7yt5QPT9S1b68zGtTTEpU5MW/w91OPjtBXcu7tLO8 +30pH9MG7w+FOOCYeJkW4qaivv+c5Kys497qzvtLeXkRBWNHAvcpeTE9Ta82/vsb1Sj8+SG3F +u7q7y1pGTe/HvMdgQzcoHylQs6enr8juPi0sOHG8tMLf2ONMQU10ybzIXU5o8N3OycXH60Q4 +OkzTvby8usFvRk7bvb9POjkvIiM03qylqrnLWzcwMT3ftrbJ1dttTkxP+sG/21dUZN7Ny8vH +0k89OT9twrm5u8LgSkRpxr9rOjkyJic3arSoqrnIZTs3OT1eu7S+zvtZVl9ZWNbI3F1UX9jC +vsPTb0k9OTpMzLi3vMXbZU9W2tTpfFc9LiksO86vrK+3x1Y7MzE6c7+7vsvke2BPTFn02tDP +0tPRz87dfmheU0hIX8u+v8PCws1sSD49SVM+Li06Tsm5ury9wOBTQjs+XtXW0tba1t5gTExZ +3crIzMrHzdb7WldsblhWYN/KxcfIvr/WUjw4Pj81LS5A8L23vcLAweBOPTg7P/u/vLy9wd5P +R0JLbNvMv7q8xt5TSEpNTlrk0svJzMzIxdVQPTo+REg7MzhCWd3OysO8t7nHXzw5QEVKWd7F +u7a6yNthTUZJV+DFwcPM32lRS0tPXPXn49LMzNxeTktQWFdVVFFNS0pKT2rcz87P1t3obFNK +T3bSycbEwsTQcE9GSVnd0NPV2+dhUE5PW2r59Obb3N96aHbs93v1+nRfUVFVXXDf1Nja3Opr +WExISExXdNrOy83W5WRXVVzw1c7M0OFwW1VWYe3WztHZ3+trW1RVX33q5vdlX2JnZ2lra/3l +3t7qaldPT1NdZezWzcrO7FdMSVJlfeXTzs/ZdVdPW+zV0NHU2tzmal9ibPby/2tfX2xvffV7 +fHJtcGphX2htZ15bVl/z2tjg6nxhWVxdZfLY0NDcemJaXHTi3Nva19vd7GxobO/q8mhVUF7+ +5+bn4eLtfmhXUllhY11eZW7s3Nvc5/x+c2pnanrn3+Hn9GtiY2p2fu7e2NnidmRleu73b2do +Y2Nrcu/j3dze4eX7bGZobmpfXGt1f3X4+XVnXVxYXmvr3N3c5Ovy/P97/PLh3N/pfXJvcPjs ++nF0bmtmcfnu8f5+c2tmbv/37vDw9HNoa2x+6OHn/Wxtbmtran/r9G9nYGRye/Xy7+z1bWZo ++uzu6evx/fXo6d/a1djh6PNqXl9paGlrZ2VmZGpmXmRpbGtkX2l09e/g5PNleNTj19bU2nRb +eOxzTkzb2fbs4uHh7Vpm6PB1aWdfUlj77Nfb1dje61ReW1ZZVFlba/h+4d/d2urt/P57ZnB6 +8OLo7fr7+u3d3d/j6/D36+/35eTo4vtjanRbST8+QT9ES1bo0MjBvbu9w83ibFxOQz9BQ0pa +/trLwb2+w8vR3XFcUlRXVV/y2dDMx8HC0VA7MTIxKy42RWrOu7Grq7C2ucVbPTYyMzU4Q/fH +wLuzs7a7xddsSjs5PT9CS27Owry7urzCz+ppUTotLzUuLTlT2sS7tK2rsr2/0Eg4MzAxNjpI +18K+uLCyur7F0PtMPz9CQUdX7NDHv7u7vb/B0k0+NS0tLCovPEtywbWvrKyvtLvXSj85MS8w +N0FR3MK4tLKytbi/z31OQTs5Oz5IWu7Lvru7u73EzvpOSj0sLTouLTxKV9q+uK6ttbOyxF5a +SDc0NDc/R1DVwb64sbS5vsfbVUE+PTs6QlZw1MC6uLi4vM36RjQzLygrMDQ7WMy7s6+tq665 +w85UPTk0MjQ3QFb8yru2s7O1ucHdXUs/Ojg7PUFP6cu+uri4vMLK1GE+MzgzKjA5OD9c0MC4 +trCut729y1dHRz46Oz5HTFPYxcrCvL/Fxs/ie1tRTElLXW3/0MXHyMLD1mVUQjw3LzM3NTtN +d9TAubWztbe7xd5hUUM+QD9CSE5f+tDGwr/BwsjV5HxXTU1OT09WcOPZz8vJxsvQ031RQEI+ +LjU9ODtO4tzLwLq4vr68w9r581dMSkpMS1J+d+/Ry9DRxsrZ6/5xW11+92712tng3Nbc9Xdu +Tz8+RDo0PkVFT3HRxsXCvb/JyszlbWleXmNndvB25Nz23NHZ4+XmcmRveGFUaPlvfOnf29PS +1Nt1+fJcUkxCRkE6RktGU+7p69LNzMvO0c/T39/fen37bPV4a+fh5OPh293d3+r2cGxlZ/fs +9+/s7fTzcXv7WFxiUUdGS0tESFpYW+jX29PNysvQ09bfb2x3YV5y8vDo3tjX3ODf+XL+aml6 +c3Dv5eTe29vZ2eLqeFhYU0xNTU1KS1tUS156Znri3eLg3+LzdO3d3ezh2N7d09LY29fc7v56 +emxlbfv78+Hf7fHi62hhaFlQVE5MTlRdW15y6+3s5+n2/f5vYGNueHZ68Ofa19POztLQ0N7o +7mddV1NVXWh3//nr5uTp5uPpfnFrYmRbVFpeZGtrb2178efg6u/tcl5jcGpncX1sc+jk6+nf +2N3m6vL+eGxkXWBud//z5eXh3dzj5uPr+mxeYGJfaW5w/O7p5+rvf2tlXFhYVVVVWmFv+erk +2tDR1tve4/F7cWhhX2VrbnH24d/k6N7e7vjzeW5vdnNnZ3BqaWl49u3s6P1lfndnZGFfXV5o +bnfx6uzv6d/k5eHm6ev09/B2cHtxbXb3fnd8fnVtffl7d/75dW56e25z9+/z/vbt8vnv6/1u +b3Rsbnp57+Xm8nh2e/v+9/xydHh6dW1scG1r+enq6e//ePj5fXlv++/sf298+37y6evz9vp8 +b253+PDzfHJ5cnn1d/nx+G5qa2x2bG388fDt8Xdwfff1+nZ77e3w6eDg5+fn833+/HV3fXZ0 +amppa2lvamFoaXR6dnR2fv55cPv08uzw9ezo7e3t9u7q5eX18vV8dX16bnJucXNuc3d48eTr +9nxtdnpyeH9uZm9rZ2x0/Ozq9/Ly6+v9eXP7+Pv8ev3u6+/37fB0b2xndPH7d3z87ev2d37z ++P52a2Rla2tu/vLs6/Pu6ujs9/5xcXBzfXJ8+XlwbXD47357e3F1dPrw8u7t8nt0+OTpdW18 +eHd+cGpu+/D0/P3t7fR+c3l2c3VzcHB1/fh2cnj7fffw/XZ3fnx+ff32d3zu8O709u7u+nV9 +fH3+/nlvcHx9bXF5+/X6enny+O7u7e3w7O/9/XttZmBnbXNucv33d3z1fPjm5vJ4b3Z4cXz7 +/vt+/X16fv358u30+PLy93nw9Pz17Oz19H7+fG19bmlpa3Jx//11cHNsbv35/fX8a296/ft/ ++/Dr8/b2+O7u7fDw7+96c3Z+8fJ+dHl/9fj7c25vbmlkcP37+e72bnz183598fJ7c3Nrb3h6 +bGv6/3Z5eH707uzr5ubk7XtvdXn06/x4/fr8b291dm9scW9yZmdscXz2+u7m5+Hk7vX37vN+ +cmlpY2JfYGVtdvbx+Ovt/Hl9e/16d3h7fu/v8vh79e/r8Xlv/fpva2tqbHN4df72fnpvd/X8 +cnJ2dHv283Rs/vL5++rs8PP3+W9vd/p9cXz7bmloanRwcW5qbG94cmhr/u/u73zv+fv9ffPw +6ODo9Pvv8fx4d3Rtampsb252cG1xePT5fW5tendtcm9kb/15++/6+fT5fvR4bXX77e3t/fb7 +9u/9bXB/fXZrbHx0eOvz9+3v8vH49ft1aF9oYmRiZWxvanj8eP7v7+jr6OTw8fv07ebn7fX0 +9fh9emtpbm1uaWdobmx6e3v07n1vefns8fx2/fv/dXrx6uxzb2ptfXp5cfbo4+ju7Ptxb3Fs +Ymh7f3R3dXl2/X/z6vDs8/n7/f94bnrv8Xxucnv/9u/99/P0+mVr/u/z9v77/HN1b3X48PX5 +/np8fXNy9u3+cv/38PT5d3n9cW9qdXl1e3z97unt9vTr7u/y7/l8fnz2+XdubnN++Px4bmlo +Zmhse/H19vh/cP3z8uzt6/x7dHh9dHrz5uPn6vH3/Pj99u75dm9pa/V+b29tb3J3b3V6dvr2 +d3J88PR0eurn7/N3c/vu9Or3df37cXF6+PF3b290cPjp+vX08fD2en9+dnZvcWxqeHFt9PHp +3evwbXf8c3j3d23+7/f69P9wfe/x8vP6+21qamNlZ25scv7w7efm6efq5+7v9/n+7vB9/3f7 +/X51dHf/bWVnZmlia21sfnJ4efrv7On3793d4ubqen3573ZqdmtoY2Zrdfr5e3vs9vl4d/x6 +9/X66ujm6fDs5uv++/1vbnRrY2BlaXL/e//2b3FwdHn57+/7ee/u7fnz9ffs7Hx4dW9xbXj3 +7+56am5ve/f2/e7293xrdX3z9vvv6/H36vf3fG56fmxpa2Rta/31eG1tb3z4d/p1aHFyb27+ +7O55fO/q6ur+d/369fL3+fft6vl+7u/2eW5sa2dtbXBqb/T9/3f89vDueXtwe/H8ev/3+P39 ++/t8bG93aXFxanV6/nj+dW717+/26e717nh4dfby+Xr3+e7uc2hx9/T083lyeHzzeGtscW91 +/H3ye212dfX1efr7f3j793p+e3R7fWxvbXB7f+/u6uXt/GpwdnR+7Pd5+XV9fnnyeXr9fvR7 +c3j3bmh/8u7s7X319O/v+vn0c2l2b/59fG9veP14/fd3dmJpcm5qcnpodXF49uvh5ePc297k +6/Z99fT89/xybHBtc29tZF9fZm12cHj7+/t/e25vd/T18u3s6O9ycPN2fHt+d3ft6fhwcPn4 +dvny8/dxdXf/+vx9b3J+9Pt2fPX8+39ubG92/Hdrc/Xr6/P5+/rr6+rt8/r+d2htcGtocnx2 +enx8fH/+7e5+/fL3an309O77+/x/f3l8cXF+9f3+7+3teG5z6eby93v67Pvu+XV7cW1ua2xv +Z2xs/nZ67n3z8u348H715eXn7evw7/z9cnp+fPx1cWlsc2xsd3RqZV9kZm/u5/L76+Xv+uHd +4+jp8PPt83pqZG5uam9tcPz8emxoZGd5/376/O/p7OXo8Xxv+f3w+/vs+nv+6uz0fvZ0Zmds +f/r+/f1va250+fLu7fT8/nlyb33+73p09n//+PJzbGz9fG1xbvXs6O3t7/fz7+r39uv2+H7y +8Hxvb2t7+/97enRtZWdmZnn3fv73d/n79fjx9PfqfG9y9Orq6uPm6u/7+3ZxbG5tZ2z18375 +9u3zef9/fvz4+npu8Xp3bWp3b3RxbWxocnlwc3Tp7Prt8efo6erl7ffp/HNsb3p6cXl7fHr+ +f3t9+f11amT+eG77e3d2aG7u9+7u8Pfz697j6uvt+G95eGxpZmxlYGZodG1ke/B5efl+9vzy +++/tffr/9Xz36u716ubm7+3x925oZmhsefP+e27683ZvbW92/nVwdnr5+vz38/z+amZman7v +7fn8dHj4d3V96eV/+Pbtcnj3fvzw6Pn7/fjxfn15e3hnbHx47/f7++Tfbm50cmL3/3doY230 +4u5/bnhuaGxmZm9+bvD33uH39+3raevr5PL41svafmtcT0pUXV5j/Nva1drh8eFxXFxUYl1h +avTl6+7v3vL37+nocP7xeGl5eH169vXy+W9/eHRpbe32dG198nH6/Ozzdmh992hv+/t7c2v7 +c29q/9zd7np5/HZs+3D7+274dWpcZuv57G/65+Z2dHp5eWh+/3D+Yf/q9Pr13uXu3dxjZ11a +X1x0b/bg+m/9cvzr8Ormenvl7fhgeulsXVhobWr4e/H4fnh4/Wl+7O5+9ub06/Lx4ensdXJ3 +c213ePv+dWxvZmd6eXfx9Xbf/v3va3lsaGB0aHFubvLs8OLp7etlaHt4ZGPd6fbv6u98c2xv +Z3V8fuppb253d3P9YGZp29lq2dlr3+pt+PxaXmZ18XLm4vTo93RmbmteZmFkbG12++94ZWZs +bXrZzXpj6uLraF/wWsWzRdrY11xZVPnyQ0xN71de4s/o8en94131YO52XfT17mPz8OV9fPjw +7Gb5cnp8cnDl6d/b7+Pv+GxqYmz99W9f+Wzldvfy8n1w7fPyeXtrXVxk9vRzffPv8PNxee3s +bXZ0b/rs9O76bvB59vbidmVv/Hp66Hns9O3x9fr5fG13cnZt/15ob258bXr9cnvwcm/q8Pv8 +/nHpePri523v2+Pmc+987nvn53VtW3JcZl9ob2Nsc/78ePd9eGhq4ePj5Nniefz87nxs+Ofu +fv/nb2d5bur9Y3v9bl1aaX9zZHR072hv6u/e9+zm3Pbr4Hj66+Hu5+117npqaXxuX1t08G54 +dfNwYmn38XL7bG56eW5qbm58+m5/6enh2+d/6f79eW/9fuvi8v/yfW/9/u74b2x5cu3oc3pg +an55a/vx+vVqYGRzeu7s/HX5+3969O5iZnV2cP/x6+3r3OPy9OzvcHRv+XJ68vV2dv516+5t +cfH2fHz/Z2R3de38+fR++Xj293hoZ2lrdWxt8/R5/vrv497xb3v57P7t5+Xs5eP5aGJrdndm +Z/p9X2hw8uxx+XJmZnH07vjy4udzd+r47/l48+rv9+nu9XF1e3t7e3ptYlxneXZub3j8fG5w +fXlsd+ng4ePl6Ojv7/Xw/W1pbvZ/cHf5+/t1fu/3bXF7Z2v87fZwbnvq73hra21y9HN+8Pj9 +dP/76+XtdGRve3x8/fX86+7x6+73ffl17/Do+G9wa3Pu82t6eGtnX2JoZmpqdPf68/jz8fPu +59/o7vF4cmRs9+fp8er+/XlvfPz8aPzt9nZ4fv778OPq/WtiYmpubnZqbG58enrt9PV7en7t +5/LzfHL9fv1vbHJ77ezd3ejq9337eHB6dW5zfvt0bXTzaV9tcG1ucm719G769Wph/ejz7Onk +3ePq8urud3Zqanp3eXry6+17bWhtfWlxaWZ58nxoa3zq7vrg2+t1/ezs93z99Wpobnzvb2hw ++29t7u/tbmvp4/Nvc21ubW/5fvnx7+3p5fDo7Pb+ZWFqZmry9vvu6+/76fj+/nv9bGhxb2Vt +/Ozvd/r4+ev4eXZ09fR89O3u7+96+vT3dWt2bG1v+355c3p3cfvs3+59/n78/vf2dfvu6u93 +7eZ4bmtlZ25vb2hq+ur3enJtfu3u/nr9+fr9d/Lt7+3z5+rr5O37fnNzc3Rub3x6b/Ds/PVt +b25t/vxvZ294eHF96Of/evt5ePj99XVy+fXr73559O54ePr1/Hv/++v3/npobnD89fz58P1u +aW51eXv89fTy8PptbHhtb+v0+ezxbnb9ePf0c/Xt7/du+evs7vl+7vB48+9tbP52bW1mb/1t +bnJ68PJ/aWv293NzcWx7ef3xcXzu5ebr9O/qevb2+up6b/p49uvtd251d29haH5/c3Bub25v +7vV6f/Lu/3R66/f+8/96b3t9c/f5+fJsbe/q/Xd9en96fn78fW76eGlseO37b3fu+nv37/Hv +6vD8//58fnhueHxxb3rv73d993lrcX9yY15r/nfy6ers+f17e/zy6fducf1vanP34+v88PT0 ++Xzy8mx2dWlkbPb7/P5x8+vu+vhyfvB3d29y+/P7e/16+/pwfvDq7HRlZGtqbnT+9Px9eG5s +eunf5uzs5ej17Ony9/x+eWxhZm1gXm96bGxxfX158uzw7/P89Pz96u3+bH/2fPLv8vv+9fV+ +aG7x+3t3fv92+/Pz7/X7dm1pcX90fvt//ftzf/txeHRudP78/3H85/F0dvry7Ptv+/f+9fFy +bvTu7HZ36vVwamz09ntrd3VnaHX1ePz/9fFzfu7w+fnx7fL19v54/vz37vltbm1qam17+/pz +bXL89vL+df16e/HueXzz7fd59fL7eXV+9/H9cnR0cX72evn5+npybnf9d2tvdHj8//r5+OTl +7ezv7Hh4e297eGt0dHX07/Hz7fNva3Rydndvam969vt1enr+9urq+fz4/f71+fTv/f7x7/t1 +cm5oZmpu+vn5+Htvc3J59f11e/7/8/336evy9O3v83r97P9vcXVvaGx5/XVsb3h3df739fr0 +8/z97efm6+/49O/48vF5cXl5bGlpa19fbmppa2VuenZ19Ojq6uTq6d/c3d/z9/N8b25rYWNw +f/v+9v17eW1la2pmdXZ7//jn8fvz8uzp6uzv/HNubGh193txc3Bsdf77fHzv7fL9ffH0fvjv +7/H09/p9dX3/8/lwbW1rbWtpamx1+/d5b3j2fPru7urm5ufq5+Tm9W9pam5sbWxlZm5vcnN2 +/nJtffjv9X199/Xn5ufp8/Z9eHVue359cmpqeHxz+3Z+9ntua/3t7e327/P7eXh+b3Tv63xy ++/l+cHj/dG92fnF8/Pl0Z3b47/f++X7y7fbp6e3p6fH79/v/dm1pZ2dsdGtoaHL89ff2/XV5 +/Pr/cHP39Ovq7e3v7/Pq7PL1eGpqamp3d3RxbXH99PH/dHd2fH3z7Onv+/n09Xn6935w+u33 +/H7+bWtubnJ3fH1yb/18dHBscX339Ozo6u7z6env7vZza25ze337+v75+PT2+3JydHV1d/58 +b3F8fPr17vJwbXNpaW1xbWVz7e/q6/L16+jn6356/vb+/vPw+Hn99fXs6Or2/m9vdnV1dW5o +aGVlZ2hia29++fvw9ff29PLv6ebs+/vx+PPt73V0fn35eX37+Pbr7P50aV9iZGt2dXt2ffj7 +++7u8fZ2b2929evq+Pju5+fs8PL2enVzcm5qbnVyfvr6bmt3f/h/eXlvbXr4/Pfw7e/w7fL3 ++HxraGxrfe3w9vH0+379f3tycPvv+P99fnV77ez3/fD9+XVoc/j39/N8dm90b2l29vPw+nZs +aG596+nl7PP4fnv7+np3amZtdXJ5fXBs+ers7O74ef35enL/8frx8vTq6vl2b2hteHNzb2tw +dn//fXx4dnl6eO/t8v788e7q7/r38/z47+vv9v11a2drdXlrcf56fHJ1b2xtevjv5+r1bnB+ +7+v4+/vz8P58eW569fL+fHP5eGp2/PDo5fBxbHL++Xx++3j/e252dfj0e3r97vh1eX317+/8 +9X51fHp6bnv19v3u7n94dHBzeXhzc29zb29vam7+/X397uzr6unr9ezl6vHs8nNuc3j+eXJu +bXFrbHV7fH57/f538+jxfv13bXZxb3n87/B9d3FzfPv8+PR9a2Zsb3f78Xp96eHg4unr6fj5 +f3R1e3ZsaXL39vpzb3R3fXR5eHr2+Xl0b3J4eXt99319+fr99vL0+fx/9Pj87ujufmxucm94 ++/1vdP3/e3Zvdm9vd/rs8fnz/Hnw6/F+fvf193z37uzv+ff3bmp/dGhxeG5yffX8fHlv//L/ +dHBtbv7vfHT+/XVvbnft5uDm6fF87ev5ff79fn/5/Hx+/3p3fHd4dXlzcGpsc37v7PN7e/r6 +evr8cf79fHJu/vr+eXb++3x+8+zz7ev3/P34/3Nrbvz27+98/H5wcm50/+7v/Hp9fHNzeP/w +9315a2p97Or/dP3+ffz4/P759X51cn33eXl7bWtxbXZ4bXV3bnZ48+zu6ebk5uvt6u/2/f59 +eP96a2pva3R8fXxzb212dm5ybW54eXF2c3F9/fny8vT//fTx6+Tl9nj+/Xj79vjz9/H3/X79 ++Pfv73xxeX1tamttcXR8dnX7/v1tanB4fXd1e/p4bW9zdPXr6evu6u/s8/vv93h9+vB+d/t2 +cP3u9PtqZWxpaW38+PDn7/X57OP4cHj+9/l+dG9mcX1qaWxwdXlu+e7x9vHs7e368/x2fe7v ++Pt+fn1+7OLn7PV7al9gZl5bZ/d1bnr48P149O/u6ePh7Ojg4+Hc2Nfe7Xxzc3ZmX1hWWlRO +V1hQbOz78ujo5/Jve/tpavPr6t3Sz87NzM/Z3e7v/V1dWkpCSk9HUfbi3dTOzdPr83JSTlFO +TlFn4t7czs3d19Pf3trY09bb19fqZV1LPUJHQElf893NycXL3OVrTkdHSklMX+He1cjFz9DN +2Ovp1dnSzMvJy83kSjo3NS83QE55z7+7vcLF2VVNREBERFPt2Mi8vL+/y933aHbx3tTSzMbJ +Zj43Mi8uNEBU8cW3tbe5vs9XQz89Oz5M+tLIvLm/x8rUf1153t/Pwb6/we1dPScsMSkuTnbQ +trGuscDG0EE1Ozk0PW7Hxruvs8XLyPpQYtvKxL26wdJrPCcpMCUrTWnkvLGtrcHKyEAwPDgu +PtXLvravr7/Oydti2ce+vtLEwUouJi0uISx47ve2rKyuvL7POC43LyxD6s23sq6uvMa+y9DC +w83NydxEKyQvKyA23FvXsKqrsb68ZzAyLyoxRV7HubGqr72wrrm+u755a0csJCUtJiZJ9n69 +rKurtL7ATDMuLi4wO+vDv7Grr6+pqrKyuczgNSEfJiEdL21nza6mqK66ucc7LS8vLS9MzNS/ +rq2up6erqK++2i8eHyMcHS9La8OtpKStt7XUMy4xMC0yX8nKv66oqq+spq26wkQpJSMbHSUs +POC5pp+nqarCPzcxKiovOVPQuaypqqanrrC/PS4wKh8iKi01QOm0rrWuqbC/zd1XPjU5P0Jb +/vvJv723uMDFxd9HOzcxLTM7P1jYx7++v7u+3f3ebFFn3d7gz8bBy/5fW01BQktSVEtJWXBX +SE9+YF/gycDCwbi2vcLExsvhRTtFPDAvNDg7OkDNwODKsbLBxcC/zFFfw89my7u8xOlTbEMq +LTosJzE/UGtPzLK+x6+uu7evr7jJubPTeNo+MTYqKC8pKD9LP+LN0L7d2LXF/bqvt7y0q627 +vMZJPjQoLC0mLT4/XtXOusDfvsFo2b/DzL6xsrq71UJMOCgvMSkySUzUwr2zxdi801nLvsDE +t623v71NOEAqJDItKjxKUc/Lu7vWv79qzbe6u7Ktr7e66Dg5LiMrLyovRFTp17+5z8+/3OK/ +uby6r7C5trxEP00qKTguLD1ASG7Vx+DXu9l2trXGvrC1v7e+Qz1HKic1Liw/Y37aubHGzLbT +Wb6+1MO0s7+8u0c5SiwjMi4oOFRNX8O0xdO1w3e4s8K7r7C8u7tINVMvITEzJjVdQUzHucnV +trxsvbLGxLKzvbq36DhPPyIrPSgpUlE+5Li/2b6339e1vdC6sLu9sLpIReMtIzszIzNbOUHG +vs3Ourv9wLLAw7Oywbu0xzxDYCkjPjIjOeA9S729zcu/webWwL/Iv6+xvLGufjvcPSAsPiUm +S0k65sDDxsq+uttevrXNxa2xv7SyVz1nNiUuNykrP0xV7da9utXYvMpVzre/x7Wusba5zEA9 +OSgmLSsqNkFPzMXGuLnTz8DK1Ma8t7S3s66zwls7OjQoJiosLzQ8/MTYz7++w8fGw7+9t7m7 +s7G4u7/nOTQ4LikpKSw2OkBd6s29vL+3tru7ub2/urW6u7a5xWs8NC8tKyckKTA6SfXTybqz +s7S4wMPBxcnMxLi1trK1yE0+NiwqKCQlKi477cfGvre0r7C9x8vb0cO/vbWxsrO1w002LCcm +JycnJys788G2tLi5tK+0uLvG3t3Mxrqzt7y8vtZIOS0nJiYlJSkuOmLDtq+tra+ytLi/xs/1 +XezKwbqzs7rB9z0wKyclJCQmKjNKybSsq6utsbe7vsXO6VRKSlrQvLWxtLrIXTsvKyYjJCcq +MD9sw7Kppqerr7jAyuVXRj47PUjqvrKtrK20xU8xJyIgIiUqLzlTyLWsqKeorbjG/E9KSkVD +REJK576wqqeqrrjoOCojHyAjKi83Q33GtKqnpqiuvdxOPj4+PT09PUXru62loqSpr8JHLSQf +Hh8kKS43SdO3qqShoqevx003MC8wLzE1PE3Ns6efnZ6jqa/EQykfGhcZHSIsPf27rKWfnZ6i +rcBONCsmJCQmKzJMvayknpycnZ6jrLnzMR4VEA8SGSAwbbuqnpiVlZmitUQoHx0cHSAoNtSu +op2dnqCkpaaqt2gzJx4aFhUWGCA316ygnZqYmZ2lvDkmHhsbHyQtSLunnZucn6e0xvZJRUpR +ZvPc4EspHBwbHiwzOmW9qpuVmJ+tTy4uLCYmJig8uammp7G9uLi+2joqKzVWu66tq6mnrPcf +ExMUHS44Srqhl4+Pm7VIKiUlHRcaJUupnaCstLi3u1UqJCk30be2r6WdmZqgujEZDQwRFB88 +z6aVj5CUn/QuJBoVFhokz6Kdm5yltc88JyUqMXOyqaakpaqqr77LVjMoHhQNFCUuz6qjm5KU +obVVJh8eGBcnzqydmqGkorA6KiUgLWHcw66uvLu/z7m0xMK3uMPkLRMNGiUjN+WwmY+Xqa3A +MygfGR75treln6eruC4dJiwsQ8e5p52jsrjRRFJyTunDznXoYyIOEiwuPrGlm5KVrs7RKBkY +GBxOq6+kmp2rtPUnJCwqOLyurqapxGY+LjNxzNKypaCks2ojDg8dGhs/p5qWmamrqTsbHCEm +PcG3p5qdsLm9NyYoKTLhydCwqb5YV079u73OsqisvFo1IQ4OKCUe4Z2YmZmipaU8Gx4rJSM9 +zqucn6+vsTgiJyknMVbAq6WvuK21+1/O39/F1NW5vj0fEx4uHSTEpaehnJ2ftDEqLiAXH0DE +taqinp+3Ojw9KCEtTde7raimrsTEut5AcMfN3md4PBkUKyYaMbGtqZybnJ6+NToqGBgoOD+6 +op2cobS/zC0eJy8uOsuvqqirray34NvfRkBHQjooGiA9JSFsr7Sqn5+fpsdeOx8aJDIuOLWj +oaGorrhJKiwvKi9MyLSurKmqssXNzfFOREJJMhwbMCYZNbS9tJ6bnZ6uv9ooGh8pIinMq6qm +oaGrzkVBMSQrP0ZwvrGur7Gxt7+8v+1dRiwbFyQeFi6/xq+alpibpa7dIxkdHRklUbmooJyb +obO75y0lKi0uPPy+trOuq66yr7jq1z0fGRoeFhc5zcqolpOXm52kVyAcGxYXIzvPrJ+ZmaGn +q30tKykjJzJE5b2tqKmoqa6zx0wvHhcdHBMeQEfFnpeVlZqbpUMkIRoSFx8nR7Wim5ucnKS8 +bjwqJCcrMEzHt6yop6aqu2w5IRsfGRYiKi7Pp5+ZlpiaobZULB0YFxkdKj+5o56Zl5yhqc82 +LCYiJy43Xbuvq6iutOUsLi8bHSwmJ0q/tKmhnZykqavFMSooHRsfKS1LtKegnp2ep7bKRy8r +KywuQtK+ubOvZzfdMh4uNSUsWeDFt66lp66rrMtRWDYqKCcqLC9Zv7mqoKKmpqy+ZkU6Mi42 +WltLzL0/Odw2Jjc7Ljps1L63squxu7K8Vk9mPC83OTQ3P2Hcy7itrK2sr7vMeU5CP0JEWl5R +5GA3PUsvLT44NFbNy72zrq61uLvTVklDPDI2Pzs/XOfPvrmzsbOzucrcak9KTU1RZExMWDk2 +STsvPEo/XMrAu7m2s7a/xMxaR0A6OzY3T01U0cfGvbm8vL7Cy+N+YFxYfs7UcVpUPzU5OS8z +PUBO3MW6t7Svsrq/y2VGPjs2MzNHTD7Dt8i4rra8vcrWW0pjTD9U3vjfw2dE2kIvPzoyPEZL +4czFs7W6tLfDzNhPQDozNjY1Smrnv7e3tbO7wcr+V0xCQEhKT+HSzcHCV0/PPzNHPTM9UVjh +z8S2u7+3utDh5Uc6OTk7PEPszcy8s7m7ucTab05FQj1DY+zVw9ZLy94xR1UzOk5MXc/Ou7bA +u7fH7NpgPj09PEA9Stra2L23vLy5wddgTUY8OUJIQ1/Oz8i9vb/J4GpNPTs/ODZHTEnwyMS9 +ur29xtvuWEdKUU5e2cu7s7nBvsdEMzg0KSkzO0fouq2trq2uvv9QPjAtMDQ3Qu3Aurawr7a/ +zfZCNzc1MzhDYc2/ubOxtLzH1kw6OTk1N0BU7s7At7W+x8tuRz87Njo/QFPfzsS6uLy+xtj9 +VEdERERLXO3Xy8O/wsfH0vJvXUk3N0Y7Nk7e3Mq/vbq8zd7fUD4/Pz5FU/nPycK9v8jWXE5S +S0lV9t/Uxb++wsfL31pSRSwqQDYyZtbFtrm/tLdfR1ZEOz1DVtDLybu6xtdnUlZNRlrcz8jD +xb++ycPBVC8tLikrNkjaurKvrLDG/0k2MC8zQta7s62ssLzfPTEvLTFBa8SwrrS4wmpJPzk+ +V+rTvLO0srvWfCUXKC4mQc63n56vtrBWLyslKEd8YK+mrKy6Tko+Kis8ReSzsLKst/hrRjhE +TkvJtri3yTIiICgvPfm8pqCptsxONSwqLT/LtK6vsrjjOi8tMD5YxrCtrrjRU0I9PERxvbO1 +srC0ul8pHRcYLVrFqaShn6xLLysmLDVBxqikqrPSRjkvLDNO0rqwtLm++UlJRkzlyse+ury5 +ubjJOikgGRoxbLajqquntz0vKyg7a9qyqq2xv0w3NS82X97ItLXAzGdJV/Tr19zSwsHAvLu7 +tcM6JhwSGD7WrKCrqKS6PjEnKE/byrCvtbPFPDM0LkfS+r+1wsTPSVPX8tnIefbLz8e4sa2r +vzEfEg4iTbecpKmfqWw2JR0v2sStrLOutj8yLiY81/29t8zAxlBmzsq9vd1gZFvUvLOqprU8 +JBYNGDJunp2ro6fISi4dJlnJram3ur9JPTIoNdrEs67K0tNMYOL1yrzJ295V78C2qqi7Nycc +ERQlQKiaoaWqzUs6JiM357KmrLrKW0U6Mi1GzbyrttjhTlfNyNXGyvnjWU/TuKumrzwnIBgW +HS3FnZykqMFIRDQpL0Pcr6q3x9JQSE02PevnurXP6XReyrrBw8xVUGRf6MG1rKe/NScZExcn +UKicoqWs0Uo2Jyc5a7qssbfAcFw/NjhF3bq1wM/zYtLFxcjTfl5kZ+K/ua6ouj4pHRgXHTS8 +oJ2iq75aPTQtL0LNsKyuvWhaPzlBO0jHt7e5zk5p4dzJ3Fhg9uDPxr+vrLxPLSMfHRwmTq+d +nae16T89Oi8yRdSwqK7HST80OE44Xbi6rrHzTHde1b1+XNx42MTHv7OywFksHhsXHDzDpZ2j +q7HcPDUrKj/Staqstc1DOTI1OUK+tLCwxGlPVV7TzPjV097OzMW0rrteLh8dGxwvbK6eoKiv +0EM6MS45U8uxrbG9WDU5OzxT3sK2tcHXc1Lz1tnZ//TVzc29s7O3zzspHxoYIkG4n56orb1p +SzgpLDp3sKqutsw/NUI4OG3xv6+5ydBuZ8vWZF5KY8W/urOvsb5QLSIcGR0v3amfpKq03Eo8 +LSs1ScKurbK8ajxJPzxWSH26ubm91nLT0OPgTUXzyr63tbSzv0ErIBgXITW+oqGlqLLG2z4q +KS4+wK6trrjTTj07MjZDT761urzGzs7UU0dFROm/t6+vsrS8TSwiGhcfMMimo6enrLnHRiom +KTL+uLGusLzqUks3Nzs+2b69ubq/wcDlU0g8S9G+ta6wtbzyOioeGBojOLqnpqWnrbC/Pism +JzXkvrq4v8S8v99QOzhJdOXU09fCubu/0Fha5dDKycvIwtVcRS0hHiAqQsS1r66vrq6530E1 +NkJVWk5DR//Et7a9yM/T32tJPD1J88a/wsO/vLq8yNhsSj03MSsoKjNI07y5vL2+v7/H3G9r +Z25hRjk2OUnjyL66ubm6v9JbRkZLWHjm18rAvr2+x9xeRj46MS0vN0FVb/Tt59nNyMfGwL6+ +wcvlTz47PkRPYe3Txr6/xdR5Y2h67/n/7+DZz8vT8VxPTFBXWFZadPl3W0xGRUdKVW/ezsjF +x87c8WdZVl539Onc2Nnd43Vla/fazc3Pz9LPztXmXk9LTVRcbHd0dPh1VUlBP0FGTl596djO +z9TY3eTk5ujg3dvd3eDg5/lvb/Ha0NLR0M/Qz9PjYlRQTU9bX19eW1NST0dDRUpUZvTm4tfS +1Nbc39/e3+Xn+29yfu/r4+Di39jPz9ff4ePe2t7ifGNfZWZnYlhTUk5OTElIS1Jbcf17fP3o +5N3b19DP1djg8Pj28O7t6+Hf3tza3N3m7ure4Ov6bm586udyXFRMSEhGRUhOV2fm3eLn9Wr8 +4N/h4eXe1dXc5evq4+br6uTl6OLf2dfb3+Hp8XhsaGdu7vRmWk9KSUlGRktPV2rp3d/b2tnU +0NHe7fTp5e3vfHB/6ufs8//05t3c2djX2N/n7XtrbG1yb2ZZT01MTU9PT1BSWGBrbvLc09DR +1dvi+3Z4dHzu597a2tjW3+bh3+Tm4d/h4OLh7fZuXVdQUExKSkpNVFdaXV5mcnR97uTc0s/X +2dXc7PJ+a3nx5OHh3dra4OLd3eDl5Obl4uTn/mlmX1RMSklISUtPVl1keHhr+uno393a1dTY +3uLg5+zt6ufm397n597c19jc3uPl497g6fhpWk9LR0ZFQ0ZLT1Vfc/rt5N/h4uLh4t/c29fX +297b3NvZ2dzd2tjY2dnb4ens9v5mXVxZU0xJR0VGSElMT1lr9ebg393c29vf4N7e3t7c19fb +3uDf3Nza19TT0dHZ3uL0aV9aU05MSEVHSUpOT09SV19t/vvq3tzc3uTh3dnW29zW19nY2tbR +0dHS1dfa4ex3ZV9fW1BMSklISElMTlFWXWNu7Oju6vn36O/k3tza2dnZ1tnRz8/P0NHX19LT +0tff/l5VTUtHRkZERUhKT1JSXGRsdPfz8Obf3d/n5OHb297W087OzMvMycjKz9DR1N3zaVlS +TkpGQj8/P0NIS05WXl9jbHZ77+fh39vZ2tnW0M7MzMrJysrKyszLzdLZ5HZeVU1IRkdEQUFD +RkpNUlVXXWZzdPzo397f39vZ19XU1tXOy8vLysnIy8/O1N3j+GVWT0lEQkJDREVHSU1QVFxx +eXh5/vHu7+vn7HpbOT60sb+xrK+wtr2wuGA/PDcvLSclLTEuMT5MzrrFuaustre2vcR0Q0hX +RzxP08O/wbivsb/QbkQ4LygkJygpLjhPzLy5r6ipra6zvMbsSkZBO0DswsC4raqrr8ZFOTIl +HR0eICUoMOazr6uin6Gkrba67TkxMjA6WmvBqqanp6/fUkwpHR0dHB8kKlm7vK2foKOhqrKx +0zc3Ni8/bmG4p6uurdBDbC4cHiIdHygrTrS5sqGfpKOqtrPGOjY+Pkjvx6+qtMZgT00sHh4j +IiImMtOztrSlnqOrra+yykVJ0f5Mybe+yFovOEIkHCQnJS0xPbOqvq6eoqeptrWu3EbHzP+/ +y0hONyQpKx0eKSYpPkvgrausoZ6ioqavsa++0b+7101BLCEiIBscHyIsOz5durGvqKWkoaOo +pKOsrqq0z9I9IR4fGxcZHCMwMzy3p6uooqGgpK2pp7O4rr9+1zcgJScdHCAfKjw3UbGurqiq +p6Cnrqutrq69UllLIR0kHxwhHyZcT0G1p6ihoqWdoLK0rrW/4DxBOR8dIh4bICIpUm/OqqWl +np+ioKeysb1gZk49TDQhJjAqIyYmOWY1R7Ksr62tpaGzw7G9XFNc4c3lLi5VQiolKT5jMjbA +r7TBwqunvvvFvu9YQt6+REfF1kE+STs/NS9FTT9Hy86/v9e3tsXCyN7N1u3hc8b561NTX0RB +P0M8Q0RYZU1Yctzo5tvKt9C6ur7Cw8DdzFDnXEw6Pkg4REZHWUo7SVRc+ubW3cDHvLu1usfA +087SZ1BXUEM8Q0pBP0ZcZk1K3eLvfd7DxMrJycrV1/bgbVzpb+pvVEFOR0xJRWn/U1jP1cHM +ybrH3/bvaFNWTmr7e01m31xYSl13V1JZ39ff68nEzM/EzOvrT1lfU0pcU01+ZG7442N7WVTd +6Gpx3uXo3Obj421c6dlxzctbfehe4f1ITU9KWGZuXmzo3/7f3Nvv8NJy3cvn4tDe3uRm81Nz +blNcW3dcYlRPYFhea+dqVul1/eLTz9jS4s/Y4vdoam55enHm51f8Y1JeT0vy4m9/+dLQ5eV1 +c+lqYmjvXFppbN/c3ezh6mZ37F9pcWza3Hrv3OHlYFldbV5eZX5r4+5n2t343edkfV5WbOjf +3Wz73fbvbHZqWlX17P15aXDw2N3e09t+bGFpembo6VdjeFxqX+vsbW1aX3B499/o3txw3ePu +69rVfVn05n5jVHFq/17/9HVbXVhm6WHp1ebg2OTrztfaXFTaZldcaHl8anXjZ1tefehnT2Bk +Yvls5dx+2tbe0ur/2c7Z8fv8cmtkYV1XaF9oT1Nwcm1Z8m7/3+Pi0OPn3tzefV9b7V1aeXLx +cvTh517zfX7qed/g53Xb729ganJdaF1kcmJpaOfeenXl2m5sV+TrdH7d2Gje/enj+HFXZX9b +XnlhfmZn+vLt8HB34uHr62d/2Wjd2W/uZmrp+mZpWnFyWFd4d/h6ff7u6WD55N32bm3q5H55 +bex9aubj7O5zfXbi/OTq2+5wZWrj7PxbaFpwYFBOaFdKUVhjWVlh3Nfd1cnFyMbFxr/Dy83P +61VLSUI8ODc7PD1ATGLr7OfGv8LKx8DH3d/OyMfVysLBxsrPYF5XQDs5NjY3NDU9R0tZ99TI +xMS/vL/Av8HFyM7Kw8XMwcPFz1hGT0o1Ly4xNTIvOFpkXOXGu7m/yLu3xNXPzM/cac66ws/D +u73LUUFYUDIrLjExLy03/OJX27q1tbvFurLEbd/V5mJJWL+6z865tLnOTE32PyopLy8tLC9G +035nv6+yuL2+tbjqTe3kTUJE7bq8z72trbTEfu3gOCYoLSonKCw8fllfu62vtbm5s7rxXNbe +TkdR5sXCxrmur7W2vvxPQi8pKCckJyotO1Fhzre1tK+yt7e8ytHXcGd0YnTTwr26uLSytb3N +XkU7LiclJyYnKi88V+3QvbOxtLa4ur3H1NPP2e7p0cbAv723s7a8vshYPDguJyUlIycsLjld +59O7s7Oxsri2tLzIx8fP1uNv3MfHzce/vr7G12hHOzUtKCcoKSouNUJx08O2sLGwsLS2t7vC +xcvZ5PNjatfT2szFysvN4F5HPDo0LCkqLC4wNUTvy8W8sq+xsrO2t7rEzNLlbVtVW/Xf8O7f +4tjS9H1yTz4/PzYwMjM0PEJI/8fFv7i4urm7xMPD3W7pb1xuamXf0+971N3j39/p6e5XS01L +Pjs8PD9GSUpl2tfWzc7SzMvQ1NDW1dHU29fY7ejc5GReaF976tTPzc3V4fHsXE1DQD4+Ozo8 +Q0lLWHTf1s7MzMW+vsHBxtDha1ZQVldqaOHWz8bBvb28wcjic1RAOTUzMTIxMjg/Rk/x3MvC +vr+8u73ByNLp2etaXvXa59PMxb/DwMK/ydXsWEdCPTYzMzQ1ODo+R1VfetjOycXFxL+7vcTO +0cnL52vv2d3r39Xh2N/r6HlsXVZNSUxLRz9BRUdGRUdOXvPq69bKx8bEwr/CzNLQ3NXtX1pS +W1laZGtff+Td2NXPz9Pf721vVEhDQUJAQ0NGUFhieN/XycTIzc3MzuLv7f13V1NhfHnw6tzN +xcXNysjJz8/b72NTSkNBPjs8PT5BR0xXftnTzczN0dXX4tro7f5r6+HU49bQy8vNx9fJzcrL +093k7E9IQkQ/Ojk6Oz5CRk1a8N3Qz87JzM3UzszY0Nnc1tvb1tjV3tbV2OX00ufe/mt5WVhP +TEhLS0RCQkVITVFaZObXzc7QzcnO3Nng2+n68H7f/9n929bdz+rR5dfi+uZea2Njak5OTU9M +R0dHTFFSX2nm4tXR19fXzNXe5vrkaXRq6+bp4OzZ2dfU8tfZ6MzS4Ofu2nFoSE9LRkI9Pz9P +UUxXcdnYz9DVyszM3N17cn3xamfa2eLm6tzPxc7Yzs3X2OXkbO1NQkRDPztDPz1LTVNV29nS +xMbMycXO3dPs5e52cFnqcu/j28zTwtXOz87L5tBvZ049Pzk+NTM6NkRLXW3ewMS5uby6wb3Q +0dJpbVVWS0tcTmZ82cvNyMPCwMXT1e1bQTU6OjMzMjM4RFZW6sq+t7S0t7W3vcfT6lhNST4+ +RUpSXOLMw728urrDycrnTDwyNDQuLi4vN0RV8s6/tbGurrO2ur/J4lNFPz1AQkVKTu7KwcHB +uri5v8vTcU46MC8vLS0vMTdGXdjGvLi0r66vsrjAzd5gST89Pj9ETVJ3z8XBvLu+vr/FznVV +RTYvMTEuLC40Okddzr69ubGtra+0vMfTfFhJPzw9RElOVuHQx7y8v72+xcfJ2GJMRDguLjAx +Ly81Pk1h18G7uLSwsLC3v8bUfFVLQz4/QkdPV2/Rx8XAv7+9wsrKydxdTUc8MS8yNTY2OD5K +XN3Bubi3t7e1tb3O9VxQR0E+PkNJTlvxysTLy8C/w8HDyt9lY2hhT0I7NjM1O0BAP0dd48y/ +ube5vsPBxMzdWklFQERLTFNu7d7OxcPDyMrGyth+4d5rXllYWU9FPTw8QUhMS0pRZu7cy8TD +yNHV1tbS23RbWl5p9d7X1M7Q1tLS2e9vXl9//VxX997Z1d3i/1hJRkVERERDQUROYOrZzsnJ +zMzMy8zW6Pz6+Htubvzv+nNw/v576t3a0M3PysrQz8zQ3mlMQTs4Ojw9PT9ETFd32crCwMPK +0dLP1eJ+aGFfXGN88Oje2t7c1c7NzMrMzc3R1dXcc2FVRz45Nzc6PT9DSFFv4dXKwb/Eyc3Y +297h8mlmbW508enb2tva2tnQyMrM0dTQ1ef75+1bSj86NjY4Oz5BRkxWaeLLwb28v8jMztLW +3fB4Xllhdu/o4N/p39HRz8vM0dbZ1dPa53pdSz86NzY5PD0/REpZ99nMxL++vsLJzdHe7O9v +Xl1iYW/44dTV2NPNycjOzMnR2dffd1tNPzgzMzc7PD1CR09l487Cu7u9wcbJy8/b82tjYV9j +b+zi3tTPzc7R0M3Lzc7W9GVYTUM7NDI0Nzs+Q0lVctvKwby6ubzEyczR2+xlUk9OT13r2dXS +1c7Ev8LEy9bU2uxqWUo7My8vMzc5PD9LY97Nwru2trm9v8XO33ZfUkxIRUxg4NPOysO9vL3B +w8bN1d98WkY5Ly0tMDU3NztDTnbMu7Sytbq7vLzDzuZaS0I/Q0xaW17sx7q1tbe6vcDEx9T9 +TDcrJygrLS4uMDhGd8a2rq2usK+tr7jMYExEPTs8Pj9ARmrCtrCvsLOztLi+z083KyYkJiYn +JyovP//Bs66rqaemp6y3yN9bRTgxLy4uNUbux7y2r6qoqauvuctPNywkHx4fHyInLkLYvK+p +pKGgoKKotM1eRDguKikqLDA+bcS3rqmkpKWorLXGVDQmHh0dHRwdJC9H1bWooZ6dnJ2gqbXH +VzQpJCIiJCctOVe8q6alop+foqmyvn42JBwaGxkYGx8rPtqypZ6cmZibnqStxz4tJyEeHh8k +Kzh2tqqkn52cnqGossVOLR8ZGRkWFRoiL0nCq5+bmJeZnJ+ltVgyKSIeHB0gKDRbwa6knp2c +nJ+mrr1dLx8ZGBgWFBggLEXDq5+ZlZWYm56mvUsxJyAeHB0hKjxqvqqgnp2cnaGotNo9KRwY +FxYVFhslN9WvopuWlJaanqOzUzMnHx0dHiEqO9e2qaCenZydoaez+DcnHBcXFxUXHCc5x6yh +m5aVlpuirMU8KSEdHR8jKjrrtqifnZ2dnaGpsMRCKh0YFRYXFxoiM9ytoZyYlZaZn63LOCYf +HBocIis9y66knZqZm56iq7nkPCcbFRQVFhgcJTu+p52YlZSWmqO7SiodGRgZHCEuWbSknZmX +l5mco6/HTi4fFxERFBcZHytYrJ2YlpWVl5yq6C0dFxYXGR4pQbqmnpmWlpeZnqq8aTQkGREQ +EhUaHytHtqGZlJOWmp6qyDgfFxYYGyMtP8KnnpqZm5ydoau7XjIkGxYVFhgcIi5gr6CbmJiZ +m6Cv0zEfGxobICs3a7uroJybnJ+lrbbKSC4gGRYXGB0lLUDFrZ+ZmJqdpLDFRyoiHhwfKDJ+ +uKyln5+enqSuvGw8LiQcGRcZHSY1Yr2tpJ2bm52jr8s/KyQfHyQrNmC+rqSfnp+iqK69czoq +IBwZGRofKDVgu62knpydnqStv0ovKCMiJSszS9G4rKSfnp6jrLvhPi0iHBkZGh4lLkq+raSf +np6fpKq4dTksJiMlKjJA/MCwqKKfnqGptt47LCMdGxkaHSQuS8KupJ+dnZ+kq7jePS0nJCUp +MEBvwbCooZ+foqu43jssIBwaGRseJS9Nwq2ln52dnqKqun47LCclJiowPXS+rqWfnZ6gp7Pl +OSceGhcXGR0mNWm6qqGdm5yeoqu9UTAnIiAiKC9B17mqoZ2bnJ+mtOI1IxsXFRUZHSc45LKm +n5uam5yhrMBILSUgHyEnLj7ftqefnJudoKax4TIgGhYUFhofKz3Vsaafm5qbnaOuyT8tJSEh +IyguPPG2qKGenZ6gqbdqLyEaFxYZHCMuScKto56cnJ2hq7trNywmJCUnKzZSxq+no5+fpKiv +wEsrHxsZGRwfKTdfuquinpydn6WwykcxKiYmJysvPfa6q6ShoKKlqrPMOyYcGBcZHSMtPtay +pp6bm52hqbxZNysnJSUnKzZRxa+kn56foaart2YqGxUTFRoeJC9Mt6CZlZWZn6q39zYlHRob +HyxGzLWqoZyamZuhq7tVKxsTDw8SGB4oSrOelI+Pk5mhr9guHRYTFRsmOdOxpJyYlpebn6ey +2zQeEw8PEhcbHi3EopaQkZOWmp+yPiAWEhQXHSc5wKadmZiZmZufqr1MLR4VERITFhsfLr6k +mpSTlZaZn69DJBoVFRcbIzXTrKCdmpiYmp2lsc49JRgTFRQSFRon3KqhmpWSkpWcqcU5IBgV +FhkeJDXGqZ+bmZiXmZ+ru2kyHxYUFBMTFyA4v62kmpOSlJidqL01HhkZGBkcHzPLsqedmJaX +mp+jrMw2IRkXFhMTGR8qQ8eqnJiXlpabpK/pMyofGRodHyc2XbWkn52amp6kqrpoLx8dHRkW +GR8lLDzSraGfnZqbn6auvWI0KiopJCUsOVvJu6+npaqrqq/HSDk3LiMfJCYkKTdNfc+8rqqr +q6qssbm9xmpAPkZHQUpt7c+/xsvCyWFHSUI3Mzc0Mjc+SVp53cfG0MjByse+xcO/w8bGzc7D +xsvMyMjT32NKOzQ2Ny8uMzU1Plrr3MzEvry/w8zp283e5tHU2M/Nx8DBv7q5vsXI1mZPQDo1 +LisuLy0xP0lV38q/ubu+vMTaz9Rm89Dj7tPTzcTAu7i7v8DJ3+b2Sj87MC4vLy4wOT9JX9TG +wsHAvsfPys70e9va39PNx7+9vcHExcfLztTyVkc/NzIxLy4yNzxO79THvr2/v8Tcc2xfWmb1 +4dHGwL++vLu/w8XJyc7gaUw/OzQuLi4uMzpEWt/Mwr2/wL7J3eB0WFZVatvRysC+v7y7vr6+ +wsXG1nNOPjkyLi0vLzE5RFX9z8G+wsLAytve6nBuZvXh2s7LysvGwsLBwsPBwsnV+05BPDUx +MDEzNjtDS1/dzcfHx8bJzdDU1djb19nY1dfX2dnQzcnIzMvIzNn9XE1FPjs5ODk7PkJGT2Pz +5N3X0c7NysnLzM3O09ra3uv45tvV1M7JyMbFx83afmFLPjo3NjY2OTw+RE9s5tTLxcG/wMPI +ztHU1tXd6/Du49/c0cvGxMTIzNPrWktCOzc2NjY3Oz9LX/LbzsjIysjHx8rM0NXa3ef6fv/q +2dHMxcO/v8TK0elYRj03MzIzNDg+Rk5j59fMx8bGx8jJzNDW2+Ho933z5dnTzcnEv7+/w8rW +81JCPDk3NTY4Oj1GTlz84NDIx8jIyMrP0tbf5vR5d3Xv5NjNy8bExMfKztTfd1xNRT89Ojk7 +Pj9FS1Zs6drTz8/O0NHT3d/f3+np4OXj2tTPzMrKysrMzM3V3uxdTEQ+Ozk6Oz0/Rk1Yb/Lh +19DOzc3MzdLY2t3i4eLu8Obg39rUzcnHxcXJy8/iWUdBPTk4ODg7P0hNXvDhz8jIycjJzNLb +5O9vZmBganTu39jOyMfFwsLCxsvT7VlKQz46Nzg7PD9GTmDw4drPzM7N0dXc3uD09/Ly7OPb +2dPNy8nHx8fEx8rQ3npWSkVBPDk5Ozw9QktSXHvo28/Nzc7Q0tPU19zg4Ovt5eLd2NHNysbG +xMTGyc/fX0xCPzozODo4OkBKUF3r0c3LxsPBydLNz+d2bF1aYWhea9bUyL67uLm4ub7N41w+ +NzAtLCsuMTY9Te3TxLu3uLa2vL/D4F9TSENGSEtVX+rOyb65uLS1uLm7ydlePzYvLCoqKiwx +OEdt08C5tbKzs7S9xcljTEw+PUJBSVpxzsO9tLKyr7G2usDRWj44LiopJycqLTI/WdS/u7Ow +sLC1tb7O0l9GSz88QkBKfurMvry1srOvtLq7yOVWPDcvKigoKCouNkJO4r+5s6+vr7S1vc/Y +YEZEPj0/QUthfM+/vbi0s7C1t7nH0+9GODAtKCcpKSwzPkzoxby2sa6vs7O3x9RvSUQ9Oj4/ +P09p5Me/ubSzsLG1trzL4VM8Ni8sKCgqKSw2QFHawLm0sK2us7O8y89fR0I6OTo6Q1Re0MO+ +tbKxrrK1tb7N3U08Mi0rJygsKi06QVTPv7ezr6yvs7K8ztNeQj86OTs7Q0xV08a/trKzsLK1 +uMDM5k0+NS8uKygsLS43Qk/cw7mzsq6utLe6yuZzTT88Ozo8QUxe6cm+vbi0tbS0usLJ2GNM +PzgxLzAtLDM2N0NY6Mu/uLi5tLa+wcLgW15PRURLSEZW7+7Vwr/Avby/xsbI3upyUE5LQj06 +PDs0O0E+R1hm39LGv8K9vsXH183YWHpcRVJQSlVb/ODly8jPx8TLy8vJz9nU5fD2WUxEQj83 +Ojw3PEVHUm7Qycu/vsbDxNLL3G7oVVBkV1ptZmf/3NLZ2M7U1MvJy83EydvX415TSEU9NDs6 +NTw+P01c4tDKvb3DwMDLzs/e5mZeZFZUVVRWX/7u5t7TzMjExMC/wsfM0NjuXFFFPzY0OTIy +Ojs+TGrU0su+v7+6vsLD1dHbYf9oU2JWS1ZaXX3y2NPYx8bJwsPEyMvK1eDuUEZDPTU2Ny8z +OTpBT+3R08S9vru4vL/Fycvvb3lOT1VKS0tYaFzf0NXJwsHCxMPEzsvN+HlrTUM9PjsvNjsw +N0NETWjOxci8uL69u77Hz8zfYnBfUkxRXE9PcH552MzO0MrI0c7J0OPn5n1meXBUTEdIRTY9 +QzU+SURWZdnN28K9ycK9wMfOzOH081x3XE58XVj0aPrm/uXj5NLY18/Y2dfe3vxz+mhjUUhP +PThJPjlERk1WZc7NzL27wcC+w8zS0u1cdHJPUmFbVlpnY2Tt5W1/2dbe3NXieu/p/m7z3N9c +V9lbQGFRPEVPUU9U399yzsXTzsXI29/P22Jz6ltSXWZvS1HXUE7S4XzZ0N/+19Df7NjV/enO +3v7S1FXy3T9LXT1BSUNLVlZu3fTRydnOytTZ19nt9P55aV5qXVNdY1li6Xz409jTzNDOy87P +z9ji1Ntmd2tNSkZBQD9BSE1MUG/k5tvO0NXSz8/W29ji+frp4Hxp/Hdqdu16XnXvX2zp+vXp +5/F/7+bm7fTm4Obx+HR39fn+bm1dVltZV1tbW1pbYGJncXL16OTe293a19jX3+nr6uT9e/1m +/H997vvp4/r+cGJx8fr79vj1c3NwXlxnamZwfmhlbGloaW5yb29++3Pp3+bm393i4N3f3+Tf +4fz3/mtpaWRfYGZeYG91eHx4bGx28en6/vh++OLi7ero7XlvbWxpZGprbX7z8O7l39/f7Pnt +63tpXl1iYnJxam11c21taP7r7vDr4eLl4O9+9nz+d2p37PL67//68312dnh/6+32//7z9XJz ++3RubmxiXmZnYWFpcXVycXT56/Ht6unj3t3e29ja4uru8/txZ2/6eXz8dnF2cGphX2FmaGVr +b2tpa29vfu/s6vR/9/Dv6+Ph6uru9mxcavjdy/Ph3FJP9OhH591s6M7f48ZcZsjgRlR7SVJO +Rk/sXEnk0Wr209ndzdrtzNFo/NHyXOlpW/ZlU3fdW1rocGvf62Tw52Rw4nVl/flv6fdj+ufy +9eLm6eR1Y2prWFxsZWhycW99///m3ufm3+fh525kdnZjbvlya3/7c/H58uv1dXvw+3Ztd3B3 +enLr8Hf27vf27+7y8O77/vh2/nNvdGz//XF3/WpncHR5eHx8++7q7e7p+nFuYmhsaWdv7Ph+ +9+/07+r//O/98uDsbvXn+XFubmtueHn27eze1tvg29rs9PhoXEY8R0xBR2ruz8PLzcTMb19f +UVhVVGDXyc3Kx8rM3VxNTUlJT1Zv3tLT2t3hc1pNSk1SXHzb0s7Lzd3i/F1TT05UcuXe0s3X +5u1dUFVZXGn13NbT1Nze6mJaWVpdZWz35t7f3+tmYm1rWlxk/uTl497h6e/0fm9x+e198+bt +/vdyYfnranH5dm1wbWr07/t6bfp+aGVvamv3bHTzfGro4fHg4np/9GFk7+nh2d3i3ut8fPX1 +9Pr/fnhuZmReSz9JWl3t1NXPy9pkWVZWX2Jb/dnTz9fi4N3m9fj/39HV3d3X1dbd7X5pZE4z +Jy5N6sy/vru2yUc9QkdZ3NnQvr3J4F1MT11aWGplZtjY/vPpffLpZF9vaGBvfd/EwNNvc9vV +4+/j3udrXDUnOd/izsHNzb75OTtITfTG0eHFyu99VUVK38fW1MjN1ttlaMa9xtXW0dPkZlFM +RT4uITTIz8a6xNzA4jc8YGbevcjvyM1PT3tnbc3mR11kUsfB6s++zmdjTEnYxs3My9XS0vTu +6WVjWTgmHirXyMC0r7W43jU1SmD0ysjQvb1jSmZb/czrQUbd2unSxsC9z0RBXHLx08jAu7nI +VklDOzEoITW+v8W8uL2/3jw+YFZGWe7av7/kdtFrQmzUUFDO0Nm+v8jAx08/TlTrwr68ucH8 +Vk03KywuJyvGt8m+s7zLykY2Wc9aUsvKzrzGXnTfTUx4RzzhvczMu77Jy2RBVOtV/725vsHO +6HY3JiUjJ1K+ycCsq7rHdkBGXj42UM/MyMHIytZPTks7P+jH0sOysLnWS0Ng3mte47+yt81Y +QDYuKyMhPrvBx7evt7vVP0BwUzpB/9DDv83hzb7PPThS2f1a7b+xsr/v+9t+YFpsybzH7Fs/ +NzYpHCjN0FLGrbG0s9FR2MtFNUNMUtjIfWm6s+I9TtTuT01xxbq+zsvBvsV3SFPU13RvUkZD +NSQgN1pFT76xsa+1zuXK2j04RFhp5udO8La8bXvMzOB3XFzWxMzc1MrHz35k28TG31E/OjQr +JCo8SE7bu7WzsrfC0c/kS0JJSkRNWV3azOTqyMHM1MvLzMfP5drMy9pmU2DX0vpaT05NPC4u +Nzg3PVXayLq1ur6+wthiaGhZX+bxY+3nXl7z/ltv0M/RycXFyNLzWlleWFZq2crP41tLS0tF +Ozk/TFNUZ+TZ1tztcOnS1+rdzMrT3/tm69xoU17k19HV18i/wcra6+vlel9t5u1cSkJDR0I7 +O0FJUVpeZe3b2dze2c7N4fPZ0d7l3efn5eL7fdzb18/JxcrKzdzu9uRzYV9YVVJIQkJDP0FI +SUxVaff46uPWzs7R1dja0dd0buvc4e/y++3h3u3k1c3LysjO0M3V8mBhX1NNR0RDRUI/QkhN +Vl9kYvni39fOzM7O1Nvb3O/23t7q49jc7ODc597Y3OPVzNDSz9z3eW5fUk5HQkA/P0FHS01W +XGBr8ubf2NPT08/T19zj39nS19jW3ezq3N3c2tjT1tTS1Nzg4vZmVU9LR0RBPz5BQ0ZMTllf +bu3n28/Nzs/QztTW2N/j29re4+Lm8Ovn5ODc1c7NzdLW2uj+b2BVTkdGQj0+P0FCSVBSW/Dg +2s/LzdHU3OXo6vvz4djQ0tPR0NHY3d3i3tzh3Nvf4uZ9al9bVU1MUFlWVVZPTk1LSk1UXGJx +e/Xt7e/k3uLe19XVz8vMzczNztHY4O7x8Hx+7uzn7HxuYGReVlZWVFNZXF1eW1pbWVdPUVtc +Wmj+d/rs7Ofh4eDc2trY09LU1dfbYkf+2dbozsnEv87d49pqUk9LTk5LSktVWWFebPzxeWpr +Y2ZoXVRPTUxPVFtf9+nb0MnHy8fKxsvR0tTX9ejw6u99aWp4XVl2dVpYYGxlal9ra19jXlxa +ZF1e/m5xaV9TWmZub2F44N3r5dzX2tnW2NbX2d/f3+X79enl+e9v9fBjYfPoWlheb2lbVf13 +bm3v7fDvYWpsfVpk+Gjb6efv5mlfaXXx/mxr5Wpi7uv14+d87+nk897b1uTp3eb4eOll+nJ9 +7O5q/3Zdbf1mX2hqbl1ab2Nybv1gYWZtbGt46t7k5uzt8W3p7vPv8/P06nbu7tzhfGRt52d0 +dd33but4bnboeH117vBp63b1ZF5UbmhkeF9pYn5sd2xsYHjle/H5+fvg5Nve6eP07u7f5O35 +6mRu5mxw7fFlb2Bq7vHwdnxsZXBjXu37d2xe7+3fdHzw7HBc5/FpZuzp/O/z9uXnfnzxbHt0 +ZnjiX2re7Xnq/Vjm+Wxx3eBtfnrpamFo4etocdbe5uti+Xz+bmpubPhkb2zd8Gh5ZWBmZmvo +b+zj6vfn8nL8YXl9bnfu5ez5ft7x4Gl2d+fw7u7v3W986nXv/mxnc31uaHZXXG5cWF3tYXF2 ++OL07G3l6/DubOve3vff3+B96vHq42Z1cnds6W1u7l5bXW1f8G/u5fTpfPZ0b2pob2pzb/vu ++Wjv6uJ5++fp73bvcHX8f/1x8Pp0ZW3o63194+Xubm3y9XPu4u78aGxq8XX7/3x2cGNncXts ++/NvdPj+7fnu6vL38PDf2OVvc+z4amv/9/toe3R7cvzf+nvsfnhyeHfrbmnqdXRgb+r0fnvp +d/hq8mj7del7ZOno6PLxaO13/HV/3/HnbvV37n37bPxve3Rs+GnyY2v48Ox+/3V2a2/weHDu ++HTv9vvv5u776HT67Gls+PlrbfXxfPZzdvJyfndx/+1n8955aPDy9vl7+W5ofWtvaHx3Yl7/ ++G72+Ozt2v7z/Orr+u9x5G75Z+9uaGz6emznePp73293+ed0ce7n8mtudW77fG/59mhr7W9l +7vB//fdf++ht9Prk5+/r6XNs8XFocOLvbmfq+Hdnb/968fTv8Wtya2pp7X7883l93Pnu7PX0 +8ulRfXlpdO7x99p16+3vbfXk5X9f5Xn7VvJ4YWlgbmf8X+vf5WFx2OTf+3fz8ml76WZqfO1l +aG5j5+ds7dt9/m1mY379Yn5tePfmbuXn+vvr9/Rx6ONq7/duYV5oe3lu3/pzdX17b/pc+2/1 +aelod9p6ed/gZvXl/3ty8Xv3b3ZuY3Tr8GJia+f1fnDk1+Tt7edx9Fpe6G5fZHxr5PLz1Nrd +6uRqdnns2/t+X+5uXVVMV09PTVdQTmJg6+3SzsnDyMvLwsjI0MjHzcnGx8bEYDYqLC0qKSou +PdrCt66rqKaptchVOjItKiovO1bMvLOrp6aoq6+2v9DpSTEqJB4dISQnM0vIraSin5+mrbtP +LyklIiYsMVG/squnqKuqrre7xNHHvcdSODAnIR4cHiMtQcSvpJ2cnaOuyz8sJCMhIy1HzLSq +qKeorbjE3m/33M+8tMB1RCseGxscHyg316yfmpmbn6q7SisfHh8iLUfLs6mlpqqwwN5wVVNh +2r2ytsRfLB4cHB0fJzH1rJ+amZufqr5EKx8dHyQtTb6up6SnrLTJX05MTubFubK2v3cvHxsb +HR8pOP2wn5qZmqCuzz0rIB0eISxYt6ynpqmsr73qT01W07q0tbzORSofGxsdICo8zKyfmpmb +oa7QOikfHR4iLEy+r6mmp6qut8XNz9LHvry9yF8wHxsaHB8pNUi+ppyZmJynul0xJB4dHSEv +Vb6tp6emp6uxsrjBwcDIz9tLMSAaGRodKDlVxKygmpeYnq3aMCIfHR0gKTZ7sqiko6Wpra2v +s7a8y+xPOSofGxkZHCQ2+7ipoZyZmZyjt0EnHRscISw6XMK0raekpaeqrK+ztrzKVzIiGxgX +GR4nMVS7qZ+amJico7NQKh4bGx4oNl7EubGsqKWkpKaqrrO800QsHxkVFRgdKDrhtaiemZaW +mqG0SyofHBseJjZXybiyrqqnpKOlqa650kgwJB0ZFxgbHyxGw62jnZqYmJylu0EqIR4fJCs6 +Vs28ta+rqqqqq620xVY0Jx8dHB0fJCw6Y72tpp+dnJ2grMc+LCcnKi84R+fGvLe0srGxs7rK +WzksJiQlKS00O0NPbtG9sqypqKmts7/eTz88PUJMad3Qzc3My8vN31A+NS8tLjQ9T+rOy9Do +Zlxj4si+u7q7vb6/xs3X7HVoXF506d7d525YTEQ9ODc5Oj9MadvOzdf9XVlm8t/WzcbDwL69 +vb7Ez/ZdWVpedOnm9G9dUk1IQz89PD5ETmD02dLa+l5YWWrh19TLw7+8uru8wMvX729jYWFV +TElJTFBVU1NQSUVGS1Jm6+5sYVdNSUlMVvzPxr+7uLa3t7m9xdD1U0ZAPj0+QkZMW+/e3dzb +3uPj5/RlU0g/Ozg5O0JS6su+uri1tLW3u8PVcFFHQD49P0RNXHbs3tnU0M7Ny8vW7VxLQT09 +PkBHVGze1MrHxsPBxMrR5WtXUE9QT05UYHzg3NjX1tPPztTX3nhTSUVER0lOWWj46uDc19PO +zc/S1NrzZ11dXF5iXV5p/e/56uXl4OTs+WxdWldVWGN56ujn7PDp4t/a1dXV2eX7b2ZjY2Ng +XFtdWlpfZHTq5ODf6X1pY19eYHHx59/f5e3v7evp3dvf5ez58u36cl5aW1tZXWJu+e7k397h +6fR9dXt5a2hpb2tqaGl79/L37+zk19jc3tzf+mlcVFFQVFlfae7l4uLl29vl6/Nwa29udG5p +b338eP35cfvt6+Ti6et+cnZtbGZeX2VpZ3bx7+no6Ofl4t7f6393/vt7+X5vbGxwb2xtdnVx +f+nuf3h0bGFeY2Nka2tvdurj397c2t7d5up2fO/v6vL+b11V4Pph+vLscP58/nhvampqX11g +W2ZobPH44t7f3N7tU2HT0OLf3N7p8uPqdlxYW1BPZlJd09TL3mr49MjfSz5JbF5NWtHf2Vvn +x8nJz/Dd4WDqbV5eUl59Vl95WO7nY+nj7+n5bWltXl5dYnNpd3rq6ejb5tp75fDh0vnvbXJ8 +7u/w/f93cXh4cOptX15f5l9Va1va3l/4cO7dXePxYNTxeNtbU95599jx7tBd4N5o82vq7mVp +fFroZX97YXP+bmP4Y3Hi81/gedjq+dpkY+9aX+h+5XZz1/7o4mDv2nDt3/reXm5sXl1rbHhk +YnVg7uDm5Obo3eb7emhoaPDmaH58ZnVoX/p+8OTi/HTuX/H0/fb77W1jdn556vjq5Ozq+H7c +/XRnWPtgbnJdbV1Rdf3j0+PU53X+bevu9XroaW1ZZNx0ffFibuVj4ujl+fnfdP5kWV5lVnbu +dm/27eTs2tz55ufn6Gfy6GJiX1xX+G5+6+3i3nzl7l7hb19oZvdvWt7fWNzifu3vbmzveXZr +9OlmenV1bfN879/kfl/kfe3k53nq53Z9+f9ienJfXWNddmxw7eP65tzi6fTe3X5gdmxvaW3+ +7HZp61/s3l/9bmbsat93deHh8O/Ybu3V1uLn4fl26mVuWVFMRUhDQkZLVWvfzs/KxsLAwsPH +ytDS1+R338/Sy8bE2Uk6LSgpLDJGV2Tf3M7EvrezubvBz9zvaV5nWXfp3c/EvsG9v77H2j8x +KSQlKC46TW3Lxb61sa+vtL7L/FtTTEpLTk950766tbi3ub7GeEIuKiUmKCw0PUx3x7uwrKuu +tsTpWk5LSEhITVN107+7ua6trq+0wmM1JiEeHiImLTlOzrCnoqCkrb3bSj45NDM0N0jivbCs +qamnqauuv2AzIhwZGRsfJC1MvKedm5uepbDIPy4mISQpM0/JuKymoqCjp6uvuddFLR4ZGBkb +HiQv7q2gm5ubnaGrxjgjHh4fKjRFxLCqpKOlpaesrrbjPjgqHBoaGh4jKD3Gr6KcnJydoq7P +NyUiISAqNULBr62no6Wmqa+wss1JOikcGxwbHR8jNcy1qqCdm5ufq7reNSooIiQvNEDTvbKo +p6mmpqiruN9dOSMeHRkZHB8pPF3CqZ6bmpudoarCOC4qISAkJy9DfL2spaGenqGnr73sMx8c +GhgYGR0oNEi+p5+cmZiZnqi2azsrHx4gICIsPc+uqaSenqCkqa/GPikjHxwZGR4kKDH7s6qk +npubnqGotts5KiklISMqL0DUvK6opqamp6y63z8zLCUfICQkJC0+Tti3q6Wjo6OnrbfI7UQ0 +MTIyNDpEW9/Bt7i3r7DGftr3NSw0LycoLjc6PXK8ur2vqrC0r7jBxelaUz4+TkpN9dDLyL+9 +w9L41nk0Lz0xKC45NzxM3r/Cw7SywLyxw9PE1V9mWFJcTVXPztC+urq6wNbe+TkuMi0lKC8w +N0RqxL2+sq21tq+6y77KX1hLQUZIS/HQy8G6tba8v8xePDQwLCkoKS0zPlXTv7myrrGwr7jC +vshxXVVKSExXaufQxb68urzJ2+VGMTEtJygsLTM8StbBvrKtsrWvtse+vt9tb2JiXGfm4N3L +wcPBwMr5W0Y1Ly0oJyssLz5V7cK3sq6vsa61xcC/7VpyXlZYa+LZ0cS8vLu9yNVaPzcuKiko +JysuMkBn1buxr62srbG3usDXcWFaTU5bZvfYzMS/vL3G1W9GOzctKispKS4zOU3bwriyrqus +rrC2wc3T+1JJSE1TYd7RzMS+vsbR2lQ9Oi8qLC0qLTU4Q+/LvLCvr6yttbW4x9XuVlFPSE5i +YeTJyce/xc7N+z9BPywqLywrMDZAXm/Nt7SzrauusrW5vdJdXlxIQ1BYU2Xp0M3Q0s1+PU1K +Ki09MCs0PkFeXti2tLevqq60tLq+y2xmdEdESldVT1521tnu183gZ00/TTwrMkI5MjpQb2Zg +zbW2vrWts8DAvsrkVWT0WURMeF9TXtzQ22ttz9dWU2JSQ0JJRUdHRk5QSE7x59bPy8i+wMjG +xcrP325y61VQYmBnam7q8mFvcGxlfHre1N3n2eReZ1JSTk9MTlVMT13l+nDZ5NbU4NfS2HnX +3/p1/ellfVpqz17V0MjQ2dfe/l1mTExVSGNWTdxKcNJd7+br+PVs3GD+6lv4Xfv2delt2s7W +39fR5f1sX/NPWV1S3Uzy5H7fbNrd7dvy1fTy8W58YXdoY1/6+unx4u3lfPP3XHJPU1NOUU5Z +/nPw1crRzdPVzt7b0uPo7u5fXmdfbltpZmX4/tnn8d7+XltWVl1XVFtjZW7f4OPa1tfa2eLS +4Ph4bGhcWVdXX2lfbf36bWhdZv7e5uvuanx5/2p89Pfh6uHc3tTX2drb3Nfce2dlUlNVVFZO +U1xdVU9XbFxhaunpceHc2dTU1dfX2enq8XB539rj3+DjdWxnWl5qbXpuY11fX1dZaVxXaPvu +8nny3vPr3Njl+N7b/O3l4OHi4X5mZWly+XH+9HRzaGXl6ePvcvZ1b/78eXfp4/318/toe/F8 +cGF0cW7z9vR1cfl/93Nv/Hd69fv1+nZ1a29qafLq8nl27d/a1tzb2eLg5fX3c2x0bnJrX1tb +XF1eXm9vdGZqdf/o4+fp4+Xl6OPrfHFsb310d3J8/fjt9PV4fGpkaGdqc3307u7x/n52bmlw +eu/s4+fs6Ofq7O/5fvF9b2188Xd6cXNrbf7ybGlmZWZka2ttdPv67d/c3+Tn7Hd4bmVmXV9o +a29wbHJubXPz7Ofh3drc5O3y9fv6/Xd5/XpweHN1bW5nZmt39+vtfvh+am5paWxtcHB8e/zp +3dnc3N/h6Ovz7fpubHlscXVjYWNra2lfYnJzcnvu4Obq4+Xo7ezzdP309P5waF1t0v5f293t +421h6G5eXF5cW2F5PFm8XFzKyWzJ2ObJeWJsa19bSVBcZUnZzffUxd/eetngT2xQamlCTv1a +WW9pYdzR3t/FzezV4nrOb0/x+FhaY/v+805W2u52W/na52N43NrZV0phUFVT8tvL29nW1dxv +7trV9Vtr7FdTTeJuWudm3Wb8Xmd+Xm9wf2jr/urofOrn2+jb7f185HLb5e110GntY1nu8Vts +6Ofn8HPn7fpY5vdtdGhd5VRNVVpNSVVNb2NR+OHT7tDJzcXTxcnKzczY0tnY9c7kztDv3047 +QEU1LjU4OD1ETtC8ysG0sbq/wsXN80xSVkhGTk36z9LKvrq7v7/Dy91PPzs3MS8uMDM5Pk3j +yby2tLO2uLvI3+VjUkpISEtSWmTl2dnNzM3Jz9XV1tzwXl1SSkRCQD8+PkJLWGHs2dLOzMjI +ys3T3eTucGVfXVpaX2rv39/a08vKz9LP2N3uZF9WU1BMR0VJSk1PWV1e/uTc2tjW2t7i7OPt +cGZjaXzv+Ozg3uDY29fSztPd2t3e62tvXVlTUk5LSkxNT09abXFvfu7o3t7e5ebs//j3dvvy ++evdz83Oz8/NztDT2uX8c2NcWVRQTEpJSUtNTk9QVVts+fbv3Nra19bW193f3drY2dzg5/jv +9/vy8vT+bnF+5OPo8mxjX1xUT09TT1NZX2l779/d2dbV3uTv/Hdxb2ZqbHB6897e3d7m5e3e +3+d2bHNraHBtcf/v9vrr7fL3d2dlYV5aVFZYVFdfZmhsZ3Ry9d7b3d7Z2NfY2N7j4+jm3dzh +7ejq8+jg5f98/fV+bmJeWlFPTUpMUVNUWF1nfPf27N/i3drd3t7d3uDg3t3r++nn5t/d5fTs +3+nu6ejj6Ovrd298bl9XUlBRUlBPVVxcZG57fnzt/n/t5N7h6eLd3N/g4urx5+Lu9Ozp7e/t +3Nna2tnX2drd72paVlNMSklLTExNUVtlcP3/+vPn5fTt4N7d2NXQ0tjc3Nt9TtrC5ljky83R +1dPS3fhmXlRFQURDQkJERUZMWG1sf9bQ2dfKyM7Pzc/W3efr7en3dfjy/efY2NHO1M/HydTW +23tNQkc+MjM6ODQ6TVpT9MvGwby7vLy8xs3L3WBfbVdKTl9cW/DZ1s7EwcPDwcTP315HPj00 +MDY3MzdDS0plysXHvba5vru7wM3d63pVS01OS0tZ8eLZy769wL67xNbbfkk7OTIvMTAuND9D +S+XJyr+3tre2trm+xc7zY1NIRUZGSFN34dTKwb29vLm7ytTaTj09MiwvLysuOz4/XMvEvrWx +s7Kyub2/zO9bTEU/PT1DSU5c6M/GvLa4uLS3xczXUT86Ni4sLy4sMz1BTt3Evrq0sbOztrq/ +zNh6TkZCPj0/Q0tZ9drNwbq4t7a3usLP/Es7NzErKy0rLjg/SGnKvbexrq6vsbW8xtJ5TkE/ +PTc6QURHV9/NyL+4t7m4tbnJ0N9BOTovKSsuKiw4QUvgwLayr6ysr7K0vtZ8WkY7OTo4OD5M +UmHXwby7s66ztbS5w95XPjQvKycnKyssN0hV1LuyrqyrrK2zusDcUEE9My40OTY8WdrLvrOv +r6+tr7m9vtJLRjsqKisnJSkuMjxbyrqyramoq66uu9hsSjcvLy0sMDtFa8u7sa2tq6uvs7a/ +1/ZaQDUwKycpKiUsPz1GwbKyrampq665wdRDNzkuKCw1NDVZv764ramqra6vt8XT3l1APj82 +LSssLCwqMldlarusrK2rq6+8z2NJNiwuLysuP0NJxrOxrqqqrK+5vcHjXm5dTEY/NjEuKSoy +LTFkzMq4rKysrLS8v2Q3NzMsLCwvQlRNzK6sr6uoq7G7wsHQVVBpWEU/ODMwLCkrMjU+8r+1 +rq2srK++2mtDMS4xLSw1QUrkvbavq6utrrK7xM3d+2lbUk8+MS8vKygtNDtN1LuvrKyur7XG ++0o5Mi8tLTNESFrEtrSxr66usbvAv8tuXfN6T0Y7My4sKyotOUVczLavra2us7vKX0A3MS8t +MT5HUte+uLOvr6+vtL3DyulqZ01JRT06My8yNTU7R2TZxL27t7W6wMnoV01EPz9APUBKT1r7 +0cS9u7m4uLq8v8vfa1RMSEhJSUtLTE5RVFFQV1tbXnbu7O/v8HhvZ1xTT1VebfHf1czGwL28 +vsDCxtDkc19RSkpMTlFTVFhXVVNPUFZZWl50/fvp5vH+a1hPVl1cbOvf2M7NysfGx8fIzNHY +6GlkX1hYXl9cXnfv739fXWlcTU1UTUpPUE1OUlRbcern08zOy8nMy8nN2NfT2efp6Ox0XFtZ +WVpicm1ven/9697f5+x6ZF5bVFFPTk5OT05UXm7+5NbS1tTP1dvb1NPY2+Dm+W12+3ht9ubp +4uHd2+D1/PRwZmRmW1lcW1RRUE5SV1937/f76Of08uXl5N/g6O78/Xzw8fjn3t3d19ni393l +f3R+//P29351aF9eWVhYWFZaYV9kfPP2fHV+a1pMT8TAT2HM1dZYT83AXj/1t9A5W7bbQc/J +ZFTb7Uffyz4+vPZA3dZCWthL9XpAeN1MRey16EK7vmxazlRPvlI6y75IYMHgdMX7Tm7PYTpo +z/pITerAUzjA1E1+fE7ny19HWr7vPdnE5lBc4u9j2OBhx8xS38Zi09RUTdPDQEa/6z9/7lBw +WXh9UPHfRG3EXFDS01tO6tPuWuDZfeHib2Ha127l39p4ZH7eb9p1TvXKUUnS21taVfvTWUzu +3U9V2+BV887pUl3b3E920vHVe1nP1l1YzdtN3b9QUsbcT2bcXVZbW2ntYW75XWnSdkXfyGdU +bt3acGza4F9v3t5c+upZX+vk2+5fc8/NWVbb0OxdVHbSWk7c71fx4+7qZnZzdGlu62NYbdrt +UVzS3FZr1u7t2GtY1s1dSfHG505m1t9vX+/cZF7b32do7eFRVs/OV03p0ehcX/je6lxb8m1a +/eNuaPjr4OPlb2fj7Hb3fGp74u9ZX+/f52T54eTi5GtTcN5xZGppbnV1bH7r/v/j3vVy/eXv +YWjn7WlubWv06nD26uzs4u9fZu/2YWn35/pr7O55fXH75+Pj92R4fu3o5uX3fO7e1OtVUllr +Wk5OS0pUa31kcOPYz87Ny8/OztLvde1wduDb6OPQ0NfPzMvJ7TosLDQ8OTM1Ss++u7a0tbi5 +ur7gQjc6RktFRVjcysK7ur/M0MnF1VhKU+3UzM9xOiwrMD09NzdG0Lm0tLO1usDBwt1FNjQ7 +SVVTUWTRvra2ur/HyMTL32dXXO7OzHg8LCcrNTw4NT3vu66srK+3vcDF2Eo0LjE6Q0ZIUt7D +ubGwtr7IzNHca1RUbN/Ny9doPzAqKi84Ozk+Y76wrayusbe+y/9JOjEvMzs/R1Hbvrawr7G3 +wtv6ZlVMR0xu1szJ0fFINCwrMDs9Oj9+vLCtrq+xt8PnTz0yLi41P0hMXsm0rayutL3O62RW +SD49SPDEu73H0144KygqMDg7P1+/r6qpqq22yGJDOTIuLC43SvLNvbOtrK2zv91OQ0A/PTtG +4L60sra9ylAtIyQtODg1Psutp6eprLLHVD83LyklKTVgx724r6qqrbO/bkE8PT08O0Hru7Cu +rrK93j0oHh4lLTM5XLWno6Olq7f3OzEuLCgoMFa9sK2rrK2xus5KNjI3PkBASHfAsq6tr7bG +Zz8rHRofLkdt0LSmoKOor8VDLCgrLi4vPM2uqaiqr75rSElFOTI6Y8vN2Mu/vb26tbjIXk9W +PSQaHTFt9ea7qaeusa+7PiYlNEo+Ol+3ra2urrh0OTY6OzpE88O9v8XN2t3MwL3CycjGze9D +JhgZKF3JzMGvqqqpqLoxICQ6Xk5N07qzrair1S8rOlRKPU7Hu7y5uMxGPne/v9HXzcfAvcZA +HBEZOMPEvK6prKuiqD0cHC7pycS4u8q6qKnzKSMtQ9y+t7/dzLOy4Tg2R9m+t7zkVsyxt20t +GBAbXqypqquwu7Wu2SUbI06wpqayTzlgvck9LC1Avamqw0hG9cG90kk8Tca6y1VM4rqvtvYq +FBAju6moqa/M57i2RCcnNsWpoatPLDFTx7/RRjdesq/NOzQ+4LKswj41PVDbxL29uK2rvjwf +EREkvqegn6jPTdrgOi0xSsCrp7ZHLy8857y84UVI2cTaSDc5yKmqvUUtKTXEq6qtsbnByl42 +HA4TM66dlZizMC4+OjlFQD/EqKi8TTMqMM+tr8dNOjdB+c3FubG2zkUuJy7ZrKOiq9BBP0VI +PiITGkaqm5adTx8jNVXFvlk/zKyqukMpJS/Cp6e+OSouVbisrbvaZEs7Ly9Bwqqipbo9MTxP +0L8xFRY0sp+Yn0siKUPhwc09Nsiop7VJJh4rvqOivS8rPM2uqbNiQU5PQjo2QcCoo6vQMis5 +ya+zMhQTJsafl53oKCo4W8XNP0C6p6m3RSQeK8aln603KDrPtauvYDg+Qz0/S3+8qae0YTMx +ULmxxikVFiq6npifbygmL0vHwOXTsqyuxDciHy3HpJ2m3i8tPOq8udFIP0VMTmrLvLKvvFg7 +Pte0r7wyFxIeXKaZmq45KSs46MLP176ztcFHKSEq9qecn8kpJC5Rtqq1Uj1FTVvp3urHsq63 +2lBOXWo6HhggP6+bmKdDJyUu7rG2ztrQz8bRPCkqQrein64+JSMwzquotNk/OD1Mcc+8srG6 +ytpVPTssHBwuzamdnbE6KiowWbu5ycvDzOJgPS8zUsKwrLhIMTVD17Sttc5NOTVC3ryvrbTC +1GJENiIXHDW+opmdwi4pKjLivczavLa9xGgyKjFawbSwvV5MV2TgxsDFwsb8QTxJ27WopbBR +LB4UFSbXqJuYoeEuJSMt+7W1urrAxsHWOigmNNCspKrKPjY9YsC2usbMzedWTFTUt6yw1ywY +ERYlyZ2WmaXLNCYmMEvaxr29ws3+TURMbM+/u7zNXkZCUc+5sbTFX0A7RGbY13BSWP1YQ0U7 +Li46WtDAu7/L0sq/v81TPTc4RG7b2Me4r6ystO02LC06/by1usbW3OZfTD01N0brx7/C0l8/ +OjtARkZJVnzYxr/E03ZZWObKwcTVaFl91MS9xHxIQUJO7srAwcjX/FtIQEJIW9PEyf9KQURW +eG5VSkVP2L67wdNWRElrz8nO51hLT2bez8vM219KQkRfzL24u8hiRUBBSFb62dHNzuJaSUVI +T3TSzMzQ2OtpU0xRcdPFxNJZQD1EWtPCw8/3VkhHUu3Nx8XL22dSTU1SW3zdz8vM4VJCP0dm +y76+xttdS0hNV3rUysjM3lpIREps08jI1mRLSE1WX/vwcG/+49/h3/5kbe7l4fdcUlBb/tLG +xMfS+1VOUVv40MXFzvhRR0VLXvXf4O9oYmpxdm1jVVJc/d/V0tzweHJsb377f3T35d7e4ndh +ZXvh29rb6O7s+mpbV1dZc97X2N97Xltia25rXFxp59HLy9DvW09NUFVfb/fi1tbhdlxRTlJd +ft7QzM7R2/hpXmBkcuff3tvX3O1+aldOTU9WZenW0tXd5XxiXFpZYnzu5N3b4O1vXFlgbnvx +5+nn5OTqeGZdXmJu9ejs7+Xh4+twWVBRWnrd09DY5fT89O71/Xdubvfs6fxpYmBiZnvr5ejv +831teO3ya11bWl925dvd5/J3bWxqaGRk+9/c3u5oTFHPzez219ni6vHtbVhYafv6e+7i7O/3 ++m9eXGJnbH30+fns7OzzbGJo+u37fnJjde3l6+7ufXJ06efz/v15bW7x625ne+Te+GtrZ2pv +7Ofve/vxcW726v52dXXx7u//bGRqdH3v9fXt6Ofr93Zxamhqamdo/fbr6Ojj7vH5cG1sYGpw +ev3x8nx6bnzu6/Tj5nJ05d/v+mZfXmd+b3Pw6uDl/vd0XmJr/Xvu7ejv7+Tq/W53anhnX3js +8vjz7/Vwc2Zod2ZaZuzv49vj/Gttc378/enf3t/k5ufpfGtqcunrfG1ycW5walpbX2l5dHN6 ++Ojj6v1oanR4bHXo6PHu6PNxaWZwbWv8+Xzz9nl2aGZ27ODc2tnY19XT29/d3dbR1uDf1s/Y +Z0MyLS0yODo8RWDOvbOur7a8wcjjTz86Oz1HZNfPzcS6tba7w83Z+WpiW1dbaVxDMisqLjU3 +OkNjzbquqquvub2+yl0+NC4uNUVddOjLurCvsLW9zNzqdFlLR1Hgys5iPSwmKC86NzM85bas +qKeqsbq7vNg6KyksMTc/TVzcuKqnrLa+xM3jXUg9PUvbxcbW+1Y9LigpLS8wO+27sKyopqqy +vMLvOSsoKy0uNVHNvbKqpqmvt7/cS0BCQT9FXNvKv7u/7zkqJCYrMDQ5Ub2rpqWnrLW/00sw +JiQpLzhAbL2uqKWmq7bF3FQ9NTc8QU3kwLi1tr3iPiwjHyQrLjZftKekpKWpsMRfOSkkJiwz +OkjNsKilqK21v9dNOTM3PEVc2si+t7G0vdZMMSUeHykyN0y6pqGjpam13UEzKSIkLDlH1bOs +qqipsL7PdT4wMj5JSl/IvLu3sbTA7lhDLSAdIS89Pm+voqCorbTGTzUrJygvRmTXuaqnrru6 +wGM7OT4/Qlbt4sy8uL7Gv7zG6FVNPi8nIig8RzlMsaOpurmxvU00LzA1RFRN5LSttb69xv1f +Sjs+WfBWWMe91e3BtbvTzr3FbkY9PC4gIDlYLzC4oazJtaeyTzs9OTM0OT5quLG8va+txD06 +T1A6N1LKyc7Fura7wcPJ2PZlT0hNRDMnJDNBLChirK6+rqGnveRrSzYtKy9FzsvBrqitwtfP +SjAxOj9Jbcy9t7a9xL3DaUxs3FVN2t8+JyE8TSAixqu91aidq83N5Ew3KCYyWX1MwqaosrW4 +yFg6NzxFU0tXzsHE08zAx+Z218nTfGZHOC4lKDQwLU+1r7Sto6a3zfZLOCsoLz9TXs6vqrK7 +trruPTxCOzU7U9PN2MSzsLm/wcPLYkVMRTQtJSc/Oic6srHAs6Wks8rO7Uw0KC5CPTVOt665 +t6+0vNxITlA7N0BTWVzXv7y6vMK+vdxc41YzLy4mKzguM8y0vLSopq26wMlpOi0sMTMuN+vJ +wre1s6uuysq93kA7PT47OkzYxb+7s7C5x9RwOyklLTAkJkfT9cazqqartrGvxEs+QDswLC46 +VFZNy7CyurWyt8BnS15NPEVYWmP97dTL5fHQ3FlNS09IOz1TU0dU6N7X1djQzN1mb+Z4XWT+ +2snGyMjIy9XyZ25dTU5SUVBUXm997tzc39LLzc/P2+L2U0lMTUpHSVZoa2xo9+B9XF9tbGVf +bOPT0tDLzM7S39zZ83vs6OxwZWxqZWdpbfTw69TS3ebd4mNQT1BKR0tRW2ZgWmn6eXb+6dzd +7t7Nztve297d4Whx80tR2O/axM3Xz/d54VpTXGb/1+LkzdfubEc8Qz8xM0FGSGXcwbK1vbWu +ucnM3mRHNzU5NDQ6Q+TGybuusLe4vMXbTENLQztI+X/zzsnU+j85XDkmMU0+PebEsK24s6mv +3Hv4TTswLz1JNznJuM/CsK+3x9TBzj08Z1M+RWDKw9zPub9TPjU1NicmO046Wbatq6ytqKrL +TFNALCotNDxDWsewr7mxrLvg8V1IOzRCc01Pxru7vcW+yE4/MioyLiU22Vpvs62urba5s9o5 +PkQvLTpFVubMvLOzvL++zFxLSkc/QE545s6+vb+8vtbsbks8MywyOisx0c1bva6ytrzCvNc7 +P084MURcW+LMwLm7xb++1nB4XUtLT1zs6tvFw8zHw913/ko9OCwvRS4q2MFI0q2yvrq7vMdL +Rm1DLz5zTEnWv8nHu7/Dw83W21ZOZFFLbOft1cvMztPT4lZOQzEsQDknQ75IQbSuxr2wusrl +XGRONzpuWj7yvt3Zt7zSxr/V/3pTTk1JWH7858vJ2MvI3d/qUTsxPUQpLsxZM9KtxeKvr9To +yOJJQkFHTUZPzc5sv7fVz7nHZdbZS0ZYWk5a4tXW08rH1uvpaUk6OUQ5LUPeQ0G/t+vPsLtl +2b9qQlpkSUlUXfPx9snD0MnAydjc23teYl5WXXRvdu3o39ro8+n5Sz5MRTQ8Z1E9Zr/S7r+7 +z9zJzW9YXWVdU17l6X3fzsvR1cjM7v7uXk5SWFhWXGdket7e4NLN3uvX9kxGTUo/P1BcT13b +ztLQzM3X8f51X1hbW2Tx4dzTzszP2tzf/mtqY11cXGV7/+jZ1NfX2ODob1xgZFZMTk9KRklQ +WFz539zZ29zc2t3m7u7ud/Pk9/ze3Oz27fpmX3rq8n7t5ff02tnd39vhfW9ua2BpfnFnZWNa +UU5QUVBZZXH26Nzc3d/c3+fp8Ht38nZnbHt+a3Xe3erp3Nnd2tzl7+vm6vb+fnbu5Oz7dnN3 +92pVUVFNSkxMTldlfebc2NPQ0tbX3Ox5dWxlbHR+8+re3d/d29/t/nhxbWRqa3Hw5NrY3t7e +3+n0blNKSElFRk5WX/fd3dfS1dPX3e1uY1xZWlphffno19Ta2tTT3Ox+/Wtcd3j95tna2NPX +09ft92lQSkI+PkBETF963MzN0NHY2t/tZFxUUWJbXVriz+bN283P1tvh2uX57WxcY/nr39Dc +2dzf5u9zXFJMQDs8QkVM+9bOycnO0tXf4+xlU1BUU1t+38/Nz9Ha5v1xc3p48uzve2x59ejc +2NPW2tzf6u3m3dztXUM4Nzg8R2fWy8XGzNTd4ubybFRNTVFb8s/KyMzS3/VnWWd6/e7o6evn +5d/b1Nfb2Nzk5ePg5vRrUT01NTk8SubKwr/Dzdrp7vxtWk5LSlNv1cfBxczgbFtVV11u8e7q +5enq4tzb2tXZ3NjZ1tHR1/FcTTwxMDU7St3CvL3BzOJjV1dcW1NNS1J7z8O9vsjfYFJQWWzq +3+5/++zg2tTY3Nvm8Ofb2tzZ1NbrXU89MC8xOETswr28wczdc2ZiY19ZUVBj3cq+vcPP81dM +Tltodu7r7vLt39jc3dvb3d3Z2dze3NbU3HhUPCsqLjtpwre5wN1nXGzi3HFQRkZS2cK9vMLZ +a11VTlNg8N3Uz9R6UlJe8M/JzNbg7+Xc2M3DxM7pTDcnJSw627avt8ddSFBaYnBaTVBr2ca+ +wcTI0t73VERATdu/u8LZWUdIUW7f2dPOzs/V6mdk38i+v+A9KB4lOdSuqrLLbEhMaVNMTk5f +1s7e4trSv7vE70c7PVjUwLzG2uh4UkhHT+DAubzKZ0hHZsm6ucNbOi0gIzVZva2uvtVPPUVP +T/za5N/Y8/XMxb+8ymNKRUNNbNS/u77K8EI4O0nZvLnA2FxOTWDWxLu5wls8Lh4fOtq0qa7N ++E87SE9AVNDOzcjlXM7CwL7STUdLSFT+2sS8vctkPTQ7X8O4ucHbbVRNVm7LubS9XTYpHSBD +zrasscvVYTo9QDxywcXNz+b3w77FzO9PU2hNR1rewLi91Fc8OER2ybu5wMvsTEdNccW5u9NI +NCIdMWfRsay7xMdCOEA6Q8vJ2s3O38q/093fYGrfXUBO4s/BwNHkX0NDU3XHurq/yOVVT2HV +xMPNUzwqHSpcXcivuMG35jQ6PTvsw/NvxsPHu8ld8Nxz5ulBRdjXz8HH2ulaP0Nsz8G6vsrN +3FBg0trkbkI2LSAt1+bctLK9t8w2M0RBS9rmWse2wMfG7mDja0pQeuTe4eXOxs5rTUdJaM7I +ycPAw85z7NTa60s6NiYfRcdM16yvt6/TMTlJNTZu4nG5sMjHudJLUEU7bcZ3Xs/HyMrfT1RZ +RkrszcW9vcjOzcjNYEY9PTklJFLKTtyvsLW00js/TzYwSvF7wLbBvrHBSERMP0JXTV3HvsPF +wNVXUk1Ld87Mx76/yMPD5EE/TTciHjbfPkixqK2yvu52XDEpNVtNUcW5tq6xzGniUzk8VFZq +y83Mu79pZ99RSvDd+c7CzMG//mDWXjEnKTg3Kzq2rbu5r6+78zs0PDkuON3Ex7uvr7vN7VJO +TkRGbeNh48HAys/W2M/YWmTO10w7Q8p6MDjP1zAu6MJPTMS6wdDp3cloOUvJWzz1wdDf187C +x2FXzs5dV3n5bV9fbN3S2tzU1NnXc0pOb1ZJV3ri2Oluee9uTUtPSkJJXk9K6dpe7srO0sjO +18vRbGns+fvr3NbQ0t9x/N7mcH7b0tHdevl3UkpNTlJdbmlu6W5h4+Zfc3JOTFtSR01eXmL/ +/eXV1eXr2NDb4t3X1M/Kyc/X3P1iXlZafube3eL6ZWthUlFbWlxtYVVt5e3o3dvqa1tNSlBa +V1Rn3dfd3drY4PZ293pcX/Lk69rS09jub2hgX3bb1N7k3OZ5X1xsbVtXWmZrZ2/23d7n5vpq +ZFpVXGVkZ27v3N3r8/Rya21kXGF67O3u3dvb33ptef/9++fd2t3y+PH1c2xzdmpfbH5zY2jn +2+xz//9oWlpgX1xj7+j5/+7h7W5183FjaHJ18+br7+nl83N6/vDf2d3f5312bGz49fbo5Op8 +am1waHDy9nlwbWZoYVtaX2VfZHF69e7q3+x7e/ru9/Ti3ebs5uPu8fL77ur/bmdjaXz+ePDp +7O7u/HVvaWhnaWx2+H53+n5zdm5oWllfZvrf2t7d4O/1/vbo8Xfy6fJufOryaW3z+29qampq +cu7m7Ofj8np1cmtv9+n3+ezp/2tqb2dRX+hpV/zX3+vj5Ol8ZWNydmBe+u1t9Nzc6ebg5ej2 +9+vza19neV5j6u9jaPTu8/R55t1wauftZV5obGhy7+719/Tu5v5s6u1oZ/RsZG//eXp+c3bv +/nT/7PF++u3o/vfub/fw/n92b3rz/f3t9fTv83NxdHz6bPrtdnB0dW1manD5bmh7d2717ezo +7fz8+XVkb/5udvR/+uzr8vj16u77+/78bXz6enNu/3t3ePn8+v1x+u99cm5xaG72+fN+6+ns +6ujqdXn+aGlrdXFpZ15s/vr46e5wa21zc3jz7fbv6OXl6ufi5u35cWprfnp883p8+WxnaWpv +cXdtbv35+ff993N29fv//f/19vT07ejw+Hzv7fL5+fD+dnFpaW54/Hh08vnxfPv/bXJ4bWZu +eXJ2+O7q4OLq6Ozvd3R0aXD7+H7q+er49f/wdHn7c3t76/N7bm9oZW9sc3FnanD/9O/u9Pv4 +7PPz7+rt8e/p5fh8dGxkbX52anL56unvbmVrfn11+v9+fe7+d+/u7uzu/nBvb21iaXzu+/jv +8nh29nR9/353bG1rdXr77uft9/n59fHt7vP9/Pv9cm1tcHJve/X8evPwc3j0fH54bW75fXF/ +9Pb67O//7ujm5+jq6+z1eXD1emtnXlhZXFVRV1lWWmnx5uDh3NTQz9LS2N3e3eh9fXN6+ejb +3Nzf393f7G5lTEA8Ojs7Oz5NfdLEvry4t7vBytlnT0Y/QURFSlrt2M3IxsXGydLuZltVU1Na +aP7f1M3Lzc3P1uw8MT88LjI+QVzFx7+urbi6u85tWz0zOjw5PlJ3z7u6vbi4ws7ZXU9RRkNV +bGjdysm+vPBBQEI3Ly81QW7dzbqvr7O4w8/zRTc0Njc6P0rgwLu4tbW4vcn5VEs/Ozw+Rl/j +1sa/wcPEzdzc4l5SWVlDMzU/OjtIS3q/vsW5tb7Dxu1UV0k9QEhJZd3b0cXHzs3W3972Wldc +WWL879PEwMjKyMvRTzYzNzUvLzpP1sfAtq6ut7/L3W1BMzI5P0FIYMy5tri6ur7MbklCQz46 +PU1t4dvWyL/F13r78V9VVWHfz9vfzsvK1U46QUY2NT1AVtPWzrm1v8PG1Nj7Rj5HSUxbZePF +wsvJytXV7lZcbVpZfOjVy87Py83bYkM2NDYzNDtN4cW9ubOxt7/VZk5AOjg8Qk750MG6t7e7 +wtB5Sjw6Oz0+SF3cxsDAwsfTbk9LSUlMT13ezs3Iw8bIz9x5Vk9SUE1NUlBFRFBOS1/u2sbA +xcLBzNnoXVNTTkpPVlr26f/Zy9DRzdvc1vFu9HVp7fZy5NHOz/JNPzk3NTQ5S+vLvbezsra+ +zfJNPjs4OkFNZ9TDvby+xMrWck1DQUBDR01q28/KxMXK0PhjZlNOVV1x287NzMzW4mtPS0pE +RExTV2f13M/Lzc7N0N5uU0VDRkhLU2zWyMS/vsDGzN1qVktISEtPWWdw3M3T393d63VhWmV4 +aWju2M7NysTAympHOTY5NDE6TffJu7eyr7bAzX1NPjY0OkFLfMzBure8wcjXa05EQkZMTVre +0s3Gytnc81FKSURIVFdj3dPV0M3P0uJsbP5+fX1ubfP6XUdFVEtFTVt3zsjLv73Dyszee1NA +SE5FTm9ieM/OzcXT8uRvXGVZUWnvbd/Nz8rHzs/UeV5KNjQ4MzdASG/HycW5vcK8wc7P8lBR +TENNXFh73N/Rxc3RztjzcVVIS0xPae/o1M7RztHi4N55XVtUWGNZVWJXTFNZT1FeW2j6cnbq +8ubZ2c/M09nZ6XJ79+zj6erZz9PY293kfWhpfH1oXl1lcnR0aWReVE5QV11hZn3r/Hl9ZGr9 +WlJaXGh3a/3U0trT1tfP0+fe1NXa3unk6W9pYW18Z2Fmauv+WWDuenB8bW5qXmRxZl1wa2pr +cOzt3+l+bFlYXVZWX+7j3c/Qzc/a3ed4bX1nXGz1fe7u8OL17unrfnJ1aV57+vTzZ1xo4XZ4 +6eju7X1ra11jY2pna/Bvfnf8emFtfWtu5uZxYXd3f3Vd6+Pl4NPR19vk1eF7buV5Y/Tzfn32 +XGFhYFJVWVr9X2bu4njy4f77d2j+4nX86uHf6/Hp2u/k4+vs/3lbal1hYltcZnVu8n3m4ORq +df5k9HDzfuzh3eXy4OPt6OZw7+3za2ltbW5g/GZe/vr0+P5tf3ZmY3NwafJ5eHL1eXlw8+/x +4+p06vP73+jl6fd7/Gvo5/T953xpbGJhZnhbZvp1enFubXRhdef1/vH06tzr7en89Glpaex4 +f3j05H7+aXlh/WRz+vvv7N5zcm/9aO57Z/nj6ure23106/llaWlmWWd8++r4bv5nfm5tb/ns +6nT6fnP4+Ont6t7i6e5+d218/mFjY/JrYXfg7Pf59W1sfmd39P1r8uX4+uHneu51+Ozv6+13 +9nhjXmV2dfjq8e7z9/1ia+/6dH7/a2j5fOtzdGzydnJ09uLv8ejofPl0am1+d2ny5e37ffRx +cnvp7vzp3uz79nf+/nReaHxubW/wdW9i9Pd8bvXg53Vz6nnscPBubWlndV597/N+3vj8a/zp +/e7l3PHu4OPv72j8+25pdmZi9P5ma3FyaV97/f3w6en4d+rufvX0cHfxbXjx8XF1d+9obXfs +a/fa6u94cG/rb3Xs7PPr221tavR1e2NneGf4efD55vvy+2dqX/Z19vf7dOTqd+p633n89On0 +avHu72R0Zntvb175e27hZu39d2bo6Hv7aet9d2vo9vvt9ebx/mjq8uZz9HJ7al/ucXRo3+jq +/fbxc+pkdnP9X/n4c/J15XLqXXn39Phk9Wz0VOrs5/v93WvoYNpv7fRt32/uWN7q32np5XX5 +WfBY+F9o6fhkbdJ0+Xx7bO5+XuN2b3vrauXraOze+2rfc2/9X/fvbVn092t+em7h53Tt3nde +2f5q7uF5cvNZ4Gxtcn1oYuBddnV5X3X/Zd/99HzaeeHf9/HjflvYbGXs/mle6mvxbWtv8Wxo +4mh98Oh77vB05t91aOf3aGrqZGRravXpb1r5415t3+tu4+N98uBxctz9aN18YuDsYP3pYGl6 +dnDra13d+1z37l9cdmjwdGB62e9e4td+897z9Ox1edp+aNneZfn4aWrxVurdUVzoZ1Pa/ljc +6mrn4WXu11d712Fb33Rk1Ota4dhg5tlX/9xkX2ZtW+t9YNftZ/7nf3zv9/vg5vfl/vbr4PV0 +dGj/d1xo8l9c9HFva3R3buhuduvu7np87fXu7/b4/e3799bi79/2am/eY2Tjdv7u92fh/WTd +dWTs6md95WZ1bldWV1RXV09ZbVpd5uLm1NLUzs3RyMrRz8/h7+Z4bHzw7efrdnxiU0VERDg4 +PT49RVhr28vDu7q9vb3BzdDdXlBPSkJFS1Zv+9nMysvMyM3a2NjpYGHo6F1t4GlDQk88Mjk/ +Pj5OdtTMyry0u8C7vtZndllEPUFOR0Zoz9XUvbrCx8HF1nVk+WdOWvN9WnPPaDs/WTktO1A+ +O2HKx8jAt7O+zsHAXz9OVD03RWlYTNy8vce+tLnOz8TTUE5oa09Q79HgYd/MTjM9XzMoOl06 +Nue9xsi8tLK/3Mu+bTpEZ0M3R9vkX9W7usbFu7zOZXPcYkRN4/JX+s3U8djfTT0/RzYvOkxD +P/zBwcO+ube90eLWbUI+S00/RF/u7dXHyMbEyszM1On+e1xYb2th9eD47tbT3OV6Y15PREBA +Pz9ETE5T9dbY2c/LztTX2+Lo4/lqaX71//fk1MvQ18/O1+Xt/3FxbW109+3q5PF5a19PS0pE +Pz5ESUtTaPnp1szMycfJ0NnqaW1uY19o++7k3tnW1NfZ3ens9u/6dXNucXF7/ejh5OHr/l5P +UFBJQkRISk5Zb/zn2tfU1NTV1N/v9398fe7r5dve4d/e3trX3uPe4vl8+3F0//Dt5u726+1r +UE5OSUI/RklITV5octfJy87Mzc/O1Of3eGdiZWVp6N/n4NfY3mxe0M152MLOedrNzs9uTnbo +RDU0OT88Nz5z19nKwb24u87dzdtPR0VFS05JU9rP1cjAx8TAze/t719fbv/j1MzHwsDIaU5q +SSojMUYtK224vr60sq+xz0tdazsvND9U8d3aw7W3x8m9xvZbT09cXVJsx77LzL+/xsh6PkBG +LiQoNT05Rca1s7S3urnEWEBAQz89RFrRwsHFwL7K6PV0W2JxX2nk39/WysTFx8fKxtNIRls7 +KyksMjs+TM23s7e6u7zLXUQ/QUNITmbOv77EyM/a7Vlc+OXc0tni3NrYzsvS29fNyd9MRko2 +JyUvPD9Oz7qwrrS/ydJsSD89Pkpt8tjEvr3F21lOUFh0487EwcfP2uXaz9Pi7N3Nx8zqTUIu +HyIzNTX8ubWuqrDAy+1EPD46N0jdyb+5usjY3mlJSmzozb6/x8nN3tzcemre0NPR1N1iRjYi +HCg2Ol+5tLCpqbnN/kI6Qkg8P2LTxb22vt1zT0BFXGvcvri8xNJmZtjX9PLe18bBzeRbQS4e +HiszTrmvs62pr77PRDEzOzxFc+jQwbi0wOxLQz9CYeXSvLa6vsz57dztcO3WzcnFz2RIOSUd +Iyo1za+urqyvu77YPjQxMDdYzMK9uri8xe9IPj1O7s29urq9yN7q1tj9Y19ked3PbUU5KR8j +KzPhsKurq667w9FIOjQuLzxixrays7vI7U9MS01j/NPBvbq6v8/e4Hxr+V1MXe5cTD8tISQn +LF+1q6iorbnG40pFPTQyMjpev7GsrrzlT0NGYN3W0NDPwrq4u8ThW1RccmdWSj0zLScmKzBF +xrKrqq2zvdVbRz04ODw/T93CtrS3vdRhT09cfN/Z19DIvr2+xNhvX1xdXEo9Mi0qJy04Scq1 +raussr3SWUI+PT1ARU/vzMa/vMPM1XxiX2X+5+fr1sW+vLzG1vZaV1dSSUM3KiQlKTXWr6mm +qbLC5lBKSUI7PD0/Vs+6sbG4zlA/Pkhf4MzLz9LPx7+8vsjfXE1PYmtaSTYoISInNs6tpaSq +ts1jTU9PQzs5OkbevLCttMxXPjtHdM/Kzd1w/t3KvLu+xdXvbm/x8Uw5LCAeJCxMtKekp66+ +3F9HPz86Nz5S3Luwsb3sRTxEa8/DxdlyZm3Tv76+wcrPzsvZZFc+LykiICczarSopqqwxGpS +RDw8PT1Ozry2uMdSOjhBbr+1tbzPWk5TZ+DOx8K8u7y/z1tDNi0oIiEnNNqtpaSrvGdAPz4/ +Q0peyrextcFNLCozRrysrK+75ElERENwxry0sbjD12JJPzQsJx8eLFO4pqKpt9JHNz09Ok/O +vLKuuGQ9NDA4RmXIta6us8pFNzhE2ru1tri8wcvrWjwtKiUgIi9Vuaejq7n3OjA3QVfEtbS1 +u9tDOjc2PWnDvLe3v8jcWklESmHGuLa4v8jZ9+9TNysoJSAqW7urpqq+Yj0wNlLewrW0v9Fv +Pzg9R05fzb66u8HSZlRMS1ravbS0vd1kYejLwM07KikmIidCxLGprL3yTkFE6NXdyMTT3dpj +SVdYPUjPzL++1dPVa0xT3su5tL/fV1D2vra5xUwsIx8fJEHIuq+tsLrFVTtAT2jaycvPxstb +REdYX1p+zs7NxNRs18bHxMpnUHd0fsa6trW8UiwnJR4gLUjGraaprLTrOjU2OEvMvrm3wP5L +R0Q+QW3Gx8zCxMrEx9be709Q7uLYv7e4urvWNignHhkfPcuuoJ+nrL81Ki8wONW2trCxzkZG +Qy4z8N3Ovbi1ub/+XW1OSlzLwsXAvri5vdg3KCMgHRw0v66ppKavu0UrLz1JVsS6vbi+aU1Y +OyxUx13Kr7HCvM5K4t1KXr7Cfs2/xby63jIpKCIgHinJsq+so6ey1jQwP0c+RtDAvLzMzs/f +SzhAWe3r18O8tb3Nzs/VVk9m58S+v8PPUzAnIyQhIT6/tauioqy15Dc0Ni0sP+7TubO4tK/C +Pz5BOjxHfb+trri1s8RNPkNMcNttTHvXOikqKCUtS13Fp6CorK/ITUQ0Ki49Pj/ZubOtrbnK +0FM2NT1DaL2ztLCvucnX/D8vMjYyMDg8Mi89SlHeuq+tq7G+x9BNODg5PVBsds64try+ws7e +a0hBVunay766ur3YSz01MTQ1MzU8P0VKTlnfxr63srG1usXvUEQ+QEVPbdPHycfDwMDI1nVZ +T0pKVPXazs3Y4PRYRDw5ODo8Pk5l/vPf3O/q0sTAvry/xdJpUk5PVW3m5d7Wzs7U1tvscmBU +U2Hw5t/e0s7eWkhDPjs6Oz9Lfs7R6t3X7mNp583Ly8fFytj09+ns8OLb2tnb4PHf2/xXVFhZ +V1RWbeLn3+NiSURMTklLUVxjd+/3ZmFfYG3v1c3Mx8DAxc7X29zp+PLr3tzh6u95aFlPT1BQ +UVt8497k7H5tXlBMS01OU1ZcZ2tqXFpjdfbj1M3HxMXH0tzh8mdmdXH139XOzNPb43lWTUlN +U2P3/+fb2epiV1NPSklPVm3m5uHs/W9paF1m+ezk29TZ5+ftal9se+/a0srHyc/Z4H9pX1xZ +XnDs4+7o6nNfUkxLSk5VWGbu4/f3+Wxpa2pse+7k3N3p9XFtbW3w5N/b1NLY2t/ycPvxeHH6 +5tzd5ud1XFZQUFVXVF1x7env6/Xt6O98a2hqevjs929xbnJrY3ru9O/r8Pr1eGprcGl+39rW +09TZ3eL4Z11fZ253++7yeG5sZF9oamZrcvj07/T7cmpdXmZt+/33/Pfzfm5maWdqePzk2tXR +19vc4/Z7cWRlcHzu4+Hm5/p0cGdfYWtqa217cWZoZGRjb3Rsa25uc/978O15evxx+eTi5OLh +4d7f8nBvdnP57Xn33+Xn39ze3+Hu9XZ4bGdgXV5aWlpWVVRUWFpcX2h+5uLj6O7o5enl4t3U +09vZ2Nvm5d3v7Ojg3dvd6eHue3txYVhPTE1JR0pKTVBWXWZ5+OLb2tjRz9zY0+Xv6evg19vf +0tLc6ePtZW357tzc49jQ2vT4W0hDPjo4Ojs9RlBf3MbCv7y8vr/Dz+H3W0lGRUVJTl7qzsfD +vbu9wMTKztTm29heTEs6MDEuKisvMT1s2r6uq6upqa60wXJPPS4sLi4uNkV4xbqxq6irrbC5 +xN9LRENBPjc2OjIsLC8zNzxJzrm1sKuprLG7x9hFMjEvLDA5P2fDvLOsrK6vtsHNbU1JSElU +ZtzSVU9JMissKikyN0HHtrWrpqqsscrvTTEtLyssOEFTv7SvqaqtrbLA015EQD4+S2XnysHS +blc4LCsqKS0xPda9u6+pqq20xNNaNS4xLi83RO7AuLGrrK+xucPUWURCPz9KWurJxcXN31Y6 +Mi8sLC4yQe7TwbKusbW8ws5POzw5NDc9WdLDurGurrK4vsjfWUxISEVJW+rWzs7a9kw9OTUx +LzI3P01qzby5uLi7vcXdYlVGPz9DV/TdzL66ubu9v8XXeGVfX1FPW21rcfpy7v5LRElDOzk6 +P0ZFSWLq2s7Jwby9xMbK1edzaHFqc3Vw9Ot+d97b49/b1tTQ0tXR0dTV2+TzaVBJQz08Ojo9 +Pj5CTFho797QycrLyczNzM3Rz9DX297e3NbU0M7OzM7Q09TX19fd9l1TRz07ODU0Njk8QEhW +dejVzMjBwMTExMnO0Nbd7Xx+e/Pk393X0c/Pz87Pz9TV0c/S4mZTTEI6NTQ2ODo8P0hUbPPb +y8bExMbGxszW3t7d4u7w4d/e2trTzc3O0NfWz9bc2t/s7X1eT0dAPTo6PD09P0RNWWPw2tHN +ysrLzM/U1drb1tPb393c3+Hd2tfW0s7Nzs/V3Nzb4vJsV09LQ0A+Ozw9PT5CSExWWmXe08/K +ycnHyc3Nzs7N1NrY2Nzc3+DZ2Nza1NbZ3OTm92NsdmVXVFFLR0RBQD88PUFDSVNce9TPzcjH +xsTFyMnMz9fk6+76fn548+Hj3dPOz8/V4t7f7Ptwa19gXE5MR0NCPzw9Q0RETVVn3tLNycnG +xMnQ09PZ5X3w59/g7OnYzc7NysvQ19zr/ftxXlpaWVlUUE9NSUI/Q0I9RE1MUW3u1cfHyMLC +ycvO1Nzk4uvv6+nx7d/c29rZ2dne8f9wamhiWldYVVlcXmZwaFhTV1RKRkpQV1te9N/S1N3Z +09Xb3+vo3uH889rO1NjRy8rP1NbY3XtlX11cV1RUWFZTV11fWVVbXVtYWF5qaGNfYW50duze +3d/k4dzY3uvl2NLY3tzX2d3f6Oftb23973xjZ3VrZ2djaGxjXVxeW1tfYFxdaGl18frw3t3k +7Onl8fj3+PF7am389/599ufo7erp5OHn5+zxenZyanBoY2tramJoef119enj3OPx6ud7c3Rt +bGxoZmRgam1qam59ff30/X/29+rr9e/xfH70+Hj/e3v3e2188u/q4OHg3t7f6e95d3BvbGpp +X2FlX19obnL/e252dm9ubnb36+r0cP33f/t1aGn4+frr4eHj4ePs8+vv9fV++fr8dmZlam1t +cHl3eHZtbGNkb2psd3d9+Ofj6Ont7fz+/nZ3eHZ69Pd09Ovu+e7t9/Dx+H7+dnBqZ2thZGtx +eHN0eHRx+/L//O/z+ebf7vXp5efs7+/r7vB8dm9wbmpqY2Vobvl3bXd/dnj+dn/5/Pr78vd0 +bnhxeOro7+/m5ejt7e7x/v97dHd3c3Fwb3z5/Xh1bm5raXf9/fPx/XJ2dHNvb/9vbPV4dnl3 +8vHy8e7u6+fi4+Xm8377+XR8/nR5eGdsfHhrb3VpZWxwbmxobfj4d2188Xh29e9+bnN+9PHt +5uHo8+/0/W567O99ff7v7/nv7unu9vl3Z2RvanV4bnv9b2779e93bnluam1lX2poc+3y+fTq +6vPx5+bo4OX1/HV66O927fF77n557Pd4bmtvcmZscXNua//w+m35+GhxePr7d27s5u7x9/r+ +eWlz731z8u377/B9+e/6dvLubHj9bXr07vz68H92dG926vF0cWlrcmtv6up8avrteHP35vNz +d+jj72xu93pzbv94fvh4Z3LtbWBn/Pzq7/Pe5+zt7+lvZWpoYl5m6Oz96+fs7Ov9/vl2dXJv ++vtsbP/v8/Pq6v5nYG56ZF967u/8efv77vj89PX6++1zcfr3/O3sdXny/2Jx8Xp3e3T89W96 +83598Wtsb2zu73Rq9ur16O1u7+xp8OZ4cv3zb2Bke/92av7a6GJ34O1yY2jueGZz5N/7+97b +4fx15+diWW7tb2hpbvl+aGv6al1u6/pu+uri9Xb65OtrbOrj8F5j4ehna+vm9Hl08/lveePk +9/vvdGp7b3fj8mp9bWBpfvby/v1waPr6bmvr7HJu/vp56+7+3+D77/xr+PFpZHRn9+9pdnr1 +bm5kdfN28ur4aP7o8Oh3bOjtYG/l7W5k/+3ydefc8WVn5npkZ3n0Y2F64vxp4+T3cX/z9Gxq +8O37aWpvaF1fe/R6+e3u8Wd253ttfvf4a3Tf6Obwbt3ea3rodmttbvDsb/rb5nr+/H5hWWVo +XmhbXfZred/t+Nvof/ttffN+7+jl3+Dk8uzzZXdwYmJfZG9xYW37b296b/Dxam9xbm7t5urr +59Pfduvp8/VxYfr6YOznaWz2/O/lfHztf3N1XmzvYmn4XmL+bW3x6uvxd/j6bv5/9ebq9Xzz +395vb+z3a11i/nxcX/nf7/588Odkafbu9ffx4eR8833+5Ov1+W9v/X9taGxu+nxtfvhseW9g +a2NX7u5i+ePd1+5v3dRtb+l6/ft4en59Z3F5XmHr7mV06u/s63z/4uv8+Xj23nxh6eVhY292 +/XJvfHZiaHf5dfnvZ3rg8XnmfHrobe/sa2/06e/r++vp/GVh7e59cm187F5c6udwbOzt9Wx2 +73pgd97eaXXq9nhlbPPvaGb893d7d+jhc+3pcXJ4a31tZunve97b4/Ry6eVlYGdne2li8+5o +Yfrv935pc/ppaP3v5vD169/t/O7l3u/57utmYWtrXHf3afN5cerqXWF6cWdibvXvfu3c3uDa +6Wv/6Wtt7+3m5/zs5W1heWVeZFpfX1/y9XD19Pfu/vDn6uvtbPvi73ns6ev5aW73eHj4+mj+ +fmphX3H8/P708fXo8H72+u3u8Hb76PtsdX56aGV4cnjwZm/9bmJuc//sfO7id33j7/3i5Xnv ++Wp982tx/X58am5ub/1vb+zraHPr/vb2+evu9fPqfPn3fHlkZX59dPtyb/XqfW1vffr3Zl9z +enj3fP3k7n7p5/Tt7PL3fvPseGRn9+t0cnN+/mZg+vlmdffv9nl79/pu/2586n5rdvPz39zo ++PPyb3hrZm1ma+x+b+f9b+/tb/P0aHX1fHr2ev/r73P25P7+enJvbHd2dWl3+fxyef3x5vvq +6fT9Zmf6+WT07WXv52995/357ffudXNpZ2x0bXvufvPy++3sdX79dvRoYmr+73Bv/n7z73jt +4P558ftna/7v7/t57/P9efvv5u/28vrqe2f763Nvc2l0emdmavb6dW9iXnD47+rf7fvvafbf +dmR9/Hnv+erpe/Z8aHDw9Xb0+vf4cWl68HDxdWbs/nvvdWf+5+3zduLlY2/k9Wjt4eh8ZmF+ +elpf7Oxs9e59bGf+7vj37PV4dPP/bW1+7OTp6+fp+Wt0fGtuZm18Ymt6eXX3/3jv/nv77v5z +99/e+/r38e18a3zo9m/26O79+ejtaF9qZV1cZ3dvbGp2+mZabOvs7/Hh3uns3N377+L3ZGd+ +eHH6++jhf2/i6mpsa2ZoZ2L862976PxeZW16/H7z933v+ffsfmv23+bsfvfrfF9kX2jyePXf +5Ov5+Ormemb49WdoaGBo+292+PTtbmZ5emF87evf7fDk5ezufXF69fXu3+D9/G1pZF9ybl9o +dWVmfnp973ZlcH327ufu7N/t9+98aPTrePrm3+XueHD4bl5mcH5vcvNtZXJ0/u99een1d2pq ++3hv7ej6d+L1cvtv/Ov3aXXn9m7l5m9ybmt4bGnr5+zq7u/1amNx7PllcXZrbm9ufvpv/Or3 +8OT59fF57/H593Fu9/d26/F09Gxg6/12/nj+dGxsamR5ePHs9t7f8fHvcXtnae91eft6+vRt +fu316Ox2+vhvdGttdPz4fWdxfG75cGJiffXq5url7+bm+vrz8H1wa/n+bnt0fXtoduvzb/p8 +d/JtZ35qXGb8cm5x/ODq6N3g+m/x73Fu+Pjz/W5t7u3u6fvyfG1ma3xlX3jpbvv8Z/59ce/k +6Oz9fHv7enN45+996uLs7OpvX2JfX15eY3vs9nd6/GtmdXH+6PDv3Nrf5+TveXN18nFo+/Jo +a+v8be33++n7cvnveWZjY2lkYX3r7nb57HZuevf4c2/w/nz96f5t7/jr6e7x6fFv9XFndG5y +5uf39Or7amh+/Xh/+flra3n0/3br//rq/v7q+WlqZl1bZ/5+f+zd4/Xz7Pbz7Hn/6uvr8Xnx +7X54eWxvfXV2eHl+8/d3fXJzdGllcWxzfXTx7PPo7G/+5epwbuvj73p2/3Jpfvf89HNq8/Z3 +5vZt+O9+ZWNwev3o7Pfr5+v2dGZdZWZn+Pdq8Nzi5+z87Ovy6Hp3eGZtamRmfPTr9O3mcWNv +b2NudPPr+Pzq7/3p7+js8/D98PdnZGRm+/F8eO/p7Pn9bGVrc3hs/3X74fJtePd5be/k6+rs ++Obf8m1//WVr925pbG5oaWBdbnz+7e/q5f5x92to+O7o4uXj6d/b6fDvfX19a2l7a15lb2xh +a/B9fe7tdmd1/W5faPHz8vH66/dvcvjvfWps//p+73pv9u3w7Ofp3uHo6ubqZWZlYGVn/PJx +bX5vbOj3aHF3b2v9eGl5+X5sYnDv8u/s4ePr5+r+dnZz7+vqfPT/cHp0b2poYV5iaWhu9+rq +6enq4uju9u/z/Xx8/n148/hventmYmRkZ2xqeeZzZufg6ebh9e7ydm9s//d8df3n5fX+/XJu +dmhlZWd0cG5ufvl77+717PDy5eTp6fDv93BydW1y7+9+fnBnYF9ne3JfZ2Rpd3Z+7efq6d7h +5+318vTr7/Bwa3FxbXT07XtmevZqZHj/evbv6e96fu/8//zz6/D5fG94bHb7a213a2ZtaGVt +cf/v8u3k3+v99O3zdu/x+u7u9fP9cvp2dPV8d3Jqb2ldZHh7+//v4OHm4utqaW1wbG39+nb+ +6+j7ffF0b3v7cvl8a/16bHF0dXr88+ji6O/x7X968/Pr73tvcm5ubG7+b2Nxc2prdOzu/fnu +6+3x7fJxbv99fn9qcO/1/n18+ndtef1ydvZ3cXdvfu9+eO/m7Obl4up+cHr1fG5sbnZ6+ezx +e25qaWReX/nrdHR5+Onw7uvv7vP/+HRvcnh4fH5+8vb7e+3qdnRyZml3fPr1/39/7+nu6vPw +7v9ucGxofvn3fXFucWlmcXt6ePTv+Pn9+Onk6uzs+XJvbnh7fPd9dX3/e/Hw9XxucXF4aG18 +fPHv/nBucHzu5/N2c3Vtcf97e/rt83R59fPt8vTx+3x6/nFtdv3x+fjy+npwefp/fnh2Z2h7 +cmRmef73ff706uv16+vx7ery7+3y+3d+e3d++/j6/X5ucW9pb3JkYm5vb3f//H/88fPw8PHm +6fzv8Pj18f5saXjvfnJud3J8fHJ6fvX/9+707+v7bnV7c3N9+fF9b3NweP369/766e15/fT3 ++PN4a3BsbXVy//jt9G1xend59/Z8+/n6/vzw7u/9fv75e/Tv/3p//mpkcWtmbXN3/f50b/nv +8Ovr7e/x+vTu/Pb1eXdz/359+/p5/u54a3p2evzv9fbwfnt9/P7v8O91aXx7c3fz/Hp2d3Fu +dXX3+/36a2tteHFrc/Tz+H7z7ezv5+Xt7O7q8vXz+fNzeXz6dWtua21rbPxiX2dla295+vp3 ++O3f5uzk5vp47fHu9fHyeP/xfn3t73n8fm1yal5kXm5yde9+am919nRpd/j9ef3x9+vv5OP6 +feft4+n35en8/ex2dOjp+W1qdWxrZ3vyb15ibmJm7+9tav7r/nd58G1xbP14bOPn6+Pg7Nfk +buXs7/Z6ZGZtd3n+Zf9/ZvHo8Hrs5vx2WOv/Ymfu8vhkfn/5dmr7bm79bW/vY23p9nTe3OHs +4vT8b2z4d3Vu32hl++ls7uf3/HZ0bm1vdHpuZV/0Z2lv9vj5+fTa+v7l5udv6unjev19am9s +e+vr62v96Gt1cPZoZGxadHVx9OXl6uJobutmdf1ybGV3Znn74eTr7/HoffHjbX53Z/VxYmp3 +5Hvhb9znavPmeXBw9e1uanhxY3P57O9sbPx2f2tscG9ofvVydfR9d+bb7HX67Xz6+fXc7XPt +8/b37HZ2fmdj/vJoWXxzX2f9935v9+9883Xn7H589Hfr531s5HRr5X//ZXlq+Xtm4v91ZV99 +6Xd58uTpcuvz/fDua/zm9vh67/FlW3llc/Jy9fFpf21uem14/+r+8/Z76et+8fT39Xn0/nV+ +5nVkeWRk9nJmb2Nw7vj56O759uvv7+f17Xjve2Pv/mb25uxkeOz4Yn3lbW/6evT4Y2FscXb5 +/3bxa2ps79/19OXpZH59aXtv9vxv7+9u+uJn+97n73z+6/Zmd/X+b29y/ml27XPz9H17XnVu +b3ts7fT93evv/uvtcXj07HRf7fJobW14ZWxfbHnp8Hf7aWF39m1t8uHk4eDr5/Xq5fz94+n4 +629nbW5dYHVvXHZqbm12bu599eT84OXt9mfsbW354G/65Hz+6evzbnNv+WhoWmx0bvxue3h1 +cv3t7+jo/uX7auh7fW52ambp6eVfdH52cmNg7e5uY9f27N7v2/3v9+zsaet1/W9p/Xll/mNc +ZOp7ZfHs/HP3bOxxYXrs8Xrp3e9s/v99aO3rbf3y8XT5e2v7fm30fXBtcfrzbmvl7/tsevtt +7uFxdl9gYnFr8+/n6dvi3u7z9XTm/fH7+PdraOnha19vaGRuXnVsY2Zi/G5w5fVmd+Nv5t5g +8fjw9t/k6+Tl9Hx2/Gj/dGFtYujsaOrrd+/7bm5ubf1pa/R6+uD5eXR7499fW+hoXnfj19h+ +X/f9YmXo0d9obu1yUmV+aHVgamjp+vXb5vTya29laGXn6N57cebi8uLXd3T+YGxxa2jd4fLy +429i3PtSYV1o+99eXdPfT+bP8WRxXlfke27r3e9n6/RZX3NOW9Ro3MvOzvFh22dOTk/Xz2JZ +0spbU3vT2extcv5fYlVn3d91WPbpbGZn6tpcXuzd9lht+2pobO3p6ev678/LzMvFys3W09t4 +WUM3NTo2LzI9QUFL5MW5t7GtrK+ztbq9wcTBxMjlRzMoKyoeHiYtMThKtKSnqaSmqrxLRE43 +LjRE1sfFrJ+foqKnujseGhoSDxYdLEjYpJWWmZmcpcEtKCojICg6v7CrnJWUmKW9WxsNDg0L +Dxgrrp6XjIqOkp/JLxkPEhUbLWapmZeTj5CVneQlGAsICQkOIDyok42KiY6Xpy4WDgwOFCDO +n5aSkpGTmaO5XCUSDQ0ODhQovKKbko2OmKm5OBcODxcdKruZkZaampyr0dPOUiMYHR0XFx88 +wbysmpacpbO5PxcUHyMkRqaWmaikn7RXbrm2yTknKiAWFx8tQtyumpieoqq5OxkWICQlUaOY +m6mpqMs/0ay0wcg+LB8ZGBwiL+avoJubn6u/RB8XHSgsRKqcnKevrrpkzqmtv7lAKB0WGBwf +L8WpnZqbnKjKRB8XHCEoQbKfnaasrbrJwK2stKxHISAZFhkeNLyzo5mbn6vI4yUWHCUrOMGf +mqezrrTM4K2kvNdSLyEWGSAjLFOwn56jnqG4WCgcHyAkNr+koKiqqrXLz6+nwsPMLB8aGh4d +Jlm1qKCenJ+1zzgeHSAlL1+toaOqq6+90LyqttHLNSggGh0fJDncs6Sgn5+qt1okHyQiKDu8 +p6itqqy5yr2qtMizWzEkHCAdGypBx6ypnpqirbc8KSQfJy0+vK6tra+vtb+vqrSuuT4xIR0d +GR0sPM+1qZ2dpam0Ty8oJigrOe3Au7iwra+tp6WnqrlNLh8cGRcbJDNuvKicnKClrMBMLykp +KSw4UNzEtrKvrauqrq6w7D8xKiYhIS02PGTIta60tbfFbD42ODY4P03vyMS/uLavrK2rrbbF +XEU4Li0tLjQ3PU5s5XxYZU4/PDlGbvzMurSzt7u0s7WxsbC0yPRmQjQuLC4vLzQ/VfpXTVpM +Pzs/XtbMvrWztLq9ubq3s7aysLvQdFM+LyotLy4uNEJPQz5CR0hHT9m+ubq7uLe+ysO6ub25 +sK+zv8/ZUzkwLzEzMC8zNzo2Nj5KXuPJura7w8bEzXv3yL69urStrLC7w8xqQDYxMjItKywu +MDA2TdjKwby2utHv3tx1YtbAureyraytr7jEzPVGNzEyLSclKCwvM0Phxb69vr7F7lhm6et1 +1b21srCsqqyxuL3Jb0Y6MS0qJSMoLTM5S8/CwsjKxs9qXe3P1NnIvLe3ta+tra+yt7zKWzwv +KygjIicsMThE5s3Ozc3Mzetr48/O0Mm9urm2sK2srK6yucZnOi0qKSYkKC00O0Bc1tXq5dPQ +3vzmzMrU0cS5t7mxrKurrrO6y1Q7LisqJyYqLzc7P1X073Z16N7j7t3OzNLUw7m0sa6pqKmr +sMbbdjYnKSsnIiUwQDk5er7UU9+8yE9U1NNMScm3urSnn6Gmoai/RTQwIRodJiQkLta7z7yo +rsd0z900LT4+NzvfubqxoZ2foJ2dr1U8LR8XFx8eHSpyvr6zoqa4vLz2NCw3Mys458/KsKOf +n52bnqe7XiwhHBgaHh8oNt21s6ynrbbLXEUtKzQvM0rdv7msoZ6dnJ6eqtY7KiIZFx0eHSpL +xbqvpam3t8ZMOS8vMS07VHXCsaqjnpydnp+u0TMpIhcYHxwfMVrIvKulsriy4Uc/MjAvNEVE +8rmzrKKenp+dpLnlNSceGBweGyY8Scyzq62zsbxtXUcxNTo2PWrQw7Goo5+enaCpsO4wKh8Z +HR4dJjZI37uvs7W2wd9hRjk7PTpAY+LIsqymoJ+en6iv3DgtHxwfHR0pMTdjv7u7sbbFyN5G +PEI/OEZpW8uwrqifnp+fo6/LQy8hHR8cHCYtLk/Izr2vuca8zE9KTj85TFlMy7W1qaCgoaCi +rLnpNiwgHyAdHyoqNPfvzre5xMDFd09ZTEBTYVzKvLitpqWjoqSqr7tINywgIiEeIyoqOFdP +7sDA0MTEW3/STlzVbebBvLmtqKmloqmqrsVbPy0kJCMeISwqLkpJSM7A38u85efD6l7K0/W/ +t7uvqaqopamtsL1vPTEoJCUjISgsLDNDQ0/P1d7BxObLxfPZwcvEtrSwq6mrqaqwtLzmTTwv +KyknJSUnKiwyOkBJ/c3Rx77IycDGx7u5ubGusK2ssLGyu8XH1k8+OC8rKiYjJSgpLTQ8Se/L +xr+7vLu5urq2s7W0tLe3tLm+vb/FxMniUkI4MSwnIyIjJiovOkVtzcS+uraztLOysbGxtrm6 +vsDAxMnFwcXGyeRJOzIrJyMiIiYpLjdBYM6+uLWzsK+wsrO0uLq+xszOzMvIw8C/v8bN5Ug1 +Ly0oJCQkJiovN0Vpybuzrq6trK6ytbrAyNHl7ObVzMnHw7/Ax8zWYT8yLSkmJCQnKi46S+G/ +s66rqqytsLi/xtXta19bZefbzcTBvr3ByMzfTzoxLCglJCYqLjtQ2b+1r62rrrCzvMjR3nJo +YVdabO7by8TBvbu+wMLWTzoxLSonJigsMT5V5Ma6tbCxtLa3vcfO1un7fmBd6dLHvry9vb3B +x87+RTkzLispKSsvNkBNdc/Bure5u7m7w8rN2eLb3+fXzMnDwMLAwMXJydHzTT45My4rLC0v +NT5GVN7Jv7u8vru+yczK09nT1+LYzcrCvby9vL7AwMTeTkE6MiwqKSotMTk9TurNwb2+wL3A +zM/Nz9XNztXNxMG/u7q6ubq8vsfjUkA5MSwpKSorLjU6Q1/ZycC/wr29xMTBxMnHys7LxMC9 +uru7urvBxMv4TEA6MSwpKSkrLjU7Q1vYyMG/v729w8O+wcTEx8vIv728urm6vcPGytduRzs1 +LyspKSorLjQ6QlrcycC9vLm6vby7vr++wcbCvr/Avby+wMTJztZpRDs1LyspKSkrLjI4Qljf +x728u7i4u7q4u72+wcTDwMDAvr2/wsXIztxdQjkzLiopKCkqLTA2P1bbv7e1tbS2urq4ur7A +w8fHxcTBvr6/wMLH0/5NPTYxLSopKSkrLTI5R/PJvLa0tra3ubm5u77Cx83NysTBv729v8PI +2WRJODc0JygtKigsLi81Qvu7r6ytsbS7v76/wsrU6uTOvrOtqKeoq7LcNiMZFRQVGSM6zK+n +oqKjpamuvFkuIx8jLVK6rainqq+xr6yrrK+5yv4+KyIaFRQWGylXsKKdnZ+mq6+52zwpHx0k +M86spKKnsL/Oxraura60v9hNOSsfGRYVGSM/sJ+dnqOstb3F004vIx8lOMWmnp+ovmFRcMGx +ra63wsnbSjEiGBISFiFTqpyYmp+ruMfRaDkmHRwlQq+dmp2q2z08X7qsqq67z/lbRy8fFxEQ +FifAnZWUmaO01/heRi8fGhsm8aOZl56xTzlDyq6oqrTeSktQQi0fFg8QGC+rmJGTm6rPTk1Y +QSoeGh0su52XmKHAPzhOvKuprslLRUpdSi0dEw8RHFCgk5CVn7lPQEhLOiccGR44rJmTl6PL +OTZYuKurt/E+PFBoSS8eFA8SHnCek5GXpMZCOkFHNiYdHCJOppeTmKbVOjpoua2vwEo4N0bl +WzMfFREUH+uek5KYpc08NTo8MCQdHinjo5iVmqnNQz/xvLK0xV5IRFNfPyscFRMXJsyflpWa +p79RQD0yJx4cHzK3nZaWna56RlDLtbG+UzcxPGjQXC8eFRMXJsCelpWbqcdYTkQ4KR8dITi3 +npeYn7PdVm2/trrORTg1PmFONiYaFBQcNq6blpedq73ZVDwtIh0fKuGmmpidqsD86L+wssFF +LigqNkU/MyMZFhkl16GXlZmktdtIPTYtJyYrRbejnZ6lr7/Gvra2x0swKScuPz4yJRoWGB9H +p5iUlp2ty0g8OjMtKyw36q+kn6Gor7i5uLrISzUtKi06Oi0jGxcZIDutm5eYnqzKTENKTkpC +OjpI1rWrp6aprrS7y189MS4yPU1NLyAZFBcfN6+dmZqgsMvjzLm0utk9Li462rGnpamwwedO +RUNIWmNbSywfGhUVHCn2qqCen6eqq6qlpq2/QisnKTjRr6inrcBrQT9NV0UzJxwYGBoiOM2s +op+fnp+foaaruv06LSsrLjdH5L64t7vXRjEnIyEgJy5BybOrpqanqq+3u8nO1W3+ZFxfVV5W +SkY6NDExNz1Lb29lZGZ92cS8trm/ydXKzcPR3XZYdF7z1MjP83NOSElEREhCOzw+QmTYzby+ +wMPZV1Jt717xx8xPaN1iVVN9997Hw7u4vMLLz0w+Pjo2Njk7Su/IwsvC20dLPkNQUnbZ4NDE +yMO/wsPGxsPEwcrL3XdXSj02MS0xOjtR1tm/sbx2ctdSPET63NvNzcC9ytHLxs/h1cvY5d1h +UVRHPj08ODY5PUd0y7+1tsPP3FtJTWzaz8rHx8vQ2djc7etuYltQU15eX19PRD46Oj5M7s3E +vr7DzeN+4dvi1M7Kztnd7mpu8vhoU1FNRkFFbGpY7WJNTEdGTvTPyMC/xMrLztXQztTk82pi +Z2Bt5eFzWE9OS0VLUFhhZWhwZk9NTlNf/9jHwsjGxsnIzM/X4u5kU23va2Rlal5YU05MT05V +W1xy6m1kYFdaZPLe1szKztHW2NbY1tvY8O/ma2L2+l9ZSkZCQFnbWj7jydPS1cvO1uhuYWZk +7vNyb2jh1cvU19xnYlpYTEtPWFBOWHLf2ODi1dLh9Ovf6PRjbm9oeOnY0+7r197peuxoalpU +Tk5V/eB1cXr87O3s5ej89W1v8+zf39zvcWb2/mxsZG9u5t304XhpXFh1a/b9Zm9cYmV+a2jm +2efs9uns3Nnbz9z2WvpmbWNj9t3g8+v1a3JuTlhfWFVoYXJ0W97c8vLW9uzact3a4+njX2jn +Y/r3cfznd+XaZ17nYU5lZVhXXlzl7P7Z1e/b4uXv4eHj1/jv3+nzW1l2Z11bW3By/m369WVo +WF1ZUFpu63bZ59PR19/c0drb2dja2PRx6V9YWlhSU1JWWF5ea1VS4dftbef+4+Tk79v3+/LW +2fXX0Njc5tzuXl1YWU9VWlNdVmVoaW1443rZ9eXh6mjl2F/k7N776uf+8Wfd93ZV1t1i8vvl +XGJff1RS8eBnb9Vr9m30bmpZ69dgZtXZX3Ll62Vk/+t6XubjenPrcGdganlxavTafHrh6Wzs +33LubX3ic/z7a2jtfWhy9mZv6u3f7evxcnztZ17yaV9tZV9caWx+Y+/Z6t/Y7HzjbXjpc23d +Znze9O/o53/Z7/H0dmJoaVtdX3BbXmxqWGvaZOPp6+7n6uPbddbg/d7maX3oYfvufvBgU11Y +TFFSUGFdZuXu9dDQ1sXJx8HExcfJy8jbZldHOzQ2MS8xNjk8R1nfzr+5trSxtLe3vMLHx8/V +0MnNzt1OWD4uMzMoKzAuMjtGVGvJuL22rrO0sre9wcbF0MvCy8nAwsnOVEw5Ky0sIyYsKy88 +SF7pv7W0rqqur662vcbM1PHaz93SwsTFyWRVOy0vLCQoLSswOkNa88W4urOssLCutr3Bytrl +2MvMyr+/v8LTZUg2Ly4pJikqKzM8QVjUyb22srGvr7W7wcnY287NyL27uri4u8r6VDktLSkj +JykoLjo+TNrIwbqzsra1tb7Fw8na08fDwLezt7a0vNVpRjYsKyklJCktLzdJZ+3LvLm6ubm9 +wcbJy87PycO8uLazsrW3usfmSzw3LyspKCkrLTM6QFb738/JxcPCxcTEwsC/vLq3tbO0tbe5 +ur3Cz2FEOzMtKygmJigrLjZBUXbUx8G9urq6ube3t7i4uLi4ubm6vLy+xtLqWEM6My0pJyYl +JyotMz1P7su/u7aysrOysbO0t7q8vb/AwsXHyMjK1eFrRzw1LisoJycnKi40PlLgxLu4tLGw +srO0trq7vcXIyc7PztDPysnN0+NYQzs1LispKSkrLjU+Ut/Jvba0sa+vsrW3u8DIzuN67O9y +++ji2NDQ2ONtUEE7NS8tLS0tMjlBUd7Fu7Ovr6+wtbvByt34fF9ZX2pq/uHV0s3IzM/ReExB +OTAuLi0tMzpCWdLDvLWytbe3vcrR1+xqfW5ebfLz59HMycTAxMvO7k5CPDUwMDExMzpASV/Z +zMS8uru7vcPJzdTf5+33eu3m5NrSzMjGxMPGyttbTEI6NTMxMDI2OD1O9tbHv76+v8HIzc/V +2dve6OXX1s/KxsO/vb2/xtDc2ng2LTMyLC0wNDpATG/XzcbAwMPHx8jK19rU19jZzcbDvru3 +s7W5u8DnST41KykoJycrLjM/W+LIubW1srO3vcPJ2O7wd19v4NjLwL67tbO3ub3NY1A7Kyoq +IyIoKCg0RUzOtrWxq6uurrW/v8/561hRaF9i1svIuba6uLW/4HVMLyssIyEmJiYvO0TjvrWv +rKmrrq62vcHa9m1QVVVQaOvcxr69ubq9yfNtPS4xKiImJyUrMzxPzrqxrqqprKyuubrD6m9U +S0pMVWF02MbAu7m6vc/gUzUzLiUlKCYoLzdAesO3sayorK2stry91f5gTEtKS1dm3sjFvbi6 +vMTU6T80MiklJyYmLDI7Us27s66pqq2ssby9zXRiTkhISU9c98zBvri3ubvJ3GU6My8oJigm +KC42RXfFtLGtqa2urrm+w+VnTkVKREZbaufGv7y2t7m+0/1LNzItJycoKCwyPFLbvbGxrauu +rrG7v9P2XUlJS0RPcfXOwLu6ube/z9JbOzMvKSYoKCkuOUZax7SzrqqtsK+2vsvgb01KUUZL +7+fWv726t7m8yOhePjMxKyYoKCovN0Nty7ixsK2sr7K2vc7ufFRIVllNZ9rayL68vLu+z2tb +PzEwLigqLCwwOUj5z7yzsq+tsLW1usnT2l5NXF9OXd3j28fBxsnJ2llSRDY0NC0tLzA2Pkdg +2Mu8trizsbe5usTM0u50b3tz+uPa2dnR2vX5bldMSj88Pjs4Ojk7QUhPa+LVx8LBvL3Avb/J +ysjS08/U2t3h7Pl0cXdwb2NZU1BLSUdBPz49Pz9BSE9aftrQy8PBwL+/wsTEyc3O0tvb3OXh +4+76em95a19fT0hHRD49Pjw8QEVIU3nk18vFw7+/vr7FyMfL1tfU6vTyeWVp+eXo4uLteG5l +TktFPTs8Ozs9QEhX+tjMx8O/vb6/vsbMytXx3/Fdef5s3Nno0dDT1Nrh/FRIQzo0NTUzNjw/ +SW3QyL+6uLi5urrAzM7cZmZfUFz9bubP0M7DxcrN23BYPzg0Li0vLzI7QU/ezcG3trSyt7m6 +xMrL+2Z8W1p09ujdz8bKx7/O2uJKOzkxLCwtLS81P0pfy767tK+xs7G2vr/F5Wn+YVN15Xzb +ycjKxcTWcVxGOTQxLCosLi42RU7wv7q5sa6xsrC1v8LJ5+/sXFd97u3XzszOys32b1M8ODUt +LCwtLzQ8SmTRvrqzr7Gysri9wM3b5PRrYXHn38/Fx8vEx/hlWTs0NC0qKywsMTtJY827uLOt +rrOys73Cxdb7/XJdZOnd3MrFzsvI7F5jPjMxLSkqLC0uOUdT0rq3s62trrGwtsLEzmlfYFVX +deHgz8PExMHMfFpJODAuKygpKy0yQFjiv7a1r6yur7W5vc/c709PVlJo3tHJwbq8v7zC7V1B +Mi0qKCcnKiw0RmDOuLCuq6uur7W9yelgUUdJTUxh28zCvLW1t7a/32M/LywoJCMlKSwzSvHF +saysqaitsbbD2WhMQzw+Q0VY38q9trCxsLC9ze0/LiomIiEkJys0TNy9rqqopqeqsbjHWEo/ +NjY5Oj5O4ca5sK6ura61weFGNSkkIx8gJSkvQ9u8rqikpaaor7zJWD45MzI1Nz1M8cS3r6yq +qqyvtc5MOi0jIB8eHyYsN1e/r6qkoqSnq7TIaEE0Ly0uMjtL68O2rquoqKmssLrbPy8qIB0e +Hh8mLj/YuaumpKKiqbC/XkEzKy4uLDhJWMSxraqnpqerrbDKej8qJyAcHh8fKDRDxrKrpKSl +pau3zEY1MSoqMjM6dsu8rqyop6mqrLS/x2Q2KigjHB4jIyg4a8KyqqKip6isv2o/Mi4rKjM+ +Qeu9t6+qqamrrq64y9B+NysqJh4eIykrNGe8s6ylo6itsLt0OjMwLSwzSFjmvbGvrq2trbG2 +ucLM2UUvKygjHyEnKzBC1LWsqaalqrG710EyLi8wMT56z8K2sK+ur7Gztru+xdluRC4oJiIg +IicuOk7NtKupp6iss773Pjc2NTM6S3HRxLu2tLO1tbS2ub/Lzd9CLykmJSMiJi46Tc+2ramn +qKyxu9RMOzk4NzpBTnDTyL65uLi4uLq9v8PL12M+MS0qKSkqLTM9WM+8s6+vrq+0vMnrUEVB +OzpAQkJKX+7Uxb+6tLOzs7O3vcn2RzkxLSsqKywuNT9Z3Mi8uLWztrzByd9dUExHR0tOWO3Q +xry3tLKytLq/zWhDODQuLCwsLjI6Qk/yzMO9uLi6vMDI2XFcT0xQV2D52s/Iv727ubq9wsjQ +a0pAOjUyMC8wNDlAS1/hzMK+vb29wMvbfV1ZWWBo79bOx8C9u7q6vL/Izt5bRD48NjEyMzEz +OD1AS2jdzcK9vb6+ws/g731z+ufXzsrGxb++v8HCydPe8ltKQz88OTY0MzQ3O0BKWu7QxL6+ +wMPGytDe397q5dzb1cvIx8TAwsnN097f4WVPTEY+OTY0MTM3Oj9MXurKvr29vsPFyNDd5+fw +9+rj3dLNzMnFxsfEw8bLzt9dTUU8NTIwLi8zOD1IXuHLwL28vL7Cx83X6Pd2dPXs69zT0MvF +wr++vb/AxdNtTkM8NC8uLS4yNjxEUubMwr28vL3ByNHf7PR3d3X47d7PzcfCv729vb/DyM7x +VkY+ODEuLS0vMzg+Smrayr+9vr+/wsbN1dzl8uzg2c/MysbBv7++vb67vtVPRT82LioqKywu +N0BRfcu8trO2u8HGzO5aV1ZVWmbu08bEvba3uLW2urzH+Eg4LSooJiYpLTVE7L+0rq2srbG6 +0k0+PDgxOEROadPDurKws7Cws7i7wMzZaDwtKikkHyMpLjVHyrGrq6ilqLO910IzMC4tND1A +WMi6ta6sraytsrS3vs5rUDsnIygiHSEtMDVvt6yopqSiqbvI4zYrLSwoLkBHb7+2r6usq6ms +trW2xd/mVi0kKyYcHissKkK/saunpKGms7vAPSouLygqPUtO0Lmwra6rqKuysrK+0NdXLyYp +Jh0dJyopOMu2r6qkoaevtbxNLS82Kik5XVLkt62urqqorLKzsr/p69w7IiUsHRklLykwzLOu +qaWho6+/vHQpKjkqJTrvV9a0rausrKiqtrevvVvf7CwjLSYbHiwqK0bGtKyqpaCpuri/OCkv +LygrP2X7yK+pq66qqa+3t7rKaVhMLCIpJRwfLi0xbbqtp6elo6zBzP4vJiwuKjBP5s67sKqp +raypr7m5vOVT4DsfJS8dGis3L0bBr6WmqqSlumHvQCclLC4vOnHCurqxq66yrq+5ubrE3/JZ +LiMnJR4fKzhH2LeooKSoqa7KRTkuKCktM0LtyruytLSxtbi4ubq4vse/4y8kJSMdHSYzTNe6 +qJ6hqaqvzD4uKSgsMDpiwbq4srK3uru+vb29t7W+zcxGJB4iHhshL0q9rqifnaWuvWk8LiQi +LUhO77atrrO9x7/A2trJvK+uvMi6YiAaHx0bHyxVrqWln52jrss8LiwlIStPx7uxrK2ywujp +2uDYxbuup6vBUjwkGRkaHSc7166gnp6hrcNWNCkmKCw9xrCura2zv/VGSmnjzryyqqesvW8w +HBcZGh4sS7qlnp+fpLToQC4nJis1Z7mxraywvtlLPkpf58e1rKilrMhEJhgWGRojONmtn52f +oqzCSzIsKSsyRMWuq62xvc9rQztBWsu5sKqlp7VcMB4WFxkeLEq6p5+en6e46z0vLCstOuCy +q6quucbpTD4/TW3JuK2opqvEQCsaFRgbJTv5s6Sgn6Grvk4wLCwtN0jMr6qprsPxU0dHT13p +xLWrpKOs5TAfGBcZHSk50q2jnp6krshALywqLDdkuK2nqbO+ekxLSE1Y6cGxqaSnukQqGxcZ +GyQ0SL6rpJ6fqLLiNSwqKzI95ritqKy3xm1cXVZmed/ItKqlp7lHJRkYGh0nM0fIrqKcnKKv +7TIpJycsOGG8rKmqrbzP61ZUUU15ybisqa6/PCIcGRofJzjovKuhnp2frdg2JyMjKTr2vK6s +qquyu8djRkRJ+Mi7r662zzwnHRoaHiY09LeqoZ6eoavFPCggICYyc7quqaiprbK72E0+PUrn +vrOxvV01Jh4eHiApMUy7q6GdnZ+qv0IrIyElL0/AsaupqaywuMhiR0NHX8m8vc1MMSUfHx8l +LDZku62jnp6gqbxKLickJiw6fL2vqqiqrrS9z31kWmHa0NjmTTUqIyAhJSozR9G0qqShoqat +vmI8MC0uMTxUzru0tLi+zNXb3t7XzczMzuJgRTkwLSsrLjY/Ut7Hvbm4ubzAxsvQ0dPY1tre ++1JHPzw9R2vOvbe0tLe6wtVpRzw4Nzc6PkZNT09NTE1SXP/r2czKxsTEydDmWEpIS1vgyb67 +uLi5vMHNe01DP0JIT1pfW1FIPzo5Oz1BSVzlzcXBvr/J22ZNR0pc3si+u7u6u7/G03VPRUFI +XN7Nx8vXbEpBPDo4ODo/Sl/j0s3P3WxUTUxSatjGvbq4uLm8wcvdYk1GRk5p2MvKy9X9XlFN +SkQ/PD1CSlFZXFVNSElOWHvVycC8urm6vL/K311MR0VLXOvTysfKzNLb3uh1XFBLSUtOTkpF +Pz4+P0ZOXfXbz8rEwcHGztz9aVxebuzZ0M3Lys/W1M/O0Nfj721pZVtUTkdBPT0/QEhOV19k +afzh3Nrb4+js5+Ha0s7Mzs/R0dDPzs7Oz9Pc4+r5bmNbU1BPTUxLS0tJR0hJSktPWWH539XQ +z9HW2NrZ2dbVz8vLzMzN0drj7G9pa2lrcfjq5exvXVFNR0I/P0BESlFebe/e3d7c29/d2NXT +zsvl173N287P8mBg0NLm1svO1t73ZU9IQj8+Ojg6PUFHVmB61c/Vy8jIwr29vsPS5flmWFxe +auvf08nBvbq4vdBgQjAqKCcoKy02T8y7rqmoqKqzy2dJOjU1MzpLbNW/uLOtrLG3ub3BzmJO +PjAkHR0fJis4W72qoqCjqK+82jonJCo0T9C/r6eor7jDy8niXNzIxru+YEAuHxwdHSArR76o +n5+hpbDsOSwkJCw8x66opKStvu1EQkpMWMauqqusuOk+HxIUGBon/LqlmZqgpr83LyofJDNN +sKKkpqi6VT0uL1LbzrSqp6Souug0IBgSFR0pWa2jnpugsdI6LS4tKznSt6yqr7i+YDo6QFnK +v7+upqq0v9FKKx4bGR0sOtirpqakrdlPPzU1My5HvLe0rrK5wko2P1V+zb+2qqizyN5CNzgl +HB4pOFDFtqmlq8dUQ0BFPjM6vrS8vrq8veg1PF3WycLEubLH9WZMPEpcNykiLEJDTcWwq6vA +XWPaakU3PL+3y9K8vMByOEDq0/Xl1b62yX/MxXBNS0cuHSNASE68tLGquUhJfkVCRkbCssDO +vMTTZj0++c/pzMfHvsDPzcbPekhLLRcdPEZRt7CupLU8OEs+R2n7uKy23d5cVltJSti8xcnL +zsrBwMfS5dVIOjcbFzD2VLqqtK2tTS5GVUN+yb+1s+pFU3x83MrQw8dkSF7Nwbu7v8K/Yz07 +GxEmfl28p6+sp2wrOk1B7sXFu7DNQFPQy8bBfWnlSz5Pzruur7u+w0s4PxwOHm3rvKSrrKTc +KS9GPtu6w7+tvUBMz8nLvv5MYExEW8a3rq6/1cj6OTUcDRrMwsunoaWjySQlP0Z6vLqzqbhA +T7u1xOVAOUZBQOKxrrS8xN5EStO+KgkL0KlMrpyfn7ccFjC7uq+npaOvLibLq7xwR0JKPTRj +rqasyz5AWDQuy7AjDx/hTlSvqKasMB9VsNnEqqytsUM3uq/nZd9SWVk3Pbux22vP2FhP91Ms +HiAtODpJuKiy5khKz7y8uLG4vr3K2MbD4HFqRTw9Xbu9YEXdxEk85s1JKiIpO0Y+97W62eJ+ +6rm0vLe62ebOxreutWw4OD81L/TBzsTNPnW2VTIyLSssO8u2vn5TVmDYvrOvs8diVEhpu7G0 +wtFRPDo9SUZXyOBexsHSSTY3MjE/XXVi+tDPbVbHuLzL7cq+119dyLa81VBYflRFR0Y7Ql1p +2b27vM1DMz1MTkjs0NzQUUNd2+Pb0d/W5V7639TD11hYwsPc50NeUDxAPMSxvcxbXVpJT+zG +zOjfSlNMSmRQ19xe2/FVTWDebtPUSfLKxNhFQEFOXlXEtr/S1+pGPVjJxdHVzsxfQkv1zdxV +W09Valxq3OLh7mx9ZVxbUVRKSFvay8i+yNVnREZZ3t3Pwc9lZV1fXnB4eNTpXF9q9PxzaurV +319ZWmdjVVvv1d/ezMzfV1JVVGbYx8xtWltoXEtZ3tx3WvjV3/753HdXZXX68V1efO1raOXj +3t/Z2v19dO/c5+XdelZMWGxdbuvZ2/149+PnfXlzXV1u6f5tZl1wbmV84s7abl913+5ebH3m +ZFR27nNn6tnpb+v5dfdx3M/aa1tt3tbgfW5oYWdaZN/yWF7oXFzb7F5e6910ZnVp4dT25NTb +ZHPr6lVR/+BlYdzX8Flc/WhaaO/p9HFgWV9weO7m2tra2NvqcujjeWX25/ff4UhF0s1OTNbK +Xj9Wz1tEeszlXXrycGxh28nYfc/M515rclxVXnJsZmR6887GclPZ105Me959Wlvd5GFn9eFy +etzwe3Za6tz6eN/f/ltv/l1e59jiXlPoy+BDTc/xR2fjzd9a7tLoYlhu32dd9N96cuDg5/jv +5Ox7/N5rVXzuX2ZscXni+2jf5F1x23Rc69x6XnHocVZg09xOXtDmUVzW1uR56t5uUFRfcm9f +79Pf7+HY7Ghu83R48fv1/nBp9/Lo4nvq3d56ZuvX81Ro7GFPUVxrUEpm7m9yfm/nc1Ff2n5Z +2MrS3tTT1dLg4M/S5tvQ2NvU2OhzYHzg295iPjI0OzQzRFtPT1BZzcbjzLu+xcXJz8rGyMnM +z83N2tbU7GhuY0tIT0tGYeFbSkVGSkxIR0lHS1ZlYPbc2dPOy8rHy9TTzsfHz9rd29zn/uvd +3dXW5OXf9mFm/+tTPj9MPzU4PDxATU9Z7Ojp0MnMycLGycbExcjS5N7b3NjZ3NfW2tza3/xu +fPHz9mZHP0Q9NTY7OTtHTVX97e3PxsnFwMTGxsfKytPo5uDe2Nnh29DMzNDa3+R/aHN9ZUk+ +P0E8ODk4OT9LTVns49zPx8TAwMLCxMfFy93s4NzU097c087N0Nrr8HddW2ZfVVBCOzw9Ojg7 +Oz9MV2Lt3tjJw8G/vsDBxMnMztLb5Ofm5OLi29nX2Nje7enn82NdX2BVQzo8Pzg2PT89S2pz +7dfPysLAwMDEx8fLztXi6+He3tPS3N/f39vW4/39cWxfWldaXk5BQEZAPUBCQk1eW17u29PN +ysrGxsnJzdXX2+Pn3uLe1trc2M/O0tvqem9zY15bVFBPTEVERkVDQkhJTlVZYPTf2czGxsbE +x8rL0Nvc4+7p5uDe2uHp49/h7Pp9a11bV1FOTk5SUlRVV11qY2n4/Wdu8vHx6t/k4tzb4ODj +6ebj5u70fWtv4tzZ0tfd5uzv6f5zbVtWWVxXYGFjefNvcef7fersc2tfXWdpY2NrZ2d4f3d4 +7ebr6d3g7t3d6+Th8+vm9/Xt5uzq6ez67u1/amBhdvVnZmdXXGhfXnNoW1pebnp7a3b27+La +3OTl6enf3u91/P5ubPn67+7o6f3s+ujq/vfo+/pnXnJpZWdpa2hja3Nrbm1qdvnm7Xz16vRm +bnZsevru6NzmfOfp5+nl6N/d4/n6fW9pZGNcW15gWVthcnNu/mttePHr3uTs5ufr9N7c4d7i +7vfs+OblcGX19Gd0fWtkZ2lrYl9qX2JveHRpaGJlbXf573xy7urf2ufi2uj/6dzs6+/s7v3u +5Pr372lpfG1faGZ6bFtldGlefnlmaWdlcH9icO/m7env6eHy6Of27Ovo4+Dj6ODednV6bXr2 +bl1iYktQ0N9gZ95faGvx5Gteaed8/3nw9m/8f+br5+vy7Oz2b3199v7t9nN77vdnb+nu+urp +bXD9cG/9e2nuaFpiXlhj4vZ46uDo5/Vw6uDl6OT4/unmferc/k3uzWpb39thdF51+2VUXnFa +Xl9maulnX/X8/Xvr43ru2uJw39ri3nzs2uPm5X5oaOzkZ2X99uvkbGlrU1Ht8VhpeFxV9f5g +av7re/Bo/Gnf3Nra2fH+4nLt4OZv395w4fz4anxW9+JgW+/pUVlqbWJwXG1uYPp54d/2Y+XW +42lja3Pz8n9o83/p3dv98tngbfvsb3fzZlv4fWNn7l5X5Nxv7N9mYHFiXH/x7nxnbH717fp3 +723m09zycuTt9+v8XWpwZV1v/HB1Xmnk2PRoc+vpbWdtbVVa38/f8nd73udndN9+WV1ubWV0 +4N3q9Hvq8XVudO7o8Xp8eHH7emNlfXx47OJ4+N3pcfPqaV5//nJnZnBqZG7o5vdvd3tmXGBn ++Ovp3t7l6enr6Ozt/ffu73F1e3t9cXH34vJsbPR4ZG50ZWv6dnfw+fl77uTn6+rf5OHo/nRp +W1JPSEM/P0ZMXOXPysK/v8HFxszR197j+ODY1czHwb29zUkyKSMgJC06WMe5trWzsK+xt8Vb +PTUzNkFm0sK7uru5trS0trm/zGQ6LCQfHh8mMUzOurCtq6imp66/VTQqJys1StbEw8S+uLGt +q660vs/nUTouJiAeHiMtRs22ramnpqapsNA8KyQkKzzevrq6vby2rqurrrrPYVhcTDkrIBwb +HilBw7GsqqqppqWqukQpIB8mO8m0srnDx7uuqamuvvVMU9XKbjQiGhcZITXbvbevrKafnJ6r +aiofHSU507zBzt3LtamlqK/DaFJpybm8SiMZFhgdKkfe582uoJqYmaDBLiIiJiw5T2b1ybix +r62sr7e9yOBdbce8ZygaFhgeKkTxaF66oJmXmqPCMSUmKiwwPV3Ww7m0s7Csqq/BcEtIWsez +tzobFBkhLD1YSTzWoJaXnam9Qy0sLSgmMOq9vr+6t6+mpK5lODxczr+/xmktHRwlKigoLjtb +sp2Znaiss/s0LCspLUXe2M+6rq2trbHGYV15VkpY5si6uUEeGiMvKiIpQMmtn5+qs62v2jQw +O0BDVHTyyrGssru7vvZGT+TffvPkz7irtSoWGioqHR86v7avp6Soqqiv4T9KZkk2NU3IubzK +1sW2uM9NSWjVysvXzbmuvyAVHzUkGSFtu8Szp6epo6e+3r7COy4/dU1H0bu7u7a+6F3tzczL +3FRdzL2/TyYbIC4pHiFBvb67rampqauyvL/LVT9BTVNryru+ysrK0tnV1M7PUTtF3eQ5KSkz +MScoO97S1cOyrK+4ubKutsfW2lY4Mz1qycHIyMLLblzj1l5ESEU9PDo4ODs9PkzVxcjJyNLb +v7e6xL20utxGPT5FR0ttz8O/x9zYvr5PMzg9MzE/Vt/lYWrPxsjT9eDbX0b6wcLNxr7G2E5B +QkxNRlDUx8S6utJt8GRANTQ9VXFLSsm50l/LwtZdVXfVXUBnxr7F41voz0I3VFlIesnPwbne +5MXhOD9ZOTxi0lrXxNLgvr37fdFvQ15TVF/W2OTlaVFJbnBNR//d62vn1MbG7WZe2/lifvrn +32VV6+Tf2uRmU1dP6G1hf+7eYvT+4FlhVGlWX+vi3Ovu89TV3N/PzNlqTUpYem9fWWrZ2H75 +6WPz3VtNY+1p+dbT315UbGZaYuDnfvzs3dbk2tLZ4HJWTExSXVVa8d7T2t/f4OhuYmR1ZnXp ++Xzl2/plY2dufl5Tb9nv4tHZ5Oj/6uBeUVdRVWD52dbd6efrfG999Ortf3Zub/d+ZWn6fG1v +dnd46/h07eb29G1ZYPrtfWRs5tnb1uLl5eV5amltb2FcZG1qcHl0bnTw6vxqX2FvamR+6ODd +6PDn3tje6uPl5ubt7vfs+nZqYl5aX1xaZGt59PZzZnZubnZ6/X5yZGvp4+Pl6N7Y1dnZ3u7s +6eru+nBfW1dWUlRcX3Dq8Ofd9G7z9P5sbXZ2cGFlb/R7+ujb2d3e5ODe6vVw/ux8bWFbWF9n +ampnbnN66eXs+/j4eGhkev78cnpybP3t497e3t3e5+7reWVma2tpYF9nb/ju+G9qbPz2bHX8 +/e/s7vXt7/96bGZgYGZ09u3x7uPe5erufnJveX3++/D9fPnz7/f5+PHw8/D6amhucfbr6/pu +amhfXV1eYmd9/PL973Fx+PXt3+Lm3uvm7+jo737v8PBu/OXv9+30eGJi9/JeXmxgWGFoZW5i +Y/L3cPbk7+Xy6Oz2+3h46eDl3OTs4vP98+32eu5lffJkZHlmXVRr32Jb+fxu+nNr6nZq4+vd +7Xbh2V1Na+ZV6s/n2cz89Nb4aeBmcnVeUmRUXmb5Wmv/YXT53/ba/NvudmTUeV7t63Ra+mvi +/uNV3d952ePc5d18XlFUbXpLadJGe9Nybc5uU8jV7fNb2dxPTtbdTl5+4N/4T9fLal7x1v5v +SvPOYUv+2WbmWm/F6Exowl9V32nP6E1fv0xT3190z1BJwP5KbdRR6HtW2M5SUczkaF9/8tH4 +a+/c9ujO1c3Y1tLF1N3Y+f1nTTg5MS4zNDRAbs6+urawsr2+v8rP0dTKv8HCvLe2umYxJx8e +ICElO8azqqKgoai58TwtJSElMEbRta6sqaqvtLi8yM7E2EA4Ny4mIyUtPEVsuKqpq7C6yGc+ +NzY6SGbs2sa9xt/veXzaxr66t7a8yd5NNysmJS48Qna5r6+xu9BnSTUyPEdV0L67t7fF/11L +Rktp28O4tbOzuM9LNy0nIiY0SO28srCvuN9LQTo5PEfQurWysrvKez83Oj9K5srAubGxtbrJ +TzIqJyUlLUngv7Ctr7K/YUY/Oz1HVdi5tbvB0mNNQz5CVd7OzMXEzdDR4fzx6mxNPzcyMDZI +7Mq5sbK3v9xYSD8+Rk9hzsLFx8jdUkc9PUVNXuHW0sjDxszLycnNzdH6TzwzLzE7UNjBube7 +xOFKPjw+Sn7Sx7u7yutRPTg8RGLUxLm3vcTO6GNRTVPszcvHyNZROC8sLj7uxry1tb3YSTg1 +O0hn1cS9ur7VU0E+SXvRxby8yuF9T0lLTl/YysTAvb3QSTguKSs3SNq6s7W4wHBHQ0dQ7MvG +v77I31ZCPkZTXFhLXMvJ083Q2c3L3m3kz8jMYUM3LiwzQvW7r66wudFRQz08P0750sbH0O1V +RkVPUkplzc/LwcnTysXMy8fPzsxsPDQvKSw9Ycy2r7K1u/4+Ojk7S3ThxbvByNdLPT47O1TP +yryytrq7xNzuX1Jfdl5JQjorKz9k1ry5wcDFXz8+P0zVwcvKvsfYdEE3O0NN1768uLa8yM3Z +8fns18/U/EMyJh8oO13EtLOzsr5eQjw9V8vI0sK9x8pwPDU4RWzVxL27u77Aw8TI53nn62U/ +NCsfIjRNzLKvsa+09z89OUrGu8fEusjmUzYtMENh1b25t7a8x8nGzNvg3dXIzEEsIB0nPVzE +r6yrrL5CMzE4VsrJxba4wdk8LDFBQ1PMvrSts766ucPPZ07tybzKMiEdHik7T8qupqSsyzsx +NkFOX9bCsq+8Wzo+Rz48SeK6sLO3s6+2wmBASf3NaTUlHR4qMkPBraaiqcFLOjM1PEVyvbe3 +sbnMcEAyMjpNxLCtrq6us79lPT5VZEctHh0lLjvpv7Onpa/JTDU4Q0RM7s2yqbHByms+NS4z +5bOurq2trrHBUUE7NjEjGRwqNFq+vrGjpbPROjVXTz9DUNK5tbi4tLfMQzIzS8O4tbCsrLTI +UzM3USoaGR0pTMbIt6ijp6/cQT08MSwuQLyqqKmqrbhzNCwzVcy8tK+qqrTdSkk5IhYTHClK +v7OspKOptno+NTMvLTbYtq2qq62uu99OQ0NGRV7Mu62rrbbCbzAfFxQZIC1YtKWdnaCrv0k3 +LicpOG2/s6+tq663xd78cFNBPETpwLe4tq+y3CsbGBodICtItqOenqKpsLtlNSssOEhV6Me4 +srS5u77F3Ek4NDQ+WWvgwrexssNHNzk4NDI1PmPV19bc6ebxZ2Rx4tHOz9XOyszV2tTT3l5M +TVhx0ci/ubKyusp8STs4NjQ1OT1CS01NVVlVXW1f8c/Lwr/Bv7/I0+B1ZFxdcPXt5dnEu7m6 +vcLN41VAODc7PT9BSU9RTkZBQUNHSFXvyrq1tri6wttcTU1YZG1/3cq+urm7v8nY/VhKRkVG +RkdMTUpJR0VEQD06Oz5L7cS6trOzt73M7VdJRkdNXufNwr29w9Da4OduW1heb/91a2Nsb1dF +PDc0NjpCWdXCvLy+vb7K/U9HRUhMVnXWzMrJzM7S2dzj+ePT1NDNzcvP6VlKPz9BPz9GTldj +bHT/6Ozwc11ZWmV/7uTcy9DTy8/g+G554NnPyMTBv8bU62pWTEhHSk9TU0xIR0ZKS0lNXHB4 +49jV0c/W08/YZ07vxH5jxsfU0dTBvtXb2mZTcmFt4XlZUT89Pzs1OTtAWm3pyMK/ur3GxMDH +ze5cW19QTVJZ+9PNyMLDv8HR1c/R/lpDMSwsKCgrLTl6xLaqp6Slq7LDTz86Ly40PFbZ3cm4 +tLOyuLeyu8rYTkJDLyEgIiMnKi5VubCppaShpLC/aDYvLSksO0rVvLmxq62usbq8vcva1U48 +QTAkIyQjJigtT8S3raikoaawvO86MCooMDpB37yzrKywrq+6w8bHxs7sTUU7KiQkIiIjKDVf +wbGoo6GiqLC+ZDUrKCctNz/et6+sq6yrrbe/xsrK3FtJRTkoIiYlISMqNmfBtqujoaSpr77s +OysoKCoxPmHAr62sqquutb3JzMnS+HNMPjEoJyglJCkwQ+W/sKejpamtt85GMSwqLC81P+K+ +uLGura2vtbu+w8TJz9xfPCwoKichIio0Qmy9rKalp6irtMxIMi0sKiotOFLTxbmtqqqur6+z +vsPDyNFpPS4qKiYhICcvPFTDraajpKapsMBUNCwpJyktMj1dzLuwrKysrK61vcfLztDW/U8/ +MCooJyUlKjZN1bmspqOlqa68eTsuKikrLzU8T866tK+tra+1ur/L1tjQy8vVXjwvLCkkIyYu +O1DJr6ejpKituc9MNi4rLTE3PVDTvru6t7e5v8XCwcXEvru7v+0/MCsnIyEkLDpVyLGopaWp +r7rOUTowLi82PUVQ/MzDw8O/vb29vLq4uLm6vMlYOCsoJyMhJjNJYsmxqaeprLG80Vc8MzQ4 +PD5EUGjczs7OycG/wLy2tbe3tbvSWTgqKSgiIio8T2S/rKipqq24zGtBNDE2Oj1HYnreysXG +ycrMy8S/v724trvJ50kxLCwnIyk1P0zJr6ysq621yWRFPDg0NT5c6fDVwb3BydLb1M/e3se8 +u7y9xnU7MTMsJSk0PT96uK+vrq+0v/VBOj04MDts1OLVu7jDys7b6PFnYNG/v724usV3OzM2 +LCQqOj087LOvsa6utstUPTg6NjNF09Hfxrm6x9nZ1PVMSmTc2dG/t7i7w/09OTQpJS45N0PE +s7GurbG6zFI9OjczPGVwccW5v8nCzHR6ZEZL+/lzy729urW621NBMyooLDE1P965s7OvrrXL +YUtAODY8SFN0zcPBxMfC0FZl5lxPfNbZyr++u7e7zlg5MC4mJCw4OUq+sLCtq6+4xPFKPjc2 +PEFIZtPLxcbJw83t3/dWXvTr2sa/vry7wNxFMS0rJSUwO0DPsK2sqKmvvNpPPDEuMTc6StXI +wbq6vsXV7WJQUl1728zCvbm5u8xROSwqJyMqO0J4saiqqKatvedFNi4qLDM8TMy6t7WytsjX +3U5CTVha6sjAvr27u8ZbPi4oKiYkN1tXvqenq6erv+tONy4tLTRAUc+4uLq1vNbS2kxKWVJc +29DJvL29uc1WSCwnLyUiQXFEu6WrrqWsxddNNjEsLTg/Sda8v72zu8vJ2GRpYFfv1NTEu7/F +w9ZOLygwKB0x7zpgqKiwpaS3ydg+MS8sMD4/VcG9vra4xMnaXnNcSnzM1cm5u8K+xlRDLCQv +JR47fjnFoqqvo6i/yfU5Ly8wMDhP5tbCub3CvMLn7N5dWNfN0cC6u7zG2eA+JScwHh5NZzm4 +oayuo6vFz184Ly8wMDxRcc69u7+7vM/Y0vNdd9PJxr+4ur++z1JAJyAuIBw89Tq/oaqtoqm/ +xXU6MjAzMTlX8tvAu7++vc3b2Xhl6tfLxMK8uMHGxFA7LCApJRwv20POo6SspKe7xec7MS4u +LjJCXOjEvLu4vMPDy+fb1eLLv8jBub/Lw+U8LB8lJxon0kZWpaGspKKxv9s+NC4sLDA9T9HA +vbazur7A0+jZ19vNyc7AusnHvFQ/OB0fLhwe1s5Dqp2pqKOwxes4MTIpKjs8Psi7x7avv8G7 +z93N1trIx8q+ub/Jwtc/MCEdKR8bR75JtZ2jqqSsxO47Ly4rLDRDUtG9u7a2vcLG0NXRzsfD +x8S8wMfE1GNFLx4dLB4bVrxQr5yip6aywugzLjcsJztRTMS6u7K8zb7JX87B0MW8vbq4vsPH +6UU0KR0eJx4j177Lp56mp6zC2UwtLjQqL0lOzbrAtbPKzL/e+8LAwbm6urW8y8XvOjUnGx4m +HiTjv76poqSlrsLIUi8xOC4zSVvKvsm4tdnfxN1vxbu8trO2tbjK3mo2Jx8cHyIfLsO+uaSg +pqiyxM8/LzY1Lz1V4LzCzrvGUWTa+tS9trGvsK+xusniPyoiGxohICROt7OqoqOmsc7+TDEu +Nzk9V9O4t9LJyVBNZV/Yv7mvq6ysrbfcX0QoHRsdHx8ncLOvqqKgp7bN80UwLTQ7SGPMr7LL +w9FFPj5F9cW7raeoqay5y2YvIRsZHR8hOLyvq6Sho6/P/U8zKzE4PlbVsay6vL37RDw7TubP +s6ioqKiuvdkzHxoaHBsfOsWwq6WeoLHP4ksvKi44S1njrqi0ur3iWT41T9LWu6upqKmwttsq +HRoaHBwhSruyqqKforHUckYtJyoyR2XFqqetr73cWzs3S/XMs6uqp6u5vl4nGxkcHBwoW7Ws +qqOeo7njXT4tJSczSGG9q6anr8HMZDw8TuS+sa6oqK26TjIiGBocHCM6z6+opaGfrMVpPzAp +JSs5T8u2raWnr7jIblBITtW8ta6ssLnIQSIaHBwZHi1nr6ypnpymttRLNicgJi4/bc6vpait +r7a91EtW0cnEubSwuOFGLR8gHhofLTzPtaqfn6artdk7KiUmKTI+Zbmsq6uqrK+81NbO19rI +xcfMZDsrKigfHiYuPWnJrqOlqauvvE4xLSwtLzNJy7y0r6ypq7O5vcPN7GJWVVc+Li01Likq +LDlWWN22rautsrK31Us9NjQxMj9W3sW9t7G1u77Czdnuc2757+jZ3WtURjszLzExNj1HaNDH +vrq5u8DO+1NJQ0VNX93Lv7u6ubi7vb7IzNTtX01JQzw3MjAvMDE2P09+08S9ube7wMfP7FdH +R1vt5dK/uLe4ubq+xc/qWkpCQD46ODo5ODY2OT5KWHjRwby7u7u9xdPuY1ZUWmbizsW/vLm3 +t7vF0f9MPTc2NDM0Njk8PUBJT2L52szCv7+9u7zB0OprWlRUX+PMwb26uLa5v835TT01Ly8u +LjI2PEZVdtzRysfHxsjIx8jHyM7c73VfYXnt38/Fvbu7u7/J408+NS8uLS0vNTxKatvLwr+/ +v7/Cx8jMzMrMz9Ld7P7t5d/b0svIyMvQ5VpJPjcwLy8vMzg/TfzQxr++vb2+wcXJzM3Ozs/R +09HP1NzZ2d7j6uzvblpRSUA8NzU2OTs/R1V1283IxMPAwMLFys7Q1drd3NbY2tnb3d/n3+Tp +6PhiVk5JQj07Oz0/QklWYvXbzcnEwMLFx8rO1uByWvfGxfVmzsXlYtrPfFBe7VlFQ0pJPjw/ +RUNGTmDs1svExcfFxcnQ09PkdPHsaWTv1tbl4M7P3+Lb3OtvZ19USEA+Pj5ARUhOXX3d0M3O +z87M1evm2+Ht7u3Z2/7u19tqb9bL2u/Ox9V1bGpXTUhDRUZDQ0hMT2Rx7dbOzdDPy83u9s3P +XVjg2mpQ/dfnaN7J2GzZy99n29xUT19SPz9MTEZHTl1nYfrT0NPOys/U1eHc1+heaN3qW3rb +5NXY2tHN093V/Vx2cERCVEs9RExEQkxgd3LjzczOzsvI1uva4F5fcPfw7/jhzM7M2uzLxt5X +28h0S2dmSUVFPD1EQkBFYuHq7s+/wdDTwcbmdN3ZW1pt/vF179vU19bI0tfT2dbV5U9JUUw8 +NThAPjtEdtXb08O7u8DDwsXT6/J5W01QUl/yZF7GxNrTxMHHyevpcEY8PjsxMzk6O0BX2MzG +u7W1u7u7wNX99l1JQ01RVlpk08zOyMPBvsLPzc1QOj09MS0vNTk5PFPTx762sa+xtrvAz3ZY +S0VBQUJGXezdzL+7ubi7wL/BYjw7PzMoKC42Ly4/z8XNva6rrbO1srnRXFZPQTk5QUpNWN2/ +ubu5s7S6wtFaPDc2LCUoLi4sMlbLzMGwqamtrq6zvt1TRz84MjU7REtfzby4tbGur7W8x2A6 +MzIrJCUqLC0yRdnFvLCqqaqrrrK7zlxHPTYxMTY7QlnTwLiyrq2vsLS/dkA2LyslIycrKy47 +98C8tKunqKutr7XFeUg+OTQvMDc+R1vNu7SvraytsbrHXjswLigjIygqKi5D2sS7rqinqaqr +r7nG/Ek9Ny8tMTc7Qv3Cu7Wuq6yur7XGXz40LighISYoKS0958e/sKilp6iqrbPD9kxCOjMv +MTY5PlbOvrmzrautr7K72Uo5MSwlIiUpKSo0T9fIuq2oqaqprLG6xOVWQjkyMzc5O0JpzMS/ +tK2usbK0vNhNPTQtJyQnKiosOE7vz7uvrK6tq662vL/TYU5EPjw8PD1HXujRxbmztLa1tbzO +W0c6LyopKyopLTlDTPHAtrazrqywuLe3wuH2d04/PkBAP0dc793Ju7m6uLa6zmtcSTguLy8s +Ki45PD9VzsPBurKvs7ays77Ozc9nR0VIQj5BS1FZ78e+vrq1uL/O2XlENjI0LystNDc4QmfW +zcW6tba2tbK3vsPI5E9KTEY/QEhPXHfRxcO/ubm9wsvcYEM4NjMtLC8zNDlFXuPRxbm3uLaz +tLm+w83mal9WTEhITVJe8tzPxsO/vb/DzedsUT42NjAtLS81Oz5K6c/Lwbi3tbW3uLzEytDr +YVhOTk9QVVxr4NjNxcPAv8LK2XRfSzo1NC8tLjE2Oj9T1MrFu7W2t7W3ub3GyNHyZ15QS01P +Vl9r6tnVysfIxcXJ0WhQUT00NTQvLzI3PkRQ2crIvre0tre4u7/HzNNzWVZOSkpQWV5j383N +xr6/xMbJz3xQTEQ3MTMwLi82PUZR68a+vrq1t7u5ur/I1+VvT0pOTkdKUlpn4MzHx8C9v7/A +yt9cS0Q5MC8xLy82P0hO/8m/vbq1tLm6vMDK3fZjT0lJS0hJT15t6NDLysG/wb/BxtFjTkk8 +MC8zMC81PkVMbsm9vLu1tbq8vL/K2/B3VElLTUlIUlteetbNzcnBwcG/ws3mWEpCNjAyMS4v +OUBHXNHCvry3sbS4ubvCz+L9WktFRENCR09cZubQy8S/v7+9vMXea1dGMy4zMCstOT4/T9PA +vbqzrrG3tra+0d/7Tj8/QT48QEpNVOjJyMS7uLm5ub7QX1JLNiwvMSspMj08ROK/vLuyra60 +tbS6ydrlWkA7PTs4O0ZOVP7NxcK5tLe3tLnH5FZKOy0rLiwnKzs/PFbAuLu1rKuwsrC2xd/y +XEI6Ozw4Nz1KUWHSv7y7s6+0tre93U5HPC0pLC0oKDNCQk3Lt7e1raqtsrO2v9ZqU0Q7ODk7 +OzxEWnrWwrq2tLKxtLjA1VJCPi8nKS0qJy9DRUXRtLG1rqqtsra3vtVeS0I8Nzc7Pz5EZNvP +w7u3tLOztbnC31NEPC8pKSwqKC09SU7aubK1r6usr7S4vc5qTEQ/Ozk8QUZHV93Mx761sbW4 +t7nG+0tEPS4oKSwqJy5CSUnWtbG0r6qrr7S3vtZkS0I/Ojc5P0REUtXGxLyzsba4trrJfkxB +Oy4pKy4qKC9FSkfft7K1r6qrsLW4vs9tTkM+OjY3PUFDT9vJx7+1sbW2tLjF5FA/OjAqKSwt +Ki07TE/9vK+wsKyqrbO4vMbfTT8+OzY0O0E/RnfKxcO5sbK2tre9z1lDPDUrJyosKys1S2N+ +xbKvr66rrK+3vsnfUz88PDk0N0JGRFbPv766sa+xtLS4xHdJPTYtJiYqKyktPVZh27qvrq6s +q62xusDK6kc8Pz43NDtGSU3wyMC9trKytLe6wM9bPTU1LCUlLC0pL0n17cqyrK2trKyutcDN +021AOjs8NTU+Sk5d18K7uLWzsrW5vMXeTTkzMSokJywsKjJR4djAsKysq6urrbS/zd1POjc6 +OTU2PkdMYNHCu7aysbG0ubzJ5Uw3MS8qJCYsLSszVtXOva+rq6usrq+4ytzoTjk2Ojk1OEBM +YN7IvbizsbCxtrq9zl1DNC4tKiUmLC0uNlXVx7mvq6qrra6vudDj7Uw5Njg3NTpEUnvTw7m0 +srGxsre+yt5WPzEtLSolJCsuLzVPyr23r6qoqq2urrbO8mdHODQ2Nzg6P07908a6tLKxsbO4 +v8jdVEU4LiwsKSYoLzQ3RdzDvLWuq6usr7G2xuloTTw4ODc4PEVOadTDvbm1srK1ub7L2mhI +OzQvLSwrKi41O0Bazb+7trCur7K1uMDc815EPDw8PEBGTmfcy8C5t7m4t7vCytl3WUE5NzUw +LzIzNjxCR1zPysq9tre6uru/zNrxX1JKRkZOUVJo3tHNwr++vMHAzMzlWFtTSUA+PTw5PD09 +PktNXPLj18vDycnCw8/Ny9Xmd3BfZ2pmc9zY5dDKycrNztPWcWxcX1VMTVVNSUlJR0tIRE9U +T01XbH7l39PNysvNyczZ18/i6Oni4/ng387X1tjX7n9uamVfXm5sdWT9cHxfVlhKSkVHRUND +Sk1PW+zb1czNzM3KzdHP1MnW19bc0XrU9d9qX+tZ3Wln4vrk/9zl2nneXF9LTEk9RD1HPkVJ +T11j+NLOyMnHyMrJ0tDV2Nrl3vvbcu103fXq9N3d2OXj6d707m7rWlVTUU9JT0FIQUpGTUxc +YPLf28/KyMzMytjQ597d5N/99Gt49ejb2tjY4NXt8HJ2cHhjWl9eZmZfXmFVY1hZVk9VXFxd +aXFq+/r95+vi5d/i3t7g2PrX5NTZ3NvT19Xh5uru/Xf2dGZiWWdfWVdUaVtpWWtlamRrbmte +V15canb7duvmf+bk29ja0trR2urm3/Lt9OP64vf3ce9tZmxlbmd+an5rZmtv72ZrXl5fcGVj +aGRYYWJwbX7p693p2OLW3+Xufu13/XDyevh06fTddO1v3/Z74Wrva254aNtc3Wbma/HwWnFf +amtlallsY2Zq6vtt329xaf5hbtxd7edy7F3c4+Xb29P94X7e1Fz47dhsbudk1Wn173b9TmdX +dVZZT1tjWVZkYNpx/vnt0fb2edDy6OX/1e5w7O7ceO5q7mZ9+/F96+vz7+dq1FzV8m39W2Ze +bFNTb0xoVVl+Wdle097p12HeXtf0XOTucFnvY/zRdtTh1dZeyN7n4tn5cc39fONjbmdjR05T +Sz9IS01QZV1x19fVzsrYzNbv6dzyXn78YP7jX97Z5H7P0+bY3OzTadR759J+WvHzWUdKVT9H +PkJFW0xQ6tHTz8XHyMXOeNLfZl5jZln2eVnp3t3b19nTy+Pg2NN539Ly6Pb7WFRaREBRPjk/ +R0JEZvHfysLIvrjDzcjP9mxZSkdPUkhW/n3618zPxsPKyMTV2tLc4O1meW5KPz1EPjM1PkA/ +SFPiwMXEvLa1v8bFztdiR0pORUBDTF5l7tHFvL/Cvr7Ez9HP+HBcT1BRQDc6RDwuNEVBQlFe +zLy/wLmvtb/BwszkYUdESkA7QExQV+3PxcC8u7m3vsnJye1QUVxRPTk3NDwzKzVLRD1S07+9 +vLizr7TAxb/NXEtHQ0A7OkBNVF7cxr+9uri3tr3Dw8tpUVJNRjw2LzE8Mis1UUk9VMy7ury4 +sa61w8m/x1JHR0A9OTlCT09V38S9vru3tba9wcLH8k9bXkI4ODUwODQrME1IO1DMu7q6ta+v +srvHw8hYQEFBOzc3PEpPU/fGvby7trO3vL6/yH5TVVpKPDs4MjQ6Lys6TT4+88K5uLixrayy +vr++00xAPzw3MzY7P0ZR38q/urm3tre7vsHK61loWUZBPzs0Mjw3LTRIQj5gzr64t7WvrbG7 +wL7RT0E+Ozg1NDtAR1zlz762tra0s7a9xszmW1FLSkY/PTw1Mz84LTVGQUfvzr+4trSvrrK/ +w8ToTD89PTg1OEJMUl7Rvrq5t7W0tr7IzN1aS0tIREZEQUU8ND5DMDA/Q0Vf9M+7tre1r7C8 +wsLXYVJDPT49Pj9BTPbbzr+4tre4ubzH1/dXSElEPklMSERIRD5EPDZASz9FaubLvr+7tLS5 +vr/H31tKQ0JDPzxHZWNl0b+6uLq7ub3N4H5WRUdHQktMR05YTUZOVUU6PkRGVEtaycLMwrq4 +uL3Dx8vzS0hPQz1IT2Lp2M3AvL7Cx8XNa19STUs/PkhJTE1p72r1y9tL6tBSSlpNT21PSeDN +dXPMydvd6PjT11h1z9323NPVzcDj3r3sV+pcUmBNSlBlUkly319c1O3Z5Odq4N5HUGBQTEtG +TVpeX3Lb2Pzg3+HM3tzY1tXd0tHK3M7Y2dxoe2Z8eEx3TFZqTuPtZ9lc1ON63mfzUttIYeZH +akzpT2RjV9x5Z1rv31/v3OfN6+rfz9hfz+TbZe1h4t1dZuZyenRk2m3a3OXg42xtZ2RdTXVd +V+lTflrbUOhl/m74Yept1m56ylXfb/lZeHxr6Oxg01/Ueud33d/r/eHZ6+bv2WDiWF5q9FT6 +Xfls+mH5d2XaTdNP1VLUUM5V4Opb2vNqZfRjfl/2WuZZ6ubr1vTccs1o2WvYdnvSVNRVdE7V +VeZU017NYuTs+OFLyErOWeBvbnFda/RU+kxuZHFVen5g5eji79zt5NHhW9Bi1k/ebWXoXnx1 +2/l31fzZae7vcu9rdmriXmhX3/xndvdV3E7aU9NM9k/WVvveaNxm8fnvXN1u3917Z9td5+5t +ZNz7b9zq6mjaXOzm8k/ne0veZm5ZyEzW7nniX8xO0uhU3WhsY2h4WepTYOla33Ju8+fwZ+Nn +7+LsX+7e/WvY41jNaVnQX1TXaV7z5GXy0Vzy215rd95Pd/Na4OtZ8d5aUdp4SdvjT+rNVFzI +7F/b69Vr/tpPy1tKdsxJ79NSY8pnWNXJT17IaUzWcV5X2Vhf79ZsScL4UctmYcxObfXj52FY +2NFV6mZny0p2yEjRbWLcbmX+1Vpa+dz7V9boUNveZlPf1lxoaNvv83R14+9gb+Lfa3rY7ONR +2W1daN5bWNfdSeXTWerO81LY2E/n0VtB2NFLXeTSWerbcWbc81/p22pX3O5PyF9R089bTNry +b+Jcd9f2W3DaZ2N6Z2t+eupZbOPrXlv/4uR54dF2a9ZobdRuWdfWUGfq51tc32dwbOHhcuht +9WlufGZ4Zuh5Zu962e1SZNnbTPLPelbe31znfF597mFlWNn4X+zs52DW+HLn0vhl2N1h7mNi +0d9RatVnWXxkdmN5elpWb9p2XeHf62rybWba3Fx8395q791g2//kZ+DiWGrqam3wWFnV9l39 +e25i0OZl9uHqfHdt8/Bub1Dv72zx9HjV32ps2uVfbv9nY1145F9o2+ZX9N/o3Ol8997scPR+ +7GRr3O5wZ23zYlZ95vRfYNvcXH3w3dxsY2/3VnLkbP3oeGLu1/5f4fV81e777np34/VebXV2 +dmpt9vXsZ1n34l5q3OdxXej4a1lY7N3vaeTteuXz3ev61vf27O5vWvx8b+lZ+eRtXefaeO1j +VOzkZl5Wan3qXXjnZ+r052lk5dj27v/28W9y+9DoePDpd+XZXmzrfF5reVpkYvjiXV5q4flp +9393bGHl7e9979nr4P128Pjv4WZs22pN9NFvWfrkXF7z82fm8Wvk6Hnh63breF/v3HNdcevi +62tca9nhZV72cVlvb2lqcm/v+Xno6/Xw6OX6aXj27ft19t/teens9n7xcWJoZGD772Ve8Nvm +93zr9Hpua3tjd2pedXRvePni321r7OXn7f5jeff35erd1tPc5eT07HdmWk5LTE9MS09XZWtq +bvDb19jWz83T3djV2+zs29nc39fT2d3Y2er7aVJCPT8/PDg6RlNZXuDIv76/vr7E1OflaVJM +TE9OUlv/2dTSzMjLzM3O0djc2d3d3+Tj7Fc9OTw9Ny4vP1ZMTNq6tr27srG80NjTbkM6PD49 +PURa3tHMvri3uby8v8jY/WhhXFhRRj02Nzs2LzE8Tk5O2Lm0t7iwrrbHz872Qzk5ODQ1Oz9L +68jBu7Svsba3ucPZdGxfT0pNQzw4NDo5Ly43REhEZL23vLuvrLO/vr7RTkBDPjU0PUFCUtnJ +wrq2tbe4usLO1ehYTk5SSj8/PTY6PjAvOUY/Pl/DvcC7sa6zubi5yflZVEU6OT9BPERy3d7Q +v7m7vr68wc/d5fNeV2ZaSUVBPD07LzQ9PDc9WOXb0b2zsbazsLfGzs/sTkNBRkA7Qk9MUufO +ysi/urzCwMHK2ePnclRLTks+OD4+MTU7Ojk9T+bc0b20tbi3tbjAxs3lX1RMQ0BFRklMU2/f +1MvDv76+w8fGzdzwb1lPSkI/Ojw3NDo4Oj9JWHvayMC/vbq4vL/Cx8/adl5kVlRYWFtaYuze +3NfPysvNzc/Y4PP6Y01MR0A/PDs7PD1CSU5f99nNyMK/v8DDxcrS2ODyfGdlaF1aaefg493W +1NHQ1dDQ4ODe+2hlV01DQkA7PT49QUFNU2P23NHKxMLAw8nLytDR2t7ofn118fDq5+bn7/nz +5eDe5uPj73Z1bl5cVU1MSUFEQENDSldXXGni29DPycfJyszV2trc4O3e4+Xj4eHs5uDi5+jq +7+7k3N3j5Ov4Zl5TTExEP0I/QkJITVNf/+Pg0c3JysvKys7O1Nzc49nf29nc8W5vdv957njy +5uXg4tje5HVmXlJOSkRDQkFCQklLVF1+3tfQycjKyszO0tLX3NzX1+Pg3ujs6+71+ezl63/s +3+bh735iXl5TTExFPkNCQ0JGUVhj9trYzsrGyMfIzNDY2d7j4d/o5t7m7ezvenru4uz13+fl +6ufufm5mW0tMRz9BP0E/RU1NV2ri2MzJxcrIxsrNzM3W2dXT5Ort+nf+9HV08unv7uro5OTj +7nt2WktHST8/QD9AP0lLVGXd08zJx8fJxcjL083P2Nna4PXi6/L58/P+8PD6b+rf4OPh5/z9 +WllRQUM/PD09REJIVGBu29LMzMPAw8PFyNPV293n4+H2+/nx+/Ls6ujf2d3d1dnY3u9qV1RE +QT47OTo9PkNLWmrw1szKxsLGxsXEys3L0dfZ1+Py7fD6fO3p5+708ebl2dnk/GNoUUM+Pjk5 +Oz4/Q1JgfObVzcfFwMbFwsfLzs3V2Nfa5u/n7H578vbv8d/f4trc3+5oZVtHQj87OTk8PEBM +W2/m0M3MyMPFyMTGy87N1ejn3/Lv6Or19+Dg39zVz9DO0eRvWl9JPT47NzY4PDxCWXDp1cnH +xsHAxsXEyMzP1ODt3+D8/uro+e7d2drV0tfQ2Nv8U1ZMPj07Nzc3Pj1CT2D108nGxsC+wsDC +x87V1Nvr7/pkZGn75ebUzs3IyMjKz99sVEk9ODgxMTI2Oz1LXujSxL+9vLu9vb7CyNDW7n5n +X1xXYWd77NjOy8jEw8fT3WtTRDo5MzAyMzc4P1Ft2sm/vLq3uLy7vsPL1uZoXV1SS1FbYGnj +zsvHwb7By9LdX0Q7OzUwLzE0NjxKWefKv727tra6ubq/ytHZb1dVTkdLVmNp6MvOx729v8jT +2ls9OzkxLi8zMjQ+TVrhx7y6uLG0t7e7v8rW51lOTUdCR1BcX9nIyMC6vMLO0uFCOjoyLS0w +NDM8U3Tmyr26u7azt7i3u8fX4GJJSUpCRU9aYefNxb69vMXO1GtEOjgvLi0vNDU+UvbVw7m2 +tbKztbm8wM3be11NSUlIS1Vh6dLMwb29w9bfbT81NjEtLS81NzxU4djGubW1srGztru+zOBv +U0lCREVKWGnax8K9ubq+z+zgQC8zMCspLDM3OEzOxcC0r7Cxs7K3wsbOeU9LST8+Q1RgaMy9 +vrq1t73ZdPo8LC8uKCgqMzo7U8S9vLGrrK6wrrLG1t5aPjs/PTo+XOt8xbe4tLO1ut1RVjgn +KismJSkzPT9furGyramorLSytdVPUEk4Mjg9Oz59zci4sK2tr7K65kdEMiUlJyQkJzA+Tt61 +qquqp6Wqtrm89T05OS8rLjc9RuK/ta6sqaisr7fYPj0vHyAkIiEnM0VrzbKmpaemoqa2v8F0 +NSwvLSkqMkBM6buuqammpaiuus1BLy0iHB4hISMtQ93AsaWfoKOko6vFdFQ5KSUoKSgrOFjZ +v6+noqWnpaawxuM+KyYiHBwfIyQuSc+3rKSenp+kpqrCSTo0KR8hJigqMl+/tqykn6Ckpaar +wmE+KyIhHBodIiUqOsyvqqWem52hpqm0TzEuKiIeISotL0TBr6ynoJ6fpaeqtPg7LiUfHhsZ +HSMoLEa6q6egm5qdoqevw0UsJyciHiArMjpZuaqmo5+dn6arrrlkNSslHx0cGRwjKy5Guaik +oZyanaOqsshFLSckIiAhJjBF8L+so6Cgn56jq7W80jwqJSEeHBocISkuPMmtpqOem5ygpqu8 +XzwtJiIiIyMoN2fLvKuhn6Khn6SvvMDiOSkkIB4dGxwiKzE+y6ykop+cnJ+psbvpPCslIyIk +JCg1Ycu8q6CfoaKgo627wc5FKyYkHhwcHB4jLDpbu6qin56dnaGqssNQNyoiHyEiIik+1r+z +pp6eoKCfpLDAyXQ3KiYhHhwcHB4kLT16uqmgnp2cnaCqtcVPMCkiHx4fJyw4erWqpZ+cnJ+j +p62+a0I3KyMfHB0dHR4jMEJfwaugnp+dnJ6ns8H8NSckIiAfISk6YsqwpJ6enp6fprDA2Uw0 +KyYlIBweIiMiJz3mzryqn56fn56hrL7YTzMmISIiICQuQvG/rKKfn56eo6y4xn49LywoJSAd +HyYmIypNyMS7qJ6epKSfo7LXYk4xJCEjJCImNE/Suqujn5+foKatu9VSOC4sKCYjISMmKSow +RtS/t6ukoqSlpqm1y15GNCklJScnKS5Fx7ivp5+foqanrL19SkE2LisrLComKS4vLzZR1c7A +sKmoqquqrLjNbEw5LioqKystOFHNurCqpaOmq66zxV5IQjwzLzM4NiwrOD8yLD3Q1lLesKmu +ubGqrsTn2uo9LSsvMy0tPNG/xLaopKiuray22lRiWz00PEM3LisvNy8qL0JmVVq/rq2xsqup +ssfa2lk2LS0yMS0wRdzEv7Wqpqqur6+521lhZkc5PUI+OzIuOT8zLC9Pf0RGy7Gyvbisq7XO +zsxfOS80OTYyPeDEx7+xq6yxs7G3y3ZtbEo+Pz9APDAyOTsvLDtJPj5ZzLy8vLOsrre9vsVs +RD5APDU1Q2ds7MC0sLK1s7G4w87T5VRDQEE9ODM1NTQvLTM5Pj9D0Lm6vLStq6+8vbvPTEA/ +PTk2O1J278u6s7O0srK3wdPZ+E1AP0A9Nzc4LzdHLi5HTUVRXtO3vs64rra8v8TBz0xIXEs+ +QExs3d7Mube7u7u7w9l+cFNAP0RHQkZHUFlEPkRBPEE7OkdQUGTZyLy7u7WxusLIzuVUSklO +TEhS483Nx8C8v8nIztz+UEtJR0NHU1ROavpm3tt5VmdMRD83Oj4+PEhh7NLJvre2uLi4u8fR +4WpUSElKTVFm6dnIycTCy9D29lNWWUhGV01HU1dOZGpV8+ru997k+fdhaFpYSVFWTU9UXG7j +8NfQ0MrMysvGzsrQ3M3g9n98bF1wZ3T1Y3Jq+lxpX29sZW1veWprYnBebVxp8Fv1ZG5fZFpa +eVxrZHZyf+nm7Pdy9d/86N3W09/T4tPc6djv9flr/ul37ubo/erue9p27+9naVhmUl1TWXVV +Z1tqWXV1dmBvXvtmYGf+eO7q6evj++Tf6O/s5Ofp7PHn3eLV1NrX1trc4ux7ZWJcU1JWXFxd +Z2997H1x6XtkXmdhXGJfXmZgXWt+ffby5+Tj6/Ln+fB+7tzg4OLZ293c4drg4+fg6fXvc2ls +a15fW1daWWNcaWp3am14anZsb29gYGVub3Tv5enf3eHa29zh3t3k3+x9am5tbWprbnDs5+/t +9f7vbGtubW5ncn5+fPPq7ffsev32YmJiZF9kbnls9ebx5d/i7t/e5/JvZWxrW2zvcGVre3Xz +9/365+fs5N3m7erd4+Hq53j2aGZjW1paWmN5eG54dXns4t3g6+vzb2BoX2FkeW5zZHHv9fT8 +8erp4+3x6uru9e5n/G3/9+Z15e/vbH384ujtbX1u6mn2/u5UYF1pYF9ifnhhanD1bGJsdd9/ +5PXl8er33drg7ejvdvXvbfP8+XxseHL6YvR89uH38vpqYlteXVhmWflr9e3Z2uvU5+hz63H1 +aH/seWdeeGFwYGVfX2hp8ffr8eXf3ejq7uze7X1w+m1rc/b++fF1bf13XWJfY3Xv+/To8+3q +6+327XRxZ2FnZG1rd3z48fjn3d7f5/J6a2pqcGlvbWZoYGRdYm5sc+7m6uzt7Ori3dzf3+rt +6uxxcWtfX2RnaG1zcPz07Ovn/XZ1fXh1fP3++3VwamlqbGZjaPd9bGdx+/vn6+Tk6eXyeHt4 +enp5ffXy+uz3+/Du8Ozv9f3+cWxsampnam9oZGh1cXl+fnv//vP7/fHm3t7g5+78cHL3d3dz +dGtra3j7dHl8+fz/fnr9dG90+vp8d3f+eP339PX/9355d/nq6+ri6OXg4ub5d29maGtnZGZl +YWdpd3r/8PD3+Ovq6+78e3n39H9zbXZ8+vr0+3v5+ff8+e7o8Pfu6ej+b3NraXz1enH9+Hx1 +/u/z+X59enRveHx7+u709/52eHV0evv2d3Bwb2939flxcv317uXk6eXq9vr5f/r4e3j97+vr +WXnUa1555ml5e3rxdHJvZmRmb/H1+nVzYlRET727ztnQ29bbWE9MSFVxSz0+X9DL0M3Dw8bP +zNH4U01PUE1JRUXVzXzj2eXczd/x8Vtbfuzpa1pg9t/p+Vpl7fb9b3Ts3+v883RnePd89+5t +b+/z4tHLztXU1tbpU0Y/PDw7PEBHVOHJvru7vcDByNxTQ0FFR0pMVejKwL6+v76+wMnXdWn/ +cWBLPTcvKi00MTRAWcizrayrq660wGE8NDAuMTM5SHnHt7Ozsba8w9pURkA/RlBy08S8t7W0 +vv5CNCcfICYmKz37taaioqGkq7bZOSomJCUpMUHctKqnpqiss8NYOjIvLzQ/Xcq6tK6rrrna +SjYrIx0fJyw2X7uqoZ+ipau57zkqJSQmKTFGzrGopqiprLXIUjs0MTE0PV7Ju7Wyr7G4v9pL +OC0qJh8jLzI94b6upqeqqay73UczLi0rLTdG7b20sa6tsLfGa05FPDw+RWHYxr68u7u+xcbX +U0tCLikkIywwLjnZuK6srKimrLnQXD8zLCstM0Zk37yvrK2wtLfC+0xGR0M/R1zhzMzGvb7N +Z1FfWT0uKi01MSwvRd/Kxryvq622u7/I4kw+Oz9DRFTaxb64s7S5v8/E+UVcOTlHRzhGcm9a +VcLwP7/POd7OS1PpVWzZWXnhbXJfefhseXl6bXV9/+7mzM7Uzs7L0NnX4GtobFhcaVVUc3tu +5fbs2dze83D2f1lTUlhqX1pldOzp7v3z4OtubGFiaFxYXF52++7X1dbZ39/nefjudXP9am1w +fXRy3trW09jd3t73aGNpY1lcWl54/m927erj9Wl1Y1lbT1NpWmN5dufY1tXd4tvk8vZraGNa +aG525enf0tXV1tfX6n5rZm5hWVtdafxsZ2xveGdcZmdfbHD76+vn6+Xf4+5sZHBqX2pmcu3u +5t/b2+To72xoZl1pdmtx9/Pk3O3q5+bscWlkXVdXWVxz493b0s3R1+V3XltVS0lKUVZc/Ofd +18/R2NbefGhqZlxdYGZ09ujn39zk3trc6vl0eWxfX1tbX2dqfe/g2Nrf5/BqWlNSVFlaXXP3 +9+Hc3d3a2d7u/nJiZmZiZ2Vu9fXw6efo7Xxxbm5xbXd2d/js49/a3N7ub3NsaGhoZ2BdYGVl +bfn17/B7eX51enl8fG1tdHJw7uHg3uDk9Xz+eXV//vvz9fx4eG9qb3FzcHZ8dHNrbnFz/3Z+ ++fvr397i4+1xa2RqZmNqZGpudfXz+Hz473pqaHNvb33x8O7t6ebr5env/Pv+e3RnZ2Joe3X8 +9Pjs5ez8dXT9bmpvamVmZmNmbfTq6+rs7O/5/v7zfv7+fXZ29XdtaGx0fu/p6Pj58Xl7effv +7uXo7/PzeXJrZ2dmamVbYGplYWhvcHvy6ert59/e4uLveXrw6vvw7O7n4/F0/nhoaG9rY2xu +bGdnb21qaWNXUM/SP7/d+/nScvrdWehnaVX3WuxT3Xrf71x14cnudNzY1mbe0V59Vn1420db +4U5SVN/+a1Fl2HJt9tjk8G3Z1PpaWGXOeXxN/c1v2du/9vr363NOS1NzTURc9uXl9snE7O14 +0/VTZNfyWVp18etKetx/bVfY9+JP1tTve/Hf5179e/1+ZF1tZfzxYN/p/d1j217cT2vdTmdU +0VB3aOHnfezZzl3Z9Nr16tdu2VPTVtVtYXhp5EvWTd9SX+xq3lzh7fH6aefk5ln+cn35bOln +zlrp72/kXuHpfGJ45OzwZeLy32TefN/6WNdf3VTUeP7dXMx8a1hrbVReW3NTV2H1eWRo2tZW +2d7P39/l3slZ1tDX2Nnb28pd3815+el95dJEN21IMjg5OkA7OPnNYNa8uLa6uq+yxMq/yX5P +SmpfRk3b0uPRyr+/03tHSkg1LCwyLi8vOm/v8sSxrrCxsrK1yuTVcElAR1BeXFvPzM3MzsjL +2vXc42xsTUxUT0M/Q0JBPT1DT1Zc+dTIxsXIxMTKzNbdfe7sfPdydu/Z3dvf29vZ1dnX3t/m +6uByYFdUSUZCPz9AQkJJVWDw287MyMfIy9DT2+VtZlpYXGV5eN/Z1dDOyczKy8zLzc7Y3/hi +V09IRD47Pj9AQ0ZJUF1r29XS1Nbc6uXv8Ofd1tfW1szLzMjHxcjLztrf4mtnXVpVUlZOTUtL +T0lISEpNTlBQXWz9f+nU0NPb1NHW1dXU2NjW0tLa4eng4vF79O/+b2dsdW9memplZVhdXltT +UVFTWllZX2hqfvXt5fL8+m1v9eXj3trY2dnW09LY2+Hn7vtwamdq8PPp4t/d4OHv9nBcT0lF +RENFRkdMVl1y6N3V19fW1NXV2dzc4t/e29vf3d3j7N7b3N3e3uTr4t3n9WRWVFJJPz9BQD9E +SE1cX27ezczNx8jM0Nrb3Ot/4t3u9+fj6Ozg1dbPysrLxsrX1O5OR0c9MTI0MTA1PUZZ6cq6 +tri3tLi+v8PgW09JRkVFQ01de9DEvLm2s7W4ur/bRzw4LCUmKScnLjxKasq3rqysqKiutba/ +fEpAOTUxMTg+Ql/GurWuq6yrr7rNTjsxJyAjIx8jLjY/1betqaajoaWrrrTTTUQ3LSssLC83 +ROrCtq2pqKapsLfOOzcuHh4jHhwoMTJburGooqGenqWqrL9TSjcqKCkoKjA7V8y5ramopKKr +trV1LDArGhshHRsrNTrGsaqgnp6bnqiqrupBOiwmJSUmKTBA8MKupqWkn6Kts7pCLC0kGBse +GhwqND+/raaenZyanqaos10+MyYhIiEkKTJJ0Liqo6OfnqKqsL5AKikhFxgdGhooOD6/qKKd +mpqanaWqu0o3LCIfHx8jKzZYwa6kn56dnaCns85GKB4gGRIZHBkfPVHKpZ6cmJiZm6SvvEss +JyIdHSAkKj3Vt6mfnZydnZ+puOk4JRwbFxEXGxsgP9S7oZqZlpaanKS66zomHx4cHCAoMmK5 +q6Kcm5ucnaSuxEQrHxkYFhEXHR4p4barnJeXlpedoq1eMyoeGhscHSUzULqon5yZmZudoam/ +QTMiGRgXExMcHyRCtamfl5WWl5uirN0uJx8YGR0cIjprvqadnJmYm56iq7w9LCQZFRcVEhoj +J0CxpZ6XlZWXm6Sv8SsgHhkWHCIkN8KupZyZmZibnqay0jcmHhgVFRQVHSUt3amim5SUlpid +rMBCIR0bFRceISl+s6mdmJiXmJ2jq79CKx8aFhUUFBsiKkqtoZyVk5SXm6e+TCYaGxgTGSQp +OrOmn5mWl5iboqq5PykiGRQWFRIaJSpJqp+clJGUl5upxkYlGhoXFRojK0mxp56YmJeYnKSs +vTsoHxgVFRMUHSQr46eempOSlZedrdQ5HxgaFxQcKzBkqqGcmJiYmp+or9QvJB0XFRYVFh8q +OL6inJeTk5ebpcRALBoXGxgZJDdLtqSfmpmbnJ2otL5HKh8ZGRkUFR8pLf+onpmVlZaYor5P +Mh0XGhoaIjNctqegm5mdnp+puc5PLiAaGhwYFh0sNlKvn5qXl5iZn7s/LyEXGBwcJjh4tKOf +nZqdoKStvt5LLyIbGx0bGB0sPOizopqXmZucorc+Kh8ZGhsdKkfHraCenJufpam01Ew6LiMb +Gh0eHB8sR7yro52YmJufq8E9KR0YGx8jMFu+qZ6enp2hqa7CWUg9LiUeHB0fICMrPMiroZ6c +m5ufq8w3KR8bHSAmOsy2qaCgn56lrbfOU0s/MiojHh4fICUrNFK3p6CdnJ6hp7ddMiEcHyQq +OmXGraSioaGnrrfOW1NOOjEsJCEhICMqMDdfu62knp6fo6u9azopIyMkKjpfxK6qqaenq7C8 +4E9GPjw+PTgzLywtLzE2P05+ybuzrqurrrfD6VBHQ0RMWG73eHb56H9iVUxUX2fnz8O6tra5 +v9NZPzQvLSssLzdDac+/ura0s7a7xM7eZFZPRz8/Pz9FWevNv7u3s7Kzs7fE7kk7MSwqKisu +Nj5R4se8ubi2uLzE1HFXTUxPUE9PUVzu1MnAvb29vLy/yt5kT0Q+PDo7Pz9DSlVv+nvu7vn1 ++311cWRdYGnv3tfV0cvIw8DAwcLI1eRpVUtFR0ZLXvHa1tve625eUUhCQUFDR0dKUVxv3szI +xcC/wMDAwMPK4WVQRj8+QUVNYeXOxcK/wMjO2O9ZS0ZCPz9BRENDSVBectrLxL++vb3DzeFd +SkM/P0JLXubPyMK/v8HGzNv7Y1tWVldVUExJSEdGR01RWWnj1dHOzs7afV9UUlBb/uXYz8nH +xsbJzdbn8WxdZvfh3tze4e1iU0lDPz9CREdMT1pqcW157Ofq4tTNycfGxcjP2Nvld3b47+3q +3dzW0Nja2Nz4ZE0/PDo6OTo8PkZNXN/Iv728vr/ByNHY33dgXWFsZnHr7fzNwsjMyMjO2d7c +bEE2MS8vMDI2OT9N2761r66wtrvBydh+XE1HR0xWa9zX3ufn0sPH82rZ0d/0bllKQD09PTw7 +Oz5FWeLNxsG/v8PIycrO4nd87+Xf7G9eYGVy6uTe3NvSzsnEw8rpVkpBOjc3NjU0OD9S8tbK +wL7FysC4ucrb0MnM2vxeTUlR/Nvi7drKv7m5vsb+PDM1MiwpKCotOWLBubexraupq6++8E5E +QD05NTQ6SffJvbm1sq6tr7O8yGw+LygjICEhIygwRsuxqaOhoKKlrLfaQzErKSgqLTVF3L2v +qqakpaessrvG90MyJx4dHB0fICUvT7qnn52cnZ6iq79LLiUgICIlKzhpuqymoZ+goqatutJf +SzsvKSEdHh4fIiUtSb2roJ6dnZ2gqbxGLygiHx8hKTdaw7CqpKCfoaatt8XqUEM7My8qIyIi +ISMmKznUtqijoZ6eoKey9zwwKSQjIigvPFzCsqmjoqOlqKyzw+9RRj41LykiISEhIiUrO9S5 +rKahnp2fqLLRSzkrJSQjJy41Rsu2qqOjo6Kkqa/C8FhFOjItKCMhISAjJSs8a8Svp6GenqGl +rbzZRTErJyUkKC42U8azqaSjoKKnrLjM9k0/ODEtKSckJScoKCwzS8W0rKekoqGlqrLC7EIx +KiYlKSotPGHEr6qmoqKkp667x/RANzAuLisoJiYpLC0xOlPOuK+qpqOkp6y1v9xINSwoKSwt +MDxfwbGsp6Snq665yfs/OjUvLzI0ODk5PT9ARUx6zsS+u7u5u8DOdlVMR0RDRUpd69rLwb25 +ub6/w8zQ6lpPTElIR0ZMT1FUT1vm6Xbq3drX3PZiVEtGQz8/RUxVXnrcz8rHxsXCv76+v8HI +zdnoelxPTEtNUFdmeejc3t3h82paTEVAQENAP0JHT2H77OLX0s7OzMjGw8PExMfM0t/1+mZY +VE1PWF1p9NvLx8fHztjlXk9IPz49Ozw+QEdMWGzv3NbPzc3KysrJy87T3+/o6f55dHb36uLg +2dTSzcvN1Nzqb2FXTklGRUNAP0FFSU5VXGb+6t3W09LS193b2tXU2tzY1dLQ0tPQ0tTX4fPw +9v9xY2ZtbmdnYV5iW09KRkVGR0ZJTlheYW177t7Y1tra08/Q0c/O0dHPz8/Q09TY3+zvdWJf +ZG/75+15a2FcWFBOT1NPS0pLSU1UW2Ft//Ls59/a3N3d3NjZ29bV1dXV19vf4dze6eDe3+bj +3uP6aGJZVldVV1paYGhmYF5cWllXV1FOUlZdYm/26+Pe2NTW1dLS1dLOz9LT09TY2+f6b19a +VVRVV1xha2959ujo6ubsb2ZgWVNSU09PVlxhbPPp39nY19bW2t7q+21nZ2FfbPDn4ebr3t7c +19jb293k+XdsamZgX11dW1teYmRlbndydnxza2tyeW5saW54bGlqeXx69/Dn39nb2dnc3uPu +fP/o5+np7vp5cm1sWkJWuFk9wslN9c5q22ZIWltGX09F4F3j3HrbztvO3dfbW9pNbWl65Fje +V+PFU9PL7MfLy/W/vWrOzk0+RDswMzAuNz49U9HMurWysa6xu7vI9nhLOj09ODxOTXO/072y +s7W1usTF0EczMi4tKCMoLzc7QOW5r66tqaeorrzG0m1ANTEzNTQ2QG3Pwriyr6ytsrO4w9NU +Ny0pJyMhISUqMz5mwK6mpaSio6aruM1lPTIuKSctLzVF78OzrKqpp6itsbnQWD8uJiMhHx4f +ISo4TdKwpqCenZ+hpa2+Xj0vJyUkICUuOE3FtaujoqKgo6iuutpCOC0iHR0cHB4fJTNfw66l +n5yanJ+kq7lmNCkjISEfISs5X7+vqJ+dnZ+ip6253kAyKiEcGxsbHB8kL07BrqSem5qbnaOr +uPs3KSMgHx4hKDRXw66ln52dn6GnrrvaRDAoIBwbGxscHyYuT7+upJ2ampqdo6u3WTAoIh8e +HiAoNlzArqSenJyeoKevvP0+LygeGhoaGhweJTF5t6qhnJmYmZ2lrrtMLiUfHh4eIis+1rWp +op6dnZ6kq7XFVjYpHxsaGhkaHiMtTb2soZyamJmcoqy+TzAmHx0dHyMrOmy7q6KenZ2eoaiw +vvk9LSMcGhoaGx0gKT3HraKdmpmZm6CsvU0vJyAeHR4iKjvpuaqinpycnaKqsL53PSwgGxkZ +GRsdIS1NvKifm5mZmp2jsN08KyMfHx8gJzFOwa+oop+enqCmrrrPUjYpHxsZGhsdHycz+a+j +nZubm5yfqsBGLychHyAiJS0+2bSppKGfn6GkqrbKaD4vJR0aGhwdISYuSrqon5ybnJ6gqLhb +MygjICEjKCw3bruspaGhoaGkqrLC7kY0KB4bGxsdICYtQcCqn5ybnJ6jqrh9MycjICIlKS88 +6birpaGho6SorLTFc0QzKR8cHB0eIigvRMGqoJ2cnZ+lrr9YMiciICInLTdNy7WqpKOkpKer +r7nOYUMyKCAdHR8iJyw1UbuqoZ6en6OptNVCLiQhISQqM0flvq+ppKKkpqqvt8XcVz0vJh4e +HyInLjVBzq+ln56gpqy1zkozJyEgIik3Udi6rqmlo6WqrrbE1XZIPDUrIyIlJys2PkrOtauj +oKSqsL3yRzgqJCMmKjl1xbatqqelqK2zvdJtXko7NzEqJyssLjlET9K5sKunqK+1wWY/OS8p +KCouO23GuK+srKqrsLnGdE1NTU1HPjo1MjU6Ozw/Rl/KurGtrrS7w9pYQTUuLS81QGDPwLq0 +sbGwtL3PbEtEQ0tZ6+hhXFNGQEQ+OTo8P1vLvbi1ub/Cx9xhSjw2Oj9KadzVzMS/vbq9xM3d +c2RgVUpJTV/Pv8LXa0k7Oz48Ojo6O0rgxry4ur6+v8G/yHJKQT0+SE9SV2bpz8K+vb/H1N/m +cVxUTUhHTVr2z8bQblNDOz0+PDw/RFTQvbWvrrO4vcrlW0E2MzQ2PEpe38e+u7i4u77F0v9X +SD07Ozo8P0FGVu7Ov7m3t7e8zvRVQDo2NDM4P0/fxLy5tbW4u8DO/k9FPz08PT9CSFj92crD +wsLDwb69wdJhRDg1NTU3OjxDYc+9s66vs7e/z+tXRj47Ojk9Qkpb9+DPyMjIy9Pe4uPn8WhZ +VlhbZ+7j5ujo3dbNys3Zd1xVU1RTU05NUFljZmZiW1hWV1tn9uTe4OXaz87O0Nrj5uXh3t/e +2MzGxsTFy9R2STo0MTAxNjtFXOLLvbe1tLe9yNpqT0U/PTw+QUhWedjNx8PAv8HEyM7a6mdW +T01LTFNcZvTc0czIytf1VEI7ODY3O0FKXd/Mv7m1tba5wM7oXE5KR0VFREVKVHXazMbCwsXL +z9PZ4uzzb2NXRz04Njc6PkROZdzLwLq2tLS4vcfYaVBGPzw5ODk6P072zL64tbO1uLvAydT5 +VElEQD9CQT89Ojk5PEFMX97Lwr25trW3ur/M311LREA+PT5CR1Fz1cjCvr2+wcbL0d3qfmdf +XVxeWk9MRz46OTk7P0dTfNXGvLe1tLS3vMbbXEg+OTc3ODk/SVbhx7u2tLO3ur7EzNt6XlVO +TExLSUhBPDc1Njg+Rk5r08O6sq+ur7W/02RLPzk0MjIzOUVsybu1sbCwsra6xNdjSUE+PkFN +Xmp+bVNDPj06OTo7PEhoz7uzsrKzt7y/yOZLPDYwMDY9R2DZx7y1sK+wtr3I4GdVTEZBQ0xl +3dryTzkyNDMzNjY3QXjCsKqrra2vtLnGTDEtKiouNDlEc8azqqeprLS7v8rrSzw3OUFMU195 +aFVFOjc0Ly8xND/6wratq6qpqq631UE3LyorLC01SN27rqurqaqtsL3iTT45OTo5P01e+dno +Pi82NS8zNDA86sK0q6ysqKuzvOA+NzUsLC8xP9jBt66sq6irtL7XT0Q+NjQ1NDVH7+nvVDtG +ZEA9Pjg7Vm94xb67r7K6u77L1/5EPUA8QlNg0r+9vLq5u7zE32hOREVBPT9ISlvi7mJv1d9M +Pj09PTw2O1BZfMnKxbe2uba7w8DKZWJfWHFcT1zf0NDP3dnN1vNrWFNZUklMT1BgZ2Ju7uvu +2k88Qz8+QTw+T+7u0MfDt7a8vsLGzNtfU1xaZ2Zabt3Pzs7P18/O5GlcWFVPSERMSUpPVltX +WV5senno3Njk9e7o3t7ucF1iY2BfXnjyfPX45tLPzszO19PM1drV3nxpb2BcV1dYW1ZVWVxf +bG9udvDi8f729HdkYWJnaFxUV2R88Ozw6tfR19rc6d/l/334fX5yd3d45+Lp9ejn83JrZl5e +YW53fvP5d3F86uff5vX8Y2hrYl5jZ3zn7eTm6v1xa2dfXVxhX2Pr6O3f3dza3+zo7vJvZmNp +cXr09O7n2NHS1OP7bWdqV1hXVVtjZG7w/fD0+/twa2VuaWpfa/z45vr47+jv7eTmeXVvbnz9 ++ufn/uTd1tvm+e35cGxlXFhdZ3xt/+bi7nJ9e29wbWx6/XV95env7Op9aF1YVFNZW2l5dn73 +6N/S0dXT1t3f5fN2bmFmZmdr+fDs5u71/WhhZGRiX19eYm98cv767+fs73t+cGhwcnBue+Xl +4eHd3N7h6u1ybWxdXF1nbWxtc35z+O3p5vF+dGpkaG778Onn8vLu7e59dX58+Xtob/5v+vp5 +eHF4eXp6dm1qa3J4evr58v589PHr5Ono5enu7XZpbG58fHVtbGtrdHpyfPb2+nNmbffx7Obt +fn5zbm1pbnNvcXv87uvw7uzt6ObyeXj8cG9vcm9t9Ons5+j57v1tbvXvfmZeX2ZtbW1panvn +4/Lu7/z98vj/+/1++/T4+vb09PXv9fj8eHJsenx0enZwc29rbvbz9/Hu8vHo7vLr7vTz8XR+ +/GlpcGtpefltZGludPHr5+Xt8fDx7OXi6fn/cW39fW5wcXVxcff6b3zs6uzt/W1nZGNhXmFq +cnP26Obx+O/p4t7e3+Tq6/l0cXB/9HJrbG52/nJoam96+ndtcvbt/nZ+8f76fnJx/Ozt9nx4 +/fd9d3V8//58dXnz9/v89/Hp6fn/+n559fB/b294e3d1dXd2e3l9/Xb793x4e/l9df7z/Hj5 +7/T2fnx4c3h6c29+fvzw7e79fnRz/fN4an779u7u/Xh2/ezt7u3v+3Jtbm9yf/R3bm93+P51 +bmxra3P9emtv+vPy6uZ3YdXZbmT36ujlZl302HNn4ttmX+VxX2ns725fV2FkUExyxs5LQ7mz +RDq9r1o46LZ4MWO4dDVSvOU+Vr/KRGG/1EhfxflKXtZrRVzXYUhmz+lf/tjYcV7b0/1Y49Zq +W2rT91ju2OFt7O7k/Hv5eXT7b2v+W1jrfFhs4+xmZuLhbfrtem/58+7t9+Xk8mdy6vF5c+Hl +83ju5mtx8HtwaVlqdVVi9FxhZFdtblRk6mtb+9LgfNrM2t/KzNjY1tLa3dbX4erZ3NrT4UJd +3C0xSC4qODkvQWXk4cawtLOqrbOvsr/M1PVRSlBHQ2Bsa9PC00XOzi00TSokMy8qN01fbL6v +ubGnrbStsb7J1GpDSFA/ReD7ZsK8wLzBw+VJSC8qKyYkKi0vQVfKu7WrqqqprLC1vtdaTEk+ +PEZKR3XPyrqysry6vV5CQC8lJyUjJiwyOVfGvreqqaypqa2zs77qblg/PkVEQFLf2ci5usO2 +zk9UOi0pKyUkKS4wO/vPvbCrqqmmqq6utsza9Uk9Pj07Pkxj8ca8vr62xmLlRi4rLCUkKi4v +OvnUwq+srKmnqa6ut8zaXkY9Pzo4QEVM5cXDuLi+utRkWzotLSsmKS0vNknfy7qvrayrqq60 +tb/bZlY+PUA9P0hPYNHGvre7vrzZXlA4Ly4rKSsuMTtR4cq5sa+trq+yubzI2O9aS0hDQkdL +V3rYzMS9vcnBxFBKRjQuLiwsLzc8Ru7Nx7q0tbOvtru8ws3f6G5VVlFITllf59bNyL/C08XT +TUw/NDIwLi4xNz1D8tjWwLy6uLa2uLu8wcrL331rVVJUT1ly5s3JwL7VxMlKUEk0Li8sKi0v +NDtY1s69tLWzr7Cztri/zM7dXFlgSUhYW1j2y87EuczVu2o9TjkrLS4oKzA2PUvOx8KysLSu +rbK1tr7M1t9aR01EPUhRU2XQy8e5u9zGvkY7SDQpLS8pLDg7Q+rFwravrq+vrrO7vMjleFtF +QEI/Qk1gdtrGwru3wtnF2zs2PC4mKy8sLj1OZs28ta+urq2utLu/z35bR0BBPz5GVWnx28rB +wcfAx9xoV0E5NzQyNDc7Q1H+zcG8ubW3ur3E1exuTkhJRkdNVV5359jR0s7Mzc3Oztbi6epu +WVZUUFJSTEtNUVtcXF9iaWdkXllfbXzx6Obc09LQzs/P1dna3uPf2uL57Ofh6vDteXBrX2Be +XmljVFBTTktLS0xSWF5y+/Dd19nY1NjZ2dva3OHq4tzc29ja19Tb3OH3eX5oXVdVU05OTUxN +TE9YXGb35t/c2t3f3Nfb5ufv/u3c3dzb3+Dl6u91cnRoZWlmZml0bmJfXWJfVVlgXWT/7uvl +39ja2tjg4t/m+H52a2d1cmptcXRtbXH06/916Or+/nduYmp4a2VmaWx88ung4ODe4N3d6Ptv +ZGRoaWhka3BpaGlscW726O7p5Ofp7vp8c2tnZWVjaXh7fuvj7O/u7/X59H747n1zf/X28PJ7 +ePjp5/R8/PP3bGJiY2JfZmtsZW5vdfDs4uLq9f1ybG50amrz6urq39vc2dnh5+z9bGNjX2Je +Wl5iYU9PzthLbsfcXXrT63Ne8v5kXV9zamZP58bV6tXN29ne5+p3WVtdY2ZlX2JjXWBhaHR2 +dXF8fnL55O5sa+fof+/g7vnr4dzc5ebm4Oj9bWhqYmVWSFXd1W9ba+Tb3t3rXVFWX3ztd/zi +39/Qzs7P1NTec1JJQT5BREhPWW3f087Jx8vN0uZ2Z3r6aGVsam9/593VzMvGw8TEyMvaWD00 +LywtMTdCUf3Lvbaxr7K4wd1VRD8+Pj9ASU90zb+5uLu+xc3SzcrJy8/WdU46LisnJysuOlPU +u6+rqaiqr7nTSDcvLi8yNjxGWtC7sKurrrK6wsvZ8HxqXlRDNCsmJCQoLzpXy7etp6Oho6my +y0gyKykqLC4zPErovrCrqKqtsbvH1vBlY2VeU0AyKiUiIykvPXm/sKmin5+iqbTeOiwmJSYp +LTA6S9u4raejpKitt8bZYVBPUVdOPjYrIx8jJCo9UMeyrKWfoKGkr8VHLicmJigsLjQ/acCt +paCfo6qxv9xbRT05OkFNVko6MSwnJysuO2DTua+uqaaoqq6+30czLispKSwvPH6+rqejoaSp +r7/1STw4NjY5P01q08xdQTcrKSwuN0lMac7AtKypqKmwwHFANC8xMjc+SfW+saqmp6qvvM5q +Sj43Mi4uMTlK8c/CvsTlW0c2ODg0OTw7R+rQvbe6uLe8vL3G0/hSSktX8MrBwcHGycnL0+Jc +R0I9PUBGV19y3tzQysTD2kk5ListLzM8P0Nn0b6vq6qrr7q+xdfb/0tDPz1GX+DOx8bLzMfF +xMnabFFHREI+Pj5ATVd02dx6UUc/OTxIRkpOS1ThxbevsLW6vcDEzO1RRUFJWHDk187Iv728 +v8vkXk9JSEE7OTo9RmLZydxWRDs6PkNGRj5AVuPFt7a2tLe3trnC0WhNS0tNU1df6M/Evr2+ +xM7X81hEOzk3O0NTWUw/OjxCSlFNPzxEWc+9uru8vbiysLO8z2xTVFVXT0pNW97DvLu9ydbd +blNHPjs9REpIPTUxNDtGTU1NXObIvbu8vb26tbK3wddeWV1WUEtKUOvGvr/Iz87P1d1dQTs8 +QEtUTj41MTE4PkRDQUdny7mxsrW3trOytLrJe1NNSkpKSlB21MjDx8rLztPmWEQ8OTs/Pzw3 +MjI0OkJKTV3eyr63tLW2trW1trrC0fheW1tPR0pZe9XJxsjLys/c+FtIQD89OC8tLC0xOT5D +TFvQu7GurrG0tbW2u8hwTUpMTVVXVF32zsG9vr7Ey9Hc/lRJRkc+MS0qKSsvNDtFT9+/s66r +q66xtbe8xelSQz49P0NETGfUxbu2tbe8wcvV/1tUSDctKSYmKS0wNTtM2LitqKeoq6+xs7nJ +ZEE4NTc4Oj5DT+7HurOvsbS5vMDJ2HVNOS0oJSQlJyosMj77vK2npKSmqauvt8dvQTUvLi4x +OEFU6Ma3sK2srK+0u8bS+E88LygiICIkJysuN1LFsKeioaKlqa2wu9BKNi0pKSotND1M2L6z +rKinqayxt77L/0IzKiQhISEjJiovP+O7raejoqKlp6uxv+1CNC0qKiorLzdCbsGzq6moqaut +sbnEe0M1KyYiISEiJSkvPvq9raejoKChpaqxv/VBNCwoJygqLTQ/ZcW0rKmoqKqsr7fB4Ec1 +LCgkIiEjJyowPm3BsKmloqKkp6uyv+BJNy4rKikqLTM+Wc+8sq2pqKiqrbS+2FQ/NCwnIyEi +JSovOkzYva+ppaOkp6uwustvRzoyLSorLTI9T/bOvravrKqrrbG7yONVQTctJyUkJSktND9b +0r2zrKmnp6mttL3PcUo8NS8tLS82P1Ply7+6s6+tra+0vMngVkM6Mi0pJygrLzc/T/DLu7Ou +rKusr7S8yOJfSz44NDM0OD5LcdPGv7y6trOzt7zF2XZRRj86NC8uLS81PERU8dLIvbaysbC0 +u8XT7GRTSUI+PDw/SVj71czHwr68urq8vsfV72FVTEU9ODQxMTM3PEROYOvPw726ubi6vsTK +09/6Y1RMSUhLU1xq7t7Z0szIxsPDxsvO1N57YlVJPzo4NzY5PUFHTVz83M/Jwr+/wMPFy8/R +2PleWllXW2JvcXLu3dnUy8fIx8jM0Nvh72lRRT46Nzc4ODo9QUtaaebPycO9u7y+vsHEytTa +429fW1RPT1RWXGzw3NPPysfFxcfKz+JtWEtBPTg2MzM1OT5ETmLoz8e/vLq4ubu+wsnN1ON8 +ZlRMTExOUV138+DTysXDwsTGy9DaeU9COzYzMTI1ODxCTV/w1Mi/vLq5u72/wsbM1eH4YVdR +T09PUVhdbOnXzcrFw8LCxcvV7VdFPTk1NDU4Oj5DS1v72MvGw8G+vr/AxcrO2ODrfXVvYFdV +WFtidPTf2tPOysrLy8/aeVBFPjs5ODo9P0ZNWG/g0svIxMLBwsXJzM/Z3+f2f/t4Y11fXFte +am785uPe1tHS1drpaVhNSUdDQkNER01ZYnTk1tDMy8zMz8/S1NbZ2eH7fPd0Z2tsbG36+3Zy +e3p1+PTq4t7c4vxnXVdVU09PUlNRUVhdY2366+Xc2Nfb2dTU1Nna3Nzc4O75dm1ydmdla25q +cPjv4dza2+P6bWZeV1FQTk5QT1NYXF9jbXvl29jZ1dLW29rX2tjT1trh9HBsY2Nua2NjZ15p +fXV6b2lnaW1naW54cGx4b2tkam1qbf7r6ufn6Orx8uvp6+He4+36+Xhz/H5zcXBub3Jyefx9 +em//9/Ds7/R7bWltamVpa2RlbXjy5ODl5ent7PP49/56b2xpZGlscHF++/Dp7Ozu6+Tj6err ++nhybW1xa2diX15iZGlvcn7+d/fu7OLe4eju8/r57Onk5eXq7/d5/fj+c2xqaWNdW2NmZGVp +b2767fL06Ov07evv9/Z6efLs9vvw8Ozh3uLj5+rxfGtua2JmYlxaXGNnanj6f/Tz+vfw9frp +5uzq7fB2cPDv9/fx8fj4+fj2+PTv/vv2fXRuf/x4dG5x8/t1d/50cHtyamRobG1qaWhs9/v6 +6ufq9u7z7d/d4evv+XVveHt4dXp5eGdob3X66eXp7fb1/fd4cXVraGhtaWFlamdla3X57u3t +6urp4eLs+Pnz/nr++Ht4fnv26+vp7HpueHpwaGp0dG1vdXT+eG5tcnZ5eHJ4/ff8+e7s7+bf +4ej09HtubGxsbXJvbmNhaG5xfu/t5+br7vH3+/Du9PP7+nRwcm12dnVzcm5qeevo7uno7u/3 +e2tnbGxoZmtxc29scvLm4+X3effx6OXl7fLu+29tdHNlYWRlZGdqam397+32/uzo6ubm5erl +6vt+8/Hs6nxpZmhqcnxvZmx9bXD59vb49P37/GtjZm1zfPv7+/f79fX06d7h8fHve/jr9m5p +fPn5+nxtbHlue/t9ffTx+3F6fXd+8u3+dW1jXFxhavPj39vc4uHb29/m925nXVhaXV5hY2Fm +eOrr7ufr9fb16eXq7vd4b3B0/HNwe/9+dHL48Pbu5+bs7fp6dv/v+nVtbWlreHJtbm54+fb8 ++/Ds+mxwf3FpbWtsd/bo5+zp6uvv8fZ7eHl9cm92eG1ucH/t6/R8+Pt3e/fs5ej2/vtvb3Np +Y2luZ2Voa3P57eLe4Ofte25we/n8dXRraXR8/fT0/P/29/bv+XlufPp3b/r7d/nv9n50dnZu +efz6fHD97fF88vD8enVyfHVtbnl+dfz0+n397v346+708fl1bGtvfP1zc3nx8PLt8nZu/vf+ +Z2FobHJ4/vD4fv357efp7e3u7Ovs7PPu9G5na2xscG1nZ214+31udH7y9P/6/P3n5e/y7Oru +73dnaG9ubnVxa3ryd/jh4ebofmtnX1xaYGZqbnN7+fLl3N3d29vh7Ontfvvv/mtqeXhscn5q +ZWVeZnL/fu3m6+bc3N/p7m1cVVFKRURIT1/u187KyMbGyMvN1OVxW09MSUhLT1hn69zWzcjF +xsrP2epuXVdXVFFOTE1PWmhqYmNlXl1gZ3Xz7//67N/T0tfb3unxfGxlbvjy6uDg2M7KycvL +z9jjdmBXT0tJSUdJTFRhf+Dd5nBjXFhXVE9NTU1WX2Xv2NPNycjJycrKzM3S2+Pz9u3f5enk +6vhzamBcW1lVT09QU1dZYHPw7/d3aFxQTEtMTk9TWV9l++LWzcbCxMLDxsrLztnm8XRgW11s +/e/s6uzs7PVyaWBcWE5LS05XXWJgVk5OT1RWYXNpaGpt/d3SzMjGx8rMztHV1tje+Xhxa27r +2dPa4+9vY2RlWlROT1FSUlVbWlhUUU5OUVheau/q4t7c3NfPzs3LzNDV3Orw5dzb2trZ2+Hl +3t7f7HpfUE9UUk1PUlNbaF5WUk9RUVFQUVdcY3jn29fPy8nKztLV3OTi3t7c2dXS0NPY3dvV +1tnrZFZUT0xNTk1NUVJLRkRFRUhOVVxlbfDa08zGxsfJzNHT09fZ3N3i4+Tm3dPQ0tbX3PBn +W1thX1VQTkpLT09LSkpIRUZGSlV15dvW0cvIxcTEyM3V3+xtbHV3fvvr39bRz8zM09re6nZt +ZVxZXF5USkI+PDw8PUJLUmTr2s7JxMC/wMTJ0N5wY2RcXmpxfubaz8jBwMHFytHjaFdWVVFN +SUI8OTc2Nzs/SV3m1cvEwb+9vL2/x9PoYU9IRUdMV3Td0MjCv726u7/FzN9pVE1JQz46NzQ0 +NDU4PUpn2s3Dvru5ubm7vsTO7lVIQj8/Q0hQb9PFvrq3t7i7vsXN3mJMQTs1MS8uLjE1PEZZ +4czCu7e1tLW4vMPN6FRHQj48PkBIWt/Lv7m2tbW3vMDGz+tYRTszLy0sLC0xOkVc08G7t7Kx +srO2vMPSbE0/Ozk3ODtBT/XLvreyr66vs7jAze1PPjUuKyopKi0xO0z3yLu1sK+vsLW6wc7y +VUQ8OTU1OT9KZ8+/t7Gvrq+xtrzG5lBCOC8rKCcnKi43RW3JubGtrKyusLW7x+xUQzs2MzEy +OD5O3sW6s66sra6yucDSX0U4LysoJiYoKzE9WM67sq6rq6utr7a/0mdJPDUxLzAzOUFb1L+1 +r6yrq62yu8fhUj41LikmJSYoLDRBeca4r6urqqutsbnD2lxFOjMvLS4xNz9bzbyyraurq62x +uL7WUz80LCgnJiUoLDNA9sO4r6upqaqtsbnG51A+NjEuLS0vNT9Y0760rauqqqyvtb3RWz80 +LCckJCUpLjdK2L2zraqoqKqutL3QXkM3Ly0tLC4xOUd0ybqwrKmoqaywuMTnSDctKCUjIyYr +MT5rxbWtqaenqKuwustnQzgxLiwsLTA4QmXKurCsqqmprK61wehHNiwnJCIjJiszQvLAs6yo +pqWnq7C6zlw/NzAtKystMDlJcsm6sa2rqqutsbnG9UU2LSgkJCYpLjlN2r2yrKmoqKqttcHf +Tz42Ly4uLzE2PlHgxbqzsK+ur7W7v818TDwxLCopKi0zPE/Xv7ewraysrbC3wt9RPzg0MzIz +NTo/TfHKvre0s7O4u8LO6GBYT0Q7NjIvMDQ7SG/Pwbu4tbS1tbq/zO9PQz06OTg6PkhOX+vV +yr+7uru8v8nZ+F9YUU1KRT8/Pz9DTVzy2c/My8rGxsjJy9TjaE5MS0tLTU5OU17+3tLLyMfH +y83O1t3f6nZdTUM8Ojo8Qktb7tHIwby7urq9yNduT0hDPz8/Q0dPX37k0srGwcLI1etxYVtU +T0tISEhMVWrh0MvKycrMy83W4fRtXVlVVFZXWVtgXVlZV11x7Nva2tbZ3+Tl7nZpX1pWWmJs +amz8497b1NLR0dPc7HdjX19dXF5nX11bW15lfO3m7vZ6cXH77/V0bG5xcXH+8e/q6ez4+/rv +6ePc19Xc4uru6ufreWFaVlJNTE9VW15pcfHp4dve3djX3ujyeWhhX2Jrbm93/fXo3djZ3uDk ++GxnYF9eW2JraGdzfPbr4+LwdWpna3Z+9e3xevvt7+jg3ef98vV1YmFfXV5nb2djZ3jy59vb +4unrenBwamptbHNxef717uvq7+nm4Ox79/5ubW5qYV9kaGtrefP17O3z6ODn8fD1e3lvamlt +d2xscnL3+fXy8vH17er0//t5b2ZjZGlv/vLl5OXk73f57ft7entxdvz5/nf0+/v5dX18bGhq +dXv5+3h6+/r98+z07en5dXJ9+3dsZmJma212cXTy4uDa2d/k6en2dWpmX19mZmNmb3P77Ong +3uHn8XtvbWtvd3JxZmxtZWluamX65+bl5urs6d/e5Oz3e3Zxa25tZmllZ29udvHr7ufj6Pp4 +cmpoZGVgXV9qanf97NzZ2d3h3+Tq8nttYmlnYnr0/XhvcX7+bGx0b3R78vDy5eLo6vt3bWNb +W11fcune39zW0tPW2+TyfGxmZF1aW1JLTExNUVxiYm7o3NTKx8nJzNXe5/1tbW9zal5dZGhu +eG9tb3H+6OXc19/r7/p4fGlYV1pcXmp27ej5c1pRVF1famtkbnltcvHt4tfY29vd3drb2dXV +19na2dfU1tzo9G9eU1BPTE1OT09XXF5ra3Hh193mc1dPS0pMVV1fYmVndODPyMK+vsDFy8/S +19nn+21fW1VbbOjh6O9qVlBOSktOVVxcWVhYXW7z59nW2+hqWVZUUFBRUVddY+/Wy8fCwsTE +xcbL0tvm+XZmXV9z59/c3ur5b1xVT09OS0pKSUlITFhk+OLc29vb4+j0bmNdWVRTVl5t9N/Z +1MzJxsLCwcHHzdTh7mxgY2ZeWVxhYmZwcWVdWlhOS01SVFVZXF5t+e/u6eTo+WFXVVNSVV5l +c+vg39jRzMjGyMjIys/b4Ov99/Tt+/zl4+r0+PtpW1dZV09OTUpKTVRbXWnz7fz/a11WU1NS +Vl1u9O3s6eTYzsnGwsHDxcnP1trn7u78dmhlbHR49+p5al1RT09RU1tjY2NeYVxWUE5OS0xO +UVhodnfy49rUz8rGw8LGzNPc5uvr6ujc2d/k4eTg2dnc3ul1XVFMS05PUVhXT0tFPj1AREpT +aPTm3tfTzsbAvr6/xMzS3Op+bmpkYlxh/enYzs3P1NXY4ntpX1NOT09KRUA8PD0+Q0pXet7P +yMfIx8XGyMvO1uPzcGJfYmvz3NTQzMvJyM3Z5/JvX1lVUFNcXldMQzw5OTo8QUxg59XNx8K+ +vLu8v8fV8F9PS0lKTVp83c/Jwr69vsHIz91oW1hQUlJJPzgyLy8xNj1Ld9HDvbu5t7i3ub7F +029OQz8/Q0ZPa+HNwr26uLe5vsbYbFZLR0Q/PDYwLSsrLjdCYsy8tbKwr66ws7jC3VpEOjUz +NDg/Te7NwLizr66vsba/1GlPQzw1MC0pJycqLTRD9ci6sK2rq6utsbnJb0Q4Mi8vMTY9TuvH +ubCsq6qrrrW+zmxLPjYvKyclIyQnLDhO0Lmvqqimpqmssr3XTDkuKigpLDA8V865r6unpqap +rLO90Vw/Ni4pJSIhISMpL0HZua6opKKipKmvu9VJNSsmJCUnLDVJ1bqtqKSioaOorbjNWz4z +LSgjHx4eHyUtO+u5rKWgnp+hpKq21UUxKSMgISMoL0PZuKyloJ+foKWsudNLOS8rKCMfHR0e +Iis83raqo5+dnZ6hqLLLRy8mIB4eICYtO/q7rKWfnp6fpay40E89Ni4rJyMfHh4gJzNVwK6n +op+enqClrb9QMichHx8iJyw1Tcewpp+dnJ6krbzfTT87ODQvLCYhHyAkKzpgxLOrpaCenqCn +stw9LSUhIiMmKi45V8Cto56dnqOrudNYRT48PTs2MC8tKCcoKS47W8WwqKKfnqGnrr9RNCok +ISEjJy05VcGtpZ+en6WtutdQQjw5OTs9P0RDOi0oJyYqNlvEsKiin56fpa7GPywkIB8gJis0 +TMmypp+en6Otwm9GOjY2NjlFbsvDxN46JyEgIis/3LytpJ6cnJ+szzclHh0fICUsOuywo52c +naSvv/FENi8tLjhVyLavrrPFUy4fGxsdJjvGraOcmpqdpb44IxwZGh4nNeWuop6cnaSvwVY0 +LSoqLTzmvK+rrK6us8hAKh4YFx0qPsaso56amZ6uUigcGhwhJzbWr6KcnKKvxlI6My4pKTRr +uq2qrri8vLy9yE8zKSYmJCUtPmq+rKWmqKu2ZzYtKCcsOkviua6srK2430k+NzQ7SV/axL2/ +vbW0usHGxs/cdkIvJyEgJy86Sde3q6WiqLhtPzcwLy8yPH67sbCvr7fJZ0EzLzlHUGPPvraw +rK64wsPF12xHNC0pIR8nLTVFy7GsqaWos8XgTTUtLjAyQtG+vbatrbrO3lg/PD5BRWbFu7eu +q664urzTTzwuJiAfISgsM0XOs6qlo6Wpr79XNi0qKSkuO1rBr6qqrq+wvVw8Ojo7QVbdvrCt +sbWzt8tPPDAqJR8gJykrNvS2rKWgn6Opr8dFLygjHyMuPFm/raaioaartMtINC4vMjlH+Mm8 +tLCvsLXEUDctJB8fISImMW+7rqSdnZ+kqrlaNSsjICMnKjjVt6ylo6SnqrHJb003LC01ODpY +wbq3s7G1yj4uLygdGyIsLjnFqKOjn5yeprHEUC8nIyIlKi40UrqtqqekpKmwvtRXPjYzOD4/ +TM/F7Vz9RTIyMCssMTg9Yr63tK6pqqyusb39R0A3Ly4wMy872u/ts6uys6ystsDD019TT0hA +Pzw8PTUzPTsvNEE9PE7Zyci/ta2tsK6uuNN6bkEzMzg3MTNL+1Hrure7t6+ts7y7us1pYlpE +Nzc5Mi84PTYzOD5BP0nYzNHAs7Cysq+xvcfF7VNIQUhCO0RFQUdMXdvMwbq4t7W2uL/N31pE +Pj47NTg5NjY2ODs7P1dv6c+9t7e5trW4vcPFy/d75XRRTE9OR0lKUVZt1szGv7q8xczR705M +TEZAPz49Ojs9PT1ATFxz383Hv7++vr7DyMfK2OHe7XhmXVtPUFdcburPyMO/vcDJz+BcS0dD +PTw8PD09QUhNTV157+Hb1NPX0czU09HNydDPyMza4/NsW1RZWFxv5NLKyL+/xsrP4l1OTUY9 +PT4+PT5DSEZMX37+ft3U3eTU0NXT0MrKzMbDyM/Z2+taWmlcWmZ+8+bZz9TWztLh+2xfT0pO +SkA9PEFCQEdPUl3z2tra0MzOz9DQy83Mys/X2Njf6vj0bWRv++/f2tLS083U29zwcV5MSkk+ +Ojw7PDxCTk9Y79XPzsrEx8rIys7b2tTl7uDg7u/f2/Jw8fZ77d3Rz9HJx83Q2N1YSUpAODU4 +NjU3PkZJXdjNycC8u7/Av8bS1dt9bnV2YmPl2+Pd197v6t3a4djLysvSz9xOT0o5NTU0LzA5 +QEJM3s3Lwry5u7y4usXGyd7+aGBXS1ZlVWPn4NzbzcfPzMPK2NTVYU9PPzc1NDIwMztAQ1fb +0cm+u7u8urm+wsHN2dvrZ1dbWlVbbe7t5c3LzsS/yNTO50lMRjMwNTAtMDc9RUrnyc6/tbm7 +tra9wr/J3OP6Y09PY1paed/g5czHzcnBxM7P1VJGSjYuNDIrLjY1Ok/z0se+trS4trG4w73B ++G/4VEpNT09daenU2cu+wMa+vMnY0F4/QjgrLDEsKjc9Ok/PzMO6trWysra3vsjK3FZOTEZD +SEtPW+nVz8W+vby6u8DGymtCQzssKi8sKC8+Oj7cw8O8s7GysrO3vMbP2XxNR0pFP0VVVlrc +ysfAurm7ubrFzt1NPDoxKSotKio0PkBZysC8s6+wr7C2u73H/l9cSUFGSkdMWmjmzsfAvLq7 +u7vAzNhePzk0LCksLCouPERM38O9t7Gxr6+zur7E2GBXTkNCRkZLVltv1cfGw7y5u7y7v9Ds +Tzw5MiopLC0rLz1IWdXAubKvsa+wt7zAyN1aSUVFQ0FIVWl37szDxL+7uru8vsjbZUs8NzMs +KSwuLS89S2bQwbm0sbOzsra9yNLnV0hHSkpLUFz669/NxcHAv7+/xsvP3WhPPjo4MCwuMzEy +PU9m38m+uLa5ube5wMrO3VxPTk9MS1Jl7eDZzcrGyMrCxc/a1eFoUUdFRj03Nzw7NjtJU1p0 +1cTAw8O+v8nOys7rXWl+cGBkau/o4dvMy8vOzMvQz93r829TT0tMP0JAQT0/RUdITFjv4N3T +zMjPzcrO19/i7/Xwc+Tq29vW19XRy9TP3dD7amNvWlpMfVvwUeB0bFVZWltMTkdNS0lLTmpu ++PLd1d7r4dXU19fP1M/jzNTH1s3K1dZ63/53amH8XmdaaWdtbe1z+FpeTEhHREZFSEpNVVZ6 +/NnU1MjOzNbOz9TU3trS3uzj2ufn6PTo593o3enf6Obo7G52XWtZU09TT0tLS05NSk5OU1dr +dunZ3dPOztPZ1Nna393k59/j2+Te3Nbc4N7c5PPwbnRcYlZYVFtYXl1kXlhfempeYHNrbG5s +Y19qXf3p7H7i4Nvk3ufe3OTk2tjZ2NnX3N/r/nhiWltUWVdZWlxsZ2Zv+ex5637d5Or38m5v +ZWdsdGpk6Ptw/nrvfP9v6/R7fH1s+Ph8avNx9uPh5+jk5+3r/eZ63ObhaXNeZGz7+m1rZl9f +ZGL0dPZ/6vb3+vvx/vx6cvxsaWh8bGxt8vj/e9zteP727fL+bOvr7Prteul0debs+mvn3ers +7OTibGN5eVxZXmVtWlprZmdge3Jvb/jn6OXt5vbj9e393nvv/eP23uPm4fjhc+lz/m1k8l5o +V29pYmFcc+1fa17hV3hi8npzeNLy4XvZdtNt3+D+9uTm5OvnXuJrbvx93XPfWGjbVGRa81Bh +X1NqXFJ49/Nl0ubh5N7ffORl2/Vu/dvcZ9PeeNxv42PaZHbfWvzl9mbd3FfpW1VnTk9NbUdU +81Vp5eTnz8/4wuPs289mZtNP6W1bfd5yY9Xdac/8z97X6NvlcN97au9PWU9PPUdLPklJWmVz +79bB18zCys3b1t70aGLyVFdqd1/30+je09HP3NfW2Nfn2eHcb/BpRklMQDc/Rjg9Sk9b587H +vcTAusTVz9BiWF5OUEpMbHZ03MrOy8PIysnIztjd3eBodutbPz9POy87QjU1UFlP3sW/wb66 +uMLPytxTUlpIRFJOT3Pi1srFx8K/yMXH0tLS7XvrdGxYT0s/Pjs1ODg2PFVOVsjEzL+5vcK+ +xdXnY2FRSk9VT1P4293PxcPHxMTNzM3r5eFxau/vUVhTPj8/ODs9OTtQUlXLx9TDusXJvcnr +2txaUFRWT09f7t7eysnRzMnN1c7Q4OLe+Xrd5H3tbk1ITT85Pzw2PU1JSeDZ9Mm8xMm8xOXW +1Whj8WZZZmdh5tfa1szMzs3M1Nrc4PLz+2lpamJoYVVMSkE9Pj07PUhLUOzZ1Ma9v8TAxM7V +1uRwe21gXWZqZ3z25dnX1NDT2tzc3+Xf3uz5/PdzbmZPSklDPTs8PT9MV2LqzsrHwcPGx8jR +6+x+YF5nXVxzdnjg1dHOy87U0s/S3N/m73lsZW1lYmhUR0VGPjo+Pz5IXmj6zsjKwb/GysnQ +5+nmeF1dXVxkd3Xq2djRzM/T0NLY2+Dx8fZ2/fxudm5aS0pHPjs+Pz9IV1tk2szLx8TL0szS +7uvlZV79f2zn3N/Xz8/Qzs/V09Tk8+z6e3xwZmloWVRNRUNEPz0/RUROaX/mzsjJxsTKz8/W +7nl5amV69vPm3+Dd2tjSz87S1tXc4e1xal5cWlpXVk5JRkNCQURGSE5c/ODVz8zJxsnO0dvl +6e7q8vbs4ujo3NrZ1tja19fd3d3i+GpmXldXWldUV1RRT0pJSEdJSkxUZXnr2dPQzsvN0tLV +29zb3+bp7ePd29rX19zc3d3j7vVyZFtYVlJPUVRTWV1iZmRfZWxoZmhmX2JoaWVv9Ovg2t/f +2uTq3dvk5+Xq5drY3Nza2trc5e93cWdcVlJTVFpdXl1hcHpyeP/07fxoX2Vv/f5tZ2z05+74 +7vN7eHd6d+vf5+nj4d7c29zc4+31e2pjZmJeZGhkaHFvcv3z8u7seHr3/HFpcPh6cf/4c256 +fHRvffh+b259+v/67/f7fHhxffr06vdrZGptb/bt8evp5uXp5+Xm6vD8eW1scnFtaW95a2xs +aG5tbmlqfHj9fW9/+f56fvPq5+30/HxtaW9pYWz98vn49fjx5uXo5OXo5e74+P5vaGZia21q +c31vfO3r6/F8fHRyen1saXB++ndqZmVqcmpna2x96ejn5+vq5d/j7vLp6f9veGxsdX7z8Pfz +6/P/dW5maGxrbXBsZm18bXL2fnv463xyeH13df70+fLs7ebm6ur1cGpudmz59/v4d3v97+7u ++3V5+n9yb29wb29vbnDt6Orn6ff/b2ludP5taG1vbn7v/vzx7u/07vr/7unm7flyXkzkxEh5 +1txfamhMw0xSz+jyVuDr319QY79OZf/Ibk/eYc9H8NnTSdJ7+lftzF/qW+zOU2vqzEvtTshd +b11ya/JlWk2+THVqysxF2PvNSl3celRbXcZcTcrIZVG/e19ads5oOtvN9zvU39FKT8XYzznJ +5cg/asBH0UXEdk/JVeJhyl9Zw03W3kPK91FK0XlR10nF811c3NVM6mDe2FTi6tlmUnrm3E9G +3sxpT1jE1FZL3cTsUF3JzE1Q0MpXTP6/b0xpyNBHUuPPTkZ309hPSdzD+0VoztBcRGfD2UpR +zNRyVufM011SbdxaS1Bs23pc6NbI8V/fyO9PYP71T1P3y9703tnScVVY8mxOUF/k62Bt29rv ++t7gd1pldnJibNzj8evv2djYZW1iZF5Va3VzbHzr7d3u629sfmNdXmt4evf64eLp1+Tz7Ovs +5Gtmb216YnNn+Pb87uDocG1+/l5jcvNs/utvb+Defu7xY2pdWmNdZezT39zZ2u1++u1zWWFo +a1x/6t/g49vb7GVYX29iX/3m6Xt46ODudnFv4/VkXVpof3j69unx6+nd9mz7bmdu63Zr/X50 +aGty4Nfr/erj7OtdXfXsa3nu/9bsXFv54HzuYWr67npu6u/nclhXXmZv6NfY6V5WYf3r/W98 +3djpaFts5N3e7vVqYm5r/9jP1NHZ8mxpZ23h5vD7cl1iY1RNVVRWT0M+QExScNvTx8PEycrR +2dXb29XO0c/IyMrN29zd8WRldtnAPR4hKi47X09ss62xs8xDTNzf5c/r6r+8wsXL6NPIzNXc +81762ce7uMEvGhskKDRVWdOqo6eos3tOTzgsLzhMwrOxs7fB08/O2edsWfrIwLy3r65IGhQa +HixYc2qwoZ2boMc0LSwqKygqTa+joae2zsrGy/1FOT7bua6qqK9LHxgZGyArOFC4pJyZm6jW +OSojIiMmN7ynoqKrub/CzOdINDZHzbGopq74KxwaHCAnLTjrq52YmJ+xcDgqIyAfJjrAqqam +rLO3u8xcPTM6V8axqqq3UCYdHSAkKjE7zqecmJmguE41KyUjISIv3LCopquxs7jF3EY3PFLS +uq+zwEgpIiEiJiwxPcapnpqbo7blPi4qJR8fK0TErKanqay2wtFaSkxPXc+9u75eLCMjJSox +NTvfsaOcnaSxzkQ2LygjIyk0a7Wqp6ist72/ytRtT01ozsC/ViwlIiMpMzk/27eroZ+kqbTh +PjArJiYpLT7Kr6mmq7a9vcbJzO5aY9zJyFAuJiIgJi40QOG8raShoaSrv00xKSYnKi06YL+v +qamtsLa9v8LO2d3f6WE+LScjICIpLTnvuq2kn6CiqLfoPC0mJScrNE3JtK2srq+yt7q9x9PX +2N11PywlIh8hJis1Xb2soZ2dn6WwzUcyKiYkJiw937uzsLO0sbGztr3Gy8vN3EktIx8dHiQr +NVHDr6SenZ6hrMJUOC0oJicqNEvOu7a3t7Owrq2vuMDK0d5SMSQeHBwgKTJMyrWpn52dn6e5 +6UEyKygnJy06TtrAurmyrq2rrK+3vs7rWDYmHx0cHycuO+u7raKdnZ6ircJiPi8pJiUnLTlK +5se9tKyqqKissrrAzndBLCAeHR0iKjFB17epoJ2dn6exwX1BMikkJCYtOEr4xbivqaalqK2z +vMjWXjopHx0eHyUrND94uqqhnp6gp667zlY3KiYkJSoyQGPLuK2opaaprbXA02dHOS0mISIn +Ky8zOUzXu62npaittLq+ymM+NjQ2Oj0/RE5w3nhvtKituMG9trXHSkJEOy8pKCwzNzU4QmrL +v7ivq6uwusPL1G5JPjw9PT5DTv7Ov7m2tbe2uLzF/D80LiopKy0yODs+aL+0ra2ur6+zvcrm +U0A5NDY7QUtV+cy8trS0tbm+yNRrRjYuKiotMDE1PErsxrmvrKutr7e/zPFMPjk5OTo+RmDT +x7qysLG0usDL22dENCwoJSYqLjdEY8/At66op6istsTuT0E5Nzg4Oj5Jbc2/t7KvrrG5ws7k +TzwvKygnJyouOEztybuyraqqq662wdxUPzk4NjU6P0de08C2sK+vr7a+y+dNOi8rJyYoKy85 +R2jJurGtq6ytr7W90FtFOzY1Njo+RlbdyLyzsK+vtLq+zGNDMywpJygqLDI9S+3DurKtq6us +r7fA309CPTs5ODk+RVnbxbiwr6+wtbm+0lc8MCsnJykqLjU8Tt3GurCtrKutsbnK/E9BPTw5 +ODo9R1/Xv7ayr66vs7a9020/JyQsLCcqLi8+XtW4rrCvqqyyt8HhZUo8Ozo2O0ZO68zFubKw +r7K0uMftQTAsKiYmKCgtO07Hsq6rqKmpqrTHbEI0Li4tLTQ6S8q7ua+srKmqr7bE3N1mNykj +IyUlJictQM+3rqiloaClrbzsQTQsJSAlLTU/V86vqKampqiprbzZYk9PPywjIykqJiQnNGDE +urCmn5+iqq+31z4vKSQkKCwtOF+/r6uqp6Okqq+7xc57RDkwKCQnJyEiKjVJ28KzpaCio6Wq +ss4/NS8lJCopKjdJ3Lexrqajp6mqrrLBZU9JMyooJiYjICYwOUHRtqulpaShprC9z1k5KiYr +KSUsPVjWwLOppainpamvucvuUzkuKCUkIx8hLTE1WL6wqaakn6Cqr7jQRzcsKislJS84PXK9 +sKqoqKSkrbK2x/dSPzMpIicnHB8vLy9QxLWqqaWeoa6srsxRPy8qKyYjLTQ5XcG4raenpKOq +rq++6mBCMysiIykfHCouKjvIua2npZ6epqiot3BENCgnJyElLjE90LmupaOjoaasrbbdV0c1 +KyUgIyMcIDIuL/20r6iin52gqKuz/D82KyQjJicpM1HHua+ooqSnpaq3wNBnQjYwKyMjKSIf +LDUyR8azqaWmn6Csr6/VPzguKSkoLDg8Tb+0tKypq62yubnD331lTz84LCYtKB4nNy820Lqt +pqqkn6m5t8Y8MjItLS0uRFdKz7Cvsq6ur7bFwsDlffpv60c4MCsqJyElMTQ52Laspqamoqq+ +z949Ly8vLzEyRd7rybKur66wsbbM28vvUnRrYVxBNSwrKyQiLTo8Z7qtpqeqpae54/RFMC0s +LzczOujHxrWtra2yuLjE7vdsVFJWVG9VPzYsLy4lJjhFSNS3q6SpraetzGBQOTAtLDQ9OkrO +xLqxsa6tuL/D5VhQR05vX1/p/083LTUzJik5R2jJvqujrbCss8pcPTY4MSwzPkdd3cCxrbKz +sba/4FpaWEVAUGTu5l5gQzI0NS4uNj1lysW0q66xtbzF30s6PDo1Oz1FaNzPvrWzsbW+vsd5 +VVNKSkpDTvllX1tJP0RBOj5GTXvb1MvDw8TDztrW3u50WE9RT09UWm/o2dLNy8vOz8/a7fHj +7/ru7+7b2Of/Wk1KSEE9PkJIT1Jh6uDX1dbT19rb91xoeGvv29HOzc3MzM7Nz9zp//vu8Ozg +2d3q7W5PRkZHPz0+P0NKT1hn7tzY1tjV1NfV2+Db3ubc2NnW1dnc4N3b4erj3eTn2dPV1dfb +4mNPTUtDPjw9Pz9DSk1SY+rXzszIxsfJzNLW3O94df5xe+/z+fTq3NbW19XU0NLZ19je4eZ1 +ZFlKQj06Ojo8P0NJVnvc08vGxsbHx8nO1tvl+21s+PF8eOjW1djT1NXS1tve3t7sb2pvaFxR +SUE9PD0/QUZOVlp53NHMyMXHys7V1+D4f3d97Onq3N3c1dbZ1dnk6efs/Ofu9e31/vlsVVZT +TUpHRkZISUhLU11dduPg3NbQzM3SzszPz9DX1trf4vF7b3J2c/z9/O3s6uHo6+bucHVyZGFn +Yl9bUktIR0dHSU1SWGX65NvRz8/T2tnT1NnZ2t/k3Nzf3drW197f3ud9/3ZubWhqXl5nYmJr +aV9XT01LSktMUlpga/je19fa2dbX2+Lf537x5+ju7eTl6+rh393Z3fFybXL4cWh37O7s5e5+ +bW5wXVZST01NT1NVV2BxeP7o39vb3+Dl729OUcba38rMxM7c3dbvaldeYXdKTtLg8PTQ0NXb +ZHzfWj5DRDs8PDtFaF39xb68t7vEu8DWf2NOTUo7P05LT3fbyL+/w72+xMjS2NDZ8ujuUToz +NjMsKi02P0xew6+rrKyqq7DA7FZBNy4tLi84PlDVvreyrq2vs7zM3WhLQURDRUtOST88PTw2 +NDpDTnLdybiys7S0trzH6FdKPzs3NTtGTFzOv7q2ubq7wMvbfVxQT0lGTU9OS0c/REpBP0ZQ +WnHe183Dv72/wcfL1vdiVFNPTlNe/uzk5d3Y29/k5PtrYGp8bP3u6tzh8P3z7v15aHRiV1BK +SEVKT1BPW/l8/9/c19TT09LNzMzNz9LX2ub+a2VfXW5qb3z99+rp5t/o7fh5cmFebF9VTUpK +SkhITlVaYGvl1d3h1c/U1NXX2OXi5+304uLr4tza297T0dzX1tve82RqXk9RT05PT09SUVhn +Xl1pZ2bw7fbr8vbq92hqZWZxZGr+8eHb187LzcrJzdLW3+Tpb2hlW1tiX1teZWhdWGhuYm7z +fnFrYmluZWpgYmBdX2doZP1+8+r04Nzg39jY19ff3+Xp39/u7+78bG5ra3FkZmheW1xdYGVv +7+vz+Pnw5+325+n6d3doZ3j98/V+cnjx/XF47fpybmNlaG9ve+/27vTs6nz26uz18vXr5e/p +5ubh5vp4em5wfHRnW11hX2/v7efo7u3n73dhX2NdXmRt++7y7vT17/z4/29u//T3em/v3uPj +3N3p7/D+/XxvZGZkXF5qfPzm4ebk7fx8/mtgZmtte/Tx7ufn7fl9dmhfX2Rub2/7/Xj56+Tt ++Ovo7/Ps/PP6aXj19+3i6H98+PRuZ3B7cHTx6+/u6eb4cfDtaF5pa15ec/hqaHx7b3nw7+/v +6ujz+/h3df35d3P68XNjd/L65+tT99bu2t7S3dp78u5iWl1xX05LRVzN51R5yMvQ6WzU11RO +alRQVlVN79vk49DJz9Z6b93ZYFh7cWBvYVny4mhnfund72Nq3eNrXl5kXF9fcefk6nft5+z/ +/eTj72VZb+fyaH7h3OVzfe/3YFxv9ndoaW7v7vXm29fl82xi599jUmD4aFto+f766+rt3eDx +7/VzY2JeY2pjXnvc2fJvfWdcXmVw8fRu+OHl6uPsdN7b7err7/j19mvw2+jl82536fF76PFf +WVpUTkpGRE1OSE9o6+ni3s7FzNPN0NTR2uHSztna29zS0tvX3v3m33tub2VcXEotLDo3MzZI +1LzGd8G2xmxV+9LdVFbIwMzSyL3C1PHWxtlmZNnJ1f390tX6al3733g4ISlGMCcy6rq33Pms +q/VGX+55TT9buL3exbq9zW9b08HxWdPEx9/p0MbSXnzT3mFUKx0sNycoP8Kvss+3o7JPTeNy +OjE5+cLZ0rmxvedq2sTUX+nEv9Di1cPE3eXbz85kRC4fJC4qKDbQs667uKmu109SUUI0M07J +2uK/s7fUUeq7v3Htv7rF8G7Gw/t42MzI20wyJCEqKygvbbWvtrOoqr9ZSUo/MS4+3NnNu7Wz +w1tcz833/NC9veJ0yL/Q69rJxutKPC8mJSsrLT3Rt6+wsKyyz11KPzgzOFXQ1se5ub/fb8/J +7GnUycfS+c/Ez+XZzc7OdEE+LyQpLisyVsSzrbauq779U0I7OjE2Y9brzbu5vtrmwcDo7tTN +zWxf1MvS18zGvslYTEcuIyktLTI/2rWvtq6sts9UQD88MTZU6uTjzby6yM7BvcLYYvLeXlBb +3s3KzMi8v9TlYz8tKiwsMDVG2sC+urS0u8jXalVHPzxASkpLWdzHwsC7trnHz9TbZk1SW2B5 +4+nhz87d8mNJQUNFQT9FTlhWU1t54t/d2M/Ozc7Y63BeU1ZdaurY2dzd3M/R297a0tjh3dbZ +497Y19zs9nZaVE1BOzw9Ozw/Sl7+7tfJx8fJyszU2t7m5ed3X1tr6+Pb08zNztDOztja2eh6 +/vHr+2RYTEdDPDk7PkBJTU5j29HSz8jEw8fMztDc82dcW2Z5Z27f1NXY1dHMy8/T09nh5uvz +eWpcUEdBQkVBPUBFRklNWmvj09HJw8LGyc7a8WRdXWRrcXbj4l/XxtfKwL/Jzc/L0Oth/fZf +TUhKPDg8OjM2PUZZXei9t7q9vMDB3UtGR0RARUvzzNfPu7i8vcLBw+tOXVtMTlNw0tbZwr/K +1n0+Li4uKCguPmDayrCprbW2ucN1PTlAOzU9U83Av7q1trvG5djoTUFGTVZVTuHCxcrDvr7L +42U+KiswKCgvRO7DvrCmq7m5u9RQOTE8PzE818jBvbywsMvlx+dLRENPWUVOzs3UyMG7vtbW +z35EMCovNSopPXXPy8Supq6/uLfXRDc4QjswPs3HzsG4r7fa3cv3REFLZVZHZ8nQ6s7Dv8XX +ystuRzItPDMmLUpbfNK+qqi4ua66WD45PTwvMU/e7ty9s7bAysPPaEtJVlFITvr09tfMw8HH +xb7E9ks6NTstJzFDRE3Vu62wvbOvw11RR0A6MDpTTFXQvbe6wL+7yV1hZ1VIQk1rW1LfyMnL +zcW/w9RKP0E9Lis4QkBAab+1ur+0r77i9n9SPTU8TkRCa8vBxcrAu8Pc3NXfXEpOXFNKU3zm +497SxsLO5n1vUT84O0E+Pk3x1tHMxL7Cys7V321QTE9OTVZeZufa29zW2t3W2d3d6X1xaGVu +f+3e087NysrP3X1YS0VBPjs8P0RKUHHe1s7Nzs/S3ez1cHri5ezf4t/X2NvZ1dzn7fXv6vB0 +b2xv8N/Z19rb3/ZYS0lGQD4/REpPVmnc1dDJy8/S2+p+bm7v4ujr5Obj297g397g5OTl4er2 ++vB5a3P38Pfv6fZuXE9LSUNCR0pKTllt4NTSzsvMz9DT2dnX297i7nRubWdeaX58//Hq393f +3Nvf829ud3737+fwZFlVTkhEREZJT1pedd7T1dPNz8/Q2eDg4N/h6v52/m9lb/b69O/s5N3Y +29na4/Lu73RjaW9vaFpQT09LSUpOUlZdYW3r29bQztXd3N/q7enu7ev8+e7s7vP0/PDk3NjX +19rd3OtqaGZbWl5eXFxfZWhqbGRYUlNWWFlfZ2ppevv36t7e6OXh5d7Y2dfY3t/b2Nvf6O/3 +/vV5eXhmZV9dXF5iXWJvcW1xfHv29/52//T8eX5tZGpuaWpud/5+fP7z+/nu6ezt6vt++Hxv +eM7if9Pp5OHqcnBtaGdlYWdjZGhrfnZ7+nl3+/H7/n706+nk7ft8enRtbmt38/RzbGptbnf1 +7fp77u7x7vJ9dW9zc2ttb/727eDe4eTs7er+bm90aGRsbWtqdH1wefX0+/t1/vV/9ern7HVt +aGl6/fp+/HNsbW1yenJ0ffHo5uXn4d/g4Or1ff72dGhv/25lZGZkZml2fHf+/3lzd/p8e3l4 +cWl0fPn6+OXe4Onu7+nn7e/0/H56ZF9kbnp5b3T3+vn//e9+/fB+//t3c/327unv8vn9fvv9 +dmxoaWNpbHd1fvV9en3t8nlubXB87ubk4uLo7O/t7/P3/nl+cGpnXmdve/rx6/B++3l48Obx +93lraGRpa21yfHz/cW17eWp28ezo5/H96OPm7fZ///3/eG10b3P/bW7+7+7v+G9vdG94+vH6 +endvdHt3b3zu7vDs7fzu7H/7emNqcWxuevF7dP14c3F6WVTG2kdczs9SQfew7TVAsLEyLsGp +VS/drc4yQrrCOz3QxEk95sVtRvfJ11xj2l9m4GVc09hdae3bcFZO+9NzUm7V1ezj0WRl8WBv +X09QamnO5+jNyOlQTFbY505VzMjjatvM40tN5PlITt7ccWjfzth45X1gX19XSFBm+N/fYt3E +6F7cyd9hcNfaVE3311pMbdpvVHzY3nt6z83ud+f+UFJmXFFk5/Zz4NnhdF/g6VJa53ZaZ+jp +4u3Z221d+/NsZl5d3ude/9Xldd3obnvs5+F3YPLnZ1li591oUuvWdl9d69prW/nueXpkZejs +Y3H/avN0V2Tq9Gnq3vPd2t/f4Pj06+1/XVxqaVxdbOn+X/fi8/bk62/s4O1maWpt6l5R6dRr +XNvY7u9p59xfWvvlZVlq/+p7c/3e3/7+bPXsX1Ro+nJqeuLY3Gz85ORqWnvj8Gdj7d7v/Pr+ +fX1sbvz04/1oYnN9ZVlmfP53a+PkcvTd3u35fXx5bnT+729p9/107N19eOp5ePd9b/XvYmXu +fF1u7OPndFxq3u5t5uHl3PZRUvpnWWZmbOVuUV3h3unp9PDf3+/85+Tn82/97+7u5dzWz9Pa +4+nf2NTee+jw7m9HLig2OjQ6Ss+0sL3Cub3aWU1PXvd5ednKxMLHz8/Jy9ba5e7e0trhzcPK +Oh4dLCwnLUC/p6Svsquvv3E3LTU8NjtaxbOtsby/xc/xTkJH/8vGxr+6tra/0D4fGR4lIic7 +wqadoamoqr1LLiMjLDU+37arpKaz01hIPjk5P3S+ubu5uLe2vd9MPS4kHh8mLjzYsKehoaWs +u2U0KSUmKzd1uKyrrLHFXz83Nj1R58e6tLG2vMLL1N1oRTs4KB8lLTRJy7mso6SqschCMCwo +KDFIzbKssLq7w11CPj9cy8TFwL7Av8PaWnnU9llOPC0lJSovOVHIr6Wip669Zz4yKycrOV/B +ta+usr3M90pIV2No7NHJwsPN1M/Kys3oVF1NKx8hKi86X8WuoZ+mrb5VOzMpIyg2WL6ura2u +uNJcQTpCWmfyysPDvsDO29XU0tRcRUg6KCIoLjhkxLmro6SqteA9NS8oKC8/3Laurq+zvuVh +UkJHVVdm39bW0NPu4MzJycXGzt9LLCAkKi45U9i2pqKor7vtSz0tJikyQ9O6trGsrLbE1l1E +QD08RVlm78/KxLq3ubrD5Es7LCAfKC43WsW2qaGlrLPJTDwzKikvOUvKubaxsLi/xNdNRERA +S19cVfrNw7u3tra4xltDMSMfJCouP+a/raSjp6u330s5LCcpKzJQyby0ra2xs7vnTktCP0ZD +QlPfzL61sbGxutRbOSUeHyMkLUXfs6OfoaKpu99KLyYmJyk3a8y5raqrrbG91FxDPDs5NztJ +bsm5s7Cur7XBbjUkHR0gJS4+8bWmoKChqLXF9jsrKCYnLj5cy7auqqapr7rNV0A6Mi0uNUXb +vbOtqquuuuI9Kh8dICMoMkXWsKWioaOpsLrVPS0nJCQqMj/kuKulpKeqr77mQzMsKy0zP/vA +tK2srK+4yUYpHh8gIScsNGyyp6KenqOmq8NBLSQfHyQpNWW8raSfoqarufZDMikoKy47bsm8 +r6uqq7DKPiojIyIhIyk14bCnoJ6en6StyzwqIR8fISgzW7qqoqCipqy20kUyKyosMTtM48Cy +q6mqrbphLyYiHx0eIitJuamhnZydnqa5Ui8kHh4fIy1Az7KopKKhpq242UM1LyspLjZI1r2w +qqiqtOwxKCYfHR4iK1W1qqKenp6fqL5UNygiJCIkLT1mu6yopaKnrbDBTjkwKikuND7ivbKq +qa21yjkoKiQeHyQqP72vqqCeoKCkstpNMCUlJCEnMT7vt6yooqOqrrXYSTwvKi41OUzNvbKr +rLG43DIqLCUfIyYqQsO4rqShoZ+kschpNSkoJiIoMDhQwLGrpqWpq66870U1Li80NTpP0by1 +t73B/jw9OSknKy00T+zQtaqop6ars7vLRTIyListMTRC2MfFubKyr6+6yc7oUUlGQD9KXVdM +UnjnelJJWPFVRVVxXFBq4Hhp2MnVbfva3eDf087b5dPP7GNgaWVaZeze3NrX1Njd6mhXVFNQ +UFNg7drPy8jHzdjlZU9JRT89PkFDRktW7c/My8nKzNLY52tp/Hn72c7JxMLExsrP3WRRTEhG +R0tPWXXe0MnKztLdblFHPz09PkBESVX52M/OzcrM0dvqaWb4+vDf1MzHxcXFxszT6l5YUUxJ +R0dLVV924NLNzM3P2epuV0tFQkJFSEtSX3Dr29XW3ObueXn26eDZ0M7NzM3Ny8/f92tbWFRR +UFZkcu/h3dnV1trh+WhfXVpZXGRnaG5tdG9oXltZT05PTk9WafXm3NLPzMzP0djf6flnXmlv +e+bW0M3JzdDP3v5xWk1KSkE7astKXcDL1cXW5stsRExGPEBEQEhXaObd2s/EwsrQ3N/hb1le +YWna2+3Zzs7P2enh33BaVFZebF9+3M/NzszNztHuV1A/Ojw6NTc8P0/46cu8vcC8vMHBx9/p +7ltMSkZCS0xIVfPa1dHMxb/Ays/KzNx5bXByaVpf7N/felhIQUk9MjQ5PD5FSPK+vb63sbG1 +vcvT3FdAPT09QUBBWenYz8i+ubq+wcfO4VpMS01KT2jl0M7V2epKQUA2LzAyNj9NYMm5trGu +r7S4w9p4VkE6OTg6P0VP+dXEvby6uLvAx9h9X1BLSU5ZYfTa0M3Q3FZDST0vLzMzOEFH7L68 +u7Ovs7S7zNbbUz9APz5GSEhd393Rw768vMDHyc3mYFdTUU9OU2fe3Pbm2WBIRj86NzY3PUVJ +as3Dvbi3ubq+x87Y/V5US0lPT01OV/za3OHTztTa2NXV2+r9+PV+fnHc1Njf3dv4UUtLQTw5 +OTxDRk1819bNxMXEw8fLztPe5e5vdH5saf728/5sfOzn8fvu7Ojo93H97+/v8eHa5eLf3+Zy +VE9OSEA+P0FHS01Vb93R0s3IxMXJyMnMztXe4+dwbWVhXmFaV19pZGZtbG/09e7h5PTr2d/d +3ef37/tmZ15UVVpWTUxOT1FSUldmbnjm3NfQzs/QzczP1dPX197sdmtmaF9cXmJlZ2Zs/vD6 +/u3s/fLv9/rqfm7z/Xz4emVjalxTT05NTk1MV2Zr+t7c3dfT2djOzs/Q1NPY4+np731tX2Rm +Z2hta/vm+H3l7/xqb1tjcWlzb/n78+9sbnJoY1xWTlRRTk5SXGd28+/d0s/T087Oz8/X3N/q +829veuzm4uXg6fX6b2NgamVeYHdyefN0dH5xfXNtXFdbWVlWWl5cXGlnZW7/7+ji3eHc3t7d +3N7c29/k4N7g6eXk4en85ebm7vJxaV1dZFtfaV9fXVlcXF5eZ2xrbm5laWZqZ19p+Ovg7+bX +19ba1tze3d7h7X7s5n52bOzt9vfsfnJqbWJpamplYWxsamNfaW1nbGhvYWllbGppcPzu9fl8 +fuvp597j5tfc5dzf3+Xs7u758315eG5u+2l6dHn8dG1qbWFaXVheZHh9e/d35/Xu9HZvev5v +ZWx8/vH78eji5Ozr5eTr4fLre/lzeu317nf7/vTw/nz+Z25uZWFjaHJq73Ru/f5vc/93/e78 +bGl0dHFnau328fz87u/v6+bs8Ojz8Pp99ezteO37eX9t+W995uvqbHj3939ka2ptZ2JydnFq +ZmZiZmxoaW7t6Prt8uPo5+Hm4eDb4+3n7fX4ef5t73x3fe9vdfz/aG5oefZrYVtbXVxVVl5u +7Ovk39ra5efh3Nnoeu/v+f39c2xubHJ97nzx5eno5Oft6ed8cv/tc2RqZVlPTUxNTk1UX23f +0MvKyMnNz9vz+vxlXFtVUFNZXmP75d3Y19bb3eH093lvb/729ujb3eDg2dfnW09TTkQ+PkRL +UFpz2MvHycnJzdTpbWFiXlNSWlxgfuPa0s3P0M7P09nm8e9rW1pdaHbw5NvZ3OVqXVVNRz8/ +QEVITVv+3tTPzsnHyMvQ1d7o+mtfX25xaXr6+/P39/Pl39/j7uro4+bl3+De3dzd2drj+mNY +TUY/P0A/QUVKVWTt3tTOzMvN09rZ2trZ3+jn4uz07Ork5ePe393e3+bp8O/r/Pjv7+vs/Gxn +XU5NS0A+QkJCSE9Uad/YzsrNzsvP19Xc6ung3+Dg39zm5dzc3t/d6O5+Y2BoaGdubH3u6N/f +5envXE1MRj8/QkFGU1321tLRzMrMztTc3unx8Ptuce358uPj39fZ4+Db5vH6c2t67ff5d3X1 +6ODf5elyUExQRT0+RENIV1tk4dXQyMfLycvY3N5+anZycP3z8uji5NjV2drc3+jv+nJnZGht +dW917uHm7+jvW05SS0BAR0dHUV1t49PPzcrM0NLZ5O/6bGJz9PD68eTg3eDe3HZe3uFr6tHN +0tTUzMvS2dr9W0g0OUAyMzlETXbs1be7w768xND3SUtXQD1OX2Nz3NHBwM/HwcbR2/d1dU5N +XWFq6+PSx9bqzsrmXVNKODI8NzM8RVjqzsm5tcHAvct1WExITkhEXuPj1MbBwb/JzcvuW1lT +U09MUnh+/tjRy8nVz8XXb2BTRTIzOzMzPk5f18m+sba/vb7XU05KREdBSnPyfdLCxcTHzczS +dV5vWk1UZvPs+NnIydPRzM3qdvNURTc2PjIvPE9PYMrAubzGv7zPV1dWRUJFT/Tv9c2+w8zG +xsvbfXf+YU1TZGBddNTO0NTRzMva5+JeRDg4QTMuPE5LTtnCur3Eu7jKZXJtS0FDTF5ZVuPK +0NDGyMnN2drZdVJfaFtm9NnOzszGxc3P2VtOSjUyQjQtPklDU9rNvLnFvbjPW/hsRERMTF9x +Yt3Gycu/vsXKzdrz/VleZVVXae3/5NHS0dLc6WhYTDw7PjU0PUNCTt/OwL7BvLvC1tTVW1JS +UVlbZO3Y1NPOz8/V2drg5m9iZV9eV1xmZPXj3N7a2OXw+mVSTExHQkFHTU1Y9uPf2NTY29Xf +9efo+u3h49/f3N7f4ufg4uPh4vL67O7p39ve5drc5t/c4ev/al9NRERDPz0/Q0dOZXVs5NPU +1c3P29bV3eDY1tvV097d3OTk4uLz8u349/v+e/f9/uLk+fb28e3v+3NoUEpLRz4+RkZDVu3n +4s7L1tDM1eDd3/zr4ffx3d/n393d3t/f3+jq6O96eHd2/e/o5+Pm6errf25sXk9ISEc/PkRM +Tlfz5N3PzNDV09nb29/g6uvq8eze5e/h29/j3N308uTqfX7w+XV2fvvq5d/l7X5iX1lMSEdE +QURJS09o7OPUy8rLzM/d5d/l9vPxen7p9Xrn2t7k39zc3d3s/XRye21oa/nn3t3e5OjuaVpQ +SkZDQkJDSVFfavrb0s/Pz9DU2dzl+fns7v766uXf3N/i3Nvb19rf5fF4cHV4cHNwcffl5fhu +XkxZ+0M8RkhIVVJSdu/dzdDY09HR0972f3386fP06Ojp4tza0tLb4eLl6+z3a21va296fnzr +6+z5/ntaUFJNQUFHR0dPYm7s3drb2M/Q2Nnb4Ofh4uzo3Nff4tvc4N3a3ebh3O53/Whdandp +ZnFpYGRoWlldWlNTVVJRWl9cY3H7fvvq4eDh397d29rd3Nve4eTl7uji4eh67uzv83huZWBk +X2BmZ3R8dXP5/3X9+Pj8/Hpub2tiaGZeafn9eHZ8b21sbWpu/vx9cHvr5OPl4d3c2d7g6O3c +7W3q7WlxeHDv/WtsfnRqZWZtY2NqbWtpaG1+eHL76uPu9v92e3VzbXZ/+Ox6b/7w9vbs6ez7 ++nxx9vL2eXBxeOrp7O/r9vzy/HV89/5zbHX38O74ff37fGtiYWl0eWhlbmZgYGl1ePTs6vHs +3uL68eXq6Ol+cHV8e2p57+rj6/7v7Pp6bnF8+3Ztbmpx/n1wdPf2/Pp9dHl5bnF4bm9za2dh +VX/P4W5j/d7gfGB23+5ub2307+307+9e5NLd4n365tjua3t7e2xmXl9qZ19ZYvT5ZV5nenfr +53Vvae7gbU9V4NXb7W/u2trn7/bv59fXeE9V6t3sZ2V26+v1d2p39HZnYmZhX2Zja+7r7uft +8PDtcmty7+Xs6+7x8en1d21o/vR4aG55bmtrc/vf3ev+bmh46/Rv+/L4fn5+cfbp9+bk7Phn +aHD7aW5oY2lv+nf7a3n37XBm++fe7/P773liZPPse3du9OXk3eLi5+jc4/plW1VdXmJdWGH1 +29jW4Pj04+NjW1pya2lqa2hk/nLy+37o3+rr5eLm5epye9/c+WdZXnftc2h5+efe3eh3bmNd +YGRdWV1kfNzX7mZvfOrhcF9m/+3a2uB1bfvs2997anh48/n7ZmdrYGB9f/Dj+G167Gxnd/Rw +du7kcl5s7/bu9X15bn5qbnr+++30eOXzYWre3PVoXmvp4e7sd2f96fpjaGtuX1z82tjo/Xvq +5O3k3m9XWmZpZllUcNjY5m9u6dfkbmFZW3bk9mpxePrf3NvncWv85N3ef11bYPbtcWxfWvvZ +3/l1Z/rqbXToe1tq+vptfujzeHNy7unvcWBt8uro+W999fxtYWHw3uttbezo7uXr/n7/dWd8 +dG5obfbt5vluZWF44uJvaGtodOvd4+Tn/f72+255dHB59nh27eny7fVwbXR4a15cWlts7v1u +bm1+6+rs4extbPDp+nV+7uni3N3d4+zr6uf0b29uZ2VwfG5ramtsaGNra1xbW1pXWGF76fd9 +493Y1tPS09Xa4OHc2tvb3M/JztbUy85oPjAqKCwxNjxXvq2qrK2usr7hRjQtLTA4QmLJurKv +sbe/zeRURkZJT17nyr24u8DQQicfJS8uKTHHqKWopqSrvm9ALSMjLDk9R8SrqK61trnKXkg/ +PERy2t/MubG2vsTVTi0eHCUvLy9ZrKCgo6WqvFE6LCEeJjpk0rutp6mwv+tOR0A7O0zWw8XG +v7u7ws7X3WpKOioeIDdcPjrAop6osrjAWTovJyEqVMbRyLGqr8TtW09TXlNIYsC4w9rb1dTU +0dv13s3VVjYkHitNPzFQqp+msLa+/kI2KSQtcsHMwa+rsMDhTUhRW0lCXMW+zebc2d7b1s/O +zcrUYjogGy3sQy5ppJ6lrrrbS0IzJCIyy73Ct66uuNBHOUBdbVRixba3yHBkfmZaad3PycHK ++FAxHh88VjM4tqOlrrvXYVc/LCg22b3EvrSvttJLPkhzfGBl0b68zlZQa/Xs7NnFv8zY1l08 +Kx4gPFg4Ra+hpKy661VSOSkpPdK/wbqyr7frPj1LUElP5cO8vsvc6OR3WmrNwM3TyNVYQS0c +Hz9NN0mvpaarvF5qazkpLD/hwL6+ubK4Xz5MaFlX5M/Fv8vtdGpbV/vWyr/Bz87TVj8wHx43 +aDw/uailp7T2dNlEKyo1R+HMzMK1ssZ259pmUVZb3s7V5N3PzdHY0svL121d8HRINyUhOGQ3 +NOmzrKu2zsO3zDkvMjpJV0xouK60vsPAye9OP0NXWVPvy8O+wMjLz/JdT05NQ0E1KC5SSDRG +0L6wrre7r6/LSTswLzg3M0vBt7Svr7a8xlY8Ojs8P07lwbq8vbq+0OLnWEI+MyovQjYuPlzn +ubG6taurtcZmPDc4LyszR1fNtrKyra69zthdSEhGREpRUFNVUVlsdvrVyMzR0dd3UkY8O0FK +S1F30MTH22vr2ONpau3WysnQ1s/P3vtqaW/t7m5vZ1pWTUtSZvTczMfJys3iWk1GQEBERkpV +aOfW2nBSXeva1NfWzMTK7mhiYHD5am3m087W6PH2b21kYvnh2tTP0Nnkc1dQTEFASEpLTUpN +XGVZV3bYysG+vsHFzNv4Xk1HRUhUYfnazMjKz9zf3tvY2ODl09He8O9xWFpRRDoxLzY9PURc +17uuq62us73WSzQrKy41QljavLCtr7a9yOVRQTs9R1V53M3Bu73HztDZ9k86MCgnLjg5R8y4 +q6SmrbO+eD0vKCUpMkzcvrOsqau0x+pNPzk4O0Zt0srEvLu9wMnU6WJFNC4pJSw8Q1XEt62n +qK+6zU45MS0rLj3txrixsbGzvt1aRT4+QUlW3se/v8HBwMzm72hPSD0zKycsPEdW0cK4rKmt +tcPwTD84MTA1PFXPvrm1tLW7w9BcR0JCRk9g+tfKv7y/x9Hb6WBIOi8pKC42PE300LywrKyt +sr3N71E/NzAvMjpHcsq9uLWxsLS8z15NR0JDQ0ZOaOba1tna3fFeU01KSUpJR0hMU1dm6NPO +zs7OzMzR2vNhX2386+Hf29PO0NzteGhiaWZYV15fYn15cuzY1tzd5u7vcV5WVFhaWVtdXltS +T1VdbPVxYm/u3dbW3vHe08/O0tjf3NnW1trd4uxvaF9ZW1teXlpibG98f29pfXhlZGlcUlBQ +Vlxkbm1qcuzb1dTQ1dnc3eL8/3764drb1tbX2uHyfWxhW1dWWF5mXl5q/uvf2Nvf5vtmXlxd +WVBOTE5YX3zj3NnZ2+Pp5ejt8X388+7p4NjU1NXV2uDp/2thXmReYGpv7eXh4OT7a2hjXFlY +U09PUVVaW15dZW7t3tvg7ePj59/h3dfa29nU09jZ6HJucW9oaXF/8ezt73xtX1xbXWp2/Ht6 +9vd7cWxnXllUUlNVWV5dX2dw+erb1c/Lzc/X4e54ZF1gbfjq5trUz83O2ev/aGJjZ2ZkY2Nr +en5vZWBeW1xbWldVUEtLTk9aaP3f1tLQzs/S1dzl6u3t7uLf39nV1drd4fN0eW5pZ2NdX2Rq +bHR0bHr18+frb2VcWlVWU09PVFZacPjw6+jq9+3o7fjs5d3b3NzZ1tTS1Nje5O52amNhaH34 +bXr3f+ztemtsb2tvenFnXFpZXWBeX1tZVlRYXGFjav7w8Orf3t3Y0M7NzdHX3eDi6Ozq7+zv +fPx6bWlnZF5eX2hjY2Fna2dw8eTz/PHydG1uXVRUV1teY2FibH7o3tze3t3h5ujn5+Le3Nzb +3N/e3+Ts6PJ1bWlkXFxjYV9oaW599+zt+X50bmlob3hyampxb2VjXVdVWmNtZHbl5Obi3d/j +5OXj3tzg397f3dvd4eXm6npnZGVpamdpa2llbG1mbX15fO3s/WhYWmJgYmJkY15cZGj992lp +fff47Ofaz83P0dDX2+bq83Rxb21kYGdsdPfs4+nr5d7Z29zfd11cXGNyd2tWS0A5NzY4QVfd +xb25uLq7vMDM6FlHPjs6PUVb3Me/u7i5vL/H2PhcTUdGSE1Z/djNycvN22pLOC8rKSsvO2LF +t66sra+yusXcUj44MzAyOkjqw7iwr7C1vMncZk1CPTs7P0dZ3Mi/vLy+xM3V3V0/MywnJics +OWi8rainqKuyvdNRPjQuLC0yPWPHtq6sra+4xNpeST47Ojs+SFzbxLu3t7u+yulOPDErJiUm +LDdYwK+qp6eqrrfH/UU1LisrLDNH2bqtqqmrsbvNaEk+Ojg2OD5Jas29ubi4vMLL6E48Lyon +JikvP964raimp6uvvNNZPTEsKSksNUjQtq2rq66zu8xvTD87OTg6PkvjxLu0sra6wM9sQzMr +JiMlKjRRxbKqp6eprbS+1005LyooKi46YsKzraurrbS9zWdJPjk2NjpBY9TCu7q6u77J2U48 +MyooKiszSO2/sq+urrK4vMrsVD83MzI0PU/jxLu3tbW3u8PV/k9DPz0+RE1XbN7OysbIztfm +b1hNS0tKS09TUU9NT1NWXm/z5N/a3NzV2tfOzszJy9DW4O7/b3B2e/7z/m5oa2NjbHzu5eXo +5u9xXFJST05UXmRob/NxbO33bm5taG5tYmtu/d/p4tva2dvc4eTl4N/o5+p2bnpmYHv+dOzr +8O9zdvj1+3Fvb3dx+3p1c3BiYl9bXV5mbHf87fX4/HFycfvxdXx3dP/s7eHW3OPe3ux8e29t +Z25vevnw+u3q/ejo9fj4fmtuaWhraWZu9+no5OLo4ef3bWJaV1VWVlhfaHvn5/Xr4Of79fdt +cnX49Ofh39jX2tjb5d/b3uvu/GhlXFpbXVtfe3t8+ubwen1pXltZVlRXU1Zp+eDa1dXU1dXZ +6vN+fG9rbWhmanv+5ODq2t735/L+eHf6dWNoaGdpdO716OHi63poYl9ZVltdXWRrbXjl5Nzb +7u30feztdvrx9+7z+/LpfvbmevTmeG5+aGR1b/nl6fT083z1fHlka3JuaGh8Z2bu9HTq3d/r +9P5nbm5iaWZ873pz/+ru5O5s4uVhXmhve3T++P79+Ovx6ujf3+zr+25vdG1ndG5+7vfs6ens +7XdjXlpfY2NiYGdub2/57Orq6erz9W9s+u7o3dzo6ePg3+ft73/zdW5pZWNlbW5qZ2lnZ216 ++35+bGdhXWt3evzt7+7s5N/f3eDg5fX8+Xt4//x9/Pf6dnlucXfyeG1ybF9U3+tg/ePr9e36 +4edrb/lzbV9jb2Boanh1e+7r5e3v4uP17u98eXN6b3h+dXX/7+vi5P3r7nt5dHJqa3Tv7Wxt +8uz78u5saWplZGZrePltcH59+Px3+O/x7u59d/v9e3T65ero5Onr6uzt+Pf2fHtucXV8b2dw +bW7+8v5pbmRodnD87/H8/err83tw+vry7fZ8fvb5ee79/e3/em51aGp2YGBtfO7s5+ru7/np ++vzu7vjy9HTtfXl5dHr89/f/bGphYWFq/nFu+vL+8+96d+3x/X76fHbx//v39n35/Xl7cPz3 +dv/u7vP89Ov193Zudn11a3Budn7wa2RscP74f/nz7+t8aW5+d/F3Z3N28nj19Xjz+/l2enhq +eXju4OXqdnl7fPHv6nt+83Z77fLy+Pf5bm1ye2psbmV0a3h0aWp29/f58HxvcXV5efLu597h +6enp73tl5Nly9O13ZGtjduxybXhtZ2dlZ2lqdfvy8+jl6Ozf4e/wauXsbHn59nzfemFkXVVt +cmD2++/b0/v65m1qXmheWmh6+NzU09PU7f3e4/1kXmFYV1NffOzj5ef+6ej3fGtlZVtdX2Rl +Y3h8+/Te3O7q6Obi5+bu6Od17+zw/Pnr/ufk7m5u+W1neP94/Gpofe17ZWViXV1aWlxla2Rf +aHFu8err3tzc2Nfa3tzh6uPh4u5zeP7t+3z36vJvdvDy/fd5ZW53ZmRaTkRHTktJS1Nh6drQ +ycXGycrN0NXldmJWTU5QVVlk7NzUz9DMy9Xi4N/3amlpZV5jaWtv9/J0WUpITUxDP0NKVWXz +3M/Jw7+/wsrQ2ehuXlxfX15fdd/X2NjX1dbe7vl5aV9eXVdWX2ly/PD5ZlhOTElGR0pOV2X8 +38/LycXDwsnP1+XseF1RTU5RV2Ny89/XzcrKzdHX5GlebW5bWWBucHL74d9mUEtKSklFQ0ZL +VFz918zIxsTBwcfP2ul5ZltVT05OV2T95NrT1NHNz9fc5vptcmpfYWhz8eDf4uVpT0hGR0RA +P0BHUl/mz8nEwcC/wMbR5fRtWVJQTk5SY/fj3dzXzsvNz9rv/G5eV1RXXGXz4N3a19vkZk9L +SkdBPj9ETFr32MrExcTExMbO3e52ZldOTExLUmbr2tLOysXGyMzW53VkW1dWV1pdcufd3fVa +SUE/QUI/PD1JYNzJwb27uru7vsndZFhPS0dEQ0RJVunSzMjHxcPFy9TiaVROTU1OUl3r1srE +z2dCPEBGPTQzPFLmzsS8t7a3trnC5lVNS0M9Ojs/RFHhx8PAvbm3vMnfe1xNSElKSk9s08nH +zNbqVT85OTo4NjdF4svGvreys7i9xN1VRD49Ojg8S1xx3sm8t7i6vL7K5V5PRT4+RE5YYd3G +vr28wnw+Nzk6MyssOWXTy76yra2usrvUUEQ/OS8tMj9NUGrFtLCytra6xtxqTD47PkZOVvHL +vru6usZzQTQvLi0rLTdTyLy3rqqqrLS+3Uc4Mi4sLTM/Yc+/tK6srLC7x9lYPjU1OTxCUOrJ +v7q3t7i9xNc/KictLyomLWS5uLetp6aqssJSOTUxKyksPO3Kwreuq6yvu9RrWkU2LzE9UWLn +xrq2tLS5xM/vPS0nJSkuLzBHxLCrqqqoqrDFSzQuKyssLj3bvrevq6qsssVaRDw2MDA3RFzg +xr28u7m8w9f4X01NVVhBKyg9WzkxQci0tbSwtry5wk80MDo/Oj5Yz7mvr7a7vMZvTEE7PEVJ +SE7dwb/BwMbHv8hZTWFHNDQ0LSw3T15sxa+srrS4wdtcQTMuMTtGWdC5sK6wtr7PXUI7NzQ7 +TF/nyb++vsLFzW5QT09NT1/u18nEzkcsLD09MThNzrSrqrC8v8dfPC4rLz5ozsS7sq+wutZU +QDo5OkBP9ce4t77EydDeYE1OTklV7WhFQTwvMUNKSPDGvLCts7/R900+ODExP+bFvLWztbi/ +7kE7OjxCS1zgyb++xNJ6X2xlTUdQa9rNy8rGw8vbcFA/LSQqNz/nvb+6ra2zu/84MDY7P1H9 +2rqur7S/ZT8+QEBDS0xbxre6wtJubuLqZVth59TPz8/NfjwxKCYuPErWurWuqqy2yE40LS4x +Ok/cv7Gqqqy240E4NDQ2O0jtv7e4vs15TUI/P0ZX4s/Hwb/By91wVE5QT1BZa1w/Oz08SvLa +0MjKzMXGz9PkWVFfff3c1+/p2N7z7nBhWFJg6M/Iyc/Z39nc6mJSUFZsZWR3/+HoTTs0MTVB +ccm8uLm9wcnXZUg9Oz5Ke8m8uLe8yOlaSkFAQ0lg1sbDx8rZZ1ROTFBj+Oze19HLxsvV315P +T1JJODIvLjlYxrSusrm/0m1dTUE+PkRXzbu0tLrI+E9CPT1CVPfay8bGydDqaltTVVhe8dva +2djY29nb9GVSST0yLi4xPnjAtK6vtb7VVklEPz9GU+PGvLi2uMLiTT07Pkdd3c/Ly8/b63hc +T0xOWfvWzMnM1N/2bV5XTktOTko/Ojc2PVHOurGwtr7OcllTUlRZXF133MzDwMLP+FdJRkdQ +ceDb2eHw93Nsdfrs5t3a3N/k7np1b2hcVFNbY1lLPTc0Nz9Zybiwr7W/1WxRTEtNVGB+4dDF +vry+yOVWRT4/RE/329LR1Nvf7G5wbmFpZlxmfX578PF0eHpvYUc5NjAyPVfItKysrrXG9kxA +P0BGSlj4z765ubzF7ks/PDs/SFry29XP09ja3uL8a2phanz06d7Z3t7ifF9UUUxBPDk2OUNi +ybixsbS90G1NR0VMVmnh2c/IxcPGz2tNRD4/R1rr0szLzt75Y1lZWVpt7dzPzM3V3/dxaWRl +aVE7NjEuN0bdvbCvsLXE4VpGPz5AQk7rzLu1tbnA2kw/OztDTnbaz83Lzdv0ZFpYVltjd+bf +2t/i5nxpYmBfZGFTRD06NjxJesa3s7a6yN58VU5SUlRf69vLwb/Dyt1aTEZHT1x76+Ho7u3y ++2RbYGVv/unn5OP5e2RZX2hucG9eT0I7PT9O58m9u7u/w87peVlNS1Fj7s/JxcXM225bVVFZ +WVdaX259597g6vz9dG1sb2leW1xeXWBcTk1YVWji39zb5Xf57eLR0tnZ625ubm/r3NnT0tPW +3vBtamBdYWBmbnduamxseXtval5bWlZYY/Tp5/FfVVZYafDe2drg6O7x9H1ubnv04tra19La +3eD7aGloZ33l4uLucHBsYltdXFxhZnnz7/F8d21nZmRmbHfw8/rs7HpvcWxx++3n6Obg5e3+ +enP88vbs7e99cXdtZWl0++vm3+Hu8fR1ZWJlXlxibHPs39/h6vlrYV1cX3nw9Oz18fFyamZn +b37m6e3g29/t+m9ud3h1bG11+fj99eri4+7x83/z9PtuXltbX2Z09/Xu6+3o7fp1dWtxfnz7 +++/u7XVudm91bnRqdOns7397a2pvdf3v6ern7X759PPs6Onn5uru9fdtYmBeXmRve/Hp5OHr +/H1sY2RlaW1v/u7p4+r7a2JkaGpu9eXg6O3r93x9dnFyfe7z+fh7c//v8f7+6u7y5/P19Pt0 +bHr+c/ns7vx3fGtmYWRramZrcG5wd3ZveHd99PDn5OPi5en0+nJ09vjn3d/l5Onv7npqamlr +cHBsbGFhX19jZWlrbXL27PP++/Dx8ens5+Xo6ezs7ers7fP0fGpqbWx69H5sZmlmZmptd/f8 +cW52ef3y7+3u6/N7/O3p7/z7dHvu7e3u+PT3b2poZGv783t3+PD7dXh4fHp4bmt3/n3+/ezn +6/d6cXP+bGp3cHF5f3x1+u9xanX59+/t6ur69PPz5+Hi397reHFtbGlnanZ9bmlmYmdnbW1n +/vD1+PN9een6dHv+7Ovu5uTr+nJ09f1ufO3v93xsa3f+f/948Pd4+nxzdm13end5eHB8fvzu +6u/3dnd3amd58fz28O3k7Hp9+3n79HTx6PJ3cm9wbm138fdtcm1udGVq/Obr8erv8fJ77u33 +9vVxevLz/fz+cHF2fntyc3h4d3l2b3h9/vr0fu3h7Ojq9vzn7WRof2x7+2dnb3Bzb2dpemhr +7nvp5+zv9Oj67O/k3u90bf7v7XVu8vZ6b3L3fHxucPduYVxfd21s/vbu//n3+PHv5+Pl6ex7 +/O95aHv+8/pu+et3Y2Zic+9yc/X8/vh5bm14/O/p6/lmavbw9vTx5/hmZ213+Ov5/Pn96HBu +e3vu6+n/d27++G/6ePF7bfVvdOrtbG95fP9z93z7/W/7cGzn5O7t7+93eWtfevt1b315/PFu +9/p1933w6fD/9+ny+2xr8nX66O31d/Hn5/J+6ux3ZGF1bFxbbPt4bn3g5PRuZXTx7vP9+/Zw +fPJqZnrue3J8+O3q7ezp8Xl87f109ud1c3hy+nR+8X5vbnxuZ3JpYnV7ePbvfe/j7Pv5+P93 +9n1s9nL8+2fx4XtscW5u9en7evPu+Xp1ZnPs725u++nneX3z/nhv93Vu7fVtbGto8Xdg//Vu +8OHrfPvr4uh89ndlfelpZfrr8v15+ezf+Gt2Zf3uaWRwZ/LmbV9u6eT3amh2dm3+8e7s7+j+ +dun1bGxvZ3vvbvrz++fh5upucO/r8Xpv831q+nJcZ/v2/21t8ubo73N96OpycnF1Zl/xeXT7 +dfP9ZmVq7+RfZOnr6erw6eB9dd/1ZPtycvb+/Pdz9+ZxaefmZm38+OJ1XWr0emhqdnB+925u +ZGRueOnw8Onr6+bx6en39XVrfnxtfnB56ehya3Z2/XB+7fDnfG79aG7yb2r27PX1b273b3h3 +ZHB+d/p5Znn5+vp4cHjn7f7i5P5+a3ru7u/rfn3tfXR0eXV58nlyamvv9mty8u72amFv+flf +YO//dnl67O989evy9/vu4evv5+zxfm9y+u9tamtvfP1+a2Fn8eplaPJv/u516+Zra+vz7N7w +a2xueevveHp5cOrwWmLx6er5aP7g+GViePl/dXZ6dvT3+uzd7nt9cGlv8e3+enV07/1odHR5 +bWBz5m9f+t3o9fl8+/Px7u/w/ennf3P1dv7ua19/c279/vPvc2/6a2FhamxoamL33X1w8Pfl +3vJ45uN45N52+N3fc2x47exrXVz9/V1eaGf5a2Nt831y9mxze+nd733z797ffP/m6+98a+Xq +eW50///7/Hn1dGFtb2Vjfn59eGRo4exvfu7j7mp83elvcPt9X2B5dHRs+dz29d/0++5ya/Vm +X/t+bXPz9fb28Ozr73/65u3873Zs+3xtev14fnZqa213a3Dd9mj14+vo6XHz73teXnP8Z15v ++Oz6cel+aP3ubm59duvh+Pjg7P3z6Ob/++94ZvTt+efuZHT3bP3+Xmf6Z2pja+/y6vl7a3B9 +7/9o/3ptb3L9fW/35On49e3q7/Tq7u3i9P3n7P3+8fhv7Hlh7HFY/XRcXWVmaV9cdfX+Y27u ++Pru4ODj3d7t9efd2+Lv7/n0eWBtbGBpY2XvY1luZ2BmcP7s/md43eH43/hj6+l76/Fx6eht +e/1q7N5vaG/v6vFja9vha2/0d/Loe2j99njmbV5vdWpoXFho+3pqb3j8fGlw3uh83uZt7+3+ +2t115tfi5Op87d3vW1l6eVxYY/hsZWxkXvN/cG5oaW3reGT57vXg5PL35eR6duzq8Xl/8PDk +7PPkeGzn521cX3/rZFh+3Xtid+7ecF7/+11c+mxo7/P773t+6tvf729cc/H49P557t7kePfs +53Jl/nxx92pm8u708m5kdun3WGfc5mJr5uL3bfDjaldt6PBqYvXc6Gr843r07W3s7m76cmt2 +cnD15nP+7Hx6b2r0fmRlbe/kdmN3dG9rae7j+3bs6+z87tzi4Orp5e5ub/H1eWdncHlmamlo ++nxsaWJq9u/27uhydO38b393dvxwb+zn82xf9+JfWe3p8ubo3dv/euXr/m529+1jWnV0b3Fo +9d53/eVvZur7Yn10Ze57XWZ7+vxyeuDld/ru821t93hpfvPv5Wxn5O7r7+/e+WT/8XJw7u74 +fW52+2hm92dv925zbF1v63Z6693f/v/veX1xZm5rdvF7env07n37d+fmZnvq+v5mY+3sb2fw +3O7/9/bp4ntx5PtfafhtaG1dbuZzbu9+/el2ae3vb+t8auLxaH3q7nBjZWxvfnZ57Op2eOrm +7vx16e5nefN06uRycOJ9Xv3zZ2H+5f9lbu3d433s1+Jren1qbGBcaXdgad7rbWz273Z2ZW7v +eG/x/ujodPXj5P15++/3cnvza29++nly8PduZPzwa3D37/P7bXze6X7k7WluaGZwaV9063xt +9d/k+ujndfr6b/j7a3jueW/0fPryde19ZvP6aHD6fvrq7vX9+fxvbGthZfPpfnHk5vv0bGj8 +8vp1a3jt6/9zf3z6/W3z5+z58uju7fT4/GllaWZva2Z37t7e/Xrl8nXvfm52d19ke3FnbfTx +fnNydPv7ePbw/u3z/+Tq+vDt7O3z+/fk7XJ0+vNsamtpa2txaGhsdXBt739p+Ot7c+vwbm7u +7G/z6fb28PTz9nV5+nlr7uX77PH16+9vbfp8amVxcnx+/vtyenl4+/T/dnRx9fL5enf78Xv7 +5+/9eGpp8/lrbXn5ffrw/ObuaPnrdmjy6n7y7fd39H9+6/J1/fpjaHtva3vv7fj7cWpvc3t6 +c3H27H1sfv1w+fR+8/57fvjl6Ono9X7w/G/48Hz98GdieH1wa2tt/P9zdXxxdfX1fG5t9vdv +9uzs6PJ97Ob8fe12aWxv+/r9fnJucm/17np99/L3eG9tb3h7+O95cvf2eWxmbXn66+zo4Ov+ +/vH1dfrp7X56b2ptd3rz82tqc3JpZGt2f21udnF9efno7/nk4u3z8v3u5+nn8f3+8fJubHB2 +bWhte/78cGV3+29x9/d8+vh3ffH19vp0bnduePtzc3zx9Xzy6urq8Pbt7PTy6e1ycv78cGRp +a2tpbW9tenJwefn+/354/u3p9ffyfvjz/fb7/e7o6+fp+nRz/fh6bXN0aGRkaXj3/v73endz +c3h3dXd6/vD4e/pxanr08vL19+rt//7u7PTs4fB8fXdudHN69PD2dnNtbnh8cnF1bm1vbGhk +cHx2c3J98vd4c/Lt9u/37+zm6/zr5eXh6O/s6vT+fG5iYm1xbXFwbWhvfW5qZGFoeff2/nd0 +d3p8+PPs5+no5eTvcHH+/e3m4ej9+O/7dHr39Xh2dnJyd3VqYWJpb21pbW1wefj38PTx7PDy +6+fr+/Lu8/bt6fr3em9++vz08nhucHt4dv18dnh9/X17/u/t7vjx+XNzdHFvfXtuZ2pwdu/r ++fr8fm53/Hd+7Pl37u/18vDq6Ovt7/JxanRxZ2lxcnh88/Dt6/h3fn93c3n48/52bm99enFy +dm589H7/9f588PH+e3h6d2x08+7y9fl8d3vp6HVv+/d4bHLu82lkbXVqafbj6e7q7f/7b23q +5Pd2fff8d3l8+ux5ZWVua2dqfvX9bW57dHj77u/u7O/w8PH3fXx+9OnteWpsfPH1e2lqcW50 +/f5oa/76fXbu8Ph4au3k8evsfnZ4b259fW1z+X9ye/v8/Pz76ePx+Pb3+/tvbHRxcG13fv/4 +7Ojt7eHm+3F5bGx+cmVjZWJjbXb36v587/R4bHr5f/z87ubn6vHs7392cnbr4+rp2dLY6ubl +em9+YFteVlFOVlVHSnPsdeHR09LddOjdb2T77+jmbmvd3fZ0/+zsfHHq293k5dnV4Ojl7XJp +cWFsZFpbVEg7OFjuTF3Gv8vXcOrRbE1q2vx3fHnazdneztTrbmfw2d7x4s/Q5/z26nxQXOxw +695ILC9QSDlbvbi6xtnAwkg7U3xbWF7qyMne591qSURS5tLNysK/y/NfX15ZXfPa1NDPz9np +Z1hfWD8sLEBTO0m/trnC49XA+T9N6O9lYnvHwdvh0/FkV0liz9zlycTN32NdblRMZNjPzM3L +xsnpZkAuMC4rOVD3v7a+vrnRVVhPTF9kXtPGz83Jz95oTVLydvXPx8jL2WxiWlFTZmv41s/N +zM/Nzf9QRTAjKEFCRcSurrHC9c7nPTlPYFVaa9C+xPlk1tdPRW7HyNnPvbvOV1bh9k5P38DG ++9PE3ElLPS4tKiw95NrHsLW8xdRVWUpBTt3m2cjCwcl+Udf4P0jezMnP28C/XUdeYlNOUvrK +z9jIxczL0vDqUC4uMSYrXddvtq23usdTZt89OVzj/M/O076831hjSkhhWu69u8a/xndVRj1N +++nPwb65vs/N9zw2LywpIzW+4FW0qLfFbU/jYjQ8y8r23tfFus5a6thZSVrYw8rdzMDPUk5d +XFdW78bEzM7Ex/BaPzQ3NSQj3sRE26ytt8JN3MFHLkzcYFnqzri57HvO4EtFTPbM5urAvNRc +V15iUUrhv8LJw8DE2E0+NzQyKCNdwUf3rq25ulllzk8uQ/VVTu7RvbnO2c3UXUtOa9P55cW7 +xtrg4+hYSW7J0OXZycxsRT4+PTQvKzbc7knMsbO8xuHFyUs7T3JTUGL60MfKysS/zvNq52FT +Tmfd5nvXx8zX5NznalJW/HZTSlhnTzw5SFdFP03h1+nl0MfGyM3O0dd+W1Nbavnr3s/Kzt7q +5+R+YmVv+vlsb/Hi5ePt5tbb5Ojj4+pfUUlKSkE8PERKR0lg2MzKxcPFytXyaVxYbfj+59fP +1NjZ0NHjdu/n8fbq2NDP2/7r3ed9dvp0aFtLPDY7Qjk3RWtf+dnMwb3Ay8XL13xbTFdoV1x8 +2tna3MzFy9XX1drraHHu7P7u4N3wbuPS3V5dX0k1Ljc8NTVH383Av7ivr7zK12hHOjY3Q0tM +b8W+wL27vsbTdl5TTEtXb/LXy8TEyM7MzPVbU0g/PDkvLj1EOUTRwLy3urSwvnhoX0I5NztI +eG7bvre6wcfEymVFSFhOR1Pey8nLwbzH8fvT5U0/QUs9LCtLSzdByr27u7+0scVPe2VFOjo+ +W3JP4r67xcTHw8tdTmt1R0xq19DQzb28zNzV019FPkI7NzItOvhCRcK3wr27vrnLSEzsQzc8 +SFrmadC3ucbIwcHMX0/0805N8NHN0dHFws/x3XhEPD07NCwsP0c7Tr22ube3sbTOS2pdPzY7 +SWpwWM24usXHwsLdTlRqVUdOX2z04s7AwMrMys34RENGNCswOTQ6T+K/t7ezrbPG0PFNPzg1 +PkhIYsi+vr27vcTdXnhYQkRPTVVeas7F0NfDw87T1dh4QjY4PDQuN0/+58u5sLK8vr7NWkI9 +PT06Pl/X2s6+urvAzM/ZX0lITEpLTVfv1dPLwcPKzcvN60U+SjwxNj4+R1FtyLy+vba6xNXt +XFJEPkJKS09s4czIy8rHytTj7eR1UVBfamFreu3h4OTb2u5hZHJSTE1PTUxRXO7s5tvV193c +3vF1Z19lberk3dnb3Nze3uZ0alxXW15fZnjv39rX0dLU2+Pz/mZVTUxLSEhLVmnz5d/a0tPW +2uj27vxmZ3X9/PLl3tzd3+Pzb2xwbG9zamrp4+/08PH19vru8XR8cGlmXmJkW1NWXV9eZX71 +eXvz5Nzh8+3l6ujs8eTc4+je2t3h397X1tva2v1WUk9LSkpKS0tNV2r88OHX1dbV1NXZ4u/3 +7WRQW21kafbo2NPU19nf9mxkZFhXXGZtdO/k2trk6OfzZ1tYU1RebnBvbnvv7fP+9nr/fnj7 +8erp8/f0/fPn5ejl5N/i6O90amNcWFlZWWBz8efj3+d9/nhvZVpgZl1eZ2t87e7u4dnU08/N +0dTY3ODn9HNiWlVRUFFST1BSV1xcX21vePLi3dvV0dTb3eXw9P38bXF9bWpjY29+7eHf4+ff +3d3e5uvxdWxqbWpmbnh4anl5aWNbTk1SUlFWWmBrfefe19jb293h397d3t/f4Nja3d/c2dnY +2dvd53dZUk5JSEZGR0tPVl1u8+Pc2dTS09TY3+rq6PT/+XtqaGxmYWJv/XHy5N/c2tze2trm +6/D57eji3d/sfnNfUE5NSEVHSElPXWT53NvY0s/Q0NHW2dfa5/huZmh09/Xv9vf47d/Y1dPR +1dvh/WNWS0dFQ0VHSk5XYnLp2tbQzdHW1tnf4uPveG9rZmlv+XZsbHR//O3n3tjX19fa2tzf +5OTo7m1bUk1LSkhEQ0RIUVxn89rTz87NztHS29rc5OLc4fb9enh4/HlpZWhqcfPp4t7m493e +29zk9HBbUk5KRkZFR0xSXGlz7t3Uzs7Oz9TZ293m6e338vl2aGhsffz4+erd29rY3N/d2dXV +2eP4dVxQTEhBPz8+P0ZMUVx94NTKycrJys/Pz9fa3efp5/R1ef5sZ218+ezm4+Tf29rd4uTi +4eh8Y1lQTEdDQUJER0tPWm3s2tXQzsvMzdDR0trn8fb8fXNsa3zz+O3s5NrW0tTW2dnd4uDp +7vV0XFJMRkA/P0BER0pPXvff18/OzcvJy87W19Tb4/Nyb25rZW13e3zu6efe2dna1tbX1dTX +3eH6YVFLR0A8PD4/P0ZOWXfZz8zLysjJy83W3dnje3d7f312aWBi8OHs893OysvMzMvIx8zV +5XJOPTczLy4vMjdCaM3BubKvrq+2v8zwSjw5NzQ1OkFY28u+s6+0t7m/215XVE9MWN/X1tfV +1E0tLDktJCxJXnnArqinrbKuukg3OjMrLTZL997Dr6yytrW830xCQTw3P2zj1b+2tLrIz9lC +LScqKyUpPN7JvKykpa2ztMZFMzEvKyw5XdrItKuttLS50k5FPzo5P09v1r62t7i4vtRlSTQq +KCkoKjNK076zqqersLXBVjs1MS8vNkzbyruwr7S3uslcRUU+NzxRZXHLube7ubXA2OpJOTMp +Jy4sKjrl2cOvq6qttLe+WDw9Ny4wO0pa3L2ytLm1t8j1ZU89O0RSUmLFvL++trjI4/ZYNysp +KigmL0RS3LesqaqqqrDJaU45LSwwNTlF2726tq6uuL7B3khDQz47RG3g38W4vMK+xW9CNy0r +KycsOD5Wva+tqaaprrfGZj0wLS0sLjlIbsa1rq6ur7TA2mRIOjk+QkhizL2+urrCy1s3MjMn +JC81LkDAubWrp6mtsbbHSzs6LyouNjdDzMK/r62vr7K+zPBIPz48P0dQ78/NycvRTDpIOCov +OjAzasvKuK6sra+wtsloUkAyMjczNEdkaMm5uLe0t73E0fZlUElMTU9g7GzfzVlATFAzL0A+ +MT3a3Pe/sri6tLO+z87iSDxDQjk+WU1L0cbOw7m+ycPCzdbW4l9ceVlNXltPVko8S0cvOWc/ +NHHGWW65u9G/s7zPxsN8Tm1lSkpWWk5V6+r83MrJyL7Ay83N2WZcVkVBQ0RDSl5ST/dhTFn0 +U0lrb1Bi19Xh0MbK0s3K2OfY2vr+/VpYb2dm6dvc08vP3+Hb7GlfVUxJSk5WYGpy5dzi39/g +7ltWY1lLU11PVXBzdeba3dzT1drZ4+7t9P325t/c29jX19nb6W1fWlZNT1RWUV73dfvr4uDk +293r8OjqZ19oX1xreF9p821gXF/m61Zh2/Jb5tNoW8PDXdu911Pn2lZKXWFPTmvo/njh2d7Z +09flcGVeVVhdXGBpaGR24t7m6ftraG9tV1Rka23r3NnX1tTd5Od8bGhaVWFoZ/jk4+Dh29ja +3uB8X11bWk1Lc9lYU9bPdHDSzfNb7t1oUl7+Zl/v2uLs4+f1/GtmYlxaW2RkafPm5eTc1dvj +3uP7bWtvbGRdYPnp+Ora4u7i5XdqcmtdWl1n+H/07WlWXtbNa09t1+xUXeb0WVrp2+X899zd +8nXr4fF2bm/5+Wx84+Ty6OHf5PpmY25uZm/0bF1p62xZavd1ZGj7fl5ca/drXnra2uve1tno +3tnneu/vaFhf+GhaZHvv6mxw5+t5ff3x5fljX+Lf/vtyZXJnX/Lr7v743m1e395vc2Vt7FVh ++GPmdn7k6P9q6O9W+NZu5edPf894XGRe6uZkfc/SbWnv5t5nWWrSW07XYnHmXO5u3WVZ6OD1 +UnLdZ27seHr1/2TZbGrZ+PtyX9j0dHb+/WbpX2vz+W9izvNqd+zea2rdX356V+/YbV3U7WFv ++tFpXe7p8mZtbnz9YVXs52jgaGDn3ldt42pa6udf/NPi++xn33702Gv3c9lccOLkb2TifnFv +Y3v3aVRh3/JX+310anRu7dxvWOfb+HLk9+B2325z1nhe3ONe8Pt473FmVePjV1zXbW3d9Xrg +aWbseGRp3Gxkbm7rePXq6+3d5vxv6uV0WGzqdGL4d2H+cHl9du5s9HX1/nx1cenrcG/l/PR7 +9+h84fVt6etxYG/pbmBw/HV86/hfZXz9afTu+3PmcXzmffn9d/p2aOrl5u7s6/5r/G9fcnPv +5mxq7Hpk5vN4fe5mcuphYO/67fHncfneeG1m7fBk+fJj/vprafJn7+94enD57nT3cuno8ezl +53nn7Hj4b29vd29h+XXudWTu4WJo/GJ+b11l+vh+7u3o5/jv4/f+fvb27P18/Xdpa/zs6OP5 +bu3qYnd7Z2xp+Pv7e2Jw/fVtaHXs+G1wb3f5b3fq8vbo/Oje6Ofnc+vm9up9eG14eG5ucW37 +fHFoW2ppbnJq7/t7bvt66+tx8OTq6PRv7eLp6unpe/x4dmJtY21wcHf3eHx+6/V9+ej3+X99 +e3J3/Whje/5y8PRue/57+nx5+X/n/Hp+7u3s5+/8cnVud2l4/fHpaW73+Pd88mx3fmdtdmXz +/X3tfefu6urt6en6bGhxe3dqZmt3c3Psdnvr7fz18fv9bvTj/njxeXF4bWdxbGx7/f31b3vx +9fF1dOv++fJ27OXh+Onr/njv7vVv9O9wbnZpanFtc3N5bvBvePNvbGlraGlpbHf99uPh7u7n +4ufi7Ojnf3z2fm98YG/vdWdsdHH58/r8fvXu9nl8eH7y4u9rc3r7/fF3dHxmc35haHBvc3v0 +cPX3eejz6vPt7/Hn3+rt6eP5bGdrcWx4fXP+aHN+aW9udWxodPj+bOTg+Pjf8Hj7fH54c31/ +eG56f/L17err9XFraGh3b2hoa2198ebh6OHjfu/mfW5tfnT+7vtybnFxcnr2anZmZ/t8ePfs +dfPse330cf32fHr1cnX/du/t+u7s7W97e3Rr/XFx9m5qe3J17O736fpqcP5ycfTo+Pjr5/l8 +9/D+6PRnanBwX2R9bX7o9nJ69HJucmxucePne2757uvr5+X48fJzcHry+mFmb3Dr6+Z47u12 +fvL5c/tsbvz9/nFpfG9uc21obXdtbm128/157fXv5OPs5+zi5Ono8/j7f3b6/nhza3FybnR4 +cGhjYFtsdft2em987vvo3+P98O79ff/7/erm6+nm+2hscm328Xlobnhtcv59b/t+bf56fX10 +c3717u/29PL27+rn7f56dXVvevxyb2hvb25+9HBubGv27fLs3uHm6+zs9+z/cH50bHdkZ2pr +bW36fHjv8Hlx+/52a2hrfX/17/Xq5uzl5/nv6m9mcP566+T+cf709nZsaGp2b2t4dmxla/Pu +8+rr+O/u6un6f/F2dH14dPj5a235fXp9e2tqbWZsefh7fffy7u3q7Or1cf3u/3X0fG739v55 +eXBtevrz4OT09n5sbHN2cnx58fj37v5wdW9xffL1cHJzdnN0dXp0bnB+7ufj5O/u6vL063Zh +Z25jcXR3/vju7/Lv7/d5ePLwcnVwbXJxbnpy7+308ffx7Ob5bWtue/no7PH7/3tybnJkY2xq +Ynb7/nd7cnbr5u3v7/b77vj++f39/fv3b/n7cHp9dXN8dfr2+/bn6nt28vry7vX1cGpucGtt ++35za2/9/Xr3+W9rdHx9fXf0+e7p7PL59fp/+u/y+PZ9fPb/dnz9a29vb3n++HxtYml5+nzq ++3L87vDw+ert7e9+7erxf3t7e3twdm5ue3t5eWtvbnV9b3tufePt8PXn7Hp+/HD/8enx+v5z +ev1vdPt5amZye3jy8Xdy5/bo4+/t8Wxtcn5kbXdzeuz57W75+/p3fPfr9/b8/H/86PBx9vv9 +9PV8835ufnRvcmRmamp+dnjvd2p+6vD87+19fvnw8ero/Ozt+/179nR2aXp5d3n893V4ZW1n +bWltbfr9dvvn6+/e3u7b5np8fHxtfHlvcn1+/vp1//RrZXBqXmN1aXb95O578/5sfXF8c/Dl +6/rh+f/07+r1/Xdw+3RhbXju+3vq8Ht2cfLv/PD/ZWv6fmt5cH1z9Hx3Z/7t6vb19PLw+XB8 +bXp7dm5tcfDy6+rq+/Tu6efr/vd3anz8bGRmamxdbG1qbnNvdfvv7+/5duTf4uHf5+7sffhz +92xy7Gdu+PFsZ3dvam99fH1renNobH/o6/f05u7l+ut66vd+/f5+bmVhX2J3/Pr+/fzydevz +6+Xp63ft9/h5c35ufX78anT78v75b/1xbm13/nL89/n6cf/rd/D2ePz1+Xzt7vP6/Xn9bGtp +aX5rcGh3ZHnk6u7n8Pnq7vn3+P/q7+rv5+z0d29yb25nZ2xvbXNsbG37d3Jt/X558O/5+Ht3 +6evm6ujv9ufl+/f79WtwfnBddG53Zmp3ffx7cXL8evF28/vp6uX27e7te3V/+376d3ttbH72 +e3JqdX31d3H/7vrt737u7vluenf+/vH+d3Bvdmxz7/X9/Pz5+3h2fXR6d+f28ezv8PHs7ufv ++m1lYW9ub216bnx4eHj4bezv5nzlef9rfWzx/Ox38v3w9/T77u/0fXdreWpnaXJ7d2537vf6 +8u9/7OzxePt16u74b/1z+f7r+/r45Hl1a3Zoc3V1am9z8O17a/vt8evt+XZ7/W17bnhze3v6 +//5rdvnt9/Z693Dt7vF07P3mdXdq93v2/ed77u/x+O/8/W5rbHFuYGtmcm33++945ujm7Oz7 +7XB5bfB09+nv9XT+fHZwc3ZsbXBtbHdo6H7tcuXq7eTf53XsZndlfW75Zfhn+2pwZ3tu7+vs +/u397vzyd+t78Wl+bvd97+rj7vDrdPtl+Fx8aGlpaH1m8mbuef195Xfj9Ozlc+Jd5F/naO1m +8/b2dl/uZuT6+m9e7nZy62Bt+OHT9urfd+3521lgTFlsXH7w7vHf3N7s8HNrbG9eXmho8vfm +7Hri59787HB6attw/O1sc3bi+X3iY/vrauNUeGZpYvFnaGbrfHrwef74/ODsc+Ff9exY3m7f +eezW699nae1t9/pe72j/5Wpqc2D3b2r2aGz+bvj3dfrn9PV+buV67OZ2+ft+4t3v625u5XVp +c2lpZmx5bX5qbm/1bWLvbnB5bPbv5uHv8ePu7+js7vl+bWn47vv7ePj38e59+vru7m54e3D6 +dmZeU1hWVlNWZF1tffLa2NHOz8/Z2tv6ffj1/Pji39zUzczIycfL5FY4KyksLzFCZfDGta2s +ra+702BKPjY0Njk+TuDHv7q3ub3Dzu1RS0dHTlnz2crAvry7v9dKLyQkKS0zSPjXvK2oqKux +wmhCOTMvMDQ7TtC8tbKxsre/z2hLQ0FDSFbozcfAvr69w/05KB8jKy457sfBr6WkqKy5XjMt +Li4uNkdc0LqzsbK0u8jvUEpIR05VWPzOw7+8vcTHy+pELyEdIi48abq2tqujpKu5VC8pKzA2 +PEtvzrqvr7e7xexZU0tCQUxfcuHPycW+urzHzdZtWlAzIR4oNDt/t7m+raOlr8VMMSsuNjU0 +P/3Es6qsuMjQ41pRTD88RWLd0MnEw8C+wtTq3t/j1/MzHx4sOThVxNvYrJ+jrcFNNTI4OjIt +NVS+raiuv8zJytdfPzU3SN3FwsTKzcnDyN14d3Tp3V4yISEvOzVC2tTAp56jr8JuSUI8MCon +LEe+r660vby1tcBdOTI4T9zS723iyr/Bz29aW2jk2utMNjA2Pj08P0dcyrWxt7y7ur3NUDs2 +OD9TbGdq6Mu/urrIa1Rr2NHjWk1QZeLgaFlm/ezc1Nnj4nFNRUlTVE5KREZRaeHPy9L8W2Ht +z8nJ0+r13NDP0dr3a3bo53NdUk5OYuzzbG366dzW2u7z3djvW1FNT2BzVkVET/vY2nZbYOHN +yMXO7l1i4M7Rf1NLTF7f2upraf7YztTxZGRfX3/rbmjnzMbGxcx8S0VHSUU/PDxEVevNw8HF +yMXDy9n9U0Q+P0ZNUldm38vCv7/Ey9HW4XRWTVBcbebXzcjGwr2+cTIpLDI1OD1CTdSzp6Wr +us31UUA6NC4sM0zIt7O4u7q7wtZXPjk9Rlzo5/Pbxru5vMTQ1crBYCoeIiw2TsW/yb2so6Sx +XTEqJyozPkZYx6+opam37EA4NTMzOEbkv7OvtsXad19o/nJcZMu1r/AoHyMpMu67v8y4qKSq +uk8uJSUvRV/fw7ewra237zszMzY/We7Twbq5vMrwVlBX/tficd/Csa5ZIh0gJje8rLS+t6yq +r8FDKSElNe+8sbC4v728yE43Ly44Xr+4u8XR29/pZU9JSmDUysvLxLmxtj0gHiIrWK+rs7q4 +tLS76DYnIypDwa+ttcTOy9FgPzYyOFLDtLS9zex6/XNUR0NIWtrIw8C7t7jPLyAhJzPPray0 +t7i9w9RHLyosOd61rrXG4H5tXU1BPT5O0ry4vdNeVF1093pfVFrxzsK+vsXO1GgyJyowP8iw +sbq+zPJ8X0M4NztIz7i3wNL4XFtydF1XYeDNxsfUcV9dY3xuXlxaWGrTxsXIysrSPyooLTX/ +sa60ucXpdHVOPjk6Qfq7tLvLa0xMWWlkZm723MrGzeBuW1ln/vT9Zl1m59DLzdTb39/3Pi0s +MDdXvbKytb7YYFNKQkBCSnrIv729xNlpVEpIT19kbt/X19DP2eb9XF1n69TFubO9QyojHyZD +uaunqrjTb1FAOjYzNk7Cr6qrt2E2Li899cG8vcfka2ZcV1FJTHLSysbNbEtHSVrZxL/By99m +XGJnVTwxMjhMxLKwuM9IOTlCWtzMycrKyMrbXEc+PD9S1Luwr7fKWj89Q1fMuLCvukklHR0h +NLymoqWswllCPDY0NDhIzLKpqK7POywpLkTJt7a5wM/l8VxIQ0BEaMvBv8jtTEZPc9PIy+Zf +YO/Mvrm8QyQfIiltqaGlr9s3MDtO8s3PeXzRwry900Y1MzpSxLW0u8xaREVOW+zTzsnEydXe +1sfCfzIkHh8s4qqgoKi/QTAvOEhhaF1t0ruvrrfrNykoNPO1rK6/ZUdFV9jM3GJWWm/azNZx +ZPjKtayyRSMbGR46sJ+dn63ePjY3Ojw4NDpfu6qio69RKiEhLFi3rKuyxfhaXF5VTUlMXtS/ +uLOytLnSOCIbGx8zuaKdn6rLOy4uNUFNTEhR3ryuqq7DQy4sMkzCs7bC311Y4cjJ3GNOR05t +49rKuq6rr9QsGhUWH0eom5meq9g7MzM1NTc4Qdyzp6SntkcqJCUvXrivsbjIcGX/4edlTkpU +7s/EvrqysLl7LBwYGiJKqJyanq3tNi4vNDtBQkveu6+rrbxOMy4vPd68uL3Le1Rb4szHzuZd +T01PX9q9rqquxy8bFhceO6ycmZylvUIyLi0vMzY/3baqpai2XTQrKS9Ky7u3usjb2tjV2f9W +UF7s08jCurKzvV0qGxcZIUSqnZqdp8FENTAvMTExOVq9rKWlr88+LiswQvDEu7vBx8jN1+Bl +UE5XaOfOvra2uso7IxsZGyjkp52anae9UzYtKywsLjlcvKqjo6q6UDIsLDFF27+6uLu+wsnY +ZFBKR0xbz766t7t+LiAbGh4vxqacm56pumo7MS0pKCo0VramoKGqvEowLC00Q3jOxL+/v8DE +z+xeUEtS7c7IwL3PQi0jHh8nPb6on56gqLXVRjQsJyUnLkTDraalqLDHUTw1Mzc/TnzPwr26 +u77G1HFaWl5q49fySjYrJSMnMFa5qqWjp622w+hJOC0pKCs3bLyuqquvucbWdFNJPjs7P0v3 +yL68vsXN2unu7u1fRTkvKSgqLz/hu66qqaqtsrzOWz0zLiwuN0jsxby5ubu9vsHJ3GNMREBB +R1fv2NPW2+nw4dXQ1udXRTs1NTc+S27Sx7+9u7y/xdJxT0Q/RU1e28zKzNHW3Ofz92ZfXl9c +aO3g29rf92VdZvLXy8XHze5PQTs4OT5GTFRp6NvNx8jM2PFgVFRi7dXLxsTJztTd5fFyaF5V +Vl5lcu/g53NfWFRafN7Tzs7U42lQSklKTU9SWFxt7+bd3u9jVk9PXH7bzcfDxMjP3OPr+3Fm +cfjq3dnY33ZZT0tJTFv53c7LzNPkaVRNSUlKT1dfdX3q3uP5X1NPVmro08vHyMrR4nhjXlhc +a/Lg2M7Pz9Tc7l9PS01PXPLa0M7T3Ol4XlROTUxNVFxnd/lrX1dVWWbu2s7Kx8nM0N94YVNP +U1hp6t3VzcvLz9t2WlVTU1FZZ/3i2drY1N39Y1xYWl5eXV5aWVlSTVBXX3zd0dHR1dvd3+d8 +aV9han7o3M/LysvP2vhvZFpaWlpfbnN+9HxvbmhgYF9haG1xbl5VT05QWGT76NzW0M3Mz9jl +eF9bXGNrfuLVz87O1+Xxdm12dWxfYPhybere8X9/b2RdWllbXFdSUE5RWFxlduLl/NHJ0uLW +1eJsXf91Zmfhz8zP09Xe5HhoXFdZbenZz83LysvP2fxSPjczMzU2NztKbMy8t7OxsLK4xONU +Qzw6Nzc5Pk1vz8C7t7W2u8LRfFROTUxUauXSy8bJ0l47NC8uLi8zPVfTuq+urK2vtL7bUz43 +Mi4vMzpFZ8u8s6+urrO8yvpKPz09Rk5tz8a/vcXZSTgxLiwrLTJF5b2wrKqpq7C6zVk+My0s +LS85R3PKvLSurq+zu8fiUkM9PD5JV9/DvLu8w+c9MS4sKSotMkfXva+rqaiqr7vPTjwyLSwt +Mj1O6MO3r66vsrjB1VpGPz09RU9p0b21uLu9yE81LSknJygrNlDIs6uopqaqrrzrQzcuLCwt +ND9W1r2zrq+xtrzH51hGPj5ASFBxz722uL2/yUYwLSgkJigsO2/ErqinpaSprrr6PzYtKiss +LztO6r+0r66usri8zmJKPTo+QUVX3Ma9vsC9xVY0Ky4vKyswOl69tq+rqqqpsMXwRzg0Lywu +Nz1Q59K/s7G0tLi9w9lUSUZDRURGXN7Zz9XUxMPUYUc4NTY1Mi81SezPxLq0r6+2vMPP8VRC +Ozo9QUZNbc/BvLq5urvA1GZORkM+Pj9EWHHr3dTMzcvU5vr3cVNKQ0BDR0VCR1Vr4NfSycTE +ys/RzszV6/39ePL5b2313d3Z5PDu/2RQUE9TX/V8+dzY2+fzev9wbWBbXl1bWlpcduHuav/n ++2JfVl1hXGV67eTOzM7Q0NTc3f5rXWNlXmJYXGXo6NzY3tzWz+Px+GlcVVFPTFhlfvTi7eTm +7fJuXWFrWFtfaGz66tzZ2dPY5+7+eXVxXWVqbGv9fvjX39TX29/fdWpoXGlqYF1pZmL+/vjx +6/7vdGtebvFvfHJ+/330amVrc2pj7G/17v/v6erh3eLb2NfgfW1lVlRcXl168uf12tfg3Ozx ++mtgbF5iafLw7d7k6n1vZ1lZXVRRXVlZbP/56NjSzs/T0dvn7n1dUVhYV1x17uDd2Nbc293y +aHppWFlcXGlv8+Df29/i5vVvX1tYT1FXXmtw/+nb3eDa3+Lh629rXl1ka2zs3d3f4OLc6vJo +YmxrbmphYnbl4u3j3uXxblllaV9fZ2/w/e7j4d7t9e5xeGdpZWlfYmxwc2z47ujv5ev4/Ov0 +bfHt9O/w7eXp6+jt83N7dWJiaWJefmZlcf567tzl5+nudmd7+3RnZ2hsaGlr8uHq5/Dq7f9s +9Pn8e33q5fzz7XV9c3lr9/ljaPtzbHl+dHf3ffHkfnbl7Xtof/b8cnBtbG/9eeno5+fv7e/v +9f50bmt4d2BeZXxzdvzs6u708+/yb/7/ZXJvdHHt733o4unx/Pb7ev9nZXnveHP/aWz0c3Vt +d/3v5OnuefLs++ru937s7vXv/mZtb3FtaGFod3F8fffv9vr3+e94cf3yfvB08Hhx8XxtY3H/ +f3x59vdtauz0a37w5+jd6Ozk3+Hm8/TufXFvaGRtc2xoaf5qZ2x0furybmhy/HNuefft7+/+ +6uLs6+v6/nB6eW1zefr7am3s9H378fN6dmZfeXl+/3L3+P3o7OLe6Obe3Ob+fWtob2h5al9g +bm1qemZy9Hv8dm5r++758un5ffDsfvtvdXT3+nzz//z4fXzv6fX17fF++Ox1evF2aPv0cfxx +X2b8+mp0dnJ96fx5d276bG5p+vPr7OPn6PHu7HXt5+d593Fvb2hmaG52cmtzaW18eP336/Pm +8O/y/vh8+e/39Pl28fr3bX12Y3P/eWpva2r6bnF3eOv1duzs7/H18+7q9HHu7XB3a3T+9Prw +8GZpYm5vcnX67fr56e7+8unw6+/6+Gz+/f1rbfx7df359ftsanH9bPPzbmxicmT88Pdt++D3 +9fzu/ubvdvTu5fDw7PHo4eN6/G5qZ2NpY29tZWpzevXqe2VveW1sf3F09G5o+2998ubn6+Tp +5ebu5t/n+fP+bWpuXmZ293V6e21scnzk+355YmlobmVtaWp19/rr6Ont6uDh3/j86/fs7eh0 +amxpbXBpa39vZ3JuYG/s93b69Px1c33v/Pvi4Ojq7e32eHH/ff9vdnpmfvv4Zm5we/p++Hp5 +ZXN3/3xtdvxwb+jz+O/o5O3r6uv8af1vaHT+/mn1cGho/n11dmv5au/v63168/Tq7/Pr7Glx +/e1z92xfb+7+dvV0fnj0fun6ZmduaWrt/Pf7fH5v7ubr7+/z9/f3bm1+b3B/7e/5eHR2fvj+ +7fz2fPpwb3JxcWZ86e59e3x2eu56f/R9dP709+fr/Xl9bGj56/Z87Wxpd/fv9n78+fx++fNx +en38a3B/9nlwentp++/28vb25ef98Xx0dnb6ffZzeG5kYvh6fflr8Hr26u91bfjo+nv5/n5o +Znzz8e7j73768vNrb255dPfvbn9//vnq6OPudn9scHJtb/94/HBybnN8//lrdvjt7vl9eH/5 +7P12ePzv9/f47nVyfvr7+O/2+Hp+fm5tfnR9+n735/Z0fnB2dG5rcWlpdHt7cvrv+3rk4e/1 +8nVp9nv5/vnv8u/07+zv+ex9amr7dm5tfXV+921793NpbnZ5fHFtcn387eHi7Hn56vP68PZ4 +enJscntxa3N88e7r+//+7/H6eXb7dXJvampyem1tbXRr/eXrcXLl4ebv7+bg6n359n58bHJu +cvt68nh7dPx+/XlsamVhX2Z6a/r26+rp7Hv8+OPo9fD6eP359u/38e7r9H36a3tx/HRxdm58 +fHZscPR8b3pzZWdpb3Bz//Pw6ejo5ePr+/x9cHR+dG50/Hh4fOrs7ev5/nf9fnFmZW5qbGly +e3j68/N+/3VtdG179/t+/ezz6eHf3+Dh6ftydH7+/XN8f3RwZmJoZWRpZmtycnNrbHj+/vTt +7e3q6uzx8+zs+/rt7fP8fW9sbG9wZ2t9fHt98/D68ejo8fb6+nt56+bud29wcWpwf3lycnV2 +bWttaW559Pv68uzr5+nr7vd+fnz8ev/0+XVrdnVub3pvbXn/+nR4f/79+X11/vL1fH79+fn7 +9/bv6/l/+fPv9/P7bm1uZV9o/PL48O769fz6cXr89Pt3eW/7eXZwcnx1b3V9/Pz19nVvevn0 ++35+/e35eHH47O/z+fz79/Hw7fr3/m94efxtbXp3dHF+bW12dXlxb2509vH28PD9/+7u+O7m +8Pjt7/D7b2lmZm14dHXv9Xd4/PDu7Oj2eHhucnJ0ef39+n95c3Bta2hmZ25sce/w9v57/ezn +6ufm6uzr7/Pv7Phuc3r8+fp5cnx1b3ZtZmv6+H94bnB7/35ubnR3cmprfe/u7+3r6vP8+Xh1 +/PLw9/n2fmly8e3x+nxubG96fnd+/nR4fn7//PP79/b17fL8dnZ9c25qa2//8/h+fn11dv72 +8PLs9O/t8u7r7vfv7v1mW15iYmdrcHF1ev739vfy7317+fz+8uPl6ebs7e/u7vP29ft2bGVp +bGhqaWxvb3N//HX48350ePr06enx+n18fvb3fnd9cG17/PTs7Pj5/Hz1fXh8en15+e/7bWVo +bHz4+P90//18fP788e3s9vDp7vDw+/D0fH96c252fXJteu/09vZ2b2lkZ2pr+PDx7Oz6d/v8 +8uvp/mv/6+z07/psbGpxc3b8+vT17vZ7dXd9dffs7fP9b2hven717/R5eHd8ffvz//92enFx +c2/58ez0c3Fxbm9+/nl3evv++vnx/3l8cm91+/Tv8Hz99evs8fL68e3q/m1sdH17dnZ7em9t +ZWFod/3+fH307+rz7/Vwcvnt+fbucG15+u/49e3+cvrx8vp8/X16df76dnNxfHx2dGxrZmT6 +eXJ9Yj58uFlUzdNUWXb6xtBj2+1SXWJfauHnWmLp3udn3c/vYVhqeGRhbeDtWv3o6+JpfOzv +Z3HoeO/vdujya2v9/P7vcWz4fufydPV7amRvbPn5bG1kXnP26OHn637x9vHt83/+7eX5eXxn +bV9c+Xr37fx4aX7u4vlt9O1t/fju6GR75+lle93t9Wzv8V1ie+p4eu7vbFpk6uXo+Xvdc1Vc +9Obq9GxqV1lu/u7d295pVfzsVOrM/+TY5ulaWndkZtvb9OlaadZmeNztW05ceV5g3+NpWV1v +927n0fBf9u/tffXQ2/re32VeaGhp8frp2mNc5ftYfudp5Hxk8+laTXPka/HM1mtjVl7+X9zN +fmdeX11Lccp+98fhZ3pg+Vdj0tne4tH9R1TqZlrXyPlW6e9QTWrmcF3j5FFTbHJt7NbS3PL3 +bmlp5N1k2dlT7d1e7Mvr+9NyeOtXVPB9WeDdXVJcWU1Xa+D4ZON8Wlt2ZV9q69jp2crc4NXe +187e2s7t/dj0ZvDq615s7FZQflhJ310+Q1I8M0xNRWHPz9fKv8HJv77Lz83a6d7a2+PVz9LV +4ub5WURe40hb2nPWTC/pPyQ9Vi9Bxu7Hubu6x9HK7lZp+Xp32MfN08HG3dDO6vrg5PNj3tZc +dMlu7Lt7LjxOHyNIMCzYucezq6yzvLvTPkRJODxQ/vDNvcHLvL3l2ctcVNfrVfDU6/rSxt7e +5DkxOSgmNzY157y9r6utsLjFYkY8MzI4P0vrzsG9vbm5wsS/zN3Z5l1e6+/sysXO1Pc9MTYo +JDIvLlHCybSrra+0utNHPjkvLzxATMq+vbWwtbm4vczS3FVLWE9U7eXSytHgWTw5LiUtLiw/ +3NG7ra2ur7TDbU09MzM3PEZ+zMW4tLa2t7/KzuRdUEtJT2XqzcDMzco9OD8nKDItL17MzrSt +rrKyut9eTTcyNzk9UtHPwLa3uLa5wsrP+E1PT0hZfPjNxOPL5zQ/NCYxNi1C1Wy/r7O1sLbL +6vRHNz48N0FYata+uri1s7i9w89jTk9GS1lU3sbN38JpNEg3Ji44LDfmadW0sbiys8Tv6E47 +P0I9RGj90764uLe0u8HF1FxUS0JLTlfWytHPxk8+TS8sNi8uRV5QxLe9u7W8y8nTS0hJPT1H +Tlbax7+7tre6vMHZeG9PTFhZadHKzcvMTURKLi06Ly1MV0PKusi8sr7Lw8tQTls+PUtITd7N +x7y5ubq9xNPgaE5OV1Zn1s/R0s18QEw/LDg+Ljn3R1C7xM22t8zHwWZOXkU9Q0xLYczJw7q5 +vL7AyNvvb1JOWlxr2s3X085ISVUwL0AxLU5NPc6/2by0xMe/02NjTkZHTVpl28rBvr26vcPE +yvFnZk9OWF9p2s7i2d1LRUg3Ljk1L0JPSdzAxL65vMHE0+5eSEdNSkz86N7FwcK8vMXFyNzu +6mNZ+fTe09XY3fhNREQ3LzY4MztHTnzVyr+9v8TFzexiZlhPVmH96NrKxcS/wMfIy93u9mJk +/G9r6ebe3/xeTUM/PTk4PD5FUFnv08/Pys3WztDl7vhgaef699XU2MvLz87N1NbT2t3Y3OHd +19/o5H5pWktEPjs5Ojk6PkVOaeHczsjJyMrO0tXi7u/66Nza2tXP0M7N0dXS1tva29/a2uHe +3ut9Zk5BPTs5ODo5PENLXnjh0c3KyMjJzM/U2t3d293d2dve3dXQ0M7O0dPY293p+/vzdHtx +WUxFPjw7Ozw/QURMXfnd0czJxsbKzc/U2OPt8P3u4+rt4N3Z0M/PztHV19re2t/o6e9+XVNM +RD08Ozk8PkBHUVx92M7Lx8jKycrN1eP47ujv8+Xg3drSz8/Pz87U2dzd3ufw8O5+Z1tRSEE+ +Ozk7Pj5DSk5d7NrRzMnHx8jKztXY3+rx7u/p3dzY08/Nzc/P1NjZ3eLsdGtuXlhdXU5EPzs4 +ODk6PklTZd3OyMC/wcHCytbjeWVjZ3rl2tfSz83Kx8jL0dnd4u7u9G13cGBaVkpBPDg1Njk7 +PkZObdjLwr++vr/DyNHa6WxgYF5i+N/b0svIxsjLz9jd5vZwa2tmamtpXlRNRj87Ozk5PD9G +Tl7nzsO9vL2+wsfM2HldWFRUXm/p2M/My8jIycrP2uTubWdoaW54c2lYTEU+Ojg4OTs/Rk9d +5szAvby7vL/FzuNqV01MUl1r6tnPycPCwsPIztTfeGJgYmJoXlhXT0lDPjs4ODo8P0hWd9bG +vru5u77Bx9DnXk5MTFFba+LSy8jEwL+/xczX63poYVxVVU9OT0lDQDs1Nzk7PkhTb9PFvrq5 +ubu9w9DhZk9LSkhOYu/XzsnEwMDCxsrS3/NzbGNhXFdTTUlFQDs1Nzs6PEVPX9vJv7y4tri8 +v8rccU9FQ0NDS1v+1snDwL6+vsHFz+hwZV5dWVNOTkxGQj86ODs6OT9MV23UxL24tre6vMXV ++ldKRERCRE5l6dHGv727u77ByNf3blpRWF9dVE1OTURBOzU5OzY5RVBY8Mq/ubS2ubi8yd1s +U0hDQ0ZOXu7VysO/vby+wMTR6XNdVFBSVUxJUk0/QUQ3NT87NUNiV2jIvLu2s7e4uMLkfGNI +Pj8/Qk9pdt/Jw8O+vL/Cx9Ld62pcXF9aUFRbS0NFPDQ8PzU5TFVT7ce/vbi6vLq9zuPzWklE +RkVKXv7oz8bEv7y9v8bP3e70Xk9WXE5MV1FFSlE/OkBEOztGTVB9zsnBu7u+vb3G0tlwT09P +TEtSWmPo0MvIxsfHyNDc2t/waV5iX15hY11UVVZKPj5DPzw/RktZ89fOx7+9v7/CyM7ZeFtb +W1JPW2np1MzLzMvKzdHc82lhXVVTWGFhaWtnaGFcUUpFQEFCQ0hNWXHdzcbCv8DBw8rX6nte +VlZbYnP249bPz87NztHf82dhXV9dVlRfZmh0amBfZVxRTktHRkZKT1pm79fOy8nIycnO1uD9 +/X94eHJ/9ejb2NjY19nZ4Wtkbm9hXmxxZF5eZW1wa3F0bGVaUU1LS0xOUFNfavTe3dTR0M/O +0dna3+z37u/v4eHg29jc59zY7nru92xqXl9dW213de7p+v3x9WNUT0tIRERFR05ZbfHd0MzI +xsfLztnm83FrZ3j48urf29fY2dbc6Ol9Wltuc2Ru3tTd4drc7/puVElCPjw8PDw/R1X708jF +wr/AwMPL0eB8ZGNfXF5n/Ore083Q2Nrd3d3xaXHu397h393h+WZYTEE8Ozk2NjlAS1/cyr+7 +ubm6u7/K22lOSUhFREhPXPHUzMjDv7/Cw8jP2OtlYGpvZFxcXFdNQTc4PDg1OkNLW9rIwbq2 +t7q7v87ccU9FREJASFhv68zEwr69v8LDytv6ZFdTVltaVFpdT05LPjxAPzo8S09P/szGwLy6 +vL2/zt/sZU1KSEZNXn/sz8XGxMHCxcjP3vF1X1RTWmJcV1lZVFE/OUJDOjpLWk1Z1sjFv7y9 +vb/M3tzsVkxPT01TZnXfzsrHwb/FyszS4n1uY15cUk9TVlZPT0xBP0RCPT9MTVN21svHwL+/ +v8LKz9vxX1hYU1BYYWvs1M/NysjM0NDX3+txaGVjZWFmYmFiWU5KSEdBP0NHSExaa+zYzszH +xMbKztPc7vj0dV9ibn7q3NjU0c/LzdLR1N97bWldWFpdXmpnXlxdVktKR0FAREhHTF5859XL +ycjFyMzO0dvv/Hhrfe7u49jV1dDO0tvX2+v5eGZdXFhUWmNobG1nXlpWTUZEQ0FFTE9UcdvU +zsjGxsfJz9jb62xsfG1p7+fk1M7U1dHX3+DieV9dXlxcX2Fu+vt2a2VbVE1GRERCQ0tRVWjd +1M/Hw8jIyM3X3N/6ZmtoZXvl3dva2tnb3uDq93Fob25jXV9sevfj5fd3YlhPSEVGRUNGTVNc +7dbTzsfFyszQ4uvvbWJnamJn+uLb083Oz87R2Nvi7fVyaGhzeG54fHttamNXT0lAP0FAQElP +UV3h19DFwsfKyMvZ3uF3Y2loaf3k3tjT1djY19jc4/1qb29jZG18+Ori5Op/XlJNRkBBQz8/ +SU9UedfQycPEycrN2+55cGJnfHNy6eHh2M/Q0tLT2N3j9/x5amlveXd5/fh7bGlcUklFQ0BA +RUhMWnzl28/KysvLztbb4/J0d29n+uXp5dnV2dfT1tvY3e94bWdgbG5sbHhvanFxamZcT0tJ +RUBBREdPbeHb0MnHyMbFy87P2+33b15aWVtcVVnZys3c7Obd3up3XllhaGlw+Orl1s7U3vlc +SkZFPjo8P0VT6c7Gvr3AxMrZeWRXTEpLTE9g6dTNysnKys3W3vhoXl5fX2h3ffTc1M/Q3Of5 +dFxMPTg6OztASlTlx768u7zDzNZ7TkRAQkZNWGTmzcbAvb/K0d37aWJZUVFa/tvNxsXHyMnO +5l1MPzcwLi8zOUNb2sC4tbO0usTaWEU+PT0/SVziyb25ubzAydb+Wk5LSkxVdNvQzcvHw8bK +z/FNQTouKi0yNkrWyb2zsbO0us5iRTo3ODxATGXeyr66ubu/ytb3WlZWU1di/dvLx8fGyMnL +2G9VRzswLCsuN0V4yb+7t7e4u8XgV0M6ODxCT3TXzMa/vb6/xM/qX09OVFpj/d/SysbHyMnM +z9j7UUM3LSkqLjdNz7+4srK1uL3K90k6NDM4Q2LRx8LAvr+/v8XR7VpNS1Ns7N7Z0s7Ny8fF +ys/eWEU8NCwpKy84WMi6tLGztrnA0l5IOzU2PU7iyL+9vcDDx8zQ319MSUpQZOTQzMrKzMvJ +zM7Q6VFFPDEqKSwwPfrBurWxs7i7xN9UQzo1Nz5Q1sK9u7u+wcLGzutUSUdITWPp3dfPy8rJ +ysvM0XlPRDswKystM0LhwLqzsbW5vcntTz42NDhCW9LDvru7vb6/xc97VExITVx26N3Yz8vJ +yMnQ2+9VR0A3LSkqLjdPy7u2srK1t7zJeUs8NjY8TPbOxsTAvby9wczuVUtKTFRncXbo08rH +xsfL09jZbkpBNisnKzA7Xce9u7aysrW6y1pAOjc5QFF52crEvru6wMzgZ1RRUE5PUFhv2cfB +w8jKzMvM1mpMQTguKiwzOkrXxb65s7K2vMh8Rj05ODxGWeTKwr67u77EzeVgUExKTFRn7t7P +x8XFx8vS3uhpTUM6LyosMzxP1sK+urOwtLrHf0U9Ozk7RFBn1cO9u7m8xtPrXVBNSktSX33a +ysHCw8PJ1eHl/1NGOy8rLTU9SXTWzb+1sbS7yO5SRz88Oz5JZNPCu7u8vsPL225VTEpMU119 +3c7GwsTIy8/V4vVdRzw0LSwwNzxJ882/t7GzusDK4lNEOzc7SGLlzL+9vLq8xtTpYU9NTE1T +Xnjh0MjIycnP09vrflVCPDUtLjU7P0zkyr62srW8wsv1TEE9PD9MXu/Qw7y6vL/Hz+NpVEpL +T1tjcd/RzcnGx83Z3fFTRj43Li83OztCa87CurW4vr/D2lRGQD0+SE9a3cO9vb2+v8LL3Wxa +WFlYWmjt2dDNy8vR2u9dSz86NjEwNjo9RmTPv7q4uby+w9RiTEVDRkpOX9jGwL++v8HH0eth +WFNRU1de/dzX0czMz9jpZkxBPTgyMjg6PU7nzse+uLm9w8zeXU1HREdOXHjTxr++vr/DydHf +ZFVaYV5gavni2Nfd5u5hUEhAPDc2OTo6QFrezcS7t7i7vsXQflJKR0dMWGf108jFx8bDx87d +92RXUldcavjn4OXp7XZXTEpDPDo8PT1BT3DfzcO/vr7Axs3b9WpYUlZhbfDazsnEwMPKztXp +bldGQklNTFZxc2tu/OHrcmhcTUxMQTtDVkhG9s/f1cK/xcbFx8rQ43X3fGRo4tfXzsvO1Nnj ++mRYVFNQUVZaY2Jfb29eXF1VS0hOTklHS0xNWm7o2s/Mx8XDw8XJ0NXb4ens4d7Z0c/Q1tbY +5XhdVE9NSkxNTU9VUlJYV1ZZYHh1bvzycmt9cGl6/W535eHo39nT1Nja19fe3tjZ293b2+v6 +8fptYl1ZWFpcWmZqXFxhdXlvaGReXGloY3H27/Hu6fl+7ufu+uTm7O93cWpiZnH57d/c397b +3OLt/XBjZGVkZml9/n7p5+zs9W5ob3loaHJ3c3D48v549vD48+7t9HRqZF9kdXhlY3rz8e7t +8fR+/Xx3cmxpe+3h39zb4+r5fXJ1+fp1c3Zsb/bu+Pjx9XB4dHFvanBybGNobXV5+ezv9vn0 ++m5v/3xrZGZlYm/w6+rm5efk4uHt9vn59n1yfe7s9fPu7n989fv67+x8Y2JlZGdqa2tuefn7 ++f318ndpa3ZycHhycXrr4OHn6ury9v3y7Px7enr78/X5+fbq5ezv8vx6bmdka2tsa2dsefz9 +fnh7+/Py+/50cG1qbvbv8d7e5OLf5fZ/dWxgafxueHlmVlr4W13a3Prb1fr183P8+Wt94PFu +fO3q4d/42u9ld+f8aetscV5UXGJdVFv+bGZ35OZt+ejp5d7Z5u/o/Ori8297XnfsZWvY6W3a +8nprcnzx9Wru71ts729fe3v6emR97V9e5N1vX+vkYWrffF5fcujndnPZ4n/j2+h339vbb27e +eVtz415Uc21nb2Ze+vdc7+Fdft5vddvpZOZ2Yt3uXf/bYV3Z9lvb613m32D51ln/2WVj33hd +7uJX8+Bn6uBiZNt1W/ttW2l9XXXs/uLj/3zubuzkdHzYdfd+9eztbv/p/njgcFp2bGb6fmDv +8lz582v3dm98f39v72xl/Hxv7u/r7+zu8tps9dT0VOvlbW3sbHXuaWXqeVfv4Ghv4mxv//r/ +6d9u8+trbN1vYN7uXO34XPPnafbocnj6bW/7ZGbkcWrg63Py/2ppcejr+2Lm23xv3+xf8d3h +Xnze5F9a8OtoYuZwbHL293ZsZm1oemJo4t9qadvcbefe+HLe42dx6ntsffZpavr3bWzc43pj +fO52Ymz0c2Z353xy8Ph+53Zf++ro+ffs6u57e3Rv+vpsa/Xsb3nm6PDs5eTr8/Pl8HxvZmBd +XFRYV1NYWlZZdX7/6+Lc1c7OysvOzs7W3+Hf6nh6b3Lr6urm9W5aTUhHPzs6PT9ARFH52czB +vby7ur3Ey9Tma1ZOTEdLT1Bbb+XX0c7MzMzNzMzS2d/m/mZdUEU9PTw5ODtBRktW/tPIwLu4 +uby9wsva/19UTElLSk1UaXnv2M7LycjKzM/U19rqe2ZbVk9IQT8/PTw+QkhNXezVysTAvry9 +wMbO42BWTkhGR0pPV1/w18/MxcPDwcTJz9rn/WdbUlBQTUtHQkA/Pz9DSEtQXPrYy8fDwMDC +w8bM09/2YldUUVJUXnV76tzX09DOztLW2uDudW5lXV9fXFtVTEdDQD8/REtOU2D02svDv7/C +w8XKz9PceGJaUE5RWF1hfujd1NHPzszNz9fj8v54Zl1bWFNQTkpGQj8/QUZJT1p439PMyMO/ +v7/CytPd8GxbV1VTVltp+d/X08/S09DR1dzvb2NcWVZYWVhfX1RLRkI/P0FITVd449XNxsPB +wMHCxszW43RbVFFQVlxr8fDm2tXT0NLX4O79c3NoZmZfXltaWVNMSERAQUVKVF/53tjMxsTD +xMXIzdTe8GxkX1pXVltoe/Lh2dfV0NDU19re6XBjXlhVVllWUU5LRkNDRUpNUl772s/JxcXG +x8jLz9DX5nxqXlpWVlhdb+/c19nUz9DV1tri9nJpYl5XVVpaVFBNR0VFRkdKTlx34NTOycbG +xsjKztHU2+P/aVpUVFZbavfo3t3a2dfb3t7s+/jz/nBsYFxfW1VOSkVDQ0VITVRcfN/UzMfG +xMPFyczP2eH3a1tWVFNZZXzo3dnU0NLT2Nvg7vhrYV9ZU1NWWVZPTEhFQ0RFR01WaeTQycTC +wb+/xMjN0dzqfl1UT05PVFxq/Obc2dnc3+Hf3+3+dmVdXFxgaGxtaFtPTElGRkhKTllu5dbM +ycfGycnLzc/Y3eh8XlZVU1pldn3o29TU2Nfa3+54aWNdXFxcX2Zybl9WTUhISEdHSlNh69jO +yMXEw8THyc7S4PFqV05JSkxRXHjj2NLSz9HU1dHW3e5rX1tXUlhcXWVlVkxHQT8/RExXdN7Q +y8bEwL/AwcXK1fNiUkpJSktPWnTr49zX1dHOzs3S3u9xY11dZ2tpaWNSRT48Ojs/S1tr59XM +xr65t7m7v8ztV0tGQkBBRUhLWP7Zy8K9vb/Fzdbh825oYV9mYFpXWVJIPzw7OjxDTVv81sjA +vrq4ubzBy+JZSUM/Pj9ARUxa5svBvLq7vMDHztrzZlhQTExRW2Rsa08/Ozw8PkFITFNq18W8 +uLa3u8PO3HBYTkc/PT5ASFflysG+vby9v8HG1G9SSkhKUmb27/9tWkg+PT07Oj1ES1Hux726 +t7a3vMPK12RMRD87OjxCTmvYx767ubm6vcXQ62JQTU9NTFNhcvpzTj06Ojo5O0FLU2rKubW1 +tbS4wcrVZ0Y8Ojo6Oj9RdNbCubW1tre8xs/tWklDRElNT1Zma1NBOjk8PDs9RlJs0r21tLe2 +tLe/0ehYQDk4Ojs9R2rUx764tbe5ur7Nc1NNR0NFSExQXH1nSDo5PT48PEBQ+9K/tbK1t7W1 +vtH5U0I6Nzg8QEpqz8fFvbe2u7/FzehdV1BJRkpQVVJUTUE6OT0/Pj9LcdjKvrays7a4vsnh +WEk+ODY6QEtV7szDvrq4t7vCytPtXVJTW1VTVlxdSTs3Ojs4NThGX+7QwLexsbO2vcrlYE0/ +Ojg7P0da1sK9u7m5ub3G0utjU09PT09UX/D5SDExT04xLDvTy0lKvq6wvbyyt9RhbWBDOT9J +RUNexrzBw7q4v9Ll9VpGREpNS0xa8ePf19z+4PNHPT48NDdCT1Bfy7u7wr21uMvr3NhhSUlT +XWj+3tHLx8nP29zlb1lVWlpSVFxqdnjg2NnZ7ko/R0U5MztQVURI3cHBxr+4t73Gys3lXlRT +Vl5hbevd18/NzcrKzuF2ZlVNS0tJS1BWWl1saFpOSElLSUNHUFxp7NPJxMLAvr7CydHm8nFc +XGFeX3Pg1s/OzczP3/FzWU5LS0pKSUtbXlZcbfnu+3d4fWVcbXtlY3/o4d3a1dbn8Onx+HV8 +dfTt6dzY2dPMz9bS3m1zZ1hWXVNTYlxVWWRga3hqW11rZmBeaWf+7/rm4unr5vDh4fbt9m13 +d+vY5/Xm1+J+a+7fdFln6NzxbOTm+2thbWRYVV5tXl5defZt9+Xn29zn7e15ZPx6ZW72/mT6 +4ubv/fT7/vpsX15lfPr4bnPn8vrj73f99nn9b3nm7PPr3+Hn5Ofo7+3t/3R2YFRUY3pkX278 +fnRsZ3P/efp3fXF08+/t7+jo9ufi8395fn/4em3x6efn3tzv8e/ueXR8ZGdpYl50+e/2/Xxw +ZWVtbH37dPj3fuzs8ufydG1ta21rWWDx7u32793e5+Xg6+zl4elycmxkYGdkbmxvd/t6+OHh +7u3r73jte2x09n5q/Hh5dGxicfVmX2Rram7+eObZ4e3c4XByd25qfW1tdXLu6+Xn6Onc5nN2 +9P5pbWxlX2hoafXr8efed1Tz41tn7Xr13///+Pt53+pfY215Z39x+OXe6Oz38+zt6vlucXhi +YWZobGb6f/nf4d/v8/j0f3VwZWtuam5sa/Lt5+zv737m7GNZV2zf72Nq8+rd3uzo7PH7dXt1 +bGJy/u7m7fz1bWt4aVpVZf/ybGBq/uPX2t/k8PDy7PF0cXd4c2tfZG9ocPft6+Xo/Hl27OT6 +cPt/eXJoa2xsb2ppbvft83dv/ufj7Ojp6ur0fm9sd3xxfXludG5rb25oa3NubnN+7e5+evbp +5+vu9vj99PT69/Hq8fn4+fx0b3F7+/H3e3F6+3ptZWtzb3B7b15bXFpebHz1+/jz7Obf3ujg +3eLj397i4t/b2dna397d4ePmeltMQTw4Nzk+SVnq0svHxsPCw8bM1eT6aWRfX3Xt3dDMy83O +z9fmZEo/Ozg3OT5JWuzQxb++wMjO2/Rxamtpc3Nvcvvr3tDKyMfL0+1gUEU+Ojc4Oj5JWezO +wb28vcLL1uJqXFlbYWl88eLXzcnHxsTHzd5yWEg+Ojc1NjpCTGPZysXCxMjM0N72bWZka3zo +3tfPzsvIxcXIzNLlZks+OTQyNTpATWjWyMO/vsDI0OFlVFNSWF5x3tLLyMXDwcLGzNjoXkc7 +NDAvMTc/U+THvLm4ub3G1G9OSEVFSVN92s7HwL28vb/FzdtvSzowLSwtMTtS0r20sbK3vMnt +VEY+PkFKXNzIv7y7u72+w8nZcFZCMywpKSsxR9K6r6yus7zKb0g+Ojg8R2TSv7i1tri8v8PF +ydV2TDgrJSUnLD3Vtq6srLG/11w/NzM0OEThvrWxsbjCzMzIwb6/y249LCQiJCs9zLCrqqqv +vNhPOS4sLjZMyLSusLjF3/rVwrq4usPuPisiICMpOc2up6WnrLvvPi8pKS076LitrLG+3Vxh +zry0sra+3T0oHx4gJzy8qKOiprDORjMpJikzXLqrqa6+cUdHdb+zr6+2wWQvIB0dIC7Lp5+f +o63NQDEpJSg1cbapp67FTz4+W8a3sbG1ucY8IhsbHizJo5yepbNwNiwnIyg6ya2lprLbQztC +dsO6t7i2tLtBHxgZHzavnJufrMJJMiskISlItaajq8dDO0Zj18jEwLqvrLkuGBUbKsSemZ6r +us1MNSogHy+9pqSrxEM7UtfR4vjqx7Coq08cExgp0aOboLG+vMlNLyIeLMGnp7HjPDz8v8b5 +XXrHsKmrZx0TGC3KqJ6jtsC4vVAvJiM3t6esv1M4OVfO3GrkyrywrbRcIRYZLcyuoqCrurzP +OyspLVWvpqy/bD45Q15dW9W+t6+uukggFRcp6K+in6m5v+QyJygw16miq73fSD5IV05L676y +rKy5SB8UFyrls6Whq7e82zIlJS7NqKStvdRYSkxORkVizLarq7dHHhQZLs2wpaKstrvqMSYn +ObypqrW+xtxVSkdESVfqv6+tt0QdFBs0zrSnpq20u1wuKC1dsqyyvLy7yl9LTFpvZ33Esq/B +LxkXI0/BtKyssLXMOCgoPb6xtry8uLvWUFXXzPNPYsGytGgkFxw3xb23rq2uu04sJzXMt73E +v7q6y1BO08DWVFfQt7LMKxoaKte7vLOrqbNcLSUxzri/xr26vM5MS8271kRJ0LawvzgdGCRR +yM22p6Sr0i0jM8u+zMe8ubnPR06+t+o5OVa8rbhBIhwlP2pXx6ukqcUzKT7N0V/fvLK21Ex0 +uLVuMC9Kva+7RCUgMFFGPc+uqazLOTnTxllFZsK3vOlfwa+3WC8rNeG7yUYtLUnxPzdzt7C6 +8UvPtL1PPk7Kub/Z0bevu08zLzdOZ0k2LkPH0kRE4MXIYj9fsay+XEpP6s7T0r2vscZPOzc4 +PTs1LzfVuMTz3dz4VTs51K2suuJUU2vp1b+1srvpSkhDPjkvKytBvrjEx8LbUzwvO8KvtL3N +Y1RUUt+2rrfSYVVaZUw1KycrT7i0uri830MyLkC+s7e7xOJjS0jZs6641kxGX+hJMCgkLGC7 +uLawudxDMC5Nvbq+vcTO3FBH37ezvftGSP3ZVTYqJS1Tw7u0r7bMSjIvUcDAx8jPycHcVty9 +u8PpTEv60V45KyUrSczEurG2xV43LkPHws3Q08m8xH5+xr3E6U1L58vqQTAnKT7azL+0s7jE +TzE3fdDk7+bPurjSYtjGx9RcSWHKyl05KiQuUdjNvLW2uc1AMz1aY3jRx7y4wefoy8rO4lZV +1sPSXz8uKC07TNW5s7S4x2Y+MzQ+bb+0t7/J1ePq+Wht4M7Jyc3ZWDsqJCo90baus7m7yUYt +KTJgua+zvsXN6WFPS2HMwcTKysfKWS8iISpCv62qrLDFSzQrKzvTtq2uutFlSEFLaNfGv8G/ +vcLbSzMnIyc03K6oq7XOTDo0LzVZv7KutMhhRTw/T+7FtrK4v9T1Zkk0KCUqOOy3rKuvwFg9 +Ojw/UOHGurS61Uk5O1nGube9z3hfb+LW7kEsJCQrQbyppqu47kE8Pj9AT+rHubK3yFpBQlTd +zsvGxMTHz9d2SzgrJigvSr6rqKu37jwzMzhBYsm8uLjC8ktCRlrVxL26u8fpVElS2cbPTDIq +Jys9ya+qrbvyS0hOUUU6OEF2v7SzucjzWFRp3c/P297RwLi3vNQ8KSAeICxdsaajqLPaQzg1 +Nzs+RVTmw7Osq6/CVz08QE/tzMLAwb++vsL5NSQeHB4pTrenoaKptchcSEA5MjE3Tsm1rq6y +vc9fSkVDRUlPds6/ubW6xWg5KSEfICc157Gkn5+krL39RTgyLi4vN0zKta2rrrnUSjgyMjY/ +Z8e5s7O2u73GWzElHx0hLVq3p6Ggo6q1zVg+MSspKzBB2b22tLi+ytTlfW9pbGdlYWD418i+ +ubm910EuJSAgJTBUu6ulo6WrtMV4RjcvLS0wOlDZxL+/v767uLa5v9VSPjo8P01w18vEvr/K +WzwtJyYpMEPNtq6rrK+1vMbZZUo9NjIxNDtN3L61r66usbnKWz40LzE5Su7Jvbq8v8jjSTgu +KSgrNEjPuK+rqqutsrzhQzUuLC40PlLcwrm0sLK2v9ZXQjs4ODxJa9LEu7e5v85uRjgwLi40 +PlrQvri1tbi/znVRS0hDQEJESVNo5tTIv7u4ub3H2V9MRT8/QUhY2cG6t7e9yeNMOC4pJygs +O+q6rqytsbjB02xLOzU0OUTrv7SvsrnH4lVIQkBBRU1f4c3GwsHEytLe825kUEc+Ny8uMjte +w7SvsLfG51hIRENGSlfny7+8v85wTUNDSl3118vIyMrQ3OxrXmN36tbOzMnJzd1hQy8nJigw +V7msqKy51FA/PkRISVFo28O7urzLYUpHR1nn2tLOy8fEzNxyUkhIS09ae+vYzMrGw8tqQjMr +KCs2XL2vra+4yOxZS0ZEQ0RP6Mm9ubvG4VxQUlpp5uLm3+Xt+mdcWVdf7tTMxcXL0vtTSUQ8 +NzY3OkF4yLq1trzMaEhAQkhVbOLQy8bCwsXN1m9TSkhMU23k2djZ1t74+mtgYGVy6NPOy83c +e1xNQz47NjU5Stu9tra7ym1OSUpNUFhq38q+u73F3FRGQkNOb9jLxsTI1e1WSEJET/fNw7+/ +wcbT6WdPQDYsJioyUbqrqa258kU9PEFIRkdS68e5tLe+0lpGP0ZW+NfOyszO2GxRTE1W987F +v7/F0nlUTVJdcXNKOCwpLjrmt66utstZTEdGTExKUfrJubCzu9FNPjs+SmHh18/Kx8bN3V9L +RUhY6dDLys3b7efx7tfZeEw7LyoqMUzAr6yvu9pTR0JGS0xNYNK+trS6yWVJREZMW37r4dLM +zM7dWklDRVbjzsnK1OLr28vI0e1SPTUxLzE9Vsu2sbW92Us/Pz9JWHDcy8C8u77M71VNUF58 +4t7w/OHb2eBmVEtOYt3Qz9h+Z2nx0MzR3m5OPTczMDdAZsi6uLvE32xeVlRTTVBl28S6ubzF +311TTUtKSkpObNXHwsjZaVNTXnPt4+1nb+TUysfL2mRKPzs5NjU5QlvVw7u6vL/G1m9USUFE +TnXWycK/v8PJ2V9JQT9BTHDSyMXJztbs+nRjVE9RW/DZ0MvKzdDfXUU8My8wNDxO68vBvLq6 +vcHL4GhWTk1RYuzY0tDP0dff8m527d3d3eVlVU9PTlhsdXT06dvRzs7P1N9vXE1EQEFAQUhK +S1Rm7uHY1dDPzs3Mzc7Nz9nh4uV/a2hcV1tja/fh3t7h6vTp4/F6c2FaX3jr29fT093xc19S +SkNAQEVKUl1dXGdqa37l3dTS0c7Oy8XFyMzU3vtlXFpja2z/9P759nloamleWVVVXvjd0M3N +ztTZ5mxfV01HRkhMTlRUTk1RWmN55NzY1tbV1NTOztDQ1djW3ufr6fRxcHFwdfnu8m1iWlVV +XXPq2dPR2OhwZV5ZXF5aWlZQT1BOS0xNT1lidPLg2NbW087LysnKztHY5u7v9vTt8/by7vN9 +aV9YUVFYZvXf2tnb4ev9eWxhXVtWUVJTT01OS0pNUFdo897X0tHT08/MzMvLzNHX3Of7cvx1 +YmNubHB7fHNubV9eX2Z+7Ofp5Obr+np2dn53cWtbVE9JRkdKTFFYXnPs4trSzcjGxsnLzdDa +5/V1bGRiX19qeWhld/ru9XV3fPbv7fR/+/Ts+nl4fffn3+bz7vF3W0lBQD8/Q0hMUGHx1cnB +vby+v8bO2e1zZllWWlpcY3zh1tDP0993XVlWTk1RT1du6tvWz83Nz9PZ3+h2XlNMRkE9Ozs9 +QU1x0sO/vr+/wsfN2O9XS0tOWfXQy8rLz9Pc5fhlUktLSUpQZuXZ2dza4+rre3ZwbXzt7d7U +1t7valZGPTk3OT5Mes/DvLm5vMDK3G1SSUVESlbw0MfCxMnO3e5pU09MSU1add7Y2Nnj/Gdf +YWBcW19p5tHLyc3beFtRTEdAPTo7QU/hxr26u77DydPb8FlKR0dOaN3PysjL097yaltQTUxN +UmPz4tnX3dvi+XZiYVxXYH3j1c/OzdDjemJURDo0MzY+Xsy9urq7vb/Fz3dMQj0+SGTWysXE +xcfN129TSUBBSFFv3NTS0M/P0dr3XEtJTFRh8dvSzszKy9X4VEhDPTo4ODxJbM29uLi6vcPM +2fBZS0RFS13gz8vKzNDd9GlXTklJT1p44djQzdDY3vxdVU9QXHPt2s/OzMnL0ulmSTYuLi82 +R+3FvLm1s7a5wOBSQz4/R05l6tHGv72/zXRUSEZISk9OU3LazMXEy9h1W1pVTk1OVnLUxcDG +z+pXTktCODIyNUBfzb+7ubi3uLzH51BFQUVOXWr5287HwsLK5VtMRUJITE9aXevPy8nM2nxh +WFBVXGvq2dHLx8bL21g8MS8wNj9Obc+/uLGvsrvMbExGRENCQkZY38a+vcHI0u5kVExGRUdO +ZeTTzMbEyMzS5WhYSkNKVlxibHH083xzVklDQkNHU1587NvOxL+/wMbN0tzn+WhbW1xaZfbn +3NHT3N/v+XxpXFdWVV1x6+Dm/P7+bGZfWU9PV19rdW9scXNmX2FlZ19bX/Hb1dLP1NLNzs/T +3v1vaGz/9/15eu3j4d3oaV5fXVxdXGJx/+zj6+rzbGVdWVxZVVZZX2dt7e3/8/V93uD9+Gpr +fu3s3dbb3t/a29zh4fdoYXJrY/789fn/ff1vcHtjYGVne/Z1dPt8fnNkXl1hY2trcPnv8vPn +6Ozr72x8dHH/bG93cv7p5+Xi3/Hu7fT95exzdXR2fnxpd/vq6PPvenxzfHl8dWZcWlhiaGNt +/X138+7r7unmdmt5aW5w9ubt7uvp6vD48vf07Ojj4eXq9HxsX1lbYGl19fx6fXd3/e7u+317 +f/399vpxa2RhZmJiaXf7++307e7ufHd6cG748vf+7+5ycOvg397b3Ovp+29kYF9ubG72bnRt ++W1ubHpqYnn89O//a/p9aHd1bG9xbnF09u/n6uv35fB87u52cfhzbWpwb37w7uXm8u7n7+zo +931xbm5xam12/O/3+mVkZWxua299/Xx1c2x1/f7s7On0e3Nz9+vy9fvv+PPq9v9+bm1tamZq +en17efV//3zs7O7p73FqfG948e3v8PhpdW58b+ns6PlybmJrb/T/d3X+bmd3ZW1+7/Pq735y +bO727nZ493lteHz3dn7683fv7e7xfXh0endz+W979+p9/n7+b2/+/Op8+3pzaW958O38enJt +e+jq8333+fx5ZWlycXrx9XP68G5mbvz7eP7v9XZ48O/39Oz0dnl5fPb5+nV99fPx7vH48Ory +e3dvaGtze3Rua3F4bm59/fr1fXd3fX17bm96//Ty7u/s6uz2cW16c3N7ffn28vVwc3p3+urt +7+/v7/b+9Ovuffn3fnlvbWhobmtkY256cHJ+/Pp+/fD0fPT093tycn34/fnz9X1z/vPs5unt ++fXt7vxzfXdvbHZ0bWlrbGRt9+vs8Xp3+npxeXRucX37eX/9/Pfv7Ozw8vJ5dnB7eXJ7dnzz ++HL99W9vd/7t7+35bmxudPv9++z38+rl7P75d3JqZmlobW9qa3D29Pj3/Hd0/ffw7/R+/vX0 +7+31+/h8bG5zdXRwbXN99vP4b2/6+fT26+r+8e339fL+/Xx6bmxvd3VxfHny7Phva2pobf5r +7ddt6uDtcHdu8PZ69XdraPBiWFPd1f3j1+He91pf/1/o/ff27t7t6338dvxvaVxn7+zt7Pv6 +7HBsbmlobGpmaGNp83z14N/e3N7n6XRzeH76fPL48Onl5+Dc2tna6X9oZF9QSEA8PUNGSlrq +y727vLy/xcvaWklDQ0dKT17p0cfCw8bMz9npZ1ddYfXl3dLO5EIxLi8xNzo/bL+zrKuusrfC +7EU0LS4yOEd2y7uysbK3xNP7TUE/P0hd6Mq+u7e3vNs+KiIkJys0Q9+xpqKiqLPAejssJSMp +Nk3LurSsqKyywl1GQTo3OT1Uz7+8uru6vMbgXkk1KCImLDhSz7uuqKepsMlZPTEtKyw2Ts65 +s7Oxtb3K+0xDQUVQZe/Y0M/IxcTDyMvO2VY0JCIoLTpW4byqpaWpufdPOC0pJy1A2Ly0sq+v +tL3XUEVCRUlPXerPx8PEx8PAzNnkTTcqISYuNlHOv66np6u1e0A7MC0tMD/NuLCus7i7yf5P +Qz5AR0522c3GxcjKzs3M7HduSz0tJiw0P3bMx7KsrK69XEY9NTM1OEjUv7e2ubu/zOBiTUVF +SVJr49bRz83Hwb3Cyc9rTTooJCktPmfcwq+sqau86kw5MzQvNET/xLe4t7i9xtJ6TkZFR01X +etrLwr+9vLy/y3JFMyUjJis5V9O8ramkp7HNTTgxLSwuOFLPu7Wztba8yutOQT9AR1Fq3s7I +w768ur3BzV45JyQnKjRGYcayrKWlrbzfPzYvKiktOVbHubKvr7C1vNFbQz49PkBNZd3Hvbiz +tbrDZTMoJCMnLTZHybSpoqOnrbxsPy8qJycsN0/QurGtrK2xusxeRT46OTxBTujIvLWztLjM +QjIsKCosLjdJ47mtqqmrsLrNTzwxLS0wN0Z0zr63sa+wuMHN5l1LQj0/SFrt1c3Iw8TYT0A5 +NTU2Njo/Uc68tbKzuLzI3GNIPTw+Qk1adOHNxMDDx8jHyc/jZ1hSXF9cWFhf++pwVE5IREVE +Q0VKVuTLwr6/yczP2etkV1ZZY+zh6unb2t3p+eLd3dnf4+Dq5O93bVxcWFtXUU1IRERGRkpU +ZODMx8DDycvT3fZ6X1xu8uvt8uvd3uT4c2dq9t/d4N/n6N3q/WdnbHr3YlFHQj8/QENObdnL +xsTGycrQ4m9kYWvx8O/9/u3u7H9uaGn04efY193b3OPu9P3p+f1tXE5KRkE/QEhSaebU0NDU +19bc3vZz9uTb2N7n8Onp7vR+/vTh3trX3tvk9nl0a3F7ZFtYWE5NSEdESlFZafXf29TU0dLW +0tXa3uPl7O76+3Nobm5reurq397Y2eLm8fLp5Hfw7nRkXFFMSEdJSEtRXG1+79/h4djV1dPW +3N7n7X76/n139Ozz3+Tb4t/h39/c3/XsePP/8mNgX1hPT0pJSktOUVNbZvHj2tbPzs/S19/v +6evw9fDu++f25unb4eDo6Ojv7evs597j6X3vb1VNRUNAQUdGSU1f7djOysnJysvO1OJzdmRp +Z296+uXb1tfZ3ubp8ez4/XL36ujp8urt9G1PSURDQkFCRU1d7NnTzs7Mzs7P2O9vbWNqbG5z +7dnQ0dHT1tXb3+z6dWf08er4fff8d3VbS0dGRURGRElPYuna19fPzMzQ2eXw8fh9c2547N7Z +1dbT1NXX2d7q7n7r3t7g6nxweG1YSkdJRUBAP0FIUWTr2dbMx8jLzdbj8PLx/nJs9urf2Nre +3tnY19rk6ePf39/o/PTt7v5uW0pGSkU+Pj5ASVdi9t3VzcjIycvV3N3e6u37anvu6ODe4+jn +397h6+zp49/e7+3p7uDh821hVkhFSEI+Q0ZFT2du9+Da1c3Oz8/V2NTW29zm7+bl4+Tr8+ng +5unn4+js6+btb3F8evn1/m5nYlhOTkxEQUVGSVZfXG/j2s/IyczLz9HP1+Pv9H725Ofvd3fs +5e3s5ejm6Onr/X/+8/Hv5+3+f/h0XU5MTEQ/QUNCSVJefN3TysfGx8fLzdHe5ux9cnpwbO/p +8fX57Ovv8O3s8n57YVj07uPPzMnKzt9uTTszODY1PUNR28bAu7q+v8bX7FlHRkxKTV9n8s3H +xMPJz9biXlxTTFNUV27w7tXMzs7R3dzX2dLO2fZOOy8wNTI4P07VvLq2try+wd5PQz0+SFBb +5s3EvLzAxcreelpFQkZGSlNi7dHJxsXO3eR3XF5lftfQ1NT1SDkxNjk5QEr4w7i3ubzFytlR +Q0BBS2X24sq/vLzE2PJgTkhDPkhfX3Tb1M/KytHZ7W3s63/q2M3Fxs3dW0U9MSotNDdFbte8 +tLa4u8rX6Es/QkVS4NPLvru+wc9qZFxKSkhIXd7VzszMyc7xXk9IQ0JLVmrayb+9wMfN3F5M +PjMuLTA6QFLXvbWys7m9xdphTUVET1tp7c/DwcLI0uJvV0tERE5aa3bo0c/P3m5ubWpudHbl +z8vM1N/X3UQvLjM0O0FK2bu1tLa+xMXpSz89RFlqatrFvLi+z9feZ1FJP0RZX2T46djLzNje ++WhrWE1Zfvbf1NHNzdvnbj0uNzo1P0lZwba7urrBwMZYRUhDRlJPWMq/w7/M3M3Qak9KRU5g +Ulrj0s3Iytrh62xdTUVPZ2/+7ebSy9ff2Uc1PTozP0lOzb7DurW+v8VdUV9MSVNPWc7NzsHF +zMPPW1FNQ0lORlD+4NDIycvP9mRfTUlPVVdeberb3N7a6G1rWEE+RkZNZPvUwsHCwMXO0dxg +UU1QXWZg/dnXzcrQ09Xnal1RTllbZPXazsvLy8vYTj86NDY4OT9X2cS6ubm5wtVdR0E+P0BK +XdzDvby9vsLM3FxPTkxOUFr6187MzdPW5V5PRUJFRkpc9tzNys3S09j8WExHSE5OT1BVafL5 ++N7X08/X19TX3unucPns7Pt3f+fa1tDMzdDU2dze61tJQjw5Ozw/THvYycC/vb/J22lNSEZC +Q0hOZ93LxcLEy8/ia1xVT09SWG/g18/Mz9TT2+b2Z1tcZXZzbvv99erufGtqXlVQTk5RVVZY +Wl105d3a19XX2uPv9f14b37m3drb19TS0tfd5uHqe2NeaGFGPURDRU5PXNnR0sjHzMjO+Wle +VFhWTVJlaezX2NPQ1c3P3d3kcWNVS09cY3zl6t/c3uvv9GpgVlFTUFBYU1FfeuTZ2NfPztHZ +5ez2bl9ibv7h2+fq4eHj7W5faGVhbm9s9e14/H/38PP+cGdkbvh6bmVhbHBpbHZubG1panX+ ++XdreO7p8vTs49vd6+vi4tzW2tzd5vN2Y1xcW15iY2f+6u34bW1ybWxmZm1hX19odPLn6fB6 +9PJ+eH1wb3Fz8OPk4uTr7Obf6X1udm1rbG717v7++/7++X54eHFpa29vcG92dXry7Ovq7vz2 +7/t8a2ZfZn1+7Obq7vB3cH39+nz9/Xh6dm91d3p2/vx8+3prZ3Ty6uLe5+7r7vp4b291eHp5 +cW9uam766uXs7/N9dnp8/XhubWdnZWVrcX7v6eXs7/J9dW5sbG1873twePj6+vDu6/L07urs +8+vv9ndycmxvcPLu9/t/d2lub3BsZGdjYml2fvHq6enz7/Do7ft+dvt8fvz/b2x4/fP7eHx8 +9v33fXT+/Px8ePz9/vDm7Ht/8Ov1b292cW1qaGZtb3l9cnp+b21ucnz47Ozx9/X5+fj9f35+ +/fzr6PF/9e74/fv/+O/6cvf+bG1nZmVzdHZybXL47+74/Pbt6vdqaXT5+vv29/Hv7/9rb25w +c25ten587ery/vP9dXr5/Xh4cvz4/3h7/v759/Xv8fD5dHducH1vbWx0fvj57u306/h4/O/x +/Px29/H5fnZuZWt7dXV5fnd0cnF7/vTq63Zxdmpre/Ly8u3z6ury/fvv9/fu7fT8bmtva2po +aHZ3dGxtd/35dvnzdm92f31+9/bu7358+PDu/Hl4/fz39/z5fvz6+nl4/v13d3tudPP9cHN+ +/Xz56ef4bmtuefp4dXp29e338vf/9e/3/f17dHFvb3Z3e/t7dvzx+XF0/nN08vX6dmlna3V9 +8vnz7O/+cnT99/Xm4ez78+v2fXz19H13fGxsb3H483Vuevh2ePz+/v37dX18+/T78evn8P98 +enZubGlrbGlrbGtudX74+Prx7fHv8vL19PTu6Ofh5+77/3t3e3dzb2lpbm90eXNqbG12fnZv +eHl58vn/9fry7O3o6+zw+PXw8/t5d397cn37d2xsZF9ia3t0ePTo8f31+v/z8354cnV/+vz7 +9evs8/l6cnTy7fP7d3p+cGhtbXR4e35+7+37evbz7v1tant3bn/9/XZ99fv/8Or2cW52/Pbu +5+z6d3ZzfPv29fj3//z4dnpzeHNv8vj8+nNrZ2756O7/fnR/dnl2b2tqc2xteHz/+PT37O72 +6+fr6ezt7ezq7+/x9/j6b2ludnJzcm5mY2hoamlpb3NtbG1z+/Lu7Ozo7PTx7/Hp6u3m5OTt +7+zq6fh3bGhmbft3aGVnZmpoaW5oZGZqaW199/z88ejg4+Ph5+3u8/r9efXx/f/39vx8dnJ5 +eHd7bmptcXF29/T7eXhxb/75+fX28Pv8/HRwcfnz7/lqZ2dmbn7+8erq9PXw8/r7//56d315 +ent5ffXv6+j1/vr2+X1zb29rb3B3+fx2fP7+9O/n7P78d25ud3v78e/t7e/6dmpuevx+fXx5 +fn13dPT0/3xua2hrbGFlaG3+9+3u7+ji4+nr5OHq+O7s7ff9d2x0dP9vZmVpZF9odXBz+n14 +enb47evq5uX2fHV7d3v4e/12fPh+/PTx+P56c3hydH73f3d2/+748e9+dXT5/m9ub297ffP0 +dnJxaGZxd3308vn37fP08fb3+O/t93j77fd0dv/8/vr7+/Xx9fp5bWxqamttcHV6d3358+7v +9u/08vX+fnpvaWdu9vR4eX16fX13dnFvf/Lw8e/o6fDz7Ozx6vt1bnBwbm9ydXBvb3Z3e3Jq +cfz57+rx8e7u8P58ffX1e3VzbXXv83h5ffn6eHR1bGpsc3n/+P11/vbs6urn6erv8fR1Y2Fo +efn7enx+eH57/vl7cnx4fPTr/X18ffv57v999vtxd/vz8/91bGtobG9vcnR6fXr7cm537Ojp +4uXq8/Xt9e/1+v52dW/x+X18dnN+fXVscG9rZ2t0fXJqcHR4cX39eXd39vn08vTo3+Ds+Hh6 ++fd+9urr7373+Hdxfn9panN3d29pa2dnbX738/l5bm93/O30fuzq8/Pr6O338u32cG52fWts +evpyaGttbmpx/fD47ePp6OvvfWtvbv99evr/d3h2c3zu7Pd9/n5yfG5sd/n7eH73/nZ6b2t2 +7+3t7352/fX7fnj/8P9ycHr+/P727uzu8Pb8+/V2bGtpcG1sevPz7u5+e/P7dXt+bmpwb3F1 +cvjye3f97vF8eX5+fn5zb3v89/t+ff717e/47O7+9fD8d//v8/J6/PJuc/h8Yl1ocn10eft4 +fffz7/r+/nR0bHN7eHNze/5+d3N0+/Lu6ezz6u9ua315b+7vd35+5+Txdm9vc3x49XZue3Zv +bnx++nJ1+np9b2lobvz8dH/+cHZ4+fHr5+777er4dHn29Prw6vpucndtanN3fPn+bWVqb31/ +fHV5fnv6fvXn6Ons9/z6+XRkYWVtZGR3f3n68+/p9/Lt6+bo73P29H5183tudnt2fnhu++3q +9293cWppanVtbH7093t79O/v+Ovo8P57//7x+X11dvL3eG1ubnN2+vtobHN87+3w8+99bmxw +bm/z9Xr37O/9fHD883F8/nd77uDl9/37fXR5b3FzcXV0cW18+/xvc3ZudHRwdfn5/Pt89PP8 +e+7o6uz6+/pxcv17+Px59PF5ann99P1tcnFnbvz69O3q/XL27urz8u37eHhybXB1cff3eG5u +9/bz//Z+aW1vX2Jv/+nv8ensfPzy7fvv5/P49vD/fH5z9PD5/Pz0fmt08/f/cG5tZm56b29w +b/7p83pz/vN8e/v4/vf49v52/u/p5e779vv0/Hh1//1xbW1oYmpsbXh/8n/26PV8/Ofs8v9x ++nhxfX757fHw8+/89fxxfG9vamRmZnp7cXd+/HT27vR8cPf7b//w6+zu5fJ99v5+fvNwbnJq +dOz4e3j06fn6/HV17+P2ZmZpcXt9emZqd3B1bmt77P9od+/z7/x89PHl3uDr4+H1d/n6em9k +YGJgbG9sbGx7bmtz/unp9O7x9ers8+z79/p7e3L+7OXu/fx8/u7za27+dmlramJhZ3rz7O/q +6e59eHxyanD29O34an34dv18/fzv/n/+fn9nZ3J2++fq6t7j/f95ef3v/mhwbW17enJ5/ft+ +cnZ2eOjr6vB7/3R0a2d1fHR38/D57+vr9vXu/3hwdHJhafvt83d+dvzz8ufu+nh56vR8cnB+ +bXT5emx88XX+e/3u73Fy+mp4cXFrde9+8/Lp6+/57/P58f5t/v/y7Xhqc3FvbGxtaHd0dXj4 +7evu9nh9ef7v+3ny6vn3+PJ/b+77eHxxenr5cXZ1bG5tb/x9evbt+W5nc+/s6Obn5+33+fz/ +cHPs7nl5fG1jYWv9eHhsa/t8eHJ3evz5cHrz/n18+/zx6+Pn6eju8fD99Ovu+nlqbm9pZGpt +bn50fHBlfu39bn3l6/T09nt98Xd+8/7o7nLp+m98a2FkbWz2+HTt7fL8bfvv/nr07+71//31 +7vTse2due3FkZ3Ry9f337PP98/5vdvzk5nFrcv75+3z97e30eHB5empvf/r47fl6d3B3eP5t +YWt8/m9udvbq8vXq5u3v5/Pt7PTz/G1pam1/a3nt+nv+cfjwb3N+b/Dg/2xobv5+eP337+t8 +b2l5f/T5b352fXBj/PX56+Hh7+/5+31sbvTofnzv+nR1cmZ8emx1e3/4fmdk9P9zfnlpb+z6 +fvvs4vtw8PHz7uns7+79+P1ze3l7c2Zrb3x7enl2enP3eG12dvnt7On0/fbu/W99eG1zcG5t +aGz16vFscHzycW18++v4+O7u8O3j7uzu/e3x+PPu9nFmYmpoX3BucPf9/fF7bGpu/vbv+P3v +eV9xc2l2dWtu+O7p9/Pe7e/p+X796vtsb3j/b/rs93l/9/726O7r/GppaWlnbW5w+XJtbGtw +d3Zpb/vw7+r3+ent7Ozv7+Pf6XpqamJjfXdvd259/vR+9XptdHjw/X36f/f9+vH6+fV+evf0 +fvl6f/du7vpv/m16fmtobnZyfHZ35+bv8ntwb3L5fHZventxdXjv7Xxwd+Hc6+n3efvvc3Z/ +aXL8cHF0Zv56ZP7r8vZ1dHB8amVuaP58d2xy6u7w93X7+uzm6ezr6fh59/B6cXN2a2d2+vl2 +a3fx9W9wfXFvfPru83d49+nv+XxsbWl5+Wxvdm9veHNyfO/o7fV7f+7u7uzu9/Tu9mxjcnt6 +6u3573JpeHxra/v5dXNpdH167nzzfnj9bHxtYWr883Hx5eDf5+vm7Xpsb3Xq7fx7dXls7+9p +ff5tZGRjZnr+8+xxavv39HJtfvf99e77+H50a/n/a+fsc/bw7PLw9vrt63pu//L7d/l5+/39 +fHl1Y372ZHFuanNx/nX+92h5+XRyfevxfPvv6+5x/ezm7PTr7vpvevNz/e339m7/7/loYWlv +eurtcXJ1dWRmb3t3bGBoe3tw+er1+nvq7O7p7OPt9Obs7W928u/o9P3+c/htamxrbF5hY19p +/fR9+Pnz9X/4+Hz5fO/m6OXv8u3u/nF7eG59a2RpZWlu/G1t6uLf9nr+b/tvanV3cnltbH7y +8u/37ODte+vq/O77d/hva3Nsa3d8d3/teG1/9O/96vxs9/X/82xs9PN0a21u+H5n+u72eXn2 +7vb56/dvcHNucGp46/h2/G185+zv8O7u6nR65ndr/Ph3//ttamVpeHn69Hr5+X90cf9ybmNt +fvX/+fbs7/7i6vL9+flt/vH893Zsdfh5dGps7+n++e5+/v1sa2p37ff9aW/y/nJ7ePjq82Vg ++PXz8/fi7PP9bG5obHP/bGj/8/Vtfuv3/vj2fnZxd3x7+Xn25evu7vL3+/PzfPH3bGVqavdu +bPNw+u3y9mtoanJzcP3y9vn2dPnm9W5u9+n6f/B+9nxu8HJp8Hr+93f2+P51++j9fn5/7Wpl +eXZ/e3j3e3Hs5/Tp3+337fz9dfL5bGNtZW97Z3F58XJlcvVvcvdu8vp2d3zufe7d5evnf//3 +bXhocPdtcenj+3twdP77+vfu7vdxanD8fXH68OlxcfF5bHT57nJt8H9pbnz5eG/u+fbm6O/5 +efl0aml28Xlxb/3te3x0enNobXT86ut8d3Nv4+f8/PB4aG5+fff7bvz5/fB87fDx7nXxfmVu +93xmbXfp9Xb8duh7bfLq5nt36udoX3B2ZWb+fej2ce50aXX682l17vTr7XZz8PH0eHl2afpv +e/h+9u/p4u998ur9dXV/fWrw/GJqe/vtd3fr8XRvbH3ufX3xfXV8dfdyd/Nud3px6W9v/vNz +eObn7Gxv/PZtbev+/fV98vD2bm7sbHXreXr99Xbs6PVq6uZweGl3+31vZntzcnh79XB4d//q +cnt5b25s7fpyf+3lfX/46+327/by9/VpZvFocu1peHZ2fvP8a/3/f/l7Zf7qbv7r+H7p7Xh2 +e+vo+Pf26/JyZnzxcfJtaXRobGdnYG7p8f9q5t7v7O7t/vTsenFtdf7m8m/0/Xlt9+/7dlxg +/WVub2r9e/P99P3u3uXk7Wb26H3u4vtu7+7t835uZXdubHFjWGN4bnhxc+9qb/Zx8eL6eOTf +73rt5+TweOnn+u3+Z3r++O5zdm9faWhq/mVte/lodfr+7HNz6nZk++jt+f1u9+52enhx/Wtw ++ePr/+Pt9fVvfnzv+/r2duz+dPd6cv7p/WZmcG9tZmNsbXJx797h+HDp4mhgaPlxW3vm7+jo +3Nv9bXV5d3D+e/Ds7+Xz/nlycG5ma2pca2hjbv3u5Pjn3Pzz7/z+/Wth8/v7e//t6Ot5cnxv +73Jj8fvk+mFvcfF5b/r0eHH++Ppu6utt9un1/P1/fe3y9vp8a2praW3s9m/u+fnvfO/uZmZ1 +e15abH74em/r3PVv8uXi6vT+7Ob69fPr7HF773JnZWpvb29tbvp0ZHTz6nb88/L9aXZ7Z/zk +9O7u5+H37fBtbHhvaHb3+Htw+fb37/v59PtpZ21paWFib3f3+/nk4X185+jp/Pvy/P795t/p +/fPr9mtrbXBmZ2ZgbnR2X2T+cX717PJ4fe7h9Pbt6+//e/Pj+Hf07+b3Y2xvZWVhbPN2cnT0 +bG5z6+h5/nvs9Ph38+r98u/j7nd4fu/0bG/v6HRdavb4b3X96Xtrb/X+bnvx7vHu+fHxf3Vv +a3V+dG99+PhtZ3Z+dXbo6/HqeXD9+vTu9Px6aXP/8Ony6Or9/P3zcGRta211b275921sefd7 +bXV6cn71++zq9n319W778fZ6+/Hv7O/wfPrr6nhseG5dX29veXL9/XN7efvt937y7v1w/PD0 +eGxo8+z7/PLw9fvt73hydnN68e3v6uzv/fT3+3lgaWxmYmZscntxeu/teWd3+Xbr6erm6+7x +6+vt7O7vfGltbHV8ef577e93e3xvZGt5dnF3bGpyefx++fh2+n726+7v+3lrb/707P17fvP2 +fXR77PV88Ovr6+vv/npxc3RtZGh8b3FnZGVfbHT88e3v+3j86Ony7ejo5+369np99fDt73xs +Y15eYWlu//x5+/vr6Ofq8evw+Hx8c3Z+//j3ePp9cnj9e25udm1maG1++HZ0/nvz7+7u6urr +7O3t7+Pl9e/s9Hh1e25pbHh+amlxc21ocXX//mxtbXV0fn52cHjs5eLq6OPh3enq7vl3aGhs +en95cmts/394d2lka/t9b3J5dHR8//Pq6+/17u79fHd6+e3z+e73+Pv9c2h36eX2fn5zb2xz +/nt8dHJvdX7//P708vR9bGplaHr59fv78/d+ffL18u/z/fz8/P7/cX7p63x6fG9xfXxzcHx4 +fHz99PDz+/57dnV67+32/vny+Pz0fGtyenz89vN/eXt5fvh9cm//dW3+fnh2+vH+eHJ3ffPv +9PT17/D9fHJ48O/+dv56f/71+XpybHVveXz4dnTu6unp6/P+/fb8+PVvaWxqa3d+eW158Ov3 +dHhvbXP19vfs5Obr8O7u7fH7/HJwc2xzfG92em1pbGxqa3r1+Pj0+3R+8unh4ujr6fP78nhp +bHFseHR1dv58ffd7d//y7O/7cXJ/+/1ua2d1fWpscn358OvyePnu8fPq6uXp+3p/f//38Ply +bXFzb29pZGVoffD2cm96d319+/j38O/v+v3u7PD29O3v9+/w/X36eWZlffV6bGt1ff10cXFv +d/L1f/52bnZ3cn7x8/L58vj17e3s6uLn+n3392ttb3h0ZWhxc2x3f3ZtbXVybW16/Pv07/Hv +6eju//nv7u/8+Hx08unn7vP2+3JvbmpsZmBkaWhvfvPp6+zv/HZqcnl2/HltdPHn6+/y+PH4 +/3dxc3j57O////749u/t/nZ2eH76dXd+fn14dH57bGlrbGt9eXL8+O34e/z27uvp6fD09v9u +aW1tefp2evL1+fv27fP49Pb69ndzb2p1+3dpcfx2bHr+c21sbXX/++/1dvfs83x6fXdzc3p4 +evry5ujt5uLm6uft/XV1aGNjZWppampzdXNtamltdnp3ePHv8erl6+7m5ezw6+3x9/308/n/ +emlpc3dxbmtmYmdtdHx5d/708Ozs7vt5/nt4fPLsfn76fPbo6fX+8PtsamNo/vPy8vv7+Pzx +7PL07e19cnz6fXn5dm17dndxbnZ7fHhvaW1vevf3/315c3r26uDm7vbs6fb9+/H4+/1xa2lr +YWFvb3Zze/Pz//bp6O7z7evx/H75e3r+/vl/eW9ucnt8bmhnbnt6enn+7vH1+f5++/f9fHZ/ +fXn+9f11bWZe/tH55OZmVVHb4W/k4+xsUWTZZ1hozszk69PMUkfhYE554GXe32vo3nZvcXNO +V2xPXnbVaMzW6v7p5kvf5V7v8Vpx2mr0ddr33vFr3nZuXP5oXuxh3OzoafBned5eXtzjZnPf +5uv9XfPf9Vtn4l9v6FLm8mti7+193XN04W9j9Oj1/29nfe7r3eZz7edl6vNZcvxgXWbr/N92 +V/NsZm5ybXfkbW3n4+Pr7Ovd293X297f7O7f32hx8ldVXllKR0M7ODc5RVzcxbq4urvAx8vQ +19jX1tLW3dXHvr2+xsTGw8soExUdHi/bvqebn6yrsvRMOCQjLTNQuK+rpau+0GNJVF9c0r+8 +tbK0srdMIxkQEB8za6qfnZqcqsJBJh8gHiNPqqGgpbO/2D4xPWjIuLzDtqqmo6jPJxcSDxUf +PbSgmpyfp8U0KSYiK0TqtKSjq7TQQz5CQFfZ2tfIvLWrpqWoySUcFw8RHz25nJicn6rmLykm +Jjm/sa2rr8thVD5DeeHs0st+5cW6sKuqtHU3KB0VEho8sJ6Znai2ejIpJSlAtqipss5sVElO +ZdzAyE88PEzGramqq7HNQTIoHRUSHsWgmJiiv1Q4KicrNdarpa7MS0VGTeXKxMlbNi45362f +naOt2DEqLi4iGRghvp2anKxfNDIvLjBDvqqnr+I6O0NIZ8XE2FE0L0y1pZ2dqsZINC8/djke +EhQvrJ6bobpMRDgrKzfQqqKryzsvMzhSxba2zj0vOsirn56lvzsuNVe9s8geDQ4gv6CanKm8 +Xy8iIC3aqqCktEcuLTNLvqytyDgtOdasn52n0jEqNv25seYeERIfy6Wfn6a0Vy8lIzO8qKOl +uDcpKzBVsaWr1DMoL9Won6CrzUQ5OEvRx0gnHBkfPLWsq6qtun86MDZNybS7TUJKSFTGraet +7CwlL9WspaesteA6OWPHbzckGRspQ8i2qaSkqcU0KCk5TFjYu7a7wMfBtrPLNCgpNtevpqSm +sNs9LzNavlIlHRoeK9CioJ+eqecvKSUoNme5sbC0u8LGu8JcNystONq0q6SlrNc2Lj7EX0tB +ISUoJ0fOtq6wuN1JPjw+TM+8uL/Q0MW7t7jHTDYvOFHFtK2rsc1GOkVJP1TV1DwdHEFUMEuu +p7tGOEu4scTHubpfOz7erqewbzs7OC89vq6xutJIWOTvTEpFNC0rMTY4Vu3Yvbm/0Mi+wsnY +3uHV2fDDs62vyz8zMzg/VuDEvb+/zHtSNSIjN0o4PMa3x1dPwa+02FnPwOBFU8G+ycm+usDO +9GlKNjM+aFdOw7O7304/Ni8vMDpoxMXSyb/G1eDPzvZPXtHI1/3Pwsrf/tHG1lJRT0NOTUrc +zdzR11hBPUI+P0tJZ8PEy8zEwdt1bGb5Tk3KvMb66MnTTUTZwdxbXVFQTUVO4srNzs/WbEVH +SD07TtTP4NjV7FBHaOZ6/d3Ly9vf1tx4dNTYZPfH0f9k29xi6+vbzOtLR/ZQOFjaTWjN21lX +TVBfTfptUmNs89HZ693h5mrPz83Kv77nUstNOMrN5NPkc2tGWFJEbNvcUlTYWEHmvjrj5TfS +dUnG4XDFPt/ASc+60ui/RFX7ReLF2eXL4WVeVFZW5Gtq0lZf7undWs9MRt8+YV//x13v4Mxc +wNtowkpnQmTWR2i812nSXVTNcEvhyExZ3elV7GDZbGbcRmxiVljZ1u7NYMVh3sxL1VVPcWtT +1v/Pcs5bTs1E3Pvg8+LLS8NZW9px3VrkTU1dWt5N1fPl207T3+7tXfBj9Gjm7N/cfcRgRc9h +U2XY3FHN8Fjf2EnY1k9Q3E9YS75LashadlreY9bW23jNZ2prbWRoy2Pq+PZq0nVT1Wxd8nph +X9ZPXNhI7WpX3/bMTHXbZkvAYfrB5d1iz0zMa0TC7ULPxTvn2VZHx2s/w/FBycQ8c70/T8VL +ULtRR7/pU93lZdTaY+TeV+Jfffxj31jkak3YZW5b3uVecODJ8lTI1lr9WmVXXU/O2UTc1mlg +69fs01BnzUnjV1/haWpu1k3Y7VjP10nF7ldkuUpVu1pJ1XBHxtYzvcw0ZLg9QrlxPL9mSr9U +Qb/FOeS8R1PHUevQVPnGUmnEW+3a63teWWtrR+fYRHPmXmT84/Zp5OXufdJo2NJW2+hgcV/u +Yenib/7272lm49vfeFzufk1dzk5IznxW1tdh0+pf0t9P3NxPaelrXHRicu5iaNboZNjeWfXO +Z/XVfGHaXWnlflrc6FpqeWtS7u5SWGdbTn1dU+Tfa9nY7NbN18/C3MzH3svI39bB2GdPRkgz +LDc2LS9CRkfl0by5vLOttL21u9bT5VhNS0xa7V7cvcPoy8lUPT02Ly8tLTY9O1XIwr2xra+z +s7W9y+BtSz4+RkVIdM3Fwbu1vc7STTozLissLSswP1DnvrSurayrrre8xHFLPTo4OTtEb9TJ +uLKyra29x9I4LC0mHyMnJi1AXsWvq6ijpqqrtMprSjkzMTA3P0vVu7awrKqsrrXD3zoqJyIe +HR8mKjJMu6yopJ+epauvu3Y7MS0sLCw2SG3Ht62pqqusr7e8VEA9JyAlHB4mJitFyb6qoJ+f +n6Ost/o7NSskJywwO1HVtq2uqaerrrLC5d5ROjUpIiUhHycuNlfBtqifoKChqLLESS8tKiYp +LjVO1cm4ra2trLC1uMr85n5HOzQrJScmJi44R8u3r6eipKerus9ONi0qKSsyOkfTwbexsbGw +sbm+yOrk4O39UEE3LSkpKSszPVvItq6rqKqut8doPzUuLS8zPVHnyLy5uLO1tbe/xMvKz87K +21xFMCknJSgrLTNL1LyuqqiprbK70E07NC8xOD5La9bIu7S3sqyytbvCx9dlTEA2LSclJCUo +LjlSy7itqKWkqK63y1U9MCwtMDhGbNK+uLOvr7G3vM13bFxYUU5IPTIsKygqLzNB8MKyq6em +p6y3yFY8MS0tLzZBac+/ure0tbe7wtDncGrp2dveeEMyLCcmKi04Tte7rKelpKqywms9NCwp +LDA9WNnBvrizuLm7xcvP3djOy8fK1lo4LCYhIykuP9+9rqajoqavw1U4LSomKC8+47yzr7C1 +uL3Hz9r/9trLvru9wtk/LCQeHiIpNXe6rKKfoaWvyEYwKCQkKTnjuq2qq662x/hSS1j42si+ +tq6vtck8JhwZGh0jL+Suop2cnqSv1TgoIB4jLUm8q6Sip7DEWD47PEdm2MW4r6ysscY4IhsX +FxsjNcKmnZmZnaW0SywhHR4jLlywpJ+fpq/KRTMvMT7+xrivq6eqtt8wIRkUFhsmPrikm5ia +nqi9QCkfHB4kMO+uop6epLPkPC0sLjhewbOsp6WnsNI8JhsXFhgjNOGpnZqZnam6aSsfHh4i +Lkm8pJ6foqzISjIqLTVCz7aup6Smq7pPLyIZFhccKD3ApZyam5+qu04qHx0fJC1MtKKeoKOs +x0MvKy84R8myq6alp6y9SSwfGRYXHSo9waWdm5ufqrZYKh8eHiErR7Sin5+gqLtYNi4wMz3Y +ua+ppqiuvkkrHxoYGh4lNr+qopybnaKu3jkqHx0gKjjYrqeioau6yFA3NzpH1L63rquvuMpI +LCIeHB0kLDy/q6einqKqss8/MCkjJy40XLm1r6qwvL3cTWzk5Ma9vbe3xNPgRCsmJSAgKDJF +0bqup6aqrK+9X0I6Ly4wM0fda9q2ucnBv8S+vb64uMDAweVHQj8vJSUqKiozTt7EuLGrqa6x +tMJiSTszNDI2SkpE2r7Hv7Oys7G1t7fD2Nl1Rj8+MyspKyoqLjhH4Mi8ramrrKuzxtxKNjQw +LDQ9O1XDwLuvra2usre3xO9vVUI/PjUyMysnLS8sNFXkyLOtqaaorrK+Zj84MS0sLzs/Tsa5 +tK6srK6yt73QWkpIQEBGPjc3MCkrLSstQPLLtaumpKWqr7nXQzcuKCYpMTZExrOvq6eoqq+5 +vtBKQEM/QEtHOz89KSUuLCUwe9a/raijoKerq7lMOTQpIyQpMjpOva2qqKOkrLO7zVY+OTo7 +PEVdRTY/NSgsLiw3TVrCrKuooKGqr7fyPDAoJScmKjlXyrCpp6SkqK64zFo/NjQ0NjxJT0VB +QjQvOC8tRFhQw66tqqWprq68WEU6LCkrKS49QnKzrKympKmttMnfVDgxMzEvN0dAPk9MPkVH +PU1oWfPCu7u0sLS4u8reekM3ODg1OEdb1ry0sK6wt8DSWkA7MzEyODxDadbKxcHCxMrS0uBm +YFdOTFJSU1pVU1VXWl906d3WzMbDwMLIzNX/WU9HRERHSlR44dXPzsvJycrO1tjedVhUVk1M +TUlGQ0RGSlZs6trOzM3Ozs/O0+dyaVpRTU9YWl5u59TOzMbDxMvR5d7M9urY4PHxblVOSz86 +Pj03O0lNVeDSyL68wcG/z+VuXUtBQENLSk/0zsrGv72+v8nJxdff0dZ6cdl3WVxNRz0zMzk2 +MDVIUVfWvbe0tLa0uc1pX0o5Njk6QktN4L++vbSztri8xMzdW1tZRkdPUlxZQ0tMMTE+OC47 +UU/8yb+0rbe8srfV/PRLPTg2OT9BTdnAu7ewrbC4vcbcUz88Ozk8R1d8997NUDdITS4tRUc8 +TNO9srO5rqq44M3ORzU0ODk1OV/Ox720ra+5vsDcTEdGP0FETt7V3sPJUkU8ODctLDtHPEfJ +trOzsKytuc/b5UU0Mjk9ODt+ycvCtbCzusHEzGJKT09GRE586eHMzldNQzEzOC0tPUZF6rmx +r66srK+60/NZOy8yODYzPv3XzLuysLO6vsPdVlJUTUhLXt7Z1svTWkk9My8tLTAzQXzKu6+u +rKyusr3RUjw2MS8xNDpMedC8tLCvsbW5yOdrU0hGRUlk5vThztVMPUMyLDguK0R0UtW1rq+x +ra+3v2xCQjguLjQ8PkvRvLavr7CutsTP1WBCP0VJTlVn1stvR09RMic2PSotT+PWv7asqqyy +tLLCRj1AMy4yNThP3M69sbC0srG7y9V7T0U+PkRKU13cy15EcPM1KDVcLipfyd/Dua+qr7u7 +ts0+PUk3MTk8TNnPxrKvtri2uMbhYkxAOjg7QkVIYdTJyMjE5UM8SzImOzYx4lNKrqy+sKmu +vcXSVUtCMDlPPD7xy8W/u7i1ucbO0GRBP0VEPkNcbfng2cjJfuXUPTRMOis0PTtKX16/sr28 +sLW9v83f2l1FT2FNTurPysXGxb/J2fB9bElARU9CP09bYHpWXOnWaHba4utWU2NOSU1SXWpc +XtfR7dvJzdTX2tLU3d/Q0trX3tLW6XzW419TbF9FUlBOWW9WdOjy6GPj5nN5YOxkYFZX42ZX +TXpvT/Jg5t316vHM3HrO0c/d09zf3e7q/fn6XmlhWl9a6GBp5Gbp5fvg2Ht4/W9lVGhgTmNn +WXD7dn3m697v7nfm7lRtX15vY+/82N7W19Xr3OzuePBnXutveWj47/Dq8dnr6fV4b3JRWF5Y +XmTs5XRv3ezp529nZF9qZ3hmZn3lZOXs5/TxdeTm+f7g+fb2cff25ebx3Nbx/n15WFlpXnBh +bnbr4+bb5fV6ZF5dXXp07vv52/vlfPJialtYU1VZV21l+W7W19LRz9HR1efh+XFdYmRiX233 ++vbc2dzh+HlkZ1hWUVhdV19y+tzZ7NzX5nBuY15aUV514+Dc2NnV4tnf6X1iWmVfUVpZZW1u +5d7a4Nvq6d7x8P7ub29qaPBq7+zf/u1rbXBnXFZoYHBm7W9+/ufj7e7l63Jp+m9q9X/14PTb +39777vJp8l9ta15fX2RzcOjr9vbj9e/za290dH3y4vjm7+Dz5XXucP1daGlubFxgW/l19+/q +3/H28+TsdnDs9PT55OD08PPrbmpqb3JjdXD+aexc+XX3b/zscft4/2D+b/1m6vL37fDj5ujr +4d7w8/LlfGduYWtrZm9me350bHpw/nN16u74/OXc7G5teHZqa3B8fmtmfPVwe/Hq/uDs7Xvv +8//u8uludPFx63P7/OlqZ2Vi/mdubX7+buz16Pztdu1+dvBzfW/wf+fw7Pz1d/fnb2/wanBr +cHP5bnZ9fXl7/m3/fvnw9fB4/fFs+f3r6uLh5P3rb2xzemhpamp3Y2h0b2R8/uznfe7n4vL/ +5+TvfXNxZF9rZnFrfPH1ePvk9/b87fD16vDv7f/q9Pz5bnX9bW5rdnxyZ3zyafh5fm9pc/du +cGVoe/rvfe7/7eTt3t7g7vbo7/z87edz+vJmZW5+X3PsVG/vanHpYud9anz5a2R87+17fn3t +9njn6ejs5fX853hpf2dc6fr+7vlia3pjcvhrcev76e3mbvnref3ybv17/npyfW3f7eP74fZ2 +aWbt7PZb619vZ2/rZ+5w6277XXJ5eOt7e3Xqbvd07ujweX3++exz93t0cOzn/d7h7u/3bvZ1 +c2N6Z1lv72JkaXzp7m563O1lcPPe7v73+fZoZ+/9aHn8am1udXj66+rx8uzjfvn19O32+3n6 +bmj17PX17vl5bGhveGxfe3Vi9Ojn7uzq9n7+9/p5/eptZ2hsbWBdXGBfWVZVW1df7+PZz8/J +xsvKysvU5O3+bmZgYGRp8t7d9mpUSEpDOjo/PT5FTGjWzMO6ub28vL/G0+n9XExMUE1MTFFj +eOrSy87LxsfHytrf22RIQ0Q9NzQ3PT09SXPd08i9uru+vLvDzt3saFNMTU5HS1pt6NbKw8DA +v77BzNLSekY+OzUvLzQ2NThDZN3Rv7e2t7a0uL/IzeRYTkpGQUFIS05Z3szIxLy7v72+w8/6 +U0c+ODMyNDAyOD1HXtjHv724tLa5ur3CzN3tWEdCQ0FDSl/+69fJv76+vLzCy9ZnRzw2MjEw +MTI2PEVQ7sm+ubWztLW5vMHL3/VdS0lHRkZITVZu28zEwL68vr/G1vtTQTs1MTIwLzM4Pk71 +zMC8uLO1tbS4vMPWelhLR0VDRUdKV2T/2M3Evr27vL/I32dYQTg0Mi8vMDY9RFbaysO9t7O1 +tre6xM7jX01FQ0RCREtRXGzbzMa+urq6vL7G41xPPjQxMC8vMDc9QVDaysG7tbO1t7a6xszd +YE9JRkZAQUlOW+7PyMK/vr6+vcHM52JKPTUyMy8uMDg9RlLbxr+7tLS2tri7w8zUdVJKQkBB +Q0pPVGvg1MzGv7u8vr7G1m1PRDszMjMvLzQ8RE/xyMG+uLS0t7m6vs/a4lhLSEdHQ0VRUlbv +08vGwr6+wb/Dzt5YSUI4MDMvLjM5P0xd1sK/u7e0tbi7vMXW2ftPSUhGQ0JKUFNn3M7MycG9 +vr3Awcrpak08NzMvMjEyOT5Ha93Jvry3tbe6u7/I3O5+TkhIQkJHSlZjYN3My8S+vby9v8LJ +33tYQTk3MS8xMTY8RFni0cK8uri4uru+yM7lXFJOSkhIRkxOVW/hz8fEwL/Bvb7GwtB0WEA6 +OS8tMjAyOT9T6ti+trm1sLS3u8PH21VTTUA/P0FFQ0xrf9/Kwr+7urq5wsbF509GOzQxLS0x +LzM/TGTOwbmztbGvtLi8ytlhRkhBOTo9PUVPaNfKwbq5uri4ub7IzNtXQjk1LywrLzEwOkxq +18K4sLCxr7G7v8l9T0U7OTo2OUJGVdnLwbm1trS2uLq/xdJjUEU2MDMuKy0vNDk/XMvCu6+t +rrCwtb3M9U5BOjQ0Njc8S2jbx724tbOztrm8x9PoYEpAPDUxMS8xMjM8S05uxbq5tK+wtLe8 +xt1WQjo6OTI3REpL9MO9vLSwsre8vsbcZmhYRUE/PDUxNDk0Mj9STVPMuru6s7G2vsXL5FJB +PD08NzhJXmTZv7i4trO0ub7I1OBiTExPSUBDQTs3ODk4OkFLT3zMw766t7m8vsjiZVhJPDxA +P0FS6tLHvrm3trm+wMfYd2JbVE1OU05IRD88Ozs5Oz9GT2PdycC9u7y+vsTR7mVSQ0FHR0xe +4s/Iwby6ur7GytLsal9ZVVdZVExHQjs4Nzk5O0NOXejLv7u4uLm7v8jZc1ZHQENCRU5n3c7F +vr28vcLJztfsfG9gXF9aTkxHPzk2NzY3O0FPedDEvbq4uLm6wczdaVFDPj9DR1fz18rCvr69 +v8bLz977ZFtaXmhoU0lCOzg4ODY5Pkdb2cjAura3ury/y+RjT0U/QEBDS1/nz8O9vby7vcPM +1uxzb2xraGxuYE49NjU2NDU5PUJa1cW8t7e4urvBzuJkS0JBQUFGU/3Yx768uru9wszZ82Vh +WlZec/1xXEs+OTg4Njg8P0Zc0cC7t7a4urzCz/hXSEFBQEBIW/fTxL++vLy/yM/Z9mVcWl1f +cu3wbFM/ODc2NDY6PUZizsK8tbO2ubvC1PlYRj48PT9KX+PLv7y7u7u/xs/nXVJZWVNacO3u +9VtBODc3NTU5Pkdozb+6tLK2ubzE31lLQTw8OzxIYtzFvLm4tbW7xdD0VlNXVlVd9d/ib008 +NTQzMTA2PU7dxry2s7G0uL/QdVBGPjk4PERV38i+ubWztbnAzu5aS0dKTVZ84d/qZE9ANzMy +MTI5Rl/bw7q1srK2vcbWYkk/Ojk7P01l07+5tLK1ur7G2llHQUNMW2r8283XaEk6NDAvLzE6 +T+XFuLOvrrC4xNheRT05Njg6QmjTwrexr7C2vMbWY0c+QEVS7t/aztb3Szc0My4uMjhH38C6 +tK+vsrnE5VVEPTg3Oz9R5M2+tK+vtLrAz/tNQT9AR01d08PBwtdTPzYvLCsuND1azryyra2v +tb3NZkM5NTQ3PEFXybu4sa2vtbzOaVJKPjxEVGrPwb+9wtpKNzIuKSouM0LxxrmvrK6zu8z3 +Tj02Mzg8QFHUvrevrq+yt8LdW0g/P0FJXtfIwr7A1VdBMi0sKywwO07YvbWwra60v89tRz05 +Nzg9THjMvrawsLW7wMxtSUFCRklQatPDv77By25DNS4rKiwuN03TwLewrq60vs3tTz86OTk+ +TH7PxLq0tLe7v87zU0hHSEpWe9TFv8PIz11GOzEsKiwvN0Npy7yzsbK0ucHUaFBHQz8+R1n3 +18a+vLu9v8fS611TT1JaZOjPysvO1nlMPzkyLS81OD9N6M/Au7m3uLvFz95kVExGRUxebe7X +zMPAwsXIzNbmfWtncu3m3+j5bltNRkA9Ojg5PEBIUXvaz8vFw8PBxcnP2e79dWBfbXRx5uDj +2tTS0NLX3N/h3dvZ2+p5aF5WTkhFQUBAP0JJTk9b//Lj1c/Qz83P0dHX3N3b3+zq9Ozp5+Te +2dvW1NfUz83Oz9ToblxTSkQ/PT09PkNKTE1edXjh1dbWzs/X0s/W1M7T3t/l9O7f4+ne3eDg +3d3Z09PQztPe62tWTUc+Ozw9PEBHSlR09fPXzs7OztLWz9fd3N7p5d7v7+Pf4OTh3tfX2tjT +0dPQ1dztd2RUSD48PDs7PEBFUHvp6NXLzMvLzc/Pz9TW4eTi8P/67ODZ297e4OLg3Nzg39nc +7XNvaVhMR0I/Qj8+QUlPWXDz38/LzMzLz8/N0Nre5fLi5vXp3Nzc2Nzc2Nvm9Pn7+HxuZ2Fd +X2JQRUFFSEZFRk5hfuzk2dDOztPY3Nvc4ujv8fHh3uLc1s/R1dbb4u/t9nRs/nhkZ2tlYVxd +ZWRdU09PT0tKT1FRXWxqb/Tk49/Z1NPSz8/T09LU19rb3N3g5+rubW96dX327HxvbmNaU1hZ +Xl9eYFtYWlxXVFxdXmFbWmb6e+/e2NXOyszRz8/Y3+fl4uLt/v1se+fi7O3u/nj+bV9cWE9R +VFJZX2hqcHt29On5bGNlZ2xpa2n46u3n3dna3uTi6OTp6eXu7Ojm7OPi4+ff3+t/Y15ZVFpe +ZGh3fn5xdHFsZGJkXVxcX195em7559vk3tzu5t7i+vvy8+nz7urn6+jl7/Vzb3BsbWd8enZ9 ++P9zcH1xYmdpYl9udn5xfXru5vTg3N/v7Xp6bXduaGx7anF1eHTzdXJuc3RjeXnx+vPi29vq +4t/f6+//a252bm36/3x/8/fw63ZubWdeXmJfZGp87uzu7Ov7a3Z8b3F+dfp6/PPt3uHveu77 +/Hl+bGj7/fl57vT0++7j73/u4n1tcX5vb311eW158XJqe3Jf+2Zr7+d26/t+eebzeG5obm5m +Wm95YXbr4ufe6uTk3OfY6Nvx8+7pb2F+b35gVl1WVfNhbH3n5uj08u3r6nR+a375fevy82/w +b2N1/fB1+Wx7cPRpbnjk6nfy9+vs5/vh/ux6Y3Nbc3T6e/Lhcvn76tzq+3n5eVxbaHv4avlx +d+lzZHJ0de773ubv+eZ8fvh17231bHl/fWp57OnwceXt83ZxbHvk/HP35XXqcXT09mlb5PJ2 +ZGP/dPZpeOrjbXL1/f9xb3/r93597ez3bW7o9H95dPd6anH17ufg3+Pt8PHx9W9sbHBwZWRl +Ymxvb3Z65uNzZmlqXVpZW19eZG3t3dzZ0tDNzs/Q0drd3t7d2NPV0tjW0+hSOS0uMS0rM0n+ +yr62ramstrq/20k7NTQ3OT1N1cC8uLW1uMDXdl5PRklRZN/Oxb/E20w2LSwqKCs3UtK8sKuo +qa65yGg/My4uMTVAbsu9s66ur7fBz/VRRkNDS2ndzr+7w851OikmKSgpL0jIsqyqpqWsvetG +Ni4rKzFBZtfFt6+zubq9zGxKRk9SSU7exb6/wbu7z1xDMScjKCwvP8awrKqrrK/ASTQwLi4x +OlHHuLe3uby9zGFcaF1QVGL86+vdy8TGxsPG3FVNPi8oKS82PVa9r62xt7m+/Tw0OD4/Rl3K +uLi+wL3E5UM/8vlJVtbN1N9l2sPN3srCzt9uTEVLOCYoPko9aLiws7rL0sZgODpLTU9v6ci3 +uc3Vz2hIR0tX2c/fz8XL2dHP3dzb3tLM1+z/fmdCLCIrQDs1bLWwt8DLvr5jPEnuZ05Secm8 +xt7Qy/VKQ1Pb2+rWxcDI3fvk3HBd7s/Jytl2dWRCLCEoPT84ZLOtr7zPy8N8PT5RV1tddci5 +u8jV5V1RW1ha08bMzcjL0XlPT2FfVWbSw8PWaWNqPigkLzw/TMqzrLHE1s/SYEM/RVr4duDI +vLzLa1Z5alFg2MfByNne6FtIRk504dnIvL3Q9mFKOSkjKz1MXsCwr7S/0trhVERCSFfz5NnI +vsHcV13laFH6y8PG3Gz56k9CTPjPz9HIv8DN/ExJPiohK0JOaMK1r6++4N7gWElCQlTs79nE +vr7NYmbnXk9c6M7L4Hjk2fVdWWba0NrdzcnScllRRC4mL0FGVc67tLK9zdPdb1pHPkZga3/V +ysLH5mjm+WByftvM0+/n2uZvZWrk3N3XzMvSeU9USjYsLjlCU2/Qvra2usbW191gRj5CUmhk +XfTRyc3OzNHQ0dftZ2FvdWhjYWju4+7v8fLo72dr7e1hVVlcWFJOSElWX1pZedjLyM3b3trg +92RTU3Ta1tjWzsrP81xYX3xuWl7m1dfc3d3b33lodutuT01UUEpHRUFGUl1l4s/Nx8XIz9vj +72tWT1dy4Nva09HR1/JpeOt+a3Tk2NTW3ebo7P11fHpYS1BTSEJGRD5IVVv219PMxMHGztvr +Z1JIR1Bx3M3Hwb/Cxc/jb2heW2VsbO/b29nX5/nqZjwwNTk3PUdMesS9u7i7vb/OUUlLPz9J +SEhsz8a/vLy7v9RtXFBJTVJXetHKxcHCwMTYVEA8OCokLjk/9cS9sq2yu8bmVk0+NztJXN7N +z8e8vcjP09babVVVWFxdafPb1NPQzMfJzc3+R0I9LCUtPUFixr21rrTBzepRSkY+PUpo6c7J +zMXE09vY6evp/O3e3eHd3d/c5G5ecuZ6XF1lXk5bTzpERz5JTk750tfYz8/OyMvpXVpdd/f4 +3dPOycrT2tTZ3uD1cO7o+fH8bmxsWVVjdHhuXlZgf3p3bko4OUA/QVPcycLDyszR29rje/Dh +4O7r3NLOzM3T1NLZ529dWV5fXl9dXV1kZmnu72pjWVdcWFdkevHl4fVkXmhlWU5MVGR5+W// +19DX2drWzMrMzs/O0d75bV9kc3z8/HZxaVteXFtmaV1dY15hXl1iXl906+Lm9nxra3Z2dmt4 ++vjx9O7n397Z1tjd7vd8enJw8t7s/OJ+YG9nXGrte3tt+d/r/+99aWthZ/x4ZmZueW9reXtu ++/Hk6Xn/fnxlbHBqbm/0eHXi4Pvz9u5naHxx4+Tn3djZ3dfcfHJrYXP2bWFsb3Pj8GBeaGRb +YmNjZGl86X1qevHp93Xq3uv59v1vdvd3eXrt6X598+Xg6unm+29pbHF48vzn4+zq497o+PF5 +W1tbXWVs+Hr89ebmeXFfXmVYWWVq7+Xh6fnxeO/6+fPy8O7g3uLs4er8dHvx6ujt+vh9evpq +W1xodHH17f9wfXn85X5veWdYYGhteXh+8+ftePLt+XP0+v7s9evc7XF8+e5/9fVxau92Vl7+ +fn395t7k6PhuffN0fPdt9ent633q9WR4fG9982pq+nZleXBaXWhta+zq7vjq7n54b3f08Hb9 +/u3m5XFp8el5Zl516PHz393n7/z+9fp8+HN/73Jt/Xd2fV9jdG1qcPLt/HBrb2xfYXny9/t3 +b/D2a3jv7e3l6nno9Hfq4OP07vPt6/xrfO1zafbsfm1pY2hzaW58b/73fP5zd3t4c/D1ZG3r ++XH46u3n6vDseml/6XR18/h8dG57c2dmfu7q/H7p6vXy/nNpbWpmfvx6+O/z6un/+fL7dnlo +aXZ87fP4fXZ7fXRmef5/dnj7cP7w7n1ud3/5ef3yd3/47+35cm95c3Bvb3X56efufX3o4Ov4 +5eb3+e76ZFpUUVFTS0xbdfPo4drQzdDS1Nvg9fL3c3fz7enk4NzRzMzOztPd6002KygsMDM/ ++b+wq6utrbPFWjkvLzI4P1vKt7O4vL3E2VxFPkBISU1k2svCvb6/wcXH0WtMOSskJywvPu68 +rqmqrrG530AzLi4zO0blu6+vs7e9xt1OP0FJS1BcedXIx8nFwcnV0e9PQzQmJC83OWq7r6mo +r7i41zowLi00Q0Vluq+vsrzT9GpDOD5V4M3N1cm/x9r0+vl+WlLmzc7W90MsKzY1NErQu66t +s7e41kY8NS80PULourSzsrnKcT43PkJFVO/IurnCxsnafFJLVvDk3cS9y1kzJywxKy9oua2q +rbGvumA6MS8vOD1Svq+utLrC1kszMDxISnjGubO60+vcbU5MV9bL2tC7tclELCMnKSgyz66p +p6qur7xKLysqLTdC4bWsrK+1wv5DMjU+Q1/Pvba3xvZjVElBQ17WzcS/u7fKPC0mJSgtOdit +qKiprrfMRDArLTA8Wsu1rq+yu9BMOzg8RU9yzbu6xtzvY01CQ1nUycjHwr3D3Vw9KSEqLy9L +uqumqLO+vmo0LS0yQF/lva6tsLnOXEM7Oj9GY8vCxtnVzVhHTU9a/OXZxcLHw8jQ1l42KiYs +NDZHvaqprbe6u9s5LTA7Q0VWx6+stMLR4lE6Mzxe+P/Nw8/X4VBFS1Va7dTIvb7Fx8nPzdo+ +LCguMy08ya6rr7iyr803LjA1NzhGxKyrr7a5wE4wLjQ9Qk3auLC6z+TeVD47Q2jWx8O+uLnH +71pZOyclMzk6frmtqrDBvsRDLi8zO0pU0bGqrrrF3U00LjM+Vd/HurK1ymdbTT87PVvMxcW+ +u8DK51Rf62xKKyhHPC1Dvre0t8a4smQ1PD84OUNtuLC8v7m97UA5P09HReS6uMXIxNhKOT5S +YWDdvrvF2fbp4Nv6YuFJLSswMjVPzLmur7a4vlc5ODc2PFXJtrCzs7bDXT44NzhAWM28ub7L +zn1DPUFJWW1w1MLI0tXg69/db1t5dTgsQ044QtjBu7zRyLvvPUdbV1Fl3MG7xcO/x2A+P0lO +RUXowsp03cLG+01b4/dLTs/E1+7SvrzMRzAuNy0pPMm7vLq0rrLYR0ZANjM7V83AvbWvtsbf +X0c6MzpOYmrOuLnH2tbZVj89TFtOW9PDxs/NyMbK515fWTooLkYxNeG7uLa7vbPEPj9dSjo/ +7b64wL61vPs9OT9APD/gvry+vrzHdUpFREZHT9/Px7q60GxCLC8yKjTfv76yrq+xxU9FQDEt +NkvoxLy1rbC/1vRIODQ3Pk1hz7i2wMjD3EhCQT9CRVTaycnDvLq+zvhkXT0sLT85M1LDur3C +vre/TEZfUEA/VtLL1c+7vM9zXFpUSkBQ2Nlp2729zdvMxdpOS3X/S0/gekg7OEI8NUDh0t7J +ura7ys/MYjo3QERFT9u6srm8trrhSENGPTY8W9PTy725weDtdkk9PUVRXvjPwL3AwL/K+kou +LTssKkfP0sK1sa624OvdPjE6RUlQVMWywsW0udZoVkpMQj5X7PXUv76/v8PJ3l9KOzk+PDs9 +Uc/c6MnD2llUU09KTHPX3N3Iyuf9altcdWvuzMnFw8zO1upoYGRca/ng2uHs+fZgVldSUE9W +XWzt9NrZ6d74T0xOPj1LRkhf+tzJyci+xdXT1+hnXW33dvLMydTR1ftiZ19cYGXx4/Tl1tx/ +dWhYUFBQTFNcVGXm5NnfaXNZS05ZXE1Ye/bj2M3Izt/d4ndz49je3NLT3N3q/PZrXnfqWlJu +82xoeebqaGH7b11ddO9t+dzc2uVlcFxLS05MTlhZ7uLdyszb3OJxWlFeX1731c7Pz87Q43fv +5f9hdulnY/Pi5O7z5OtjXmZcUlpdXGj05+t/+n1tb2tdWGFWXH5u7ufc2Obn2+ljavHvd/Hf +3Or3/vD3Xmzm7O/h2trb7Xx1YWlnW2/zZ2B462xk5u5mXlxbWVZgfGxw9u3v6OXd2t7j4OR8 +b/Pt9e3n73Frbn5pX3l6ZWJdeuj57djU6/72bl1ddW5t7OLp9f3r7fl0Y2RaVFdf+/Po3+/7 +6Hxdandmb/Xs8Ojc39/l49rd6ux+fnZjZ3VnbW5iYm53bf57f/xrZm5iXW/76OPx5uJ4de77 +eHv2729t6ux/fPnycG7u92Vs8Xtx/ejY3vfq5m1td2dxZ2ztdHPz+HD+8nrzfWX+cFxqeG/y +6Pl5fnZ6/O3e4uzr731tdfT2/W1ucmps/Xxpeev3bvT2c+7t7N/p+eTo8vH7eHpzdfd4c+z4 +aXF7Yl1nY2VjY/32+e3o7O7z+unu+/Lr3/f+6/n9enZ9/2t97Pl8ffT8aWBudWn33+Pp6O3u +d2l6fHNpdHdsbWz++3Bkb/tqbfjzbG/v8Ors8ObudvXh3Ojk2d/z/vl8Z19oc2xkb/xvY2Zs +ZWZvfGhlbvvv6/Lv5+787d7m5+ns63Ju7O1tfHx7bWJub2Rh9Ot1cnXx+m3s6P947unzaWV+ +f2916O5/d/ft/G5+82phbPv8fevc5Wt382thau/0aXL2dGVs5ux7+vDvcnDm5O3u7PN8+3h9 +dHHq53ZvbW1jW2VraXry+XBvdPDj3uX6+nFucn72b3rv9v/5am/w7e/57nhucXRtdO/r4+z+ +eW5scXtydXn77/b9+/3w7evn82tqaWJia/7/ffh5a2pw9vL7f/18e+3h73r5+fD07et7fu/v +/HxrYW52aGv+eHn9+/1vb/r7em97end+7Oju8vx88n5/+Hdyfev6d3J7fPzu5uHudnRzbHJ4 +9fdubXN9/vX0eGts/vZuaG76en72fXr+/v/y+e7n93p8/PDt6urv8Pf7ffb/d/fteml3c2pp +ZmpndXH78m9tf+rk5efu7/L9fv73/f78enPy9nv5cXB4/f5vb25maX77+vN+b297ffz1/nn9 +8O31fXl0e/n+8vX++/H2fPTq6fb6+vz+eHlqbGplaWt0ePn1e3p1/fDy8vh6fvHv7/Z29vX+ ++fz/c21tcnN3/G5qa3d79fd4/3368O7u7e75fHj47ez7e/d3bGRsfHpwcXp5fP75eWx37+zz +935we3R57Ovv7PP08X19emtsenb993xybnN5eXZ9ffb4/+/s7/P1fGx+8unq+fj4dW/98Pds +Z3FsbXn49XL8eXBxdH58fXb+7evy9vLy/Pjs8f1uaW91fu3v/nRyen55+vF8bfXw/31z/fX2 ++/X6/vr46/B/fX5+c2tobnFpbHx4fO3u//zv93F1+e3v9u/s+nn+7er2+O31eXZvaGVkbXH+ +8fj5eHJv9fR29e71fH799eru+PZ2bXJ9eGx2e3Rxdm9sc3Bsbvj59u/v7urf3+l9dH767e17 +fvHw7n51/m9kZm9xcXv9eXBsbHn1/nr8fGto/fj+9PT+/Hzv6unr7/f5e29wamZw+vH39vl9 +/Pp7+3dtefL4++vk6nJpdvn38+76dnz9935ub25vam149uXs9n5/bmpubml57ezy7enycHDx ++P31e2tpc/Xs+3d/+3pz/vtwePx1bm147Of2+/jt7u3r8ntvb3B0/3d5bm1ree/z9nh4eP7x +//98evz7ffzw+nt/cWhqbXRxbvv6//X5cnB9+Ono/nZwev746vD90+1w83fs+uz9bGJnaGpl +bGr+7H58a3Z5bP/67vV79fb/+e/p+P3z7Ovv7vl5cHX/9nhsdfV8bXr09X38e21tbW97dHZ9 +6vH6/PT5e/nz8vL1eXB3df3z7/X69m9v//Pt6ft4/vz3939vcv18Zmh6dG1vaXf38vH5cGpw +e3ZwbnZ+8uLl5+fm6Ofm7vD6fvj07vhvb3Nzc3VvcfhtaHZ7c3b+b2l0b2hpc/Py8vHv7e35 +evju7u/49/1/ev/9bP7u8fnw83JtcHV7b3r68uvw7+77ef17fnz+9nR0/XZueff+fXd7fv3+ +e3lwc3z6+W9x9uzv7er8dnv6dm5tb/b28+ro7fHs8Hpzem5qamVncm7+6ev0fvl8b3ztfnJ1 +e3r8//3r7H93/fzt6O9+dHVqa29rb3V4/O7r8v716fp5/n12dXx2c3p8/Xt0c3r4dW/+/vXt +7urr+3z/+/x4e3lubvz9bGxzfnR+8u3r+vn2/m9y9/V0b359c3f9fXr68ujp+312bGpt9fL6 +6+jufvj47+/+eG9nZ3Z1dnx2fH16e3l2cm50eXZ2/fx1cezq/e3q6O/17/v16uz5e3Fv/vbt +9fT9c3FrbGpqa//vdnz6eWdr/nB4fH11b3J7ePnr7erp6uzu9318//z7fXP7839+9Pjy5+n/ +df93eHB8b3X7fH57dW5uc2988HVrbnB1+fn28fTu7/fu+Xr+e314dfLv/XZ/+Ph8f+34/PHu +8fLw93ZtcHNsb3Frbmpse375d/To7Pb67e99cG58/fnz/XN38+/+fHt+dXn16+78fXtza3j7 ++m1y9/v56+9+fv3993V39/b9+/Xv8O/0cW99/Pf7e2lpbmR87fZzam1tcf77bGpzev53ePXt +6OTi3+j79vP3fe/p7PX+fHNsZ3ru83J1dWlqaW5vcfx7efn8cHN/e/zy/X15dHf76+18+evp +7O70/W1oaWt2dv7xfm5xe/v6/vHv+HVw/v3//fn3evXs8f16eXr97uvvfG96/Pt7d3FsbnF0 +dm5mYm9wbX19dXp9f3Nz//rv9nJz8+nl4ufm493e6vvw7H50ZmVrbGtoZGNu9/p3bnX/ffd+ +++33/O3v9PN4cW1qbHF5cW9tc3X56ejt8+75/Xjz73t2+/T8fnz7e29udm9xd3l7ffDy8u/1 +eHzq6uzr/XN57PB9+vB9bWpyeGxqdXd4cnJ6bmhlZGRuff7z7uvr5+fr9Pfx/nV4++7s7nJp +bnz37vTu7P90dm5pcPfxeHr4fnBubvns7vhtZ2t3+vl+ePbp9PZ+dW1oZWdueujpfHN29O7r +5t/k7fh8fvX3fnlzcv33fft3dXFvfHh3aWVsamz69Hpud/f09Ozl6uzr5Ofu9PZ2e3hv/vf8 +eHh0bG97d3J+/3Zsb/b2fGtpa2l48e7v8vT28/f7//58f/f18vn57vr15+z28fTr7f78eW1n +Zmx3bW14b2xw8vD+/H798/LzfHN2dnn+eP3t+H3+/359c3d5/nH55vX0735vb3jv8X39fn73 +fv3y/mtv9/f48fb4+Xz5/Ht5e3pqce7u/v/4+n5++fN7b2pteHf6/n57ffl2bXf46+93/fnz +9u/8bGx1/Pn3b2hmZ3JwaXj49ubf5u3r9Xl68ezx+PX0f3t19/f//3lubGxtZ2pqa3FyeXdz +fHt3/PT49O7u9/Lm6vD88/B1c3drZmBgaXvu8+73fvn27e/s6fN+/P16efvp5/z69353b21v +enh+eW9sbnl6d3zz/HJ6dnh3dX7v6+zw7/L57+n3eHducW1zdm91+OzwcG397f95fHl0ePfw +93V8fPrx6uLp8vr18ezo6/FsZWhnY2n6/HdveH7/dGp3d3T/fvT3fPn8/2907/dyeft+ePzr +7vD18vLt6eLn+fX6+/nz8Pt4fvD0bmprZWhpdn54bmlweXF9+XlsdPbu7PD5/Xd2++/08Onp +6Ovs8Xt3fu/t+XJ2+nxpYGVud/Xo7fp7cnd1a2t0dXZxcXh89fPr7ejt9vTt+n7v/nn+/Xv3 +9vV8/vj/fnj88P9+cGxrb3F7eHR5b25veHV4+O7z9Px69e/zfn71fP3w7/T67ufvd3V6fHp6 +fP/58vl4dHNtcfx3b/r7dmhpcHj38O3xfHj49/ny+n57fXlqb356cXz99evo5efwe21ocW9+ ++/n3+/Hq8/zr6vd7ePf+aGRmaGFnbHZtav7s8fz16Ofq6ex7a239+Pnr5urq8PV6/X5yfH7/ +d3Nrbm9oZW1sbHz093Z5//b47+z06e9vf+3tfXD5dG93+f51fvfz8/nw6u35fn55a291bnV/ +eHf7+uzp+G1493dtfP5yeXvx8vr57+3s7uvp9G5vb2hscG5ubGVrcvz19/V++/f7fP7z9/L8 +fX96/vz5cHFxff7/7OXi9f7/fX1yfP75f3n1+Xx2fX99eXhsZGdrdXpwc3zw9PX8eH75fm98 ++3x9e37/fvD5e/z7efzz9/Dt7O18en16b3749f3x7X5yd/t5dX/+b2hoaG90dXRxa2hqfP59 +b/zq8X1y/PTy+/X19vP28fXs6Ozu7+/37/x4/Xt3aGpuZGRmcnv+9fl2dHt+eHl6efv4fXr+ +7Ovu7Pf8e3RrcPX68/Tv73Rz+fNxbG1rb2toc3N76+Pt7vDq7v5zbvvu7vft8nlyb2xkZW93 +bW9+fP/06ePr9vf4/npzdXz9dH73+e3s8/11fvT5c2ppZWFpand9evn79PLw8vPw7uz48eLo +9/Pr7f9xeHZvb3J3/25s+H9xfvb9bW10bmxuefX8fv328PD47vD9+/50a2969/H69u3u9X39 +/3b+92tu8/T9+/Du+Hh8/v51cHtvZmhxcGn97PXv7/r07O7t6/B2bHx8evH5dW9xfXtvbWx7 +/371/Hb67e7m6+/0f3p5/nt3fXRwc2958/N5dnZ0eHxxfHltbm57/PDl5erv9P5+eXV7+Ozq +6vZ4en13b/fxfHh8+f59bnj7bWdsdG9z+PLv//19e3dzffj4/uzt9e/o6+np7/52bW57f3t2 +cGpxcPjs9357/HVxb2ttamJob3fw5ezs6+Tk+fLx9nN2+PX08fX4fnj19f9+emxqbm5xeXlr +a3v5fPfxeWx5e29xcn7/fHb16Ozt6enu7fp2/nt4bml38+3n5vh38/V37/dsbnx8bW1xbWRq +ffLvf3Ntbm//f2xocf3+ePv8dH7u6+jm7OTm7+7m6fD9/PX29Pr+bmRudnFvbnBybGtuaWx3 +8/f//Xf99/Pt5+X1/3xqaHHz7/rx7vpxbm579Pf49vHv+f51evn8/X1ucvT46ertfXXu6f9q +ZmBfan9uZGRse/p/7uHq9O3o7+vf5fL99Pf0eXz17Op+cWhpY2NmaWtscHf+eHT99Pfv9f57 +fOjq8Oz0eHN5/PV+c2xu+/z6/Hj07Ofp7uz0fv17d390bXz+fG1rf/P6fHRucm9ufm5od/17 +evr8fHj46+vn7vX08O7s5uj0+39/+X1vbWtgZW1vdnz9c2l0+vr+9PlubfTwfnX/8u7v9Ofq +7u70/H7+fXB0cG1/d3P8+3VmbP52a250amd09+7u7erm7PLp6e/y+f59ffx1cGtq+O9vanv7 +cmxwb25z93twfP/39Xr77Ojq7/Dxevbn5Ors7vj8e3dwbGhtdWReY2lvb/ftenvt5/N8b3Z6 ++vbu6vH37e/1fPj++fN5amhtanV8dPro3/F/9/v6cXr8eHZ6d3x8//dzb/bwdnBzbmhvf/zv +7u/v+HxtbXx8dXF1cnN+dHB0evPj4vDv7vTv9PP9/PX27efq9X50eP1+aWJraF9gYmdpb337 +9/z2/n346+fx9+7q7OvvfnP+8vf69nVy+n1ve/j+e3h8dHn+fndxefX2c2lobfnx9PF/9uvv +93lqamtsbXN++/Ly8fr77OTrfXl8c3F9eHt6/Xx9/33v7vPy8v37dGhqbm1pbfn8bnj6/3zu ++mxz//p/e3P7/nJ66+bs8351fPL3/PP19/bw7fnz+HRtdXBrbm5waWpycnX76un3fXv7+u3w +fPn/dnv+bmlx+evs5uP9dnRwbWn/8Pj/+fL5/3JtbG9saHN5fe/x8/n27e/69+/qdW58d3J4 ++/96fPX2cmxvevr27uz1+3j97/Xy7vH18/Z7bWZkcnFlaHFxbfvzcm37+HB4dXh6/fXu6/Tw +5ujr7evzeP3+fXZzcnZ3dPvx7n358n5xb3hybWprd/t3c3RscH77a238/nZ2eXx/6+vu4+31 +6ef6/vL5cGpycm3/6ujr9Pnx+Hz/fXJmY210+vT9e3dtZWhtbHHy+Xz47uvu7+/u6/HyfXJ0 +/vhzcnh5cnJ3/Q== + +--owatagusiam +Content-Type: audio/basic +Content-Description: Flint phone +Content-Transfer-Encoding: base64 + +/31+/35/fv7+/v3//v///v59/f5+/X19/f5+//7/ff/8ff/+///+/Xx8//9/+Px7fPNyf/38fnZ+ +9vr7//79/Pz/ff1+/v98ff3//37/fv79fv9+/fz//nv+/P/9fX5+/v3/fvr9fH7/f379/P17/ft+ +/P99//37fX77f379f/5+fvz+fv39//1+fP3++vx//f39//39fvx++33/+379/n99f/v//P77ff3/ +//5+/fz7fn74fv39ff1+/f7++////v5+/vz7fH37fvl/ePz//vz+f3/9/v/+fX79/n///n39/3/+ +fvx8/P3++3z7fXz//n/8ff77/H7//339//3+f/p9/v5+/377/3/9/H7+f359/vz/fv349HN3fnb+ +///9//Z+fn98eXrv9/38+vz+/f7+fn79/H59/P7/fH58/n1+ff/8ff7//nr9/33+/v/+/3p+fv7+ +/H/+/H///f58/f79/Hz6fv79/n7//n79fv7+f3/7fX37/f5+/vz//3/+e/v8/v7//fx+/X7//Px9 +//39//7+fH77/f5+ffn++358/f///v/+/v7/f////X9+/vt9////f/7+fvV8ePh9/H99/n//f3/9 ++33//37+/fz///78/3//fX78/v39fv/+/f9+fv/9/v58/P3+f31+/vx+/v/7/n38/3x+/P///n37 +//t9ff39f35+/fz+/f18e/v8/nz+/H77e3r+/Pt9/H5++/7+//3+/v9/fv78fn18fvt++33//X7+ +fH98+f5++3r//f1/f35+/f7//n39/X3/fH/8/33//f7+fnz//vz+/n5+/n79fX7+/v7+ff79/H39 +fXz8/P95+/1+/n9/ff79/X5/ff79fv1+fvx/fn78f///f/59+399f/7//X5+fH/7/39//vt+/v77 +c/37fv1+/Xv8f35+/P9+/v7+/33//n5+/f7//3/9//x9ff7+f379/n7+f/99/f7/fv/9fv9+/31/ ++/19fv7/fv99fv78/35//P3+f/59ffp8fv79fn/+/nt/+n3+ff1///17/X38/3x+/v7//319fv1+ +/H5/+n3//nz+/f5+/n7+/X7+fX38/X5+/v3/f31/ff7+ff/9/f///Xx8+nz9/n1++/5+/33/f/79 +fn78fv7/fX/9/X1//H39/359/v1+/n3+/X78fn59+/17f/z+fv3/fn///v9+/f5//n19fv38/359 +/X/9/359/Px6/f37ef7+fP7//f18/fx+f31+fv7//P58/v3//n3+//58+vn/b//7//x+/f1+/v3+ +/n3///77ffx+ffr+//1+e/r+f//+/v7+/n19+v9+/v7/fv//ff/9/f59/v1//X3+ff79/fh8d/t5 +dPr/evt2+f179/z8fXt+8f9983z6fHd+evzzfvv++v1//Xx9/379/n39/37/fXt+/v58/f1/+nz8 +fnn7/P9+/f/+/X77ffr9fvz+/vz9fn///f3+/n77/n77ev/+/v1//vz/f/x//v7+/n78/X7+/n5+ +/Px++39+/X///37//H//ff39/f1+f/r7d379fvt9/v9+/P79/Hz9/P///v58+n79//79/v3//377 +/3/9/3/7fn7//X39+3x/fvn//X5+/H/9/v5//v7+fn38/X5//v1+/v9+//79/f58+n7///99/v3/ +/n/8/v//fn7+/n59/fn+fn5/fP5++/x8/f3+/35+ff39/v/+///+f3/+/v3//f/8/n/+/nn7/f7/ +fvv+/v/9fv77fv39/P99/X9/fv39fn78//59fnz9/P7/ff39/n3//379/398/vv+fft8evv+ff79 +fv5+fn39/X37fH7+/379/378/37+/vv//v5+fvr//v59+v9/fP18/P1+/Xv7/v3/ff9++v5/fv38 +/f18fPz+e/z+/H5//n7/ffv9/Xz9/H37fX39/v//fv79/v99/378/f19/Px7/H3+ffv+fn18+/1+ +/P54/fx+fv39/nv+ff9/fvz//P7+/nz//X75fn5//f5+/33//v77ff/9//3/fX/9//3+/v3+ff7+ +efr+fv19+/7//n97/f/8/338/v79fX79/f5+fvt9/v/+fH/8//5+fv39/f98//3++nv8//7/fX// +/fz9fH75fPx9fn7//H7+ff77//9/fv/9ff7+/P9+fX79/P3+f/x+/f5+/37+//z6d/3+/vl4/f9/ +//5///z///59f/3///7+/X9/fn7//Px+/376/33+e////vt8ffl+/H15/P/9/X7+/vz+fH59/v38 +/3z9/P/9fX7+/f5///x/+35+/H///H7//H7+/v99/v3+/Xr7/H5+/37+/v7/fP3+/v59//79/Xz9 +/f5+//9//n79+397+339/3//+37+f//9/f56+37+/H5+/n9//H3+ff79//7+/X79///+fft9/f9+ ++n79fn5++35+//z9ffx8fv79/P97/fp5+X57/f79f//9/v9+/n5++/5+//z///5+/n37/H1/fft/ +/v39ePl+//59+P9+fP59/f7//v7+//7+fX/9/vt/ff76fPt+e/t9//19/P5+/f19fvt8/f78fv/9 +e35++f9+//77/f9/fnz7/f99/v79/Hx+/vt9fv7+/Hz9fXx+//z/f/37/v7+ff/8/fx+/P7+//5+ +ff7/fn/8/nz//33+fv1+/Hz+/P/+//9///1+//1+/X99f37+f//9/3/+fX7//v39/Xr9/v/9+v12 +fXX+/n71fHd6+/j7+v39+v/8/n5+/v7+/H5+/X7/fv9//vt8/n39/n78fX7+/v59/fz9fP1/fX/9 +/Hz//v3//v59//t+/v39fX7+/X7///v+e/z///1+ff7+/n79fft//X59/H/9fX/9/vt/ff1+/v18 +/vt///58/v79ff79ffv//v5+fv3+//7+/v7+/n99/X9/+3v9/P59fv5+/fx9/vz+/H/9fvz///19 ++v/9/n19/ft6/Hr8/H7+fP58/f7+fnv7fv19f3/+/v9+/vx+/n5+/v39fn5+f//+ff99/vt+f3z8 +/3799Hlvfnr2//z9/f///v/7/n78/f/+/3/+/n77/31//P///X1+/X9+fv/+//19fX/8fn7+/H5+ +/n19/v7+/37//n7+fv98/Hz9ff79//98/v78fH9/f/l+/n5+fH/8/X19+3/8fn5+fv1/ffz+/H5+ +/nz9/v59fvz9/nz+/3z6ff7///5+fv59/vx+//7+fv5+fn7+/f5+/f5///7/fH7+/vx8/vx/f37/ +ff3/fv1//P7+ff////1+ff3+//99/339f/1+fvz+f37/fP3+/n59/H////98//3+/337f3z9fn3+ +/P7/f/v9/v7+fX77//5//n3+/H39ffr8/337fv7+fX58+v19/379//1/ff7//n1+/v1///59f/79 ++vn5+f3+/X18/X78/339ff9/ff7+fn5+/v3+ffx9f/78/n78/P39/35///r+//7+/f3////8/f7+ ++/z9ffn9//77/f/9+/t//X79//v8/f39/P77+/79/fz7//37/f77/v37/fx++vz/+/7+//z8/P/8 +/P/8/P3+/vv8/f38/fz9f/78/P3+//r9/vx+/H76+/39/vv+/P99+fx9/P38/P39+3t/+v/9/Pr/ +/P1+f/79+vx//P79/f9+/f39+37/+X5+/f1//P39/P38+/5//n78+/t9fvz++/9+fX74fv3++/3/ +/Xx++/z+/v/9/P39fP5++v3//v37//n+/v38+//7/fv9/f1//vf+ffv8/fz///z++vz7/n74ff3+ +/vr++/39/vv9/H///fz+/P/7/P/7//79/fv9/v76/P3+/H/9//v+f/r+//t+/vz//P/9+v79/P1+ +/vv7/n/8+/7+/X3/+/z+fvr8fvz+fv75/f//+v1++v7//vv9/P/9/f37/v/9/fv8/vz8/H77fvz9 +//p/+/3+/n7+/f39+X5++vz6fv/9/f38/H/6/f/7/X38/Px+/vv9//3/ff/9+////f/+/v1+//37 +fv/+/P7+/n78//t//vr/+v9//X7++v3+f/v6fvz9//r9//39/f38/v/8/fn+/fv+/P1++/n4eXh3 +d/z+ef15e3779f32+Pr9+/z+/Pv+//36/v//fP7/fv7////8fn///n99/n///vv//nx9/v7+ff79 +/n9//33+/f3////9/n5+/X39fv5+fv1+/X59/f1//P59+33+fX5//vr+f/79/Px9/P19+H3//v1/ +/Xx/fn77ff99/P3//n7+e/v+/n7//P7+f/9+/P58/X7+/nz+ff7+/v5+/P/+fv5+f/t9/fx7//v/ +/f5+/f/+/fz7fv5/ff///n5//f/+fv1+/v7+/X1++/5//v96/f57/379/v5/f37/f/79fvv9/nz+ +fP/7//t+/vv9/f/+ffv8fv77fP7/ff9+/P7+fv7/fX//fH76fX1+fvz+/X/+ff78fH37fv7//35+ +/f7+f/v7/n5/fX79/P5/fv36/fz9fv38fP39/v78/31+fv7+fP/8fvx+fX3+/v1+ffz+ff97fn/+ +fn9+/f59/Hz+/n77/378/X7+fn7//X/+f/37/vz+/X37/n58/H38fn3+fvz9evx9/v/9e3v/fvp8 +/H7/+3z+/3x+/n5+fv1//X5+/v79f//9/n///nv++3n6fXz8/v79/v39/fx+/f78/X1+f//+/v5+ +/f3//319fvx//X7+/P//fn58f//9fv/+f/x7fv7+/Hz9//p+f35+//38/n7/+/v7f35//f/+/v79 +fP5+/n/+fn7+//v+/n5+f//8ff1+fvr//f58fv3+fP/+/v5//n39/f/9e/r//v9+fn/+/v5+//1+ ++379/n76fn3++v///3z+//59//z//H7/fn3+fvt9//x9/n7+fn78fP59+35+/3t+/P7//X37/f79 +en39/fv+/v77/v79fXz9/n7++37+fX7+fv1+/n1+/v1+/3r+/f39ff/8/v/+fn3+fv9+/v7+/31/ +fv1//f/8/H38fX39fv79/339+/76/378/v78//79fn5+ff7//n5+//37e3n8fv39ff/7/P/+e/59 +//x/fv78//1/ffv9/n7++/99+39+//79/H3//ft+//37/f/7fP78//x8fXz5fX5+//5+/Xx+/n9+ ++317+/z7ffh/ePp9fn39fv7+fv/9/P9+/v/+/35/fv///n5+fvr9fv79+/39/H7+/H7//nv//fp8 +fP77ff7+ff/+/f7+fvz9//5/fH37fH18/P7/fn7//P19fv78//1/ff78/P3//n78//v7efp//f9/ ++3z8fP9+/v5/fH79/v57/n1++v7+fn76/v5+/v/9/X59/v5+//98f/z+/v79/37+/Xz9ffz+/378 +/P7+/v39/v59//d+fv59fv3+/nv+/H3/fP59//v9f379/37+/3r9fn7+efx/fv18/f33/nd/evr/ +e3P79/74/nz9evb4+fz9+/r7fPx/fP96fv3+f3x9/v18fn1+fPz9f/97/P///X1+/v/7e/79fvx+ +fP78/v5+/P37fn3/fv3+/n59/vz//P58+f/9/v79//79fn7+fvx8/vx/+v94/v79//t7//p8/n18 +ff79fn1++/9/fn5++/3//v78/H59/37/+X5+/fl9/Px//X39/v5+/P79fHx+/v/8fH77//19fn1+ +/f5+fvz6/v3+/n39/n9+/H7/fn1/ff/8fv38fv7/fP7+/f1+ff/7/v39/v78/f5+//t+/35+f//+ +/n/9/f79/3x//vz9/////v99/3x9/P5+f3/+/35+ff3+/v/+/P9/ff59f/r9///7/fz8fP19/f59 +fvz9/37//n79/f58/H/+/nv//v39/X19+/3+/nz//v//ff7//35+fH/6/n3++39//f//fP3+/H58 +/Pv8fv38/n1pXF9a/tjfvLjJ9Vo8Oi8xRklg67qusbGssrm/QDguJzMsLTU4w7Ovr7yxqrbvQjw7 +NywtLkq9ua+4sqmttVVBPzkvKSw0Q1W+uLqzrK25/Uw+PC4pMDQ7T+K4rq+rqq+zzkJBKiovKzc1 +R7Ctra6yrKzEQzszNiwpKyxqu7Svu6+qrsJEQTw3LCotPOLOtbi3rK2uwERCNjktKDg/Rdi+t7iw +q623wFJCOykxNjA9Ps6vsbGvr622TT8wLTQoKys0vraxsLiqqLPpSEE9MiosLUzPurG6rqqutU09 +OjYvKC03SGHBs7GyrKqz121APjEnMzc3R1m9rrKvrrKvwj9DLi41KjAvQbe0sLK1q6y+UEE6OS4q +LC5sw7q1va+rsLpIPjw5MiouQmTLt7q1rqytxE1HOzoqLDo7RvfEs7OzrK+4vEU9NCcyLi43Osqw +sKystcPPX1JLRUVFRUdNUl1w9NvX0s7R09vi7u96cWttb214bnt8eH92dHp2d31zaW1qZnt2fuz3 +6dze4Ors6ff7dXV1cnZubG7+9fX+f3N1cG1lamVldH39/vP0+/L2/XX5enr8ePLp6eTp6+vu7+5+ +b29rc/vzffz9/e/0c3Vybvlzbft29uj+fXV8eHxtbXF1+ff++H7z7PR+dm10/nZ8+n338/L8+PR0 +f3VueHb97Pfr7fzt7vn+bWxybnB7+f/s7+7s+vh2cHhtfXR78Prt93X693v/bGZ4dH33/fHv+PT0 +9Hhz/nRzdHJ+8O/t7nvz93x9b3N2+f16fPjt8u33/n54eXBydHd8eO/68Xh593T+9Xz2eX387X7v +93z59m9+fW51/f/59PLrd3BtfPJ2/fF69O777ev29PR6eHVuemlt92z1+fvz/3Zv+nlpdW1seXNs +2Lu721VMSEU3NjZLubizt7mrsfBOOzU3KS0tOr26tre4qq3YZEA2OysvLjm5tbGxs6qs0Vk+MDor +LS8ywri5tLasrc5QQTE7Ly0wM8i4urKwrKzIWkgvOjIuNjXItbqysK2uzkhBLjkzLTU4zLu+s66t +rt5eRCs8MC85Pbu1ua+ur7JXSzonOC8tOD6+uLqtrK+ycnI7KTwwND1Mura2ra61uFNSNic1LjA8 +Sr22tqyttLhgVTknMzAvPlO8tLWrq7O4W0k5JTAxLz9bu7ezqau1vVtLNycxMzFD7ry5tKqtucFN +QzglMDg0T9u9vLCprbzWVkg2KDM4OVbKuLmuqa7FakU8LyQuNTdYx7m3q6etx19QPi8oMTg/7r21 +tKupr9dKRzotKC44P3i9uLSrqrDaSkg7LSkvO0beurizq6uv5EVGOzApLjtH4bu8tausr9xFSTsx +Ki46TN+6vrWrrq7UQEI6NCkrO1PVvMO0qq2u4khLPDAqLThdzri8s6msr/o+PzguKCo2Vc+5vrOo +q6/0SUc6LiotN/zHtry1qay1ZUVBOS0qLDV/ybe7uaqrtHxHRTouKiwz48K2ubqqq7V7Q0A5Lior +Mtm/tri8q6u1eUNDOi8rLDHWvri4v6yrtm5BQTszKysxzr+7usKsq7pmSEM+MS0uMsm8ubfBrau7 +WEI9PDIrLC/MvLq3v6upv2hMPD8uLS4xwbm4tr+trMdSRDg9LSwuL8a5ubS9q6rJeEw1Qi4uMi/H +t7mzva6qyFhOMT0vKzIt2rS6srmtqb5bVjA6NCozLm20urO1rqq7VVExNjgrLzBmuby3sa6rvVJb +LzQ4LDYy+rK5s6+urLxITC0uOiszNGG3u7Strqy9U20sLzktOjn2srazra+wwURLLCo3LDM7Ybe4 +s6yvsbxYay8sOi85P++1tbOrsLi/S08uJzUtMj1ft7Syqq23vFVSMyc1MDJCa7m2tKqsub5WSjgm +MjUyQ2++u7WqrrvFXU04KTE3NknevLm0qq26zFBANiYtNzVM1r26rqiruuhZQzEoLjU5V8a1tKyn +rMVVRTktJSw0OVvEu7esqa7JXFRAMSsxO0XqvLi0q6qw4UlGOi0oLTg/Zr25tKuprtVJSDsuKC03 +RuG5uLKpqq7XREQ6LygsOk3Vubuxqayv9kJEOi8pLDhS2Lm9taqtr98+QTkzKSs5Xc25wLaprK7w +Q0s8LyotN3fJtby3qaywbj4/OC4oKjJtyLe6uKmqsO9FRzouKiwz5cK1ubqpqrVkQ0M6LSorMOPD +trm8qqq2ZEdFOy4rLDHUv7e5vqurt2VERDwwKywx0L+4ub+rq7phR0M8LissMsq9uLjArKu7WEI/ +PTErKzHHvrq4vaqqvWBKPT4tLS0yv7q3tr2rrMVPQDc7LCstMb+6t7W5qazMbUY3Py0vMDW+ube1 +vK2t1VpDMj4uLjIzxre5tLmurM1oSi88MC00MMqzt7G2rqzNUUctOTAsMjDMs7ixsq2ryVlMLDgy +LDYyz7S6s7CvrcNKSi01Nyw2ONu6vbOurq7KWFYsNTguPDzNtLuyrbGx1EFHKS43LTo80ra7r6uw +sc5WTCoyNy8+R8S0ua6rtbjuRD4mLTMuO0rFtLatqbW72U5FKS02MD1WwrW3raq3welERCkrNzE9 +W8O0tqyossbrRj8qKTQyPGTAt7arqbLKc0M+Kyc5Nj/awbu1qqu051lHOysqNzlI0Lq4samrtWpJ +PTcqJTI6SMm8uq6pqrdVUUU4LCw+TUBTvq2ztLy1rslEPC4zLygtLFK1ubCzrae05e02OjosNi9S +s7izs7KruU1TLi41KS8tQLa2sa+uqrFtZDItOSsxMUW1tbOurqyzY1I1KzstLzZCvbu5rq6vtV1Y +Nio6LzI8TLq2t62tsrVZRzgnNjIvPk++u7arrLK5ZFc2KDUxM0JwuLOxqau5wEpBMSQuLzBBb7y5 +saiuvMNfWDcqNjc6UNC4t7GqrsbmTEEzJy40NknWubewqKu+6lZENSctNzlRyLi3rqmsvl9OPzYn +LDk7V8a8ua2qrcBNTj81KSw3QF/Auretq62/SEU8NSkpOEXtvr+5q6ytxUVMPjQrLTdM5rq6uKqs +rs8/QTkwKCo0TeC7vbipq67QRko8MSstNF3Ot7m4qauw30JEOS8pKzBbzbi5u6qrseJDRjswKiwx +fMW3t72rqrDTQUU7NCsrLmHEu7fCrqqwz0VIPjQrLC1Wv7y2wq+qsM9CQTs3LCstZb29tsGuqLLc +S0E+MystLWi5urS+sKm07EY9OzQrLSxOur20vLKptedXPTw5LTMvS7m8tru3rLXxVzw3Oy0yMD29 +ure3t6yx5WE8MjwtMTI7u7W2s7Str+dTPS48Li4xNb+2uLGwrK3YW0EsOi4tNTbCtrqwr7Cu2EpG +Kzk0Ljk8yry+sa6vr91bSCs4NjA9QsO2ua+tsrT3Qz4nLzUsOkPJt7mtqrK13VNDKTE2MT9Xv7W3 +rKq3vm1CPSYsNC89VMK1tquptsXiS0MqKzYzPmO/tbesqbPNe0U/Kyg0NT1qwLa2q6mwzGNKPy0o +MTc+d8C5t6yqsNBQRT0yJy89P9vAvrSrq6/eSks8LyowPUvTurqxqqyx70A+Ny4oLTtN0729sayt +tOtMQzUuOk9W3NfMzM7Q2Nnd3+r3eGtgW1pYWFxcYWdre/fz8ujm4ubo5O3p8nz5/vzx9uzs7vJ+ +9Htxc2txbGtvdHlyfn99/vz+e356fnl5fHv7+fv5+Pjz+vj9/vn9/Pj7/P77+v77/v1+fvp+e/t+ +fHx7fvh6cnJ28X76+Pf+8vz3fv14/Hx4/nt7c/78/3z8e3///f/9/vt3d/f9ef1++Pn5+PXz+/p8 +/Xz093z3/f39e354ef59enx//Xt8fv3+fn18dPf4/fl+fvf3+/t8/357fXp+fPX3//x7+f/7f319 +//16fPz+/Pf9/Hx+9376+H75+31+enx5eXx9/3z5/X17/vx/+nl//3b/en39fvf39fX18vz9+v38 +fXh3e///+319/fn8+f15/Xl1b3B3dH78/fX07Pb78fv5fXl3cnd6/Hv++vj1+vv4935+/XBtb2Vd +U9G2vutkR0hDNTk3Tbq0sbi9r7HCTDk4Ni8qLDBL4byxtK6qq7HpRD46MSktOEBZyravsq6rsr/Q +OzkuJDAvMDxDvq6wrqytrLlMRS8xNCkvLT64ta+zuaust2Q9PDczKiotUsy8tb2tqq20V0Q+Oi8q +LjtLeL21tbKsrLnvTzk5LCc1NTlM47avsq2tsrDcSEMrMzItNzNlsbOvtressNZHPDY4LCssL+W+ +s7G5raquvUY/OzgtKSw5V9e2srKtqqy5VUI3NyslMjg9bce0srCqq7S4Xj07Ji0yLTk45K+vr6+u +rK/fPzkwNiwqKy/Mu7ayu6ypr85JRz42KywtQt/Bs7qyq66w6Tw8NjQpKjc+Tsy4r7GsqK7D1UU/ +MyYvMjI+SMKusK+usq+8RUYvLTYqLy85urGvr7isq7htQDw4MCorLUjMu7O3r6yvuGw+ODE1NzxF +VXzczsjFw8PFyMzR2vdmW1RRT09TV1tfZGtwf/X48/Tz9Pb68vDt7Ojm5OPh5Onv+3huamRlZmRo +bWx1fnt+eX7+/vr8e3z+//r18fHv7O3s7eru7/X3+Pz39vz79X17eXZ8cnBxcnFtcnF2dXB2c3t3 +dX10e3d6/Pry/Pf4+fb59vr09/Ty+Pj39vb2/f/7//z9eXl9ff///fv6e/3y/vz9e3l9fHp+fHt7 +fvx8e/V4/vx5e3p9eHt6d3t6+////Pj8/Pz7/Pn3fn57e/j+9fp/+fn9fv58/f7++vz9+vr//nx9 +/P7+fHt/fPj+/Pp8fX17eXZ4dnj9f3n5fvr7+fX5//v6fn55fnz//v/5fvf5f/5//nh9enZ9/f35 ++vz7/fp+fv7+f3h8enx+fvv3+fL2+fj8fXl7e3Z8+Hl8+376fHx6e/v2+OffWT9IZNzPurO20UZI +PjctLz5a3Lu2tKqqrtFFRTkuKCoyRHC8urepqq3LREY6LygqMUvluLS0p6irw0FGOi8oKi9K8by4 +u6qrrcJARTs1KikvTta8ur+sqq7DRUo/NiwsL0/Lura/rqquv0FBOzcsKSxNx763xK+orsZIST40 +KywtS7+6s7+yqa/KREE8NSsqK0a+vbS+tKivy1JGQDgtLi1Dvbu1vLmrr85OQDw4LC0tOcC6tLe6 +q6zFW0Q7Oy0sLTPDuLW1vKyrv1hDOTwvKy0uy7i5tLqsqr5fSTY9LywvLs+2uLO5rqu6VEY1OTUr +Li19uLy0tKypul9XMTc1KzQvcLO4s7Svq71QTC4yNisyL1i2urOvrqu7X1wuMDcsNjRms7WwrrCu +vFBWLSw1KzM1T7W0sq2vr7lYWzErNi4yOlK6tLKtrrG6Z0o2Ky8xQ2zhyMjDxsrM0dfd5PZvYVpX +VlRUV1tgaG189Ovp5+Tk4eLm6u3z8/j59vTt6+vv7/X+cWllYmFkZmttdv59ffb3/v15+37+9/n5 +8/Tz8vHv9PTu+Pf8+3x7/n31+v76fXt8dnt8eX12eHl2d3l4f/7/fv/8e33+fH1//n19/Pv9+Pj/ +fv79f/v7/vb8/fh8/vr8+/769/x9/P57/Px6fn38fnn7fn59+vx/e/3+//19fP9//3p9f3z+fHt1 +fn58eXz3+ff9+n789/r9en9+fv36fHL8/fn7/Ph9/P79/n3+/v79fvx++3j9+n79+/v9/Hj+fnh8 +fHt4/X19+37+/fr3+n/8+3p+fnt8d373/X74+/57e3v///9+fvv1+/X2+vn4/n79+P9+/Xp4fn5+ +fXh+/nv+fHt8f/r9f/n9+/58/3n//Xn//fr3+vj47+TdTjtP7eG8r7zW71E7LC44Qt6+vq+orLtS +T0ExKyorW7y+t72tqsTjSS49Li42QL6+tKmtvMZbRywpMzVJ0Mi6rKyx3FRSOy8sLkjCv7i9sKq4 +41E5OjQsMTnmy7+srbfB+UkvLDIzQdq+uKyprMBQTjwvKCk9zsa8wbCotM9pOjwzLjMzzLm9rayw +uGdNLicvLDRU1MKxqq2/cnpHMy4uPtK+tr2zqK/LXz88MysuLFq6wrSvrq/SYzsoMi4vROnAuaup +tNdtUDcrKzVPz7vCtKmsvVlOQzUsLCxUusO2sKysxFpEKjQvLD1UyMGtqa/L9Fw8LCs2Rty+xLWp +rbhZT0c1LCssT7zCuLisqsTtSC05Li04TMHAsKivwddTOyorMTdYxcCyqKq1a15LNiwrLGO9vbe7 +q6rC50gvOywtMDq/v7eqrbXEV0cqKjEwRNnHuauqr9VaXT4wKy5Pxb+6vq2pufFNOjwuLC40xcS+ +rK2uulFOKyk2LT5+zb2sqa3JXGg+MCwvSsy8usCtqbfpTEA8LiwsMMnDxLGvrLd7cy8sNiw4Usm8 +s6erve1xRzArLTlYyrvCr6mwy09LPi8rLC7Pu760saqu13Y6LDgrLzxrv7yrqLTM8E82KS02Q9fB +xa+rrrpMUkY4LSsv2sDDubaqrMx8Qi48LC42Tr7Er6iwu95JPiYqNDZlysuvqau3WG5MNi0tL9m7 +ure7qavIYT8yOissLjvBxrepr7TFY0opLTIxSs2/t6mpsOlXUTktKy1KyLy4wK2ot+RPPDwuKy4v +y77Arq2ts2tdMSg1LTVT0sCyqKu8ZXJHMiosPue/ucKvqK7ISEg9NCsqLHbAyLOtqq3YdzgpNyww +RNy+uaqostZrTDUqKjVG2sDKsqmtvldXRTUtLS7lub60tq2rzulALDosLTdLwcCvqLLK3VQ7Kisy +PHS/wLGoq7VfVUo4LSssUbu9trutqbztTzA5LysxOMrEvKutt8BXTi4oNTZE0869q6uuzlhlPzEt +LkXAvbe+sKiz4Es6OTEpLDHxycWtrLC5dFkvKzQvPebBuqynrMVXWT8vKiw/1MS9x7CptttYPz8x +LjAyyby/r6+utndrMSo1LTVM0b+2qau+8m1JMissOWDGusGwqK3DT01BNCssLXm9w7ayq67UfT0r +Ny0vPmnAvq2psct2TT0rKTdF6MDNtqqtuFxaTTouLS1Pub+3uK2qvV9KLTUxKjQ70cm6qa2+y3hH +LiszOVPGwrmpq7DmUE47LiorPr+/t7yvp7ncZDA5MisyNMy9vausur5vTy8oMTA788a+rqmsxF1o +QzErLDvJv7e/taivz1k/PDcrLS5ev8uxrK+04141KDMuNV3Mv7KoqrlbW0g2Kio92cW8yLKnr81Y +Rj8yLC4t07rBsK6ssPlfNSc1Ky9G5MK7qaq56/tONSwtOV/IucCxp63DU01BMystLGm6wbW1rKzQ +7UEpNy0tO1a9va6mr8vfUzwqKDI9br/DtqirtGNVTTktLCxIur+3uq6pvGhRMTcyKzM82868qq27 +ympMLys0OU3Iv7mqqq3MSk08MCorPcfFu76xqLXcYzY4NCwzNNO+vqystbxlUDEnMTA59szBrqqt +xV59RjMtLTrJvra9t6iw1287OjcqMCxLu8e1rbCx0WhAKDEvL0jav7mrqbLbZFY8LSoxVs28v76q +q7xsTUE5LS0sPrzEua+trL5STSouNSw+WM7CrqmvzXViPi8tNUvVvLy4q6y37EtDOC8tLj3Wx722 +srTG1145Mjg5RPrVwbOvt+FQTDsvLS5Hx7y3u6+otNNmOjwzLTEx1by+r66zuO5hMSgxLjVWzcCy +qay8Yl1INSssOtnCucG2qK7KYUU+NywvLV68ybOvr67cWT4nMjIwT/nMuqurtnVwTjcsLTnowLa+ +taeswE9GPjUqKitOvsq2r62tzu49KjYuMUbkv7urqbbiZE44Kys0S9S9xLaorcFjT0U3LS8tW7jB +tbOtrM1+Qik1Li07VMC+rqexzuVWOioqM0HpvMO1qKu3WFJJOS0sLFG6xLe2q6rE+0orNy4rOUjE +xLCor8PiTkArJzY9bMPQtairtlxkUDkuLi78uL61t6uqyWlDKzksKzVCx8iwqLPF1VU7KS00Peu/ +wq6nrLtWYEczLCsu0by7t7uorNPdOy46Ki4xTbzCr6i0vdhTOyctMzZlyMSvqau4W2hLNy0sMNq+ +urm6qavGakE1Oy0tLkTMz7SqsLbRXD0oLzI2XMm/r6iqs19RRzcrKDHkxb29u6isxe5DOTotMC9M +u8S0rLG00VU+KC8xMUvgybisrLj+cE83Li006sG5urupq8LuQjo5Ky0sPbvAtq2vrsNmRCgtLy0/ +6cC5qqev0WJVOiwoL1DNu727qaq6fEtAOSwtLD28xLmurq2+V0wqLTUtPlnRwa6qr85nZD0vLDNP +zru8uqqqtnZIQTctKis7w8a6sa6svulNLTMxLj1exL2uqbHOcFI7LSsyQu+/wbmqrLr9VEg5Li4u +Rby+t7SwrL53UCwzMiw4Rsq/tKitw91gQC0pLzxawr+7qqqw3k9OOzArKz2+v7m1ram581ItMjAq +NUDLwbWorbzUUkItJjA7WcfOuqqrsedcVjsvLi9Nu7y2t66rvX1ILy8tNFNQ29rTz9fa4+jw8ft4 +bm1wcHb36+Pj3t7f4enp7/Pu8/by+f53bGdjYWBiZmpuc3V1fnhyeHT+fP338+/w7O7u6urt7+76 +9Pr4fv36/P59eXh5eHh4d3l3c3l3dXx6dnh6+Pn//H//fvf7fvnyfnx+fPr/+vfv+fj4//r+en5/ +fHt1eP18fP36f3/3/vv6/fz9/n19f317fHx++f9//P7+9vz+fX/8ent4ePx9/P1+fn59e/55e/V+ +/fn3fHt7///+/Pr2+fP7/X53fHz+/f78/Pr+/fh+/vd/+v38/nx7eHl5/359e3p+fn5//f74+vv8 +e3P983f//v/9+f729v79/v59fXt5dnZ7fHv3+n399Pr6+PZ+fXt6fXz7fPz8+vf3+Pz7+vx6enp5 +dXd8ffr+9vn6+f78fX51cnN6fXb7+Pz4f//68+/29Pfr33ZEPkzeyci4trzBTkg1KTUzNEfjtK+u +p6mvt1BBMCEtLSw9XLy4rqWos79PRi0jLi4ySs6ysqukqrrMR0AsIy8vNE7Oubmsp67G41FELik0 +Nj1sv7a2q6iw21JFOywmLzU8a762s6qnr9lRSTosJy84Qtu5tLCpqK/0SEI5LSYuO0TXurmxqaqw +c0dGOSwnLjtJ0rm8r6mssGJBPzgvJiw/V8e5v66oq69RRUE3LCgtPW/Cs7usp6uwTD07MyslKjpq +wrW+rKaqtEtJPzUrKSw91b2yvK2mq7dIPzswKCYoOdW8sLmupam4TEQ9MikoKTnIvLC6sqaqukxE +PTYrKSo2yb2yubeoqrtVRj84LCorN8W+tru6qqy9U0I9OjArKzjDv7i7uamswFlHPjosLSw5vbu2 +ubiqrslLPzk4LSwtO8W+uLe0rLHKYkI3NThIT3Pq3NLV1tnZ2tve4+/4dGZfXV1cXl9la3F5+PLu +6ujq7Orv7/x+f333+fLu7O3q7/R+cW5qaWpqbnF4enz79/v9/3r/e3n/e3n+fnj69P719Pv3/PH2 +/vrz+Xv4/Pn+evr8e312fH55/Pl7/Ht7fHt6e33+fn31/Hx+/358+/z9/f79/v7//n59/np9/v5+ +fv59/vr6/v38/P7+/nx+ffz3f3d7+vP6+3v7fv7/ev97en14/33+/n1//P7+fn79+X78fP1/fnt9 ++3t+fP/9e/z9/375+/74+/t8+3//fn5+/f7//Hr7/fv6/f///P17fXp7eXl/env8/H79/X5+fX16 +evb+/P18+P35+H39/Pt+e3z+e/99fPr38vn9/Xt7eXRzdnp8/Xz++fr3/H7/+Pv5/fv6+Pp+/Pz/ +/P57fP95fHh8fnp+e312dnVoXlfovrrBX0xOPzUwM1G8ubS4sKm69FcvNjAsMzjNwLurrr7IYEsu +KjM0RM/Buauprs5bXz4vLCw+wr+3v7OotuxTODo0Ki4w48HGrqyyuHNcMSg0MDvuxr2tqau8U1xE +NSoqPsvEusSzp7HTXD49MywvLti8xq+tr7VeVDImMy0zUdbCs6irvnj0SzUtLjzZwbjAtKivy1ZD +PjQsLi1au8O0sK+vzv8+KjQuL0Pvv7usqbXbaU85LCozTNW7v7iprLpgTUU3LS0sRbvBuLSuq75i +TywyNSw7Ss/Esaqux/ZiQC8rM0J3v7+8qquw20lMOzIsKznFx764sKq142oyMDcsNj/Uv7qqq7zP +Z0YxKC84R8/IwKyrr9BTWz4xLS07vry3uLOps+FwMjE2KjI1fr++rau6xehNMykvND/hxL2uq67B +XldBNy8vPNrAura2vs3ZZVhPTExLTE1OUVddZnrv6eTk5efm4+Pj39ze3uHp7Pn/+Xp3+ff5fn52 +bW1nZGlnaW9tdX55fv5//Xz+fXp7f3v49/n28u728vD19f/28nr7fH76e318e/p+ef99fn57fH59 +e3h/9Pf2+Xp7e3z/ff18/v5+fnx6+H79/X19fXt8/nt8fvn+c3j8/Pr+ee/19/148P128P34/vz9 +/v16/n96fXz+e/79e//+/3x8fH19fXV9fv39ffr++/r5+f96+3t+f3t8/37/e/z7/fp/+X74fn75 +//n+/X76fv75ffb+/Pt9/n19eH5+fHt9/nz9/Xx6fX19ff/+/P36fv3+fvt8fPv69/z9+fn7/f71 +9Hx8e3d3ef13eXn/fHh9fP/7/Pn9/vj7+/78f3/6fv35+vf+/n3+fHx8f3x9/f76fvx+/P16e/58 ++vfs4fNQQ0FS28u2rrfbWE44LSstWsXGta6rs9D1MC43Mk7TzbKqr8dPTzwuLCszwMK4qa+zxOY9 +KjE1Rs7Nya2sv3hKPzotLzBcvcCpqLq/0U4vKzJG5MjYvqu23185OzgsOEfOw62ntc7WWTQsLD/M +y8G+rq3Ld0AtPS80VXfEr6u03nheNy4tMsrBwrWvq7ruYSwvNi9R89Owq7HXVls6Li4sRrvIsaqu +s83vNSozNEnP2r+qr8ddRj4yLDA0zL65pq2+wuZBLCw2S9HH2LSrvuhPNT4vLjlWwb2pqLjP2FEz +KixK1M7Iw6yv3eQ4Lj0sOl3NvKyost9hUzcsKDTN0ce3rqzB5k4rNzM19da+rKuz61ZRNS0sLW/A +zK6tr7ncWCwtNTj2zNCwqbTZTkQ5Li0uP73Eraa1vcdlNCswPXvIz8arsdz9Ojc6LDQ+zsCypa/G +zf06LSs26c7FybWswO5PLzs0MEr9yLaprsTtez0uKy1twsm6s6yz4mcyLDowSPbttq2vw1drQjIv +Ljm+v7utra7A8EUqLzQ6+WzTrq6+ek9DOC8zMnq5vqqotbzYTy8rMjxrz9+7q7jYXTg8Mi82Sb69 +rKa0x89OMSssPe/Lycmur9PgPTM+LjdKz7+xqLDJ3Gs5LSs12c7GwrWsv+tXLTY1L03lxbOqrcNb +aD4uKytRwdC4r6yy2/AzLDkwR9nWtquuvVRbQjAtLDTFxr6rrrHC3UQrMjU/29XOrq26eU1FOS4v +Lk28xaypt73NVTEsMj9+yNbCrLPWbjw5Ny42Pcm+s6auxM38Oy0sOHDUys+0rMXpTjE/MTBF+MK4 +qKy/4OpAListWsrNwbmstOd2NS4+LkF32rqsrLpueUwyLiw6wMm+sq6txX5HKjQ0Nvd+yK6tuG9e +TzYvLy/dvcesrLC64lotLTY5bdfetKy33FBGPC8vMEK9xK6ntL3KaDcsLzlZzM7Lrq7L+UM5PC4z +OuLCuqisvs7cRi8sNFnWyc+9rLnheTU5OS09WMi9q6m23XlOMysqRM3Ww7ytrtHiPC09Lzx8zryt +qrTiXU82Lisx0M7JtrGtwOBWLTY2NnjWx66rs9pTVjouLSxLvs6zrbG4zfgzLjc4W8vXuquyzlVG +PTEuLzXHv7inr7zE8D0sLzlRz83QsK3C9Uk8Pi8xOW/Evqmrvc3ZSDAsMVPTyc2+rLbmZTg3PC49 +UtnErau55eJYNS8tQ8PLv7yvrcxwRS08MjVdbcmxrbjrc1k3MC4zy8DEtK+su+hgLTE4Mlvq1LCs +t+NUUzouLy1Husexq7C1zu41LDY2TdPhv6yxy1dJPzQuMTbMwLuorrnA6EYtLjlK1dLasq3C8Es7 +PS4wOHHCvamqu8rnSi8pM1neztS6q7rnbzI6OC1BZMK7qam55/dLMiorSM/Zxr6tst/bOi8+Lj7w +ybusqrnwb040LSsyyc7HtK+tx9tJKzYyN+3Owayqte1XTzUsLStWu8murbC31PgvLDU2XczZt6qy +zk9KPzEtLjbFxrelrrnC6D4qLjdOzMzRrqu/cUU6PC0uOWHLvairvs/YRC8sMmbLwsi6qrXsXzQ2 +OSw8T9jCrKu9499MMi4tScDHvbutrdfePCw8Ljdf4sKuq7j2cE8zLiwvyL7AsrCsu9xjLDE1MVbY +zLCqstVSUzotLSs9vMa0qq6wyOc5KTM1RtDdvqutv1xKPzIsLjHVv7umqre/6kosKjlK39P4tKu+ +7E04Pi8vOV++vainuM3gTDEpL07fysrN0Xi8s8plSDw+LzA5ZcK5pqi6w85BLSovUNnKzrmquutX +LjUxKzxcwLmop7rN2kcvLCtDxMm8u66u1ts8LDsuOFzUv66qt997UTUtKy7YxMazr6y632stLzkz +W9zSsaywz1JdPC8uLT+8yrOprrHUbTonMjlI1HXHrK/FXUpBOC4zN8++uaaru8TtRSwrNkjfz+G4 +q7/nVjU+Mi88Y7+8qam7z9tKLywtSNHLxcOtsd/aNjA8LDtdyLyrqLjY7E8yLCo0yMzAu7GsxttO +KzkzNGfYwa+rstlcXDovLC1Zv8+0rq622/MxLTgzUdHatauwx0xUPzMtLTvLzbapsLjI9TwsMjpU +y8/Gra7DYEU+OS0uNvrJuqeuwsbfPi4uOnDLw82zq8PtTDE+Ly8+a8S7qK3H0OI/Li0udcnIv7ys +uO7pLzM6LUN7yLurrL/x8kcxLSs7wMy+t6+uzOJGKzs0O+Lnv62uuGdaTjUuLS/avsetrK+69Fws +LDo5b+N6tKy221BLPjEvMUi9xK6ns7vRXzcqMT9a1ezRrrPX8z48PC85QsnBs6evx9FyPC0sOXfb +yNO3rMnbTi8+MTJK27+1qK7H3W08LiwtZMfKvruttt/hMjE7L0Xoy7mrrb1oaUgyLSs3w8y/sa+v +x95EKzc0O9/axa2tt3dNTjkvLS9bxsytq7O6110vLTY89cnbuKqz1k1EPjMtMT/NyrGntcTKYzgt +MEHkyMnIra7R8z01PS01Q9vJtqizzdNzOi4tNdHJwsO3q8LqWy06NS5I68W3qa7G6f0+LiwsT8DM +u7atsdzhNi09METi2bqsrr5aZkYxLiw0w8a+ra+uwflNKS85PN761a+uu3VPSToxMjVkvr+sq7W9 +4k4yLj5MXt7c1drg5/j3/PTy9310aWZkZ3T97OLi4eXn7fl9ev7++f58fHdzbmpqbG14dnr///j8 +ef37fHv6/fz67/j27/Tw7u73+v99d3h6eft5ev98/vt7fHt5end4dXd9ffz/e3t//Pz7/Pn6/P/8 +fvv6fv59e/f9/v/9/f38fn1++H77/n37+fl9/n5++3x+ff3+fn1+ev78fvz9/vp8/Xt8f37+e37+ +/H18fnx8ffz8ef75+vj9+/36fn59/n55/nr+//v4fvz++/f7+3t5fnl+ffz6/vz6/n73fX58/f9+ +e3z+d3x5+P1/+Pz6/ft7fHd+fXz7/f/9/f//fv17fH94fXt7/vfx+Pj7/Px9fH97/v59/n78+/38 +/Xp++3h6enx6+Pj5+/33+v79+/z8+///e3j+fHh5en94en57+////X75/Pv9e319eHBnWvy8v/T2 +RUlANjw/ybu8ra21vFlKLyc0MTzs3sGura/UUl8/Mi4vTL+9uMCvqbfrTDs+MSwuM9HKwa6vsr15 +Wy0uNzFF3sO8raqw0lZXPC8rL07Owb7Frau+31E+Py8vMDm9v7yvsrC9ZFgsLTQtO1vHvq+or8xx +Yz4uKy9I2b28v6uqtuZPST4vLS03v8W+sq+svWRbLC82LDtPysKzqq/Fa1tDMSoySvvCx8GsrLbn +VU8+MS8uPr3AurWvq7tmUS0vMyo3RM/GtamuxtxrQS8sNEBvwMG7qqy2+lVOOy8uLUC9wbm6squ9 +7WAvNjUtNz/Ow7qrrb/OZ0gwKjE5SM7Fvqyrr8tXXT4xLC07v764urOps95bNjU2KjA6fcu/ray5 +w2xMMCozNkTPxburqq3KTVE9MysrQMbFu72wqrfXWTo5My40O9rCu6+wuMlUQzw6PD5GT15439XP +zMvKy8zO1trn7/ltaGFpYl9dW1tdW11iaW9xfvn6/Pv9+PXy7ufi4+Hh4eXp7vv8d3VzdG5sdHN4 +dHJ0dHZvbXJxb3Nzdnb++/rx8+/3fu/u8fD38PT2+vb8+X77/nz4fv58fn7+dnN8e3d3eHV8/nl9 +d33w+fr3fXx8f3h7fXp+/H77f337/f75+/z8+vr6f/n7fv78evx8fft8fvz9fvz7/n3+/Hz9/n36 +fn5/d338fv7+eX35f31+eH769vp/fn/6fP38/fb7dXZ7/Hj8+nV4/vv5+f33+/j7f/v7/fv/fX7+ +eXv+/f77+/3//P99fXl/enp5d3x8/P7++/n4/fv8+fh8fXp4e33/+336+fj19/t9e3l7eHt6//j7 ++fXy+Pf2enp5eW90fHh8fP/9/fP3+/h9/nh3fHh+f/z7c2VfzLrUXmlYRzY0PHjJurq9ra205jw9 +Ni0oKy9Wybe1u6qorspHSz0zKywuTcm5tL2tqK7JREY7MCkqK0jHvLS/r6mvx0VGPTUrKy1WwL21 +w6+psMxKSj82LC0tU769tsOzqrLPRkI9OCwrLFW9v7bDsKiy3UxBPjUrLi1mt7uzv7Gpt29JOzw0 +Ky4sY7m8tL2wqbh9Vzo9NiwzLm+2u7S8s6u8XlU2OjcsMy5Ptrq0ubWquF9fNTY6KzMuR7O3s7W0 +q7JkUzgwPCsvLz24uLWysKuw+lw6LTwsLzI7u7a3sa+tr/5LPCw8Ly41Pb+6uq+trq/uYD0qOy8w +OkC8tbiurbCzXEk4JzUuLThDvra2rKywtHpeOyk3MTA9T7qztKystrpZTDcmMi8vPE68s7Sqq7i8 +Y0w3JzAxMkNvu7Syq6y5xGJHOSsvNTdI7r60sbjCyuJ4XFVQTk5OT1FUV11neO3i3dra2tve3uHm +6vPzfXl2bnFyd3Vsb/z6c21oZGNiaGtxevnv7u3s7u3u9fX6+vv79Pf69fL19PT0+f59enV1em93 +dnN8dnp6e3p9entxdfr1fn57enx4fXx+ev/9fvb8+PX7/f33+/t8fv7/+Pt+fn14/X59fPr8e3n/ ++n19e33+/v9+/X59f/5+enn+ff3+//r+/3l+/P9+fX1+fnn/fX57en15eP36+/f++33+/356e/t8 +/vz9fHv+/339+P39/3h7+vv8+/x//359/Ht8/n77d3j8ePz+fv5+e/58//37+3/+d339fnt/fHx7 +dXZ8/3/7/f349vn4/Hh8e3x8eHh9fP7++/z8/fv8+f3+enn+ffn+/fj69ff8/Xx7eHVxcnp2d/5/ +/Pv1+PX6+fh5enpxcnh5eH57+fLt39ToSDxFX2/MxMjAubi/XEI7OTMrN0BDbcu0rbCurLG0yzo7 +Kyw0KzAxSLa0sbOzq67PTD41OiwsLjPJubOzvK6sss5BQTs1LCsvRPbFtLiyrKyx3UVAOzQqLTg9 +TNa8srWvrLK/ykE+MSYzMTA8P72tr66urau8S0MuMjAoLitKtrWvt7eqrrlUPTw3LygpMujJt7m6 +q6yuvkVDPDktKzNATtW6trevq6/B7UY5NycsNjE+TsSvsa6qra26RkosKjQpMC89tLGvsLarq8dM +PjY4KykrLeO+s7G6rKmuw0RCPDgrKi0+Zs2ztrOtq67JR0E5OCkqOjlF8MKytLGqrre7R0I0JTMv +Ljk5wa+yr7Ctq7dOPzMzNCkrKkW6u7C6tKiruVNIQTouKis0/861ubmqra7CPj44NiooMz9Ozriy +s62orcPbRz41JjE1M0FLwq+0sa6zr78/SS0tNyoyMD22s7Cxuqusv1VFOz0vKywtecG3s72uq6+7 +Qz87OS4oLj1Y27i2tq6rrb5RRzs6Kyo5OUFmybW1ta2ut7hNPTkoNTQuODjOs7aysa2qtlpMNjc2 +KS8sQrq7sru7qq67TT49OC8pKzN+zrW2t6mqrL1FRTw5Kyo0PkrevLO0sauuxtVKPDomLTYwPT/l +r6+wra+usU9KNSo5Ki0wML+vsK65ramz6kA8OTUpKipAyb6yvbKprbFjPz85MiksN01vvLW3says +tOhPPDkxJTI8O1jYubW3rauzs9U+RCktNiw4NU+wsK+xs6yu00I5LzYqKCst1Lmzr7msp67JTUg/ +OCwsLj/rxrS6tKyuseU/Pjk0KSw2PkzTurGyrqqvv81EPjMmLzEwPUTArq+ura6tukhBLy81KS0t +PLm3sbW2qqy7VkU9Oy4qKy/vxre3vaysr71BPzo5LigvRVnKt7q0rKutyU9HPDcoLjo4SXi/sLSx +rLK3vz0/LSc2LDA1O7mwsa+0rKu/XUs0PS8rLy1euriwvLarr8FIPzw4LSotNV7Yt7W2rKqsu05F +PTksKDE7Qvm+srOvqay6wko5NyMsMy06Q8uwsq+rrau2SkovLjcpMC49traxtbqrrblPPTs5MCkq +Le7Euba+q6mtvUVIPTosKi8/WNG2t7Wtq67KTUE4NycrNzRDXsSwsa+qsLW7Q00vKDctMTk5vq6x +r7Wvq7tORTM2MygtKz+8ua+3t6mstl5APzovKSsvVNy5tLmtq620Vz86NzEnLT5AeMK4t7KqrLfI +YD4+KSw5MDxD27Gys66ur7NQPjQrOCssLjG/trOwuquptv1LPz4xKy0tWMa7tcGxq7G7RUA+Oi4q +LjtW6bq2tq+qrL5XSz48LCo3OD9cy7Sxs6yuuLhQPzkmMC8sNzbRrrCusK6qtGNHNjQ0KS0rPb66 +sri7q621/D8/OzYrKjBc0bu4va2srrZOQz47LyoxPkn5v7e2tKytu81aOj0qKTgwOUT3tLCyra6u +sV1KNyo3LC4zNMKys7C8sKu4Z0U7OzQqLSxBxbyxurWqrbVlREI8MystNVB+vra5s62ttW9IPTs0 +KDA8PE/evLK2r6uzuMw+QSsqNi01OUm1sLGwsK2ux0U+MjkwKy0t7Lq6sr2wqa/CS0g/Oi0sLTzd +yLW9uKyvscw+Pzk3Kys1Q1PNubS1rauvx3BIPjIoMDQ4RE3Fr6+wrrOzvURELys2KzAyOryysLC3 +rau7YUk6PDArLi1Pw7evubKrr7dVPDs2LygrNUt4vLS0rquste5KPDMtMTtFX2HRvq+329dOVlg5 +QDpOuLe1vMqztMpDNzc1LigrLk7ZvLC3rqmssPBFQj42Ky89SWXDtrG0rqy0yOc6Ny4lLzIxPk/A +s7Swra6uvkpGLzE1LDMySLmzsLS4rK25Wj46NzEqKS1Xxrq1va6qrbhNQz46LiouOlDnurW2r6us +u1lGODksJzU2O1bYtK6wq6u0s+9EQScuMiw4NVyvsK+ytKyv40c7MzorKywv0bqzsbytqq/FQkE8 +NyspLDx3yrO4squsrcdBPjc3Kyg4PkjTvbW3rqquu8ZGQDYmMTMxPkHEr7Kxrq6ut0o+MS42Kiws +N764sbK4q6q060tDPTEqLC1Ozru1va6rrrdKPjw3LikuOkt+vLSzr6qquvtVPz0rKTY1O07etbCz +ra61s10/PCcyMCs3MPOvsq60saqv2Ek9NzgqKys0yr60t7ysrbHLPz86OSwqL0vuwba8sKytr+hF +Qzs1Ki87PlLPurO2r6u0vM86PS0nMy4xOkW5rrCurayrxUtELTYvKjAtXbe4sLu4q6/HS0I+Oy4s +LTTxzLe2uqysr8BERD07LiswPk3mu7S1squsu+JVOTwrJzYzOEh7ta6xrKyvr+I/PSgvLyo0L2Sy +ta+2s6uvyUU+OTovKyszy7+3t76sq6/GREY9OS0rL0Fpy7W5ta2tr8tEPzg3Kis4PEnfv7S0sKuv +usBIRTYoNDIxPT7Jr7OwsrKuu0xHMjE2KS8uOr64srS7rKu4a0VCPjUrLS5N0b2yu7GrrrFuPTw4 +NikrOEVTx7e0tK2qsMnuPjwyJTE2NERVva+zr6yvr70+Py4tOSsvLzy5trKys6qrvFFEOTwuKy0t +dMC5s76wq6+9RD46OC8qLjpe1Li2tK2srr5VQjg2Nzo/SFdr49fOzMrJyszP1uHzZ1xXU1JSU1da +X2NodHj78Pf09Pn07+/r6+ni4d/d3eHl7fb+cW9raWdqaWpubm5vd3hzdHJyc3V0dX779/j48u/0 +8/H08fLz9vr68+/5fv55enl2eHp+e316eHZ6e3t5d3t4eXd7enr/en97ffz7/vn4cfz9ffj39fn8 +/Pt9+fV8+vr//3l+fXx7fHl9fXz8/vv9//59fX59fvv+fn56/f5+fP59fHx4eHl/f/t8/fx7e3t+ +e//+eXj7/X1+fv/++/1+/f78/vz8e//6+X58/vn9/f79fn36+nx8fHt6/nn//Xv7/n5+/X53eHdy +eXR3eXX7/fj4/Pb6/Pt9/3l5fnZ++vD3/fj893/1em18/3n8/nT+/P/5/ff3+/56eXV2b253c3j9 +9Pf67/P3+Pv8fnl3c25zeH378unf0dhJPUpOT23Pvby+t7jMz0k5OiguODI/QOqtrKytr6uu3ko5 +LjcqKiwuzri0sL2wrLPPPj04NSspLD7ZwLG4sKmsrspDPzk1Kis0QFHMuLO0rauvv9ZEODMlLDcz +P0/ItLWxrK6uuE1ILyw2KzAyPLqxsLK4ray+Tz43OC4pKyxev7ixvK6orbxTSUE8LisuPF/Yt7e3 +r62vwklCOjgsKTU6P13NtrGzra24uvdAPSktMy04OGqvr66urqyv3EM4LzYqKiovx7iysbirqrDY +Q0E6MyorLUnXvbS9r6uusWQ+PDg0KSw9SG++uLizq6u22WE+Py0pOTQ7Sv21sLWvr7OyZj08KDQv +KzQv57G0rrawqbDbUD47OSsuLTzHvbO6u6yut2k+Pzs0KiwyTHK/tLawrKyy6kU/OTIpLjk9UtG7 +srOvrbO800E7LiozOkdh5M/JxsbHyMrN0tjpeGNaVFJTUVZdZWp0/vf39fb4/fz7+/f18evp5+Ph +3uDi6evxeW9raWhoam1uc3l4e3h5cXR2b210cnF1dHL//P349/X39vT99ff99vz3+Pj3+/78+/z6 +/353/X14f356ev95/3p++nl5enZ7+n36+338fnr9//3+/n19+vt8/vp8ff56e31/fnl1e/z9/H99 +/X77/X36fHz7/f79/P74enb+ffx+eX3+fX77fH18//x+f35+fHx9dX30ff57e/58e359evt+f316 +9/76/f38+/v9f/z5+f78fHp9fX58ef37fn9/eXz+enx5eX55enh8eH5/+/z+/v1++/t4eP95fX3+ +//z49/r39vb8+f3+fHl3ff/8+v7/+Pf6/395eXh3dXFydHJ4/Pv38PH38vj7+nt7dXF9eXR4/vr3 +9+/n39tbQj9DesPGw767tsNKQDY2Oi42NUu1sq+0uqytuFU8OzgyKSovZs25t7+sq667QUA7OS0q +MD5S2beys6+qrL1zSTc6KCg2MT1M1bCvsKuusrNRTjkoOC4uODTMsLWwubSst15FOTk3Ki0sO8C7 +r7e5qqyy9j9AOjQpKzBN/b6zua+rrbJ9Qj04NygtPj5Yzbq2t62rs7zRPUYtKDovNz5Mt6+0sLCv +rso/PS00MSovLFi3uK+6s6itwU9HPzwtLCw12Ma0uLurrbDLPT45NysqMEFW0ri0s66qrcRiSj06 +KSw3NkBWzLKxs62vtrZNPzknMy8tODPRrrGutK+rsv9GOjU3KSwrN8G7srW8rKyy1z0/OTcrKS9U +2ry1vK2qrbBeQD85LykvOT9RyLausa2qs7/YODgsJC8uLztKu6+vrKusrMBSRS8xLywzNmG9ubO0 +ub3I2G9VTEZDQkNESU1SZfje0s3MzMzO0NXZ3+ft9np8dG5ubm1pamhjYF1bXFpaXmBpdfvy6+bl +5ebp7O3s7/D59fXz7+/v7+7y9/z6/np6b25tbnh0cnJ0dnh8dXV6fXh+/P38+fn17/D39Pf59ff3 ++v76+/T5/P97/np4e3N4/Xl2fnp6eXd0dnt//n/8ffr/ePX2fff69/5893r9/vz8/fx8ev7//Hv+ +fnv79359/fr9//59/f37f3/9/Hx7fnnz/vbyfH59fP19en39/3h9/f37/n54/H36+v77/vn7e/1+ +fvx8e3l3fH59en7/+318/Pn+/X78+3r3+Pz8/Pr9+fj//317e358fn16//b99/x+/nl4d3l7en58 +9Pn++PP29f15/Ht+enN3/n///fv9+/T9//f+f/56e3l6/vn7fvv8fv36ffjr3+1HQk5Z1NHKtrO3 +2EFBPTUtLjdYy7e2t6mprstDRTswKSouS9a8uL6sqq/JQkU8MyorLkvNurO8rqmtvktIPjYsKy1A +zL+2wbWrr71NRj86LystPsbBuMC5qq6+U0lCOi4tLTvAvra8vKuuv09CPTsvKyw4wL64u7uqrcdf +Rj08LS8uOr27t7m8rK/QUkA4PS4uLje+vLi3u6yt029ENkEuMjI3vbe3tbqur+NYPy88Li8zNMC1 +t7K2rq3QWEUuOzAuNTTGtLmysq6uzU9GLTg0LTU2zbe6sa6urs5USSs1NS45Os21urGtsLDMREYq +LjgtOkLSur2vq7Czz1FMKjA4Lz1LxrW4rqu2u+dBQCcsNi48T8i5uKyqtr/iTkMqLjg0RP68tbWq +qbnQYkI8KCozMT99vra1qqm34WBGPCoqNjhF2bu2s6qqte9VQzwsKTY6RtG9urKqrLdcTUc4LCo0 +Pk3Ju7yuq624TUY+OSwoNEZhv729rKutukhKPzYsKzJJfb24vKyrrrxDQToyKikuQ/O/ub6sqq28 +S0xANywsL0nVvba/rqquv0ZGPTQrKy1C0b61v7Gprr9KRz81KyssQca8tL61qa2+TUU/OS0rLDzC +vrW9uamtv1BHQDktLCw7v763vb2rrsBORD87MCwsOcG/ubq6q63CXEc9PS4uLjm/uri4uqyuyE4+ +NzouLC00wrq4tberrc1sQzM/LjAyNry2uLS3ra7eUT4tOy4uNDPBs7ews66t0V5HKzoxLjg0yrK4 +sbCxr8tOTCsyNi03ONu2uLCtr7DGVkwsLzQuOTrhsrWyrK+xv0ZHLCs3LDQ9/bq7samusr9UWS0r +OS85RNmztrCpr7jFP0IrJTQtM0Psurquqa67xF1VLys4MztSzLW3rqmvv9ZFQSwmMjA0SNe3tq6n +rMDZUEQvJzAzOVbHtratp67Id0tALycvNDhNybWyrKarvW5LPTAlKzM3Tsm5t62prLtjUkE3KSw4 +PFfGu7esqq28Tkk9MikqNDxZwrq2q6qsvElFPDMoKTVAbL26tKmqq8FFSTwwKSs1Rf67uraqq63J +P0U7MCkrM0n3uru4qautyEJLPDIqLDFP2rm4uqmrrss/RjowKSsvSOK7tLuqqa29QUQ7MyopLUPY +vbW+ramtuUdHPjksKi1D0L+1wrCprrlHRD84LCosO8vAtr+2qq22T0BAOS8qKzrGwba+uqmsuFZH +RDsuLC01y7+3ur6rrLpUQ0A6LyssMcu+uLi/q6u5ZklCPS8sLjDNu7i1wq6qumFHPT0wKy4t4rm6 +s8GvqblwSzw+NCsvLGK3vLO+sqm180w/PTksLyxOub61vbOptPdSPDs5KzAtTLe+tbuyqrNvSjs5 +PCwvLUi4vre2rqmyZ1w4NjwrNS9Ktbu2t7Kst1ZPNTA7KzEvP7e6tbGvqrNoaDUvPCw1M0K1tbWv +sa21VV4zKzorMTM+tre2rq+ttVdmNCs7LDI3Q7a0tq6urrNVVDgpPC4vOEC7t7iura+yXFk5Jzgu +LzpFu7a3rKuvslxHOSUzMC48TL66tqqqr7ZeUzknNTExQV25t7WqrLa8SkI2JDAxL0Jgu7myqKu4 +v1xQNyk2NTdM2rm4sqmuws9LQzMmMDM1SNu5uLCorMHYUUU0JzA1OE7Nt7evqay/6U9ANyctNjhO +zrm4sKmsvGtPQDYoLDc4T8q6ua+qrb5WTD03KCw7PGPCvrmsq63BSk8/NSouOUJsvrm3rKuuwEJF +OjMoKThBbb6+uKurrcdJT0A0LC45TOq7urerra/OP0Q6MSkrNUf/vLu5qquuz0dMPTErLTVV17m7 +uqqssNVBRTwzKiwyT9u7ubyrrK7FQ0k8NCssME3WvLm+rayvwUNGPTctKzBUzr67xK+ssMVISz82 +LS0vVci8uMKvrLHIQkQ8NywrLlvDvrnGr6qy0UpNQDUtLy9rv7u3xLGrteVFQz01LC0tab6+tsex +qbbgT0ZDNS0wLnS6vLXEtKq5c0k9PjMsLy1oubu0wLOpt+5OPj82LC8tari8tMCzqrd+TD4+Oi0v +LVa5vra9squ3eFE7PDktMi5ct7y2vbOst19KOjo9LS8uUrm/t7iwqrhqXzY6Oi03MGG1vLa5s63A +T08xODksNTB2t721tK+twl9bLjk4Ljs11rK5s7Ozr8xOTiw0Ni05NOa0ubOwsq7GVFcsMzkuOjnb +tLmzr7GvxUxRLS87Ljg75re8tK2xsshOUiwvOC86P9C2u7KssrTNRkgrLTsvO0jQu7yvq7K40E1M +Ky45MT1Ox7W5r6u2vt9DQykrNy88Ucu5uq2qtMHcT0ctLjk1QGfBtritqrbOc0Y9Kyo0Mzxew7a3 +rKq20WpJPSsrNjdB6r22taurs9ReRz0sKTY4QeW/ubWrq7PlUUk8LCo1OkTYvbq0q620fktCOy4n +ND9Lyr29r6ustFhNSDktKzQ/VcW5uq6qrbhJQT00KigwPlbDurusqqy7TE1BNiwsM0j8vbe7rKut +v0NIPTQqKy9DbsC3vqyqrb5DSj41KisuRt68tL2sqa26Q0Q9NispLULXvrS/rqmtukZIPjYrKi0/ +z762wbCqrrpFQj45LiksQ8W/t8SzqK29SUtBOCwsLELBvrTBt6muvkVBPjgtKis7w7+1vrqorMBX +S0M7LS0sO769tbu9qq3FTkA6OissLDW+u7S3vamryV5FOz0sLS0zvri1tb+sq8ZYRDg9LiwuLsi4 +uLS9raq/X0s3PzAsLy7St7m0va+rvFpKNzw4LS4u77m+tritqrteVTM7NSszLuCzurK1rqu+S0Mv +NjQqLy7utrqyr62qvl1cLTg2LDgx27G4srGvrcdISiswNSs0MWq0uLCurq2+ZFwtMDYtNzjos7ax +rbGwxEpOKys1LDY5a7K1sauur71MViwqNyw0O3+0trGqrrG9R08tKDktNEHtt7mvqK22xUdNKyg4 +LjdI0LS2rqiuuck/RSskNS82TtC5uqynrb3TTEctKDUzO1vDs7Wrp6/I/kE8KyQvMThdxbi2qqez +z25OQy0qNDlB4ru0tKqose9MQzkrJi41PPe8tbKpp6/fT0g8LCcuOELkureyqamu4khFOi4mLjtF +1rq7sKmrr25DRTktJy47TM23u66oq69dPj42LSUrPl7Dub+tqKuxTEdCNywpLj78wrS9raistUZA +PDUrJys878W2wK6nrLZKS0I4LCstPdK+sr2wp6y6R0M9NSopKjjRv7K7sqeruU1FPzcrKis4yr2y +u7eoq7hOQkA5LSkrNMm/tbu7qau5VUVDOi4rLDLGvba5v6qruFhAPzsyKiowyb65uL+qqbteST49 +ListMMK6tra+q6q/TkI4Oy0rLC7Gubm0vKqpwWdLNj8uLTAuxrW4s7ytqsdWSjA8LysxLdmzubG5 +rqm/WlQvOTIqMy3msbiwtq+qvVFPLzk3KjItW7O6srKuqbtZWS40NiozL22zuLGur6u7Sk8tMDkr +MjNlub20rK2svlNbLDA6LTk73LS4sq2vscZGRiwtNS01Pu66tK+3vsXb7mVZVFNTUlJUV1hfbfzq +5d3b3Nve3uHp6/R8/mxrbWJlaGltfHdxc3dya21sbHR3+vLr5+bk5ujq7PH2+Pf9fvl+/n34/v77 +fXl0cndtcXR0dHF4d3Z5e3n9fn18fv369/5/+/r49/j28/r39/36/Pv0/X78f3t6fv78+v31/n7+ +fnx3/X3//n3/fXt9+Xv+///8fv5+/X7/fHv+/v78eX78dv95/n5/fn74/Pr6/v/3/3/9fPl5/vP2 ++vz8/vv+/v79/Xx9/336/Xz/fv71/vv+fX99fn57eX94/3t/e3f49/j7/Xt9fH15fP5+ff58+f3+ ++3r59/v7/n58/Hz9fv37evz/+ft8/Pr6+f50+P/9e33/eX18e+/5e/J/ffr7/3/9fHx4fn5+eHt9 +evr9/vv7+/r8fv/8/v98/f7++f7/fX98/v13+nx9/Xj/fv76fv5//Pr8ff78+vz+/nx9fX34/P36 +/Pf//P/+fnl4enp6/n36/nt7fXx8/v/6f337+vn6//x++v3+/vz7//39fP7/f/5+//z7fXx+/nt+ +fnv2+/x9/f99+n38ff/9e/38fnx++33//f/+/n3//fz7fHp7f/58fH57fv/7fv/5+/v//H3+/f3+ ++vp++/38e3v6/ft+/f9+/fx9f/57enp/ef9+eX56/v97//z5//59f//++/r8fff4/f5+/vv/+n99 +/X36fn1+evz7fPz//n5+fHz//H57/Pz7//59fP78/n38+/r9ff7//Px/fH38fP5/eXr++n37f3z9 +enLy7nT9f3r5ffz9/f1+9X38+3j2/H/7e3v9/f73/XX9/f18//59ff/+fv//fn5+//3++f79/f9+ +e3x+//v+/v7+///7/fv9+/7+/n19e/96evv/ff38+X5+fX1+/vz7/f39+vr/+vp9//x+e35+d3h8 +/n1+9/z6+338/n98ev/9fXp5eX19/nx+///7/f76/Pt+/fj9+v37+f37/3t8e37+/v7//v5+e3x4 +/v54+338fv79/f56fn15fv3/ffr7e378+/19/H3//f55e/v8fnl+//v/ff3++/35+PP9+n79fvz+ +/fp8f31+/X/6ff1/fXp8/Xt4d/97enx7eXz5fvn7+/n8+fr/f/v7fv7//f99ffr+/Pl9fXx5+/1/ +//z8fnx4/v//+vv4fv76/P38f/z8ff56//53/Xx+fnr/fP/4+/78fn5/f35/fn7+fP1+eH78/Pj9 +///7+fl++31+/X37fn79fX56ffv//P18ffz9fX79fP5+/vr+/n7/fv19/n/693z9/P56f/x09fj/ ++3z6ff52fv53eH3+fH94ev59/fn9+fz6+3z/9fT9937++X7+/v19ff/9ev16fHt3d3j9evt+/vd+ +/33+fX74/fj++/r99fl4d/12fn79e3r79/n8+3r8//79fPn+/v/9/n98/vl+fXv//ff+ffz9fv58 +e/t9+n/+/n/9fP59eHv/fn15evz+f/j//vv+/3p+fn5/f/t9/fr7f/v6+/79/f76+/t+ev35fX1/ +/339/H3/ffx7e3t4fX5+fPx+/Xz+//z7/vr8/v7/f/5+f/99+/l9+vT9/fp4fv5+/nj9/n7+e//+ +ffl//vz6+v78fvv9ef19/fl4fv59fXz8ff59fvt9+356/f79+////P3+fXp//n78fvx+eXz+fn39 ++/37+f77+3z7fv78f/7++P7+fv//ff78/v7+fnx9eH78fXz++/1+//98+/z7+/35ff/8enx3ff56 +/f///n1+/P/4+fr6+vd/+3t6fP3++P1++/7//H94ff19fv7/fH//fX7+/f/8/v7+/f59f33++nv9 ++/39fv/7fnv8fX3//n19fH19+vr++vz9f/z9fn77/v76ev39/f5//f1///59f/56eHn7/vn6/Pd/ +fvx3fH1+/H56ff5+/n18e/79/f59/f7/+/589/x++Hv7+/v6/X5+fvv6fH36f3x9e3j+/3x7/f1+ ++/x+fn5+/X3+/378e/z/ffx+/nz9/H7+enz6/n1/fv78/Pz+/v3//3x89ft++Hr/ff/8ffz9/P77 +fP59fXl4/v/8/Xr+fH78/Xv++fz//n18fv39/np/+/z+ff3/f/d+/3/+/f/7fv19/f3//nz9ff58 +fvr6+v79/H38fXp9//p+fn7/fXx+fP/9/3z//f76/vt+f//8/Hx+/vj/fv9+e3/+fnx+f/99/P18 ++Pt6fvn9fX7//Pn99/n7/fx+fn58fX5+fv59/X57fH19/338//j/efr+en/9fvP/fvl++fZ7ev59 +ff1+/v59/n1+/vr6/v34//x9fnx++vx7/vv+/n7+/333fP57fP57/P7+ff5+f3/++/75/n59/H56 +/3r9fv97eHx+/fn+/fz+/n/9/Pj8+/n79/58/Xz6fv79/X58/Ht8fPr+f/x9/357fnx5fv99fv77 +/Px+ff9+/Pl9+35+/Xv/d3v9/vv8/Pz4/v3+ff37/v79/Pv+/H79+v36+3/++nx9fv97fv59fP99 +fn18fHx9/v17/v3+/vz8ffz+/fv9+/37e3j9fP5+fPx7/vx+/X37f/f8/vl7eH73ffr7/Pt+/vt+ +/fx+ff5/fH76/X5+e3v+fnx8/Pr7/339ff3+//18/P/9f3x9ePt++v9+/Pz/fH16/P37+fz2/P1/ +e/99f357ff3+ff98/X3//P399/78fnt9fH5+e378/vt7e3x//fv9+vn7/v19e/x+fXt+/v19fHt8 +f/z+ff7//f5+fvnxdnj1dH/593h6/f7z//j+fPl+ff97evx//n3//Xv6fXz/fP1+fH1//v//fn3/ +/f1/ffv+/fp/+Pf5/v78+fz//n19/fv8/nl6fXl8/np+fP19e/r+/vz+/nz++378+/9+fv//fvf5 +fn54//z9/fx7dvl+/v76/vz8fX58fn78+v36/P5+/f/7+f1//n7+f35+fv3/fHv8fnx7fX15/n56 +/vx5/fv9/fr9+X7//P9/f359fPn8/Pn2+f/+/nv++Ht8/H38efp7/n59/H3/e/t7f/19ff59fn/6 +/vz7+/v9+v/+fP77/n5+/3z89f7//3t7fX5+fP9/fP99+vx+/X1+/f/8/vz8/Pt/+/78/fz8fnz9 +/379fP38e/5+/P1+/X16e///e35//X79/vr+ffz9/v78/f37ev/7//79fP1+fvz+/fz9fnv9/n7+ +eXx5e/36fn75+fz8+3/8+/98fPh6fP5+f/7+efx7//18ff5+fPt+/f5++3x9/nx8/Pr9fP59/P79 +9/33/fz++ft+/X5+fH7+fX7//v59/n59/3p9/v76//9+enz9/H3++/r7/Xx6d/79fP79/X/9/f98 +//19fn77+/5+///6+/v8//f8/f55fv///X18+/t+/n7+evv+fn9+/X3+f31+/X99fv3+fH5+fH/+ ++/7+/fz5fv7/e/x///97//1+/n56+vv8/vv9+/76/337ffx8enp+f/33ffv//fp8/np8fH58/319 +//34fv5+fnz+/n/4ff76/H39eH77/f59/v57/H56+ft9/H/7/vz++n9+/fv9f/5+/v99/v33fnt7 +ePz/fvR9/v38/Xx9/nr//Xx+/vv9+/35f/1/e318/nl8/v18/vx7e39//f77+Pz8/n/9+/r6+v9+ +93r8+3z8/P1+e35/fP58env+fHz+/P19/nx9/339/35//v39fnx+/fv9fv37//79///+/P78//7/ +/f9+f3/8/v1+/P5+/f////t7ff35f/58/n1793v8ff3+f/58/n3+/f1+fvp//35+ff38fn1//X3+ +/33+/vz8fvz9fv19fn9+/P78ff7+/P18//38/Xz++n78fn5/fv3//X79/vt7e/t+/Pt8//t9f3t+ +/31++/59/P39/v99f/v9ff7+/f/+fnr9/Pz9/v38/v3//X1+/H3//f7/fv9+f/79/339/n/9fn3/ +/f7/fn/5ffx+/X58/H/+fPx+/v99/v39/37+/n7//n7+/H38/X/+/vr/fv///f79f/3+/v59/nz9 +fH7+ffr+fPx6//z//Hz9//5+fH98/f3+fP78fv59///7f378/v5+/v7+fv77+339+/7//v1+/f/+ +fPr9e/3//331/Hl5cf77/375eHd+9/j9/Pp++v/+/P/+fX37fv1+fn3+/n59/v7//nx/e/5/fvh7 +ePh//Px///79/v16+X9+/nz/fv3/e/z9/X7//v/+/fp7fvp//X59/379/nz+/X/+f35+/Pz+/335 +ff39ff79/fz7ff38//t/fn/9/n9++v/+/39+//5+/Hr8/Hz9fn7+//79fP/6fn/8fX38fn98/f5+ +/n1+//37/v7+/X5+//5+//v+/X78/P/8ff39fvl9fvr//H97fP1+fn/9/X37fP19fvv+/H79/f56 +f33/+37/fv38f35+/v78/vh5/vt9/H3+fv3+//3//P38/Xx//H3+f//8ff59/n39/n7+/v7//37+ +fP78fv59/ft9//5+/n1+/3/9ff58fnz/+/15fvv//X1/fv7++/18/vv8fv1+/ft+/H79/X7//3z/ +/n19/f38fX7+fv5//v59/P18fX9+ff3+/n7+/v7+f378+///fn/6///8fX/+/fz9ffv8/P19ff39 +/n7//f9/fn1+/fv+fXz5fX79fn3+/P9+ff77/X7//n9+/357/P79/31+ffv+fv3+/f5/fn5+/vz6 +fX33fv7+fv/9/P99//1+//9+fn7/fP3+//7//n5+/P7+f379/H1+fX3//n5/fvx+/v59fP3+//t9 ++vz/ff79fPr9/v19/P77fXz9//19f/3+/n7+fXz9f////v1+/X96//v+fn5+/f7+/X3//f5/ff39 +fP9+/X/7//5+/P9+/X//ffv+/X/+/vt+/v5+/f3+//79ff76eHv8fv59/vz/+X97/f/8/X7//v9+ +/n18//7+fP7//f39/nv9/f79fvz+fv1//nv8+vz+//p8/fx9//9/f378fn77fX99/vt/fX/7//79 +fH79/H3/fn77f/78/3r+/nz9/X7+fn99/f/8fv/8f/59/n7//f78ffz7/Px9/P/9/v17/vp9fX5+ +/33+fn35fX39fP59/P3//378fv5+fX5++35+//1/+n3+/f/9fv7//P7+ff5+/fr8/nv8/v1//n5+ +/f59+/79/Xz+ff1//f9+/P1+fv98/v3//X///f3+fn3//35/ff5//v5+fX78fv19+v9//X7//n79 +/H7+/fz+/v7+/Pj+enn+/XF8ff/+fX98+Pn+/f== + +--owatagusiam +Content-Type: image/pbm +Content-Description: MTR's photo +Content-Transfer-Encoding: base64 + +UDQKMTA0IDEwMArve3/+3//////////w3b/b73//////////sLbt/7v3/v++//////B732/+3/+5 +/9/////w3nf7d//9/9/////78Lfc392//m++7/f///Dtt/b//7/d7//////w3bs//////v93//// +8Hbu7b/99//9/////+Du2+///9///77////wu3c7f/v9//6Nf///8O212////2+60z////Bvvd3/ +/7+ym3bP///w9s5n//+/tt253//38J3zv//+/9+3/mf///B7Pf//9v/f///r/+/g7u1v/90///// ++///8Lbvf//n7aO/6eX/3/C3O9//vu5s7/91//9wbdr//fszW2/983/98G3W///pkkN//Lv3//C2 +d7/+zEyU3f9t//+ws7n/9iAAEpf/c///4M2ef/EiIAJPbJ////Dd5//5AAAASf217/+wtnn/zBAA +AAb29///8Gbef8CAAAAj2t////DZp/8yAAAAAfs/777Q33n+SBAAAAX83/378GbefskAAAAB9m/f +/+B6zf4kQAAAAPs/9+9wm3d9kgQAAAL7t/2/0O20/JiAAAABbP/v//Dtn/ygIAAAAWx/+9twm2n9 +JggAAADzf/7/0HZu+UCAAAAAnb/XtvBnt/5QIAAAAP3/X/+wubX5hAIAAABXf2/b4L5t+SEAAAAC +Xf+z//DNz/5ISEAAAGb/v7dwc3P5kgAIYAA7f3/94L51++SRvyQAP/5237Bmzf/9RPeSABf+7/bw +W7v3///52SAf/u974Ns25//7DAEAD/n/23Dc1dv/rmcggA/o/v9wZ9tb/+SeyAAf4H+30Lsqxt/S +PgBAW+A39vDa77f/3j/gT/vwPd/gbtWz/9oe/DuH/D95sG23j9/CHmQwBYA/7/Dbakn/4i8AIBYA +N79w222Xf8EGyCAHAD330G23N//BEJIACUA/ffBtmsm/wIAQAAYQN+9wm26Yp4CCACAGAH3/0PNt +pl2AACAAAAB/dvBtsyVfIEkAIAAAd9/wbbbxLkAEAAAAAP270Jtt3r6AEkKAAIDu7/DzWZ/+gAZa +AAAA/v3wbdtgT8GBgAAAAfefcL222k/gASAAAAP98/CW7Zky6ADIAAAD73/wdtnlHuQAYAAAR/vd +0Nt2fNuSADAAAgfe73C7bxo2wgAYAAAP/7vwbbnqbaAADAABH/v+8M227JskACQAAD3+77C22zY+ +2QAkAAAf97vgdtubD/lT8AAAHf/+8Fts+V/gAJgAAD97b7DNt2xHkgQIAAA///vgdLWeNPAQIAAA +G+++8LeZ05ZMgCAAAD/777Crbn0TAAAIAAB/v//QamenbeIAAAAAd+/28Fu5uyUoAEAAAH3//uDd +rtubyQAAAABf9vuwptts0nSAAAAAf9/v8DrZt2WSAAAAAM9/ftDbbt95IAAAAAC3+//wzW3ZmWAA +AAAAt//t8Gebb+yIAAAAANv9v7C0//72gAAAAAFb//vwn///NkQAAAABbf7f0P////sgAAAAA2b/ +9vD////eiQAAAAKa/7+w/////8wAAAQDu3/t4P///73SQAAABmd//3D////v0xIEAA2Zv9vQ//// ++/yAIAANtv/28P///97spABAGmb//bD////PIwEBADObP+9g////zfJIEAA9u//7cP///8fYkIAA +Zm2/9ND////HbIQgANtN//+w////yeZhAADZ93/7YP///4DZEAAB5jd//dD///+yexIAAzu5/+3Q +AAAAAAAAAAAAAAAAAA== +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Star Trek Party + +Received: from hanna.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA29543; Thu, 3 Oct 91 13:04:09 -0700 +Received: from thumper.bellcore.com by hanna.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA19372; Thu, 3 Oct 91 13:03:25 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id for MRC at CAC.Washington.EDU; Thu, 3 Oct 91 16:03:12 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id for MRC at CAC.Washington.EDU; Thu, 3 Oct 91 16:03:09 EDT +Received: from Messages.7.14.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.40 + via MS.5.6.greenbush.galaxy.sun4_40; + Thu, 3 Oct 1991 16:03:08 -0400 (EDT) +Resent-Message-Id: +Resent-Date: Thu, 3 Oct 1991 16:03:08 -0400 (EDT) +Resent-From: Nathaniel Borenstein +If-Type-Unsupported: send +Resent-To: Mark Crispin +Return-Path: +Date: Thu, 19 Sep 91 12:41:43 EDT +From: nsb at thumper.bellcore.com (Nathaniel Borenstein) +Message-Id: <9109191641.AA12840 at greenbush.bellcore.com> +To: abel at thumper.bellcore.com, bianchi at thumper.bellcore.com, + braun at thumper.bellcore.com, cameron at thumper.bellcore.com, + carmen at thumper.bellcore.com, jfp at thumper.bellcore.com, + jxr at thumper.bellcore.com, kraut at thumper.bellcore.com, + lamb at thumper.bellcore.com, lowery at thumper.bellcore.com, + lynn at thumper.bellcore.com, mlittman at thumper.bellcore.com, + nancyg at thumper.bellcore.com, sau at thumper.bellcore.com, + shoshi at thumper.bellcore.com, slr at thumper.bellcore.com, + stornett at flash.bellcore.com, tkl at thumper.bellcore.com +Cc: nsb at thumper.bellcore.com, trina at flash.bellcore.com +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary=Outermost_Trek + +--Outermost_Trek +Content-type: MULTIPART/MIXED;boundary=Where_No_One_Has_Gone_Before + +--Where_No_One_Has_Gone_Before + +You are invited to a + +*** STAR TREK 25TH ANNIVERSARY PARTY *** + +When: September 28, 1991, 4:30 PM until whenever +What: For those interested, we'll have a rerun of last year's season-ending + cliffhanger, and then we'll tune in the season opener and the 25th + anniversary TV special. Prior to that, if you bring some food + we'll have a pot-luck meal, and general merriment before and after. +Who: You and your family, including kids of course. +Where: 25 Washington Avenue, Morristown. + (See Nathaniel if you need directions.) +RSVP: 993-8586 + +What follows is some Star Trek related multimedia mail, the last of which will give you a chance to RSVP on line. + +Live Long and Prosper! -- Nathaniel & Trina +--Where_No_One_Has_Gone_Before +Content-type: audio/x-sun +Content-transfer-encoding: base64 +Content-Description: He's dead, Jim + +LnNuZAAAACAAAFmUAAAAAQAAH0AAAAABAAAAAAAAAAD////////37+/r7e/z9/f7//93b29z +//////v37evv7+vr7+/z9/97b2NdVU9OT09RWmFr9+Pd3d3e4+vt/29la21ra2lra3vn3dzn +9+//YVtaV1tp9/PjzsjHxsbGy87P2ef3c2dz/+vr59/Z09HR1dLR2d7n/2lXTUU+OzY1NTQ1 +OD5ETmXf2dLP1dfb3O9jYWNhX19pb+/ZzsjIzMzP43dfVU1RX2/bybu6u7q7wcjN0+1ra1VR +Y3fv7+fZzsS/v8LEztXW62FPRj03Mi8sLCwsLTVFVffLwL6+v8XFy9b/W1tdV1RVWVtr2srG +ytXj/09LRT4/SVtd2MC0r66trrG2uL3I0/dOSE5WWVxn99nGvby7vsfR4VdKRT03MCwoJSYn +JyowPURb0cfHz9lrZ2tZRktdd+HazcrGv7iwrrC4usHR5W9VTl1pd8i7tLSztbm/xcrb91dF +Pj9DREhXb+vQv7y7uby/wsr3XUQ7My8pJiYnJiYsOEFK38G9vL7Fzc/R72f/1dXe69/v99/M +w87v919NSUU+PUVMTme8s66urKyvsrO2vcTNb1JVWVNLTmfr2szKx8HLzs3XY0o9ODQtKCYm +KCYoLjpHacnIx8fI1W9dU0A9RU5nZf/Zxru2rKuusrK3xM/cb1pvd2PXu7Ovr7O2vtVlS0M9 +ODM2Oj1ATVfr1cq/vbu6ur7DyutSPzoxKiUjJCUkJS48T+29trSxt7zCyNNYS1FYb+/t2c/H +vrq6x9HbW0E9PDg6QE1dxbGtqaenqayxtbnC3FFNS1NeZ//c18/SzM7Pz/ddTktAOTUvLCgl +JScmKCw3QV3bvru2trzCyMjrT0hTe+fXy767urCsq7G4vcn3WU4/P0NJTs+6tbS1uL3Oa0Y/ +PDcxMjg+SlBb3si8urq4uru+yNnvW0c9OTApJycmIyQpLzdFY8i8uLS2urzC71b/697j2sfC +vLivr7W9xM1bRT88ODxHSnu8rqyqqquvtsDXd1NGRERKUVphX+HTz9LV2t/3b1tNRDs2MC8p +JSUlJSUsND1I2MC3srK1urm7xldHRUtLTF7Vyr61rKutsLa8zmdKPjpDRlHPt6+ur7K7x+FZ +Rj86NzU3Pk9cb+/Nvry9wb6/w8jV/1pFOzgzLSssKygoLTQ9SNrHvbi3uLq8xNtMTE9eZWfn +x8G6r6yttLa9ymdGODQ1PUBHzrWtrauutLrC2VlNPj1BRE1be+/jzMLJzNPjXVtKQDo2NDEu +KygoKignKjA4QGvIv7u4uLq8v83hY2lvc+/Ovrm2r6utr7O7yetURzs5PUdbyrevrq+zusfP +91lEPjs5OT5FTFBd98zIzcvKy93ja1lPQzs6Mi4sLCsqKzRFT9a5s7O3ubm9vcPnY1dMS1NN +XdfMw7y9x8rI0V1VT1M+PUdvz76vq6+vr7zCy9VZTkpKTERhc1lr0d3Sy83azs5rXU5EODMu +KykmJSQkIygyOkTOuLWzrrG/xbu41s7I1+u9ubmyrKytrbS7uuFCOjY0ODlAc8O+tbbAyM3v +X11LRkZERV7f69PPz9vZyszKx8DYy8vrUT83Li8pJioqKCs0Oz13u7W0srXHwsXcUVQ9PEZE +QE/XzsC6uL28xcHhRz9HQD5axbavq6mssbC+z+PTRzI8Ojg700ZFd9dN47nDz7+47cjM7ztD +Qy4qLS0jJygqMDNP38vPu7m8vbq2vsfG19fXzsO1tLOvrbPfu77VO0xFNS9CQEXCzL+3rcvY +4108Qz0wO0jj/93awr7VwLW83bS6wtTDWzowMzMoIyYpIyorLkJd19W6r7K/vLH/zrz3Pc3M +P2O/zky5s9HIr+dMPkIvNkpM0LinpJ+fo6qvvU5LSzYuMjk4SdDP3sO9z8vFTzZHQi49U0Rd +zMnN59zrbzA3PDsuLi0xKTAuKz3rxb6urqWgsbe4n6Sqt6rGLTI2Kibrs8XBq8F7MDIfJCEn +Ljtfr6ain5+foqK1w0IvHyAoIzBByc+trKepq7HGZTErHx8fHx8fHyAnMkLIr6ifn5+fn5+f +o6Cx78HhLzRTPylHMysrOiwmTEU4P7Pew7P33atJSa6nc76sr0i2rMNevbs438hIJVlQLyx3 +OCgtNCslMTwuNOPQyLKtqqerrK7GzVvTNS0uRSwmRdM3T63FrqzM377eOT1fKy5XREjJt7Oq +sLKtqv++wUfXwUss3UYvxNg8c6zLvrLDv75eS2suNy0iLjMfJjsyPa62yq2ipsyrxUq+zT5O +20e5PTK8yz+8sV/VZ7NFS09NMi9UTTxetFzIu96yvt+7r1ezsMXMa1tO0z05KT0rIkAuMEn3 +QLfnabRWSkfJTDo3yk9DLN+qv1/RyUbrU0lFd0W5tr3Bv7xPZ9EwLsbEPFuvvVO+q7Cup7K4 +Y080HyUgHyMmP0BXraOroammta3Jv0tLOygpKT5EL+mst8q7q6zv0cu1UUFZP003LjMzXS00 +RkYq4z0wz0M4QrNFyrNIvsS3T7HG07DDsrasv7m/XbprOzFILS48KD4wRT3XO0TEUEjJy99M +3bPQY925RbbEa3OvQzrJOsTXTOvJ+9e/68FMr21aRMbDQcdCxMy92a9OwNXzX0bYOlVR33dO +rcDjw7V31Uc8d0w/OzxTUz4/VdDz99/Ore3G78xCPjxBNi8/Ly85OTMywT+3b83Gzu3Vx0lD +70nIzFHIt669966wU8RMUelET0DLNWdMa01ttmfBP824Ok9JPeEw6Va/O2e8ULZS07XHU7rK +uljVw1vXa/tfQ088STlLSmPnzGO/W7/Wx//TxDxNXm8x/85D30nP5bJMw+PNN9Y9V1bBUc8/ +7bG94cO+zmvHZ0zLRz9CQjhZSztAc0TOXjhO38FTyM1XzXNH5z1JNFMqT0RfTdeyXa/pwcXI +Y1fS/87bX9nKzGf/vuHHz/e4T8DzuUpX73vFOs/Nzcr/yOf33kC/d9tcYchP671PxNDUSsL3 +uL3VxLXF+8tMS009KjM4LS45OkTjMtBZ3Ei6wtFKb0rBb0zIxcg6u2HP10vM1O8z2M81QzbO +R8ZYtMzPU8vPz1HKU8tFYWvM90PdVMZY607HTkbcP8c9zuVFVDrINcw/QzzzZ0q9yeu0uLnJ +u8NXb9rV+06+Srbf80/Zx8/USctaREndOE04XGFvwsW367fR3L7ezzzeOfdEyEhfw0vBd8xD +xmvOWlNj5+c+Uzk+ODgvQDM+NUE/WVX/yMnAx3fA/7BlvGm+Ub5Rxsq+xdW988XhVmNGVzlL +OFpjRMLTtc68w9PMy9vT7VnY8+//593aXc3Wz8/I28vv4UHHUVlMUDxANUU9OktJa9fFy8jK +w9zM49nKTM5Zd1lR90/cXdTdz9vX3l5jUT5VTW9P2b++vbq/wdJ3Y1dKPkBGPUM+TFlvWs/F +083Hw9HVzu1nRUg+QTU2ODQ2MzpNTGfcw8nLw8nhx9bO3cnVyMrAxrjFwL3Cu9vC92dcQ005 +PD5BS1Prv8TVx87I1Gfe/9NOa3dvT1X3d3NvzM7vz8jI02drXVM8OTk6NDQ2MTw+UljN0MC7 +v77SynfMZ1djUWtOY3PX0+3ry9Xn3ddlWm9LW0pIR/vdyb6+usPB2tTNZUxJUERLSllXa1nv +x9bP2cfHx8rK1/9NVkM+NzM3NzM4PFxl18fFv8DFy8nMzszfxsXHzcTBwcjEyc/b299fR0M/ +PTs/TvfUyb64usHJ1W9hU01VV1JNUE1TVG9l49PcyNHN193r729OQ0Y1NjQyMTA2NUJKY8rE +wsfCxtnZ69Tr39nj7+/OztXdysbP5//vW0NDPT9ARf/OvrivsLK1vsPP0P9eU0peWVFUW2v/ +a9nZzdXO1P93d29IPz0+NTIxMC4tNjtFSf/TvLu+ubu5vb3Nztfez9LT19jLxczb/8f3UkRJ +Qz08QEpV28u/wcS/zdNvVE1fUD9DS0hMW13zzsfCur+3u77Jzd1PSUc/ODk2NTAvNzs/PmXj +z9bJzd7N1MzP29fMydPIxsbAvr7B0cjTy2fnSkJBQ1lRzce+t7u9xMbTd3tXTEdHSU1Tb9nb +6c7SzcjEyc/lWWFKOzk4Ly0uLSsuMkNPVM3Dvr28vL+8u73IzcTFzNDGy83X291rX1FGPDo+ +Ojo5P0Jb28C/vb3Ix9HOzNFzVE1VT1lYXWNn59jNx727vb68ydlfU0s/NDAyNS8vNkVGT2fP +zM3JzN/v1t1nb9/KzNPOzGGryd/Lw06zzMn3XNHb3TfG12dfsfPCVVfvsllvQkfDP8c64+NB +Ub9Ew9xc0+U8OL9K2FoyLjstOi89NOsuSz22ScPOrsixY8K/+04/47/e373FzcNQuMrTa2Vd +Y0AsP0M4z7a7q666y6v3R1XhPdZLNMjHQN3Id9m349m3wTTFRMI80zE+RTNfWVwsWka6UVlG +sk3nv8tR9zYwwq9HONTJa008Zaavus6tu1cxLS8sIjDlvNfJpqemtr61tjYrNiciIB8nPz1Y +q6Kon6GjpajBYfcvIx8iIx8nHys7vbemrZ+rs03rMy03Vc2trK+rr9c8QDo0PeW2tc6zpKW+ +yMXOTyYkJygjKy9GwaijoJ+fpKqryS8/LB8iIh8gKT0+Pb+wraOgpK9r4UY1LjXJwKu1tNVX +KikhHyErN0vIuMasoa6/zME6LyYuM1VDY6ynp6Ofn6WyxunfNR8fKB8fIyYp2zU5ta9GwKOf +xdGtrsZb2rGgpK2sqrc/LSwpHx8jMTQySc64rMfBs7c6PU44M2PZyq+ioqGfp62rtd3dPScu +Kx8jLiQr2z8uY6jRO7Gfw0ZfwMJPS8WiprW1r18tICQiIR8q08x3tKiuqq3S5VsnHyIoHy89 +X66foaSjqL5ZSUQ1MSk3KyknO0w7R8GzoqlvvqilTe+3vltS466hq7SutjkjJyYfHyAtPt9d +rau1r6y43U0sNTctNMjVZ6afq6yrvddKLC1FNjM3PS46RitnscU9rqZra6ejXVGzsr/Z072k +rNDOyDUfHyIfHyAwyb7DtJ+rw7W7dywoKy4rL1C+r6qfoamptNNvTz8/Qi45TCchLln3PDj3 +59/E+2Oon6/rqaHDP9G6p6/KuLdVIyInJiIlSry/ya6tvLnhz1Q1Kjo/LTe5sK6mn6Kps99v +Pi0kOD4vK0cyLEQ34cG+Ta2rrFU3UKeuNe+wxjI2R7atxdjB3SkfICsiISjntsLNqKOuX8Sx +xy4kN1xENc6qqKqmrbbHOTs3Ki93Oj7HUTk8Zy85zKpESK6t5+t7p6CqS6yoyDhPxcW+Tklh +Nh8iKiciLty7tr2vpalLSMPILC9fXE3z27+yq6motVhpYyotLixM5TQ+tOM2O+/7vDQ7vai3 +udA1XbSsVEG31zwzOruvs0/d0zghHyMnKitZq6mpt8GrsTQz7eMtM8/JtM5jwKWjrLOww08x +Mt1nND20uzUvSW05P08+zae8bbmhs8Y/PrGt3yu/r9UyV7atyTdT9zkfISs0KTTBqrG/taev +Rjvrxz0wX8LOb//BuK2ssrXYQTA0LixQ1c7JW+9CNSw7SzswP0Jcy6Owtq6zyz0rWa/nLT26 +ezwzS7GtzTFBUCkfJDFHRMKtn6evra/HPzE1NisuRqzXPGOyrq+2wrS4vtfDSDxNX0tGMi84 +Tj4wOrq30dqmp846wKqtRCc4vksvWq3JL0U3OTkuObGvTzbVUzYlL2vEvbSfn6Sps7zAVywn +Mjw6P0jbwUw7x6/M22dDX0gpKD85Nzw/TmlMOUiyxeO/qqbDWdW5zEzrrVsvNUUzva+v6TpR +MjQ6Q9exvP84MCwpKTN3uqyfn5+fn6KtvD0pKSsfHy42L0e+xrymuP9P8zgwQELv09c1Lyk5 +NS04tqaosbGvrcw9Pau0TCy+v+tALzTcwikqa8YqKTBNQj1Dt5+qurmzYy8oL9O6wa2fn6Os +r7bPLyAqLiIgLC0yTT1DvbHL1VlXXVUyNs/GRlG9urvD47iuwsqvqq+80ruqXzT3wzw5Pv/H +P1tfOSkxQDJBt7nVQEA4W09Uu6irzcvfbzAtQ72/uqafpqyzvVEuIB8fHx8gJCo3QLympbmr +ornLytvK1jo/+/83b763wK2oqa7L78/RRT0/dz4xLTg5N0BZSFH/T2d3b9RLzcbbd2/bSUnr +/1V7wcHEyr22sLm2trC4vcZ3Ri4pLjMrKjdDOz5Nb9B3Qz1ZUUI4TsvK1bmmpaqqpKesr7W1 +tM1f71UvNT89NTc3Ny8uNkU7NDg1LzE3Pmm/ta+yuLGuvr+4vMXMVUnZzVFjylZFQzk1OTQr +MDk4P93Pv73Bxs7zSlVv693EwMbCwr+9u8zR01tJPkNQ28vCu8Lfd15JPT5Oz8nfzr24ymdr +zk8/Pk5PUT5D2dNBP2fX3evPvrrRSklXRTlB/148SnfF0e/jy8pXUt3aZ+O+w1ta52nn72Fv +yc/3/8jB2/fGvcrvZ01GPzs4Oj88Slr/WGvOz9nEvsPlW2tINjU/U17Z083Jz93v3efrzsft +d2tIOj1EU2HZx7u1vMDAurzC2tO/y0lBTkQzLC82SURNz7u4vr+7t73BvbzEzs3O0dLzW/tb +SEpNSUxVZevrTz9KPTI6OTc8R1FOTkxTXV9VXffr187SycXNycnt2cnL0bmzubO3vr/DXD86 +Ozs7PkZEODU0OD5PZ8i6u7q6vt/dysjvadnHyv9U08zZa8jEUWM3PD0uLDU+S0ZMVFdES2HL +tbKzs7Czs7W9z9/Z1mNGS2vf/2Np2Ug5NDw7NDc8Zelnb9fLzM6+vLm9wr7Ed0lN4/9GQkJB +Ozk8RlNNYcbHzMvbWe3W68zEy83MbU1KTz5CTU9AQz9ASVFTY9zT1c/DvLm6v7vAz8vL1Wvp +7//ryNZ3/+lVUVlbb+fd287L2V/e1eNzX0pKRjk0Okhb5c/KytnV3OPzX1ljZ1NGQUNZ59vB +s7W8wMr3b3dfT05MXVtfY8a8xNPRzuNIOjg7PTk4RfdzW3fb3dbS07+8v7+8v8PEzN/n81VG +PTMxNDU1OD5AREtFSFv/3M7CxMXI0tXJxMfKuLi7xOvnztfXzdRPP2NfN3f318jYyMbrU0xV +5/Nf1cC+yMvf6917e+fba09VTUlEP0FVV0hBPzw+PkNES1Nr7czZ39nIwL68vMnJ7Xfv+1v3 +08vT2uv7/11PTldJPTw7Okbr2My/wMjN2VdaWktFWe9hXevjy8G+vru3xM/VaVNXSj9MV05M +91FJSlJX99ZvbWFP89X3V83K0W9zSE1NUf/Bws3LydTjyr3IyMj7UfdPUW/U78i+yuFvT0z/ +a1FOXFVcT0A9R1dQW+/z2+drd8rB09TK2U1LPTQ1NjVHW1tSysXS78bIw7q+0v9PR01PU9/J +xMnD309Y3/db691VR0U/SFvj0cDCy9vtNELKL9xWPcRD1dNZvNdrubjf0dfp18nPzNPY/1BI +PTg6MT7CPGPIxL5HRePFxtvjSt9KP2FZe83Jv9fj7U5PXlHl2XfvY1ZPS1nTyMC+2GV3Xmvd +98Y3vrA9PD88uuPRr3vLzEh33l/n3cXDylFPMzE6LjY9TENVa/fny8G9tLfC1N1zOlc+Y9Pa +uMPNx3Pj42Pr3lNXRj53Szaz6zi+P7m6NsRBQbc+XctXVkvczLfFusXd1VxGymHLZ9Xrad4z +Oj00TCphxy5S1y/PRFm/39bLZ0jZY9+9U7nP1k+/OEPFN8HNSc33Mki/P89N2rnTx99Kx1Xr +Os1fyUk6uz1by0mzc/fE9zx33Efc58Tzx0nlwTjKWzpX0MM199lHW7DptOe/30vPd1ZExtTV +ucA7uz/JwN9lutVDSEtDU9/SU7tBzdRAvE//1z7GRllMO88+uU1ruW+zwUvrb0zEQ8ZLS05W +PD08R91Gb0ha11XRRcJrb7TXVrpLQ8df17xnylPvvUXKukmxPlS7Ob9KQ7hD3NnIwTjA1Vuy +Se++81Tbb0Ln31nhzcfUvEbGPM7Pu1S+tjy4Pjm3O8zIUzbE5yzDTVO9vTu1uz62UD27VU+9 +Z3fMzjm+bze+Osq+RDW+7z68OWG8XF9I2zjRNvdc2U1E2Tu+dz64W+W3UVHKvjXF50S/2TDL +NzfPVTu7SEfITvPn0E292UvKXbhB29W8zle067/3R1awRb/Jzu9t3DhP1zXAW8rYrtA8x7tL +Rq9Xd+9ETdlXQkXAPbzZRNpZv03Ax8tLZzrjey5Ga8Ezw1s30/suz7bdSk7bWN9TPbtMVdFl +2TP/TsvFPLtZQ84z1Ek42s7nSbl7V8V7V8NvxVE/1VxRc2drwW9B2rNKT8y9ytXRw8FUQsTR +PURbVjrJPj5GXLFzTrW4zTvMvlLr90S7e0hDtU1GssnVukfY50s843dEONFTzOfMt2td6dHl +PzTjPys8Z0BMXdm2ulm5u+/nuMdO3N1PNkhVLlVELzJNWzHZxeO5uv9Z1ckyMlHtuzfWpbNd +16++RjFR0TUrPbzvLNuyVDSworJCr6a6RSlCsc0mMb3NMy3Nrq/DrKKnwWnntDYqQ0g4LTy2 +vse5srbeZT03LCcrMy4yPMO5t6ymoaWvsMZWQi8lJS4qLC03S764/7mpvDzrvy1ES7rWRUA/ +rkM0zavDSa6828XBPjE9QzD/bS7jt2/zzz1nuk4rQctBvUMxsq8+K/fKNSguurbPOUarrktG +rKGpvby0rN83Q984JSUuT8LHT66frdwww709JUzSUCsu662xSu+soMMrQK/BLCvvs7Q+L1u+ +ySoqwbIyMMdKSHdKy7CqX8Ct1d3tyMDNxkwxRTAqLO/dOzZdVUgvM1fRw907z7DBMjrPrLZ3 +26up1FHMvus4OExLMi1E49vnwbOusWHMsbBLNsm2Nf9ZLza8MSjfrDouxq3KY+k7Qcc+LNOv +38quvju7p61rLTq8qUclOLRnJyzXpK4zK8qtQSc3q7dKLVa4tFkqPbyqazzn685ZOzXDuj0q +OU0+LkG9r7U6OLGkySkv6aOvMi65o7s8JWmosDMsuKvZKTTDqtErKVOs0yw1rrMvLduotNgy +WKu2LSnAq9U2xbmxxTAytK82N7VrSrz3LsusVjWyyzHerzguxP8oMbG+NkW03TxHWEy3tz06 +ualON83eNkbAQ/Opu109PDU8S93fwL2/Uyouv0Ex26WrTURAPM29OTGzrkUtyaq+ODk7ratR +K0yyOSY76biw1SdErdEuSv9YrK5ML82nYzNH2XfB1TTzralBM2e090EsUautPzHXres2LVOz +sb+7V1e6QicnOGW7q9XjrsApKsvTRW9lyqzLJzi+vT8xN8SnxjQvx9dFNEXNwO/rvttTS0Y2 +PK+2PE/APWWyNzO+sTtcvddvvkMxX8//QUq00tjEucVNLylQwrxOMryo/0W/u+fRby1Lrbkt +U7zN2zw4uqe0Xc7HSigu3aas3F33z1k2K1+qqMo2O0P7bzUyR7S4v9NDTMi/4+OzxEztZ0Zf +WzE6uPM0OfutrcwoLbiq2TnTzsQvKDi02TvfwSopy62qwSgiVapWLDG3oao/Jy1Ctq3NRV62 +1WVLPz13rr1HSFlD0cBMN1nX18tGOcymwk/LsbpHMig2wbLWW8Oup9EsLOmvv0UvwK7KLTLN +sK3IOEXHxzwpK+2svG82c7SuVjlWZ29lzlEtSbrKP8O5QS5vw0/Jsj9IvqzdLiEoxKm0NCw1 +O9y+R1OrqNs2JS/BsbTvWee/w005O0e7rLhISbi8Py0+58vGa1PQyc7XU0BJa//Hs7nd/9XO +zWtCPkvbx8JnQsSzx03nvcXvYUo3M0xb69H398e6y0Q/W9O5v1hC0Md3REY/X8nhXFFbX+ta +TsW6vcfGb07XzUxE5+9PRT4/Ozc228BnPUA5U8hfR2W/zFVRP0fIvszvtsT7W+lb48LB3s7B +RjIvUOtPW9VSO0FvVVzRxe/X0/dG97zLyLjDy72270Y/S1bnymVF/7vC3drJzffdZTQuOV1z +41tAU7e7Z+HDe8u360dOe0k/Ni9Ou8/rXz1G2cXXw7/OwsRdRFF3vMo8NlVvV048Kk7BVztJ +RDvdwVNPycztz8PKv722sLi+02FCSffRWEM5QVdGPmfUX088OkvnvP89PcS9zsa72NPByGO8 +tr3tX1tV61h33VvfTzw+WktJzspJPVNYVV1vybu9yHfv/1Rdzru7vca/YTxnzsfezM5jd1dv +XWPX619j+0NLVDw+TUs/Sz82Nu/rXdLZY07r1OdXTlvbwcPfXFdU68jD1dTW1/vfa09Vz9dR +Rv9WQDdNzrWsvlJO08zR1crEvLvETjk7S93N41tnSjw5RWfMxVw9U/PjXf/v5d3n0dF7d+vL +wL/FTUvXymvvUE//u8FDOTxFUffvTU5hb2VRW/9d+9nGysr3R0nKxMDMVV1Y51Vj6+lMRkZd +829nSU/Kw2dET1Hc3crQ3e33/0pKXPfvysLJ2V0+PDxP0c7ad1dIRWPT08q/u793P0ZKYcDD +Y1vnX0BHTs64uMtj3s27uLu4ucPN70NCSFN370tPTEBBOj1Zys/nTU9XTUZpv77H70lHZ/vO +11/vx7/N90xGPEbjy8heQz5EQU1NSWvVY0c7RVPnwsjJy87nXXfDtri6yGdJa+9Tae3r5cnT +TTk8TNnAw15FW95HUdm/ytRdSV/nT0Rr1c9lPzgyP1H3wbm5ub3DzdTdw8fvVz05Oz09Rk5b +/29rb1rvyr+3s7i+0Vk/PUzMv9FdTEpLU/PLxcHHyvddSEVWe3dTSkpJRDo/78G/xdNrZVdB +TNfnY01FRT04Nj/NvL/O4+tvUlnXxru/yVtFPkJt59HFy9/pa1Nvyrq4vcTra1FNWuvNzMvd +a15PX9LJz8vr/2dPRU9r3tvdb0U8PD9Y187Wd1FNSkpV183Cv7zFaU5c993QXUA7NzY2P1/d +4d3ra29ZV823try/w8fj49fLxsvnTkA9PVHfysfJ111NPzxDX29fU0xJSlRjzsK8ycrjUUZV +XWve2eNTRkRGTd7JysnMYUpGRlnRx8nVd11KSUVLb8nAwczT5djCvri7vs7Zd0dEZ+PR019R +TVFNXtfHzNXn/2NMR0JU993pTEE+Q1Pn92NNT09XTlP/ycPP3F9tR0VJZ9nZ1+NJQUVVXc/F +zVtISUlh68nCwLy/xdPd48y8x9hvU0dEQ0h3zMrU3/9jTlD3ycrnTkVAQ0RI5cbBxc5lRkRc +y7/AyntNQD5CVtXIy9P7Xlv/49/EvsvaTT48QUdZZWNZc2NVe8a5tLW+ydNdSEdLb9jvYVxf +WV9ryr27v8d3SURDTf/zW0tDPD9CTWnPz+Prd0xIS0//09leV0ZAQEvvyMrX3t9v7+fp0cnf +X1lGQExrzL68wMbFy9Lb08G8xe9OQ0JGV//XzfNNTEVET2PZytfvX1dPU2fevri802tZSk5N +Tuvj/1xIRUZZa93Jz+9ZSUlOX+/PzOdPRkE/Rk1f0tHb4e//59XEuLe8y+lZSkZJc8/P+09T +VV37387ExM/hWUlGS1zv4e1bT0xHSU1l499dTUhGVXfXxcDE3Onna/fj2NPX41lTTUtUZ+Xh +33tjX1133tHFvL/EyczIx8nN095zWVZPTlVfc/NjTkhJSkhNUld3d19dXXPp08nAwc/j82FR +TExNWWNZU1NQV2Vt99v3V1RZXWd38+vvY1FQT0tTa/fa3+/p1dfLx8PAwMfZ/11aZXf73d/z +5/NrX2Nfa9vZ921jVFlfaefd52ttb19WTk9TV01MU1Bfd+vTx8jNztXz493l39XfY2lfU0lC +SE5dZ11n7efn3M+/vb6/ws7/Z1dv721TWU5MTlFSWf979+9tU1FOW//nb/Pj7fP3/+/f5WNf +T0FESE1X7+fj2/dfWFVb3dXb1dt3aWNhb+/pd3NhWWFjd8/DxsfGyM7R0c/K0eP7b1RNTVzj +yszn4953YV1d99X3a2taT1FWZ9jQ2+t3a05HSkxf93dfWVNUXWPdz+Xv/15bV1Nj2dLd+2tX +UEtQZ9HS2c7W397Wy7+7wMjVb1VPT1Xz4/drW05LTVRt0+ldV1JHREZT39HT1917Y19v49nf +Y1RTSkZKV+HFyc/T71tRUWfRzdfva1RNSU7/3dxnXF5fVl3fxr29wcXM193f18zO52NVTEtL +XuPM2P93XktFSFPr22tbV1BTUWXVys7vWkxJQT9IY+PpZ2dnY1tn3cvK429ZVVNRV93N0mta +W1lPTunMwsfN0dXX3s/EvsPO3GNWTEtZ18/Xb2FbUU5P5c/L3W9fUk1JUN3Iyc7nb19YUV7b +3/tZTktLSlfPw7/L2/djVU9b18zT61hJRkNFXNPV7WdYUFFd38W7u8LO2+tjc9nDx9l3WkxJ +SU3pzNN3U0dDP0NV69brXlVOTlNf0cPK1ltMRD9AS+3X3W9jU01LXNPJy9n/XlFMTV3azNbj +Y1VKR1bVwL7AxszX5evQwb7I1/tlTk1f28zM329VS0ZFV9fMzttzVUtFVd7Mxcvd711JRE5n +9/9WTEU+PEFrz8nM1/NjTk7ry8XFzm9rTD9HWefa2+9eUUlL98e+vsTXbVVNVtXDv8LXd1dL +SmHn09V3VUc+PUV30c3R5V1dUE/dxsPGzV9TRD5G99rT1d1vVUtMXNnIy873Z0pGTnfX0dj3 +V01ESe/Lv7y+x87X79fMxsPK12dTSUz/0snK2FtLRT5Eb+Pb33ddTUZKX9TFxMbdWkhDSVtj +Z29UST49Qlfr1c7R+15NT+fbycXG0OtOQ0hf697X22NORkvjz8rHx9VvU0dY59XNytLfZ1Zb +383NzM53UEJATO/W083db1lKVdHKxsfOWUs9PEln3NnT22NJQkZz09XV13tOQj9O39TT2P9b +ST1Ia8vGw8XM3W/v0cK9wcbdXklHUtvMy9HhV0g+O0lc6+//XUxBQUrvycTJy9VtTlNp2dnn +Z0xDPTtD+9bLzd1vU0hQ98bCxcnha09LVdrLyM3nXU5DS9/Iw8LJ62tMSFvhysbH1/9bTVLX +xcHCyfddTkdX1c7Ky+1fSUVLb87GydNvSTs6PlNz5+tzU0M/RHvOy8vNe1RCQVXj1M/W6VND +QErvysG+wtJrU1nVxL++xutPRD5K28zIyedYQTw/TfPVztVdRjw+TOvOycbYZ0xLVdjIx8zb +VUc8PUxv0MnO22NLRkrrysTFzW1LQURd0MnJzON3TUZZ08S/wMrZV0ZHVd7NycznWk5JWM/E +wcTWa1FGR2nbz87X/09DQ0vny8bK1V9IPjtGZ+/t61ZGQT5E+9TIytHvWktJT9nJycrnWUpH +Rm3Iw8HF229bVmvKwL/H3WNMREdazcPCxdRnT0hJ/87LzeNVS0JEWdvJxcrnY09OXd/GydX/ +TUE/P0rjzMvaa1FMRk3jx7/E1ftRSUNFc8vL0ndSS0xP98O7vcrfZVVLV9PGyONhU0tITV/M +v8znV0tFRU73zczfZ1VNSlfvw7zC2W9bSkNCSf/dXE5JREFCS+fHyeddVU5NU/PNv813Z1hP +VV3jwbzJ1d/v//ffw7zA221XS0dKYdfAzOfnd1lSVePHx91fU0dCQE3byc7/d19XVFfjzch7 +TElDQkdMa8vP92tnVlRb5cS+ym9bVEpHSFfdzHtRUUxLTl3PwsfZ6/dnX2PlysPVa11cV1t3 +28XE3HtnVlFTXuvW5VtTU1hl68y/vcXf721OSUpRaW9RS0hISUxf3c7Q91pbWVxj3c/Jz/9v +d2/z1czEv8zZ4+Hv49fMycnXX1dRTk9YZd3cZ11dVVll69bP31xRSkhMWm/TzeN773d773N7 +615FQkNESlBd4czV7+vt7+Pf1c3Pa1FOTEtMTlfnbU9NWGfz59nJw83f5+Pe3ePZy8jf8+fr +5d/f08rX/19fV1dPT2n3Z1FXc/fv7dPIzOdlYVVPTUta92FRTlZdW1VZ7+F3XG//d19d99va +b2/p3ePr3cvEy9LPz9XvZ2/d41dOVVVPSlRp2913d+//Y15r599fV1thWU9f18rM3dbR32NT +VlpvVUlKTEtITGPUz9vp3ed3XXPbz9n/e29jUU9d89fj79/n/23318bDytfR6W9de9PKytXU +1ON3Z3fYz+dvZ1BIQkNNXWdbd+t7e//by8fN42lXSkJDS23vc21vY1tPVu/Y3O9vWU1LTmPd +0+X3/21rW//Xw7/JzdPjXVVr2djhd15RUUpJd9zT3f9rXldQb93S3fNzW1lPU+XKxMbN4WtV +SUpdaWtYSkdGQUhezMfN0+13X1hr0MnO2G9WVU9Md8rFydPr3fdd6czBydn/V1FJSVvOxsnW +92VYTVTZzM3bYUxLQkJW6c/U43dhW1NZ2cnL12lNR0I/TOfT0uddVk5FRV/Z0dxjVUxEQkrn +z9PnY1lVVmPIuLW6v8vZXU5d3czK2OtnWExLd8nEydn/W0pHTPPPzuVfV05ETN3JwMPS32dI +PkJc39rhb1VMQkVvzcjI2m9fSkBP28zIzuttV0NFWdPExcrZ51dR98jBxM97T0U9QGXayMfV +62dGQ03bycbR71dHPkBc0cjJ0etfTkhd1MvJ21FJPTg+TO/Pzt1hTj8+TenNzdJrVEVASuvK +xMXQ72tQT9nDubm9w89jTlXdy8jI0/dVSEdrzsfGyutZS0NId+HT0u9XST5DT9/Kw8TU/0lC +Rln/3dx3VExCQ2fby8vS81lDPkpd59nV71RGP0Jj18nGyNXpYVfdwr6+wdhtSD9GX9zNyMnf +W0M/T9/QysnXZ0tFSfPOx8XD1u1RS2PXzMzN2FlDOTpIb93W0XdORD5K+9PPzd9dSz9I79HJ +xsrYY0pLd8a8vL3D2FdGTevZ19Xcb1dGRHfPwcPF2PtKQkln0M7P22dJPj9Y1czM0/9TQjs/ +WPvj3/9fTD9KZ9HLzNF7Uz48RG/b3N93VEQ9QGfSysbL191dW8+/urvAy+lMP0Nn08vKz+Nc +S0NW1cvLzfdVSD9J48zEwMjT51NSb8vGyc3/Tj89QV7Xzs7ZX04+PUlr6+f3V0s+PERb08nF +zetVSkvnw7y7vMjfWktd2c7O1+1fSD5AVc+/wcLPd0pIT93MzM3bX0Q+P1PXzMvPa1A9OTxI +Z+/l+1lKRkzrxr+/wdddR0VL683Nz+NWRz5Fd9PFwcfP/09OX8a7vb/J50tBRm/NyMfN62NI +QU/TysrM32dMQENP1cfGxdHpW1NZ28bEx9VZSz87R1zf2NfdVEM9PUdr5+9vSz86OT9j2dLM +2HdfVmPLvrm5vMHPa1lnz8vR1XtMRT8+T9XJyc/vWVNMV9jLyc3b/1RKTVvRx8rP71VDPjxK +/+Pf71lQSkxf1cK/yuN3VElNX9PJzNlhSkRCSO3Iw8nX92ldZ9PDvcHU61FGQENdz8nN32VT +TU1fzsHE1mtRS0ZM783Gy9z3Y1ZRW9fFy99TR0JARFXVy9NrT0dBP0Zf3+VdS0VBP0RN1sXS +6WdeZ2fZv7S0vMTL0+v/28vCz19OTElNU//Iwdp7W1JOUVnjysxvWlNTWGPdybzF43daTEVD +TtnO71pfVFRXY87Axf9WT0pNTF/bxt9XTklHRkhdzszna2938/fQvLnG52dTTExMb8jG529r +X2Nbb8rC129SSkZHSvfGxNh3Y11jXmvdyeNMRD9BRUdezszvZ1NNTk5P88zVa05LSkpNa93K +0/tpb//r3cW5ub3Fys/V3tnOzN9ZS0lJTVX308vjY11dXF9r49Hhd1VVVV/73czExuFfWUxJ +SExf/29XU1Fca2/h0+VjTEtLTlRb8+fvWU5PU1tp7dHKz9vb18/MycbGx9xfUU9TU1nz2+dh +XV1hb+/hzs3rZ1dXY2//48nI13fv49vj7+vjX0tGSE1bXGHn2f9fYWf/92/t0dNpTlFUXVpb +d9vvXF7/3NXZzMDAxs7V19Xbb+/Z41dRXGtvXV/r3P9bXWd7X1FY/3deUVr/3Xdr2M3VaV1V +UUlDSF/va1tdZ/djX/PX52tVYWdfTExdb1tOU1dfW2fjyMLHyMbBw8rOy8bO811dXU5IS237 +Y1ldZ15XXf/Mzt3r7d/rd2vRxsza39fa/11d9/tVSktOTkdHT//ta2dv/11VUf/j71hTUk9L +TmPj29/Z1NPW19HGwcTK0d7vXVJb8+tvaXdnWlNb693d7/P3d1pMTmX3ZVxdYV1RVuPNzdnh +b19NSVL/3djd5ef/Xl1v2tHd6/9bS0VETWl7Z15fV05V7c6+vb29wMfP09PIyNnpZ1FGSVPv +3N3j/1VMSU5n6dXa529dUVVf28jFys7XbVpVXvf3c11ORkJAR1lz2+Pra1RNTVbf1Nnj/1dL +R0x3187P09jfd/PRxr++xdl3UkdFTnfd3+d3XVBPX9nMzNHfd1xMS1dv5d93Y11VTVHhy8nL +3WtPQUBK/87N0ePzaVVY69HM1e9hTkA8PU138/tnV0tHTHfJv728v8PL09LIwb/J52VMPz9H +c9PW3WtQREJFX+PZ22tTTklDVeXCv8DGz99bU2vY1d9zT0Y/PURX39jfc1dNRUNSe9PV72NV +SEhO787Ex9Hjd2lv1cK8u73O91tOTmvjztd3Y1hOV3fOxcPI1ndUUVt729feY1FOTFjr0cTC +02NRQTxDTF3p63daT0tP98/Hx9BrTUQ9RFVv3Nl7W01FTv/SxL+/ytXr3s/Hv77E2l1HQ0ZY +/9/bb1RKP0Jb/97b42lOQkBFZ9fJxMXO32tz18vKz95fRj89TP/f0s/f+09ER1f34+fzVUc8 +OkJj2M/N1N3/W2/Lvbu7vcnR/2P/1crHzNp3TURKa9PLzM/nX0tGUe3Uzt5fXUhATG3Ry87r +X0o8O0NU9+97WVpJSFrRw8DDz29XQ0FRZ+Pnb1lMRUBH38jAw8jT32Nj28fBwsnrU0g/SHPc +zM/nZ1JFRlPdzsvN32NOSkzny8fFydPna13jzcrN2l9TRT5KX9XOzttfTUREV+3V1elTRz87 +P1n/2NXh92dZa8q+ubm7wtpjVFzbzMnK129QSUdn28/N011PQUFMY9/X3PNZSUFDZ83Gys9z +TUA+Rl/f2dxfT0dBTO/Xy8vZbU1AQEr3z83VZ05BP0nvysK+w87pZW/Rwr6/x+lfR0BJXdnM +zdpfT0ZHZ87Gx8rlXU1JT9nKwsLK3W1OTW/b0Nn/WUo+PkNpzsjIzntPRURO69nd91FJPzxD +UOfc4/9bTklTd8S7urvC12tZXePIxMreW05HSFrpy8fL1WNLRUZb4dHX71dNSUlWzsLAxddX +SkNBW9zL0N/3WU1KTefIyM3rTkQ/PEjfz83XZ1RLR03rwr2+wszl/+3Zwry8w91RSkRCVdnO +zdlbS0VGTvfGwMnWY0tGRU7XxL/G129cVVFrzcvcX0dCPj9IZ83I1OlXSERET+PO1mNNRUNC +R2vWytpdT0pGSWfRwL7L1mdjX13nw73D2WtTU1NfzsK/z+9rVE1OUu/N0fdUTkpLUe/Ev8bd +XUlFREvvzcfa/2dUTlhrzsLM51pKQ0FBTt3M1mdaU0tPXdG/usTO1efr3dTEvMffW0xHSEhV +0857T0dCQUZP/8XE3nNXT1Vde8a8xM3Zd2FdVXfPzmFNRkJESlH3ys9nWUxJS01e1c/lV01H +R09Z3cjM72NbWmP/1cW7v8/b7213b97Ew8zrbV9j7+PNxsfab2teW1he39HnV1FLTldb78/T +6VNKRkhMWeXOyd9rY15nc+vTzuNnVk1NTk9d5+NbTE1KTlb/z8fI1dvd2c3PzsfK91lTTU5R +W//Z1XNOSklLVmf309tjWVtn79nOxL/Iz9//b2tXW+vnV0pLTlFcY2vh61hPSExjX2Xn195b +U1Vj9//v19PrZ3Pz1czLxb6+zd/3/+//a+vW2nddZ2/j92/r1fdbV11jXFNV9+tlWVtv7/9h +b+9vTUlLU2Nj79nL0vd3d+97ZWfn5/9YVVpbUUlPX1xJSVNbXFt328bGzMvGxM3a39ndZ1hb +be/3d+PT1GtjaW9zY2/n1etdY//n83vnzsvZ5f9vYU5JVf/3Y3vv429bWXvf/2VjbWdXUFvp +329pd/tvV1n/29vv7eHR3ePfy8jP2+f/WUxHVe3d7/fj2+9dWW3b3e//e19PSU1z3ePn3en3 +d1xj6/9bUlVPTk1Qa9vc6//vY1dQUXvZ3+vrY09NSVF36+/7d2dlWW/ax8LDw8TJ2/P31tHV +3v9va1lSa9vP3elnW09IUF7f5+vvb19QTlvcx8fN2fdjSkVMXeXj3ud3XVVP/9HT2edeTkhH +S2nf63NZUExDRlnn09HV2+/7d+fHvcDGz/9RR0ln2M7O1+tvVElN59fU1913VUlFT93Ny83Z +82tXWe/R0O9fT0pCP0ph18/T2ftjTUxX18vP1f9hS0dM787Jy9Pn/1ZV886/v8PK0PdXVvfQ +zt1tU05HQU3nzcvV72NVSEz/2s7Z/19URkVO28fExs7nVkc/S2/r4/dtaU9LV9/Ix83j91lD +QUpr+2dXTEc/PUFl1c3V6/9vV1nbxLm5vsbTX0xP3svHydlzXUlFT9zMzNZ3W05AQlnjz87Y +5f9aVWfOxsnQY0o/OzxN3s3K0O//UUdX183HzO9jSz9EVenMzNT3YUxLZc7Cv8PR53dWWdrO +ydFnU0g+QE//0snP42dTSEzlzMjJ02lPRUBL4c7LzudrTUFFTF3v5+tfV0xNb83Bvr/K3ldJ +S1v/7/9tT0pAPUtl2c/N1ftbUVrTwry7vcnhY05l2c7IxtZ3V0hN79fNz9dvU0FASXfc2dnl +b11ST9vEwcXK81hBOj5O59XV3W9SREdX3dvb42FNPz1Ea9fV0tl7W0xT18nCwcXM315VY9TK +y9P/U0Q/QVXr2dned11RTV/b0c/Z72lVS05r1szO0edlTEdOd97d72FTTUhM38W/w8nW51VN +Z9PJy9xvTUA6O0/v19ffX1dLRl/Hv7u+ydPvU1Nz0cfIz9zvVkpZ1cfL03dUSD5BY9zRz+1b +V0lGV+HIx87rUkU7PEr709PeY1RJR07jzs3XY0xGP0Fc5c/R32NUSEpay767vMbN5W9j2sfD +x9dXSD89RHvVytD3XU1CRVLVx8nN71tKRk3Xv7u9xtxzSkdX387R52dPRkNN/8rBwsrvVUhF +U9jJx9D/S0M8PFHv1d1vWE1FRlHNvr7B0XtTTlHjyMTG1G9XUk3vxMDF0WFORD9DV9vKzdxf +TUdFV87Gxs9fRT47O1DhzM3XaVlNS1nbxcXP41VJQ0JXz8TH02VKR0VL28S8vcXN3fdt98y/ +wtdvS0M+P0/Xys3fV0pHRk3ey8XP719RTVNzw7q6vs13U0pFUt/X71NIQENEU9DDwtNvUUhC +Rk7TyNHvU0A9PT5SzsjO91ZPTlr3zbq3wM5nT0pMWM7Cx99jTk9OU9m/vsxvUUxGRk3/x8Pb +d1VPTlf/x73B900/PT1AWMa9x+dpYVtb986+vdllTklJS1rPwMV3TURDSFHpyrvC2etnX2dv +18DB6VlLRkdMX87Dy2dQS0xOVdzHweFRTUtRWWnMvL/R+1VOTUhL79z3SkVCRk1X3cfA111O +S09SUufJ1WdMREZITWfHwMrrb2dn++PPvbzPd1lPT1NZ2cfRd1VLTE9Vb8i/zm9fXF9rd9nA +wNLp/2X39+XJwMlfSEA/QkNR183hW1FPWWN33cbD3GVLSE1NWt3N019OS0xca9bIv8v/Z15n +Y//fzNVvU01PV1/pzsnQb1JRV2Fv0szMe05JSEtVX9/MytdfV1ddVV3/3eVZVFlb8+PQy8XR +b11bY3f/59/nZ0pER0xZbd3Oy93r79vRzsvGw833Z11bb3P/2dfnWlNbY2t33c/X92Fjb/vr +79jK1+tr99vX4evX611HQ0NDRUlXb2VPTlNf+//vzsjcb2Nnd29p99TW91dfb+n/d9PK029c +YXdzV1V361pPU2Xn523dzdNrWmv33f/r287tVVVl7+1z/8/L3Ptvc3dVSlPv811c/9/a/+3W +ydT3Z+fdc1lTd/9dSkpPVE1KWefa7+XTy8vZ1srAyd/j63dSSk5v4/9cZ21fSUhd59737eXb +e1NV68zR2tPQz/Npa9/3VUpHSEY/Q1vv+2Nrb/dhUVPdzdbb293vX1j/0tDb3+Pta1VR3cnI +0dXZ61JHSGHrd29v82tdW+PJyM3R1dv/WWHpz9nj4/NvXFlf1MnZ5+ttTkVASmn/a+/j72db +We/LzNvb3/dcUVPn2ev/Z1NKQkFV3tnf1dvd93fWx7/Hz9f/TkA/TO/b3+N3YVBHTf/n3+f3 +ZVFGSFXTyMbGydb/XF3d0+t3XU5APT1M69PY3ftvU0ZLY9XO0NXrX01MWNXJys/db1NMTenC +vb2/x85rT1Fv3t9nWE1GP0BS08PDy9j/XUxN+9XN3mddVEdJ98zExtLnWUQ8PEv/3+n3bVtR +TV/MwcHJ33dbS0xe2czP22lTRDs+X9na3GtdU1Fb18G9wM73Y0o9QlPb0M3X+3dSUnfQxsTP +61pMSEf3y8jFzc7T82/by8PL42NLPzo6TO3My/NVTEdGW8/H1e9lX1dKTdnNyMXd3+1MTFvZ +v7m7w91jXlvf2dXea05HPj5Lb9rMzdDvTTo6Tffb3f9PRENFZ83CvcHL419OVGdr5WtdW01G +RErdx8TE229JQ0z3z8vI1mtLQ0BN79nU0WtOQ0NZ2crAwL/I3VFHTWvXy8vR51tMXdvJxMnZ +Y05MW2vT0N/O0vdcSEbau8XI1UxOQjhET0tXYUlb7UdabdvDwsbdVzxPY8e/bVnjZUtVPT3N +yr21z9drX2/OzdvJz+9bODc9UePOzVvT1udrRC4qLkqyrK++1uNMZ1tJW0vav6u0t71F3VdC +PzU1OVJrzsZjX+fKurnM39nj42VGZ2NBY0xOSURANLSlo6VPKh8nSq+fn6Gq50YtJCQrLz69 +u7S998+9v797Ni4xKzpvXbWwrq3H32NI1r/D1vdnP0g9KDlCM/tAMTUvOb+vublGOfdOv6+r +qbC+SkUuLT9OvLzd1UZPzysuTbypt0ElHyy/p6Gfrba+OicfISnPtbOvvbm3sLe8xTkzKiIl +KCtFva6qqK+tuGPN28O8yE9jOzlrSfPbR0A4NTp716+tt79vV9rPx7i/0c8yKyslLjUpO6ys +qLkpHyYwtKu+q662sckvPWNXt9nnx8C1qKq0tV09MyMfHyQvO1NFT8zMvbKxr7DId0E0Li43 +Su/XzdLr1c7Fua+vr7zbzse5ra6uq7HLOTAlKjM0Ql1va+M6KjFbycTeOkL397ywuba3vLvK +UUppy7W62Uk4MzpP78XI5VM4LCYmLT9Ye//hy8fHyMS+vcnbb1Bf18q3tbzH61FVSkNZ59r7 +ST49PUNj0cC+ztPVXkxHQWPN09tpRkVPd8q5vO1dT01RPjpV3MG/xc7Myb++vsf/92VOPjo+ +U99nPTk8SePOzsTD0eljXV1b3b21t8vnc3fbz8e7vclrQDQyMzZK38jGyMzTSEy5REVZ3ExH +PkdI3b+4v9VfUl5NPTXD0kRBPUhNd86tvM9lSnvrY8K5zsffUDld7V9GSMldT0hOR1w6OstX +Y1tnVrC5wqy+wb9A20VKzvNDrrr33TlHudDOs0fbTzpBOz9fW9PaO1Tf12XG1XdIXThvQ0JX +v66suEJETeXl0Ve2vmk9Ly8tP1PNusqvu82/1b7C2UNMNjRbSjU6LzPKuLOqrKi12zk/NTg+ +S0vdwjxAQyMyRS3HxDbQybztNTpIvKWkuMq6srVvOiUutKaswCofJSw5u8a2oafGQC8rc9/V +tbCno6WzyT4uLyonJSsqNjhGurW1uMrTy+PDtke+rFPMtEu7vjNfPi7vQS334TTD2tuptl3p +Y7irt8g5MC4kZdH/PiwrQjkpMC/Koaauu1w+TzIvvLCmqNEz2N9JbSooTkg6LjrPprE7QsjG +vuM5uKq+ubbPsco8u1QsJCI4sqtBNzX3u0Et86ygo+vHrcOtr8a96yUlLShZqK21UiEfISk9 +rqmjn7NfUzQ0VVTVpaeur0I6STMqLzs+21kvRdK0smE3PETVu6+sqLRTNSMtPzVjuffpPic9 +Wb3IzL24SiwpNLKqqKCpuEEnID08zq65sMpCQTIjNbfGvjQjNVVDyKupn6pNQDg221M1trK4 +v0I9vb5bTzU7X0MvP1q+uMrCvr7Me2fExj7G2b+460TBsUozJifZRnvN0cFILWs9QLmyd6u6 +SVYuQ+3de9NvRy8jNberr98uMTU7P/exoKS0UT0vLSQzU/+9tL2xu2dKw+97XTM7NTIyPWm4 +va+pxazKzLGtv7lIVT05NztVyPM9LjtZvs2zqcTGTyzX0b+trMm4QycqKDmuvLezZV88KCxC +2bO4xLfDPlQuPnfX2b/X/+NXWNXHxrpcW1Q+PzcyP0pTz8LPwbK2t+/O619IKjEtPDdJN9E+ +wttJ07zLvb3MwtHH3Xfvwm9d4zxLPkXnzs7n48Jady5j0//DT9rN71xXOvdP1uNj2etK48rG +wWfIT1s//9O0ta69w3s9MTA7Y8Xd4c1GRT1Ib8bhzNRfTURFyL64v+NnXUFHZ8nIyndJRTc7 +Vdq6t75vQzU5PkzczcjpRTw8PEhYW9Pd520+PjxJ0cy9vuO1zL67u7a5ws5fTzszOj08Vk9V +Wj9DUsLMw85vzu9ZU+nfzcrTx8Ld17++vL3K0VtKPEdJ4+PX2W1va2XPxsHG0Fc+PC84Rltv +zMvZ0UxKNk4+X07PydnHwbTHw8rt9088QEGws29V/9xZ/+/fzf/f4UlBMTpJTtR7181TST9b +zW/AykvhTUdERj/Dy8Lpykb3Q01C2Gu9XD8+P8d7y8/LuMvtu97Vyr65tblVXEA6aUZv5Vvn +QmtZxWXv0dpGv2vD58u0Z8M93Dj7P7r3usrf00dCRkLPY2nCTUw/Umfv41Hd/81PPldPZ/Pb +S8s7Vjlv78i6wrzr50DnTNTfv9hf60fORlTFUbg/7zxRQP/UT7tpWUdEVzu6293G1sVJ2z7A +wsfTslXWSVPXOsFOtFW5RWVMyEpGvUPISL49ylPO1+NYuFPN6d61xMZnwzfOTU/hvU7fa0Zc +NVLrvt1H93dNWDXbTLBPUss+vkFXR8FJvl9bW0HMSV9Jx0TZQ2tXQ7ZPtD57N1NOMck4u8tJ +WEhnSfdIs1fFT2/fU9w/ulnFv1F3PzrOd1e40XfRLkXfOtfA/8iuTVW6Pce+RLXEV8PrPbrH +97zIPcY2K807Z8Nb7/+8P//fQq/3VcRIU0g3xP/LzVlZ/1VI2M/Gw7pWRdFHTHvdU3dTZ2NZ +PjdRacjr0ffN1kBtRP/VPk09PEVBy8HFusnR401PUs/K18xHSkJKW02+v76/TE7ZUstZzcrJ +ZUhHOEVVZ8e640Vvt7XM2uPJtLXF4ffpz+dcVTo9ODo1Nj/P6dvOb+vF1sy7vca8XfNhSENr +b2XjWVD3UF/Ku7i/yFNLMzQ5NlBDSkJGRUfr1Lu1uLy91sra38Bt49trRDgtPELvuMdfSTlB +OVtJU19Fd0JGPz5Kvrqusq+ytru9r8G63TkzJSYiKiw4S0vZybuzq6ukp7CxyW9QQUhJ005A +ODs/Ql/Kt7CvvN3Ma1U5RsO+a0UtLC41V+vVREQxP0lTR9HNwrq+u83Hu7GqoaSpqa+9y/9L +OykjIR8fHyAiMTxU08m7wrOusauuusnKY1PfTV3vY/9tZ9PJy7+2sbzL6VVJSjtFSThIQko5 +NzIzQOHLY1tAPkjOvLOtrbm4s6+pqaWqrLe72Vk/NDEuMCgoHx8gICcrNFFQzb+zrKekoZ+i +qq66ytlr+0tTPzIuMjE3RG3NztDR2/vnztXNxl/VQT85OTU9Rk0+Ozo4SExvyry5ubq3vre5 +t7GyucPT22tlV0E+NC8rKywpLi42PEdHV9fOvL23sq+ytbu2srS0sri8zOf3b2PcX2f7UUJH +QD5JOT4/Pjw1OzlNTO/ey83LxMG8v7vAuMXdZ0pIS0tLWm9jV1lUX1dvZ97e/1VnWV/Ta8XJ +61lMS01YTE9fd29349/Z3eXb1NNdae/ZzdPHxr3Jz9Hn72NUSFhPRENHSFtZTuvl/2tlY2Nf +S05ZWVhMWenb0dXMytvf+9Xj6effy8fV18/Kz8/XzMzfe/fn49Xz5dHdV1lcUVJISU1vTklO +T2FnWl/33G9hY19eW01Za/dfZ+n382Xd0t3rXf//929z38/V4/vtb1hPSFl3Tk1MT09JR2Pz +3f/3d/NpTWndys3RzcjT1OfVzcrd891391tW5+HtZ+Vv61RMXWNjWFtYb29WY9/b2+Pf2WtL +SVB36eXX3ON3d2vSzMzP2dvnX1Jd29vn9/dnXldf4dvc6d/l329v68/V43tdWUhGS1rr42tr +a1dIR1Fp6+//42NJR01319TX0s7be13t0tXb6+vzX1Ra2c7K09LX7V9VXefZe2dVUUk/QlP/ +9+93b2dPTlnTxr/Cv8HV71nt3dPa3/d7WVhd59DT3+HvWk1JTv/7b2ttXV1SV+nZz93/ZVRB +P0lV/+vf2d1zb+vMwMLGzNfnXVRj2dHj81lOSURLY29tb1lXWU5Z79PN1etVS0NBPdtzR7Zd +SsxUxd9KubHv91gw105H1ufQxs9lb+P/z8TU19tXSEDj5dG8d72+XMPrTP9hW8/fO1ZCPthL +X9VNXGdOSv/3c8a/Z7rAz7nAvthV50lIPUI5P1FG1mdVPUpP77vR3co741Jdurm9wrHnM08q +MMI3vLs7tzAu60tPOq6/tLAzRD02z3exoq28OiwlK0A0v7dLtt5EvVPEws9pZ9c6zEQ1yELj +t9+wVFa4SLq4TrnN/y7KtLqsVy0sJTytpqCgyTsqIjXF47i57bS/QkIvNNm1rLjVMSw5Pr6z +ycvzV0lWV2+9s7KzUylbt7mvSywlHylZr6mpvywqHy1D17yqqrOtPDEvJ1e6sq3OPVM8XcZU +uuFzx2lNQm9fsK+9Wiv/ubW0MykiJtyto6jDMigiOXu9rdXM3ry93s4+RcjDzcTtPNJBSesy +YUhnuLPUzr93qqtJPr3Jq8YuKh8o0a6kqksrJyBE48S061NPxMzfZzNPxsK9VDdBPUp3S09K +R1XazsfFuLy6wkKuvrWuQTwjJtOspqtfJSQjO7+/t1w1QNPKyvcuREpzwONfY07pyczlVVtM +48rBvbqs0zi5wqmv3dcpO821oK/TMicvP8u7bTw+aePNazpEPmPB381ZQlNAT1djy9dOSjbW +uLZQu620p287KSrNq6OmzjMkI0f3vb9K6b3EvDwqKDjKsb5OLSg1T7e0xt9IO0RpzrFz/7HC +qPc1SyzKtq6fuO8yKDZfu7rDS1NnzL3L30dHVU9HOC8yP9vCyrxIODgv07q+w6mzpbw0Lizr +rKWfs0IoIytItKqxtldN5z/XzrSrtXcvJh8qNme6wLlMMyooUU7RrKSoskMpLT20rKu0NzUt +LFrItL3NOV5N78Jrv77JyE00MC0wU0/CtPdWKyg+NkPbv6+ouzwmKE6tn5+r0zEsL1S3q6jT +zUtLyWe2t6620Fc1Mi85RHe9vsE8KjEtPF/Gy6nJv0ErQzDCp62q3UEuK0S+sry467uxwLpv +z8PNSz8uKi4rP2POustMOy8yOT/Hta7KPCgqLNy4prK50TNbWtumta2247C/v7rJzNlKRjor +LykpOkHfykVILyxfPEzTOLew37RPO1g+r62ssU1NP++tv7y/17a/wsfJuMfZXT03MC4pNDJF +3mfeRzI2NGPI2bzTvbS0uFNMQE24sauyzG85b8K4ucxeVcK2r8xIOTNBOzM7LTEvN+Pd91M0 +ODk6RUzr1+PIzq2qrb89PzjBqqqor8jlZ0lJQzrMz8HDZVFAPEpLQWc0R89IzGsvM2s381Y7 +777VzK5luLDTqefHs8nHu7G1uMdGXHtX3chDOF00azo090FQa026O09MYc08TznERUfLSLJT +sLZetEnzssSrZ6++vbZVuGO8VN86OdssSTYwQDIrSzlVPm0v4Uk6zDjaaz/Qv7G+vtq2Q7pG +3dDK4fu2V7J7xFW9QL9nZ1Q9wD3GNOc1a0JrRFVfQ8VX0EB720xvvtDHvM7O7enr0mfK07/I +a8Xe48bV1XNtPd84zj/ZRVb3T2tvS+dPXE3pPctHX0xB/+PV40q3SbZKzEPIyT/LN8tU92Nd +yG1La+FPwVW23Ne4XcNZwTrHP9BdRlRETUPvWm0740e/b0HjXMxbzMBKuN/FSMJvxMZKy/PV +UsFDe9HtOXfZa99KsljEzO2/493r0NnATbdD0jbzPt3jPuVEtlq6P70/uTxT60zaQL1PxErn +OOXlMtM0zlB3R0pZPnc32kvlTNFFxvdVxVddV10z3k3v69NjWsJP88lQxDjBO81X6/vnv1LR +5c02xDPPXnfJ77blvj67Qs89yfv3Wul3Yds6z+vYe+NXVdNYytzMP89MwMtBvsvKxMg3xzVb +TXdLXVxpY0nEMME/xsZV6dm8T7dIv03AXUjRP85CwVK8y1LXVGn/XMftS8s9zd86Ous8vknb +Ot4z7XM6wzPBTNtOO7pGs07SyEvOX+FOve/vSk/ZQWdjYbZvwkfnzVzMXc7Mukm+U0jbbT7r +1N3lQbVNvNPFb7mwQLvIWLlE0bs4yjRt3DbJO0fANs3LL9dGPb9TXE7jc3e8RrrOQq86ybU6 +s01OtTy6SjxNX0tvbW/P20tLvzO+b0W/Qla+L0q/S17ASl3FVP+63cK9Sc7zOdQzPN49c2NF +RldCXMdRWu9BY8ZFzVpZwdbVx03n2sXVvm+/xGvUSUvlzd3YysjfxUNC7We+usbjyj1XSEpS +Rk9F607/0eu21b/Azc7rS+NlZdlFT0VMyHfF1eG728tMTUBXZ+v3QUU4Pz9TR19Nzr7Lv0M8 +OmHEsa+94TQ2MkVOT1VFSOv7w7+5v77T1PNKPjU+Tnfze2dv7829sK+urrrIa0pvQ0VOQUM9 +OD42VWtdys/N0ddXzsC/uL7L31NLb0rMa1/PU+NcTlVV23PRXktRQUZdzrvDwO9QSU3lwb29 +xVM9MTdAU9fZzslcb1VZx8zH09XvTE9ITFrf385rX0E/P0nn1c/OX0tPPlpp3dzO1VdJRElL +42/f/1tJVUta1dvPxc/KzWfrd9O8v7+/3ttMTv/c2ettSFVDSu3nu72zvb7JY9N31evcW0RC +Mz88a2H/505GPD40Tl931tnv70v737y4trbAxu1XXF3nzOfEZU9BP05h1VvRTV1HPz9AZ1zP +a/NEPj4/U9nMzcne72/71b7DwMHZ/0pFQVnv88x371NFV0fp08rL2VpRQU//z8rIzuNcTk9Y +3czL3edbRkBLV+vGyMjR72dbb83Hxb3L2W9NR2ff38/vV0hBPkr/zsLGw9PfWVXj1cvO03tN +Qz1FV//K3+9RRT47Q2fv39NZa0nfd8i/w8DnaUJERFPj18/e911KSVxzwcHJd0pHUvPT0V9L +TEn/y7/Fzv9YS05dU1dN2cS3sri/50w+RFXl6+dJOz4+RlbMx8TGyNLP7e/fy8HIzfdpRUVH +T3dv61BMQz86SG/ZzMrM3M9z59XHz97Wa1pRTV3PzcrVTUk8OVfjw7u/1+9vT1ffxcDD305D +Qj9AU9labT85OTs7W8i/vc9jRUI/Ud++sbW4wM9aT09czNX/d1xET1ddxLy8zsnOT11OTM7P +Y18/OTg/RtjHzNDj2tVj08S/urTMz9FrTc7F68BLM089MUJH4bvKT2dXSkhtU9fR21/HVVVn +5dfOVkc+ST9S6+PK00hV3Ur/1e3DytpO+2k/U0xjwMvpytte71nhu8C93VxDQU09aczj3mdX +VW9N29PS11RKT0c+Rk7vbef//1vP7XfAxsbKTc7tUdH/zL7Oz9Fve2NTb8rz81tHQTxKU8m9 +7+N3RU5BWdXNwcnJyu/jTE7NycjOWXdAO0dT18FvVFVDRjxSWO/VTUfzPHdbP7zP0MJFXc9E +3vff2j9VTl9v69u86+ndREJNQ/fAxczvRl9RW3fz389n3/vRVctjxbjAwMZRVUxO2MnBv+dh +Y0lrTvNd7/NVZ01fTEpS51tr7+PczOPL29DOTkM+REhIbd3M2FdpUFfX98fAxMnj729T32vJ +2uPZVltWU+fRv87ca1JTVV3V2d9RPj89Q0JPTsvz5V9zQmdMY97Vy+9RWU7f3ci5zs1YVETZ +///A1+XdPVhARdFvv8/dXEBDRUfr3rzO2fdYTlRfVcfJysv/ymtvzcS6wdHvS05Qd93RzGtM +TEhIS1dnY1dJT1dHV0hn5+Nf2W1n2fvZw9TOSk5dS1tr0s3Fd1PjTOlpRtJGY15D1f9rym/N +2FNX62fY3WnOVeFVR+NPb2Vf729JR0tS62/nxefH0+nOb1nnSN3vVtvr2tFPb2vR29v3zFVN +VT7Rb1DP98nNXl1d///nZ8Npd+dNzNPNy83B3dRK2mNP3D3a52/PX7/KxdHYyEdVSU7LXNnn +R2s8O11N81lMSkI/Q0hd0+XN52/GXNe907vve/9HUURzysTH52tDY0JMW2/K9//dRVlRb8rK +ydx7b1xbb+XT0M5n0/ff3t3Ra8xpT3dMRVd7xtfJ69ldYXdK0NPpXndl2f/zzNfeUUNHd1fv +d3fXUltRSGtTe8DOudnzd2HjU8vjxtlrW1tr8+PYz29UP0lPd+vPzs/KSttLV/890mf31UNj +Xz9HREvcWdhZQWU8aV1j++v/c2d7bdHCvL7M9+ll/13329vJWFFvS2dX0+vS6Wd7UWtU5+PM +ztDbydPr0NXR2tnU3Hfbb//a995lX0g9TUbP1tTXX1dMTEj/3e/PZ9lNZ0VjzdHMzuFOS0Nb +c83O51NEPz1MVdDHx8rd72lPUv/rz8/O1llMRExf43v/b0tPUVvHv8fG+2djXWfZ18Hn71lN +W1NVY9Tj2GNIQkJCVtfpzmNeTWP/58u+xr7b3/9LZ03Tyr6//19HR1d33czM129ITFZNz9Zv +a2tX5U370N/B0f/TW1djd8jF299TWlNJQT9P89vf+0xJP1jhz2dPQlPd19/f2czJymNVSU9c +/+NfW1VZSkxFSczMw83nZUZdd3fGy+POT1tZRmnv2dbO5fdHW2frwrzFwsvVTlNX7+Xpymtn +Q0tP3MXf2Fd7XklHPUZv2e97UUlGS9nLw73O2l1OTmft0czN0Vv3TGdj38nO1ftfUE5TXsrP +119BQE5OWd/SxcXPUUk/XdDHusfXXU8+Pk1SxsrLSkVAO2X3a1/Vd/dTPkRU4cPN33da/15c +/8/M22VTW09ATP/Evcbba2NbW/vQ0cvNZ2NGVG3rwtXV011RX1fby7y+0dhz90pTY9z30d/3 +Szw+RtnPzednW0tHRe3Zy97XT0dDRm/Rv8bPe91LQU5P19vV309KQUNA38nIwtP3UUdO283Q +b+ffV05HRHu/wr/Za1tDY+PAucLJWVtOTk1e59PH5d9IP0Bd2MZp329XTDo8X83Hy+ddY1xT +1MnAw9vZY09DTnfBvcbbb1BFSErXy77Gc0I7SkxYY9XG0dtYU1l717y7vM1rVlpXa/fRy19v +QklCSPvWw9xDQ0lEXWVj3P/ZTEg/Qk3pzdXIxuNVSz9N58zBe0tPPlFPb9HFyMTrVVtr3b/E +w99VWU9KQ2/Xw8jO41db7+fUyL3D209GP0XfztPZ5WtbVkZP48nP505NSD5Md9nZ62VfXVlM +Zcy8vdVeTElh49fBw8bZVEpJS1tvXl/37WtRQUNLY9Tj71lNTV//zMfMvb+/20ld7ce+d09P +V1lFRFTXx9ZVQ0dPUVtt/+f/41tGT2nXw8Pb7+1OTkNEW8/L2HdTSkhf987Mxcn3X1/fycDA +zNvL129ORV/YwsPaZ1FPVd7b5+Xr0NdRPT5N99nW2d3lT0xW/83F1c9fSUBCXHfb1uP380tJ +XVHW19zaW09FT3PZzMzR7+NaTk5DT9vnZ1JMRUNOX9fGzNX/911j/8q8ubrQ2efv7//rzthn +SUZITlFNY9t7XVNJSUVQ39XO71Xv62ldd9zBx93/UldfaW//5+Xt/2FfX2nZx8v/+1FdaV/7 +79XI/09PRuXP0c7P69pvVVFKW2fbzNtbWUth/3Pr69n3a2ddd+9v2vdTUU9PVVdt69/la1tb +UWdjb/Pje2P/Z2/3593S2ePl73tz/2/n53tbUk9TX+ff3uvv6+Pv0dnPysXL13Nne+3n6dvf +7XdpXF1dZ2tvWVlYV2FXY2n/6ef/d2/v39/d3eP3X2NaW2l3/+//b+9v9+dvZ+/p5ettb//n +/3Nrb3d3729nbf/Zzt3r+93naVtYd+ttW11dZ2tv8+/j82drYV9jZ//j/29nd3N37/Pb3/93 +c3NrY2d77+dz93d7///73+H393trc/f/+/f/7f9tY2N77+/j6/fz9/v3997Z3e///29hZWv7 +9/f7d/97d3d3/3d3a2tjX11n++/t9/9zb3dvd/Pv93tvb21v/+/r93f/////d3f37/f3d3t3 +b3t3+/f/9/f3///38/f7/+/z/3t3//v/e3Nvd3d3d/////f7//97d///9///////////+/f3 +/////////////////y8= + +--Where_No_One_Has_Gone_Before-- +--Outermost_Trek +Content-type: MULTIPART/MIXED;boundary=Where_No_Man_Has_Gone_Before + +--Where_No_Man_Has_Gone_Before +Content-type: image/gif +Content-transfer-encoding: base64 +Content-description: Kirk/Spock/McCoy + +R0lGODdhQAHIAKMAAAAAAP+2bQAAACQAAAAASEgAAAAkSEgkJG0kJJEkAABIkZFIJCRttrZt +SNptSP+RbSwAAAAAQAHIAAAE/hCISecQt+qtJf9gKA4EpmVXZqasZREHp1ozKlJsig38yv9A +0uAAGx54hUHSSBzCns3jj3hYKBQHae/n2+m4wVx4PO6Syd5zazuTVdq4D/xGl/uEBOEvT6IS +YDt8ZzhbaTyAYF0rhD00YkCAMTxZBlkHCgsGlZaWlZt+WQQFfqMwDAEMDpWCamyuhq1BWrFT +sLS0bjV1OCUhbSq6KF8mK39UnkRFlFTJMZKHMU+FLjoYodRzJ8JAXoFESzDLC+MMDQsN5gwL +6uuoqJkIluHzkwfu6t93Yc9Btq1efKQU8IcEyKwxMQbegvMrzq4Rb0A03EENAwxNoDhp3MiM +06o+/mmItXC0rdvIRBdYTVLWaZ25KuNinkM3Dp0DdOUwfdqU5wilBuUM6FtjRMKwMEMRCkgS +g+CPAgCmRFXjQyHVN9lEVsw2MeIGG4RIIjqwKgsTshyzLFCrdu04tvKOOCRaQ1cuNWiRtZU5 +DsECv35jBjZXs8HNcpnWoj2SR0Anqi2M6uPjKCkXipwcD5G1g1/Cpf4OTB0Ci9hX0w8hWmzY +lcbinhgrOSY7IcvstGzdGlBchRMiioVsNKq29egeSgYaKGjQ+23veAigR58e+C/fmUCzqytL +GqPjkCiBi1RiqNuiIQCcbULmyUh5bl8QGkU/iE7W0/edYI3YqLPjEpo4/vaJM6K5V5RrZ+G2 +FyXcjEeDVnaYQRpy5VSoWAJZxJPFKAdAVwB0HU63ll8w1TSThbYRmJ4EMRiA0jBmuCDhF6Lp +RZaNnZi1mSgF9bgPeGd4cAKEqUUo5JAOGSOAUOyhtaQFBD44HxvqKWiJc0gJh5oLQjaoQ14G +pIJYhxoVYOaZSZx5wCgcZtihdXC5dU5QZXnnomsPAoNaMAQt5kklFWrnVhW7fXKGT87cwU8Z +Rfri1Vd2zSDadzWSpUCT82khgGRZImHNZohactsBOJn1BxhsVJRLGjcqwMAp5WxkphK0ApGm +Emta0qYlJDbXGzo6eQTqd3meZ1KeU3i0jCcu/lV4EzrQQvtsAwOaZa1j6QmQh0IFujLJpjfc +R2SjGojWS22aZNIJBYmWJ0M1pI2i2a6c2EStJfAZK+O+smjyqgOw8ubTU7XOeiutabK55iga +cqLYw+ouJtqkFtyJ6pbw1qMJFhznpF120JYTbQANkHwYwOMU6ueEmhFrSLcSHBmuRKe5wa5Q +k9K25BB6/cninl2V9INRcQ2hoTWkorLTQf3tGweVYcIasGcYLGHVIwlvdmvCGzqs0XZNyeZi +u3qmGlY9rn6cinYAowLw24bZRPLcJU87pzmbMCEgerZ4cJnMNG/pBuBvGAAAkwJmG8ORlRx+ +waTiKiXVJFFtJHAW/yW/hIkflMGI1SE8u4qKyJuk51PVnqZ+8BIIK4HmwgubmavXOVIas3hE +rpHFcrCaHIAD7gQg/O/AOzAtOiQbBny054yznBVvKabXDqwTRcGRDJE7AhUsGh4VRpVD6Ti2 +/DLyLa2SnC4JDr1dmQWLOBFGVsO4Q2rRjWKmslbpTUmi0NXmsVVBljAwhKkJTQlaxoq2go1F +dIZUpxie8fIXso9JK27Hi5YGm1cYaKVsf99aH2mGQziHaEtwKExhCry3ovQgYyq1AcCU/Ca+ +8zRlM8PyySa80Jb2OWMANQEYTNbTGBmVbQC7edU97mUbHgLnarTYGutGUbCD4XBCy0CWqv7m +sru6AcxCGhRZyda2G+xo8IxoROOYPmGCZ0xJe49ymggKJCD27FAS82ljVLhEwy1Ya2Dpy2Ky +LjcqmlwpYuZ5Wh+UKDXeOG6EtmIEQapnq9UVrHVMcU8WE0UcRaKFd6/ioEzEmIrgIWY3pGIe +YfiSRuXFbXMpIp8spnKkEtbBLuA6wYry0iK0LNAaLIpKCXOAqNmEg2W16VZtzlEJR7YFlZlQ +WRGJMwUF3COU4HuGFi/WnzBYzUdbI5g3cZgjimmJGmRp1k2ix8p2CC+CiFnOJUokkwSMIwGA +AUxhjicTZVmjM5KxZYTIFzgZ6Kw2BPAEBcaGAQ/IcAQp+KFGWP4WKlbARFmLSRlcQoEXf0mN +Oe1yyjQs0wpKgtN15OnRqGSTCEUdIFCJ8WFMqoCT4Z0CC+7bi2CoQ50OPoudAsMZ0VxIDId+ +QDIw6xKSZACgFMlmYooTKAcINDHNcOSfZ/knRiUWMUpEUz294NmNgIKK5XinW6gCS9nGsxAr +dqpWBskLtkaKLgiaQ54PO6RyPFiqprDIYdaJCT7ZFJ0OvkQjGhJKDgRU1AnIbA4lnFSA+EXM +Fh11mBKJaG2ueBYeEet9DWXLgKqFG6Hw0IUvzQkl5vqg83ClWOMcQ/VM2o995AhnsrRGJUAW +z0H5kFR5kWETa8GJ6tjzLwgwU3IRgP9P3sxLdviahSFuZx9s+dJFD0UhWm/kjD3WLJeO0qo8 +crimHkBlQgEx3XokRqjRcjdRE4sasLJYmpbWjJpRFOBCGnQbhT7IT17NBHME1l9LmM58wMlV +AeyZzw+haVeoe528SKOIDoAXcDfSxGStSzjhulChQpVjHId0GUqNkIezpE/OeCkqQmmkWtn0 +F8CUo0AKm/NprdXTjPbLYxZUiQEMIlBMeUNaOnK4S0cI59WUGx184jO5BtvQJOA6K6zSZwfU +rQOggKwzGT5Uxzn7ky9tWct3xRA96fvOCNNcG5dtcmzu3ciW1RWmMSrnhabJrr50PC66nOGb +uDiKgOYp5rT+gY2lkLpAl2ohwG8mDDAOfvCZqpYGqxFwXBUo8wbQQichUawCn+buemLIAakS +dACPLdD6bqhZipAvRaVNC1AYwLFZX2FdrnZg9iDyiEH8g1G/+CsWmMU7GhuYNVoZ1lOk2Gg2 +PRg+UBTnmiPyUCEBTgXd+xO29Iwt0773TyHegMwei2ojrkDVP2tzdyn16omxN9a7e2f88HHd +1vBnoPAJzmW81Q+2Nk0bn4QeTDcXoE/zp9dwRWnrUippYOcbCZ1AtIWvJ+7rNc6h38NBMDNs +OMNp3NQF1aNjG/rqVyNVmN8pspzfvY6PcnnYZAFLeCUJjIyJRw2AnkYnZSBcTIj/DmzL8Osc +MibtM6GUtv7mL7+hawWDgwvkoDac01VAFgnE5n3iKrXN9kU0Ne+rKf98Kmmb6avLmY4ss0YF +tZpOiXRPhJquvYP5OjX3fOmrA19KDyPZoRHJvEu2y164o8vw1pQSjKZ3Ro1RRy5QGXZcqdc7 +nKWGnd2sjzy8SESznuHLbp1JVqxem2lQLUfWzeE0NpdPTb74DVeS5MCkrobR0MtdBVgxZz0e +RlJwTKJkHyX8FrMKgplOxOWKb2rxMctypj8ApuQMW8TkyoA5jwRVismVUjgCLDpK1Js7siUn +XfUEt0Ne88/F59eAf9G/77ukWTuyhZzyFpBiO0X91vYp/muCshQ5tMaPUxfq4LUBGiZ5BnAF +HjdQyydV5UYfj+MBjcN5YnVHo9JPIONBS1MvmAA97GE7OpYf4GEI4VRSbkV4DqQN31JnlAdV +uYVJwEEGJlV/9ddo04FPsQNXaiFmmlZtjBeAqUdqO4NbgNI4pgVHhLBqwSR9nbdSESgxzLFX +I7NB+wNrzQF0wcWDEGVCQ+EFAxGC4pQEIrV+CAJ2WRAr7+NlkJM6BrRwRSd4loQEaJIA9nRc +CRBpBrMEo2JtjgU4i7eDHeABlUKAw6ZYROgCTIIeefAz3VUlLEZazoMdIkM3wgMs0pNTVgAU +X1Vw2LML2fN6wXd4mGQmlYYG/51UDx6xJNHkPZGXJ1kjaQbjhlT2iq7zhqwUhwxmdG44G4h2 +O172dLn0fyHAcbrlS0TYgFUFdp/iboOWfYyICWcEPMMjPMUTAGxnOUlDa18FLkYGffbxCICU +SbOjMC74eycxCnfDAOulGAu0Dd50JvoXiwTTia74YH7hSuiQAA1gj/UYHVaENI2zfMbXi7zI +ARrmJKL2UE4HaploZMqXZmQRDjD2Yu4DPeZQgcTzOxb5AA/wO6vEEWS1HeI3KQD4XeZTQOjj +NQ3DNLTVb7jSDq+iDmcndZWnhQakXHM4WHPYcAkjj002jxlpPM+SQfcEj0jwYaKxi7qoi5fn +iwi5JP8BEm7bJmKc8pT+USWfVSflRI1DNJEQZDyZ44wY+YzQmB3RRSj3AG4++I8PIQYDYTnR +UyawMILepBY/RxuLIUP0F4sLVpMLpo8YworKZVg34QAZKUGBKS3PUotCOSFehpTZhYcBCDge +5yQ8Mza7OHRxUJR5d2ZGgAzhcJWfAFSpJEZyE40YOZhgmTw4VS8LMDq+1APjN4gsQEBM0Ja/ +xQ8heDCzwBTqxQmmky1VsRQzCYd76WRwuABOxlzMZU+CCTxfeZqRSDyF+ZP3OFis40SM15j/ +l2XKJyQ+QxuU6XeZRXKY8VeKYyWA1ZYDZiJnNDfM2ZzO+Q5BhjnWxGU4I4j/SwVHfrQUtONb ++AKDPZImC2Ma7iZ+HGabSyGPcMhcxnlG9rigyiOYpvmew/OgPmkTcDidyeVNMWSUx0dxSllC +2uZtfoVpczEFlJEinakgQCUTNNFKyFM3F+mezrk5o1J7ZjmENzaIW8EU+4kza/GOCASgojJV +LUQg/YhDsvOGxTkTgemTTuqTpZmREfqeXsSVN4GP9iicdugDybeYXXqdAamDFTOQFzeEPsga +VeUaOJOicfIra7FKzdOiaEQ3pBkApWmnEuoAiKQRVvCAe1SUW0dxmvifCUQ7DIcr0MWjutZQ +ZlikpgNxsUOTC3aP05kADmCpT2o8USqlEgqNJPMA/8sjLXB4qQm6pQVRlIyJcXiYfMy3G5fi +WCWGaoTzOJvSC1RVqCvKoobVSsnjOzEapZ36TrHkER75JID6XWAYLluwhWlxdqyGSYiye2WT +M86aHlrzhnmZpZZqqYb5pJuKpxIKqtEYN9FyqYahpWklFEa5rl+6i0kJLhpmgDckqPsBFgyJ +RW16HerZjMrDnr7jjMZjp5t6pxJKhbHRck7SoWk5M8LnRIk4G2o2QMBJK5Smc1tglzH0gI7h +bDfZZHC4rfd4qZnqpN/6lSZLsBV6PFlKqvdoqlQEqBzKqozJi4yTWgfFQKbhY9oyIQnSK/o6 +kUBbrlDqpBZZtF45sMAqof/38lfNFBSfl0KLKjjAV14hpBmgQk73Jwa440fuJjFn0rHDWY/c +OrIkC6GcKjxSeqdD66TlaqE3KQyJ46XHF7M0q3yTSWsHGTiGKAWI0pkQUyJplKmgiqdTCpZI +O7DBilNM6T4D+Vj12kD1FYriOAuqNhv1AJzR9mdSwCUSYw2s2GTGubIUSrJIS7hIu5ziCp1p +9LFemAIFoAlyK6ZeinyX1yrb8ZpcwYBa1ZnRQU8xMZHY4a2HOzymmbaEK7AYabadCmQlgCjh +Z5fCAS9yFL20IGVTlj6gMlHCd6pTMATOcW67qStmcpM1+bEfe6UjW7pnu6nLCbDE04x6Op12 +OAX/6rqYc7uudQteSOQv63CANCQHNSebxVV2HRS8mlqynTqYJ4u8pSuhlfA47gNz+LEGtiC5 +gwdI0dW92Ys0Y4koPHolyaMO3bBVn+uxozqqgluayqvAJ6vC0Cmd0NKg5vq25lWGs9uh1ZbD +WaZhBXiKCytR4nVIviunFAqqiBusnMrCAwuhnYoFawYXh5MnlPspqPJHoXI55sm32Ys5liA/ +ZzQTp7kAWoiLnMCOSmq+aEy6DXy8pyuuFapB08K658FCs9ulR6mwAGCrhXJx79qDwNEYY3EW +1cFKNnHA3xqs76nADHzIzukA6tMJMIc912tVj9wcELMAAQuF/MmnEZk0/yWDyO/JZVssK0qq +j9SBxvYIpYccoW38pORKqfiIycI5HKNQxzp8w41prBsDu2QWgJwhwEIsJ7s6tM1ZuKD8jHeq +woz8jE81aB7hXd27EZQCuIQBvNJimtHIlYaRPNs8Ms54zFRqG6NcxgvGjsl1kw+Wxqoso8QL +rMlrxM7IVxpUi2Zjy/eLw/jbbXqxQDL7rgZBXAkizL+7T5rKxCYLzqdpvOxLsGDJHNKXF32q +gtN8Ysmifbv6oMaMyAH7zQhtU+pCikHXIWgCZej8uedLssTbzi38ztpMGA1qRuhKDbbMrvbr +rpsSG7zsrka1h+ejPjUaDwJtRsR8vB2d0KZ7uP8yei/fIWy8vCkRlSDDwi65EadCi7gsnNDt +WdSniQWVs1Ubon/lPJx9gaAofMBEjcDFYzcHEIf3tErRMRyMOtP3nMM4HKIZILv5DAac90ck +ElgDXchmm8xajcxpu9BGPKV1AkoR4zdYhLWL0rUwMY+AbdYqjbZXPdhgqQ5YYF0tQc5kTaH3 +CNbJiamoa9jwzM2HlSGj3aD2FHx8NNN1PNdLkmFOt4cKiyDkEQ2holN/XcQBm9FFrciFrcxT +yhvXdCMelixQPWV8gwI+8buAfcTGq9WfPDd000+bpYgbYnTjm8oHXKHGSdIfi9GH/d2qaw7P +dsYfiwAwAtsxG9tWx8P/Q3iUXzqSEsWWAh20T2rZmG24SE3cBHsvexfRRWpVRpAgWKXFu03Q +h73Awc1PqKQXONHMUrjdOamchgyhXBneJuzdqFvQ4K2XwSdFo70A8xt57p3i6JKMq/qui9a6 +JMmnutq2XimYAtvfhL3I7yyu7nkO76RatLF5E0VVV2UQtxFEgS3cx6zCNIHFbfHJ5bBL8CW+ +Z7y24vqgobvaHu7GzNOXOdk+OTnaoBgHKe7euSR1Awim+GyCLXYW3pvfVD2yN47jDHzUKlzQ +pglKTiuM1sWzWlAvHsQJ03YlDwquho7IoEoYvWtg7oY87xQAjTPOkfq1zDW6TX5cpPpk6iyY +/y1qnJLWXB6kj187WP9W5mb+PVVXcfTNi8z9OLJwnvsqtOaN4+58uB9u0OQQhbg3coL+5128 +rzPVXfhqE+yM6Ff6FxvC62rh6M/I1YBkBE726eMtP5F6oaR6ziftk/dU0h/iZB607eObnGPu +N6Zuzw6oYU9C37lMXT1gLVB9JYM8E0Jd0HWu1cP93yn8AIPygAOoWQRy4IdE1aIkzhHVxcRe +2IfeznpKg5OmU8wOlpvNtxqhlzXZ4ei8rOHOuh47tBjqYBRPg5bwsX+RreydeuUe2wsVc6ru +oTq4WDsSVwQA1CzKV+fQpMuZ8Ahd60jdvmY9iQoUEZnxPgE/0KJ0NP+UI1yIZ8jFLrCEwSEa +Qsga9IzlYF1amAXrjcbL1Y5WYxaULt6kfZjcbnTYYPUJylxj7n8nX98JtfJ2XN/RPBttMpvC +HLjKM7hL39E6f7qqLI2M249QokkpMptvck/hPYdY1wgbYZhLj5HmoOnX4RdOBhMPjwppagTI +Xr5oTIfDpxhNjlx0ONoVKpxgrdds4PRxyN5tkPY33Fo72K6t73rPOs17Iadxnu/9rcR67618 +38VmtXHhi8GWjFzT0YmlIdWkss6Gq6fGufyCNem5At1jBGSOgDkjgsrrvZPYsexxIxijTtpi +y+1QRpAJY74jn/qqz6EXUQI7rdMcOpLRXOH+19FKNs/GOJ/A/83Sgrv7Y5gTfi/7uz3AEHBk +GdWOIqilZ8gkccbnCc7TaZakSRZ4QahMsG1PWhqeCQzBIVg4NAINBCK0dC2dDcfDOD1BHYFF +oaBsjUYuF2sJ05UP2oMzUbnZAG94XC4XAOoCQx7ovtvj/Tabi4qcIIEPiYMYGJ5GRxUvr4Ar +k4BKFMzMkk1OzqjIyJIFg8QGBgaFAwM7oUQJRESz10Haig2LxASEHZJMFZEXFhm0D4xD3LQd +IwZSAMKWo4OkJcimEJ6WRuWjyaMsLS4SKRVsJscdmARF3UWKm4G6Ofn5NtXVPrs7/L/84w5D +D4iClEHnyKAXKJP+riysVCLTQ06WOj0g8QmUKFcKAjAYxQqAhIGJiLhydShgrWK2UooM0QuF +ih3BxMyQMeFVDkTKTh1wlmvKBCdfnjDJ1ogbjwVnClBDqEaNQaQrlEndcMjNPKx08Ny7+iae +V6/6+ln9ECSWkFhJV6y1cpBHqIUSHVrSdGLi3YqgxCUtdeoeTxwkcwgGifOkIlKDA4o8s8tl +CkgOXoRIknDUAgaJ+JY6kbmVgF1Ghqnx4vSLZCsjqgQAurRL6V/AromAyhZplkBfs9K7oUef +bj/5wI4VxBOtELOKF02FkvrtRYYON8m9W50iRYt6pbjC/ANwSMLhB/JVMEoRxxWJSWr+QdPl +0iQri3Ql3NiAIAP7Enhs/PExyIsrkNgiqNKugSKbSFbjAQQuWhLKhS8amQ0hR45AKqA2dqMn +rDwUUGAPfuL5Src22Cjmpla4Y6QRhMhpEa67qLNuIouu0267RBRoQAGv9iBEMAQSSYI70TZK +hRT+1NqMsQJgiOKSyFoQwckrUMCviBOm4mUjUkJaIMAZZiBwhAlvDDA/p14DJhIWnyPHKCNg +msEOeIDT8A8bDFDgFAUG6IcOOEbsx8TPYClMkUXcBKW50yqyzi4TZizhSTPnWnLHPN45iztF +FNkFhpewiOGAzk5QZIX1tpAGirngE0qoLy/xoUr8OqMvs1j/oDkizAYjgy01cSi60AnXHIRQ +r0UpVMHCFRCo06o7scJhT7+62sePq367gKSBwEP0rRSwUxZYRyU1V9xQKKIrS2kkICVT5MIr +41NtLMTEKGaNYHeCJCp7LLJ0yERtP/hM8QUF+5KDZgX2inXQIgS9mJScydKkTUq4TnOOTW1m +MNFODUXM8xS/CAA5uEBzO0YxAlD8QIYVI1OITQe+BPa66aSTTiIZJ0ZXnEzyS2qBVHh6oyzB +hk5UGzL0xfchLBicYakGrnsJlIclNghqWrtMIyH7PgDnCYmRzWsFmbLQhahjzZbsl8i0QTsD +C04OuTdqOQIR22tDhAeDHxPZFFFl/iRRLVmzcdY5Up551jnx9zYaekdVANgjRU47tU2qFaGG +OqkEwKEptUoaBeM1iT0PNRoQoKlZpC0aFMFtSimWaoliyaU9QgolDJ09NqKV1gCSmQECZRHl ++U0Dk2IZ6TjCFWXU9GrI7YSuSLPX2RK3Iz+BlKQya8Yqeb9tjnOjqlS9WWmUCBP17H2F+0uJ +vcfkEvXAdoVXotJ90sY3SSkESwkH1nZHM98NkAZdEV5Y8pQ3VfABZYASzjFWJrjPqIg5bXrT +I6Z3kemgYHFz+VkooHYl/XzoDcbBoJAm17vnXA9q9vmU+8T0Gulk7HTpUh0mPLOwzUyNgOYo +WwklVA4C/haQBAfxX4vKQSwi1KCByjMAZnayN+UBYlCBi0UsvHSqzdVGGzV7hDiigL3qQCo7 +Jjxhji7HiuQIKUiFww4jimi/SRCOMrFTAunsUr/eza5VPcxPW+aojt85rG154dhbcKcLLmAD +KdmAH7IO5BQ0SHGKfAtCHsSXqWwFSpR8Q0YLW3GiTy3HNgXRUlRYVD+7oNETetFdJfQlOVUY +Jx8sBBIMEGAFYdHvf4SMwQv6FbvZ/QtoERJmRHroGQkVQQJCnAYR3fbBb0CymmmCUDKdmEAo +zsluWeHDVjz0LsBIaw7HONFZvJgTwi1naJ2SZww4Jz8bzdKScauGKvNjOa7A/8MwckwlqyYV +ETx6QxhLmEYSeKEaEQJtZiDsoZVY4IJf4gcGDZMdNbxJsy+IiY9js9hHeyeZNG3BHePcjQAI +oAcPES0PH5ngiHJjC5eWjyTqWJJO45koXtwMhAhkSz3naQrztMIZQfgIkFL50EFW9AHpuChl ++qWE1GFCohOtX0JRkAoW7MIHASiPUkhqIIxND5g1a1hbSUrSV47LGmoAhyY3KSJVkOxD9iBn +yix4IsUgzT8+9Wm/gPrBNUYoKr686pA0VwTzNINOA0EEOOhZuK3G8nNVbUJjfynI90xEIiBk +nOo4koYD+MAHF2JPR83xQYfYhwZauEBbp/YCtvjqiP5pUoIWWHo3T5LMHkbTIrbGYgucDC4R +4PEWYQmzi4LKT2Py9GwHklYSOmGOJDQJRgy9irDlMFSbWH2MCJ3JVcU9kzNj9cEEzpom7VTB +Y7eY7RaUEQMn8s6RKd1CnTYJljqQ4hRG4is/AFwiXBSDCIHLIBCUCp6eSqCpy8WcPacSt9sw +FkWLScS7NtMlHAx2u+0Lgc1Au67ISSEdcw3r+3AIEetQSrQn5IvB+IMqs67tKdI1ATbOgIGG +hQ5AHcwXoxxR0qX4lkTRAsRWNuKXCB7PTtoiBEDaCZIQf4CmRNJSZJf7I/DQqy3MJIMrzkKA +IKU5wkol7nrS7D5GJHNnzv4M5lzHoM1rlFeEk2jVQT+RMxpXUV9jxTF7ShpXYXFum7PZYIXE +aGe6esxaBvBTA/NEPOEu11qcJEshBiOQlmVwy5pR2g50VGYsx8tLYm5LVIJ0AAJU2cpn0Ix9 +8qMKeGQ3zCrtFzWayThgfwEdJSZ2r/P8JKgddHF//rP9fmjj+uSHBu57SsRgqI0nxOTRjxZg +N3UBPAbetZOpPQVf8oCWCf7JJCsDyAVXSFOBEiapSUGnejxCEnt68EIYdMbf/lacb7krB3YA +wqZ45dCqdnXOdSypVSMZrGQPM37K7kYmUPgC/qz21mNzLT7FKIapGMiV5zBITGaDO9rm+r9i +Af8oCtXTSf8O5x0mMQxlb4AWb4EnMYn5iHoA6x+vRQ9YvvwyOtGSYM6QxCOBe3PTqeFdvDQB +pU4Qg47dE0JfSEJ7flYX1IqWlKDxBchDbBAYEGcQmfgOKjsoQm0EiNbfWWDlw2EFKfbaj0Lh +g8qHOZHOEwHHLulBPbkcfEly2YqmkQspr47FGxwckkOE2gidQqdXEPHmaV6VbMHyRBPsvNBv +PwzrQWMVsulSo7gwCxWuUK2FyszxJBTrm22SG3OkNIW1F9XkJ/+dBdM9xRsAVMIpMgS0wrJF +wHlaIIfPKUgEyk6jdThzJBm8HWs3DM2whsKyQITT0PkbObbvza9V+MT+7uuUqi9axg+BiRVO +X/G4LIQK+HEwqQiN47EncZunKQo5Won22Xk0Vqq6McANq/gtddIHwfAIQwiectKUDBgo7RK4 +euAlpUKnW5oneSmc0UKCUjCKntoBFNCPWzo8B5uwOWoX8Vs0qMOOMCA2SKoYans4SVCIt1gL +M8Ke+IMoRwg69moEV9CCAfqdPOumt/E8bROG2xDAU0EHAiwxJKgbBFQevxoA4pGwpio+KRQZ +TbkyxTC8D2gZNhiMncsJTLCwRSC1hKCUpuEGhBGNzlkQgsGCwvMKzZimFZyGhCub0uCcFotB +HeMf2ugnRog2w+kGdYkLg/AMHOCPKrg1pQj+HSGCwvORDSesmCFyglcDo/uSJ6pLCjYIN+DD +lgPQkRSBo6P7jgpaGWRQLsLYlDUzgFuCEyckg8mhD3L4lhQoGKaxp4eAxAhqLhDAQ2N7qEVJ +BzU4pmTkqJagjaVhlk9AxIVAiHwpj6bqDtXCMfeKnSDrNktkgSRLufyrL1ewtQHEHSVIinCb +whDJhypiRJoriwoYi5TZFg4jtTTklhRZERYhPSxgmk6BLIiKAvTZNqa5JRRIqoBkhf15taZz +qGsQJmFDG2GIPSG8KtqaNqIIK/uSCjfphkMsOb5wPBsDQtgJx4tMuPSbmnFMpJS8ruUISCgc +n99buZFJES9qwO//CD5BkMekQcNRKZ982483yZc0XBETkL8w2hi5QUgUKLwI0i6+6Jd22QXc +kki0gUEZECI+kjQOGJAWmy9OdJNNCJBlOYfhe8cnu5DNcCtDa4l04MqLLLGLYoQuI4lVWgdE +YYb/okLw07Tlm7kDDIsqExsN2hwNxDeh2w9He0QliR5K+ITNqZ5zKMSHUBF3CbNpSooh0bzb +m6TTMabYm5rYqwVDUyn28AAiwL21mihe3DfCK4IfTBW3hMK41KZiUoOq88QQWMyAXATJMq6+ +BAsrNCV59LdQDIS/WTB+KSiRRDV62hxoJD10gCw6qhIiUx+l5EDPIYygyxzOfLOFup1P/zwm +IZoAlZitlny11ayC6zycL2CWockMx0stW0G1cawvA0HGT2k4TbS6FWm7BdEBtZgpuhM3AGs8 +6KkKdgrFLVJNfOPH2qAnVWiaRluNFPDIDHuLSCHIjzwc7oEoz1mSMhu8FMTDzIPImgG9yTBP +1EwJ9ayvLTDJXzLLuDLLowDIBbCcXDKF1UpMs5LRokBGJAMeGgAcIcwG5iA1aQrO4WyyO/g+ +WEjOdXsWTdHJD0A4D+qgC0GVyUQYBbmvtbgwfQIFyKhBkHwIqMylCVNBaRia8auYySBAz2JJ +JI0it6pRqOi6MpqZtRuaVBA+gzGFAQ3C2hzSlHLJI9XP/azM3//8u+Fcpzj4AFLwwrrZFpUp +JRfiR9VgzQBxQ1AF0zdcJQ39n4lxCRjBjorLBHW8w8OThansTMOqGCKFpAE5JjxtGKXQgaoB +SbhoDsxSiG5YLMRoBgnIRlRZkob5ytDANrp8pK6MgW0i1SpKjKZxUgPry3owgAgUCGQwiclC +sMW4vGa9wQT51HsRVYQ0SBbxs2nsqnLpuqARuDVVTE8hOvETAz/cyoaCLvZsn62MGXmtEp9p +v4oYVkc1D5oCAIPRKKnAoPoCMpETBoo9om2zvRpTC814l0j1y6Op1MFoHgmINeSg0gb9yZhh +lCPgwVB1SgVZ2SJrV1O9mnzyhFV9w+//DMgRI4hRmSOYCYqZMCyYadYXYaNV3UHFmj1HKIOe ++wgfZUudHbv0TMfbuSioUCzGfE5GwEtX6FhJ/ctTUjAMiDWfFIQuPJRpukpFGchfrCjnOB8X +MaMzegnFoTjPaYB6fdV5IYg8LCa4UQEtRayGiEaG0Kpd5LOJxMUc5Rw2ZUgfqDFpMrMjHbs7 +Ezl2/dMxoNAlWQWvFc6UgRdDEZt/mMdMRToicM64EtY0dds4scEOSlX1MS8Zm5RfvALqk77w +4MxFeMiqiwTrM5NznZlhdcMdtI2zXDsJ+4uPeDJUW5L0rC/XslwOogL5JEBZ6LC+etJ8WL5W +GIlbQBqz7UnA/2pIC9OLw60oUIVPc20iPBIX7Bgk+XOFvOVbRPEsROqj52CB7oFPZBle3DsK +Mjsf1hxQywmxY0UhM2jLQRDSssMtMKiN6l2oNFAHpetcPEEeZ0gMMGPOQniWOkFOCXwqm3mO +1Y3dHuLfanCRfDJhrXpfZ5K/yEqMgQguoiHRN+VXOFVCL6AS7TCbXSSHRzxLDB0BfozZkQyx +OrC/05IXIAMcW6gr9HstR9OGTqFgUzpQCw4RmNs+bxWsDzYRBkvRYloB82XhtiXeSWEiuY0q +us2OmoUCL+PRxFAtBOaLnpVVGWgB+rmoAzJTAT6Txf3fghQj5GAqx/WB+T2JyV1P3f9Mm7Yb +FVtELeBRuSz22JsbKOBJLn3wYJwyuEUgI2NMPTB1WZAsy9ojnYlRHTd2lC/AMjwwjjxoWM+w +Y4Lw11mF4wvLLwTihk+lgsZkTIX6uFYNFIFaS5IQ3Sf+3toKMmnoTZ7S3EhWVroJJWlhR1EC +DpMgBev6sbDFObIozA1zqFTSY5tJEKc5Y31JSmGLGc7TMzWCDnGxj4ITAqOjY6TSIE8B2Hud +JOsjYwH2oEAW5JjFvaE8h/GZ5yAYMEbsXg5YYCfegLay4p2KTiBdKZ5sKQuuA0oNLMMoC7K4 +Up/kjhqSp+ANVc9hiHXGLEAS0WChHRcsDB7dK7XEj6/T2cb/Ck8LawlgRZsx3RoFAebLtY9G +WwuuEISmykbzGAKUoAX6yk883dWJFgmcCr5KvpvDo5ubaCcw3pZWFOOCShTzZb8fPlOYyDd4 +RVXVAKCMEZZ3ObdyQ4wnu5LNgNOrIrHQUEJntFo9XsoBrpCArswNQoc9yA1yS4+wVYmlri2H +XlZj2GYr9i1EWKoNsWaM3lZQnADK+rEBINtvLtl79FmjeiWH6NT0hT9Q8CVF0acOzQv3zQ5U +yQNKJZnLyEbPSGBpUBWqtMpqQg05nY2ebkML+ZapMEogDGweKOpNtr8d4YtDUOZLvSnxpQUN +eF4jxQXMKOS+qepsfdUjvYkF+2Iw//5CAoWuMQ4YiUxKw9XON9nhXJ5ZcXEVRrKkUaA0e+CP +avVRsqLlhqxrdtBDXqjVNeHPTcTbCBPBXjzlJQzUTC3s8ugSukGJj74pCD9ATraBkTAFnKsp +z9XW4uqNw2sn5mxQTD0OmgNYo2rvaBzWM3pfg0WI3zW9mekx3ZFvSvMTAXuymUaFy7hDziRG +cVbR3pZTG5oawmq0qWjCghg+4vgAmi6JxPa3CFeZA1we5cwJ+kun5Eme4KDsr8U7n1NN62qZ +6B4E8R7a/jyslVZVP4MP60s0Mr4IVwGbtaWl/CDZj7BnWVRoG1ZB3Ma8wI3LapLLBYo38eap +TrRLMY0Bzv91IIaUKYU9iVqgcCuV8otusifGX/okjpQxLi7PVk5CJ7EdWXf44n84urNAOE+0 +SxNKSpulCKUhl4JQPBwk4hlnk/kmAFzHA/wujz0xkgbX2cyrSscyn5gYTbdi6lBEmrOopyUk +HDYlLjzAgVg2Vn9gpwj/4Cmn9HWy8LlMLbzdyd8YpSyWoGy+6jv9mEtV9g2TVpihWPzqHhdW +Ach0cV+SUE4lIyNrpFcjgAxomV6HMh/VmxBkjDRDLYcaUyFabNGBajjrRE5ZkXwr0IXtpFQY +t3MzDmPI9n/Ddimvye3lOAeWrEDgJHrUXrHgyXes1If+5oYWQ1g7dXEOK6r6Eon/ZLZ4Z0t+ +dEIRrsUVxfcxK2epyANcz2ADiOvwqY8q0inM28yOqQogQ/WZR8aYcc9kXUy2s7VVMBo7qBZe +MtZ+uwBKn3IrrSA8ydIGYYGFBPcMyW6Tr8Jc2okrs3au9oBQC8M3Je90lInZqXnWJkha1rAU +hXppvWstqRkXRwJS4Gwmp2MYkO35jaIhUQd68SUZ1dKCXhoBtpdaPEhUCwtycwNYpqkx38Lw +DftraW7osiqQ+/ajKX11k6C586vt1QMJSAUxrAHkrLLjKCXxHNo5pXlkWWF555SWCbVQu3t+ +FVq7NDLgTwpcjzWSLfq1/BCDKZrwgHwVDNxm4cpqijPD/geqWC8qP/ztMvP8nWBAXaITxCb9 +sBcOTnrin00GQ1dy9s+NjParm6N9z8DUpe5oF7oqCFhpobXabW657t0DYsdykCaapghrURYW +x9eGIQeB54RgNAyQQfIBFwaVqZA8FG4TUiMaZRWq1srEJZW6uhhY1Bu2oAAHs0FxBrABArZA +MJjP5fRBPK9369/5udVAQUKFhEQCiYVBm9xfXx7cW9skZSUjnBufwIHB0RknzkGjHV7BwMHp +6eYmqkkLBQuWocuHR0jHQxRKSQlSqEnGlswFx9YGGcHOXI5CAINzg4IRQ4PnkSeTIFPSjdYY +lVWTFWECYWwsU0vFFrFMw8H7/vviIgB9ZOYfHumdPr7f/z9A4sZhQWTwSZkzdfDoe2TpIcR7 +muKAYvNJlCA7pOSI6riJgBJXFdS96OIgyoYPIQKwbMmyQQB2vXZpQNlh2IwwNSgkG9CTwKkF +QYqYiIYthTYlp5okCvYFgbkqCMJRrSKoChMx7nDCMGLm6xpGDTUxLHunD5+0cQCxKDfobbkS +5Z70itSoIVpIEfdiwpSH0zU/nxbeAakq1KlWKM6NlFAoQQ0PGnA9cBnTsrAvkzVYvslFJwcL +N5KhAnrKAMtnDHodkXatVcirTKR25QLrHNMkVk0puVHI6TBiwuuusccozkRH+xjm1SOwSVtx +U8tB/yXUC5GJThgXjkKe6TtfvpDypDljx0QqOufptEqv+ECsF7+BS7EFwvLLmDD16xd22WUH +LJ1EQzslALUDDwOYAYQzqxlABiiepGLKNlc1AQYX1s3lwgQTxKdVZjmFodkFJtQTliXOPcLc +KHjlY6E4CQwyFzlQHXDQjYCpAYB6eOEFXngReccHJ9UYwFEPJpyn0VKbpIKeCoyV5E0wtVTm +wH8twSRFf/WdhCV+LgHnwGg5xAGUJ6oV8eBRnDyZHoyDtBNGW/PVRt9nwmRQ4J511XPcQwB5 +54iLaz0XDlRTKVqFjOQg4kR2RijE4nh9BSnkJAAdwMCRdbTykT6lsJeYkv/vwUdSF6HZVIsH +AYCZ35aXbWmMq/tl2ZJTFyBAmgAHDnDND6q9MxMoq6CyG29zwEflC+RgGKIxwpwU4nAjfOLG +kX5QIomgzfVxR1WLzmgOBeWcgIhVgMHB3SPaSnIpppFsKkSnym7CIz9yFJDDm+1t49srs3j5 +ZU0fyBorwiNyydnC+OkZypk7AKYmEL6gAQjGgjw3nw3WcVhbfZsZM+20CnelCBvz6JXiPe1y +S1acVIED36OQYjcVYPRst1almcIrnh9pCIHvYfoaegcqS0GJxDnNFthBMShNdpKs/C2cJ5at +xgqgyT8haEDFPzjjDLEoHGmKxkln3ERcX4jm8bP+NhXsqqs3eWZyF+aZt8d37qbVN0B+Hc1b +VVLdIBJ2KFDYSaaU/qPWz4GCR5GDR3ckCpMeJUYqDk+mg6oFkXFAMOn9Wb0f6lvUXXBNUWi5 +BXo9Cb3mAQ1S40uxqoBLh1QFMPsxfXaDECCWCJfstgsmFrfHu+9e0nzf+KhlFuFWbIO72itv +5JDfkQsZtFH7dEQ0R0Qn7QupIQW85wfRSuY6/FtrGVPWdLNeU5dRGJBMDmALm+bYGCANFRyB +QvrKmMak0rZUeWNqBltJ1Walpy+cwDvZ6p7zLAWkDW4rOc5JoFW4o55tGaBHPbuE94R0CgHu +bSFKuoMb+mWqpXHjFW3+S4kGCCSt0/FHS9OaH7SodYRTEEABQdBODoTSoGqgjz3LARd0DDGD +KhmsfrMKU5fyVoIjfeKC0uvgkFCIwpdlilDqGdTR8GCJTe2Mb49LIctiaEROWA5zGDGUQjiC +PsX1ZlmFgNrdttK6K8YPdcXzT4iyqKRk+G8mRIQHg9Rgto4owRSkQBu40nEndxjMYVh8yRjI +MJNOkJJvgeJWBjnYl1R6sFsrqwTYqsE9DcKxEn+pWL3qwAqe9ahUxlIBhVZQEgxAzW1B/CEo +88cOaMWtREc6AhB21UIUNGiAUJoQP7LJO2AwcE6u+2SYYIe8ohyRjsjRCwbPGcafsdJ787r/ +oxpf9spaHocIC4ih+MxwxhEmhhUo4FwN10GD1nkziBJ8UAO7aRsMEeM1FcNcGtMADWvApj3a +zCZW1reVyoDTYTKZiVCGogDtfDGVzUOLKukZnk0FoBO6NKVKU7QJIHTqiTvL5vgUk75KCtMb +OyERnmCXqkQ0BT672AV9cuaJBG0kMUZczT8xmSxMniWTJEmAMakWTi7lb6i8GMpQOvFKd6Gy +Bz3AFgFSGtNANYNTC1ADSrXFTsnFsJEx7OUuGaI5ZQH0eiHpzW9kAlTk8YKbJzjqYbEHDD1p +Jzs11SV7SCCEFHAEbcnKl1mUZieF2ep1V/soUecF1iCMdA3tlCcc/o7Ev7SudaVBCJYsf7RO +8ezlDTn4waTypTk58OEwfPVFSBZDAdBM0QUsUGx2FLu55GrFCHEg5XYIg7QjSKpzltUYdvNl +KJ52g4FcVeZCk0dBE4x2tIzzG/OOlJZ5rHZ/rYVIDyjWIFSMp53eQ+WvxJpGpDW1RzJcAh9F +klASHQ4pKbjGEfyJvdDpooF0LBYX8XmXw4Din3zFGFUhm8ZdQMULcwJvceGR2PKWd6SsfZ4m ++LAIs9Zjf/vj33szdYRgCYFBk81LvHym44lop4T2wik8xacv3AVXfcwaEQUsnJgcpKCwwGjK +qj4ajAQ/+F5M4hlHqPvCF2a3yy265BKu/urhPDVYxMM6AYnT7F61kGdIyOkEI0m52hOvdROz +41QUnpGd+sIxg7at2F31SgrM+TezFF5CcAUs0MwQzJj0CWq0QpkIKajhmVbu7ZUBwaPkKskO +172uhqWbaNB5GB4lOvOTS0DjNIN1pGpk83PNamk5w/nFL05GTHvQiadSIw1io+ne7KtWW2KL +U4bq73pa0VukDYbI6gssJ/EX5ZANElrHGwEDzWlljeTj2MqyxgF5t7uzrAiKIkGHk0Ga6pmw +mtUK4ME5J6Lis9Laxfxz8a1rmSRo0rgTqzZSI+BLS/gKgFMuGtVZlLRspJlBwUsp8qlSJa3W +ke5uX7o2yQYU/15eSMoNLQxVQ0SorI5kxNPixqzL+IGVRCPBySowA0zarWYe+EMPK1YZI3Nu +7zgTAM50DlLPSek/0hYp5kBgIoroKuzn7k9QzOEHoUXIS5IrRinb6A2I7ndtrRePfnq60wlc +cN543uVbaRwFly+qTW5j+ZIc0Qb22rQISMo8ze9WULz/4UV6zPnePfe734EudGgOxQhD/3UQ +CE5sHQetH3YpCzyP9WX2bJpzAkFF0wq69cwIh7Dd9LDL7cjLQpXd29tR27izOeHumJFJc4jw +Rb5iBki2pO7lLaE6gzaPFvMcAH2/t9D7/j2hTywIQtGO/sDagNoOu56ofPwpiGav0v7v0186 +hfv6xlTtz5wseb1o2nwaUwK9sOilbZ+wXjOidtU//YzK0aYlK3IvFCDe9iUGSsvskS20zvnW +tw76751S0A0eaQHBSJGSJIFVjn2RLcXa5ECOkOkOLyEJRvyTCgxAfAQWpHEfYRXYCYDfUJXB +sZWey3QbcxSA0aReVaEfyo2eepQKEsjAM6SG/bUavL2ReqXV7s2D//2dzuGb8JHV4OmIERWh +ApSWNRABEJyW4KgSeeyfX9Tc2r1UqPAIRVAS6i0GtOFEnnxefPiC+IlGCdyAB4VKCRLK0TzR ++lFhWZRdVTEbFMQN7VFMDYZVPEXhM/1J8OXc7/3f/7VXnP/tYRocYRFyCnRpx2sFiX29QX69 +mvMAxBtKoBlNX3swWUVlH5/kBAOpQ4F9XwbKx+GcoSien3StoXaFHPu54cjBw8PAgGosUR2K +FLyxWR76XrYAH+DxIa35Xh8OXq0RohGOlJ1dAyEywPfU1nNBFOP5A8g90eQhnEX9VthJ3HBQ +Iyge12E1hjZi4w220vlxzyReVIaZ4QQShirSxNfFwDPEHDTEYljhn1ylTD3kog62187tHB/a +4+DF2REeADAegUWQkgEKnPZYSq+oFxqtUkBIVxup4chhU0VN4+cVVzedgx+VxEhgI32NIo4x +DxqaYqi5nvsRRkg8mla8ohKuWg3/4h4+WFqv8I+u6Rzg2Rog6qMv2hoCCo0wyh4nCJAC0FY8 +HgfrxaNcrQiToOBQQh5F6E5krdvnaUFFKpQWGdUNBE7ueZC8iSJITuDk7cNalGQDSYGpCcWv +BcAB9po7spDvaUK2PBPP5SNN+qAfDuBN1lpODuIRAqRF1INPEiQrldUbGeQqkYUa7heheQTq +raJEWiMXhpIgGdcYmgiftQuLNGF9YZnakaBIYpaRTckIjJMUqAawKKE7Nt1L2tbuuUE92mPf +zaX/1aXQAaMBCtB5tQFeEmQUntQJRc9gupITmZ8feMpyWF+qNcWYhcj7cF6SHY5dgKNDSM9l +uszCOWQa/z5dH2VkFqga8oRmnr0G4aWliQkKtqjXH9YkEPYibMamAPnkEaolRdRDe8bLWGUl +bz4f4CSHsuDLB92F3qQHHrmCcWbdqtTC/YzBYblISUWneC6odNacCbbfkFGlfHhfPJzAZwJb +Y4kWeO6PT2QCD9zcPJanD/6dnAFfeiLgehaiEemlJAyicXQQrP0FggqmTAnlt5jQhAWaTSkY +UYHIwbCK8YgSCuRdKxXpI8JaVhalN4baymVg9hHVmeFWhBiehqblrpBVyrilXOKivdnlifpi +e/pkio7Ueu3aTyqeFGbHWKCWBikpZaqet+0OJl0OYonSqSHSwXwdhODAGfrD4/9FZ266Ubw5 +KNt5WkZ9olelW4R4QqWRV1qSVtN5qFjVwxu4l4jiI05+KQK2J6fmpXlkwq69aG6yGRRAVRgd +aZtOzpvCqRuOnvggVRwGFdUcTwgOaUE6Z4oByUlBp6qyzH5RhR9VgHGKWOhhgyR9wqMa392N +x4fyHq7tISBq6k0C4z9WWoS9AScY0Sld5ilIaWCsU1DWqCs1lXKwoCjsy5KpgJ2GpdR8XdjZ +qijaaLuUlJ8SJYopZD5QCGBxk6ImFihM1rF6XLKSFlD4wd/x4mq1mB/eY10eYMPKphrQZoKt +WMoc4Y4V5V9sChN5QsD9pWCSkW+uAvUtB/o5SZ1yXDD/gEG1nBmx8KqbEuoo/M3Ltin0AOYH +8cZRFZYiKEKEcMIWJcRMDawhwlsyvKRq4iKJZipdSquZBuM/foIkZOtPumnurcIFtAm8DuYD +bm3VnlP5mV0vKYslSmQorWu2jVJzqpPMspnvzee98mqqUu0f4OyBUWmF9RhgJAS2qKQ7qsGB +pJV5Iq2JMi2YUqs/EuI1/EmLWiyWtqSdmYFQ3K2BodPHDmp9lpvUGZp5AEUwtZzOmtq79gJr +yBZ6VW3NFSyRWq5JwW3NOujTORaCQVeFlcFXUI7QckrBti3g9iLPdSnhxmZe/qPQpVcaAAqs +rYEJuAanIYEujeoyCs5+fhAq/6qi7igBNijq535ucnkkfUrEPyRITzAgb0IOsXVLGTKJRUyp +2bAJJ4BFb1UpeHZO0fogL5ZnD/7u4AVvP46Up64Yt+za2mpKQA7B7D5ZCqCN6n6syxql9LYh +Z14h7ohucR6YafXKZM6SoNxgpbgZA6KX91buijAC8s4eGlyaHsBvWsKZT8DYlgruD+JvGsRw +qPIvYNTXIJYu35wBlQLkRaBA4iQBb43vAuPrfpZfZjXVpyBX3Nms+WptcvAATDIeyN5nzcqT +FYOjgtQutnpcKw3dwKrBCr9kD5qn78LwDLPJruVMPAKwWvgvGnRRcoGFL2BHJaFu66KW2oZs +GxZmVf8pD9YusUdaZYIG8JyNRfTMlr3C6PONaz4QiV0kh8DerolBsQ7O4zz2Lr6Z8V3yLw0P +b6Zka9fuW/ryMFgA1EzISDiYnwKn07hKl1eunbHg7R8TnzfO6wVPBILMIpu+ba/eJ/QyshsB +5znx2sC+1d+25ky+ZSbDMP/WpUcOol2AaBs4lvuea1PmyPVcXT9cJR4vsIpclB0UrL1cS9Ek +F+Gxb4pdZr0+DlG+5Jwl8Aadln2qM8wysHLwQUjd7q258+4GYhlr8tIqVew+IgCPh6XdLYsa +i2yoq+L4VRWobkH+MjA/6Jm0y7XQKUvRizAGG0e2zCKv8Ds3B/l+cBwFaij/l+A2u8HtHtEx +r6VYxaU/L620yjTxefLL3PCbXYvOzJ3HmWzhKMHNIEqiqbLxuhHM1rKhkSBQqEDMNdZHGGkg +DyrG8jNMJqSfcdAiRuEYkZXZjYc/rrQAHfOIJq2XAvTgHmIp7Z/uGeMW795Frwu+4Gy6rJxR +SQVV/tVGytvfSHQtS+fUccTYrm+P8V1fd62fZiWvhLQFQ2BJ75iugtEYIWjQgDULrRZV/6A/ +m7FMJ63C6uquVaoeMk7DsQHUwchshMOpxMJAQAdSrKluHrKCxqhRPsm99WwNv6coavAsNeBl +r5ZP9Mpek1EKKamukqPNUXZ45txBbmkm07QmL6xL/35HJ7A1D86DiWCauP20UCsKzdQJd1sF +5VaxbE90uYZcSLQGvcBTWnV0INdcc1IyaXgN//zIYyuiGNHsLE03MSfrJAdu8NWac/8uXb4w +UQKw0LVYWJiHCwlAVVxdJQ0CfIjDqRDCIFABetD3LaMR8/S1EWfsp/BMHsVrn2LQ0fYKSP9e +3xHpwOnbhlOEF+vzEaDnAAb4c8f07kHPZ8/aVeJTHQDrT08F20AHazMGd6syceddCRZ2+2Wx +Jii4bo+iBjdvb/IBile53z1n+UqEXwryrlF2WPPujNP4c9Pki+HYZ8uadmwb+lmWdiOKogD5 +OZhDC5xK9rjZBtNrHlNmUv/2CD5pcJTn9ob7zFpY+Q7EuImOdTrDqMABSt4JpJe7GhQDt98B ++DKPObTem0Hqmqz1zH6eayCc9mozinSwDZFXAHSgw0YK6qgKap5/LbeZRaFyZEU7p/a4sw7k +sk2S6FjjmopzraCjl5l6OW1W+TIDoM9pajOnp1x+sK49UympOWYyeMy0ueFARbXHeVvQ+YVz +86BAIFejNOsxBLz9tj48eR9Y9pPjecQQOnRn9h9iOTKm2ADuN1i/24fCGJkfe6WPOdKqNSO8 +NKVq+OhVz8q1+aK8+ZvLeaJkJDa+1Dqb7kmrSDkOGuqa5hn+tp6jKiOINcfrwD1Gqz7y+m5i +6f//drmwG2AulvV/I/sZyzBs4jtX66WlFYoDU3vvyExUTAc6ePdtUMHhCDOSezB5h1yWAS6t +QzGVW7A7QzUzWvkfXsOI7ruXwpjG5+q8h6mw9/eLhaiu26WYT+vLzxnNMo5+8VbuhcpUFbzN +34B0wLnPE/kYYiMm8VlhB72eE/0KY7werPdpwndV49NIUzmKe3zgMvc+VnoUN6FqbmqJrecX +k/mzqrwZO+xN7jpst5jE6/G0N2nhoDKpI/x01Ih3M4aS2bK3yDp/IljSlOC4nwm5H0iDsnNv +3zoOxOWL1f7hL+2Al/nzXH0xEjPW83fKF7smUz7lrzyuBTyoIuTp81La/lM7kF8BOKg26MeC +wu88zqCeiHNz2jrHM/3Au50m61c0FIO0OtmxoPPPrffhree7TDItTNIltapo8D8+TALhiX59 +bLp8XSa/cTwhBAg5aRVDlFF4979AQg8RObEUk5RlD+SFj0PDrFsA8kq/D+PAECoOBIyhQiBI +lILmYKlc5gbQpkTXk265XamBYACPyeKwGH1Gr9cKt3solCvkdfsd7/6m2eDwvy9QTIGN0MAw +TSprEUBs5yKnp2eiagPksiBhhCQzpCQT5XOlBSHhYKFkRqbgoLIKZydrYtJiAMgggCFXAYpp +SScqWFgADKrnp9VIckfKymvLzyx6TU3QevAN/o6OgW4b7xt8yI+rrPza2hCR+o8AwD1ywnFx +9majSuODpkNE3ySU5F8LVAgGLnjxwpSMGTRcveJBQZIsCgN+NBCSi0GRK1ecODGCwYhHKR0P +ECJwYNY7Hc6MeBmj5CW7PebOocmmLc4QOOF4zpGWiI2aaufSDRLETqWsRmJoPapVCR8rDvpA +mBjhj4WnEqNKbe1KKsaMqWIbXpjkTqJESgYWXNQlpAjIKRNCbunYkmMQlCFT+npGDhpMQHsA +1Tx0c6e2nT0Zc2tSE2ZQQeooG6WGFksPJEj6PuqB4Z4He5c+cdAUyh+ogKO4EiQFI5XYhWTL +2ugc60KQXLt1geno/9H3FhteRCITfuOv4HF8fpIZWhNxt+jcGvN0I62wYcOV1QVVu0OeUnqU +7N2zhGkfpxNZt2pdwVpgDBTyYYRYqJAVRYcQKRB4yxsjA2zpzyO6lOgFrysA+EFAKBySJbmX +YopMuZm0iw7DBbyhrro8lotMu2sQIaS7oNpRCR40lomIPKjOQ++DFE7Y5KpPvHoNx7BSeU22 +VmaboRJaKBLCIt6G0KgYJu7Cy6+RlGikCAlsw+0vjbqYELsQD8MwG+q6yWnDDrkxSSjtQKTJ +Jsv6eBLFeMJr06nQLJkzKk6s8uQqPEnRs6vWYisNNoV+nC1QGAxaCADQGGigAQB1yQUIvv98 +EakLuUaCZCL+fGGpwislPHM7DLd8Q8Nt6GjrSzHHnIZCLdHpo0QwWMxhDbQwS0tKOTl4ET0Z +88SKvRRaoyEFYvlZRZVkSVmA2QYWKJKBQ2d49r//MGIgUi7ucgJBSg+8wraVsHgEL047Haew +59C57o1D3CVRgVK/lG5MVa+zUF1qtIx1HVsrMOMdARwY2IGnajAPxjzTQ0GrGnHUip8YWNGH +2PVKYLZZRi2CNhdnm1200UcdhXSuSYVxklu7+DsLnuEiHGymfANhV01SMfRS1TrahcZVNN01 +k5Z3anVnYKILngiqDl7kdUaF/6lRz6tGsU+ssWhQlqCMNea40a7+GcX42ZBHfosbjUBaklK5 +RFqbB0aadPBlmKexRmZ1SkKs3jnmrW5nUHuG7qh2cCNmaIGPfmq00PBhWr0ZseLTYUBjvI+F +BLTeercAtv56c0bHDsDIBoLz1skEn3kIHqWaSO4Ll9D0O8002b1pzC69Weybm8yQ+Zoy8x1x +TTgJZwotggs2fuDEd2W88aYZhjwgGqdi2KvLNdZ8t5A7d3bRsDkWudoABYxyCQc9skJJ4lI6 +C0LSXZJJQn2bi32yd92Ql8NT8c5dOkNadZV3kAnYuNiQFKNJIHku2pVoEmYnp1HPRk3bxMUs +573NOUBz2+uc90YGOow4ShxFAMDJgkH/qQIJpmSxgNPq/hINdsxvHYVog+xKsiX84eQN3EAA +ELpUr/7dy0KBCGD9rsEyWg0NAAND4NESmDg6MU+C0osc9Rr2jwo6S4NZ1OL1HgW+zIHOWkJY +gAFGKAEkJAh9V9qCuG7lGRQBhjAoBNEZhhirEXEpXqYqSQNsp5PaXWd3Pxmiz0IkOBT1ATPG +m0ACD7a8BqYHII7bR2qedzEsbs8BW9QigDInMjCCUBdkCoMArERC1o0nYKpjHbqqAbsQkcgm +XIrDTSzCDQN4STG6Y9XfLoTIRmhmeCr6jpSa+MQFRgWKkKSiVQKiAoJgsgGZ1GTnsFckD3bx +k9jEpvgo0ogT/qGMdZfKjFPgEc6YBHKQsPqZ/Q5Rkhpm44YKCJlOcqlLF0qGl2Yi41KCKUwU +TYKRLhoNMh+pTElKLgUWnOZCw9hJD17zk50M4Sij0SQWqo8e81jEKrNDGPm5Kh01tB8etxEg +2+mOX/l0lTt+oYNApDJOTVTaQHk1UILGyE7LzITlsKjQzWVQk57EHkSzCUZtdpGPTDnj2ozA +SlOWTDzjcl8LzZHOnxWFZiMlAu3coBsiceiP2eCDuqzas8j0E4nDFKgCCVpTpVWleXfqyrMS +cMmFYo5RDQ2fFyNa1A/ChTO+GQeCqMqRWZ1FETJR7Fids69XjYqktdRbDhHDHHyq7PQcI4RJ +I9D6T6S5YnHlWdxbl1ZQuTrzWd5L7V2158lHea5rRNXmF7u4KEL8wAmOKMJmiLFYdP1mPFRq +Ifzm50qiGIU7Wp0XHXgDr7ACMn4whMxH6UbHdgjCXxVoCGiNOVrSFrRxCRBvXetqve0t6j/W +9KsuuMZX95LNqGjoLfysG05Y9EezcGyVpwQ5MzWpk6Q/vJYt7xadQFLXspcF4HKw69kLNCS0 +NYhwd8FLmvcsgLwaa5ZPPVfN2VZTc67t6zYdei2LiAEZZ2xHFFj5A4zC4hnevOc5BpnS2BU4 +l7Vry4B9aM+yKjifMosAADs= + +--Where_No_Man_Has_Gone_Before +Content-type: image/gif +Content-transfer-encoding: base64 +Content-description: Star Trek Next Generation + +R0lGODdhQAHIAKcAACQkJNsAAAAAALZJJP+SbbZtJLYAANuSSZJJANttSf+2bZIkAJIAAEkk +AElJSbZtSZJJJG1JSduSbW0kAElJJLaSbZJtSZJtbdu2krYkAP+2kv/bbdtJJG1tSf9tSf/b +tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAQAHIAEAI/gABCBxIsKDBgwgTKlzIsKHD +hxAjSpxIsaLFixgzCgCw0WDHgh8zchRJsqTJkxYdoCSokmHLgS8hqpzZMCbCkANxrtzJs6dP +mD8HIoAwFABRCBIpQIxQ0CZCm0wNOlWoM2jCBQiwah2AoMCABAXAik1wgGwCAmStqqU4NeLQ +t0QfFJB7FK5dog3y6t3LN2/BqA9VAhbYFsBUwC8Lr0WIYIDWrAgadx1QIKzZsmXREjiwuTPn +z55Dg+a8mKTiiRLmqpabWi7rAxJgy35wgLbrt31z90XQgPdQvRDy8tabwHdvookJUph6WKDS +g6d9WqAc+TFWyQO+FsA8WrRoBQTA/osPT15B9+5kL5Te2bZA67kIaLeWHTu27bkH8PZe4LUy +WO7egUYZdUflVUBdZcmFGVm1HThgcFwF10BT65FUQVjZVQfZAlz1p10CIF523ncKiFdieeFx +Rl6AaB1wAQYVrnSfa/TN1uBr9TU4VmYqjucjij/+SMCQGBYwVGXaHaAkaAlA0ORbAzSAlEPR +xQiABRX8pySSXjkGmWT+MchieUsOqcBZn5XllQURtGkBBWz2p+JmIJpHwHYZVSnRaRFQ4Jp7 +q6mW2qC1FfqnXCAquVmQQDbKaJBpkhXlcLlRCpdeT12kp0lYVnBBZJQpWRxkA3rFGXgHLAAA +nAMQMOCG/tmFtWBZCmRHGZJnhcbgAUWiaaSVgRlmUHzxuXdjoIeqpuWijgLJWZEZVqboZZdt +l+KQunqlW17jEQDsQpuKVRkCCXTYX3X9bbfdiGVlZ92X/1G7JJp2rshZteV+Ve6mbIErLFAN +DQbXgXdFCpaH4oJoJoqahSepAhhEjEEEFlR8QK1fPbrikAaHZWBxoRaAEXMm2VQYArx6WRxW +91aXXaJobnZAhlx5eR2sAyh6b1lgyVwZx7OCWGRS3z5kZAM5j6ZzZwzf6+NnGkfdrJ2f/RcW +kmiB5yphRfekQGOaYWxdrNSZRa6+CeecqwKyitejiAuOdXDXVAIMUdLMaiwz/gEa8K1A391e +y3HUcyqNr9DlFuBX3VwzTndCORPQ2Lta9fyszbB2RXnC2yF+tViq2p0pQn1KVHqeFFkG4MXX +Rkqrw1J3yzqjumJWJIYI+Ps4Qs9N1DtBA7DN1cyOlftlrBgiDzN3JVLdYqItiqx7RfwCq/p5 +A2SwwATZJ8CB9wR4EL73ZJ2pJOHOi8ozktPyKv23g/0rEMWoJ4dQAZtRByp2/Hvof5JmkRlY +9AUgEG3kgCNBoAITyMAFbiQABmBABCfIgN0dhFwBDGCPGqWBE+mNY88LEc3WtTCOXa0AoVtP +/KSykBUqRCm/awkCJ7C9rNRsMlpaGtSudTAj7UhE/thSn8gc2MAiGiAAFSSiEou4xKrE6EOf ++5y8TqihrZQqZqAhUwm3lAAaInAtNFnI70g3EMQQpIlMbCAF4xUabHVQa+dxW4uyAkElHjGN +aMwjHvfoRCuRK4o8w9f1PAMpXrkvO3pcokjGOL2C9C6RfIykAy2gno6wyQIA24gBNhlBBkjQ +AAswAAMlqEQJBuCUqEylKle5yiMe8ZScnOARGaBKV0IQlRUsSWMguUCUdW51q9ui+3YpyWJ+ +MYEFWGBEFMNLYzqzmXkMZS03CcFXutKT1IQlK1/JylZ2c5qfrKY2bcnNWT4EmgDwyhJzJ4Dt +ASBm1FpUvlBoTMmg855F/rzJM/fZRFkGYIGx5OQtU7lJbNbyoNwk6Ctp6cpsDhShqExoKyUI +pwtUgGIHUCg1rSlQbRL0lrnMCT/xCLIFqAQD3GOnhxCgRHri86UjPSZMl0jLb2bTodXc6EMD +ulGdTrSmNn0oLG0p1G06VKIEhYACNkCBClBAAktd6gEMQLGCCrSTQP3oUEU505h6VaYjEUhX +x/pVjoDUk9vDJlK9CctwdjKW27zlVQ/60XB2k6jVzKpR7frNvt51kwtw605zCkoP1WxcHeJK +Y2hGs8kYyVbY4RCYbAXZc93whpalYpcUuFjHTCCsIxXrM8+1KgBM0JjS5KkEV0vBCW5TrwxF +/qIn1YrTac6VnEUdp18V+tfZ5jaofZ1gWlkbW07uz0iTAdPkHsu/mn2lsTXjEGOJctguNbd/ +7rIVf7rS2cnZkLuXpQwkRdtEyzq2VAM4XWkjSMPZMoCG8A2sVSMq1/ri9a5ylSZD3yvf+9I3 +oPYNMH49+l8I6jWnat0tfSdKQxye5SzwjSAKEysW6lQGudDFzoAuK5nIdIk6L6MMAB5gUYtG +4AF+AkB4OxQZ8Gbou/9jLmbRy1I8ftiwkiWbYdH7q4a8l6Gd3J6Q3TuBhgYYt0iu5gTIcieQ +nZAyPI0yXJNM5QIjOYKBxeZshQxfLUtZp/715nZABTLHTobDaL4u/maV+9iwxMeiC3jPAyJw +0Q3U5royphlW0EthPZPqf2RLbH+sGGMe85h/C+mjaC3I6EaXpnqLMVlC2oKTSoMEtPpUtKM3 +/ZMq2a8nm/p045wz6tJoetGcTnUjKwSB1dQoR8miy6Xq4hAXslAhkmYKpPVZoQ1lTnm/1CCL +2KVqKwlqNsZ6j5wBJZ/V3GUvv5GQlKB9HDcT5dbQmYioeXfpoHDX1zkeULxmxa5hm5tJFSg2 +SybdkFbTiEb1QRazVaOfbeVlAg3Ad2/2DW2C1aUut3lAtCm1FwqNetffWkC+qni8W8FsTHIs +d+GYFkTR8Ew9YPwJBG5ULPm82lD4sQ8g/oU9talV7cL15ousH9CkAfz7N5g6CcItkqXtgJjh +kvVfFNm4w/S1MXb2eh4G0q3ugzAlAoIy1qGOFe/5pGbcMSs50J9mHp5dykj/dnOFsR5zXKu6 +Ap4SV2fGtT/HXLojDnBABBojpoOdbzMYUpNnuVwZOHYGRMGz+QHYve5+EcTW2VaIwO8D66TP +SN46m7rUm0XxSCnO3nnRj9dlIr/FNBl/WJlAYyzTYsocbLHjVtHMwG1Dtc2LRwvazBt7JKoK +Z6dWLjHNSSjQ6rjQ+0DOBgvLWT7sQl7Ndl5x1fsGQoE+sb1zJQThzh7PlztNZu9cmzlP9KSu +428Pf6Pij+cV/tU06yqWcl5ZnlkUVqLzzApJbHuf9OWnp979LioxpFBhhIOAOw0aABdQAAUu +sJE25Z9cdKJ4AtgonhE3V9MirVIZKcR+Bqdud1IqC8Ah4OEVMAZFO+YY0VV2KCMmrUNIZdJ6 +UTR8y1R5CaFrLYQSL8Fki+c8jtJzK9iCFrdz41J1m5E7jzaCJhE8roJz+zMzF4ZYZvZ9fxZF +AnR+CWODMlch0SFsswMkXMIfUnQ+PaN45pZBB0MdE7I7oZZtCPc5VTQu2qdznCMuthM0meE5 +ldEQjNR3pPYQgFcavxd1FkcWXpEBB5AB2ZOHeLiHeUgv2EI7TLI+wSc0A7BpTrFC/s0xOoH3 +Tu2COdfhfDl2HZ4nJmoSNOWCemZRiG/Yhn8HausxSDsjL6J4Ki+YPraTL3jDJD0WI4Bnggex +HHwnOgqheTnXPxcWSKlHiN1lKh1zhs+TKmX1QP/kVbtDQExoHuMBOPaCiafYYdL1M01odydH +TxlnRuv3iqXGSzW0WNKCRXkTdDwTIHZyGQjAAIl0SsEYWoyWZuGVLuGHfDu0MFQzHmW2Rz3h +ig6xhh6Rjs1kVQywHZCCLSnCFdsTQQ2ERPyYQKZUTgaAQLMEUcq0FhF5QP6hOqOIRVoDjrZC +VkS0gEshEZvEkZtURPHFVenoXihpSg6UYMGlYGG2U62F/ldJlkqnlhDl9Vl5NAA4uS4XKY9K +MhkjxR/NJJSRJBEcmZBEhJKD9VFrtVVI9FB8tVYy6VdHRAE25U8cVV8EBks2GYzFEVYOkG65 +o1KsM3abpypoNCBImZCwuJZNRFdDRVgaNWW/9VZNWWC8lVB36ZRbSVAIMCgUMHRDFwEvcmIF +QFgN9ZAGFlch6ZYMRIEDUF6F2FXk5ZhHqUempGALZmA39UnWZFtyVVsTtZdamVcuGUG/tU1W +uVuf9F45ZWWEJQAe1hVIkligAlnad1w3x2He51gOxBXOVJmVCVbNNJzFhIT4hF/kZABddpc1 +9VZI5E/KSZe61UqoOWARlZl7/iWamnmVoOSZUSZXLeZmzlVSGKhmONRd0QVZL0ZZ5oVm+qNw +lPGM0SJdkhGG7LRPxrlO1mVdBDFbEwCgBdmaDJBaoQlXLllftBRbQFagrNVR1glmRwZcm1lX +CIVV3Imd3yRBw9VanskhyfNcjjFh2seOItpczxiEf+R9F2ABagZi+hMtZyaJGlZoLpVG+6li +/tN5hpZYC+FJXZaS8TUBg0WanslXqhRYBhagEKpb4VllUgmby6mdcuVlVMZJDypl9QWPc+Rc +4acdN7RY6MmeyoWBtvJYGWNnYHdRBQB2SHcAFbBUFIimzhWm9Mlc/3OFRrKjHNGbgJZzhmaj +GQIR/ljFX8SFoUQloS9ZSxMQFm4jaLHSM3QIFl92WxNKZWg1pP0VZb5VnXhJoah0m4KGouw4 +ptx4ppuXONmBNM3VAC6aWKWagdx1LlnxWO+CXTqmP+gCgbGyP8k1n4uVY5IhUvuIahZRk0ZZ +dMq6rN9iacYKWsh6EFURrcy6rNd4g9XKa9m6rTj4ONumiGwIrmpBrdxarqtWrfoYe47jd2fU +lVRhrvC6GHYBb/Imay9XElXiQptoEPu6acdzXl4Rr+zKEzgCG8lmsLFGbwQnbXqBhG64iPOj +HKVmdBCRrjFCOV66cz2JHgLbrROrEEfhajkysoCibMcicC/3cl23F/Fz/q3fyoARQa4Y4V2P +MVlhEjTnlrMdKxII2yAm63Q+a7ByBnOQF3nCEXm4BxYMexcNuK6y2GjO+GsOF2zBJHE5myY7 +CxHJMigh92pK1yB1UbS7wRcMCxxjS7ZvMX1Nu7YmEQHa5Wu2CHU6dLV0GylZmxDzBm8nSx/M +RrR8UbPt2FhfgrIDIxq3EbIpyxs1oW2siCQ8OFk8B3GlCELKVzsJQHSeqBYvwbVxUSwjayPK +5iDvmHplaXIVJzTHMRz/Bk8HMK8OknK7RjLXShEXsnDgBqnipxlWu7uE1IGu06Kosx4m85eA +0mqfK3Lz4XHvsSNZNICywzaJA5mNkRd0iLKi/qKyiott4to1dFabNNtw7/hD7QOO5rZ4ljt0 +I8MQFrtuCBcfhoKwX6u3TacsQBSNkxuQk8pdEOByUTh+bqYtC5CFmdsTWGI1vQm3Mya3HCiN +d9e7JaKMZ7IrslMW6GsVLfEcp0EyB4EfseazXdts97E8G+S8JjeOwyQhqjsZR+Fy4AVzsaiu +FVLAJwQtKPRdXDGGFrk0KaIwfLMgSNInfZJ4lXsvdcIrXVEyLzyCR1cQfyJnINfE9WoZTEPC +sbNBAsR8kOcbASzAMLwnbJsnETB0tSst9td5C3B0qfpgaHFDq7J2E6YvHBMiHIMBB1B8GxGY +BfA0aJE4dAh9sbhr/vg4eUm8KoN3bAl7yFI8wqX4LCFSLbwCFnDEwGRBcJViIIX4xSnxtBAb +EWCRFVz2MkbsYdqxGfzhpjDEFB8gcLcKjb94FhY5xYH4ZGShAZcsEtsWP9ZIgoXxEijLwVGc +LMuiyHo8yZglgwkjx84yh8WRG0zGFd5irpeXODQkbi5zRefTMYN2u8bYIqKyKGmiRSC4cLCn +yeFKgh/bOLPLxEdir8VCXTiHPDwijysCj5jRKhXgAB0wEh3wAFmSAODRKgEZywP0MWrjH+Rc +bPU3QGCKPxRYq6NclqyXL5JFerRphP58LyxSLf0BFh7piYCXiA2Rui/HM+5yQajCIEJi/r+P +IsymG4piQZt7iiGa+xNGDIVC5s9Gch2m4od2AoSOiDM8Yj59HBbKZ4YYUi5dHCwvARj9Ws4Q +ISFJU2Gi0qY6iD9y5M9NQ8VS9ywGWC6a4c8i5mgItwB7TJAI0Kjh8WK0OW4+fauO6Hm4Az2s +wyt398homMSxW0Yl+LARMSlvF3HfKI16zNJUfB6cs9N3ciYd6xRloSETwDHuUoEI48qb1zmJ +s4Fjt0XDtj7iIoKCfM5OrSkXAYAqncwj7EGCM8WTW3HLlzY+VDXwCmkXUy5uLRlCQ8O3AiDh +gT/3ci5OBnVW08mL+9nY2hDxLHX+IXqfEYHc80v2stJUozPz/hIvVyghFsy4bDi7z0EnPKgV +M/MfXEGLoMIlvwQ1eNeNZaguAzTAGYHBGSHCDgxCk0pyVQzdhrMk0DIqnObeoG3OsuhCdOIV +1oFC4Tep0OVwUITDds05nciv7peE/Z0Q6/sQP9R4dW0Wb3S/f0iAgXjbCF7LzFo9klZaABAV +N9y6X9JigCo3U2s5AdLVdJgp/Qp/6bweocfaD8iHe3jWC8ABA/A937OHpJiRAV2Et7PHASvW +eL22+SoQC3AmyIUVnfM1pee45qIwnOF5ytwqy9fRKNHUm+wTD9cdT7ajhwXJ5ts6cYN3WO4z +1KhuYG5G5WwT6/JilGPDGoJDMrin/hepJkT0tDKrrLKCJqSr2s57Ma4zfhnCw9GNdw5bIYPR +loDB3/k4EQrH0GmWLmMoKf3Jema4KwaUkKfkSeNlQVSLkeXxN6oOOH+zMTKjPrc9OaDsk6/e +ZMC5GLZWfAOBSQ7A3xM+Ee1Ei+0Yheoj0F8Beo5cv/X8VaN+lHTzR+LLJBeOia6X55FKcVkN +QlfDaOsXRnotQ0wkZOE2FuI4Oy6txt44JNSyT6d0mfbIaDH2vYB7XomSRfKcNcuoFfkELN7u +SCQurg5Q6gf0Y6BX3vFtit2xjOVSZGh0RO6OThZU2Tis4Ol+70wmPIgUnCUB5l7HHA/PQLHE +APXOLKvn/oFuoySOIVsOZJAfLwAsr5+7c8yfbkhRh4woYkiaA/OKxO//0vI4Cu4OGVAir0WR +QaSknkDDyJEQxU3g+ZpMCVKYthOQFIfcQW6GzkMbmZD7WWOdpkBcVpCVGl8ztZCh9GUKhEls +kkavVERICpct6U0MaVWKCZu4hBEOlEzOxE6NDEw8DTTc5VW5SUSvkk6TiaMYsUkBb5mmBfaK +n0f2lWB3SZqe+vRD5VafiVu4RK5Tr5N7FBkI9GBmaO6xgpbFBIHEWEzclmmN75jFVZpwf/mj +HpWMWaFuf5WC5aS0zxAw5UVFVIhYsRFYlIv3l0hZsfrj5RQ+31WxpVAs2ZeL/iqXuHRUs9+X +q0RRbPJXPuVTrl9N+0hWAs5AhchO5xOBr+JAm1cqyZ+OmWT8o8RRiflfPFWX0kn7/mVLmQmh +UVpOd8UASoViYIcBAHGhAgULBzYYCGBAYcKEChEyRPgwwMSIACwKAIBRY0aOGz12BOlxAAIE +GhcgGBmyY4EBKj9+vOhS5suZNWnGpJnTpsuJFCVK9BlxYc+GDiEyJEqRAYOhSYlGTIqQQU+g +TotStZoQgQQFGyhUqGDhwoYCESJYiKDUoVCFU51CVahT7s6PLAcUQImAZYG5fen+vQkYJE7B +crNancq2J1OjVdfCRWrVANPDFCNfvSx5cuasCilE/kDQ1LJUhwwWTJAcuS3HBQkKsCwJckHN +vCNta0Q5MrZf3oV99wbue8LppZsrRxXqNgBj0VEhLqz6dHnzt0+pv518/fhxhwsYY4XscKRd +va/zwl6AV/3d2ncHjK+dG+97kvPdk7d9Pi8ABK4HbCQssOAGDImlCAj8qLHnTJtgKc4WQ8rB +ttY6jC3ouNssOqyIoqzC7DTcrrLSvnusqO7cq808+FaM7z3y5suLJNvYg28v+vKbEb/X3rtP +LxTdW+Ck2RD8zcaUAvyLOeaM6myi4qIbqrillvRQwdEeZDJE5bBjassQQaRKIe+eLO25BXhM +r70dT2pRTfNg1E2v8848/m9HHFtkDyXYfMTxTCHtU4/Ivlykb6/9LJpyyrkmaA6yL4tbDino +lvKOws4oDO+o6n5yTqlNJ5MwRMuOm4q4JSk8E7YXSZJTzzbHUzG++vTLLwEaX5UPpTRllJNH +Xe8EtoDfCuyxvvtutSjZqUxLdLjhupzQuUwdBQ+i03xKiIEGqbxUwWkr3LBaL5N7UtQHnzot +XWcTnUzGuwpwzTX0ZgXWRzhrO7PQG3ecT6ALLGgAWH0HSJNFBOgk1EYYjQRO4bvYTNi98dxL +tmJEtTU1UXW9e67Eb8F8aIG2lhszyysfu/Db6q482UHpQNUOucSmQxmlBG4+4GZ4BzigPzpZ +/pKXT13xw/NeX2vctwGD/MVAILMKOCBW+/Kbj05jjTzv2HjvG3KlG48leGKHx2bPYrMvZjDj +Zq8d6mNNFxsK5wQomzLlo1B2W0NOv2V2wUSlBPVUvO92Dt4ECCBUPh6NRBjXehfmcSTXNlBA +ArAikOC1CCrAvKvKGz/6RjYNNfQ9eW8k6Wd9ITf0YLGPJZvoZCk4u+K0Ge3Qwm2D8pbwaV9z +LWcCDiCg+Jzh3RnvwfOuFqq/iXNW3eymbIjKTLd7KIE/bz3aXcdflfjW0y2goAEEHijgAQQg +IKgB87sXWLd8AaXvYKLvXC//kYS0n//09j9Y/1oXn9oVMDGB+xu0/qZ0LUn5zoEJGUDwDqAA +AijgePGK1fByZivlYcqBa1nKcFCmpLtNr3lfSg3CdhaxOBnteznq0elciD+JvRBiqAvg/2LH +HoVlbYc/7FUQj2Q2mHCkgEY8YhKVuEQmNtGJT4RiFKV4NgdM0Yq1q+IVtXhE2hERibXDSEy0 +GMYtltGMZ0RjGtWIxShmMVlVdKMWI5CsOQKgixYjIxkJs0Y+9tGPfwRkIOMYyALCkZCHRGQi +FblIKA5SiY7sI4C+iEQ9TrGSjMRkJjMJyYpBkpOF1CQULznJUYbSlKfc5BLrOMVPFvCOTVzl +2UqJR1mi0pa3BGQrLaZLi3VxkLwEAC9f/hnFWYKRlkcsJi6V2UZb/vKUnoQiBeI4y2Qu05qa +BOYWz5e+AkjgAJlDXzjPtz4EHNGZa8zmG9NYzWu20538gQA3H/DNbh4gnPIkJ/ogQE7z/dGT +w3zlJ6sYgWF68Z0HRWgTBxDObzbUm+Dk5j4lSs59us+iDdgnKltZ0GSxE5P+yxHyMOiahB40 +nvqkaEonKtGIqvSiL3WfFh3JUTqa7TOf2SUylZnDANZppCJNwAGIN9ThlbSM6VxiPuW51Hs2 +NX32ZKpKEfDSYFaMpr00myGzykUmIjWR/nOd4uIVVLIKj6hnHV5ajSpIs21zng91aEPvCU56 +zlOcK10fTDE6/lW9TtScOX1kEmPZztTxNGtjzVliD4dWxqb1rGvtYxy7+VRvvhWqc61rXfEp +0b1C4KWeNZ/7QLvXBPSnAHiFgDot4sbBsrGRt9SVYcVmOMUmtrG3dWxuIbvGyi4Vrr+NK10h +ylm9FteioC2AaKea1wbAqz8UFWwwA6raAtbxqh8lmGzlQ9uyLja3uAXv8BKw2yUC06l2nSxw +H8pNcFLUuO8VLXyJ6z6pbnW1ZnSkR89ogRjxz03BK2t4BfzdtAZVkV5dY1PlWs/M9RZ9Dk4f +P+E74Yoad77FTS15mRgB+WnXdNwVnncHPGINJqAC5EUwUyl7WRZDVH0VLu7GJsDT/gVYlE3x +xOs9WYpavlb0bK0FpTV9RWMcRRBqQSUx8SpIVOMRGK1BvYA/Tali9D44uJOd52ht7CrEkpUA +hwvqrVCrYtsOj8fEpa5rAXvLC9gFrI0DnpfDW0E6U9DOdR5xzjin4SRupaUKBm6Vv8nXvXCX +wMa785cVvSPzjfmeQiVAVCca3wZU9b5qtmYFnJtdkG63zHMuXvEsSMFDkxq3UEYwIVNdMR2v +j73BtadmIYpBxaa1zre+c6KHGjQYxyexUBsAaoPN13420Y3QtO8fOawisPrwyJAWapKdnNsm +PzlqaFHmqi1yWVdbdr0Qtuw9u2zrXOPa3HbeNY3eU1wE/kRNfQQgZ0uommxtK/ICQeN0TwlF +aznbetoC1rWT9Qxk8vb2pLB+66vhir5xK7ncDz83niNtK7zEc2yHg1q7pRrTID+x3lq8N42a +vW+gRq22CbDg8ND9b3ILeIP/SuLHEZleyjI41gxduGblBm2I9zzi6I4axddnZAmK17n77Fmj +K51TrR7UAoYjD42vJlKqy43lZ/V5uR2b2ApgYIsy32I8G0zzyrbYofVk+LOHmvWf/5x4QT3t +0FmKQR7jxaKWNjbek03IzUEdh/4tMtCe3e8lO9nU5daAAiBe4AOAhZlSJHjezTZHK8/1qZgt +e8LRV+sJtp3tPv/yBpm73JUG/nvY+xwJaKlY0r4juYb5viHwBq/BtdNZ0UrGvcrFe4C7fCYC +e+l8yqFWAQyq8bpWdKQ8b658u54d3GoXteel//AJCjXMFaevRZfb6LxMeulqBvverRgBDABV +hoVVYc5yHW1qKz7Sule0zlxDULSYBS2JvYuSIw3pSLfkj760mMizI0xTPhfDssuDKgMEMN37 +vOmzvcIbquMZgNCysJQSLb1LswyUovCzmAq4N6CKNPTIjxyyI4IyQT0xKw3imQlSPOSxEZ6L +OA16jS+zizMSwMc7otNCwAdjrx48L8MhNwdsQK07q+OZsB7jq0sjLwwAC5FKNxyhnc8oJ4so +qIGK/iDX0IvDqSC4CyoFgBqzoB0MIL8DoID32Lodkb80Eqia2iIdFK7Lujwq46agYkAhxLW3 +Uyzq+y7egy8LxEG2aqKuu7fWMLL+859C4z9Ssw3x8q/XUD+4U7IHqAAFMMGvKICUi0CdgZcN +GiJM+0MNrB1pwsCKwbGa+8EfLDo7TDku1JmgIyt5gRdEezK7gy9TCyxt40AlIgBn8Y/yMMSp +QzIEIKiM+IDPIL4JgD3T6S7hATbZiz5Se8WdicXXSKTp6qqzmSjNk0NxA0KHazujQxoMyq1+ +qz2Vy0RbMa7O+zI+swicOZh0KQ9bCRvTyZmRCLUBMEEA+IALgD3XiaBM/jw5s1o/xnPBCPJC +j5uiwdqoJLqjuDsvt4qwn4I2x1q8nNmueNEL3tuL0jqYkQo+CCTIBNCrAkAclDiA+wKmXDyj +C3qNIJkAwcsu05I9oNE/oWpJqSuPgESy0FssUrM9LlSRSFuk68oimhoklhKnF4swCFgoaZSX +T3tGPCs66+O9lrCADgCADrAAi/m0gTxHlrgonhFLauSjpvMj+SOUl5SY7XHEnpS4m2y2tuQ8 +gVQADQg1Czq5oNEZUDq28jKnOUqnT4qllHqxfNKTn5JIt1y/mxG1MGNBC7jKrITM4rmLnqvJ +AsNI9zmdqCGA2Vgz5EukAfBCeTQPnXmPk3AP/iRjv5qURz8hsitULMakSibDxF8TuqjxP1YC +ReuqmMi7QawSRXiSKmiTF1spyQGoIJ7xsjtkQAQYTRSsINgQqgYssNBDngm8Gcm5mY5DKAW4 +mfTYNJvMrtSsvUSLlX6cn51kRcXDxHGMzfzjvSkERU8MLCW0CMBcvay6quWawCtEw9lAC4JQ +API5SQraROY8t9sawiYrKyfUyC+7i/n0o758rYpBgC9LlQQYDue0ldFRzjpMOdRBz/o4Mp4M +OpIESTB7T+CRz8+8oqJESauyTyU6PkLDOJawIwwQQwrogA4gKAxwj9C7wwUl0iIESqixSQi9 +xoOClyBpjYOZgMXa/p/xkDNMLK0RFJJ8y0KVU7xXtEk6BMhohI2vi6YKzUBHstECg5O7QDJd +I56AU0XpO8MNckHrM1DPtCazdFGLUACeiZ7hQDksNBYAC7E+yaEO+5/YZInW6DyTC9MTZQmV +ZMgZlak1S64IYjlzC0JTA9E49UoZvJmtgRcKMjl3WrULhcvTkNKw8ZGREh19Y5N3HA4Pnbbi +WSw6ddVKFabfRKMsIgktHELatD1hJVLmJCr5Eyn4NJzxMqU1XNKKiZpFRYAZi068CCvBe0Hi +mR9ptBlI28T2ZCxIA8qtqU8qdKJUk1SLWEHqLM9baz9VbKxoxCC7QLkt7KRUEr9rjKNI/ouR +zrNWP4kYR4wa8LRN0zFH1wi18BrXnTkjpALAe6XQLUpEz3u7O7PL9Us5eN3DaITU/sQZYcEl +DtRTAEDRf9U3PiHJ11BZWAzVNqXBwym3DVLNhS0tJeLVe8XZUQzAPZU8i/lHb7TMqNE6LUys +LVzQcTTRVuRWjmNHKzIe9Asr2yjNHhE8TmRT87Af92DGnUOeaM3PXtVZ0ESqD23XclvUrh0e +GRlVhGVXcD3DjxU6z3qniM3ZfGVDAOAZBYitkfOPoOEVfUvNkqPKZaw6kJ28mANFdMVATjq+ +JNrEnQTan0RYnXnXYhW42ZSh08JTU13cTyTZ4UFUnuragQXc/ra0Vaz9ny4zOaozXDOlz1uC +TciNvnGUG+/sVMsEvWpTVJj0zHRtVnMNzleaI+vbW566QnDMUnuRxsKlNaiputysqo9zgKsK +zgltojhLwWFlPDokVTuMyk+lyoIMGt89I1E8J+401xw8UdHNWuCpIRtJzMRctHlVJQltosY9 +opuFonaDvurburIigItFnAwYAAIOsO+NQSMNuncJuhbFJPLF2euKgPS4GagFWHt5l61BzDC1 +zpHaTkrFO968W7ut1Lrl2SNi0yplrAJmYQJ2YRZ2yY25xCXDXTxESyRzrnfS3/u0KYKr3jna +mXY7zXkRq+y0FUIVsY2Nl7dj1h+z/sb0TSQINi2BPNawcVKCSQAOIAAt9gAC6GIPmM7I1UNb +tc0dAVUHPjC/5OFz5SIgc076OIniBCAMnpEFPJ43Lbxo5MkmPpuCmqMdTqj820njobgXzoAs +RmSanT4Fhju8ANMv69BmQlzxG1mcuq9YuqMbhdoJSh34cJeptJWJtD7jtGHtOdw1BgBAPir0 +NaP+kF08FNH2ANOjDdNQNdhjlceQ7Tj9hSQBRM5XBSvei0va+lLaAp5aU000Bk0QXuU+EuTt +hUrvgtfaHGVgk5zLFKq7mIDfveTexCoZHWEpQk4stOI46TAAij3Rkce8IFSqbAmdqBh4pqRJ +Sqidm81N/tXYY8XVfWHACeLCzY3iAiKf2lklXUo1lPDOK3Uc2Akf9RjkpA1IYREUl4gIebam +wYNKXKvLunS72hzX06TH2fVnssLRRWqtVXpYvvw6VsHIwOva7hJVdZtOMu6u27PIid6IbBkW +2D2577KzjU68xONUfRbTTj5eb6xO4nEugFYkS05lKE7cE0am0zjZifFgzutg1Nm5Vnzl48Fp +J8Fpes6k2O3Kj1w5OdvdvXURkhRWilRqednmQ/LjELapDUxpWnKWqI3H2QMzc7QgDIIV1X27 +7U0AQZmIYfGLU3JEqtNJzmzQXjSsjfQ3d71MnTmNRCpoMg1MJMlrODvq23Nr/rwsTowebP8t +KwJZjbCeC9iSvdoqyHkBvNRM4upbuY+EZJccjAfuXBMmaGOaCwZxF+xFK8qG5BJlrFVMLAYQ +jABA7OZeJqmDmKKRbVH+XkhDN47smiLioz8GwIGCaidSyKd2gNUOCaqmk6mkyApyv//16epT +LJGhi8NW7Z3GpflhaNmTX6xz13pNaF35C1WrqfM1aN/+b46YElih7jpTvCIkVjw8GAOoCeae +77DGJfxmbJp9Zep7U7v4D5lAEv3STcGsrsWd8JAoDTsOtQCutmlzPdzhCeUu8fm2pSy88Lwk +PA3POBztjQ9v2K8d2RFvbtT+kFnW3uG2IIJZgIR4/onlCHKZgBQn4QmK8HBbukIk1snJTjTx +cpHsFgweFwBldt0x6qgmT+yOmB6HmGH322jQhVIm94jJIHOQmBmo4J3vUA5OmQhJ+iO/aA0Q +W0bZZU557HAKlwmmntSv/eYCivEud4AoC6Ms0ogPGZG6WRaQkPCZ8BJzeZkwoZLcIRwoj6TC +kEu0JjyRDsH3WPQA4QuxDkXIi+c4L3HymyMB2MrxzghIN/DJWACNSIyXiBnsSQ06pxnoeIjr +6QkQTyLc2ObgKKdQxeobN56emQ+cbt/7yKNVDwxWDts3Mom4+A0x6YuNmZnbERmI+JsRgo6M +YAgBkG85/3UU0hvVwJSm/jB25rainBiAZd8JZMQInuHrMhtWaS8nAvkfutCTd66JT3QAb49x +A9B3ZzGARQcOhoCWUUkNYHcMeVeQO//0w5aiudBmmzgJ1oDoKi08veDy3jgJAvHy3EbIMZd4 +WP8NjpGIOaeZcFkZ7sCSMJkQqcAWYc9zVq+l3mAJucj3jNj1aFtGb6Q4hPeLY5H5Mv/uXYr5 +qneJUMl4K6F4egcXTReR0hANu7F4CFciIsGLnOCLg8kIaKutCeKXlJ8JlIh6mC9w6sJ1q5/v +bdkSYQd6aWkIy/gOlukUr2+SnreOzAAK5Vb0IOdIjaiiChCAtJ+NBRDlxPqf3Yh7rpn7POry +/sXH+zg/oLqRjk2/FCfpmGrJ+UcxCyz5EJ5XDedQfFoK60W9dUf/jw5HzibTIbj/cqj/fM7f +8aHffDL3IOt4cpx/G+vweddHfot3/rdgALPgHM0I/Ksw9op49RL372DiR5TAiCvdC97X8eEv +8+Ag8N/PCOXJFgvpHeN/977/+cNvfsTvDAaAgAOIAH/hHAvoimIPfEsBiAAGBAYgWFCgAQAK +AQhg6LAhxIcSI1J8mAABgoYAFiAYsKDAgAILJjoMWfEkSZQqU5JUuBLlQgcvWc6cycDgQQM6 +EQ4sOFAnUII9D/o0wGAn0aRCkwa9WZToUKg4ox5kAOHAgwMRKmDg/lqhQgQLWHUe7Rk0wM2B +TnNWpem25sMBGOGafNvSLlyYeCUujJB370qEbKPuPJsTaNCfSgUyKLtYKlW1ZpkuVuxzsdUD +EhRs7RqhQIQLYCFI/lkY6FqpPgGzrggSAYACCWTLRgCywN+ZLlvz1i2zN+vKQy3zLH4ZsWni +UBvjVKp4uOnHwoc/vrqB84UIFK4/wG4huWCyqQcjZAA8t8OOHUMOOO92N3q98QFQ+D1/pvSq +BpH6dBwZsVD8OcdcfpdJNV5+hlEFlQEIaAeBAhtoRpYBFHxnVHkLILiUafe556F8H74HHHwi +QlSgUmsZVlZhTAGYmHRGLUgZdM0lyN+M/kQxEAGKZKHFwARLHXeYURANMEACIXU0UkMf2QZb +kwgscORtT8p1pZVyNWCiQyWWWNGXXIYIokMTNCZgj2alhZaM1DH4nI0HHlUgcWqhyKabd954 +EwMa4sghYnIVsF6Sg1I55XoigYQlSBcdieWVR2Y56G1KQgrliBGFqRGJwHW0aW+NAakhgXeu +5diPADoHaI5soRrjcqZiaKCeMWJopn9T8SSopQgkGalIGFFqZaIFDHupoSFN+WilhqoHrKTG +/toeXAt1Gt9toOa2QGJGjfqqrf3tdBS4NBYXmYtrPvYfiuTWWiuG5CL3XGEdXeTsr4nq++iz +SD56Kb+SPkkp/nsA21awr0pWeiRDUt62AMQLkZlblQNQIOKacP70LZo6EiTqjyy2Ch66zs1a +ma4b6shcq+/mxOeZ88475QKOqmesXOoNTCyVxvK8pLOLSkplr8gqaduvH1mas6IeOTmAh9qS +dHDFUr8Uc8vHeasyUltjPfKL5po8clJzoixqxy4zdROuMtO75GyMvoYRRgYTHLDO/R5rG84G +8+qRsYN2tGjeDnP06EVisoQw4RYrJFBr3Moor8hpF3Rm2R8DOXmL08E45IyGqfbyuiFbrnZ/ +AbSNWMY6CTs4pEjS7azRe1+57N/P9v0s74JipLRHVBIrpZS5C8rkXlYzVDHViS6U/qoBcE3Q +osZFISevx2Zt3Ke8orv4OYcoZ33ZhmrFjHqMbJNaOWKI8tv4kbj3PnDReSdLe8L4Ayzw0ev5 +nrP75peziZWkSsJiT9W0AwCvAYkBDZnAAiD4QG7ZCE7v4tN+zLe60yEnfBYUm/jQIr7JuSxr +6psei9zVIF+9ZlEfCaD+bla/271vaPkbWgTsFj8XJut/HJlfs2TnHgT2L4iEK4C1AICWCDYm +ghFsk7c0Ni+eoKl6BojgYBooMlvByIqwohXoEGQakL3LhAaAIBrXJyNESSskfXPSegToxhi+ +TnhXwpmhRBOBBgBRX3X8V++IaERlsWRTRqQb0RZGNQBE/sBa3mJin9KIQh+Rp3oJ4hAFyecn +8EGGeh6MEwiPUyqtkfFOyiEPBJEkyTMxoHh8mw0s39i4QM6ShgobAAQGV6iOiEaPfERWouSH +pbpRjYj7ew1djPjDRBZMkElciFEgKKompjFXoPvkKVWDvWieL3RU9GI22QLGpZiNlJgzJY6A +wrtY3iYBB5iAz4oVOEAOToD7utmS3qeeJDVAM72swAWy84ACDHR/kfLhARXJKPbMplKLu1/B +3CdIZiHQNox8pkKiCclpjkqagKIc56yZH8mZb4vUSY4nvbiqcT4nk4dBWzjH+LUpBgBJB5DN +AQ7gzkLxKnA+u10teVdLgR3s/ki5dKMEMHAAgAIUAwEFgAQ0Q1D//WyYieqVEWnTUARGhHHG +ZONEB2kojCaxMdXkaCSxeNJPVmZDHr0i1rA5RXCCEJwyMmf35jVTmX3SVwkgwAEIkCQZVipu ++PSbHBlVVF8dQEJfAQtovhIBzTR2A0c9LM/ACtGe8XShR8RqRYNXTLEK8lNkTaKZHilNtD4x +PNgM3+XO+BGdKiCwBzjSXFkVNpXC9rU6wVV5mohWmLotpSiTzWANW6XlHg6xfhuawmCnAAlc +QAENkMBUH3CB7ihAAQ9oQOwUC0Bm8mqXt3Ol8JjXrN/1NKxhfdZpn/mtAF3xrE7ZrW8/ZhTA +8rcA/jq9KSxxW1y+0rVO4SPXt6jpRDSiBood/GCCZkM82QFLqPZE7HL/RRtjgaUB3iVoASwQ +Aex+V382NNQPFzbHJRXPvYpc2DJdLGPaxVe+Cw7pZM4yYLmS5SMKAKw7qeROwP5XqwPuYn6l +KKoF35h1dz2XJ9F5EEQ5bIaIvLA9MzyoABeAAntsAB/BDOY93tO5Kb6qR+oJQOJddZCifY1c +OCJnkRCtX0+Db42TyBiO4pijBrKkkKpyxtnklABalU2vhpxTYx05yfTt6CYbTC8KXXN0wmGK +K3ep0Lo5N8vGRDTzMGzlS6HXhmmWM6eDSN5lHq5SBwTcsuBcZTrjOc8LSrkvm4YLaTSy6Zp0 +JQqSdgrYH8fyVwX4sWBve2QpUojPblvVGHMc6NJB23edtSF6sfzcheFR2xSNIaTkHDvSHpJo +0CK3jI33rIAAADs= + +--Where_No_Man_Has_Gone_Before +Content-Type: APPLICATION/X-BE2;version=12 + +\begindata{text, 269602880} +\textdsversion{12} +\template{messages} + +Where no man has gone before... + +Click on the "death star" icon to start the animation: + +\begindata{fad,270222644} +$N icon12 +$C 30 +$T 30 +$L andy12 +$P 0,0,20000,256 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$A 29,24 -1,76 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$S 216,264 +"Fire!" +$V 260,260 417,242 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 321,186 250,158 +$V 319,193 265,172 +$V 316,199 290,187 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 321,186 187,122 +$V 319,193 215,141 +$V 316,199 232,155 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,102 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,102 +$V 198,102 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 241,145 179,117 +$V 265,163 179,117 +$V 316,199 180,127 +$V 169,120 163,101 +$V 184,111 188,89 +$V 163,101 172,115 +$V 188,89 190,110 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,108 136,162 +$V 136,162 137,176 +$V 136,162 131,162 +$V 131,162 130,177 +$V 130,177 137,176 +$V 131,162 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,108 +$V 198,108 199,118 +$V 199,118 138,171 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 246,158 180,127 +$V 169,120 163,82 +$V 185,109 204,80 +$V 163,82 172,115 +$V 204,80 190,110 +$V 175,133 173,162 +$V 173,162 181,132 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 198,108 141,158 +$V 141,158 149,161 +$V 141,158 130,154 +$V 130,154 137,171 +$V 137,171 149,161 +$V 130,154 157,133 +$V 162,129 162,129 +$V 162,129 195,96 +$V 195,96 198,108 +$V 198,108 199,118 +$V 199,118 149,161 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 164,61 +$V 185,109 219,66 +$V 164,61 172,115 +$V 219,66 190,110 +$V 177,134 201,167 +$V 173,142 201,167 +$V 188,128 256,143 +$V 256,143 195,120 +$V 175,147 147,192 +$V 147,192 173,142 +$V 168,127 113,103 +$V 113,103 171,136 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 146,98 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 171,109 +$V 171,109 177,130 +$V 171,109 142,135 +$V 142,135 183,120 +$V 183,120 177,130 +$V 142,135 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 132,80 +$V 185,109 195,52 +$V 132,80 175,116 +$V 195,52 190,110 +$V 177,134 192,201 +$V 173,142 192,201 +$V 188,128 241,106 +$V 241,106 195,120 +$V 175,147 234,175 +$V 234,175 173,142 +$V 167,130 113,143 +$V 113,143 171,136 +$V 167,130 160,153 +$V 177,130 210,140 +$V 190,110 208,94 +$V 172,105 172,64 +$V 154,122 120,115 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 142,135 +$V 142,135 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 146,66 +$V 146,66 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 171,109 +$V 171,109 177,130 +$V 171,109 142,135 +$V 142,135 183,120 +$V 183,120 177,130 +$V 142,135 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 146,66 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 139,55 +$V 130,154 175,116 +$V 139,55 190,110 +$V 177,134 219,150 +$V 173,142 219,150 +$V 188,128 193,72 +$V 193,72 195,120 +$V 175,147 226,80 +$V 226,80 173,142 +$V 167,130 144,191 +$V 144,191 171,136 +$V 175,147 173,202 +$V 155,138 130,167 +$V 157,128 121,89 +$V 171,109 165,69 +$V 191,115 205,70 +$V 184,116 247,130 +$V 177,130 191,172 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 156,170 +$V 156,170 177,130 +$V 156,170 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 179,200 +$V 130,154 175,116 +$V 179,200 190,110 +$V 177,134 221,72 +$V 173,142 221,72 +$V 188,128 123,82 +$V 123,82 195,120 +$V 175,147 120,89 +$V 120,89 173,142 +$V 167,130 276,111 +$V 276,111 171,136 +$V 172,131 164,203 +$V 153,136 74,143 +$V 152,114 128,56 +$V 179,113 182,44 +$V 199,118 301,141 +$V 194,137 215,183 +$V 151,150 97,225 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 204,106 216,100 +$V 215,110 221,109 +$V 231,98 236,95 +$V 241,102 241,102 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 214,99 214,99 +$V 215,110 221,109 +$V 242,84 236,95 +$V 246,91 246,91 +$V 221,147 221,147 +$V 207,133 207,133 +$V 168,166 168,166 +$V 150,161 150,161 +$V 175,92 175,92 +$V 192,90 192,90 +$F +$V 428,132 377,142 +$V 377,142 327,179 +$V 327,179 306,219 +$V 306,219 304,271 +$V 304,271 318,309 +$V 318,309 350,344 +$V 428,132 479,134 +$V 479,134 520,154 +$V 520,154 549,192 +$V 549,192 562,230 +$V 562,230 564,265 +$V 564,265 553,296 +$V 553,296 531,322 +$V 531,322 511,340 +$V 301,290 318,321 +$V 318,321 338,343 +$V 301,290 299,253 +$V 299,253 306,219 +$V 527,162 563,144 +$V 544,181 570,152 +$V 520,154 590,101 +$V 549,192 592,157 +$V 578,109 569,68 +$V 590,101 581,61 +$V 506,90 503,105 +$V 503,105 510,108 +$V 510,108 521,89 +$V 521,89 507,86 +$V 507,86 594,23 +$V 521,89 593,35 +$V 510,108 591,50 +$V 418,224 410,232 +$V 410,232 409,248 +$V 409,248 420,258 +$V 420,258 432,257 +$V 432,257 446,246 +$V 446,246 457,219 +$V 457,219 447,211 +$V 447,211 418,224 +$V 425,233 421,238 +$V 421,238 427,243 +$V 427,243 434,239 +$V 434,239 425,233 +$V 507,147 548,197 +$V 344,235 358,232 +$V 358,232 346,243 +$V 346,243 359,237 +$V 365,248 357,243 +$V 357,243 349,247 +$V 349,247 354,257 +$V 371,259 367,253 +$V 367,253 354,257 +$V 354,257 364,267 +$V 381,274 374,281 +$V 387,277 391,281 +$V 391,281 381,289 +$V 397,284 402,288 +$V 402,288 392,297 +$V 392,297 389,292 +$V 389,292 397,284 +$V 407,291 399,300 +$V 76,56 51,65 +$V 51,65 34,80 +$V 34,80 21,108 +$V 21,108 21,129 +$V 21,129 31,153 +$V 31,153 54,167 +$V 54,167 88,169 +$V 88,169 123,153 +$V 123,153 139,129 +$V 139,129 146,105 +$V 146,105 139,76 +$V 139,76 118,58 +$V 118,58 93,53 +$V 93,53 76,56 +$V 34,157 47,167 +$V 47,167 82,175 +$V 82,175 115,163 +$V 115,163 130,154 +$V 130,154 146,131 +$V 146,131 146,115 +$V 146,115 131,123 +$V 71,102 63,110 +$V 63,110 65,120 +$V 65,120 73,124 +$V 73,124 83,123 +$V 83,123 97,103 +$V 97,103 87,93 +$V 87,93 71,102 +$V 73,109 71,113 +$V 71,113 71,113 +$V 75,115 73,109 +$V 73,109 75,115 +$V 73,109 79,112 +$V 71,113 75,115 +$V 75,115 79,112 +$V 39,105 39,105 +$V 40,111 40,111 +$V 40,111 53,115 +$V 47,118 47,118 +$V 44,123 44,123 +$V 44,123 44,123 +$V 44,123 48,127 +$V 52,130 52,130 +$V 52,130 50,135 +$V 55,134 55,134 +$V 59,136 59,136 +$V 59,141 59,141 +$V 66,142 66,142 +$V 70,141 70,141 +$V 70,141 74,143 +$V 74,143 74,143 +$V 93,40 112,42 +$V 112,42 142,65 +$V 142,65 151,89 +$V 93,40 80,53 +$V 151,89 146,105 +$V 147,109 157,90 +$V 157,90 155,65 +$V 155,65 122,39 +$V 122,39 93,40 +$V 93,40 86,54 +$V 146,105 163,134 +$V 146,119 157,133 +$V 167,130 163,134 +$V 163,134 177,130 +$V 163,134 146,131 +$V 146,131 183,120 +$V 183,120 177,130 +$V 146,131 157,133 +$V 162,129 162,129 +$V 162,129 175,116 +$V 175,116 167,130 +$V 167,130 199,118 +$V 199,118 177,130 +$V 112,42 105,48 +$V 105,48 136,67 +$V 136,67 142,65 +$V 191,115 185,109 +$V 178,104 185,109 +$V 183,125 183,125 +$V 169,120 130,154 +$V 185,109 177,125 +$V 130,154 175,116 +$V 177,125 190,110 +$V 177,134 162,129 +$V 173,142 162,129 +$V 188,128 173,142 +$V 173,142 195,120 +$V 175,147 163,145 +$V 163,145 173,142 +$V 167,130 163,134 +$V 163,134 171,136 +$V 220,75 220,75 +$V 215,110 221,109 +$V 242,84 236,95 +$V 278,93 278,93 +$V 248,151 248,151 +$V 211,172 211,172 +$V 176,196 176,196 +$V 137,186 137,186 +$V 178,70 178,70 +$V 198,64 198,64 +$V 169,100 169,100 +$V 192,97 192,97 +$V 204,137 204,137 +$V 151,150 151,150 +$$ +\enddata{fad,270222644} +\view{fadview,270222644,2,0,349} + +... by Curt Galloway +\enddata{text,269602880} +--Where_No_Man_Has_Gone_Before +Content-Type: application/atomicmail;version="1.12" + +; +; +; +; +; This message contains a ATOMICMAIL program. If you are reading +; this now, that probably means that your mail reader does not know +; how to handle ATOMICMAIL programs. +; +; If you were reading this with a mailer that had been extended to understand +; the ATOMICMAIL language, this mail message would automatically interact +; with you and take certain actions based on your responses. However, +; the language is designed in such a way that ATOMICMAIL programs can +; NEVER do you serious harm. +; +; If your computer has a ATOMICMAIL interpreter but it has not been linked +; into your mail system, you can run this program by piping the mail +; through the ATOMICMAIL interpreter. (In Berkeley mail, for example, you simply type +; "pipe atomicmail".) Otherwise, you can simply write the mail +; out to a file and then type "atomicmail that-file-name". +; +; If your computer doesn't have any ATOMICMAIL software at all, you +; should probably reply to the sender of this message to tell +; him or her that you were unable to run this program. +; + +(&checkversion 1 12) + +(defun init-ctrs () + (progn + (setq newline " +") + (setq summarizer "mmsurveyor at thumper.bellcore.com") + (setq global-survey-qid-ctr 0) + (setq global-nesting-level nil) + (setq this-level-ctr 0) + (setq total-questions 0)) +) + +(defun nextctr () + (progn + (setq this-level-ctr (plus this-level-ctr 1)) + (setq global-survey-qid-ctr (plus global-survey-qid-ctr 1)))) + +(defun pushnesting (txt) + (progn + (setq global-nesting-level + (cons (list this-level-ctr txt) global-nesting-level)) + (setq this-level-ctr 0))) + +(defun popnesting () + (progn + (setq this-level-ctr (caar global-nesting-level)) + (setq global-nesting-level (cdr global-nesting-level)))) + +(defunq onelevel (i) + (strcat (int-to-str (car i)) (cadr i) ".")) + +(defun apply (f l) + (magiceval (cons f l))) + +(defun getstring-oneline (prompt def) + (newlines-to-spaces (strip-newline (getstring prompt def)))) + +(defun getstring-notrailers (prompt def) + (strip-newline (getstring prompt def))) + +(defun newlines-to-spaces (s) + (let* ((l (strdecompose newline s))) + (cond + ((null l) s) + (t (strcat (car l) " " (newlines-to-spaces (car (cdr (cdr l))))))))) + +(defun strip-newline (s) + (do*((len (strlen s) (- len 1))) + ((or (lessp len 1) + (not (equal newline (substring s (- len 1) 1)))) + (substring s 0 len)))) + +(defun cadr (lis) (car (cdr lis))) + +(defun cadar (lis) (car (cdr (car lis)))) + +(defun caddr (lis) (car (cdr (cdr lis)))) + +(defun cdddr (lis) (cdr (cdr (cdr lis)))) + +(defun cadddr (lis) (car (cdr (cdr (cdr lis))))) + +(defun cddddr (lis) (cdr (cdr (cdr (cdr lis))))) + +(defun caar (lis) (car (car lis))) + +(defun cddr (lis) (cdr (cdr lis))) + +(defun caddar (lis) (car (cdr (cdr (car lis))))) + +(defun > (a b) (and (not (lessp a b)) (not (equal a b)))) + +(defun mapcar (func args) + (cond ((null args) NIL) + (T + (append + (list (magiceval (list func (car args)))) + (mapcar func (cdr args)))))) + +(defun thislabel () + (strcat + (cond + ((null global-nesting-level) "") + (t (apply (quote strcat) (mapcar (quote onelevel) (revlist global-nesting-level))))) + (int-to-str this-level-ctr))) + +(defun revlist (l) ; like common lisp REVERSE + (cond ((null l) nil) + (t (append (revlist (cdr l)) (list (car l)))))) + +(defun informative (p) + (strcat + "#" + (int-to-str global-survey-qid-ctr) + " (of at most " + (int-to-str total-questions) + "): " + p)) + +(defun survey-multiple-choice (prompt choices) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (car + (car + (select (cons (list "" (informative prompt) NIL NIL) (cons (list "" "" NIL NIL) choices))))) + newline))) + +; USAGE: +;(SURVEY-BRANCH "What is your favorite color?" +; (quote ( +; ("red" "red" (branch-question-set "red" +; (quote ((SURVEY-SHORT-ANSWER "Why do you like red?"))))) +; ("green" "green" (branch-question-set "green" +; (quote ((SURVEY-BOOLEAN-ANSWER "Are you green with envy?")))))))) + +(defun survey-branch (prompt choices) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (let* ((ans + (select (cons (list "" (informative prompt) NIL NIL) + (cons (list "" "" NIL NIL) choices))))) + (strcat + (caar ans) + newline + (cadar ans)))))) + +(defun branch-question-set (branch set) + (progn + (pushnesting (strcat "/" branch)) + (let* ((ans (ask-question-set set))) + (progn + (popnesting) + ans)))) + +; USAGE: (survey-short-answer "How are you? ") + +(defun survey-short-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (getstring (informative prompt) "") + newline))) + +; USAGE: (survey-integer-answer "How old are you? ") + +(defun survey-integer-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (int-to-str (getinteger (informative prompt))) + newline))) + +; USAGE: (survey-boolean-answer "Do you think I am sexy? ") + +(defun survey-boolean-answer (prompt) + (progn + (nextctr) + (strcat + (thislabel) + " (" + prompt + "): " + (cond ((getboolean (informative prompt)) "Yes") + (T "No")) + newline))) + +(defunq surv-pkg2 (q) + (progn + (nextctr) + (list (strcat (thislabel) + " (" + (car q) + "): ") + (informative (car q)) "" (car (cdr q))))) + +(defun formatfillinlist (lis) + (cond + ((null lis) "") + (T (strcat + (car (car lis)) + (cond + ((equal (cadar lis) t) "Yes") + ((equal (cadar lis) nil) "No") + (t (sexp-to-str (car (cdr (car lis)))))) + newline + (formatfillinlist (cdr lis)))))) + +(defun survey-complex-form (preface qlist) + (progn + (setq this-level-ctr (+ 1 this-level-ctr)) + (pushnesting "") + (let* ((ans + (formatfillinlist + (fillindata + (cons (list "" preface "" "i" NIL NIL) + (mapcar (quote surv-pkg2) qlist)))))) + (progn + (popnesting) + ans)))) + +(defun ask-question-set (qlist) + (cond + ((null qlist) "") + (T (strcat + (magiceval (car qlist)) + (ask-question-set (cdr qlist)))))) + +(defun qcount (l) + (cond + ((null l) 0) + ((equal (quote survey-branch) (caar l)) + (plus (branchcount (caddar l) 0) + (qcount (cdr l)))) + ((equal (quote survey-complex-form) (car (car l))) + (plus (dcount (magiceval (car (cdr (cdr (car l)))))) + (qcount (cdr l)))) + (T (plus 1 (qcount (cdr l)))))) + +(defun branchcount (l prevmax) + (cond + ((null l) prevmax) + (t (let* ((this (plus 1 (qcount (magiceval (caddr (caddar (magiceval l)))))))) + (cond + ((> this prevmax) this) + (t prevmax)))))) + +(defun dcount (l) + (cond + ((null l) 0) + (T (plus 1 (dcount (cdr l)))))) + +(defun handle-survey (to summarize subject id qlist) + (progn + (init-ctrs) + (setq total-questions (qcount qlist)) + (sendmessage + (cond + (summarize (strcat "\"" to "\" <" summarizer ">")) + (t to)) + nil + subject + (strcat + (cond + (summarize (strcat id newline to newline)) + (t "")) + (ask-question-set qlist)) + NIL + 0 + T))) + +(defun maybe-displaytext (tx) + (cond + ((equal tx NIL) NIL) + ((equal tx "") NIL) + (T (displaytext tx)))) + +; THIS IS THE END OF BOILERPLATE CODE FOR THE RECIPIENTS + +; user-generated part begins here + +(maybe-displaytext + "") +(handle-survey "nsb at greenbush.bellcore.com" T "RSVP NOW!" "nsb.greenbush.bellcore.com.1991.8.17.15.18.4" (quote((SURVEY-BRANCH + "So, can you come to the party?" + (QUOTE + (("Yes, I can come" + "Yes, I can come" + (BRANCH-QUESTION-SET + "Yes, I can come" + (QUOTE + ((SURVEY-INTEGER-ANSWER + "That's great! How many of you do you think will be coming (including yourself)?") + (SURVEY-SHORT-ANSWER + "What kind of *vegetarian* food would you like to bring, if you have any idea?") + ) + ) + ) + ) + ("No, I can't come." + "No, I can't come." + (BRANCH-QUESTION-SET + "No, I can't come." + (QUOTE + ((SURVEY-MULTIPLE-CHOICE + "Aw, that's too bad. Why not?" + (QUOTE + ("I'm busy that day." + "I hate Star Trek." + "I hate you." + "None of the above.") + ) + ) + ) + ) + ) + ) + ("I really don't know." + "I really don't know." + (BRANCH-QUESTION-SET + "I really don't know." + (QUOTE + ((SURVEY-BOOLEAN-ANSWER + "Well, please don't forget to RSVP when you decide, OK?") + ) + ) + ) + ) + ) + ) + ) + ) + )) + + +--Where_No_Man_Has_Gone_Before-- +--Outermost_Trek +Content-type: audio/x-sun +Content-transfer-encoding: base64 +Content-Description: Distress calls + +LnNuZAAAACAAAIguAAAAAQAAH0AAAAABAAAAAAAAAAD///////93//////////////////// +//////f/9/////////f39/f37+/37///9/fr6+vr5+/r5+Pn4+fv6+/r6+ff2dnT1dXZ29vd +5+fj6+//9//v///3//dv/2dnXV1dXV1fXVtVVVNVTk5MTU5PTU5XWV1bXV9r//f3/+////f/ +6+///3dfa/93b/d3d/f/5+fr49nZ3d3X3+Pn/29n///3//////f/d2dZUVFPVVVZX1lXWVtX +X11bW1trX2fv49/b19HO0dHNzMzLx8bGwcbDzc3R193X49nf59vn52/r48/T3c/d119jZ9t3 +79/nz99ZT1/jY29X/+tdRm//Z0lLT01PSkNGW0o9SkRrS05FV0A9Q0tVWUlK3/9fV87Zx8/N +2bzd68zBwMv3y8Ldzvf3xsrPyd3HyV3VzF3NTtf3zN/jSt93Tmtf71XrZ11VS+s/b3dLTmfn +91tG3U1N511na+NLym9v19PKwsvZ29P//2PZxs5f78RLQG//TdlTuc9O6//nd13KY1v/2VtC +vUHNO8VKv0dbw0b/SM9T11NIzlvZWb/n1VvK1WNXuv9FvzlPvzrB2UHHXUvEQ/fZRtlPytXO +RWf3P0pZUdvTd8Q9RslGSrg378Q+vb7b91/A1V3/1VvFUUTAW0W+3z+4TU7AzUPPU+93/9s/ +T8K7PEZHRd+4vm/AWUc80znrumvMSWf3vknGvufZtkO5/0fLwj27zz/Asz/C20DV/0FLxS+5 +RkLC20jPwz2//0e8x0LCd0jNzzvT6+vLQUPd1zjjuFc/uD85wU8868A3Y74927s/91ldSFfd +Se9fb3fd1z/f39dI08pHd85AWb3jQcHTT8fOPcnCT0XDz0xj2dFfZ9/F199ryuNfZ0TP/0x3 +PFnr/0lH2/fR0c/I3//jwFfX1ePf0//Z0cbLa8fbvGdjyGtX3+fdd2Pva9ffTufjTu/nY1nn +1Vdr3UvT31Pd/0ld12d391dn61tKb+NPTu9MROtPVUVrQ0lVS0g/b0JI71VbSvdR2U9Z4+/L +22PRyG//3dXfyszM68/Rxu/r293rZ+PLa9tfSOvK12f/Wd3j787bW+9r7//f5/9R60/TydfT +zNfd3crJ2evr387H22Pv2W9X79Vnb2NTZ1dnV91K9+v/513X92drY2d3//9r42P////jb09d +UVdXWVtNTFVMQU5NS0ZRSE5KTUxZV1X373dv39vR1+vf09fP49vf29vvzuNZb2fv2ev3b2ff +5/fR21dn293R63fn59fj619VZ29r487X293Lw9f3Y/dRWXfZ72PKxMPBv8bJxcTLb2d3X1Hr +W1tZ39/d9+ffVWtrU01fY1VP2d/Z1d/v901VSU9XTUk1ODQ8NTxKPDE1QUdCU9/TV2PJ4+tX +V04/StvRz8e3srCvra20uLm731dFPzQ5Oz05PUzjzMXDubq3ubrEyc7rTEdPTzxGS0pD4+9j +P/fTyDVP97hLVf+30W/PrLPO17e4XffP9z9Cb/88SF3I/0zR1dk/T189MTY3LCcrLjIvOE9n +Y8m0rrOura2urq2zsbO2wcK/z993W008Oz04LzU5MjE7QD85VfdfUVPT311r0crj68vG0Xdn +519RQkY8Pjw7ODxJPD9F/99398Syvd22q6y1sqywr6+vsbe1wbvCvdPNy7vJ0ci/v9vLzMXr +21tTS0M8OTcxLC0xLSkqMi4rLTUyMDA5PTY3Pk0/Rkj/X3ffy8TBxL23vLy5t7u+v7y8vr2/ +v73AxL++vLy9vr2/vsO9wcfGxcfIy8jd53dVSkI+PDg3NDg1NjQ4ODw/Q0lPTl9n43fd2dXV +08vV09/j/2tbT0dBRD06OT09PT9ARk1VZ+PZ68vGvr+7uri3tbKwra6tra2ur7O2tr7Fx9Pn +509PTkVAPDw5NzUzOTc3NTg4OTw6PTw8O0I9Pz49Q0Q/P0NLQU5RRP9Xd1XHX87JzcS+vsC/ +uLu9trG0srGvr662rLuytLXLvsPZzyrGrT8zw18zY808X3dVLz9IKD13PjhJPTQ9RzI9SjU4 +PkQ3Rk4/RFFXY1P/93fd58TRv8zExMXBwe+9xb7Iw8nCvMzCucO5vMq7xNu/z+P3a2dFY0tj +Pd82QjpNOlVJQldDTznJP9tBwEjB53fO1TzfvFnVxV9Ny+NVvtFPu8pN379J/0PLTUX3PFN3 +QTzNNE85XUs/Z0k859M+X8lbS8zTScfOv8m1zc68vsC6yr24v/+wU1O00V27XbzVstHO2cw4 +we/n17bP1/drWU5HPjs5LCxBMS01Pzw9Qk1Tzl9jw9VX/9dvQ1k+QFNKQd3M6+O6vMPHv8Vv +2+vP913NWdfP38zVwre9uK6zr62vsre6vHfOPEdHIyY0LyMlRSovPm80QmtOP9HI69HFzffJ +Z0r/RD45Tj5DSudb0dW8vsqusNdIb+M3L0vfQefBsK+wra2tra2tra2tra2yvNPMyF85RM8t +OjM0Ki4qLyg9NSwmO1NfLTnN3TxB09P3TUxIW0Y4MkJANjU/59lryrLvvq2rb0+9zC84X29j +17OvrKysrKysrKysrK23tbiyxGfCw9dDT0o1NDcuLio+KicvNzMtNFc3Ql9LPTxP4zk2UedH +TVNdP0hnWTxB69dNTdPIw8XEub++w2NPV8fO68q0sravra2tra2tra2tra+vtb7Ly9VfPz81 +MjA1Ni4sLi8yMDQ4Nj5DO0JKV2dKTllNWV1OSUdOUVNbb+tnXVFPT0dMTkxZXV3/38jBwry5 +srW1s7G0sbGyt7m5vMK/x8jJ09HT3dXV1ePd09Xj3+P/W1lRT0dFPzs2NzUyMDAzMjA0Nzg4 +Oj4+P05VY/fT083Iwb/AwL2+vsHBw8PBwsDCx8PHy9HT0+f319nT08vLy8bCwL6+u7+/v7/I +zc3T629bV1NKRz9KPkBDPkFHRklVT0xGRT8+PEA9OzhHMj03PTo0RjxGPltbd83nweu+wru8 +ura5u8W7tLzFzLvj09PG/13n/+Ndd19jRUpdX1FO69PbycW3vr+4srq5urW/xsjC1W9nW0dD +PkM5PT07OT09PERGRU1XSExZa01FY01JQkg8Nzk3OTQ8OkM96/d30726vLKtsrWsrrOzsb2+ +wcvbW/dDTUdJPU5BPj5VRU3/5+/ZxrvNvcW8x8rBx9nV3/dPTl9RSl1jb2P3b2dRTkg+Pzs3 +NDI0Mjw6Qj9bU3fj2cnIu8DFvbq6yL++xcXIx9fd2edv53fK11/v481n1cPO1dvTzvf351lX +TWNVU1lbX1dX//9bb2POV2tv70lGR1E/UVNMQE9XZ1VfX2dj1+vT2c/PydO/77/Cv9l3X99f +90pITkE6TVU9Rv/rUW+/uL65scS2trrBzsW4d/9vTmdIS0YvLy83LS8vNTtMTkNCyL3Hyb21 +sryztbSwtrXB08G6xb531edjb0w7RkJJOT9JSFtf50TNd07PUWc67706NddPTzxrTj8vb+dL +Kziw5zA70cHbxbG+w62070jdwDgsQf9DRO++ycC0yf/d/0UxNUs8OFPjwL6zrVWts2M6189E +Lt/ITreusa6trcbGutE9U0hIRUNdb8rjZ1fZZ0k5TVM4P904NcnfMD3FW0xOSE08QzI9UzYt +W0gvOUbOPz/Kz0jrxc5OyLa857u1wdPAt8e8s7S2sK+5vrm3yuPM0U/Xs87Rua/A39XXPjg6 +MTM4NS87QjYvODYuKyoqKy4qKDhIOztvv93Au7eyvrnC18K6w7vItK23ta2trrvFrK5X77a4 +xWvBsb/Cys3C0UE+Nzk3Ki05Oz85StXfWU1ISzouKy0vLCoxPD9FXV3Prb43yrVPRWvfxufJ +us6svbyssd+z0dtfPUM9St1bTbPEz6+7ubXKuszDz9nGz9XOyMXGb9fZ/9s7R2M/MDU1MD0z +NUM+TElFY1NHRkZJRkdX/9fM68bGv8XLv8vIx8nHxMzOwcHJxsHGz8vO99/M33fT/2/fZ1Nb +VVFKR0tDPUU4ODs4MzU7OTlCRUddXWvV2dHKx8K/wry8x768ysfCz9HV2+/v929VU1tIS1dN +SFfvZ3fr/+/d71Vn/29VW93j3c7MysfJyM3O0Wt3b1lOTE5VU11Z/+f/d9nX593b19HTyc7J +vcHKv8bO29V3VV1MUVtXV3dd79fvz87O0cbGy8PHzMrH39H3b2NHSEpAPDs8PDk5OTg4OTU3 +Ojg7PD4+QUNGS0pVW2//49vNz9XO3f/V4//R3dXJxs2/wMjHs+PftrzHxMrFur3Rxr+9xMG8 +y8O5wcXGxcXGxcfdwLpT57lLLbRPLDxdNS42PTAtMjY5LjE7OTQ6SEFASN/3Z9PJzcnIxsbI +xb/Hysi9w8y/v762tbm4ur7Bu8rKyNHbb+/dT09rP0VFOT9MMzpCPj5GQkZNY0BHZ0RHXURA +WUtIT01BU1U9SGNFWU53V07b1ePGvr26ub+3u7y1vbi4vbvBwb/EwL/O68rTz8/jzdHMzt/r +1f/n509ITk89OTo5OTg9Ozw/QkNHQU5VRj5MRkdXa1/nzdnPvtFj28jI7//FzP/Tu85MzLvE +X8LDXcq+x1vBvM9DQEdL39HX08rA011DLy8wLCgqLTVVy7u6sa2xtcs+NDUvLTE3RuO0try2 +s7W1vcfMyclv58nJxLi4sMK+r7vbyt1n1+Nfd0dbTDlVSU1jZ8vN1cb/TONdPzg6VUXfzz0x +SUpPXVtTR1dbOy4uKi42OURTxK6tr7G8x8zvTklPa8zAxc3vwbe8vcDIwr7A3V1PY93vS0/H +v723ubnTX81HKSs0Ly9XRUHdt89LRFVOVU9RR1NNRExLU+fHwl2+v1X/zk5KTm9r2b61vLy5 +1WtbX+v3v73Dv87ZyL3Dxec4LC0817yvsMPRPzIxNDxBW/9ry7S0srfHY1NKOjpEPVnvY19I +PzpERUtANjzZSlFvPDZjR0fL37/HX8HjXbG9vLPVssHTuMjfucnEtruvusjZPiwuLDhJY9HP +U01XvLu7wFEpJCw0za+4vsLDuLXPNCMlMMSsq6u7d0E8QEpd99XJys9dUUk/TlVOU1s4PUpF +R0xVUUxXd8Kzy81Xz05nrK+6u0tLsbu2rMBPPTIuPWdX2Vk5RV1vQTcyLS1N60RLPjA6P0rn +yetZy7q4ra20w626xLm/vrmura2trb1fRT9N2c/P1f9XSUE5MzU4PlVvT1E/Ni8vNjtGRj80 +M0FGSltrQUtLTFdI5+fLwV/v28C1trCzwb6ztb28ur3BubW4srW9z2dfd9Pj28LBv7rH2WNH +1cbbvcNMLCYpKDK4s7vCNiQiIis4Z9FrXUg1OTs4Pz9RUT1JOzxASGdv72NEQ9s8Wb68/7ay +4721vMStrbG3rbi8r7W9sK+yu8DjWcC/xb6/72/Nw9Hv199OSj0/PUJOVf9nM0z/Q0/VTDs4 +QDYsL0lNY9X3Vzs8SDY1OT1Pb+9JNkhjb9drQzc5Sv/369X/X+PDvte+ts7Ps7rEvdXXta+t +s7/I38m0t+NvT0/ny8bO38jLwbrL1+NNV29jV1tFPVH3Tj83Ly44RE7Xt7rTWzYvN1XCvbm0 +xcvXW05GQFFPSl1ZST86PD9LVUlBQVXj2+NnQUBO68DZY11f18rN4+fn3+fF02/Gvr7R/8zP +w7y80cXCyb/HwcPAvc1n/3fnx9XT09fBa0ZBQv++uNFJW8hjPz02Lj1RWz8/a8VfOj0yKC4+ +MyY2yNNCR2/jY2/ra2/Nwr/f28O2tMTHvrCxrrfPtbW+u7O4yMy8vtnEvMTIxMdvR05VRklN +Sjo6PkEzMTs+Ny8vOzYrKiwuLTM2Ny86Sk89PUvRye//ysW/ubq+u7Ovr66xta6tra6wr62v +tby9uLO3vb3By9Pb605fb2ddY1lKS1lfSUdKRU1IST1AOz4/OjYyNDo4Ojk7QEU6QEQ/S0g+ +Q0RJSkxVV09O511NW1dbb1vO2c3Ky7/Dwbq/wcDKwr2/vb62vcC2v7vFwry/vb3Rv8Xnv933 +2f/va/9vT2dZSltITl1CXT9ETD1DQD5OPUJNPkJBNk84QE09QVlLR3dIXXdny2v/y9VvxdXn +wcrHxcbMvsbIt8nDu8XHw8zryt3d79/ZV8tbWWNTU29NX1dOb1v3Z13bX+Pn3e/O18fL2cXj +b8jM/9PPXczVWd/vV2vnUVFXT0FTVUBPWUdNSEVCRD08PDk+PTo9Pzg6Pjs6Pz5ATk5ATFFN +UWdba9vb3dHJx8K/vru3ubWzsbGurq2tra2vr66vr7Cvs7e4u72+w8jM1d3jd1tPS0ZBQT8/ +Pj46NzU0NDIwMDAvLzEuLzEyNTQ4OTk7Pj1AP01TV2Nn99/f19HOy8TFxMfFxsDAwcC9v76+ +v7+/xMC7vLy+vr3DvsbFx8/TzdPd3dn3b2NvXWNTTlFIR0REQ0Q/QUNJS0pdWVtnb+/n///f +d+/r39nn2+vv92dnXVFXWU9XV29dW2dnb+dr99nV29fZ2ePv/29vY//vb//Z793b0dHP1c/T +zdPZ21Xd1SqtrDwjrqwvLa2sNDK4uEkx77rRMWe8VzDTuj4xybtGPN3PY0vn0d93z8jV583H +62fV3VFMS8NdPMjdRtFNz+vrSdm060qxzWutUVWtwziurS6+rHdHsVM/tl9Eb7o+vLsxvb5I +ML3rQD9v7z5H0T8uP7czNEXXPjw5XVEtR10tR+9VPTXv9znZdzeuWzbOu293xe/ZvMHPvky/ +rbxF562t6zStr0i+rsbOta3vzbews+tJurTJyELOtF0409dE71tALU68NShCuzUqMuM9Lz0+ +LTZdQyksRWcyKS/X5ysv004ySt06Q8q2Vz7DrsFD3bmv3cy3t823ssNfwK22Z8W0r9v3vLdr +0bvFW8i8vFd3urnZUb2832PN2Vdbzuc8Qs3jPDVG31kuQu9HOktXNTx3WT49T9NZNFVvTmdv +VffO0+9vzsTL3dHCx8nNwL3GxbrFzr6/083HwMpva8lvV2NNTGNXPj5LV05CTmfvSz5Db0s4 +OktCOjg8Ozg+STc8X99ZR1fCx0nPssvZvLvA472vv/+/ucbrb9nDV+vFzcm8u7i6trK4yMHB +z0s/Tk43O0I3RXdvW2/Kw8jd28/ja1s9OD09PTUuQD80OV9LTkv3yf9nytffy8bGxsu/vs7N +wr/Dxu/f0dlrWdfJ71Nj9/9MR1VFNzxLRTE4TVc8P2/PUWPI0WPvxsf3Y7i51/e/usTVxL/H +xbm7v7+/vMnOwcXj1d3r70xVZ01XUU1ZU0FPSzo8T0k2NUtvQzRATEk+TW9MRVtdTElPV9vP +62v3u77ZybzFzsPDvri5t7S+xbi568e93UVPvtk6SsDrT0TMu01CyE4vNk8/MThjVTo9X9tA +PURPNzRESTo/WWdHP0rXTkFFystMa8fXT83H11/Zsr7XurG5xLe1vt+8tr/BtLrVwbeyv9u6 +tttZxtlTQd13OD1jTTE3SkgtL0k4MThHPj0/21VI3brX/8fAxN3Xw0k4Tu9KSv+4u99OU2NK +My9LTUVd/1n/287d3b28zc7j/9tVP+fFw2fNu79vx7rAwsvFxMzjwc3vyL/C09vNzNPbXWfv +Q0dCPD8/Q0ZRU+9VRGvv51VV9+9FS1dHSVX302NX9z01PEU8PkJZ51lDY1tKTd/b487d6+/N +x77HvLi5vr++v7y9z8nEvMfByb7FzczL111KU2NDV9lKTOfvSE9NTv/nY01Z23dV3+fvxMhn +Z0RG3WNHX1fja0RGV0k6S09XQz7JWz5T/0VJRj9ZSV3RX0pbb3dTSs9348HOY8O/vMVTy7bT +v8PXvrvJ6/fZv8zn09W0tsbNus/GxmdVY+vvQkdvdzs2OTw3Nzs8Nz4/NjZTP0FnSmvnV9Pb +0+tn28ZKW8fna+fPzk//wNfj/9m9vsrKub/Gu7q8vL23uOPIvsfj48bBzN/L1efMTErI1UhT +710/PU1OQVlrTzs4PkQvPFFAPUJBQ0A0QFdB//9rRllv1VFNX9XM1c3Nwc7GxtXZysnv67y5 +yFfO393O009vy/9v5+vn3dNNSdPHTU/300o+Y29NZ8znVc7L61PR22fd49vJt8zj78G9yc25 +vdHIvs1rY89v486/10rn60xJ3e9JTk1MOzlAOjw2PFFbOD1AQk02Nj5CVWddV1lbZ2NP92/G +zePGvbzK1cvK2efHyMXLw8rbyr/Nd+/nyHd323fT2993/3fb1UxZb9tPT1vT3Vdrb1dT9+dr +X2vTTVPT90ZJR0VTR1NMX9fvV1VZSUpvd1//z8PXTOvN79vN0cLA6+//Y29na2vLxMfV09v/ +d/fPzMnV0ePr319KV93P91vb7/dnTGNjd+/f58rG119T705dV0lN30o9SllMRk5ORT1n60Vd +9106S19bSVvV09PT23fPx8rC3c3Ly9fJb+u/29vHxs7My/9Nb9dfa2fd18rZ/2tv3XfXX2/Z +TmfnV1ffV/dvS1lVT05ARW9NZ29NzNlOSlFd301HW1lb/8//WdnVa1tr92d3/99j/8jfb99d +/83P38/Z093/0ef319Pfy8Z368/nWUdNd2f/6+dda/f/909Pd9/ja+Pn19POb+ffa+tXX3ff +a//X61Fjd2tXSktbWU53d1VZ987b49X3/83Za3fVwb7vZ+fd591ja+Pn629dP11dT0n3d0pO +Z2tKb813W+trb9Pf/+Pd12/j31frzNX/z9HbY13r4/dTWfdvTm9ZSFld2/dbXXdbUWdd/1XL +xltX1+9v79fH0d/O/9ffb9X/SnfdXev/28//6+fn2+/rz29f1c13/+9r39Hv2eP/42fnWVNZ +Y2NZW1vr1d3/b99nWf9d99HLysXK1efV31Xj12tX2d3/Z2dXSE5ZTE1FR1FXTU9HTElTY0hG +Ue9bWU5dd193/9nf19Hnb/fv99HZ79PV2dXXb+/j58nL08rV18PH08rG173JzsnO28vCxcvZ +ztfvT2df7+tMSEJHW1NLSUxZVU9JRUtVTU5RX2P/VUdf31tf71tbb29VWVFMd1FKS11bSEtZ +X1djU1Pn/1tr52f309n30e/v0dfryc/VzsnH093P2dnMy87OysHHwb7Cvb6/ysTGzMvd59/d +3dn/X91fa1tVU1dvZ3ddT1dRT0JAP0tPRj9ETVdOTUpISltTSEVET1dbU19XSl9ZSkhFTUlb +WVn36+fTze/XxM7b18rIwr/GwcK/vrvEz8nNy2//W1VjV19ja1tTW1Nfa+//b/f3//9vb19V +Y9vf3//v59nj49Xf28/P4+vX3d/fa/f359nj/1tjX1tbUVf349nr19fV19X///9db2tXVU9H +P0E+RUVKS0lMUU5dTEj3d3fr3etrW2/nXVdd29nja+/n5+vn38932dPXzs7N287f1dvPyNHM +09Xr92dj4+fv4/d39193XVtdX2/f/19v5+drZ/9v599j9+f/z8zOx8rDycvOx8nLyMnHytPr +5+tnVV9jWVNZW09KQT9FRzw+Pj5ERUpOTVlLUV9JQ0pNSUlLTVVbTlln//93Y19ZY+ddZ+/b +y9XV08rH19/b59XKyMLEzsXKy8jNzNfn193R5+vRy8fEw8TDwcbDxNHj393Vzszb/29ZV2Nd +UVlNVU9TVU1NSUtKSkVIRkRHR1dbXVVOR0tfSUhNPkJRU01NU19rd/fv/1dv3dfOyMjLy8vf +293j59XR09vf2d3Z083OyM3PxM3My87Jzs7Nz9nf9+/j0etja2NjZ11ZUVdJT0pVU0pOSERD +P0NHSUZCSUpNSUZLS1drZ+vn783MzdPPzszN0dPJ0+fO3W/r09fV3+fPyM7b2/fV1dVv19PP +zutZV2d3Z2tra2drV1tfW1lTUWNv39ndTln3W1lXSVFjY93Z7//FyM7n9+/V52N3a+vRzMvf +29XV1eN32dXP2dP349/j43dTXV9bQ05GQ0tMV09RT11bR0JMTkxbT05MW/fb2/dv5+fO29/d +zM3PzM/R1+dj39Hj1+dbV3dfWVVn69/r52ddT13X0+Nn59vZztXrX9vR291v3+9v09Hfa1/v +42dV2ePfY/9ZW+PR0+tb3dfn499jV+vvb3dnd+N3b9fZ71VET09da1lOUUtXT0xNSFtbX1lb +Y2f/X//NwcjMz2/fybzI0dXPz8rjVV1r485PR0tVXVtJRU9jZ+t3W+/n411jb+vZ1+NrZ9vO +011MTmfr2c/Tzcvb32/j3+fV0cnFzdlv41dX91tKWWv/409JU1t33+tNT0RGUVtX/+tKSERH +SVtRWV9La89fU8/H1dvX39/rxLm958C6v7W90f/RwsLfW9nNydH352/DzF1nSlXTa0JNSERH +Pjw2O/9XSDtO29NTPEFHV93/V0Nb91NbS0JRXcfCy8Xn38rv577N09fPzc7LZ93Rx8HKvb7L +39nn18bK/+dvd9/N3VdRWUhDUTs4d0xNu1syMjBVzlVJWd/GwNk/MjxOwbxMS0/T07rHb7C/ +69lVPtGuvciwwk6+9z5ESOPIXzRRvv9vSzw+47+/zltFx81bw9lJT79RMT9fRmtTU9VZMdfb +PES5az/F51m7vM7byOvGvVXjv2fXzTj32UfdTUU/Rt9DOV09Y+NMvj882///Oj3HVdfZS01b +wbnjd8RbvbzB00mssuuvT0+us7/bQsy7vF3bz0xNtmMxyL430esy68frWWc9PlVTMVfKK10/ +MEhrNjLvNTjLSzV3wDdXzWdjwlvGMa1bvuM/vt/IzetXvs3HwkC32V3V1z9X177LyddMd99j +ylNrPMnd7/9rZ1XIxUlrY7tbv+c8tcvPY9nJT8a8PUi5U8q9XW//zuPHPkxTvEo4uTk40U9N +P0Q7W7cyM2ddSf9vMzm6z0tOQC21sDxjyUjHusw8Ubi3ur03Nq3DUUhO3bC6ySVA9+vF5z7J +vkz/zT5fW7xVRMNIPcxrOsDE3UxZRk9VV0pb10hKZ2vXQ1PIyLi8PFu3x3exzFe7xL7GycFT +y7Tdzbo3QKzNML3MMj9KZ76vvzNn5yMnQC48trzfvr5NTOf/yr5EO85fz77BXVu0zVFLJz6v +3y7T22vKti8luq1ET7Ur1a33Kz63rTw+RStLvNs3R99fd71FObGuW7/rMretvD08vbdd6+/P +r8ROYzpOYz5RvrisrLO5999fNEzvRMEyR7g7X73bLy1A2yN3rc05P7W2NyoyNrOuv8vZtbLN +Ozg+b9dvPjr/tb/rZ8XKyb7GRU7Nxzorx8ZRQVlCOkjJ4ztX389rSC5RtLfDvb69xOfOx8zF +LjzDubtjTz4qLT9VPV2urbmvu1Pjz++8dz7f0b671W/Mw7rZNzc0NDs3Ki1HZ99jPEVdTEdd +Rl29s73PTV24trrHx7y0sdfVV1PL2UosOuPJzkQrO7RXOTZLuqyuua+4tbfDyLzZ98XNyMvI +41tBOjkzNC4zMCstMjg3OT5DSkI6ODhHwL7C51drzdPIvsW0wri7wLq8zv9fSbq/07ndUXdj +WbO3y7W6ta+str7BXdfXX+fd2//VO09fSVc9LS82Li0uKzA2LiosLzc+S1XrzevAy8e7ybe3 +u766trOxw8PN49nVWV9rUe9ORknf3VfPV0/Pyc+2ub6zwbm/v8e7vtfZUVNHTU8zRTo1Pj47 +N0A1MSswOjQxLjE4QVVn3by2rqysrKysrKysrKyur6++xc/jTF08MTEpKiktLygsMi89P1c/ +19HIvbyxs7mvvb/Husu/zedfUV9ITUVOQkk+Qz85Pj41RUVGREM/TWPdwb+2rq6tra2tra2t +rbKyu73DyF9PQTg5LCwrLCwtKiowLTQ7PkZbW9nFu7itra2trbK0sbjBzP9JPT43Oj0/PDY+ +OUBDRUA6PTQ5NTE+PDw+QUlvwrmtq6ysraysrKysrKyytriysrS/70w/ODYuLSwnJCQmLDE2 +QEDdXfe/uq+trrevsLOvuLC7w8/dTz5CNTIuKiYnKCkrKiovMTM9U2PLxcG6uK6tra2tubm0 +uLOwtLa4vbq3uLW2ur7Fvbe5wru+w8xbY1P3V000MCwrKikoIyMjIyQrMD1NTmfZxLWurK2s +ubm5uLOzv8PO1ePN29PvVzkxLi8xMjIuMjU9Rv/bxry2raysrK2tra2trrG2ur7R51tFPjkv +KCkpKCYnKycqLTY+TN3r07uvuLKtrq2tsLCurbG0ucHDd01KQDYyLiwzLi81NzU6P0JPU0pR +V11d493PxsfGybyxtrq/w8PHzMzO39fEa7+0v1nn1cnNwL3AxcO9td9vd9fPXU9C3W9DNDA0 +KyMjKDI3OFHFwrm7sa++y8a/tr7CvLKusK+ytsfbTDstIyIiIiIiIycvOm/Py9vDtq2trq+t +ra+xubu/tri5zOvN50Y7KigvLCwxODpE58Wxuresq7K8u864xN22s7y3vc+1vPdJPC8sKCQu +PjA6TkVCQ0rrTTMvLjsvOUtnzri1sbbAvLHC513fwN3/ydfBvrq3xru2v7u6tcHfX1dVWUJL +RTZAY/80MkdINS4jKCowLCpCZ7vBrbaurbS3t77rw8O7vrmzra+ttb66ylc9LiojKSclKy0q +Nkb/vK+sq6usrK6wwN/J70VRQe/r/1NrTGc3OSszNikkJC42PTlRwK6svq+svqyuvsy/u7TI +0bTfu8JJTFFLYzguOCwzOCg6SDJAP0bb693FyK24u768s7PE0d3Xz/fFuLjVtLnHrbi/urS6 +28/Ryf/rTEvCzDk3LzM7KSMvYyszSSw/40Qv98pbUTf3WdPKTcKzu7OyvbW9x7/nzUdKPuc4 +MWPrX1m9ucF3wj9M3SlBOydFxVPjZ7z/xq3VvaznS61DzUGxRi6tuzS5X8RZ374o3UEryy8z +xlPARdnFStG0M7XLO8JfQLjvX7o/z7stu0g1vzs33zRBWyu9NbhHT641rkwvrkd3tC6xwePf +sz9vrCesKzmsM7yxNqw2Ub++PMvKNawurj/FSLY0tOc51U02v0I81TXJQ+suvi7B0zPbYy++ +Tz+tONW9QNe6Mm+xL61nN60sb602tK4+tWdBrS+/xi3MySyuNmc/QD3jN7Uqryxf4zW9TTuv +LcrBP607xa4yrev/rz66zkfj2z/EyU3Ru8rT68zKRMPOSc///z/rW0xKOcs6W+s7V9NOZ8Y2 +a9E9b0VPV13JyUy/U/fTxsi5PK09u8PJua1dsNXKvOfCPve/Mbc7/1n3Sdk21180xTczvyxn +1yq/My/ZMdVKM8MyN78tV1szxDJbuS2/VT3dw8ay77TLxa7Hxq13rcC9sLdbrT+t2V2yY7yy +/7xfw9vjPMRZRVHF00PEd1HNS85bTevMOLg4Sc8w9zA6UzlENk88QEkzUz9nNMlH389K20bH +d120R8K7NbfTP67nVbQvTrQvsUDXV7FAtV/PvNVHsDbLy0nFPMRVY9tHxTg/vy3KPD/rxDa2 +MN9ZZ0S4QblGu9fKXVvTSdvj1T65RuPGb0u6OrxPd3fnX/dV5022W9W9QbRPxWOvQLrAwL7O +y8i8PL1LtEPXV7k7xDjCO3fO4zq+PlnRREPXO88vQ0jrNmc9Y009RUkvuTRHdzpLPMY5TVnN +VT21U9XXyGu34768xneyXcLIv0a6P7nV18JXukTvtj/MS89BuFtLv1PZW9tR091CyldDvj3B +O9XPS9vKOsc7xz1jzTjTUePdVc8/skG7Mt3vb9k/uzq0U9/FQ9tB2c80uzu3OrtLzO/XVdlL +PMVE107HSl9r3WM9W2dJyzGwLr7ZRtF360++SuPf40PjX0rD3z26QcNIvz+9Qe+7O8LvVbk0 +tfddyNndb0C9VbtVxW/TX09TVUhJ70VXY009a1lH/0rTTfe/yPfD47tnxb+/z7fA2bLTXbVX +u0m/ScDOY9XOV1fNPms+azTPPTpfOT9FMFs9zzdJQu8+90VfWfc32TjRWW9vV9dv/2u/TblN +yEK+90K6PLhNxM5DuetVvefbTLjvw+O7zve6v0fDVchOtD+/013CM68wska9T8+/QM5HSc1R +711GzULKNboqzjvjTi+5Mt1vX0FK40ZX68pfXbtE28fKTsfdZ1XLVePN0zvX91M6wkxOPbg5 +RMI/zWO9SrnDxNXvvlG02f+tWbhPvd/fs0i80bpGw79Iv0vXQE9nMMs8QDZbPUlGMV9ESjnr +TUVKWzz/70dv28NMzNtFvl/Z49fFXchvWefRa1XFVdlXulXTvc/Rzs3jwc7RyMzIwcTNv8jd +yMm/19Pf6+dnS2/nTGtPQFlFRz9DPjg6PjxCQEJJSmNM30Z3a2dM7+ffR9/X21m81dPLz83I +vVnTxM9O3cpTxV9nUbxvU9PvSXdVX0bfR+vZZ8M/vVPNTb8+698+/1e/POvJ28PEuc23612+ +SGM2TD1L9zPFycK/w6zjrLGu17RBz0dVIy0vLykzMDk/Sjc9Zz48Ok1OZ87NraysrKysrK2t +usNROSYnIiIiIiMpLjVGu6+srK2tra2tr8PXXz0xMS8/SUbfv763vK/Gv8ZGL1NELytBOE9V +38mxr7q6rb3Bzrj/t8bHtbOzu7CzvMDXT0Y0JiIkIyMjIyMjJis5WcK9rKusrKyssrK0wsnn +38bbwevEuN9nusrXwkdTzM45Pci+Qbq7tbi1zsW541lO10ZL5+vDvLq9t7W+y9tRNCwnIyIi +IiIiIiMkKzRLa7Szra2tra2tra+zvv9n31tRTVv/d//n12PXxc/Da8zLv9X31b/G18zByb7K +xMK/w7/Gv8TGzt/O0Wd33VVrSk0/PTsxLSwqKCkpLCosLzEyPVXXyLazr6ysrayusrjBz85T +Qz44OTc2NzdHRFNd3f/PvcTn08C9vcG0r7Cysbi0ubnI519ZOjo1OzxHTVn/b13vRU9FPS8u +Ly4rMDA5QFdb/768tbezrbKvs7Kzt7m8v83Pzd3//1lIR0M/NDIyNCwvMTYzNz1GWU9j1b66 +vbGzrrK1tbq9vdfnY2tOSUlBRklBREFOPEg/TEJMTEljd9XPvbm3t6+1trW5u7zBxsLD1b/J +vsvH5/fnT0lJOjcvKykoJyUnKCsrLzc7OUz3/09v0cnPu7q2trW2tLy1ub3Cw87N/+tv6+vd +59HjysLOyb61ysvAv+/3zMzZx8nHwcnFys7Bwcy9x7/J09Nra04+Pzo1NC8uLSkoKSYjJywp +KTA6OjZT2dV3u7extqysrK6tsbNFvshvZ+/rX+vIzMzEwcTOwc3IzHfdvtXv1c/KZ9e/07+5 +u8DEzNNXV11fS1dn51lTXV88PjwwLSwuKSgpKyskLio0NUZV983Nx825tba8sqystK2vrLO4 +xcPO90xIUUJFV0hn39HTzsXCzdnEU9W/3+drzOtP08DAt7Kys7y9u9l36+vfT2fC0V9r3Ugz +OTwuKjAsJigtKiMsNjA9StPvW8+7xc3Auq+/r66vsrnAxW9RQzo2OTg9PUNZ5+fKyMHF09vj +TT7V31E+U+tPZ8m7t66sraysrLm3r661sK2tsK6vvc3TVzcvNSwlIickIyMqKC47REJLY8xT +0e/AxcPBtbi1wr/dXz88NDQuNDA2OEZVU9HNxtXRzv9R281JQf/XXee3uryysbm6sba2sq2u +rq2tra2vsLzLZ04/NDEvKSYmKCIrLjgqPEFLPVnO3dO/urO9s7u9ys1jRj0/PDg9P0FDTExj +TvdTTU1DRztPPktMUd3jy8W6s720uru4urK0rrGtra2tra2vtL3L3Vs+OzsvLyouKjcsPjlE +PktbRkbv3dvjtLm8ubG7xtv/QDswMi8tLjQ1NkBFTD9LPjw5OzkzO0s/R9fIxL+usrGurbKx +sK+xrK2srKysrKyzt7jMSm9INi80KyosLywwP0M+S9dVR2/v/9fGvLq0tLW7vtPbTUU7PDM1 +NDU0PTpGPkxISz0+PT41QUdFRc3XyL2vt7Wvr7aysra4sLWztK61r7m3zM9OSDUwLiwrKist +LjA3QUBXTtXI0d/Fv8m/t6+zrayttLa82U9JPjMxNTQ3NUU/TUxXR05EPTs7MzpERUlf08zN +ubnAvLS5xrO3u7qvr7GzsbG4wr7NWzU1NTUmJzA1KzI7Ty493/9BRr3rd8qusruura28uLTM +T013RDNEU0g/V91TR0dXOTI5MzAyPjZB3eNNb7rZzbq3vMO2vMW8uLq2rbK1ubG6x9FZSjIz +LDE0LDQ5PDJNRVNOwsDvu7u4xrKsxrfIrMPGtrvDyV9bMzQtMCktLTgwOU/nX8zrzkxXQ0M/ +PTpJREjKtnf3v7nv17Szvr21usK7uMC1rbTIuL7Rd01JMi4tKjEqKj0yOT0u32NB48S+wL+t +u8awr7fKvLPHY73B3V9r7zw2QDgzMTc/PEDr38/DwdVj3e88QUlAPDw0VbxrW86vvdG/rF+u +vbivwa25ra25vMDrxkItyy8pVzw0KS9HNyZEPC8yukPGz7evSrmw289Zvchb27lnudPrdzVJ +NSs0NzJBT/fP57i93dtXRzg3OTw1S19T666sw7Wsrry4tb63srG1rKyysLG2y1dPSDsuLC4w +Ky8+LSg2NzUuOltBRsHT67muu8HBs8LOws7Nyr6+yL6+y29VSjs8PDk8REZn3dvX4+drUUU+ +OTo6Oz1BQUlj19PbwcS/tra4tK+ur7Czub6/yf9nW0A+PjgwMS8uKy8rLTE2Nj5DT+PT08e9 +vb6/vL68tbW0r6+wr661ubi8ydHP3+/bb1tbWU9KTUxDRkhKSEpNS0pNRkFMSkVJTkpJW2/3 +48rHxMDGycbIztfXd1tXSz06OjIuLy8sLi4vLzY7P07v18S7srGwra2tra2tra6ur7O4ur/L +1e9LQkE7NDI0NTQ4OjtBTFdXX/9fX19KVVFCQ0lGRGPd2cm8uLu1sri4tbm+v73Izc7VW1VR +PTo8OzM1MzIuMTU0QUh30cS7s7Cvrq2vsK6vtrW1vsfGz+dnX0w/OjYtKyooKSkpLC41O0BT +Z9fOy77Fvbm9x8fK39fRz9PGv8XFwcvKxcPTycjJzsvK693bZ01ZV0VAQjsvNDMuMT47SVnv +1cy8urWzsa6ura2vtbW3u73Cw9vvXUM5NC8uLC8tLjQ8PUJVY93PzcjRvsLR0+9jTF9bTevR +y9HJy9nLzcvZzcrTycvR5+NvT0pIPz86NjAvLi0sLS41PUhP78e8uLSvr62tra2tra2tr7O3 +vsHLY089NjMsLCwsLS4zOD1ESuv/09PFytPN79lH72/32dXFu7+8vrvCv8a8wMHCvcvV09tP +U3c/PEA6MisuKyorLTE4UVXvzbi8tq+trKysrKysrq+0t7zI4/dbPjUzLysuLi0tODc6Ql1X +WePJz9vT71lrb0gwxb1B2f//tcHbu8+6tcGxvLmvvcnTz8vZZ1E3Pz0uJyQkJi8xKzJHY2/B +zbWtrKysrKurq6ysurO6xGdTPTg9NzEwNTU4Oz00N0BAN2dZRT1KTVPvxtHKtrb/99Vn9+/3 +27Gur62urLC4v9VHyT8vPDxILygpJC9CRiw0U0H/TDhfra2urbmtra2tt7TBx8VnNTpLX1tV +PUJrz0hCPjdDQDzn/0dLY2fd583BvrrfPT1BY+/398ivsK+1trm8tu/v3/dbPkFGPCsvKzXV +PztVN0BOMUqytcG0t7y1r6y8y7z/b2tdQkdf109FY0pnTzM4Nzg6TlVdQ0FE/7/Bxbm6zutv +b+fXtrjIuK+tsrq9vt9fZ0pJW0Y5Ni87My9nOiw9Y1M7PsO7wsm9v761rq26ur9rP0pZT1VV +42/bzspdS0E1ODg6OkZRTEpMZ2fPvrvAy2tb68nDu7Ozs7Ctra6yurzKXV1bVUAxLiooLi8t +MS8wMjM7R0tv0cvCvLi0uLe4wsXI0efTd11NSUdDRUFDU1/3TmPr3ePX029vWd/f0dPT92Nr +XdnPzs7L1dPGwbq4tLW1t7a3ubrB1WNKPUJANzUrLSwrKisyNzs3O03/zMC1s7a3tLS0tbq8 +xtNjV1NOSEY8Ojo6RE1PUVlnWUhGTVtjX1dOV1Pfzce/vbu3t7azr62ws7i7vb7IzutfQDky +LS4uKS4tKTAwNEhFY9nGvLyzra2tra2ur7G5usrbV0U8NC8vLi8tLS8vMzg6R0tT/2dv2+PV +ysfOxcfNwr++urq5t7a1sK+urrC0try9v9XZX0Y9ODAtLCoqKissMDI5Rknr1cC7tLK0r6+x +sbK8vsLZY19HOzoyLy4tLi4xMTc5P0pba9fIw8PHys3Nys7JyNnTysvNv8PBuru6t7a1srS2 +ub2/xMnVa2NLPTg0MTAtLi0uLzI3PUROW9nKvrm1sbK1srS4urrI28NIQD4+NTczMTEwMjM7 +PkVPXe/ZzMS/ur3CvcHMx8bXzcnT1dPV29PGxcXFx8PEv8TBwMPHzdfrX01JPjg3MTAuLi0u +Li8vMzk9Q0xd287Evbm7ubi6urq6vb7D1ed3V0hKR0dJR0ZMV13n1czCv7u5t7e5u7y9w8fX +2/djSktJSz/3JNW4TEkqTLO8/+fPysnRzN/f61lLPD5NPDw/PDs1Ozo4Mjk+RUhd3c/Hv7y4 +tLCsrLG+yce7u7nD11NJQD9IRUE/PTY3SVnZ3dnbycm/wsPPW1dXUUxBOz1AR2fHv7/Bwb++ +vr7GyWtn52ddT0VDSllbR0Q8Oz5AP0JFVWtNW+vEvby7urq4usPJyMrVSz06Sd3Kz+d3a/9j +W1VJQDs8RlN35+//08vAv8jTXUs9S1tPPjk5R9W7s7G0uLe4ur7OX1lOVV9bU1djZ1lbWU9H +RD4+PT1BPT1IW1lVXdPHuri1usn/18jH1Ug8Ru/Dwszr/9/n52dORTo0Nz9TX2Nba82+vL/O +519FQFNnSzsvTN+6s66vrq2srrjCzdv/VUxPRkVZX0w/QkpTTUk9NThATUs6PVN3y9fTxrq3 +ub3Fz9/r0eNLPUld99nIy9vf2e9ZR0Q+ODQ1OkRRX2/Rx8HDxdHfYz9HX1s9OD13wrm0srCt +ra28yMrM3VVHQ0ZKT05APD1LS09IPDdMWUE2O03RzGNZY8+1srrLyMDD5/fJx+9V793NycfH +09vb31lERj88Oj9DSk1b59fn2dlr/1tITW9HP0hfz7y2sLC0sq+3vr6/wc/Z419XW11AODg7 +PDw8OjM0PTw3OkRGR09n59HAt7vAwsHAu8XZ2d3VzMfFwMLMzs/nWVdJQT8+PDs9P1FZXWvb +729nX1lKPUffY0dHXdvOxrq3vbmvr7e4uLzAx8/Z729j71NJSFVMQT1BPTo5PDo8PT9RWVVO +58/T0czN3fdf0cxfU+Pn4+PT193359/3T09RSz8/REZHVWvr79HJxcjNysbN0cvV08TKzdfL +x8rIv76+wL++v8LHzdHd2ddvV0lLR0I/NzY0MzQ1NDY6P0VLUVtfd+/d19PTz8rExsXFw8O/ +xMnHy87Tztff619PTEdKTUxKS05VVVVPVVVZU11rX2/33dnP68rRyMnOz9PX083Jz83T19nO +0dvj929nX2NXUU9LT0xMTUtPUVNPT09NUUlKTUtTT2dd/9nOycvGwb68vL2/wMTByMzR23dn +TkVJRT8/QEA+PkFAQEdLV2v/1czFxb/Cv7/Ew8PFx8TIztXX19vd9+//7293X11nZ2tnW1VV +T0hFRUlDPz8/P0E+PkA/P0ZKV2dv4+vR0c7PzcjBwcC+vr29v77AvsbNztvjd11dT09HTEhM +SEZJTU1LTlFVVWfd19HPzcTCv76+wcTEy8zOzOvf42fjX2NTV1VVT09NTUpMRkxGSE1JT1FV +UVFPVVdOTkpMTUxLTlFbXW9rd3fn59vT0c/RycXBwcHBv77BxcHBx8jOyNHV29vd/29ZVUpK +R0VDREhHS05TXW/n09HOysbIxcjJy8/Tz9XT/2f/V2NXTldXS1dPT05NT01IR0dGRkdLQ0ZD +Q0dJS09bXWN379fPzcbIxcbCv8PCw7+/wcDEwsHIyszP0fdvZ3dfS01KSkVKSERCRkZGSk5T +TlNNT1ldb/fbzszIzMjIxMjFw8fIy83Z2eNjUU9TTU5MSUpHSElCSkpHV2d3d+/n6+fj5+/j +/+//d//j39fb0cvNz8rJx8LCxMfGxcnGys/Ozd3f4+NjWV1RR0dGRj9EPjw+Pzw5PDs8P0RG +TFddU193///n39nRz87OxsfGysfM19nduTQ9rL0lPqw6P63OQcJrRcTnOee6PWe16z+6ukhr +uchK3cpn99VZV9vZV3fD91nKyu/Iz3fX1Wfn13dv0+dX1cxF38dnQWtVPkZXPj9dRzxFRzxM +STk8Q0o9P1tHTs/r78TBwLvCwLi+xsbC32e/yk3CxUe9vUfd1d/b38rTb9m/RVtbxU41Qm9N +NUs4a2M72URGvtdRyNXPvlvfxNf3zuvLzcvN/87I29lb3evbVUpX701GS0dTU0RAQ05PRUxb +a+/X0dXOxr3X473BTcNO28TvRs7GTsHbyL+7utnCv9nVWWdBP04wNTQ+LTo7PNs230fjW1Xv +QWdNz01ZzE7E68G+wrzFvb2/zdPA58nJ113n1UVTRjs7Pjo3PDtFSkpX3cO+xLm5uLS5xbq7 +//9Za+PZzNW+sr68tse7w7/Fd29PU0M6QUZVMURNPDE2TjswRDs9QVM+Ud1TXc7Za8HF09vH +z87O92/j/9NDX09d/0FnPVk/PEY7TjrvXc69z7rByLa51f/PW1/fTU5d67rNRbDFtsC82bjA +N7gyrkU0rS65vz+8ONFCSzs9XzjbPk7vV9VPz8n/uMvCvcLJ48/Rd9NKb1HbT0r/V3dXS1dL +WzpFRUhHXz5n929jX8VvZ7hLY///OtNON79Eb75NvTe1rS+sPUu3Sbw7sV1v2edNW8I1Vc07 +Y01JUzLMMkfRP+9PyVPIS2/VTcBjSb4971u/5zm2SLs8tTeu2d3F3bjV48V3zcLAyNXJa7RO +u1O808nPXbZGu0O7QUe4RDW4L8tHZ18yzUk3Y/85ty+5Ns2/NMvPLbY0zzpMTDvbvjfr5zvj +Z09VWedTTcU8yjWtMrvFP7hLd7/du75dtUTFPNm9S1XDO7itLa0rTbUvrDG7ObzEO79BPLYu +rjbJazu2PlW7Lq850bsurjS00UC8Tj+5OLZIV8I1w0XnTz3AN8LPMK4vRb5Lu9dRyUPPZ9td +RfdJzkhJ43c/uji0OFm0LrAvtzS878tdU8RvUbsvrje3vj+0OK5IxcJCskS3/z2yU83B3U/f +vf9byj23P8rLQspOd0pjP2s5zU5GzT/NP91K30xGzDjr1TTP529G21PnU2NHR+dCvNtHxj6u +McFfW8nVzMz3utlT18pXyMpPxT5vwjmxR0+9P+vDS7/XXbtO/7hfz64urDg2rFnjsTuvb0+u +U3fTRdV3NP9TP7pBVd0860tZ69s4vj0yvi22TU7XTkrLQkK9Ql/EOlu9ObxNR68vXbhM2blI +ulu+1+/Zxv/M2dVZvVPP485dOsF3ObpTV0PPUz7vW0n/Re9Ld+tb/8E/zsJj3993zF9r33dK +51l3/z3ZyTPd10RvTtFbTt9NV1tf59d3d9nKd9XVy83Zv8vTwMDnwc++w2vEzNPj0+vn72vX +a2/nY+fnT89Ma/db/1Nf/0VfX1dbSN9XT1FjVU1vSmtOX1lrW1tZWU1ZTFtOUVtPSlNPV01b +VVtXWXdb71Nr6/f373fdY3fR/9HX18fZzNPR1c7b09fjz9fbytPGz83Pzt/L39fZ59X/zt3V +y9fK08vR08rXz9HV2+Pd6+fva2ddXVtMWUlMSkhJQEtEP0pDSUpFU1VLY0v3Uf9OZ1lRb09b +/1vr/9fv1+fd3+/d5+vZ79vj29nV29nd7+fd99l35+dv5/fr92v/Y+9f/2tn41vn929r713/ +d293W+93d+v34/fZd9v/69nv59X/0fff3dnj39nr3edr33fj9+dvY2tra2//9+fb5+vf3+Pj +293b09nd59/jb/9rb2dX91NfV01PSUhPSk5JUUlOUURXRVNRV11VY29rd+/r6+Pv6//392f/ +393Z2dHZzt/N19HX0dfZ2c/b18/Pzs/O19PZ49tr72db51n3W+9jd2dbXVdfVV9Xa1N3WW9v +d2v/7+tvb/dj62v/b/f/39/d2dHRys/O09PO68/Xa9XM21Fv0dfvZ9/3VVln3VlG511VU01f +U1FRY1NNUV1vQ0xOTUtR/09ZWV9ra/fv52dv783b9/fb19Xn1dnv0dPNb93Dy2tRzu9n4/9v +Sl3d31nv229ra19bTe9vZ9VTSVnf1WPZ79/fzdnI2cnJzdu4tlNN2b7CWevn31u7ykFJyLd3 +SV9Bvb9IOUZXzdfPQzLNs0JHbztbvko4PU3V7+c4OufBVz5L51t3zDlOZ19PzOc0Y8vO6+tf +xMfCb87BwL1rx8Ovul/Zv7iwvUpTvsvE01M3PN/Pazs6O0XGVTMuOG9dOC45R01NRTw6WdFd +WVnr2dHMw9vf38avw//fua2w2Wu7sL13zsnHx79XWdvKz87rd1nZysn/Y+/bz/9ZVUlI79/3 +R0tO59XvU0pXb1NBODtCPzw6PUVOUXdNVWPVW1dMPkVGRjpBQUld11Xfu7y+wte+tLLI69fH +zGNFQ1nX09v/zsvT09dZ2XdbY0c7TM/n59vTua+z2cO9tq+2vrm0v8bC1/9JRkpZSz5H07/D +62tXUzkrJCMjIyMkKTM/W8+/vLmsrMw0MUfIzEo097Kutse7tq+z0Wdb62PnUzhIXdfJWU/V +vbvDTnfVXetbRUn3vrm+xL+/w+9HT+fbY1lLQjo0MTAvKzI3O0v/ybCssba6v81ZOjAyMjI2 +WVtbsKutvLyyrKy+Ttu/vVVfa8u5sLTGxr7CyFUzLzg5MjAwPVNJTj083+9N6zkvQD1KZ05O +w7u1rLq/sbr3zcdJQUhJd8TIzL3AxNtnRjAwLzg7QvfZvry3tsTG609VOikmKjNLy7Wxr7G5 +y2M8Oj9G2c7JuK+0vr3Zz7XTNjw9Sus8WcFfr706PVPj4/85LCxEura5vMKxr8w6LDEsOjIt +Qe+1rKyvsLW4yz0qKSsuMzY6W7K3rL3Ar8HrSj490brPvbG0vMG60c3G09nO0U1rX1NvSi4v +vGMzRDY231MyMkRXPjdFPsy9XdlTza25yc0+Y7q6W0pL08vJy9m0trO5Y0xOOzIvMUV3xbiu +tLezr8FvV0EzOjYtQHdn79VvR/d3PTxNUUVRVS9My1PXzNHI519XTUdLTEhFVTs2TF9Dyb6+ +3a6svK2tvMbEubatrbiurbbBuNEpOU42Qkk3RcbAxcdfR0U+KiIiIiIkKCtE71dXP0xRY1E/ +P2ddu7G0r6ysrKyyt7Kssba1tL/Dwc9vuLGxv2++/8pONElBV8vVK0BNPDQyMiwx7009/zwy +Ny0nLSgoMS43PefTtLy7vs/Oyms+PtW8urSusq2svrq6t62trq2tra2tsrCtvL++v9W972Nb +OkE4PjY2LC8mKTAqOS1ELjs+MC8uLC00MkhKTF/Nyb3Xysn3V9e+X83nwNu4u1m9zr69vv/R +ur+yt7e9u7rOvtHP979fs8W+xd3IQudPQlXvQEc7OT8v/yrRP78/VetEyEvHXbjDtd+zd7W8 +00TRa0//X8swxTlZPl87YzFfPj28V1FVZ2/fyUpJd7pOzcpbyLvRuFevV7p3tj2uvb9vz8JM +zF+9M8VE2z3/O28v1S09M+swRDxNNkJOW01Pd0/jWVG6S8+3L6wvuFe3b1esRqw3rUCvrj+s +M7rfxFdVu1GuNbU3uEW6OcYub0NZNT1KN9sw2Tw8SUw6Ty/OML9NPdFM39lFvTjH0cjMzLrB +wbbEuL3XrUyt67atv7nCvrzbt1e2UbpPwMzZU933SEhKvDfvN0JAQixGI04qPCdCJElMJFkj +Uyw+MjE2RT88XUhHxj+vU7m3v7usa6zMrLutrK2srK6suazLrLmuv66turO1tOO5ys/FU81M +aztKPzdAKUsiOSkrLykqLCorLihHI04oPzI+QDPPOl0+znfnw3fCzLr3rf+zuq69tK23rcet +rrmsw6y+razHrMuzw8y6b71L51V3Tl8+TTfrMGMyNMslXTAvPj42Qjc1QTFGPzrVOOM/V1tZ +02tOv8vTtlW2U69BsUZRt1G2d8lfu8jJV8Bv17xEvdHTxlm4S8nGSrpKtc1nuUK3XcFjRrhj +d87ZyffZzUnGT83jb1lRxmNv2VFnU2tRWU9JYzxrSENJPUo3STc/Qj5MOlE8RERGTU5bW2Nf +d+NV2V3Z/9Xv2dXNy83JxcfGwcq+xL+/xbvJvsnJycjN38rZyt/Ib8/r0+fb3+/jd2/nV+9n +a9332dfv0+f/11PbX1tdR908bz1HTEFRQltAUUhbS1FKSkxHT0RJQkZHPko9ST5ORkpMS1lL +61nb49/P0crbxc/AyMHHv73Dur+4vbe3ubK3sbK2sruzu7m7vbvDwMTIytvb43drT1lGSD47 +PDk1NTIxLy4tLC0rLSwtLS4vMzE1Nzk8PUJHTFFVV19v39PJyL+/urq2tLOysrGvsK+vr6+v +r7Gyr7Wytba2uri7u7+9xcfL0dfvd2dXU0tHQz89PTg3MzQyMDAuLi4tLi4sLi0vLzM0NDk8 +Q0ZOWV3vb+Pf1cnMw7+8uLixs7CysLGzs7W2uLi6ube3urW4ure9xMbX2eP3U1VMSkpHTkRO +RkJFP0E+Pz04NzY8QUNCPDg8NT47Pz8+QkBJTedRTuvDW+9MTP/Ru7S3vsPDvL66s7a3tra3 +tri8vMXIysfX51VTV0lPW11dVVNMSEU/QkZFSkNAP0hGdzFAQFFvTTUrR0m+u0s7191Z02c3 +SOutray5wE/fz7m+uMK90761s7m3srm9wctPQE5TU2drRkhITFc9MDMxLjE2LiwuLzM5ODg+ +OkI+PkQ8QlNvZ+PXy8S5tbO4tbOvra2tra+vsq6zsLa0tre5vL7FzOP/X1dOQE1NVUt3OkVL +RFU+Rjg4OD01OTUzOD9ER0I/OzxFQ01NRmNrX9Hn2d3Oyr+9w8TMwsa/vru/xM/Ryc3Tb2tX +d8zMzF9CPT1K9/9XSj4/P01nZ2dPa013b8zZ59/j0c7KxtHr09HGxL7CztvV09nXzNv/X1dR +R0pKWVVfW0s/QEM+QERNUU9OU2tnz8vM0d/P48rCxMnPy9vDz76/ycXPz+PPZ99bVWNO03fr +b+vjX+PJ42Nv63dTd8pHPkZZT0vV70I+RD44P29BPkU8Oz1KTkZDVz89Y0FrX29b/9nXvMm1 +x8nFxbS8ure4vLXHurW7t8OuZ8W+79fLuP//290yRUI7S1VjSTdCQj5ZSkBROVs/V91R39NT +72t3yte7xu/TTE5v/2PT0dHv68hX49vbd1nKTFFfdz1MzndPX8hCTUfjd0jIwzhdy8vLwr9n +OjI5Ljzd58K62ctryr/AvbxfTEIvNjZFY3fLyGfH4//O3cLDzLvDxba9urvBzmvX51dj61Fr +XV9fRudLRllEPj48ODUySER30e//a01jXc3Fx7TBur/J18fjxcW/v8LGzu/PZ2NfPjYxLy41 +OknfzMPJwsvR31NKODI1MTtOY8m7tbq5ubm6v73Oz+9f2dPHvLvCwutjRz9HOjxLPD9BPUpZ +/+Pr998/TEk//0/fY1dXU2/O/8y+077Gv8a+ybrGxs5Z21VVw8jJusvK1Vf/X0lrU1tHVV1T +/8XIwL3Pyk9MPzY6PTU8Pzg6PEY9SO9TU28+PTo2RkBNye/n505XX+Pnzb/Hy7/Py7y+t7K6 +tbq+u7i5trC4urO70bvNx768wsnBy9PFymfOW1dGOTQpLSoqMC8tOS0pLyUqLS04LjM0LTw5 +RcPIuLS+tsPVwNPbucy8z7q+wa6ut6yvvLW9triyrbG4tMnHyNHDyczEd9vnU05IRUo+Tkk3 +SjtDSUNJPz5DNjJCMTxKOEU+PEk9WWdTXVVIRD0+UUPXzM2/yN3dZ9/R28S9zsLE1+vNwMe7 +s7m3uLm+vsnKz1lrR0T/a9PHu8vXa0Q2MjQuNjg6PkBIX1Vny9P/zttLS+NOT9/ZW2tv53dT +udHvusVn03fPy76tsbCsv8lnQD02Q933wLLBvsrTd0RIRC41NCsvMTc9OllGPEc5MUc7SdHJ +uLi0r7i1ubO6vL7KZ1dPNlNbT7/P0cXf491rWff/3ePLydG9487Ka9vV/3fX/2vvTk1OT0Hr +TlPXTUxvQjlZP0RGUTlFTjZGRFFr787BzO/HU0Rr79/HucC1sLS2tLO8v8PO29nR19vH2d9d +TUY+PkpDRvdHRO9FS048RTc4MzU4O0NFWWdfVev3SXdna+d3zd3NvMfGub7FuLzAw8O9w729 +xM3b2V9r38jFs6+3srnDzt1PRE1BS01LXVNMT0hJR0JKTT5fSExIPkg+QUdLV0//W0xLQDo1 +NS4vMTA0PkX/X1/vVV/3783Xx72+ubK5sLWys7SwtbKztbi/vr+9wc7TxlvLwN3H1dFvV189 +RmtNR01FPlNFSdNK0989Pjk4MEtIW8PFv8fXVUQ2Ly8sLjlFTtXJ1+9KPjo2PExC0bzLtbjF +vL6+vbu4wMHM3dl3373IwbvRXWffTtvOx7/KvVvn519vXf9RSEZMRk5r6+vZ3V9LSz46TjhK +90fKX1P3T1lZ40v331vPycjIyePr10tj3U7ZwdfdyF9fzt/b2+tbTU48TzxNd0/r9/dV60RH +RD9NQt/jy8fByrzXv85vylnNzM3BzL7F68lnUdtMz9lbxd/Gvby7wsrvPFFKOHdja8/X29vv +Z1NEODMvLDA3O2vLy7vB2VM8Ny80NEFdV8vVd+f3Rmt3Quv3Z//J1b2zurCvtbSxuL2wubyv +uri2wMfZz01fV0BTPEI9R0pIVU1DPDoyND42Rk5DZ0FVSkRRS/dVZ1tL/0xr29O+vrm7w8nv +WVHj69vJwtnM52NNS0xIUVdO21vO09XKwsfRwdvj2dNvyef/zNXK/9nZd09jSEVXSetOa3dK +PUBGPlP3d8vMXedJR9V3xcDJvmPVyGfJw8XJusDNxcHJ0dPrT0tZUU9VW2dORF02NUEvMzk7 +PT5KPj49OkdBTc1n38Hr38rj983J2dW+zLy6uLC7sLe9vMHK0cd30/ff4+vVV9Vba2NHa0FJ +Tmf/zc/IyddrWW9jb9Vdb+NRSE8+PD5KOD8+O01ASV9fV91rY8bX0b/Z58LJ47/b17xnzcpT +3/dZZ+Nd2+9X411j/9fZy8L349NLTldKXV1TTVtZPWdKQsj/3evbW9vb38/O38nNd8zrzs/R +0+/PX1HdVW9fU1VXRExrTV3/T1lbTEhKTD9RPkldT1FV/0vd6+/PyMDEw9PLz9PEvry2t7e/ +xs/ZZ2Pn5+Pfz93b3+t3V+t33dfX2WPjTmNFRz9CSzo8Qzk+PTpKSDxIRG9f0cfJusjLw19n +791vxcfJxdfT129jUWdVa+NR0U9V3UxV39NZ/1tPZ1/r3+PR4+fr/87J4727xMXI0dvOV+/X +SmdrVUhjSj1jTU9Vd0Z3d13X28vGztfO1Wfd213R02fMd99fd/9XY0JbSEFPRlFMZ19NUUFI +P0pCRVNJd89db+fPzt/CysHMwr/Gx9PIU/9FXVtP0UfrV11nWVnbz9vIwse9xMPGycrJxc7J +02vn993vyWfT42/nW1lZ30/nTkx3VVFbT0RPX0J3UU3jb3fR/+vP41/vW29ZV1VKVVs/UT9E +Pj5AQj9FY0Y+SENNRXdf0+PAvt3E28/r28LOucW4uLm4vr7Gyetv31f3Y1NnTutfd11bW1N3 +39nZz8bNv8bIvr2+ubzJxsF3zW9b60lrZ0Y9RDwxPTMvPDg5OUU9O0hIY0ZM1+Nn181va+dn +6/ffx8zdwMzjvsjEvsfGvd3TydfJwsx3x2dVy0bn52/Pze/nxO/HyNfIzNPbxmNXX0lXSUZO +O0Y+OjM5OjA+Njo2P0s9TUpTa2/r3dPPyc/fyNnKwMfAv7zFvr7CwMTAwsXDw8PrzMLbytPV +Y9n/WWNrze9T/11VY1t36/9TZ3dPWUZFXT9EP09CP1FITklXTlvnX/fdz8njw+fr191fb/9T +719n719Ga0lMVU9db29da1Hn/2Pjz1dj1/fnzd/Gz8/ExMe9vrm9t7rIu7++wMfGzdnZ593n +W1dJPEM+Pj05PDwvMi41NzY6M0FKOj9PSVdP51v/b9nC08jFvr6/ur2+wc67vdO+xMa5wL3I +xMbEycfK0cjI283L18TE1cvGY9XXZ8tba11TRkhMQ0VAPjo5NjNDNDQ5Mi4xLi1DNTE+OTU9 +PD1dQ13VW9vRxufEvse6vLaytrWvtbuyu766ssK4v727vrrDwc7PzcTH09PL20tvW1lZb1NZ +UUhTQUdKRUdMTj9VS0pKSENCUUlnUf9LRktTSk9rY9tbVU9IW1lvb9/Za9fn2+PR39Hf1dnn +z9/T0crVzc3Ozdfd7+tdY+9v919XUV9OX2dbY+NXTndNY1dXU09PU1tvW2v3TmddV2v/1Wvb +7+/O09++y8m9xsu+0cjE2cPT79Xb/19Xa1fOb2ffX+PT1efvV9NRT/dI3WffU0nVQ2tP91lv +d07vUWNOQddL699Db1tHz0rN2UvLZ9XRS87L3bpjycdfvW/v00vMUdFj4/f/V2fdP2NnQONH +U9U9bzw/Tzo9U0I6RTxEQ0ZTTUrKS8vT3cHb0cnJxsS908C9ybS4wLTEurTGsbfGsr6/u8DN +tcHNusvNw0zDbz3dQ0FnQTJOLzU+LTk0KT8sKz0mPTYzQy87PTlMVU7KZ9PPyd/AxdW5yr+5 +xLm8urfHssTNutO9vne14/e478O7/77dSbdJ0chN41tE70RXSD5nPVVbPllJSFtO7+M80TU7 +3zDn4zbnO0xfQNFPTctJV8VEyF1nzFPGvlvB09e9yrSy16zfvbLXtbnPu99bvlPHzk3LRznE +M9H/NtEw/1843TxDX0BXTkBRPUBdP1VXQe9FRP9GV+tCY0dRWT9jY03PY2/D68XI47rHwba/ +urfBtrrFr+O3w8+/0du5Z8fTWb9f3c8+6007Zz4+XzdIPjNHNjlGPEE+QUdAS09OVWtX12Pb +yufHyf++yr6839HK68fA38/302vIxsDv3VdRz9nja193T2PP/2tNTVVn4+NTTEtLVU9LTkVn +XUzjSV9ZWevf5+f/779d09fv1+fNyeO+42POW9PGy85n3c/rz/9P219Ty1vXZ9VnX19dY11j +U+Pd3efnV1/fV9vfzXdfZ11f20ZO2U3db05ZTV1X/29Na0xRV1lb/3d3Z/fX29PX2/fZ99XL +19HEzsLVz9PX383J1czb3dtXd01j90ZMQkBPREA/P0ZRRUxFTFVBW0tb71Nvb07f29vRX9nb +zcD32c93zevR08zG0ci/zcnT58/Lx8DFxdvV2dXV09fX49fn51ljXVHdZ9vbU/dVZ3djWVNM +UUZMQzpCPj1HQEpJREhCT01ESE9N711VX0dVXXfd293P79vbysbAv7u+vr28v8LIzcHBv8jM +2d/j13ff2///Y+NjZ2dbXW9LT19OV1tNT1VVVU5NSkJORktTSkZMTEhKRUdJR0lRTlNbW2v/ +49/VyMfFw8PAv72+vb+8vr7CxcHFwMHJxs3RzePj//f3a2tRUU5DR0ZCSkNCPT09O0BCRVVI +TVNRd1//193V0czJysvP08/Z1cnn2+Pv1etnX2tvY29ZW2vn//d3a2djW01NTElOWUtMRkxK +TE5LS1Vv6+PXz8jEzMnEyb2/wMHEx77EycPGy8rJ29fb/9f//3ddb2v/X1lZW1VZUVdXd1tb +TFVVTU1bSk1NU1VPX05fd1dOSk5NVV1ba2d34+/r6+PVz8jHx8vHzcnT19vj3evf5/9dV1FT +UVtTTldVTU9LS09PW1dfX1dfZ2/n5+vr3ePb3efX29PT08/b39nn39PbzM3NzMzRyM/XzM7P +29fd09fZ3+Pva1tVTk1MT0pGSUE7Pz1KS09RVV9nV2N379/f49nZ3dPOy87M0dPV19nP2//r +Y11fb//v6+dva/f35+9v4+ff4+fvb2tnXVlTZ1tdb2N3a1tjY19rW1tdZ2tdb+/v32tra2v/ +/2dfXW9b92tjVVdVT1lXY2//3efn59PNy8vLzcnJxcjIxcjOzc7N2+v37+dZVWNfZ2NdWV1b +U0xOVVVZUe//d+vZzdPOz8zM08vNzs/b0dvf62drd+9rV1NbV01JS0xVTUZLTEpMSUdKQD49 +Q0lDR0VIU05OUVtb/+vf19vT19fR0c3Nz8jIysfJx8rV39XXz8/KyMjCx8nJ1c/Nys7Xy8rJ +y87Ry9fR0dvdd2tnY11dV11bVUpEQUdEPzw+QkA9QENGSU1VTldrd9nVys3NyMXDxMXFyM3N +z9vP2d/j9+/vb/9fZ2djV1VZU09XWVFTTk1NTUxOTU5NS0pKTE9ZX//d3ePdztfT29fR0c3X +0+d3693r79/d2+d3/+f379/r9+vv5/f34+N3W2NfV1t369/r6+vj2dnf29nT09nj29PR0dvd +29PR2dvXzM3O2dPX2d3V2+vvd1tXWVlNR0lJTEZBQ0lOTk9OV1tVVVVjZ2t3d9XZ09XZ0d/n +9+v/b1lRS0xLR0pLS0tKSE1VU1NOV2NjY2/r69/Z0cnNz9fRztfd6+v3b//v59nX19PRzdHV +09vX2dHO087O0c/LzMfJx8rKzc/b3dnT19fVz87b29vj629fW1VTW1FfU09RTExLSERAQT5D +QD9DRUBDP0pMTU9NXWtjY1tnX2drb/9vd+Pfz83Kzs3IxsPBwsTGycPJyMvV1d/f62dvXVdZ +VVNOT09PU1tdX2fv7+vf929nY/9nZ2dna19na2936+vd49/r7///7+/f39PT0dXX1c/P2dfj +5///73f3b/d36+fZ0dXP0c/V2dHZ39tra11RUUtLS0lJTUlETEpOT0xPT1VnX2/r6+9r/+vn +Z2dnX2NXW3d3//9v//9nY19jZ05XXV1fU1trWVdXU1dbV1FVVWdTd9/b2+/X0cvOycnKyMvR +zcvFxMG/vL++vL29vry6vr7Ex8vP0dvf5+trX1ldWVNPT0pBRURHSkxLRklLS01MTUxNTU5X +V1dfVVlRV1NRV0xKR0tESEdOUU9TU1tXX11nd3dr7+vb2+fd6+PvZ3ff593V2efvd29nZ3dv +993Z29fX1dfTy8nDxsXHxsTHycXFxMbHyMfGys7P2dvn72/v/+P35/9vWVVVU1dVV1tZX19b +WVNRUUpMS0pOTU5MTElHRkdIS09RT1dZWVlXWV9fX1tfb3fj3dXX0dPV09HLzM3Nzs7Nz8vN +09fb19Pf3efv/2NjX1tZVVdTVVVXVVdPT01OU1ddY2dra2v/9/9r93d36+/f9//na+vj2dHI +y8fJxsTExMbGx8rLz9HV29XX29XV29vjb2dvY2tnXWNfX11fV1FNTExLTUxISkpHSUhJSUVJ +SUpITEpHTU9XY2Njb2vv5//v6/f/7+Pb0dPXztnV1d/j5+vn//9v6+PZ2dPKycfGxcXJxMfJ +yMzKzs7T0dfb39vf69vvd+93Z1NbT09RUVFNSkpLS0tRUU5PTEpMSUpPXWNn9//v///3393d +39vd69/d3efn929v5/f34//db2NnZ+93d93V3dvd4+vj99/32ePZz9HOz9nZ429v///n7+// +//9dWVFVU09VT1VPTFdTU05RW19XT09RXVlrd3f/b//f693n6+fd7+f/9+vvb+Pf3dnf0dXT +1c3T0c3OxtHLzNPb5+vv79/33+fV4+/373dvb2fn7+/rZ+fj/29v52/3Y3dfV1lNX1FRTFNP +T0xJS01LTkpRTElHSEtIR0RISUxMV1lv9+/n18/TzcjFys3RysjMysjCyszLz83Mzs3KyMjK +zMzNy8zJy83TztnZ1+Pn793f/2tnZ1dTT1VPSUpJTU9PVU5LS0hFSENERUNHSklLTExDP0RF +S008SEZMS0dGSUtPTUpMSUhCSVFVT1V3b//3/2/v1dHHyr++v73EzcnKwMXLzMrNz8fJxMbH +xMDDvcfFy9nrX2dnb11TXVtOT2Nf7/dva1/n42NfZ1lZZ09NTkFKS05dXWdfVf9PWVtbUU1G +TkhDTUxITldf/2Nb7/fj49XnzM7MzdPRzdPXy/fO69nXy8/Vy87P1c/L28/Xztf/0e/f1dPN +999rb1tbXV1XX0tTTk5MP1E7Pzo+Qz9LSEhPU09vb1vb39PMzsPEv8O/v768u7vAvsO9x8zV +3WNvWetnWVtVTUxbVVdXVWdX42/XZ1lPSU1LR0ZLR01DSkZEPkdKTldr49/J59fTzdXZz8jX +53fZV19j71Ndd1lvb/d3Y2fd9+PXz8nHyb3BvL+/v7/Av768wb/DyM/b32NFTkE8Pjo6ODM0 +NzY1NTU4PTo6QUpHRl9db3fj59nKzMLGwMDDvsbBxM3Kxb/Izc2/wMrJvr/AybzMwci9wr3A +3cPTyNnv/19fTldNVVtMSU9JRUg9R1c/SDtFPzo8OTo3Nzo3PTo9Pj88Q0pMU1drd+fd39PZ +59fNx8O+v769t7rBu77AvMPGw7/BxMPMzNXf7+/va/dnWU9NV2djX2dbXU5VQ01PU11XUVVR +TD9VVUxbVXfr1czRysTO09XK0czFyc/Z2f93z3fT63dra1tfV+9n9+/j4+vvZ/f/3//r4+dn +Z1dbUVFPVUhDRkNBODtAP0hHRFNVX1tvb2vv283Fxr++vru9vb24v73Av8rM29Xf7/9nU0tK +RkxGS1NKV0pGTUlMSUdCP0dKR11r49Pd0dV31d/ZzMnPxMS7v7zAub+7wsTPxM/n91tbW1Fb +Z19d/3dvZ1NNS0tNU1NZT1NKSkxRTU9NSlNPTldTT1FdV1VOUVVbX2NbXf/359vbz9PrXedb +53d319XO08XJ0dtba2dr/+fPzM3NzMjJzcvTzdvM2dfbzt3N38vF0dHfz8vPz9HVd9dr6+tn +a11bR0hHTlFdWVlNR01LU1dRX1tfR0tKQUI/PTo7Ojg7PD4+SUJBSUBLSFVZ3+vXzsvIyMq8 +vr69vr67tra2srCxr6+xrrKztbm7wMbO12tdX1tVVUhOR0xBSUE/Pj5APEM9QDs/ODY5OTk1 +Ojk+PEA/RT8+QE9jV+Nnx8PEwMO+wMPKxMvL18/Zz9fbz+PZ5+9n6+fv987Ry8XTzMjJwsDL +1dXDwcfJzszHwOdXa2f/d05JSlvnX0pDPk1TUVdNU0VbVUk9PkRXU19Oa//jVVldS1VMX1XL +vrvvUz5dv7rHwrrVzefZ19HK6+fn1cbbPTAuzr2ttNtIQDw0ODhNb8G9vFdnX/9dTl3dwut3 +z8RFTGNvPd/328O9/0bdXUc/WU7/T2dZTzw1NVnZSz41LzRF3dlrW9/Ty7+9vtusrKw9LzT/ +rKysrK+vtO9GOz7Er6640+vba0c+OEHjwWsvQzovLzEqKUDnQuPMXzxNzGfru7/BucDVa8HP +x8bP1VlnWbu4zz85L1ljxVFK213OuCQpr6yyNSMoKKyrrMqwrOffNigpPbeszLzDsLTTST0+ +u7mu32P321U6MiswQfdnb1fIztdTPUNfuruyt7S9uNPZ18HJ1dXvVUlfRTY7N0I6Q0BbXdH3 +Wzk2Oj08Sc3fx2eyrSNPra2vUyo2Ma2ttNOtrchTKykqScvNN9u4rc0+ODnXur3VX9u3vkwx +LDlKY2NHd7uwtt9nY8C4tbu5sq64yklZ59PRV1Nn30s9MDY6QDw6RF3FTkFCTT5LV1tfuLBG +K66srDolLTe/rLrBra2wUSoqNUHfX0TZra3AOzhT429MTNG4s8o7LzhDPTc7Ss2yrbbXz8rG +1cjGta2tts5j2e9nSElr529EOjQyMjQuMTxLRD9jQzkySG/nUdHnwLvnsOs8raysQSvNv66t +rqysrLM0LUxVOTNXya2srMHjw7lRNzlT193vTz9DPS8mJis0PkxjyL282V1LV2PTwLW0t8nj +a1U+NTg+TU9MSkNGQTw5SOvf39fOwsjvb93ZzdPBure9uLW1uVXbvrPOW9+trKxAd8a9Slf/ +s665TDQ4RSgjIy1FS13jwLm84zs5R1E5Nz/ZzNn3W93nXUFD2cfKxbu5tL3My7+5wM3Py9f3 +WUs/Pzw6ODk1NDY+Pzo/T29j38zNzL/IzNPOytPRx7m8w7aztcnMwsrTvclnzK65SzdTUTo0 +Ok7JyVE1PUs2JictNDQ4Qte9u7u7s7bB09nKzONn3cO/ys7Ju7u9vLzFw9Hj393b3d/3X1FM +SDw2MTAwLy4wNjc5QUdJT2/j0cfBw8G9vsLLy8G7vby2t7q6usrLxcvTxsv/29PnU0Zv51k+ +RkpEPjwzNDg5MzdBREFFUVNRb+fr39HLyL+8urq6u7q/wsPIzs7O3f9vd19fWVNOTltbV13/ +b2NZW1lTU01LTVdfW1tf///36+/n087N29PV1c/T3dHPysrO1+Pr72dTU1VbT05FQUJCP0FB +RkxVVVVZY19dWVNMUVFLT1NXb+fd29HIyMXBwb+9vL69vb3CwL28v8LFwL7DztnR3/9ZT09O +Sj89Pj4/PD1AREdJR0VJTUtPXevf2efd49tnV1dfa19dWWNdT0xLU19nb+fb0c/P19PN0c7M +y8rDysfJzM7Pzc3R09PR1d/n6+v3a2NfY1lVT09PU05NTk5VWV1fY2/v72/37+vj9+//5+f3 +92NvXWNXVVVdZ11jVVVXUU9LTktPT01NTE1GSktMU2fd0crGxL+8uru8vLq6vLq/vb7Ayc/O +09vj7/9v7/9nXV9Xa05NTEdTV09OSlFRSE1IUUxZUU5NWV9TU1FXT1dVVU5bVU9OT1FRT09X +W1lna/fn39XL08nKzc/Oz83NyMrHwMHCwMPEycrJy9XT0dPd3+/na19TSEhPSkhPW1VTWVtV +TVFZXWNjd2/d3d3r2dXb6+fj/+/rd19bZ2NdW2NrZ/9jY1FZU0tPTE1TS1lVV1tTVWNjd2Pr +9+fr99/j59/fzs3NzdPVztPj29XO19vMw8vKz8/LztXX387L1dfd2ePb3/d3a+dra2drWVVT +T0pNSkVGSklFREtLTUZBSEdEQ0ZDSk9TTFNnY/9n49nj2dHTztHM1dXTzNPVzdXX1c3X1dHM +ysrGx8XHwL3Fxb6+xcbJzMfJ0d3Z2f9Za2tZWXdjTmtTOmNMODlTRDk+Pj46PUI+PkJFRz1T +90VCVdldP1/LRES77zpZvU1O28XIX9W418a528y8ysrZvbzfQsex1zi8v29HwVnTzNfTxme5 +y0XBtlPvxf+972fMSP/FTUNNX1c3OUdbOFVGQFtOTks4b/83Rk9LU1fr2VfZwNX30dnL91/r +VVfvS1Pj39HT0ca5vb7Dvb3Ezd/TzN/j2d/Z2e/v187d/2djUUpBQUFNVUpLWXdrX19XZ+v3 +d1NV919JWe/vUU/31VFb99VO78vRTd/r/03v3V0+2fdDSV/nZ9X/2z1Z3ddDOlu1zndR9+/M +vcH/07C1xOfXzt1vX0BC2b2+y763tLy+zV1LUUU5MztDTl9nX+fMw8fb72v3Y1dMTW/371tv +Z29rVT89RkRFRUlDQ01MQ0RTSz5NZ1lNd93jycTAwr/DyL21xMG/xdu6xO9nys7RxL5nT09n +b1l33T1300lMSU5vT0hfa0ZT687V/3dOS2fZz9/Jwb7IxN1ZV1lTR0FXY11ra1NNTldnSlFV +UU9Zb/drZ9tXTld3d+ffydnKwL7JxcjM6//f32/d093X18rO293r59fX329ZTldTRltZT0NJ +V+fVzNlLR9HByNtbPTtO00lIUVdf78zNV0hdVztK12NBPzk4O9vCz+/Hxs7MyN0/RGdTSN/L +x720r7G6uMDNd91nTk7n2dvIvcnOy87nX2tbSk9fZ//f1d////dTUU1ITk9XVU9VXVd3b1lV +WV9OS2P372N3W0lOX1lvb2ddY+fv/+dnTFFRU1fvU05rzMLAy1tLV1n/02dn/0RL08zZWet3 +Su+5usXj905fv7rMa9vHyL67ushf/9tv68j3RU7XT07XXT06RPdCTvdKP2fr/2tV72dVxsLn +59nL0c2+v+PZztvj49vvTFnda2fva19bW1lfZ1tr6//jW29fa2NLS13r911b99lnUV9MVdfn +V0ZId3fT38dbLEu1tetTOCkvPbutuLPFUz1O0f8uKjEtQ8asrLK6uMvEvbpRNzQ6P3e8tsLf +187O08bLXURMY83AtbW7xMbI2etjX0M9QU5dd+//Q0JHSEVLS01JT//3Z2PvXVVfb2v338// +Y2v3V1tdW09MX2NTW+vb6+PMzetZZ1tEXdnZ793Z1edf39dd08bX6/9ZUefNwb53SFFOTtPM +y9VrW/fvxsLdU0xbXd3HyN9PW13v5+t3W0pXWWtZa2/v59/n62/31dv36+tbWWvv2/dj0ddj +X83jd03f1d131XdKTnfR6+PV/1NEV/ffy8XZY/9bW1tj6/9TV3dbT1XIzGNHPj08P2PKy9fb +/1NJTD88PD5Gd9fFvsLFwMXGycvnb1dbW//v7/9n7+vb29PV28rb1+Pf2dHOzcrP1dvX09/f +73drW1dTWVdfU1NOUWPn3dvP31Vfxcv//9XrP013/1n/2/9M//dvSe/Hb01EZ2tX58PCyN9r +SEtEPjo6PDs6P9/Czd/j19nV53d3WVlbU1Ff19nb3ePRy8jCzc3Oxsa/vry9vb2+zNvX619P +SkY9PT5APkZHX1lr79nOzs7X3eN3629va3dZ3W/Z79/j9//n3c/dz9XT28/b0dfVd11OXU1M +SU5CQEZVS0dPX0tTZ91379njWWdr72vv5+9ZU2P/a+/n5+vX0crMzs3X72v/W09RTkxGS1tr +X3fb5+/V09fV2c/Z29nTz9fX529nW19TUVlfV0/r29PVxcfOyNHN08zDTMzN72/LZ2NFy2ND +wkhbTUdMOWdZTlH3XWvN5+vT2dfr411fWVtba/f/d9vvX9/j4+fd1+f34+//6//n71tZX01T +TVFRTFtbV1tRW1lf6/fr1dnV0czV29vX/3f3Z+f/529r92v///d3/+fv5+/r7+fd5+/v32P3 +a+f/7+P35+Pf3+Pd52/v393Zzs7Xz9fNytHP0dVr5/dTU0Tf0z9OXz88PmtVTmPXU0t3129f +a2NHR0hdT0NTzFFd2dPGPm/GX+vbyt9L69NbT+vrW/fNytHTzcfKzr/Dzc3T29n379drV1dd +UUxRU0tESk1PVXfr7+fZ19XP08nN1c/Z4//v52t329/j99vv//ff7+vf1+fn7293X2f/W09n +WWNfXWddWWNfVVtTU11TW1dXX1ln/2vn4+vZ1dnO1czPys/M19Pv7/9fV11fZ2dr/2//Y3dn +Y29jV11dY1dnW2NfZ19bV1dVT09MVVFNW1tjZ293a+/n7+/b2d3f39HX19fX19vf0+/n3dXV +2c3PzsfNyMnHxcTIyMfIyc/R09XZ3dvn5+/r92dnWVtdV1VXUUtKS0VFRURES0pJTEtLS01J +T0tOTlVRV1NXT09OWVVXXWN3b/fr2dfZ2dnT59Xf2+fX9+Pf49/T5+Pd39vV19vT3dXV18/O +0c7R1dXO183/3dHZ3+vf73fr3+v/73f3Y3drY2NnX2ddWWNbd1tra2djXVlbWVtZW11jb/f/ +72//d+vr/+9vd2v3X/9n52fv6+vv53dvd29v7/ffY/9v/2dv71/37/fv73fr/13d/3f34//v +//drX1t3WVlvX1dbXV1bXWtnZ2dja/9fb3dn9+t3a3f/b+vv59vd39vb3+vja2Pd/2d3//9r +2+P/387r1dnP0dPZ2dXf793X59nP987Ta83Oz9fr6+9n62NfXV9VV1tOTlNVTE5OSllRWU1n +Z2tr3+9399/v5/fn59Pb3+Pv2+Prd+fv3/9j91lfW1NXX1FfV1lfWVtZU/9dW+db2e/329fZ +3dPT19Pf0dvR19/T3///d9v///9Z93dra2tdU19RV01ZT1VXV2dra1tnd/9369/n2efn1dnV +19nj793jd9Vnb+fj6//fa2//7+d33Xd34/d3Z+9r3d/V0dXr39Xf3dtv69/jX2vn5133d2f/ +b/drd2dnX2NPW1lZV1NnU09RU0xPVU1VXU1XXU5VXU9rWVnv5+Nd3d/n/9Xf593v79l33ePb +3dPTz9PT1dHZ1c/P78/b4/fn711nW11r/1tv62//Wevva93rd+/P29/b39vb39XZ19XT59vn +a3dvW05bV1lRS0pKRklFTk1NTFn/d/drXdNrXefV79nR28rL18hnx9XvxUc/vfdBv8A8wtc9 +U8xdRtXRwi+7PWu7OMa1QUq5zji2OErXYzmwPzy2ON9b50xT389VSsRL42/fSknr71lGVb5K +33fr69nn1VvZydfn28fPytnT293Ozevn2+Pd/1FTUf9vTVNv/+/dV+PZ0ddVVWfKZ2tv78pb +QFVrd1VCP87May9bvsLTd0hRzs3/RE3IwNtfb//T109N29lVRNPG5zs4Pm/ZwcjIv7a9WT4+ +Pzc8Oz1MvrO0vrmvtMlVRD45Ojs+W7/Da01TSzo1O0z/0c7Iure2v9fVuMvOxc9d50vLU9HR +a0DNSVdOvtlL57XBLi+urccpJkE+wsnO262tyTYsNSwkJSguR6+tt7utrcTnTD03SNnvTr+2 +vetbV05Z289v78W7wsXCv7m3vstfR0xGPkBfd/drb1NBR009SE7vY1PVwXc/Nz333z5frqzL +Rcm760pXut/Iuss9tKywMy9Hb++709m+t8kvJy06Kio9Q125rLxN2bbMR0tdX9O+utXRu7nv +U9vVb8jCwd/Mvr/Z59HfX0pBOC4zNzo6Pj9FSD8+Nzk6Pzpd38nbz7y821XLra62zF27rq2+ +W9m2wL6/viv3razDLSlbTsvTzWe0rro0LC01LjEwMTu6rblJT7/E1VtZRG+8uNVT37/FV09f +787AzdXdxclvRUZNS2fv91tdV0g6NzU3Njg7REpNU2NnY03rxsnGwcK9w7+/vlnZtK2vss1j +ObyvrVE4vK13NEe6xc/J2Tk5RVNATOs8KzdLPjVbxl9DT189NU/XSkvOtLu+t7TAvb6818/E +v+PXzsT/U05LRFNv/0tNY2dRVUtBO0zrazs6P1FVb0k+SGtZPj/PyNl3y8VrWcC5ubG3wFdb +yLe5ub7ZO0fMr733T10+NzzZydvRbysszq9nLCYuPe+2t+9jv8Y3LjVIP07O02vCra/Jzr/d +3cu9zc69u91RUVE/SltbPUprd11rW1lVb1tXT3fO01c+TU5nT+PrzMrH0/9f/9fR31/TybjB +Pzhrr7PBRT7rt7LROUHJvj41O++2rsk0JyxTz99ES+/D11szOE1rZ1lPd8XJU0NASufOzm9b +2bq4w8fGxsnK51VR48HIWVFMUVNJRklP6+9b9+vfy8zPzdvX2cvN6+v/Z3fnW9nrzONdSlFZ +xMZbO0zP20NLZ105O85rPUDDTVtR2etX2bo117PBLzBbrsvBwsVVybe7Qk53d0VVV0ZA09dn +PVHba13/UUI+VeNXRk9fVVlv42/v18rT0869wMPJzdXOwsHZ09HXZ2vv419bY0pHU1lDS0xf +b1/v70Zj38nM68zAz8Nra8PHsrlny9fH01XIvlFvS9/jzclJLTnVzGc2Liw5a9dPMjtNPTlD +zkZRXVE2PFvM/9u+vb28usjb073H083L08jCvsvZ1dFfTU5PW1dTW1NAXVlvT0prX2fPWVdf +zbrBd9vPz81RRFnbvLXdU1XV5+NPWV/V72M4S9/nVV1X2T9Fw81TWXfDvk5jxcd3vlVMSsy5 +zOvn2V/jW+/dw+vdRUtvb0rb183jWUpFOz1nUWtVRktVT3d3WV1TV8vNa/9n3+dfTk1K/2v/ +12tnyt1Tb1nvvsjO1+/Z690/48fB1XdEUWNXv80+z9tvxFHj2e+7wz5ITOu4wf9dW8+497vR +/3dd/8F3vb1XzcxXd8e/yD9ARj9K93dnTmdPOjg+ODs4OUBGXc7ZY2d3ysTBys/Pz9HPzcnJ +ycbI59/Mb9Nba+9jW+/Z33f/XU5ZREhTS0VGP05KRFFEO1NnWV3fzN3DvMtJWb++29Oyw0NZ +ycK2vudLTve1XUHOucTnQUNTXcO6w8fE31FDOz4+Ql9X99vd599339njyctRVWNnXUVGU0hN +X0tETnfbV05VW+PVz9vvz8HRWWf/73dM/+tPWeNbQU1nd3dfUevra8e93U7vxL/rRNe5w9fK +//e9xeNnV13Hzl/LPjbTt2tFOjpn42PJ20zV401GPUxXU09KXW/Nv87Pyb/Gy9tn0cLI02f3 +193v6+93a9fT///3d9HT493b39nvVU9nb1tNRkBGWUpDPUdPTENHRkpHX2dVTOPZUVm7ylXV +sdtv97fnz765d//Tz2/P/2//xdlORszF6z/bZz4+T0k/P01LRkNKS1Nfa11399Pd2dfT2c7N +0dPdy8rGxcrMysvMzs7O0cbJ3d/r09/f3/f3b+tjX2djZ29rX1NdZ2tvXW9379nvX13r61tZ +U11RVUxHSUtOSExFSElLTEBKSl9bW2tvY/f/4+9d53fj3evf39fR09vTzM3R09/d1cvd1c3X +1cvZ49vT4+fn49Xj3efR3e/d2ffvd2Pn//fvb29v/11jU1VVV1NdUWv//1n/a+tn/2tf5+PZ +5/ff5/9v9/9dXXddY29rY/93X2vv/2tna/djY1tn63f/d9v/b+9n72//X/fr4//v73fj//f/ +/2vn/+Nf42/d/+P35+ff//93Y+93/2df7//dWV1n6/9rXVvrd+t3593j73fvY2v/X1dv/1VV +X+9jZ/9vb//rb29v2+vf2c/r3c73593j79XVXefA7+PDyt/E41vAdz/b02dT019I22NFztdn +a11r92dPX/dN611T/1fnY2NM10/vTUDBOk9fRlPTPl3nOsrFP1Hda+P3791Jz8FdXd/Kz9X/ +/9PD/1v32ePr9+/TzdHV69nM2ffVy9P/09fb1///3+/j/19j1+9MTdnnVdvjW0ffX01R3dFN +V29JTstRS+vIdzpV0T9Pd91TVcm+S0q9xks+WbzJVUndz9NfSMC9w3fr0c9ROj5J7z09RM/T +XVvby9vI1VFr2fdHVWPvSVvRXU1d2c1v49XN68vI5+fFv9/VxcXT0c/M513Tb19b929RTmNK +QFNGTVlRU05F62tNUWN3XWvbSVPOU09T2c1jS2PXy0fKu79fSsy/d//V0azRSGe8wWNDz8HP +y1nZzdNdR2e/S1Pf70tfV09Cb11BSO9dQERvRj5TTk5KTF9LT13v29/v1ev3VVf3b2/j529Z +z2P3z8pX78TVWdu+3+vf0cDM/92+zv9Pz9HnU8nL61vXx+fdQkvfW0FI3czZ3/fvY11da09n +RXfP30df/9lR4+9vX+//SVljW0//a1Pfxe/vzNHG0dHfzdfb2c/37+N342tv/+NXVetjV1FT +W01GUUljX1lT7/dvTevX21tdzc7j683N09fP1+Pf905bT1lIU//3Tl/Vz01v0e/3VVvIzEhb +93dTXedrWbzTTNvB30j3w8Rnv8fZ1clrb9vG/0nGykpDa0hBT04+X/9NRlfvb2tV62ddSEl3 +Y0tj3dfV1dHbyt/r09PPxN/XyL/L2cu+71PO0eNbz8znd9dd3ddfW+fdV1FfVUZjVUtO/08/ +Ve9HT11VW9XvV2fMxetHUd/VQj9b3UxIR1XTd1Vb49f/Rf/P41Vj2d/jXffP0ev35+t3d1tj +z+v/28rK49nTa8C/7/e/ws7Gxt3Jxl1jxM9V38xVb+9PTOtPR0ljU09XWU5nY0lf711T93dV +XV1OXVljWWPb/2fn2dXn68zN3dvb/+ffZ2vn52tf72tRW3dbW11Vd2tOW/dTWXd3W+Pv7+vP +9+Pj53fj419n4+N3Z+/j9/fr6//nb1vv6+Nv79/TZ//j7//n6+v3z+P/59nrb9fr79/f4+/d +4+vf2+vv5+tnZ3dvZ2tnX19nZ133XVlTVVldZ2NnW113/2tv72f37+d349nn3d/V09vb3/fr +a2Nra1lZa19nX19TU19PT1VLTVVbUVFVWVtZX1dvd3dr3d3V08jPzdnP2dfR19fT09fb2czX +3czX2c3d39nf7/fj5+/d2+t333dvY1NXU11PV19bVVNrV2tbWVlvX3dd6//v63fv9/9f71/f +a+//3eP/92fd399v79nv9+vra2//a19TY09ZV1ddT1FOVVdZX1/vXf9fb/dv2f/d09nf09fX +3dfZ1+PR09PR09ff3dPj1evb19v36+/v4+fZ3e/va/9jZ1VbWVVPW1lXWV1bZ2NfX1VbS1lN +U0lJWVVNXXdfb3f3991r2e/P1dfX2dPj29PV09vT3dPbz9/Kz8/dzs7f1+fj3+PrZ3fj7/93 +Z1tjUV9LVVVPUU1KS01LTUhNVUxTUVlTW2dZd2tvZ2Nf7+dv39vjz83O0cjNztXI2czTx9PK +ytPL1dHbzc/T19fn7/93X2djX19XV1VbT1FXVU1NTldRTFFOU1VZY1NXb2NrW2Nbb2vr/3fn +Z///7/fj59/b4+fr6+fr5//P29XN1cvjz9vZ2+/P2d3d29XR39n/7+vn72P3b29db19RZ2NP +Y19dX1VdZ1lZVWtfd1lbY3fvd+93X/f3Y/9v//9vWd3dd//jb2trXVtfV11fY1n/WU1vWV1b +d2fv493j1dvR1czdzs7PzM7HzMnb3ePv39X/z9nf29/33efjd2fnZ2tfd19fV3drd1dna2dP +VV1dV1lZZ2NrX/9dTedV/2dX51lnX2f3Z+P30/fn9+9f591rb2PvVV33a/9r7+/ra3ffb+f/ +d+P/79nr3czVd83Ry+vT2+Pd39fv5+vn2ff/429n999f/193Z+/rb/dvb+939/9RWV13TEtr +U05NU1NXTENTWU1MSUxdd1NZ9/fr/93V19PN08zP2c3j18/X48jN3czZ0dnR1Xfr7//n5+v3 +62vr53ff4+vj3+dv91lrZ/9nW2trZ0pdTldRd11ZTlNnUWtbZ11nW+//W1dZU/9P93fv33fr +42tf2evPb+fv5+dn42ff39vnzdfj/3e6Vb1r39XZ1dPnzWPHa+dj2ePfSe9Na1v/THdZY2P/ +411rY2dPVevvZ+v/b0vV30TTY3f3/2fbV+Pnd2/rV9FdY1t3Tk93X05b61dnd//nb9/O1dPJ +ysLJycfL383F1dfP1+Pb59X/0//j51vZZ2tjX11ZX1dMU0NJRkdbTVdKd2NjVVFOSVdTY01r +Z0/jY+Pv0+vfyevf79XfVclv41X/W0/vVe/va+fj02vvzkrNy1vf58tR1cJvzcrv38zNzMzK +0b/b6//Xb/fE3cX/08pJwP/b51lbTe87Ttc5/0NExi652y+0Lsn3N8tLVzi9PTXEP2/nQ11b +W81Ld8VB18w2x0TA2U9r0dXT9/fbxE7f72PFWc1Jz8vT79nD3cDDZ8S668P/XbvGTcPdv13/ +x9Pnx+tXy2vRTzr31ztM7z5vWUdTQ0zbPDjOU0HrTlNNz1VdTffvWW9N7+P/R2fd2U/OTV3Z +W0dL31FH68tZ0d/P2cr30f/M/2PGy8rC48i7ycBfu71jy9tjumvXzP/Ld1fZW1XdS0/nUU9X +X01bQ9FTPf9Fb1tCb0lX2T1X0VHbV0jnU81KP75RY8rrZ8LZ7/dZwWtOv/drxv9bu0y5wky6 +TffXPtnf/+PMUW/Z//dCWVnfW1NDUc9v4+dVv9dVZ1Vv2UZN6+/VU2Nf/+t3S1dv72dGXcx3 +a//j2//3Z3fjzlNO61Pb70xr41ffb0/ba2vfd+PK1c3CztnX19nX0cbRz8fVxcPbydfZ083j +3c/jW1vf49/P1ePf1+d372dbS01LSj9MSEVHSkRKTERESEpDXUFLTUlHRk9ZVU1nRU9bVWNb +3/fv2ev349v/0+dr49PTys/RzsvXzdvJx9nH2cjLzc/Rx8vKycvIzMXOyMPIxcjPzdHb2evX +02/jZ3f3VWNrWWtdSE5LS0tCR0dESUpISEhHSUBIRkhJRElMSkpNSFFRTE5KVVFRU2Nv2e/v +zdvO1cnLxcfAxMPCw8jEyNXG2c7ZztvVzdXT0dHPz9PZ19Hj09fb3dnf3+//d29TTldOSkVF +Q0dHR0hCSkhMS0lVTUtOSU1OWUxfU2v3V//Z29HZysnIycHIvb2+v77FwMXJz9PX6/dbb1tX +WVtVV2dnUWtfWfddXWf/6+dn7+fv5+9n32tnWVNZVU9NT09OT0dZTWtZU1tTXVVRWVNTV1FV +XV9jWVl3b///b2d3a+vb2cnXzsvOzMzKzcvFzsXDysTHw8rKxMzK0dHT39Xd59vr3+P32+Pn +32fdb9/r69vv79/v493v7+9db1tjVU5XS0tKSkVJRUQ/QD89QTw/PDs9OzxAPD5BQ0RLS1FR +W2dd79nVyMPCv7y+vby7vLq9ury4vb25vb7AxL/DyM7MytXZ2+vj/1tvV11ZWWNdb29TW09f +SltNTFtjVVNTSlFKRExISkhNSE5JS0xLS05MV1NfV2tfX1VbZ2v3/+fV39Prys/d09Xf39HV +3d3KycjT183f0+fj29fT3ePR4+Pj29/P59vv3+/r59vr1d9r9+//d99Zd1dRVU5dTndnd2Pr +Z+tjY1lTU01rUU5ORktPRUpNS1lPU1lMb1lbVV1vU2tv72fn2evZ0dPNzcnPzcnKxca/xMC+ +vr6/xca/wczIzM7P3dPf/29v92dna1VMU05DSFFRQUtBQT8+PEJAP0E/QURGSUlNU1VdZ1ld +99939+PPd9Pd3/fP38/b1dvXzsvPzNfP48vj1czZxcfIy9PAxcbKxs3Rz8jH2dXT49tf/+db +d3dnY13rTWtRWVlDW09MTUhJQUJIS0ZJSU1ISEtKT1tPXUxfTVdXXV33Y2v33f/X2+v/39t3 +zd/X3eff1d3Z3dPv6+fv3dvZ18jHy8LIx8jHw8jFxsfNzuPf23fZ3fdr/+9fWVdVU0pRS0hP +R0pBS0tEVUtTT1lITE5RT2NTX29nb+v32efTz9HIysvRxsjLzcvJys7Mz9XT1dfd3dnj28/d +3e/f9+tbXVVTW0hPREtIRlFHT0xPSklJQ05GSVFPTl1RW1tfV+tvU3dv1eNr99/r19nZ0dXb +ys7VzMnKysrMzcvR09nX0+Pd1c/T0dvj593Rb+PZ6+fj5//rW2/vZ/9jZ2tjb2Nj73d3a2tr +d2dbb3dnWWdV73dbd1FrUVlMWU9fVV1dW1n/Z/9fa19VWWtbb19V19dd4//XzG/j60fE29nJ +VdXDVczZVdvF/93bW9tOY9dPb2dJV1FOX0RX/29rXW/v5/f3593Z0//XzufRztPnY89n5+tr +3e9v3+Nvd1vfb2/dY2Pf3e9rW3dvWetrVWdvY13rZ2tr2Xfb4+/V791j7/fv3f/rd/fnd9nr +a+td//9Vb1dn429fZ3fra3dnd/djW1XrW/93X293Wffjd2PnVXdnd1f/a11j92ffXXf3791v +5//n32P3a+Nj01fO/93P99fb2+fT2d3n7//d5+fr5+Pf3czZ2dPT19HN3dnX6+v/a//3Y3db +V2ddXWtXd2drb1lRWU5bYz9IW1VXd0j/W1VvVVvbTmtOY1F3WU5XW19vV11fV19bV/9rb9vX +69Pd29fV39HZzs7NzcrM1dfG29PM29PZ38jT68fN38hZ68lN01HRT2vnWdVX91NZZ1N3b1tv +T2NMX1H/UVVbX2tVZ2NPVVdjWV1OWVVjT1VZWV9Zd2Nf7/dv49lrzslnv9fFv9nr38nvyt3f +zmfOXd1d//fX4113V3dZ91f/71ljV1dXZ3drY19nV09XW19ZY1tVWW9bWWNnY29j42vj1+vj +zMrOzGfna8JVvlfZ3+93601vd//Td29jd1FdX+/352Pr//fv7+/Z2f/j6+/v/2v/b3dVWe9f +a2NjX3dvX+N3d9vZY9XXWcdZxshT3WN31ddEyU9O7/9ZX0RZXWt3V1tPVU9bTmtdY3dba3dr +79nf29/d5+P/a2dr62fr53ff6+vr3d33z9nR19Pb2c7bz83P593v2d932/9vY03n12dN70jv +//9O70ffRtlX/01bZ05ZX2NJX0pOX2NVXVdTZ2Nv72P35+fr1dvZ2dPR08vR19PM49XT59// +4+vnb+vn/+fv52/ZW+Pvb/d3a11na+9nb+dnZ+//a29rX2NZa1tZY2Nfb2f/a2/vX2v/91// +//f/4+Pr6+/v4+fj7+vdd/9vb29rd2/3d3dX3dnvX19P49n/0WNr32dv/1nv3etvb/fr29vX +49/d1+/v3efj92tvZ3dvb3d39/fv5+/r7//j6/9db2NRZ09nXV9ZV11rWVljb193Z2tfb2Nv +a2tnX2N3Z+vj79/r3d/Z1c/R087bzdvZ2+Pr28/d3d3v7/f/92Nra1tXXWtXWV1ZZ3dfZ29r +Y2dbW///929rb2/rd1trb29X/1ddXVnvX29j71/ra+fn/2933+9v29HT30+/zdfZ3d/Lzr/f +0c5ra9nV1+Pj3Q== + +--Outermost_Trek-- + + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Digitizer test + +Received: from hanna.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA29550; Thu, 3 Oct 91 13:04:23 -0700 +Received: from thumper.bellcore.com by hanna.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA19374; Thu, 3 Oct 91 13:04:04 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id for MRC at CAC.Washington.EDU; Thu, 3 Oct 91 16:04:01 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id for MRC at CAC.Washington.EDU; Thu, 3 Oct 91 16:03:59 EDT +Received: from Messages.7.14.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.40 + via MS.5.6.greenbush.galaxy.sun4_40; + Thu, 3 Oct 1991 16:03:59 -0400 (EDT) +Resent-Message-Id: +Resent-Date: Thu, 3 Oct 1991 16:03:59 -0400 (EDT) +Resent-From: Nathaniel Borenstein +If-Type-Unsupported: send +Resent-To: Mark Crispin +Return-Path: +Date: Fri, 24 May 91 10:40:25 EDT +From: sau at sleepy.bellcore.com (Stephen A Uhler) +Message-Id: <9105241440.AA08935 at sleepy.bellcore.com> +To: nsb at sleepy.bellcore.com +Subject: A cheap digitizer test +Cc: sau at sleepy.bellcore.com +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary="mail.sleepy.sau.144.8891" + +--mail.sleepy.sau.144.8891 + +Well, here's a sample +--mail.sleepy.sau.144.8891 +Content-type: image/pgm +Content-transfer-encoding: base64 +Content-Description: Bellcore mug +Comments: 256 x Image wrapped by /usr/sau/bin/fetch_video +Date: Fri May 24 10:35:57 EDT 1991 + +UDUKMjU2IDI0NAoyNTUKAHaPj4+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p5uCaWl2dml2dnZ2gnZ2goJvfHx8aXx8aWl2Y1dKMTEx +MT5KSkpKV1dKSkpKSkpKSkpKSldpdnZ2Y1dXV1dKV1dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPkpKSko+Sj4+Pko+Pj4+PkpKPj4+Pj4+PkpKSko+Pj4+Pj4+Pj4+Pj4+MTExMTExMTExMTExMTExMTExMTExMTExAAB2iIiIiIiIiIiIiIiVlZWV +laGVlZWVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6uurq6urq6uqePdnZpaXZ2aWl8fG9vgm9vgnZpfHxpaXZ2Y2NjRDExMTE+Pj5KSkpKSkpKV0pKSkpKSldXaXZ2Y2NjV0pKSkpK +SkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPj5KSj5KSj5KSko+Pj4+Sko+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMTExMQAAdo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6en +p6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLShlXxjY3ZpaXx8aXaCb298fG98fG9vfHxpaXZjUEQxJTExPj5KSkpKSkpKSkpKSkpKSkpKXW9vb29dXV1dSkpXV0pKSkpKSldXSldKSkpKSkpKSkpKSkpKSkpKSkpKSkpK +SkpKSkpKSkpKSj4+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTE+MTExMTExMTExMTExMTExMTEAAHaIiIiIiIiIiIiIiIiVlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6u +rq6urrq6rq66urq6urquro98fGNjdnZpdnZ2dnaCb298fG+CgmlpfG9jY1c+MSUxMT4+SkpKSldKSkpXSkpKSkpKV1djb29jV1dKSkpKSkpXSkpKSkpKSkpKSko+SkpKSkpKSkpKSkpKSj5KSkpKSko+PkpKPkpKSkpKSj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+Pj4+PjExPj4+MTExMTExMTE+PjExMTExMTExAAB2iIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq66urq6urq6rqGVgmlpdnZpdnZ2aXx8aXaC +dnZ2dmlpfG9vb29KSjcrNzc3RERERERERFBQUFBQUFBQUFBdaWlXY1dXV1dXSldXV0pKSkpKSkpKSkpKSko+SkpKSkpKPj5KSj5KSj4+Sko+Pj5KSkpKSkpKSkpKSkpKSj4+Pj4+Pj4+MT4+Pj4+PjExPj4+PjExMTExMTExMTExMTExMTExMTExMTExMQAA +doiIiIiIiIiIiIiIiIiIlZWVlZWVlZWhlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrqurrq6urq6uq6hj29vb2NjfHxvb3xpdnZ2dnZ2aWl8fGl2dmNjUDc3JTExPj5KSkpKSkpKSkpKSkpK +SkpXY2NjY1dXV1dKSldXV1dXSkpKSkpKSkpKSko+SkpKSkpKSkpKSkpKSkpKSj4+Sko+PkpXSldXV1dXV0pKSkpKSkpKSko+Pj4+Pj4+Pj4+Pj4+PjExPj4xMTExMTExMTExMTExMTExMTExMTEAAHaIiIiIiIiIiIiIiIiVlZWVlZWVlZWVlZWhoaGhoaGh +oaGhoaGhoaGhoaGhoa6urqGurqGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urqulZV8Y2Nvb29vfG9vfHxpdnZ2doKCaXZ2dmlpaUo+MSU3NzdKSkpKSkpKSldKSkpKSkpXV2NjY1dXV1dXV0pKV1dKSkpKPkpXSkpKSkpKSko+ +Pj4+Sko+PkpKPkpKPkpKSko+SkpKSldjV1dXV1dXV1dXV1dKV0pKSkpKSj4+Pj4+Pj4+Pj4+Pj4+MTExMT4xMTExMTExJTExMSUxMSU3AAB2iIiIiIiIiIiIiIiIiIiVlZWVlZWVoZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6u +rq6urq6urq6urq6urq6urq6urq6urq66urq6urqurqGIb29vY298b298fGl2dnZ2dnZpaXxvY3Z2Y2NXNzclMTE+PkpXSkpKSkpKSkpKSkpKSkpjY2NjV0pKSkpKV1dXV1dKSkpKSkpKSkpKSkpKSkpKSj5KSkpKSkpKSko+Pj5KSj4+SkpKXV1dXV1dXV1d +XV1dXV1QUFBQUFBQUFBQUFBQPko+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMQAAdoiIiIiIiIiIiIiIiIiVlZWVlZWVoZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urrqurq6urq6urq6urq6uurq6urq6uq6b +j29jY3Z2aXZ2aWl8fG98fG9vgnZpdnZ2aWlpSjc3JT4+PkpKSkpKSkpKSkpKSkpKSldXY2NjY2NQUFBQUFBQUFBQUFBQUFBQUFBQUFBQRERERERERERERERERERERERERERERERERERERFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQRERERERERERE +REREN0Q3Nzc3NzclMTEAAHaIiIiIiIiIiIiVlZWVlZWVlZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6uq66uq6uoYhvb29jb3xvb29vb298b298fGl2dnZjdnZjY0o3NyUx +MT4+SldKSkpKSkpKSkpKSkpKV2NjY2NXV1dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPkpKSkpKSkpKSkpKSko+Sko+Pj4+Pj5KSkpKSj5KSkpKSkpKSkpXV1dXV1dKV1dKSkpKSkpKSkpKPkpKSkpKSkpKSj4+Pj4+Pj4+Pj4xAAB2iIiIiIiIiIiIiIiIiIiV +lZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6urq6rpuPdmNjdmlpdoJvb3x8aXx8aXaCdml2dmlpaVdERCUxMT4+Sko+SkpKSkpKSkpKSkpKSkpjY2NjY0pKSldKSkpK +SkpKSkpXSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPko+Pj4+Pj4+Pj4+Pj4+Pj4+SkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSj4+SkpKSkpKSj4+Pj4+PgAAdoiIiIiIiIiIiIiIiIiIiJWVlZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGh +oaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6hgm9vb2NvfGlpdnZjdoJvb3x8aXZ2aWl2dmNjSjc3JTE+Pj5KSkpKSkpKSldKSkpKSkpXY2NjY1BQUFBQUFBQUFBQRERQUFBQUFBQUFBQUFBQUFBERERERERERERERERE +RERERERERERERERERERENzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N0REREREREREREREREREREREREQAAHaCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+Pj4+hoaGhlaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6u +rq6urq6urq6uurq6urqum492Y2N2dml8fGl2dnZpfHxpdnZ2aXZ2Y29vXUo3JSUxMT5KSkpKSkpKV1dKSkpKSldKSmNjY1dXV0pXV0pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSko+SkpKSkpKPkpKPj4+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4xMTE+ +MTExMTExMTExMTExMTExPj4+Pj4+Pj4+Pj4+Pj4+AABpgoKCgoKCgoKCj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKGCdnZpaXZ2aWl2dmN2dml2 +gnZ2dnZpaXxvV2NKNzclMTE+PkpKSkpKSkpKV0pKSkpKSldjY2NXSkpKSkpKSkpKV0pKSldKSldKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPj5KPj4+Pj4+Pj4+Pj4+Pj4xMTE+Pj4+PjE+Pj4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQAA +doiIiIiIiIiVlZWIiIiIiJWVlZWVlZWVlZWVoZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6uurq6urq6rq66rq66uq6uuqebiHZdaXZpaXx8Y29vb298fGl2gm9vb29jb29XSjcrKys3N0pKSkpKSkpKSkpKSkpK +SkpXY2NjV1dKSldXSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSj4+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTE+Pj4xMTExMTExMTExMTExMTExJTExMSUxMSUxMTElJTExMTEAAHaIiIiIiIiIiIiIiIiIlZWVlZWVlZWVlZWhoaGhoaGh +oaGhoaGhoaGhoaGhrq6hrq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq66urq6urquoYJvb29jdnZpdnZ2aXx8aWl8b29vfGlpfGlpXUoxMSUlNzc3SkpKSkpKSkpXSkpKSkpKV2NjY1dXV0pKSkpKSkpXSkpKSkpKV0pKSko+SkpK +SkpKPkpKSko+Sj4+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4xMTExMTExMTExMTExMTExMTExMTExJTExMTExMSUxMTExMSUlAABpiIiIiIiIiIiIiIiIiIiVlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa6uoa6urq6urq6urq6urq6u +rq6urq6urq6urq6urq6urq6urq6urq6urq66urq6rpuPb2Nvb29vfG9jdnZpaXx8aXZ2aWl2dmNvb1dKMSUlMTExSkpKSkpKSldKSkpKSkpKSkpjY1dXV1dXV1dKSldKSkpXSkpKSkpKV0pKSkpKSko+SkpKPj5KSkpKSkpKSj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+Pj4+Pj4+MT4+MTExMTExMTExMTExMTElMTExMTExJTExJTElJSUlJSUlJQAAdoiIiIiIiIiIiIiIlZWVlZWVlaGVlZWVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6uurq6urqurq6urq6h +fG9vb298fGlpfGlpfHxvb4J2aXZ2aXZ2aWldSjElJTExPj5KSkpKSkpKSkpKSkpKSkpdXV1dXVBQUFBQUFBQUFBQUFBQUFBQUERERERERERERERERERERERERERERERERERERERERERERERERERENzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyUxMTEx +MTExJTExJSUlJSUxJSUAAHaIiIiIiIiIiIiIiIiIiJWVlZWVlaGVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urqhj4J2aWl8fG9vb29vfHxpdoJvb3x8aWl8aWlpSjc3JSUx +MTFKSkpKSkpKSldKSkpKSkpKV2NjY1dXV0pXV0pKSkpKSkpKSkpXSkpKSkpKSkpKSko+Sko+SkpKPj5KSko+Sj5KPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4xMTExMTExMTExMSU3Nzc3NzcrKysrKysrKysrKysrKysrAAB2goKCgoKCgoKPj4+Pj4+P +j4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p6d8aXZ2Y298b298fGNvfG9vfHxvb3xvb29vXV0+MSUlJTc3N0RERERQUFBQUFBQUFBQUF1dXV1QUFBQUFBQUFBQ +UFBQUFBQUFBQPkpKSkpKSj4+SkpKPj4+Sko+SkpKNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyU3NysrKysrKysrKysrKysrKwAAdoiIiIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGh +rq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq66urq6rq6urq6urq6PgnZjY3xvb298b298b298fGl2dnZpdnZpaWlQPjEfHzExMT5KSkpXSkpKSkpKSkpKSkpXY2NjV1dXSkpKSkpKSkpKSkpKSkpKSkpKPkpKPkpKSkpKSko+Pj4+Pko+Pj4+ +Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMTExMTExMTExMTExMTElJTExJSUxMTExMSUlJTElJTExJSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6e0tKenp6enp6enp7S0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0tLSnm3ZpaXZpdoJpaXZ2aXZ2dml8fG98fG9vb29dUDclJSUlNzdERFBQUFBQUFBQUFBQUEREV2NXV1dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPj4+SkpKSj4+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTEx +MTExMTExMTExMTExJTExJSUxMSUxMSUlJSUlJSUlAABpgoKCgoKCgoKCj4+Pj4+Pm5uPm5ubm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oY+CdmNjfG9vfHxjb3xvb298 +b2+CdnZ2dmlpaUo+MSUlMTE+SkpKSkpKSkpKSkpKSkpKSldjY1dXV0pKSkpKSkpKSkpKSj5KSkpKSj5KSko+Sko+PkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4xMTExMSU3NyUxMTExMTElMTExMTExJTExMSUxMSUlJSUlJQAA +doKCgoKCgoKCgo+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKeVdmlpaWl2dmlpfHxpdnZ2doKCb3x8aWl8aV1QPiUlJSU3N0pKSkpKSkpKSkpKSkpK +SkpXV1dXV0pKV0pKSkpKSkpKSkpKSkpKSkpKSkpKSko+Sko+PkpKPkpKPj5KSj4+Pj4+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMTExMTExMTExMTExMSUxMTExMTElMTExMSUxJSUxJSUlJSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+bm5ubj6GhoaGh +oaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6uq6urq6uurq6urq6urqhj4J2Y298b29vb2NjfHxpdnZ2doh2dnZ2aWlpSjc3JSUxMTFERERERERERERERERERFBQUF1dXVBQUFBQUFBQUFBQUFBERFBQUFBQUFBQUD5K +SkpKSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTExMTExMTExMTExMTExMSUxMSUlMTExMTElJTExJSUlJSUlAABpgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp7S0tLS0tLS0 +tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p5V2aXZ2aXx8aXZ2aWl2dnZ2iHZpfHxpdnZpXVA3NyUlMTE+Pj5KPj5KSkpKSkpKSkpKSldXV1dXSkpXV1dXV0pKSkpKSkpKSkpKSldKSkpKSkpKSkpKSko+Sko+PkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+MTE+MTExMTExMTExMTExMTExMTExMSUxMTExMSUxMSUlJTExMTElJSUlJQAAaYKCgoKCgo+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKGI +fG9jb3xvb3x8aXaCb298fG9vgm9vfHxpaWlKNzcfHx8xPj4+PkpKPkpKSkpKSkpKSkpXV1dKSkpKSkpKSkpKSkpKSkpKSkpKV0pKSkpKSkpKSkpKSkpKSj4+Sko3N0RENzdENzc3NzdERDdERDc3Nzc3Nzc3Nzc3Nzc3Nys3Nzc3Nzc3NzclMTElMTExMSUx +MSUlMSUxMSUlJSUlJSUAAHaIiIiIiIiIiIiIiIiIiIiVlZWVlZWhlZWVlaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6urq6urq6uq6hlW9vb29vb29jdnZ2dnZ2aXaCdnZ2gml2dmlXVzclJSUl +MTExPko+PkpKSkpKSkpKSkpXV1dXV1dKSldKSldKSkpKSkpKSkpKSkpKSkpKSko+SkpKSkpKSj5KSkpKSj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4xMT4+MTE+MTExMTExMTExMTElMTElJTExMTExMTElMTExMSUlJSUlAABpgoKCgoKCgoKCj4+Pj4+P +j4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oYiIb2N2dnZ2dnZpfHxpaXx8b3x8b298fGlpaUo3JSUlMTE+Pj4+PkpKSkpKSkpKSkpKSldXV0pXV0pKV1dKV1dK +SkpKSkpKSkpKSkpKSko+Sko+SkpKSkpKSj5KPj4+Pj4+Pj4+Pko+Pj4+MT4+Pj4+PjExPjExMTExMTExMTExMTExJSU3NyUxMTExMTElMTElJSUlJSUxMSUlMSUlJQAAaYKCgoKCgoKCj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5ubm6enp6en +p6enp6e0tKenp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p6ePb29vY2N8fGl2dmlpfHxpdoJ2aXx8aWl2Y1dXNyUlJTExPj4+Pj4+SkpKSkpKSkpKSkpXV1dXSkpKV0pKV1dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPkpKPj4+ +Sj4+Pj4+Pj4+Pj4+Pj4+MTE+Pj4+Pj4+Pj4xMTExMTExMTExMTExMTExMTExMSUlJTElJTElJTExJSUlJSUAAGmCgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0tLSbiIhpaXZ2aXZ2dml2dnZ2dnZ2dnZpaXx8aXZjRDcfHx8rKzdENzc3NzdEV0pKV0pKSkpKSldXSkpXSldXV1dXSkpKSkpKSkpKSkpKSkpKSkpKSj5KSkpKSkpKSko+Pj5KPkpKPj5KSjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3 +Nzc3Nzc3Nzc3KysrKysrKysrKysrKysrKysrHx8fAAB2iIiIiIiIiIiIiIiIiIiIiJWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6rq6urq6uurq6urqnp4hvY3Z2aXaCaWl8fGl2dnZ2 +dnZpdnZ2dnZpUD4xHx8fKz4+Pj4+Pj4+SkpKSkpKSkpKSldXV1dXSkpXV1dXV0pKSkpKSkpKSldKSkpKV1dXSkpKSkpKSkpKSkpKSko+Pj4+Pj4+Pj4+Sj4+Sko+Pj4+Pj4+Pj4xMTExMTExMTExMTExMTExMTExMTExMTExMSUlMSUlJTElJTExJTElJQAA +aYiIiIiIiIiIiIiIiIiVlZWVlZWVlZWVoaGhoZWhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urrq6uq6urq6urq6urrq6rq6urq66urq6rpWCgm9jb3xvb29vY298fGl2gm9vfG9vb3xpaV1KMSUlJTE+Pj4+Pj4+PkpKSkpKV0pK +SkpXV1dKSkpXV1dXV1dXV0pKSkpKV0pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MT4+MTExMTExMTExMTExMTExMTExMSUxMSUxMSUlJSUlMSUlJSUlJSUAAGmIiIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWhoaGhoaGh +oaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urq6rrq6urq6uqenj29jdnZjdnZpaXx8aXZ2dnaCdml2dnZ2dmlQRDEfHysrNzc3Nzc3NzdKSldXV1dKSkpKV1dKV0pKV1dXV1dXV1dXV0pKSkpKV1dKV1dXV1dK +SkpKSkpKSkpKSj5KSkpKSko+Sko+Pj4+Pj4+Pj4+Pj4+Pj4xMT4+Pj4+MTE+PjExMTExMTExMTExMTExMTExJSUxJTExMSUlMTExMSUlAABpgoKCgoKCgoKCj4+Pj4+Pj5uPj4+bm5ubm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6e0 +tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0lYJ2dl1vfGlpdnZpdnZ2dnaCaXaCb298fGlpXT4lJSUlNzc3Nzc3Nzc3RFBQUFBQUERQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQRERERERQUERERERERERERERERERENzdERDc3 +Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nys3Nzc3NzclMTElMTExJSUxMSUlJSUlJSUlJQAAaYiIiIiIiIiIiIiIiIiIiJWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq66urq6uq6urq6urq6uurqurrq6p6eI +b29vb29vfGlpfG9vfHxpaXx8aXZ2aWl8aVdEMR8fHzExPj4+Pj4+Pj5KV2NXV1dKSkpXV0pKSkpXV0pXV1dKV1dXV1dXSkpKSkpKV0pXV0pKSkpKSkpKSkpKSkpKSkpKSj4+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4+Pj4xMT4+MTExMTExMTExMTExMTEl +JTExMTElJSUlJSUlJSUAAGmCgoKCgoKCgoKPj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSPgnZpaWl8b298fGl2gnZpfHxpdnZ2aXx8aWlXPjElJTEx +MTE+PjExMT5KV1dXY1dKSkpKSldXSkpKSkpKV1dXV1dKV1dXSkpKSkpXSldXV1dXV0pKSkpKSkpKSkpKSkpKSkpKSkpKSko+Pj4+Pj4+Pj4+Pj4+Pj4+PjExPj4xMTExMTExMTExMTExMSUxMTExMTExMTElJSUlJTExJSUlAABpgoKCgoKPj4+Pj4+Pj4+P +j4+Pj5ubm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLShoYhpaXZ2Y3Z2aXaCdml8fGl2gnZpfHxpdnZjV0QxHx8fKz4+Pj4+MTE+PkpXY1dXV0pKSkpKSkpKSkpXV1dXV1dX +V1dKV1dKSkpKSkpXSkpKSkpXSkpKSkpKSkpKSkpKSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExMTElNzclMTExJSUxJTExJSUlMSUlJSUlJSUlJSUlJQAAaYKCgoKCgoKPj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6en +p6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJWCgmlpdnZpaYJ2aXaCb298fGl2dmlpfHxpXV0xJRgYGCUxMT4xMTExMUREV1dXV0pKSkpKV0pKSkpXSldXV1dXV1dXV1dXV1dKSldKSldXSldXSkpKSkpKSkpKSkpKSkpK +SkpKPj5KSj4+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+MTExPjExMTExMTExMTExMTExJTExJTExMSUxMSUlJSUlJSUAAGmCgoKCgoKCgo+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0tLSbiGlpdnZpfHxpdoJvb3x8aXZ2dml8fHx8fGlpSkpKNzc3Nzc3Nzc3NzdEREREREREREREREREREREUFBQUF1dXV1dXV1dXUpKV0pKV0pXV1dXSkpXSkpKSj5KSkpKSkpKSkpKSkpKSkpKSkpKSko+Pj4+Pj4+Pj4+Pj4xMT4+MTEx +MTExMTExMTExMTExMTExMTExJTExMSUlJSUlJSUlAABpgoKCgoKPj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSnlYKCaWl2dml2dnZpdnZ2do+b +m6enp7S0tLS0tLS0p6enp6enp6eVlZWIiIiIfHxpXV1KSkpKPj4+SkpKV1dXV2NjY2NXSkpXSkpXSkpKV1dKV1dKSkpKSkpKSkpKSj5KSkpKSj4+Pko+SkpKSkpKPj5KSj4+Sj4+Pj4+Pj4+MTExMTExMTExMTExMTExMTElMTElMTExJSUlJSUlJSUlJQAA +aYKCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp7S0tLS0p7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p6eIaXZ2aWl8fGl2iIihtMfHx8e6urq6x8fHx9PT09PT09Pf39PT09PT08fHx8fHurqn +p5uPgoJvY1dXV0pKSkpKV1dXV1dXV1dXSkpXV0pKV0pKSkpKSkpKSkpKPkpKPj5KSj5KSkpKSkpKSkpKPkpKPj4+Sj4+Pj4+Pj4+MTExMTExMTExMTExMTExMTExMTExMTElMTExJSUlJSUlJSUAAGmCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ub +m5ubm5ubm6enp6enp6enp6enp6enp6e0tLSntLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSPgnZpaXZ2dnZ2j6fAwMDAtLS0p6e0tLS0wMDAwM3Nzc3Nzc3Nzc3Nzc3Z2dnZ2dnZ2dnZzc3NwMC0tKGVgm9vY1dXV1dKSldKV1dXSkpXV0pK +SkpKSkpKSkpKSko+Pj5KSkpKPj4+Pj5KSkpKSko+Pj4+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMTExMSUlMTElMSUlJSUlJSUlJSUlAAB2iIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWVlZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6u +rq6urq6urq6uurq6rq6urq6urq66urq6urq6uq6hlYJpaXx8aXZ2obS0oaGhlaGhoaGhoaGhrq6uurq6usfHx8fHx8fH08fH08fT09PT09PT09PT0+b4//////jfx7ShlYJvY1dKSkpKSkpKSkpKSkpKSkpKSkpKSko+SkpKSj5KSkpKPj4+SkpKSkpKSko+ +Pj4+Pj4+PjE+PjExMTExMTExMTExMTExMTExMTExMSUxMSUlJSUlJSUlJSUlJQAAaYKCgoKCgoKCgoKCj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p492 +dnZjb3xvb7rNupuPj4+Pj4+Pj5ubm5uurq6uurq6use6usfHx8fHx8fHx8fHx8fT09PT09PT7P//////+Pjs7NnZx66hlYJvV0pKSkpKSkpXSkpKSkpKSkpKSko+SkpKPkpKPj4+Pj5KSj5KSj4+PkpKPj4+Pj4+MTExMTExMTExMTElMTExMTExMTExMTEx +MSUxMSUxMSUlMSUlJSUAAGmIiIiIiIiIiIiIiIiIiIiIlZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urq66urq6urq6urq6urq6urq6rqGVgmNjdnZpdoi62dm6oY+Cj4+Pj4+Pj6GhoaGurq6urq6u +wMDAwMDAwMDAwMDAwMDAzc3Nzc3NzdnZ2ebm2ebm5ubm5ubZ2dnHx66PgmlQUERERERQUFBQUEREREREREREREREREREREREREREREREREREREQ3N0RENzc3Nzc3Nzc3Nzc3NzcrNzcrNzc3JTc3Kzc3NysrKysrKysrKysrAABpgoKCgoKCgo+Pj4+Pj4+P +j4+Pm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSnj3Z2dmN2gml2rs3m8tnAoYiIiIiIlZWVlaGhoaGurq6uurq6urq6x8fHx8fHx8fHx8fHx8fHx8fZ2dnZ2dnZ2ebm +2ebm2dnZ5ubm5s26p49vXUpKSkpKPj5KSkpKSkpKSj4+Pko+Pj4+Pj4+Pj5KPj4+Sj4+Sj4+Pj4+Pj4+MTExMTExMTExMTElMTElMTElJTExJTExMTExMSUxMSUlJQAAaYiIiIiIiIiIiIiIiIiIlZWVlZWVlZWVlaGVoaGhoaGhoaGhoaGhoaGhoaGhoaGh +oaGhoa6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urrq6urqurrquoY98Y2N2dml2gqfAwN/s7OzTupWViIiIiJubm6enp6enp6e6urrHx8e6x8fHx8fHx8fHx8fHx8fH09PT09PT09PT39/f39PT09PT39/f39/Tx6eIaUo+PkpKPkpKPj5KSj5K +SkpKSj4+Pj4+Pj4+PkpKPj4+Pj4+Pj4+Pj4+Pj4xMT4xMTExMTExMTExMTExJTExMTExJTc3KysrKysrKx8AAGmCgoKCgoKCgoKPj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6entLS0tLSntLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0tKeIb29vY3Z2aXauurrHx9nm8vLy07ShlYiIoaGhoaGurq6urq66urrHx8fHx8fHx8fHx8fHx8fHx9PT09PT09PT09PT09PT09PT09PT09/f39/f07SVb1A+Sko+Pj5KPj4+Pj5KSkpKSj4+Sko+PkpKPkpKPkpKPj4+Pj4+Pj4+PjEx +MTExMTExMTExMTExMSUxMTExMTExMTExJTElJSUlAABpgoKCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKenj4JjY3ZpaXaCp7TAwMDAwNPT +5vLy8vLZwKebm5ubp6enp7S0tLTAwMDAwMDAwMDAwMDAwM3Nzc3Nzc3Nzc3Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZx66CYz4+Pj4+Pko+Pj4+Pj5KSj5KSj5KSj4+Pj4+Pko+Pj5KPj4+Pj4+PjExMTExMTExMTExMTExMTExMTExMSUxMTExMSUlJSUlJQAA +aYiIiIiIiIiIiIiIiIiIiJWVlZWVlZWhoZWhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6urq6urq6urrq6uq6urq66urq6urq6oYh2dmlpdnZpfK66urrHx8fHx8fH09Ps7Pj/8t/Huqenp6enp7q6urq6urrHx8fHx8fH +x8fHx8fH09PT09PT09PT09PT09PT09PT09PT09PT09PT09PHrohXREREREQ3Nzc3RERERERERERERERERERERERERERERERENzc3Nzc3Nzc3Nzc3Nzc3Kzc3JTExJTExJSUxMTExMSUlJTElJSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pm5uPm5ubm5ubm5ub +m5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p6ePfF1vb29vb4Knuse6x8fHurq6urrHx8fZ2eb4+Pj4+ObTx7SntLS0tLS0wMDAwMDAwMDNzc3Nzc3Nzc3NzdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ +2dnZx7Shb0pKPj5KSj4+Pj4+PkpKPj4+Pj4+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMSUxMSUxMTExMTExMSUxJTExMSUlJSUlJSUlAABpgoKCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp7S0tLS0 +tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLShgnZ2aWl2dmmCrrq6urrHurq6urq6urrHx8fT09Pf3+z4////////5tPAwMCurrq6usfHx8fHx8fT08fT09PT09PT09PT09PT09PT09PT09PT09PT08e0oXxXSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTExMTExMTExMTElMTElJTExJTExJSUlJSUlJQAAaYKCgoKCgoKCgoKPj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6enp7S0tKe0tLS0tKe0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oZV8 +Y298aWl2iK7AwMDAwMDAwMDAwMDAwMDAwMDAwMDNzc3Z2ez////////y8ubT09PHx8fHx8fHx8fH09PT09PT09PT09PT09PT09PT09PT09PT08e0tI9vSkpKPkpKPj5KPj4+Pj4+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMTExMTExMSUlMSUl +JTElJTExJTExJSUlJSUAAGmIiIiIiIiIiIiIiIiIiIiVlZWVlZWVlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6urq6urq66urq6urq6urq6urqurq6urpuCdnZjY3Z2Y4i0wMDAwMDAwMDAwLS0tMDAwMDAwMDAwMDA +wMDAwMDNzc3N2dnm5vLy8vLy8vLm5ubm09PT09PT08fT09PT09PT09PT09PT09PTx7S0oYh2aUpKSko+Pj4+Pj4+Pj5KSkpKSko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMSUlMTElMTExMTElJSUlJSUlAABpgoKCgoKCj4+Pj4+Pj4+P +j4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKeViHxjY3Z2aWmhtMfHx8fHx8fHx7q6urq6x8fHx8fHx8e6urq6urq6urq6x8fHx8fHx8fH09PT09/f39/s7Ozs7N/f +7N/f7Ozf39/T09PHurquoaGPgnZ2aVdERERERERENzdEREREREREV0o+Sj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMTExMTExMTExJTElJSUxMSUlMTElMTExJSUlJSUlJQAAaYKCgoKCgoKCj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6en +p6enp6enp6e0tLS0p7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oYJpdnZjb3xplbrHx8fHx8fHx8fHx7q6urq6x7q6x8fHurq6urq6urq6uq6urq6urrq6urq6urq6urq6urq6urq6uq66uq6uurqnp6ebm5uIiIiIdnZ2dmNXSkpKSko+Pj4+ +PkpKSkpXV1dXSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTExMT4xMTExMTExMTExMSUlMSUxMTElJSUlJSUAAGmCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0p5WIdmNjfGlpdqG0x8fHx8fHx8fHx8e6urq6usfHx8fHx7q6urq6urq6urq6rq6urq6urq6urq6urq6urq6hoaGhoaGhoaGhusfHrpWViIiIfIh8fHx8b29vV0pKSkpKSj5KSkpKSkpKSkpXSkpKSj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+ +PjExMTExMTElMTElMTExMTExMTExMSUxMSUlJSUlAABpgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6enp7S0p7S0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLShfGl2dmNvfG+husfHx8fHx8fH +x8e6urq6usfHx8fHx8e6urq6urq6urqurq6urq6urq6urq6urq6urqGhoaGVlZWVlZWVlae0oY+Pj3x8iIh2dnZ2dnZ2Y1dXSkpKSj5KSkpKSkpKSkpKSkpKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+MTE+MTExPjExMTExMTElJTExMTExJSUlMSUlJSUxMQAA +aYKCgoKCgoKPj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSnj492Y2N2aWl2obrHx8fHx8fHx8e6urq6x8fHx8fHx8fHx7q6urq6urq6rq6urq6urq6u +rq6uoaGhoaGhoaGVlZWVlZWIiIiIiIiIiIiIiHaCgnZ2doJvb29XSkpKSkpKPj5KSkpKV0pKSko+Sko+Pj4+Pj4+Pj4+Pj4+Sko+Pj4+Pj4+Pj4+MTExPjExMTExMSUxMTElJTExJTExJSUlMSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ub +m5ubm5ubm5ubp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0p5t8b29vb298b6G6x8fHx8fHx8fHx8fHx8fHx8fHx8fHx7q6urq6urq6rq6urq6urq6urq6urqGhoaGhoZWVlZWVlYiIiIiIiIiIiIiIfHx8fHx8 +fG9vb29jV0pKSkpKSkpKSkpKSj5KSkpKSko+Pj4+Pj4+Pj4+Pj5KSj5KSj4+Pj4+Pj4xMTExMTExMTExMTExMSUlMTElMTElJTExJSUlAABpgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6entLS0 +tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKGViHZjb3xpaXynusfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHurq6urq6uq6urq6urq6urq6urq6hoaGhoaGhlZWhj4+Pj4+Pj4+Pj4+CgoKCdoKCdnZ2dnZ2Y1BQUERERERERERERERERERERERERERERERE +RERERERERERERERERERERERERDc3Nzc3Nzc3Nys3NyUxMSUlMTExMTExJTExJQAAaYKCgoKCgoKPj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6enp6enp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSnm3Z2 +dnZjdnZpp8DAwMDAwNPHx8fHx8fHx8fHx8fHx8fHurq6urq6uq6urq6urq6urq6urq6urqGhoaGVlZWVlZWVlYiIiIiIiIiIiIh8fHx8fHx8b29vb2NXSj5KSkpKSko+Pko+PkpKPko+Pj4+Pj4+Sko+Sko+PkpKPkpKPkpKPj4+Pj4+Pj4xMTExMTE+MTEx +MTExMSUlJSUlMTElJTEAAGmCgoKCgo+Pj4+Pj4+Pj4+Pm5ubj5ubm5ubm5ubm5ubm5ubm5ubp6enp6enp6enp6enp6enp6e0tLS0tLSnp6entLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0oY+PdmNvfGlpgqe6x8fHx8fHx8fHx8fHx8fHx8fHx8fHx7q6 +urq6urqurq6urq6urq6urq6urqGhoaGhoaGVlZWVlZWViIiIiIiIiHx8fHx8fHx8fHx8b29vSkpKSj5KSj4+Sko+Pko+PkpKPj4+Pj5KSj5KSj4+SkpKSkpKSj4+Pj4+Pj4+Pj4+Pj4xMT4xMTExMTExMTExMSUxMSUlJSUlAABpgoKCgoKCgoKCj4+Pj4+P +j4+Pj4+Pm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6e0tLS0tLSntLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKeVdnZ2dml8fHynx8fHx8fH08fHx8fHx8fHx8fHx8fHx8fHx7q6urq6uq6urq6urq6urq6urqGhoaGhoaGVoZWIlZWI +iIiIiIiIiIiIiHx8fHx8fHx8fG9vY0pKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+PkpKSkpKSj5KSj4+Sko+Sko+SkpKPkpKNzc3Nzc3Nzc3Nzc3NzcrKysrKysrKysrKysrKwAAaYKCgoKCgoKPj4+Pj4+Pj4+Pj4+Pj4+PoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh +rq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6uurqurq6hlYhvY3Z2Y2OIrsDAwMDNzc3Nzc3NzcDAwMDAwMDAwMDAwMDAtLS0wMC0tLS0p6enp6enp6enp6enp6ebm5ubm4+Pj4+Pj4+Pj4+PgoKCgoKCgm98fHxpaWlKPko+Pj4+Pj4+ +Pj4+Pj4+SkpKSkpKSkpKSko+Pj4+Pj5KSj4+Sko+Pj4+Pj4+Pj4+MTE+MTExMTExMTExJTElJTElJSUxMSUAAGmCgoKCgoKCj4+Pj4+Pj4+Pj4+Pj4+Pm5ubm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLS0tLS0 +tLS0tLS0tLS0tLS0p492aXZpaXx8fK7Hx8fHx9PTx8fHx8fHx8fHx7rHx8fHx8fHurq6urq6uq6urq6urq6urq6urq6hoaGhlZWhlZWVlYiIiIiIiIiIiIh8fHx8fHx8fG98fG9jSj4+Pj4+Pj4+Pj4+Pj4+Pj5KSkpKV1dKSko3Nzc3Nzc3NzdERERERERE +REREREQ3Nzc3Nzc3Nzc3Nzc3NysrKysrKysrKysrAABpiIiIiIiIiIiIiIiIiIiVlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6uuq6urq6urq6urq66urq6urq6urqurpuIfHxpaXx8aY+6x8fHx9PT09PT +x8fHx8fHx8e6urrHx8fHurq6urq6urqurq6hoaGhoa6uoa6uoaGhoZWhj4+Pj4+Pj4+Pj4+Pj4+CgoKCdoKCdnZ2dmlpXUREREREREQ3N0RERDc3NzdERFBQUFBQUFA+Pj4+MTE+Pj5KSj4+Pj4+Pj4+PkpKPj4+Pj4+PjExMTExMTExMTExMTExMTExJQAA +aYKCgoKCj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5ubm5ubm5ubm5ubm5ubm5unp6enp6enp6enp6enp6enp6enp6enp6e0tLS0tLS0tLS0tLTH09Pf7Ozs39/T08fHx66bj29jb29jb2+PtMfHx9PT09PHx8fHx8fHx8fHx8fHx8fHx8e6usfHurq6urq6rq6urq6u +rq6urqGhoaGVlZWVlZWVlYiIiIiIiIiIiIh8fHx8fHx8fHxvb1c+Pj4+Pj4xPj4+Pj4+Pj4+PkpXV1dXY1BQPj4xPj4+Pj4+MT5KPj4+SkpKSj4+Pj4+Pj4+Pj4+MTE+PjExMTExMTElMTElJTEAAGmCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj4+PoaGhlaGhoaGh +oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6ursfZ7Pj4+Pj///j4+Pj47OzZx7Shj29vb29jj8DA08fH09PT09PHx8fHx8fH08fHx8fHx8fHurq6urq6urq6uq6urq6urq6urq6hoaGVlaGVlZWViIiIiIiIiIiIiHx8fHx8fHx8 +fHx8b2NjPj4+Pj4+Pj4+Pj4+Pj4+Pj5KSkpXV1dXSko+Pj4xPj4+Pj4+Pj5KSj5KPj4+Pj4+Pj4+Pj4xMT4+PjExMTExMTExMTExMSUlAABpgoKCgo+Pj4+Pj4+Pj4+Pj4+Pj6GhlZWVlaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6u +rq6urq6urq6urtPs+P/////////////////////4+ObNroh8fI/A09PT09PT09PHx8fHx8fHx8fHx8fHx8fHx8e6x7q6urq6urq6rq6urq6urq6urqGhoaGhoaGVlZWVlZWIiIiIiIiIiHx8fHx8fHxvb29vUD4+MTE+PjE+Pj4+Pj4+Pj4+PkpKSl1dUFBE +RDExPj4+Pj4+Pj4+Pj4+PkpKPj4+Pj4+Pj4+Pj4+PjExMTExMTExMTExMTExMQAAaYKCgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+bm5ubm5ubm5ubm5ubm5ubm6enp6enp6enp6enp6entLS0p7S0tLS0tLS0tLS0tLSnutPs+Pj47Pj47Pj///////////////// +//jmx6e62dnZ2dnZ2c3Nzc3Nzc3Nzc3Nzc3Nzc3NzcDAwMDAwMDAwMC0tLS0tLS0tKenp6enp6enm5ubm5uPj4+Pj4+Pj4+PfHyIfHx8fHx8fHxpaVc+MT4+Pj4+Pj4+Pj4+Pj4+Pj4+SldXV1dKPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4x +MTExMTExMTExMTExJSUAAGmIiIiIiIiIiIiIiIiIiIiIiJWVlZWVlZWhoaGhoaGVoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq6urq6uutPm8vLm5s3Nzc3Nzc3Nzdnm5vLy///////////s7N/T09PT09PT08fTx8fHx8fHx8fHx8fHx8fH +urrHurq6urq6urq6urqurrqurq6uoaGhoZWVoZWVlZWVlYiIiIiIfIiIfHyIfHx8fG9vb2NKPj4xMTExMTExMTE+PjExMTE+Pj4+SldKSko+Pj4+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+MTExMTExPj4xMTExMTExMTExJTExMTExAABpiIiIiIiIiIiIiIiIiIiI +lZWVlZWVlZWVlZWVoaGViJWhoaGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6urq6ursfm5ubZ2cfHx7q6urq6urrHx8fT09Pf7Oz4//////Lm09PH09PT09PT09PT09PHx8fHx8fHx8fHx8e0tLS0tLTAtLS0tLS0tLS0p6enp6enm5ubm5ubj4+P +j4+Pj4+Pj4+CgoKCdoKCdnZ2dnZpSjExMTExMT4xMTExMTExMTE+Pj4+Pj4+Sko+Sko+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4+Pj4+MTE+PjExMTExMTExMTExMQAAaXyIiIiIiIiIiIiIiIiIiIiVlZWVlZWVoaGhoaGhj3yPoaGhoaGhoaGhoaGhoaGh +rq6urq6urq6urq6urq6urq6urq6urrrZ2ebTx8e6uq6urq6urq6urq6uusfH09PT3+zs+Pj45tPT09PT09PT09PT09PT09PTx8fHx8fHx8e6urq6urq6urq6rq66uq6urq6urq6hoaGhoaGhlZWViIiVlYiIlYiIiIh8fHx8fHx8b29vY0o+Pis3Nzc3Nzc3 +Nzc3Kys3Nzc3Nzc3Nzc3Sj4+Pj4+PkpKPj4+MTExMTE+Pj4xPj4+Pj4xMTExMTExMTExMTExMTExMTExMTEAAGmCgoKCgo+Pj4+Pj4+Pj4+Pj4+bm5uPm5ubm5ubgoJvfI+hoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq7H2dnZx8e0p6en +p6enp6entLSnp6e0wMDNzdnZ2ezs2dnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcDAwMDAtLTAwMC0tLS0tLS0tLS0tKenp6enp6eVlaGVlZWVlZWVlYiIiHx8fHx8fHx8fHx8aWlKMTExMTExMTExMTExMTExMTExMTExMTE+Pj5KSj4+Pj4+Pj4+Pj4+Pj4+ +Pj4+Pj4+PjExMTExMTExMTExMTExMTExMTElMTExAABpgoKCgoKCgo+Pj4+Pj4+Pj4+Pj4+Pm5ubm5uPj3xjV2+Pm5ubp6enp6enp6enp6enp6enp6enp6enp7S0tLS0tLS0tLS009PTx7q6rqGhoa6urq6urq6urq6urq66x8fH09PT09PTx9PT09PT08fT +09PT09PT09PTx8fHx8fHx7q6urq6urq6urq6rrqurq6urq6uoaGhoaGhoaGVlZWViJWVlZWViIiIiHx8fHx8fHxvb29jSjc3JTExMTExMTExMTExMTElMTExMTExMT4+Pj4+Pj4+Sj4+Pj4+MTExMT4+MTExMTExPjExMTExMTExMTExJTExMTExMTExMQAA +aYiIiIiIiIiIiIiIiIiVlZWVlZWVlZWhlZWIfG9XV2Njgpubm5ubm5unp6enp6enp6enp6enp7S0p6enp6entLS0tLS0wNPTx7q6rqGhoa6urq6urq6urq6urq6urq7AwM3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NwMDAwMDAwMDAwLS0tLS0p6en +p6enp6enp5ubm5ubm5uPj4+Pj4+Pj4+PgoKCgoKCgnZ2dnZ2aUoxMTExMTExMTExMTExMTExMTExMTExMTExMT4+Pj4+Pj4+PjE+Pj4+Pj4+Pj4+MTExMTExPjExMTExMTElMTExMTExMSUxJSUAAG+IiIiIiIiIiIiIiIiIiIiIlZWVlZWhlYh8b11KV1dK +Y4ibm5ubm5unp6enp6enp6enp6enp6enp6enp6enp6entLS0tMfHx7q6p6ebp6enp7S0tLS0tLS0tLSnp6enusfH09PT08fHx9PT09PT09PT09PT09PT09PHx8fHrq6Pb2+Cgpu0tLS0wLS0tKenp6enp6enp6enp5WhoY+Pm4+Pj4+Pj4+Pj4+PgoKCgnZ2 +dnZ2dlc+PjElMTExMTExMTExMTExMTExMTExMTExPj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4+MTExMTExMTExMSUxMTElMTElJTExJTExJSUlAABpiIiIiIiIiIiIiIiIiJWVlZWVlZWVlYKCaVdXV0pKXV12laGhoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6u +rq6urrrNzc20tKGhoaGurq6urq66urq6uq6urqGVp7TAwM3Nzc3Nzc3Nzc3Z2dnZ2dnZ2c3Nzc3Nzc20lWk3NzcrHzE+SnantLS0tLSnm5unp6enp6enp6enm5ubm4+Pj4+Pj4+Pj4+Pgo+PfHx8fHx8fGldPjExMTExMTExMTE+MTExMTExMTExMTExMT4+ +Pj4+Pj4+Pj4+Pj4+Pj4+Pj4xMT4+MTExMTExMSUxMTExMTElNzc3NzclMTElJQAAaYKCgoKCgoKPj4+Pj4+Pj4+Pm5ubj49vXV1dSkpXV0pXfI+hoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq6urq66x8fHtKenlaGhrq6urq6urq6urq6urqGViJWn +usfHx8fHx8fHx8fT09PT09PT09PT09PT08ehfD4lPjESJT4fHzE+PnantLS0tKGurq6urq6hoaGhoaGhlZWVlYiVlYiIlZWIiIh8fIh8fHx8fHxpVzc3NysrKysrKzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N0RERERENzc3Nzc3Nzc3Nzc3NzcrKysrKzc3Nzc3 +Nzc3NyUxMSUlJSUlJSUAAGmIiIiIiIiIiIiIiJWVlZWVlZWVlXxjV1dKSldXRERdUGOIm5ubm6enp6enp6enp6enp6enp6enp6enp6enp6enp6enwM3NwLShoZWhrq6urq6urq6urq66uq6uj3aClafAwMDAwMDNzc3N2dnZ2dnZ2dnZ2dnZzc2uYys+Ph8x +V0o+SjcYGDExY6G0tLS0tLS0tKenp6enp6eVlaGVlZWVlZWVlYiIiIiIiIh8fHx8fHx8aVc+MTExMTExMTExMTExMTExMTExMTExMTE+Pj4+Pj4+Pj4xMT4+Pj4+MTExMTExMSUxMTElMTExMTExMTExJSUxMSUlMSUlJSUlAABpiIiIiIiIiIiIiIiIiIiI +lZWViHZjV0o+V1dKSldXSldpgpWhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6ursfHx7quoZWVoaGurq6urq6urq6uurquoZWCaXyhtMfHx8fHx8fT09PT09PT09PT09PT09OnXT4+MVeVp6e0tKGIdlcYJURXj7S0tLS0p6enp6enp6enp5ubm5uP +j4+Pj4+Pj4+Pj4KCgoJ2dnZ2dnZXNzc3KysrKysrNzc3Nzc3Nzc3Kzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3JSUlJSUlMSUlJSUlJTElMTExJSUxMSUlJSUlJQAAaYiIiIiIiIiIiJWVlZWVlZWVfGlpV0REV0pKV1dKV1dXV4KVoaGhoaGhoaGhoaGh +oaGhoaGhoa6urq6urq6urq6urq7Hx8e0tJubm6enp6e0tKe0tLS0tLS0tKePdnZ2gqfAwMDAwMDT09PT09PT09PT09PT09O6dlclPo+6urrHurq6uqeVdjcfMWmVrrqurq6urqGurqGhoaGhoaGVlZWVlZWVlZWViIiIiHx8fHx8fG9vVz4xMTExMTExMTEx +MTExMTExMTExMT4+MTExMTExPjExPjExMTExMTElJTExMTExJSUlJSUlMSUlJSUxJSUlJTElJSUlJSUlJSUAAGmIiIiIiIiIiIiIiIiIlaGVfGldRERXSj5XV0pKV1dKV2N2j6GhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq6ux8fHtKebj4+np7S0 +tLS0tLS0tLS0tLShlYJjY4KhtLS0wMDAwM3Nzc3Nzc3Nzc3N2dnHm1AfXZu0x8fHtI+CdqG6uqGCUBgxaaGhrq6urq6urqGhoaGhoZWhoZWVlZWVlZWViIiIiIiIfHx8fHxvb1c+Pj4xMTExMTExJTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlAABpiIiIiIiIiIiIlZWVlZWIfGlXSldKPkpXSkpdUD5QXUpKb4ibp6enp6enp6enp6enp6enp6enp6enp7S0p7S0tLS0tMfHurqhlZWVp6e0tLS0tLS0tLS0tLS0p4h2dmlpj66urrrHx9PT09PT09PT +09PT09PTumM+V4i008e6x7pjMTGCp7q6oW9KKyuCrq6urq6urq6uoaGhoaGhlZWVlZWVlZWVlZWIiIiIfHx8fHx8fGlXPjExMTExMTExMTE+MT4+PjExMTExMTExMTElNzc3Nzc3Kys3Nzc3NysrKysrKysfMSUlJSUlJSUlJSUlJSUlMSUlJSUlJSUlJQAA +aYiIiIiIiIiIiIiIiIiIdl1EV0o+SldKPldXSkpdXUpdXV2Im5ubm6enp6enp6enp6enp6enp6enp6enp6enp7S0p7rHx8eum5uIm6enuq6urq6urq6urq6urqGPgmNjdoKhoa7AwMDNzc3Z2dnZ2dnZ2dnZzY9jN2m007SIb1dEREQlaaGurq6uaSs3So+u +rq6urq6urq6hoaGVlZWVlZWVlZWVlZWIiIiIiIh8fHx8fHxpVzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyUxMTElJTElJTExMTExMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlJRglJSUlJSUYGCUAAGmIiIiIiIiIiIiVlYiIaVdXV0REV0o+V1dKSldXRFdX +SkpjgpWhoaGhoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq66x8e6rpubiKGhtLS0tLS0tLS0tLS0p7SniHxvb2N2j5uuurrH09PT09PT09PT09PT09OCN12nwM2nVyU3Nx8fPj4+b5uurqFjJT6Coa6urq6urqGhoaGhoaGVlaGVlZWVlZWVlYiIiIh8fHx8 +fHxvY1A+MTExMTExPjExPj4+Pj4+MT4+PjExMTExMSUxMSUxMSUlMTExMTExJSUxJSUxJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUYAABpiIiIiIiIiIiIiIh8XVBQPj5QUDdQUFBEV1dKV1dKSl1dUHaPoaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6u +rq6uusfHuqeVlYihrq6urq6urq6urq6urq6uoY+CY298aYKhrrrHx9PT09PT09PT09PT09OnY0p2p8fTgkpKMR8+PhglNx8xiK6hglclSpuurq6urqGhoaGhoaGhoaGVlaGVlZWVlYiIiIiIiHZ2goJvb29KMTExMTExMTExMTExPj4+Pj4+MTExMTExJTEx +MSUxJSUlMTExMTElMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRglJQAAaYiIiIiIiIiViIhpSkpKPkpKSj5XV0REV1dKV1dKSl1dSl18j6GhoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urrrHx7ShlYiIoaGurq6urq6urq6urq6urqGIb29v +Y2+Cj7TAwM3Nzc3Nzc3N2dnZ2dnHj1BQocfTtHZKJUppUDExMR8fN3yhrqFKJVePp6e0p6enp6enp5ubm5uPj6GVlaGVlZWVlYiIiHx8fHx8fHxjREQxJTExMTExMTExMTExMTExMTExMTExMTExMSUxMSUlJSUxMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJRglJRgYJRgAAGmCgoKCj4+Pj29QUFBQRFdXPkpKPj5QUD5QY0pKXV1KSl1daY+hoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6urq66x7q6oZWIiKGurq6urq6urq6urq6urq6ViHxpaXZ2aYi0tMfT09PT09PT09PT09PT028xfLTH08BjK2mh +rrq6oXxjPh92rq6bdj4ldqenp6enp6enp6enp5ubm5ubm5uPj4+Pj4+Pj4KCgnZ2gm9vYz4xMTExMTExJTExMTExMTExMTExMTElMTExJTExJSUxMTExMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRgYAABpiIiIiIiIiGNQUD4+Sko+ +SkpKPkpXRERdXUpXV0pKV1dKXW+ClaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq6uwMDArqGViIihrq6urq6urq6urq6urq6uoYhvb29jb3x8p7rHx9PT09PT09PT09PT07pvRHa009OhY0Rpp8DAwMDAfDc3dqG0wHw+PmmVp6enp6enp6enm5ubm4+b +m5uPm5uIiIiIiIiIfHx8fHx8fGNENysrKysrKysrKysrKzc3Nzc3Nzc3NzcrNyUlMTExJSUxMTExJSUlJSUlJSUlJSUlJSUlJSUlJRgYGBgYJRgYGBgYGBgYGBgYGAAAb4iIiIiIfF1KSj5QUD4+Sko3SkpKSldKSkpXSkpXV0pXV0pdiJWhoaGhoaGhoaGh +oaGhoaGhoaGhrq6urq6urq6urrq6uq6hlYiIp6e0tLS0tLS0tLS0tLS0p5WIfGNjdnZpgrS0x9PT09PT09PT09PT09PHVz6VwM3NrkoxiLTHx8fHx5VQH2mnp7ShVx9XoaGurq6hoaGhoaGhlZWhlZWhlZWVlZWIiIiIiIh8fHx8b29jPjExMTExMTElMTEl +MTExMTExMTExMSUxMTElMTEfHzElJSUxJTExJSUlJSUlJSUYGCUlJRgYGCUlJSUlJSUlJSUlGBgYGBgYGBgAAGmCgo+CaV1KN0pKPj5KSj5KV0REV0o+Sl1KSl1dSldjV0pdXXaPoaGhoaGhoaGhoaGhoaGurq6urq6urq6urq6urq66x8e0oY+CgqGurq6u +rq6urq6urq6urq6hiG9vb2N2doKnusfT09PT09PT09PT09PTtGlQj8fTx49dRIK0x8fHx8eISj52p7q6m1c+Soinp6enp6enp6enp6enlZWhlZWVlYiIlYiIiIh8fHx8fHxvXT4xMSU3NysrKysrKysrKzcrKysrKzc3NysrKysrKysrKysrKysrKysrHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fAABpj498aVc+PkpKPkpKPkpKSj5QUEREV0pKV1dKSl1dSldjV1d8j6GhoaGhoaGhoa6urq6urq6urq6urq6urq6urq6uwMDAwKGPgoKnp6e0tLS0tLSntLS0tLSnlYiIaWl2dmmItMDA09PT09PT09PT +09PT08BKSqHH08eVPj6busfHx7q6oUoldq6urq5vJUSPoaGurqGhoaGhoaGVlaGPj4+Pj4+Pj4+Pj4KCgoJ2goJvb2M+MTExMTExJSUxMSUlMTElJTExMTExMTExMTElJSUlMSUlJSUlJSUlJSUlJSUlJSUlJRgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAA +Sl1pXUREREQ3Sko+PkpKPkpXSkpXSj5KV0pKV1dKV2NKSl1dXYihoaGhoaGhoaGhoaGhoa6urq6urq6urq6urq6ursDAwLShj4KCoa6urq6urq6urq6urq6urqGCdnZ2Y3x8iK7Hx8fT09PT09PT09PT09OuY0qVx9m6aVdXlcDAwMDAwIhKSm+hurqhb0o+ +gqenp6enp6enp5ubm5ubm5uPj4+Pj4+Pj4+PgoKCgoKCgm9dNzcrKysrKysrKysrKysrPjExMTExMTExMTExMTElMTExMSUlJSUlJSUlJSUlJSUlGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgAAFdXREREREREREREREQ3SldKPldXRERXSkpXV0pXY1dK +XV1KV2mClaGhoaGhoaGhoaGhoaGhrq6urq6urq6urq6urq7AwMC0oY+CgqGhrq6urq6urq6urq6urq6ViHxjb3xvb4+6x8fH09PT09PT09PT09PTx1dKocehfFclY67Hx8fHx8ehSiVvp7S0tHYlRIihoa6uoaGhoaGhoZWVoZWVlZWIiJWViIiIiIiIfHyI +dnZ2Yz4xMTElMTExMTExJTExMTExMTExMTExMTExMTExMTElJSUxJSUlJSUlJSUlJSUlJSUlGBglJSUlJRgYGBgYGBgYGBgYGBgYGBgYAABXSkpKPkpXSj5KVz4+Sko+Sko+SldKPlBQUFBQUFBQY0pKXV1ddo+PoaGhoaGhoaGhoaGhoaGhrq6urq6urq6u +rq6ursfHuqGVgoKnp7Snp6e0p7S0tLS0tLSnp3xvb29jdnaItMfH09PT09PT09PT09PT37pvSojAiD4lSoiux8fHx8fHj1A+Y6G6uqd2Sj6Cp6enp6enp6enp5ubm5ubm4+Pj4+Pj4+CgoKCgoKCdnZ2dlc+MSUxMTElJTElJTcrKys3Nzc3Nzc3Nzc3Nzcr +NzcrKysrKysrKysrHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwAAN0pKSkpKN0pKSj5KSjdKV0o+V1dKSldKSldXRFdXV0pXY0pXY2+Cm5ubm5unp6enp6enp6enp6enp6enp6enp6enp8DAwMCnlXyIp6enp6entLS0tLS0tLS0oY+PdmNv +fG9vj7THx9PT09PT09PT09PT09PHYz6PrmlQUGOhwMDAwMDAwK5jJVeIp7q6byVEj6entKenp6enp6enlZWVlZWVlYiIiIiIiIiIiIh8fHx8b29dNysrKysrKysrKysrKysrKys3Nzc3Nzc3Nzc3NzclMTExJSUxJSUlJSUlJSUlJSUlJSUlJSUlGCUYGBgY +GBgYGBgYGBgYGBgYGBgAADc3UFA3SldXSkpKPkpKSj5QUD5KV0o+V1dKSldXSl1dSldjV1dpgo+bm5ubp6enp6enp6enp6enp6enp6enp6enp6e0x8e6rpWCgqGurq6urq6urq6urq6urq6bgm9vb29vb4+0x8fT09PT09PT09PT09PTx49Kb7R8NzdXV2OI +p6e0x7qniF0xPoiuoW9KSoinp6enp6enp6ebm5ubm5ubj4+Pj4+Pj4+Pj4KCgoJ2dnZpVzc3JTExMSUxMSUxMTElMTElMTExMTExMTExMTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlJRgYJSUYGBgYGCUYGBgYGBgYGBgYGBgYAAA+UFA3UGlpdmNQRERXRERX +SkpKV0pKV1dKSl1KSldXSldjV1djY2+Im5ubp6enp6enp6enp6enp6enp6enp6enp6enwMDAwKePfIihrq6urq6urq6urq6urq6hj3x8Y2N8fGmhwMDNzc3Z2dnZ2dnZ2dnZ2c18PnyhSjdKJRg+PiU+XV1dgnY+MUqCoZVXJWmhrq6urqGhoaGhoaGhlZWV +lZWViIiIiIiIiIiIiIh2goJ2aUoxJSUxMSUxMSUlMSUlMTElMTExMTExMTExJSUxMSUxMSUlMTElJSUlJSUlJSUlJSUlJSUYJSUYGCUYGBgYGBgYGBgYGBgYGBgYGAAAREREV2l2dnZXSldKPkpKPkpXSj5QUEREXVBQUGNQUGNjSl1dUF1vgo+hoaGhoaGh +oaGhoaGhoaGurq6urq6urqGhobrHx7Snm4KCoaGurq6urq6urq6urq6uoaF8aXZ2aWl8obTH09PT09PT09Pf39/f39/NlVdXiHxQMT4+Hx8+PhgxMR8fPisriK52Nzd8oa6urq6urqGhoaGVoaGVlZWVlZWViIiIiIiIiHx8fHx8fGlKMTExMTExJTExJTEx +MTExMTExMTExMTExJTExJTElMSUxMSUlMSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGBgYGBglJSUlJRgYGBgAAD5XSld8fHx8aUo+Sko+SkpKPkpKSkpXV0RXV0pKXV1QUGNXV2NjV3aPj6GhoaGhoaGhoaGhoaGhoa6urq6urq6urq66x8fHtJuIiKGurq6u +rq6urq6urq6urqGPgoJpaXx8b6e6x9PT09PT09PT09Pf39/f36dKV4iuuq6PfHxXHx8+JRg+MRglSoiIaT4xgq6urq6urq6urqGhoZWVoZWVlZWIiIiIiIiIiIiIiHx8fG9jSjElJTExMTExJTExJSUlJSUxMTElMTElMTElJTElJSUxJSUlJSUlJSUlJSUl +JSUlJSUlGBglJSUlJSUlJRgYGCUYGCUlGBgYGBgYAAA+PkpKaWl2dmNKSko+Sko+SldKPldXRFBQUFBQY0pKY1dXY2NKXWlpdo+hoaGhoaGhoaGhrq6urq6urq6urq6urq6uusfHurqhiHybp6enp7S0tLS0tLS0tKenlXxpdnZpdoKnusfT09PT09Pf39/f +39/T09PHdjdptMfHx9O0fF0xMWNjNzc3JTePjzclY5Wnp7Snp6enp6enp6enm5uPj4+Pj4+Pj4+CgoKCgoKCgnZ2aUo3NzcrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwAA +PlBQPml2dnZ2Vz5QUD5KV0o+UFBERF1dSldXSkpjV0pXY1BQY2NQY3aIlaGhoaGhoaGhoaGhrq6urq6urq6urq6urq7Hx8e0oY98la6urq6urq6urq6urq6uoYiIdmNjfHx8rsDA09PT09PT09PT39/T09PT049dSojHx8fT05U+Pm+hrrqnj4+hj11KN2Ob +tLS0tLSnp6enm5ubm5ubm4+bj4+Pj4+Cj4+CgoKCgoKCgmNEMSUxMSUxMSUlJTElJTElJSUxMTExMSUxMTElJTElJSUlJTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlGBglJSUYGBgYGBgYGBgYGBgAAERERFBddnZ2dl1dRERERERQUFA+UFA+SldKSldXSkpj +V0pjY0pdaV1dfI+bm6enp6enp6enp6enp6enp6enp6enp6e0wMDAwK6bgoKhoa6urq6urq6urq6urqGPdml2dml2gqe609PT09PT39/f39/f39/f09O0Vz52p8fT08CniF18tMe6use6rpVXJUqbp6e0tKenp6enp6enm5ubm5ubj4+Pj4+Pj4KCj498iIh8 +fHxpSjExMTExMTExMTExMTElMTElJSUxJTExMTExJSUlJSUlMTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRgYGBgYAAA+Sko+Y29XV3ZdRERXRERQUD5XV0pKV1dEV1dKSmNXSmNjV1djY1BjY2N8m5unp6enp6enp6enp6enp6enp6en +p6enp8DAwMC0oYiIp6entKentLS0tLS0tLSbiIh2Y2N8b2+uwMDT09PT09PT09Pf39/f09PTx6FKMXy0x8fTx8fHx8fHx8fHx6FXJT5vm7S0tKe0tKenp6enp6ebm5ubj5uPj4+Pj4KCgoKCgoKCgoJ2dkoxJTExJSUlJSUlJSUlJSUlMTElJTElJTExJSUl +JSUlJSUlJSUlJSUlJTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGBglGBgYGAAAREREV0pdNzdjY1dKSldKSkpXSkpdUD5QXUpKV1dEV2NXSmNjUGNjY1dvfIibp6enp6enp6enp6enp6enp6enp6enp6e6x8fHuqeViKGhoa6urq6urq6urq6hoY98b29v +b3yIrsDNzc3N2dnZ2dnZ2dnZ2dnZ2dmub1A+grrHx8fTx8fHx8fHx6djSjFKj7S0tLS0p6enp6enp6enp5ubm5uPj4+Pj4+Pj4+PgoKCgoKCgm9KNzclMTExMTExJSUxMSUlJTElMTElJSUlJSUlJSUxJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJRgYGBgAAD5XSkpXaTc3aWlKV1c+SldERERXSkpXSj5XV0RXY1dKY2NKV2NjV2NjV2mPoaGhoaGhoaGhoaGhoaGurq6urq6urq6uusfHx8e6oYiVoaGurq6urq6urq6urpuIfHxpdoJ2gq66x9PT09PT09PT09Pf39/f09PT06dKSkppp8fH +x8fHx8fHuo9vShhKiKe0tLS0tLS0oa6uoaGhoZWhoY+Pm4+Pj4+Pj4+PgoKCgoKCgnZ2Sj4xMTExMTExMTElJSUlJSUlJSUlMSUlJTExJTElJSUxJSUlJSUlJSUlJSUlJRglJSUlJSUlJSUlJSUlJSUlJSUYGBgYGBglGBgYAABERFBQPmlXH0ppV0pKSko+ +V1dKSldXRFdXSkpjV0pdXVBQaWlQY2NXV2Njb4+hoaGhoaGhrq6urq6urq6urq6urq6uoa7Hx9PHuq6VlaGhrq6urq6urq66rqGhj3Z2dnZ2go+nwNPT09PT09PT09PT09/f09PT09PHlUoxSmmPus3Nzc3Np49jMR9KdqG0tLS0tLS0p7Snp6enp6enm5ub +m5ubm4+Pj4+Cgo+CgoKCgoKCb1dERDc3Nzc3Nzc3Nzc3KysrKysrKysrKysrKysrKysrKysrHx8fHx8fKysrKysrKx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwAAPlBQUFBjYytKaVdXSj5KV0pKV1c+UFBQUFBQRFBQUFBjY1dXaV1daWlQY3yIlaen +p6enp6enp6enp6e0tKenp6enp6enwMDT08e6p5Whrq6urq6urq6urq6um4+Cb29vgm+ItMfH2dnZx9PT09PT39/f39/T09PT07qhXSUxSldpj492aWkxHzFKaaG6uq6urq6urq6urq6hoaGhoaGhj4+Pj4+Pj4+Pj4+CgoKCgoKCdnZjV1dKSkpKSj4+Pj4+ +PjExMTExMTExMTExMTExMTExJTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGBglJSUlJSUlJSUYGBgAAEo+SldKY2MxV2lpSj5KV0pKV0o+V1dKSldXSldjV1djY0pjY1dXY2NKY2Njgpubm6enp6enp6enp6enp6enp6enp6enp7rH09PHx7ShoaGh +rq6urq6urq6uoaGVfGl2gnaCobrH09PTx5uux9PT39/f39/f09PT09PTunZdSiUlPjEYMT4fHz5XiK66urq6uq6urq6urq6uoaGhoaGhlaGhlZWVlYiIiIiIiIiIfHx8fHx8fG9vb2NjY2NXV1dKSkpKSkpKPj4+Pj4+PjE+PjExMTExMTExMTElJSUlJSUl +JSUlJSUlJSUlJSUYGCUlJSUlJSUlJSUlJSUYGCUlAABEV1dKSl1pRGN2XVBQUERXSj5KV0pKV1c+UGNKSl1dSldjV1djY1djb11daYKPoaGhoaGhoaGhrq6urq6urq6urq6urq6ux8fT09PHtKGhoa6urq6urq6urq6hiIh8b2+IiJW6x9PT3643N2Obx9nZ +2dnZ2dnZ2dnZ2dnHoWNjShglPiUYPldvobq6urq6urq6uq6urq6urqGhoaGhoaGhj5ubiIiIiIiIiIiIiIh8fHx8fHx8iHx8fHxvb29jY2NjY2NjY2NXV1dXSkpKSkpKSj4+PjExMTExMTExJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRglJSUlJSUYGAAA +REREV0pKdldXb29QRFdXPkpXSkpKV0RQXV1KV1dKV2NXV2NjV1dvY0pjY1d2j6Ghoa6uoaGurq6urq6urq6urq6urq6ursDA09PT08e6p6enp6entLSntLShoZWIiIiIiIinusfZ2dmnMQwAEmO62dnZ2dnZ2dnZ2dnZzc3NoXxvUD5ddoinwMC0wMDAwMC0 +tLS0tKe0tKGhoaGhoaGVlaGPj4+Pj4+PgoKCgoKCgoKCgoKVlZWVlYKCj4+CgoJ2goJvb3x8b29vb2NjY2NXV1dXV0pKSko+Pj4+Pj4xMTExMTExMSUlJSUlJRglJSUlJSUlGBgYGBglJSUlJSUAAEpXSkpXSmlpaXZjV1dKSldKPldXRERXV0pKY0pKY2NQ +XWlXV2lpV2NjV1dpdoihoaGhoaGhoaGhoa6urq6urq6urq6urq7Azc3Z2dnZ2bqurq6urq6urq6urq6hoZWIiJWVobrN2dnmmyUlDAAAfMfZ2dnZ2dnZ2dnZ2dnZzc3NwMDAtLTHx7rHx8e6urq6urq6rq6urq6urq6hoaGhoZWVlZWIiIiIiIiIiIiIiHx8 +iIiIiJWVlZWVlYiVlYiIlYiIiIiIiIh8fHx8b29vb29vY2NjY2NXV1dKSkpKSj4+Pj4+MTExMTExMTExJSUlJSUlJSUYGCUlJSUlGBglAABKPlBQUERpfHx8fFdKV0pKSldKSldXPlBdSkpdXUpXY1dKY2NXY29dXV1dSmmIm5unp6enp6enp6enp6enp6en +p6enp6enusfT09/f39/TwLS0p6enp7S0tLS0tKGhoaGVobS0x9nZ2Y8xdnZEAEq609Pf39/f38e609PH2dnZ2dnHx8fHx8fHx8fHx7q6urqurrqurq6urqGhoaGhoaGhoY+Pj4+Pj4+CgoKCgoKCgoKCgo+Pj5uPj4+Pj4+Pj4+Pj4+Pj4+Cgo+Pgo+CgoKC +gnaCdnZ2dmNjY2NjY1dXV1dXSkpKSko3Nzc3Nzc3NzcrKysrKysrKx8fHx8fHwAASldKSldKV3Z2dnZdXUREV0o+V1dKSl1QUFBdSkpjV0pdXV1daWlQY29XV2NjfJubp6e0tLS0tLS0p6enp7S0p6enp6enp7TAwNPf3+zs39/Nuq6urq6urq66rq6urqGh +rq6ux9Pf39+PN5vHoR8xp9Pf39/f39NvN4ihlbrT09PT09PHx8fHx8fHx8e6urq6urqurq6urq6hoaGhoaGhlZWhlZWVlYiIiIiIiIiIfIiIiIiIiIiIiIiIiIiIiIiViIiIlYiIlZWIiIiIiIiIiIiIfHx8fHx8fG9vb29vY2NjY2NjV1dXV1dXSkpKSkpK +Pj4+PjExMTElMTElJSUAAEpKV1dKSld2dnaIY0pXSj5QUFBQUFBEV1dKSldXSldjV1djY1djY2NXaWlKY3yIm666usfHx7q6urq6urq6urqurq6urq6ursDA2ebm5vLy5tnHtLS0tLS0tLS0p6e0tKG0tMDT39/fiDGIx64lMafT09PT09/NVwZKMQBdtM3N +zc3Nzc3AwMDAwMDAtLS0tLS0tLS0tKenp6enp6enlaGVlZWVlYiIiIiIiIiIiIiIfHx8iHx8iIh2iIh8fIiIfIiIiIiIiHyIiIiIiIh8iIiIfIiIfIiIfHx8fHx8fHxvb29vb29jY2NjY2NjY2NjV1dXV0pKSkpKPj4+PjExAAA+UFBEXV0+b3x8fG9dSkpX +Sj5XV0pKV1dKV1dKV2NXV1djV1dpaVdpaVBQXV1diKG0x9PT09PT09PTx8fHx8fHurq6uq6urq66usfZ5vLy8vLy5tPHx7SntLS0tLS0p6e0tLTH2dnZ2YgxSnZ2GEq0x6GVp8fZzVcMSiUAV67Hx8fHx8fHx8e6x8e6use6urq6rq6urq6urqGhoaGVoaGV +laGPj4+Pj4+Pj4KCgoKCgoKCgoKCgoKCgoJ2iIh2goKCdoiIfHyIiHx8iHaCgoKCgoKCgoKCgoKCdoKCgnaCgnZ2dnZ2dnZ2dnZ2dnZ2Y2NjY2NXY2NjV1dXSkpKSgAARERQUD5KSmN8fGlXSldKPldXRERXSj5XV0pKY1dXV2lXV2NjV2NjV1djY0pXaYKh +wNPT39/f7Ozf39/f39/f09PTx8fHx8fHx8fH09Pm8vLy8vLy8ubZzc3Nzc26usfHx9PTx9/f39+CHwAAAABptGkfBhhdtMBKElclAGO0x9PTx8fHx8fHx8fHx8e6urq6urq6rq6urq6urqGhoaGVoaGPj4+Pj4+Pj4+Pj4KCgoKCgoKCgoKCgnaIiHx8iHx8 +fIh2doh8fHx8fHx8fGl8fHx8fHx8fHx8fHx8b3x8fHx8fG98fHx8fHx8fHx8fHxvb29vb29vY2NjY2NjV1cAAERXSkpXV0RpgmlKV1dEV1dKSldXRFdjSkpXV0pXY1dXY2NQUGNjV2NjSkpXSleIp8DZ2ebm5ubm5ubm8vLm5ubm5tnZ2dnZ2dnHx8fT09/s ++P/4///////4+Pj4+Pj////47Ozf39/faSUlEgAYj6ExBgYGBm+uRBJKJQBjrsfHx8fHx8fTx8fHx7q6urq6urqurq6urq6urqGhoaGhoZWVlZWVlZWIiIiIfIiIiIiIiIh8fIh8fIiIfHyIiHaCgoJ2goKCgoJ2dnZ2dnZ2dnZ2gm98fHxvb3xvb3xvb298 +b298fHx8fG9vb29vfHxvb29vb29vb29vb2NjY2NjAABERERXRERdXV1dUEREV1dKV1dKSldXSldXSldXV0pdXV1dXV1dXWlXV1dKPl18lbTNzdnm5ubm5ubm5ubm5ubm5vLy8ubm5ubm5s3NwNPT3+zs//////////////////////Lm5tnZ2WM+j49EEm9v +DDFvVwwxiDESVyUGdrS0j4+Pp8DNzc3Nurq6urq6x7q6urqurq6urq6uoaGhoaGhoZWVlYiIiIiIiIiIiIiIiIh8iIh8fI+CdoiIfHyIfHx8fHx8iHx8fHx8fHx8b298b298fG9vfGlpdnZpdnZpaXZ2Y3Z2dml2dmNvb29vb29jb29vY3Z2aWlpaWlpaQAA +RFdXSkpXSkpKSj5KV0pKV1dEV1dKSldXSldjV0pjY1djY1dXY2NXV1dKPl12iK7H09/f39/f39/f39/f39/f7Ozs7Pjs7Ozs7Ozf08DAzc3f7Pj4///////////////////y8ubZ2ccxY7rTfB9KKx92rpUlN2kYJUoSEo+CPgwABjGIusfHtLSnp6e6urq6 +urqurq6urq6hoaGhoaGhlZWVlZWVlZWIiIiIiIiIiIiIiIh8fIh8fIiIfHyIdnaIiHZ2iHx8iIh2doJ2dnZ2dnZ2dnZ2dmlpdnZpdnZpaXZpaWlpaWlpaWlpaWlpaWldaWlpaWlpXWlpaWlpaWkAAEpKSldKSldXSkpXSj5XV0REV1dKV1dKSl1dRFdjSldj +Y1djY1dXY1c+PldpiK7A09Pf39/f39/f39/f39/f39/y8vLy5ubm5ubm5ubTx8fH09Pf7Oz4////////////////8ubm2dnHPmO02ZUlMRgMJVBjJSVEEiVKEh9vPgwADAAAJYi6p2kxGBhKdq7Ap4+hrpWVrq6bm5ubm5ubm5ubj4+bj4+Pj4+Cgo+CgoKC +goKCj4KCj4+CgoKCgoKCgoKCgnaCgm98iHx8fHxvb3x8b3x8b298fGl2dmlpfHxpaWlpaWlpaWlpaWlpaVdpaV1daWldXV1dXV1pV2NjAABKV0o+UFBQUFBQPlBQUFBQUERXV0pKXV1KV1dXSmNjUF1dXV1dXURERERjiKe609PT39/f7Ozf3+zs7Ozs7Ozs +7Ozs39PT09PT3+zs7NnHx8fH09PT3+zs7Pj4///4+Pj45ubm5tnZx0pKlbp8JTESAAAAAAASJQwlShIlShgAN2ldGABdm1cSAAAAABJpoWMfN0olSoiIYz4+XY+PoaGVlZWVlZWVlYiIiIiIiIh8fIiIiIiVlYiIiIiIiIiIiIiIfHyIdnaIfG+CgnZ2goJv +fHx8fHx8fHx8b29vb29vb29vb29vb29vY2NjY2NjY1djY1dXY2NXV2NXV1dXVwAASkpKV0pKV1dERFdKPldXSkpdSkpXV0pXV1dKXV1KV2lpV2NjSkpXPj5jiJu0x9PT5ubm5ubm5ubm5ubm5vLy8vLy2cfHx7q6usfT09PT08fHx8fH2dnZ2dnZ2dnZ2dnZ +2dnZ2dnZ2cBKEhIxGAZKHx9jYzcfHzEAH0oSJSUGEny0tFASPlAYAAwlJQwAH4hKDAwMADFdMQAAAAA3iJubm5uPj4+Pj4+Pj4KCgoKCgoKCgpWhlZWhlYiVlZWIiIiIiIiIiIiIfHyIfHx8fG98fHx8fHxvb3xvb29vb298fG9vb29vb29jb29vY2NjY2Nj +Y2NjY1djY1dXY1dXV1cAAD5XV0pXV0pXY0pKXV1KSl1QUFBQUFBjV0pXV0pKY1dXY2NQUFBQN0ppfKG6x9PT39/f39/s7Ozs7Ozs7Ozs7Pjs39PHurq6urq6usfHx9PHx7rHx8fHx9PT09PT09PT09PT09/f09O6aTEGBgASdj4Ygrq6p49jEjdKEh8fACWP +usehdmM+BgZjoaFpGAZXNxIAABIlJQAAEhIADF2VoZWVlZWIiJWIiIiIiIiIiIiIiJWhoaGhoaGhoZWhoZWVlZWVlZWIiIiIfIiIiHx8fHx8fHx8fHxvfHxvb29vb29vb29vb2Nvb29jY2NjY2NjY2NjY2NjY2NjY1dXY2NXAABKSldXSkpXV0RQUFBQUFBQ +UFBQRF1dPldjV0pdXUpXY1dXY1c+PldXfKG0x9PT09/f3+zs7Ozs7Ozs7Ozs+Pjs7N/T09PTx9PTx8fHx8fHx8fHx8fHx8fHx9PT09PT09PT09Pf39PT08CIUB8MV6F2JVehlXyVdhg+ShIlJQAxlcDNzc20SgYlj7S0jyUANx8GBkp8aR8AMW9vJQY+iIib +m4+Pj4+Pj4+Pj4+CgoKCgo+Pp6enp6enp6enm5ubm5ubm5uPoZWIiIiIiIiIiIiIiHyIiHZ2gnZ2dnZpdnZ2aXZpaWlpaWlpaWlpaWlpaWldXWlpV2NjV1djV1dXVwAAPldKSldXSldXV0pXV0pKXV1KXV1KSl1dSldXSldXV0pXV0pKV0pdgqG0x8fZ2ebm +5ubm5ubm5uby8vLy8vLy8vLm5tnZ2ebm2ebZ2dnZ2dnZ2cfHx8fHx8fHx9PT09PT09PT09PT09PT08eursDTrlAMDAwASkoSPj4SMTEGMZvAzcDAp0oMPqHAwKExDCUlACuCp3YYGEp2dj4MMYihoZWhlZWVlZWIiIiIiIiIiIiIlaGhrq6hoaGhoaGhoaGh +oaGhoZWhoZWVlZWVlZWViIiIiIiIiHx8fHx8fHxvb29vb29vY2NvY2NjY2NjY2NjY2NjY2NjV2NjV2NjV1cAAEREV1dKV2NXSldXSkpdXUpXV0pKXV1KV2NKSl1dSldjSkpXSj5jiKGux8fT09Pf7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs +7N/f39/T09PHx8fHx9PT09PT09PT09PT09PT09PT39+PMQYAJYhdDD4+DDdXGBiCwLSCdnY+DD6htMehMQYxGAA+j6FjGAAADAAAACt8j6Ghj4+bj4+Pj4KCj4+CgoKCj5ubp6enp6ebp6enp6enp6enm5ubm5ubm5ubm5uPj4+Pj4+Pgo+PfHyIiHaCgnZ2 +dnZ2aXZpaWlpaWlpaV1paVdjY2NXY2NXV1dXV1dXAAA+V0pKXV1KV1dKSkpXSkpjSkpXV0RXV0pKXV1KV2NXSldXPkppgqG0x8fT09Pf39/f39/f3+zs7Ozs7Ozs7Ozf39/s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7N/s7NnNzc3Nzc3Nzc3NzdnZ2dnZ2dnZ2dnZ +2aFvY4+6dh9KShI+djESUIh2JQBKNwwlj7S0gjEAMRgAPo+nYwwAAAAAAAAxfJWVlZWViIiViIiIiIiIiIiIiJWhoaGhoaGhoaGhoaGhoaGhoaGhlaGhlZWhoZWVoZWVlZWVlZWViIiIiIiIiHyIiHZ2gnZ2dnZpaXZpaWlpaWlpaVdjY1dXY1dXV1dXVwAA +RERXV0pXY1dKV1dKSl1QRFdXRERdUFBQXUpKY1dKV1c+PldpfKG6x8fT09Pf39/f39/s7Ozs7Ozs7Ozs7Ozs39/f39/f7Ozs7Ozf39/f7Ozs7Ozs7Ozs7Ozs7N/Tx7rHusfT09PT09Pf39/f39/f39/f39PT06dvb1cfSpVjGAAMAAAYb2MYGGOhoVcSEkof +AESVoWkYGF18fGlpgpubm5uPm5uPj4+Pj4+Pj3yIiIiVoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhlaGhoZWhoZWVlZWVlZWIiJWViIiIiIiIiHZ2iHx8fHx8fHxvY29vY2NjY2NjY1dXY1dXV1cAAERXSkpdXUpdXUpKV1dKXV1KSl1dSldjUFBdXURXV0RE +RFdXgqG0x8fT09PT39/f3+zs7Ozs7Ozs7Ozs7Ozf39/f39/f3+zs7Ozs2dnZ2dnZ5ubm5ubm5vLy8vLy5tnHurq609PT09PT39/f39/f39/f39/f39/f09PAoaG6p10YAAAGUJWVPgYSPjESADFjJQBKlad2GBhdiIhpXYKVoZWVlZWVlZWIiIiIiIiIiIiI +oaGhoa6uoa6uoaGhoaGhoaGhoaGVlaGVlaGhlaGhlZWVlZWVlZWVlZWIlZWVlZWViIiIiIiIiIiIiHZ2dnZ2dnZpaWlpaWlpXV1dXV1dAABKSkpdXUpdXUpKV0pKV1dKSldKSldXSkpXV0RXVz4+Sldpj6e6x8fT09PT39/f39/f3+zs7Ozs7Ozs7Ozf39/f +39/f39/s7Ozf39/f39PT09/f39/T3+zs7Ozs39/s38fHx9nZ2dnZ2dnm5ubm5ubm5tnm5tnZ2dnZ2dnZ2c2udldXiLTHrmklAAAAACV2aRIAaaGhfCUMK0orACV8m5ubm4+Pj4+Pj4+Pj4+PgoKPj6e6urq6rq6urq6urq6urq6urq6hoaGVlaGhlaGhj4+b +m4+hlZWVlZWVlZWVlZWViIiIiIiViIiIiIiIiIh8fHx8fHx8aWlpaWlpaV1dXQAARFdXSldXSkpXVz5KV0pKV1dEV1dKSldXRFBQRERERERvlae6x8fT09PT09Pf39/f39/f3+zs7Ozs7Ozs7N/f39/f39/f3+zZx9PT09PT09PT5ubZ2dnZ5ubZ2dnZ2dnm +5tnm09PT09/f39/f39/f39/f39/f39/f39PT39PT08fHx8fHx8e0fD4fEjd2oW8fH2+hoaFQEgAAAAxXiJWhlZWVlZWVlZWCj4+PfIiIiJWux8fHx8fHx8fHurq6urq6urqurq6urq6hoaGhlZWVlZWVlZWVlZWIiIiIlZWIiIiIiIiIiIiIiIiIiIiIiHx8 +fHx8fHx8fG9vb29vY2MAAEpKV1dKSl1dSkpdSkpdXT5QXUpKV1c+SldKPlBQN1d8j6e6x8fH09PT09PT39/f39/f39/f3+zs7Ozs7Ozs7Ozs7Ozs7N/f08fHx9PHx8fHx9PT09PT39/f39/f39/f3+zs39/f39/f39/f39/f39/f39/f39/f39/f39/f09PT +09PHx8fHx8e6p6e0tLSnj3yhtLSnm1cfDAxXiJubm5ubj4+Pj4+Pj4+CgoKCgo+brtPT09PT08fH08fHx8fHx8fHx8fHurq6uq6urqGhlaGVlZWVlZWVlYiIlZWVlYiIiIiIiIiIiIiIiIiIiIh8fHx8fHx8fHx8b3x8b29vAAA+V0pKV1dKSmNXSldXSkpd +XURXV0REV0o+SkoxPmOCm7THx8fHx9PT09PT39/f39/f39/f3+zs7Ozs3+zs7Ozs7Ozs7OzZ2cfHx8fHx8e6usfHx8fT09PT09PT09PT09PT39/f09Pf39/f39/f39/f39/f39/f39/f39/f09PT08fT08fHx8fHx8fHurq6urq6uq6urqGhlYiIoaGVlaGh +lZWViIiViIiIiIiIiIiIm7rT09PT09PT09PT08fT08fH09PHx8fHx8e6urqurq6hoaGVlZWVlZWVlYiIiIiIiIiIiIiIiIiIiIiIiIiIfHx8fHx8fHx8fHx8fHxvbwAASkpKXUpKV1c+UF1KSldXSldXSkpXSjdKSjc3Sm+Cobq6x8fHx9PT09PT09Pf39/f +39/f39/f39/f39/f3+zs7Ozs7Ozf08fHx8fHx8fHusfHx8fHx8fHx8fHx8fH08fHx9nZ2dnZ2dnZ2dnm5ubm5ubm5ubm5ubZ2ebZ2dnZ2c3Nzc3Nzc3Nzc3AwMDAwMC0tLS0tLS0tKGhoaGhoaGVlZWVlZWViIiIiIiIiIiIlaGu09PT09PH09PTx8fTx8fT +08fH09PHx8fHx8fHurq6urqurq6hoaGhoaGVlZWViIiIiIiIiIiIiIiIiIiIiIh8fHx8fHx8fHx8fHxvfHwAAD5XV0pXV0pXY1BQUFBQUFBQUFBQPj5KPis+SmmPrq7AwMDNzc3NzdnZ2dnZ2dnZ2dnZ2ebm5ubm5ubm5ubm5ubm5ubm5ubZ2c3Nzc3Nzc3N +zc3Nzc3Nzc3NwMDAwMDAwMDZ5ubZ2dnZ2dnZ2dnm5ubm5ubm5tnZ5ubZ2dnZ2dnZzc3Nzc3Nzc3Nzbq6urq6urq6urq6p6enp6enp5ubm5uPoY+Pj4+Pj4+PfHyIiIihtMfHx8fHx9PHx8fHx8fHx8fT08fH08fHx8fHx8fHx8fHurq6urqurq6hoaGhlZWV +lYiIiIiIiIiIiIh8fIh8fHx8fHx8fHx8fHx8fHx8AABKSldXSkpjV0pXV0pKXV1EV1dEREREMTE+V3ahrrrHx8fT09PT09PT09PT39/f39/f39/f39/f39/f39/f39/f3+zs7Ozs7Ozs39/f39/T09PT08fH09PHx8fHx8fT09PT09/f39/f39/f39/f39/f +39/f39/f39/f39/f39PT09PH09PTx8fHx8fHx7q6urq6urqurq6urq6uoaGhoaGhoY+Pj4+Pj4+Pj4+PfIiIla7Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e6usfHurq6uq6urq6hoaGhlZWhlZWVlYiIiIiIfHx8fHx8fHx8fHx8fG9vfAAA +SldKSldXSldXSkpXV0RQXUo+V0oxPj4+SoKnusfHx8fT09PT09PT09PT09PT39/f39/f39/f39/f39/f39/f7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7N/f39PT09PT09PT0+bm5tns7NnZ2dnm5ubm5ubm5ubm5ubm2dnm5tnZ2dnZ2dnZ2dnHx9PHx8fHx8fHx7q6 +urq6uq6urq6hoaGhoaGhj4+Pj4+Pj4+Pj4+CgoKPj6GuwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM3AwMDAwMDAtLS0tLSntLSnp6enp5ubj4+Pj4+Pj3x8fHx8fHx8b298b28AAEREV1dKSldXRFdXSkpdSj5QUD4+Pj4xV4inusfHx9PT +09PT09PT09Pf39/f39/f39/f39PHx9nZ5ubZ2dns39/s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozf39/f3+zs7Ozs7Ozf39/f39/f39/f39/f39/f39/f39/f39/f09PT09PT09PHx8fHx8fHurrHurq6urq6uqenp6enp6enlZWVlZWVlYiIiIiIiIiIiJWV +p7q6urq6urrHx7q6urq6x8e6use6urq6urq6urrHx7rHx7rHx8fHx8e6urq6urq6urq6uq6urq6urqGhoaGhlZWVlYiIiIh8fHx8fG9vAABEV0pKV1dKXV1KSl1dSkpXSjdKPjE+XYKnwMDAzc3N2dnN2dnZ2dnZ2dnZ2dnZ2dnZ2dnHx8fT09/fzc3Nzc3Z +2dnZ5tnm5ubm5ubm5ubm5uby8vLy8vLy8ubm5ubm8vLm5ubm5ubm5ubm5ubm5ubm5ubZ7N/f39/f39/f39/f09PT08fT08fHx8fHx8e6urq6urq6uq6urqGhoaGhoaGVlZWViIiIiIiIiIiIiIiVoaGurq6urrq6rrq6urq6urq6urq6urq6use6urq6urq6 +urq6urq6x7q6urq6urq6urq6urq6uq6urq6urq6urqGhoaGhlZWVlYiIiHxvbwAARERXV0pXV1dKV1dKSldKPlBQMTFEY4i0wMDAwNPT09PT09PT09PT39/f39/f39/f08fHx8fHx8fT09PHx8fHx9PT09PT09Pf39/f39/f7Ozs7Ozs7Ozs7Ozs7Ozs7N/f +7Ozs39/f39/f39/f39/f39/f39/f39/f39/f39/f09PT09PT08fHx8fHx8fHx8e6urq6urq6rq6urqGhoaGVlZWVlZWViIiIiIiIiIiIiIiIoaGhoa6urq6urq6urq66urq6urq6urq6urqurrq6urq6urq6urq6urq6urq6urq6urq6rrq6rq6urq6urq6u +rq6hoaGhoaGhoY98b28AAEpXSkpjV0pXV0pKV1dEV0o3Nzc3V4+0wMDAzdnZ2dnZ2dnZ2dnZ2dnZ2dnZ5ubm09PHurrHx8fHx9PHx8fHx8fH09PHx8fHx9PT09Pf39/f7Ozs7Ozs7Ozf39/f39/f39/f39/f39/s7Ozs7Ozs39/f39/f39/f39/f39/f39/f +09PTx9PTx8fHx8fHx8fHx7q6urq6rq6urq6hoaGhoZWVlZWVlZWIiIiIiIiIiIiIiIiIiIibm5uPoaGhoaGhoa6urq6urq6uurquurq6urq6urq6urq6urq6uq66urq6urq6urq6rrq6rq6urq6urq6urqGhoaGhoaGPdmNjAABKSkpdUFBdXUpKXUpKV0ox +Pj4+aZu0x8fHx8fT09PT09PT09/f39/f39/f39/f08fHx8fHx8fHx8fTx8fHx8fHx8fHx8fHx9PT08fHx8fT09Pf39/f39/f09PT09PTwMDA2dnZ5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubZ5ubT09PT09PTx8fHx8fHx7q6urq6urqurq6urq6urqGhoZWV +lZWVlZWIiIiIiIiIiIiIiHx8fHx8iHx8iIiIiIiIiJWhoaGhrq6urq6urq6urq6urrq6urq6urq6urq6urq6urq6urq6urq6rq6urq6urq6urq6urq6hoaGVfGNXVwAASl1dSldXSkpXV0pXV0o+SjExb6G6x8fH09PT09PT09PT09Pf39/f39/f39/f08e6 +usfHx7q6usfHx8fHx8fHx8fHx8fHx9PT08fHx8fT08fT09PT08fHx8fHx8fTx7q6utPT39/f39/f7Ozs7Ozs7Ozs3+zs39/f39/f39/f09PT09PT09PHx8fHx8fHurq6urq6urqnp6enp6enp5ubm4+bm4iIiIiIiIiIiIiIiHxvb29vb29vb29vb3x8fHx8 +fIiIiJunp6enp6entLS0tLS0tLS0tLS0tLS0tLS0wLS0tLS0tLS0tLS0tLS0p6e0tKenp6enp6ebj29jV0oAAEpKV1dKSldXSkpXRERERCU3b6G0x8fH09PT09PT09PT09PT09/f39/f39/f07q6urrHx8fHx8e6x8fHx9Pf08fHx8fHx8fT09PHx8fHx8fH +tLS0tLS0tLS0tLS0wMDAwMDN2dnZ2ebm5ubm5ubm8vLm5ubm5ubm5ubm5tnZ2dnZ2dnNzc3Nzc3NwMDAwMDAwLS0tLS0tKenp6enp6enlaGhj4+Pj4+Pj4+Pj4+Pj492dmlpaWlpaWl2dmNvb29vb29vb3yIlZWVlaGhoaGhoaGurq6urq6urq6urrq6urq6 +urq6urq6urqurq6urq6urq6uoaGhoaGhoXZjUF1dAAA+V1dKV2NKSldKPkpKNzc3b6G6x8fH09PT09PT09PT39/f39/f39/f39/fzc3AwMDAwMDAwMDAzc3N2dnZ2dnNzbrHx8fHx8fHx8fH09PHtLShoaGViIiIiJWhoaGhtMC0x9PT39/f39/f7Ozs7Ozs +7Ozf39/f39/f39/f39/f39PT09PT09PHx8fHx8fHx8fHtLS0tLS0p6enp6eVoaGVlZWVlZWViIiIiIiIlYiIfG9vb29vb29vb29vY2Njb29vb29vfIh8fIiIlaGhlaGhoaGhoa6urq6urq6urrq6urq6uq6urq6uurqurq6urq6urq6uoa6uoYhjV2NjUAAA +SkpXV0pKV1c+Sko+Pj4+aaG6x8fH09PT09PT09PT09PT09/f39/f3+zf08fHx8fH09/T08fT0+bm5ubm2dnNzdnZ2c3Nzc3Nzc3Nzc3NurquoaGViIh8fHx8fHx8fIiIobrT39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f09PT09PT08fHx8fHx8e6 +urq6urq6rq6urqGhoaGVlaGVlZWVlZWViIiIiIiIiG9vb29vb29vY2NjY2Nvb29vb29vb29vb29vgo+Pj4+Pj4+PoaGurqGhrq6urq6urq6urrq6rq6urq6urq6urq6urq6urq6uoaFvXV1KXWkAAERXSkpXY0pKVz4+Sj4xaafAwM3Nzc3NzdnZ2dnZ2dnZ +2dnZ5ubm5ubZ2bq6usfHx8fZ2cfH09PT39/f8vLy8vLy8vLm2dnZ2dnZ2cfH08e6urquoZWIiHx8fG9vb29vb4Ku09/f39/f39/f3+zs39/s39/f39/f7N/f39/f39/f09PT09PT08fHx8fHx8e6urq6urq6p7S0p6enp6enp5WVlZWVlZWViIiIiIiIiHZ2 +dmNjb29vb29vb29vb29vb29vb2NjY2NjdnaCgoKCgoKCgpWhoaGhoaGurq6urq6urrqurrq6rq66uq6urq6urq6urq6urqGIY0pXaV1dAABKSldXSkpXVz5KSjFKdqHAwMDNzc3Nzc3NzdnZ2dnZ2dnZ2dnm5ubZzbrHx8fHx8fHx8fHx8fT09PTx8fT09PT +7Ozs7Ozs7Ozs7Ozf39PT08fT07qurqGhj4+PgoJ2dnZ2rs3f39/f39/f39/f39/f39/f39/f39/f39/f39/T09PT09PTx9PTx8fHx8fHx8e6urqurrqurq6urq6uoaGhoZWVoZWVlZWVlZWViIh8aWlpaWlpaWlpaWlpaXZ2dmlpaWlpaWlpaWl2goKCj4+P +j4+Pm5ubm5unp6entLS0tLS0tLS0tLS0tLS0tLS0tKenp6enp6eVaVdjY1djYwAARFdKSl1dRERERDdKfKHAwMDNzc3Nzc3NzdnZ2dnZ2ebm5ubm5ubm08DAwMDA08fHx8fZ2dnZx8fTx8fH09/f09/f09PH2dnZ5vLy8vLy8vLy8ubZ2cfHx7Snp6eVlaGP +j67T39/f39/f39/f7Ozs7Ozf39/f39/f39/f39/f39/T09PH09PTx9PHx8fHx8fHx7q6urqurq6urq6uoaGhlZWhoZWVlZWVlZWIiIh8fHxpaWlpaWlpaWlpaWlpaWlpaXZ2aXZ2aWl2dnZ2goKCj4+Pj4+PoaGhoaGurq6urq6urq6urq6urq6urq6urq6u +rq6urqGhiGNXSl1dXV0AAEREV1dERFc+Pj5XfKfAwMDAzc3Nzc3N2dnZ2dnZ2dnZ2dnZ2ezfx8e6usfHx8fHx8e6x9nZ2cfHx8fHx9PT39PT09PH09PT39/T09PT7Ozs7Oz4+Pj47OzZ2c3NwMDAtKG0zdnZ2dnm5ubm5ubm5ubm5ubm5ubm2ebm2dnZ2dnZ +2dnZ2c3Nzc3Nzc3NusfHx7q6uq66uq6urq6hrq6hoaGhlZWhlZWVlZWVlYiIiHZpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaXZ2dnZ2dnaCgoKCgoKClZWVoaGhoaGhoa66p6e0tLS0tLS0tLS0tLSnp7S0p6enm29QUGldXV1dAABKV0REV0o+SkpKgrTHx8fH +09PT09PT09PT09Pf39/f39/f3+zZx8fHusfTx8fHx9PTx8fH09PT08fT09Pf39/fx8fZx9/f39/f39/NzdnZzd/f3+zs7Oz4+Pj4+Pj47OzZ2cfH09Pf39/f39/f39/f39/f39/f39/f39/f09PT09PT08fT08fH08fHx8e6urq6urq6rq6urq6urq6hoaGh +oaGhlZWhj4+Pj4+PgnZ2dmlpaWlpaWlpaWlpaWlpaWlpaWldaWlpaWlpaXZ2dnZ2doKCgoKPm5ubm5ubp6enp6e0tLS0tLS0tLS0tLSntLShrq6uoXxdXV1dXV1dXQAAPkpXVz4+SjFKiLTHx8fHx8fT09PT09PT09PT09Pf39/f39/fx7S0x8fT08DAwMDA +wNPTx9PT38fH09PT0+bm2dnZ5ubZ2dnZ2ezs7NPT09Ps7N/f3+zs2dnZ2ez4//j///jNwMDNzdnZ5ubm5ubm5ubm5tnZ2dnZ2dnZ2dnZ2dnZzc3Nzc3Nzc3NzcDAwMDAwMDAtLS0tLS0p6enp6enp6ebm5uPj5ubiIiIiHx8fGlpaWlpaWlpaWlpaWlpaWlp +aWlpaVdjY2NjY2NjY29vb3x8fHyIiIiVoZWVp6enp6entLS0tLS0tLS0tLS0tLS0tLSnp5tpV1djY1dXaWkAAERXSj5KSjFQlbrHx8fHx8fH09PT09PT09/f39/f39/f39/fx7rH2dnZ5tO0tMDAtMfHx9Pfx8fH09PH2dnZ2dnZ2dnZ2dnZ7Ozs39/f39/f ++N/f39/f39PT09/f8vLf8vLmwKenusfT09/f39/f39/f39/f39/f39/T09/f09PT09PTx8fHx8fHx8fHx8e6use0tLS0tLS0p6enp6enp6enp6eVlZWViIiIiIh8fGlpaWlpaWlpaWlpaWlpaWlpaWlpaV1paV1dXV1dXWlpaWl2dnaCgoKPj4+bm5ubp6en +p7Snp7S0p6e0tLS0tKentLSntJtvV0pjY1dXaWlQAABKPkpKNzdjm7rHx8fHx8fT09PT09PT09/f39/f39/f39/TwM3Nzc26x9PTx8fT39/f39/fx8fH09PT09PT09Pm8ubT09/f09Pf7Ozs7N/f39/f7Ozs7Ozf7Oz4+Ozf39/f38ehlaGuusfT09/f39/f +39/f39/f39/f39/f09PT09PT09PTx8fHx8fHx8fHx8e6urq6uq6urq6urq6uoaGhoaGVlZWVlZWIiIiIdnZpaWlpaWlpaWlpaWlpaWlpaWlpXWlpaWlpaWlpaWlpaWlpdnZ2doiIiIiVlaGhoaGhrq6urq6urrq6rq6urq6urq6urq6IV1dpXV1paVdXYwAA +N1BEN0pjlcDAwMDAwM3Nzc3Nzc3Z2dnZ2dnZ5ubZ2ebTx8fHx9PTx7rH39/T09PHx9nZ2dnZ2ebm2c3N2dnm+Ozs39PT09PH2dnm5ubm2dnZ5vLy8vLy8ubm5ubm2ezs7Nnmx6GVlaGursDA09PT09/f39/f39/f39/f39PT09PH09PTx9PTx8fHx8fHx7q6 +urq6urqurq6urq6uoaGhoaGhoZWVlZWIiIiIfHxvY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Njb29vb29vfHx8iIiVlaGhoaGhoaGhtLS0tLSntLS0tLS0tLS0p6eVaVdXV2lpV1dpXVAAADc3N0pjm8DAwMDAwNPH09PT09PT09PT09Pf39/f39/T +09PHx8e6usfH09Pf09Pf08fH39/Tx8fT09PT09/f7Pjm2dnN3+zf09/f3/js09Pf3+zs7N/s+Ozf3+zs7N/f39/f39/frpubm5uurq66x8fT09PT09/f39/f39/f39PT09PT09PHx9PHx8fHusfHx8e6uq6urq6urq6urq6um5ubm5ubj4+Pj4+Pj3x8b2NX +V2NjV2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nvb29vb298fHx8iIiIiJWhoaGhoaGurq6urq6urq6urq6urq6urq6ufFBQY2NXV2lpV2NjAAAxRERpp8fHx8fHx8fH09PH09PT09PT09Pf39/f39/fzc3m5vLy5tnZ2dnZ2ebZzc3Z2dnZ2cfHx9nZ2dnZ2dns +2c3Z2ebm+Ozs7N/f39/f39/f39/f39/s7Ozs7Pjm2dnm5ubZ2ezTtJWVp6enp6e0wMDAwNPT09/f39/f39/f09PT09PT08fHx8fHx8fHurq6urq6uq6urq6urq6hoaGhoaGhj4+Pj4+Pj3x8fGNKSkpKSkpKSkpXV1djY2NjY2NjY2NjY2NjY3Z2aXZ2dnZ2 +dnaIiIiIlaGhoaGhoaGhoa6urq6urq6uurq6uq6urrquj2NKY2NXaWlXV2ldUAAAMTFpp7rHx8fHx8fHx8fH09PT09PT09PT09Pf39/NrqGuwMDZ2dm6use6usfZ2ebm2c3Nzc3N2c3Nzc3Nzc3Z2c3Z2c3f39/Tx8fH2fLm5vLy5ubm2dnZ5ubm5ubm5vLy +8v/s7P//7OzZuqenp5WVoaG0tLS0x8fH09/f39/f09PT09PT08fHx8fHx8fHx8fHurq6urq6rq6urq6uoaGhoaGVlZWViIiIiIiIdmlXV0pKSkpKSkpKSkpKSkpKSkpXY2NjY2NjY29vb29vb3x8fIiIiIiVlZWhoaGhoa6urq6urq6urq66uq6urq6uuq6u +rm9XV1dpaVdXb11dXV0AADdvp8fHx8fHx8fHx8fHx9PT09PT09PT09/f39/Hp6e6x9PTx7q6x9PTx8fHx8fHx8fHx8fZ5uby8ubm5s3N5vLZ2dnZ5vLZ2c3f39/f3+zf39/H3/j4+P/y5vL/7Ozs7Ozs7Pj////y8vLm07SVlZWhoaGhoaGuwMDAwNPT09PT +09PT09PTx8fH08fHx8fHx7q6urq6rq6urq6uoaGhoaGVoaGPj4+Pj4+PdnZXPj4+SkpKSkpKSkpKV1dKSldXV2NjY2NjY2NjY2NjdnZ2dnaIiIiIiKGhoaGhrq6urq6urq6urrq6rq66urq6rq6uro9XRF1vXV1dXV1daVdXAABpp7q6urrHx8fHx8fT09PT +09PT09PT39/f39/Ap7TH08e6oaG6urrH09PT09PHx8fH09/Tx8fT5vLy8vLT08ff7Oz4+OzZ2dnZ8ubZ2dns7NPT3+zs7NPm5uby8v//////7Ozs+Pjs7Ozs7Pj4+N+6rq6urqGhoaGurq6uurq6x8fHx8fHx9PTx9PTx8fHx8fHx7q6urqurq6uoaGhoaGh +oZWVlZWViIh2dmNKNzc3N0pXSkpKSkpKV1dXV1dXV2NjY2Nvb29vb29vfHxvfHx8fHx8j6GhoaGurq6urq6urq6uurqurrqurrq6rq66uqFjPmNjV2lpV2NjY1BjYwAAiLq6urrHx8fHx8fHx8fHx9PT09PT09PT09O6rsDAwNO6urq6usfH08euurrZ2dnN +zdnZ2ebZx8fHx8fZ7Nnm5sfT7NnNzeby8v//7OzZ2fLy39/y8ubT5ubT5tnN5vLy5vL/////8vLy8vLy///s7Ozfx7qhiIihj4+hoaGurq6urq6urrq6usfHusfHx8fHx7q6urq6urqnp6enp6enlaGhj4+CgmlpXV1ERERERERERERERFBQUFBdaWlpaWlp +dnaCgoKCdnZ2dnaCgoKCgoKCm5ubrq6urrq6rq6urq66urq6urq6urqurrqurq6IUFBQaWldXW9jV2lpV1cAAJW6urrHx8fHx8fHx8fH09PT09PT09Pf39/f39/Tx8fHrq6ursfT09/fx8e0wMDAzdnZ2dnZx9Py39Pf3/LZzc3Nzc3N39/f39PHx8fH0+bm +5uby5tnZ2eb4+Ozs7NnZ+P/s7Ozs09Py///////4+P////////Ly066CgnaIiJWhoaGhoaGhoaGhoaGVlaGhoaGhrq6urqGVoZWVlZWIiIh8aWlpXV1dXUpKSkpKSkpKV1dXV1djY2NjY2N2gm98fHx8iIh2doJ2doKCgoKPj4KCj6Gurq6urq6urrq6rq7A +tLTAwLS0tLS0tLS0tMChXTdXb11daWlXV2lXV2NjAACPurrHx8fHx8fHx8fH09PT09PT09PT0+bZx9Pf39/f38fZ2ebm2dnAwMDf08fH39PT08fHx8fH5ubZ7Ozs39/T09PT08fZ2dnZ2dnZ5ubm5tPfzd/4+P//7Ozs+Pjm8v//8vLy/+zf8vLy39/s7P// +///////////////42bqhj4KCgoKCgoKPj4+Pj4+Pj4+Pj4+Pj4KCdnZ2gnZ2dmlpaWldXV1dSj5KSkpjY2Njb29vfHx8fIh8fHx8iIiIiIiIiHx8iIiIiJWVlZWViIiVlaGurq6uurq6urq6urq6urq6urq6urq6uq6uurq6fEpdXV1paVdXb2NXaWlQXQAA +obq6usfHx8fHx8fH09PT09PT09PT09PAm5ubrs3Nzc3N2cC0tLTAwM3m5uby5ubmzc26x7TAzdnZ2ebm2dnHus3N2ebm+ObZ8t/f3+zs39Pm8tPm5ubm09P42dns7Pj4+ObZ2ezs7Ozs7N/f39//+Obm5ubZ7P//////////////+Nm6oXZpaVdXY2Nvb298 +fHyIfHxvb29vb29jY2NjY1dKSko+PkpXV1dvb29vgoKClaGhoaGhoaGurq6hoaGhoY+Pm4+Pj5ubj4+Pj5ubm67AwMDAwLS0wMC0tMDAwMDAtLTAtLS0tLS0tLS0iEpdXV1paVdjY2NXaWlQY2MAAKHAwMDAwMDAzc3Nzc3Nzc3Nzc3N39Ouoa7Hx8fZx8e0 +tMff38euwNPHx7S0tLS0tMfZ2fLy8vLy39/T7NnNzcDNzebm5ubm2cfT09PT09O609Pm5tnZx9nZ5vLy5tnm0+bm///4+P/s3/j47Oz///Ly2dnZ8vLy8vLy//jm5v//////////////8seuurqViIh8fG9XV1dXV1dXV0pXY2NjY29vb4KClaGhoaGurq6h +oZWVoZWVoaGhoa6urrrHtLTHurq6uq6urq6hoaGhoaG6usfHurrHx7q6x8fHx8e6urq6urq6urq6urq6p2lKSmlpXV1vb1dpaVdjb11QAAChurq6usfHx8fHx8fHx9PT09PT39O6x8fT09O6uq6urtnNzc3Z2c3Nzc26zdnZ2dnZx9nm5ub45sDAwMDf7P// +//Lf3+zTx9//5tnZ2c3Z2eby8t/f8t/T5vLm5tPf09//+Pj47Nn47N/f8v////Ly39/y8vLy/+zs7N/f7Oz4+N/f39/4///////////////////y8v/47N/N2ebZ2dnZ2cfHx8fHx8e6rq6ursfHrq6urq6urqGhrq6urq66urqnp7q6usfHx8fHx8fHx7q6 +usfHx8fHx8fHx8fHx7q6x8e6urq6urq6urq6unw+V29dXXZpV2lpXV1paVdjYwAAobS0wMDAwMDAwM3Nzc3Nzc3Z2dnNzcDAtLS0tLS0tMDAwNPTx9PAwMDAwMDT7N/f38fHx7q6zd/s7Nnm5ubm08fH09/f8v/y8t/Tx8fZ2ebm5s3Nzc3Z2fLm5ubAwN/s +2dnZ2dnm5uby8vLf39/f3+zs+P//8ubm2dns//j439PT+Pjf7Ozf39/f39PT8vLy///////4+Pjs7Ozf09/fzc3Z2c3N39/f383Nzc3NtMfHtLS0tLS0x8fHuq6hrrq6uq6urq6urq6uuq6uurq6zc3Nzc3Nzc3Nzc3NwMDAwMDAwMC0wMC0tLS0tKFdUFBQ +aWlXY3ZpV2lpV1dpXV0AAKHAwMDAwMDAwMDAwNPHx9PT09PT09PT09PTx9PT08fHx8e0p7TTx8fZ2dnZ2dnHx8fHusfHx9PT5ubZ2dnHx8fT39/f7NPHx8fH2ezs7Ozs7NPTx8ff7Ozs39P47Ozs7Ozf09Pf39/s7Nnm2dnZ7Ozs7Oz4+OzT5vLy/////9nZ +2dns7OzZwNPT0/js2dnZ2dnm09Py8vLy///////47OzfzdnH09PT09PT08fH08fT08fHurrHusfHusfHtLS0tLS0p7qursDAtLS0tKe0x8fH08fHx8fHx8fHx8fHx8fHx7q6urq6urq6x7p2Pkpvb11db2NQaWlXV2lpUGNjAACburrHusfHx8fHx8fH09PT +09PTx9PT09PT08DT09PT5tnZ2dnZ2dnZ2c3Nurq6urrHx9Pm5tnZ2dnNzbq6x9PT39/f39/Hx8fZ7Ozf7Ozszd/T3/Ly8vLTx+zs7Ozs7Ozs7N/f3+z4+Ozs2dnZ8vLm5vLy/9PH3///7OzZ2dnZ5vLy8vLy8vLy8vLT0/Ly8vLfx8fT7N/TwMDA09Pf7Pj4 ++Pj47Ozs39/fx8fH08fHx8eursC0tMe6rq6urq7Huq6uurq6x66urrq6p6e6x8fTx8fT08fHx8fHx8fHx8fHurq6urq6uq66urqVSkppVz5XY1dpaV1daWlQXWlXVwAAlbq6usfHx8fHx8fH08fHx8fH09PT09PTx7TAwNPHurq6urq6x8fH2ezs3+zs39/s +39/f383NzcC0tN/T09Pf3+zZ2ezsx+by8t/f3/LTx9nm5ubZ2dns09Ps7Ozs7N/f08fZ//Ly8v/m09PT0+by8ubZ2dnZ2ezs7OzZzc3Nzc3f39/f39PH2fLm8vLy8vLm2dnZ2ebm09PT09PT39PTx8fT5vLy5vLy8vLy8ubm2dnHx7q6usfHtLS0tLTHx8fT +08e6uq6urrq6urqntMfHx9PTx8fHx8fHx8fHx8e6urq6use6urq6urq6Y0pXVz4xPl1vY2Njb1djb2NXY2MAAJW6x8fHx8fHx8fHx8fT09PT09PH09PTx7S0p6e6oaG0tLTH08fHx9PTx67A09PT09/s7Ozs7Ozs7Ozs7N/f39PTx8fT39/s08DA09PT09Pm +5tnZ2dnZ2fLy5ubm08fT09Py///y5uby8ubm5uby5ubm09//+NnZ2dnZx8fH3+zs7Ozs2dnZ5vj45ubZ2dnAwNnZ5vLy2dnAwM3Z2cfHuq7A09PTx8e6urq6rsfZ2ebm5ubm5tnZ2ce6urq6urq6rq6ursDArq66uq6urrrHx9PHx9PHx8fHx8fHx8fHx8fH +urq6urq6urrHiEpKY0orSmNjV2NjY2NvY1BjY1dXAACPwMDAwMDAwM3Nzc3Nzc3Nzc3N2dnZwLS0tLS0tLS0tLTTx8fHx8e6urq6x8e0tMDA09PHurrH09Pm8vLy8vLy8vLm5ubTx8fHx9PT0+by39PAwNnZ7Ozf39/T3/Lf0+by8vLf07rH5vLy///4+ObZ +2dns7Oz/7NnZ5tPm8v/m8vLy5ub45tnZ2ebm09/y8tnZ2dnHx8e60/Ly8vLy2cfHx8fH08DAwMDAwMDT09PHtMfHus3Z2dnZ5ubZ2dnNzc26rq66uq6uuqe0tMfT09PTx8fHx8fHx8fHx8fHx8fHx7q6urq6urq6oUpKb103RGNjY29jV2lpV2NvXV1paQAA +j7TAwMDAwMDAwNPHx9PT09PT09PT09PT08fHx7quwNO6urq6usfHurq6x7q6x8fH2dm0tMfHx9nZ2dnZx8fHx8fT3+zs+Pj47Ozs3+z45tPTwNnZ2dnZ2ezZzdnZ7Ozfx+by2dnm+Ozs7NPT09Pf8vL///j/+Ozs39////////Ly8tnZx9nZ2dnZ2dnZx8fH +09PTx8fH2dnZ2fLZx9PT09/f09/f08fHx8fH09O6urq6rrrNwMC0tKfAwMDT09PT39/T08fHx8e0p6fHx8fT08fHx9PHx8fHx8fHx8fHurrHx7q6urq6unZEUFBQN0RXdmlXaWldXXZjV2lpV1cAAI+6urrHx8fHx8fHx9PT09PT09PT09PT09PT39/f7Ozf +39/f09PTx7rHusfHx8fH09PHx8fHx8fH08fHx8fTx8fT08fT09Pf08ff3+zs7P//////+ObZ2cfH0+bm5tnZ2c3f7Ozs39/s2dnZ2dnZ7Ozf8vLT39PT5ub4+P////////////////j439/Nzc3m2dns7MfH08fm2c20tNPf09/f09Pmzc3Nzc3Z2dnZx7q6 +rsDAwMDAwMDAwMDAtLSnp8fHx8fH09PH09PTx8fTx8fT08fHx8fHx8e6usfHx8e6urq6uq66x5U3RGNXHzFjY1djY1dXaWlQY2NXV2NjAAChurrHx8fHx8fHx8fH09PT09PT09PT09PT09Pf39/f39/f3+zf3+zs7Ozs7Ozs7N/f383Nzc26x9PHx9Pf383N +zcDA08fZ5tnZ2dnHx8fT5ubm8vL////////4+ObT3/Lm5ubm5uby8tPT39/f7Ozs383Nzd/f3+zs7Ozfx8fH09Pm8vLy///4////////8vLf08fT8ubm5tPT08fHx9PTuse6usfHx7rNzc26uq7A39/Tx9nArq66urq6urq6rq7Hx7Snp6enp7rHx8fTx8fT +x8fHx8fHx8fHx9PHx8fHtLTAwLS0x6FXPmlpMTFjY1dpaV1daWlQY2NXV2lXSgAAocDAwMDAwMDAzc3Nzc3Nzc3NzdnZ2dnZ2dnZ2dnZ5tnZ5ubm5ubm5ubm5ubm5uby8vLy8vLy8vLy5ubZ7Pj4+Pj47Ozf08fH09PT09PH09/f09PTx9ny5ub4+Pj///// +//jm5tnZzc3N2dnZ5vjs383Z+Ozs7Ozs7Pjfx9Pf3/Ly39/f39/sx8fT7Oz4+P////////j47N/f7OzZ2cfT09PTx9PAwMDT08fHx7q6utPHx8fTx8fH09PT09/s2dnZ2bq6uq6ursfHx9PHx9PTx8fHx8fHx8fHx8fHx8e6urq6urq6urpjN11dRDdKV2lp +V1dpaVdpaV1daWlXV2MAAIKhoa6urrq6x8fHx9PT09PT09PT09PT09Pf39/f39/f39/f39/f7Ozs7Ozs7Ozs7Ozs7Oz4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj///j439/s08fT09/s7Ozf39/f09PT39PT5vLy///////////47OzZzc3m5vj47N/s+N+0tMDAwMDZ +2ezZ2dnZzdnZ5ubZ5tnNzdnZ7Oz4+Pj///////Ly8se0wMDAwNPT09PTx7S0wMDfx66htLS0x7ShoaGhobrHx8fZ2dnZ2dnZ2dnH09PHx9PHx8fHx8fHx8fHx7q6x8e6urq6useVSkpXV0pKY29jY2NjV2NjY1BpaVBQaV1QAABpiIiIiJWVlZWVoaGhrrq6 +usfT09PT39/f39/f39/f39/f39/f7Ozs7Ozs7Ozs7Ozs7Ozs7Oz4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4//j/+Ozs7NPTx9PT08fH09PT09PT08fHx9/s7Oz4////////////7NnZ2c3Z7Ozf+Pjm8v/s09Pf39/y5tnZ2cff+N/f7N/f38C0x8ff7Oz4+Pj/ +//j4//j47N/Hurq6utPT09/fzbTA08fHx7qhtMfHurq6oaGhrq7A09PT09PT09PHx8fHx8fHx8fHx8fHx7q6urq6use6VzFjYz4+Y2NXb29XY2NjV2lpV1djY0pdXQAAV2lpaXx8iIiVlZWVlZWVlZWVlZWVoaGurq7AwNPT09Pm5ubm5ubm5ubm8vLy8vLy +8vLy8vLy8vLy8vLy8vLy8vLy///y8v/y8v/4+Pj4+Pj///j///j47N/f7N/f39/f09PH2ezs7NnZ2c3N5ubm+Pj4////////////+Obm09Pm09/T3+zf39/Hx8fZ2ebm5tnNzbrs39/T09PHusfH09Pm8vLy8vLy8vLy8vLf09O6p7THusfHx7S0tLTAwLSn +p6e0tLSnp8fZ2cfH08fH08fHx8fHx8fHx8fHurq6urq6x7q6gj5XYz4xRFdpdmNjb29XY2NXV2lpUFBpXVAAAFdpdnZjY3Z2aXx8fHyIiIiVlZWhoaGhoaGhoaGhoaGhoa6ursDAwM3N2dnm5ubm5vLy8vLy8vLy8vLy8vLy8vLy8vLy///////y8v////// +///////////////4+PjZ2dnZ2dnZ2dnZ2cfT7Ozs2dnZ2fLm09Pf3+z/8vL//////////+zf08fHx9nZ2dnm09PT08fT7Ozf38fH7OzT0+bZ2ce6urrN383Z7Ozs+Pjs7Ozs39/fx8e6urrHx9PT5tO0tLTHx9nZx9PT09PTx8fHx8fHx8fHx8fHx8fHurq6 +urrHrko+Y29KN2N2aWlpdmNjdmlXb29XV2NjUGNjAABXgnZ2iIh2goKCdoiIdnaCdnZ2gm98fHx8j4+PoaGhobS0tLS0tLS0tLS0tLTAwMDNzc3N39/f8vLy8vLy8vLy8vLy8vLy8vLy8vLy////////8v/////////////////////4+Pjf39/f09/y8t/T +383Nzd/s7N/f7N/Hx8fZ2dns+Pj4///////4+Ozfx8ff+Pjs7Ozs383Nzc3N2dnZx8fH09PT39/f08eux9nNzdnZ5ubm5vLy5ubm2dnArqGuurrH09PT09PTx9PTx8fT09PT08fH08fHx8e6x8fHx8fHumkrV2lEJUpjY2N2Y2N2aV1paWldb29XY2NQUAAA +V2N8fG9viIh2iIh8fI+Pdo+PgoKViHyPj3x8iHZpdnZ2aWldXW9vfHyPj66uusfHx8fHx8fHx8fH09PT5vLy8vLy8vL////////////////////////////////////////////4///////s39Ps39PT09PT5tnZ2dnZx+zs09Pf09PHx9Pf3+zs//////// ++Pj45ubTx7q62dnZ2dnHx8fH0+zZ2bS0tMDAwNPT08fHx7qurq6609PT3+zf3+zs39/f09PT09PT09PH09PTx8fHx8fHx8fHx8e6use6x8e6x5s3N11KN0pXY3ZjV2lpV2lpaVdpaVdjb2NXb28AAFeCb2+CgmmCgnZ2iIhvgo98fI+PdoiViHyVlYKCoY+P +j2lQUFBQUFBQUFBQUFBQUGl8j6G0x9PT08fHx7q6usfH2eby8vLy8vL////////////////////////////////////////4////////////////8vLy5tnN2dnZ5ubm2dnZ2dnZ7NnZ2dnHx9PT8vLm+Pj4+P//+Pj439/s2dnN2ebm2dnAwMDA09/fzc3N +urq6x8fT08e6urq6ocfTx9PT09Pf39PT09PT09PH09PT09PTx8fHx8fHx7q6x8fHx7RdMUpvVzdKaWlXaWlXV2ldUGNjV1dpaVBjY1dKAABXaXx8aXyIfG+IiHaCj4J2j498fJWIdo+PgoKViIiVlWlKV0pXaWlpaV1ddpWViIiIb11dXV1pfI+hrsDA09PH +x8fHurq6x9Pf3/Ly8vL///j///j////4///4+P//+Pj///j///j////4///////////////////////////y8tPHx9/fzebm5ubm5ubm8t/T09PHx9nZ5vLy8v//////8vLm2c3Nzc3N2dnHx7qurq7AwNPT07TT5sChusfTx7q6usfZ2dnZ2dnZ2dnZ2c3N +zc3Nzc3NwM3Nzc3NwMDAwMB2JUpvUCU+Y1dpdmNjb29daWlXV2lpSldjUFBjMQAAV3xpaYKCaYiVfHyPj3aIlXx8j492j5uCgpubfI+hiGldSjdKY2NXY2NXfKGVlaengoKCb3ybm4iIiHx8fIibrrq6x8fHurqnp6enp6fAwNPm+Pj4//j////4///4+P/4 ++P////////j///j4///4////////+P//+P/////////////4+PjZ2ezZzc3f39/T08fHx8fZ2dnHx9nHx9Ps7Oz4+Pj4+Ozs39PAtLTH5ubm2dnZzdnHrqHAzdnZx7qurrrN2dnZ2dnZ2dnZ2c3Nzc3Nzc3Nzc3NwMDAwMDAwMChV0pdSjdKV2l2Y1dpaVdj +b2NXaWlQXWlpUGNjPgwAAGNjdoh2aYiIb3yIfG+IiHZ2lYh8j498fJuPfI+bgmlXPj5KY1dXaWlKdqGPj6GhgoKCaYKhlYihoY+bm4+PoaGVlaGhobTAwM3NzcDArq6uoaGhtMfZ7Ozs+P/4////+P////////////j/////////////+P////////////// +///////4////+Pj47Ozfzc3m5sfH08fH2dnmzdnZ2dnNzc3Z2dns+Ozs///s7OzZzcCurq66x9PT08fZx66uwNPT09/f09Pf09PT09PT08fT08fHx9PHx8fHx8fHuseuSkpjY0pKV2lpXV1vY1djb11daWlXY2NXV2NjPhIAAABXgoJpgoJvb4iIb4iIdnaP +j3aIiHx8m498j6GIiHxXPkpXV1djY1BQfIiIoaGIiIhvb4+bfIihoY+np3yIp6eVp6d8Y2Njb3yIiKGhusfH2c3NzcDArqGurrrH2ezs+P/4//////////////j///j4///4////+P//+P////////j4//j4//j4+P//////+P////Ly383Nzc3NzdnH09Pm +x8fHx8fHuq66x8fT5ubm+Pj4+Pjm5ubTwLS0tLTH09PH39/f39/f39/f09PTx9PT09PT08fH08fHx8fHx8fHaT5Xb0QlV3xvY3Z2XWlpaV1vb1djb2NXaWlXYyUAAAAAY2N2gm9viIhvgo+Cgo+PdoiVgoKPj3aIm4h8lYhKSko+SmNjV1djY3ybm4iVoXxp +doiIfJWViJuniIiVlYihrpWCaVdKXV1dXWldXYKnp7TAwMDT09PT39/Tx8e6usfH09Pm8vLy8v////////////j/////////////+P//+Pj/////////////////////8v////////j/+Ozf09/Tx8fH09PT09Ps7NPTx8fHx9nZ2dnZ7Ozs7Ozs7Ozf3826 +utPT39/f39/T09PT09PTx9PT08fT08fH08fHx8fTrjdXb1c3SmlpaXZjY3x8Y29vXV1paVdjY2NXaVcYAAAAAFd8fG+Cgm98iHxviIh2gpWIfIiVgoKViHaPm4JjUD4+V2NXV1dXV4Khj4+hlW98fHx8j498m6ePj4+Pb3yViIiIY0pKV1dXdnZjY4iVlaen +m5uPj3yVrq7A09PT7Ozf39/H08fH09PT3+zs7Pj4+P////////j////4////////+P//+Pj/+Pj4//j4//j4+Pj4+Pj4+Pj4+Pj///j4//js7N/Hx9PAwNPTx8fH2dnNzc3NzcC0wNPf39/f39/f39/f39/f39/f39/T09/T09PT09PT09PTx8fHx8fHx11E +XV1KSldpdmNjdnZjb29vXW9vV2NjY1djY1cxAAAAAABXY3aCb2+IiGmCgoJ2lZV2iJWCgpWVgoKbiIiIY0pKV1dXY2NKV4KCdpWVgoKCb2+Pj3aIoY+PoZV2goJ2doKCSkpXSkpjY2NjY298obSbm66VgoKCgoKhoY+hoaGhtMfH09PT09PT39/f09PT09/f +3+zs+Pj///j////////4+P//+Pj4+Pj/+Pj4//j4//j4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4//js7OzT5ubHx8ffx8fHx7rT5ubm5ubm5ubZ2ebm2dnZ2dnZ2dnZ2dnZ2dnN2dnNzc3Nzc3Nzc3N2ac+SnZjRGN8b2Nvb2Njdmldb29jY29jV2lpSl1KBgAAAAAA +V3ZpaYKCb3yIiHaPj3aClYh8j498iJuPgpWVfHyPgm+IiGlpdnZ2iJWIiJV8Y2+IiHyVoYihro+ClXxpiIh2Y1dXRFdvb2Nvb1eCp5uPrq6IiIh8iKGhj6G0oaGhlYihrq6uroiIobTH09/f39/s39/f09PT09Ps7Oz4//j////////4+P/4+Pj/+Pj/+Pj4 ++Pj4//j4+Pj4+Pj4+Pj4+Pj4+Oz4+Pjs+Pjs7Ozf39/ArrrN39/s7N/s7Ozf39/f39/f39/f09Pf39PT09PT09PT09PHx8fHx8fHx8djRGNQPlBjY29vY2Nvb11vb2Njb29XY2NXV2NXGAAAAAAAAFdvgoJpdoh8b4iIdnaPj3aPj3x8j498j6GCgqGVgqGh +j4+hlXyPp4+Pp6d8iJWIiKGVfI+hiIiVlXZ2iHxpdlBQUFBQXW9vY2OCm4+np5WVlZVpj6F8iK6biKGhiIiurpWurnZXV2Njb3x8iIihtMfT09PT09PT09PT09PT09Pf7Ozs+Pj4+Pj4+P//+P//+Pj4+Pj4//j4//j4+Pj4+Pj4+Pj4+Pj4+Ozs7Ozs7Ozs +7Pjs7Ozs7Ozs7N/f7N/f39/f39/T09/f09PT09PT09PT09PT09PH08fHx9OnV1djgoJpdnZpaXZ2XWl2Y2Nvb2NjdmNXaWlXPgAAAAAAAABXfG9vgoJpfI98fI+Pb4KPfHyPj3yPj4+ClZWCj6GIiKGhiIinlYihoYiIp5WIoa6VlaebiJubdoKCgm98iFdX +V0pKaXZpaWlpfKG0oaG0m4KCj4+Pp6ePobShiJWVfJWuoYhpXUpjdmlpdmlpiKGhoa6uoa6ux9Pf39/f39/f08fT08fT09PT3+zs7P////////////Ly//Ly///y///y8vLy8vLy8vLy8vLy8ubm8vLy8vLm5ubm5ubm5ubm5tnm5tnZ2dnZ2dnZ2dnZ2dnZ +2dnZ2cfH08fH09PTaUppfGlpfG9jb3xjY3ZpXW9vXV1vY1dpaVdXVxgAAAAAAAAASml8fG98j3xviIh2do+CdoiIdnaPj3aPj3x8lZWClaGCgqGVfJWhiIihoYiVoY+Pp6eIoaGPj6GhiJubiHxpV0pKaWlddnZXdqGVla6uiIihiIinlYKbrqGVp6d8fJWC +do9pRERjY2N2dmlpj6GVrq6hoYh2aZWnm6e6uq7H09Pf39/f39/f08fHx9PT0+bm8v////////////Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLm5ubm5vLm5ubm5ubm5tnm5tnZ2dnZ2dnZ2dnZzdnZzc3Nzc3Nzc3Np1dpaWmCdmN2dmlpdmlXaXZjY3Z2 +V2NjV1dpaT4MAAAAAAAAAERjV1djY2NjdnZ2j498iKGCgpWVfI+biHyVlYKPm4iIm5uClaePj6GhiJWnlYinp4iVp5WIoaGPj6enj6enfHyIdmlpdmNjdoJ2j6eVlaGPdnahgo+np4ihoXx8iIh8fJVvV2NjY3Z2dml2doKhuqGVro9vfKGhiKGhlaGhoZWh +tLS0x8fH0+bm8vLm5tnZzc3N2dnm5vj4+Pj4+Pj4+Pj4+Pjs+Pjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozf7Ozf3+zs39/s2dnm2dnZ2dnZ2dnZ2dnZ2dnZx9PTx8fT02lKY3x8aWl8b2N2dmNvfGldb29jY3ZpV2lpV1clAAAAAAAAAABpiIiIfHx8SiU3NzdQaWlp +doh2iJuPj5ubgo+hlYKbm3yIoY98lZWCj6GVgqGhiIihlZWhoY+PrqGPoa6Vla6ulaGulYiViHaVp5ubrqGCgoKCj6Ghlae6p4+hlXaPm4KCaVdKV3x8aXx8Y4Kurpu0tI+PgoKPoZWIoa6hoaGhj6G0p6enj4+hurrH09Pf39/s7N/f09PT09Pf39/y8vLy +8vLy8vLy8vLy8vLy8vLy5uby5ubm5ubm5ubm5ubm5ubm2ebm2dnZ2dnZ2dnZ2dnN2dnNzc3Nzc3NzadKXXZpaYJ2aXZ2aWl8fGNvb2Njb29XaWldXWk+BgAAAAAAAAAAgqGhoaGuiB8AAAAMGCUlMTExSmNXY3x8fIibj4+hoYiIp4+PoZWCj5uIfJWVfI+h +j4+np4ibrqGPp6ePoa6hj6enlZW0p5WurpWVtKeIoaGIm66hlae0m5ubm2+Pm3x8b1dKV29vb3x8Y4KuoaGuro+Pj2+IoaGIoa6hj6eVgpu0oaG0j2OIp6enp6entLTHx9Pf7Ozs7Ozf39/T09PT09/s7Ozs+Pjs7Pjs7Ozs7Ozs7Ozs7Ozs7N/f7OzZ5ubm +2ebm5ubm2dnZ2dnZ2dnZ2dnNzc3Nzc3NzcBdUHZ2doJvb3x8Y2N2dmN8fGNjdmldaWlXY29QGAAAAAAAAAAAAIKhoaGhtIgYAAAAAAYYDAwMGBgYJSUlPlBQUGNvY3aPj4KVoY+bp5uIoaGPj6GVgpWhgoKhoYihrpWVrqGIoa6Vla6ulaG0oZW0tI+ntKGh +tLSVrq6Vla6hfIiIiHaVgldKSldjfHxpaXyPj66um5ubgm+VroiIrq6brq6IiIiIiKG0lWmIoZWnp6enp6ebm4h2m7rHx8fH09PT39/f39/f09PH09PT09/f7Ozs7Ozs7Ozs7Ozs7Ozs7N/f39/f39/f39/f39/f39/f39PT09PT09PT09PH09ObSl1viHZp +dnZpaXx8Y3Z2aWl8fGlpdmNjb2NXMQYAAAAAAAAAAACCoaGhobR2GAAAAAASEhISEhISEhISEhISEhISHys3N0pXSldvb2+Cm4iIoaGIm6ePj6GhgpWhiIihoY+htKGVrq6VobShla6ulaG0p5WurpuntLSVrq6VobS0la6uj3xpXV1pfGlpfG9vlaGVobqh +doKVlZWhoY+hrqGPoY9piJWCgoKCgqG0oZWurpWntKGPoaGVp6ebm6e6usfHx8fH09Pf39/f09PT08fT09Pf7Ozs7Ozs7Ozs39/s7N/s7NnZ5ubZ2dnZ2ebZ2dnZ2dnZ2c3Z2cfH09PHXURvfG98iHZ2goJpdoJpaXZ2Y2N2Y1d2dmNvYxgAAAAAAAAAAAAA +dqenp6e6bwwAAAAADAwMDBgYGBgYGBgYGBgYGBgMGBgMDBgYGCU3NzdXY1dpfHx8j5uIlaenj6enj5uuoZWnp5WVrqGPoa6Vla6ulae0oaG0tI+uuqGhuq6VrrqhobShiJWhiHyIiGl2m4+Pp7SViIhvfKGhiKG0oaGum3x8iIh2j49jgq6ulae0laG0oY+h +rqGhrqGPoaGPm66urq66urq6usfH09PT39/f09PHx8fHx9PT39/f3+zs39/s7N/f39/f39/f39/f39/f09PT09PT09PT08fToURdaWmIfGl8fGlpgnZjdnZjY3ZpXW9vY2Nvbz4SAAAAAAAAAAAAAIKhoaGhtF0SAAAABhgYGBgYGBgYDBgYGBgYGBgYGBgY +GBgYGBgYDBgYGBgYGBglPj5KY2NjfI+CgqGhiKGuoY+np4+hrpuPp6ePoa6hla6ulaG0oZW0tJWnuqeVrrqbp7quobq6m5uurpW0tJunp4+Cla6bj6enj6e0j4+PgoKCj49piKGPp7Sbm66uj6GIb4inp4+hrqGVrq6Poa6hla6uoa6uoa7Hx8fHx8fT09PT +08fHx8fHx9PT09/f39/f39/f39/f39/f39/f39/T09PT09PT09PTx2k+Y4KCaXx8b2+CgmN2gm9jdnZjb29jY3ZpaWklAAAAAAAAAAAAAAB8oaGhrq5KBgAAAAAMDBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYJSUlPkpKV29vb4iI +iJunp4+np5WVrqGPp6eVoa6ula66m5u0tJW0tKGhuq6Prrqhobq6obTAoaG0tJWuuqenurqhrrqbm5uPb4KVdoKCb3ybtKGVrq6Vp7SPY3yhj6Gum4+np4+brqGPp6ePoa6hj4+hlae0tLS0x8fHx8fHx8fT08fHx8fHx9PT09PT39/f39/f39/f39PT09PT +09PT09PT06E+V3Z2doJvb3x8Y298b2N2dmNjdmlddnZjY3ZQEgAAAAAAAAAAAAAAgqGhoa6hMQAAAAAAGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAwYGBgYJTExMUpdXWmIfHyhoY+hrqGVrq6PobShla6ulae0oZW0tJuu +x66hurqhobqhobS0lafAp5W0tJunuq6btLSPobSnj6Gudnanp5WurpubtLSVlZWVlbquiJWnlZWuro+hrpubrq6Poa6bm6enj6GhlZWurq66urrHx8fHx9PT09PHx8e6x8fH09PT09Pf39Pf39PT09PT09PT09N2PldviIhpfHxpaXx8Y298Y2N8b2N2dmNj +b29dMQwAAAAAAAAAAAAAAIKnp6e0jyUAAAAAABISEhISEhISEhISEhISEhISEh8fHx8fHx8fHx8fHx8fHx8SHx8fHx8fHx8fHx8fHxISEhISEhISEjE+PlBjY2OIiIiIrqGVp6ePoa6hj6GhiJWuoY+urpuntLSVrrqhobqula6uoaG0tI+uupubtLSVrrqh +oaGhla66oaG0tJWhlWlpoaGPoZVvfKGhj6GulZWnp4+hrqGVp6eIoa6hj6eniJWniHyPp6enurq6urq6x9PT08fHx8e6urrHx8fT09PT09PT09PT09OuSj52dnZ2iG9vgnZpdoJpaXx8Y2N2Y2N2dl1vVxgAAAAAAAAAAAAAAACCoaGhtHwYAAAAAAwYGBgY +GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYJRgYGBgYGBglJTFKV1dpgnZ2m5uIoaGPj5uPfJWhiIibj3yVp5WVtLSPp7ShobS0lae6p5u0tJWnuqebtLSbp7qum7S0m6e0lW9vlZWhtKGCj6GPm7Shj6enj4+n +m4ihoY+PtKePoa6VlaeViJWhiIihoY+hoZWhoaGuurrH09PH09PHuse6urrHx8fZ2dnZ2dnZgkpdaXyIdml8fGl2iHZpfHxpaXxvY3Z2XV12djcSAAAAAAAAAAAAAAAAdqGhoaFdEgAAAAAGEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIf +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fEhIfHx8rKytEXV1pgoKCj6GPj6GVfHyVfG+Pj3yIoY+Poa6VobSnla66m5u0tI+0tKGhtLSVrq6hobS0laenlaG0tI+ntKGhrqGPoa6bj6enj4+PgoKnp4ibp4+PoaGIm6ePj6GhiJWnlZWnm4iVoZWV +oaGhobrHx8fHx8fHurq6urrHx8fZtFc+Y4iIb4KCdnaCdml2dnZpfHxjdnZpaXZ2Y2MlAAAAAAAAAAAAAAAAAIinp49vJQYGBgYGEhISEhISEh8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8fHx8fPkpKV2lpaYihiIihlXyPj3x8iIhviJWIiKGhiKG0oZWuro+htKentLSVp7S0lbS0m6e0p5uuuqGhtLSVrq6Voa6hj6GhfIihoYihoZWVp6eIm6ePj6GhiJunj4+bm3ybm4iIm5uCj498iHx8obTAwMDAwMDAtLS0p2k3XYh8b4KCaXyI +dnZ2gmNvfG9jdnZjY3xvY28+DAAAAAAAAAAAAAAAAACIlYJdNxgGBgYGBhISEhISEhISEhISEhISEhIfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHxISEhISEjElMURXV1d2doKVlYiI +lYh2j498fJuIdo+biIihlYihrpubtLSVrrqhobS0j6e0oaG0p5WntKGVrq6Poa6bj6enj6GhlYinp4+hoY+Cm5uIlaePj6GhiIihj4KVlYKPoY+PoY9XY4KCdo+Poa66x8fHrnY+SmlpgoJvb4J2aXaCaWl8fGNvfGlpdnZdaXxjJQYAAAAAAAAAAAAAAAAA +dnZKKysSAAAMAAASEhISHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx83NzdjY2OClYiIoaGIm6eIiJWIdoiIiHybm4ihrqGhtLSbp7Sn +m7q6lae0oaGuro+hrqGPp6eVlaeniKGhiIinm4iIiHyPp6eIoaGPj6eniKGhiIihlXyPoYh2aYKCj5uCgoKCgo+hlXZdSld2iHZpgoJpdoh2aXx8Y298aWl2dmNjfGldShIAAAAAAAAAAAAAAAAAAEo3JRgYDAAAAAAMDBgYGBgYGBgYGBgYGBgYGBgYGBgY +GBgYGBgYGBgYGBgYGCUlJRgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYJSUYGCUlJSUlGBgYGBgYGBgYGBgYGBgYGBgYDBglJSVEV1djfHx8laGPm6enj6GhfHyPfG+PoYiVrqGVrrqhobS0la6uoaGuoY+hrpWVp6eIoaGPj6GhiJuniHaV +oYibp4+PoaGClaGPj6GVgo+hj4+PY1d8lYh8lZWCj4+Cdoh8b4KPgm+IiG98iHxpgoJpaXx8Y3Z2Y2N2aVdvYyUGAAAAAAAAAAAAAAAAAAAfHwwYKwwAAAAAAAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBglGBgYGBgYGBgYGBgYGBgYGBgYGBglJRgY +GBgYGBgYGBgYGBgYGBgYJSUlJRgYGCUlJSUYGBgYGBgYGBglJRgYGBgYJSUlJSUlJSUlGBgYGBgYJSU3V2NjfJuPj7SniIiVfHyPj3aIoYiIp6ePoa6hlbS0j6e0oY+np4+bp5uPp6eIlaebiKGhj4+nlYihoYiIp5WCoaGIiKeVgpubb1B8iHaPj3yIlZV8 +iJWCgo+Pb4KPdnaIiGl8iG9vgoJjdoJpaXx8Y2N2Y0oYAAAAAAAAAAAAAAAAAAAAEhIlJRgMDAAMDAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBglJSUYGBgYGCUlJSUlJSUYGBgYJSUlJSUlJSUlJSUlJSUYGCUlJSUlGBglJSUlJSUlJSUY +GCUlJSUlJSUlJSUlGCUlJSUYJSUlJSUYAAAAAAAAGBglSmNjdo+Pj6enj5unj4KVlXaIm4iIoaGPj66hlaenj4+uoYihoY+Pp5uIoaGPj6GViJuniIihlYKVoYiIoZV8j6GIiGlpdoiViHyVlXyIm4KCj492do92aYKCaXaCdmmCgml2gm9jdnZjY3xvY28+ +EgAAAAAAAAAAAAAAAAAAABIrGBgYBgYGBgYGEhISHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwwMDAwMAAAM +AAAMDBglN1djY4+Pj6e6oaG0p4ibm4KCj4+ClaGPj6eniKGum4+hoYiVp5WIoaGIlaePj6Ghgo+hj4+bm4iIoY+ClYhKaZWIfI+PfIiVgnaIiHZ2j49viIhvb4h8aXx8b2+Cdml2dmNjfG9jb29XJQwAAAAAAAAAAAAAAAAAAAAYGCUSEhIGBgYGBhISEhIS +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8MDAwMDAwMDAwMAAAAAAAADBgYJUpKV3x8iJWnp5Wnp4iIoYh8lZV8 +iKGPj6GhiJWnlYihoYiIp5WIoaGIiKGPgpWhiIihj4KVoYhpaYKCj6GCgpubfI+PfHyPj2+IiHZ2iIhvfIh2doKCaXaCb298fGNjdmlpUBgGBgAAAAAAAAAAAAAAAAAAGBgAABIAAAAAABISEhISEhISHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fDAwMDAAMDAwADAwMAAwMDAwMAAAAAAwMHx8xPldpaXaPj4+hoY+PoZV8j5uCgqGVgpWhj4+np4iVoY+PoaGCj6GIiJubgo+h +iIiIaWmCm4h8j498iIiIfI+PdoKPgnaIiG98iHZpfHxpdoJ2aYKCaXZ2dmN2djESAAAAAAAAAAAAAAAAAAAAAAwMABglDAAADAwMGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBglJSUlGBgYGBgYGBgYGCUlJRgYGBgYGBglJRgYJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGAwMDAwAAAAADAwMDAwMDAwMDAAMDAwAAAAAAAAAABIfHz5XY2OCgoKVoY+PoZV8iJuIfJWVgo+hj4+bm4KPoY+Cm5uIiKGPgpWVfG+VlYKVlYKClYh8iJV8fI+Pb4iIfHyPgml8iG9v +fHxjdoJvb3x8aWl8b1AlBgYGAAAAAAAAAAAAAAAAAAAGBh9XPgwADAwMDBgYGBgYGBglJSUlJRgYGCUlJSUlJSUlGBgYGBgYJSUlJSUYGBgYGBgYGBglJSUlJSUlJSUlJRgYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJRgMDAwMAAAMDAwMDAwADAwMDAwMDAwMDAwMDAwMDAwMDAwAAAwYGCU3SldjfHx8j5uIiKGPfIiVgoKPj3yPoYiIoaGCj6GIiJWVfI+biIibm4KPj498lZV8fJWCdo+PdoKVgnaIiG98iHxpgoJpdoJ2aXZ2aWkxEgYGBgYAAAAAAAAAAAAAAAAA +DDFpiD4SEgYGBhISHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYG +BgYGBgYGBgYGBgYGBgYGBgYGEhIlRERXaXZ2iJuIiJWVdoibiHyPj4KPoY+Cm5uIiKGIfJWVgoKbj3yPj3x8j4J2j4+Cgo+PdoiIfHyIiG98fGlpfHxpfHxpaXxXHwwAAAAAAAAAAAAAAAAAAAAAADdpfHw+EgYGBgYSEhISEh8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fKysfHx8fHx8fHwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAwMDAwMDAwMDAwYJTE+V29v +b4+Pdo+PgoKViHyPoYiIoaGCj6GIiJuPgo+bgoKVlXaIiHx8j492go98fIiIb2+Idml8fGN2gm9vfHxjRB8MDAAAAAAAAAAAAAAAAAAAAABjfHxvMQwMDAwMGBgYGBgYGBgYGBgYGBgYGBgYGBgYJSUlJSUYGCUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJRgMDAwMDAwAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAADAwMJT4+V29vb4KCdoKbiIibm4KPoY98lZV8iJWCgo+PfHyV +iHaIiHx8j4JviIh2doiIb4iIb2+CgmN2dmlpaSUSBgYGBgYAAAAAAAAAAAAGBgAAY29jYzEMAAwMDBgYGBgYGBgYJSUlJSUYGCUlJSUlJSUlJRgYJSUlJSUlJSUlJSUxJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwMAAwYJTE+SmlpaXyIdoKVlYKVoYiIm498j498fJWIdoiVgoKPgm+IiHx8j49vfIh2doKCaXx8b298fEofDAwM +AAAAAAAAAAAAAAAAAAAAAFdXV1clEgYGBgYYGBglJSUYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGAwMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMJTExRFdjV2mCdnaIiHaIlYJ2j49vfI98fI+PdoKPgm+IiG98j3xviIhpdoh2aXx8aWk3GAwMDAAAAAAAAAAAAAAAAAAAAABKY2NXJRIAABISEh8fHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHxISEhISBgYGBgYGBgYGBgYGBgYGBgYSEhISEhISEhISEgYGBgYGEhIS +EhISEhISEgYGBgYGBhISEhISEhISEhISBgYGBgYGGCUxMUpdXV12dnaCgnZ2iIhvgoJvb4h8b4iIfHyPj2+CgnZ2goJpfHxvb4JXJRgMDAwAAAAAAAAAAAAAAAAAAAAASldXVyUMAAASEhIfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHysrHx8fDAwADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwA +AAAMDB8rK0pdXV1paV12dnZ2dnZjb3xvb4iIdnaPfHyIiG9vgnZpfHxpPhgGEhISBgYGBgAAAAAAAAYGBgYAAERXV0olDAAAAAwYGBgYGBgYGCUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlGAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBglJTdKV0pjY1djb29jb29jb4KCb4iI +dnaCgmmCgml2aSUMDAwMAAAAAAAAAAAAAAAAAAAAAABEV1dXJQwMDAAMGBgYJSUlGBgYGCUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxMTElJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJRgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAABglJTFKSj5XV1dXb29XaXxvb4iIb3yIb298fEoYDBgMDAwAAAAAAAAAAAAAAAAAAAAA +RFBQUCUMDAwMDBgYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlMSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlMSUlJSUlMTElJSUxMSUlJSUlJSUlJSUlMSUYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDAwMGAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAwfMTE+SkpKY2NXY3x8b4KCb2+Cgl03DAwMDAwMAAAAAAAAAAAAAAAAAAAAAERXV1cYBgYGBgYYGBgYGBgYJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlMSUlJSUlJSUlJSUlJSUxMTElJTElJSUlJTExMSUlJSUlJSUlJSUlJSUlJSUlJSUlEhISEhISEhISEhISEhIGBgYGBgYGBgYSEhISEhISEhISEhISEhISEhISEhISEgYGEhIGEhIGBhIS +EgYGBgYSEhISEgYGEhIGBhISEhISBgYGEhISEhISEhISBgYGBgYYGCU3NzdEXV1daYJvb4KCaXZjJQYGBhISAAAAAAAAAAAAAAwMDAAAAABEUFBQJQwADAwMHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHysrKysrKysrKysrKysr +KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrHxISEhISEhISEhISEhISEhIGBhISEhISEhISEhISEhISEhISEhISEhISEhISEhISBgYSEhISEhISEhIGBgYGBhISEhISBhISEhISEhISEhISEhISEhISEhIS +EhISEhISBgYGBhIlMTE+UFBQb3xvb4JvShgAAAwMDAwAAAAAAAAAAAAAAAwMDAAARFdXVyUMAAAAEh8fHx8fHx8fHx8fHx8fHx8rKysrKysrKysrHysrKysrKx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHzElJSUlJSUlJSUlJSUlJSUlJSUlJTEl +JSUlJSUlJSUlJSUlMSUxJSUlJSUlJSUSEhISEhISEhISEgYSEgYGEhISEhISEhISEhISEhISEgYGEhISEhISBgYGEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgYSEhISEhISBhISEhISEhISEhISEhISEhIGBgYYJSU3SldXdmNjYz4SAAASEhIG +BgYGBgYAAAAGBgYGBgYAAERXV1crDAAMDAwYGBgYGCUlJSUlJSUlJSUlJRglJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxJTExMSUlJSUlMTElMSUlJTExJTElJSUlMSUxMSUxMTElJSUlJTExJSUlJSUlMTElMSUlJSUlJSUlEhISEhISEhIS +EhISBgYGBgYGBhISEhISEhISBhISEhISEhISEhISEhISEhISEhISEhISEhISBgYGBgYSEhISEhISEhISEhISEhISEhISEgYGEhISEhISEhISAAwMDAwMDAwMDAwMDAwYGBg3Nzc3Sj4fBgYGBgYGBgYGBgYAAAAAAAAMDAwMAABEV1dXMRISAAwYJSUlJSUl +JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlMSUxMTElJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxMSUlJSUlJSUlJTExMTExMSUlJSUlJSUlJSUlJRISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIS +EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISBgYGBgYGEhISEhIfHx8fDAAAAAwMDAAAAAAAAAAAAAAMDAwMDAAASldXVz4YDAwMGCUlJSUlJSUlJSUlJSUlJSUlJSUxJSUlJSUlJSUlJSUlJSUlJSUl +JSUlJSUlJTElMSUlJSUlMTExJTExJSUxJSUlMSUlMTElJTElMSUxMTExMTExJSUlMTExJSUlJSUlJTExMTExJSUxJTExMR8SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIS +EhISEhIGEhISEgYSBgYGEhISEhISEhISEhISEhISEhISEhISEhISEgYGAAAMDAwMAAAAAAAAAAAADAwMDAwAAERXV1c+GAwMDBgYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxMSUlJSUlJSUlJSUlJSUxJTElJSUl +MSUlJSUlJTExJSUlJTExJSUxJSUxMTExMTElJSUlJTExJSUlJSUlEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgYSEhISEhISEhISEhISEhISEhIS +EhISBgYGEhISAAAADAwMDAwMDAAAAAAAAAwMDAwMAAA+V1dXRBgGBhIfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr +KysrKysrHx8MDAwMDAwMDAwMDAwMDAwMDAwMDBgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYGAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBgGBgYSEhISBgYABgYGBgYGBgYGBgYGBgYGBgYGBgAA +PlBQXUoYDAwMGBglJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJTElJSUxJSUlJSUxMTElMTElMTElMSUlJSUxJTExMTExMSUlJTElMTExMSUxJTExJTExJSUlJSUlJSUlMTExMR8SEhISEhISEhISEhISEhISEhISEhISEhIS +EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIGEhIGEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIGEgYGBhISBhgMDAwYGAwAAAAMDAwMAAAAAAAAAAAAAAAMDAwAAEpXV2NEGAwMDB8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f +Hx8fHx8fHx8xJSUlJSUlMTExJTElMSUlJTElJTExJSUlJSUlJSUlJSUlJSUlJSUxJTExJSUxJSUlJTElMTExMTElMSUxJSUlMSUxMSUlJTExMSUlMSUYGBgMDAwMDAwMDAwMDAwYGAwMDAwMDAwMDAwMDBgYGAwMDAwMGAwMGAwMDAwMDAwMDAwMDAwMDAwM +GAwMDAwMDAwMDAwMDAwMDAwMDAwMGBgYDAwMDBgYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBgGBgYGEhIGBgYGBgYGBgYGBgYGBgYGAABKV2NjSh8SEhIlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUxMSUxJSUxJSUlJSUlJSUlJSUl +MTExMSUlJSUxMTElMTElJSUxJSUxMTExMSUlMSUlMSUlMTElJTExMTExJSUxMTExMTExJSUxGAwMDAwMDBgYGBgYGBgYGBgMDAwYGBgMGBgYDBgYGBgYGAwMDAwMDAwMDAwMDAwMDAwMDAwYGAwMDAwMDAwMGAwMDAwYGBgMDBgYDAwYDAwMDAwMDAwMDAwM +DAwMDAwMDAwMDAwMDAwMDAwMDAwMDBgYBgYABgYSEgYGBgYGBgYGBgYGBgYGBgAASmNjY1AfDAwYJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJTElJSUlJSUlMSUxMSUxMTElJTExJTElJSUxMSUlJSUlJSUlMSUlMTExJTElJSUxJSUlJSUx +MTExMTElJTEYAAAAAAAAACsrKysrKx8SEhISEhISEhISEhISEhISEgYGBgYGBhISEhISEhISEhISEhISEhISEhIGBhISEhISEhISEhISEhISEhISEhIGBhISBgYGBgYGBgYGBgYGEhISEhISEhISEhISBgYSEgYSEhISEgYGBgYGBgYGBgYSEgAAAAAMDAwA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHx9PT39/s7Pj4//////// +////////////////AAAAAAAADAwYGCUlMTE+PkpKV1djY29vfHyIiJWVoaGurrq6x8fT09/f7Oz4+P///////////////////////wAAAAAAAAwMGBglJTExPj5KSldXY2Nvb3x8iIiVlaGhrq66usfH09Pf3+zs+Pj/////AA== +--mail.sleepy.sau.144.8891 + + +The digitizer does 64 gray levels at any of: + 256 x 244 (included) + 128 x 122 + 66 x 61 + +At 19.2k baud (it uses an rs232 interface) it takes up to 32 seconds to +fetch the image (with no compression). The lower resolutions take +8 and 2 seconds respectively. +--mail.sleepy.sau.144.8891-- + + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: More Imagery + +Received: from hanna.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA29595; Thu, 3 Oct 91 13:05:05 -0700 +Received: from thumper.bellcore.com by hanna.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA19384; Thu, 3 Oct 91 13:04:49 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id for MRC at CAC.Washington.EDU; Thu, 3 Oct 91 16:04:44 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id for MRC at CAC.Washington.EDU; Thu, 3 Oct 91 16:04:43 EDT +Received: from Messages.7.14.N.CUILIB.3.45.SNAP.NOT.LINKED.greenbush.galaxy.sun4.40 + via MS.5.6.greenbush.galaxy.sun4_40; + Thu, 3 Oct 1991 16:04:42 -0400 (EDT) +Resent-Message-Id: +Resent-Date: Thu, 3 Oct 1991 16:04:42 -0400 (EDT) +Resent-From: Nathaniel Borenstein +If-Type-Unsupported: send +Resent-To: Mark Crispin +Return-Path: +Date: Fri, 7 Jun 91 09:09:05 EDT +From: sau at sleepy.bellcore.com (Stephen A Uhler) +Message-Id: <9106071309.AA00574 at sleepy.bellcore.com> +To: nsb at sleepy.bellcore.com +Subject: meta-mail +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary="mail.sleepy.sau.158.532" + +--mail.sleepy.sau.158.532 + +2 Questions: + +1) MM_QUIET doesn't seem to work in the 212 version of metamail. + +2) I've been pondering how I am going to send you this 40mb mail message. + I was going to split it up using the "parts" mechanism, but then it occurred to me. + My software has no business worrying about message size. Its up to the mail + delivery agent to do that form me. I should be able to compose a very + long message, and pass it off to sendmail (well, a pre-processor to sendmail). + if the message is too long, based upon the src/dst etc, then sendmail should + break it into multiple parts for me, and send it as multiple messages. As the + user (sender) I should be unaware this is happening. + + Similarly, on the receiving end, the separate parts should be assembled as they + arrive; I shouldn't have do deal with them at all as multiple messages. + + I guess what I am proposing are two utility programs: + + msplit + + that takes 1 mail message and splits it into N messages and + + mcombine + mcombine + + that any mail system can call to achieve a uniform mechanism of splitting + and recombining messages, Kind of like: +--mail.sleepy.sau.158.532 +Content-type: image/pbm +Content-transfer-encoding: base64 +Content-Description: Mail architecture slide +Comments: Image wrapped by /usr/sau/bin/fetch_image + +UDQKNzk4IDUzMgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAB////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAP///////////AAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////wAAAD////gAAAAAAAAAAAAAAAAAAAAAAAAAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///gAAAAAAH///gAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wAAAAAAAAA///AAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAf//AAAAAAAAAAA +AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAA +AAAAf/4AAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AP/gAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAfAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAABwAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAeAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAHgC4AAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAABcAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAA/4 +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAXATgHgdB0DwDwB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAF4E4GMIwjBGB +HxjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAABOCODBmEYQwwwwwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAA +AAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAATwjggZgGAMMMMIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAEcQ4f+eB4ADDDH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAABHkOGAD4PgHwwxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAQ6DhgAPA8HMGIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAEPg4YAA4DjDA8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAABBwOHAUGQZgwQBwEAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAQcDg4JBkGYMMAOCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAECA4P8YRhHPz/j/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAHwg/g8F4Xg+Yf8PAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAA/wAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAABgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+ +AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAQEAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAfwAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAwBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAHQRwME/v4HgJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAACM9/DPDAwGMe8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAABhDgwwwwMDBhyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAYAwOMMMDAgYYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAHgMBjDDAwf+GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAA+DAYwwwMGABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAADwwGMMMDBgAYAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAOMBjDDAwYAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAPwAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABBjAwwwwMHARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAQYwMMMMDA4IY +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAGEOGDDDIyP8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAABeDeD/8cHA8H4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAD8AAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAIkAAAAAAAAA////////////4AAAAAD////////////gAAAAAB////////////wAAAAAAAAAAAAAAB+ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAjAAAAAAAAAf////////////AAAAAB////////////8AAAAAA////////////+AAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAEAA +AAAAAAAH////////////wAAAAAf////////////AAAAAAP////////////gAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAEUAAAAAAAAB////////////8AAAAAH////////////wAAAAAD////////////4 +AAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAPwAAAAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAA +AADwAAAAAAAAAAB4AAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAB8AAAAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAH +gAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAAA+AAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAIkAAAAAAAAB4AA +AAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAA +AAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAA +AAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAA +AAAAeAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAfgAAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAA +A8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAQAAAAAAAAAeAAAAAAAAAAAPA +AAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAA+AAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAjAAAAAAA +AAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAA +AAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AHwAAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAA +AAAAAAAAAHgAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAB8AAAABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAA +AAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAARQAAAAAAAAHgAAAAAAA +AAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAAAfAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAEAA +AAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4 +AAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAA8AAAAIwAAAAAAAAHgAAAAAAAAAADwADwAAeAAAAAAAAAAAPAAB4AAPAAAAAAAAAAAHgAAAAAAeAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAABAAAAAAAAAB4AAAAAAAAAAA8AB/AAHgAAAAAAAAAADwAA/ +gADwAAAAAAAAAAB4AAAAAAP4AAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAABFAAAAAAAAAeAAAAAAAAAAAPAAf+AB4AAAAAAAAAAA8AAP/AA8AAAAAAAAAAAeAAAAAAD/wAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAfAAAAiQAAAAAAAAHgAAAAAAAAAADwAH/4AeAAAAAAAAAAAPAAD/8APAAAAAAAAAAAHgAAAAAA//AAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAACMAAAAAAAAB4AAAAAAAAAAA8AA//wH +gAAAAAAAAAADwAAf/4DwAAAAAAAAAAB4AAAAAAH/+AHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAQAAAAAAAAAeAAAAAAAAAAAPAAD//B4AAAAAAAAAAA8AAB//g8AAAAAAAAAAAeAAAAAAAf/4B4AAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAARQAAAAAAAAHgAAAAAAAAAADwAAP/+eAAAAAAAAAAAPAAAH//PAAAAAAAAAAAHgAAAAAAB//w+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAIkAAAAAAAAB4AA +AAAAAAAAA8AAAf//gAAAAAAAAAADwAAAP//wAAAAAAAAAAB4AAAAAAAD//PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAjAAAAAAAAAeAAAAAAAAAAAP//////4AAAAAAAAAAA///////8AAAAAAAAAAAf/////////// +wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAEAAAAAAAAAHgAAAAAAAAAAD//////+AAAAAAAAAAAP///////AAAAAAAAAAAH///////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeA +AAEUAAAAAAAAB4AAAAAAAAAAA///////gAAAAAAAAAAD///////wAAAAAAAAAAB///////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAACJAAAAAAAAAeAAAAAAAAAAAP//////4AAAAAAAAAAA///////8AAAAAAA +AAAAf///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAIwAAAAAAAAHgAAAAAAAAAADwAAA//+AAAAAAAAAAAPAAAAf//AAAAAAAAAAAHgAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAPAAABAAAAAAAAAB4AAAAAAAAAAA8AAB///gAAAAAAAAAADwAAA///wAAAAAAAAAAB4AAAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AABFAAAAAAAAAeAAAAAAAAAAAPAAD//x4AAAAAAAAAA +A8AAB//48AAAAAAAAAAAeAAAAAAAf/+eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAiQAAAAAAAAHgAAAAAAAAAADwAD//geAAAAAAAAAAAPAAB//wPAAAAAAAAAAAHgAAAAAAf/8HgAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAACMAAAAAAAAB4AAAAAAAAAAA8AB//gHgAAAAAAAAAADwAA//wDwAAAAAAAAAAB4AAAAAAP/8D4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAQAAAAAAAAAeAAAAAAAAAAAPA +Af/AB4AAAAAAAAAAA8AAP/gA8AAAAAAAAAAAeAAAAAAD/4A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAARQAAAAAAAAHgAAAAAAAAAADwAH+AAeAAAAAAAAAAAPAAD/AAPAAAAAAAAAAAHgAAAAAA/wAPAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAIkAAAAAAAAB4AAAAAAAAAAA8AA8AAHgAAAAAAAAAADwAAeAADwAAAAAAAAAAB4AAAAAAHgAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAjAAAAAAA +AAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAA +AAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAPAACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAA +AAAAAAAAAHgAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAHgABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAA +AAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AARQAAAAAAAAHgAAAAAAA +AAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAIkAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAB8AAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAEAA +AAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4 +AAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8ACJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAPAAIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAA +AADwAAAAAAAAAAB4AAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+ABFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAHgAiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4ACMAAAAAAAAB4AAAAAAAAAAA8AAAAAH +gAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAQAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAD4AAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwARQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AIkAAAAAAAAB4AA +AAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAjAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAADwA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEAAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ++AEUAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgCJAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAA +AAAAeAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIwAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAeABAAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgBFAAAAAAAAAeAAAAAAAAAAAPAAAAAB4AAAAAAAAAA +A8AAAAAA8AAAAAAAAAAAeAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AiQAAAAAAAAHgAAAAAAAAAADwAAAAAeAAAAAAAAAAAPAAAAAAPAAAAAAAAAAAHgAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPACMAAAAAAAAB4AAAAAAAAAAA8AAAAAHgAAAAAAAAAADwAAAAADwAAAAAAAAAAB4AAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAQAAAAAAAAAeAAAAAAAAAAAPA +AAAAB4AAAAAAAAAAA8AAAAAA8AAAAAAAAAAAeAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ARQAAAAAAAAH////////////wAAAAAf////////////AAAAAAP////////////gAAAAAAAHwAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgIkAAAAAAAAB////////////8AAAAAH////////////wAAAAAD////////////4AAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AjAAAAAAA +AAf////////////AAAAAB////////////8AAAAAA////////////+AAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAEAAAAAAAAAD////////////gAAAAAP///////////+AAAAAAH////////////AAAAAA +AAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAB4CJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAA8BFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwCMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4IkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAwQAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEAA +AAA/gfAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkAAAAADwAAAAAM8AAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EUAAAADgBAAAAAAAACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAOHAAAAAAMAAAAAA +DAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeCJAAAAA4AQAAAAAAABwAAAAAAAEAAAAAAAAAAAAAAAAAAAADAwAAAAADAAAAAAAwAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAHgIwAAAAOAEAAAAAAAAcAAAAAAADAAAAAAAAAAAAAAAAAAAABwEAAAAAAwAAAAAAMAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BAAAAADgBAAAAAAAALgAAAAAABwAAAAAAAAAAAAAAAAAAA +AcBAAAAAAMAAAAAADAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeBFAAAAA4AQOgPATAAC4APAHgTw/gAAAAAAAAAAAAAAAAAAAHgAHgTwB7BOHAPAQwAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAHwiQAAAAOAEEYMY94ABHAEfGM9+DAAAAAAAAAAAAAAAAAAAAA+AGM9+Bhz334EY8MAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8CMAAAADgBDCGDDkAARwDDDBjhwwAAA +AAAAAAAAAAAAAAAAAH4DBjhwwMOPHDDDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAQAAAAA4AQwBAwwAAIOAwwgYwMMAAAAAAAAAAAAAAAAAAAAAfggYwMMDDBgwwwwwAAAAADwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwRQAAAAOAEPA/8MAACDgMMf+MDDAAAAAAAAAAAAAAAAAAAAAB8f+MDGAwwYMAMMMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IkAAAADgBB8MAD +AAB/8DDGADAwwAAAAAAAAAAAAAAAAAAAAAHmADAxgMMGDAfDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAjAAAAA4AQHjAAwAAQHAYhgAwMMAAAAAAAAAAAAAAAAAAAAAA5gAwMYDDBgwcwwwAAAAADwAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwEAAAAAOAMAcwAMAAIA4DwYAMDDAAAAAAAAAAAAAAAAAAAABAOYAMDGAwwYMMMMMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +A8EUAAAABwCCDOAjAACAOBAHATAwwAAAAAAAAAAAAAAAAAAAAYDnATAxwMMGDGDDDAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPCJAAAAAcBggxwQwABABwwA4IwMMAAAAAAAAAAAAAAAAAAAAGAw4IwMMHD +BgxgwwwAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwIwAAAADxwMIf4MAAQAcP+P8MDDIAAAAAAAAAAAAAAAAAAAA4cP8MDD+8wYMc/MMAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAA8BAAAAAAPwC8B4PwAfAfx/w8Pz4cAAAAAAAAAAAAAAAAAAAAL8A8Pz4PI/fvj5v/wAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhFAAAAAAAAAAAAAAAAAAwMAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAGAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAABwwAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAHiJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAHhFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAB/gA/wAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAH4ADwAA +AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAA/AAYAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAH4AGAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAA +AAAAAAAAAB/ABgAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAfwAYAAAAQAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAB4EAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAG+AGAAAAEAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAeEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAeAAAAAAAAAAAAAAAAABnwBgAAADAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAHiJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAY+AYAAABwAAAAAAAAAADgAAAAAAAAAAAA +AAAAAAAAAAAB4IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGHwGAD4A8AAAAAB+ABjg4AAAAAAAAAAAAAAAAAAAAAAAAeBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABh8BgDjg/9+P4fhx4H58OH8AAAAAAAAAAAAAAAAAAAAAAHhFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAYPgYBgcBwPB4Bw4HA +OnDgcAAAAAAAAAAAAAAAAAAAAAAB4iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGB8GAYDAcBwOAYcB4Dxg4MAAAAAAAAAAAAAAAAAAAAAAAeCMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABgPhgMA4HAeDwEHAOA8AOGAAAAAAAAAAAAAAAAAAAAAAAHgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAY +B8YDAOBwDgcDDgDwOADjAAAAAAAAAAAAAAAAAAAAAAAB4RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAGAfGB//gcA4HAg4AcDgA5gAAAAAAAAAAAAAAAAAAAAAAAeIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAABgD5gcAAHAPD4YOAHA4AOwAAAAAAAAAAAAAAAAAAAAAAAHgjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAA +AAAAAAAAAAAAAAAYAfYHAABwBwuEDgBwOAD8AAAAAAAAAAAAAAAAAAAAAAAD4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAD+BwAAcAcbjA4AcDgA/gAAAAAAAAAAAAAAAAAAAAAA +A8EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAABgAfgcAAHAHk8gOAHA4AO8AAAAAAAAAAAAAAAAAAAAAAAPCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAADwAAAAAAAAAAAAAAAAAYAH4HAABwA7HYDgBwOADngAAAAAAAAAAAAAAAAAAAAAADwIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAA+B4AgcAOh0A8AcDgA48AAAAAA +AAAAAAAAAAAAAAAAA8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAABgAHgOAIHAD4fAHAOA4AOHgAAAAAAAAAAAAAAAAAAAAAAPBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAYAA4DwEBwgcDgB4DgOADg8AAAAAAAAAAAAAAAAAAAAAADwiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAGAAGAfHAeIHA +4AOBwDgA4HgAAAAAAAAAAAAAAAAAAAAAA8CMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAADwABgD/gD8BgMAB44B8AfA8AAAAAAAAAAAAAAAAAAAAAAPAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAD/AAIAPgAeAIBAAH4B/wf8/wAAAAAAAAAAAAAAAAAAAAADwRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8IkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAeCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAeBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4CMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4CJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAeAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4BFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAeAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgCMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +eAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA+ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAA8ACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAB4ABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAADwAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAPgAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAeAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAIkAAAAAAAAA//////////////////8AAAAAAAAAP//////////////////AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAjAAAAAAA +AAf//////////////////gAAAAAAAAH//////////////////4AAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAEAAAAAAAAAH//////////////////4AAAAAAAAB//////////////////+AAAAAAAAA +AAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAEUAAAAAAAAB//////////////////+AAAAAAAAAf//////////////////gAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AADwAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA +AAAAAAeAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAHgAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAA +AAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAARQAAAAAAAAHgAAAAAAA +AAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAH4AAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAEAA +AAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAA +AAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAB8AAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAA +AAAAAAAAAAAHgAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAD4AAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe +AAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAB8AAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAIkAAAAAAAAB4AA +AAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAA +AAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAA +AAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAA +B4AAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAB+AAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHg +AAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAQAAAAAAAAAeAAAAAAAAAAAAA +AAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAH4AAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAjAAAAAAA +AAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAA +AAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/ +AAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA +AAAAAAeAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAHgAAAAAeAAAAAAAAAAAAAAAAAHgAADwAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAD8AAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAH8AAAAAHgAAAAAAAAAAAAAAAAB4AAD+AAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AP/AA +AAAB4AAAAAAAAAAAAAAAAAeAAH/gAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAP/wAAAAAeAAAAAAAAAAAAAAAAAHgAH/4AAAAAAAAAAAAAAfAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgf/4AAAAAHgAAAAAAAAAAAAAAAAB4AP/8AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAARQAAAAAAAAHgAAAAAAA +AAAAAAAAAB4f/4AAAAAB4AAAAAAAAAAAAAAAAAeAP/8AAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAe//4AAAAAAeAAAAAAAAAAAAAAAAAHgf/8AAAAAAAAAAAAAAAH +4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAH//wAAAAAAHgAAAAAAAAAAAAAAAAB4f/4AAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAEAA +AAAAAAAHgAAAAAAAAAAAAAAAAB//////////4AAAAAAAAAAAAAAAAAf////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAf/////////+AAAAAAAAAAAAAAAAAH//// +////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAH//////////gAAAAAAAAAAAAAAAAB/////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD8AAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB//////////4AAAAAAAAAAAAAAAAAf///////////////////9+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAf/8AAAAAAAeAAAAAA +AAAAAAAAAAAHn/+AAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAH//wAAAAAAHgAAAAAAAAAAAAAAAAB4f/4AAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAfgAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB7//gAAAAAB4AAAAAAAAAAAAAAAAAeB//wAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe +H/+AAAAAAeAAAAAAAAAAAAAAAAAHgD//AAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgf/4AAAAAHgAAAAAAAAAAAAAAAAB4AP/8AAAAAAAAAAAAAAAAPwAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4A//AAAAAB4AAAAAAAAAAAAAAAAAeAAf/gAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAIkAAAAAAAAB4AA +AAAAAAAAAAAAAAAeAD/wAAAAAeAAAAAAAAAAAAAAAAAHgAB/4AAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAH8AAAAAHgAAAAAAAAAAAAAAAAB4AAD+AAAAAAAAAA +AAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAeAAAAAB4AAAAAAAAAAAAAAAAAeAAAPAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAA +AAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAA +B4AAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAB+AAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHg +AAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAA +AAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAARQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAB+A +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAjAAAAAAA +AAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAEAAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAA +AAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAA +AAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAA +AAAAAAeAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAD+AAAAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAA +AAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAARQAAAAAAAAHgAAAAAAA +AAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAAAAAAAAAAAAIkAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAA +AAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAjAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAA +AAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAEUAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAA +AAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAACJAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAA +AAAAAAAAAAAAAIwAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAABAAAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAeAAAAAA +AAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAABFAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAA +AAAAAAAAAAD/gAAAAAAAAAAAAAAAAiQAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAB4AAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAACMAAAAAAAAB4AAAAAAAAAAAAAAAAAe +AAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAQAAAAAAAAAeAAAAAAAAAAAAAAAAAHgAAAAAAAAHgAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAD/g +AAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAARQAAAAAAAAH//////////////////4AAAAAAAAB//////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAIkAAAAAAAAB/// +///////////////+AAAAAAAAAf//////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAjAAAAAAAAAf//////////////////gAAAAAAAAH//////////////////4AAAAAAAAAAAAAA +AAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAEAAAAAAAAAD//////////////////wAAAAAAAAA//////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAAAB/4A +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAA +AAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAH/4AAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAB//8AAAAAAAAAAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAAAAAAAAP//wAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///gAAAAAAH///gAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////AAAAP///+AA +AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4APAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAPADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////////+AAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAP///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAALgJwDwOg6B4B4A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAD+B8AAAAAAAAgAAAAAAAAAAAAAAAAAAAC8CcDGEYRgjAj4xgAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAOAEAAAAAAAAIAAAAAAABAAAAAAAAAAAAnBHBgzCMIYYYYYMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA +AAAAAADgBAAAAAAAAHAAAAAAAAQAAAAAAAAAAAJ4RwQMwDAGGGGEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAA4AQAAAAAAABwAAAAAAAMAAAAAAAAAAACOIcP/PA8ABhhj/wAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAOAEAAAAAAAAuAAAAAAAHAAAAAAAAAAAAjyHDAB8HwD4YYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAIwAAAAAAADgBA6A8BMAALgA8AeBPD+AAAAAAAAAAAIdBwwAHgeDmDEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAA4AQRgxj3gAEcAR8Yz34MAAAAAAAAAAACHwcM +AAcBxhgeDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAOAEMIYMOQABHAMMMGOHDAAAAAAAAAAAAg4HDgKDIMwYIA4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAADgBDAEDDAAAg4DDCBjAwwAAAAAAAAAAAIOBwcEgyDMGGAHBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAA4AQ8D/wwAAIOAwx/4wMM +AAAAAAAAAAACBAcH+MIwjn5/x/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAOAEHwwAMAAH/wMMYAMDDAAAAAAAAAAAD4QfweC8LwfMP+HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAADgBAeMADAABAcBiGADAwwAAAAAAAAAAAAAAAAAAAAAAGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAA4AwB +zAAwAAgDgPBgAwMMAAAAAAAAAAAAAAAAAAAAAADAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAHAIIM4CMAAIA4EAcBMDDAAAAAAAAAAAAAAAAAAAAAAAwEAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABwGCDHBDAAEAHDADgjAwwAAAAAAAAAAAAAAAAAAAAAAOGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAEUAAAAAAAAPHAwh/gwABABw/4/wwMMgAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAA/ALwHg/AB8B/H/Dw/PhwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAABgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAYCAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAHDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAABDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAfwPgAAAAAAADwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAgAAAAAAAAMAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIAAAAAAAADABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACAAAAAAAAAwAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAgAAAAAAAAMAcHAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIE8AAB0EcDBP7+B4CYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACPfgAAjPfwzwwMBjHvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAg4cAAYQ4MM +MMDAwYcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIMDAAGAMDjDDAwIGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHACDAwAB4DAYwwwMH/hgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAABwAgwMf+PgwGMMMDBgAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAIMDH/g8MBjDDAwYAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAGDAwAADjAYwwwMGABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAA4BAwMAAQYwMMMMDBwEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAwMDAAEGMDDDDAwOCGAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB44DAwABhDhgwwyMj/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4D8+AAXg3g//HBwPB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAACJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACM +--mail.sleepy.sau.158.532-- + +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: PostScript demo + +Received: from hanna.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA19503; Mon, 7 Oct 91 09:15:36 -0700 +Received: from thumper.bellcore.com by hanna.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA28214; Mon, 7 Oct 91 09:14:12 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id for mrc at cac.washington.edu; Mon, 7 Oct 91 12:13:58 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id for mrc at cac.washington.edu; Mon, 7 Oct 91 12:13:55 EDT +Date: Mon, 7 Oct 91 12:13:55 EDT +From: nsb at thumper.bellcore.com (Nathaniel Borenstein) +Message-Id: <9110071613.AA10867 at greenbush.bellcore.com> +To: mrc at cac.washington.edu +Subject: An image that went gif->ppm->ps +MIME-Version: 1.0 +Content-Type: application/postscript +Content-Description: Captain Picard + +%!PS-Adobe-2.0 EPSF-2.) +%%Creator: ppmtops +%%Title: noname.ps +%%Pages: 1 +%%BoundingBox: 147 304 454 496 +%%EndComments +%%EndProlog +%%Page 1 1 +/picstr 384 string def +gsave +147 304 translate +1 1 scale +307 192 scale +320 200 8 +[ 320 0 0 -200 0 200 ] +{ currentfile picstr readhexstring pop } +false 3 +colorimage +9148489148486d4848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d4848914848914848914848914848914848 +9148486d48486d48486d48486d48486d48489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d48486d48486d48486d48486d4848914848916d6d916d6d916d6d914848 +9148486d48486d48486d48486d48486d48486d24246d48486d48486d2424 +6d48486d48486d48486d48486d24246d48486d24246d24246d24246d4848 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d2424916d6db69191da9191dab6b6dab6b6da9191b69191914848 +6d48484824246d24244824246d24246d24246d24246d24246d24246d2424 +4824246d24244824244824244824246d24246d2424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +6d24246d24246d24244824244824244824246d24246d2424482424482424 +6d24244824246d24244824246d24246d24246d2424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824244824246d2424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48489148486d48486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d4848914848914848916d6d914848 +9148489148486d48486d48486d48486d24246d48486d48486d48486d2424 +6d24246d48486d48486d48486d48486d48486d48486d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d24246d24246d2424 +6d24246d2424914848b66d6db69191dab6b6da9191b69191b66d6d914848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824244824244824244824246d24246d24246d2424482424 +4824244824244824244824244824244824246d24246d24246d2424482424 +4824244824246d24246d24244824246d2424482424482424482424482424 +4824244824246d24246d24244824246d24246d24244824246d2424482424 +6d24246d24244824246d24246d24244824246d24244824244824246d2424 +4824244824244824246d24246d24244824244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +9148489148489148489148489148489148489148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d4848914848 +9148489148486d48486d48486d48486d48486d48486d24246d24246d4848 +6d24246d48486d48486d48486d24246d48486d24246d48486d24246d4848 +6d48486d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d48489148489148489148486d48486d2424 +6d48486d48486d24246d24246d24246d48486d48486d48486d24246d2424 +6d24244824246d2424914848916d6db66d6db66d6db66d6d9148486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d24246d24244824246d2424482424 +4824246d24244824244824244824246d24246d24246d24246d2424482424 +4824246d24244824244824246d24246d24246d24244824244824246d2424 +6d24244824246d24244824244824244824244824244824244824246d2424 +6d24246d24244824246d24244824246d24246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +4824244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +9148489148489148489148489148489148489148489148486d48486d4848 +9148489148489148489148489148489148486d48486d4848914848914848 +9148486d48489148489148486d48489148489148489148489148486d4848 +9148489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d24246d4848 +6d48486d48486d24246d24246d24246d24246d24246d24246d48486d2424 +6d24246d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d24246d24246d24246d48486d24246d24246d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d4848914848 +916d6d916d6d916d6d914848916d6db69191b69191b69191b66d6db66d6d +b66d6d9148489148486d48486d48486d48486d48486d48486d24246d4848 +6d48486d24246d24246d24246d48489148489148486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824244824246d24246d2424482424 +4824244824246d24244824244824244824246d2424482424482424482424 +4824246d24246d24244824244824244824246d2424482424482424482424 +6d24244824246d24244824246d24244824246d24244824246d24246d2424 +6d24246d24246d24244824246d24244824244824246d2424482424482424 +6d24246d24244824246d24244824244824246d24246d2424482424482424 +6d24244824244824244824244824246d24246d24244824246d2424482424 +6d24244824244824246d24246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d48486d48486d24246d24246d24246d48486d4848 +6d48486d48486d48486d48486d48486d24246d24246d24246d24246d2424 +6d48486d24246d24246d48486d48486d48486d24246d24246d48486d4848 +6d48486d24246d24246d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d24246d48486d24246d24246d24246d48486d4848 +6d48486d48486d48486d48486d4848914848916d6d916d6d916d6d916d6d +b66d6db66d6d914848916d6d916d6db66d6db69191b66d6db66d6db69191 +b69191b66d6d916d6d916d6d916d6d9148489148486d24246d48486d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24244824244824244824244824244824244824246d24244824246d2424 +6d24244824246d24246d24244824246d24244824246d24246d24246d2424 +4824246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24244824244824244824246d24246d24246d24244824246d2424 +4824244824244824244824244824244824244824246d24246d2424482424 +4824244824244824244824244824244824244824244824246d2424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48486d48489148486d4848914848914848914848914848914848 +9148489148489148486d48489148486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d24246d2424 +6d24246d24246d24246d24246d48486d24246d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d24246d48486d48486d48486d48486d48486d2424 +914848914848914848914848916d6db66d6dda9191b69191b66d6db66d6d +9148489148486d24246d24246d24246d24246d24246d24246d24246d4848 +6d4848914848914848b66d6db69191b69191b66d6d916d6d914848914848 +6d48489148486d48489148486d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824244824246d24244824246d24246d24246d24246d2424 +6d24244824246d24244824244824246d24244824244824244824246d2424 +6d24246d24246d24244824244824246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d2424482424482424 +4824244824246d24246d24244824246d24244824246d24246d2424482424 +6d24244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d2424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +916d6d914848914848914848914848914848914848914848914848914848 +6d4848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148486d48489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d48486d48486d48486d24246d48486d48486d48486d24246d48486d2424 +6d24246d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d24246d4848 +6d24246d48486d24246d48486d48486d24246d24246d24246d48486d4848 +916d6db66d6db69191b66d6d914848916d6d916d6d6d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d48486d4848914848916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6d916d6d6d48486d48486d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824244824244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24244824246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24244824246d2424482424482424482424482424482424 +6d24244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824244824244824246d2424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +916d6d914848916d6d914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148489148486d4848914848914848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d24246d4848 +6d48486d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d2424914848914848916d6d +b66d6dda9191b66d6d916d6d6d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d4848914848914848916d6d916d6d916d6d916d6d +b69191b69191da9191da9191da9191b69191b66d6d9148489148486d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24244824246d24246d24244824244824246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24244824244824244824246d24244824246d24246d24246d2424 +6d24244824246d24246d24244824244824246d24244824244824246d2424 +4824244824244824244824244824246d2424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d4848914848914848b66d6d916d6d916d6d +6d48486d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d4848914848914848914848914848916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6db69191b69191da9191b66d6d916d6db66d6d +9148489148486d48486d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +4824246d24246d24244824244824244824246d24246d24246d48486d4848 +6d24246d24246d24244824244824244824244824244824246d24246d2424 +4824244824244824244824244824244824246d24244824244824246d2424 +4824244824244824244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +b66d6d914848916d6d916d6d914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48489148486d48486d48489148486d48486d48486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +9148489148486d4848914848916d6d916d6db66d6d916d6d9148486d4848 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d4848914848914848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db69191da9191 +dab6b6dab6b6b69191916d6d9148486d24246d48486d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24244824246d24246d24244824244824246d2424482424 +4824244824244824244824244824244824244824244824244824246d2424 +4824244824244824246d24244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +b69191914848916d6d916d6d916d6d914848916d6d914848914848914848 +914848914848914848914848914848914848914848914848916d6d916d6d +916d6d916d6d914848914848916d6d916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48489148489148489148489148489148486d4848914848914848914848 +6d48486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148489148489148486d4848 +6d4848914848916d6d916d6db66d6d9148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48489148486d4848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b69191dab6b6da9191b69191b691919148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d2424482424482424482424 +4824244824246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24244824244824244824246d24244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +da9191916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48489148486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d4848914848914848914848914848914848 +916d6db66d6db69191b66d6d9148486d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148486d48486d4848 +6d4848914848914848914848914848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db69191dab6b6da9191b69191b66d6d9148486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d2424482424482424 +6d24244824244824244824246d24244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824246d24244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +da9191916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848916d6d914848914848914848916d6d916d6d +916d6d916d6d914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848916d6d916d6d916d6d914848 +914848916d6d914848914848916d6d916d6d916d6d914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48486d48489148486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d4848914848914848914848914848914848916d6db66d6d +b69191da91919148486d48484824244824244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d48486d48486d48489148489148489148486d4848914848 +914848914848916d6d914848916d6d916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6dda9191dab6b6b69191916d6d +6d24246d48484824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824246d24246d24246d24246d2424 +6d24246d24246d24244824246d24244824246d24244824246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824246d24244824244824244824244824244824246d24246d2424 +4824244824244824244824246d24244824246d2424482424482424482424 +6d24244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffb6b6916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848914848916d6d916d6d914848 +914848916d6d916d6d914848916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d914848914848914848914848916d6d916d6d916d6d +916d6d916d6d914848914848914848916d6d916d6d916d6d916d6d914848 +9148489148489148489148489148489148489148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48486d48486d48486d48486d48489148486d4848914848914848 +6d48486d48486d48489148486d48486d48486d48486d4848914848914848 +914848914848914848914848914848914848914848b66d6db69191b69191 +b691919148486d24244824244824244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d48486d4848 +6d24246d48486d48486d48489148486d4848914848914848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +b66d6d916d6d916d6d916d6db66d6d916d6d916d6db66d6d916d6db66d6d +916d6d916d6db66d6db66d6db66d6d916d6db66d6db69191dab6b6dab6b6 +b69191916d6d916d6d6d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24244824246d24244824246d24246d24246d24246d24246d2424 +4824246d24246d24246d24244824246d2424482424482424482424482424 +6d24244824244824244824246d24246d2424482424482424482424482424 +4824244824246d24246d24246d48486d48486d48486d2424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824246d2424482424482424482424482424 +6d24244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffdadab66d6db66d6db66d6d916d6d916d6d916d6d916d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848914848916d6d916d6d914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48486d48489148489148486d4848914848 +9148486d48486d48489148489148489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +9148486d48489148486d4848914848914848916d6db69191da9191b66d6d +6d48486d24244824246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d4848914848914848914848914848916d6d916d6d916d6d +914848914848916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6db66d6d +916d6d916d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6db69191 +dab6b6dab6b6b69191b66d6d6d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48489148486d4848 +6d48486d24246d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24244824244824246d2424 +6d24244824244824246d24244824244824246d24246d2424482424482424 +6d24244824244824244824244824244824244824246d24246d2424482424 +4824244824244824244824246d24244824244824244824246d24246d2424 +4824246d24246d4848914848916d6d916d6d9148486d48486d24246d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdab66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d916d6d916d6d914848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48486d48489148486d48486d4848914848 +9148489148486d48489148489148486d48486d48486d4848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d4848914848916d6db66d6db691919148486d4848 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d4848914848914848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6d916d6db66d6d916d6d916d6db66d6db66d6d +da9191dab6b6ffb6b6dab6b6b66d6d916d6d6d48486d48486d24246d2424 +6d24246d24246d24246d24244824246d24246d4848916d6d916d6d916d6d +9148486d24244824246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24244824244824246d2424482424 +4824246d24244824246d24246d24244824244824244824246d24246d2424 +6d24244824246d24244824246d24244824246d24246d2424482424482424 +4824246d2424914848914848914848916d6d916d6d9148486d2424482424 +4824244824244824244824244824244824244824244824244824246d2424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824244824246d24244824246d24246d2424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +ffffdab66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d +b66d6db66d6db66d6d916d6d916d6db66d6db66d6d916d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48489148489148486d4848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d4848914848914848b66d6db66d6d916d6d6d48486d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d48486d48486d24246d24246d24246d48486d48486d4848 +6d48486d4848914848914848916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6d916d6d916d6db66d6d916d6d +b66d6d916d6d916d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +b66d6db66d6db69191da9191dab6b6ffb6b6916d6d916d6d6d48486d2424 +6d24244824244824244824246d24246d2424914848914848914848914848 +9148486d48486d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d2424482424482424482424 +6d24246d24246d24246d24246d24246d24246d24244824246d2424482424 +4824244824246d24246d24246d2424482424482424482424482424482424 +6d24244824246d24246d24244824246d2424482424482424482424482424 +4824246d24246d48489148489148489148489148486d48486d2424482424 +4824244824244824244824246d24244824244824244824244824246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824246d2424482424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdab66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +b66d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +916d6d916d6d914848916d6d916d6d916d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6d914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848b66d6db69191b69191916d6d6d48486d48486d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d4848914848914848914848916d6d916d6d916d6db66d6d916d6d +916d6d916d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6ddab6b6ffb6b6da9191da9191916d6d914848 +6d24246d24244824246d24244824246d24246d4848914848914848914848 +9148486d48484824244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24244824246d24246d24246d2424 +6d24246d24246d2424482424482424482424482424482424482424482424 +4824246d24246d48489148489148489148489148486d48486d2424482424 +4824244824244824244824246d24244824246d2424482424482424482424 +4824244824246d24244824244824244824246d24244824244824246d2424 +4824244824244824244824244824244824246d2424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824244824246d2424482424482424482424482424482424482424 +ffffdab69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6d916d6db66d6d916d6d +b66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848916d6d914848914848914848914848914848914848 +6d4848916d6db69191b69191916d6d6d48486d24246d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d48486d48486d24246d24246d48486d48486d2424 +6d4848914848914848914848914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6d916d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6d916d6db66d6db66d6d916d6db66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6d916d6d916d6d916d6dda9191dab6b6dab6b6dab6b6916d6d +6d48486d24244824246d24244824246d24246d24249148489148486d4848 +6d48486d24246d24246d24244824244824244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d24246d24246d2424482424482424 +4824244824246d24244824244824244824244824246d24244824246d2424 +4824246d24246d24246d24246d24244824246d24244824246d2424482424 +6d24246d24246d24246d24246d24246d48486d24246d2424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +4824244824244824244824246d24246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824246d2424482424482424482424482424 +ffffdada9191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b69191b66d6db66d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6d916d6d916d6d914848914848914848916d6d916d6db66d6d +916d6db66d6db69191916d6d6d48486d24246d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d4848914848914848914848916d6d916d6d916d6d916d6d916d6db66d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b66d6db66d6d916d6d916d6d916d6db69191ffb6b6ffdadadab6b6 +b66d6d9148486d48489148489148486d48486d24246d4848916d6d6d2424 +4824246d24244824244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24244824246d24246d24246d24246d24246d2424482424482424 +6d24244824246d24244824244824244824244824244824244824246d2424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24244824244824244824244824246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d2424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdada9191da9191da9191da9191b69191b69191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848914848914848914848914848916d6d916d6d916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6db66d6db66d6d916d6d914848914848914848b69191b69191da9191 +b69191b69191916d6d6d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d4848914848914848916d6d916d6d916d6d916d6d916d6db66d6d +916d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db66d6db66d6d916d6d916d6d914848b69191dab6b6ffb6b6 +ffdadada9191b66d6db66d6db69191b66d6d916d6d916d6d6d4848482424 +4824244800006d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824244824244824244824246d24246d24246d24246d24246d2424 +4824244824244824246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24244824244824246d24246d2424 +4824246d2424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24244824244824246d2424482424 +4824244824244824244824246d24244824246d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +ffffdada9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6d916d6d916d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +916d6d914848916d6d914848914848914848914848914848914848914848 +916d6db69191b66d6db66d6d916d6d916d6db69191dab6b6dab6b6ffb6b6 +ffb6b69148489148486d24249148486d24246d48486d48486d48486d4848 +6d48486d48486d48486d24246d24246d48486d48486d48486d48486d2424 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6db69191b69191 +ffb6b6ffdadada9191b66d6db69191da9191da9191b66d6d482424482424 +4824246d24244824246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24244824244824246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24244824246d2424482424482424 +4824246d24244824244824246d24246d24246d24246d24246d2424482424 +4824244824244824246d24244824246d24246d24246d2424482424482424 +4824244824246d24244824246d24246d24246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824244824244824244824244824246d2424 +ffffdadab6b6dab6b6dab6b6dab6b6da9191b69191b69191b69191da9191 +da9191b69191b69191da9191b69191da9191da9191b69191b69191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b69191b69191b66d6db66d6db69191b66d6db69191 +b69191b66d6db66d6db66d6db69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848916d6d916d6db66d6d916d6d +914848916d6d914848916d6d914848914848914848916d6d914848914848 +914848914848916d6db66d6d916d6d916d6db69191ffb6b6dab6b6dab6b6 +b66d6d6d48484824246d48486d24249148486d24246d48486d48486d4848 +6d24246d48486d24246d48486d24246d24246d48486d24246d48486d4848 +6d48486d48486d48486d24246d24246d24246d48486d48486d4848914848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db66d6d916d6db66d6d916d6d914848914848 +da9191ffb6b6ffb6b6dab6b6dab6b6dab6b6b66d6d916d6d482424482424 +4824244824244824246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48489148486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24244824246d24244824246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d2424482424 +4824246d24244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24249148489148489148484824244824246d2424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdadab6b6dab6b6dab6b6dab6b6da9191da9191b69191b69191da9191 +da9191da9191b69191b69191b69191da9191da9191da9191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b66d6db66d6db69191 +b69191b66d6db69191b69191b69191b69191b69191b66d6db66d6db69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d +b66d6d916d6d916d6d916d6d914848914848916d6db66d6db66d6d916d6d +916d6d914848914848914848914848916d6d916d6d916d6d916d6d916d6d +914848914848916d6d914848916d6db69191da9191dab6b6dab6b6b69191 +6d48486d24246d48486d48486d48486d24246d48486d48486d48486d2424 +6d48486d48486d48486d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d24246d48486d48486d48486d48486d48486d4848914848 +914848914848914848916d6d916d6d916d6d916d6db66d6db66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db66d6ddab6b6ffb6b6ffdadaffb6b6ffb6b6da9191916d6d482424 +6d24244824246d24244824246d24244824246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48489148486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824244824246d2424 +4824246d24246d24246d24246d24246d24246d24244824244824246d2424 +6d24244824246d24244824244824244824244824244824246d2424482424 +6d24246d4848914848916d6d916d6d916d6d6d48486d48484824246d2424 +4824246d24244824244824244824244824244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +ffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191dab6b6dab6b6b69191da9191 +b69191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db69191b69191b69191b66d6d +916d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +b66d6db66d6d916d6d916d6d916d6d916d6d914848916d6db66d6d916d6d +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6db69191dab6b6ffb6b6b691916d4848 +6d24246d24249148486d24246d48486d48486d48486d48486d24246d2424 +6d48486d48486d48486d24246d24246d24246d24246d24246d48486d4848 +6d24246d24246d24246d24246d48486d48486d48486d48486d4848914848 +914848916d6d914848914848916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d +914848914848916d6db69191ffb6b6ffdadaffdadaffdadadab6b6914848 +4824244800004824244824244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824244824244824246d24246d2424482424482424482424482424 +4824246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24244824244824244824246d24244824246d2424482424482424 +6d24246d48489148489148489148489148489148486d48486d2424482424 +4824244824244824244824246d2424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +ffffdaffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191dab6b6dab6b6dab6b6dab6b6da9191da9191b69191b69191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191 +b69191b69191b69191b69191b66d6db66d6db69191b66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d914848916d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848916d6d914848914848914848 +916d6d914848916d6db66d6db69191da9191ffb6b6da91916d4848914848 +4824249148486d24246d48486d24246d48486d48486d48486d24246d2424 +6d24246d48486d24246d24246d48486d48486d48486d48486d48486d4848 +6d48486d24246d48486d24246d48486d48486d4848914848914848914848 +914848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b66d6db69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6d916d6db66d6db66d6d +916d6d914848914848916d6ddab6b6dab6b6ffdadaffdadaffb6b6b69191 +6d48486d24244824246d24244824246d24244824246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824244824246d24246d24246d4848916d6d916d6d916d6d9148486d2424 +6d24244824246d24244824246d24244824244824244824246d2424482424 +6d24246d24246d48489148489148489148489148486d4848482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdaffdadaffdadaffb6b6ffb6b6ffdadaffb6b6ffb6b6ffb6b6dab6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191dab6b6da9191da9191b69191b69191b69191b69191da9191b69191 +da9191da9191b69191b69191b69191b69191b69191b69191b66d6db69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848916d6d914848914848914848914848b66d6d +b69191b66d6db69191b69191dab6b6dab6b6dab6b6916d6d4824246d2424 +6d24246d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d48486d48486d48486d4848914848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +da9191da9191b69191b66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6d916d6d914848914848b66d6db69191dab6b6ffb6b6ffdadadab6b6 +b69191b66d6d9148486d24244824244824244824244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24244824246d24244824246d24244824246d2424482424482424 +6d24244824244824246d24244824246d2424482424482424482424482424 +4824244824246d2424914848b66d6dda9191b69191b69191b66d6d914848 +6d2424482424482424482424482424482424482424482424482424482424 +4824246d24246d48489148489148489148489148486d2424482424482424 +4824244824244824244824246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +ffffdaffffdaffdadaffdadaffdadaffffdaffdadaffb6b6ffb6b6ffb6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191da9191 +dab6b6dab6b6da9191da9191b69191b66d6db69191b69191b69191b69191 +da9191b69191da9191b69191da9191da9191da9191da9191b69191b66d6d +b69191b69191b69191b66d6db69191b69191b69191b66d6db69191b66d6d +b66d6d916d6db66d6db66d6d916d6db66d6db69191b66d6d916d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848916d6d916d6d916d6d914848914848914848914848914848916d6d +b66d6db69191dab6b6b69191ffb6b6da9191916d6d6d48486d48486d2424 +6d48486d48486d48486d48486d48486d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d48486d48486d48486d48486d4848914848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db69191b69191b66d6db69191b66d6db69191b66d6db69191b69191 +da9191da9191da9191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d914848914848b69191da9191ffb6b6ffb6b6 +dab6b6dab6b6da9191916d6d6d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24244824246d24244824246d2424 +6d24246d24246d24246d24244824246d24244824244824246d2424482424 +4824244824246d4848916d6db69191da9191dab6b6da9191b69191914848 +6d24244824244824246d24244824244824246d24244824244824246d2424 +4824244824244824244824244824246d24246d2424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +4824244824246d24246d24244824244824244824244824244824246d2424 +ffdadaffffdaffffdaffdadaffffdaffffdaffdadaffb6b6ffb6b6ffdada +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191b69191b69191 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +914848916d6d916d6d916d6d916d6d914848914848914848914848914848 +916d6db66d6dda9191dab6b6da9191b66d6d6d24246d24246d24246d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d48486d24246d4848 +6d24246d24246d48486d48486d4848914848914848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6d916d6db66d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6dda9191da9191 +da9191b69191b66d6d9148486d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d24244824246d24246d2424482424 +4824244824246d4848b66d6dda9191da9191da9191da9191b66d6d914848 +6d24244824244824244824244824246d2424482424482424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +4824246d24244824244824244824246d2424482424482424482424482424 +6d24244824244824244824246d48486d48486d48486d2424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6da9191da9191 +da9191da9191dab6b6da9191b69191b69191da9191da9191da9191da9191 +da9191da9191da9191b69191b69191da9191da9191da9191da9191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db66d6d916d6db66d6d916d6d916d6d +b66d6db66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d914848914848b66d6d +b69191da9191dab6b6dab6b6b66d6d9148486d48486d48486d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d24246d4848 +6d24246d48486d48486d4848914848914848914848914848916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191b66d6db66d6db69191b66d6db69191b66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b66d6db66d6db69191b69191b69191 +b69191b69191da9191b69191b69191b69191b66d6db66d6db66d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848914848b66d6ddab6b6 +ffb6b6da9191b691919148489148484824249148484824246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824244824244824246d2424482424 +4824244824246d2424914848b66d6db69191b69191b69191b66d6d6d4848 +6d24244824244824244824246d24244824246d2424482424482424482424 +6d24244824244824246d24246d24246d24246d24244824244824246d2424 +6d24244824246d24244824244824244824246d2424482424482424482424 +4824246d24246d24246d4848916d6d916d6d916d6d9148486d2424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6 +ffb6b6ffdadaffdadaffdadaffdadaffdadadab6b6ffb6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191da9191b69191da9191da9191b69191b69191da9191 +b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191b69191 +b66d6db66d6db66d6db69191b66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848916d6d914848914848b66d6d +dab6b6dab6b6ffdadab691919148484824249148486d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d4848914848914848914848914848916d6d914848916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b66d6db69191b66d6db66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6d916d6d914848914848914848914848 +ffb6b6ffb6b6ffdadada9191916d6d6d24246d24244824246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24244824246d24246d24246d2424482424482424482424482424482424 +4824244824244824246d24246d4848916d6d916d6d9148486d48486d2424 +6d24246d24244824246d24244824246d24244824246d2424482424482424 +4824246d24246d24244824246d24246d2424482424482424482424482424 +6d24244824246d24244824244824246d24246d24244824246d2424482424 +6d24246d48486d4848914848914848914848916d6d9148486d24246d2424 +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffdadaffdada +ffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191dab6b6da9191 +b69191b69191da9191da9191b69191b69191da9191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b66d6db69191b69191b69191b69191 +b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848916d6d916d6db69191da9191 +ffb6b6ffb6b6dab6b69148486d48486d48486d24249148486d2424914848 +6d48486d48486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d48486d4848914848914848914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191da9191da9191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6d916d6d916d6db66d6d916d6d916d6d916d6d914848914848 +b69191da9191ffdadaffb6b6b691916d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824244824244824244824244824246d24246d24244824246d2424482424 +4824244824244824246d24246d24244824246d24246d24246d2424482424 +6d24246d24244824244824244824246d24244824244824246d2424482424 +6d24246d24246d24244824244824244824244824246d2424482424482424 +4824246d4848914848914848914848916d6d9148489148486d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffdadaffdadaffdadaffb6b6ffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6da9191dab6b6da9191dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6d916d6d916d6db66d6db69191b66d6d916d6d916d6db66d6d916d6d +916d6d914848916d6d916d6d916d6d914848914848916d6d916d6d916d6d +916d6d916d6d914848916d6d914848914848916d6dda9191dab6b6ffb6b6 +dab6b6ffb6b6da91919148486d24246d48486d48489148489148486d4848 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d4848914848914848914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191da9191b69191b69191b69191 +b69191da9191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6db66d6dffb6b6ffb6b6916d6d4824244824244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24244824246d24246d24244824244824246d2424 +4824246d24244824244824244824244824244824246d2424482424482424 +4824246d24244824244824246d24246d24246d24244824244824246d2424 +4824246d24244824246d24244824246d24246d24244824246d2424482424 +6d24246d2424482424482424482424482424482424482424482424482424 +4824246d24249148489148489148489148489148486d48486d2424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffffffffdaffffdaffdada +ffdadaffdadaffdadaffb6b6ffdadaffdadaffdadaffdadaffb6b6ffb6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191da9191 +dab6b6da9191da9191da9191b69191b69191da9191b69191b69191da9191 +da9191b69191b69191b66d6db69191b69191b69191b66d6db66d6db69191 +b66d6db66d6db66d6db66d6db69191b66d6d916d6db66d6d916d6db66d6d +916d6db66d6d916d6d916d6d914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848b69191da9191ffb6b6ffb6b6 +ffffdada9191da91919148489148486d48489148486d48489148486d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d48486d24246d24246d24246d4848 +914848914848914848914848914848914848916d6d916d6d916d6d916d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191b69191da9191b69191b69191da9191 +da9191da9191da9191b69191b69191b66d6db66d6db69191b66d6db66d6d +b66d6db66d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d +914848916d6ddab6b6ffdadada91919148486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24244824244824244824246d24246d24246d2424 +6d24246d24244824244824246d24244824246d24244824246d2424482424 +6d24244824244824246d24244824246d24246d24246d2424482424482424 +4824246d24244824244824246d24244824244824246d24246d24246d2424 +6d24244824246d24246d48486d48486d48486d24246d24246d2424482424 +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffdadaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191b69191da9191b69191b69191b69191b69191 +b69191da9191b69191b66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6d916d6d916d6d +916d6d916d6d916d6d914848914848914848914848da9191ffdadaffdada +ffb6b6da9191b66d6d9148486d48489148486d48486d48486d48486d4848 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d48486d48486d24246d48486d24246d48486d48486d4848 +914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191b69191b69191b69191b69191b69191 +da9191da9191da9191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6d916d6d916d6d +914848914848b69191dab6b6ffdadab691919148486d24246d2424482424 +4824244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24244824244824246d24246d24244824244824246d2424482424 +4824244824246d24244824244824246d24246d24244824246d2424482424 +4824244824246d24244824244824246d24244824244824244824246d2424 +6d24246d2424482424482424482424482424482424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffb6b6dab6b6ffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191da9191 +b69191da9191da9191da9191da9191da9191b69191b69191b69191da9191 +da9191b69191b69191b66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b66d6db66d6db69191b66d6db66d6d916d6db66d6db66d6d916d6d +b66d6d916d6d914848916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6d916d6d914848b66d6dffb6b6ffffdaffdada +da9191b66d6d9148486d48486d24246d48486d24246d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d24246d24246d24246d48486d48486d48486d48486d4848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191da9191b69191 +da9191b69191b69191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191da9191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6d914848b66d6dda9191ffb6b6ffdadadab6b69148486d2424482424 +6d48484824246d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824244824246d24246d2424482424 +4824246d24246d24246d24246d24244824244824246d24246d2424482424 +4824244824246d24246d24246d24246d24244824244824244824246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6ffdadaffb6b6dab6b6dab6b6da9191 +dab6b6da9191dab6b6da9191da9191b69191b69191b69191b69191b69191 +da9191b69191b69191b69191b66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848916d6d +916d6d916d6d916d6d916d6d916d6db66d6dda9191ffdadaffdadadab6b6 +da91919148489148486d24249148486d24246d48486d24246d48486d4848 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d48486d48486d24246d24246d24246d48486d24246d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b69191b66d6db69191b66d6db69191b69191 +b69191b69191b69191b69191da9191da9191da9191b69191b69191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +916d6d914848916d6db69191dab6b6ffdadaffdadab691919148486d2424 +4824244824246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d48486d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24244824244824244824246d24246d24246d24246d2424 +6d24244824246d24246d24244824244824244824244824246d2424482424 +4824246d24244824244824246d24244824246d2424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffdadaffb6b6ffb6b6 +ffb6b6ffb6b6dab6b6dab6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6da9191 +da9191dab6b6b69191da9191da9191da9191da9191b69191b69191da9191 +da9191b69191da9191b69191b66d6db66d6db66d6db69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db69191dab6b6ffb6b6ffdadaffdadada9191 +b66d6d916d6d6d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d24246d48486d48486d48486d4848914848914848 +916d6d914848916d6d916d6d916d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6dffb6b6ffb6b6ffdadaffb6b6b66d6d6d2424 +4824246d48484824246d48484824246d48484824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d48486d48486d48486d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24246d24244824246d2424 +4824246d24246d24246d24244824246d24244824244824246d24246d2424 +4824244824246d24246d24246d24246d24244824246d24244824246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffffffffdaffffdaffdadaffb6b6ffdadaffb6b6ffb6b6 +ffb6b6dab6b6ffb6b6dab6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +da9191da9191b69191da9191da9191da9191da9191b69191b69191da9191 +da9191b69191b69191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6d916d6db66d6dda9191ffdadaffdadaffdadadab6b6b66d6d +9148489148486d48486d48486d48486d48486d48486d48486d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d48486d48486d4848914848916d6d +b66d6db66d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db69191 +b69191b69191b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191da9191da9191da9191da9191 +da9191da9191b69191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db69191dab6b6ffb6b6ffb6b6dab6b6916d6d914848 +4824246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824246d24246d24246d24246d24246d24246d24246d2424482424482424 +4824244824244824246d24246d24244824244824244824244824246d2424 +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffffffffdaffffdaffffdaffdadaffb6b6ffdadaffb6b6 +ffb6b6dab6b6dab6b6dab6b6ffb6b6ffb6b6ffb6b6ffb6b6ffdadadab6b6 +da9191da9191da9191b69191da9191da9191da9191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db69191b69191b66d6db66d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6ddab6b6ffdadaffdadaffb6b6da9191916d6d +916d6d6d48489148489148489148486d48486d48486d24246d48486d2424 +6d48486d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d4848914848914848916d6d +916d6d916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191b69191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6dffb6b6ffdadaffdadada91919148486d2424 +9148486d24246d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d48486d24246d48486d2424 +6d24246d48486d48486d24246d48486d24246d24246d48486d24246d2424 +6d48486d24246d24246d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24244824244824246d2424 +6d24246d24246d24246d24246d24244824244824246d24246d24246d2424 +6d24244824244824246d24246d24246d2424482424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffb6b6 +ffb6b6dab6b6dab6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6dab6b6 +dab6b6da9191b69191da9191da9191b69191da9191da9191da9191da9191 +da9191b69191b69191b69191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +916d6d916d6d914848b66d6ddab6b6ffdadaffdadadab6b6b69191914848 +9148489148489148489148489148486d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d4848914848914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191da9191da9191da9191 +da9191da9191da9191b69191da9191da9191b69191b69191da9191b69191 +b69191b69191b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b66d6db66d6d916d6db66d6ddab6b6ffb6b6ffdadadab6b6b66d6d914848 +9148486d48489148486d24246d24246d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d48486d24246d4848 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d48486d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824244824246d24244824244824246d24244824246d24246d2424 +6d24244824246d24246d24246d2424482424482424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffffffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +dab6b6da9191b69191b69191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191b66d6db66d6db69191b69191b69191b66d6d +b66d6d916d6db69191b69191b66d6db66d6db69191b66d6db66d6db69191 +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +916d6d916d6d914848b69191ffb6b6ffdadaffb6b6b69191b66d6d916d6d +916d6d916d6d9148489148486d48489148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d4848914848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191da9191da9191da9191da9191b69191b69191 +da9191da9191b69191b69191da9191da9191b69191b69191da9191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db69191ffb6b6ffdadaffb6b6b69191914848 +914848916d6d6d48486d48486d24246d48486d24246d48486d24246d2424 +6d24246d24246d24246d48486d48486d48486d48486d48486d24246d4848 +6d24246d48486d24246d24246d24246d24246d48486d24246d48486d4848 +6d24246d48486d48486d48486d24246d24246d48486d24246d48486d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24244824244824246d2424 +4824246d24246d24246d24246d24246d24246d2424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffffffffdaffffdaffffdaffffdaffdadaffdadaffdadaffffdaffb6b6 +ffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6 +da9191da9191da9191da9191b69191da9191da9191da9191b69191da9191 +da9191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +916d6d914848914848b69191ffb6b6ffdadadab6b6b69191916d6d916d6d +914848916d6d9148489148486d48486d48486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d48486d24246d48486d4848914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +da9191da9191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6dda9191ffb6b6ffdadab66d6d916d6d +6d48489148486d48486d48486d24246d48486d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d48486d24246d4848 +6d48486d24246d48486d48486d48486d48486d24246d24246d24246d2424 +6d48486d48486d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824244824244824246d24244824244824246d2424 +4824246d24244824244824244824244824244824246d24246d2424482424 +ffffdaffffdaffffdaffffffffffffffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffffdaffdada +ffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6 +da9191da9191da9191b69191da9191dab6b6da9191da9191b69191da9191 +da9191b69191b69191b69191b69191b69191b69191b66d6db66d6db69191 +b69191b66d6db66d6d916d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6d916d6d916d6d +916d6d916d6d916d6ddab6b6ffb6b6ffdadadab6b6b66d6db66d6d914848 +916d6d6d48489148486d48489148486d48486d48486d48486d24246d2424 +6d24246d24246d48486d24246d24246d24246d24246d24246d48486d2424 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191da9191da9191da9191da9191da9191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db66d6d916d6d916d6db69191ffdadaffdadada9191b66d6d +9148486d48486d48486d24246d48486d24246d48486d24246d24246d4848 +6d24246d24246d48486d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d48486d48486d48486d24246d48486d24246d48486d4848 +6d48486d48486d48486d48486d24246d24246d48486d24246d48486d4848 +6d48486d48486d48486d48486d24246d48486d24246d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24244824244824246d24246d24244824244824246d2424 +6d24246d24246d24246d24244824244824244824244824246d2424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffdadaffffdaffdadaffdada +ffb6b6ffb6b6ffdadadab6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6d916d6d916d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6d916d6dda9191ffffdaffb6b6da9191b66d6d916d6d916d6d +9148489148486d48486d48486d48486d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d48486d24246d4848 +6d48486d24246d48486d48486d48486d48486d48486d4848914848914848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191da9191b69191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6d916d6db69191dab6b6ffb6b6ffb6b6b69191 +9148486d24246d24244824246d24246d24246d24246d24246d24246d4848 +6d24246d24246d24246d48486d24246d24246d48486d24246d24246d2424 +6d48486d24246d24246d48486d48486d48486d48486d48486d24246d4848 +6d24246d24246d48486d48486d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d48486d48486d24246d24246d24246d48486d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24244824244824244824244824246d2424 +6d24244824246d24246d24244824246d24246d2424482424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdadaffdada +ffdadaffb6b6ffdadaffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191b69191b69191b69191da9191b69191b69191da9191 +b69191da9191b69191b69191b69191b66d6db66d6db69191b66d6db66d6d +b66d6db69191b69191b66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6db69191ffb6b6ffb6b6ffb6b6b66d6db69191916d6d916d6d +9148489148489148486d48486d48486d48486d48486d24246d48486d4848 +6d24246d48486d24246d24246d48486d24246d48486d48486d48486d2424 +6d24246d48486d48486d48486d48486d48486d48486d4848914848914848 +914848914848914848916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b69191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191da9191da9191da9191 +da9191da9191da9191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db66d6d916d6db66d6db69191ffb6b6ffb6b6ffdadadab6b6 +916d6d4824246d48486d24246d48486d24246d48486d48486d48486d2424 +6d24246d24246d48486d48486d48486d24246d24246d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d24246d4848 +6d48486d48486d24246d24246d24246d24246d24246d48486d24246d4848 +6d24246d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +4824244824246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffdadaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffdada +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d916d6d +b66d6db69191b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6d +b66d6db66d6dda9191ffdadaffdadadab6b6b69191916d6db66d6d914848 +9148486d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +914848916d6d914848914848916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b66d6db69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191da9191da9191 +da9191da9191da9191da9191da9191da9191dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191b69191da9191 +da9191dab6b6da9191b69191b69191b66d6db69191b66d6db66d6db69191 +b69191b66d6db66d6db66d6db66d6db69191dab6b6ffdadaffb6b6b69191 +9148486d48486d24246d48486d24246d48486d24246d24246d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d48486d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24244824246d24244824244824246d2424482424482424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6 +ffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6ffb6b6dab6b6 +da9191dab6b6da9191da9191da9191da9191b69191b69191dab6b6da9191 +b69191b69191b69191da9191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db69191b69191b66d6d916d6db66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d +b66d6db66d6ddab6b6ffdadaffdadab69191b69191b66d6db66d6d916d6d +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +914848914848914848914848914848916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b66d6db69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191da9191da9191 +da9191da9191da9191da9191da9191dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +da9191da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6dda9191ffb6b6ffffdaffb6b6b69191 +6d48486d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d48486d24246d48486d48486d48486d48486d48486d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d24246d48486d24246d24246d48486d24246d4848 +6d24246d24246d48486d48486d48486d24246d24246d24246d48486d2424 +6d24246d24246d24246d48486d24246d24246d24246d48486d24246d2424 +6d24246d48486d48486d24246d24246d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824246d24244824244824246d2424 +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffdadaffdadaffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +b66d6db66d6dda9191ffdadaffb6b6da9191b66d6db69191b66d6d916d6d +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d2424 +6d48486d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191da9191da9191 +da9191da9191dab6b6dab6b6da9191dab6b6da9191da9191da9191da9191 +da9191da9191da9191da9191da9191b69191da9191b69191b69191b69191 +da9191da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db69191b69191b66d6db66d6dda9191dab6b6ffdadaffdadab66d6d +916d6d6d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d24246d48486d48486d24246d48486d48486d24246d24246d24246d2424 +6d24246d48486d48486d24246d48486d48486d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +6d24246d24246d24244824246d24246d24244824246d24244824246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffdadaffb6b6ffb6b6ffb6b6ffdadadab6b6dab6b6dab6b6dab6b6dab6b6 +da9191b69191b69191b69191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b66d6db66d6db69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6ddab6b6ffdadaffb6b6b69191b69191b66d6db66d6d916d6d +9148486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848914848914848914848916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191da9191b69191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191da9191da9191da9191b69191b69191b69191da9191da9191 +da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b66d6d916d6db66d6ddab6b6ffdadaffdadada9191 +b691916d24249148486d24246d48486d24246d48486d48486d48486d4848 +6d24246d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d24246d48486d24246d2424 +6d24246d48486d48486d24246d24246d48486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24244824246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d2424482424 +ffffdaffffdaffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffb6b6ffb6b6ffdadaffdadaffdadaffb6b6da9191dab6b6dab6b6da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +916d6db66d6dda9191ffdadadab6b6b69191b66d6db66d6db69191916d6d +6d48486d48486d24246d24246d48486d24246d48486d24246d48486d2424 +6d24246d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848914848914848916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b69191da9191da9191b69191b66d6db69191b66d6db69191b69191 +b69191da9191b69191b69191da9191da9191da9191b69191da9191da9191 +da9191da9191da9191da9191da9191dab6b6da9191dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191b69191da9191da9191 +da9191da9191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6dffb6b6ffb6b6ffb6b6dab6b6 +b66d6d9148486d24246d48486d24246d48486d24246d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d48486d48486d24246d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffdadaffdadaffdadaffdadaffb6b6dab6b6ffb6b6ffb6b6da9191 +dab6b6da9191da9191dab6b6da9191b69191b69191b69191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b66d6db69191b69191b66d6db66d6db66d6db66d6d +b69191b66d6db66d6db66d6db66d6db69191b69191b66d6db66d6d916d6d +916d6db66d6ddab6b6ffb6b6ffb6b6b69191b69191b66d6db66d6d916d6d +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +914848914848914848914848916d6d916d6d916d6db66d6d916d6d916d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191da9191da9191da9191b69191b69191b69191b66d6db69191b69191 +da9191da9191b69191da9191da9191da9191b69191b69191da9191da9191 +da9191da9191da9191da9191da9191dab6b6da9191dab6b6dab6b6dab6b6 +dab6b6da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191da9191da9191da9191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6ddab6b6ffdadaffb6b6da9191 +9148489148486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffb6b6ffb6b6ffdadaffdadaffdadaffb6b6dab6b6ffb6b6ffb6b6da9191 +da9191b69191da9191da9191da9191b69191b69191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +916d6d916d6db69191ffb6b6dab6b6b69191b66d6db69191916d6d916d6d +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +914848914848916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +da9191dab6b6da9191da9191da9191da9191b69191da9191da9191da9191 +da9191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191b69191b66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6ddab6b6ffdadaffb6b6914848 +6d48486d24246d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d48486d24246d48486d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d48486d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffb6b6ffdadaffffdaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6 +da9191da9191da9191dab6b6da9191b69191b66d6dda9191b69191da9191 +da9191b69191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d916d6db69191da9191da9191b69191b69191b66d6db66d6db66d6d +916d6d916d6d9148486d48486d48489148486d48486d48486d24246d4848 +6d48486d48486d24246d24246d24246d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d2424914848914848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191da9191 +dab6b6da9191dab6b6dab6b6b69191b66d6db69191b69191b69191b69191 +da9191dab6b6dab6b6b69191b69191b69191b69191b69191da9191da9191 +da9191da9191da9191dab6b6dab6b6da9191da9191b69191b66d6db66d6d +b66d6d916d6d914848914848914848914848916d6d914848914848914848 +916d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191da9191ffdadaffdadab69191 +9148484824249148486d24246d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b69191b66d6db69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6ddab6b6da9191da9191b69191b69191b66d6db66d6d +916d6d9148489148489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d24246d24246d48486d48486d4848 +6d48486d48486d48486d48486d24246d4848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191da9191 +dab6b6dab6b6dab6b6ffb6b6da9191b66d6db69191b69191b69191da9191 +dab6b6dab6b6dab6b6b69191b69191b69191b69191da9191da9191da9191 +dab6b6da9191da9191da9191b69191b69191b69191916d6d916d6d916d6d +9148489148489148489148489148489148489148489148486d4848914848 +916d6db66d6db66d6db66d6db69191b69191b69191da9191b69191b69191 +b69191b69191b66d6db66d6db69191b69191da9191ffdadaffdadadab6b6 +916d6d9148486d24249148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6da9191 +b69191dab6b6dab6b6da9191dab6b6da9191b69191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db69191dab6b6ffb6b6dab6b6da9191da9191b69191b69191b66d6d +916d6d916d6db66d6d9148489148489148486d4848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d4848914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191da9191 +dab6b6ffb6b6ffb6b6ffb6b6da9191b69191b66d6db69191b66d6dda9191 +dab6b6dab6b6dab6b6b69191b66d6db69191b69191da9191da9191da9191 +da9191b69191b66d6db66d6d916d6d916d6d916d6d9148489148486d4848 +6d48486d4848914848914848914848914848916d6d916d6d914848914848 +914848916d6d916d6d916d6d916d6db66d6db66d6db69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6dda9191da9191ffdadaffb6b6ffb6b6 +b69191916d6d9148486d48486d48486d48486d48489148486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffff +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b66d6db69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6dda9191ffb6b6ffb6b6dab6b6b69191b69191b69191b66d6db66d6d +916d6d916d6db66d6db66d6d916d6d916d6d914848914848914848914848 +9148486d48486d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d48486d24246d48486d4848914848914848914848916d6d916d6d +916d6d916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191da9191da9191 +dab6b6ffb6b6ffb6b6dab6b6da9191b66d6db66d6db69191b69191dab6b6 +ffb6b6ffb6b6dab6b6da9191b66d6db69191b69191b69191da9191b69191 +b69191b69191b69191b66d6db66d6db66d6d916d6d916d6d914848914848 +914848914848916d6d916d6d916d6d916d6db66d6db66d6d916d6d916d6d +916d6d914848916d6d916d6d916d6db66d6db66d6db69191b69191b69191 +b69191b69191b66d6db66d6db69191da9191ffb6b6ffb6b6ffb6b6da9191 +da9191916d6d916d6d6d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d24246d24246d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824246d24244824246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6b69191b69191b69191b69191b69191b69191b69191 +b69191da9191da9191da9191da9191b69191b66d6db69191b69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d +916d6db69191ffb6b6ffb6b6da9191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b69191b69191916d6d914848914848916d6d +9148486d48486d48486d48486d48486d48486d24246d24246d24246d4848 +6d24246d48486d48486d48486d4848914848914848914848914848914848 +914848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191da9191 +da9191dab6b6ffb6b6dab6b6da9191b66d6d916d6db66d6db69191da9191 +dab6b6dab6b6dab6b6b69191b69191b66d6db69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d914848 +914848916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d914848916d6d916d6d916d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db69191da9191ffb6b6ffdadaffb6b6b66d6d +916d6d6d48486d48486d48489148486d48489148486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24244824246d24246d24244824246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffb6b6ffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6da9191da9191da9191b69191b69191b69191b69191b69191 +b69191da9191dab6b6da9191b69191b66d6db66d6db69191b69191b69191 +b66d6db69191b69191b66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db69191ffdadaffdadadab6b6b69191da9191b69191b69191b69191 +b66d6d916d6db66d6db69191da9191b69191b66d6d916d6d914848916d6d +916d6d6d48489148489148486d48486d24246d24246d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d4848914848914848914848916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191 +b69191dab6b6dab6b6dab6b6da9191916d6db66d6db66d6db69191dab6b6 +dab6b6dab6b6da9191da9191b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db66d6d916d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db69191da9191 +b69191b66d6db66d6db66d6d916d6db66d6d916d6db66d6db69191b66d6d +b69191b69191b69191b66d6db66d6dda9191ffb6b6ffdadaffb6b6b69191 +9148486d48486d48489148486d48489148486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d48486d24246d24246d24246d48486d48486d48486d4848 +6d24246d48486d48486d48486d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6dab6b6da9191dab6b6 +ffb6b6dab6b6da9191b69191b69191da9191da9191b69191b69191b69191 +da9191da9191da9191b69191b69191b69191b66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6ddab6b6ffdadaffdadaffb6b6da9191da9191b66d6db69191b69191 +b66d6db66d6db66d6dda9191dab6b6da9191da9191b66d6db66d6d916d6d +916d6d914848916d6d9148489148486d24246d24246d48486d48486d4848 +6d48486d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191da9191dab6b6b69191b66d6db66d6db66d6db69191da9191 +dab6b6dab6b6dab6b6da9191b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191da9191da9191b69191da9191 +da9191b66d6db66d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6d +b69191b66d6db66d6d916d6db66d6ddab6b6ffdadaffdadadab6b6b66d6d +916d6db69191b69191b69191916d6d9148489148486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48489148489148489148486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d48486d24246d48486d48486d24246d48486d2424 +6d24246d48486d48486d24246d24246d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffdadaffb6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191b69191da9191da9191da9191b69191b69191 +b69191da9191b69191b69191b69191b66d6db69191b69191b69191b66d6d +b66d6db69191b69191b69191b69191b66d6db69191b66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6ddab6b6ffffdaffdadaffb6b6dab6b6da9191b69191b66d6db69191 +b66d6d916d6d916d6dda9191ffb6b6ffb6b6ffb6b6da9191b69191916d6d +914848916d6d916d6db66d6d9148486d48486d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d48486d24246d48486d24246d24246d48486d4848 +6d4848914848914848914848916d6d916d6db66d6db69191b69191b69191 +b69191b69191da9191da9191b69191b66d6d916d6db66d6db66d6dda9191 +dab6b6dab6b6dab6b6da9191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b66d6db69191b66d6db69191b66d6db69191b69191 +b69191b69191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db66d6db66d6db69191dab6b6ffdadaffdadaffb6b6da9191 +da9191da9191dab6b6ffb6b6b691919148486d48486d48486d24246d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848914848916d6d9148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d24246d24246d48486d48486d2424 +6d48486d48486d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffffdaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6 +da9191dab6b6dab6b6da9191da9191da9191dab6b6da9191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6ddab6b6ffdadaffffdaffdadaffb6b6da9191da9191b69191b69191 +b66d6d916d6d914848b66d6ddab6b6ffb6b6ffdadaffb6b6dab6b6b69191 +916d6db66d6d916d6db66d6d9148489148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d48486d48486d24246d24246d2424 +6d24246d48486d4848914848914848916d6d916d6db66d6db69191b66d6d +b69191b69191b69191b69191b69191b66d6d916d6db66d6db69191da9191 +dab6b6dab6b6dab6b6da9191b69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191dab6b6dab6b6da9191da9191 +da9191b69191da9191b69191da9191b69191b69191b69191b66d6db66d6d +b69191b69191b66d6db66d6db69191ffb6b6ffb6b6ffb6b6ffb6b6b66d6d +914848914848916d6ddab6b6dab6b6b66d6d6d48486d48486d24246d4848 +6d24246d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d9148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d24246d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffff +ffffffffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffdada +ffdadaffdadaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db69191b69191b69191b66d6db66d6db69191b66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6ddab6b6ffffdaffdadaffdadadab6b6dab6b6b69191b69191b66d6d +b69191b66d6d914848914848b66d6dda9191ffb6b6ffb6b6dab6b6dab6b6 +b66d6db69191b66d6db66d6d9148486d48486d48489148486d48486d4848 +6d48486d24246d24246d48486d24246d24246d24246d24246d48486d4848 +6d48486d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d48486d48486d48486d4848914848916d6db66d6db66d6d +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6dda9191 +dab6b6dab6b6dab6b6dab6b6da9191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191da9191da9191da9191da9191 +b69191da9191b69191b69191b69191b69191da9191da9191b69191b69191 +b69191b69191b66d6db66d6dda9191ffb6b6ffdadada9191b66d6d916d6d +914848916d6d916d6ddab6b6ffb6b6b69191916d6d6d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +914848916d6d916d6d916d6d916d6d9148486d48486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffffdaffdadaffdadaffdadaffb6b6ffb6b6dab6b6ffdadaffb6b6 +dab6b6da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6ddab6b6ffdadaffdadaffffdadab6b6dab6b6b69191b69191b69191 +b69191b66d6d916d6d914848914848b69191da9191dab6b6ffb6b6ffdada +b69191b69191b66d6db66d6d9148486d48486d48489148486d48486d4848 +6d24246d24246d48486d48486d24246d48486d24246d48486d24246d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d24246d2424 +6d48486d48486d48486d48486d48486d48486d4848914848916d6db66d6d +b66d6db66d6db66d6db69191b66d6db66d6d916d6d916d6db66d6db69191 +da9191dab6b6dab6b6da9191da9191b69191b69191b66d6db69191b66d6d +b69191b69191b69191b69191b69191b69191b66d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db69191b69191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6dda9191dab6b6dab6b6b66d6d916d6d916d6d +b66d6db66d6d916d6db69191ffb6b6b691916d48486d48489148486d4848 +9148486d24249148486d48489148486d48489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848916d6d916d6d9148489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6dda9191ffffdaffffdaffdadaffb6b6da9191dab6b6b69191b69191 +b69191b69191b66d6d914848916d6db66d6db69191da9191da9191da9191 +da9191b69191b69191916d6d9148486d48489148489148486d48486d4848 +6d48486d48486d48486d24246d48486d24246d48486d4848914848914848 +914848916d6d9148489148489148489148489148486d48486d48486d2424 +6d48486d48486d48486d48486d24246d24246d24246d4848914848916d6d +916d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db69191 +da9191dab6b6dab6b6da9191dab6b6b69191b69191b69191b69191b69191 +b69191b69191b69191da9191b69191b69191b66d6d9148486d48486d4848 +6d24246d24246d24246d48486d48486d4848916d6d916d6db66d6d916d6d +916d6d916d6db66d6db69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b66d6db66d6db69191ffb6b6b691919148486d4848914848914848 +6d48486d48486d48489148489148489148486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d4848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +ffb6b6ffb6b6dab6b6da9191da9191dab6b6dab6b6da9191dab6b6da9191 +da9191b69191b69191da9191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b66d6db69191b69191b69191b69191b66d6db69191 +b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6d916d6d +b66d6ddab6b6ffdadaffffdaffdadaffb6b6dab6b6da9191da9191b69191 +b69191b69191b69191b66d6d916d6d916d6db66d6db66d6db69191b69191 +b69191b69191b69191916d6d9148489148486d48486d48486d48486d4848 +9148486d48486d48486d48486d4848914848914848914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6d9148489148486d48486d24246d48486d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6d916d6d6d48486d48486d4848 +6d24246d2424914848b66d6db66d6db66d6db66d6dffb6b6b69191b66d6d +916d6d914848916d6d914848916d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b69191b66d6db66d6db69191b69191b69191b69191b69191 +b69191b66d6db66d6ddab6b6ffb6b6916d6d482424916d6d6d2424916d6d +6d24249148486d48489148486d48489148486d48486d48486d4848914848 +6d48489148486d48489148489148486d48489148486d48486d48486d4848 +6d48489148489148486d48486d4848914848914848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffdada +ffdadaffffdaffdadaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191da9191b69191b69191b66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b69191da9191ffdadaffdadaffffdaffb6b6dab6b6da9191da9191b69191 +b69191b69191b69191b69191916d6d914848916d6db69191b69191b69191 +b69191b69191b69191b66d6d916d6d6d48489148486d48486d48486d4848 +6d48486d4848914848914848914848916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db69191b69191da9191b69191b69191b69191 +b69191b66d6db66d6db66d6d916d6d9148486d48486d48486d24246d2424 +6d48486d48486d48486d48486d4848914848916d6d916d6d916d6db66d6d +b69191da9191da9191da9191da9191b69191b69191b69191b69191da9191 +b69191b69191da9191b69191b69191b66d6db66d6d914848914848914848 +6d48486d2424914848b69191916d6d916d6dffb6b6ffb6b6ffdadab69191 +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191da9191 +b69191da9191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b66d6db69191dab6b6dab6b6916d6d9148486d24249148486d4848 +9148486d48489148486d48489148486d48486d48486d4848914848914848 +9148486d48486d48489148486d48489148486d48486d48486d4848914848 +9148489148489148489148486d4848914848914848914848914848914848 +9148489148486d48486d48489148489148486d48489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d48486d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffdadaffffdaffffdaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191da9191b69191b66d6d +b66d6db66d6db69191b69191b66d6db66d6db69191b66d6db66d6db66d6d +b69191da9191ffb6b6ffdadaffffdaffdadadab6b6da9191dab6b6da9191 +b69191b69191b69191b69191b66d6d916d6db69191b69191b69191b69191 +b66d6db69191b69191b66d6d916d6d6d48486d48486d48486d4848914848 +6d48486d48486d4848914848914848914848914848916d6d916d6d916d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d9148486d48486d48486d2424 +6d24246d24246d48486d24246d24246d4848914848916d6d916d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6d914848914848914848 +9148486d48486d48486d24246d2424916d6dffb6b6ffb6b6da9191b69191 +b69191b69191b66d6db69191b69191b69191b66d6db66d6db69191b69191 +b69191b69191b69191b66d6db66d6db66d6db69191da9191b69191b69191 +b69191b69191b69191ffb6b6da91919148489148489148489148486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +9148489148489148489148486d48486d48489148486d48486d48486d4848 +6d48489148489148489148486d48486d4848914848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d24246d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6 +ffb6b6ffdadaffffdaffdadaffdadaffdadaffb6b6ffdadaffb6b6ffdada +ffb6b6ffb6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191b69191da9191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6dda9191ffdadaffffdaffdadaffb6b6dab6b6dab6b6dab6b6 +da9191b69191b66d6db66d6db69191b66d6db66d6db69191b69191b69191 +b69191b69191b69191b66d6d916d6d6d48486d48486d48486d4848914848 +6d48486d48489148489148486d4848914848914848916d6d916d6db66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b66d6d +b66d6d916d6d916d6db66d6db66d6db66d6d916d6d6d48486d48486d2424 +6d24246d24246d24246d24246d24246d2424914848916d6d916d6d916d6d +b66d6db69191b69191b69191da9191da9191da9191da9191b69191da9191 +da9191da9191da9191b69191b66d6db66d6db66d6db66d6d916d6d916d6d +9148489148489148486d4848914848b66d6dda9191da9191da9191da9191 +da9191da9191da9191da9191dab6b6dab6b6da9191b69191da9191da9191 +da9191da9191b69191b69191b66d6db66d6db69191b69191b69191b69191 +b69191b69191dab6b6ffb6b6b69191916d6d9148486d4848914848914848 +6d48489148486d48489148489148486d48486d4848914848914848914848 +9148486d48489148489148486d48486d48486d4848914848914848914848 +9148489148486d4848914848914848914848914848914848914848914848 +9148489148486d48486d48489148486d48486d48486d4848914848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d24246d48486d24246d24246d24246d2424 +6d48486d24246d24246d48486d48486d24246d24246d48486d24246d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6 +ffb6b6ffdadaffffdaffffdaffdadaffb6b6dab6b6ffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191da9191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6db66d6d +916d6db66d6dda9191ffdadaffdadaffffdaffdadaffb6b6dab6b6dab6b6 +da9191da9191b66d6db66d6db69191b66d6db66d6db66d6db69191b69191 +b69191b69191b69191b66d6d9148489148486d48486d48486d4848914848 +9148486d48486d48486d48486d4848914848916d6d916d6d916d6d916d6d +b66d6d916d6d916d6d914848914848914848916d6d916d6db66d6db66d6d +b66d6d914848916d6d914848916d6d9148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848916d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +da9191da9191b69191b69191b69191916d6d916d6db66d6d916d6d916d6d +916d6d914848914848916d6db66d6db69191b69191da9191da9191dab6b6 +da9191b69191b69191b69191da9191da9191da9191b69191b69191b69191 +da9191b69191b69191b66d6d916d6db66d6db66d6db69191b69191da9191 +b69191b69191dab6b6ffb6b6da9191916d6d6d4848916d6d914848914848 +6d48489148486d48489148489148486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48489148486d48486d48486d4848 +9148489148489148486d48489148489148489148489148486d4848914848 +9148489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d4848914848914848914848 +9148486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d24246d48486d48486d24246d24246d24246d24246d24246d4848 +6d24246d24246d48486d24246d24246d24246d48486d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d48486d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffffdaffffdaffdadaffffdaffb6b6ffb6b6ffdadaffb6b6ffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191da9191da9191da9191da9191 +b69191b69191b69191da9191da9191dab6b6da9191b69191b66d6db69191 +b66d6db66d6dda9191ffdadaffffdaffffdaffdadaffb6b6dab6b6da9191 +dab6b6da9191b69191b66d6db66d6db69191b66d6db66d6db66d6db69191 +b69191b69191da9191b69191b66d6db66d6d9148486d4848914848914848 +9148486d48486d48486d48486d4848916d6d916d6d916d6d914848916d6d +9148486d48486d48486d48486d24246d48486d4848914848916d6db66d6d +916d6d916d6d9148486d48489148486d48486d48486d24246d24246d4848 +6d48486d24246d24246d24246d24246d24246d4848914848916d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191da9191 +dab6b6da9191b69191b69191b69191916d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db69191b69191da9191dab6b6dab6b6dab6b6dab6b6 +da9191b69191b69191da9191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191da9191b69191 +b69191b69191dab6b6ffb6b6ffb6b6916d6d916d6d6d48489148486d4848 +9148489148489148486d48486d48486d48489148486d4848914848914848 +9148489148486d48486d48489148489148489148489148489148486d4848 +6d4848914848914848914848914848914848914848914848914848914848 +6d48489148486d48489148486d48489148486d48489148489148486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d48489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d24246d48486d48486d48486d48486d48486d48486d24246d2424 +6d48486d24246d24246d48486d24246d24246d24246d48486d24246d2424 +6d24246d24246d24246d24246d48486d48486d24246d48486d24246d2424 +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffffda +ffffdaffffdaffdadaffdadaffdadaffdadaffdadaffb6b6dab6b6dab6b6 +ffb6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191dab6b6 +da9191da9191b69191b69191b69191b69191b69191da9191b69191da9191 +b69191b69191b69191b69191b69191da9191da9191dab6b6da9191da9191 +b66d6db66d6db69191da9191dab6b6dab6b6dab6b6b69191b66d6db66d6d +b66d6db66d6dda9191ffb6b6ffffdaffffdaffffdaffb6b6ffb6b6da9191 +da9191da9191b69191b66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191916d6d916d6d6d48486d48486d4848914848 +6d48486d48486d48486d48486d4848916d6d9148489148486d48486d4848 +6d48486d48486d48486d24246d4848916d6db66d6db66d6db69191b66d6d +b66d6d9148486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848b66d6db66d6d +b66d6db69191b66d6db69191b66d6db69191b69191b69191b69191b69191 +da9191b69191b66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +916d6db66d6db66d6db69191b69191da9191da9191b69191da9191da9191 +da9191b69191da9191da9191b69191da9191da9191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db69191da9191 +b66d6db66d6dda9191ffb6b6ffb6b6b66d6d914848914848914848914848 +9148486d48489148489148489148486d48489148486d4848914848914848 +9148489148486d48486d48486d48486d48486d48489148486d4848914848 +9148489148489148489148489148489148486d4848914848914848914848 +6d48489148486d48489148486d48486d48486d4848914848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d24246d48486d24246d2424 +6d48486d48486d48486d24246d48486d48486d48486d48486d48486d2424 +6d48486d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffffdaffdadaffdadaffdadaffdadaffffdaffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191da9191da9191dab6b6dab6b6dab6b6 +da9191b69191b69191b66d6db69191b69191da9191da9191da9191b69191 +b69191b66d6db69191b69191dab6b6da9191da9191b69191b66d6db66d6d +b66d6db69191da9191ffb6b6ffdadaffffdaffdadaffdadaffb6b6da9191 +b66d6db66d6db66d6db66d6d916d6db66d6db69191b66d6db66d6db66d6d +b69191b69191b69191b66d6d9148489148486d4848914848914848914848 +6d48486d48489148489148486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48484824246d2424b69191b69191914848da9191ffb6b6 +b66d6d6d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848916d6d916d6db66d6d +b66d6db69191b69191b69191b69191da9191b69191b69191b69191da9191 +da9191da9191b69191da9191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191da9191da9191da9191dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191da9191da9191 +da9191b69191b69191b69191b66d6db66d6db66d6db66d6db69191da9191 +b69191b66d6db69191da9191dab6b6b66d6d916d6d914848914848916d6d +9148489148486d4848914848914848914848914848914848914848914848 +9148489148489148489148486d48486d4848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148486d48486d48489148489148486d48486d4848914848914848914848 +914848916d6d9148489148489148489148489148489148486d4848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d4848 +6d48486d24246d24246d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d48486d48486d48486d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191b69191da9191da9191dab6b6dab6b6ffb6b6ffb6b6 +dab6b6da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191da9191da9191b69191b69191b66d6db69191 +b66d6db66d6db66d6dda9191ffb6b6ffdadaffffdaffdadaffb6b6b66d6d +914848914848914848916d6d916d6db69191b69191b69191b66d6db66d6d +b66d6db69191b69191916d6d9148486d48486d48489148486d48486d4848 +9148489148489148489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d4848916d6ddab6b6ffb6b6 +b691916d24246d24244824246d48486d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6db69191b69191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6dda9191 +b69191b69191b66d6dda9191ffb6b6b691919148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148486d4848914848914848 +6d4848914848914848914848914848914848914848914848914848914848 +6d48486d48489148486d48486d48489148486d48486d4848914848914848 +9148489148489148489148489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d48486d4848 +6d48486d24246d24246d24246d48486d24246d24246d24246d48486d4848 +6d48486d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffda +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffda +ffdadaffb6b6ffb6b6ffb6b6ffdadaffffdaffdadaffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191b69191b69191b69191da9191dab6b6ffb6b6ffb6b6ffb6b6 +dab6b6dab6b6b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b66d6db66d6db69191 +b69191b69191916d6db66d6ddab6b6ffdadaffdadaffffdaffb6b6b69191 +6d48486d48486d4848914848916d6db66d6db69191b69191b66d6db66d6d +b69191b69191b69191916d6d9148486d48486d48486d48486d48486d4848 +916d6db66d6d916d6d6d48486d4848914848916d6d916d6d916d6d914848 +9148486d48486d48486d48486d48486d48486d4848b66d6dda9191b69191 +916d6d6d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848916d6d916d6d +b66d6db66d6db69191b66d6db69191b69191b69191da9191da9191b69191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191da9191dab6b6dab6b6dab6b6dab6b6ffb6b6ffb6b6 +dab6b6dab6b6da9191dab6b6da9191da9191da9191da9191da9191b69191 +b69191b69191b66d6db69191b69191b66d6db66d6d916d6db69191da9191 +dab6b6da9191b69191da9191dab6b6dab6b6916d6d914848914848914848 +914848914848914848914848914848914848916d6d914848914848914848 +9148489148489148489148489148489148489148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148486d48489148486d4848914848914848914848 +9148489148489148486d48486d48486d48486d48489148486d4848914848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffda +ffdadaffb6b6ffb6b6ffdadaffdadaffdadaffdadaffdadaffb6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191b69191b69191b69191b69191dab6b6dab6b6ffb6b6ffb6b6 +dab6b6da9191b69191b69191b66d6db66d6db66d6db69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db66d6db69191b66d6db66d6db69191 +da9191da9191da9191b69191dab6b6ffb6b6ffdadaffdadaffdadadab6b6 +9148486d48486d4848914848916d6db66d6db69191b69191b66d6db66d6d +b69191b69191b691919148489148486d48486d48486d48486d4848916d6d +b66d6d916d6d916d6d6d48486d24249148486d4848b66d6d916d6d916d6d +914848916d6d914848916d6d914848916d6d916d6db66d6d916d6d916d6d +9148486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d4848914848916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b66d6db69191b69191b69191da9191b69191b69191b69191b69191b66d6d +b69191b69191b69191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191dab6b6b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db69191b66d6d916d6db66d6db69191 +dab6b6dab6b6da9191b69191dab6b6dab6b6916d6d6d4848916d6d6d4848 +9148486d4848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148489148486d48489148486d4848914848 +6d48489148489148489148489148489148489148489148486d4848914848 +9148489148489148489148486d48489148486d4848914848914848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d2424 +6d48486d48486d48486d48486d48486d24246d24246d24246d24246d4848 +6d48486d48486d48486d48486d24246d24246d48486d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6ffb6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191b69191da9191da9191dab6b6dab6b6 +dab6b6b69191b69191b66d6db69191b66d6db69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db69191dab6b6 +ffdadaffb6b6da9191b66d6db66d6dda9191ffb6b6ffdadaffffdaffb6b6 +916d6d6d48486d48486d4848b66d6db69191b69191b69191b66d6d916d6d +b69191da9191da9191916d6d6d48486d48486d48486d48486d4848916d6d +b66d6db66d6d9148486d48486d24246d48486d4848914848916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6d6d48486d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848b66d6d +b66d6db66d6db66d6db69191b66d6db69191b69191da9191da9191da9191 +da9191b69191b69191da9191dab6b6da9191da9191da9191da9191da9191 +da9191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191b69191 +da9191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +da9191dab6b6dab6b6da9191dab6b6da9191916d6d916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d48486d24246d48486d48486d24246d48486d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffffda +ffffdaffdadaffb6b6ffb6b6ffdadaffb6b6ffdadaffb6b6ffb6b6ffb6b6 +ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191b69191b69191b69191b66d6db69191b69191b69191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6dda9191ffdada +ffdadab691916d48486d24244824246d2424b69191ffb6b6ffffdaffb6b6 +916d6d6d48486d48486d2424916d6db66d6db69191b69191b66d6db66d6d +b66d6db69191b66d6d9148486d48486d48486d48486d4848914848914848 +916d6d916d6d9148486d48486d48486d24246d4848914848916d6d916d6d +916d6d916d6db66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6d +9148486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191b69191da9191da9191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +b69191da9191dab6b6dab6b6dab6b6da9191b66d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d916d6db66d6db66d6db66d6d916d6d9148486d4848914848914848 +9148489148486d48489148489148489148489148489148486d4848914848 +9148489148489148489148486d48486d48489148489148486d48486d4848 +6d48489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d24246d24246d48486d4848 +6d48486d24246d48486d48486d48486d48486d24246d24246d24246d2424 +6d24246d24246d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d24246d24246d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffffda +ffffdaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdada +ffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6ddab6b6ffdada +ffb6b6b66d6d6d48486d48484824246d24246d2424916d6d916d6d916d6d +6d48486d48486d2424914848914848b69191b69191b69191b66d6db69191 +b66d6db69191916d6d6d48486d48486d48486d4848914848916d6d914848 +916d6d916d6d916d6d9148489148486d48486d4848914848916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6d +9148486d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d2424914848916d6d +916d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b69191da9191b69191da9191da9191da9191dab6b6da9191da9191 +da9191da9191da9191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +916d6db69191da9191dab6b6dab6b6da9191b66d6d916d6d6d4848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6db69191dab6b6dab6b6da9191da9191916d6d6d4848914848b66d6d +b66d6db66d6d914848914848914848914848914848914848914848914848 +9148489148486d48489148486d48489148489148489148486d48486d4848 +9148489148489148489148489148486d48489148486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48489148489148489148486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +6d48486d24246d48486d48486d48486d24246d24246d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffffda +ffffdaffdadaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6dab6b6da9191da9191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b66d6db69191b66d6db69191b66d6db66d6d916d6db66d6dffb6b6ffdada +ffb6b6b69191916d6d9148486d48486d48486d24246d48486d24246d2424 +6d24246d48486d4848914848916d6db66d6db69191b69191b66d6db66d6d +b66d6db66d6d916d6d9148486d48489148486d48489148486d4848914848 +914848914848914848914848914848916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6d916d6db66d6d916d6d +9148486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848914848 +b66d6db66d6d916d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b69191b69191b69191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191da9191da9191 +da9191dab6b6da9191dab6b6dab6b6dab6b6da9191da9191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6db66d6db69191da9191dab6b6b69191914848916d6d914848 +9148489148489148489148489148489148489148489148486d4848914848 +b66d6dda9191dab6b6dab6b6dab6b6dab6b6b69191914848b69191b69191 +dab6b6da9191b66d6d916d6d9148486d4848914848914848914848914848 +9148486d48489148489148489148489148489148486d48486d48486d4848 +9148489148486d48489148489148486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d4848 +6d48486d48486d48486d48486d48486d48486d24246d24246d48486d2424 +6d24246d48486d48486d24246d48486d24246d48486d48486d24246d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffb6b6ffdada +ffdadaffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6d916d6db66d6ddab6b6ffffda +ffb6b6b66d6db66d6d916d6db66d6d9148486d48486d48486d48486d4848 +6d48486d4848914848b66d6db66d6db69191b69191b69191b66d6db66d6d +b69191b66d6d916d6d9148486d48489148486d48486d48486d48486d4848 +914848914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d9148486d48486d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +916d6d916d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191da9191da9191da9191b69191da9191da9191dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191b69191b69191b69191da9191da9191 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191 +b66d6d916d6d916d6db69191da9191dab6b6da9191916d6d916d6d914848 +916d6d914848916d6d914848916d6d914848914848914848914848914848 +916d6dda9191ffb6b6dab6b6dab6b6dab6b6da9191b66d6ddab6b6ffb6b6 +ffb6b6ffb6b6da9191916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48486d48486d48486d4848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d48486d48486d48486d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d48486d24246d48486d48486d48486d48486d48486d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191 +da9191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6d916d6db66d6ddab6b6ffb6b6 +ffdadab66d6d916d6d916d6db66d6d916d6d9148486d48486d48486d4848 +6d48486d4848914848916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d9148486d48486d48486d48486d48486d48486d48486d4848 +9148486d4848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db69191b66d6d +916d6d6d48486d48486d24246d24244824246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191da9191dab6b6 +dab6b6dab6b6dab6b6da9191da9191b69191da9191da9191b69191da9191 +da9191da9191da9191da9191dab6b6da9191da9191da9191da9191da9191 +b69191b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6db66d6d +916d6d916d6d914848b66d6db69191da9191da9191916d6d916d6d914848 +914848916d6d9148489148489148489148489148489148486d4848914848 +916d6db69191dab6b6dab6b6dab6b6dab6b6da9191da9191dab6b6dab6b6 +dab6b6dab6b6b69191916d6d9148486d48486d48489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d24246d48486d48486d48486d24246d24246d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffdadaffb6b6dab6b6ffb6b6ffb6b6ffdadaffb6b6 +ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191da9191b69191da9191b69191da9191 +b69191b69191b66d6db69191b69191da9191da9191b69191da9191b69191 +b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6dda9191ffdada +ffdadab66d6d914848916d6d916d6db66d6d916d6d916d6d9148486d4848 +6d48486d24246d4848914848b66d6db66d6db66d6db69191b66d6db69191 +b66d6d9148486d48486d48486d48486d48486d48486d48486d48486d4848 +914848914848914848916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +916d6d9148486d48486d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424914848 +916d6d916d6db66d6db66d6db69191b69191b66d6db66d6db69191b69191 +b69191b69191b69191b69191da9191da9191da9191da9191da9191dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191dab6b6 +dab6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +b69191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db69191da9191dab6b6da9191b66d6d914848916d6d +914848914848914848914848914848914848914848914848914848914848 +914848916d6db66d6db69191da9191dab6b6dab6b6ffb6b6dab6b6ffb6b6 +dab6b6dab6b6b69191914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148489148489148486d4848 +6d48486d48489148486d48489148486d48489148486d48486d48486d4848 +6d48489148489148486d48486d48486d48486d48489148486d4848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d4848 +6d24246d48486d48486d48486d24246d48486d48486d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadadab6b6dab6b6ffb6b6ffb6b6ffb6b6 +dab6b6dab6b6dab6b6da9191dab6b6dab6b6b69191da9191da9191da9191 +da9191b69191b69191da9191b69191b69191b69191da9191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191da9191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db69191ffb6b6 +ffdadab69191914848916d6d914848916d6d916d6db66d6d916d6d6d4848 +6d48486d24246d2424914848916d6db66d6db66d6db66d6db66d6db69191 +b66d6d9148486d48486d48486d24246d48486d24246d48486d24246d4848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +9148486d48486d24246d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +914848916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db69191b69191b69191b69191b69191b66d6db69191b69191 +b69191da9191dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191dab6b6da9191da9191da9191da9191da9191da9191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d +914848914848916d6d916d6db69191da9191b69191916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d4848916d6dda9191ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +dab6b6b69191b66d6d9148486d4848914848914848914848914848914848 +9148489148489148489148489148486d4848914848914848914848914848 +9148489148489148489148486d48486d48486d48489148489148486d4848 +6d48486d48489148486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d48486d24246d4848 +6d48486d48486d48486d24246d24246d24246d24246d48486d48486d2424 +6d24246d24246d48486d48486d48486d48486d24246d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffb6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191dab6b6 +da9191da9191b69191da9191da9191b69191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6dffb6b6 +ffdadada9191916d6d914848b66d6d914848b66d6db66d6db66d6d914848 +9148486d48486d48486d4848916d6d916d6db69191b66d6db66d6db66d6d +b66d6d9148486d48486d48486d48486d48486d48486d24246d48486d4848 +916d6db66d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d914848 +6d48486d24246d48486d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +916d6d916d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191 +b69191b69191b69191da9191b69191da9191da9191b69191b69191b69191 +da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191dab6b6da9191dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +916d6d916d6db66d6db66d6db69191da9191da9191916d6d916d6d914848 +916d6d914848916d6d914848916d6d914848914848914848914848914848 +9148486d4848914848b66d6ddab6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +da9191916d6d9148489148486d4848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48486d48489148489148486d48486d48486d48489148486d4848 +6d48486d48489148489148489148486d48486d48486d48489148486d4848 +9148489148489148486d48486d48486d48486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d24246d48486d24246d24246d48486d24246d24246d2424 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6 +da9191da9191dab6b6dab6b6dab6b6dab6b6da9191b69191da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6dffb6b6 +ffdadada9191b66d6d916d6d916d6d914848916d6d916d6d916d6d914848 +6d48486d48486d48486d4848916d6db66d6db66d6db66d6db66d6db66d6d +916d6d9148486d48486d24246d24246d48486d48486d48486d4848914848 +916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6d6d4848 +6d48486d24246d24246d48486d48486d24246d24246d24246d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +914848916d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191da9191b69191b69191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6d +916d6d916d6db66d6db66d6db69191dab6b6da9191914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +9148486d48486d4848b66d6dda9191dab6b6ffb6b6ffb6b6ffb6b6da9191 +b66d6d9148489148486d4848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148486d48486d4848 +6d48486d48489148486d48489148486d48486d48486d48486d4848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d24246d48486d4848 +6d48486d48486d48486d48486d48486d48486d24246d48486d48486d2424 +6d24246d24246d48486d24246d24246d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffdadaffdadaffdadaffffdaffdadaffdadaffdadaffb6b6ffb6b6dab6b6 +dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191b69191da9191b69191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6d916d6db66d6dffb6b6 +ffffdada9191b66d6d914848916d6d916d6d916d6db66d6d916d6d914848 +6d48486d48486d24246d4848914848b66d6db66d6db66d6db66d6db66d6d +9148486d48486d24246d48486d24246d48486d48486d48486d4848916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d9148486d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +914848916d6d916d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191da9191da9191 +da9191b69191b69191da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191dab6b6da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db69191b69191da9191dab6b6da9191b66d6d914848916d6d +914848914848914848914848914848914848914848914848916d6d914848 +9148486d48486d4848914848b66d6dda9191dab6b6da9191da9191b66d6d +9148486d4848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48489148486d48489148486d48486d48486d48486d48486d4848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +6d24246d24246d24246d48486d48486d48486d48486d24246d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffff +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6 +ffdadaffdadaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +dab6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db69191b66d6db69191b66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6dffb6b6 +ffdadadab6b6916d6db66d6d914848916d6d914848916d6d916d6d914848 +6d48486d48486d48486d4848914848b66d6db66d6d916d6d916d6db66d6d +9148486d48486d48486d48486d48486d48486d48486d4848914848914848 +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d916d6d +b66d6d916d6db66d6db66d6d916d6d916d6d916d6d9148486d48486d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d4848914848916d6db66d6db69191b66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b66d6db69191da9191 +da9191da9191b69191b69191b69191b69191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191da9191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6dffb6b6b69191914848914848914848 +914848914848914848914848914848914848914848916d6db66d6d916d6d +9148489148486d48486d4848914848916d6d916d6db66d6d916d6d916d6d +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d4848914848914848914848914848914848914848 +9148486d48489148486d48489148486d4848914848914848914848914848 +6d48489148489148489148486d48486d48489148486d48486d48486d4848 +6d48489148489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d24246d24246d4848 +6d48486d48486d48486d48486d48486d24246d24246d48486d48486d4848 +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffffdaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffdadaffb6b6 +dab6b6dab6b6dab6b6da9191da9191dab6b6da9191da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b69191 +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6ddab6b6 +ffdadadab6b6b66d6d914848916d6d914848916d6d916d6d916d6d914848 +6d48486d24246d48486d4848916d6db69191b66d6d916d6db66d6d916d6d +916d6d6d48486d48486d48486d48486d48486d48486d4848914848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d9148486d48486d48486d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d4848914848916d6d916d6db66d6db66d6db69191b69191b69191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191da9191 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +dab6b6dab6b6da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b66d6db66d6db69191dab6b6da9191916d6d916d6d6d4848 +916d6d914848916d6d914848916d6d914848b66d6db66d6db69191b66d6d +916d6d916d6d9148489148489148489148489148489148486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d4848914848 +6d48486d48486d48486d48486d48486d48489148489148486d48486d4848 +9148489148486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d24246d48486d4848 +6d48486d48486d48486d24246d24246d48486d24246d24246d24246d4848 +ffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffdadaffdadaffdadaffb6b6ffdadaffb6b6ffb6b6 +dab6b6da9191da9191da9191dab6b6da9191da9191da9191da9191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6dda9191 +ffb6b6dab6b6b66d6d916d6d914848914848914848914848916d6d914848 +6d48486d48486d24246d2424916d6d916d6db66d6db66d6db66d6db66d6d +916d6d6d48486d48486d48486d24246d48486d24246d48486d4848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6d916d6d6d48486d48486d24246d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d4848914848916d6db66d6db66d6db69191b69191b69191b69191da9191 +da9191da9191da9191b69191b69191b66d6db69191b66d6db66d6db66d6d +b69191da9191dab6b6dab6b6dab6b6da9191da9191b69191b69191b69191 +da9191da9191b69191da9191da9191b69191b69191b66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6db66d6db66d6d916d6db69191ffb6b6b66d6d914848914848914848 +914848916d6d914848914848914848916d6db66d6db66d6db66d6db66d6d +b66d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148489148489148486d4848914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48486d48489148489148489148486d48486d48486d48486d48486d4848 +9148486d48486d48489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d2424 +6d24246d24246d48486d48486d24246d48486d24246d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6 +ffb6b6ffdadaffdadaffffdaffdadaffdadaffb6b6dab6b6ffdadadab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6db69191 +ffb6b6ffb6b6b69191914848916d6d916d6d914848916d6d916d6d916d6d +9148489148486d48486d2424914848b66d6db66d6db69191b66d6db66d6d +b66d6d916d6d9148486d48486d24246d48486d48486d48486d4848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d6d48486d48486d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d48486d2424 +6d2424914848916d6d916d6db66d6db69191b69191b69191da9191dab6b6 +ffb6b6ffb6b6dab6b6da9191b69191b69191b69191b69191da9191b69191 +b69191b69191da9191ffb6b6dab6b6dab6b6da9191dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b66d6db66d6ddab6b6ffb6b6b66d6d916d6d6d4848916d6d +914848914848914848914848914848914848916d6db69191b69191b66d6d +b66d6d914848914848914848914848914848916d6d916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148489148489148489148486d4848914848 +9148489148489148489148486d48489148489148486d48486d48486d4848 +6d48486d48489148489148489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d24246d48486d48486d48486d48486d24246d48486d48486d4848 +6d48486d48486d24246d24246d24246d48486d48486d24246d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6ffb6b6 +ffdadaffdadaffdadaffdadaffdadaffdadaffdadadab6b6ffb6b6dab6b6 +da9191dab6b6dab6b6dab6b6dab6b6da9191b69191b69191da9191b69191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b66d6db66d6db69191b69191b66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d +ffb6b6ffb6b6b69191916d6d914848916d6d916d6d916d6d916d6d916d6d +916d6d9148486d48486d48486d4848da9191b69191da9191b66d6db69191 +b66d6d916d6d6d48486d48484824246d48486d24246d48486d4848914848 +914848916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6d9148486d48486d48486d48486d2424 +6d48486d24246d24246d24246d24246d48486d24246d24246d24246d4848 +6d48486d24246d48486d24246d24246d24246d48486d48486d24246d2424 +6d4848914848916d6d916d6db66d6db66d6db69191da9191ffb6b6ffb6b6 +ffdadaffb6b6dab6b6da9191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191da9191dab6b6da9191dab6b6b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6d916d6ddab6b6ffb6b6b66d6d6d48489148486d4848 +9148489148489148486d4848914848914848916d6db66d6db66d6db66d6d +916d6d914848914848914848916d6db66d6db69191b69191b66d6d914848 +914848914848914848914848914848914848914848914848914848914848 +916d6db66d6d916d6d916d6d914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +9148489148489148489148489148489148489148486d48486d4848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48489148489148489148489148486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +ffffdaffffdaffffdaffffffffffdaffffdaffffdaffffdaffffdaffffff +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffffda +ffdadaffdadaffb6b6ffb6b6ffdadaffdadaffdadaffdadaffb6b6dab6b6 +dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b69191b69191b66d6db66d6db69191b69191b66d6d +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6d916d6db66d6d +dab6b6ffdadada9191b66d6d914848916d6d914848916d6d916d6d916d6d +916d6d9148486d48486d2424914848b69191ffb6b6da9191da9191b66d6d +b691919148486d48486d24246d48486d24246d48486d24246d48486d4848 +914848916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6d9148486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +914848914848916d6d916d6db66d6db66d6dda9191dab6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6da9191b69191b69191b69191b69191b69191b69191 +da9191b69191b66d6db69191b69191dab6b6dab6b6dab6b6da9191da9191 +da9191b69191da9191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b66d6db69191ffb6b6ffb6b6da9191914848914848914848 +916d6d916d6d916d6d914848916d6d914848916d6d916d6d914848916d6d +914848914848914848916d6d916d6dda9191dab6b6ffb6b6da9191b66d6d +914848914848914848914848914848914848914848914848914848916d6d +b69191b69191b69191b66d6db66d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148486d48489148486d4848914848914848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffb6b6 +ffb6b6dab6b6ffb6b6ffdadaffdadaffdadaffdadaffdadadab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191b69191da9191 +b69191da9191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +dab6b6ffdadadab6b6b66d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d9148486d48484824246d2424b66d6ddab6b6dab6b6da9191b69191 +916d6d9148486d48486d24246d24246d48486d48486d48486d24246d4848 +914848914848916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6d916d6d916d6d9148486d48486d48486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d24246d24246d24246d48486d24246d24246d4848 +6d4848914848916d6d916d6d916d6db66d6db69191dab6b6da9191dab6b6 +da9191da9191b69191b69191b66d6db66d6db66d6db69191b69191b69191 +da9191da9191b69191b66d6db66d6db66d6db69191da9191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db69191b69191b69191b69191b69191b66d6db66d6db66d6d +b69191b69191b66d6db69191ffb6b6dab6b6b66d6d916d6d916d6d914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848916d6db66d6ddab6b6ffb6b6ffb6b6dab6b6b69191 +916d6d6d48489148486d4848914848914848914848914848914848b66d6d +b69191b69191b69191b69191b66d6d916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48489148489148489148489148486d48486d48486d4848 +6d48489148489148489148489148489148486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d48486d48486d24246d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffb6b6 +ffdadaffdadaffdadaffdadaffdadaffdadaffdadaffb6b6dab6b6dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191da9191da9191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db69191b66d6db66d6db66d6db69191b66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +dab6b6ffdadadab6b6916d6d9148486d4848914848916d6d916d6d916d6d +916d6d916d6d6d48486d2424482424914848da9191ffb6b6dab6b6da9191 +916d6d916d6d6d24246d24246d24246d48486d24246d48486d48486d4848 +6d4848914848916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6d9148486d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d24246d24246d24246d48486d48486d48486d2424 +6d4848914848914848916d6d916d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +dab6b6dab6b6dab6b6da9191b69191b66d6db69191da9191dab6b6da9191 +dab6b6b69191b69191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191da9191dab6b6da9191916d6d916d6d914848916d6d +916d6d916d6d914848916d6d914848914848914848914848914848914848 +914848914848914848916d6db66d6ddab6b6ffb6b6ffb6b6dab6b6b69191 +916d6d914848914848914848914848914848914848914848914848b66d6d +b66d6db69191b69191b69191916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148489148489148486d48486d48486d48486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148489148486d4848 +6d48486d48486d48486d4848914848916d6db66d6db66d6d914848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d24246d48486d48486d48486d48486d48489148486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffffdaffdadaffdadaffdadaffdadaffb6b6ffb6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b69191b66d6db66d6db69191b69191b66d6db69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +da9191ffb6b6ffb6b6b66d6d914848914848914848916d6d914848b66d6d +916d6db66d6d6d48486d48484824246d2424916d6ddab6b6dab6b6ffb6b6 +b69191b66d6d9148486d24246d24246d24246d24246d24246d24246d4848 +6d4848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6d916d6d +b66d6db66d6db66d6d916d6d9148486d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d48486d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d4848916d6d916d6db66d6db66d6db69191b69191b66d6d +b69191b69191b69191b69191b66d6d916d6db66d6db66d6db69191b69191 +da9191da9191dab6b6dab6b6b69191b66d6db66d6dda9191da9191da9191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db69191b69191b69191dab6b6b69191914848916d6d916d6d914848 +916d6d914848916d6d914848916d6d914848914848914848914848914848 +914848914848914848914848b66d6dda9191dab6b6dab6b6da9191b66d6d +916d6d916d6d914848916d6d914848914848914848914848914848916d6d +916d6db66d6db66d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148486d4848914848914848914848914848 +6d48489148486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48489148489148486d48486d48486d48486d4848914848 +6d48486d48486d4848914848916d6db66d6db69191b69191b66d6d914848 +9148486d24246d48486d48489148489148486d4848914848914848914848 +9148486d48486d48486d48486d48489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffffffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191da9191da9191da9191b69191b69191b66d6d +b66d6db66d6db69191b69191b69191b66d6db66d6db69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6dffb6b6ffdadada91919148489148486d2424916d6d916d6db66d6d +916d6db66d6d9148486d48486d24246d24246d4848da9191dab6b6ffb6b6 +dab6b6b66d6d9148486d48486d24244824246d48486d24246d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6d916d6d9148489148486d48486d48486d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d4848914848914848916d6db66d6db66d6db69191b66d6d +b69191b69191da9191da9191b66d6db66d6db66d6db69191b69191b69191 +da9191da9191da9191dab6b6da9191da9191b69191b69191da9191dab6b6 +dab6b6da9191da9191da9191b69191da9191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b66d6d +b69191b69191b69191b69191da9191916d6d916d6d914848916d6d914848 +916d6d914848916d6d916d6d914848916d6d914848914848914848914848 +914848914848914848914848916d6db66d6db66d6db66d6db66d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48489148489148486d48486d48486d4848 +9148486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d4848914848b66d6db66d6db66d6db69191b69191916d6d +9148486d48486d48486d48486d48489148486d4848914848914848914848 +9148489148486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d24246d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffb6b6dab6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191b66d6db66d6d +b66d6db66d6db69191b69191b66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6ddab6b6ffb6b6dab6b6b66d6d9148489148486d4848914848914848 +916d6d916d6d9148486d48486d48484824246d2424b66d6ddab6b6dab6b6 +ffb6b6b69191916d6d916d6d6d48486d24246d48486d24246d24246d4848 +6d48486d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6db66d6d916d6d9148489148486d48486d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d4848914848914848916d6db66d6db66d6db69191 +b69191da9191da9191da9191b69191b66d6d916d6db66d6db69191b69191 +b69191b69191b69191da9191dab6b6da9191b69191b69191b69191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b66d6db66d6db66d6d +b66d6db66d6db69191b69191b66d6d916d6d914848916d6d916d6d916d6d +916d6d916d6d914848916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d48486d48486d4848 +9148489148489148489148489148486d48489148486d48486d4848914848 +6d48486d48489148489148489148489148486d4848914848914848914848 +6d48486d48486d4848914848916d6db66d6db69191b69191914848916d6d +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffb6b6dab6b6ffdadaffb6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191da9191da9191b69191b69191b66d6d +b66d6db66d6db69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db69191ffb6b6ffb6b6da9191b691919148486d2424916d6d914848 +b66d6d914848916d6d6d48486d48486d24244824246d2424dab6b6dab6b6 +ffb6b6dab6b6b69191b66d6d9148486d24246d24246d48486d24246d4848 +6d48486d48486d4848914848914848916d6d914848916d6d916d6d916d6d +916d6db66d6d916d6d9148489148486d48489148486d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d4848914848916d6db66d6db66d6db69191 +dab6b6dab6b6dab6b6b69191b69191b66d6db69191b69191da9191da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191da9191 +da9191da9191da9191da9191b69191b69191da9191b69191b69191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b69191b66d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d914848916d6d914848916d6d914848914848914848 +914848916d6d914848916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d4848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +9148486d48486d48489148486d48486d48486d48486d48486d4848914848 +9148489148489148486d48489148486d48489148486d48486d48486d4848 +6d48486d48486d48486d4848914848916d6db66d6d916d6d9148486d2424 +6d48486d48486d48486d48486d48486d48489148489148486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffb6b6ffb6b6ffb6b6ffdadadab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191dab6b6dab6b6da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db69191ffb6b6ffb6b6dab6b6da91919148486d48486d4848914848 +916d6d916d6d916d6d9148486d48486d48484824246d2424da9191ffb6b6 +ffb6b6ffb6b6da9191da91916d48486d48486d24246d48486d24246d4848 +6d24246d48486d48486d48486d4848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d9148489148489148486d48486d48486d48486d2424 +6d24246d48486d24246d24246d24246d24246d48486d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d24246d24246d24246d2424 +6d24246d48486d4848914848914848914848916d6d916d6db66d6dda9191 +dab6b6dab6b6da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848914848914848914848916d6d916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48489148486d48486d48486d48489148486d4848 +9148486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffb6b6ffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6dab6b6da9191 +da9191da9191dab6b6dab6b6dab6b6da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6dda9191ffb6b6ffb6b6dab6b6b691919148486d4848914848 +914848916d6d6d48489148486d24246d48486d24246d2424b66d6dffb6b6 +dab6b6dab6b6da9191b69191916d6d6d48486d24246d48486d48486d4848 +6d48486d48486d48486d48486d48486d4848914848914848914848916d6d +916d6d916d6d9148489148489148489148486d48486d48486d48486d4848 +6d24246d48489148486d48486d48486d24246d24246d48486d24246d2424 +6d24246d24246d48486d48489148489148486d48486d24246d24246d2424 +6d24246d4848916d6d916d6db66d6db66d6db66d6db66d6db69191da9191 +dab6b6dab6b6dab6b6da9191da9191da9191b69191da9191b69191da9191 +b69191b69191b69191b69191da9191b69191da9191b69191b69191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191da9191da9191b69191b69191b66d6db66d6db69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +914848916d6d914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d916d6d916d6d914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148486d48486d48486d48486d48489148486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d4848914848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdada +ffdadaffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +da9191dab6b6da9191dab6b6da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db69191b69191b69191b66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6ddab6b6ffdadaffdadaffb6b6b66d6d916d6d6d2424914848 +9148486d48486d48486d48486d48486d48486d2424482424916d6ddab6b6 +dab6b6dab6b6dab6b6b66d6d9148486d48486d48486d24249148486d4848 +6d48486d24246d48486d24246d48486d48486d48486d4848914848914848 +916d6d916d6d916d6d916d6d916d6d9148489148489148486d4848914848 +9148489148489148489148486d48486d48486d24246d48486d24246d2424 +6d24246d48486d48486d48486d48489148486d48486d48486d24246d2424 +6d2424914848916d6db66d6db69191b69191b69191b69191b66d6db69191 +da9191dab6b6dab6b6da9191da9191da9191da9191b69191da9191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191b69191b66d6d +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d914848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848 +914848916d6d914848916d6d914848916d6d914848914848914848914848 +914848914848916d6d914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848916d6d +b66d6db66d6d916d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148489148489148486d48486d48486d48486d48489148486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffdadaffdadaffdadaffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db69191ffb6b6ffdadaffb6b6b66d6d6d4848914848914848 +b66d6d6d48486d48486d24246d48486d48486d24246d24246d4848da9191 +ffb6b6dab6b6dab6b6916d6d9148486d24246d48486d24249148486d4848 +6d24246d24246d24246d24246d24246d24246d48486d4848914848914848 +914848914848916d6d916d6d916d6d9148486d48489148486d4848914848 +916d6d916d6db66d6d916d6d916d6d916d6d9148486d4848914848914848 +914848914848914848916d6d9148486d48486d48486d48486d48486d2424 +6d2424916d6d916d6db66d6db66d6dda9191b69191b69191b66d6dda9191 +da9191dab6b6dab6b6dab6b6dab6b6da9191da9191b69191da9191b69191 +da9191da9191b69191b69191da9191da9191da9191b69191b69191b69191 +b69191da9191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848b69191 +b69191b69191b69191b66d6d9148489148486d4848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +9148486d48489148489148486d48486d48489148486d48489148486d4848 +6d48489148489148486d48489148486d48489148486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +9148486d48489148489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffdadaffffdaffdadaffdada +ffdadaffb6b6ffb6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191b69191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6d916d6db66d6ddab6b6ffdadaffb6b6b69191916d6d914848916d6d +b66d6d916d6d6d48486d48486d24246d48486d24246d24246d4848b69191 +dab6b6ffb6b6dab6b6b691919148489148486d24246d48486d24246d4848 +6d24246d48486d48486d48486d48486d48486d48486d48486d4848914848 +914848914848914848914848916d6d914848914848914848916d6d916d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d9148489148486d48486d48486d2424 +6d4848914848916d6db66d6db69191da9191da9191b66d6db66d6db66d6d +da9191da9191dab6b6da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191da9191da9191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b69191b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +914848916d6d916d6d914848914848914848914848914848916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848916d6d914848914848914848914848914848b66d6db66d6d +b69191b69191b69191916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d4848914848 +6d48486d48489148489148489148489148486d48486d48486d4848914848 +6d48489148486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffda +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdada +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b69191b66d6d +b69191b66d6db69191b69191b66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6dffb6b6ffb6b6dab6b6b66d6d916d6db66d6d +b69191b66d6d9148486d48486d48486d48486d48486d48486d2424916d6d +dab6b6ffb6b6da9191da91919148486d48484824246d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d24246d48486d4848 +914848914848914848916d6d9148489148486d4848914848914848916d6d +916d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d9148489148486d48486d4848 +6d4848916d6d916d6db66d6db69191da9191dab6b6b69191b69191b66d6d +da9191da9191dab6b6da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191da9191da9191b69191da9191da9191b69191 +b69191b69191da9191da9191da9191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b69191 +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +914848914848914848914848914848914848914848914848916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848b66d6db66d6d +b69191b69191b69191916d6d914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48486d48486d48486d48486d48489148486d48486d48489148486d4848 +6d48486d48486d48486d48489148486d48486d48489148486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +9148486d48486d48489148486d48489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffffffffffffffda +ffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdadaffb6b6ffdada +ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191dab6b6da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db69191ffb6b6ffb6b6da9191916d6db66d6d +b66d6db66d6d916d6d9148489148486d48486d48486d2424482424914848 +dab6b6ffb6b6dab6b6b69191916d6d6d24246d48486d24246d48486d2424 +6d48486d24246d48486d24246d48486d48486d48486d48486d48486d4848 +9148489148489148489148486d48486d48486d4848914848914848916d6d +916d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d9148489148486d4848914848 +914848916d6d916d6db66d6dda9191dab6b6dab6b6da9191b66d6db66d6d +b66d6dda9191da9191dab6b6da9191dab6b6da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191da9191da9191b69191 +b69191b69191b69191b69191da9191da9191b66d6db66d6db66d6db69191 +b69191b69191b69191b66d6db69191b66d6db69191b69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d914848916d6d914848916d6d916d6d916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848916d6d916d6d +b66d6db66d6d916d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffffdaffffdaffffdaffffdaffffdaffdadaffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b66d6db69191 +b66d6db69191b69191b66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6ddab6b6ffb6b6ffb6b6b66d6d916d6d +916d6db69191916d6d9148489148489148486d48486d24246d24246d4848 +da9191ffb6b6dab6b6b69191916d6d6d24246d48484824246d24246d2424 +6d48486d24246d48486d48486d48486d48486d24246d48486d48486d4848 +9148489148489148489148486d48486d24246d48486d4848914848916d6d +b66d6d916d6d916d6d914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848916d6d +914848916d6d916d6db66d6dda9191dab6b6dab6b6da9191b69191b66d6d +916d6db69191da9191dab6b6da9191dab6b6da9191b69191b69191da9191 +b69191b69191da9191da9191da9191da9191b69191da9191da9191da9191 +da9191b69191b69191b69191da9191b69191b69191b66d6db69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848 +914848914848914848916d6d914848914848914848914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48486d4848914848914848914848914848 +9148486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48489148486d4848914848 +6d48486d48486d48489148486d48486d48489148489148489148486d4848 +9148486d48489148486d48486d48486d48486d48486d48489148486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffffdaffdadaffffdaffffdaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6da9191 +dab6b6dab6b6da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b69191b69191b69191b69191b66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6db66d6db66d6db66d6d916d6db69191dab6b6ffffdadab6b6b69191 +b69191b66d6db66d6d914848916d6d9148489148486d48484824246d2424 +da9191dab6b6ffb6b6da9191916d6d6d48486d24246d24246d24246d4848 +6d24246d48486d24246d48486d48486d24246d24246d24246d48486d4848 +6d48486d48489148486d48486d48486d24246d48486d4848914848916d6d +b66d6db66d6d9148489148486d4848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d916d6d914848914848916d6d916d6d +916d6d916d6db66d6db66d6dda9191da9191dab6b6da9191b69191b66d6d +b66d6db66d6dda9191da9191dab6b6da9191da9191b69191b69191b69191 +b69191da9191da9191da9191da9191da9191b69191da9191da9191da9191 +da9191da9191b69191b69191b69191da9191b69191b66d6db66d6db69191 +b69191b66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848916d6d914848914848914848914848 +914848916d6d916d6d914848914848914848914848914848916d6d916d6d +914848914848916d6d914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d48489148486d4848 +6d48486d48486d48486d48486d48489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48489148489148486d48486d4848 +6d48486d48486d48486d48486d24246d48486d48486d4848914848914848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffdadaffffdaffffdaffffdaffdadaffdadaffffdaffffdaffdadaffdada +ffb6b6ffb6b6ffdadadab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db69191b66d6db69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6db66d6dda9191ffdadaffb6b6 +da9191b66d6db66d6d9148489148486d48486d48486d48486d2424482424 +916d6ddab6b6dab6b6dab6b6b691919148484824246d48484824246d4848 +6d24246d48486d24246d48486d48486d48486d24246d48486d24246d2424 +6d24246d48486d48486d48486d48486d24246d24246d4848914848916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6db66d6db69191da9191dab6b6da9191b69191b66d6d +b66d6db66d6dda9191da9191dab6b6da9191da9191da9191da9191b69191 +b69191da9191da9191da9191da9191da9191b69191da9191da9191da9191 +da9191da9191b69191b69191b69191da9191b69191b69191b69191b66d6d +b69191b69191b69191b66d6db66d6db69191b69191b69191b69191b69191 +b69191b66d6d916d6d916d6d914848916d6d916d6d916d6d914848916d6d +914848914848916d6d914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +9148489148486d48486d48489148486d48486d48489148486d4848914848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d48489148489148486d48486d48486d48486d4848 +9148489148486d48486d48486d48486d48486d48486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d48486d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffffda +ffffdaffffdaffdadaffdadaffdadaffdadaffffdaffdadaffdadaffffda +ffdadaffb6b6ffdadaffb6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191b69191da9191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b66d6db69191b69191 +b69191b66d6db66d6db66d6db69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6dffb6b6ffb6b6 +ffb6b6da9191b691919148489148486d48486d48486d48486d48486d2424 +916d6ddab6b6dab6b6dab6b6da9191916d6d6d48486d24246d48486d2424 +6d48486d48486d48486d48486d48486d24246d24246d24246d48486d2424 +6d48486d48486d24246d48486d24246d48486d24246d4848914848916d6d +9148489148489148486d4848914848914848916d6d914848914848914848 +914848914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6db66d6db66d6db69191da9191dab6b6da9191b69191b69191 +b66d6db69191da9191dab6b6dab6b6dab6b6da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191da9191 +da9191da9191b69191b69191b66d6db69191b69191b69191b66d6db66d6d +b69191b66d6db66d6db66d6db69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d914848916d6d914848914848916d6d916d6d914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48489148489148486d48489148486d48486d48486d48486d48486d4848 +9148489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffdadaffffdaffdadaffffdaffffdaffffdaffdadaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6da9191 +da9191b69191b69191da9191b69191da9191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db69191b69191b66d6db66d6db66d6db66d6d +916d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db69191dab6b6 +ffdadaffdadada9191916d6d9148486d48486d48486d48486d48486d2424 +914848dab6b6ffb6b6dab6b6ffb6b6b66d6d6d48486d24246d48486d2424 +6d48486d24246d24246d24246d24246d24246d24246d24246d48486d2424 +6d48486d48486d24246d24246d24246d24246d24246d2424914848916d6d +9148486d48486d4848914848914848914848916d6d9148486d4848914848 +6d48486d48486d4848914848916d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db69191da9191da9191da9191b66d6db69191 +b66d6db69191da9191da9191da9191da9191b69191b69191b69191da9191 +b69191b69191da9191b69191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191da9191da9191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b69191b66d6d +b69191916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148486d48486d48489148489148489148486d48486d4848 +6d48486d48489148486d48489148486d48486d48486d48486d48486d4848 +6d48486d48489148489148486d48489148486d48486d48486d4848914848 +9148489148489148486d48486d48489148489148489148486d4848914848 +9148486d48489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffdadaffffdaffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdada +ffdadaffdadaffdadaffffdaffffdaffffdaffdadaffdadaffdadaffb6b6 +ffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b66d6d916d6d916d6d +b69191dab6b6ffb6b6b69191916d6d9148486d24249148486d2424914848 +b69191da9191ffdadaffb6b6ffb6b6b66d6d9148486d48486d24246d4848 +6d48486d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848914848 +6d48489148486d4848914848914848916d6d9148489148489148486d4848 +9148486d4848914848914848916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191da9191da9191b69191b69191 +b69191b69191da9191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b69191 +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848916d6d916d6d914848914848914848 +914848914848916d6d916d6d916d6d914848916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d4848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148486d4848914848 +9148486d48486d48486d48486d48486d48486d48486d4848914848914848 +ffb6b6ffffdaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffffda +ffffdaffdadaffdadaffb6b6ffdadaffdadaffdadaffb6b6ffdadaffdada +ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191b69191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6db69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6db66d6db66d6d916d6d916d6d916d6d +b66d6db66d6db66d6db69191b69191b69191b69191b66d6d916d6d916d6d +916d6db66d6dda9191da9191b69191b66d6d916d6d916d6d916d6db66d6d +b69191da9191ffb6b6ffb6b6da9191b691916d24246d48484824246d4848 +6d24246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d48486d48486d4848914848916d6d9148489148489148489148486d4848 +6d48486d48486d4848914848916d6d914848916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191da9191 +b69191b69191b66d6db66d6db66d6d916d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6d916d6d916d6d916d6d916d6d +b66d6db66d6db69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d914848 +914848916d6d914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848916d6d914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148489148489148489148486d4848914848914848 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48489148489148489148489148489148486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +ffb6b6ffffdaffffdaffffdaffdadaffdadaffdadaffb6b6ffdadaffffda +ffffdaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdada +ffb6b6ffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191da9191b69191b69191da9191da9191 +b69191b69191b69191b69191da9191b69191b66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191916d6db66d6d +916d6db66d6db66d6db69191b69191da9191b69191da9191b69191b66d6d +916d6dda9191ffb6b6ffdadaffb6b6b691919148486d48486d24246d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d4848914848914848916d6d916d6d916d6d9148486d48486d4848 +6d48486d48486d4848914848916d6d914848916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6d916d6d +b66d6db66d6db69191b69191b69191b69191b69191da9191b69191b66d6d +b69191b66d6db69191b69191b69191b69191b69191b66d6db69191b66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +914848914848914848914848914848914848916d6d916d6d916d6d914848 +916d6d916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +914848914848916d6d914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848916d6db66d6d916d6d916d6d916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d4848914848914848 +6d48486d48486d48486d48486d48489148486d48489148489148486d4848 +6d48486d48489148489148486d48486d48486d48486d48486d4848914848 +6d48486d48489148489148486d48486d48486d48486d48486d4848914848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdada +ffdadaffffdaffdadaffffdaffffdaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191 +da9191b69191b69191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +916d6db66d6db66d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db69191b69191b69191b69191b66d6d916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d916d6d +916d6db69191dab6b6ffb6b6ffb6b6b69191916d6d4824246d24246d2424 +6d48486d24246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d48486d4848914848916d6d916d6d916d6d9148489148486d48486d4848 +6d24246d48486d4848914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191 +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b69191b69191b69191b69191b66d6db66d6d +b66d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6db69191b69191b69191b69191b66d6d9148489148486d4848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48489148486d48489148486d48486d48486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +9148489148486d48489148489148486d48489148489148486d4848914848 +6d48489148486d48486d48489148486d48486d48486d48486d48486d4848 +6d48489148489148486d48489148486d48486d48486d24246d48486d4848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffdadaffdadaffffdaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191b69191b69191da9191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db69191ffb6b6dab6b6ffdadab69191916d6d6d24246d24246d2424 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d6d48486d48486d2424 +6d48486d48489148486d4848914848914848914848914848914848916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848916d6d +914848914848916d6d914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848b66d6db69191da9191da9191da9191b69191916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148489148489148489148489148489148486d24246d48486d4848914848 +ffb6b6ffffdaffffdaffffdaffffdaffdadaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffdada +ffdadaffb6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191b69191b69191da9191b69191b69191b69191 +b66d6db69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6d916d6d +916d6d916d6db66d6d916d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d916d6db66d6db66d6d916d6db66d6d916d6db66d6d916d6d916d6d +914848916d6ddab6b6ffb6b6ffdadada91919148486d24244824246d4848 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d6d48486d24246d2424 +6d24246d24246d48486d48486d48486d48489148486d4848914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191da9191da9191da9191b69191 +b69191da9191da9191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b66d6db69191b69191b66d6db66d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6db66d6db69191b69191da9191b66d6d916d6d914848914848 +9148489148486d48486d48486d48486d48489148486d48486d48486d4848 +9148489148486d48486d48486d48489148486d48486d48486d48486d4848 +6d48486d48489148486d48489148486d48489148486d48486d48486d4848 +9148486d48486d48486d48486d48489148486d48486d48489148486d4848 +6d48489148486d48486d48486d48486d48489148489148486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +9148486d48489148489148486d48486d48486d48486d24246d48486d4848 +dab6b6ffffdaffdadaffdadaffdadaffdadaffffdaffffdaffffdaffffda +ffffdaffdadaffdadaffdadaffdadaffb6b6ffdadaffdadaffdadaffdada +ffb6b6ffb6b6ffb6b6ffb6b6ffdadaffb6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6d +916d6d916d6dda9191ffb6b6ffb6b6dab6b69148489148486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d48486d4848 +914848914848916d6d916d6d916d6d916d6d916d6d9148486d24246d4848 +6d24246d24246d24246d48486d24246d4848914848914848916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191da9191b69191da9191dab6b6dab6b6da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6d916d6d +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848916d6db66d6db69191b66d6d916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148486d48489148486d48486d4848 +6d48486d48486d48489148489148486d48486d48486d48486d48486d4848 +9148486d48486d48489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148489148486d48486d4848914848914848 +ffb6b6ffffdaffdadaffdadaffffdaffffdaffffffffffdaffffdaffffda +ffffdaffffdaffffdaffffdaffdadaffdadaffdadaffdadaffdadaffdada +ffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191dab6b6da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6d916d6d916d6d916d6db66d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6db66d6d +b66d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6d916d6d +916d6d916d6db66d6dffb6b6ffdadaffb6b6b691916d48484824246d2424 +6d24244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d9148486d48486d24246d2424 +6d24246d24246d24246d24246d48486d48486d4848914848916d6d916d6d +916d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b69191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +914848916d6d914848916d6d914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848916d6db66d6d916d6d914848914848914848914848 +9148489148486d48489148489148486d48489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +6d48486d48489148486d48486d48486d48489148486d48486d4848914848 +6d48489148486d48489148489148489148486d48486d48486d48486d4848 +6d48486d48489148486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48489148486d4848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffffdaffffdaffffdaffdadaffdadaffdadaffdadaffffdaffdadaffb6b6 +ffdadaffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6ddab6b6ffb6b6ffb6b6da91916d2424914848482424 +9148484824246d48484824246d48486d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6db66d6d916d6d9148486d48486d48486d2424 +6d24246d24246d24246d24246d4848914848914848914848916d6d916d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b69191b69191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b66d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48489148489148489148486d4848 +9148486d48486d48486d48486d48486d48486d48486d4848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d4848914848 +dab6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffffdaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffdadaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b66d6db69191b66d6db69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6d916d6db66d6d +916d6db66d6db66d6db66d6d916d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6db69191dab6b6ffb6b6da91919148484824246d4848 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848914848 +916d6d916d6d916d6db66d6db66d6d916d6d6d48486d24246d24246d2424 +6d24246d24246d24246d24246d48486d4848914848914848916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d916d6d916d6db66d6db66d6db66d6db66d6db69191b69191b66d6d +b66d6db69191b69191b69191b69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d914848 +916d6d914848916d6d914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48489148489148486d4848 +6d48489148486d48486d48486d48486d48486d48489148486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48489148489148489148489148486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d4848914848914848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffda +ffdadaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffb6b6 +ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191dab6b6da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6d +916d6d916d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6dffb6b6ffb6b6dab6b6b66d6d6d2424914848 +4824246d48486d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848916d6d +916d6d916d6d916d6db66d6db66d6d916d6d9148486d48486d24246d4848 +6d24246d24246d24246d48486d4848914848914848914848916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848916d6d +916d6d914848914848914848916d6d914848916d6d916d6d914848916d6d +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48486d48486d48486d48486d4848 +6d48486d48489148489148489148486d48486d48486d48486d4848914848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d4848914848 +ffb6b6ffffdaffffdaffffdaffffdaffffdaffffdaffffdaffffdaffdada +ffdadaffdadaffffdaffdadaffdadaffdadaffdadaffdadaffdadaffdada +ffdadaffb6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191da9191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6d916d6db66d6db66d6d916d6d916d6db66d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d +b66d6d916d6d916d6d916d6dda9191ffdadadab6b6b691916d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848916d6d +916d6d916d6db66d6db66d6db66d6d9148489148486d24246d24246d4848 +6d24246d24246d24246d24246d24246d4848914848914848914848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b69191 +b69191b66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848916d6d +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d4848914848 +6d48486d48486d48486d48486d48489148486d48489148486d48486d4848 +9148489148489148486d48486d48486d48486d48486d48486d4848914848 +6d48486d48489148486d48486d48489148486d48486d48489148486d4848 +6d48486d48486d48489148486d48489148486d48489148486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +ffb6b6ffdadaffdadaffb6b6ffdadaffdadaffdadaffffdaffffdaffdada +ffdadaffdadaffffdaffdadaffdadaffdadaffdadaffdadaffb6b6ffdada +ffdadadab6b6dab6b6da9191dab6b6dab6b6dab6b6dab6b6da9191b69191 +da9191b69191da9191b69191da9191da9191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6db66d6db66d6db66d6d916d6db66d6d +916d6d916d6db66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6dffb6b6ffb6b6b69191916d6d6d2424 +6d48484824246d48486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d9148486d48486d48486d4848 +6d48486d24246d24246d24246d4848914848914848916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db69191b69191b66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848 +914848916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d914848 +914848914848916d6d914848914848914848916d6d914848914848914848 +916d6d914848916d6d916d6d914848914848916d6d916d6d914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48486d48486d4848914848914848914848 +6d48489148486d48486d48489148486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48489148486d48486d48486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +ffb6b6ffdadaffdadaffdadaffffdaffdadaffdadaffffdaffffdaffdada +ffffdaffffdaffffdaffdadaffdadaffdadaffb6b6ffdadaffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191da9191da9191da9191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +916d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +916d6d916d6d916d6d916d6db66d6ddab6b6ffb6b6dab6b6b66d6d482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848916d6d +916d6d916d6d916d6d916d6d916d6d916d6d9148486d48486d48486d4848 +6d48486d24246d24246d48486d24246d4848914848914848916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +916d6d914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148489148489148489148486d4848914848 +9148489148486d48486d48489148489148489148489148489148486d4848 +9148489148489148486d48489148489148489148486d4848914848914848 +9148489148489148486d48486d48489148489148489148489148486d4848 +9148486d48489148486d48486d48489148486d48486d48486d48486d4848 +6d48486d48486d48489148486d48486d48486d48486d48486d4848914848 +ffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdadaffdada +ffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +dab6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191b69191da9191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b66d6db69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191ffb6b6ffb6b6ffb6b6b66d6d6d2424 +6d24246d24246d24246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +914848916d6d916d6d916d6d9148489148486d48489148486d48486d4848 +6d48486d48486d48486d4848914848914848914848914848916d6d916d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191 +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848914848914848914848914848 +916d6d916d6d914848914848916d6d914848914848916d6d916d6d914848 +914848914848914848916d6d914848916d6d914848916d6d916d6d916d6d +914848916d6d914848916d6d916d6d916d6d916d6d914848914848916d6d +914848914848916d6d914848914848914848914848914848914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +6d48489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48489148486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48489148486d4848b66d6d +ffdadaffb6b6ffdadaffdadaffdadaffdadaffffdaffdadaffffdaffdada +ffdadaffb6b6ffb6b6ffdadaffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db69191dab6b6dab6b6dab6b6dab6b6dab6b6b66d6d6d4848 +4824246d24244824246d48486d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +9148489148489148489148489148489148486d48486d48486d48486d4848 +6d48486d48486d48486d4848914848914848914848914848916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6d914848916d6d916d6d916d6d916d6d916d6d914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848916d6d914848914848914848914848914848914848914848914848 +916d6d916d6d916d6d914848914848914848914848914848914848916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48489148486d48486d4848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48486d48489148489148486d48486d4848914848 +6d48486d48486d48486d48486d48486d48486d2424b66d6d6d4848b69191 +ffb6b6ffb6b6ffb6b6ffb6b6ffdadaffdadaffdadaffdadaffb6b6ffb6b6 +ffb6b6ffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6da9191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191b69191da9191b69191b69191b66d6db66d6db69191b69191 +b66d6db66d6db69191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191dab6b6ffb6b6ffb6b6dab6b6ffb6b6da9191b69191914848 +6d48486d24246d24246d24246d48486d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +9148486d48489148486d48489148489148486d48486d48486d48486d4848 +6d48486d4848914848914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db69191b69191da9191da9191da9191b69191da9191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d914848 +914848914848916d6d914848916d6d914848914848914848914848916d6d +916d6d914848914848916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d916d6d916d6d914848916d6d916d6d914848916d6d914848916d6d +916d6d916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48486d48486d48486d4848914848 +6d48486d48489148489148486d48486d48486d48489148486d48486d4848 +6d48489148486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848b66d6db69191 +ffb6b6ffb6b6ffdadaffb6b6ffdadaffdadaffb6b6ffdadaffb6b6ffdada +ffb6b6ffdadaffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6ffb6b6ffb6b6 +ffb6b6dab6b6da9191dab6b6dab6b6da9191da9191da9191dab6b6da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d916d6d +b66d6db69191dab6b6dab6b6dab6b6dab6b6ffb6b6dab6b6da9191b66d6d +9148486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d2424914848916d6d6d48486d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d4848914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191da9191da9191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191da9191b69191b69191b66d6db66d6db66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6d916d6d914848916d6d916d6d916d6d914848916d6d +914848916d6d914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848916d6d916d6d916d6d914848916d6d916d6d916d6d +914848916d6d914848914848914848914848914848916d6d916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148489148489148486d4848 +6d48489148489148486d48486d4848914848914848914848914848914848 +6d48486d48486d48486d48486d48486d4848914848914848914848914848 +6d48489148489148489148486d48486d48486d24246d2424916d6db69191 +ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffdadaffb6b6ffdadaffdadaffb6b6 +ffb6b6dab6b6ffb6b6dab6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6ffb6b6 +dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db66d6dda9191dab6b6dab6b6ffb6b6dab6b6dab6b6b69191b69191 +916d6d9148486d24246d48486d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d48486d48489148486d24246d24246d2424 +6d24246d48486d48486d48486d24246d24246d24246d48486d48486d4848 +6d4848914848914848914848916d6d914848916d6d916d6d916d6d916d6d +b66d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d914848 +914848916d6d916d6d916d6d914848916d6d916d6d914848916d6d914848 +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d914848914848 +914848914848914848916d6d914848914848916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48489148489148489148489148489148489148486d48489148486d4848 +6d48486d48486d48486d48489148489148486d48486d48486d4848914848 +9148486d48486d48486d48486d48486d48489148489148486d4848914848 +6d48486d48486d48489148486d48486d48486d24246d4848914848b66d6d +dab6b6ffb6b6ffdadaffdadaffdadaffdadaffdadaffdadaffb6b6ffb6b6 +ffdadaffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6ffb6b6dab6b6 +dab6b6dab6b6dab6b6ffb6b6dab6b6da9191da9191da9191da9191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d916d6d +916d6d916d6db69191da9191dab6b6dab6b6da9191b69191b66d6db66d6d +b66d6db66d6d9148486d48486d48486d24246d24246d24246d24246d4848 +6d24246d24246d24246d24246d24246d48486d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d4848914848916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6d916d6db66d6db66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d914848916d6d914848916d6d914848914848914848914848916d6d +914848914848914848914848914848916d6d914848914848914848916d6d +916d6d916d6d916d6d914848916d6d914848914848916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d4848914848 +9148489148489148486d48489148489148489148489148486d48486d4848 +9148486d48489148489148486d48489148486d4848914848914848914848 +6d48489148489148489148489148489148489148489148489148486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +da9191ffb6b6ffb6b6ffb6b6ffdadaffdadaffdadaffdadaffb6b6ffb6b6 +ffdadaffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191dab6b6da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b69191b69191b66d6d916d6d9148486d24246d4848916d6d914848b66d6d +6d48486d48484824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191da9191b69191b69191b69191da9191b69191b66d6d +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d914848916d6d916d6d916d6d916d6d914848916d6d +914848914848914848916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848914848916d6d914848 +916d6d916d6d914848916d6d916d6d914848916d6d914848914848914848 +914848914848914848916d6d914848916d6d914848916d6d916d6d914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848916d6d914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148486d48486d4848914848 +6d48489148486d48489148486d48489148489148489148486d48486d4848 +6d48486d48486d48489148486d48486d48489148489148486d48486d4848 +6d48486d48486d48486d48489148486d48486d48486d48486d4848914848 +da9191ffb6b6ffb6b6ffb6b6ffdadaffdadaffdadaffdadaffdadaffb6b6 +ffb6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6ffb6b6dab6b6 +dab6b6dab6b6da9191da9191da9191da9191dab6b6da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +916d6d916d6db66d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6d +b69191dab6b6da9191b66d6d6d48486d48486d4848916d6d916d6db66d6d +9148486d48486d24244824246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d4848914848914848916d6d916d6d916d6d916d6d914848914848 +916d6d916d6db66d6db66d6d916d6db66d6db66d6db66d6db69191b69191 +b69191b69191b66d6db69191b69191da9191da9191dab6b6dab6b6da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d914848914848916d6d916d6d916d6d916d6d916d6d916d6d914848 +914848914848916d6d914848914848914848914848914848916d6d914848 +914848914848914848914848916d6d914848914848916d6d914848914848 +914848916d6d914848914848914848914848914848916d6d914848916d6d +914848914848914848914848914848916d6d914848916d6d916d6d914848 +914848914848914848914848914848916d6d916d6d914848916d6d916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d4848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48489148486d4848b66d6d +916d6d916d6d9148489148486d48486d48486d48486d48486d48486d4848 +dab6b6ffdadaffb6b6ffb6b6dab6b6ffb6b6ffdadaffb6b6ffdadaffb6b6 +dab6b6dab6b6ffb6b6ffdadaffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191da9191da9191b69191916d6d916d6d914848914848916d6db66d6d +b69191916d6d6d48486d24246d24246d48489148486d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +6d48486d4848914848914848916d6d9148489148489148486d4848914848 +914848916d6d916d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b66d6db69191b66d6dda9191da9191da9191dab6b6ffb6b6dab6b6 +da9191b69191b69191b69191da9191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +914848914848916d6d916d6d916d6d916d6d914848914848914848916d6d +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d914848916d6d914848914848 +914848914848914848916d6d916d6d916d6d916d6d914848916d6d914848 +916d6d914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +6d48486d4848914848914848914848914848914848916d6d916d6d914848 +9148489148486d48489148486d48486d48486d48486d48486d4848da9191 +da9191da9191b691919148486d48486d48486d48486d48489148486d4848 +da9191ffb6b6dab6b6dab6b6ffb6b6ffb6b6ffdadaffb6b6ffb6b6ffb6b6 +dab6b6ffb6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191da9191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db66d6d916d6db66d6d916d6d916d6d +916d6dda9191dab6b6b69191916d6d914848916d6d914848914848916d6d +b66d6d916d6d9148489148486d48486d4848916d6d9148486d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d24246d4848 +6d48486d48489148489148489148489148486d48489148486d4848914848 +916d6d916d6d916d6d916d6db66d6db66d6db66d6db69191b69191b69191 +b69191b66d6db69191b66d6db69191b69191da9191dab6b6ffb6b6dab6b6 +dab6b6da9191da9191b69191da9191b69191b66d6db69191b66d6db69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191b66d6db69191 +b66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848914848914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d914848914848916d6d916d6d916d6d916d6d916d6d914848914848 +914848914848916d6d916d6d916d6d914848916d6d914848914848916d6d +916d6d914848914848916d6d914848914848914848914848914848916d6d +914848916d6d914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848916d6d916d6d914848914848 +6d48489148489148489148489148486d4848b69191dab6b6ffb6b6da9191 +b69191b691916d48486d48486d48486d48489148486d4848914848da9191 +da9191da9191da9191da91919148486d48486d48486d48486d4848914848 +da9191dab6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6da9191 +da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6b69191da9191da9191da9191b69191b69191 +b69191b69191b69191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191da9191da9191da9191da9191b69191b66d6db66d6d +b66d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6dda9191dab6b6da9191916d6d6d48489148486d48486d48486d4848 +914848916d6db66d6d916d6d914848914848916d6d914848b66d6d916d6d +9148486d48486d24246d48486d24246d48486d24246d48486d24246d4848 +6d48486d48486d48489148489148486d48486d48486d4848914848914848 +916d6d916d6d916d6db66d6db66d6db66d6db66d6db69191b69191da9191 +b66d6db66d6db66d6db66d6db66d6db69191b69191dab6b6dab6b6dab6b6 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +916d6d914848914848916d6d914848914848916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848916d6db66d6d916d6d +9148489148489148486d48486d4848b69191b69191da9191dab6b6da9191 +b69191da91916d48486d24246d48486d48489148486d4848916d6dda9191 +b69191dab6b6b69191da91916d24246d48486d48486d48489148486d4848 +dab6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191b69191 +b69191b69191da9191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b69191dab6b6dab6b6dab6b6dab6b6da9191b69191916d6d +916d6d916d6d916d6d916d6db66d6d916d6db66d6d916d6d916d6d916d6d +916d6db66d6ddab6b6dab6b6b691916d48484824246d48484824246d2424 +6d24246d4848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6d +9148486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d48486d48486d48486d48486d24246d48486d4848914848 +914848916d6d916d6d916d6db66d6db66d6db69191da9191dab6b6da9191 +b69191b66d6db66d6db66d6db66d6db66d6db69191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d +914848916d6d914848914848916d6d914848914848914848916d6d916d6d +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848916d6d914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848b66d6db69191dab6b6da9191b69191 +b691919148489148486d4848914848b66d6dda9191b69191da9191dab6b6 +da9191b691919148486d48486d48486d4848914848b66d6db69191b66d6d +da9191da9191da9191b691919148486d24246d48486d48489148486d4848 +dab6b6ffb6b6ffdadaffdadaffb6b6dab6b6dab6b6ffb6b6ffb6b6ffb6b6 +ffb6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191dab6b6 +da9191dab6b6da9191da9191da9191da9191da9191da9191da9191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191dab6b6dab6b6dab6b6dab6b6dab6b6da9191b69191b66d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6db66d6ddab6b6dab6b6b69191b66d6d4824246d48484824246d2424 +4824246d24246d4848914848916d6d916d6d916d6d916d6db66d6db66d6d +916d6d6d48486d48486d24246d24246d24246d24246d24246d24246d2424 +6d48486d48486d48486d48486d48486d24246d24246d48486d4848914848 +914848916d6d916d6d916d6db66d6db66d6db69191b69191dab6b6da9191 +b69191b66d6db66d6d916d6db66d6db66d6db69191b69191da9191b69191 +b69191da9191b69191b69191b69191b69191b66d6db69191b69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b66d6db69191b66d6d +b66d6db66d6db66d6d916d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d4848914848b69191da9191da9191dab6b6da9191 +dab6b6916d6d6d48486d24246d24246d4848b66d6db69191b69191b69191 +916d6d916d6d9148486d48486d48489148486d48486d4848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d4848914848 +da9191ffb6b6ffb6b6ffdadaffb6b6dab6b6dab6b6ffb6b6ffb6b6dab6b6 +dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191da9191dab6b6 +dab6b6da9191da9191da9191da9191da9191da9191b69191da9191da9191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b69191b66d6db69191b66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191da9191da9191dab6b6dab6b6dab6b6da9191b69191916d6d +916d6db66d6d916d6d916d6db66d6d916d6d916d6db66d6d916d6db66d6d +916d6d916d6db69191dab6b6da9191b66d6d6d24246d24246d24246d2424 +6d24244824244824246d24246d24246d4848914848914848916d6db66d6d +916d6d916d6d9148486d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848914848 +914848916d6d916d6d916d6db66d6db69191b69191da9191dab6b6dab6b6 +da9191b69191b66d6db66d6db66d6db66d6db69191b69191b69191da9191 +b69191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +914848914848914848914848916d6d914848914848914848914848916d6d +914848914848916d6d914848914848914848914848916d6d914848916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d4848914848b66d6dda9191da9191da9191da9191 +da9191916d6d6d24249148486d4848914848914848916d6d916d6d916d6d +9148489148486d48489148489148489148489148489148486d48486d4848 +6d48486d48486d48486d48486d48489148489148486d48486d4848914848 +da9191ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6ffb6b6dab6b6 +dab6b6dab6b6da9191dab6b6da9191da9191da9191dab6b6dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191da9191da9191da9191b69191b66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191dab6b6dab6b6b691919148484824246d4848482424 +6d48484824246d24246d24246d24244824246d24246d4848914848916d6d +b66d6d916d6d9148486d48486d48486d24246d48486d24246d24246d2424 +6d24246d24246d48486d24246d24246d48486d24246d24246d48486d4848 +916d6d916d6d916d6d916d6db66d6db66d6db69191b69191da9191da9191 +da9191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db69191 +b69191b69191b69191b66d6db66d6db69191b66d6db66d6db69191b66d6d +b66d6db69191b66d6db69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d914848916d6d914848916d6d916d6d916d6d914848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +914848916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +914848914848914848916d6d914848916d6d914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d4848914848b66d6db69191b69191da9191da9191 +da91919148486d48486d48489148489148486d48486d48486d48486d4848 +6d48486d48486d4848914848916d6d916d6d916d6d916d6d6d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d4848914848914848 +da9191ffdadaffdadaffb6b6ffb6b6ffb6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191da9191da9191da9191b69191da9191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6db66d6ddab6b6ffb6b6b691919148486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824244824246d24246d4848 +914848916d6d916d6d916d6d6d48486d48486d48486d48486d24246d2424 +6d24246d24246d48486d24246d24246d24246d24246d24246d24246d4848 +914848914848916d6d916d6db66d6db66d6db69191b69191da9191da9191 +b69191b69191b66d6db66d6db66d6db66d6db69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b66d6db69191b66d6db66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d914848916d6d916d6d914848916d6d916d6d +916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848916d6d914848916d6d916d6d914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848916d6d914848b66d6d916d6d +9148489148489148489148489148489148489148486d48489148486d4848 +6d4848916d6d6d4848b69191dab6b6ffb6b6dab6b6dab6b6b691916d4848 +6d48486d48486d48489148486d48489148489148486d48486d48486d4848 +da9191ffb6b6ffb6b6ffb6b6ffb6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6da9191dab6b6dab6b6dab6b6da9191da9191dab6b6 +da9191da9191b69191da9191da9191da9191da9191da9191da9191da9191 +da9191b69191b69191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db69191dab6b6ffb6b6da91919148486d48484824246d4848 +4824246d24246d24246d48486d24246d24244824246d2424482424482424 +6d24246d48486d48489148489148489148489148486d24246d4848482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +914848914848916d6d916d6d916d6db66d6db66d6db69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db69191b69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b69191b66d6d +b69191b66d6db66d6db69191b66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6d916d6d914848916d6d914848914848914848914848916d6d914848 +916d6d916d6d916d6d914848914848916d6d914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d48486d48486d4848 +9148486d48489148489148486d48489148486d48486d48486d4848914848 +914848b66d6dda9191da9191dab6b6dab6b6dab6b6dab6b6da91916d2424 +9148486d48486d48486d48489148486d48486d48486d4848914848914848 +da9191dab6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6dab6b6dab6b6dab6b6dab6b6ffb6b6dab6b6dab6b6dab6b6da9191 +da9191da9191b69191da9191da9191dab6b6da9191da9191da9191da9191 +da9191da9191da9191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6d +b66d6d916d6db66d6dda9191dab6b6dab6b6916d6d6d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24244824246d2424 +4824244824244824246d24246d4848914848916d6d9148486d48486d4848 +6d24246d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d4848914848914848916d6d916d6db66d6db66d6db66d6db66d6db69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +914848916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d914848 +916d6d916d6d916d6d914848916d6d914848914848916d6d914848914848 +914848916d6d914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +916d6db66d6db69191b69191da91919148489148486d4848914848914848 +9148489148486d48489148489148489148486d4848914848914848914848 +6d4848916d6dda9191b69191da9191da9191dab6b6da9191da9191916d6d +914848916d6d9148486d48486d48486d48486d48486d48486d4848914848 +da9191dab6b6dab6b6ffb6b6dab6b6ffb6b6dab6b6dab6b6da9191da9191 +dab6b6da9191dab6b6da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191b69191da9191da9191da9191da9191da9191da9191b69191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6dda9191dab6b6dab6b6b66d6d9148486d48486d2424 +6d24246d24246d24246d24246d24244824246d24246d24246d24246d2424 +6d24246d24246d24244824244824246d24246d48486d48489148486d4848 +6d48486d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d48486d4848914848914848916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6db66d6db66d6db69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d914848914848914848916d6d914848 +914848916d6d916d6d914848916d6d916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848916d6d914848916d6d914848 +9148489148489148489148489148489148489148489148486d4848914848 +b69191da9191dab6b6dab6b6ffb6b6b66d6d9148489148486d24246d4848 +6d48486d48489148489148486d48486d4848914848914848914848914848 +916d6d916d6d916d6db69191b66d6db69191da9191da9191b66d6db66d6d +914848916d6d6d48486d48486d48486d48486d48486d4848914848914848 +da9191dab6b6dab6b6ffb6b6ffb6b6dab6b6dab6b6da9191da9191da9191 +da9191b69191da9191da9191da9191da9191da9191da9191b69191da9191 +da9191da9191dab6b6da9191da9191da9191b69191da9191da9191b69191 +da9191da9191da9191da9191da9191da9191b69191b69191da9191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +916d6d916d6db66d6db69191dab6b6dab6b6b691916d48486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24244824244824246d24246d24246d2424 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d4848914848916d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d916d6db66d6d916d6db69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b66d6db66d6db66d6d916d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d +916d6d916d6d916d6d916d6d914848914848916d6d914848914848914848 +914848916d6d914848916d6d914848914848914848914848914848914848 +914848914848916d6d914848914848916d6d914848916d6d916d6d916d6d +914848914848914848914848914848914848916d6d914848914848914848 +9148489148489148489148489148489148489148489148486d4848b66d6d +da9191da9191da9191dab6b6dab6b6b69191916d6d6d48486d4848914848 +6d48489148489148489148489148486d4848914848914848ffb6b6ffb6b6 +ffdadaffdadaffb6b6b66d6d916d6d916d6db69191916d6d916d6d916d6d +916d6d916d6d9148486d48486d48486d48486d48486d48489148486d4848 +da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191dab6b6dab6b6dab6b6 +dab6b6da9191dab6b6dab6b6da9191da9191da9191da9191da9191b69191 +da9191da9191da9191da9191da9191b69191b69191da9191da9191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191da9191dab6b6b691919148486d24246d4848 +6d24246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24244824244824244824244824244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d4848914848914848916d6d916d6d914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +9148489148486d48486d4848914848916d6d916d6db69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b66d6d +b66d6db66d6db69191b66d6db66d6db66d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6d914848914848916d6d916d6d916d6d916d6d916d6d +916d6d914848916d6d916d6d914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848916d6d914848914848914848 +9148489148489148489148489148489148489148489148486d4848916d6d +da9191da9191da9191da9191da9191b69191916d6d6d48486d48486d4848 +9148489148489148489148489148486d48486d4848916d6dffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6916d6db66d6d914848914848916d6d916d6d916d6d +9148489148486d48489148486d48486d48486d4848914848914848914848 +dab6b6dab6b6da9191da9191da9191da9191dab6b6da9191da9191da9191 +da9191b69191da9191da9191b69191b69191da9191b69191da9191da9191 +da9191da9191da9191da9191da9191b69191da9191da9191da9191da9191 +da9191da9191b69191da9191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191da9191dab6b6da9191916d6d6d24246d4848 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824244824244824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d4848914848914848916d6d914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6db66d6d916d6d914848914848914848916d6db66d6db69191b66d6d +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b69191b69191b66d6db66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d914848916d6d914848914848916d6d916d6d916d6d916d6d +916d6d916d6d914848914848914848914848914848914848914848916d6d +914848914848914848914848914848914848914848914848916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d48486d4848914848 +b66d6db69191b69191da9191da9191b66d6d916d6d916d6d916d6d914848 +9148489148489148489148486d48486d4848b69191b69191ffb6b6ffb6b6 +ffb6b6ffb6b6ffb6b6dab6b6b66d6d9148486d2424916d6d916d6d916d6d +9148489148486d48486d48486d48489148489148486d4848914848914848 +ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +b69191da9191da9191da9191da9191da9191b69191b69191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191da9191dab6b6da9191916d6d6d48486d2424 +6d24244824246d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d4848914848914848916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db69191dab6b6dab6b6dab6b6da9191b66d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d914848914848916d6d914848914848916d6d916d6d916d6d914848 +914848914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +9148489148486d48489148489148486d2424916d6ddab6b6ffb6b6ffb6b6 +ffdadaffb6b6ffdadaffb6b6916d6d6d24249148486d48486d24246d4848 +6d48486d48486d48489148486d48486d48486d48489148486d4848914848 +dab6b6da9191da9191da9191da9191da9191dab6b6da9191dab6b6da9191 +da9191dab6b6dab6b6dab6b6dab6b6da9191dab6b6da9191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191b69191b66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191da9191da9191b69191916d6d6d48486d2424 +6d48486d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d4848914848916d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191da9191da9191da9191b69191b69191b66d6db66d6db66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191da9191b66d6d916d6d6d24246d24246d4848 +914848914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d916d6d +916d6d914848914848916d6d916d6d916d6d916d6d914848916d6d916d6d +914848916d6d916d6d916d6d916d6d916d6d914848916d6d916d6d914848 +916d6d914848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848916d6d +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d4848914848916d6d916d6d916d6d916d6d914848914848 +6d48486d48489148489148489148486d48486d4848da9191dab6b6da9191 +ffb6b6ffb6b6ffb6b6dab6b66d24246d48486d2424914848914848914848 +9148489148489148486d48486d48486d48486d48486d48486d4848914848 +dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191dab6b6dab6b6 +da9191da9191dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b691919148486d48486d4848 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d24246d48486d48486d48489148486d48489148486d4848 +6d24246d24246d48486d4848914848916d6db66d6db66d6d916d6d916d6d +b66d6d916d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db69191 +b69191da9191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6d9148486d4848482424240000480000240000480000 +2400004800004824244824246d4848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6db66d6db69191b69191b66d6d916d6d916d6d +b66d6d916d6d916d6d914848914848914848914848916d6d916d6d916d6d +914848916d6d914848916d6d914848916d6d914848916d6d916d6d916d6d +916d6d916d6d916d6d914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848916d6d916d6d916d6d914848914848 +9148489148489148489148489148486d48486d48486d4848916d6d916d6d +b69191b69191b66d6db691916d48489148489148489148489148486d4848 +9148486d48486d48486d48486d48486d48486d48486d4848914848914848 +dab6b6dab6b6da9191dab6b6da9191da9191da9191dab6b6dab6b6da9191 +da9191da9191da9191dab6b6dab6b6da9191b69191da9191da9191da9191 +da9191da9191da9191da9191b69191da9191da9191b69191da9191b69191 +da9191b69191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6db66d6dda9191b69191916d6d6d24246d2424 +6d24246d48486d24246d24244824246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d48486d48486d48486d4848 +6d48489148486d4848914848914848916d6d916d6d914848914848914848 +914848914848914848914848916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b69191b66d6db69191 +b69191b69191da9191da9191da9191b69191b69191b69191b69191b69191 +b66d6db69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b66d6d9148489148486d24246d2424482424482424482424 +4824244800004800004800004800004800004824244824246d4848914848 +914848914848914848916d6db66d6db69191b691919148486d24246d2424 +6d24246d24244824244824244800004824244824246d48486d48486d4848 +6d48486d48486d48486d4848914848914848914848916d6db66d6db66d6d +b66d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848914848 +914848914848914848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d48486d48486d2424 +6d24246d24246d48486d48489148489148489148486d48489148486d4848 +6d48486d48486d48486d48486d4848914848914848914848914848914848 +dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b66d6db69191b69191b69191b66d6db66d6db66d6d +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6d914848916d6db66d6dda9191b69191916d6d6d24246d2424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d48486d48486d4848914848 +914848914848914848914848914848916d6d916d6d916d6d916d6d914848 +914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b69191da9191da9191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6d9148489148484824246d24244800006d2424480000 +482424482424482424482424482424480000480000480000240000240000 +480000480000480000482424482424480000240000240000240000240000 +240000240000480000240000480000240000480000240000240000240000 +2400004800004800004800004824244824244824246d24246d48486d2424 +6d48486d24244824246d24246d4848916d6d9148486d24246d24246d2424 +6d4848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48486d4848914848914848914848914848914848 +9148489148489148489148486d48486d48486d48486d48486d48486d4848 +9148489148486d48489148486d48489148486d4848914848914848914848 +da9191dab6b6dab6b6da9191da9191dab6b6da9191b69191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191916d6d914848914848b69191b69191da91919148486d48486d2424 +6d48484824246d48486d24246d24244824246d24246d24246d24246d2424 +6d24246d48486d48486d4848914848914848914848914848916d6d916d6d +914848916d6d914848914848914848916d6d916d6db66d6d916d6d916d6d +914848916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6d916d6d +916d6d916d6d916d6d916d6db66d6db69191b69191b69191b69191b69191 +da9191da9191dab6b6dab6b6da9191da9191b69191b66d6db69191b69191 +b66d6db66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b69191b691919148489148486d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +480000480000480000480000480000480000480000480000480000480000 +482424482424482424482424482424482424482424480000480000480000 +480000480000480000480000480000480000240000240000240000240000 +240000240000240000240000480000480000480000240000240000480000 +4824246d4848914848916d6d914848916d6d914848914848914848914848 +9148489148489148486d4848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48489148489148486d4848914848914848914848914848914848914848 +6d4848914848914848914848914848914848914848914848914848914848 +9148486d48489148486d48486d48489148486d48486d4848914848914848 +9148486d48486d48486d48489148486d48486d4848914848914848914848 +9148486d48489148486d48489148486d48486d48486d4848914848914848 +da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191da9191dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b66d6d +b69191b69191b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b66d6d6d48486d4848914848b66d6db69191b691919148486d48486d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d4848 +9148486d4848914848914848914848914848914848914848914848914848 +914848916d6d914848914848914848916d6d916d6d916d6d916d6d914848 +914848914848916d6d914848916d6d916d6d916d6d916d6d916d6d914848 +916d6d914848914848914848916d6d916d6db69191b69191b69191b69191 +b69191b69191da9191da9191b69191b66d6db66d6db66d6d916d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d916d6d +b66d6db66d6db66d6d9148489148486d24246d24246d2424480000482424 +482424482424480000482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +480000482424482424480000480000480000480000480000480000480000 +4800006d24246d24246d48489148486d48486d48486d48489148486d4848 +9148486d4848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d4848914848914848914848914848914848914848 +9148486d48489148486d4848914848914848914848914848914848914848 +da9191dab6b6dab6b6dab6b6dab6b6da9191da9191dab6b6da9191da9191 +da9191da9191da9191dab6b6da9191da9191da9191da9191da9191da9191 +b69191b69191b69191da9191da9191da9191da9191da9191b69191b69191 +b69191b69191b69191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +9148486d2424482424914848b66d6dda9191b69191916d6d4824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +914848914848914848914848914848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d916d6d916d6d +914848916d6d916d6d916d6d916d6db66d6db69191b69191da9191b69191 +da9191da9191dab6b6da9191da9191b69191b66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b66d6db66d6d9148486d48486d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +480000482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d48486d48486d48486d24246d48486d24246d24246d24246d2424 +6d24246d24246d24246d24246d48486d4848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148486d4848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148489148489148486d48489148489148489148489148489148486d4848 +9148489148489148489148489148489148486d48489148489148486d4848 +9148489148486d48486d48486d48486d48489148486d4848914848914848 +da9191da9191dab6b6dab6b6da9191da9191da9191da9191dab6b6da9191 +da9191dab6b6dab6b6da9191da9191b69191da9191da9191da9191b69191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191da9191916d6d +6d24246d2424482424914848916d6dda9191b69191916d6d6d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +914848914848914848914848914848914848916d6d916d6d914848916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d916d6d916d6d +914848914848914848916d6d914848916d6d916d6d916d6d914848914848 +6d48486d48486d4848914848914848916d6db66d6db69191b69191b69191 +b69191da9191da9191da9191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db69191 +b66d6db66d6db66d6d916d6d6d48486d24246d2424482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d48486d4848 +9148486d48486d48486d24246d2424482424482424482424480000480000 +4800004800004800004800004800006d2424916d6db66d6d916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148486d48489148486d4848914848914848 +9148489148489148489148486d48489148489148486d48486d48486d4848 +6d4848914848914848914848914848914848914848914848914848914848 +da9191da9191dab6b6da9191da9191da9191dab6b6dab6b6da9191da9191 +da9191da9191dab6b6da9191da9191dab6b6da9191da9191da9191da9191 +da9191da9191da9191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b66d6db69191b66d6db66d6db66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191da9191b691916d4848 +4824244824244824246d24246d4848b66d6d916d6d9148486d2424482424 +6d24244824246d24244824246d24246d24246d48486d2424914848914848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +6d48486d48486d4848914848914848914848916d6db69191b69191b69191 +b69191da9191da9191da9191da9191b69191b66d6db66d6db66d6db66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b66d6db66d6db66d6d9148486d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24246d48486d48486d48486d4848 +6d24246d24246d2424482424482424482424482424482424482424482424 +4824244824244800004800004800004800006d24246d24246d4848914848 +6d48489148489148489148489148489148486d48489148486d4848914848 +6d4848914848914848914848914848914848914848914848914848914848 +9148489148486d4848914848914848914848914848914848914848914848 +9148489148486d48489148489148489148486d48486d48486d4848914848 +9148489148489148489148489148486d48486d48486d4848914848914848 +6d48489148489148486d48486d48486d48486d48486d48486d4848914848 +da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191dab6b6da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191da9191b69191da9191da9191da9191da9191 +b69191b69191b69191b69191b69191b66d6db69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6dda9191dab6b6da9191b69191b66d6d9148486d24246d2424 +4824244824246d24244824244824246d24246d48486d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d4848914848914848 +914848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d +b66d6d916d6d916d6d914848916d6d916d6d916d6d916d6d916d6d914848 +6d48486d24246d24246d4848914848914848914848916d6db66d6db69191 +b66d6db69191b66d6db69191b66d6db66d6db66d6db66d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +916d6db66d6d916d6db66d6d9148486d24246d2424482424480000482424 +480000482424482424482424480000482424482424482424482424482424 +482424482424480000482424482424482424480000482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +4824244824244824244824246d48486d48486d48486d48486d2424482424 +4824244824246d2424482424482424480000482424482424482424482424 +482424482424482424480000480000480000480000480000480000480000 +4800004800006d4848914848914848916d6d914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d4848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +9148489148486d48486d4848914848914848914848914848914848914848 +da9191da9191dab6b6da9191da9191da9191da9191dab6b6da9191da9191 +da9191dab6b6da9191da9191da9191da9191da9191da9191b69191b69191 +da9191da9191b69191b69191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191ffb6b6ffb6b6b691916d24244800006d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d48486d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6d916d6db66d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6d +b66d6d916d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d916d6d +9148489148489148486d48486d48486d4848914848916d6db69191b69191 +da9191b69191da9191b69191da9191b69191b66d6db69191b66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db66d6db66d6d9148486d48484824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424480000482424480000482424482424 +4824244824246d48486d48489148486d48484824246d4848482424482424 +482424482424482424482424480000482424482424482424482424480000 +482424482424482424482424482424480000480000480000480000480000 +4800004800004800002400004824246d24246d4848914848914848914848 +6d48486d4848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +da9191dab6b6dab6b6dab6b6da9191da9191dab6b6dab6b6dab6b6da9191 +dab6b6dab6b6dab6b6da9191dab6b6dab6b6da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b69191 +b66d6db69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6dda9191da91919148486d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6d916d6db66d6d +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848 +9148489148489148486d48486d24246d4848914848916d6db69191b69191 +da9191da9191da9191b69191b69191b66d6db66d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b69191b66d6db66d6db66d6d +b66d6db66d6d916d6db66d6d9148486d24246d4848482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424480000482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d24249148486d48486d48486d24246d2424482424482424482424 +482424480000482424480000482424480000482424480000482424482424 +480000482424482424482424480000480000482424480000480000480000 +4800004800004800004800004800004800004800004824246d4848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48489148486d4848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d4848914848914848914848914848914848914848914848914848914848 +da9191dab6b6dab6b6da9191da9191dab6b6dab6b6da9191da9191da9191 +dab6b6dab6b6da9191da9191dab6b6dab6b6da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6d916d6d9148489148486d48484824244824246d24246d2424 +6d24246d24246d24246d24244824244824244824244824244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848914848 +916d6d916d6d916d6d916d6d914848916d6d916d6db66d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6d916d6d916d6db66d6db66d6db66d6d916d6d916d6d916d6d916d6d +9148489148489148486d48486d48486d4848914848916d6d916d6db69191 +da9191dab6b6da9191b69191b69191b69191b66d6db66d6db69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6d916d6d6d48486d24244824246d2424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424480000482424 +4824244824244824244824244824244824244824246d24244824246d2424 +6d48489148486d48484824246d2424482424482424482424482424482424 +482424480000482424480000482424480000480000480000480000480000 +480000482424480000480000480000480000480000480000480000480000 +482424480000482424480000482424480000480000480000480000480000 +6d24249148489148489148489148489148486d48486d48486d4848914848 +6d48489148486d48486d48489148489148489148489148489148486d4848 +9148486d48486d48486d4848914848914848914848914848914848914848 +9148489148489148489148486d48486d48489148486d48486d4848914848 +6d48486d48489148489148489148486d48486d48486d4848914848914848 +da9191ffb6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191dab6b6da9191dab6b6dab6b6dab6b6da9191da9191da9191 +da9191b69191b69191b69191da9191b69191b69191da9191b69191b69191 +b69191b66d6db69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b66d6db69191 +b66d6db69191b69191b69191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b66d6d916d6d9148486d48486d24246d24246d24246d24246d24246d2424 +4824246d24246d24244824246d24244824246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d916d6d +b66d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d916d6d914848 +9148486d48486d48486d48486d48486d48486d4848914848916d6d916d6d +b69191da9191da9191b69191b66d6db66d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b66d6db66d6db66d6d +916d6d916d6d916d6d916d6d9148486d24246d4848482424482424482424 +480000482424482424482424482424482424482424482424480000482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +4824244824244824244824244824244824244824246d48486d2424914848 +6d48486d48486d2424482424482424482424482424482424482424482424 +480000482424480000482424482424482424482424482424482424480000 +482424482424482424480000482424482424480000482424480000480000 +482424482424480000482424482424480000480000480000480000480000 +4800004824246d24246d4848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d4848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d4848914848914848914848914848914848 +da9191dab6b6da9191da9191dab6b6da9191dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191dab6b6da9191da9191dab6b6da9191da9191da9191da9191 +da9191b69191da9191da9191da9191b69191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b66d6db69191b69191b66d6db69191 +b69191b69191b66d6db69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b66d6d +916d6d6d48486d24244824246d24244824246d24246d24246d2424482424 +4824244824244824244824246d24246d24246d24246d2424482424482424 +4824246d24246d24246d24246d24246d24246d24246d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6d916d6d916d6d +9148489148489148489148486d4848914848914848916d6d916d6d916d6d +b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6d916d6d6d48486d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424480000482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d48486d48486d4848 +6d24244824246d2424482424482424482424482424482424480000480000 +482424480000482424482424482424482424482424482424482424480000 +480000480000480000480000482424482424482424482424482424482424 +482424480000480000480000482424482424480000480000482424482424 +4800004800004800004800006d48486d4848914848914848914848914848 +6d48489148489148489148489148489148489148489148489148486d4848 +9148489148489148489148489148489148489148489148489148486d4848 +9148489148486d48489148486d48486d48489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48486d4848914848914848914848 +da9191dab6b6da9191da9191dab6b6dab6b6dab6b6dab6b6da9191da9191 +dab6b6da9191da9191da9191da9191da9191da9191da9191da9191b69191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b66d6db66d6db66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191916d6d +6d48486d24244824246d24244824244824244824244824246d24246d2424 +6d24246d24246d24244824246d24246d24246d24246d24246d2424482424 +4824246d24244824246d24244824246d24246d24246d4848914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b69191b66d6db66d6db66d6db66d6db66d6d916d6d916d6d914848 +9148489148486d48489148486d48486d4848914848914848914848914848 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6d916d6db66d6d9148486d24246d4848482424482424480000 +482424480000482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424480000482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d24246d48486d48484824246d2424 +482424482424482424482424482424482424480000482424482424480000 +482424482424482424482424480000482424480000482424482424480000 +480000480000482424482424482424482424480000480000480000482424 +482424482424480000480000480000482424482424482424480000480000 +4800004800004800004800004824246d24246d2424914848914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48489148486d48486d48486d4848914848914848914848 +da9191dab6b6da9191da9191da9191dab6b6dab6b6da9191dab6b6dab6b6 +da9191da9191da9191da9191da9191da9191dab6b6da9191da9191da9191 +da9191da9191da9191b69191b69191b69191b69191da9191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b66d6d6d2424 +6d24244824244824244824246d24244824244824244824246d24246d2424 +6d24246d24246d24244824244824246d24246d24246d24246d24246d2424 +6d24244824244824246d24246d24246d24246d24246d2424914848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b66d6d916d6d916d6d +916d6d914848914848916d6d914848914848914848916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6d916d6d6d48486d24244824246d2424482424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +4824244824244824246d24246d48486d48486d48486d2424482424482424 +482424480000482424482424482424482424480000482424480000482424 +482424482424480000482424480000480000480000480000482424480000 +482424482424480000480000480000480000482424480000480000482424 +482424482424482424482424480000480000480000482424480000480000 +4800004824244824244824244800004800004800004824246d2424914848 +9148489148489148489148486d48489148486d4848914848914848914848 +9148489148489148489148489148489148486d48486d4848914848914848 +9148489148489148489148489148489148486d48486d48486d48486d4848 +9148486d48486d48486d48489148486d48489148486d48486d4848914848 +da9191dab6b6da9191da9191dab6b6dab6b6dab6b6dab6b6dab6b6da9191 +da9191da9191dab6b6da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b66d6db69191b66d6db69191b66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b691919148486d4848482424 +4824244824244824246d24244824244824244824244824244824246d2424 +6d24244824246d24244824244824244824246d24246d24246d2424482424 +6d24246d24246d24246d24246d24244824246d24246d48486d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191da9191da9191b69191b69191b66d6db66d6d916d6d +9148486d48486d4848914848916d6d914848916d6d914848914848916d6d +916d6d916d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191b69191b66d6db69191b66d6d +b66d6db66d6d916d6db66d6d916d6d6d48486d4848482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424480000482424482424482424482424482424482424482424480000 +480000482424482424482424482424482424482424482424482424482424 +4824246d24246d24246d24246d48486d2424482424482424480000482424 +482424482424482424482424482424482424482424480000482424482424 +482424482424480000482424480000480000480000480000482424482424 +482424482424480000480000482424480000480000480000480000480000 +482424480000480000480000480000480000480000480000480000480000 +4800004824244800004824244824244800004824244800004824246d4848 +914848914848914848914848914848914848914848916d6d914848914848 +9148489148489148486d4848914848914848914848914848914848914848 +9148489148489148489148489148489148486d48486d4848914848914848 +9148489148486d48486d48489148486d48486d48486d4848914848914848 +dab6b6da9191da9191dab6b6dab6b6dab6b6dab6b6da9191da9191da9191 +da9191dab6b6da9191dab6b6dab6b6da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b66d6db69191b69191b66d6db69191b66d6d +b69191b66d6db66d6db69191b69191b66d6db69191b69191b66d6db69191 +b69191b69191b69191b66d6db66d6db69191b66d6db69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6d916d6db66d6db69191b69191b69191b691916d48484800006d2424 +4824246d2424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +4824244824246d24246d24246d24246d24246d24246d24246d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191da9191b69191b69191b69191b69191b69191 +916d6d916d6d914848914848916d6d916d6db66d6d916d6db66d6d916d6d +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191da9191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6d916d6d6d48486d24244824246d2424 +482424482424482424482424480000482424482424482424482424482424 +482424482424482424482424480000482424482424482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +6d24246d48486d48486d48486d2424482424480000482424480000482424 +480000482424482424480000482424482424480000480000482424480000 +480000480000480000482424480000480000480000480000482424482424 +480000482424480000482424480000480000482424482424480000480000 +482424482424482424480000482424480000480000482424480000480000 +480000482424480000482424480000482424480000480000480000480000 +6d24246d4848914848914848914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48489148489148486d48489148489148486d48486d4848914848 +6d48489148489148486d48486d48486d48486d48486d48486d48486d4848 +da9191da9191da9191da9191dab6b6dab6b6da9191da9191dab6b6dab6b6 +da9191da9191da9191da9191dab6b6dab6b6da9191da9191da9191b69191 +da9191b69191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b66d6db69191b66d6db69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191da9191da91919148489148484824246d2424482424 +6d24244824246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24244824246d2424482424482424 +6d24246d24246d24244824246d24246d24246d24246d24246d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191da9191da9191da9191b69191b66d6d +b66d6d916d6d9148486d4848914848916d6d916d6db66d6d916d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d916d6d +b66d6d916d6db66d6db66d6db66d6d916d6d9148486d2424482424482424 +482424482424482424482424482424482424482424482424480000482424 +482424482424482424482424480000480000482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d48486d48486d48486d24246d2424480000482424482424482424482424 +482424480000482424480000482424482424482424480000482424480000 +482424480000480000480000480000480000480000480000482424480000 +480000480000480000480000480000482424482424482424480000480000 +480000480000480000480000480000480000480000480000482424480000 +480000480000480000480000480000482424482424480000482424480000 +4824246d4848916d6d916d6d916d6d914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d4848914848914848914848914848914848914848914848 +6d48489148486d48486d4848914848914848914848914848914848914848 +b69191da9191dab6b6da9191dab6b6dab6b6dab6b6dab6b6dab6b6dab6b6 +dab6b6da9191dab6b6dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db69191 +b69191b69191b66d6db66d6db69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db69191b69191b66d6db66d6db69191b69191b66d6d +b66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6d916d6d916d6d6d48486d24244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d4848914848 +914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191da9191b69191b69191 +b66d6d916d6d916d6d916d6d914848b66d6db66d6db69191b66d6db66d6d +b69191b69191b69191b69191b69191da9191da9191b69191da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6d916d6d6d48486d24246d2424482424 +6d2424480000482424482424482424482424482424482424482424480000 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d24246d4848 +6d48486d2424482424482424480000482424480000482424482424482424 +480000482424480000482424480000480000480000480000480000482424 +482424480000480000480000482424482424480000480000480000480000 +482424482424480000480000480000480000480000482424480000480000 +482424480000480000480000480000480000480000480000480000480000 +480000480000480000482424480000482424480000482424482424480000 +4824244824244824246d4848914848914848914848914848914848914848 +9148489148489148489148489148489148486d4848914848914848914848 +9148489148489148489148489148489148489148489148486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48489148486d4848 +da9191da9191da9191da9191da9191dab6b6dab6b6da9191dab6b6dab6b6 +dab6b6da9191da9191dab6b6da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b69191b69191b66d6db69191b69191b69191b66d6db66d6db69191b66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b691919148486d24246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +4824246d24246d24246d24244824246d24246d24246d24246d48486d4848 +914848916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b69191b66d6db69191b69191b69191b69191da9191da9191da9191da9191 +b69191b66d6d916d6d916d6d914848b66d6db66d6db69191b66d6db69191 +b69191b69191b69191b69191b69191da9191da9191da9191b69191da9191 +b69191b69191b69191b69191b69191b69191b66d6db69191b69191b66d6d +b66d6db66d6d916d6db66d6db66d6d916d6d6d4848482424482424482424 +482424480000482424482424482424482424482424482424480000480000 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d48486d48486d2424 +6d2424482424482424482424482424482424482424482424482424480000 +480000482424482424482424482424482424480000480000482424482424 +480000480000482424482424482424482424482424480000480000482424 +482424482424480000480000480000482424482424482424480000480000 +482424482424480000480000480000480000480000480000480000480000 +480000480000482424480000480000480000480000482424482424482424 +4824244800004800006d24246d2424914848914848916d6d914848914848 +916d6d914848914848914848914848914848914848914848914848914848 +9148489148489148486d48489148489148486d48486d48486d4848914848 +6d48489148489148489148489148486d4848914848914848914848914848 +da9191da9191da9191da9191da9191dab6b6da9191da9191da9191da9191 +dab6b6da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191b69191b69191da9191b69191b69191b69191b69191b69191 +b69191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +916d6d482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d24244824246d24246d24246d24246d24246d4848 +914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6db66d6d +b66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191da9191da9191da9191da9191 +da9191b69191b66d6db66d6db66d6d916d6db66d6db69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191b69191b69191b69191b69191 +b66d6db69191b66d6db69191b69191916d6d6d48486d24244800006d2424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424482424480000482424480000 +4824244824244824244824244824244824246d48486d48486d4848482424 +482424480000482424480000482424482424480000482424480000482424 +480000480000482424480000482424482424482424480000480000482424 +480000482424480000480000480000480000482424482424480000482424 +480000480000480000480000480000480000480000480000480000480000 +480000480000482424482424480000480000482424480000480000480000 +482424482424482424480000480000480000482424480000480000480000 +4824244800004824244824246d48486d4848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48486d48489148489148486d4848 +9148489148486d48486d48486d48486d48486d48486d48486d4848914848 +dab6b6da9191da9191da9191da9191da9191da9191da9191da9191da9191 +dab6b6da9191da9191da9191dab6b6da9191da9191da9191da9191b69191 +da9191b69191b69191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191916d6d +6d48486d24244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +4824244824244824246d24246d24246d24246d24246d24246d48486d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b69191b69191b69191b69191b69191da9191da9191da9191da9191da9191 +b69191b69191b66d6db66d6db66d6d916d6db66d6db66d6db66d6db69191 +b69191b66d6db69191b69191b69191b69191b69191b69191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6d916d6d6d48486d2424482424482424 +482424482424482424480000482424482424482424482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +4824244824244824244824246d24246d48486d24246d48486d24246d2424 +480000482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424480000482424482424482424480000 +480000482424482424480000482424482424482424482424482424482424 +480000482424480000480000480000482424480000482424480000480000 +480000480000482424482424482424480000480000480000480000480000 +480000480000480000480000480000480000480000480000480000482424 +4824244800004824244824244800006d24246d4848914848914848914848 +916d6d916d6d916d6d916d6db66d6d914848914848914848914848914848 +9148489148489148486d48486d4848914848914848914848914848914848 +9148486d48486d48489148486d48486d48489148486d4848914848914848 +da9191da9191da9191da9191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191dab6b6dab6b6da9191da9191da9191da9191da9191 +b69191b69191b69191b69191da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191b66d6d9148486d2424 +6d24244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824246d24246d24246d24246d2424 +6d4848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191da9191da9191da9191da9191 +da9191da9191b69191b66d6db66d6db66d6db66d6db69191b66d6db69191 +b69191b69191b69191b69191b69191b69191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191b69191b66d6d9148486d24246d24246d2424480000 +6d2424480000482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +4824244824246d24246d24246d48486d48486d2424482424482424480000 +482424480000482424482424482424482424482424480000482424482424 +482424482424480000480000482424482424482424480000480000482424 +480000482424480000480000480000482424482424482424482424480000 +482424482424482424480000480000482424480000482424480000480000 +480000480000480000480000480000480000480000480000482424480000 +480000480000480000480000480000480000480000480000480000482424 +4800004800004824244824244800004800004824246d4848914848914848 +914848916d6d916d6d916d6d914848916d6d914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d48489148486d4848914848916d6d +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6d +b66d6db69191b69191b69191da9191b66d6d6d48486d4848482424482424 +4824244824244824246d24244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24244824246d24246d4848 +6d4848914848914848916d6d916d6d916d6d916d6d916d6d916d6d916d6d +916d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b66d6db66d6db69191b69191b69191da9191da9191dab6b6dab6b6dab6b6 +da9191da9191b69191b69191b69191b66d6db66d6db69191b69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191da9191 +b69191b69191da9191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b66d6db66d6d9148484824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +4824244824246d48486d48486d48486d24246d2424482424482424482424 +482424482424482424482424480000482424482424482424482424482424 +482424480000482424480000480000482424482424482424482424480000 +482424482424480000480000480000482424480000480000480000480000 +480000480000482424482424480000482424480000482424482424480000 +482424480000480000480000480000480000480000480000480000480000 +480000480000480000480000482424480000480000482424480000482424 +4824244800004824244824244824244800004800004824246d4848914848 +916d6d916d6d916d6d916d6d916d6d914848914848914848914848914848 +9148489148489148489148486d48489148489148489148489148486d4848 +9148486d48489148486d48486d48489148489148489148486d4848916d6d +da9191dab6b6da9191da9191da9191dab6b6da9191da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191da9191b69191b69191 +b69191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b66d6db69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191b66d6d +b69191b69191b69191916d6d6d48486d2424482424480000482424482424 +4824244824244824244824244824244824244824246d24244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d4848914848914848916d6d916d6d916d6d916d6db66d6d916d6d +916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191b69191da9191dab6b6dab6b6da9191 +dab6b6da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191da9191da9191b69191b69191da9191da9191da9191da9191 +da9191da9191b69191b69191da9191b69191da9191b69191b69191b69191 +b66d6db69191b69191b69191b66d6d9148486d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d48486d48486d48486d24246d2424480000482424482424482424 +480000482424480000482424482424482424482424482424482424482424 +482424480000480000482424480000480000482424482424482424482424 +480000480000480000480000480000482424480000482424480000482424 +482424480000480000480000482424480000480000482424482424482424 +480000480000480000480000480000480000480000480000482424480000 +480000480000480000480000480000480000480000480000480000482424 +4800004824244824244824244824244824244824244824244824246d2424 +9148486d4848916d6d916d6d914848914848914848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +9148489148489148489148486d48486d4848914848914848914848916d6d +da9191dab6b6da9191da9191da9191da9191da9191da9191dab6b6da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db69191b66d6db69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db69191b66d6db69191b66d6d +b66d6db66d6db69191b69191b66d6db69191b69191b69191b66d6db69191 +b69191b69191b66d6d6d24246d24244824244824244824246d2424482424 +4824244824244824244824244824244824244824246d2424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d48486d4848914848914848916d6d916d6d916d6db66d6d916d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b69191b69191b69191b69191da9191da9191da9191dab6b6 +dab6b6dab6b6da9191da9191da9191b69191b66d6db66d6db69191b69191 +b69191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +da9191da9191da9191b69191da9191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6d9148486d24244824246d2424480000 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d48489148486d48486d2424482424480000482424480000482424480000 +482424480000482424482424482424482424482424482424482424480000 +482424482424482424480000482424482424482424482424482424480000 +482424480000482424482424480000482424480000482424480000480000 +480000482424480000480000480000480000480000482424482424480000 +480000480000482424480000480000480000480000480000480000480000 +480000480000480000480000480000482424482424480000482424480000 +480000482424482424482424482424482424482424482424480000480000 +6d24246d4848914848914848914848914848914848916d6d914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48486d4848914848914848916d6d +da9191dab6b6da9191da9191dab6b6dab6b6dab6b6dab6b6da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +da9191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6db66d6d +b69191b66d6db69191b69191b66d6db69191b66d6db66d6db66d6db69191 +da9191da9191b69191916d6d6d24246d24244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24246d2424482424482424482424 +4824246d24246d24246d24246d4848914848916d6d916d6d916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6d916d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191da9191da9191dab6b6 +dab6b6dab6b6da9191da9191da9191b69191b69191b69191b69191da9191 +b69191da9191b69191b69191b69191b69191b69191b69191b69191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db69191b69191916d6d9148486d4848482424482424482424482424 +482424480000482424482424482424480000482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424914848 +9148486d48486d2424482424480000482424480000482424480000482424 +480000482424482424482424482424482424480000482424480000482424 +482424482424482424482424482424480000482424480000480000480000 +480000482424480000480000480000480000480000480000480000480000 +480000480000480000482424480000480000480000482424480000480000 +480000480000480000480000480000482424480000480000480000480000 +480000480000480000480000480000482424480000480000480000480000 +480000480000482424482424482424482424482424482424482424482424 +482424914848914848914848916d6d916d6d916d6d914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48486d48486d48489148486d4848914848914848914848914848 +da9191da9191dab6b6da9191dab6b6da9191da9191da9191da9191dab6b6 +da9191da9191da9191da9191dab6b6da9191da9191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db69191b69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b66d6db66d6db69191b66d6db66d6db69191b69191 +b69191b66d6db69191b69191b66d6d916d6d6d48486d24246d24246d2424 +6d24246d48486d48486d24244824244824244824246d2424482424482424 +4824244824244824244824246d2424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d24246d24246d4848914848914848914848916d6d +b66d6db66d6db66d6db66d6d916d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b69191b69191b69191da9191da9191dab6b6 +dab6b6dab6b6da9191da9191da9191da9191b69191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191da9191b69191da9191 +da9191da9191da9191da9191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db691919148489148486d4848482424482424482424482424 +480000482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d4848914848 +6d24246d2424480000482424482424482424482424482424480000482424 +480000482424482424482424482424482424482424482424482424480000 +482424482424482424482424480000480000482424482424482424482424 +482424482424482424480000482424480000480000480000482424482424 +480000480000482424482424482424480000480000480000480000480000 +482424482424482424480000482424480000480000480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000482424480000482424482424482424482424 +4824246d48486d48486d4848914848914848916d6d914848914848914848 +6d48489148489148489148489148489148489148489148486d4848914848 +6d48489148486d48489148486d4848914848914848914848914848914848 +da9191da9191da9191da9191da9191da9191da9191dab6b6da9191dab6b6 +da9191da9191dab6b6dab6b6da9191da9191da9191b69191b69191b69191 +b69191b69191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b69191b66d6db66d6d +b69191b69191b66d6d9148486d2424482424482424482424482424482424 +480000482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24244824246d24246d24246d48486d4848914848 +916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d916d6d +b66d6db66d6db66d6db66d6db69191b69191b69191da9191da9191da9191 +da9191da9191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191da9191b69191b69191da9191b69191 +b69191b69191da9191da9191b69191b69191b69191b69191b66d6db69191 +b66d6db66d6db66d6d6d48486d24244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24246d48486d48489148486d2424 +6d2424482424482424480000482424480000482424482424480000482424 +482424482424482424482424482424482424482424482424482424480000 +480000480000480000482424480000480000482424480000482424480000 +480000480000482424480000482424480000480000480000480000480000 +482424480000480000480000482424480000480000480000482424480000 +480000480000480000480000482424480000480000480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000482424482424482424482424482424482424 +4824244824246d24244824246d4848914848916d6d914848914848914848 +914848914848914848914848916d6d914848914848914848914848914848 +6d48489148489148489148489148486d48486d48486d48486d4848914848 +da9191dab6b6da9191da9191da9191da9191da9191da9191da9191da9191 +da9191da9191da9191da9191b69191da9191da9191da9191b69191da9191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db69191b66d6d +b69191b66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6db69191 +b66d6db69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db69191b69191b69191b66d6db66d6db66d6db66d6db69191 +b66d6d916d6d6d48486d24246d24244824244824246d24246d24246d2424 +4824244824244824244824244824244824244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24244824244824246d24244824246d24246d24246d24246d48486d4848 +6d4848914848916d6d916d6db66d6db66d6d916d6d916d6db66d6db66d6d +b66d6db66d6db66d6db66d6db69191b69191b69191da9191da9191da9191 +da9191da9191dab6b6dab6b6da9191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191da9191b69191da9191da9191da9191 +da9191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +916d6db66d6d916d6d6d48486d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d48486d48486d48486d24246d2424 +482424482424480000482424480000482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +480000482424482424482424482424480000480000480000482424482424 +480000480000482424480000482424480000480000480000480000482424 +480000480000480000480000480000482424482424482424480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000480000482424480000482424480000480000 +482424480000480000480000480000480000480000482424482424482424 +482424482424482424482424914848914848914848914848916d6d914848 +914848914848914848914848914848914848914848914848914848914848 +9148486d48489148489148486d48486d48486d4848914848914848914848 +da9191dab6b6da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191da9191b69191b69191b69191b69191da9191b69191b69191 +da9191b69191b69191b69191b69191b69191b66d6db69191b66d6db66d6d +b69191b66d6db69191b66d6db69191b66d6db69191b66d6db66d6db69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db69191 +b69191b69191b69191b69191b69191b66d6db66d6db69191b66d6db66d6d +916d6d9148486d24246d24244824246d24244824244824244824246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d24246d2424 +6d24246d48486d4848914848916d6d916d6d916d6d916d6d916d6d916d6d +916d6d916d6d916d6db66d6db66d6db66d6db66d6db69191b69191da9191 +da9191da9191da9191da9191dab6b6da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191da9191da9191 +da9191da9191b69191b69191b69191b69191b69191b69191b66d6db66d6d +916d6d916d6d9148486d48486d24244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d24246d48489148486d4848482424482424480000 +6d2424480000482424480000482424482424482424480000482424482424 +482424482424482424482424480000482424482424480000482424480000 +482424480000480000482424482424480000482424482424480000480000 +482424480000480000480000480000480000480000480000480000480000 +480000480000482424480000482424480000480000480000480000480000 +480000480000480000482424482424480000480000480000480000480000 +480000480000480000480000480000480000480000482424480000480000 +480000482424482424482424480000482424482424482424482424482424 +4824244824244824244824246d4848914848914848914848914848914848 +914848914848914848914848914848914848914848914848914848914848 +9148489148489148486d48486d48489148489148486d4848914848916d6d +da9191dab6b6da9191dab6b6da9191da9191da9191dab6b6da9191da9191 +da9191da9191da9191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db69191b66d6db69191b69191b66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b66d6db66d6db69191b69191b66d6db66d6d916d6d +6d48486d24246d48484824246d24244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d2424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d24246d4848914848914848916d6d916d6d916d6d916d6d +916d6db66d6d916d6d916d6db66d6db66d6db66d6db69191da9191da9191 +da9191da9191dab6b6da9191da9191da9191da9191da9191b69191b69191 +b69191da9191b69191b69191b69191b69191b69191b69191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db69191 +914848916d6d9148486d48486d24246d2424482424482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +4824244824246d24246d48486d48486d2424482424482424482424482424 +482424482424480000482424482424480000480000482424482424482424 +482424482424482424480000480000482424482424482424482424482424 +482424480000482424482424482424482424480000482424482424480000 +480000482424480000482424480000482424480000482424482424482424 +480000480000480000482424480000480000480000480000480000480000 +480000480000480000480000482424480000480000482424480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000482424482424480000482424480000480000482424480000482424 +4824244824244824244824244824246d2424914848916d6d914848914848 +914848916d6d916d6d916d6d9148489148489148489148489148486d4848 +9148486d48486d48486d48489148486d4848914848914848914848914848 +b69191da9191da9191da9191da9191da9191da9191dab6b6da9191da9191 +da9191da9191da9191da9191da9191b69191b69191b69191b69191da9191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db69191 +b69191b66d6db66d6db66d6db69191b66d6db69191b66d6db69191b66d6d +b69191b66d6db66d6db69191b69191b69191b69191b66d6db69191b69191 +b69191b69191b69191b66d6db69191da9191da9191b69191b66d6d914848 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d24246d48486d4848914848914848916d6d916d6d +916d6d916d6d916d6d916d6d916d6db66d6db66d6db66d6db69191b69191 +b69191da9191da9191b69191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6d916d6d +9148486d48486d48486d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d48486d48486d4848482424482424480000482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +482424482424482424482424482424480000482424480000480000480000 +482424482424480000480000482424482424480000482424480000482424 +482424482424480000480000482424480000480000482424480000480000 +480000482424480000482424480000480000480000480000480000482424 +482424482424480000480000480000482424482424480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000482424482424480000480000480000482424 +482424482424482424482424482424482424914848914848916d6d914848 +916d6d916d6db66d6db66d6db66d6d914848914848914848914848914848 +9148489148489148489148486d48489148486d48489148486d4848914848 +da9191da9191da9191da9191da9191da9191da9191dab6b6da9191da9191 +da9191da9191da9191b69191b69191b69191b69191b69191da9191b69191 +b69191b69191b69191b69191b66d6db66d6db66d6db66d6db69191b69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6db66d6db66d6d +b66d6db66d6db69191b69191b69191da9191b69191916d6d6d24246d2424 +480000482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d2424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24246d24246d24246d24246d48486d48486d4848914848 +914848916d6d916d6d916d6d916d6d916d6db66d6db69191b66d6db69191 +da9191da9191da9191da9191dab6b6da9191da9191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191da9191b69191b69191b69191 +b69191b66d6db66d6db69191da9191da9191da9191b69191916d6d916d6d +9148489148486d24246d2424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d48486d48486d24244824246d2424480000482424482424482424482424 +482424482424482424480000480000482424482424482424482424482424 +480000482424480000482424482424482424482424480000480000482424 +482424482424482424482424482424482424480000482424480000480000 +482424480000480000482424480000482424482424480000482424482424 +480000480000480000480000482424480000482424480000480000482424 +480000480000482424480000480000480000480000480000480000480000 +480000480000480000480000480000482424480000480000480000480000 +480000480000480000482424480000482424480000482424482424482424 +4824244824244824244824244824244824246d4848914848916d6d916d6d +914848b66d6d916d6db66d6d916d6d916d6d9148489148489148486d4848 +9148486d48489148486d48486d48486d48486d48486d48489148486d4848 +da9191da9191da9191da9191da9191da9191da9191da9191da9191da9191 +b69191b69191da9191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191 +b69191b69191b66d6db66d6db66d6db66d6db66d6db69191b66d6db66d6d +b66d6db66d6db66d6d9148486d48486d24246d2424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d24246d24246d48486d48486d4848 +914848914848914848916d6d916d6d916d6db66d6db66d6db66d6db66d6d +b69191b69191b69191da9191da9191da9191b69191b69191b69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db69191b69191da9191b69191b66d6d914848914848 +9148486d24246d24246d2424482424482424482424482424482424482424 +4824244824244824244824244824244800004824246d24246d24246d4848 +6d24246d2424482424482424480000482424480000482424482424482424 +480000482424482424482424482424482424480000482424480000480000 +480000482424482424482424482424482424480000482424482424480000 +480000480000482424480000482424482424482424480000480000480000 +482424480000482424482424480000482424482424480000482424482424 +480000480000480000480000480000480000480000480000480000480000 +480000482424480000480000480000480000480000480000480000480000 +480000482424480000480000480000480000480000480000482424480000 +482424480000480000482424480000482424482424482424482424482424 +4824244824244824244824244824244824246d4848914848914848916d6d +916d6d914848b66d6db66d6db66d6d916d6d9148486d4848914848914848 +9148486d48489148489148489148489148486d48486d4848914848914848 +b69191da9191dab6b6da9191da9191da9191b69191da9191b69191b69191 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d914848 +6d48486d24246d2424482424482424480000482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d24246d48486d4848 +6d48486d48486d4848914848916d6d916d6d916d6db66d6db66d6d916d6d +b69191b69191da9191da9191da9191da9191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db66d6db66d6db69191da9191b69191916d6d9148486d4848 +6d48486d24246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d48486d48486d2424 +482424482424482424482424482424482424482424482424482424482424 +482424480000482424480000482424480000480000482424480000482424 +482424482424482424482424482424482424482424482424482424480000 +480000482424482424482424482424480000482424480000480000482424 +482424480000482424480000480000482424482424480000480000480000 +480000482424480000482424480000482424482424480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000480000480000480000480000480000480000480000480000480000 +480000482424480000480000480000480000482424482424482424482424 +4800004824244824244824244824246d24246d24246d48486d2424914848 +914848914848916d6d914848916d6d916d6d9148486d4848914848914848 +9148486d48486d48486d48486d48486d48486d48486d48486d4848914848 +b69191da9191da9191da9191da9191da9191b69191da9191b69191b69191 +da9191da9191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b66d6db66d6db69191 +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6d6d48486d2424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d24246d24244824246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d24246d24246d48486d48486d4848914848916d6d916d6d916d6db66d6d +b66d6db66d6db69191da9191da9191b69191da9191b69191b69191b69191 +b66d6db69191b69191b66d6db69191b69191b66d6db69191b69191b69191 +b66d6db66d6d916d6db66d6db66d6db66d6d916d6d9148486d4848914848 +6d48486d2424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d24246d48486d24246d2424482424 +482424482424482424482424482424482424482424482424482424480000 +482424480000482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424482424480000480000480000 +482424482424482424480000480000482424480000480000480000480000 +480000480000482424480000480000480000482424480000482424482424 +480000480000480000480000480000480000480000482424482424482424 +480000480000482424482424480000480000480000482424480000480000 +480000480000480000480000480000482424480000480000482424482424 +4800004824244824244824244824244824246d24246d24246d2424914848 +916d6d916d6d916d6d914848914848916d6d914848916d6d914848914848 +9148489148489148486d4848914848914848914848914848916d6d914848 +b69191da9191da9191da9191da9191da9191b69191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db69191b69191916d6d6d2424482424 +482424482424480000482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24246d24246d24246d48486d48486d4848914848914848916d6d916d6d +b66d6db66d6db69191b69191da9191da9191da9191b69191b69191b66d6d +b69191b69191b69191da9191b69191b66d6db66d6db66d6db69191b66d6d +b66d6db66d6d916d6db66d6db69191916d6d6d48486d48489148486d4848 +6d48486d2424482424482424482424482424480000482424482424482424 +4824244824244824246d24246d48486d48486d2424482424482424482424 +482424482424482424482424482424482424482424482424480000480000 +480000482424480000482424482424482424482424482424482424482424 +480000482424480000482424482424482424480000482424482424482424 +480000480000480000482424482424482424480000482424480000482424 +480000482424482424480000480000482424480000480000480000482424 +480000482424480000482424480000480000482424480000482424480000 +482424480000480000480000482424480000480000480000480000480000 +480000480000480000480000480000482424480000480000480000480000 +480000480000480000482424480000482424482424482424482424482424 +4824244824244800004824244824244824244824246d24246d2424914848 +916d6d9148489148489148489148489148489148489148486d4848914848 +9148489148489148489148489148486d48486d48486d48486d4848914848 +b69191b69191b69191b69191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b66d6db66d6db66d6db66d6d +b66d6db69191b66d6db66d6db66d6db66d6db66d6db66d6db66d6db66d6d +b69191b69191b69191b69191da9191da9191da9191b66d6d6d4848482424 +4824244824244824244824246d2424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d2424482424482424482424482424482424482424482424 +4824246d24246d24246d24246d24246d48486d48486d4848914848914848 +916d6db66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6db66d6db69191b69191b69191b66d6db69191b69191b66d6db66d6d +b66d6db66d6d916d6d9148489148486d24249148486d48489148486d4848 +482424482424482424482424482424482424482424482424482424482424 +4824246d24246d24246d48486d4848482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424480000480000 +482424482424482424482424482424482424480000482424482424482424 +482424482424480000482424482424482424480000482424482424482424 +482424480000482424480000480000482424482424482424482424480000 +480000482424482424482424482424480000482424480000482424480000 +480000482424480000482424482424480000480000482424482424482424 +482424480000480000482424480000480000480000480000480000480000 +480000480000480000482424482424482424482424482424482424482424 +4800004824244824244824244824244824244824246d24246d2424914848 +916d6d916d6d914848914848914848916d6d916d6d914848914848914848 +916d6d9148486d48486d48486d48486d48489148486d48489148486d4848 +da9191da9191da9191b69191da9191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db69191b69191b69191b69191b66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191b69191b69191 +b66d6d9148489148486d48486d48486d48486d48486d48486d24246d2424 +4824244824244824244824244824246d2424482424482424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d24244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d24246d24246d24246d24244824244824244824246d24246d24246d2424 +6d24246d24244824244824246d24246d24246d24246d48486d48486d4848 +914848914848916d6db66d6db69191b69191b69191b69191b69191b66d6d +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6d9148486d48486d24246d48489148489148486d48486d2424 +482424482424482424482424482424482424482424482424482424482424 +4824246d24246d48486d2424482424480000480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424480000480000482424482424 +482424482424482424482424482424482424482424482424480000482424 +482424482424482424482424482424482424482424482424482424480000 +482424482424482424480000480000482424482424482424482424480000 +482424482424480000482424482424480000480000482424482424480000 +482424482424482424482424482424482424480000482424482424480000 +480000480000480000480000480000482424480000482424482424480000 +480000480000480000482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824246d24244824246d2424 +6d4848916d6d914848914848914848914848914848914848914848914848 +9148489148486d48486d48486d48486d48486d4848914848914848914848 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b69191b66d6db66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6db69191916d6d6d4848 +6d2424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d4848916d6d6d48484800004824244800004824246d4848914848 +9148486d48484824244824244824244824246d24246d24246d48486d4848 +6d48486d48486d4848914848916d6db66d6db69191b69191b69191b69191 +b69191b69191b66d6db66d6db69191b66d6db69191b69191da9191916d6d +916d6d6d48486d24244824246d48486d48489148486d48486d2424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d2424482424482424482424482424482424482424482424 +482424482424482424480000480000482424482424482424482424480000 +482424482424480000482424480000482424480000482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +482424482424482424482424482424482424482424482424482424480000 +482424482424482424480000482424482424482424482424480000482424 +482424482424482424480000482424482424482424482424482424482424 +4824244824246d2424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424482424480000 +480000482424480000482424482424482424482424480000482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d4848916d6d916d6d916d6d916d6d916d6d916d6d916d6d914848914848 +9148489148489148489148486d48486d48489148489148486d4848916d6d +b69191da9191da9191b69191da9191b69191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b66d6db69191b69191b66d6db66d6db66d6db66d6d +b66d6db66d6db66d6db69191b66d6db66d6d9148486d48486d2424482424 +4824244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824246d2424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +482424916d6d916d6d6d48484824244800006d24246d4848b66d6db66d6d +b66d6d916d6d6d48484824244824244800004824244824246d24246d2424 +6d48486d48486d48486d48486d4848914848914848b66d6db66d6db69191 +b66d6db69191b69191b66d6db66d6db69191da9191da9191da9191914848 +6d24246d24244824246d24246d48489148486d24246d4848482424482424 +4824244824244824244824244824244824246d24244824246d24246d2424 +6d2424482424482424480000482424482424480000482424480000482424 +480000482424482424480000482424482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424480000482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424480000482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d24246d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d24246d2424 +6d24246d24244824244824246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424480000482424482424 +4824244824244824244824244824244824244824244824246d2424482424 +6d2424916d6d916d6d914848916d6d914848914848914848914848914848 +9148489148486d48486d48489148489148486d4848914848914848914848 +b69191da9191b69191da9191b69191b69191b69191da9191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b66d6db66d6db66d6db66d6db69191b69191b66d6db66d6d +b66d6db69191b69191916d6d9148486d24246d24246d24246d2424482424 +4824244824246d2424482424482424482424482424482424482424482424 +4824244824244824246d24244824244824246d2424482424482424482424 +4824244824244824244824244824244824246d2424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424480000482424916d6db66d6d916d6d +b66d6db66d6d9148484824244824244824244824246d24246d24246d2424 +6d24246d24246d24246d48486d48486d48486d4848914848914848916d6d +916d6db66d6db66d6db66d6db66d6db69191da9191b66d6d916d6d6d2424 +4824246d24244824246d24249148489148486d48486d48486d2424482424 +4824244824244824244824244824244824246d48486d24246d24246d2424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424480000482424 +482424482424482424480000482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d24246d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48489148489148486d48486d48486d48486d48486d48486d2424 +6d48486d48486d48486d24246d4848482424482424482424482424482424 +4824244824244824244800004824244824244824244824246d2424482424 +6d24249148489148489148489148489148489148486d4848914848914848 +9148489148489148489148489148486d48486d48486d48486d4848914848 +b69191da9191da9191da9191b69191da9191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b69191b66d6db66d6db66d6db66d6db66d6db66d6db69191b66d6db69191 +b69191b66d6d9148486d48484824244824246d24246d48484824246d2424 +4824246d24244824244824244824244824244824244824244824246d2424 +4824246d24246d24246d24246d24246d24246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +4824244824246d24246d24246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824246d2424482424482424482424482424482424482424482424482424 +482424482424482424482424482424480000480000916d6db69191da9191 +da9191dab6b69148489148484800006d48484824246d48486d48486d4848 +6d24246d24244824244824246d24246d48486d48486d48486d48486d4848 +6d4848914848914848914848914848916d6d916d6d6d48486d2424482424 +6d24244824246d24246d24249148486d48486d48486d24246d2424482424 +6d24244824244824244824244824244824246d24246d48486d2424482424 +482424482424482424482424482424480000482424482424482424482424 +480000482424482424480000482424482424482424480000482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d24246d48486d24246d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d2424482424 +4824244824244800004824244824244824244824244824244824246d4848 +6d4848914848914848914848914848914848914848914848914848914848 +6d48489148489148486d48486d48486d48486d48486d4848914848914848 +b69191da9191da9191da9191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b69191b69191 +b66d6db66d6db69191b66d6db66d6db66d6db66d6db69191b69191b69191 +b66d6d6d48486d24244824246d24244824246d24246d24246d2424482424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d48486d24246d24246d24246d2424 +4824244824244824244824246d24244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24244824246d24246d2424482424 +4824244824244824244824244824244824244824246d2424482424482424 +4824244824244824244824244824244824244800006d2424916d6db66d6d +da9191b691916d48484824244824244824246d48486d24246d24246d2424 +6d48486d24244824244824244824246d24246d48486d4848914848914848 +916d6d9148489148489148486d48486d48486d48486d48486d24246d4848 +6d48486d48486d24246d24249148486d24246d24246d2424482424482424 +4824244824244824244824246d24246d48484824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424480000482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48486d48486d48486d48489148489148486d48486d48486d4848914848 +6d48486d48489148489148489148486d48489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48484824246d24244824244824244824244824244824244824246d2424 +914848914848914848916d6d914848914848914848914848914848914848 +9148486d48486d48489148489148486d4848914848914848914848914848 +b69191da9191da9191b69191b69191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b66d6db66d6db66d6db66d6db66d6db66d6db66d6d916d6db66d6db66d6d +b66d6d6d48486d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24244824246d24246d24246d2424 +6d24246d24244824244824244824244824246d2424482424482424482424 +6d24246d24246d24244824244824244824246d24246d24246d2424482424 +4824246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d24246d24246d24246d24244824246d2424482424482424482424 +6d24244824244824244824244824244824246d24246d4848914848916d6d +916d6d6d48484824244824244824246d24246d24246d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d24246d48486d48486d4848 +9148486d48486d24244824246d24244824246d24244824246d2424482424 +4824246d24246d24246d48486d48486d4848482424482424482424482424 +482424482424482424482424480000482424482424482424482424482424 +482424482424480000482424480000482424482424482424482424482424 +4824244824244824244824244824244824244824246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d48486d4848 +6d48489148486d48489148489148486d48489148489148489148486d4848 +6d48486d48486d48486d48489148489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d2424482424482424482424482424482424 +6d4848914848914848914848914848914848916d6d914848914848914848 +6d48486d48489148486d48486d48486d4848914848914848914848914848 +b69191b69191da9191da9191b69191b69191da9191b69191b69191b69191 +b69191b69191b69191b69191b66d6db66d6db69191b69191b69191b66d6d +b66d6db66d6db66d6db69191b66d6d916d6d916d6d914848914848914848 +6d48486d48486d24246d24246d24246d24246d24246d24246d24246d2424 +4824246d24244824244824246d24244824244824246d2424482424482424 +4824246d24246d24246d24246d24246d24246d24244824246d24246d2424 +482424482424482424482424482424482424482424482424482424482424 +4824246d24244824244824244824244824244824246d24246d2424482424 +4824244824244824244824244824244824246d24244824246d2424482424 +6d24246d24244824246d24246d24246d24246d24244824246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d24246d24246d24246d24246d24246d24246d48486d48486d4848 +6d48489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d48486d48486d24246d24246d24246d24246d2424 +4824244824244824244824244824244824246d24246d2424da9191b69191 +b691919148484824244824244800006d48486d48486d48486d48486d4848 +6d24244824244824246d24246d24246d24246d24246d48486d48486d4848 +9148489148486d48486d24246d24244824244824244824246d24246d2424 +6d24246d48486d48486d24246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24246d24246d24246d24246d24246d24246d24246d4848 +6d24246d48486d48486d48486d48486d4848914848914848914848914848 +9148489148489148489148486d48486d48489148489148486d4848914848 +9148486d48486d48486d48489148486d48486d48489148486d4848914848 +9148489148489148486d48486d48486d48486d48486d48489148486d4848 +6d48489148489148489148486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d2424482424482424482424482424 +6d2424914848914848914848914848916d6d914848914848916d6d914848 +9148486d48489148486d48489148486d48486d48486d48486d4848914848 +b69191da9191da9191b69191da9191da9191da9191da9191da9191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6db66d6d +b69191b66d6db66d6d916d6d9148486d48486d48489148486d48486d4848 +6d24246d48486d24246d48486d24246d24246d24246d2424482424482424 +6d24246d24244824244824244824244824244824246d2424482424482424 +4824244824244824246d24246d2424482424482424482424482424482424 +4824244824244824246d2424482424482424482424482424482424482424 +4824244824244824246d24244824244824244824246d24246d2424482424 +4824244824244824244824244824244824244824246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824246d24246d2424482424482424482424 +4824244824244824244824244824246d24246d24246d24246d24246d2424 +6d48486d48486d48486d48486d48486d4848914848914848914848914848 +9148489148489148489148489148489148486d48489148489148486d4848 +6d48489148486d48486d48486d48486d24246d24246d4848914848914848 +6d48486d24246d24244824244824246d24246d4848916d6d916d6d914848 +914848482424482424482424482424482424482424482424482424482424 +6d24246d24246d24244824244824244824246d24246d24246d4848914848 +9148486d48486d24246d2424482424482424482424482424482424482424 +482424482424482424482424482424480000482424482424482424482424 +4824244824244824244824244824244824244824244824246d24246d2424 +6d24246d24246d24246d48486d48486d48489148489148489148486d4848 +9148489148486d48486d48486d48489148486d48489148486d48486d4848 +6d48489148489148489148489148489148486d48486d4848914848914848 +6d48489148489148489148486d48489148489148486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d24246d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d24246d2424482424 +4824246d48486d4848914848914848914848914848914848914848914848 +9148489148489148486d48486d48486d48486d48489148486d4848914848 +b69191da9191b69191b69191da9191da9191b69191b69191b69191b69191 +b69191b66d6db69191b69191b69191b69191b69191b69191b69191b66d6d +b66d6d916d6d916d6d916d6d9148486d48486d48486d48486d4848914848 +6d48486d24246d24246d2424482424482424482424482424482424482424 +4824244824246d24246d24246d24246d24244824244824244824246d2424 +4824244824244824244824246d2424482424482424482424482424482424 +4824244824244824244824246d24244824246d24246d2424482424482424 +4824244824244824244824244824246d2424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824246d24246d24246d24246d24246d24246d24246d24246d2424 +6d24246d48486d48486d48486d48486d48486d4848914848914848914848 +9148489148489148489148489148489148489148489148489148486d4848 +6d48486d48486d48486d24244824244824246d2424b66d6dda9191916d6d +916d6d4824246d2424482424482424482424482424482424482424482424 +4824244824244824244824244824244824246d48486d4848914848914848 +6d48486d24246d24244824246d2424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24246d24246d24246d24246d48486d4848 +6d48486d48489148486d48486d48486d48489148489148486d4848914848 +9148489148486d48489148489148486d48489148489148486d4848914848 +6d48489148489148489148489148486d48486d4848914848914848914848 +6d48489148486d48486d48489148489148489148489148486d4848914848 +6d48486d48486d48486d48486d48489148489148489148486d48486d4848 +6d48489148486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +9148486d48486d48489148486d48486d48486d48486d24246d24246d2424 +4824246d24246d24246d4848914848914848914848914848914848914848 +9148489148489148489148486d48489148489148489148486d4848914848 +b69191da9191da9191b69191da9191b69191b69191b69191b69191b69191 +b69191b69191b69191b69191b69191b69191b69191b69191b66d6d916d6d +916d6d916d6d916d6d9148486d48486d48486d48486d24246d24246d2424 +6d24246d24244824244824244824246d24244824246d2424482424482424 +4824246d24246d24244824246d24246d24246d24246d2424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +6d2424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +482424482424482424482424482424482424482424482424482424482424 +4824244824244824244824246d24244824244824244824246d2424482424 +4824246d24244824246d24246d24246d24246d24246d24246d24246d2424 +6d48486d24246d24246d48486d48486d4848914848914848914848914848 +9148489148489148489148489148486d48486d48486d48489148486d4848 +6d48486d24246d24246d24246d24246d24246d24246d2424482424482424 +4824246d24246d24246d24244824244824246d48486d48486d48486d2424 +6d2424482424482424482424482424482424482424482424482424482424 +4824244824244824244824244824244824244824244824244824246d2424 +6d24246d24246d24246d24246d48489148486d48486d48486d48486d4848 +6d48489148486d48486d48489148486d4848914848914848914848914848 +9148486d48489148489148489148489148489148489148489148486d4848 +9148489148489148489148489148489148486d48486d4848914848914848 +9148486d48489148489148489148486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d24246d48486d24246d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48486d48486d48486d48486d4848 +6d48486d48486d48486d48486d48486d48489148486d48486d48486d4848 +6d24246d24246d24246d4848914848914848914848914848914848914848 +9148489148486d48489148486d48489148486d48486d4848914848914848 +grestore +showpage +%%Trailer + +--owatagusiam +Content-type: image/gif +Content-Transfer-Encoding: quoted-printable +Content-Description: Quoted-Printable test + +GIF87a@=01=C8=00=D7=00=00=00=00=00=00=00=AA=00=AA=00=00=AA=AA=AA=00=00=AA= +=00=AA=AAU=00=AA=AA=AAUUUUU=FFU=FFUU=FF=FF=FFUU=FFU=FF=FF=FFU=FF=FF=FF=00= +=00=00=14=14=14 ,,,888EEEQQQaaaqqq=82=82=82=92=92=92=A2=A2=A2=B6=B6=B6=CB= +=CB=CB=E3=E3=E3=FF=FF=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=FF=FF=00=BE= +=FF=00}=FF=00A=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=BE=FF=00}=FF=00A=FF= +=00=00=FF=00=00=FFA=00=FF}=00=FF=BE=00=FF=FF=00=BE=FF=00}=FF=00A=FF}}=FF=9E= +}=FF=BE}=FF=DF}=FF=FF}=FF=FF}=DF=FF}=BE=FF}=9E=FF}}=FF=9E}=FF=BE}=FF=DF}=FF= +=FF}=DF=FF}=BE=FF}=9E=FF}}=FF}}=FF=9E}=FF=BE}=FF=DF}=FF=FF}=DF=FF}=BE=FF}= +=9E=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6= +=C7=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6=C7=FF=B6= +=B6=FF=B6=B6=FF=C7=B6=FF=DB=B6=FF=EB=B6=FF=FF=B6=EB=FF=B6=DB=FF=B6=C7=FF=00= +=00q=1C=00q8=00qU=00qq=00qq=00Uq=008q=00=1Cq=00=00q=1C=00q8=00qU=00qq=00Uq= +=008q=00=1Cq=00=00q=00=00q=1C=00q8=00qU=00qq=00Uq=008q=00=1Cq88qE8qU8qa8qq8= +qq8aq8Uq8Eq88qE8qU8qa8qq8aq8Uq8Eq88q88qE8qU8qa8qq8aq8Uq8EqQQqYQqaQqiQqqQqqQ= +iqQaqQYqQQqYQqaQqiQqqQiqQaqQYqQQqQQqYQqaQqiQqqQiqQaqQYq=00=00A=10=00A =00A0= +=00AA=00AA=000A=00 A=00=10A=00=00A=10=00A =00A0=00AA=000A=00 A=00=10A=00=00= +A=00=00A=10=00A =00A0=00AA=000A=00 A=00=10A A( A0 A8 AA AA 8A 0A (A A( A0= + A8 AA 8A 0A (A A A( A0 A8 AA 8A 0A (A,,A0,A4,A<,AA,AA,=05=E1Sf/(=B1=C6=126=A0H=C3=86;=F1=A9C=12KH=C1=85=12A=E8=90=03= +=0FL=A5TDJ/=BC=FB=17=0C?=909=E5Z+=FC=80CN3=04=11=DD=BE=9Ai=E6=F0_cr:=14=0F= +=99=8A=8C=A8[*=EC=D4=E2~.=B5=FB=9D=AA=AA=C2=80=E6=87,=D4\=EB=AD+=0AZB=CD=99= +=AD #=8D=C2=AAF=AC=B1=B0=3D=E4=91=92=D7=DA`=82=14%=8CY=C3=09=1E=E1P=02=0A/I= +-=DC=09=3D=B4 F=CA=13B=0D=E5H-=04w-I)=94tB=0A<=A4@]=0C=06=F30=C4=13FlQ=05= +=9FY=FB=14=E1UKN=01=16=83=0F-=F4=10C=0C7=0CqC=0Di=D6=94=93=11E=08a=C3=0D9= +=FC=F0D=12Z=0CQ=84=C1b=8C=1A=C3=0C+=CC=90=B7Oc=12EC=12=1F=13=A5=02=19^%=06= +=C3=0C8=C8=DA=82=0A7|=EC=12=0C=9Br=8AB=11=12=9B|r=0A*=E0=00=03=0E=95=8A=0E= +=AB=0D=17=A2yb=CD+=D2=0AZ=0A.=D0=C0=C2=0D=0E=B5=B9B=093=A8=F0s=D07=E6H=F4A= +=0B=C5=D0PD2/=D9=C2=09.=A0=C9=BC=AA-=BC=B0=03I=8A=B9=80=14=0A=15=C9pto0=E4= +=FB=92=11:`=1B=D1=B2=CF=02=C7-I(=D8=B0=14=18)=B1=98=0E=82=90=848x=81`9=08= +=82XJ=17=9EA=8D)=05+=E8=C1=0E\=90=12>-=0Cf=14=D4I=10=D2=85=83%=FC=00=0AJ=F0= +=C1=0Et=B0=83=190=E5=07=A5=DA=DCO|B=83=14=A0K=05=14=FA=C9=0C=14=C40=8C=A9= +=8A=09=FB< U=0D=9Cb=AB=16 at G)=B6[K[J&2=0A=A5@,=1F{B=11R4=84=94=CC=80Q=AF=0AP= +=0BR=C7$&=99=E47$=18=08DF=E0=B3=D5=91=00h=C2=1A=DA=F5x=A4=10=17=94=00x=FDYL= +=9BzP=03=D0=D0=E0=06*=A8=D9K\=10=83f=A9=EF=06R=01=9F=D7L=80=03=FE=A5@=093= +=B8=C2w=F4w4=AF=8D=E4=04,=08JIJ=82<6=F1=E0C9=E8L=E3=CC@=06'=0C=C1=09=06=A3= +=82=1Bb =03=1Exl-;=C8=CC=0C=80=A0=AE=0Fy=05+7=80=99N8=A9=B8=C0=09=A1=07<=E0= +=C1=0E=A0=D0=03=13=C6*U=1E=E3=E1=A0\=08=86=17=C8 =08=83=8AA=85L=A8=83&x=07= +=83=95I=C9=DFT =98=1E=BC=003=B5=93=90Oz0(=DB=9D=E5'*=08Q=EDP=90=03=EF=E4=E0= +'=3D=C0=81=13\=A0=02#=B8`=0Al=11=82O=94=B5=02=16d=FCqF2=FA=99=08~=06=83=11= +=D8H=8Cc<=16EV=D7=03=FEP=ED=08.@=91=10=02=AA=02=1E=F4 at y,h=CE=0D=0C%=83|=C9Q= +]=DCb=0B=0Arr=83%=04=E1=06U=D0_qre=BF=A3=99`Q.=08J=0E=D4"=03=1F=C4`U=BB=BB= +=01=0E=8E0=05,X=81=09#,!S=0A=A4=92=CD=A8=E0=05I=D8I=0D=3D=94=18U=FA=12=07D= +=00=C2=E2l=B0=84=AC=CC=84=07b=91A=1B[dS=17H=C1cLJ=89=A0=9C=92J=9BV=C5=A7=AB= +=FA=10=0C=94=E0=18=01Ie=88D=EC=D4=104=17M=93=FDE0=99RJ=0A=CE=90=17=14=A8=8A= +$< gD=DA=B8=83=1F=B1=A0=05=F2=9C=11=18=A9=C7=1A=10=CCs=8C=181J=0EX =91=88= +=F0=A6=04f4N=0B=8A=D0=02"=9C=88=99MXB=11=DA=D8=CE=18=B4=C03=DE=01=0E=13f = +=85=F05=87=075=F0A[M=90=1C=16=FB=88-I=FC=F3=C1A=81=90=D0=B393'=DF=81A=0Ev`= +=03=1C=E0=A0=07=B0=8Ce=12vP=83=A9<=92=05=1E=C3=8C=B8=E6=93=18=D8b=D0=94r=E1= +=13=1E=A1=D3=19)H=86*=C9=E3=9B=AD|=90=99=1B,=C7%=A8=C3J=A90=13=03O~=06gs=FC= +[q_=80=84=1B=FC@=08B=80A=16=1C=16D=14=80&be-=E2O=80=00!=A1=00=A5=7F}$=ADF*2= +!"`=E4{f]=0B=10= +`=F8.k"=EA=C5}1-=B7=B4=F5=11=86=BC` =03=9EQ=81k=E4=D7=03=EB=88=045P=88k=16= +=9C=ACD=CE=C0=04=1A=19s=CEXP=95"T=14=06=F2=E2=81=11z=85=A6@=DDU=09=DEy=C1= +=10p;=04=B4=ECOJ)=09=B1=0D=1Ac=E2!=E4=80=C8=98=06-s=7F=E0=9C=0C%=90*R^Aoe= +=C0=84=83=1D=C6=B8=C7=3D=E6*=CBU=DB=1EH!=09Sp=C1=12Nd<=E5=D1=C0=0A1x=02=0F= +=B0=13m=DB=E6=C0=87k=A2=F6=DF=A6R=15&D=C7=07@=C0A=E9`=80=84=180=95Bq=A6=1A= +=0D=EA=02g;=9B)-=A7=EE(C=0C=12=E8`=0Dz5z=CD=E7kvS=02=A8=F17=C4'=8A=1E=AE|`= +=85"tHspy=C1=F0=88w=D7=98=9D=CBP=1A=8D=F7=84=FB83K=1E=CC=A0f=1E.=F2=EE=0C= +=0A=99=C8H&=094=D8=C1gjUY$d=88=07QHW=0C=9C=00=84c=C2=CC=06=C7=DD]=11=C2=A9= +=03#=13A=E16k'=0Bt=80=14=A6=FC-%=A02=02O=17=9AdN"a=D5=B1=D4=13=97n=B0=EE$= +=CB@=06)=8CaX=F12=AF=C3=98=18=86=E8v=F7]=E2-=EF=85=D0=BB=DE=F7=AE=D1=80=F5= +=BDo=1FQ=846=C6=81O=0Bb=00*=19=E4=C0=09=3D=90=8A'W=80=03=86=13Ox-=08=83=0B= +=80=08=1CE=9A=0D=D2=13=97m=13=1E=E5a4=C1=ECQ=82=B3=81=0F=AA=12=97=1DL=81p= +=C63=9E=0B=8C@=95=1B=E8=C0=06=04=8BA=10\Ed=0C=02np=DD=0C5hi@=84=BB=EBX2=0Bt= +=BA2=C3`:=1C=90p=869=B0=83=0F=8A=B0=F9#X=FB=06;PfRT=98=F5N=B9E=C7X=8F=A1=D6= +=E1=BD?=19=14=E7=06G=9B=FC=F7=0C=04Ro=02=DF{=ECd_4=BF?*=CC=1D=00%=05/=F0Bt= +=A82rZ=DDu=82=C2+|=9Av=B2=96=17D\=98=13*=CA=87=FC=B4=04_=86=DF=05@=E8=C1=0F= +^0=AA=92j=DA=06IxA=0Dr=D0.=E3=BDd=07G=00=06=91=01=1D=81=E3r=9D=A7*q=F5!z0= +=03=E4=F3=12=0B=F7P[=10rC`=04M@=1DI=B6!Z=C5.=1B=94=03K=F06N=90=04"=92.~=93= +=12:0=04=E5=F3I=C2=C7=17=14b=03\=B0(.&uSg;=DC=B2=02%=E1+=FD&H=18aF=05q`z=15= +v=AA=11h=D1'}=B7=E1=02N=00=05=D2=02in=C5'=00h=03X=D0}=C4=E3=02=05=F3=12d=80= +L=91a~=1A=15=14=CE=C4&:=F0=1D=C0=D3Y=85=A7*=DDTd=C9=D3=03cp=03/=D0.}=93s=15= +vRA0=03C`=034=00=06=87q=80=07=B88=FCP=81w=0B=D7=02VP0=8F=E1=03A=10I=C45^N'= +=03H=80=03C=A0=03Z=F2=04U=90=04hP'>G8=BDu=03=FD=14:=96=92~1tD^=D1=03=82=02= +=83=C3=A7=17!u6L=10R(=A0=03=CCc=02=89=94E=C7r,=D2=13hAco?=08}A=88=3D=0F=D1Q= +=19=01=03O`x=C3c<5=A3p-0=169Q=03=00=B5=85/=00=05=F5=91)(=A0<=F8=A2J0=83=87= +=EA=93q.=80G7=E0=03=1E=C6p=BA(GQ=81=04=DD=11K=D9=B1=8C=EFGd=D0=E1=1Dxh=8DG= +=B0\vX=88=A5S\r=C2=03=81=83=05*=15=04@=00)D =04<=A0=03>@=8C=DB=06\=FF=C1{0= +=08=836=C0]K`r=94=18_Z=87=02K =1EH0=07=82=04=13w=F5=02b $$=10=16=FA=97W=CDG= +=1A*=E0|=A7=01=8B=B1h=10Hr=1BG=98=13=FCrtq=C6=03=04N =19L=86=15v=97=93=E5C[0=93=12=0D=18=93=9DW=13=A9=F4=93= +=E1=F7=02?=F0=86=E1=D6!=E7h:=08C*=06=A3R=15e.=B2=14=7F&t9?=80=19=9B=B1=8F= +=FC=882'iY=B7=12=901=18!+=A0=16* T> =03=E0=88=93ibn.`|=99=81=8A3R=91z=B50= +=7Ff=91=17=99o=19=89=3D at b4=D22!=ED=B4p=91=C7=02(=E4q=8F=B18L0=7F=18=93 =DB= +=D1=86o=F4!=06(~=E1=87w[=E8=026=01s=0F=C8p}=B3=04<=95qw=18=933y=80=9E=F9=12= +F=C1=03=AE=E77=E3=A5=13=D5![=1Ch=877=80=04;p.:=F6t=ED"=03Y=E0b=FA=B8B=FB=A8= +=1Dkq&=14t:N=80=03)=F0=03=A13|04%=FC2PT5=D0=80v=D7N=86=A8"xE=10' =1070=02a= +=90^=AE(v=18=99=97=B1=C1o=FD=96&9=14~+=12G!G=155=00+9=10=1D=A2=C201=B0=055P= +=16B=F4=04=0BU\'=05=99=A193Q=D1+K@=999yW=9EI=9F=A1=C9=8D=A1) 0=A0=05:aR5p= +=9A=82=C8I=9Da=03=1A=E3%U=96!h=F0j,=B2=19=FA=F8=041=D4=13n=91=03=99=C1F=E1D= +*Q=C7=89=EE=E6^g=A5L_1=9F9=A7/=93=A3=3D$=80=02#=A0=02$p=03=0A=9194=F0N|=05= +=84=DA=A9=91=DC=C9=145=D3=99/=10=04=F5q+&=94=03=E7bP?=A0=06\=F2=03=B9=07=03= +P=D0=1F=BE=B1=16B4=1F=0B=E3L=00Z=9F=0E=88&O=A0=7F=97iwU=DA=022C=A5^=0A=941S= +dH=80=81=08=0A=034=90 at F=90.L=D6dqwW=FC=D1=93K=14=AAK14=03=80=01=1Ag=06=05A`= +=05=BFt=9B=BD=17g1=F0=03J=F0)H=E0=98=97c=03r=B1$=B4=82=03=99=C3=1C=BA=D3=02= +=10Q<=C0=E3=A2=D3C=3D6z=A3=DB=89$%=A0=02=A3=C2a0`=12=8B=F3!>=80;m9=03M at BG`= +=04F=F0=03a=80=0390=04t!=16=18Z=14=10=E3=157=C0r?=D0*D`=03=82=F3=A5=91=99= +=A5:=C9=AB=C0=0A=A6=AA=E4!=9D=87=8E;a[=B8g=13<=C0=048=B0=03P=11=04=94e+=BAD= +=A1?@M=97h=1Foqf=FD=F2]|=DAnq=F6bM=E4=06Z=A0;;=E1=04;@=03M=D0=8F=91Gr=15F= +=12=FFQ=04=A1=18=14=82F=A9xi=A9=97zX=F6=F3=02=D2=82=02=94=06:>!=03=A32=039= +=D0=04B=D0=04X=90=04H =87@=B5.1=11=1E=BB=C9L=7FccW=B08zB=9F=FCZ=1A=93=FB=99= +=B1=C1=BA=B1=DD=F8*t=98U:A=04QP=05kv.=DF=A1=03=CCFr=99Ai<=C4=1F=CB=C1{N=F1= +=03L=A5=024@=19=1C=F2t=B8=03=96=02=E9{g=C2=13O7=1F=9C=D4P\=C2"=B6=823,P=04= +=E4=05=B0) 3yU=A3=F5j=AF=02=B1`?=E2=114=F8QC=D1e|=B2=07=04d=05W =04=92`=18= +=E7=C1IC=00=A7*=D0=02=D5:=159=A0=04=85=D9=03=E2=97=B1n=FB=B6r=C4=B1=1B=FB= +=B1=C5=8A=9A=9Fc:3=90=9ChB<=B42=1D=EDD=03D=AB=AC=B6=B9KN=01=B0+=C2&/A{=CA$= +=16q=84;=BD=D3=A7=11rVX=F9t=F1=B3m6=C9=7FD=DB3=ED=A4 at P=90=03nx+=B91`=AD=F8= +=B4P+=B5=B4=01=12R=E2=1B=E6=03=9F>=F0AF@=04H=A0=05:@=04;=C0=14Sp=94H=E01=AC= +=13&TA=15=FC4=E0=06M=F0K=D3=08=B7=C4=FB=ABr=0B=ACt[=B7=1FR=93=8F9=8D'=C2=04= +_1=04H=B5=12=C6s=18=A1d=9BU=90=B3=00"8=EBF=88<=B0=04=B6=F5=15=06=F5-:=BB=B3= +=D7dD=9A=A1k=0A=14=039=E0X=99=9B=19J=C0=02=D2=EB=92B`=04=E1=84+=C4#=BA=F86O= +=A4k=AF=A6{=BA=1E=95=A68=F1!=D01@=B8=15K;@k;VR;=80=95R=F6=A71=11=1D=AF=19"= +=AF=E6=AB=C5=FB=B6=C7=8B=BC=C9=AB=BC=8Ag=80=C2cY=BE=94 T=D1P=87aB4=F0=03=A3= +=02\q=8A9=91=B10=9C=F4/K`01=B0=04=E7=A6=95=DE=AA=1F0=88;=08c=A8_A=B9E[=B4= +=A0A*=E79=1D*=10=9D=12=D9|_dh=AFQ=02=D1=F7=BF=00<6=13=82=18=D5=1A=1DH=00)= +=3D=A0=03=07e=03;=96=B7=99=DB25=10=04'9=054ax=EDr=C1=FCf=CC=9F=19=EC=A5=1BL= +=87=E88=9F=BC=D8=02C=E0=02=B1=1B=19=0B|=1EP=B7=03K`q=C0%=AD=10=14=16=F3=F1= +=05=CE=AA=03G=80=04=A9bb=DDj=C3=E7=BB=8Fj=B3c.A+?=FA=C3=B7=A2=03E`=81/=C0= +=03=BA=C1|=13y`3=A0=C4E#=11=80=E5=C4S+=03G`qR=F0=14=3DI=045 at k=B4V=03B =19OW= +=04?0<=AB=A3=B9=A9=C4=021Q=C1w%3g|=C1=FD)=AC=9DW=9Fk=1C=CC=9D=D7=1CG@=13I= +=90=03R=E0s1=90=04=02;=13=01=B7=A8=3D=A3c=3Dp=18=B2=95=C0=9EQ+Yi=C3=DA=AC= +=95=B8=93=04=16=01h=A2Qo$A=04=7FU,=DB=83=8A;"=1B= +=DCYH10"=86=F7=02YA=13U=E1\=CFE=15:=80=05=86=11=9E=B9=D6N.=90=05_=81=99=BB= +=0C=B7T=FA=8C=FC=DB(=CC=10=1D=D1=B0=06=8D=B7J=04M=B9m=E2=B6=13U@=88>=903.= +=B1=03s=A1=13=C7=94/)t=C8N=BA=CD1dn4=B0=04=C0=17=A7=C8=E3=D2-=DBB=83=02=03= +=A3b=1B=02Q=02G=90W?3=02=0D=03X%0=A3^=87=10R;5Or=84=0C=F4=12=AF=85{=1E=F7= +=CF5[d=98C=B4=81i=04Yj=C1=0B=8D=BC=80( =12=0D3=F3=99=D5=18d=86=BE=E4=AC*5[= +=CA=1Cd=FB=C2If=DD=04b=96=06=0D=07=B20=00=04=16=D7=CA=83=9B=C3=DC=AC=CD-=0B= +=D3v=3D=ADo=A1T,=90=039`=02p=F1N=07=E63=C7b=02.=90O=10Q=04{=09=CA=B4=01>=15= +=81-0P=1C=E4=02=8E3id=B2=B6=05P78N=90=8B=EB=EA}=0BM=BCi=FC=1200=04=8Fa\=CD= +=9B=BC=C0=C6=D5=1F=E2z2a=03B@=04=82,d=17=B8=13A=F6t=19=82=8D=FB=BE=F4=02M= +=A0a=072 =94=F2=D2.=DD06\=BEFt=D7=C4=CDC=EA=BA<=8F=03=04=F2,=10=F5=C1=13=94= +=A6o=10A=83.=A0=D8=1C=B9w$=C6?=DD=11=14'=B9e3i=03=3D`=06=BA=DA=15=97=14+j= +=E8}=9B]=8D=9D=FD=D9=9Fi>=8B=E3![=ED=027=B9=C6=8A=D1SY=9D=13R=90=12P0=17A= +=16=DB=CA=F47=9E;CUAcW=CC=05=17=18=03G=C0=14=C6=A3=02=00=91B=C5@=18-P=1CD= +=98P=E1B=86=0AS<=84=18Qb=C4=81=03W=D0=D8=D1"=C5=08=8E#=9C=8C =F1=02=87=8A= +=157:=9ED=99=92#=09=12=3D\=98@=C1r=05K=9A4]=D4=C4Y=A2=C4=09=1B-t=ACp=D1=C2E= +=91=87Bd=B4`=D1Bi=0B=186t=B8x:=03=C7=0E)6\=B0X=91U=EBV=AEYY|=05=1BV=EC=D7= +=A5e=CD=9EE[=D6=85=8B=170=8E=FC=D0=F0=11=E3=C5=DA=19k=ED=DE=C5=BB=F6E=0F=B9= +/=FC=FA=CD=1BX/=0C=BF0f=EC=D0=01=03F=0C=C5=8Dc<=9E!c=06=93%:v=F0=E8=11%=0A= +=8E=1B7b=C8P=1C=83=87=0E=1E/b$=81=E1=E3G=0C#)=1A.t=FDZ=B6=8A=89=B5!V=B4H=BB= +=C5=0B=12%:=D6=CDZQ=E5p=944=93=E4hQ=C2D=09=9C4=997g=A9=13=C5=09=185n=F8=B4= +=91#=86W=B0J](=B9=BE=D4=C5=10=1A=87_=88=9D=D1U=FDX=F6I=CB=BEHk=96F|=EFk=89= +=DC=A8=91C=86_=1Fs=EF=FA=17=AC-=1B=14=FB=EB/=C1=F0*=10=06+=1AcP=B1=19=BC=C0= +A=88=1CvX"=87=1CtHb=08.=98=F8!=07=1C=8C(B=06=D0b=B8=81=88!vXL=86=AC=1E=92= +=CD=A1=16e=B3M =DCp=CB=017=16=82=92=AB7=96=90=C2=8A6=E2~=04)=BA=CEZ=B8=E1= +=B9=16=FBrz=AE9=9D=94;!(=16j0B=88=1A=E6=13K)=1A=9Ct=8F=06=CE=80=A8!=06$Z=F0= +=01)=F5=BAj/=AC=A0=C4=13=CA;=B5=CC:3>=BB=FC=CA=A1=08=A9t=E8=01=C0=B5x8=90-= +=91t=E8=AB@;=03K=901=C2=1Ad0=86=19h =02=07=1Cr=10=A2=89/=E8=F8"=08=0A=8D=90= +=E1=B1=C7^=F8=E1P=1DhP=81=06=16_DH=05P=1B=92=88$=8CjXa=C6=8Az=E0j=AD=E5X2= +=01=BE f`a=A3=94p =01H=96b0=A1=85=8B`=D0=C9=84=1BrB!=C9=9A=82]b=06=14=B6H!= +=06:=8D=A8a=A9=EEZ=E8)=AC=B2=A2h=A1=07!x=1Cs=BD=B1=BC#=EC=87=1Enp!=07=17=CC= +X+=CC=FA=D8l=13=AD7y=B0=C1=86=1A=E2=A5=C1=C0=B6f=F8=F3?=D3:=D3=C1O=03=01=F5= +=D7_B=17=D3=C1=C3=0B=83=00"=0B'=9A=10b=07F=E9=FB=84=8C=86=1ES=8Dh=D4=83h=B3= +=D8=A1=DAHbA.*V=98x=89=1B=B0=FAj=05=A5jxA=A7!\=80a=88=87=86c=EE=C7=9AL=80= +=01=89=14=ECz5=BA=12=A0=D0=09=C9%M0=E1=84=FDfH";=ABx$+#k=BB=BB1=ACn=C9lOM= +=17=84=C0a=88=19=06=E4=01=887=DB=1Do=AE=B4=FEs=EB=07 |=C0=01=B4=BFb=A0=81= +=B0=03=0B=D3=81=0C=19=86=D8/`=00=E5=96=BB=C1=CFd =1B=07=1D=94=F8=C1=0B$=8C@= +=C2=B2=F2*=95=81=08=C3=06z=A8=D6OG]<=E3=83b$=E9=86'=82=D0=01+=A0=8A=A0=E1= +=86=1F=90=96=E1=04^=83=A6=01=05=D7=86#=81=85)rM=89&#x*=F9+=1D=96[=B2=04=17d= +=80=3Dv=DB=95k=01=08=BF=E2ms=AC=1C=CA=14=EBi=A8=81=17=EF=05=CD=7F=98=97=B0= +=18j=80=E1=AE=1F`=C0a=AD=B3=F2j+J-=94=D0=FBa=86=C4b=A0=FA=87|=F5=F2=8B=87 l= +=B8=A1=07=C2=E8F=BFn=C7p=E0=A2=08=1Ft=B8A=D1#=C4=E5=E1=B2=1B=E8=AC=94=87!|= +=A5M"=C71v=1CB =A7=02=16=88=88=07=F3y=02\=AA=E3=83=82=84=C7=05(`=C1=09$=88= +=10=E2=94=00=064YIsZ`=02'=A1=CC=05G=88=DD=CAnP;=DB=AD=00hA;=C1=13=C2=C4=16i= +=01=0Fx=C2=E3=8A=0B=AD=05.=1B=00A=0A5=10=83=0D=F0e=847=ED=E0=07yb=8B=9EH=14= +=04=1F=F4@=0A=16=CA=81=0F=F0S =04=FD=05=06oc=82=A0^P=AF=F4U=B10=8D=91=C1=0D= +=84=E0=03=0F=91=EF=06>=B0=81=0Fj =87=C8Hf>C=88=01=AB&=92=B1=14=AC=80(=01=14= +=DD=00=09x=03=91=A5Q2=92=99=C1=BC=92=E0=9F=17(=EB=06=09!N=E9.=08=1D=E7(G=06= +8=E8=81UN=80=C2=E9$e.?=8B=1D=0Ap=FC=D0=17=89=9DE=86=EC=81=E1=F0.Y=1F=17=EC= +=00=076=A0=01=10=C8=B7;=E3=D5=00=07m=D1=0B=A0n`=033=90/^6=08=C2=0D=86=E0=84= +=1C=9C=0F}-=B3=C1'=91=80=19*Z=B1=8AX=C4=01=E6NS=B4x=D5`J=E5=99=01=10.=E3+_I= +=EC=05;=A8=18=E3R =03=00:."=3D=A0=88=0A=80=90=14=EDU=EA33=00=E7=94=8Ci=03C= +=B1=ACR=AE=19C=0AX=92=BA=12=80=CC=04::V=B1Jp=04=C2@=81<=9DK=C1=14g=B7=03=B9= +=D4=8E=84 at +H=0F=92=B0L=B3=B80=93=C2=BB=E4=0C=BD=F3!=F2=FD=E0=078=80A=0F~p= +=03 P=ED{`=83=DE*=C7=F9Jq=F5I`N=CC=81=17k`=B6=04=05=CC=96=B7TL=18k=A9=98=1C= +$=E1=06<=10=82=0D=B2@=CE"L=B1=06,=C0=8Dm=A4=19=83=FE=05p"-=98=D1=0Ax =A2=C7= +=88H{6=D8B=11=FB=13=E9=99=F3=015=05.=1B=C1L=8AC=02=13=F8=00.=CC=E9YoJ=B0=9B= +=1E=08=85=06=E5Q=81d=822=87=1A=A0(=05'\d=EC=18=F9=98/H=AF=A0=98<=E8=D3=98= +=B6I=EF=DC=C042 =03=11*S=B8U>=81=07}=8A=81=F3=DE=D4=83.t(=074=B0=01=0F:=D3= +=19=FD4=A1N=01=BB=81bd=C0=83& =E1=0B:HL=82NZ=A0 XQ=B2=91-=8C=10=BCW=1D=96= +=C5@(=96[A=0D=10=17=A3=17=3DD=050=E8=A95K=85=03Z=1D=E1=0AK=A8=81=0E=08=07= +=06=1E=94=954=98=F1=81=17=E2=B7=D2=18=14=01=06+=D8=C8N=A0=B3=B3=F9=E8$=ADKR= +=01=B9X0=9F"=A4j=05G=01=13kT=F0=82=1C=9C=E0=05J8ax=83=A6=B6=BB=E0=80).@=C2M= +=9D=16=D71%=94=3DlzA=13=A2 at 6=1A=18=D3=BEtj=A9=9D6=DB=16C}=B1=07K8=FB=82=16^= +:=D4=93=DA=12=06Y=F8P=0E=80p=04=DD=0A=CA1t=93b=FA=14=03=D1=04=DD=85[=C1=C9i= +=8Cb=C3=906>=04_=FD=DB0=A86=C6=82=B8=1C=EAJ=A1=F9=0C\&$=04"8a=08=1D=9A=0A= +=10=9Ex?O=81=E4F2=E9=0D=D0:=B9=83=F34!=06KJ=81y=91&&=90=89=85=BB.8=8D=0BL= +=18=DE?=1A=8A1z!Q.=F1=14<=F6j=D2=BD=D3R=0B=A6=EC=FB=D5y=BD=F2=08B(=0D=1F=EF= +C =EDX=86NE=D8=02=10`=9C=83=19=10=A80}Z=8C=85=16u=03=8C=EC=A0R=05=AB%=DD`= +=F0=BC=FD=9ATw=80=B1K=0B=B5=82=1B=E4j=18"=02=94=08=0E=BE=0Ab6F=E4=06+=A0=15= +=1AyP=04=DA=A2=B8=BE=16=12=82=11=94=F0=05%H*=89=DE=A4=01=C5X=B2=17=17=94=80= +=06:i=1E=91d=00=96=1B4=01h=F0=F3K=C9=B62=D7=85=A6G=82=FB=8B=04=DA=09P=F0D$= +=D8=F5=05Cxe=13=94=B6=DE*s=87xH{o=0Bd=A0=97=1B=84=A1*=C7T=AC=1A8=D3=19=0A= +=17h=B1=FCL=02=10=16U=84%P=01=0EH=A0=1Cg=B4=C3=A0x=15J=07=BD=8EW=FC=18:=157= +=9B4.=8D=F1%=A0=ED=12=A6m=06E+:=C8=B0=0Af`=E8l=AE=C0P =0Eq=8BJU=03!=18=024S= +=D1=C1=BBc=E0=03# X=07=08=B3=AD=15=84P=B0#=F03=8B1=C0)=09ZP=83)=A4@#/=11=C3= +=0E,=97=14=3DeA=82=95=CA=E3=AC=BB=13-=B3=0Ch./=C0=B5=04k=90O=BFpa=08Q=D0=03= +=97=D7=A2^=D4=B2=D7=BD=D1=8A=1A=BBZF=D1)!=B2=07>(Cg(=DD=97=C6=D0@=0A;=C8O= +=FC=80=00=04&t=E1=0DH=18=02=0F=E2=F4=18=18l=0F=07G=80=A8=A5d0=CE=C5=12=01= +=EB=93l=B7=9F$K=03=07=F7=FC=B9=8A\t=82=0D=88=80=14p=A6j X=09=0A=BF)Rq%=02<= +=E0=AF=89=C8=F2=A6=B0=9D\^=B7R=A1Y=CC=0F=82=80=035=1F=E1=08A =82=0E=B8=10= +=19=C6=1C=11=075h=A7=AF@=C6=96=1C=A0=80U =93=CA=0C=9E=00=85=17=D8 at t=AB=DEJ= +=10=8A=A0=B5=93=99=CB=055x=13"wp=EB=13=E0=BBe#=BA=9F=A2i=D0=83=1Dh=C9=06=B2= +=F6y=D4=BE=85=DD!=7F=AD=B4qI=C2=A4=8F=10=85=1FxR=B7=8DQ=D4=0E|`=C3t=DF`=F5`= +xB=8BG=B3=83=19X=8A=FBA=E0A=14=EC<=A5=D1=AF=A1=0A=0C=D6=01g|pxx=0B=EC=89Gh= +=BB=DB=03=D6=84=A9_^=9C3=F8=01=134=AF=E4 =18=01=A7=1A=061N1=99=1B=C8=08=BF= +=93&=D7z=81,=A8=08=81=A0=81=A1=12=82=D0=A0=81,P,-b=82=1E=E8=01'=E8=01=B8=10= +=11=9ES=81=16=E0>S=01=02=FD=FC=E0)=92=88=81=1C=08=82=1F0=82=B2=81-=19=B1=08= +=AF=A0=81=C4=90=81"H=0C=18=B0=AB@=13=15=14=88=81[C=01=15@=11K=A9=01p=9A=81= +=1Cx=82=1F=A0=81=FD=E9=B9L=02=9E=AB=10=0B=17x=82v=A1=8F7=81=81* =02!=98=822= +@=82L=CB=81=F8a=8C=18=98=82 `=02=CE=E0=0C=F2=C1=01$@=02=1F("=1F=D8=81=0C=DC= +=C0=0Bd=82=1C=90=02Q=E2=02=0F=B1=8C)(=02+=00=82!P=14=13=8C?=CD=92=AC(h3=06= +=F1=AC=B6P=14=F2=E9=BD=19=B8=01$X=1E=1E=98.=C8S=82=D5=BA=8Dlr=AD#(=1C;c3*= +=008=11=83=88=1E=D8=02=80=BB=BBy)=0C4=A2=81=1FH=B7=C4=B2=AF=C8=B8<=0C=F3=01= +=C3!=C1=1C=A0=82=06=AC=91=AC=B8=0C=0D=99=BE=18=90=02=92=A8=08=AD=F8=A1=1E= +=C0=9B=AF"=1F=11=A1=82=F3y"=18=10=82=E9@=88=15=18=02+=B8=1B=13=FC=03=02=A4= +=E9=AA=E0=AB=92i=99!=F2=09=8A =98=1E=041=9F=1D @ @=02+X=82-=D2=01#=80=BF=CF= +=D0=B6i{=A59=CB=01=1Ep(.@=02P=CA#=CA=F1=10E=19=02j#=82"=08=02,=A0=02(X=02(H= +=BF=1B=A0=9C=F8#=94=12=BC=01#=D8=C3[=DA=01<=EC=01E=013=1D=12=11=C9=A8=81=81= +=92=81Ps=C4=87=A0=18=D7=DA=01=92=F8=95=82=98H=FF=C1=C4=14=08=B5=0D=83=88es3= +=C2=90=81&=C0=0Fc=FA*=13S=90=A3=B0;:=F3=15 @=01=E3=C1=811H=15Oi=01=D6 at C=1A= +=18=BB=1B=B9E=16 =1A=1D:=94*=B0=AF\b=02`=B4=81JI=886=92=82e=E3>=19p=82 =B8= +=0A=CD=F3=B7=B8z/#=14=0A=96[=8A=EA=D0=01mC=13=F18%=BD=90=01# =9F"=F8=81'=D8= +=02" =82=D1X?=19=F8=02$=B0=10=F8Y=A5x=F9=A4\=FCz<=1Cp=02'8=A6"=D8=01=19=F4= +=90=C5=8A=1F!P=82=05{=02&x=02=19=84=1F=F6s=10=BB=E1=9E=D5=E3=0BBA)=19=E8=01= ++X=94=0B=E1=812=9A=81=89#=02#=08%=BB=9B=11N=C1=8D=97=0A=A7IR=11=BF;4L=F4=14= +=87P=81=85=03=02=C68=1B=BF=88%=13=AC=813=C8:=8C=FB=0A=D5R=81=9E=00=99=0D=C2= +=01Y+=A0i=E2=AE)=B9=1A=8C=B3;=93i=8B=A1:=14=0A=89=82N=FB=A4,=FCE=E3y=02=DA= +=B8=C18=0A+!=BB=81C=81JgD=8A=DDh=9E=1D=08=0A=B6pJ=F1`=99=F1=F1=1A=B7=F2=0E= +=1D=88G=C3=C9B=1B=10=82=A33C=1F=A8=9F=C5=8B=8C=1A8=91=F9)=82'x=A5W=D2"=8D:= +=A6$8=82=FF=D2=C7i=CBF=F1=09=02%(=02"=106=1DH,=9C=F4G=06=D1=9E'(=03=C3=04= +=C4=BA=D9=C2=C9b=B1YYH=C9=801=E0T=95=87=FC=E4=1F=02"=02=11a=C5=E7C=1B=D1=FC= +;=C0k=1C=14=88=02r:=0F(=88=018=F8=8F0x=81+=80=BD=8D=EB=01=AC=D8P=15=E8=0D= +=83=88=89=9D=08,=A4p=01]=DB=1C=AFz4=0C=AB=08=17=88=8C=80=AC=1F=F5=B3=9B =98=95=1F=F4&=19=D0=AD=FD=88=16=AFh=C1= +=15@=0C=16=E0=81=AC=C8=A5=C5H=82=E8=B1E=9D=CA=18eY=88=1B=90=01=19Q6=FFH=93= +=16=C0=81 =00=0B=DB=BCE=90X=01cA=81+9=81!=08=16=89=FC=B1UY#=B4=BFz=C8=1D=D8= +=01=B3,=02=D1B"Sb=8C=1A=08=13=BF=1B=88 =B0=08E,=B6=A4=D8=A2=19=88=8B=A2=14#= +=1A(=03=DD=A2=81)8=02=1Bx=81*=90=17c=9A=01sU=A6=E6=01=1B7=EC=81=A0<=D5!=88= +=13=A8=CB at p=AA/=1B=88Gx9=D7=8Dz=A5>u=A8=89=8A%A=E5G$h=82 @=82(=08=82)Y=C8'0= +=14D=E1=BA=18=B8=82!=18=02=1DX=BD$=E2=93=81=C1X=C7=10=02=CA[=D4=A2*=AA=C9= +=84V=D4=D2=0FC%N=1AH=82=EE=83=1Ej=15=D1=D1=CC=18=19=10=A0=838=02=01B=0C=D3= +=F8A=A5 =B6A=D37=8Ex=A7=0CZ=01=1D`=0E=1B=DD*=1D 2=AFP=B2=FEI=CD=18=C8=0E)= +=10=82%=C0=02p=E3=A21<=98=E2=01&=10=02/h=02=A5=95= +=D7#=E8P=C2Q=11=90=A1Z=15=F8=01=CD=BC=C5=A7=E1=02=B0(=B2=A4=00=0B=F8`=8A;= +=E0=8B=1D8=82/=B4W0=92=97t=93=D7=97=A3=13%*=A6=BD=3D=02%=00%=BA=AD/=BD=85_= +=F8=D5=D3=FA=EC=8C=B6-=C9=1A=10=17=C4=08A!x=82&8=14=11YVE=C1=0F]=84\=C4=8B= +=DC=7F=9C=DC=0A=A5=CC)=DB8=EE{=0C.:=02(=FCp=E0s=0BM=D6=1A]=DA=C3=E0=14X=A4= +=E6=19=88=13@,=A1H=81=19=E8=AA=16=98=81X=F1=01=95=D0=91=0C=8A=8E=17=D8=9Bji= +=01#=80=81=CEC=01=87=81=81"=B8=81$R=3D0=D3=DF=F5{=8C=CB=A0=AD=DF=9BZU=11=E2= +k=15=8B=D2=88=9E=1BX_&(=8F=AF=D2=1C=0BY=A5(PM=C6=C0=C3U=BA=DF=BC]=A5w=AD[= +=B3=8D=DF-=E6=D7=F9],=1C=E0S=1B=E8=01(=F0=01.p=18=D2=D0=81=89{=02;=E0=C5=C5= +=BA=90=B4\=D4=03=C6=D8E-"p2=AA=1E0D=1A=A0=83=A00=8D-=DC=01 =D0=A8=87=C4=DE$= +=82=02=11=1D]=D3=C5`=B4=02=9A=1C=D41=1A=08=1A=17=C8=A5C=D1=09=16=D0=01=95= +=90=81=94=D0=89=93=99=0A=16 =02=BB=D0=01=09J=01=E5=C9=8E44Td5\=A2z=8CO=E2= +=01=1FP=01=1E=10=E2W=FET=A9=04=8B=11=DE=8D=84=9D=17{=9D/=E0=FC=12=82=CE=C0= +=02-=90,<=9C:=FC=0CJcR=D2,=E62.=96=DF=F9Uf=FAU=0Dw\=94<=B4=8C4=F4=01=F9=CAC= +=92=DC=01I=81=A8=81A=91=03=EEX=19=F8=01=D2=D8=81=A21Wcj=82=B6P=D0Tc=81G=CB0= +U=85#=0C=C6=B5=13=0A=96=12P=01=13=E8=81=E5=B8=8A=15=18=A4=DEx=81=D4Aa=12=18= +UN=16=9DS=CA=A7\=13=02=B6=88G=1B=98=A83=F0=81=CA=A8=01=F0=13=910=E8=09=CD= +=83=E5=89=B6Hg=EC=8Er=81=BA=1A=D0E'x=16( =82=1F8=02=0BY=D2=091A=1F=18=D7-3= +=E6=94~=DF=F8M=DF=A0\=E6=97=BE=81+P=B0=82Q=14h=DE=81=88e=82#=A8(O=C2=81o=96= +=92=04U=8CF=95=DCE=95=8C5=00=82=ED=03.=CE@#=94U=0C=AB=EA=91=054=B4C=16 =DA= +=03=9A=DB=91g=96=00=96=E4@=9D=9D=05=92=958=81=B0=9A=01=9D=FC=08=82=87(=01!P= +=0E=13H=01'`=0B(=B0e=F2=F0=CD2b=C8$=10=D2=DC=A0=E8=E9=BD=D2=B0=88a-=99=97Ir= +=8A=A5=A5=03p=EB=10%=C8T=19d=CF"=C8=02=93T=E9=94v=E9=97VfQb=EC=EA=BB=E1=9A= +=8E>&=F8=E8 H=02-=90=02)8=91=1Cp=82n*`B=99T=04=AE=D0=1E=C0=AC=0Bi=82!(=02= +=9D=06=BB!=90=82 =80=8C=03z=EA=95=D5H=8B=F1=C8=19&F=D1=81=E7=ACR=92}=D6=D9= +=11=10=01=11=D0=95=12=C0=01=DD=0E=09=B5R=01j=DC=0D#=00?=B3=05=C2=C8=98=81"= +=E8-=CB!4=E9=ADk"=9E=CD=FA =D7=B6=C0,=CB=AE=82nL=02=CCj0=C9X=82?=1E`=F7M=EC= +c=B6bK=1D=9F=C7=8E=1F=BET=E6=CE=D06j=AB=E9=09A=18-=10=D7! =ED=96=FA=01o=02j= +a=EC=EF=C5=10;m=81O=0Ba=82 =90=82{=CC=DC=1C=FB=00=88=1DOb=C8=88Ap=06=10=16*= +=16=A6h=E8=F0=E1C=14=12'R=AC=98=02=C7=C4=14Bf=C0@=91=E2=85=0C=140T=98(Q=82= +=04=CA=94#V=92X=E9R=04L=972Y=DA8I=02F=CA=9C&K=98=A0=E1=A2=05=D0=19In=D8=082= +=83=C6=0C":b=0C)=92=83=8A=8B=15,VP=AD=B1b!=D6=ACZUP=ED=EA=F5=EBW=16b=C7=B2h= +=F1=D3=85=0B=1AHr=F88Rd=88=93 :v=CC=90a=F7=0B=8D=1A;j=D0=E8=EB=F7/=E0=1A=82= +=07=13=AEa=E3=87=12(D=89=DA`l=E3=F1=0D=1CAp=DC=A8=EC=B8=B1=E5=CC=91s=00=89= +=C2=E4=07=10$h=80=F0=F8Q=C4G=8D=1FB=0A=C2h=ED=BAu=8C=A51^=D36=18=E3(=0E!HvH= +n"D=8A=13&Cx=E8=08B$HA=BB3=8A(d=08=F1y=C3=8A=D2)=AA=80=F1P=85=0D%;z|q=01=FB= +=D2=85=89=F0&U=CE=94=093fy=13-e=E6Li=D2=C4=09=144=C4=B6=88a=C3=05=16=18:=A0= +=E4=D5=F1=02=C7=112=1C=D5=C2X=3DL=B5=15=82=0B=81=B5 Xd=8D=05=94Y/=00=D1=D8= +=12>,=D1=83=19;=E8=80=84=0Eu=09x=94=0D=80=89=98W=0D=A8=15v=A2=0DBtA=C5=10 at 0= +f=C4c1V=E6C=0EQhv=A3f8pf=DA=0E?=F4`=C4=12E=D0`=84]=B6=19D=1B=0C=06=E1=00=C5= +=91H&i=D0=0C8=00=01=84=0E9=E0=90=9BjE=1CA=C5=0E;lT=90A9HQ=03=0E:\=A5=02t=D0= +M']CR=A5pU=10=A8=B5=F6=82=0BD=0D=89=82Y6=ADW=DEy}=96=F7'K:=B5=90C=0E=DA=D1g= +=03P.=D8=E0=D4=0D?=045=C3=0CL=C9=F0D_S=9D=99=A0V=0Cj*=95=83=F4=01=F5=02=0F= +=A8=FD=80=04=12<=F0=B0=03=0F=3D=F0=FB=05)=AB=90=8E=F8=D7=89=83=D9=80=A2=0D>= +=F8=00=04=13=95=E9xYe9 qe=0E7R&l=99=94=05=DBD=89H=D9=05=A6=91=CD=DA0=84=0F= +=B29=F9=A4=0CJ=D8&E=10=BA=0A=E1=A3=A9<=D8p=AA]=FE=D9@=04=0E1x=DB=C2=0E[=B9= +=90f=0Akz=E4=90=0A>$)=04=0EI=BEp/Z=9F=1E=E1=C2=09'=D9=C4g=9F=E7=01=FA=A7N%= +=9C=90=C4=0A6LA`Yb=B9=80C=94=0C=97=05=04=0E-=D00=ABU4P=85i=A6`=B5=B0i=A7=9E= +=BE=D0=02=0C=3D`|=D8=11>=E0 E=88=AD=BA|=94=88=82=3DV=C3=0D2=CB=8C=F1=CD=8D= +=F9@=05=11-F=91m=8EB=DC=BA=05=8E7=E8P=F4=95=95=CD=BC=EAQ=CB=E6=D0lAu=D9=A0= +=03=B3=D3=1AD=03l2=0Ca=04Q8=D4:=E1=0F=CA=0AH=C3=11-=D4=D5=97=0C=A8=B5=80=83= +B=ECBd=11D*=D4=9C=FB=DD=0F=B3=C5p=83O?=91=FC=83=0C,=F0=84BI9=AD=14=B0=9F=03= +=CF=D4=9EI'@(=D6=0F=0F=FA=F0=82=83=F3I=F5=F1W=1Cg=C5 =0Bl[JU=C8=13=F3=F0B= +=0CV=CE=10=B6`R=F8pC=13<(=11=06_H=BD=0Cs_=B2=FA=D0=C3=85=95=FD=00=99=101=CA= +=A8D=CA=3D=F8=F0C=10=C1f=F6=AB=10_=08a%=0EJ=E4he=D1=991a=04=1C=3D8=C1j=0F= +=CC=DA=16=AE=0E54ku=0E=AE=C5=00D=92=13=12=D6=EA=B8 at X=B5BB+=C8=90=95=DBn=A3= +=197W@ =05e=0E60=01=D4=83$=CF=E0B=0D=EA=CDD=B8=C0=0C=E7=92=F6=90=80'=AD=C9= +=97=83Z =04!=88=A5+=94=93J=E5,=A7 M=B1=80Fd=91X=02=B9 =BF[=11=C1/58=02_=0A= +=D3=97=D7=C1=0EV=82=01^=A8~p=03!=E8=C0=07=BA=93Q=9C|`=85=1F=FC=80=09=C3=FC= +=A2=0C=0Ev=00=04,=F8 at .T=18=96ep=10=05=1D$=EDF=C1*=CD=11=BA4=17 =E4=A0.=06)= +=92=0C=A6=A0=83=B7=10=A1=07F=9A=16=92=A2=F0=02(t=AF=087=98=81^z@=03=A2=08!*= +W=91=0A=FB=DA=A7=C6=E7p=A5=06< =88=0Cn =A4=D91=AC=055SB=0DX=E0?=80=11N=80= +=03D=89=DFJ@=03=03=C2=00=8C^=A1=0F=E46=D5=15=09N=10d1=A8A=0B =97=C7=90=01= +=85=06=C7sB=0F~=D0=BA=D6=89=88=84%4a=0D=8C =04?=8C=C1V=AA=B9=81=12 =A3=AB!= +=04a=09NHB=10~=90=03=DEL=A6LD=F8=DD=0F=8E at D ^)=0AC=B8=12=10=83=B8=851=00A= +=08C=98=0B=11=92=C0=03=0F=C9=80l=90=EA=01eh`=BD=D9`qN=F7=A2=13=9D=EES=03=B4= +=DC=C0=05e=A1=01=10.=95=C65=92=B3!=0A=FA=C1=12=945:D]P=9A=FB/=A8=C1=BFX=F2= +=92>=FAQ'4CA|<=C2=95=B0=B0=00=06/P=A489=06PN=F5=05=0A=F8+=8B=C4 =E4=9D=18q= +=F2U=9E|U=EC=04=03-=1F=A4=CAVJ=18V=9C=8A=F3=83+@=A1=0AK=08=C2=10r=F0=03=1D<= +A=07K0&=15=8E=10=04!=F0=E0=97=C0=BC=12,=91=17=CC=C8=E8h=08=A8=CA=C1\D*4H=11= +=81=85t=92X=047=E6=1C=A7=B6o=05}AM=0C=AA=17=03o=C2=01=06=0E[P= +=0B=90=E0=82=9D,=17%#hIY=0F=D7=93=18=AC =05=F6i=81=0C=08=04*,=04=A1=06=CE-= +=0B=E6=C0=12W=B9~=85=A9n=A5O=0Ex=00=04:=3D=AC=06#=D3[_q=F0=03=13=09&=B0=82= +=FD$=89 at i=18=1C=14=A1=86g=80=A5=14r=F3=04=1A=B6=E5=07=888=82=13LE=04%=00=81= +=86S`=C2=11=B0P=04=B9=B8=D6J98=0E=14=E4=F2=D2=11=BF=D4=B5=1Aj=A1=10z=10=84= +=04_iU=D3l=92=93=A0=D0=1A)=E6=C0=8B=DD=1CY[=03=8A=15=E2=D2=E0=A9\=01=EF=0A= +=B8=BB=83=BA=86mAb=99=0F=BF=14G=A0=12=8C=E5=04=01=13`J=AE=CA=82G=FET.W=E0= +=01=B9=9A=D9 at E=FB=AE=17+=9A=AA=D3=05=81b=83#=80=01=065=EB=C1=10=D0=D2=85=B3= +=F45F*L=82=7FI=08=D1=AB=12=C6D=8D=D1=01=10=9E`=85=93F=AB=08Lx=82=ADl=15=D9= +=C4=1Ea=09J=A0!=0D=95=80=04+`=E1T=A7=FA=01=114=94=D9=1Fh=E8J=14#10[=AB=83#= +=B8A=08L(=C2=166K=A8& =85=06=CD=B2=8D=93=08R=83=19=98=9415=08^=0B=8E=D0=C0= +=E6 =88=B8Pm_VZ=A0=A0 =E4x=05-=E8=01=1C=B6=D0W=7F=A2=80+3=C8AWHP8(=A3=E4=06= +%=80A=1Eg=C0=02=19=04!D=3D=F8=C9=96=E1=DA=E5}b=EE^=07=85=C2=10=F2=82=14=BEL= +=E1b.=EA=ABwlz=83[=FAN=08#=943`H=9D=17=A3=DD=16c7=B0a=9C0\=04"=18=A1KE(=82= +=16=800=BB@=F7=A0=E0=816e=85=07=DE=D3 p=81=09Q=D8=EF=940I=FB%L=8F8=07=C7=EC= +=E1=10=96@=06=D0Fz=96=CB|1=AA_c=9B!h!x*"=C3`=BE=F8=CFE=D6=BA=9Cm#'=82vp=A9= +=B0|=11=0A*=8B=0D=9A=ECX=82=EB=06=D0=8F=D7=B5I=09=BA=AB=82=13x=07=066=90=02= +Y6=B5m=F6=FA=9A,.h=02=0Cp=F0=93=9A=BD=FB=AF=82=E9=9E?_=00=031=E4=B0=09;=18= +=0E=0F\=F7:=13zM070=82=C9 at h=98=1FD=D8wK=08MbQU=05=DF=15=BC=EEv?8=DEsy=84)= +=ADt=09]P=C2=8A=89#Z=1DU=DCW@=A0p=10=90=D0=04=DFhH=08;$=0E=A4=84z=EA=C97=B3= +J<(p=08=87=93m=1D=0F=B7};=E8=B1S=B52=03=04q=CE=05A=A0=81=0E=94=E0=83=19|=AC= +=05=F1D=8F=CF=03=C5=93=9D=80=CA,@=E1=81=0B=9C=D0k=AF,=DD=C8=AC=DFA=0BV%=98#= +=BC =07=AE#=91=C9=FB=9A=F0=18)=C0 =07Z=8F=81=13p=9AX=B1=8F=DD=92^=F8=96c=A1= +)=B4=9DI=C1d6=B0=D2~=E9Nr=1F=B0=D4Tv?=BF=EF=F0~=F0=D2N=09=08AH=82=12=A4 =9C= +#=84T=B4=AC=ADxH=F1=FC=03#@=81=09X=E8R=D8=AD=9A4=81=DC=E4AI=8A=E9=00=0F=94= +=1B=AB=D0L=0B =8A=13=0C=01H=E8=D8S=CD at w=D9=9A=E5pN=D3=C8=C0=84=DC at Y=E4=80= +=09=C4=DE=C0=9C=95=09=88=04=06%=1D=A7=F0=DE=B6=1D=12=13=94=C5=AA=D9@=0C=D0= +=05=0D=84=0Ae=C0=D1Q=E4=12=DD=11Ae=B8E=D6 `=B4=00=C1CQ=D4=EC@=D3n\=81=10\Y= +=DD=8DJe=08\=10=DA]=B7=A4=CA=DD=A9=1F=A2=EDW=A0E=A1=FBM=81=11=FC[=A8=B4=96= +=16j=07=A1=8CX=12=94=09=10=F4=08E=A1=0AH=9D=0D=01R=1E=0D=EC@=0E|=C1=0C=F4@= +=87=B8=CA=BC=11=C4=10H=1B=E7=FCu=1E=FC=04=DF=AD=95=93=04=AD=C0=F9=F4=C0=0Dt= +=95=148=1B=17=90=C0=15=EC=09=A0=18=E2=E1=14=0C|=BCI=09>=C8=CA=B1\=97Q=C5=C7= +=B0@=88H=81=0Ch=C1=10=0CA=F5,G=16=D8=94=87=D0=80=0FlG=0FL=01=0D=D9P=13=19= +=01=94P=81=80=10=C1=0C=1C=C1=EB=84=DD_=CC=0A=B4=A0Pi=18=C1=11=98=86=A5=99= +=C1=15=14\=136a=DD=F9=80=14 =81=12=1E=DC=A8=DCb=14R!=83=99=8A=86=A8=A1=A6QI= +=17=92=98e<=86=15=08=C6Q=F0=C0=B2=14 6*=C7=87=90=0F=0F0=C1=F4=E4=91pq=0C=BC= +=A8=80BL=D9U=10=979=ED=E19=E2SI=C4=93=1F=9D=84Y=B9=07O=F4=95=0E=E4=85=C44= +=0Ex5NW=D8@=1Db=8AW=CC=CA=12=A4M=0DT=C9=17=99=97=1C=85]@=DA=05E-=01=114=C1= +=11=08A=10=F0F=0DX=CF=87,=CB=7F=1D=D7=BC=A1Y=0F=14A=13=FC@=01=140=D1=87=0D= +=C1=134Z/:=E1=DD=B1=DD=10=FC@=15L!=15=14=D81=BEd=10=18=C1=10=94=C1=15p=C1k= +=11=07=11pHka=DA=12=DC=00=120=CD=00^#=E5a#=1C-=8Br=F0 at f=D9@=13tS8.D=0D=A8= +=8BVh=01Q=D8!=CC=AD=D7=0A=C8=0B=0C=04=0E"=86=E0=0A=90=07=01=95=80=0B=A8=80= +=0C =DBm=1D=D5=0B=FC!H=CC=87X=9CO?=92=9ET=B0Z=0CT=0A$=95=85=90=B8=C0=E7=BD[= +A=9C=D6=FB=85=C1=18=9CT=95l=8D5=16=A5Q*=C7C=F5=C5=0A=F1@=1E=D4=88=14=94=01= +=13=08=C12=96FI=A2=9F=C1=F9=80=128=A4=11 Zh4=01=10,=01=A2=09c=85!Zg=0D=8119= +A=18=0A=01=11l=01=12=10=81m=0D=9E=1A.=C1=0C=FD=A4=0D@=CC`=16=E0=1Ff=E3`=0AH= +=16=C8=80?e[V=D0=1AW,=04=13dE=CD=C8=C0=99=FC=A0cT=E9=1A#=F9=80=3Db=84W=B2= +=C7=E1DE=01=11=90<=8E=E0=09=E4=C0Q=A1=05=0C=84=9DP=DD@=13=11=08$^=E0[J=DBTL= +"=E7=C8Z]=B9@=E8=D0=80,%=09=0E=A0=C1=11 at A=11,=10A=F2=00=0E=DC=E6`^dD=D9@=85= +=15=01h%=01=14t=09=00v=8B=EF=80F=A09=C1=C1A=01=11x=C1=DE=B5=9F=A2%=C1=94=80= +=C6=188=E8gN=09D=AE=941=19=C1=83V=89=16=96=D8=02%=C6=E5=AD=DA`=09=A5=914=13= +Q=0A=E6`=1AA=0Dd=01=B6}=05r*=88=8B=AA@^=80=CE=A5=A0=E3V=AC@"}=E7=0A4=8EX=E8= +=80=10=98=80=D4=1D=0E=0D=EC=09=09=B4=00=0A=AC=C0=0C=B4=87z=14=0CO=9C@=D9=9C= +=05b0M=A3=B4a=91=B4=E5=E5T=0A=E7t=05=05=9E=A0T=D8=C0=AF=E4=85=0C=D8UQ=F8=CE= +=138=C1=89=89=91=870=D3}=16=A6=07=DD=80=13=FC8=01=18=18A=13=94=CA=A9=00h/fR= +N=1EA=15=D8=DC=0Fd=01=13@=01=17=00=1E=A8!=81=16h=01=E0MI=130=C1=14=B4=9F=A2= +=BA=9F=10,=C1=14hA=12=98=A6=1B=EA=80=15h=A1=A6M=01=1B=CC=E9c=91=1A=9A=DEf}= +=12=A5Q=D2=05=A4|=08=0DP=8A=A5P=A0=0B8=CA=99$=CCU=B0@=A4L$=DE<=E5=8E=85=1E= +=E9%=C1=E6=1D=92=1C=3D%X=FDQ=10$iN=C4=80=0F=F4=8B=11=A4=84V=16=D0N=98=C0=0B= +=0C=81=0D=D0Wc=00=0FR=C8=D7$QE=15P)W=F0=C0=03=01T=E6=D0@=84=FC=04=11=94H=14= +(c=E3)g=AB=D8=E76V_=0C=EAg=11=18=81I=F6=80j=02(=AA=F8=A2=98=06#=15=FC=80=14= +X=81=11T=81=13=10=81=16D=C1=11 =C1=98=0E=01=11P=81i=1EA=12=B4=C8=A2=16=13= +=12$=01=194AO=F5=94=86Z=AAk-=81=12=ED=80=12=FC\fP^=81E=0A=88=0E=F4=D4=19=DE= +g=11=1C=C5`y=D3Z=D6=95=1BJ=A2=AB:=CCQD=01R4=95=1E&=88T=F4=CD=C7@=C1W=B8=C0= +=15,=17x=EDI=0A=B8=C0=11=A0 at t=FA=0B=05=8AE=E0=18L;=EE=04O=F8=C4G=A0=C5=BD= +=D0=80&.=8B=0DX=8A=97Q=E9=CA=B9,X(A=1D=D1G=B5=91=09=0EX=C1p=00=01=DA9=E6=E7= +u=AAE=0EVC=A9l_<=CB=130=81=F9u=8B=BB=BE=AB=80=0E=A8=14=84=01=E0%=C1=13=18= +=81=11 A=BA=D2=AD=11=8C=81=11$A0&=C1=16=FC]fMI=A1=BA=1F=10=0CA=14=18=C1=13= +=F0=C0e=3D,=C4=E2=D4k=3D=AE&=B1=CA=1C=0A=C8=D8=10=81=0DxH=01=DEf=1B=EE=C5T= +=F5=C5=E7=B0=00=DE=94J=F7=94=0B=0Bpn=0Dt=81A=BC=C0=1B=80=8EV=B4=AC=CB=B2@= +=0D8=DF=96I=0EU=E0@=BF=B4=C7>=A1=8B=BF=F4=CB=D3=FC=E8=00x=BC=C7=0B=A0=00=D1= +=1E=EB=08=A2=00=12d=DD=93=10=04=DE=1C=C8zY=85:R=C5#>=08=0CX=C8=C5\=8C=AA=F0= +E=D8]=EE=A8j=AE=CB=C4 =0E=10=96=CC=F0"=B8=BAk=13.=E1=C3!=01=134A=C1=FE=1B= +=FB=FE=1B=DE=D2=ED=11=F4=AB=18P=01C=06=81=FD=06=81J)*=0D=C5=DD=E3j=A1=16@= +=ECk=B9k:=E5=C5=F7=82H=EC=1E=01=DA=10`=D8=CE=00*-=01=0E=F0@=12`L=19=D9=C7= +=00B=CA=10=AC=8D=80=14=81=15=10=81=0C=F4=00=E7U=E5=E5\=0E=0B=BC=00=A4=9C=17= +=EC2=CCO=00=C1=09=A4=00J=A8=87=0A=D8=91Y=10=01O=B0=CD;-E|=04o=C5=B4c=BF=BC= +=07|=E4=91?A=CD=17=82c\=8D=1E#Q=10}=A8=CA_\=95=AB=8C+=F7=82=EC`%=D6=DA=0D= +=06=83=CD=CE=9C=D2=A9=F9=15=DC-=DAJ=14=CC-=FF=11=01=11=B0=EF=FB=F6k=FC=8Eq= +=FC=FC6=81k=0AA=11\=81=14 at d=FBqA=12=E4=E4=E5=3D=EE=E3=AE=A6=16=060i$=D6c=CC= +i=1EP=C9=B7=E6=80QR=1Ea=0A=01=1E=9D=CA\=98=CA=ED=E0=80=D6=A9=A2=0C|=8B=11= +=D0=88=A9=C9=C0Or=04q=B6=1C=AE=D5h=8E=F5=D3=13=00A=F0=99M=0C<=08G=8C=07>=A1= +=80=0C=EC=C5=0B=A4=00=D1=11=08=C9=E8=DA=FED=D7=0E=C4=C0=09=C0=07x=84Gx=9C@>= +=BD=D6lPM=0D=F0=C1=0Cl=81or=0C=0FD=A2=91=D1G=9D=18=05=CCh/=137q=09=D5=00c= +=A6=18R.=06=F0=04,=99=92=EF=15N=D8=14|=F1=16=E4=92=13=EC=9B=17=7F=F1=BFM=D6= +=11=D8=E2=12$=01=12=1CA=17=8Cs=BFV=81=12P=C1=15D=EA=FD=DAo=CF=00=AC=17=BC= +=C1\=BCV|=BEV=1D=EB@=0F=EC=C0=14\=E8=0F=E8=C8=14=ED3=AAlo=91=9CZ=B8=E0@=F4= +=B1A=A5=EA=80=16=F4=80=10=FClA[=C8=A6m=90=89=12=10=E1j=C8=00s`=A9=04V2V4=C7= +=0A=18=1F=E7\=89f~A=BD=09=01$=E5=00=81=98W;=9A=80=15x=8B=11,EC=10=84X=B0=CD= +=E4=D4=15=0BP=81=BD=BC=C0+=C7=80,=D3r=0A =85=0A=B0=1A=1Aq=15=10=14q=0A=D2= +=15=E8=12E=13=B9=0C=16=B0=0A=B9=96k5=0AF=AAtI=DD=F5$wV=B3=16l=07=80j"=15=D4= +=E2=100A=18=A8A=104=81=13l07=A7=AB=96=A4=01=14 =C1=14L=01=18=90=CA=14=90=0A= +\'=C6=14(A=85=B6=F3=02=19S=10=F0@=A6=FE=C6=89=D51=F9uA=E21=01=1E =01=17=B2= +=C5=E5EA=A7=022=10(=87=86|X'N=81=13 Af=D5'=98=C8=00=BD=04=81=EFP=1B=1D=F6= +=A3=8Fy=D9$=9A=9A=81=B8j_8A=DA=80=AC=C9,A=BE=A8=CC,=FF=C4#=ED=00=0C4=C1=9B= +=185}=18=C1=0B=FB=D0=C0=D0=9D=00=13=D0=B2ngD=05M=819=B9=EAo=C2=CF=D2=3D-=E7= +|S=F6=C8@=0D=C4=E7=A9P=9F@=DB=E7`i=D2=A9=A0]!=9B&=86=92A=F0=DC=E4=DAZ1=0De= +=D8=12=08=07=C0zq=11`A=12T=C1=11X=01=14PA=16<=C1=184=81=14D=C1=19,A=C2=8A= +=F38=BF=C5=02=19=C7=FD.=10=9C=DE=A2=10=C0=ED=A42=EE=E3=16=01=10\A=14D=81=C0= +=BE=96=12=D4=A3=EBL=01@=C8=10(#FA=83=05w=10=14=C8CI=0E=1D@=844=09=E3D=88=90= +=1CMf=10=8C=01=E3=85=8E*3j=D8=E8!c=85=0A=93'M=AEH=B1=92eK=96'Y=ACX1=83=C6= +=19=198p=D4pq=A3=C8@=194=80=02=E5=91=03=87=8B=19(=90=98H=F1=82E=0B=187p=A0= +=94=C9=82*U=1C-=B0f=CD=F1b=05=0C=18'R=9C=10=8B=02E=0A=1C)T=B0=F4a=D2e=FBK= +=94o=E1=C2=959w=05=D5=17.h=F0=E8=D1=03=09=D0=19=7F=01=FB=14,=E3/=93);=9C8= +=D1=F1d=C8=0E=1DC=AE=F0=81r$=08=0F=1D=0Eud=D6=B1=833g=1E=9F}=14ILeHi"=A7=8D= +0=F1=A3=C4J=13=D7=89=9D<=81=E2=C4=8A=923J=92 I=B2d=CB=10/C=AC=08=09=12D=C8= +=14%Q=BE$=112=87=B3=E6=1C=CF=A1=E7P2=86=0A=12=D1=3D=1C=F3=B8Q#=E3=E0=83=075= +=C6=A82d=09=8E=1CQ=80=141B=04=8C=E3 =03i=E8=E8=D1=E2n=0B=165d=FC=88=CB=B6m[= +=15%g=EAa=86=1F=82=88!=87)=8A(h =1Bh*c=BB=EDj=D8=08=AF=B1R=A8K&=1AJJ=A9=AE#= +=B2r!=08=17Z=E8=C1=85=11a=18=8E,=1AP=18=8B=AC=B2=DC=EA=CF=A5=FD`<=89=AE=B9= +=A8=CAJ=86=1Ap=F4k=06=1D=FE=1Al=A0=BFj=08=03=08=1El=FB8=02=87=1Fx=D8=01=88*= +=84p=C2=8C(=84=E8A=B3);=F3=8C=07=1F=96=98=E2=B4=D2=868=ED=88"=9Eh=C2=09*=98= +h=02=8B=C4=B2x=02=0D(=D8=CC=E2=0B=DC=92HB=091=95 M=B8=E1=82`=E2=88'=A8=10= +=02=0A=1F=A6=8C=EE9=9Ct=98=C2=87=1E=AEh=0E=8A=1C=82=E8=CE=A7=EF -=08=88%=82= +=C8=E1=06=F9|=F8=C3=07=CEn=D8=81=0A=81h=AA!=A6=19W=A0a?=17_4i=060th=A1T=1E^= +=C0LA=C2p=B8!I=1F~8b=87=1B`=D8=08=87=15G=CDP=C3=BAZ=08=E9=85=1B=82=E0=C8=86= +=BBFt=81=A4=18dXQZ=16_@=D5=BF=18=E3=92i=0BR=ABj=C1=A8=1A=82=0A)0=1F=09+=02= +=07=A0=B83=02=A8&xxb=09=1F=D6+-=3D*=A6=DC=8C=B3!>=DB=EB=CB"=B8$=E2=08&=ACp= +=E2=88+=98(316=B6=F8=A2=0C1=C4=88=FB=02=8A(=A8Pb=09=DC=B2=80=A2=0D%=88=A8= +=08=CF ~=F8=C1=87C=B1+=C2=B1=CB=A0=BBl=87ZE=1A=A2=87#z=A0=E1=87=1C=8E=A0=C1= +=D1=81"5=C8+=19`=90=01=8A=1Bn=00b=07(=88=C0=C1=0B=99A=FD=8B=08 =82=C5=D6Z= +=B7=FE=BBA=08=19=EB=CAO=A3=FCj=B0l=07#&=0B=CD=E9=8Dd=E0a%=AC=84=FD=8F*=1BZ= +=10.>=A0=80Pb=06$nx=C1m=18x=D0B=86=14=C8=A2{=C5=A5=FB=C3=F6=AD=19]=A5=B1=A9= +bk=88=C2=06=1C{=F0!=08=1An =DA=C7!d=06=0C=B0=C4=D1-=BC=87!=89x=97=CA=CEx=B8= +=A2=08$pM=A2=09.=BB,B=8A.=C0X=A2=E0&=C8=18=A3=0A+=AEh=1D=0B;=A2=808=8D=88= +=E3L=A2=08"=86=A8H=F7)=8E at 2=C9=91=EB=CD=8C=87"=84=00"=87=C1=C1=BD=C1=07=C7= +=C7=A5=B9=E6=8D=BC=8A^=86#l=18=1C=FB=F2=C6=09=DB!=0AQ=E7=D2=1B=EF=97f(i=A5= +=94h=CA(=86=1F=08=1B=C2!=DC=A1@=E2=0B$p=C8=CC+%=D2=B2=81=86$`Z=A1=05=C7.=FD= +=8B=06=1Cqd=83Nq=84#/hAZ=C6g7=16}=8Fi=FB!=D5=8ChP=15=17t=0B=069=A9=C1=C7x@= +=842=F0=A0y=03=11=90`=98=17=AA=1E|=C6=0A=9D=B9=DC=0E=AE=E4=83'=CC=09=09J=08= +B=C6 at G=04=CF1a=09M=88=82=13=AA@=85*=A4=E1=0B`=E0=C2=18=B2 =06)D=C1=0A=13=93= +X=13=1E=96;=DD=09=A1K=FE=FA]=F04=B3=03!=18=C1c=DB=D1Q=07=05=13=A9=F0=F8=A0= +=80/=08B=13vP=BD+=DE=C0 at H=10B=11Z=90=83=B0=C1=88=81h=C9=01=02=C7=F7=1F=17= +=E0=00g=D0=9AA=A5t=10=04%p!=0DK=B0=C8H=A0=A5=03=93xe=06)I=09=0Bh=90=03=C2= +=CC`Wd=18=02=10p=FC`=83=E7=08=81=80M=B8A]=B8=D2F=17=C1h&=11=8CIL=800=97=FDU= +=A5[.=B0A=18=91=E5=98=1D=8C=84\=E4b=1E=0D=CCS%=CB\=AE=07Lb=82=10=94=90=05)L= +a=89C(=02=13=8Ap=84*,=C1tV=D8=C2=14=A8=E0=85.=B0=E1=0Cc=08=83=16=DA0=05)=A0= +!=0DRP=C2=11=F9=D5=04#=E8=8EKQxb=14=A7=E4=03=86=1C=AA=09=E0b^+=9D=07-=19=F4= +D=06#=E1"=B3\=F0=83=9D=F8=C0=068=D8=C1=05q=00=85=1D=00fTJ=D3$=0B^=B4=82=1E= +=D4=E0=05=1B=89=01=18~=D0=83=1C(=A9=09|=F2=A5=0E=B6#=03#=0C!=06(BK=1C=A7=82= +=1FFzs=95M=00=14=CAp=E6=95=18=CC=E03=82=D4d=DEb=14=B5=1C=B8=CC=93,0J=0C=B0B= +=B6=0E=89=87P9=90=C2=0E|=80N=1F=91=B4J^@=92=09=A9=94=84$=F1=E0=07D=80=D7=14= +=FB=C2T=91=D2=14a=09Z=88=82=9CL=E7=04/=E8p=0BhhC=00=0A1=86-xA=9AQ=D8=82=11= +=A1p=87%d=01wJ=1D=C2=97=86=F4=03=CCM=A1^=98=E3=0B=CF=1A=D7#=9D=0AF1GP=1F=12= +tP=14=10=81=E8=05=D3=D3=01=0F=82P#!=10=94=06=3D=E0=CA=1A=DFrR=97=F4`=05J=A0= +=C1=15r`=D0=18=DC=A0=07=B6=02=02=AE=82=80=9D{=0AD=0A.x=C2Q=02=1A=03)=18!=06= +=DC=D9L=97=9E=10=04 \=E6HP0(H|=B0=02=17=BC=E8=A4=D8=9A=CA=0Bh=B2=03=F8=0D= +=14~/=10g=B3F=F4=02=B8=C9`=0A?)Bw=D4=A9=D3W=D6 =A1=0C=B9R=F0Ti%.=E9=CE=08J= +=18B=99"=A6=04)=88=01=0D]=98=82=1D=B4=F0=861=D0=81=0Dj=F0B=16=90i=05=1A.au= +=C1=E4=97=EE=9C0=85=B1=1E=81=89B =02_=80'=BC*=0D!=92=E7=9C=FB=ABO=F6r=99 = +=DC=C0=06:X=16V=9A"A=FB=C8=04iU=01=CA=11=10{=12=C5=B6=A5=A03iB=0C=84+=04-X= +=0A=07S=C0=D7=0D=920=03=1B=08Df%AB=0Ah=F0=12=93=E8@!=0A=15=C2=12=D2P=9B =08= +=D8|9=BBJ=86\=F2=C66=EA=ED?=FA#=9EB'=DB=B8=FFUo=07^t=9Bp}PZhi=D1=95=CBU=DE= +=0F=B6y=04(f=863 at 8=C2=96t=E7=C7!D=01=09M0=E2=12=AC=10=85=EDfa=0C`=00=C3=17= +=D2=80=05=1D=E2=D0=CB=05K=02=EE=A6+=1C% =A16O=F0=01=1F~=97=DF=CE=8CP/=F6=0B= +!=08Y=E9=13=C7=95=81=08<8=82=0Fp=B4=11=FBPe=82T=C1=D0=03=BB=A7=82#=9C=EA=A4= +e)=8B=0Al0>=C3=0A=B7=060=D8=15=F2B=12=D7K=ED=C0U=8C=15=DFEU=A0=04=AFd=06=07= +=EEC=02=14=BAt=99!d=E4=07=FBv,1=7F=FES=C8=1D=DB6=A3Q=D8=E7"=83=B2=9D=EA=1D!= +=A4=D1=EB=D5=F3@=18B=1F$.=809=80H=11f=09E+=E5=8A=97=BD$B=11jW=A7=D9=C5=CE= +=0EXh=DD=15=ACP=851=90=A1=09=05[=02=18=BA =85=DB=81=AE=09I=F0=98u=AE=90=E7= +=FCb=A9=D0@=90=1C=B8=80r=83=10=D2d=08=AED=1C=0D=82p=A8=00n=AF=06=08=0E=96= +=FEf=C4c=09W=FAnu=93=81=16x=D0=C5=1B a=06J=00=02Pt=00p!=B4=C0=06TYA=A7=F8= +=C3=12=1E=D4Q=08<=F1=C1=11=A0`=84=EC0wj=E8=EB=A7IJ=8E=E3=EF=F1=BA.@ =C2=B8h= +=E2=05=1C=10A=9F@=E0=19=14p=16=D2=E7%=F7G48B=0E~PX=96=A9L=80=F6tHt=A8,=B2= +=BD|=ACc=1B=AB=08=11=94=D0=06(d=01=AAurX=14=18V=86/l=81=0D=89)7=13=AEp=04= +=DA=E8=FC=09=CE=BE=0C=E6^>=D3=98=E6L=89=0AE=00=82i=8C=80=A5'=F0=A0=09 at 1=02H= +=80=82=83=E3=B6=120=83=0B=D7=0C at T=15Rm+=C2=FE=FC^=B5=148-=82=AC@=06=C0}=C1= +=B2J=D4=B6=C1-X&*`=C1=C2=15=88=83^=3De=07=BD=DB=94vp=80=DC=18df+<=C0P=0Bt= +=00=86B=86=DCZ=FBy=F4=8C=EE=A38*=EC=8A3=99:=14D=19=B5=04 =0C=DD =83=B9c=0E= +=A0`=AF+=14=8E=AD8=11=14f2=E3=03(=08=81=0AO=F8=97=D5=87=101'4=01Nr=FAB=C5= +=D8=84=86'd!1X(7=15=B6=FF=84`n=C94D=90=AF8=E5=9D_=CD=F4@=08Q0=03E=AA=E03=A2= +=E2=80z<=00B=18=B8cf=92=8DGh=E2=7FpD=06=B2=C2=E3HE=E1=E0=02o=E0h%=A4e,P=04= +=05=86=03=06=9Ae><=04D=B0=E2=08^=AE=D0=C2=86n=FC=C4=82=06\=A0Wp=E4A=CA at fFL = +=0A=A2=08=A6 =B28f=06=04=04@=1E=10U`=04}D=C5[=0CHJh` fl=07=C0=80=08=8C=C0= +=EE=A2=80(=96`=08=AA=A0=F8jf=A7j=C0V6=A3=07=9C`s=A8`=0C=1A=E2=F9=A2h=07=E6@= +=08=92=E0=0B=A2@=09xi8=84=C0=0A|c=08=BE*7=E4=E46=02=06=0A=9E=006\=A3=09j=C3= +=0F=98`=3D=D8/=FB=12=A3=08=E0/=FE=EA=C5!=00=0B=E5=F8=E0=0A=86=E0=B4=9E@=07= +=12c=07=A6=80=09=E4=AA=C9=1C=07(=90=00=EED=90)=0E=AE=F3=180=B16I=05|=E0%=CC= +=C2n=C4=02,N=C0+V V=B2"+p=80=94^NXV =A7=AA=C5=04=90=00=05=10=CF<\/(vp =8A= +=E0=06\=A0=06pB=06=CE=A0=C4=EA=02=F4=AC=A5=F1(=AF=07=06g=06=AA@=07=84KAf=A0= +=09r=A0"=9C =0C=FC=9A=A0x.C=09FN!v =09=07b=0A=FC'>=94 3=A8/v=AE =3D=9C=A3d2= +=A3=07=94 =0C=84 W=B4Ic=86=83=08=88=83=89=82=09=09t#7=96=E0=0C=C4=AC=09=C6`= +=FC=A8=00=0A=AC@=98=92=00=0Bn=87=FDh=08=0Bz=C7w=AAD=96X/=08=C8=00=08=D6C=08= +=92D>T=8E=07=98+=AE=D0)=84h=00=85=CE=08?j =E3=16=8D.=1E1.=02J=05f=E0=F3V=C2= +P=00jE.Q,=98@,T=80=06^=C0=08=16M=F1=16=F0?<=8F=E3\=E0=04L=C0=04p=C0=07=BC= +=C5=05=96@$=CA'=A7=9C=C0/=A8=A2=07**&\=05=12k=CF=81=EA=E2=8Ed=E0P=82=00=07= +=84`jn=02=08=82=00=09=E2k=08=C8=CA!~M=06=80@=05!=05=84=A2=00=DA|=E09v`=CE= +=F0=80=09=90 =08=BA@=08=00=05=EA6C=0A=0C=92=0D=00K=89=EE=C4=EA=FC=B8=10=0A= +=E6L=1D=D5q=0A=D4=11=0C=A6=C0.=A1=20=0D=BE$=08=8B =1F=03=A6=09=82@=0D=C2=80= +=09=86=80=8Ax=80=0Az@=EEVi=07=B4=C0=FD,=E5=06=96`/4k=84p=C4=F5=FCk=A7=FE=02= +=0BB=E8xxF%=13=EE=11=1B=EF-=86=CF$b=82G42=C5=C4"&M =06L=E0=04=DCf#=A8=C0=A5= +=12=AC.>=91=05=08=A2BL=8D*=AC=C0=04J=A0=04L=00=06n0=07=8AE=08=06'=07=BE=00= +=08=9A=00'F%=912=E4=F3P=C2=01=F7&|=A6=82=9D*=E2=0A=94 '=8Ao=06=F8=CF=07=B6 = +J=B4=E02=AC=80=0Dr=C0=09=E2=07+=BFC=D0x=AA8=8A=80=B5=A0,w=0ECJH=E69=AC=B1= +=3D7C=07=DE=C0=0B=E0=CC=1C=AD.=09=AE b=AA=00=09=8E=E0=08=90=A0=0B=08t7=8E= +=C0=08=D4=CE:=FE=F24NC4zg=0Bn=C78=AE=CD=08=E2oL=FC=CC=F1=07=08=0CY=F4B=08= +=98=A0=0C=F0=ED=8A=04=F0G=98=C7~=1Ag=C0=12O=01WR=E1x@=E1X`=0Bf=80=0F=F0C=07= +z%3=C8b5Y=D3=04^=F25c@=B7=BC=A5=90=9C=C2>p0=076r=13[=E0=04P=80=04~=13=06f %= +G=AAXZ=00=08=9E=00=06=1A1&0R:=F7=06g@=02=09=08"=91=E0=85H=04=82=0A8"=92=FCq= +3=14R=09=84=A0=10=99L r=80=07=A2=E0!=F2=C03=AAG/=FCod=9E/=DA4=03=DA=90@=86= +=B8=00=08=FC=948=A4 at s=BE=B0=86=06=B4P=07T@=8D Q=FD2=1FS=CE=08=9E =0A=A8=8Ee= +=E0=EE3=FEQ/=A8=EE=07=00=E8=07=06G/=E2=AA|=0AQ=3D=FD=07HV1rR=12=D2F=F3-fOo= +=EAB=16=93 <=0AB=B8=EE=03&}=F37O=E07M=A0=05~=E5=05Rd=F5=08=8A=05p at G=FCu=C0(= +=86=E0=06N=80=04L=80=04H ,=80=C0[jDT=A8=82Ig=80)=C2=06=B1=18([F=82=08=AC`= +=F0=AEb=D6=BA=83=06l =06\`=B0BB=A8p`b=F4MM=99=EC=C1r =D4h"'=80b=09=AA=84=F5= +=04e=C3=B8=D1L{=A0c=FC=F4O)=03O*=87=0A=C4@@=13TQ=17=F5/=FFr=08f=08=09~ =0A(= +=B3=0E=E3=0F=85=F2=85=17s$Dq=0033=13T=ED=C7=F5=08=C7~=EC=E7]`=A0Te=E2=B0=1C= +1=A5j at 4=11=E9=06=C2=A3=80`=E0=14Q &=7F=B3e=7F=13=05^`V=81=D5 at J=A0VK=C27=954= +=06=90ugk=16=07h=E4=D1=ECb]=AD=94=8D=AA=15%0=EC +*=06=BA=00\j`=07X =06D=AFM=FB=E2=06X=E0=05V=B1e=9A=F6=83=B2=88=C9D=8C=08=88= +&#f=80[A=E2=07=82=E7=F9=D0R=0A=FC=DA=C5=08=A2=E0=91T=CB)-=EEO=95=A0=0B=B6 7= +=A4 =09=8C`=0C=04vs=12=F5=09=92@=8F=C2@=0A&=C8Y= +]*=AEdf=F0=1E%=09=ED=8BG=08c =AE=00>=A0L=09=A2k=09=E6=93=0A=ED=CB=BEP'7=8A'= +_=F3=D5`=AF=8C=FAp'6=044=0A=1E=13=87=8C=C0=0A=00=B7:=A4=C0=CE=04=97R1=E7=BE= +(=93=07=82=10=08l`T=F7=CDq=8B=C6=7F|@=08=EC=E53 =B5=06=88=00=07A=04=96=FC= +=1A=D1T=F5=87=07N5%=AA`*=EEcHh=82c=08,=B8l`=08b=D6ey=F6X=91=D5=08j6=C9vv=05= +h=17wk=97=85I=E0ij=E0=15#=18=83=93=A0=F1j=EB$=92=E7FF=EA=F3V=C0=062D=7F=E4i= +&=A6=82=06=9E=00{=00#!=D2I=8B=E8=88=F0h=80=185=8B=07=D8=80=AD=CC=D6=0A=BA1c= +=92@=0B=E4K8=D0=17}=07=B1=09=E0V=0B=B4=00=09$T=8F=B8=00=0A=98 =0B<=06=0A=AA= +=80@=89=A0=B9=06W=DE>=A3=CB=8C=00=0C=12=C3=8AXq=80?U=D0@=A5=B0=A8,6=902=80= +=9D=05\Z=AD=E30X&=A8=D3B=EA=02(*XF=D4I at 4=D4=7Fj@=09=E4=C9[Z=E0=08`=B2ew=16Y= +Ixg=C3=07=05Z=80v=91=95=85Ey=04=E6=C8=04=10=B8*~`Zi=84+=1A=F0=86=FF=03=C3= +=C0=C5=90X=F2$=FA=86F=BC%=0B=FCj=C0=08Z=89=F8v0+I=CCqb=98=07=E4=B2"=88=02'= +=CC=03=EA~=C0O'=8A=1C=CF=17_=81 =09=C6=00=08=92=F9=99[=08}=8F@?=FF=E4c|=C0= +=09=B4Y=9A=0F=E5=8D=AB=04=0A=92`=08=94=A0=08=92=19y=82=02=8F=F3x0&=F6=06=1C= +=A2"=8A`2=D0=00=076=02=E9=12=09\=1B=8D=03=A7=02=E1=96=B7H=17yX=9Ab=06,=E5(= +=F3=C2=025=D0[r=00Ig5=93=19zuek=85G=B9=04r7w=91=15=05=AE=02\=D6=82=C7=0Eh= +=C2R=E2Fn=00%=98@=96MS*0X=B8d =0BF=D4U!=85=8C=D6=14T"=A9=06=10=B6=88=16=CA= +=98=9D=AFM=89@=8C3FI=9C w=C8=E3=0A:=C6=99=11=B6c=84=AF=09=90@=9A;FA=B9=EFc(= +s=A9=F9=EC=8D=7Fj3<=B4=0C=86(=07=F2=80=07J.=9D=F1x=97=BBf=A2=DEy=09=9C=A9o= +=FC=0F=C4=8E=0A=F0!=F1=02=8D=9ABT=80b=F5=FCY4e=02zw=B0=A0=DA=A6Cj@=8D=14I= +=05\`u=19=9A=A2I@=85qW=04=FC=FA=AFG=B9vY=D7+b=EB=119=1A=D3n@=0B=DE=C2=05=E0= +bdIz'=9A=C0=06=9C=92=83|d=E8T=BA=F8|B=C8`Z2i=DA=98KfO=FF*3=B8=E0=0A=CA=E009= +=E6=A7Q=1B=B5=8B=80=0A<=E6c=AA=E0=07=86=C0=09=02=97=A9=DFxp=B1=801=88=E09= +=80=80M=9A=A0=08=16=B3=B20ZD=F7=8DD]=F5F=EC=898=8E=A0=09*=E7J=06b=09=F2=E2= +=15=85s=06=DCY=07.H=06=96 $,R4}x*=D0=C7>~=A0[=C0=85F]`=A139=B0kW=A2G=E0=AF= +=D5{=94=91=D5V=91=14-B6F8z=05b=E0=F3=A0S=C5RjUg=C0=09=98=80H=FEL=F5=88=0F<= +=16Bfp=C4=0A=AA=87g=FB=A0=02=07=00=02=87@=819r=E8=00=A2=A3`=C1=1D:v=F0=E0= +=E1=E3=C7=0F =12+Z<=82=E4=87=8F=8D=1C=81 =91=E2=A3=87=C8=87$I=8A=BCb=06=88= +=C0"?=8E=18=F9=F10=88=C6!5l=D0=B8y=93=C7=8C=9D=E8=80%=BCv=E3pP=0FN=98=19Q=14Lp=11=84=10h=D2I=91=9A=EDm=E7= +=03=10Z@=B7=C3=0EF=10=81=1F=13>=04=B1=D4=C4=0E=1B=14=E4MM\lh=C67=BD=C9=1F= +=117X=F5=82=0B0=B8p=03=106M=F1=A9=A7=AE=0D=01E]-=BC=F0=02=D4=A9=D2=AC=B5=CD= +=14=C2=DACXA=C8=90=1A=0B5=C0=E0X_A=87hXbn=E50=C3Y(=8C|=FA=16p=F4 =B3=AAA\&Z= +ZX=D7=88=B5f=10=8E%=D7=11-=88]=93=0D7,=A1=83=82=F5=99}=B6=92=00=D2=D0DA?H= +=B1E=11L=08=E1=C6=11=09=BD{=B7@*=E1=BD=83=89=04=A1!D=F8=81C=1C=82=05+ A=09= +=16Q=C2=12=8EP0=1F =E1:O`B=11t=E0=03!,=C1=0AO@=08=8A,=E5=03=93Y=8A=07=9C=BB= +X=C6=86t=93$=DC=A0ax:]=AC\=D0=05=17=B8 at N*=83=FB=01=18 =F6=AA=B8=CC=E5=06.= +=D0=9D=A9p'!=1F=9AE.R=C1=01=11xp=05=1D=04a=09<=A8A=0C=84=C7=03=E3=05=ED0=7F= +=B1=C1=09=E6R=02=16=BC=EA=04'8=16=0D=E4b3=1A=FC=E0X;XA=0CrT=96=17=D9=88=06= +=DD=F3^=CDT5;=D4=DD=A0=08=06=99=82}=A0=C0=BE<*=89*=9F=1AH=BDz=F0&=1D4d=7F= +=FD=83=97=12=A1=10=04"(eK=06=09B=11=B0p=04&LA"@P=C2=11=17v=04D=B4=04;O=F0S= +=BD=92p=06=A6=14=01=07=0E;=19N,=C6=B9=13"*e&=8BH=CBb=05=AB=D9=D5=00=072|=01= +=10=B4=A5C=A8]Ow@=0C=A2=AAt=A7C=18=D4 =08X=98=95=16e=E0=A3=18=A4=C0=8C40=81= +=87t%=02=12=A8 =8A' =1A_\=10=83Z=B9=00=09=D5=9B=10=CC`=00=07=16`S=06=3D=88A= +=0D=A2B=83=15=B4=B1j=FBm=B9L=A9b=E6=82=D2=D9=00zy=AC'=0Cp#=83=1D$=A1=069=08= +=CE=C1r=90=86=E3=E0`=0A=82dNBt=E0'=81=8Cg@=03=C9=C1=14=80@=04=1C|=AC=A1Fh= +=1B=1D=96p=05=99H=01=08A`=88=14=88`=04'dD=82H=C8=01=A0d2=84"4=A1`@=F0A=13P= +=C99=D7tN=95%=FC=94=C5\=98=C3W=AD,=87Gp=08=CCRe=BB=A8=E1=CE=87Z=0C=EAXZ=15= +=83?=C0=B2=05=B5=EA=10=AE at 4=B4=C4=FC=A5=07}=11B=09"#!0=A2=C6R=15=E3=81=0Cl= +=F0=83=DE]=A64=EB=B4=11=8Evi=16%=C4%=A7=B0=8A'=ED=E8iO=FB=E8=E6[=06a"B=832= +=83=0C=FE=A06=09=09N=DDp=B0=D0=F144=08=02E=CE=10x=A0=AF#Pa=08=1A=D4=C1=13t= +=B0=D7=B8-=A1=0AP=B8=C2=0F=0689=C1*a;=10=F1=01M`ZS=9A=D6=FC=F4=94x=9A=E7Rc= +=A6=C3WA=E1&Z=15=E2=0F#=E4=DA=15=8C=AC=B5=0FJ=01=0APp=02=14=04=89CO=3D=DE= +=AExE=B4=C4=90=A0=045xAor=A9E=B0=0A=C5SK=F8=C1X=CB=0A=AD=9A=01=81=06qA=9D= +=0Ck=E0=02=1B=C4=D3=AD=B4=8B+=FB=E6J=83=01=C9=C6'R=99=CA=0Cx=90=04"0=84=B1@= +=18=C3=16=00=1BX=86=E2`=08QP=A8`=F1=E6=1F=8D=10A=07=02=A1=DC=0Erp=D9$8a=09A= +=18=02|Qd=03%=DC@=08=1A=F1=C1=18=FC =04#=98=B2=84=A2-=A1Lk=10V'=E4=A0P=AF= +=B2=D0\j=C0=02=B881=A8=B7=A3YlQ=03=17=DA=0A=C9>y=A1=81^X =C5=E3!/=AA=1F"=81= +=09=84=A7=04=95=A5=96?4(=C2=0D=A6=12=83&=9E=05=BA=CCR=CBX=82=E8=02!=98=8F= +=06=3D=D8=81=90=E6=08=83=1C@=E1=05Q=F0=AE=1Eq=D3=03=B6=FB]p=0A=AC=012o=92= +=02=04=864=CE?<=B8A=0E=E2{_=1D=D47=BE8=A0=82=12}@=AE=8F=0DH=B0L=F9=81=156= +=12=04=04=97=16Os=13=C2=0A=9D#=93=09=9B=D0s6=3DY=0D8=85=13"=B4=94=06@=E0=02= +r/D=97=1C=F8=80=C4=0F2=F1/=CDR=3D=B9=08A=08=8Fn+=8By=1Bc=19=FF6y=81=B11vg= +=00=83=0E=CB=8E=096`=9EQ<=05=84=E7~=86=C8j=91=01jb=BD=82=1A at 4A<=11a=8A=1A= +=05=84F=91L=D8=F5=D4M=0D=04=E9eo=8Dw=06N=E8=01=1C=8C=C0=044=A39^=F1U=02A=84= +=F0=05?!!=BEb=D3=08=7F=8E=A0=E0=3D=E3=C9=CFx=FA=C1xz=B0=04=FE=94R=A63]e=0D= +=C2=A0=04=1E4=E1=06>=90=82=C5~0=03;=C5=E0=05<=00=C2=A3=E72-=1CPz=A8=A5=8A= +=0Bj=BEH=97=17=F8 =97?=90]=0BN=A0=FB=17=A7=CAXh=A3FL=AF=FAb+=0DeQ=06?Hu[=C3= +=DB=A8=18=FC@=09=0E=BB=01=F78s=DB=94o=8F=058h=C19{=E3=9B=16=1C=01@=E6=15c= +=8A|`=03R=DE=A0=A2=EB=A3=81Q=E2=8AO=1D=D8=80*=BC=D1M=0E=A6=D2=1BLY=0AO=F7= +=95=F6=0Dt=E0=F4-=B4=D4Oh=0EB=14=800=04"=F0I=CF=BE.e)=83=84'=D0=E2D=95=9E= +=B2=81=14=08=E4=1F=AF=F7 =D5p=F97mS=D5=CDJ=9F=CA,=E9\:uq=E0=EF=98=E1 =DF0K= +=ED=14l=B0=82$@=1C=D4=13=9F1=8D=053=DC=E1v=F1=08m=AF%=ED=1A=85=03!4=CA=07'= +=B7m=CA/=8F=82=18=B9=80-=A1=B2=01=0F=96F=84y=D2'=9F=822=C9=0F=A8~=83 H=017J= +`=0D=B1=AF=8C=C1!=D8=A0[L=AAy=08=E7}f=BC=D9=97=CDh=CERI=C7=B3g3=C3=97=09-= +=C5=F9=BA=FBMv|=11=B2{=B4=9E=ABA=9B=1C=C2=03$d=E4=9C=B3=CA=A1=87=DF~b =0E= +=F1&O=90=C1=10b=C0=93W=99;=07E=D0=EE=AB~$=97=1D,=C7D=A0~=A6=A8G=1D4=8C=C7= +=0A=05F=08=0B=0F=A1w=CE H(=05c=D1=0C=E6=FF=7F[=DB#!=FCU=03R=90=03=F84=03B= +=D08Tp=04E=C0`=09e=10f=B2wecOF=01=058=F0sW=86O2P=7FE=B0=04F=D0=03=06=C4=12@= +=A0=14N=E7tQ i=C0=B7gF=C0tXG=05`=93|=CA=07BbWS6=B1=13=E6=A5=03H=D0=10f=80n>= +=B0=04(=02=04=A5c}=1Evb%fb,=D0=031CsG=80=03/=A0=03=AE=01=05:=00=03X=90]1=A0= +C4=80[=1B=E2T=BD=D5+&@q""c=18g+&`=02.=A0#.=F0=05MFr=95=07=03*=00=80o(=80*= +=C0=02=FCY=01d2=90H=03T-L=E0=04R=80.=FE=85=04~=02 =14X=811=A04@'=03=0CvN,= +=D1ohp0?=C0=04WW=82N=17|=0B=85=03=94=A3gL=87=897=00=05=0C=14=83=CA7Z5U=03NF= +=03_=80tU=A1DN=90RG=E0=039=80=044 C=B1t}E83Ce=19C=B4=02.@=05=E4=F7}:=10=14= +=00=12=04=E6=93=043=90C.=D0LM=B5=850=E0+6=E0~#=80=18^=18=7F=88=D7!za=02*=90= +!:b[0=90=80=96=87=028=A0=8Doxyq=C8=02@ =14L=12=03O=F0_F=10=05P@=05=F5=C2=04= +=05A=13B=D0=03=AE=97=81@'=04=DE=85O?=90=04=06=B1=15G0=05Z=C0Q=FF=85=1C=82%= +=1E=97XZ=81=05X=E2=86=906=10=04=0B91=9E=F8=891=D5=03*=13fK0=8E2 H:=90=04=1A= +T=05=FCd"H"=A3]=B0=04b=00'=8BBEpj1D5=F0=1C=CB=85BO=12=04F=D0v=FA=B7!z=F1=02= +=D1X=028=004=D04=024=F0L=CE8=02=B4=B2=85=BE"=8Ddhy=B9=B5=03=99=A7r=DE=08=87= +=D1u=1A,=F0$I=A2z=06v=04@=D0=80C=D0=04=07=15=1BH=E7zVvO2`=8F=BC=91>=1Af=15R= + =05Z@&?@=04L0Q=0D=B5P=09=89=90=AA=C3=96o)h=0F=C9JX=01=11:P=04=AE'=03=CBqYH= +pQ=E62{=A44K=99=02=03=162=92r7w=A8=B2O=01B=15=AEC=03=9F=15=04S=E6=02N=90=02= +dX=02V=A5=19A=A0=17B=A1=02'=B0=8C!R4\=E9=026=96=18=BFR=02=C8(M=B5=82=9Ad=C8= +E\=D4=8DH=89=94J=B9=944=E0=03gS=14C0 =0A=C3=10=FD=B6=06=E3=98=1BZ=09=03R=08= +t5`.=FCu"QB =95L0=04=E9=91=10Zr=109p=05=04=F9=96{=A6|a'=83q=F9=90=C8=A7=8AA= +P=1B=90=02=03=99=92=03=FEA=04T=A2(N at N=96=F2_=B1B=84=85=D9K&I=16>=12=06S=C1= +=03Apl=09s=06+d>CP:B=80=17&=F0=02)=F0=02=DC=88=02D0=16Q=D4=99=CC=18M%0=04"= +=C3[0=80=1A.`+=3D0=8D=B6=12=94dh=02=AB=B9=9A=AE=F9=9A1b=92O=03+=D8=98G/=F0R= +5Q=056=90=04=0E=01Y=F28=8F=DE=B5=03q%Q=1Du=03=F1#=10Q=D0=04!=D18=CB=19/=8D= +=A4=11=D0=19=9D=D4Y=9D=3D=BA|=17=A32K7=9D=A9=A3=12=ABa=1FZ=80=05=E3=01:=10= +=11=05=18SJA=D0v-=90=84"9=92=EB=C9=03*=E0=1C9=B7=814=A0=80=0E=F1=14w=B2o0p= +=17'=A0=032=E4=02=02=FA1=A1=C1T=FC%=00"2=C0+%`=16:=C0=02z=01 =A4=B43&=E0=8A= +=AA=19=03=AAI=A1=16z=A1=18=9A=94=9D=A1=02P=B0=8AE%=155=91:=07rO=FB=06+t=10^= +3 =1B=E6=05=A9>=D0=9B=BEYl=1B87g=06|7a=07=8Fe.FR=1B\=E0=03P=D0=03=0Ec=03>p`= +p=E9=A3>=0A=8A=A5=DA=90=CA=87"=03=92=A0a=1A=03Q`>=F2s=03=AFA=03L=A0=04=F9= +=E1=02M=C8=03=E9Y=A54=E3=3D,=90 8=10=1CL=928=0D=81XE 7gV=04QV=94(=00)F=B0V= +=09=A6=03>)E=89Wj(=00=11/`=02=C2(=A53=90=02=B1b=13<=A3=02=A6S=A1c=EA=A7\=04= +=A8=81=EA=19=12"=03:=08~;=00=05G i=AF=E6d=D5=A5=13=E6=85=95Jb=A9=DF=F5]=BC= +=11=91=0C%=04w=99tM=D0I9=80=10;=10=82&=13=AB=E6=A6=A3=FC<=BA=AA=3D=0A=A4a= +=D1=AB=9D=C8t!=91=AD=F1t%=08V>=EF=91oL=D0S1=D0=03w=E0q=B5S=17=007=17\=E0Z= +=D2=F2=03=DAc5fQ=872@=04=F8=CAXR=D0=04=84=C2=04=88=F5y=E4=8A=023=C2=04:T=8B= +=83=07j7=E6=17}aN; =03)=00<1=93=03, =A0=DA5t=B7=D5Dcz[=7F=FA=AE=FFgV9=D2e9= +=00=82^=C5$3=80=8Ed!N=8AI{=82=18=B0r=B5=B4U=A0h8P=04=DC=12d=85=C2=A5=04EZ= +=E2aD=A9=CAtwB=B1=15[Jfba&=D5=05x=02XK=B7B=F46=04eZK=F7=D40=EC=86=92=E9=83= +=04E=F0_=E7u=030=90 =E3=A3E=B1=82];p,#=99=03M=F0C=B3=864=A8=B3=95=EB!iA=80= +=04X=90/=068{1=00=04=DEs=8BP=A3E:=C0T=D24\:=B0=02$PM=FC$=D0=02B=B0=02:q=1A= +=EF=84Z=0A=B2o=0D=A1=8DG=10=80)'=03[=ABr=1A=AA=02=94sO3=90=044=F7=10=F1=98= +=03n=C1=02!t^x=B9G=09=F8z=01K=88=AB=08=04=17=C4=15W=10r1@=04=81=D8}+2LQ=B0.= +=EA=92gU=B7B=12=D1u=A5=D5ue&{=97=E2)=11=B9=03td`I=B0nz=02)=A5c=A6=A6C=1C6P= +=05=0A=B2tU=F0=026=C0=8FR=A1=03e=F0)>=F0U1=00.=19dp=85I-=97=A1=7F=95=874-= +=10B=F7T1=0AqzE@=04=EAe=1B=AC=C1=03?4Dr=11=04L=B9!C=D0EXH=02=B9[=93eq=3Dm= +=E1#sA9=AF=F2B=F1=84L=A3!=037=00=803=C0=BC=99G=1A=12=92=AE=C6=01y=80=F7=BB,= +=D0=10=95=E6 .g\=16=89=97=0A2=03=0B=F9=BDo=C5=C5z=C4=1A=FC=04X=14=CC=1A=FC-= +c6J=E3-M=14o=FC=B1=11r=C6f=92=C3=82=D3=B9=8Al=09`=3D=10=06=E2=88)A=10=06m= +=02=11=86=C0=B76=80=96=E2a>B=08+/ =04/=F0=03=FF=E9=8F=3DP=042=F4=0461K=E6= +=E4,6!LfH=A5E=08b=00=EC=16@=E0=024=E2=7FH=A3=C9\i=1F=9F"^=DB=E1=10=12C=15= +=9B=C7=9E+=90=AB=B0=F4=03=B8u,=B0=12=03W=A4=02%=C0=1BGv=1Ae=81=84=A1=E1=025= +p=05/=10=06=04,Cp=10=03=B1=13=196=10=05=98=B7=19[=9B=C4>=07=03=16=99=8BS!= +=A0=B7,=15=D2=C2=02K=03`=8AI=15=89$=04b{O"=C3=C5oU=812P=06=8F=85j=F6=D8=1B= +=82=D2=10M=009J=B0=90=FD=B6=03=94=A8=03P=90nG0=BD6e>=E4&nO=C0=12=3DE=13TQ= +=89=C2=F1/Jff0 :=89=BBTm5=C8=0A=89S=FC>=0C=A5/=C4=B9=8E=B2V=95,=8B-=00 ;=85= +=032=C0=3D)W#*=F0=04702T`f9g/Q=B0=04=B6!=14<=00=D1=EET=CD=09=F2)=9A=D2=B4= +=C0=D3=C2=96{=02>g*!Y=CD=D5r=06=C3tfP=1A=19=E0=EC=BA=94Z#=C8=CCF=AD=E9=8D0"= +=AFK#$=94=BB=164 ]4=F08=08=15 =E7EHV=10=8F=F6=F1=CD=DF\l=3D0=BE=92=F7=BD=E5= +,WC,HEPAO=10=95J=80z=82e=10=92=1B=B7=9F=E2=04NP=89LH=B8=05=F9t=05=81=04=A4= +=F8-=E2r=C2[=F0=04=D8=82"Fp=86=F1DK9=B5Tx=F7=84=1E=97C=D8=B5VC=E0v=B2xF=98&= +NA@=9EUa=86R=A0N=97=C7=1B6 20=C0=04=80i)U=E0=A4=C1h=CB=E9*<=BD=01=15F`=85)= +=C0=D4+0=06=80=85=81=B6=854:,=03V=D0=9D=FB=EFSh/=AA#=99}:M=EB=7F=01=B8=02CM= +=D4=F0Z=1Ad=11=CAQ35=C1-=A8=12"=15=FA$$=A5=E8y=09=D5=03=F3=B5=A2W=8D=D5=DF%= +1=07=A8=95=84=98gx#=CF=EA=88=05=8E=14Q=E3a`=04=A1DB=12=16H=C0=05=12=A1-=C2'= +=D7=FE=E3z.=81A=1A=A4 at a6:0=D0=03=C0l=A6l=D5=02A=00+(=A2j=B2=133=B18=D1S=AAE= +=D3Es=ACa=05C=B0=02(=00=10(P=9C@!=04=86=0C=18/^=C0=A0"C=C6=0D=1B4h=F8=90=D1= +=C3=C5=8F=15=19Ul\=A1BJ=0C >=B8=0C=E1=B1Cc=0E=1E4=1A=CEP=91=C2e=0A=8E+j=E0= +=901=A3=C6M=1E6 =DA=F8A#=C6=90=84/l=D4`=B1=F1%=CC-=3D=8E=0Ad=DA=B4=E9Q=15Tf= +=E4=90=B1=83=88=8C#-aju=C9=B5=AB=0A%D=82=D0`=C1=A3F=0C$7f=FB=D0=D8=01=11=07= +=8E=84A=15=CE=A5=AB=10=C6=DD=BB3=A2 =C4K=17=EF=DD=18Ar=BC=1D=02=C4J=91);t= +=E0=C8=C1=C5=06=10)9=988=E9Q=C3!=8D=1E;|=F4=F0=E1=03=09=12=1C=10o=84=C6=C1$= +=C8=94=180b=84=CEaD=08=922S=84=10=A9=92=D0=C5=ED=16=B9u=EF=DE=ED=E2=89=0B= +=16=C1=85=03=17^=B5Y=11Y=FAj#=1D=90=0B=8F=05 Z=F0A=BC=DB=B6=05Wi=B9h=BC=ABK=1B=8Cxk=A7= +=1B=90=D0!=D7=BB=B2=BC1=07=1F=83@=02=0E*=96=98=17F4=DBB=B0=AEu=CD=C5A=8D=04= +%=AAA=CB0nh=D4=858=E5=8487=88=ED=9Cxb=E36l"K=1B=86P(n=84=06=0AYd=EEV=F0=D4= +=05=CA=E9<.=B9=E0>=D7!=E4&n=10=EE=A1=F0`(=A1=84=9B=BB=82i=05=9F=F0=F3!=87= +=1D=82P=E2=0B%\=D3=EF=E2=EB=F2=C2=C1=CC=9FX=98a=85=1B2=9C=9A=EA=AE=FB=FE=14= +=11C=AC=8F=B2/&h=9B=9BT=BC=B9=80H{=DB=BB~=18=DF/=FD=E6=AEj=07=1An=18L=BF=D4= +=E6=8A=DF.=18=A6bl=D6-=8A=E8=81=E9=B9K=BD=EB=06"=A5=08,=8D=AD=88V0=E1!=84=12=A73=90C= +=0D|`=03=1F`=891>8=10_=C2=A9\=B3=C1=170L=18=02B=E8=92=D6=B9p=F5w=FA=91=02g= +=82pA=92=A1=F5=91?=C0=ADx=8C=00E=1B=88=A1=06[=AAjA=DB=BB=DE=F6=CEI70=F3=C1= +=13@=E6ASJ=F4=06.=18=82)=8F0=1E=A2=84=C7=04-=00pJG`Y=DB=15=F8=06B=D0]S=10= +=C5=02=14=08=F2=06=7F=F5=815=05=F4=84P=9ES=06=D1=C2Z=86e=EBg=11y=D29<=C0=CF= +=FE=12=B4=03=1E=84=B5]=A1=D1=81=0F=8A=C0=05w=FD=05=C60=86A=0F =12=04=1E=CCE= +=C8=E3=F9=C1Z=DF5=03=1D(A=0BB0=C2Y=C9=C6P=17=C0=E5=07[=E9= +=B3=91=AA=E2.=B4=92=C1=17=C8=96=17=C8=0F=AE"=02=BA=AB;=DD=80?=1E=DC=8D=17h= +=A0=BB=8A P)=0E=17Z=0B=88=DB=8D=1BP=02=C0[=9D=1809=1Dh=81=1B=B0&=82=10=A9= +=FC=BB=AC+<=A5=12h=81=1CH=82c=13=C0d=03=02=14=D1=8A=D8;=91=19@=B6=04=F4)O= +=82=3D+2=96=A83*=DC=D3=A4=1F=F0=01=18@=93=17=E0%B=BB=8BtA=10=1C=88=82(=E8= +=81=92=F8'&=D8(=AC=CB=B7\a=1Au=B3=0B=19=8C=BE=E9=A3'=17|=A4=19(=9B4=A1=81= +=85{=9C=1F=BC=C4K=8C2=08=F2=B8=FD=92=82.=89D=1Dp=01=1D=A8*=86i=01=19`=B3=14= +(=82=8D[=81(=B4=81=13=B0=C2=FCs=81+\=81VB=81=9A=E9=81=CF=03=C3=11=D0=08=F7= +=087=15`=14=02s=82dK=81=0D=FC=D9=AD=07l=C3=9Fz=C3&=FA=AB=0B=F3=A4=8C=C0=8F#= +=18#W=E9=81,=01/=B6=A0=8E=1CP=17=15=04=BE=1B=80=82=BB=90=82=EE{D=1C=83=A2E= +=DC4,=B8'=80=81=88"=F3>L=FCAML=19<=D9D=8Ai=0Ek=19=82=18P=82!=B0=013=A0=C6= +=BAj=1B=18=E0=01=EEx=01=1A=B0E=13@=81=AEq=01X=BCB=85=A4!=13X=81=CD=D2E5c=AC= +=15x=01=14=88=01=B2`=81=18=98=AD=9B#=01 H=02p=83 =1Bx:d=84:=DCk=A2=14P,=11q= +=01=98x=81=09=CB=8F=B8=98=11=19=10H$8=AD=9C*=A2m<=82W=11=82=3D=C1!=B8(Gq=E4= +=B7=9F=04=1F=E9=BB=09=85i=C7L|=C7=F2=BB=93=C1s=02=AE=F2=96-=C0=89R=B9=BB;= +=DC=81=D1=B1=1D=C2=8A=B9W\H=AD=BC=AC"xH=88t=A1=81P=01=1B=88!=02=DB=C5=11=10= +=01=B4<=B3=DD2=01=FD=FC`=01=CB=F09=DD=19=C9=AF =C9=A9=91=C0=A7=A8")=A2=01!= +=98=01=1E=10=9F=1BC=1D=16H=03=DFj=02=FC(=CC=CD=03=BE=EB=A8=8A[=C2=81=C3=FA= +=9C=A0=8C=BE=18x=CCG=0A#=F5=CB=01v=AC;=A4\()3=02y=C4"=D3y=9C=88=A0=8E=8E=92= +=88=B6P=08=8B0=C5=85=88=81=C0=EA=B5=14=BA<=85=04=C3=FF=A2=01=AF=14@=11(=CB= +=11(=8B=93"=C2)$=A5=01-P=A4=10=CB=8D= +=C7=A1#=9F|D=A3\T=1D=DD=D1=85=F2(=C6=B3=81)=F8=C7 =B8=98=0E=89=BD=95q=88=19= +=88=88=FD=E9=01Yq.=99Z=A0=85=10=1D^KH=AD=BCR0=D4=B9=02=0D=81=100=D03=03=D3/= +-=B0=13P=81=19=80=88=1F=8DL=9EB=AA=83=88I=18=FC0=02=1Bx=90=0E=BD=907=1DV8= +=05=AA=AFX=82'=FC=A7=10=B4=C0"=90=08=D31=16=8C=D4=81=9E=A8=89=12=FD=D5=DE= +=BB=A8=98l=81=18=D0=0D;:1M=93LF=0D=D7=F8s=D4=E2=08=8F=1C=00=02=14=DB=81,q= +=91[=D9=9E=DD=D1=0C=87=A8=89WC=B4D=EB=81=A2=19=8A=A0=B8=82=F8XMS}MT=FD=D7= +=02cU=81}P=B4=14XV=DD=D2=D9=E1=95=1Ep=0D x=90!`=01%p@=DE"=82l=A4=81J=9D=A2`= +u3b%=D6g=FA0@\=88=B7X=82=E6J=97=F6yX=DD=A9=02)R=81=1D(Q=E40.=1A=E0=01=CF=81= +=01&=A0=93=EF=B1=A3=19=F0=CBpTTq=0DWr=BD5=17=08=02=19h=027@=A2=DE=8BDR=EA= +=0A$=18=82=1F@=8D=AA =02=1D=18T"0=02(=98=C3=1Bx=02=DC=12=02R-=D5~=05P=80=FD= +W=83mU=17=10=81=AF=1DX=06=FC5=81!=E8=88!=98=0A(=B0X=08=82=3D=DE=C9=01,=D8= +=A8=EB=A8*=87=D8=9D=03c=8A=8D=CD=DB*2=8A=A2h=AC\=09=02U=EC=90=FA`=01=1D=A0-= +*=92=A5=948&=8EX=8FZ=9DG=EF=A9=A1DT=88$=F0=17=B9=08=CA=9D=E5=D9=9Eu=AFI=A1= +=C6=9BP=82=FD=08=AB=16=F0=0A=15=A8=B1=EB=98=8A=1D=90=04!=B8=02+H=82 =D8=03= +=C6h=AC=15=D8=0E=19=C02=FF\=C8=AE=05=D8=B1%=81=B15X=06=1D=81=BFJ=81=C2E=82= +=A5:=0E=89=C5=12|#=A3=3D=DB=D6d=CA[=E65=C9=96p=88R)=19=DD=FB=8A=1F=A0K)=C2= +=BE=9B!=0B=8EpF=12=D2=81Fi4|=AA=82(h=D2=BA=B8=BES=BB=DCEm/=CC,W=F0=B3=12=88= +=B8=02lILgJ=81=C6=B2=A6=83 =02=C6=00=03$H=02,@=BE&=98=0E=EA=BB=DB=14=98\8= +=8B=A8=17=90(*=B5=D2=DB=0D=D0=B1=FC=DD=81=DD%[=11=E0=0E=17`=82"H=01=1B=08= +=99=0E=D1=88;=B1=81&`=0B'=C8=15=1C=D0=027=80=01{=A4"=E6m=DE=E6=14=B4lT=0D_!= +*=98=90@=D7=AA^=A8=D8=9A=8C=A8=81 H=B5.a=82=C4m=8B=B7=C8=95=BF=B4=A30z$=F4M= +=DF=83=1A=BFEM=18=1B=F8=CE=EF=04=02'(=8F=180=9F=E5D=01=16=F0[=D5=18=82=C1= +=08=83=1F0=02#8=02=C5h=82=8D=B2=99=14=A0C=F2=B0=81k=83=81=15=E8=0E=1D(=A5= +=FDS=E0=05=D6=C5=B1=15=DB=07n=D5=DD$=01=15=10=0A=8A=99=A1=BF=82=0BOz=1E=1C= +=A0=18=F2=F0U=96=C9*$=88=1A%=B8=15=818a=BDmN=A0=B5=82 =80=82=18=18K=0E=13= +=88=19(=16=91=DC=0A=D5zN?I=A0=C5=19=8D=12=F9Q}=B3=0B=E1=F5=AE=1D=1Cb=DE`$= +=F1=D3=AB=1Ax=01<=13=BFv=04=9F=B7*=022=8A=A5=820*=17=FC=F0F=8B=92=AB=1BP=03= +=B7=E2=A5=DF!=3D4=FD=A6I=C1=81=E0=C0=8F=AD=CD=C56=06=C38~=E09=EE=3DZ$=81=1B= +=A0=E3=11@=81V=A2=BEf=DD=B3y=BC=8D0R=0D=3Dl=8A=D8Ed=14=A6=9A=DD=F3=09=1C=A8= +=8C=D7S=81=1C=A8-8s=8A'=08*=9C9=91=1C@=83=E0=02=82=99=B0=81=EB=9AB=0B=FC=A2= +=B3=10=E3=17=D0=02=D5=08=C2=1B]=18L=BC=CC:q=A4%=F8=D9=B1=F4g=A3=C4f=BF=A8ZL= +=19=08=81=A8=81-=C8f=18=D0=01t=B5=01=933=8Bk=D5^h)(}2=99W\c=00;f=06N=E6=AFE= +K=18=10=820=18=81=1B=90=D5=9B=93=13=1F=12f=F6=1A=BC=F0=A8=A1=A3=BB=DB=CER= +=01o=FEf=0C=A9^=1Cp=82=14D=1D=A8s=81=09=A4=9E=14X=81,=88=93g=B3=89F=DB=81= +=B4=08=0D=1BX=02=FD=E0=A6=17=93=1F=ED=CB=89=C8=E4=C1M=0BhG=9A=94|=FC=8A#=BB= +z=93=FD=EA=A3=DB=88Bn=AD=BB=B4J=88=1B=E8=BD @=14=14=B8=A8=06S=88=1F`=82s=B9= +=18=89=80=0Ey|=93P=11=9Db=C6B=91vc=92=1E=D8=11X=88"=D8R=15p=D53=DB=88_=B3= +=99G=96=93=F1=1B=8F=00y=0C=ED@=943=CE=E9=8D=AD=CB=8E=D0=D6=7F=0CV=1B=00=B4= +=AEX=01=16i=B7=1E=D8!=1E=E8=0C=1F=A80=D6P=0F=FC=A88=C2=B9=8E=C1 at W=A5e =BB= +=1B%=F0B+=AC^$'=B5=01=DC=FA=EA=CCq=81=B8=95=E7=88=F3=BE=B4jX(=E2X=D7=C2=BE= +=17 =D16=82=9A=C5Y=0B'=00=02=E6=B8=E4=16J=3D=CA=FB=AF=FD=EBkd=FE=EBV-lX=DD= +=D2=11He=F8=BB=AC=16=10=83 t=CB=DB=B8=829@=02=A3Z=82=ED=A0lD=AE=CB=19@=02d= +=F5=A4=CD=8E@=97=08=C9)NL(X=1A=02"=02Y!=9A=D0=C0=82=EA:=A7=A9=0E=17=D0=FB8= +=17=9D=F82=C9i=01=80h!=B0=85=8B=176j=B8H=A8=D0=C5@=82=0Aa=F0=E0=F1=82=06=12= +=1B=0CY`\=A1=11#F=81.|=DC=B0q#=A1G=1D=0C=1B*|=A1=D0=C6=12=164P=9C=88=19=13= +=85=0A=19PT=9A=E5=B1=80 g*rX$=97<=D5=C9L= +=F5=8D=97=BF,=EF=85X=0A=85=B5 at 3=EA=AA7=A6B=0CH=F4H=18=0E@=CCk=03=13X=CEp&e0= +=10=11C=15=91=F1=FA=C4=8ED=F0`=BC=154=B8=A4=1CQK=B80E=12R=F4=80=83=0D>=F0= +=B0#O=D4i=BD=10O=BF=F1=90=03=13=A4=D5=A0=D1=CB*=18=1AD=0Ed=BF=FDC=0D=07]=1B= +=C4=E0=0A=E50=04=CC:=04=3D=B9i'=F4=3D=1E=0AC=F4=A0=07CP=C9=0B=94=90=A4=9F= +=10$=08dB=81=FC=96p=83"`)#,`=82@=F87=83=B5HJR=98=03=D0Sj=F0=1F=ABp=AEs=9E= +=D3=0A=E8=14$=95=17=8Cn)(@=15=0B4=14=83X=A1./=FB~9=8C=0A=80=00=C3=182=06=06= +,=90=81=E2l=E0=9D=170k=098=88=81=0D=EA=C0&=0A=F2=80=06Dp=02=B4>4&&tk=07/=C8= +=11=10j =83=85=BDl#J=F0At=DE=F6=BE=D6=C4=CC4O=A0Zo=BE=B744=01=81=09=E7S=C1= +=87|=C2=C3=1A=F8 =09T=C8=01H=10=85=03=19=14a$=05!L=0A=BA=A3=12=82=C8=80=7F= +=E3=19U=CA=DA=02=B3=17=F4=C5i-P=C1=E4=AC=E3=91=17=AC=E0=04=A5Q=8D=0E=90=A0= +=83=E4=AC@=09<=B0=C1=0E=E2=D6=02:=C1@),=C0=1C)=1D=E4=82=CC=05(=84"=F4\=A7V= +=F0=C1=11=9C=A0=05=92"=02L=9A=D2=02;=B5=C5z0=A1=CB]R`C=D7=C5=90/}=F9=81=BA= +=EA=84=C3=19f=01=06B=10=C2=0Fn=80=84=D4=00=D1[=17I=DB"=B3=C7F=F4=DD@=088=98= +=01&yp=83=97=F9=E0|-=F0=81t=0C=D56)=DC=FC=E0=8B"=A1=CF=0D=92=06%=EF=F9=880S= +=90=01=1BO=C4=C8=17=8CM=065=D8A=12"=C2=83=00=E2=C0z=97=81=12jz@=17=1D=02=81= +=06=3D=F0=C1=0A=EF=83=B2=B6=ECp=850=B1=13lx=103=82Ha=06L=18OA*=F6I=B4=AD=A0= +=06EXB=13=E8I=14"=B4=A0=08-=C0=98=83=96B=02=A5=BC=94=05A=8B=81=A4,=A5=CA=90= +=89=0Ct#=B0=0DLI=B0=83=90*E=05QjKB&=8A=823=1C&=92=8Ai=96=AC=82=C9=AA=C4=0D= +=C1=98=AF=EB=0Bi|=F8=02=D9(=E14=DB=DB^B=B0=A4=82=13=A5=C0=057=00+=0BL=C3=1E= +{J=C1=05_=05k=16=AD=08=ADM=E2 =097X=82Hl=00=04"=DC=91=AB=D9:=9A=19w=94=84= +=17=AC5=05E=80=01=12=86P=99b=E9`=07L=B0=02=16=A6p=04=DDdM%10=D3DO=90=83=BA= +=80=C8=A1=0F=8D=C2=A9=FCV=85=1B=FB=04=C1=81=BB=E3=02=BA=04le-$$=CA=F8=B7=94=80=A9=E4=0A3P=C2ar9=AA=13=D8=C5aoq= +=C1e=A5=99$=15=9CK]5=E8=01$=7F0=83=B0=1A=C4A=94=F2=D8MA=A0)=11=90=A0=B7#X= +=C1=08=F8#=FB=BA=13=08!=068=BE-Qp`8=16H)=07-=98=81i=EA=85=C7'=A8=0EZ=B1=02o= +0=A9z=BA=D7=AD=E0 =8B|=D9=89=B0=14=03=1E0=A1I=A8Y=CD=0E=8E=DC*=1C=E4=F7%=B5= +b=CC=CD~pXc=ED=C0=07J=80=C2=0F=84=086=F9}o!0=C0=1A=BF=CE=D3I=C4=A1=00=91=B5= +J=81}=09=03-=F5=8D=CB=0BqHB=10=8E=F5=03=D3=80=81=B5}=19Q=E9\=C0b=A6=C8=92t:= +H=97ml=00=03=14(=85=902h=0AiM2=83=17=B4E=8A=0Eq=8BGb=C9=82=14=85=B2)$=88=C1= +=92=99,=DC'+=C8U%X=01$I=E0=16=97=9CX]=CE=BB=CD at P=83(=1E=CC=8C1*@=16=0E=BEK= +=DE=F0=A2=A0=08=DAUU=AD`=90=1C=D5}S2=02=D9f=B2T=13=032=84=DBfI=10t_4=BD=E9= +=19=AC at qh=12C=0EtP=84!h!=09O=08qH=FB=84P=04#=F0=04=07=EF=93=CC=0D=ACD=19=E6= +=F8=E0=85=84^=01=EDbP=84,=D0=A7=0A[0=02=8D=C2=A7=83=1D=1D=99=07=BCl=8Bi5=DB= +=16=DF=A2,=D7-=86=09=0CT =86=16=80'=E6K=B9W=EBJ=80=83=A5=9C=A0=06=99.=81=14= +L`=83Q=01=DB=A5=FD=D1=1CU=9A=9CS=05a=11#%=08=CC=0A=D0=96=C5=AAc=A4G=02a=EF= +=1Fi=90=9C=99=C5nG=E6fsxy=B0=EEY=F9=1Bv_U=01=0C=84c=83 =FC=FA=058=F8=01=A6= +=C9;=CC[=DBL5=93~=96=C9=C7=C5=05),!=09=C7=CA=81=82U=833=16=B0d=0DJ=00l=B8= +=83P=A7=19=B6 at G=A6A-=A0}`y=1E=EC`=9E=E2Z=C1x=01=86!=9D=E3Z=E7=A4=CB=F5=09= +=96 =84=A4=BF=9A)*I=FDea=9DA=0D.=9D=E9Sq=FA=A6=BER=03=0A)=10=08'=E0,=16=D9= +=A8=11k=09=C4=06R=FA=FB=01=11=B2=95=10=19=0CQ=9F=E8C#k=F2M=F66=F3rU(x=89=0C= +g=A8=82=17=8Ca=07=BE=BA=E3o@=04=03=A1=9F=BD=B5=EBf=CC=0EwD=1F=B9=E5=C0gG(= +=82=10.=B3=83*8=EB=05W=88A=1B )=E6M=02=D77J=85N=86=C0=0C=90=90=08=E0=0C=09=D4=DCY(W=11= +=B0=C0Z-!=C9=DD=11i=CC=C7=0E=FC=93=E5=1D=CB=0D=C8A=C4$=8BiX=DD=0B=81U=87`em= +=DA=09=0B8=C1d=94U=0C=DC=CB=F7T=C6=D9=FCI=DF=0CX=1F=8F=F0=84=9CP=0D=0Ct=A5= +=BB=B5=07]j=08=0D=1C=81=E7=AD=CC=09\_=99H=11oD=C6@(=89G=D8=00=18=10=93=0C4= +=81=0B=DC=CD=0C,=A0dfc=0B=95=0AyF=E6MR=E6=A5pNW=88=80=0A|=05=09=04Fc,=0C=0B= +L=1Ba=F1=17}=F6Nex=C1[=F8=00=11<=1C=10=84=D8=DCM=06=8FP=01=15=FC=94=3DU%>= +=DA=A6S=05#`=B0=C0=D9=18A=1E=F4=88=94=94=01pjH=0D(=06=0A=84=E1=0C=E0=80=D6l= +O=8F=E0_=0B=88=C4=9D=BD=99=E7=C5=C4=8A=A9=0C=8E=EDH=84&=CBI8=84 at p[Q$=07=0DD= +R4=A2=0Cy=8E=8E=0A=A4=E7S=A0=90=8E=C6=DEz=82=E3*=B9=C0W=B0=00=10=B4=80O=F5= +=91=89=DD=92=09=A0=00=F8=B1=95=0A=AC =D3lXaM=81=19 =01=10=04=01}d=C1=0F=AC= +=17a=A0=09=0Cj=1C=ADXe=83J=9Fv=FC=F9=85O=10=01=10=C4=C0=0F=FC=05=0E=E4=E3= +=0CU=DD=B70=C9=0DL=81=17"!=AA=E8=094=E6=C9=99=C4=CA=A9=0D=01=8Cb'F=E4=C8HH= +=13=0C=1C=1D=8E=BA$=90f=A3=09=EC=1A=A3=EA=A8=90=82=10N=ED=A4=08x=D7=0B1=8C= +=A6Q=86=0E@=81=9C8=01=A1=A9=00=DC=E9]=0C=E0=95=C1=0D=01=144=C1=12=1C=81=10= +=E4@=12=FD=0E=0C=F6=00=C0=CD&=99b=A8=99=EE=C5=14pH=0A=04=01o=96=CF=89=E6=C5= +=8Ar=08=0A=AC=A3B=91=91=9B`=07j=B0=96L=94=0E=9F=8A=07*=C6=C4=0B]=D1=87=FCQ5= +=DA=00GH=E1j=9DG=0D\=A4=A2*=1D=A4>ELz=ABzJ*{z=05Y=EE=CF=91=9D=00=13=08A=AC= +=C0=C0=0F=0CA=15=D4\ +=A3=C3=10=1E=98=B2=A5=E5=0DA=13H=81=B1=DC@=12=F8N=D1=08=C1N=C8=E6=82=DA=A0m= +=EAix=A5=C8=F60=01=DE=E9E=FFD=E7=09=FCtK=F8,=81=B8LAZ=16=90=BB9=C4=82mS=0C(= +U=FF0k=86=F8=8D=9D=CC=80=10=B4=CDw=AA=C4=F7q=EC=14nK=88=C1=C0=05)=A6=E8=85k= +=7F=F0@=CCN=CA=B8^=85=93=F1@=FE=A1=00=0B=A0=C5T=F4=00=09=AC=80=0E=A8=80=AE= +=84=E1=99=04=E1=10B=E8=DA=ADc=B3=08=01=B7=B4=E5=0E=84=81D=F6=80=EFT=01=9C= +=F0=00=10=C0=00=13=94=DB=AC:=1F=83=C6=90=C3>=EC=ACl^=ED=88=19=C7=E6)=D8=86-= +=0A=B0=A2=C4=F1=00=0B&${D=9EW2=04=0DH=C9{}l[=F8=00=DA=92=C7q=04=81=BD=80=A8= +=B8=04F=B1=A0=816=F5KL=F4=C0=CB=E6(=CD>=C5=0C(=EE+=D9lV=A4@=09=BC'f=BA=E7N= +=12=8C=0C=8C=80=BA=CC=80=D0=D6`_=B0=80=12=1E=9B=D4=C0=80=12=A4=13=1C=D5@=B5= +=E0La=F0=D0=D8$=16=0D=18=C1o=F8=00=D6R=18=AD=DAL=BB=01'=DA=FC=E6=C9=86=0Cd= +=0A at A=16=E8=C0=0A=AC=1B=EE=86=ECL=B8=00=91=D1=80=0A<=81=0D=F0=8B=F0=84=D4A= +=08=CD=D1=C4=97w=C0=A9=F0=AE=E8=F4=C5=A5=F0yG=C5=98=C6=89=B8=C0=0F\=C1=12D= +=C7=0E=C8N~1=C1=09P=DB=AB5=EES$=A9=B7>n=80=F0=A4=C8=FC=E4W=90=CD=DAu.c=C8= +=00=13=90=98=BDi=929=91M=18=DE=80=1E\=D1=CB=14=C1=F9=0C,=C1=0EZ=87=AC=80=A3= +=EC=05=F5=E6=AE=0C)F=0A=FC=06=10=05/=F5=F2EaxS=B8YT=0A=FC at c=C8=C0=9A4=D3=8E= + =81v=8D=87=0A0p=C0=C0D=F6JF=0A=C4=E1=0D=D4I=0A=AC=14=81N=CB=0E=B8=00=0E=84= +S=0E=E8\=FA>=05=0AHfM=B5=EF=E6p =09y=05Z=B4=16=7FuH=84=A6@=12=18=0EI=14=DF= +=BC=DC=C0=0FPA=84=CE=C0=11=88f~=1A=B0=CB=F4=C5=F5=F9=EA]=94=F0=F0=96=C8e=00= +=11$=FCU=D6=16=EBI=0A=E0=CCK =05=A3=CC=D0=0Cx=81=0E(=81=8D=E0=911=E1nC9lL= +=C4Y=8FL=94]=C6=84=0C(=E2N0=02=DC=0A=84=96=8D'=0E=BF=94=B8=F6p=A54=19=A5z= +=C5=F5=F0=00=16=3D=A5=EBP=15=D8E=10=E1dD=0E=84=A6F\=11X=1DY=FD=D2=CA=9A=B9= +=F0H=9CA=99=DE-=05o=08=D85=8Apjq=09=DB=09=8B=94i=ADP=C6[T=CB=DE(+=DA=C6=DC= +=8A=B6=C0=15=10=01=1A R=8A=B5=05w=FD=91=97=B1=80=0E=90=C1N=D0=92C=3D=A0 =FF= +=967=16rp=1D=B2{F=EE=85=A4M=11x=07=9A=1A=13=C6 =05=C6=AE=CB=1A=A9@~i2=99=A6= +=C0=11=CCPYy=17(o1=B0=96=C8=F5=15U,3=F0Zt=81=0D4=E7S=9A=C6=EDT=AB=E2=9C1=D8= +=BA!=AA=D4=C0m=F1=A9 =D9%=0B=1C=01CP=B2=DD@=91=86=06A,=BD@=E2=0Ar=CD=C5&s= +=C7=1C=F2*U=AA=82pS=97=D5=EA=CB=CA=D2=0B=EC@=0C=AC=11=15W=B1=CD=A8=0B[=1D= +=07=0E=0C=A45=A2=F38sq=F5ip=EB *=C3q=C8NT=E2L=C7I=A8=86=D1$=AB=CA=B4d!9*= +=8D=81=ED=09=AC=88B=02=11=0BpA=13`=9EET=04!=C9=E4A=E3dB=A7=D2B;=99{N=C5=84= +=08=12YrH[@=85=13=BC=14r=AE=00=10=04=96=82=D2=AE=87=C8=C0"=B3=D1=11=80=C6= +=0D=FC=1AM8=DE)=8B=F4=C1=A6=8E=0D=FC@=0BA=A7=F0=E2=18=0Ex=AC=9D=F8=84=D6=10= +=04=19=F5@=10=DC(=AA=CCt=AE=05L=13=F0=CD=1B=EEmRM=1F=0C=80=C4=D9=08f=02N=A0= + =1B=B5=E6=04=04=00;= +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: q-p vs. base64 test + +Received: from thumper.bellcore.com by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA18271; Sat, 26 Oct 91 06:35:15 -0700 +Received: from greenbush.bellcore.com by thumper.bellcore.com (4.1/4.7) + id for mrc at akbar.cac.washington.edu; Sat, 26 Oct 91 09:35:12 EDT +Received: by greenbush.bellcore.com (4.1/4.7) + id for mrc at akbar.cac.washington.edu; Sat, 26 Oct 91 09:35:10 EDT +Date: Sat, 26 Oct 91 09:35:10 EDT +From: nsb at thumper.bellcore.com (Nathaniel Borenstein) +Message-Id: <9110261335.AA01130 at greenbush.bellcore.com> +To: mrc at akbar.cac.washington.edu +Subject: Audio in q-p +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;boundary=hal_9000 + +--hal_9000 +Content-Type: AUDIO/BASIC +Content-Description: I'm sorry, Dave (q-p) +Content-Transfer-Encoding: QUOTED-PRINTABLE + +=EA=EE=F9=FD=FB=F7=F1=E9=E3=E3=E2=E4=E7=E7=EC=F3=FD=FExwsomhca`]]^\ZYY[^c= +k=FA=E9=E4=DD=DB=D7=D5=D5=D7=DA=DC=DD=DE=DE=DF=DF=DF=E2=E4=EB=F2=FCpmh^\Z= +YYYXZ\^`dghhkmmnuy=FE=F4=EB=E4=E0=DD=DC=DA=D9=DC=DC=DD=DF=E3=E5=E3=E0=DF=E0= +=E4=EE{jf_[YVUWZ]_bfmy=F8=EF=EA=E4=DE=D9=D8=D5=D5=D6=D9=DE=E5=EFynomiea`_= +_cfcba^\Z[aku=F0=EA=E4=DE=DC=DC=DD=DF=DF=E0=E5=EA=ED=F4=F7~tz}=7F=FC=FE}|= +=FE=FDzzvpmlou~=F4=EC=E5=E1=DF=DE=DF=DF=E7=ED=EF=F6=F7=FA=FExqmf^XSQPQSVW= +VX[cu=F4=EA=DF=DC=D8=D3=D0=CF=CE=CE=CE=CF=D1=D5=D7=D8=DB=DE=E5=F4tf]XRPQR= +SSTVY]bo~=EE=E7=E1=DF=E1=DF=E1=E5=E7=EA=EC=EA=EA=E7=E4=E5=E6=E5=E8=EF=F4=F9= +{kee`\^___afgkpz=FB=F2=EC=E4=DE=DD=DC=DC=DC=DE=E3=E6=E9=ED=FEonjlrplhgmlj= +npqsz=FA=F3=ED=E8=E8=EC=EE=EE=ED=EC=E4=DE=DE=DE=E7=EE=F4xlb\YWWUVX[]_bhs=FE= +=EF=EB=E8=E2=DE=DC=DC=DB=DD=DF=DF=DF=DE=DC=DB=DC=DD=DE=DF=DE=E0=E8=F6voic= +_^[YUSRSVW[\]^dp=F1=E3=DB=D6=D3=D1=D1=D1=D1=D5=DA=DF=EA=EF=EF=EF=F5=FFwkg= +c]ZXVUV[an=7F=F7=EF=ED=ED=E9=E6=E5=E4=E4=E3=E5=E5=E9=F3=FB=FCzmjjihjlppqz= +=F7=EE=E8=E1=DF=DF=DF=DF=E4=EA=F8vtqs}=FDzwskihddgijhilrz||}=FD=F5=ED=EA=E8= +=E8=E3=E1=DF=DF=E5=E7=EE=F0=F4=F4=F4=F9=FA=F9=F7=FEnia]\YWUSTY^dmz~=FC=F1= +=EE=E8=E0=DC=D8=D6=D4=D2=D0=CE=CE=CE=CF=D0=D3=D6=D7=DE=E8=F8vj`[VSOLJIHGH= +HJLNQV[d=7F=E4=DA=D2=CC=C9=C8=C8=C8=C9=CA=CC=CD=CE=D0=D3=D6=DA=DF=E9=F9yu= +oha\VRONMLLLMPW]gr=F6=EA=E1=DD=DB=D9=DA=DB=DB=DB=DA=DA=DA=DA=DC=DB=DE=E3=E8= +=ED=F4wqjc`_bdbda_bged__cccchr=F6=EA=E6=E3=DE=DB=DB=D9=D9=D9=D7=D5=D5=D7=DA= +=DF=E7=EE=FCrrnd^[YTSTVW[^biv=FB=F4=F2=F0=EB=E9=E6=DF=DC=DB=DA=D8=D9=DB=DD= +=DF=E3=E7=EC=F0=F9=FEqhd__^\ZWUUSRRVZ^do=F3=E7=E0=DC=D9=D7=D4=D3=D1=CF=CE= +=CE=D0=D4=D7=D8=DA=DC=DF=E5=EC=F9}umic\WVTSRNLKLNOUY]bio=F9=E9=DE=D9=D5=D1= +=CE=CE=CE=CE=CF=D1=D4=D7=D8=D8=D9=D9=DA=DB=DD=E6=F6tdYSONMMLLLNPSY^dk|=EF= +=E6=DE=DA=D7=D2=CF=CC=CA=C9=C7=C7=C9=CA=CC=D2=DB=E8xcVOLIGFGHIJKLNOT[_q=EC= +=DE=D5=CF=CB=C7=C4=C3=C3=C3=C4=C6=C8=CC=D1=D9=E3=F3i[TOLJIHHILNQV[ao=F6=E7= +=DF=DC=DA=D8=D7=D6=D5=D7=D8=D9=DB=E0=E9=F2=F9=FDxnjjfehlmlmrpoqw=FF=F3=EF= +=EF=EF=F4=F2=F0=EC=E7=E6=E3=E0=E0=E4=E9=EC=F5|og^ZWVVUSRSTW[_n=FA=E6=DB=D7= +=D3=D1=CE=CC=CA=C9=C8=C8=CA=CC=CF=D5=DB=E8x`XSPNMKJIJLMNPSY]f}=EE=E5=DD=DA= +=D7=D4=D2=CF=CE=CE=CE=CF=CF=D2=D7=DC=E2=EB=F7zpjea^ZYZZZ[[\]][Z[]agr=FA=EA= +=DF=DB=D6=D2=CF=CE=CD=CB=CC=CD=CF=D6=DC=E6=F6se]WRNKJIIIJMSX\aq=ED=DF=D8=D2= +=CD=CB=C8=C8=C8=CA=CB=CD=CF=D3=D8=DD=E2=E8=F2ug_[VPNOOOPPPONMMNQV^k=F4=E0= +=D7=CF=CB=C8=C5=C3=C2=C2=C4=C7=CA=CF=D6=E1=F6i\UOMJHGGGIKMQZfz=E7=DE=DA=D7= +=D6=D5=D2=D2=D3=D4=D5=D6=D6=D8=DB=DE=E0=DF=E4=EA=F1=FEsib\YUTSTTUXY\`m=FF= +=EE=E6=E3=E0=DE=DD=DF=DF=E4=E7=EB=F6=F8|=7F=FD=FB=F1=EE=EE=EE=EF=FA~~|uun= +jooox=7F=FFxyutnmms=FA=F3=EC=E6=DF=DA=D7=D3=D2=D4=D6=D9=DE=E9=FDi]XTSROOO= +OQTW]`jr=FE=F1=E8=DC=D7=D6=D5=D5=D6=D9=DC=DD=E0=E4=E6=E9=EB=EE=EB=E7=E1=E2= +=E8=EB=EF=F6|qjig_\[ZYXY\]_hy=F3=EC=E8=E5=DF=DD=DD=E2=E7=E6=E5=E7=ED=F6=FB= +~vmhfb^\[[^beq=FC=EA=DF=DB=D6=D2=CF=CF=CF=CF=D0=D3=D7=DE=EA=FEk`]YWUQONML= +KJJMOU[dz=E7=DD=D7=D2=CF=CD=CD=CC=CA=C9=C8=C9=C8=C8=C9=CB=CE=D2=D6=DB=E7=FC= +k]WSNKIFDCCDEGJNSY]`p=E9=DF=DB=D7=D4=D0=D0=CF=CE=CE=CD=CD=CE=CE=CF=CF=CF=CF= +=CF=D0=D3=D7=DA=DC=E4=F9l_[WROLKIHHHILPVZ]h=F9=E8=E3=DF=D9=D1=CD=CD=CE=CD= +=CC=CA=CB=CF=D6=DC=E5=F6sg]WSQRTST[fgban=EC=E2=E4=ED=E5=DB=D7=D8=DE=E3=E0= +=DB=DC=E5=F7ptld\Y[\]]]cl=FF=F6=F3=EC=E7=E4=EE=7F=FA=EA=E1=E2=E9=E3=DC=DC= +=E0=ED=F5=F1=F2=F3=F8z}=F8=FB=F1=F8vomptjb][]a]WRRV[][\n=F9=FC}=F8=E7=DE=DB= +=D9=D6=CF=CE=CF=CF=CE=CE=CD=CD=CD=CE=D2=D6=DC=E5=EEyjaWONNQOMKKMOQSWZ]_dj= +u=EF=DE=DC=DB=D9=D6=CE=CC=CE=D8=DC=D9=D9=DE=EE=7Fz=F0=F7loz=FC=FFnikv}np=F2= +=EE=F9vq=F1=E8=ED=EF=F0=F6=F8=F8=F2=F8=F8ujtyi__iodVR\hb]bp{tdds=FD=F9=ED= +=DF=DC=DE=DD=D9=D0=CD=CE=D1=CE=CB=C9=D0=DC=DA=D8=DFgUQRUMGHNOKIJOY[V_=E2=D2= +=CF=E3WP=DB=C2=C7=ECa=D9=BF=C6=DE=C7=B6=B8c9B=CD=B5=BC=E5w=DDjG;25Be=EBmV= +EBEGJ`=E0=DB=C5=B7=B2=C5F>_=BC=BA=DAOV=CB=CCTEQ=D1=C5=D2=FB=EA=CE=C9=E0U]= +=DF=D0=D5w`mp}YEGHg=CFVEBL=D9=F0UIONA=CD=B9=AA=B32+/=CF=A9=AD=B7=C3=B4=B2= +o/'.F=C8=BD=C1=C3=CF=EDG;:Em=CE=C2=C3=C2=CC=ECRA>?KZd=FF=DC=D5=E3cXn=D9=CE= +=CE=CF=CF=D0=DA=ED=F7=E5=D9=DD=F5z=E8=DFvYXbyo][gjVMOTXWa=E5uk=DF=DC=CE=E1= +]=EA=CB=BEY?=C5=BB=B7=BF<37k=C7=DA=BA=B9=BF=C1O0-6AX=D8=C3=BE=C2=DFE?GUh=D4= +=C3=BC=BA=C4=DCSB?AMq=ECd=DB=CC=DDeP=EC=CE=C7=D6_=D5=C8=D9^]=E7=DA=E2\[=FA= +=E0mZfs=FBb_dp^KLOc\K`=DD=D7=F4[=DA=CE=D8pL=CB=BC=BD=BFJ<;N=CC=CF=BB=B5=B7= +=BBu:/5Y=CD=BF=C4=E2TIILMg=CE= +=C0=BE=C6=D6mNF at BKZ~=E1=D2=C9=CD=E8p=E4=C8=CC=E1=EA=CB=BE=C5{X=F8=CF=EFNO= +=FE=E0^JK\[JDLXYOM[=FEqiw=E5=DA=CE=CA=D2=D7=CB=C8=CA=DAW=F2=C4=B7=BAY:5;<;?]=CC=C4=CFeOR]Za=F5=CD=C0=BF=C6=D1=EB\OKMS_u=DC=CC= +=C6=CB=DD=7F=EE=DA=E0la=F0=D9=D9sUUa`VSZgum_^cf_^ao=F8=EF=EE=F2=EC=E6=DF=D7= +=D1=CF=D1=D4=D4=D6=D9=E2=F1gZm=DF=CF=DBWECO_fgw=D8=CE=D3=F7TKIO[m=F7=F4=ED= +=EA=E2=DF=DE=DC=D8=D4=D1=D4=DC=E7ue^]^]XSQTZ_m=F1=DE=D7=D4=D3=D1=D1=D3=D9= +=DE=E8=EE{f_an=FB=F8xoruoia]]][ZZ\_j}=EC=DF=DA=D9=D8=D8=D7=D8=D7=D8=D9=D9= +=DE{k=ED=DA=E3bNJN\]VYl=E3=D9=D9=EEc\\amujghms=F0=E3=DA=D0=CD=CB=CC=D1=DC= +=E5=EC=FBk]UMHFGKOYe}=E1=D4=CD=CD=CE=CF=CE=CE=CF=D6=DE=E6=EF=FBu|=FC|=FEx= +jb^ZVUROPPQSW\_k{=EC=E4=DC=D5=D2=CF=CF=D5=DC=D1=C7=C7=D4=F9`\ixk~=DA=CF=CF= +=D7=EE]QQPPQNKKORWb}=E3=D6=D0=D2=D5=DA=E0=E5=ED{e^[SSUYd=F4=DF=DA=D0=CA=C8= +=C9=C8=C8=CB=CD=D7=EFpja\[\YWWSRSRQQSSTVX[fv=F7=E8=DC=D6=CE=CB=CB=CC=CB=CA= +=CA=CF=DE=E6=D7=CF=D4|PJJJKLT{=DC=DE~]RONQ[dlnlo=FE=E6=D7=CE=C9=C4=C2=C3=C6= +=CB=D1=DA=E5w_QJEDDDEHO\o=E7=DA=D1=CB=CA=CC=CD=D2=DA=DF=E7=EB=E9=E9=EC=F2= +=F6=FB=7Fxroie]XUSUVW[]`go=F8=E9=E5=DE=D9=D7=D5=D5=D5=D8=E2=E4=D9=DB=E3=E0= +=F5o=FDeYcpy=E9=E4=ED=F5p_XSRRVZXTW]dx=EC=DF=D8=D5=D6=D5=D2=D2=D5=DA=E0=E9= +w_YY\eq=F7=E8=DD=D9=D9=D7=D4=D5=D8=D9=E4=FBl^YUUUWYZZY]_bjmppnku=FE=F7=EC= +=E7=E2=DC=D9=DA=D9=D5=D0=D2=D5=CC=DAai=F3=ECg\fjphVNS[\[]q=F9z=FC=F3=FA=E7= +=DB=E1=E7=E1=DE=E8po=F1=E9=E8=F2=FE=F7=EC=F6g^g=E6=EE`l=F3=F5=EEe[=FA=EF~= +ia=F9=EDm=FDn=F0=E3{=ED=F0=E1=EB=F1{|=E8rl=FDp=EAs=FDz=FD=DD^=DFqz=DCZ=DC= +wt=DDR=F4U]cT=F7e=E1=F6zm=EE=EC=F4=DD=FA=D2=DF=E0=DA_=D6=FA=EB=E3=EE=E4=FC= +=F8jyx^}^|=FB^]`[d]Zk`a]ckk=F6a=EFzy=EBv=DD=E7=DD=D5=EA=D5=E9=DC=D3=E2=CA= +=DB=D0=DA=DF=DF=E1=F6=F0=EAy=EFn^\LbSkmS=F0L_TUePh\l=EE_|w\=DFo=E3=E2=EC=D0= +=DF=D7=D8=DA=D7=D6=D3=D5=D5=D4=EB=D4^=E0j_=EASyTg\[]KZM[ZU=FFW=EA_=E1=EA=FA= +=CF=FA=CC=DF=D2=D3=EC=C6=F7=CE=DB=D9=CD{=D0a=D5^=F5]TiKvIaWIfG^NQoN=D9^=E8= +=FE=E6=D8=E4=D9=DF=D3=D7=D0=D8=D0=D4=D3=D8=DC=DC=DC=E9=ED=F5=EA=E6hk_^ZVS= +XO\RVOWOfVd=FF=F5=DF=EF=D9=E5=CD=DC=D3=D7=CF=D2=D3=D9=CF=E6=D9=F3=EB=E8_s= +NkKbO_[d[_=FC^wxw=E7=DF=EB=DE{=D5c=DBq=E0=DC=FF=DEx=DF=E3e=FCX}]=F8sl=E7_= +=E5^=EFZl=FEe=DDW=DDo=E4=DD_=CE=FF=D1=E0=D6=D5=FC=D6ml=EEO=F5L=F1SYdJ=FFH= +rN=FFXnmy=F2=ED=DD=EB=D2=DD=E2=D1=DD=D2=D7=E3=D7=E5=D1=F4=DB=E9=EB=E8g=E7= +Tp\crfdjf=FB[gUgeZ=ECZ=E8i=EAy=EA=EF=FB=FC=EF=F6u=E7=F6=EEm=EBk=E4=FD=E0l= +=DC`=E9agkq=E9|=DEz=DA=E4=DE=EB=E0=E6=DDu=E7f=F2s^[h^hcW=EAi=F8tk=E4=FCk=DA= +X=D7W=ED=FE=E7=DC]=D7g=DB=F4r=E0g=E8va=EEb=FCW=DFb=F0y=E7=ED=FF=F1=EC=EF=F2= +=F4=EDm=E8ok[=F5{Z=E5L=E0]u^\=E0=FE=DBi=DF=DE=D6=DC=DF=DD=E9=F9=DAh=D0k=E9= +n=DF=F1b=F7Z=DAV=F1\\=EES^S^_Q_Qlq]=E2{=D4=F6=E1=DC=EB=D9=DB=F6=DC=EF=DA=E3= +=E7=E7=E3=D9=E0=FA=DC=EEy=E0Z=EE=E6|=F6\=E4omzOVoM`N[=F1Y=DAT=E4=F6t=E9Z=D8= +e=D3]=EA=E5=FF=DCo=F0=D9=D3=EE=E1=D7n=D3m=F8=F8kja=EEh=DBx=EA=D2f=D1i=EBr= +gtqVQ^QoN_Uea[]`=D4h=D7w=F3=DF=D5~=DC=DE=E5=D5=D8=F9=D0=EF=CEx=D5=DA=DA=F0= +ocxm=E7=EFV=EDaqoJfM^=FCRmV=EFu[=7FU=D2X=EAjg=E4=E3]p=ED=DEu=E2=E7=D8=E0=CE= +=DC=D1=E0=CF=DD=D9=D4=E6=E6=DEl=DAh=F8=EDR=F8K^PZYITNR=FEIyao=FCh=DD\=DD\= +=DB=D6=F3=DE=D7=D6=D8=DD=DF=CE=CF=D7=D3=EA=C2=EC=D4=EB=EF=DBT]i\=E4JXAQLF= +TLj\=E3n=EFhm=EB=E6=DD=EA=DE=D5=D4=D0=DC=CE=CB=D1=CD=D8=E2=DA=DE=EE=DFjid= +Y]MNJONIXQYOOZ=F9p=E3j=CF=D5=CA=D7=D2=CE=D7=CC=E0=D2=D0=C9=D9=CF=DB=CE=D3= +=EAUvi=EEYKS`pMMI_[POKSWY]X^=7F=F0=FE~=FD=DC=D0=DB=CE=CD=CD=C9=CF=CF=D0=C6= +=D2=CE=C9=E0=CC=F0pmjsSYJMVNLBLPLTG\^=F0_o=E9=DF=D4=E9=D8=DB=D6=D1=D4=CD=D0= +=D7=D0=CE=CC=D6=D4=F6=D8=DD=E2=EBbej=FA^XRNXUNJHLR\S]u|zit=DE=D8=FE=EE=D4= +=C7=CB=E6=F4=D5=C2=C6=D5=E0=D8=CB=D5he=EE=DA=E6XNX~gSNN^SHJMNW_PZ=D9=D9=E0= +x^=FB=D3=CA=D9=EA=D5=C8=BF=C7=DE=E2=D1=C7=C9=D5=ED=E7=DA=E1hVQW[UJFIHIFDE= +KSNP^=EF=DFx_=E4=CB=C2=C4=CC=C4=BC=BB=BD=CD=E0=BD=B9=C8=D5=EDdmH8Ab=E3=E0= +iORI:303;FOi=E6=CF=C7=C4=C7=C5=C0=BF=BE=C3=C2=BC=BC=D1LDw=C6=CAfLx=CA=D1= +R at L=DF=CE=E6\X^XIBBFN^]Z^e=EA=E6mQU=FB=D9=CB=CF=D1=CA=D5=E9=C3=BE=BF=BB=CE= +L>Fe=CB=BC=BE=C4=C6=CEZAo=BE=BB=C6=CDo?776:K=EE=C7=BB=B8=BC= +=C5=CE=DA=E1=DE=D5=CF=CB=C7=C6=C3=CFY at 9;BLLNd=FA=E9=E8=F9=FE=EC=D7=D4=D8=DF= +{ge=7F=E7=D7=D0=D5=DA=DF=DE=F1_RSm=E3=DF_LJQq=DB=D1}H=3DR=C8=C7=C7=D1K>d=CB=BF=BC=BE=CB=E1=EDk_|=DB=CE=C8=C5=CA=D2=E5O=3D9;= +AKX_m=DD=DD=E2=E5=EC=DD=DD=D8=DB=EA=ED=F6=EE=F5=E5=D8=D4=D2=DE=FFc^]VTYg=E9= +=DDsSLN[=FD=DA=DC=EF_Lu=C6=C5=C3=CDT>9D{=C2=B0=B3=BD=CAj at 789@q=C7=BB=BB=C0= +=D3YOPO`=E4=CF=C7=C6=CB=DA=F6J:8;IYo=EA=EC=D3=D0=D8=D7=D9=D6=D3=CF=D0=E0= +=F0ut}=EF=E5=F5|ja`ZVOOWZ`{=F5n_UQ]=E7=D1=CE=D2=D7gn=C4=BF=C2=BF=E4D:=3D^=CA= +=B2=AF=BC=CD_?4479J=DF=C5=C1=C9=D9XKPVk=D7=CB=C8=C6=C6=C9=D9VB>CUjl=F1=E0= +=D8=DB=DC=DB=D7=D1=D3=D8=E3=EAu]^`=FD=DD=DC=EEcYVUPOQS]o=EF=F0`]^`=E8=DC=D7= +=D7=D7=D4s=DB=C0=C2=BF=CBN;7E=EC=C1=B2=B6=C3=E1M<58;Bn=C9=BD=C0=CA=DFON\l= +=E4=D6=CE=CC=CA=C7=D3YA=3D>DQU\=EC=D3=CF=DA=D8=D9=DD=D7=DB=DF=F1=E8=E8m~=EC= +=E0=E2=F4yce`TOR_q=FFxlfhkis=EA=DE=E5=E4=DCj=E4=C3=C2=BF=CDI:8M=D4=BF=B3= +=B9=C6=DDO>56>X=C9=BC=B7=BA=C1=CBrI=3D:@O=F3=CB= +=C4=C8=D4=FAd[Z]i=EC=DF=D4=CF=D5sIADHNOQg=E4=D6=D7=DA=CF=C9=C7=C9=CE=D5=E1= +zeao=F0=F6xy=F8r[ONRY`d`_eo}=EB=E4=EA=E8{]=DF=C7=BE=BE=F0?I_=FC=F9=E4=D7=CF=D3=E9k^`=FC=DD=DC=E9=F6= +=F7gOFGMX_i=F0=DC=D9=D8=D3=CE=CB=CC=CF=D3=DA=E6v_Z\dq=F2=F0=FFk\\i]MIL\xx= +^Y=E8=CB=C2=C9VBINQTj=DF=D3=D4=E4=F6=F9=EB=E5= +=EB=EE=E8=DE=FBRIHJMO\=FA=E0=D9=DA=DA=D3=CB=C5=C7=CD=CF=CF=D6=EFf`hl_[]]Y= +V[\QLR_cWONi=D2=C9=CDoKO=E3=CB=CC=D6=CD=BC=B6=BE=DDQKOMHFLe=E3=E2=FAm=FD=E1= +=E4rk=E8=DB=F9[Y\TNOYglgm=EA=D8=D4=D5=CF=C7=C2=C5=CB=D4=DC=E1=F0{gguj`n=EE= +^KLX\SR\V]=DC=D8=FDQDESu=F3=F7=D7=BF=BA=C1=D2=7FgaOHHU=E6=D7=DE=DC=CF=CD=D1= +=D7=D0=CA=CE=FBc=F4=FEL?CQXKBL=EC=DCn_=DB=C7=C9=D4=D4=CB=C9=D1=E9=F5=EB=ED= +vkt=EB=DF=EEh`ce\TXWJ]=D6=E5[PRYVTZ=EA=C6=C1=CB=CB=C9=D2uSPOMQXby=E5=E2=DE= +=CE=C6=C8=D7=D2=C6=CB=F6XUWOF?CQSOX=FC=DE=DF=E0=D6=D3=D8=DB=DA=DC=E4=E4=DF= +=E7=E1=D6=CE=CE=E1=EE=DA=D9=EEn=E8=E8Tk=D9cUQMMFAH\pZ[=E4=D3=F1X[uaMOt=F2= +q=EB=D4=C6=C1=C5=C4=BF=BD=C0=C9=CA=D2=E4eNIFCBFJMXl=EC=EB=F8=F1=E0=DC=E5=FB= +=F7=EC=7Fh=FC=E7=F4ff=ED=DD=E6=FB=DE=D7w=DB=CC=EC~ra]OJNg=EF=FD=EC=DA=D5=ED= +nkd\VV[YYeo=E5=D8=D4=CE=C9=C5=C8=CA=CB=D0=D3=EBdXMHCBDKOXi=EB=DC=D5=CF=CD= +=CF=D2=D5=E0=FE|d\\UT^n=ED=DC=F2=E6=C5=CFm=EA=DD=F2h[]=E6=DC=EA=DC=CD=CD=D4= +=DE=EFzePLLHDFHKWV_=EF=EC=DC=D3=D4=D6=D6=D2=DD=F4l`_]]f{=EF=E1=D9=D2=CC=C7= +=C4=C3=C2=C4=C7=CD=DF=EBiQPICFHKJIsmO_iZTTVb~=EF=E5=D9=D1=CE=D0=CC=CC=CC=CE= +=CF=D0=D4=E8=FEz_bj`o=FA=F2=FDpm`cZONMHGGGJOXo=E2=D5=CB=C5=C3=C0=BF=BF=C1= +=C4=C9=D1=D9=E0lVYVOMXwTY}fUUX]Y^jw=FB=E4=E6=7F=EE=E7=FCw=EC=EA=E9=EB=E1=EB= +=F5=E0=EC=EF=E1=E6=DE=E1=E4=E3=E9=F2jZTNKIHGJLS\l=E9=D7=D0=CD=C9=CA=CA=C9= +=CA=CD=CE=D2=D9=DE=F9}=EDaj=D4m_=DD=FAZc`Y]idowvk_\]YVbd]etea=FEsl=EC=EC=DF= +=DE=E1=DD=DD=E2=DF=E8zlj[YYZ]en=EE=DE=DA=D4=CF=CF=CF=CF=D1=D7=DA=E3=EB|_[= +[UTOf=F9Xj=E0=F2=FC=E2=F2=F0=EC=F6{=F2=EE=EA=F9|=F6=F2omve\^d]]mof=7F=EB=E6= +=EC=E6=DB=E6=ED=EBtcf_[]\\`ho=F3=E8=DD=D4=D4=D1=D1=CF=D2=DA=D9=EEpng_[]YR= +^=E9jb=E3=E7=F7=E4=F1=FD=E8=E2=EB=E1=DD=DB=DC=E4=EA=EF=F9qtkc^_[[\Y_a_emj= +eimsonla]]Z[_g{=EE=EA=DE=D2=CE=CC=CA=C9=C8=C6=CA=CD=CE=D5=E0=EA=FCo]VTSWS= +RYYVZ]]\]_lyw=F3=E8=E4=E4=E0=DF=DF=DD=DE=E0=E1=EC=FA|of^[Y[\^fkkr~=F8=F4=F5= +=ED=E5=E1=E6=ED=F4~=FD=F6=F2=ED=E7=E2=DE=DC=DD=DF=DE=DF=E3=E3=E8=EE=F5yss= +upkhgfcaaa_ccdhkruusroux|=F6=ED=E9=E5=E3=E1=DE=DE=DF=E2=E8=EF=F4=F9=FDztm= +igd`^^^^]]]^`k~=EF=E5=DE=D9=D5=D3=D3=D5=D6=D8=DB=DF=E5=EB=EE=EF=F1=EE=F3=FD= +}{}xyz}zsuoh^YXXXXXZ^aimoptzwsqnv=FE=F6=EF=EC=E9=E4=E1=DF=DC=DA=D7=D5=D5=D6= +=D7=D9=DD=E2=EB=EF=FC|=FE~||umkgc_\ZXVVX[]_cioz=F4=E9=DF=D9=D6=D5=D5=D3=D5= +=D9=DC=DF=E7=ED=F7qjd^]\ZXXWWWY[]cn=F9=ED=E8=E0=DE=DE=DC=DC=DD=DD=DD=DE=DF= +=E1=E2=E2=E6=EA=EC=EF=EF=ED=F0|rlg`^]\]^_bdhox=F9=F2=EE=E8=E1=E0=DE=DC=DC= +=DE=DF=DE=DF=E2=E8=F0=FEphc^]\[ZXWY[_el{=F9=EF=EC=E6=E4=E4=E4=E4=E7=E8=E7= +=E8=E7=EA=EB=E8=EA=ED=EF=F7=FFzxqmkijmoonlklmoz=F6=ED=E6=E1=DF=DE=DE=DE=DB= +=D9=D9=DB=DD=E0=E4=EA=F2zf^YWUVTRRRSTVWZ_hkx=F3=EB=E0=DB=D7=D2=D0=CF=CF=D1= +=D3=D5=D8=DB=DF=E5=E8=EC=F2=FEuvvunkd^\ZXWWWWY\_bgn=FE=EB=E0=DC=D8=D5=D4=D2= +=D2=D3=D4=D7=DB=DF=E8=EE~oe][YXY[]``_^^^]^ahp|=FA=F0=E8=E6=E3=DE=DC=D9=D6= +=D4=D3=D4=D6=D7=D9=DB=DF=E2=EE{qie`\YVVUTTUVZ]ajv=F8=E9=DF=DA=D7=D3=D1=D2= +=D5=D7=DB=DF=E5=EE_^=CBdDLQ=D3=DAi`_=EF=EBgmfiZ=E4=D3=DFh=F1=E4|=D7=E6=EB= +aTS=CA=BF=EFfH`=E8`h=F5k=F5i=DE=ED=F4TS=F9eji=DD=F9~dw=D6=FCTb=EA=DF=DA=E8= +=DC=D0=DFj=DA=E0=DEn=F2=DA=D1=DF{=EA=EA`WSYNNLS]NPY`ng=F6=DD=D7=DF=DE=D3=D6= +=D7=D5=DA=D5=D6=DC=DC=DB=D9=DC=D7=DC=DD=E5=EB=F5sb]fUUNNMKIKNQU]by=E4=E4=DD= +=DB=D5=CF=CE=D3=D2=CF=CD=D2=D5=D6=CF=D9=DE=EF=E5=E8s_fgWQQTQNNSZVV`rpj=EF= +=DA=D5=D8=DA=D2=CF=D6=DD=D3=D9=EBz=F5=DF=EB_[y=EEndn=EFx[Z^\X[\PTh=F0=E7=ED= +=DD=CA=C6=CE=D6=D0=CE=D7qetbNKORMLY|=F7=EE=DA=CE=C9=CC=D6=D8=D3=E1_SY\WUU= +J\=CE_=E5=C7sa`\=EB=EA]=E7=C7=CC=D8=E5=ED=D8=F8NU=FDiX[=EF=DA=EB=EF=D8=C9= +=CC=D7=D2=CE=D9nZPH>879>HEL=E2=CF=C3=BF=BE=B7=B3=B7=BD=C3=C6=CEhJOSJEIWc]= +e=EC=DD=EDf^^p=7FM?NNIOOh=C9=D1[=CC=B4=BF=C4=C7=DD=D6wO\=E3=DE=F2=DC=C9=CC= +`QaTD>ENOIT=F5=DD=E0=DF=CB=C5=C9=CD=CE=D2wNGFC<=3DLfd=F3=D7=C3=B7=BA=BF=BB=B9= +=BE=C6=E0YRRRH at M_oj\e=DE=DEg\fiYJHLe[K]=EDnr{=DD=CB=C6=D7P=E3=B5=C4Kc=CF=EF= +N?J=D2=C3=DB=E2=BC=B8=D9Q^`J?@Y=E8X]=CF=C6=CE=D5=CF=C6=C8=E1b_^F<<<<=3DJ\bY= +=D5=BB=C2=D6=C6=B9=BB=C8=E1=DA=C7=D1VY=D6=D0^[=E4=DDnSVrcHIXSHFKSUQSo=F1Y= +^=D9=D5=DB=D4=CA=C8~=CE=B6=C0\`=C3=C4a?Q=C3=BB=DEk=BF=B9x?ARD67Q=FDOR=D9=CA= +=DDj=EE=D3=DE[UqmMFOWTPa=D2=CA=E5=E1=C2=BD=C7=CE=CA=C3=C1=D0=7F=DA=CC=FBQ= +Zq_OJTZKBMZNIM\`UTl=EDw=EC=CF=CF=CF=CE=CD=CC=CE=CD=C9=C7=CF=D5=CFZ=F8=C4=DF= +JU=D8jD=3DD=EB=D2QS=CC=C6R>APF;?=ED=CF=E1=D4=BF=BC=C7=D0=CA=C4=CE=EC=EA=D4=DF= +aT\_OO^fOR=EF=D9=ECs=E9=CE=D5_[=ED=FA\OSgh_h=DF=E4=E9=DC=D4=DE=E5=E7=DB=E3= +sa=EE=EBni=F9=E2=E1{=F4=DF=FB`{=E4nZo=EAo=3DD=C0=C6D?=DB=C6`:?=D1=BD=E6t=BC= +=B5=CCTX=E8^>B=DD=CAks=C9=C3=DFVj=DCwNQ=F6=FBOKU]LFP=F9jP|=CC=CB=D2=CF=C5= +=BE=C5=DB=DA=CD=D6{ksxe_`d_\^[OMTSLMX\\^j=F6=E5=DE=D9=D6=D4=D0=D6=DB=D5=D2= +=D2=CB=CB=D0=D0=E2Q=CE=BD=FDCS=DAx>6F=DE=F2GZ=C7=CAOCQjI>S=D3=DC{=CF=BF=BF= +=D0=D5=C7=C4=DB~=DA=D5dOU[ODL=FFjHK=DF=D6p\=E8=CE=CF=F7=F3=D5=D0=FDi=E1=DA= +=ED=E2=D7=D2=DFuv=F4ePNWZTYgbZ_|=F8ig=EA=DD=F3y=F5=E0=E0=E4=F0=D8=CB=DF=F6= +=D6]=EC=BE=CFW_=E7=DFU>D=F4=D1n=F9=C7=C6=F4PNUK=3DBq=ED`=F3=CF=CB=D6}=DF=CD= +=D8w=EF=DC=F1\Y^XLNe=EF[S=DD=CF=D6=D5=CC=C5=C1=CB=D7=CE=CE~y=EFbXjke`WXjW= +LU^PNRTUQTanp=EF=E1=DE=D7=D4=DB=D2=CD=D1=D2=D2=DB=CF=D0=DB=E3\=F4=BE=D1P[= +=EF=EFUBEg=E4n=FD=CD=D0~XOJE>E\ce=DE=D3=D6=DC=E7=DF=DA=E5=E8=DC=DF=E7=E5=EC= +}|je=F3=EC=EDr=E3=D5=D4=DA=D2=CC=CB=D1=DC=ED=F5=EChSU_XW[YVVTWUPR]_\_ba=FD= +=E7~=F5=DA=D4=DD=E2=DB=D4=D4=DC=DE=D7=CD=D3=DF=D7=D0=DC=EAe\=CE=CAUMpvXIB= +M=FCh_=E2=CE=DC=FDdYPJENa\p=D6=D1=D3=D3=D4=D0=D0=D8=D7=D4=D7=DF=E3=F2hYSR= +Z\XTk=E0=E0=ED=E3=D6=CD=CF=E6=F6=DE=E5fmf`=F5=EEm=F6=F1c^bZZ\Y_vjZ[_hf]m=DA= +=D6=DE=DF=D5=CF=D0=E3=DE=CF=D2=F8=F0=DC=DC=EDnqa`=DC=E9VOW=F6^CAVis=F2=D3= +=CA=CA=D7|g[KJ\mj=E3=D0=CE=CE=D4=D3=D3=D4=DF=E2=E8=FDmcXOKKSVSQj=E4=DE=E3= +=DA=D5=D1=D5=D9=DA=D4=D8=E1=E1=E1=F7=FC=E3=DF=DC=EB=F6=F2=EAjVTUTTNMSRNNQ= +SX^u=F5^=FE=CA=D1~=DA=CB=CC=CA=D0=CF=C3=C5=D2=D7=DD=CD=C7=E3YYnbLCI\njo=DC= +=DBnXNJE?BKTW{=DC=D2=CF=D3=CD=C8=C9=CE=D2=D1=D0=DD=FDj__c_Z^=ED=E0=E7=DA=D0= +=CE=CB=D3=DD=D6=DCukjWQXVQTTTXYV[XSWXZcig=F8=E2=E6=DB=D2=D6=D5=CE=CB=CC=CF= +=D2=CD=D6=E9=DF=E5t=FE=F0hqnR=F2=CD[GQ_TNIL=EF=EDu=DF=CC=D2=E5=E2=EBo_NPb= +kc{=DB=D6=D3=D0=CD=CE=CF=CF=D4=E4=F9fWOKJOTOOn=DE=EB=EB=D3=CF=DB=E2=DF=E0= +=F1ljegghrx=FF}=F8=F0=EE=FE|=E7=EB~=F2=E9~m{=7Fq=FE=E6=EAn~=E6=E3=FBbt=F1= +{lgfmdSn=E6Mh=C3=EAMa=EE{=FA[O=DC=C7=D9=DC=C6=C4=D9=D9=E3c[OLPXU]x=EC=DF=DF= +=DF=DA=D5=D8=E5=F3u^YOIJOOKW=E9=E4=DE=D6=CF=CA=C5=CE=D3=C8=CB=DB=E4=E0=EA= +|s_cjbbdYPWVQY[V]e]`wv=7F=E6=E4=E5=D8=D7=E0=DD=DB=EA=F2=DC=D7=E0}=E9=D9=DF= +MU=CB=D7NMb`hTM{=CE=E5=EF=CE=C6=DA=DD=DB=F4dZY\eY]=FB=E9|=E9=DE=DD=DD=DD=E0= +=F0vd[QLIJGGNZ^l=DB=D1=CF=CE=CA=C6=C7=C9=CA=CF=D3=D3=D5=DF=E9=E0=F0z=F5=FD= +`_bUNNNKIIMOPT\_h=EC=DC=E1=DD=D6=D4=D0=CE=CE=D1=C9=C6=D2=DB=E7=E1=C8=D5XX= +=F3^OMJM[Z\=F9=DB=EE=EE=EAo`]ZZ]^aw=F1=EB=DF=DB=D9=DA=D4=D1=D6=DC=DF=EFcV= +VXNJSwqk=DA=CF=CE=CB=C9=CD=CC=CD=DA=E3=E5=FAfghfga^jb[YYTRSNJLSNO[dd=EF=DE= +=DB=DC=D8=CC=CA=CF=CD=C9=C8=CD=CC=CB=DD=DC=E4=D3=D6=FD[^hXOLK[d\\w=FAen_X= +WXSW\_l=F3=EC=E7=D9=D3=CD=CC=CB=CD=CE=D1=DD=EFqgZQUYYVc=F2=EF=E7=DE=D7=D6= +=D7=DF=EB=EDoii^YX`]]]bnuo|=EF=F6qx=F8{v=FA=ED=E9=DF=DE=DC=DC=DA=DB=D6=D4= +=DD=ED=DB=DAtk=F8_Nk=E6YNZZTOMObim=E7=D6=D4=D7=D6=DA=DF=EC{=F1=FAmm=EF=F6= +x=EB=E5=EA=E0=DD=DB=DB=E1=F0=FDmZOJKKNPXu=DF=D7=D5=CB=C5=C8=CB=CE=CF=D4=DA= +=E1=F7=F2qa[`a]]^^ZTQNMLKMQSXi=F9=E8=DC=D7=D5=D3=CA=C9=CC=CF=CA=C7=CE=DF=F4= +=D8=C6=DBV`=DDvOLRa\W_ztdgbYUTUZZ[g=FD=F8=E9=E0=DD=DA=D0=CD=CE=D0=CF=D9=E8= +=EFoZOZXTX_t=E3=D6=DA=D1=C8=CC=DB=DC=D6=F9^_[VNPTYZ_=FA=E9=E1=E7=E2=E5=ED= +=FEnpsg`ep{=EF=EF=F6~=F0=E6=F4=FD=F8}o=FAh\=E3=DEdo=E1=DF=FF=F9=ED=DE=D8=DA= +=DA=CF=CE=DF=ED=EEjXQOOPOOZ]`h=FE=E9=E4=DE=DA=D6=DA=DE=E9=F9qeYWX[_dw=E5=DB= +=D5=D0=CC=C9=CC=D3=D6=D8=EBog]WVSV\^g{=FD{=F4yifg]^b^i=EF=E6=ED=E3=D9=D8=DB= +=D4=D4=DD=E8=E8=E7fTk=EBcSZs\QTi=F8=F4~=E6=D1=D4=E4=E6=DB=E6dbrmdi=FA=EC=EB= +=EF=E3=D8=D5=D6=D5=D6=E2=7Fe^QHEEHIMUk=E1=D7=CF=C8=C5=C4=C4=C6=C8=CD=D4=DC= +=E7ud^[X\]\[YWXXNLNNJJOUZ^r=DF=D3=CF=CC=C4=C1=C2=C3=C7=C7=C1=C9=E4~=DC=EB= +VMS^\TR_lXMQVNILTVR]=F3=DD=DA=D2=C8=C2=C0=C3=C4=C5=CB=E0pfTH at CHIHNl=DC=D3= +=CE=C9=C5=C5=CC=D3=D7=DD=FBga\VRV_eck=F7=E8=EC=F8vweXTU[XU^~=F2=EF=E5=DC=D5= +=D0=D4=E6=D9=C8=CF|d=F4}[Vb=E8=D8=DE=E8=D3=C9=D7s|=EEhRPXYPMQ\]\k=E3=D9=DE= +=DF=DE=DF=FAg[TOIGKVg=FA=D7=CA=C4=BF=BE=BD=BD=BE=C4=CB=CF=DBrYPLJFDGJKKOT= +XXUTX]_\]=FF=DE=DC=D8=CE=C6=C2=C2=C3=C3=BF=BD=C2=D2=E9=E4=FAZMLQZVOPYUMKL= +NLJJOTX^|=DB=D1=CD=C9=C6=C3=C4=C9=CD=CE=D1=E6i]ZSNLO`{=EE=E3=D7=CE=CE=CF=D0= +=CF=D3=E2q^VQMLLPWY^dr=FA}vkgv=F5|o=FC=E3=DB=E1=E1=D5=CD=CD=D1=D7=D7=CF=D4= +=E4=E4=F0h[VTTUQUbjaaijf]W[egel=F1=DF=D8=D7=D4=CD=CA=CA=CC=CE=D0=D3=DDw^Z= +VLHIOWVVb=EA=DE=E2=E5=DB=D3=D7=E6=F5=E9=E6{`f=FE=F3|y=EC=DF=E1=EC=F4=F5p`= +fh\Z\hq^d=EF=DF=E4=F2=E5=D1=CF=DD=F1=E3=D3=DE]Td=F9mYWo=DD=E4mb=F7=E0=E9t= +i~=EA=EEmh|=EC=E8=F0=FA=EB=E2=DF=E6=ECze_[TOLLPTST^s=EC=E5=E8=D9=CF=CE=CE= +=CC=C9=C9=CA=CD=CE=CE=D1=DA=E1=E3=E7n[Y[YNMPRNKLMRPP\]cn|=DD=D4=D9=D3=CD=CC= +=CC=D0=CF=CD=D0=DE=ED=DE=D9=DFvh=FA=E6zYW_bWMMPTOMR]kyy}=EA=DD=D8=D8=D6=D0= +=CE=CE=D2=D7=D5=D7=DA=DE=E8=EF=F6tle]cb^]ZVUSRVYUR[krjo=E7=DA=D6=D9=DA=D1= +=CD=CE=D2=D1=CC=CD=D5=D9=DB=DA=E7no=F9oihbWOKKPOKKQ]`[^n=ED=EB=ED=DE=DA=D3= +=CF=D5=DA=D6=D4=D4=D4=D8=D9=D9=DC=E6=EE=EF=ECu[\__SLNTSQU[^iz=EE=E6=E7=DF= +=DA=D9=DE=E9=E1=D9=DA=DF=E5=E9=E7=E8=E3=DC=DC=DF=DF=DC=DD=ECrp=FFn[SVYTSV= +[]^cjt=FC=FE=F5=EC=F0=F6=F0=ED=EB=EA=F1=FC=FE=E9=DF=E2=E6=E6=DF=DE=DF=E3=ED= +=F1=F1=EB=EF{nk~=F9wklnnibfnmd_gjj_Z`b_ak=F5=F1=F6=E7=DD=D5=CF=D0=D0=D0=D5= +=DA=DA=DE=E4=EB=E5=E0=E9=F5=FF=FA{kb^^ZQONQOMOQW[[c}=EF=E8=E3=DB=D9=D8=D6= +=D3=CE=CE=D4=D7=D6=D2=D8=DF=E8=EC=E7=FEf_`da[ZY[]^_bq=ED=EF=F6=ED=E1=DC=E2= +=EB=F7=F0=F1}ncehm{jh=FA=E9=E7~dk=EF=FBg_emppn=FE=F5=E7=DB=DB=DB=DB=D9=D6= +=D7=DC=EA=ED=E6=EA=F3qhrqf`_gi]Z\__\X]mxifu=EF=EB=EB=EB=E5=E1=DF=D9=D6=D7= +=DA=E1=E5=DA=DB=E9=F0=F9=F7=FCj]Z]`a][^imkkj|=F7{st=F1=E5=E5=E9=EB=EC=E5=E6= +=F5=EF=EE=F0=F2vv|=FD=F8=FEtw=F6=E7=E5=F0=F8=EB=E3=EB=FEorts`Z\^\_jmoo~=ED= +=E1=E1=E6=E1=DA=D9=DD=E0=E1=E7=E1=DE=DD=DD=E8wgi_WUQPRRRUZ_k=EE=E1=EF=F0=DE= +=DB=D8=D9=E4=E9=DD=D9=DF=EC=F1=EE=E7=EB=F3=F6=ED=E6=E3=DD=DC=E6=EB=EF=EB=E2= +=F6nbj=F4gY\[__YVTWYYZ[[d=FB=F5=FA=FC=EE=DD=D9=D6=D5=D2=CE=CE=CF=D6=DD=DD= +=E8znnkg^\fjc]`m=FDwdbr=F1=FB{=FC=EE=ED=F5=FA=F8=E4=ED=FF=EF=FF=F8=F0=EB=EB= +=EF=E9=EE=ED=F5vmihe`ahkme^j~=F5}|=EC=DF=DF=EA=ED=E2=D8=DC=E5=DE=DF=E9=F4= +vkdb_[YY[ZZWVX_cm=F8=EF=E4=D7=D3=D3=D1=CE=CA=C8=CA=CC=CF=CD=CE=D8=DB=ECpm= +^ULHHGGEEIMORXYa=FC=E7=DF=DB=DA=D1=CC=CD=CE=CD=CB=CA=CD=CF=D8=DC=DD=E6=F8= +idc`_YTU]]W[^ftjfgg}=F6vrx=EB=DE=DF=E2=DF=D8=D2=D4=DA=D6=D0=D3=DB=DF=E4=E7= +=F1ohb^ZWVSOOTZ[UV]__\V[p=EF=ED=E8=E3=D6=CF=CF=D1=D4=D0=CF=D2=D8=DC=DD=DF= +=DE=DC=DE=ED=FC=FF=F6=F9f]cpf[YWXXWVX\]_^ai{=F9zz=F3=EA=E6=E6=E7=DD=D5=D4= +=D5=D7=D5=D5=D5=D4=D6=D5=D8=DE=E5=E2=E1=FA^Z[UNJFEHJKNNOYfx=F8=EC=DD=D0=CC= +=CB=CD=CC=C8=C5=C7=CB=CD=CD=CE=D4=DD=E9=E6=EFg^XYVLHIJKKKNSX[]jw=F1=DE=D6= +=D1=D5=D3=CE=CB=CD=D5=D7=D1=CF=D2=DA=DA=D8=DC=E2{lx`XZXWQONMLMNRXWZh=FE=FA= +=FE=E5=DC=D9=D3=D5=D4=CF=D1=CF=D1=D8=D9=D8=DA=DB=DB=DD=E5=E6=E7=F8=F4=EE=FB= +wjpna\USTQPQSVWUWZZ\dlp=F3=EF=F1=E0=D6=D4=D7=D8=D4=CE=CD=CE=D3=D2=CF=CE=D3= +=D7=DC=EC=FCrjf\TWXYZQT]_c\Zbokl|=ED=E4=EF=FBw=FB=EF=F5}n|=ED=E6=E8=F2=E9= +=DE=D9=DB=E0=E0=DC=DC=DF=ED=FE|qlhfa\]afeaeu=F8=F7=F9=7F=F2=EB=F9|}=FC=F4= +=F6=F1=EA=E8=E7=E7=E2=DD=DA=DE=E6=EA=EA=EFn^[aa[VQV^_YV]gf__n=F1=E9=E9=DF= +=D9=D3=D0=D0=D0=CE=CF=D1=D0=D2=D3=D7=DA=DE=DF=E8uc`hfYPQUVPNOVXUV[anrn~=F6= +=F2=EE=F0=F5=E6=DD=DE=E0=DE=DC=D9=D7=D9=D9=DC=DF=E2=DE=DE=E3=EB=EF=E7=E4=F3= +wljnnb]aeha\_cgecdjvz{y=FE=F2=ED=EB=F1=F4=ED=EA=EF=FEz=F9=ED=EB=ED=EC=E4=DE= +=E2=EB=F4=EB=EA=EE=F0=FC=FC{tpkc][Z[\_en|=FB=F9=FA=F3=EB=E4=E5=E7=EB=ED=EA= +=EA=EC=ED=EC=EB=EB=EC=EC=E9=ED=F1=EF=F0=FBwoica_ahjknpy=FB=F7=FA=F5=ED=E8= +=E4=E5=E3=E1=DF=E2=EB=F6=FFyyxtnkliiijjihea__^_dkr=FC=ED=E5=DF=DF=DF=E0=E0= +=DF=E2=E6=EC=F5=F7=F9xxz=F8=ED=EA=E4=E2=DE=DA=DB=DE=E1=EC=F8=7Fwl`[YYXWWY= +\^bcbgq~=FA=F1=ED=E9=E6=E9=F3=FB=F4=EF=EC=E9=E8=E4=DE=DA=D9=D9=DA=DA=DB=DC= +=E6=F1|ne\WVXZ[[^gljomo}=F8=F0=EF=EC=E6=E7=E7=E9=E7=E9=EB=EF=FAy~=F6=F2=EF= +=F0=F1=F0=ED=EC=F0=F6=F5=F3=F2=F0=FA=7Fwvvr||{uoidcegggghifhku=7F=EE=E2=DD= +=DB=DC=DE=DF=E4=E8=EF=FEoige`\[ZZZ\]do|=ED=E3=DC=D6=D1=CE=CD=CA=C9=C8=CA=CC= +=CF=D6=D9=E5=FAi]WQMKJJIGGGHKOSX^hx=E9=DE=D9=D4=D1=CE=CD=CC=CD=CD=CD=CD=CE= +=D0=D4=D6=D8=DC=E3=E5=EC=F0=FCoc^ZVVUVXXYYZ\^aelv=FB=FB}vty{{=F8=F1=F2=EA= +=E3=E0=E0=DF=DF=DD=DD=DF=DD=D8=D6=DB=E6=EE=F3=F3r_XWXXVW]h}=F6=F2=EC=E6=DF= +=DD=DE=DF=E2=E7=EC=F6=FEwprnmmiea^^^_ciqy=F4=EA=E7=E3=E2=DF=DE=DF=E2=E2=E6= +=E4=E5=E9=ED=EF=F0=F4=F4=FDunha_]\\\[\^dm{=F7=F4=EA=E3=DF=DF=E2=E4=E3=E0=DF= +=DE=DF=E1=E0=DF=E2=E8=EC=EF=F5~xnfb``adhnolmmmjeb^^__]^_behnu=F2=EC=EA=E4= +=DF=DA=D7=D5=D3=D3=D0=CF=CF=D2=D4=D5=D4=D5=D7=DC=E1=EC=FAsd[WUQOMLLKLNOTX= +YZ[^cm=FC=EB=E5=DF=DA=D6=D5=D2=D0=D0=CF=CE=CE=CE=CD=CE=CF=CF=D0=D3=D6=DA=E3= +=F1o`XSQOMMLKKLMOTWZ^gp=FD=EE=E8=E0=DC=DA=D6=D6=D6=D5=D4=D4=D7=D8=D7=D7=D7= +=D8=D9=DA=DB=DD=E3=EA=F3=FDyme]YWSNKJJMOOQTZ\_cj=FD=E9=DC=D7=D2=CF=CE=CC=CA= +=C8=C8=C8=C8=C9=CA=CB=CC=CE=D4=DB=E8=FEk_YRMJGEDBBCDEFGJMR\j=ED=DA=D1=CC=CA= +=C8=C7=C6=C5=C5=C5=C5=C5=C5=C6=C8=CA=CC=CE=D0=D7=DE=E9|_UOKGDBABCCCEHJMQW= +`t=E8=DB=D4=CE=CB=C9=C8=C8=C7=C7=C7=C8=CB=CD=D1=D8=DD=E5=EF=FEsgb^[\^`a^]= +[ZYYZ[]]\\]]``gmpz=F5=E9=E3=DE=DC=DB=DA=D8=D6=D4=D3=D4=D3=D3=D6=DB=E1=EB=FB= +nb\[ZZ[]_ejlnnnmoqt~=F2=ED=E8=E1=DD=DC=DC=DF=E7=F0|ojda^\[[[[_dhlpuz=FA=F4= +=ED=E8=E6=E6=E8=E4=E2=DF=DE=DE=DB=DA=D8=D7=D7=DA=D9=DA=DC=DE=DF=E5=ED=FDo= +bZSOLKJIJLNQTX]gy=ED=DF=D9=D4=D0=CE=CD=CD=CC=CB=CB=CD=CD=CD=CF=D2=D8=DD=EA= +=FDod]WPMKKJJJKMNOTY_ht=FC=EC=E2=DB=D6=D2=CE=CC=CC=CC=CB=CA=CA=CA=CB=CC=CD= +=D1=D8=DF=F2m]VPMLKKLLLMNOT[dp=FB=EE=E8=E3=DF=DE=DE=DB=DB=DB=D9=D9=D6=D5=D5= +=D7=D9=DA=DC=DE=DF=DF=E0=E7=ED}mb\XSPPQRPPSTUVZ^gv=F2=E2=DB=D6=D1=CF=CE=CD= +=CD=CE=CF=D0=D2=D3=D5=D9=DC=E2=EB=F5{ohc^ZWVWVXXXYZZYXWWXY[]_dm=FE=EC=DF=DA= +=D7=D4=D1=D0=CF=CE=CF=D0=D1=D2=D4=D7=DA=DC=DF=E1=E4=ED=F9ymifb^ZVSSRRSVXX= +WXXY^es=F5=EB=E3=DF=DB=D7=D3=CF=CE=CD=CC=CC=CE=D1=D5=D9=DF=EErd\ZWUSRRSUX= +[]^_`dem=FE=F5=F3=EE=EA=E6=DF=DD=DA=DA=D9=D7=D7=D5=D4=D5=D6=D8=DB=DE=E4=EF= +xi`\YVRQQRSV[^`hz=ED=E3=DD=D9=D6=D5=D6=D7=D7=DA=DD=DE=E2=EA=F8vljff_\YVTT= +VXXX[]_cm=F5=E8=DF=DA=D7=D4=D1=CF=CE=CD=CD=CE=CF=D0=D2=D5=D9=DD=E0=E7=F7n= +a[VQONNMMMNORVYcp=FE=F4=EC=E5=DF=DD=DB=D9=D7=D6=D5=D6=D9=DD=E3=EB=F2=FExq= +njhhhkns=FD=F2=F2=EF=EB=EC=EE=EF=F5=FB=FD~yz=FC=F3=EE=E9=E8=E9=EE=FA=7Fri= +fd`_]]\^acfmv=FD=EF=EB=E9=E9=E4=DF=DE=DE=DF=DD=DD=DC=DC=DD=E2=E7=ED=FCsni= +f_^^\\[[ZYY[]_dgmz=FE=F1=E9=E6=DF=DC=D8=D4=D3=D2=D1=D0=CE=CF=CF=D0=D2=D4=D8= +=DE=E2=E9=F7pb[TOLLKJIIJLMORUX\hnw=F6=EB=E1=DA=D7=D2=CF=CE=CC=CA=C9=C9=CA= +=CA=CB=CC=CE=D1=D5=DA=DE=E6=ED|oic[TOMLJJHHHHJKNSY]cl=FD=E6=DD=D7=D2=CE=CB= +=C9=C7=C6=C5=C5=C6=C8=CB=CE=D2=DA=DF=E8=F5qe\UPNLIHFGIKMPU[bjw=F8=ED=E6=DF= +=DC=D8=D1=CF=CE=CD=CE=CE=CE=CF=CF=CF=D0=D3=D6=D8=DC=E4=EExh^XQNMKKLLMOOSX= +\_er=FB=EB=E2=DD=DA=D6=D0=CE=CD=CC=CD=CE=D0=D3=D7=DC=E0=E6=EA=F3sje`]]]\Z= +Z[[]]]^_^^^__dhnw=F4=EA=E2=DD=DB=DA=D7=D5=D4=D4=D5=D5=D7=D9=DA=DE=E3=E5=E6= +=EA=EF=F4=F3=F8~{via^[XURQONNMNQW\ds=F2=E9=E3=DE=DC=D9=D7=D6=D5=D4=D5=D6=D7= +=D8=DB=DD=DE=E1=E2=E0=DF=E0=E2=E3=E5=EB=ED=EE=F7rg^ZWUTUWXY\^biot|=FB}wus= +ngiklo{=F0=E9=E4=DF=DC=D9=D8=D7=D6=D6=D8=D9=DA=DE=E3=EA=F2=FAwojhecbca^]]= +`cbbfiiklko=7F=F0=EB=E3=DF=DE=DD=DC=DB=D9=DA=DB=DD=E5=EF=7Fvmjijkjgc_\[ZX= +XY\`iv=F9=ED=E8=E6=E3=E0=DF=DE=DE=DC=DB=DB=DB=DC=DC=DA=D9=D9=D8=D7=D8=DC=DF= +=E5=F0zl_ZXTQPONKLLLNOSW\cm=FA=E8=DE=D9=D7=D3=D0=CE=CD=CD=CD=CC=CB=CA=CA=C9= +=CB=CC=CE=D3=D9=DF=EDnaYQMKHGEDDEFGILOT[`k=F6=E4=D9=D2=CC=C9=C7=C5=C4=C3=C2= +=C2=C3=C4=C7=CB=CE=D6=DF=F0n`ZUONLJJJIIJKKLMOQU[`k=F5=E0=D8=D1=CD=CB=C9=C8= +=C7=C7=C9=CB=CD=D2=D8=DF=EC=F3=FBqkgb]ZWVUSTUVZ]`hmy=F7=EA=E4=DE=DE=DE=E1= +=E4=E6=E4=E1=E0=DF=E2=E5=EA=ED=F6vnieecdgikliea`_`dfity|}{=FD=F4=EB=E7=E3= +=DE=DB=D9=D6=D5=D5=D5=D6=D8=D9=DC=DE=E0=E9=F4=FEsd][VQONMMNORUZ`jy=EF=E7=E2= +=DE=DC=DA=D9=D8=D8=D7=D4=D3=D1=CF=D0=CF=D0=D3=D6=DA=DF=EB~m_ZVOMKJJJLNPU\= +m=F6=E7=DD=D9=D7=D7=D8=DA=DC=E0=E4=E6=ED=EF=F1=FA|sw{=FA=EF=EA=E4=E0=DF=DE= +=DF=E2=E1=E1=E4=E6=E7=EA=EE=F9zpjhc_]\ZZ[[\\]\\\]`fkns=FA=EF=EB=E9=E5=E3=DE= +=DB=D7=D5=D4=D3=D0=CF=CF=D1=D4=D8=DD=E0=E3=EA=EE=F3wi^WQNLKJJIIKLOT[f}=E5= +=DC=D6=CF=CD=CB=C9=C9=C9=C9=CA=CC=CD=CE=D1=D5=DB=E2=EDxjhc^XTQNMLLKMMMNPS= +X\bo=EF=DF=D9=D4=CF=CC=CA=C8=C8=C8=C9=CB=CC=CF=D3=D7=DC=E8=FFi^WOLJHHJKNS= +Zam=7F=EE=E7=E1=DE=DC=D9=D8=D9=DB=DE=E2=E3=E1=DF=DF=E0=E3=E8=E9=E9=EC=EF=F2= +=FCzwtvwqplfb_^[YYZ\\[^_cl{=F0=EB=E7=E1=DF=DE=DD=DB=DA=DA=D7=D4=D3=D3=D4=D4= +=D8=DD=E3=EC=FFog\VQMKKKLNPU]n=ED=DE=D7=D3=D0=CE=CD=CE=CE=D0=D2=D5=D8=DB=E4= +=F1vf^YVTUUUVWY[\]`fm|=F9=EF=EB=E7=E2=E1=DF=DF=DD=DA=DA=D8=D6=D4=D3=D6=D8= +=DA=DB=DE=E5=EE|lc]YSONLLKLNRX^hy=F2=E8=DE=DA=D7=D4=D2=CF=CE=CE=CF=D0=D1=D2= +=D3=D3=D3=D7=DB=E4=F0ra[TPNKIHIIJLNSY_l=FE=EC=E4=DB=D5=D1=CF=CD=CD=CD=CC=CD= +=CE=CF=D2=D7=DB=DD=DF=E3=EA=ED=F1=7Fl`[YTPPPQSSWZ]djs|~}wtpmp{=7F=F7=EF=E8= +=E3=E0=DD=DB=D7=D7=D7=D7=D9=DB=DC=DE=E3=EA=F1{mf`___acdflm|=F5=F7=F9{ywpq= +sow~{utxy=FE=F3=EE=EC=E8=E9=E9=EA=ED=EE=F2=F9|umjiknu=FC=F4=EB=E6=E2=E2=EC= +=FAsja][XXY\_cgmy=F8=EB=E0=DC=D5=CF=CE=CC=CB=CB=CC=CD=CF=D5=DC=E8=FEi\UPM= +LKJKLLLNQY_iy=F6=E9=E2=E1=DD=DB=DA=D9=D8=D8=D6=D4=D2=D2=D2=D2=D3=D5=D8=DA= +=DD=E2=EA=F6xldb^[[\[[\\^`b_^]]]]^^^`deintx=FB=EB=E2=DD=D8=D6=D3=CF=CE=CE= +=CD=CD=CD=CD=CE=CF=D4=D8=DB=E0=ECyj`WSOMLJJIJLNPUY]bkw=F0=E5=E0=DD=DC=DB=D9= +=D9=D9=D8=D9=D9=DA=DB=DC=DC=DD=DC=DB=DC=DB=DB=DC=DC=E1=E9=F1=FC~vmha\\ZXU= +TTTSSUX[_cir~=F2=EC=E7=E1=DF=DE=DD=DB=DA=D8=D8=D8=D9=DA=DC=DF=E8=ED=EF=F1= +=F5=F8=F9=F6=F4=F5=FCxnmmjge_``__```aeijhgfhmr}=FB=F4=EE=E6=DE=D9=D4=D1=CE= +=CF=D1=D5=D8=DC=E2=ED=FBvjeb^[XWVWY[`efims{=FE=F9=F4=EC=E4=DF=DD=DC=DD=DE= +=DE=DE=DC=DD=DD=DE=E3=EB=FEnf^ZVROOOOPPSX^j=FD=EA=DE=D7=D1=CE=CC=CA=C8=C7= +=C8=C9=C9=CC=CE=D3=DA=E4=F5n^VOKIHGFFGILPX_jt=FA=EC=E4=DD=DA=D9=D8=D6=D5=D4= +=D3=D3=D4=D4=D3=D5=D8=DB=DD=DD=E1=E8=EE=F4=F5=FCrj_ZXTSRSSRPQSX[]bm=FA=E7= +=DC=D4=CF=CD=CB=C9=C9=CB=CC=CE=D2=D8=DE=E5=FAkd^XSQONMLMMNQW\_f{=EA=E1=DE= +=D8=D5=D3=D0=CE=CD=CC=CD=CF=D7=DE=EA=FBqlke___^_`a`cjllklnnkmot}=F8=F1=EC= +=E9=E8=E7=E3=E1=E7=EA=ED=EF=F2=EE=EA=EB=E9=EE=F6=FAytlgb__`bdhnz=F9=EF=EA= +=E7=E7=EA=EB=EF}xqomllls}=F4=F0=EF=F0=F8=FExtuy=FB=F3=EF=EF=EE=EA=E7=E2=E0= +=DE=DD=DC=DA=DA=DB=E0=E6=ED=FDk`\XURRRRRSUX\aen=FE=EF=E5=DE=DC=DC=DD=DE=DE= +=DE=DE=E0=DE=DD=DD=DC=DB=DE=E2=E5=E9=EE=F9zrmnorpolgjilomlnnnuuw}=FD=FF=F9= +=F5=FB=FB}tmhc_acegihimnu=FD=F5=EB=E4=DF=DA=D7=D4=D1=D1=D2=D4=D6=D9=DC=DE= +=E2=E8=F4sg^YXVWWY[_dddc`adglprxz=7F=FF}|=FE=F8=EF=E8=E3=E0=DF=DE=DB=D9=DA= +=DA=DA=D9=DB=DE=E3=E8=EB=EF=F8}}yqnf_]XVTSTVXY[_bdkz=F2=E7=DF=DA=D8=D8=D9= +=DB=DC=DE=DF=E0=E1=E4=E5=E2=E2=E1=E2=E3=E1=DE=DD=DE=E3=E9=F8re]ZVQONNOPSW= +Z^beilpw=FC=F1=EC=E5=E2=DF=E0=DF=DC=D9=D4=D1=D0=CF=CD=CC=CC=CE=D0=D5=DA=DE= +=E2=E5=EFwh^ZUOMKKJJJKNPSY]afp=FF=F4=EC=E2=DD=D9=D3=CF=CD=CD=CD=CC=CB=CC=CD= +=CD=CF=D3=D7=DC=E3=F7m_XQNLKKKJKKKLNSXao=F1=E3=D8=CF=CC=C8=C7=C6=C6=C7=C8= +=C9=CA=CB=CD=CE=D0=D6=DE=E8t_WMIECA@@@@ACFJOYg=F4=DD=D3=CC=C8=C3=BF=BE=BD= +=BC=BC=BD=BF=C2=C6=CA=D2=DD=EAw_WPLHECA@@@ABEGILQZi=F3=E1=D8=D0=CC=C9=C7=C5= +=C4=C3=C3=C4=C4=C6=C9=CD=D3=D9=DF=EA=FEmd_[VRPONMNNOQTXZ^dp=F8=EC=E5=DF=DE= +=DC=DC=DC=DC=DD=DD=DF=E0=E4=E9=F9rjdca`]\]^^bfkv=F3=EA=E1=DA=D6=D1=CF=CF=CE= +=CE=CF=CF=D0=D3=D9=E4=F3sf\VQOMLLNNPSWXY[]`gn=FE=EF=E4=DB=D7=D4=D2=D2=D3=D5= +=D7=D6=D7=D8=D8=D8=D7=D7=DB=DC=E0=EA=F2=F9wjc^ZWUSSTUUUXYZ\]afjs=FE=EE=E7= +=E2=DE=DC=D9=D7=D4=D3=D4=D4=D3=D4=D5=D7=D9=DE=EA=FDl_YUTUVX\_hnt{=FA=F9=FA= +=F6=FFy{spoolpopy=FC=EE=EB=E4=DE=DA=D8=D9=D8=DB=DD=DE=E0=E9=ED=F2zmliedba= +`_^\\YWY[_ho=FB=EA=E0=DC=DE=DE=DD=DD=DF=E3=E6=E8=EA=ED=EF=F4=FA}rmhba__bc= +ffhlu=F4=E8=E0=DA=D4=D2=D1=CF=CE=CF=CF=D1=D4=D7=DC=E4=EFte^XSOMKHGFEFGILN= +U^m=F0=E1=D6=CF=CC=C9=C8=C7=C4=C3=C3=C3=C5=C7=CB=CF=D5=DE=EDxg]WQQONMLLMN= +OSY`hu=ED=E6=E1=DE=DD=DB=DB=DB=DB=DD=DF=E3=E4=E8=ED=F6vkd_\[]__gox~=FA=F1= +=EC=E8=E5=E2=DD=DB=DD=DE=DF=E2=E9=EA=EC=F4=FA=F6=F6=F6=FFvokihhe^]^^_bilp= +y=FD=F9=F0=F3=F4=EE=EA=E7=E7=E9=EC=EF=F4=F3=EF=F2=F3=F6=FC=FF=FF=F4=EE=ED= +=EA=EA=E7=E3=E4=E2=E0=DF=E2=EDzjc^[XVTVXZ\]_gjpy}=FA=F1=EC=E8=E5=E2=E3=E4= +=E2=E2=E3=E4=E3=E2=E5=E7=EA=EA=EC=EE=EE=EE=ED=EE=EC=EA=E7=E4=E2=E0=E2=E1=E3= +=E7=EA=F7xokjheb^ZURPOMMMNOQTZ`k=FD=ED=E1=DD=D8=D2=CF=CE=CE=CD=CD=CD=CD=CD= +=CD=CD=CE=CE=CF=D5=DA=E1=F1o_YVRNMLMMMNOQTY_hpu=FF=F6=F4=ED=EA=E4=DD=D9=D5= +=D2=D0=CF=CE=CF=D2=D5=DB=DF=EB=FB|qhdd_^[XUSQPRSW]dos=FA=EF=E7=DE=DC=DB=DA= +=DB=DB=DE=E3=E7=EA=E7=E9=E7=E7=E7=E4=E3=DF=DD=DD=DE=E0=E3=E8=EA=ED=EC=E9=EC= +=EF=F2=FFl]XTNKIGFEFHLOW_q=E7=DA=D3=CE=CC=CA=C9=C8=C7=C6=C6=C8=CA=CD=D2=D8= +=DC=E0=E7=EE=FBoe^YWSQOOONNMLMORW\_k|=F1=E3=DC=D6=D1=CE=CC=CB=C9=C9=C9=CB= +=CD=CE=D1=D9=E2=EEuf]WSOMLLLKLMNNQW]ep=FA=EF=E6=DD=D8=D3=CE=CD=CC=CA=CA=C8= +=C8=C8=C8=C9=CB=CD=D1=D8=E3=FEdXPMJHGEEEEFHJKPW^n=F5=E7=DD=D7=D1=CE=CB=CB= +=CA=C9=CA=CB=CC=CE=CF=D1=D5=D7=DB=E3=EB=F9tj_[YXVUTSSSTWY\_dfgilowy=F8=EA= +=E2=DD=DB=D9=D8=D7=D4=D3=D2=D2=D2=D4=D6=DA=DC=E0=F1vf]XTSRPNNNORUW[^bjko=FF= +=EF=E9=DF=D8=D1=CE=CB=C9=C7=C7=C6=C5=C5=C6=C8=CA=CE=D7=E4pZOKGDBBBBAEIIIL= +NPYn=DF=D3=D0=D7=DD=D9=D1=CF=CE=CC=C8=C3=C0=C2=C6=CC=CE=CD=CF=D3=D9=DE=DE= +=E3=FAaVNLJHHGGGHHIJMR\jy=ED=DE=DA=D6=D0=CF=CE=CD=CC=CB=CC=CD=CE=D3=DB=E5= +=E9=EA=EE=FEj_^^^[\\c=FDn\SU\b^SVes=EE=F3u|=E9=D7=D3=D4=DB=E5=DA=D1=CE=CE= +=D4=D8=DA=D6=D4=DA=E3=F9=FC=EA=E9=FC_UOSVOKEBGKHDELVbl=FD=DD=D4=D1=CF=CB=C5= +=C0=BF=C1=C6=C7=C7=C8=C9=CD=D3=D0=D5=DF=EFo\ROOMMKIJHC?AEHMTe=F2=ED=E3=DB= +=D1=CF=D5=D2=CA=C5=C2=C3=C7=CA=CC=CE=D8=E3=EB=E2=D8=D8=F3YSYYRF?LyWNK=3DCh=D2= +=CB=7FWQd=CF=E9n=D9=CC=C2=C8=DA=DC=CE=C8=CE=DD=DF=D4=C6=C9=EDXVmvXKGO[YXP= +NVc|nUKS=F2=E3lX[t=DB=D2=DC=E3=E8=DA=CA=C4=C6=CD=CF=CD=CD=CF=E3x~=FBjVMM`= +oWE?M=F5=DB=FCSTa=E1=D3=E4^Q]=DF=CD=CF=F2^j=DC=CD=CF=EA_^}=DB=DA|\o=D9=D1= +=D9{h=EC=D7=DAmWWn=D8=DD_KJ[=F7=FCVNY^efjq=EF=ECl=E8=D5=CF=E0X=EF=C3=B9=C3= +M?Y=C0=B9=C9dX=FB=EFdI?GReoijWMST[|=EE=D9=CB=C5=CFv]]=EE=E0=F5ci=D9=D2=E7= +l_l=E4=DF=E0=D6=CC=C9=DC=FF=F6=D7=CE=EDZV=DB=D1U??=FB=DAH89?Lo=E5=E8=DB=E6[D;8;= +?H[m=E0=DA=DB=D9=DA=D8=CF=C2=BC=BE=C7=CB=D7=CF=C4=C6=D2=F8^m=E8=EBUFJX^XK= +EKTVOKO_=EA=DF=EF=E1=CE=CA=CC=D6=DC=CE=CB=D4=E4=E8=CD=CB=CF=DE\=E1cG=DC=CD= +=BA=CA1()O=BA=BE=D1=DA=C6=C1U/+2K=CA=BF=BF=C0=C3=CFeGJ=FB=C9=BA=B9=B9=BA=C3= +=DARB?HQd=F9=E3=E0s^]ZSSu=CF=C8=CD=F9Uc=FA~WQ^=FE=E2mOLVefa^k=F8=F6m\b=F8= +=DF=DB=DB=D8=CD=CA=CF=DD=E9=D7=D4=DF=E7=DE=CF=D6=D7=EFIs=D3=CA=C1Q7.:=D7= +=C7=C4=CD=D7=C8=D0D0.7S=D2=C4=C5=CB=CE=E7VINg=CA=BD=BC=BC=C2=CC=E8UIEKYv=EA= +=E7=E5=E5xYR^=EC=DA=D7=E0=E5=E6=FB_VZbp=F9=F9{ja^dw=F7=F7=F9=F5=F1=F1sd`f= +=FF=E8=DD=DA=DB=D8=DE=EE=FE=7F=E0=E0=F9j=FD=DAnR=F8=DE=CD=CBd?8Ab=D5=BC=BD= +=C6=C6=CEkC;8=3DY=D0=C7=C8=CF=F1]ZVUj=E2=D4=CA=C8=CF=EFXLFHLOZk=EB=D7=CE=CF= +=D6=D9=D6=D1=D0=D0=D2=D1=D1=D4=DA=E2=EF|il~xl_VQOOMKKKLNOOQYd=FE=E0=D8=D5= +=D0=CF=D0=CE=CC=CD=CD=CD=CE=CE=CE=D2=E4=EB=DD=E3=E7=E9dNNUU]t_T\[S[d[[a[T= +WXT\|=EB=DC=D4=D0=CE=C9=C6=C7=C7=CA=CF=D6=DC=EEgYQMLJLOU^p=EE=E1=D8=D3=D4= +=D0=CF=D7=DF=E6=F3zqcYVWVWZ[]ba[[[\^cnz=EF=E6=DE=DB=D8=D1=CE=CC=CB=C9=C9=CA= +=CB=D0=E2=E0=D9=E4=FCnTGINMXt`W^ZP\k^cn[QSON[s=F7=DE=D3=D1=CE=C8=C7=C7=C5= +=C7=CA=CE=D5=E8m^PLLLMRZb=FC=E3=D8=D2=CF=CF=CF=D1=D7=DF=F6hZTPOONOSX\_cdg= +jmop~=F6=EA=DE=D8=D4=D3=D1=D2=D3=CD=C8=C6=C7=C9=CF=DA=E8=ED=EA=F4fUJ@>AEK= +YYSUWVb=EE=E6=E0=E0=F7hjoy=E3=D5=D1=CD=C9=C7=C6=C5=C6=C8=CA=CC=D4=E0{ZKEA= +@@ACFNXf=FB=E0=D4=CD=CB=CD=CE=CF=D5=D9=DF=E7=EA=EA=F2slko=FF=F1=EF=EC=EF|= +rg^YZ\^a``cchx=ED=E4=DD=DD=EAm{=DD=DE=E9=E5=F6XT\[v=D1=CF=DC=D8=DB=F5=E2=D3= +=D4=D1=D2=EAaYOLQY]krlo|=F9=EC=E8=EE=F5ze]ULIJLPZe=F1=D8=CD=CA=C7=C2=BF=BD= +=BC=BE=C1=C8=CF=DA=EBk^WNJEA@@ACEEFHILQXh=EA=DB=D4=CD=C8=C3=C1=BF=BD=BC=BD= +=BF=C1=CA=CC=C8=CD=E1vXD?A?CQRLNJEKW]y=E4=EEtlac=F9=E2=D9=CF=CC=CA=C9=C9=CA= +=CB=CE=CF=D2=DB=EAnUJGFFHJMVeiq=D7=CB=CB=CC=CD=C9=C5=C7=CF=D9=D7=D6=E1za[= +SOPSUTOLJGFEEJU^\]{=D8=CB=C4=C1=BE=BC=BC=BD=C5=CD=C7=C1=C3=C9=D5_HC>?Mh=FC= +=ECyRF@=3D=3DBISh=EB=E1=DC=DC=D9=D7=CF=C9=C4=C0=BF=C2=C9=D4=EBfXNHFKR^q=FE=F5= +=E4=DD=E0=E1=DD=DC=DC=D9=DC=E7=ED=F8qmnp|=F2=EC=FAma[^_\YVUVWYc=FE=E5=E0=E0= +=DC=DA=D6=D3=D2=D6=DC=ED=FA=ECcV=F1=DB=D7=D7=F6LBCEU=D0=C0=BE=BF=CBsOHDIU= +g=E6=D4=D1=D7=E3ueg=FC=E0=D4=CF=D5=E4mXNMLGEIV=F1=DB=D6=D5=D3=CD=CA=CB=CC= +=CD=D3=D9=DD=E4=EC=EF=FEkifekj`[[]abYONPTUV^ovmjy=E2=D9=D2=CF=D0=CC=CC=D2= +=E1c]=D8=C8=C6=CA=DCUFBCU=CF=BF=BD=C2=D0eJB>>FS=EF=D2=CE=D6=F6\TVb=E9=D7=D1= +=D1=DDv[NJLNLQm=E1=D3=CE=CF=CD=C9=C7=C8=C8=CB=CF=DA=DF=DE=DF=E5{_USWZYSNK= +MPRQONR[ct=E8=E2=DD=D7=D5=D1=CD=C6=C3=C5=C8=CD=D8=E1=E5rS[=DE=D4=D9=F2QD@= +?>K=EE=CF=CA=CD=E1aPGDIV~=DA=CF=CD=CD=D0=D9=E4=EB=DF=D4=CE=CD=CE=D9=F5\OL= +KIINWbw=F6=DF=D6=D0=CE=CE=CE=CF=D2=D7=DA=DA=DA=DE=E8{_\]__\XSRQOOQSX[_dek= +=FB=E1=DA=DB=E4=F6=E4=D1=CB=CB=D1=D9=DD=DE=DD=DE=E2=E4=D2=C8=C9=D4|RMSVZe= +rlfaXNJFEINVbt=7F=FA=EA=DF=DA=D3=CE=CA=C9=C9=CC=CF=D8=E4z__jjlgcdgl=FD=E6= +=DD=DC=DE=DA=D9=D6=D9=E2=EA=EB=ECp_\\^ZVUUVUQMNS[gk_]t=E4=DA=DA=DF=D9=CE=CD= +=CF=CF=D0=D0=CE=D0=D5=D7=DD=E8=E9=E4=ED=F2=FAupdbc^ZSPOONNQTTY`a`ch`^n=EF= +=DB=D3=D5=D2=CF=CD=CD=CF=CD=CC=CD=CE=CF=CF=D1=D7=E6wc\^`]WOPW\WQOU`a_oncb= +fw=EF=ED|o=E9=DE=DE=DA=DB=DD=DF=E6=E0=DA=D4=D7=E5=F1=F7=F2=F7ukchot=F3ua[= +_glm]^x=F8=F9ogz=FE|mv=EB=E4=E5=ED=EC=EC=F6=F1=E0=DB=DD=E0=E5=DE=D9=E3=F3= +~|oga_d[[^\WRWX\`[r=E5=EC=F9=ED=D6=CC=CE=DB=D9=CF=CD=D2=DB=DC=D9=D9=E3yhh= +ha^^Z]ZUUSX^beaaimomn=FA=E1=E4=EB=E7=E0=DE=E7=F4=FD=F6=E9=DD=DC=DD=DA=DA=D9= +=D6=DA=EC=F7~~sfd]XVX\[WUZv}z=EE=E8=E7=E1=DC=DB=DC=DC=DC=DD=DD=DE=EC~|}wh= +fefmy|igv|rligehgkyyoo=FD=F4|q=FC=E7=DF=E3=E8=DE=DC=DF=E8=E8=DF=DE=DE=E5=EE= +=ED}pj`]XY__ZUV\bip=F6=EA=EA=EA=EA=E8=DF=DC=DA=DA=D7=D7=DC=DD=DE=E0=DF=E9= +=EF=FA|sg_^_[Y[\adagkomgfx=FD=F9=F9~=ED=E3=E7=E8=E9=E6=E0=EA=F5=ED=E6=E5=E7= +=EC=E7=E4=DE=DF=EB=E2=DE=E4=E8=F8yuf_[WWXX[ZY\\ail{=F0=E2=DE=DE=E0=E4=E1=D9= +=DD=EC=E7=DE=D8=DA=E8=F1=7Fulhjmh_[Y^c_ehl=F9=EF=EA=E0=DF=DF=DC=DA=D7=D6=D8= +=DB=E3=E1=DE=DF=EC|sp}=FFe]YX\[VQOPPPUYX_n|=F6=E4=DB=D8=D2=D1=D0=D0=CF=CF= +=CF=D1=D5=DA=DC=E2=E9=F1=F9{xvfoyli^\[\]`aZ\^i}=FCyx=F8=ED=F2yngcejn|z~=EA= +=DC=D8=D9=DA=D8=DB=E0=E7=EF=F8=F3=F5wtkghnod_jr=F4=FDjz=F0=EF=F5=FC=F1=F5= +=F9=F6=FD=EC=E9=F9=FE=F1=EB=F1=EF=EA=F3=F3=EF=EE=F2necca^]`i~{lmx=EF=F2pj= +l{=F6~=F1=F1=EA=E1=E7=E3=E0=E6=EC=EC=E3=E3=E9=E5=EF=F4zpslkejoilt~=FFlccj= +nl^^jmfdj=FE=FCz=F4=E8=DD=DB=DA=D6=D5=CF=CE=CE=CE=CF=D3=DC=E4=EFxq\VXVVQM= +NRTTSVY\__mnq=F6=EA=E4=DF=DC=D5=D7=D7=D4=D8=D1=CD=D7=DF=DB=D6=D7=DC=F1l=D9= +=CDdEGl=D3=E9RKOb\LJLNW=EF=D9=DC=ED=FE=DF=CE=CC=CF=DB=DB=D2=D6=E2=EC=F0=E5= +=E8=FDy=EC=EB_PW=FB=FEWPh=E5`Qfw_QT=FA=D9=E9g=E5=CF=D5=EBl=E8=D0=DA=F9=FA= +=EC=FA=F0=D4=D9w]V^w=EF=EDxa\t=EF=E3=DA=ECk|=FDtm~k\ece=ED=DA=E1eU]=E3=CF= +=D3=F7QQw=D9=E5gVLY=D4=CA=DB^N_=CC=C4=D6ia=ED=D0=CA=D0=E4k_og][bfOJV=F1=DF= +hNOa=E3=D6=E3`Yg=D8=CE=E6=E5=D1=D8e_=D0=C9=D8{U\=DF=D9=DB=F2\PT=ED=CD=D2u= +UPi=D4=D8eFD]}ah=E8{U\=DD=CC=D1=FAx=DD=DCn=FD=CA=CCZJ[=CF=CC_EMp=D6=D9vll= +=EA=D6=EEg=F3=E7=EF]d=D9=CD=D5eOv=CB=D2jV^=E6=D6=DEZISi~{cOHO=F1=DBfIEo=CB= +=D4cZ=E6=CE=CD=D1=D1=CE=CC=CE=D5=D1=CD=CC=CF=EBt=FC=ED=EArNGHNZOHIJMV_ecp= +{=ED=D2=CE=DD=E8=D7=CE=D0=D5=D9=D5=D9=E4=DD=D6=DC=F8gn=EF=DC=DF]LNd=F3dME= +Ml=7FYO_=F3=E2=DF=DF=D3=D0=DB=DE=DA=D2=D1=D6=DF=F4=E6=D4=D4=E4]P^=DE=DAU@= +DZ=F1_NVzkLIh=D1=D5=F2=EA=CF=C9=CF=D7=D2=D0=DB=E8=D9=D0=DD]Sd=F5mYVa=ED=DB= +=E5`T_=DF=D8lNU|mLBIX\Zu=D6=CE=D2=D3=CC=C6=C5=C9=CC=CF=D7=DE=DA=D7=FEOJPQ= +KJQjrNCZ=C8=C9ZFU=F8XFU=D0=C1=C2=C3=BB=BA=C9=ED=EA=E6XCEYnZY=7F=DF=DE=D5=C9= +=CA=D9=E8=E2=E9WA<<<76FC>=3D at V= +=DA=D5=F2=E6=C9=C0=C6=CC=C9=BE=BC=C4=DE=E2=D0=CE=E5l=7F=D7=D0=E4]Zs=F9ZGB= +HNH at APu=FCXIh=BD=BFWK=D4=C7=FCAD=D4=B3=B4=CE=CC=B4=B7r<=3DJPHE[=CF=C5=D4=E9= +=D4=CB=D3=F1kjbdXE=3D at C??BO=EB=D8{=EA=C5=BE=C6=CD=C5=BD=BD=C7=D3=CD=C9=D7ml= +=E2=DDx[^qaOMOND>AGECH[=DF=EDIG=C7=BA=DES=D5=C8=D4]R=D9=B6=B4=C5=C2=B1=B6= +=E7GISMDFp=CE=D5~=EB=D2=DD\RZeUDDMF::@FEKj=D0=C8=CD=CC=BF=BC=C1=C5=BD=BB= +=BF=C9=CB=C9=CF=FF^~=E7dRV\OB?HLE>?FJHIW=ED=DB=D7=CC=DD=D2=B7=BA=CC=C5=C1= +=CF=EA~=F5=D1=BF=C5=CD=BF=C0pGC at 95:ENLS=F1=D8=DC=EB=DB=CD=CF=DC=E6=E1=DC= +rLL\\NS=E3=CC=CA=D2=CE=C2=BF=CA=D3=CD=CB=D6=EFmcXLKQRMOZ^VLKYcOMZb][s=DF=D4= +=CD=CB=CB=C9=E0=CE=BA=C6=DA=CD=DCeVV\=EC=D7=E1=D2=C7=DELGG>:;GZ]c=D5=C6=C7= +=CB=C8=C1=C0=C7=CD=CF=DAoZOC>ADEJ\=DF=D6=DC=D3=CB=CC=D8=E4=DE=DEw^h=FDg_s= +=E6=DF=DF=DF=E2=E7=ECh]qqWU]TVggh=FB=DF=D6=D7bP=C4=C3d=E2=E4YQNNf=D2=CF=CD= +=BE=BF=DEniNC at GW_]=E7=CA=CE=CD=C7=C5=C4=C7=CA=CD=DB`LI?66;=3D?DDKdcj=D8=CF=CE=C8=C6=C6=C6=CC=D9=EB[GBEDAL^=E7=CE=CD=C8=C1=C3= +=C8=C9=CC=D5=DF=FD]SNJJLNWZ^vo]Yd=F0=F9hm=F4=E6=FCp=EA=D8=CC=CA=DBe=E1=B7= +=CDQ=C6=D5KPSOZ=FD=E9=CF=C5=CD=DB=E8jNHADJII]=F4y=DC=CE=CB=C6=C4=C3=C3=CB= +=DDnYI>9:=3D>FV=F2=CD=C6=C3=BE=BC=BD=C0=C5=CA=D4=E9n[YRRY^ewm|=F1o^[]_TNNM= +OOP^=F2=D6=E4O=CC=BB=EB=CD=C5o=FA=E3_y=D6=D9=CE=C0=C6=CB=CE=E5k\LGLJFMWVh= +=E5=DB=CE=C9=C8=C5=C9=D4=F4WKD;69<>EW=F0=CF=C6=C2=BE=BC=BE=C1=C3=C8=CF=D5= +=E9=FD=FFe]ky=FD=EF=EC=ED=F2mWUYOGFFHFHSf=F6_{=BC=C3=DA=BE=C4=E1=D8=EEm=D9= +=DE=FF=CF=C5=D0=D8=D9=E8lUJMMDDNQO_=EB=DA=CF=CD=C8=C1=C6=CE=D2=DF\LFB=3D;=3DC= +LRh=D7=C7=BF=BE=BE=BB=BB=BF=C7=CD=D9=EBdVQLNOPW_glh[[]VTOQQNOR\h~=E4=D8=CD= +=C9=C7=C7=C5=C4=C8=CC=D0=D4=D8=DB=E3=E5=DF=DF=E3=F5ug^WQPNNNMMNOOOQRUZ^g{= +=EF=E7=DC=D6=D2=CF=CD=CC=CC=CD=CF=D0=D5=DD=DF=DF=EC=F4=F3=F4=F6=FEtzyuxyo= +kh][YWUVVWYYZ\]\`ho{=F8=ED=E7=E7=E6=E0=DD=DB=D7=D3=D0=CE=CD=CB=CA=CC=CE=D3= +=D7=DD=E8=7Fi_YVSRPOOQTUUX\[^`bfiku=EF=E6=DE=D9=D7=D8=D9=D9=DD=DE=E2=EB=EA= +=EA=EE=F1=F0=EF=EE=F5=FC=FB=F9}xvkiihlihotux=F4=F0=F7=F9=FF=FB~rqvsptztq=FF= +=FD~=F8=F0=ED=ED=ED=EB=ED=F4=F5=FFrqos{=FE=F9=F1=EC=E6=E3=DE=DC=DC=DE=E1=E2= +=EB|okd_`OW=C7h46>HEIg=D4= +=D3=E2=D8=C8=C7=D3=EE=EA=EA[HGLQW]f=FC=D1=CA=CB=C8=C4=C4=C1=C8=D9=E7=EAo^= +TY`[STZ_ZS[`daRO\XLO=E2=D1=F0=F6=DA=D0=CB=D2=CB=BB=C8]=C3=BA=C7=CEL:DL at J= +=CA=BC=C4=C7=CDdC:228=3DP=D8=CA=C8=C2=C5=C9=CF=DE=DE=DA=D6=D5=D2=D1=D7=E6=FE= +m^RO]pXU=ED=CF=CC=CD=CF=D3=CE=DDZLPNEBKe=F1pi=E6=E0oVU\c][q=DC=D9=E1=DF=D2= +=CE=CD=CB=CD=CF=D8=D5=D7=D7=CD=C9=EFAl=BE=CFOC;35F= +}=CE=BF=B9=B8=BA=C4=DEe]_f=F1=DC=D1=D2=E0`LC>=3D?GHJk=CF=CA=CD=CD=C7=C3=CCz= +j=DD=D8=E1=EE=E4=CF=C9=D0=DF=DF=EB[MNMMVdf_ZUVRLIU=E7=DCvr=E5=D7=CC=CC=C8= +=D3U=CB=B5=B9=D5O>C^OL=C6=AF=B5=C9z?5314E=D8=BF=BB=C1=D7wXKGNn=CE=BF=BD=C2= +=CB=DD`LA=3DBUm^k=D0=C4=C5=D7=FD=DA=C8=D2XP=F5=CC=CC=F9Z}=D6=DDdTVgkSLUq=EC= +=E8kW[ZVX]Xk=CD=C4=CF=7Fr=D9=C7=C2=D1PA=E0=BC=C7ZBBOuOG=CF=B4=B8=CF]D>A>>= +S=CE=BE=BC=C2=D5=F9la[f=E3=CD=C5=C6=D1=FBWJB>=3DDONL`=DB=D9=E3t=FC=D0=CD=F3= +[=EE=CF=C9=CC=D7=DD=D6=D1=D7=D9=D9=DA=DB=E2=FCignxw^UNGELTVZ=FD=D5=D6qNW=E2= +=D1=CF=EANK=CC=BB=C4yHKw=D9_S=C7=B5=B7=C6pIBFADW=DD=C7=C5=D2hPMLMTh=DB=CD= +=D1=E3y^PIIKMW=FE=DC=D1=CB=CA=CC=CB=C7=CB=D6=DA=DC=D2=C9=C9=DFX`=E9=E0oON= +TWKBFOUPMOTVUU]q=E8=CE=C4=C5=CF=D9=D0=C9=C0=C2=CE=D6r=EF=BE=BA=CFD=3DP=EDm>= +=3D=DE=BD=C5W=3D<@A:=3DM=DE=C7=C7=D4=E6=E2=DD=E6=ED=DD=CD=C1=BC=BF=C8=D7=EFxYG= +AL_wwfy=DA=DDbT_=E7=DEvey=E6=EAlb|=D5=D6fS_=EF=EEdYl=D8=DC_Sc=EE=FC][=E9=D3= +=EB[x=CF=C8=CF=ECkV=EC=C4=CC[FT=EC=E9TD=F4=B9=BB=E6R=F5=E8P<9M=D8=CF=EA=FC= +=DB=D2=E7QHU=F5=DC=DB=D6=CF=D1=DFt^JCNcl`n=DC=C9=C8=E2o=E2=D0=CE=D8=E2=E3= +=D6=D4=DF=E0=DF=E9~nd`[OKSb[QTanZJKf=EEnRT=F0=D4=CE=CE=C8=D7^=CD=BA=C3WK=E6= +=C8=D0HF=C3=AF=BD_i=CF=E5 at 2:]=FAOO=E8=D3=FBGF\=FC][=DA=C6=CB=F8b=E7=E1Q@= +M=EF=FAY]=DD=C6=C9=E9=E6=C6=C3=D4=E5=D9=CD=D4}x=DA=D3=EEaik^RMOUNLT[YSX_`= +_j=F3=F0=EF=E7=DD=CD=C3=C3=D3g=DB=BE=C9XMk=DB=F7GF=DF=C2=D0b=E7=D0sDL=D9lVv=CE=E7O=FAkZ=FEmU=F1=C9=FCP~=F1mu=EF=DF=DF=D0=DF= +=EF=DD=E6z=EF=F9=EE=EE=EF=ED}nj^X\[\bedgnuor=F3=F3=EC=E4=E9=EC=ED=EB=E8=E8= +=E9=F9=EC=EE=ED=EAz=FA~=EA=E3=EC=DF=DD=E2=E5=E0=ED=F5=E9nodZcXX\TZUO[ZY^i= +=F9=EF=F2=EA=DD=D7=DE=DD=DC=DC=D3=DB=DA=D3=DA=D9=DA=E5=DE=DC=F0=E9=E6qefk= +b]\]beZS[\W[Ye=EB=E6=FB=FD=FBfwlw=E1=ED=E3=D7=D4=D7=E4=E1=D6=D5=E3=DC=DB=E1= +=E1o=FE=FFn_V\b[PSXWUOVZYrun=E9=D6=D5=DB=DD=D9=D0=D5=DA=D9=DA=D9=E0=F3=E9= +=EC~=FB=E8=ED=E8=EB=F9=F8opmmecheZSUYUW^dhcl=F3=EE=F5=E8=D8=D5=EEm=EF=DE=E9= +oo=E8=E0=F0=FE=7F=EF=E5=DC=F3s=EC=DF=E9x=EB=DC=DE=F0=FC=EFtZ_=E2=D7=E8[Y=F4= +yUN]=F0gVb=F2i[\]r=F1wd=EB=D3=E8a=EB=CC=D3jz=D2=CF=E3=EB=D7=D4=F7l=DF=D9=EF= +p=E1=D1=D7kYh=F9YKO`bRMRRMLPX\oog`=F8=D9=D7=D8=D1=CB=C9=CA=CF=D4=D1=C8=C3= +=D3s=D0=BE=D2MLSe=DD_IV=E4M:X=DFI@=E1=CA`Z=EF=DF=E5[O\=E5qHS=D8=D6k=F4=CB= +=C6=D6=ED=E2=DA=CE=CF=DB=F4=DE=CC=D0oKLtwQI\=DE=E7x=F6=DF=ECkz=FCzq=E9=D5= +=E8dnyk=E8=D4=DErhPEOan=EDOK=C9=BAm9G=D7=EEC>=E8=B4=B6=DA=D4=B4=B8V8D=F2\= +B\=C0=BE=DDc=EA=E1UER=D4=CD=EBo=DF=E6[KEGMJEKf=FAv|=E9=D4=C9=CC=D6=D8=CD=CD= +=DF=EB=D6=CD=D6=EC=DB=CD=D8pb=F0=DChMMk=DCnHKanJEWN}=BC=C7[N=E7=E1H?H=D9=B3= +=B5=CA=C8=BD=D2<0;IO\=DE=C0=BE=CEg\oaW=EA=CA=C2=C6=C9=CE=FCPEBHE at Gl=E5q=FD= +=D9=CE=CC=CE=D5=D8=D6=D2=D3=D5=D7=D6=D8=DEq]as]PP\PHK[v`MO`k_hXU=C3=B7=D1= +M=E6=C6=F3BE=E5=B2=AE=C6=D8=BD=C6A/8JKKl=CC=C6=DDQMYZO^=CE=C1=C4=CB=CF=D2= +=DEYBAT~]Sm=CE=C9=DEZx=CA=CBm^=DD=CD=DF_f=E3=DAjSgyWLQi`MNf=E1=E6]Vkp`h=EB= +=E9[=D3=B8=BDkT=DC=D8K=3DJ=C5=AF=BD=EC=CE=C2f62BYh=F4=CE=C0=C7uO[m_e=DB=C6=C1= +=CB=DB=F3dMBCDCOnv\^=E8=DA=E8iu=D5=CB=DA=FF=DD=CA=CD=E0=EE=D5=CD=DAo`}=F6= +aZe{lRP_m`NOd=7F^W=E0=E5c=CD=C3=DC\d^FG^=D7=B6=B2=C3=CC=C7=F9;3?W=ED=D3=CB= +=C0=C2=DCSKW_d=E4=CE=C5=CA=DDeOIC??EOu=F2fh=E9=D5=DFp=DE=CB=C6=D1=F3=DC=CC= +=CE=ECu=D4=CD=E1ll=EFiOO_=F2fQV\_]OLW=FA=FAi=F5=CE=CEk=DD=C5=C7=DAaQQd=ED= +=E5=BF=B5=C0=D9=F7WA9H}=CF=D1=D1=D2=EF[= +KLa=E2=D7=CF=C9=C7=D7eJGLF at L=F2=DDpZj=DB=D8k[=D4=BF=C3=D9=E3=CC=C3=CEm}=CD= +=CA=ECTV=F1=EBUITmYJIOOJNZ[OM^=D7=CF=FA=F0=DD=D9=C0=BD=CDbl=D4=D1=E1i=D7=B6= +=B2=C3n`=F2T=3D:I=E7=DAiWTWMDFT=EC=DA=D6=D0=D1=E4^OSWRO\=DF=D3=E4ir=DA=CF=D6= +=DF=D7=C9=C7=D2=E6=EC=D8=D1=DDzz=E2=EE]SV[XSYnmSMTbh[Ww=D8=DAl^=E6=CF=EB=DE= +=CC=CB=CF=F2[M^ux=CF=C2=C0=C8=DF`I?>CVr=DC=D3=DD=F9fY_n=E0=CF=C6=C2=C5=CB= +=DFbUNNKHNWhaSQ]=FBsm=F5=DD=D2=D8=DE=D8=D3=D2=DA=DC=D8=D3=D8=E6=E6=E6=EA=FC= +g]^feYSRZ\TOOg=E2=F8bj=F1d=E9=C9=C8=CF=F8_d=F2~_=D3=BC=B9=BF=D9fQF?>Ik=DB= +=D7=EFe_XXT^=E7=CE=C9=CF=D6=E8m]NHHM[=FC=F1hf=EC=DE=DE=E0=DF=D4=CC=CA=CC=CC= +=CD=D2=DA=DF=DF=DB=E1=EFphh]XPNNMKJLNLHKX]al=EA=D9=D6=E8r=D4=BF=BB=C3=DAy= +=D8=CA=D0=E6=D5=BD=B7=BD=DCTNKB;>MnrPJJMNLU=F2=CF=CA=C9=CC=D3=D9=E9t`TT_=F1= +=E9=F7=F6=E7=D7=D9=ED|s=F2=EC=F0=FD=E9=DF=E8=EFr|=F0=F4|v=F9=EF=FAmcdddZU= +[a^XZg=FD=F4{=FD=DE=D3=D4=DA=DE=DD=DC=D7=D8=DB=DA=E7=FFieh=FB=E2=DC=D5=D4= +=D9=E8aRMMQ[hjvoe_`el=FB=EA=E2=E3=EA}jc\XVVX^gv=F6=E7=DE=D8=D2=D0=D0=CE=CC= +=CD=CE=CF=CF=D4=D7=DD=EB=F9widc_[WQMKIJJKLMPV\f|=E9=DC=D4=D0=CF=CD=CC=CC=CD= +=CC=CC=CD=CE=D2=D7=DD=E8=F2=FDywrqqh_ZWTRRTWZ^^]]dkknv}yz}=FC=F6=ED=E6=E5= +=E5=E6=E5=E5=E4=E3=DF=DF=DF=DF=DF=DE=DE=DD=DB=DB=DC=DF=E6=E8=EE=FAuke\ZXV= +VVWXZZXXWY^hz=F7=E4=DD=DB=D9=D8=DA=DC=DA=D9=DA=DC=DD=DB=DB=DE=E3=E8=ED=EF= +=F8}uohfhklkmnmhbbggffikkknplifglpz=F4=E9=EA=EA=EC=F0=ED=ED=EB=E8=E3=E1=E2= +=E4=E4=E4=E2=E2=E4=E3=DF=E0=E1=E3=EA=F2}j`^[YXYY[[ZYZ^biv=EE=E6=DF=DB=D7=D5= +=D4=D4=D5=D7=DC=DE=E2=ED=F5~vmfa`achlmlkiihhjmnqusppv|=F7=ED=E9=E5=E6=E7=E5= +=E6=EA=E8=EA=EA=E8=E8=ED=F6xjfghjlpsqkfinor=FC=F2=EB=E1=DF=DF=DE=DD=DC=DF= +=E5=EA=EB=F1=F9yuod^[YXWWXY[]do{=F6=EA=E1=DE=DA=D8=D7=D6=D7=D8=DB=DF=E6=EF= +=F6~vrpxvtmlkiihikmnmklmo{~=FD=FC=F8=F2=F5=7Fy{xvx}=7F=FD=FF=FC=F5=EF=EE=EC= +=EE=EF=EF=F1=F0=FB=FC=F6=F4=EE=EB=EA=EA=EB=ED=EC=EF=F3=F9=FDwojf_\\_cchmo= +ps=FC=F3=EA=E1=DF=DE=DD=DC=DA=DB=DD=DF=E8=F3=FCsg`^ZXWVXXX[^_djn=FE=F3=E8= +=DD=D9=D7=D5=D4=D3=D4=D7=DB=DE=DF=E2=E3=E6=E7=E9=EA=EE=F6xld_\[]^^acbdgil= +spoonmmnopw=FB=F0=F0=F0=EE=ED=EC=EE=F1=F1=EF=F0=F1=EE=EA=EA=E8=E7=E4=DF=E0= +=DE=DD=DD=DD=E1=E5=E8=F3vojd^]]\[ZWXZ[^dn=FE=EF=E9=E7=E7=E9=EA=ED=EF=F0=EE= +=E9=E3=E0=E2=E1=E2=E7=EE=F8=FB=FCypnmkkkmr|=F3=EE=EB=EE=EF=EB=E8=E8=EB=EE= +=FAvka^^^^agmw=FE=F5=F2=ED=E9=E9=E5=E7=EB=ED=EC=EC=EE=F4=F6=FA=FD=FCzxtnj= +fccacgnw=F9=EF=EB=E6=E1=E1=E2=E4=E6=EA=F3=F9=FB}|usuuxuuz}=F9=EF=EA=E7=E6= +=E7=EA=EC=EF=FDyojf`^^____`__`ehmy=F6=EB=E6=E3=DF=DD=DB=DB=DC=DB=DA=DB=DB= +=DB=DB=DE=E2=E5=EF~roojf`][[[\][]^^aelv=FF=F4=EC=E2=DE=DC=DD=DD=DC=DD=DE=DF= +=DF=E3=EC=F8~oiea`__^^`dfinpw=7F=F7=EE=E7=E0=DD=DB=DA=D8=D5=D2=D1=D3=D4=D6= +=DB=E1=F0yj_[URONNOOQTW[^floz=F5=EC=E6=E2=DE=DE=DC=DA=DA=D9=D9=DA=DB=DB=DB= +=DC=DE=DF=E0=E2=E4=E7=EE=FByplhd_]\[\\[_cgijr=FE=F5=F1=EF=EC=EA=EB=EE=EF=F5= +|qmnlkkq=FF=F5=ED=EC=E9=E3=E0=DD=DA=D8=D5=D4=D5=D9=DF=EBrf^YXUUVVVXYYZ\_b= +fkty=F0=E9=E3=DC=DA=D7=D4=D2=D0=CF=D0=D1=D1=D3=D5=D8=DC=E0=EA=F5sf`^\]ZWV= +TRRSSUWXZY[aekw=F8=EB=E3=E0=DD=D9=D8=D5=D3=D1=CF=CF=D0=D3=D5=D7=DA=DE=E3=ED= +=FAvha^[VUUVYZ^hnx=FE=F6=F3=F3=FA~tmmmmpusvwuqons{=FE=FA=F4=EE=E9=E3=E1=DF= +=DC=DC=DB=DB=DA=D9=DC=DE=E0=E1=DF=E3=E6=E8=EC=F9=FEyog_[WTRPNNNNOOPSX^gx=ED= +=E2=DC=D6=D2=CF=CE=CE=CC=CC=CC=CD=CE=D0=D5=D9=DB=DF=E8=EE=EF=FDonieb__\XV= +SPONOOPRUY^dl|=F0=E7=DF=D9=D4=D1=CF=CE=CE=CE=CE=CE=CE=CF=CF=D3=D7=DA=DC=E3= +=EC=FEk]VPMKJJIJJKLNSY_iy=EC=E0=D9=D4=D0=CD=CC=CA=CA=CA=CA=CB=CB=CC=CE=D0= +=D5=D9=DD=E7=F3o_YTOLKKJJJJKMOSX^jz=F2=E3=DC=D8=D5=D3=D0=CE=CC=CB=CA=CA=CC= +=CD=CF=D1=D5=DB=E1=EEyf[TROLJIIJKNQZeu=EE=E4=DD=DA=D8=D6=D7=D8=D8=EB=D9=BF= +uF=DB=E2=CE=CCU=E9=D5x=F8Y=F1=D5VX=E0=D2=DDFd=C7OU>N=CB\=EF[=FA=CCHTUZ=F9= +E=E7=DA=EB=CEi=D0=CD~=D0=DE=CE=CC=E9=D0=E2=D0=DCVwdkfOlz=DDmy=DCl=E9\O`HO= +MNKOkm=E2=EC~=D0=CF=E2=EF=CA=CA=CC=D7=EF=CA=C9=D1\=E9=D3=FCiSw=D9rWW=FF\S= +NJtYGQamOS=E4=E2=D2zf=CF=CA=D9V=DE=CA=CE=D8=EA=D2=C5=D4Uh=CC=F2`S\=D2wKO=DA= +fORW=E7nO_=EF=F8W=FC=D9=FD~g=E1=CF=F3U=F7=CA=D9bm=DC=D1=E7\~=CD=D0mc=DB=D3= +nNY=F7tNHUp[JN~=E7h]=FB=D9=DC=EB=E4=D6=D1=D6=DE=D5=CB=CF=DC=DA=CE=D3=E6~=FF= +=DE=E1l[g~]SVTOIFJKFCNbdY]=E5=D4=DA=DF=D1=C9=C7=CA=CE=CA=C5=CA=D3=D0=CB=CD= +=D7=E9=E5=DE=F1c[cbTLPWPJIPVNJP_aXYu=EF~u=E6=D5=D6=DC=D7=CA=C5=CD=D8=D0=C8= +=C8=D6=DE=D7=D2=DEo_a^QOOOONSZXSTl=FCmjw=ED=E4=F3r=F4=DF=DE=FBp=DE=D0=D9=F3= +=F5=DA=D8=DF=EF=EB=D4=CF=D9=EC=DD=D0=DFgbuoZXYQMLNZ]VZ=ED=DB=EEu=EA=D7=D3= +=DFpfsfQKMU\bu=DD=CD=C7=C4=C1=C1=C1=BF=C3=C9=D2=DF=ECvXJ>?SM at KMIHIJT=F8id= +=D9=C7=CE=E2=DA=D4=CF=D0=DF=E8=DD=D4=DF=F4=ED=DC=D1=CF=D0=CE=C8=C5=CA=D4=DC= +=DFpM><>=3D96:AIJQ=EE=CD=C4=C2=BE=BA=B6=B7=BC=C2=C5=C9=D4wTTVNH at BHJJKOU\_Y= +Tx=D3=D4=D2=D0=D2=CD=C7=C9=CD=C6=C1=C1=C1=C2=CA=D8=E3iVKC?>><<AIR_=F6=DB=CD=C5= +=C0=BE=BD=BE=BE=BF=C4=CB=D0=DD=FF[MFEEBCDIKKVc=FC=DE=F0ik=E6=D9=D7=DB=E9=E2= +=D2=CE=D6=E0=F5=FC=E8=E2=F0megntliu=EB=DB=D4=D1=D1=CD=C9=CE=D9=F1rvnWJGGK= +KIJSi=E6=D9=CF=CC=C7=C2=C2=C5=C9=CE=D9=E9v_WLD?@BB at AEKO`=FB=D9=CF=D3=D5=D1= +=CA=C6=C3=C3=C6=C4=C1=C2=C7=CD=D7=DD=DE=EAlYOJIHFFGKS^hy=EA=E1=E3=EFlckkb= +YTU[bhq=EB=D7=CD=C8=C5=C2=BF=BF=BF=C1=C4=C9=D0=DD=FBaVLD?=3D>?@CGJNa=F0=DD=D9= +=EAz=EB=D7=D2=D4=DB=DB=D3=CD=CE=D6=E2=FFx=FEo^YUW\ej~=EB=DD=D3=CE=CA=C7=C6= +=C9=CC=D5=DF=F4hXNHDCBACHO]y=E0=D5=CB=C6=C4=C3=C4=C4=C7=CC=D6=DF=ECv\MDAC= +FHIKM]=E9=D6=CD=CF=DC=DB=CE=C8=C9=CD=D5=D4=CD=CC=D3=EA\SUSMHDDGJKLR`=EC=D4= +=CC=C7=C3=C2=C2=C5=CC=D2=D8=E0w^PKHHGGLVk=EA=DB=D1=CA=C6=C2=C1=C2=C5=C8=CD= +=D3=DD=FB^OHEFGEEJNOWg=E5=D5=DCxj=F3=DE=DC=E7or=E5=DB=DD=E8qj=FA=EC=FBi\]= +iooqz=F2=DD=D1=CB=C7=C5=C8=CA=CE=D6=DD=F5bTKEB@??@FQc=ED=D9=CD=C6=BF=BD=BD= +=BD=BE=BE=C1=CB=DB=EDrZI?>?DDDGM]=E9=DA=D6=D9=E5=EE=E9=EC=F9=FDmo=EC=E8=FB= +l_^msnmiflqro=FE=EB=D9=CE=CA=C4=C0=C2=C7=CB=CF=D3=DA=F4]OIGD@?CJVf{=E3=D3= +=CC=C7=C5=C7=C9=CC=D1=DD=F5aUNKIHIKMQ[t=E3=DA=D7=D5=CF=CD=CD=CE=D2=DD=E9{= +f]ZWSRPTYXZ\d=F6=E0=E4=F7{=FE=F1=F6w=F1=D8=CC=C7=C4=C3=C2=C0=C0=C6=CE=DD=FC= +k]OF?=3D<<=3D?EN^=EB=D6=CD=C9=C6=C4=C2=C2=C4=C8=CB=CD=D4=D9=E8s_YUOJGEDDDDDEG= +KSZh=EF=DD=D4=CF=CB=C6=C1=BF=BF=BE=BF=BF=C0=C2=C5=C8=CD=D8=E5pYNIGECBBEHN= +QUY_lu=F6=EB=E1=DE=DE=DD=D8=D4=D3=D4=D3=D0=CF=D2=D5=D6=DA=DC=E4=F1=FBoe]U= +QONMLLMNPRW^ju=FF=EE=E6=DF=D9=D6=D6=D5=D3=D1=D2=D2=D3=D2=CF=D0=D3=D5=D7=DA= +=DF=EA=F3=FBzlf^YTOMKLMOQUZam=F9=EA=DE=D9=D5=D1=CF=D0=D4=D5=D6=D8=DC=E4=EA= +=F3}mea`_][Y[aaaefjkfkov}unx=FA=F9=FD~=FA=F4=E9=E4=E0=DD=DC=DB=DA=DB=DB=DC= +=DF=E2=E4=E5=E7=EC=EE=F7=FEtoommkha]\YYYZ\_^al}=F6=EF=E6=DE=DA=DB=DC=DC=DC= +=DF=E9=E8=E7=EE=F3xmhd_]___cfmr}=F0=F3=F3=EC=E9=EC=F5=ED=E8=E6=EA=EF=EF=EC= +=E6=E7=EA=E9=E7=E8=EF=FDz=FC~=FDthknmmikrx~kdcb_ZY]hmln=EB=DF=E0=E3=DF=D9= +=D5=D7=D9=DC=DE=DD=DF=EC=F3=F5wmlh`_]^_bd_ev=EB=F8o{=EE=E7=ED=FD=FD=F6=E8= +=DC=EDbm=DA=D5=DF=EF=E3=D0=CF=EEURg=F8`T\=EF=E4w^]hyo]WW\]XY_ggaf=FB=E4=DB= +=DA=D7=D1=CE=CD=CF=CF=CE=CF=D4=D9=D9=DA=DD=E2=E4=E5=E1=E2=E6=EE=F6=F3l]ZZ= +SLKLNLJJKOSTW^q}w=F8=DC=D5=DC=E5=DB=D1=D4=DD=DE=D2=CC=CB=CF=D2=D0=D1=DB=F0= +=F1=E6=F0ian=7Fkabnt`VON]=F9lVMPg=FFbZz=D3=CC=D5=EC=E1=D0=D3=F5`i=EC=E0=F8= +o=EB=D8=D3=DB=E4=DD=D2=D1=DC=EA=F7pZIAEIE=3D>ED?ANp=EC=FA=EF=DA=CE=D0=DD=EC=EFxXG?=3D=3D=3D?GW}=DF= +=CC=BF=BD=C0=C2=BE=B9=B9=BF=C9=C1=BC=C7pVi=E6eIGYbJ=3D>GH?=3DHXPHO=FF=F1bh=D4= +=C0=C4=D4=D8=C5=BE=C7=E3=DE=CB=CB=DD=E8=DD=DDUR=C3=B9=CBL@=EE=CCO8=3D=CC=BB= +=CCXX=D9=E8>02?JD at T=CD=C4=CF=DB=CE=C4=C2=CE=D7=CD=C5=CD=EAn=FE=F2hORo=DF=7F= +`=F5=D3=CD=CE=D6=CE=C8=C6=D2=F5peZQOPTRQPOMNNKIGKQOP]=EB=D8=D7=E1=E3=CD=C6= +=C8=C7=C5=C4=C2=C1=C4=CE=D9=D7=D7=CD=D0=ED=F0}Nk=D1|H=3D=3DX=F9A6F=CD=C5=E8KL= +=ECx=3D6?[=E8=E2=DE=CB=BC=BB=C3=CC=CC=C8=C5=CD=D5=CF=C9=CF=E6c\SF=3DKs=EDhl=DE= +=CF=D7=F9z=D7=C5=CB=DB=D7=CD=CA=D5xf=DA=CC=E1\p=E1=EA\LU=EBvIE[nTJJe=E0cN= +=F9=CB=CE=DF=EC=E4=DF=E9=ED=D9=CB=CD=D6=D5=D2=CE=D9mh=D6=CD=E3_]f=DD=D9dN= +QMDBHJQc=F7=F6iVXrdM^=D1=C6=CF=EE=DC=C6=C5=E6b=DA=C7=CA=DD=EB=D7=C9=D1ca=E3= +=E0S>?R=EDbJU=D9=CFjM]=D5=CB=DEh=EC=D2=DE_f=E8=E9=F8\XkhTS_\T\_ekgm=E5=D2= +=CF=D0=D2=D5=CF=CA=CA=D0=D9=D6=D3=D4=DFbl=E9mRILScfLKPNM^aqqX=EB=C2=C8QC|= +=C6=C5=E1]=CC=BB=C7QQ=D2=C7=E1OT=DA=D7RHY=E3=DF]Oe=ECYFQ=ED=DB=E8o=E6=D1=D7= +_NWn=ED=E6=EB=DC=CD=CC=CF=DA=EE=EF=DB=D9=F9k=FE=DD=D3zNTiRCBFNQIKk=F2ZV{=DC= +=D5=D4=D2=C9=C3=C6=CC=CF=CB=C4=C2=C4=C6=CB=D0=D5=EESNXZYRKHI?9ATOUUU=F6=E5= +MI=E1=CF=D6=CC=D1=CE=C6=CE=F3=E9=CB=CD=D4=CC=CB=CE~On=CF=DCNK~=CF=DAI>U=D9= +zIJo=D6=DAo=F4=D2=D6=EC=DF=D1=D3qUt=D2=D7WJd=DB=F6J at P=DC=E2KDa=D3=DC\V=F1= +=CD=D0d]=DD=D6t]=EA=CF=D0=FFb=E0=CF=DBgv=CF=C7=D2y=EF=D0=CFuU=FE=CE=D4_LQ= +v=F2TH[=DDyG?M=E8=E3K at _=D6jGM=F1=DBjm=CA=BE=C8bc=C4=B8=C6_=EA=BB=B6=CBMJ=EF= +=D3V>E|=EFI>DZ^KJ_=D9=DEbk=D7=CE=D6=DF=D7=CF=CE=E0bj=DD=DA=EB=F5=FE=F0=E1= +=EA^X_hv=F1=F9=F9=7Fc\=EB=D7=FC[Zd=EF=E4j]=FC=DE=F7rh\f=E2=DEr`h=E9=D9=F2= +W[=E5=D4=DFiZj=ECwi=F8=DF=DA=DF=E0=E1=ED=FE=EC=DC=E2=F7=EA=DB=D6=DAx_=F5=E4= +[Oat_iYNNUNPXT[=EE=DF{dh=F8=DA=CF=DE=EC=D8=CE=CE=D2=DF=DC=CC=C9=D5=EB=DF=DA= +=E1~l=FB=EAtUPRMJIKLJL^=EFoPU=E5=CC=CD=DE=DC=C8=C2=CB=D7=CF=C3=BF=CB=E2=DB= +=D1=DAcUUOMLJGDA at EJILd=EF=FA=F6=E6=E1=DD=D2=CD=C9=C7=CA=C9=C4=C3=C8=CD=CF= +=CB=C9=CD=DF=E8=EEbROQQOMIHJJKGELVZUR_=FE=F8}=F5=DC=CB=C5=C8=CB=CA=C7=C5=C7= +=CB=CA=C5=C2=C8=D5=EBihq\OORPMGACJIHMUYXUXc}=DE=CE=C9=CC=D2=CF=C7=C7=CF=D8= +=CF=C6=C6=CE=E7t=F2=E7=F8q=FE=F6o_VPPONLOQQQOOX`cr=EC=DC=D5=D4=D4=D1=CB=C8= +=C9=CF=DB=DC=D5=D2=E0na=FD=D8=DC]O[=EC=F7XLT=EA=E8ZORZ[NJQdjfcj~=DC=DB=D8= +=D5=D3=D0=CD=CD=D5=D6=D3=D5=D7=D8=DB=D9=D8=DD=E4=E2=EDmZWWVPLKKJIMTZSUp=D6= +=D3=EB=FD=DA=CA=C8=D6=E6=D5=C8=CA=E1y=EE=DC=ED_\{=E2=F4[Uco_Yay=FBbX_=EF=ED= +jf=EE=D9=D9=E8=F1=E2=D8=DB=E8=F3=EC=E0=E5=FDjedfa[XZ]a^Y\itv~=EB=DF=DC=DA= +=DA=D6=D5=D9=DE=E6=EC=E9=E9=EFvh_\[[^cghjim|=FC=FE=F9=E8=DE=DD=DF=EB=E1=D8= +=D6=D7=DC=D9=D6=DA=E5|ung]Y[[ZVSUXYVVWZZ[dv=EE=E6=E1=DE=DD=DC=DD=DE=DE=DC= +=DB=DB=DB=D8=D6=D6=D5=D6=D7=D7=D8=DB=DC=E3=EF{lb[UPNMMMOSVY]aix=F9=ED=EC=E9= +=E5=E2=DF=DA=D7=D7=D7=D7=D7=D9=DA=DC=DF=E5=EE=F7=FC}ojf^YSPORUVYY]hx=FB=F0= +=E6=DE=DB=DA=D9=D7=D5=D5=D5=D6=D4=D5=D5=D7=D9=DC=E1=EA=F1ucZTQOOOPRUVV[_f= +ko=FA=EB=DF=DB=D6=D4=D2=D2=D3=D4=D6=D7=DB=DF=E8=F7ukb\ZYYZ\_ejs|=FC=F5=F6= +}yw{=FF=FA=F9=F7=FEz|=FF=F5=F6=F2=EE=F2=EA=E5=E0=DE=DE=DE=E1=E5=E8=E8=EB=EF= +=FCzxql`_```fkmmjgc__^_cfmw=FD=EF=EA=E7=E2=DF=DF=DE=DD=E1=E2=E1=E3=E4=E4=E5= +=E5=E7=EB=EF=F1=FBvmjjgfegghmq{=FC=F7=EC=EA=E9=ED=FFqje`eijmnpnluz{=FF|us= +tw=FA=EF=E9=E4=DF=DF=E0=DF=DF=DE=DE=DC=DC=DB=DA=DE=E1=E9=ED=FCmklgda_][XU= +TTRQSSUX[^fu=F4=E5=DC=D7=D4=D0=CD=CD=CD=CD=CC=CC=CD=CE=D1=D6=DB=E2=EC|kec= +a\Y[[YYWTRSRRPPQPPRSV[du=EB=DC=D3=CC=C8=C5=C3=C2=C2=C1=C1=C3=C5=C7=CC=CF=D8= +=E0=F5eWNJFDCBCCBBDFIMS]n=EF=DE=D6=CE=CA=C8=C6=C4=C3=C3=C2=C3=C4=C5=C8=CE= +=D2=CF=DBhTNKLLHFHFA?ACIUf=F6=DF=D9=D8=D3=CD=C9=C6=C4=C3=C5=C8=CC=D1=D7=DB= +=DC=DC=DF=EBu`XOLKIIKLNPQVZbv=EB=DB=D7=D3=D0=CF=CE=CC=CB=CB=CC=CE=D4=DC=F0= +la\WTTSRRUW[]`ed`^\^h|=F1=E8=DD=D9=D4=D1=CF=CE=CF=CE=CF=D0=D3=D8=DE=E5=E9= +=ED=F6uf]ZXRNMMNOQSV[_ait=F9=E8=DF=DB=D6=D1=D0=D0=CE=CC=CD=CD=CE=D0=D4=D7= +=DA=DB=E2=EFvf^WQMKJIHIJJKKNSX_i}=E9=DF=D8=D3=CF=CC=C9=C6=C5=C4=C4=C4=C4=C4= +=C6=C9=CC=D2=D9=E0=F5n^WRMJGEDCCB?FJCGENa_r=F4=D7=CF=D4=D0=CC=C7=C4=C3=C0= +=BE=BC=BE=C0=C5=CB=D0=DB=EDql`]XTSPNLLLLMLLLLMMOTZ_ck=FA=E3=DA=D4=CF=CB=C8= +=C5=C5=C6=C5=C6=C9=CC=CE=D1=D3=D7=DC=DE=E6=F2p_VPLGB@@AABDHJMS[g=F7=E0=D7= +=CF=CC=C8=C4=C1=C0=BF=C0=C1=C4=C6=C8=CA=CD=CF=D4=DB=E4=FFbXOJFC??>>>?@AEH= +NZn=E3=D5=CD=C7=C3=C0=BF=BE=BE=BE=BE=BE=BE=C0=C3=C7=CC=D5=E5nZOJEB@@??@BC= +FIKMSZj=F7=E3=D7=CE=CA=C7=C5=C5=C4=C5=C5=C4=C5=C7=C9=CC=D0=D6=DD=EA{eZSMI= +FFFGGHJLNORZcs=F1=E4=D9=D1=CF=CC=CB=CA=C9=C9=CA=CB=CB=CC=CE=D3=D9=DE=E8=FD= +k`ZXTRPNOOOPRVXZ^`fmx=F6=EE=EE=EC=E6=DE=DC=DC=DC=DB=D8=D7=D8=D8=DA=DB=DE=E3= +=EA=EF=F7=FF=FCzvpnlljfgedfijkkjgfffjlx=F4=F0=ED=E9=E6=E1=E0=DF=E0=E4=E6=EF= +=F9yrngils}=7F=FE=F7=F1=EC=E9=E6=E4=E3=E3=E4=E6=EC=EF=F4=FDuj`_^[XZVQlZ_d= +Z=FE=F3or=EF=E1=D7=DF=EA=DC=D7=D9=DB=E8=E1=DB=E1=EA=E9=E4=DE=E0=F3=E7=E4=E3= +=E6=FCx=F9|qjhpob]\\^YUZ]]ZWX]^]^do=F7=ED=E8=DF=DB=DA=DB=DD=D9=D3=D1=CF=D0= +=D2=D3=D6=D8=D9=DA=DC=E1=F5yohb^\[[ZYXXYYYZ[ZYY[^ejy=F0=E6=DD=D9=D8=D5=D0= +=CF=CE=CE=CE=CF=D2=D5=D9=DC=E3=F8od\UONMLLLNOORW\es=F9=EA=DE=D7=D1=CF=CC=CA= +=C9=C9=C9=CA=CB=CD=CF=D4=D8=DD=E1=EEzkc]VOKIGEDDEGIKNS[do=F5=E3=D8=D0=CC=C8= +=C5=C2=C0=C0=C0=C1=C5=C8=CB=CE=D4=DD=E9{cYQLIGECCCCDEHKOV_p=EE=DC=D5=CE=CB= +=C9=C6=C3=C2=C1=C1=C3=C4=C7=CA=CE=D3=D8=E3=F7j\UOKHGFEEEFHIKMPV]fy=EA=DE=D8= +=CF=CD=CB=C9=C8=C8=C8=C9=CB=CD=CF=D2=D6=D9=DC=E3=ED=FCoc[UOLKJJJJKMOSY^h=FE= +=E9=DC=D5=CF=CC=C9=C8=C6=C6=C5=C5=C7=CA=CC=CF=D8=E4yf\SOKHFECBBBBDGKR[j=EF= +=DE=D7=CE=CB=C9=C6=C4=C2=C3=C3=C4=C6=C8=C9=CA=CD=D0=D7=DE=EC}f[WROLKIHGHI= +KLMOSY]dks=F7=EA=DF=DD=D8=D2=CF=CE=CC=CA=C9=C9=C9=CA=CB=CD=CF=D3=D8=DD=E1= +=E9=FBk]WQNLJGFFGHHJMQXav=EE=E0=DA=D4=CF=CE=CD=CC=CB=CB=C9=C7=C8=C9=CA=CC= +=CF=D4=DC=E9q_YTQOOOONMLMMNSY_fr=7F=F4=E9=E1=DD=DD=DC=DA=D8=D7=D8=D9=DA=DB= +=DD=DD=DD=E0=E7=ED=F0=FC{vtvv=7F=F3=EF=ED=EB=ED=EE=EF=EF=EF=F2=F8ymlhb^[X= +USTTUUWZZ[[^`i=FC=EA=E1=D9=D3=CE=CB=C9=C7=C5=C5=C7=C9=CC=CF=D7=DE=E9|j_[W= +QNLIHGHJLNSX^gn=FC=EA=E0=DB=D5=CF=CD=CC=CB=CC=CB=CC=CD=CE=D1=D6=DC=E0=E6=F0= +|l_YTOONMMLKKKLLNPW]gv=EF=DF=D8=CF=CB=C8=C5=C4=C2=C2=C3=C4=C6=C8=CB=CE=D4= +=DD=EA=FDka^XRNLJHFEEDEFGJMPV_p=F9=E4=D7=CF=CC=C9=C8=C7=C7=C8=C8=C8=C8=C9= +=CA=CC=CE=D3=DA=E2=F0sf^WOKHFEDEGILRY`n=F8=E5=DB=D5=D2=D0=CF=CE=CD=CD=CD=CE= +=D1=D4=D5=D7=D9=DD=E3=EC=FCulg^YUSONMNORVY\`jt=F7=EA=E5=DF=DC=DB=DA=DA=DA= +=D9=D9=DA=D8=D8=D9=DA=DD=E1=E9=FCrjfa`aefcb__][[\^`dhlnpw=FF=F5=EA=E1=DD=D8= +=D3=CE=CC=CD=CE=CE=CF=D1=D6=DD=E4=ED=FBvc]YUUQOOONMLLLMOQV]j=FE=E9=DE=D7=D3= +=CF=CD=CC=CB=CB=CB=CA=CB=CC=CD=CF=D4=D9=DE=E4=EB=EB=EF=FDxk^WRMLKKKKLNOSW= +[bn~=FB=F4=EC=E7=E3=DD=DC=DA=D7=D4=D3=D2=D0=D0=D1=D4=D6=D8=D9=D9=DB=DF=E4= +=EB=ED=FCywtrmd`_\YUQOMKKLLLMNRY^l=EF=DE=D5=CF=CC=CA=C7=C4=C3=C2=C3=C5=C7= +=C9=CD=D3=DC=EDn^TNKIIIJLNORVX\`el~=EF=E4=DE=DA=D8=D3=D0=CF=CE=CD=CE=CE=D1= +=D7=DD=E9=FDi^XRONMNORW]`el}=F0=EA=E4=DE=DA=DA=DA=DA=D7=D6=D5=D6=D7=D6=D8= +=DA=DC=DE=E2=EA=F3zoh^XTOMLLLNOQVZ_hs=F1=E5=E0=DF=DE=DC=D9=D6=D4=D2=D0=CE= +=CD=CD=CD=CD=CE=CF=D1=D6=DC=E1=F0xf_\VSQOMKKLKLLMNQV\ep=FD=E9=DF=DC=DA=D8= +=D5=D0=CD=CC=CB=C9=C8=C9=CA=CC=CE=D2=D9=E0=EC~k^ZUQOOOPRSV[_``fmt=FD=FB=F6= +=EE=E9=E7=E6=E7=EB=ED=ED=EF=F1=F2=EF=EE=EE=ED=F9}{vvtwx=FF=FA=F1=E8=E5=E3= +=E0=DF=E2=E3=E3=E4=E3=E7=E7=EC=F0=FAunkjjid`__]]^bgijhd__][]ajv=FE=EC=E1=DB= +=D6=D4=D3=D0=CF=CF=CF=CF=D2=D8=DB=DF=E5=E3=EA=F9oc^ZTPNMKLNOUX]afmv=F9=EB= +=E1=DE=DC=DA=DA=D9=D7=D5=D5=D6=D5=D4=D6=D8=D9=DB=DE=E0=E1=E3=E2=E3=EB=FBw= +--hal_9000 +Content-Type: AUDIO/BASIC +Content-Description: I'm sorry, Dave (BASE64) +Content-Transfer-Encoding: BASE64 + +6u75/fv38enj4+Lk5+fs8/3+eHdzb21oY2FgXV1eXFpZWVteY2v66eTd29fV1dfa3N3e3t/f +3+Lk6/L8cG1oXlxaWVlZWFpcXmBkZ2hoa21tbnV5/vTr5ODd3NrZ3Nzd3+Pl4+Df4OTue2pm +X1tZVlVXWl1fYmZtefjv6uTe2djV1dbZ3uXveW5vbWllYWBfX2NmY2JhXlxaW2FrdfDq5N7c +3N3f3+Dl6u309350en1//P59fP79enp2cG1sb3V+9Ozl4d/e39/n7e/29/r+eHFtZl5YU1FQ +UVNWV1ZYW2N19Orf3NjT0M/Ozs7P0dXX2Nve5fR0Zl1YUlBRUlNTVFZZXWJvfu7n4d/h3+Hl +5+rs6urn5OXm5ejv9Pl7a2VlYFxeX19fYWZna3B6+/Ls5N7d3Nzc3uPm6e3+b25qbHJwbGhn +bWxqbnBxc3r68+3o6Ozu7u3s5N7e3ufu9HhsYlxZV1dVVlhbXV9iaHP+7+vo4t7c3Nvd39/f +3tzb3N3e397g6PZ2b2ljX15bWVVTUlNWV1tcXV5kcPHj29bT0dHR0dXa3+rv7+/1/3drZ2Nd +WlhWVVZbYW5/9+/t7enm5eTk4+Xl6fP7/HptamppaGpscHBxevfu6OHf39/f5Or4dnRxc339 +endza2loZGRnaWpoaWxyenx8ff317ero6OPh39/l5+7w9PT0+fr59/5uaWFdXFlXVVNUWV5k +bXp+/PHu6ODc2NbU0tDOzs7P0NPW197o+HZqYFtWU09MSklIR0hISkxOUVZbZH/k2tLMycjI +yMnKzM3O0NPW2t/p+Xl1b2hhXFZST05NTExMTVBXXWdy9urh3dvZ2tvb29ra2trc297j6O30 +d3FqY2BfYmRiZGFfYmdlZF9fY2NjY2hy9urm497b29nZ2dfV1dfa3+fu/HJybmReW1lUU1RW +V1teYml2+/Ty8Ovp5t/c29rY2dvd3+Pn7PD5/nFoZF9fXlxaV1VVU1JSVlpeZG/z5+Dc2dfU +09HPzs7Q1NfY2tzf5ez5fXVtaWNcV1ZUU1JOTEtMTk9VWV1iaW/56d7Z1dHOzs7Oz9HU19jY +2dna293m9nRkWVNPTk1NTExMTlBTWV5ka3zv5t7a19LPzMrJx8fJyszS2+h4Y1ZPTElHRkdI +SUpLTE5PVFtfceze1c/Lx8TDw8PExsjM0dnj82lbVE9MSklISElMTlFWW2Fv9uff3NrY19bV +19jZ2+Dp8vn9eG5qamZlaGxtbG1ycG9xd//z7+/v9PLw7Ofm4+Dg5Ons9XxvZ15aV1ZWVVNS +U1RXW19u+ubb19PRzszKycjIyszP1dvoeGBYU1BOTUtKSUpMTU5QU1ldZn3u5d3a19TSz87O +zs/P0tfc4uv3enBqZWFeWllaWlpbW1xdXVtaW11hZ3L66t/b1tLPzs3LzM3P1tzm9nNlXVdS +TktKSUlJSk1TWFxhce3f2NLNy8jIyMrLzc/T2N3i6PJ1Z19bVlBOT09PUFBQT05NTU5RVl5r +9ODXz8vIxcPCwsTHys/W4fZpXFVPTUpIR0dHSUtNUVpmeufe2tfW1dLS09TV1tbY297g3+Tq +8f5zaWJcWVVUU1RUVVhZXGBt/+7m4+De3d/f5Ofr9vh8f/378e7u7u/6fn58dXVuam9vb3h/ +/3h5dXRubW1z+vPs5t/a19PS1NbZ3un9aV1YVFNST09PT1FUV11ganL+8ejc19bV1dbZ3N3g +5Obp6+7r5+Hi6Ovv9nxxamlnX1xbWllYWVxdX2h58+zo5d/d3eLn5uXn7fb7fnZtaGZiXlxb +W15iZXH86t/b1tLPz8/P0NPX3ur+a2BdWVdVUU9OTUxLSkpNT1VbZHrn3dfSz83NzMrJyMnI +yMnLztLW2+f8a11XU05LSUZEQ0NERUdKTlNZXWBw6d/b19TQ0M/Ozs3Nzs7Pz8/Pz9DT19rc +5PlsX1tXUk9MS0lISEhJTFBWWl1o+ejj39nRzc3OzczKy8/W3OX2c2ddV1NRUlRTVFtmZ2Jh +buzi5O3l29fY3uPg29zl93B0bGRcWVtcXV1dY2z/9vPs5+Tuf/rq4eLp49zc4O318fLz+Hp9 ++Pvx+HZvbXB0amJdW11hXVdSUlZbXVtcbvn8ffjn3tvZ1s/Oz8/Ozs3Nzc7S1tzl7nlqYVdP +Tk5RT01LS01PUVNXWl1fZGp1797c29nWzszO2NzZ2d7uf3rw92xvevz/bmlrdn1ucPLu+XZx +8ejt7/D2+Pjy+Ph1anR5aV9faW9kVlJcaGJdYnB7dGRkc/357d/c3t3Z0M3O0c7LydDc2tjf +Z1VRUlVNR0hOT0tJSk9ZW1Zf4tLP41dQ28LH7GHZv8bex7a4YzlCzbW85Xfdakc7MjVCZett +VkVCRUdKYODbxbeyxUY+X7y62k9Wy8xURVHRxdL76s7J4FVd39DVd2BtcH1ZRUdIZ89WRUJM +2fBVSU9OQc25qrMyKy/Pqa23w7Syby8nLkbIvcHDz+1HOzpFbc7Cw8LM7FJBPj9LWmT/3NXj +Y1hu2c7Oz8/Q2u335dnd9Xro33ZZWGJ5b11bZ2pWTU9UWFdh5XVr39zO4V3qy75ZP8W7t788 +Mzdrx9q6ub/BTzAtNkFY2MO+wt9FP0dVaNTDvLrE3FNCP0FNcexk28zdZVDszsfWX9XI2V5d +59riXFv64G1aZnP7Yl9kcF5LTE9jXEtg3df0W9rO2HBMy7y9v0o8O07Mz7u1t7t1Oi81PEru +wrzBz1VFQERPfMnAvsTXXUQ/PT9HW9jN6HXOy+hbdMq/xuzvyMl3T2nW2WNQY+prTEti8V5J +S2B1VklLZuR0ZfLe09TX1uznyL61v0g4P97L1ce7s71QNjE4Oj5Zzb/E4lRJSUxNZ87AvsbW +bU5GQEJLWn7h0snN6HDkyMzh6su+xXtY+M/vTk/+4F5KS1xbSkRMWFlPTVv+cWl35drOytLX +y8jK2lfyxLe6WTo8b9dtVdS4t9s+NTs8Oz9dzMTPZU9SXVph9c3Av8bR61xPS01TX3XczMbL +3X/u2uBsYfDZ2XNVVWFgVlNaZ3VtX15jZl9eYW/47+7y7Obf19HP0dTU1tni8Wdabd/P21dF +Q09fZmd32M7T91RLSU9bbff07eri397c2NTR1NzndWVeXV5dWFNRVFpfbfHe19TT0dHT2d7o +7ntmX2Fu+/h4b3J1b2lhXV1dW1paXF9qfezf2tnY2NfY19jZ2d57a+3a42JOSk5cXVZZbOPZ +2e5jXFxhbXVqZ2htc/Dj2tDNy8zR3OXs+2tdVU1IRkdLT1llfeHUzc3Oz87Oz9be5u/7dXz8 +fP54amJeWlZVUk9QUFFTV1xfa3vs5NzV0s/P1dzRx8fU+WBcaXhrftrPz9fuXVFRUFBRTktL +T1JXYn3j1tDS1drg5e17ZV5bU1NVWWT039rQysjJyMjLzdfvcGphXFtcWVdXU1JTUlFRU1NU +VlhbZnb36NzWzsvLzMvKys/e5tfP1HxQSkpKS0xUe9zefl1ST05RW2Rsbmxv/ubXzsnEwsPG +y9Ha5XdfUUpFRERERUhPXG/n2tHLyszN0trf5+vp6ezy9vt/eHJvaWVdWFVTVVZXW11gZ2/4 +6eXe2dfV1dXY4uTZ2+Pg9W/9ZVljcHnp5O31cF9YU1JSVlpYVFddZHjs39jV1tXS0tXa4Ol3 +X1lZXGVx9+jd2dnX1NXY2eT7bF5ZVVVVV1laWlldX2JqbXBwbmt1/vfs5+Lc2drZ1dDS1cza +YWnz7GdcZmpwaFZOU1tcW11x+Xr88/rn2+Hn4d7ocG/x6ejy/vfs9mdeZ+buYGzz9e5lW/rv +fmlh+e1t/W7w43vt8OHr8Xt86HJs/XDqc/16/d1e33F63Frcd3TdUvRVXWNU92Xh9npt7uz0 +3frS3+DaX9b66+Pu5Pz4anl4Xn1efPteXWBbZF1aa2BhXWNra/Zh73p563bd593V6tXp3NPi +ytvQ2t/f4fbw6nnvbl5cTGJTa21T8ExfVFVlUGhcbO5ffHdc32/j4uzQ39fY2tfW09XV1OvU +XuBqX+pTeVRnXFtdS1pNW1pV/1fqX+Hq+s/6zN/S0+zG987b2c170GHVXvVdVGlLdklhV0lm +R15OUW9O2V7o/ubY5Nnf09fQ2NDU09jc3Nzp7fXq5mhrX15aVlNYT1xSVk9XT2ZWZP/13+/Z +5c3c09fP0tPZz+bZ8+voX3NOa0tiT19bZFtf/F53eHfn3+vee9Vj23Hg3P/eeN/jZfxYfV34 +c2znX+Ve71ps/mXdV91v5N1fzv/R4NbV/NZtbO5P9UzxU1lkSv9Ick7/WG5tefLt3evS3eLR +3dLX49fl0fTb6evoZ+dUcFxjcmZkamb7W2dVZ2Va7Froaep56u/7/O/2def27m3ra+T94Gzc +YOlhZ2tx6Xzeetrk3uvg5t1152byc15baF5oY1fqafh0a+T8a9pY11ft/ufcXddn2/Ry4Gfo +dmHuYvxX32Lweeft//Hs7/L07W3ob2tb9Xta5UzgXXVeXOD+22nf3tbc393p+dpo0Gvpbt/x +Yvda2lbxXFzuU15TXl9RX1FscV3ie9T24dzr2dv23O/a4+fn49ng+tzueeBa7uZ89lzkb216 +T1ZvTWBOW/FZ2lTk9nTpWthl013q5f/cb/DZ0+7h127Tbfj4a2ph7mjbeOrSZtFp63JndHFW +UV5Rb05fVWVhW11g1GjXd/Pf1X7c3uXV2PnQ78541dra8G9jeG3n71btYXFvSmZNXvxSbVbv +dVt/VdJY6mpn5ONdcO3edeLn2ODO3NHgz93Z1Obm3mzaaPjtUvhLXlBaWUlUTlL+SXlhb/xo +3VzdXNvW897X1tjd387P19PqwuzU6+/bVF1pXORKWEFRTEZUTGpc427vaG3r5t3q3tXU0NzO +y9HN2OLa3u7famlkWV1NTkpPTklYUVlPT1r5cONqz9XK19LO18zg0tDJ2c/bztPqVXZp7llL +U2BwTU1JX1tQT0tTV1ldWF5/8P5+/dzQ287NzcnPz9DG0s7J4MzwcG1qc1NZSk1WTkxCTFBM +VEdcXvBfb+nf1OnY29bR1M3Q19DOzNbU9tjd4utiZWr6XlhSTlhVTkpITFJcU111fHppdN7Y +/u7Ux8vm9NXCxtXg2MvVaGXu2uZYTlh+Z1NOTl5TSEpNTldfUFrZ2eB4XvvTytnq1ci/x97i +0cfJ1e3n2uFoVlFXW1VKRklISUZERUtTTlBe7994X+TLwsTMxLy7vc3gvbnI1e1kbUg4QWLj +4GlPUkk6MzAzO0ZPaebPx8THxcC/vsPCvLzRTER3xspmTHjK0VJATN/O5lxYXlhJQkJGTl5d +Wl5l6uZtUVX72cvP0crV6cO+v7vOTD5GZcu8vsTGzlo8LywvN0FY7dbPys7b6nbo283LzcvG +zG9QSFJhZ2Zq3dPX4ufd0tPgb1xTTk5MT1366ur1dWVo7t3f72laXuLJxtHlbV/UwdNi/V1C +Pz5Bb767xs1vPzc3NjpL7se7uLzFztrh3tXPy8fGw89ZQDk7QkxMTmT66ej5/uzX1Njfe2dl +f+fX0NXa397xX1JTbePfX0xKUXHb0X1IPVLIx8fRSz48TO7Fsra+v95GNzQ2PmTLv7y+y+Ht +a198287IxcrS5U89OTtBS1hfbd3d4uXs3d3Y2+rt9u715djU0t7/Y15dVlRZZ+ndc1NMTlv9 +2tzvX0x1xsXDzVQ+OUR7wrCzvcpqQDc4OUBxx7u7wNNZT1BPYOTPx8bL2vZKOjg7SVlv6uzT +0NjX2dbTz9Dg8HV0fe/l9XxqYWBaVk9PV1pge/VuX1VRXefRztLXZ27Ev8K/5EQ6PV7Ksq+8 +zV8/NDQ3OUrfxcHJ2VhLUFZr18vIxsbJ2VZCPkNVamzx4Njb3NvX0dPY4+p1XV5g/d3c7mNZ +VlVQT1FTXW/v8GBdXmDo3NfX19Rz28DCv8tOOzdF7MGytsPhTTw1ODtCbsm9wMrfT05cbOTW +zszKx9NZQT0+RFFVXOzTz9rY2d3X29/x6Ohtfuzg4vR5Y2VgVE9SX3H/eGxmaGtpc+re5eTc +auTDwr/NSTo4TdS/s7nG3U8+NTY8SOLEvsncck1OWGHs3M7KycnvSD9BTVteXWrb1Nre29HR +1dvu8e/r5+Dc4/V6b3ZtYVZOVGNxaFpXXWZubGVncHBmVuTCwb7MTDw7VMu8s7rE0ltEOTc9 +SffIvsTW/V9dZGr14dnNzdH+Rjs8R1ZUT1j13OLo39HKy8/a3+Pt6+Ha1uD3++/oel1YW2ho +XlpSVV5tdmJZWFlY+svHxtZMPj5Yyby3usHLckk9OkBP88vEyNT6ZFtaXWns39TP1XNJQURI +Tk9RZ+TW19rPycfJztXhemVhb/D2eHn4cltPTlJZYGRgX2Vvfevk6uh7Xd/Hvr7wPzxI2sPC +wsLCzF9ANzY9TurQzdHc6PN3al9u5dfNy9dZRUZSXlRMVeXP2mpr2cjHzM7O1uhsYF1dbOnc +3+9pWFBVWlZPTVNgbGRkXk1V2MO92z87TM6/wcW/urzNVT06QFL23tvZ1dHX62NYXW7v5+h4 +U0VDS1JST1nt09Lc39jNyszP0tTZ6Xlucvv8c2ldVVJccmNOSVN2eVpUVWTdzMPMTjxF3sHD +zci8usdkQTw+SV/8+eTXz9Ppa15g/N3c6fb3Z09GR01YX2nw3NnY087LzM/T2uZ2X1pcZHHy +8P9rXFxpXU1JTFx4eF5Z6MvCyVY8P3nHxdDOvLa95Uc+QklOUVRq39PU5Pb56+Xr7uje+1JJ +SEpNT1z64Nna2tPLxcfNz8/W72ZgaGxfW11dWVZbXFFMUl9jV09OadLJzW9LT+PLzNbNvLa+ +3VFLT01IRkxl4+L6bf3h5HJr6Nv5W1lcVE5PWWdsZ23q2NTVz8fCxcvU3OHwe2dndWpgbu5e +S0xYXFNSXFZd3Nj9UURFU3Xz99e/usHSf2dhT0hIVebX3tzPzdHX0MrO+2P0/kw/Q1FYS0JM +7NxuX9vHydTUy8nR6fXr7XZrdOvf7mhgY2VcVFhXSl3W5VtQUllWVFrqxsHLy8nSdVNQT01R +WGJ55eLezsbI19LGy/ZYVVdPRj9DUVNPWPze3+DW09jb2tzk5N/n4dbOzuHu2tnubujoVGvZ +Y1VRTU1GQUhccFpb5NPxWFt1YU1PdPJx69TGwcXEv73AycrS5GVOSUZDQkZKTVhs7Ov48eDc +5fv37H9o/Of0Zmbt3eb73td328zsfnJhXU9KTmfv/eza1e1ua2RcVlZbWVllb+XY1M7JxcjK +y9DT62RYTUhDQkRLT1hp69zVz83P0tXg/nxkXFxVVF5u7dzy5sXPberd8mhbXebc6tzNzdTe +73plUExMSERGSEtXVl/v7NzT1NbW0t30bGBfXV1me+/h2dLMx8TDwsTHzd/raVFQSUNGSEtK +SXNtT19pWlRUVmJ+7+XZ0c7QzMzMzs/Q1Oj+el9iamBv+vL9cG1gY1pPTk1IR0dHSk9Yb+LV +y8XDwL+/wcTJ0dngbFZZVk9NWHdUWX1mVVVYXVleanf75OZ/7uf8d+zq6evh6/Xg7O/h5t7h +5OPp8mpaVE5LSUhHSkxTXGzp19DNycrKycrNztLZ3vl97WFq1G1f3fpaY2BZXWlkb3d2a19c +XVlWYmRdZXRlYf5zbOzs397h3d3i3+h6bGpbWVlaXWVu7t7a1M/Pz8/R19rj63xfW1tVVE9m ++Vhq4PL84vLw7PZ78u7q+Xz28m9tdmVcXmRdXW1vZn/r5uzm2+bt63RjZl9bXVxcYGhv8+jd +1NTR0c/S2tnucG5nX1tdWVJe6Wpi4+f35PH96OLr4d3b3OTq7/lxdGtjXl9bW1xZX2FfZW1q +ZWltc29ubGFdXVpbX2d77ure0s7MysnIxsrNztXg6vxvXVZUU1dTUllZVlpdXVxdX2x5d/Po +5OTg39/d3uDh7Pp8b2ZeW1lbXF5ma2tyfvj09e3l4ebt9H799vLt5+Le3N3f3t/j4+ju9Xlz +c3Vwa2hnZmNhYWFfY2NkaGtydXVzcm91eHz27enl4+He3t/i6O/0+f16dG1pZ2RgXl5eXl1d +XV5ga37v5d7Z1dPT1dbY29/l6+7v8e7z/X17fXh5en16c3VvaF5ZWFhYWFhaXmFpbW9wdHp3 +c3Fudv727+zp5OHf3NrX1dXW19nd4uvv/Hz+fnx8dW1rZ2NfXFpYVlZYW11fY2lvevTp39nW +1dXT1dnc3+ft93FqZF5dXFpYWFdXV1lbXWNu+e3o4N7e3Nzd3d3e3+Hi4ubq7O/v7fB8cmxn +YF5dXF1eX2JkaG94+fLu6OHg3tzc3t/e3+Lo8P5waGNeXVxbWlhXWVtfZWx7+e/s5uTk5OTn +6Ofo5+rr6Ort7/f/enhxbWtpam1vb25sa2xtb3r27ebh397e3tvZ2dvd4OTq8npmXllXVVZU +UlJSU1RWV1pfaGt48+vg29fS0M/P0dPV2Nvf5ejs8v51dnZ1bmtkXlxaWFdXV1dZXF9iZ27+ +6+Dc2NXU0tLT1Nfb3+jufm9lXVtZWFlbXWBgX15eXl1eYWhwfPrw6Obj3tzZ1tTT1NbX2dvf +4u57cWllYFxZVlZVVFRVVlpdYWp2+Onf2tfT0dLV19vf5e5fXstkRExR09ppYF/v62dtZmla +5NPfaPHkfNfm62FUU8q/72ZIYOhgaPVr9Wne7fRUU/llamnd+X5kd9b8VGLq39ro3NDfatrg +3m7y2tHfe+rqYFdTWU5OTFNdTlBZYG5n9t3X397T1tfV2tXW3Nzb2dzX3N3l6/VzYl1mVVVO +Tk1LSUtOUVVdYnnk5N3b1c/O09LPzdLV1s/Z3u/l6HNfZmdXUVFUUU5OU1pWVmBycGrv2tXY +2tLP1t3T2et69d/rX1t57m5kbu94W1peXFhbXFBUaPDn7d3Kxs7W0M7XcWV0Yk5LT1JNTFl8 +9+7azsnM1tjT4V9TWVxXVVVKXM5f5cdzYWBc6+pd58fM2OXt2PhOVf1pWFvv2uvv2MnM19LO +2W5aUEg+ODc5PkhFTOLPw7++t7O3vcPGzmhKT1NKRUlXY11l7N3tZl5ecH9NP05OSU9PaMnR +W8y0v8TH3dZ3T1zj3vLcycxgUWFURD5FTk9JVPXd4N/LxcnNztJ3TkdGQzw9TGZk89fDt7q/ +u7m+xuBZUlJSSEBNX29qXGXe3mdcZmlZSkhMZVtLXe1ucnvdy8bXUOO1xEtjz+9OP0rSw9vi +vLjZUV5gSj9AWehYXc/GztXPxsjhYl9eRjw8PDw9SlxiWdW7wtbGubvI4drH0VZZ1tBeW+Td +blNWcmNISVhTSEZLU1VRU2/xWV7Z1dvUysh+zrbAXGDDxGE/UcO73mu/uXg/QVJENjdR/U9S +2crdau7T3ltVcW1NRk9XVFBh0srl4cK9x87Kw8HQf9rM+1FacV9PSlRaS0JNWk5JTVxgVVRs +7Xfsz8/Pzs3Mzs3Jx8/Vz1r4xN9KVdhqRD1E69JRU8zGUj5BUEY7P+3P4dS/vMfQysTO7OrU +32FUXF9PT15mT1Lv2exz6c7VX1vt+lxPU2doX2jf5Onc1N7l59vjc2Hu625p+eLhe/Tf+2B7 +5G5ab+pvPUTAxkQ/28ZgOj/RveZ0vLXMVFjoXj5C3cprc8nD31Zq3HdOUfb7T0tVXUxGUPlq +UHzMy9LPxb7F29rN1ntrc3hlX2BkX1xeW09NVFNMTVhcXF5q9uXe2dbU0Nbb1dLSy8vQ0OJR +zr39Q1PaeD42Rt7yR1rHyk9DUWpJPlPT3HvPv7/Q1cfE237a1WRPVVtPREz/akhL39ZwXOjO +z/fz1dD9aeHa7eLX0t91dvRlUE5XWlRZZ2JaX3z4aWfq3fN59eDg5PDYy9/21l3svs9XX+ff +VT5E9NFu+cfG9FBOVUs9QnHtYPPPy9Z9383Yd+/c8VxZXlhMTmXvW1Pdz9bVzMXBy9fOzn55 +72JYamtlYFdYaldMVV5QTlJUVVFUYW5w7+He19Tb0s3R0tLbz9Db41z0vtFQW+/vVUJFZ+Ru +/c3QflhPSkU+RVxjZd7T1tzn39rl6Nzf5+XsfXxqZfPs7XLj1dTa0szL0dzt9exoU1VfWFdb +WVZWVFdVUFJdX1xfYmH953712tTd4tvU1Nze183T39fQ3OplXM7KVU1wdlhJQk38aF/iztz9 +ZFlQSkVOYVxw1tHT09TQ0NjX1Nff4/JoWVNSWlxYVGvg4O3j1s3P5vbe5WZtZmD17m328WNe +YlpaXFlfdmpaW19oZl1t2tbe39XP0OPez9L48Nzc7W5xYWDc6VZPV/ZeQ0FWaXPy08rK13xn +W0tKXG1q49DOztTT09Tf4uj9bWNYT0tLU1ZTUWrk3uPa1dHV2drU2OHh4ff849/c6/by6mpW +VFVUVE5NU1JOTlFTWF519V7+ytF+2svMytDPw8XS193Nx+NZWW5iTENJXG5qb9zbblhOSkU/ +QktUV3vc0s/TzcjJztLR0N39al9fY19aXu3g59rQzsvT3dbcdWtqV1FYVlFUVFRYWVZbWFNX +WFpjaWf44ubb0tbVzsvMz9LN1unf5XT+8GhxblLyzVtHUV9UTklM7+1138zS5eLrb19OUGJr +Y3vb1tPQzc7Pz9Tk+WZXT0tKT1RPT27e6+vTz9vi3+DxbGplZ2docnj/ffjw7v585+t+8ul+ +bXt/cf7m6m5+5uP7YnTxe2xnZm1kU27mTWjD6k1h7nv6W0/cx9ncxsTZ2eNjW09MUFhVXXjs +39/f2tXY5fN1XllPSUpPT0tX6eTe1s/Kxc7TyMvb5ODqfHNfY2piYmRZUFdWUVlbVl1lXWB3 +dn/m5OXY1+Dd2+ry3NfgfenZ301Vy9dOTWJgaFRNe87l787G2t3b9GRaWVxlWV376Xzp3t3d +3eDwdmRbUUxJSkdHTlpebNvRz87KxsfJys/T09Xf6eDwevX9YF9iVU5OTktJSU1PUFRcX2js +3OHd1tTQzs7RycbS2+fhyNVYWPNeT01KTVtaXPnb7u7qb2BdWlpdXmF38evf29na1NHW3N/v +Y1ZWWE5KU3dxa9rPzsvJzczN2uPl+mZnaGZnYV5qYltZWVRSU05KTFNOT1tkZO/e29zYzMrP +zcnIzczL3dzk09b9W15oWE9MS1tkXFx3+mVuX1hXWFNXXF9s8+zn2dPNzMvNztHd73FnWlFV +WVlWY/Lv597X1tff6+1vaWleWVhgXV1dYm51b3zv9nF4+Ht2+u3p397c3Nrb1tTd7dvadGv4 +X05r5llOWlpUT01PYmlt59bU19ba3+x78fptbe/2eOvl6uDd29vh8P1tWk9KS0tOUFh139fV +y8XIy87P1Nrh9/JxYVtgYV1dXl5aVFFOTUxLTVFTWGn56NzX1dPKyczPysfO3/TYxttWYN12 +T0xSYVxXX3p0ZGdiWVVUVVpaW2f9+Ong3drQzc7Qz9no729aT1pYVFhfdOPW2tHIzNvc1vle +X1tWTlBUWVpf+unh5+Ll7f5ucHNnYGVwe+/v9n7w5vT9+H1v+mhc495kb+Hf//nt3tja2s/O +3+3ualhRT09QT09aXWBo/unk3trW2t7p+XFlWVdYW19kd+Xb1dDMyczT1tjrb2ddV1ZTVlxe +Z3v9e/R5aWZnXV5iXmnv5u3j2djb1NTd6OjnZlRr62NTWnNcUVRp+PR+5tHU5Obb5mRicm1k +afrs6+/j2NXW1dbif2VeUUhFRUhJTVVr4dfPyMXExMbIzdTc53VkXltYXF1cW1lXWFhOTE5O +SkpPVVpect/Tz8zEwcLDx8fByeR+3OtWTVNeXFRSX2xYTVFWTklMVFZSXfPd2tLIwsDDxMXL +4HBmVEhAQ0hJSE5s3NPOycXFzNPX3ftnYVxWUlZfZWNr9+js+HZ3ZVhUVVtYVV5+8u/l3NXQ +1ObZyM98ZPR9W1Zi6Nje6NPJ13N87mhSUFhZUE1RXF1ca+PZ3t/e3/pnW1RPSUdLVmf618rE +v769vb7Ey8/bcllQTEpGREdKS0tPVFhYVVRYXV9cXf/e3NjOxsLCw8O/vcLS6eT6Wk1MUVpW +T1BZVU1LTE5MSkpPVFhefNvRzcnGw8TJzc7R5mldWlNOTE9ge+7j187Oz9DP0+JxXlZRTUxM +UFdZXmRy+n12a2d29Xxv/OPb4eHVzc3R19fP1OTk8GhbVlRUVVFVYmphYWlqZl1XW2VnZWzx +39jX1M3KyszO0NPdd15aVkxISU9XVlZi6t7i5dvT1+b16eZ7YGb+83x57N/h7PT1cGBmaFxa +XGhxXmTv3+Ty5dHP3fHj095dVGT5bVlXb93kbWL34Ol0aX7q7m1ofOzo8Prr4t/m7HplX1tU +T0xMUFRTVF5z7OXo2c/OzszJycrNzs7R2uHj525bWVtZTk1QUk5LTE1SUFBcXWNufN3U2dPN +zMzQz83Q3u3e2d92aPrmellXX2JXTU1QVE9NUl1reXl96t3Y2NbQzs7S19XX2t7o7/Z0bGVd +Y2JeXVpWVVNSVllVUltrcmpv59rW2drRzc7S0czN1dnb2udub/lvaWhiV09LS1BPS0tRXWBb +Xm7t6+3e2tPP1drW1NTU2NnZ3Obu7+x1W1xfX1NMTlRTUVVbXml67ubn39rZ3unh2drf5enn +6OPc3N/f3N3scnD/bltTVllUU1ZbXV5janT8/vXs8Pbw7evq8fz+6d/i5ubf3t/j7fHx6+97 +bmt++XdrbG5uaWJmbm1kX2dqal9aYGJfYWv18fbn3dXP0NDQ1dra3uTr5eDp9f/6e2tiXl5a +UU9OUU9NT1FXW1tjfe/o49vZ2NbTzs7U19bS2N/o7Of+Zl9gZGFbWllbXV5fYnHt7/bt4dzi +6/fw8X1uY2VobXtqaPrp535ka+/7Z19lbXBwbv7159vb29vZ1tfc6u3m6vNxaHJxZmBfZ2ld +WlxfX1xYXW14aWZ17+vr6+Xh39nW19rh5drb6fD59/xqXVpdYGFdW15pbWtranz3e3N08eXl +6evs5eb17+7w8nZ2fP34/nR39ufl8Pjr4+v+b3J0c2BaXF5cX2ptb29+7eHh5uHa2d3g4efh +3t3d6HdnaV9XVVFQUlJSVVpfa+7h7/De29jZ5Ond2d/s8e7n6/P27ebj3dzm6+/r4vZuYmr0 +Z1lcW19fWVZUV1lZWltbZPv1+vzu3dnW1dLOzs/W3d3oem5ua2deXGZqY11gbf13ZGJy8ft7 +/O7t9fr45O3/7//48Ovr7+nu7fV2bWloZWBhaGttZV5qfvV9fOzf3+rt4tjc5d7f6fR2a2Ri +X1tZWVtaWldWWF9jbfjv5NfT09HOysjKzM/Nztjb7HBtXlVMSEhHR0VFSU1PUlhZYfzn39va +0czNzs3Lys3P2Nzd5vhpZGNgX1lUVV1dV1teZnRqZmdnffZ2cnjr3t/i39jS1NrW0NPb3+Tn +8W9oYl5aV1ZTT09UWltVVl1fX1xWW3Dv7ejj1s/P0dTQz9LY3N3f3tze7fz/9vlmXWNwZltZ +V1hYV1ZYXF1fXmFpe/l6evPq5ubn3dXU1dfV1dXU1tXY3uXi4fpeWltVTkpGRUhKS05OT1lm +ePjs3dDMy83MyMXHy83NztTd6ebvZ15YWVZMSElKS0tLTlNYW11qd/He1tHV087LzdXX0c/S +2trY3OJ7bHhgWFpYV1FPTk1MTU5SWFdaaP76/uXc2dPV1M/Rz9HY2dja29vd5ebn+PTu+3dq +cG5hXFVTVFFQUVNWV1VXWlpcZGxw8+/x4NbU19jUzs3O09LPztPX3Oz8cmpmXFRXWFlaUVRd +X2NcWmJva2x87eTv+3f77/V9bnzt5ujy6d7Z2+Dg3Nzf7f58cWxoZmFcXWFmZWFldfj3+X/y +6/l8ffz09vHq6Ofn4t3a3ubq6u9uXlthYVtWUVZeX1lWXWdmX19u8enp39nT0NDQzs/R0NLT +19re3+h1Y2BoZllQUVVWUE5PVlhVVlthbnJufvby7vD15t3e4N7c2dfZ2dzf4t7e4+vv5+Tz +d2xqbm5iXWFlaGFcX2NnZWNkanZ6e3n+8u3r8fTt6u/+evnt6+3s5N7i6/Tr6u7w/Px7dHBr +Y11bWltcX2VufPv5+vPr5OXn6+3q6uzt7Ovr7Ozp7fHv8Pt3b2ljYV9haGprbnB5+/f69e3o +5OXj4d/i6/b/eXl4dG5rbGlpaWpqaWhlYV9fXl9ka3L87eXf39/g4N/i5uz19/l4eHr47erk +4t7a297h7Ph/d2xgW1lZWFdXWVxeYmNiZ3F++vHt6ebp8/v07+zp6OTe2tnZ2trb3ObxfG5l +XFdWWFpbW15nbGpvbW99+PDv7Obn5+nn6evv+nl+9vLv8PHw7ezw9vXz8vD6f3d2dnJ8fHt1 +b2lkY2VnZ2dnaGlmaGt1f+7i3dvc3t/k6O/+b2lnZWBcW1paWlxdZG987ePc1tHOzcrJyMrM +z9bZ5fppXVdRTUtKSklHR0dIS09TWF5oeOne2dTRzs3Mzc3Nzc7Q1NbY3OPl7PD8b2NeWlZW +VVZYWFlZWlxeYWVsdvv7fXZ0eXt7+PHy6uPg4N/f3d3f3djW2+bu8/NyX1hXWFhWV11offby +7Obf3d7f4ufs9v53cHJubW1pZWFeXl5fY2lxefTq5+Pi397f4uLm5OXp7e/w9PT9dW5oYV9d +XFxcW1xeZG179/Tq49/f4uTj4N/e3+Hg3+Lo7O/1fnhuZmJgYGFkaG5vbG1tbWplYl5eX19d +Xl9iZWhudfLs6uTf2tfV09PQz8/S1NXU1dfc4ez6c2RbV1VRT01MTEtMTk9UWFlaW15jbfzr +5d/a1tXS0NDPzs7Ozc7Pz9DT1trj8W9gWFNRT01NTEtLTE1PVFdaXmdw/e7o4Nza1tbW1dTU +19jX19fY2drb3ePq8/15bWVdWVdTTktKSk1PT1FUWlxfY2r96dzX0s/OzMrIyMjIycrLzM7U +2+j+a19ZUk1KR0VEQkJDREVGR0pNUlxq7drRzMrIx8bFxcXFxcXGyMrMztDX3ul8X1VPS0dE +QkFCQ0NDRUhKTVFXYHTo29TOy8nIyMfHx8jLzdHY3eXv/nNnYl5bXF5gYV5dW1pZWVpbXV1c +XF1dYGBnbXB69enj3tzb2tjW1NPU09PW2+Hr+25iXFtaWltdX2VqbG5ubm1vcXR+8u3o4d3c +3N/n8HxvamRhXlxbW1tbX2RobHB1evr07ejm5ujk4t/e3tva2NfX2tna3N7f5e39b2JaU09M +S0pJSkxOUVRYXWd57d/Z1NDOzc3My8vNzc3P0tjd6v1vZF1XUE1LS0pKSktNTk9UWV9odPzs +4tvW0s7MzMzLysrKy8zN0djf8m1dVlBNTEtLTExMTU5PVFtkcPvu6OPf3t7b29vZ2dbV1dfZ +2tze39/g5+19bWJcWFNQUFFSUFBTVFVWWl5ndvLi29bRz87Nzc7P0NLT1dnc4uv1e29oY15a +V1ZXVlhYWFlaWllYV1dYWVtdX2Rt/uzf2tfU0dDPzs/Q0dLU19rc3+Hk7fl5bWlmYl5aVlNT +UlJTVlhYV1hYWV5lc/Xr49/b19PPzs3MzM7R1dnf7nJkXFpXVVNSUlNVWFtdXl9gZGVt/vXz +7urm393a2tnX19XU1dbY297k73hpYFxZVlJRUVJTVlteYGh67ePd2dbV1tfX2t3e4ur4dmxq +ZmZfXFlWVFRWWFhYW11fY2316N/a19TRz87Nzc7P0NLV2d3g5/duYVtWUU9OTk1NTU5PUlZZ +Y3D+9Ozl393b2dfW1dbZ3ePr8v54cW5qaGhoa25z/fLy7+vs7u/1+/1+eXr88+7p6Onu+n9y +aWZkYF9dXVxeYWNmbXb97+vp6eTf3t7f3d3c3N3i5+38c25pZl9eXlxcW1taWVlbXV9kZ216 +/vHp5t/c2NTT0tHQzs/P0NLU2N7i6fdwYltUT0xMS0pJSUpMTU9SVVhcaG539uvh2tfSz87M +ysnJysrLzM7R1dre5u18b2ljW1RPTUxKSkhISEhKS05TWV1jbP3m3dfSzsvJx8bFxcbIy87S +2t/o9XFlXFVQTkxJSEZHSUtNUFVbYmp3+O3m39zY0c/Ozc7Ozs/Pz9DT1tjc5O54aF5YUU5N +S0tMTE1PT1NYXF9lcvvr4t3a1tDOzczNztDT19zg5urzc2plYF1dXVxaWltbXV1dXl9eXl5f +X2Robnf06uLd29rX1dTU1dXX2dre4+Xm6u/08/h+e3ZpYV5bWFVSUU9OTk1OUVdcZHPy6ePe +3NnX1tXU1dbX2Nvd3uHi4N/g4uPl6+3u93JnXlpXVVRVV1hZXF5iaW90fPt9d3Vzbmdpa2xv +e/Dp5N/c2djX1tbY2dre4+ry+ndvamhlY2JjYV5dXWBjYmJmaWlrbGtvf/Dr49/e3dzb2drb +3eXvf3Ztamlqa2pnY19cW1pYWFlcYGl2+e3o5uPg397e3Nvb29zc2tnZ2NfY3N/l8HpsX1pY +VFFQT05LTExMTk9TV1xjbfro3tnX09DOzc3NzMvKysnLzM7T2d/tbmFZUU1LSEdFRERFRkdJ +TE9UW2Br9uTZ0szJx8XEw8LCw8THy87W3/BuYFpVT05MSkpKSUlKS0tMTU9RVVtga/Xg2NHN +y8nIx8fJy83S2N/s8/txa2diXVpXVlVTVFVWWl1gaG159+rk3t7e4eTm5OHg3+Ll6u32dm5p +ZWVjZGdpa2xpZWFgX2BkZml0eXx9e/306+fj3tvZ1tXV1dbY2dze4On0/nNkXVtWUU9OTU1O +T1JVWmBqee/n4t7c2tnY2NfU09HP0M/Q09ba3+t+bV9aVk9NS0pKSkxOUFVcbfbn3dnX19ja +3ODk5u3v8fp8c3d7+u/q5ODf3t/i4eHk5ufq7vl6cGpoY19dXFpaW1tcXF1cXFxdYGZrbnP6 +7+vp5ePe29fV1NPQz8/R1Njd4OPq7vN3aV5XUU5MS0pKSUlLTE9UW2Z95dzWz83LycnJycrM +zc7R1dvi7XhqaGNeWFRRTk1MTEtNTU1OUFNYXGJv79/Z1M/MysjIyMnLzM/T19zo/2leV09M +SkhISktOU1phbX/u5+He3NnY2dve4uPh39/g4+jp6ezv8vx6d3R2d3FwbGZiX15bWVlaXFxb +Xl9jbHvw6+fh397d29ra19TT09TU2N3j7P9vZ1xWUU1LS0tMTlBVXW7t3tfT0M7Nzs7Q0tXY +2+TxdmZeWVZUVVVVVldZW1xdYGZtfPnv6+fi4d/f3dra2NbU09bY2tve5e58bGNdWVNPTkxM +S0xOUlheaHny6N7a19TSz87Oz9DR0tPT09fb5PByYVtUUE5LSUhJSUpMTlNZX2z+7OTb1dHP +zc3NzM3Oz9LX293f4+rt8X9sYFtZVFBQUFFTU1daXWRqc3x+fXd0cG1we3/37+jj4N3b19fX +19nb3N7j6vF7bWZgX19fYWNkZmxtfPX3+Xt5d3Bxc293fnt1dHh5/vPu7Ojp6ert7vL5fHVt +amlrbnX89Ovm4uLs+nNqYV1bWFhZXF9jZ215+Ovg3NXPzszLy8zNz9Xc6P5pXFVQTUxLSktM +TExOUVlfaXn26eLh3dva2djY1tTS0tLS09XY2t3i6vZ4bGRiXltbXFtbXFxeYGJfXl1dXV1e +Xl5gZGVpbnR4++vi3djW08/Ozs3Nzc3Oz9TY2+DseWpgV1NPTUxKSklKTE5QVVldYmt38OXg +3dzb2dnZ2NnZ2tvc3N3c29zb29zc4enx/H52bWhhXFxaWFVUVFRTU1VYW19jaXJ+8uzn4d/e +3dva2NjY2drc3+jt7/H1+Pn29PX8eG5tbWpnZV9gYF9fYGBgYWVpamhnZmhtcn379O7m3tnU +0c7P0dXY3OLt+3ZqZWJeW1hXVldZW2BlZmltc3v++fTs5N/d3N3e3t7c3d3e4+v+bmZeWlZS +T09PT1BQU1heav3q3tfRzszKyMfIycnMztPa5PVuXlZPS0lIR0ZGR0lMUFhfanT67OTd2tnY +1tXU09PU1NPV2Nvd3eHo7vT1/HJqX1pYVFNSU1NSUFFTWFtdYm3659zUz83LycnLzM7S2N7l ++mtkXlhTUU9OTUxNTU5RV1xfZnvq4d7Y1dPQzs3Mzc/X3ur7cWxrZV9fX15fYGFgY2psbGts +bm5rbW90ffjx7Ono5+Ph5+rt7/Lu6uvp7vb6eXRsZ2JfX2BiZGhuevnv6ufn6uvvfXhxb21s +bGxzffTw7/D4/nh0dXn78+/v7urn4uDe3dza2tvg5u39a2BcWFVSUlJSUlNVWFxhZW7+7+Xe +3Nzd3t7e3uDe3d3c297i5enu+XpybW5vcnBvbGdqaWxvbWxubm51dXd9/f/59fv7fXRtaGNf +YWNlZ2loaW1udf316+Tf2tfU0dHS1NbZ3N7i6PRzZ15ZWFZXV1lbX2RkZGNgYWRnbHByeHp/ +/318/vjv6OPg397b2dra2tnb3uPo6+/4fX15cW5mX11YVlRTVFZYWVtfYmRrevLn39rY2Nnb +3N7f4OHk5eLi4eLj4d7d3uPp+HJlXVpWUU9OTk9QU1daXmJlaWxwd/zx7OXi3+Df3NnU0dDP +zczMztDV2t7i5e93aF5aVU9NS0tKSkpLTlBTWV1hZnD/9Ozi3dnTz83NzczLzM3Nz9PX3OP3 +bV9YUU5MS0tLSktLS0xOU1hhb/Hj2M/MyMfGxsfIycrLzc7Q1t7odF9XTUlFQ0FAQEBAQUNG +Sk9ZZ/Td08zIw7++vby8vb/CxsrS3ep3X1dQTEhFQ0FAQEBBQkVHSUxRWmnz4djQzMnHxcTD +w8TExsnN09nf6v5tZF9bVlJQT05NTk5PUVRYWl5kcPjs5d/e3Nzc3N3d3+Dk6flyamRjYWBd +XF1eXmJma3bz6uHa1tHPz87Oz8/Q09nk83NmXFZRT01MTE5OUFNXWFlbXWBnbv7v5NvX1NLS +09XX1tfY2NjX19vc4Ory+XdqY15aV1VTU1RVVVVYWVpcXWFmanP+7ufi3tzZ19TT1NTT1NXX +2d7q/WxfWVVUVVZYXF9obnR7+vn69v95e3Nwb29scG9wefzu6+Te2tjZ2Nvd3uDp7fJ6bWxp +ZWRiYWBfXlxcWVdZW19ob/vq4Nze3t3d3+Pm6Ort7/T6fXJtaGJhX19iY2ZmaGx19Ojg2tTS +0c/Oz8/R1Nfc5O90ZV5YU09NS0hHRkVGR0lMTlVebfDh1s/MycjHxMPDw8XHy8/V3u14Z11X +UVFPTk1MTE1OT1NZYGh17ebh3t3b29vb3d/j5Ojt9nZrZF9cW11fX2dveH768ezo5eLd293e +3+Lp6uz0+vb29v92b2tpaGhlXl1eXl9iaWxwef358PP07urn5+ns7/Tz7/Lz9vz///Tu7erq +5+Pk4uDf4u16amNeW1hWVFZYWlxdX2dqcHl9+vHs6OXi4+Ti4uPk4+Ll5+rq7O7u7u3u7Orn +5OLg4uHj5+r3eG9ramhlYl5aVVJQT01NTU5PUVRaYGv97eHd2NLPzs7Nzc3Nzc3Nzs7P1drh +8W9fWVZSTk1MTU1NTk9RVFlfaHB1//b07erk3dnV0tDPzs/S1dvf6/t8cWhkZF9eW1hVU1FQ +UlNXXWRvc/rv597c29rb297j5+rn6efn5+Tj393d3uDj6Ort7Ons7/L/bF1YVE5LSUdGRUZI +TE9XX3Hn2tPOzMrJyMfGxsjKzdLY3ODn7vtvZV5ZV1NRT09PTk5NTE1PUldcX2t88ePc1tHO +zMvJycnLzc7R2eLudWZdV1NPTUxMTEtMTU5OUVddZXD67+bd2NPOzczKysjIyMjJy83R2OP+ +ZFhQTUpIR0VFRUVGSEpLUFdebvXn3dfRzsvLysnKy8zOz9HV19vj6/l0al9bWVhWVVRTU1NU +V1lcX2RmZ2lsb3d5+Ori3dvZ2NfU09LS0tTW2tzg8XZmXVhUU1JQTk5OT1JVV1teYmprb//v +6d/Y0c7LycfHxsXFxsjKztfkcFpPS0dEQkJCQkFFSUlJTE5QWW7f09DX3dnRz87MyMPAwsbM +zs3P09ne3uP6YVZOTEpISEdHR0hISUpNUlxqee3e2tbQz87NzMvMzc7T2+Xp6u7+al9eXl5b +XFxj/W5cU1VcYl5TVmVz7vN1fOnX09Tb5drRzs7U2NrW1Nrj+fzq6fxfVU9TVk9LRUJHS0hE +RUxWYmz93dTRz8vFwL/BxsfHyMnN09DV3+9vXFJPT01NS0lKSEM/QUVITVRl8u3j29HP1dLK +xcLDx8rMztjj6+LY2PNZU1lZUkY/THlXTks9Q2jSy39XUWTP6W7ZzMLI2tzOyM7d39TGye1Y +Vm12WEtHT1tZWFBOVmN8blVLU/LjbFhbdNvS3OPo2srExs3Pzc3P43h++2pWTU1gb1dFP031 +2/xTVGHh0+ReUV3fzc/yXmrczc/qX15929p8XG/Z0dl7aOzX2m1XV27Y3V9LSlv3/FZOWV5l +Zmpx7+xs6NXP4Fjvw7nDTT9ZwLnJZFj772RJP0dSZW9paldNU1RbfO7Zy8XPdl1d7uD1Y2nZ +0udsX2zk3+DWzMnc//bXzu1aVtvRVT8/+9pIODxzxe02LUm2s80/OUR6y8C3rq6yu3c8PErx +y8TDw89WPjk/TG/l6NvmW0Q7ODs/SFtt4Nrb2drYz8K8vsfL18/ExtL4Xm3o61VGSlheWEtF +S1RWT0tPX+rf7+HOyszW3M7L1OTozcvP3lzhY0fczbrKMSgpT7q+0drGwVUvKzJLyr+/wMPP +ZUdK+8m6ubm6w9pSQj9IUWT54+BzXl1aU1N1z8jN+VVj+n5XUV7+4m1PTFZlZmFea/j2bVxi ++N/b29jNys/d6dfU3+fez9bX70lz08rBUTcuOtfHxM3XyNBEMC43U9LExcvO51ZJTmfKvby8 +wszoVUlFS1l26ufl5XhZUl7s2tfg5eb7X1ZaYnD5+XtqYV5kd/f3+fXx8XNkYGb/6N3a29je +7v5/4OD5av3ablL43s3LZD84QWLVvL3Gxs5rQzs4PVnQx8jP8V1aVlVq4tTKyM/vWExGSExP +Wmvr187P1tnW0dDQ0tHR1Nri73xpbH54bF9WUU9PTUtLS0xOT09RWWT+4NjV0M/QzszNzc3O +zs7S5Ovd4+fpZE5OVVVddF9UXFtTW2RbW2FbVFdYVFx869zU0M7JxsfHys/W3O5nWVFNTEpM +T1VecO7h2NPU0M/X3+bzenFjWVZXVldaW11iYVtbW1xeY2567+be29jRzszLycnKy9Di4Nnk +/G5UR0lOTVh0YFdeWlBca15jbltRU09OW3P33tPRzsjHx8XHys7V6G1eUExMTE1SWmL849jS +z8/P0dff9mhaVFBPT05PU1hcX2NkZ2ptb3B+9ure2NTT0dLTzcjGx8nP2ujt6vRmVUpAPkFF +S1lZU1VXVmLu5uDg92hqb3nj1dHNycfGxcbIyszU4HtaS0VBQEBBQ0ZOWGb74NTNy83Oz9XZ +3+fq6vJzbGtv//Hv7O98cmdeWVpcXmFgYGNjaHjt5N3d6m173d7p5fZYVFxbdtHP3Njb9eLT +1NHS6mFZT0xRWV1rcmxvfPns6O71emVdVUxJSkxQWmXx2M3Kx8K/vby+wcjP2utrXldOSkVB +QEBBQ0VFRkhJTFFYaOrb1M3Iw8G/vby9v8HKzMjN4XZYRD9BP0NRUkxOSkVLV1155O50bGFj ++eLZz8zKycnKy87P0tvqblVKR0ZGSEpNVmVpcdfLy8zNycXHz9nX1uF6YVtTT1BTVVRPTEpH +RkVFSlVeXF172MvEwb68vL3FzcfBw8nVX0hDPj9NaPzseVJGQD09QklTaOvh3NzZ18/JxMC/ +wsnU62ZYTkhGS1Jecf715N3g4d3c3Nnc5+34cW1ucHzy7PptYVteX1xZVlVWV1lj/uXg4Nza +1tPS1tzt+uxjVvHb19f2TEJDRVXQwL6/y3NPSERJVWfm1NHX43VlZ/zg1M/V5G1YTk1MR0VJ +VvHb1tXTzcrLzM3T2d3k7O/+a2lmZWtqYFtbXWFiWU9OUFRVVl5vdm1qeeLZ0s/QzMzS4WNd +2MjGytxVRkJDVc+/vcLQZUpCPj5GU+/Sztb2XFRWYunX0dHddltOSkxOTFFt4dPOz83Jx8jI +y8/a397f5XtfVVNXWllTTktNUFJRT05SW2N06OLd19XRzcbDxcjN2OHlclNb3tTZ8lFEQD8+ +S+7Pys3hYVBHRElWftrPzc3Q2eTr39TOzc7Z9VxPTEtJSU5XYnf239bQzs7Oz9LX2tra3uh7 +X1xdX19cWFNSUU9PUVNYW19kZWv74drb5Pbk0cvL0dnd3t3e4uTSyMnUfFJNU1ZaZXJsZmFY +TkpGRUlOVmJ0f/rq39rTzsrJyczP2OR6X19qamxnY2RnbP3m3dze2tnW2eLq6+xwX1xcXlpW +VVVWVVFNTlNbZ2tfXXTk2trf2c7Nz8/Q0M7Q1dfd6Onk7fL6dXBkYmNeWlNQT09OTlFUVFlg +YWBjaGBebu/b09XSz83Nz83Mzc7Pz9HX5ndjXF5gXVdPUFdcV1FPVWBhX29uY2Jmd+/tfG/p +3t7a293f5uDa1Nfl8ffy93VrY2hvdPN1YVtfZ2xtXV54+PlvZ3r+fG126+Tl7ezs9vHg293g +5d7Z4/N+fG9nYV9kW1teXFdSV1hcYFty5ez57dbMztvZz83S29zZ2eN5aGhoYV5eWl1aVVVT +WF5iZWFhaW1vbW764eTr5+De5/T99und3N3a2tnW2uz3fn5zZmRdWFZYXFtXVVp2fXru6Ofh +3Nvc3Nzd3d7sfnx9d2hmZWZteXxpZ3Z8cmxpZ2VoZ2t5eW9v/fR8cfzn3+Po3tzf6Ojf3t7l +7u19cGpgXVhZX19aVVZcYmlw9urq6uro39za2tfX3N3e4N/p7/p8c2dfXl9bWVtcYWRhZ2tv +bWdmeP35+X7t4+fo6ebg6vXt5uXn7Ofk3t/r4t7k6Ph5dWZfW1dXWFhbWllcXGFpbHvw4t7e +4OTh2d3s597Y2ujxf3VsaGptaF9bWV5jX2VobPnv6uDf39za19bY2+Ph3t/sfHNwff9lXVlY +XFtWUU9QUFBVWVhfbnz25NvY0tHQ0M/Pz9HV2tzi6fH5e3h2Zm95bGleXFtcXWBhWlxeaX38 +eXj47fJ5bmdjZWpufHp+6tzY2drY2+Dn7/jz9Xd0a2dobm9kX2py9P1qevDv9fzx9fn2/ezp ++f7x6/Hv6vPz7+7ybmVjY2FeXWBpfntsbXjv8nBqbHv2fvHx6uHn4+Dm7Ozj4+nl7/R6cHNs +a2Vqb2lsdH7/bGNjam5sXl5qbWZkav78evTo3dva1tXPzs7Oz9Pc5O94cVxWWFZWUU1OUlRU +U1ZZXF9fbW5x9urk39zV19fU2NHN19/b1tfc8WzZzWRFR2zT6VJLT2JcTEpMTlfv2dzt/t/O +zM/b29LW4uzw5ej9eezrX1BX+/5XUGjlYFFmd19RVPrZ6Wflz9XrbOjQ2vn67Prw1Nl3XVZe +d+/teGFcdO/j2uxrfP10bX5rXGVjZe3a4WVVXePP0/dRUXfZ5WdWTFnUytteTl/MxNZpYe3Q +ytDka19vZ11bYmZPSlbx32hOT2Hj1uNgWWfYzubl0dhlX9DJ2HtVXN/Z2/JcUFTtzdJ1VVBp +1NhlRkRdfWFo6HtVXN3M0fp43dxu/crMWkpbz8xfRU1w1tl2bGzq1u5n8+fvXWTZzdVlT3bL +0mpWXubW3lpJU2l+e2NPSE/x22ZJRW/L1GNa5s7N0dHOzM7V0c3Mz+t0/O3qck5HSE5aT0hJ +Sk1WX2VjcHvt0s7d6NfO0NXZ1dnk3dbc+Gdu79zfXUxOZPNkTUVNbH9ZT1/z4t/f09Db3trS +0dbf9ObU1ORdUF7e2lVARFrxX05WemtMSWjR1fLqz8nP19LQ2+jZ0N1dU2T1bVlWYe3b5WBU +X9/YbE5VfG1MQklYXFp11s7S08zGxcnMz9fe2tf+T0pQUUtKUWpyTkNayMlaRlX4WEZV0MHC +w7u6ye3q5lhDRVluWll/397VycrZ6OLpV0E8PDw3NjxIXfvaxry4u76+u77L3NzT2mNSXO7o +bWNrcGdWS0hRbVhAPEzwbVJa39NwdcK97kt+yuRCP3PCvszcyMDYTUFCSEtUa33dx8HGycfC +x9Loal5NPTY3Oz07PU1+4urlzsPCx8e/vL7JzsjEytz54dfoVEhPYlM/Oz5GQzw/S2V0Rjvp +ucVJTc3F6E1Vxa2uw8e3uuVDPUFNYl5X3MTI2uHd3Nx2UVRlTjw4Oz4+PUBW2tXy5snAxszJ +vrzE3uLQzuVsf9fQ5F1ac/laR0JITkhAQVB1/FhJaL2/V0vUx/xBRNSztM7MtLdyPD1KUEhF +W8/F1OnUy9Pxa2piZFhFPUBDPz9CT+vYe+rFvsbNxb29x9PNyddtbOLdeFtecWFPTU9ORD5B +R0VDSFvf7UlHx7reU9XI1F1S2ba0xcKxtudHSVNNREZwztV+69LdXFJaZVVERE1GOjpARkVL +atDIzcy/vMHFvbu/ycvJz/9efudkUlZcT0I/SExFPj9GSkhJV+3b18zd0re6zMXBz+p+9dG/ +xc2/wHBHQ0A5NTpFTkxT8djc69vNz9zm4dxyTExcXE5T48zK0s7Cv8rTzcvW721jWExLUVJN +T1peVkxLWWNPTVpiXVtz39TNy8vJ4M66xtrN3GVWVlzs1+HSx95MR0c+OjtHWl1j1cbHy8jB +wMfNz9pvWk9DPkFERUpc39bc08vM2OTe3ndeaP1nX3Pm39/f4ufsaF1xcVdVXVRWZ2do+9/W +12JQxMNk4uRZUU5OZtLPzb6/3m5pTkNAR1dfXefKzs3HxcTHys3bYExJPzY2Oz08QVfa1dTJ +wMHKzs7Q2OTh197l2tDX29rV3XtkVlFcUUZKTEpJSk5aW2nfb0zSve3ZxPJa7O960MbGu7rI +199bSEE/SUxKVvF8fdrV1tbR1uNiVE4/Oj0/QERR+s7Jyb+7vcC/w8nN2OZ+al9eWVdgXlpa +WVBMS01UT0tLUFtbW/3Y19jU68a63NG81lV67HDv19LExNbueU9DPz4/RERLZGNq2M/OyMbG +xszZ61tHQkVEQUxe587NyMHDyMnM1d/9XVNOSkpMTldaXnZvXVlk8PlobfTm/HDq2MzK22Xh +t81RxtVLUFNPWv3pz8XN2+hqTkhBREpJSV30edzOy8bEw8PL3W5ZST45Oj0+RlbyzcbDvry9 +wMXK1OluW1lSUlleZXdtfPFvXltdX1ROTk1PT1Be8tbkT8y7683Fb/rjX3nW2c7AxsvO5Wtc +TEdMSkZNV1Zo5dvOycjFydT0V0tEOzY5PD5FV/DPxsK+vL7Bw8jP1en9/2Vda3n97+zt8m1X +VVlPR0ZGSEZIU2b2X3u8w9q+xOHY7m3Z3v/PxdDY2ehsVUpNTURETlFPX+vaz83IwcbO0t9c +TEZCPTs9Q0xSaNfHv76+u7u/x83Z62RWUUxOT1BXX2dsaFtbXVZUT1FRTk9SXGh+5NjNycfH +xcTIzNDU2Nvj5d/f4/V1Z15XUVBOTk5NTU5PT09RUlVaXmd77+fc1tLPzczMzc/Q1d3f3+z0 +8/T2/nR6eXV4eW9raF1bWVdVVlZXWVlaXF1cYGhve/jt5+fm4N3b19PQzs3LyszO09fd6H9p +X1lWU1JQT09RVFVVWFxbXmBiZmlrde/m3tnX2NnZ3d7i6+rq7vHw7+71/Pv5fXh2a2lpaGxp +aG90dXj08Pf5//t+cnF2c3B0enRx//1++PDt7e3r7fT1/3Jxb3N7/vnx7Obj3tzc3uHi63xv +a2RfYE9Xx2g8Q2jZ6Vpc4e1LR/7tV0jauL53b8/KX0r0wsle/sTCckhWzM5RS+/UYkxc0ddL +Q1VjSj9M6t9p/MvH3Gjnz+NXWt7W/V/izdD6/tfN2Ornz85qWl5mWEtNV1lPTVVaWlZVXWdf +Yvn8bvfe2NXT0crIzMzKycvQ0dPU5Hd3bF5VT05LR0ZHRkVHSk5QVl5g9d7c2dn02LvA2dXH +z3VQX8u/yMW6u85XSkg+NDY+SEVJZ9TT4tjIx9Pu6upbSEdMUVddZvzRysvIxMTByNnn6m9e +VFlgW1NUWl9aU1tgZGFST1xYTE/i0fD22tDL0su7yF3DusfOTDpETEBKyrzEx81kQzoyMjg9 +UNjKyMLFyc/e3trW1dLR1+b+bV5ST11wWFXtz8zNz9PO3VpMUE5FQktl8XBp5uBvVlVcY11b +cdzZ4d/Szs3Lzc/Y1dfXzcnvQWy+z09DOzxBPDpzuLrJy9hXPjM1Rn3Ov7m4usTeZV1fZvHc +0dLgYExDPj0/R0hKa8/Kzc3Hw8x6at3Y4e7kz8nQ39/rW01OTU1WZGZfWlVWUkxJVefcdnLl +18zMyNNVy7W51U8+Q15PTMavtcl6PzUzMTRF2L+7wdd3WEtHTm7Ov73Cy91gTEE9QlVtXmvQ +xMXX/drI0lhQ9czM+Vp91t1kVFZna1NMVXHs6GtXW1pWWF1Ya83Ez39y2cfC0VBB4LzHWkJC +T3VPR8+0uM9dRD5BPj5Tzr68wtX5bGFbZuPNxcbR+1dKQj49RE9OTGDb2eN0/NDN81vuz8nM +193W0dfZ2drb4vxpZ254d15VTkdFTFRWWv3V1nFOV+LRz+pOS8y7xHlIS3fZX1PHtbfGcElC +RkFEV93HxdJoUE1MTVRo283R43leUElJS01X/tzRy8rMy8fL1trc0snJ31hg6eBvT05UV0tC +Rk9VUE1PVFZVVV1x6M7Exc/Z0MnAws7Wcu++us9EPVDtbT493r3FVz08QEE6PU3ex8fU5uLd +5u3dzcG8v8jX73hZR0FMX3d3Znna3WJUX+fedmV55upsYnzV1mZTX+/uZFls2NxfU2Pu/F1b +6dPrW3jPyM/sa1bsxMxbRlTs6VRE9Lm75lL16FA8OU3Yz+r829LnUUhV9dzb1s/R33ReSkNO +Y2xgbtzJyOJv4tDO2OLj1tTf4N/pfm5kYFtPS1NiW1FUYW5aSktm7m5SVPDUzs7I117NusNX +S+bI0EhGw6+9X2nP5UAyOl36T0/o0/tHRlz8XVvaxsv4YufhUUBN7/pZXd3GyenmxsPU5dnN +1H142tPuYWlrXlJNT1VOTFRbWVNYX2BfavPw7+fdzcPD02fbvslYTWvb90dG38LQYufQc0Q8 +RExJTXLV2d/e0tLr7NTJy9HZ1NViS05YSkVMVF9eWGjc2+nZz9Lf9OXf5/7h1+Rw8t95XFps +eFtZZG1hX279dWpha+fm6tHHz/zRvs9haed7T0ZO9u9eY+T1VUhFR0RASVxfadvOzs3KxsPF +yMPCzd/j/F5YV1ZZXFtfbWpkZntzZ2RmX1tWVFdYXGRvc3b/9fjt6OHf3tvW1NLS3N/e3+Di +5eXm7mnf31xbblZOT05OWWJgbujqfP5ybmReYnx3eurd2tPOzs/My8/c5/NlV05MS0lKSkxP +W19v6eDc1M/T1dTV1tnd3uDl7uzq7vp6dm1nX1taWVZUVlZXWl1fX3L5+uro5uLc4t7W3N7f +4dvX2dzW197h5u979vtuZF5cWFZTT09QUVJTVVhcX2Jr/u/m39/d2tnW1dXTz8/Pz8/S1drg +5/pqYl9cWVhWU1BPUFBRU1RVWV1ia3d+++/p4t7c2dfU1NTV1Nba297i6/Ty7+7v8f5yb25n +YF9eXl5eYGNiZWVjYV9fX2BhZWhqbHZ/9PHt6ujk4d/f3t3c3N3h5ufq7/f5+ff4+fr18fX7 +9/L5fXhxbGlkXVtbW1lZW15lbXn37+3q5uXl5ebq6+fk4d7e3uHo7/x/f3x5cm5saGJfW1la +WlpbXmFqc3n78Ork4OHh397c2djX2dzd4et6amdkYF9eXl5iYl9fYWdqamlrbGxtc/338+7p +49/c2NbV1NPW29/i4+v4eHBuZGBeXVxYVFNUVFVXWFldYGZtdvrs6Ojm5N7a2NfY2dvd4eTl +5+zy+Pr+fn5++/t1cG9zcHF2cnBuaWVhZGVla3N5fPz+ff7+//76+//78fDv6+rs6uv0/3dz +cG9ucG9xdHZzcm5vdHV9fvru6+vs7Ozt8fb8/X54eHt++vLw8/X18u7r6Ofl5eXq8P9xaGBb +VlZXWVlaXF9obXN98+rp5uLf397d3d7f3+Hk5+rq6efr7Ozy+3RqZGBdWlpbW1tbW1xeYGRu +/e7j3tvZ2NjY2Nja3OPs/W1kX15dWltcXl9fZXBzfPjv6eXk4eDk5unt9ffz9fjz7+/y7/D2 ++v18dm9tamhqaGVjY2RiZWloa3R5efjx8+/w8e3o4t3b2djZ2t7k6/t1b2tkX1xaWlhYWlpd +Xl5gZm959ezj3tzZ2NfY2Nna3d/j6/d5bmlmY19dW1xcXV5fY2VpdHr99u7n4uHg4uDh4+Xn +6u74eXFvbGha7ORKR8/FP0nLz8zUVFHCwz5M2WxWds7nT/prWv5tVfHJ/FB+8W1179/f0N/v +3eZ67/nu7u/tfW5qXlhcW1xiZWRnbnVvcvPz7OTp7O3r6Ojp+ezu7ep6+n7q4+zf3eLl4O31 +6W5vZFpjWFhcVFpVT1taWV5p+e/y6t3X3t3c3NPb2tPa2drl3tzw6eZxZWZrYl1cXWJlWlNb +XFdbWWXr5vv9+2Z3bHfh7ePX1Nfk4dbV49zb4eFv/v9uX1ZcYltQU1hXVU9WWllydW7p1tXb +3dnQ1drZ2tng8+nsfvvo7ejr+fhvcG1tZWNoZVpTVVlVV15kaGNs8+716NjV7m3v3ulvb+jg +8P5/7+Xc83Ps3+l469ze8PzvdFpf4tfoW1n0eVVOXfBnVmLyaVtcXXLxd2Tr0+hh68zTanrS +z+Pr19T3bN/Z73Dh0ddrWWj5WUtPYGJSTVJSTUxQWFxvb2dg+NnX2NHLycrP1NHIw9Nz0L7S +TUxTZd1fSVbkTTpY30lA4cpgWu/f5VtPXOVxSFPY1mv0y8bW7eLazs/b9N7M0G9LTHR3UUlc +3ud49t/sa3r8enHp1ehkbnlr6NTecmhQRU9hbu1PS8m6bTlH1+5DPui0ttrUtLhWOETyXEJc +wL7dY+rhVUVS1M3rb9/mW0tFR01KRUtm+nZ86dTJzNbYzc3f69bN1uzbzdhwYvDcaE1Na9xu +SEthbkpFV059vMdbTufhSD9I2bO1ysi90jwwO0lPXN7Avs5nXG9hV+rKwsbJzvxQRUJIRUBH +bOVx/dnOzM7V2NbS09XX1tjecV1hc11QUFxQSEtbdmBNT2BrX2hYVcO30U3mxvNCReWyrsbY +vcZBLzhKS0tszMbdUU1ZWk9ezsHEy8/S3llCQVR+XVNtzsneWnjKy21e3c3fX2bj2mpTZ3lX +TFFpYE1OZuHmXVZrcGBo6+lb07i9a1Tc2Es9SsWvvezOwmY2MkJZaPTOwMd1T1ttX2XbxsHL +2/NkTUJDRENPbnZcXuja6Gl11cva/93KzeDu1c3ab2B99mFaZXtsUlBfbWBOT2R/Xlfg5WPN +w9xcZF5GR17XtrLDzMf5OzM/V+3Ty8DC3FNLV19k5M7Fyt1lT0lDPz9FT3XyZmjp1d9w3svG +0fPczM7sddTN4Wxs72lPT1/yZlFWXF9dT0xX+vpp9c7Oa93Fx9phUVFk7eW/tcDZ91dBOTxH +Ztvc1NZ6U0xSY+vSycHDz+1aSkRHSkxPcNva6frg1d3l2cvK3PXn191kXnVvXVJWXVxYX/36 +ZWFqbF9bfdfcYWPez9jj7lfxwsn0V1FOUltbzri91vRoTkA+SH3P0dHS71tLTGHi18/Jx9dl +SkdMRkBM8t1wWmrb2Gtb1L/D2ePMw85tfc3K7FRW8etVSVRtWUpJT09KTlpbT01e18/68N3Z +wL3NYmzU0eFp17ayw25g8lQ9Oknn2mlXVFdNREZU7NrW0NHkXk9TV1JPXN/T5Gly2s/W39fJ +x9Lm7NjR3Xp64u5dU1ZbWFNZbm1TTVRiaFtXd9jabF7mz+vezMvP8ltNXnV4z8LAyN9gST8+ +Q1Zy3NPd+WZZX27gz8bCxcvfYlVOTktITldoYVNRXftzbfXd0tje2NPS2tzY09jm5ubq/Gdd +XmZlWVNSWlxUT09n4vhiavFk6cnIz/hfZPJ+X9O8ub/ZZlFGPz5Ja9vX72VfWFhUXufOyc/W +6G1dTkhITVv88Whm7N7e4N/UzMrMzM3S2t/f2+HvcGhoXVhQTk5NS0pMTkxIS1hdYWzq2dbo +ctS/u8PaedjK0ObVvbe93FROS0I7Pk1uclBKSk1OTFXyz8rJzNPZ6XRgVFRf8en39ufX2e18 +c/Ls8P3p3+jvcnzw9Hx2+e/6bWNkZGRaVVthXlhaZ/30e/3e09Ta3t3c19jb2uf/aWVo++Lc +1dTZ6GFSTU1RW2hqdm9lX2BlbPvq4uPqfWpjXFhWVlheZ3b2597Y0tDQzszNzs/P1Nfd6/l3 +aWRjX1tXUU1LSUpKS0xNUFZcZnzp3NTQz83MzM3MzM3O0tfd6PL9eXdycXFoX1pXVFJSVFda +Xl5dXWRra252fXl6ffz27ebl5ebl5eTj39/f39/e3t3b29zf5uju+nVrZVxaWFZWVldYWlpY +WFdZXmh69+Td29nY2tza2drc3dvb3uPo7e/4fXVvaGZoa2xrbW5taGJiZ2dmZmlra2tucGxp +ZmdscHr06erq7PDt7evo4+Hi5OTk4uLk49/g4ePq8n1qYF5bWVhZWVtbWllaXmJpdu7m39vX +1dTU1dfc3uLt9X52bWZhYGFjaGxtbGtpaWhoam1ucXVzcHB2fPft6eXm5+Xm6ujq6ujo7fZ4 +amZnaGpscHNxa2Zpbm9y/PLr4d/f3t3c3+Xq6/H5eXVvZF5bWVhXV1hZW11kb3v26uHe2tjX +1tfY29/m7/Z+dnJweHZ0bWxraWloaWttbm1rbG1ve379/Pjy9X95e3h2eH1//f/89e/u7O7v +7/Hw+/z29O7r6urr7ezv8/n9d29qZl9cXF9jY2htb3Bz/PPq4d/e3dza293f6PP8c2dgXlpY +V1ZYWFhbXl9kam7+8+jd2dfV1NPU19ve3+Lj5ufp6u72eGxkX1xbXV5eYWNiZGdpbHNwb29u +bW1ub3B3+/Dw8O7t7O7x8e/w8e7q6ujn5N/g3t3d3eHl6PN2b2pkXl1dXFtaV1haW15kbv7v +6efn6ert7/Du6ePg4uHi5+74+/x5cG5ta2trbXJ88+7r7u/r6Ojr7vp2a2FeXl5eYWdtd/71 +8u3p6eXn6+3s7O709vr9/Hp4dG5qZmNjYWNnbnf57+vm4eHi5Obq8/n7fXx1c3V1eHV1en35 +7+rn5ufq7O/9eW9qZmBeXl9fX19gX19gZWhtefbr5uPf3dvb3Nva29vb297i5e9+cm9vamZg +XVtbW1xdW11eXmFlbHb/9Ozi3tzd3dzd3t/f4+z4fm9pZWFgX19eXmBkZmlucHd/9+7n4N3b +2tjV0tHT1Nbb4fB5al9bVVJPTk5PT1FUV1teZmxvevXs5uLe3tza2tnZ2tvb29ze3+Di5Ofu ++3lwbGhkX11cW1xcW19jZ2lqcv718e/s6uvu7/V8cW1ubGtrcf/17ezp4+Dd2tjV1NXZ3+ty +Zl5ZWFVVVlZWWFlZWlxfYmZrdHnw6ePc2tfU0tDP0NHR09XY3ODq9XNmYF5cXVpXVlRSUlNT +VVdYWllbYWVrd/jr4+Dd2djV09HPz9DT1dfa3uPt+nZoYV5bVlVVVllaXmhueP728/P6fnRt +bW1tcHVzdnd1cW9uc3v++vTu6ePh39zc29va2dze4OHf4+bo7Pn+eW9nX1tXVFJQTk5OTk9P +UFNYXmd47eLc1tLPzs7MzMzNztDV2dvf6O7v/W9uaWViX19cWFZTUE9OT09QUlVZXmRsfPDn +39nU0c/Ozs7Ozs7Pz9PX2tzj7P5rXVZQTUtKSklKSktMTlNZX2l57ODZ1NDNzMrKysrLy8zO +0NXZ3efzb19ZVE9MS0tKSkpKS01PU1heanry49zY1dPQzszLysrMzc/R1dvh7nlmW1RST0xK +SUlKS05RWmV17uTd2tjW19jY69m/dUbb4s7MVenVePhZ8dVWWODS3UZkx09VPk7LXO9b+sxI +VFVa+UXn2uvOadDNftDezszp0OLQ3FZ3ZGtmT2x63W153GzpXE9gSE9NTktPa23i7H7Qz+Lv +ysrM1+/KydFc6dP8aVN32XJXV/9cU05KdFlHUWFtT1Pk4tJ6Zs/K2Vbeys7Y6tLF1FVozPJg +U1zSd0tP2mZPUlfnbk9f7/hX/Nn9fmfhz/NV98rZYm3c0edcfs3QbWPb025OWfd0TkhVcFtK +Tn7naF372dzr5NbR1t7Vy8/c2s7T5n7/3uFsW2d+XVNWVE9JRkpLRkNOYmRZXeXU2t/RycfK +zsrFytPQy83X6eXe8WNbY2JUTFBXUEpJUFZOSlBfYVhZde9+debV1tzXysXN2NDIyNbe19Le +b19hXlFPT09PTlNaWFNUbPxtanft5PNy9N/e+3De0Nnz9drY3+/r1M/Z7N3Q32didW9aWFlR +TUxOWl1WWu3b7nXq19PfcGZzZlFLTVVcYnXdzcfEwcHBv8PJ0t/sdlhKPj9TTUBLTUlISUpU ++Glk2cfO4trUz9Df6N3U3/Tt3NHP0M7IxcrU3N9wTT48Pj05NjpBSUpR7s3Ewr66tre8wsXJ +1HdUVFZOSEBCSEpKS09VXF9ZVHjT1NLQ0s3Hyc3GwcHBwsrY42lWS0M/Pj48PDw/RUpSX/fT +y83S1c/M0vln/ujubG7j0srKx7+6uLq9wMTL3l1PSUQ/OzY1Nzk4OTs/SlFNVdvMzM3NzcfC +xsa/vr6+wMfKzNbncFpST0pGRUZKTVBVadrb6OHm4N9tVVRVTUdERU1ZaPrYzMS+vby7ury/ +x83P23NUSkVFQz8/QENGR0VOY2RkXFVUY2tk/uXbz8nKy8nJycrO1dre5O57amx87uvf1NTX +4H14clxNSUZDQT8+QUlSX/bbzcXAvr2+vr/Ey9Dd/1tNRkVFQkNESUtLVmP83vBpa+bZ19vp +4tLO1uD1/Oji8G1lZ250bGl169vU0dHNyc7Z8XJ2bldKR0dLS0lKU2nm2c/Mx8LCxcnO2el2 +X1dMRD9AQkJAQUVLT2D72c/T1dHKxsPDxsTBwsfN193e6mxZT0pJSEZGR0tTXmh56uHj72xj +a2tiWVRVW2JocevXzcjFwr+/v8HEydDd+2FWTEQ/PT4/QENHSk5h8N3Z6nrr19LU29vTzc7W +4v94/m9eWVVXXGVqfuvd087Kx8bJzNXf9GhYTkhEQ0JBQ0hPXXng1cvGxMPExMfM1t/sdlxN +REFDRkhJS01d6dbNz9zbzsjJzdXUzczT6lxTVVNNSERER0pLTFJg7NTMx8PCwsXM0tjgd15Q +S0hIR0dMVmvq29HKxsLBwsXIzdPd+15PSEVGR0VFSk5PV2fl1dx4avPe3OdvcuXb3ehxavrs ++2lcXWlvb3F68t3Ry8fFyMrO1t31YlRLRUJAPz9ARlFj7dnNxr+9vb2+vsHL2+1yWkk/Pj9E +RERHTV3p2tbZ5e7p7Pn9bW/s6PtsX15tc25taWZscXJv/uvZzsrEwMLHy8/T2vRdT0lHREA/ +Q0pWZnvj08zHxcfJzNHd9WFVTktJSElLTVFbdOPa19XPzc3O0t3pe2ZdWldTUlBUWVhaXGT2 +4OT3e/7x9nfx2MzHxMPCwMDGzt38a11PRj89PDw9P0VOXuvWzcnGxMLCxMjLzdTZ6HNfWVVP +SkdFRERERERFR0tTWmjv3dTPy8bBv7++v7/AwsXIzdjlcFlOSUdFQ0JCRUhOUVVZX2x19uvh +3t7d2NTT1NPQz9LV1trc5PH7b2VdVVFPTk1MTE1OUFJXXmp1/+7m39nW1tXT0dLS09LP0NPV +19rf6vP7emxmXllUT01LTE1PUVVaYW356t7Z1dHP0NTV1tjc5OrzfW1lYWBfXVtZW2FhYWVm +amtma292fXVuePr5/X769Onk4N3c29rb29zf4uTl5+zu9/50b29tbWtoYV1cWVlZWlxfXmFs +ffbv5t7a29zc3N/p6Ofu83htaGRfXV9fX2NmbXJ98PPz7Ons9e3o5urv7+zm5+rp5+jv/Xr8 +fv10aGtubW1pa3J4fmtkY2JfWlldaG1sbuvf4OPf2dXX2dze3d/s8/V3bWxoYF9dXl9iZF9l +duv4b3vu5+39/fbo3O1ibdrV3+/j0M/uVVJn+GBUXO/kd15daHlvXVdXXF1YWV9nZ2Fm++Tb +2tfRzs3Pz87P1NnZ2t3i5OXh4ubu9vNsXVpaU0xLTE5MSkpLT1NUV15xfXf43NXc5dvR1N3e +0szLz9LQ0dvw8ebwaWFuf2thYm50YFZPTl35bFZNUGf/Ylp608zV7OHQ0/Vgaezg+G/r2NPb +5N3S0dzq93BaSUFFSUU9PEp843vtyby+zNnLwsv7X+fO21tRb976XWHt429RS05PSENGSk5U +WW16aNi/vcPKzcbM/1zhwr3EzsjH7Uk+PkVEP0FOcOz679rO0N3s73hYRz89PT0/R1d938y/ +vcDCvrm5v8nBvMdwVmnmZUlHWWJKPT5HSD89SFhQSE//8WJo1MDE1NjFvsfj3svL3ejd3VVS +w7nLTEDuzE84Pcy7zFhY2eg+MDI/SkRAVM3Ez9vOxMLO183Fzepu/vJoT1Jv339g9dPNztbO +yMbS9XBlWlFPUFRSUVBPTU5OS0lHS1FPUF3r2Nfh483GyMfFxMLBxM7Z19fN0O3wfU5r0XxI +PT1Y+UE2Rs3F6EtM7Hg9Nj9b6OLey7y7w8zMyMXN1c/Jz+ZjXFNGPTxJXU1BSt3GzXFf1cng +TljQzPxY3L7CYkhxx9RKQnTL60E/aNFnR0/j0XtOW9TIzd3aycv8V1Rt1HBLW8zF2EQ/3brJ +RztMzchPPWC9u85dUPh7Qjc7TfbkfO7SzuBpYfzbzcnJycrR6WVWUU1V9NPmYd/Hws14YtvT +Zkta9nNSTFBjVEdESlNXVU9ZbGtv8d3PzNLd183LzcvEv8DJ0tjd72VdUk1NUE9PTEpKR0JF +UGf7YFNn1dfp7dPCvMTZ39nvYFld7tnd7mxfYXFlWl7t1tfkfO7mcFNLU2v3WVXfyMjjXW/S +111Oec3UWklR3t5VS175alVObdbhYnPT1HlWXtbK2XfcysbRdXnY1e9qePxoWVNTXGhaXVhN +S1FPZ978XFdMXc/QePHKv73H6fjT8E1KV+nP2fTh099oT1L6099mafL8VUE/TGFRRFfPyN1k +7sa+zmbgwcH8Ve3Ky2xLVuJsSEVPXVhMTFZbTUlW8Nztdu/VzNLXzcG+y+TgzszeaWN43t/q +6W9aVEtIVeFkSEtMS0hAQ1zf+n/Pz+b6893b4tnGvsPKy83M2nx/4dzj9WZbV0tEQ0VEPT5L +c+1obN7P1/l618XL29fNytV4ZtrM4Vxw4epcTFXrdklFW25USkpl4GNO+cvO3+zk3+nt2cvN +1tXSztltaNbN419dZt3ZZE5RTURCSEpRY/f2aVZYcmRNXtHGz+7cxsXmYtrHyt3r18nRY2Hj +4FM+P1LtYkpV2c9qTV3Vy95o7NLeX2bo6fhcWGtoVFNfXFRcX2VrZ23l0s/Q0tXPysrQ2dbT +1N9ibOltUklMU2NmTEtQTk1eYXFxWOvCyFFDfMbF4V3Mu8dRUdLH4U9U2tdSSFnj311PZexZ +RlHt2+hv5tHXX05Xbu3m69zNzM/a7u/b2flr/t3Tek5UaVJDQkZOUUlLa/JaVnvc1dTSycPG +zM/LxMLExsvQ1e5TTlhaWVJLSEk/OUFUT1VVVfblTUnhz9bM0c7GzvPpy83UzMvOfk9uz9xO +S37P2kk+Vdl6SUpv1tpv9NLW7N/R03FVdNLXV0pk2/ZKQFDc4ktEYdPcXFbxzdBkXd3WdF3q +z9D/YuDP22d2z8fSee/Qz3VV/s7UX0xRdvJUSFvdeUc/TejjS0Bf1mpHTfHbam3KvshiY8S4 +xl/qu7bLTUrv01Y+RXzvST5EWl5LSl/Z3mJr187W39fPzuBiat3a6/X+8OHqXlhfaHbx+fl/ +Y1zr1/xbWmTv5Gpd/N73cmhcZuLecmBo6dnyV1vl1N9pWmrsd2n439rf4OHt/uzc4vfq29ba +eF/15FtPYXRfaVlOTlVOUFhUW+7fe2Ro+NrP3uzYzs7S39zMydXr39rhfmz76nRVUFJNSklL +TEpMXu9vUFXlzM3e3MjCy9fPw7/L4tvR2mNVVU9NTEpHREFARUpJTGTv+vbm4d3SzcnHysnE +w8jNz8vJzd/o7mJST1FRT01JSEpKS0dFTFZaVVJf/vh99dzLxcjLysfFx8vKxcLI1etpaHFc +T09SUE1HQUNKSUhNVVlYVVhjfd7OyczSz8fHz9jPxsbO53Ty5/hx/vZvX1ZQUE9OTE9RUVFP +T1hgY3Ls3NXU1NHLyMnP29zV0uBuYf3Y3F1PW+z3WExU6uhaT1JaW05KUWRqZmNqftzb2NXT +0M3N1dbT1dfY29nY3eTi7W1aV1dWUExLS0pJTVRaU1Vw1tPr/drKyNbm1cjK4Xnu3O1fXHvi +9FtVY29fWWF5+2JYX+/tambu2dno8eLY2+jz7ODl/WplZGZhW1haXWFeWVxpdHZ+69/c2trW +1dne5uzp6e92aF9cW1teY2doamltfPz++eje3d/r4djW19zZ1trlfHVuZ11ZW1taVlNVWFlW +VldaWltkdu7m4d7d3N3e3tzb29vY1tbV1tfX2Nvc4+97bGJbVVBOTU1NT1NWWV1haXj57ezp +5eLf2tfX19fX2drc3+Xu9/x9b2pmXllTUE9SVVZZWV1oePvw5t7b2tnX1dXV1tTV1dfZ3OHq +8XVjWlRRT09PUFJVVlZbX2Zrb/rr39vW1NLS09TW19vf6Pd1a2JcWllZWlxfZWpzfPz19n15 +d3v/+vn3/np8//X28u7y6uXg3t7e4eXo6Ovv/Hp4cWxgX2BgYGZrbW1qZ2NfX15fY2Ztd/3v +6ufi39/e3eHi4ePk5OXl5+vv8ft2bWpqZ2ZlZ2dobXF7/Pfs6unt/3FqZWBlaWptbnBubHV6 +e/98dXN0d/rv6eTf3+Df397e3Nzb2t7h6e38bWtsZ2RhX11bWFVUVFJRU1NVWFteZnX05dzX +1NDNzc3NzMzNztHW2+LsfGtlY2FcWVtbWVlXVFJTUlJQUFFQUFJTVltkdevc08zIxcPCwsHB +w8XHzM/Y4PVlV05KRkRDQkNDQkJERklNU11u797WzsrIxsTDw8LDxMXIztLP22hUTktMTEhG +SEZBP0FDSVVm9t/Z2NPNycbEw8XIzNHX29zc3+t1YFhPTEtJSUtMTlBRVlpiduvb19PQz87M +y8vMztTc8GxhXFdUVFNSUlVXW11gZWRgXlxeaHzx6N3Z1NHPzs/Oz9DT2N7l6e32dWZdWlhS +Tk1NTk9RU1ZbX2FpdPno39vW0dDQzszNzc7Q1Nfa2+LvdmZeV1FNS0pJSElKSktLTlNYX2l9 +6d/Y08/MycbFxMTExMTGyczS2eD1bl5XUk1KR0VEQ0NCP0ZKQ0dFTmFfcvTXz9TQzMfEw8C+ +vL7AxcvQ2+1xbGBdWFRTUE5MTExMTUxMTExNTU9UWl9ja/rj2tTPy8jFxcbFxsnMztHT19ze +5vJwX1ZQTEdCQEBBQUJESEpNU1tn9+DXz8zIxMHAv8DBxMbIys3P1Nvk/2JYT0pGQz8/Pj4+ +P0BBRUhOWm7j1c3Hw8C/vr6+vr6+wMPHzNXlblpPSkVCQEA/P0BCQ0ZJS01TWmr349fOysfF +xcTFxcTFx8nM0Nbd6ntlWlNNSUZGRkdHSEpMTk9SWmNz8eTZ0c/My8rJycrLy8zO09ne6P1r +YFpYVFJQTk9PT1BSVlhaXmBmbXj27u7s5t7c3Nzb2NfY2Nrb3uPq7/f//Hp2cG5sbGpmZ2Vk +Zmlqa2tqZ2ZmZmpsePTw7enm4eDf4OTm7/l5cm5naWxzfX/+9/Hs6ebk4+Pk5uzv9P11amBf +XltYWlZRbFpfZFr+829y7+HX3+rc19nb6OHb4erp5N7g8+fk4+b8ePl8cWpocG9iXVxcXllV +Wl1dWldYXV5dXmRv9+3o39va293Z09HP0NLT1tjZ2tzh9XlvaGJeXFtbWllYWFlZWVpbWllZ +W15lannw5t3Z2NXQz87Ozs/S1dnc4/hvZFxVT05NTExMTk9PUldcZXP56t7X0c/MysnJycrL +zc/U2N3h7nprY11WT0tJR0VEREVHSUtOU1tkb/Xj2NDMyMXCwMDAwcXIy87U3el7Y1lRTElH +RUNDQ0NERUhLT1ZfcO7c1c7LycbDwsHBw8THys7T2OP3alxVT0tIR0ZFRUVGSElLTVBWXWZ5 +6t7Yz83LycjIyMnLzc/S1tnc4+38b2NbVU9MS0pKSkpLTU9TWV5o/unc1c/MycjGxsXFx8rM +z9jkeWZcU09LSEZFQ0JCQkJER0tSW2rv3tfOy8nGxMLDw8TGyMnKzdDX3ux9ZltXUk9MS0lI +R0hJS0xNT1NZXWRrc/fq393Y0s/OzMrJycnKy83P09jd4en7a11XUU5MSkdGRkdISEpNUVhh +du7g2tTPzs3My8vJx8jJyszP1NzpcV9ZVFFPT09PTk1MTU1OU1lfZnJ/9Onh3d3c2tjX2Nna +293d3eDn7fD8e3Z0dnZ/8+/t6+3u7+/v8vh5bWxoYl5bWFVTVFRVVVdaWltbXmBp/Orh2dPO +y8nHxcXHyczP197pfGpfW1dRTkxJSEdISkxOU1heZ2786uDb1c/NzMvMy8zNztHW3ODm8Hxs +X1lUT09OTU1MS0tLTExOUFddZ3bv39jPy8jFxMLCw8TGyMvO1N3q/WthXlhSTkxKSEZFRURF +RkdKTVBWX3D55NfPzMnIx8fIyMjIycrMztPa4vBzZl5XT0tIRkVERUdJTFJZYG745dvV0tDP +zs3Nzc7R1NXX2d3j7Px1bGdeWVVTT05NTk9SVllcYGp09+rl39zb2tra2dna2NjZ2t3h6fxy +amZhYGFlZmNiX19dW1tcXmBkaGxucHf/9erh3djTzszNzs7P0dbd5O37dmNdWVVVUU9PT05N +TExMTU9RVl1q/une19PPzczLy8vKy8zNz9TZ3uTr6+/9eGteV1JNTEtLS0tMTk9TV1tibn77 +9Ozn493c2tfU09LQ0NHU1tjZ2dvf5Ovt/Hl3dHJtZGBfXFlVUU9NS0tMTExNTlJZXmzv3tXP +zMrHxMPCw8XHyc3T3O1uXlROS0lJSUpMTk9SVlhcYGVsfu/k3trY09DPzs3OztHX3en9aV5Y +Uk9OTU5PUlddYGVsffDq5N7a2tra19bV1tfW2Nrc3uLq83pvaF5YVE9NTExMTk9RVlpfaHPx +5eDf3tzZ1tTS0M7Nzc3Nzs/R1tzh8HhmX1xWU1FPTUtLTEtMTE1OUVZcZXD96d/c2tjV0M3M +y8nIycrMztLZ4Ox+a15aVVFPT09QUlNWW19gYGZtdP379u7p5+bn6+3t7/Hy7+7u7fl9e3Z2 +dHd4//rx6OXj4N/i4+Pk4+fn7PD6dW5ramppZGBfX11dXmJnaWpoZF9fXVtdYWp2/uzh29bU +09DPz8/P0tjb3+Xj6vlvY15aVFBOTUtMTk9VWF1hZm12+evh3tza2tnX1dXW1dTW2Nnb3uDh +4+Lj6/t3 +--hal_9000-- +--owatagusiam +Content-Type: MESSAGE/RFC822 +Content-Description: Multiple encapsulation + +Received: from tomobiki-cho.cac.washington.edu by akbar.cac.washington.edu + (5.65/UW-NDC Revision: 2.23 ) id AA17676; Thu, 24 Oct 91 17:34:03 -0700 +Date: Thu, 24 Oct 1991 17:32:56 -0700 (PDT) +From: Mark Crispin +Sender: Mark Crispin +Subject: Here's some more +To: Mark Crispin +Message-Id: +MIME-Version: 1.0 +Content-Type: MULTIPART/MIXED;BOUNDARY="16819560-2078917053-688350843:#11603" + +--16819560-2078917053-688350843:#11603 +Content-Type: APPLICATION/POSTSCRIPT +Content-Transfer-Encoding: BASE64 +Content-Description: The Simpsons!! + +JSEKJSVCb3VuZGluZ0JveDogKGF0ZW5kKQolJVBhZ2VzOiAoYXRlbmQpCiUl +RG9jdW1lbnRGb250czogKGF0ZW5kKQolJUVuZENvbW1lbnRzCiUKJSBGcmFt +ZU1ha2VyIFBvc3RTY3JpcHQgUHJvbG9nIDIuMCwgZm9yIHVzZSB3aXRoIEZy +YW1lTWFrZXIgMi4wCiUgQ29weXJpZ2h0IChjKSAxOTg2LDg3LDg5IGJ5IEZy +YW1lIFRlY2hub2xvZ3ksIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiUK +JSBLbm93biBQcm9ibGVtczoKJQlEdWUgdG8gYnVncyBpbiBUcmFuc2NyaXB0 +LCB0aGUgJ1BTLUFkb2JlLScgaXMgb21pdHRlZCBmcm9tIGxpbmUgMQovRk12 +ZXJzaW9uICgyLjApIGRlZiAKJSBTZXQgdXAgQ29sb3IgdnMuIEJsYWNrLWFu +ZC1XaGl0ZQoJL0ZNUHJpbnRJbkNvbG9yIHN5c3RlbWRpY3QgL2NvbG9yaW1h +Z2Uga25vd24gZGVmCiUgVW5jb21tZW50IHRoaXMgbGluZSB0byBmb3JjZSBi +Jncgb24gY29sb3IgcHJpbnRlcgolICAgL0ZNUHJpbnRJbkNvbG9yIGZhbHNl +IGRlZgovRnJhbWVEaWN0IDE5MCBkaWN0IGRlZiAKc3lzdGVtZGljdCAvZXJy +b3JkaWN0IGtub3duIG5vdCB7L2Vycm9yZGljdCAxMCBkaWN0IGRlZgoJCWVy +cm9yZGljdCAvcmFuZ2VjaGVjayB7c3RvcH0gcHV0fSBpZgolIFRoZSByZWFk +bGluZSBpbiAyMy4wIGRvZXNuJ3QgcmVjb2duaXplIGNyJ3MgYXMgbmwncyBv +biBBcHBsZVRhbGsKRnJhbWVEaWN0IC90bXByYW5nZWNoZWNrIGVycm9yZGlj +dCAvcmFuZ2VjaGVjayBnZXQgcHV0IAplcnJvcmRpY3QgL3JhbmdlY2hlY2sg +e0ZyYW1lRGljdCAvYnVnIHRydWUgcHV0fSBwdXQgCkZyYW1lRGljdCAvYnVn +IGZhbHNlIHB1dCAKbWFyayAKJSBTb21lIFBTIG1hY2hpbmVzIHJlYWQgcGFz +dCB0aGUgQ1IsIHNvIGtlZXAgdGhlIGZvbGxvd2luZyAzIGxpbmVzIHRvZ2V0 +aGVyIQpjdXJyZW50ZmlsZSA1IHN0cmluZyByZWFkbGluZQowMAowMDAwMDAw +MDAwCmNsZWFydG9tYXJrIAplcnJvcmRpY3QgL3JhbmdlY2hlY2sgRnJhbWVE +aWN0IC90bXByYW5nZWNoZWNrIGdldCBwdXQgCkZyYW1lRGljdCAvYnVnIGdl +dCB7IAoJL3JlYWRsaW5lIHsKCQkvZ3N0cmluZyBleGNoIGRlZgoJCS9nZmls +ZSBleGNoIGRlZgoJCS9naW5kZXggMCBkZWYKCQl7CgkJCWdmaWxlIHJlYWQg +cG9wIAoJCQlkdXAgMTAgZXEge2V4aXR9IGlmIAoJCQlkdXAgMTMgZXEge2V4 +aXR9IGlmIAoJCQlnc3RyaW5nIGV4Y2ggZ2luZGV4IGV4Y2ggcHV0IAoJCQkv +Z2luZGV4IGdpbmRleCAxIGFkZCBkZWYgCgkJfSBsb29wCgkJcG9wIAoJCWdz +dHJpbmcgMCBnaW5kZXggZ2V0aW50ZXJ2YWwgdHJ1ZSAKCQl9IGRlZgoJfSBp +ZgovRk1WRVJTSU9OIHsKCUZNdmVyc2lvbiBuZSB7CgkJL1RpbWVzLVJvbWFu +IGZpbmRmb250IDE4IHNjYWxlZm9udCBzZXRmb250CgkJMTAwIDEwMCBtb3Zl +dG8KCQkoRnJhbWVNYWtlciB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoIHBvc3Rz +Y3JpcHRfcHJvbG9nISkKCQlkdXAgPQoJCXNob3cgc2hvd3BhZ2UKCQl9IGlm +Cgl9IGRlZiAKL0ZNTE9DQUwgewoJRnJhbWVEaWN0IGJlZ2luCgkwIGRlZiAK +CWVuZCAKCX0gZGVmIAoJL2dzdHJpbmcgRk1MT0NBTAoJL2dmaWxlIEZNTE9D +QUwKCS9naW5kZXggRk1MT0NBTAoJL29yZ3hmZXIgRk1MT0NBTAoJL29yZ3By +b2MgRk1MT0NBTAoJL29yZ2FuZ2xlIEZNTE9DQUwKCS9vcmdmcmVxIEZNTE9D +QUwKCS95c2NhbGUgRk1MT0NBTAoJL3hzY2FsZSBGTUxPQ0FMCgkvbWFudWFs +ZmVlZCBGTUxPQ0FMCgkvcGFwZXJoZWlnaHQgRk1MT0NBTAoJL3BhcGVyd2lk +dGggRk1MT0NBTAovRk1ET0NVTUVOVCB7IAoJYXJyYXkgL0ZNZm9udHMgZXhj +aCBkZWYgCgkvI2NvcGllcyBleGNoIGRlZgoJRnJhbWVEaWN0IGJlZ2luCgkw +IG5lIGR1cCB7c2V0bWFudWFsZmVlZH0gaWYKCS9tYW51YWxmZWVkIGV4Y2gg +ZGVmCgkvcGFwZXJoZWlnaHQgZXhjaCBkZWYKCS9wYXBlcndpZHRoIGV4Y2gg +ZGVmCglzZXRwYXBlcm5hbWUKCW1hbnVhbGZlZWQge3RydWV9IHtwYXBlcnNp +emV9IGlmZWxzZSAKCXttYW51YWxwYXBlcnNpemV9IHtmYWxzZX0gaWZlbHNl +IAoJe2Rlc3BlcmF0ZXBhcGVyc2l6ZX0gaWYKCS95c2NhbGUgZXhjaCBkZWYK +CS94c2NhbGUgZXhjaCBkZWYKCWN1cnJlbnR0cmFuc2ZlciBjdmxpdCAvb3Jn +eGZlciBleGNoIGRlZgoJY3VycmVudHNjcmVlbiBjdmxpdCAvb3JncHJvYyBl +eGNoIGRlZgoJL29yZ2FuZ2xlIGV4Y2ggZGVmIC9vcmdmcmVxIGV4Y2ggZGVm +CgllbmQgCgl9IGRlZiAKCS9wYWdlc2F2ZSBGTUxPQ0FMCgkvb3JnbWF0cml4 +IEZNTE9DQUwKCS9sYW5kc2NhcGUgRk1MT0NBTAovRk1CRUdJTlBBR0UgeyAK +CUZyYW1lRGljdCBiZWdpbiAKCS9wYWdlc2F2ZSBzYXZlIGRlZgoJMy44NiBz +ZXRtaXRlcmxpbWl0CgkvbGFuZHNjYXBlIGV4Y2ggMCBuZSBkZWYKCWxhbmRz +Y2FwZSB7IAoJCTkwIHJvdGF0ZSAwIGV4Y2ggbmVnIHRyYW5zbGF0ZSBwb3Ag +CgkJfQoJCXtwb3AgcG9wfQoJCWlmZWxzZQoJeHNjYWxlIHlzY2FsZSBzY2Fs +ZQoJL29yZ21hdHJpeCBtYXRyaXggZGVmCglnc2F2ZSAKCX0gZGVmIAovRk1F +TkRQQUdFIHsKCWdyZXN0b3JlIAoJcGFnZXNhdmUgcmVzdG9yZQoJZW5kIAoJ +c2hvd3BhZ2UKCX0gZGVmIAovRk1ERUZJTkVGT05UIHsgCglGcmFtZURpY3Qg +YmVnaW4KCWZpbmRmb250IAoJUmVFbmNvZGUgCgkyIGluZGV4IGV4Y2ggCglk +ZWZpbmVmb250IGV4Y2ggCglzY2FsZWZvbnQgCglGTWZvbnRzIDMgMSByb2xs +IAoJcHV0CgllbmQgCgl9IGJpbmQgZGVmCi9GTU5PUk1BTElaRUdSQVBISUNT +IHsgCgluZXdwYXRoCgkwLjAgMC4wIG1vdmV0bwoJMSBzZXRsaW5ld2lkdGgK +CTAgc2V0bGluZWNhcAoJMCAwIDAgc2V0aHNiY29sb3IKCTAgc2V0Z3JheSAK +CX0gYmluZCBkZWYKCS9meCBGTUxPQ0FMCgkvZnkgRk1MT0NBTAoJL2ZoIEZN +TE9DQUwKCS9mdyBGTUxPQ0FMCgkvbGx4IEZNTE9DQUwKCS9sbHkgRk1MT0NB +TAoJL3VyeCBGTUxPQ0FMCgkvdXJ5IEZNTE9DQUwKL0ZNQkVHSU5FUFNGIHsg +CgllbmQgCgkvRk1FUFNGIHNhdmUgZGVmIAoJL3Nob3dwYWdlIHt9IGRlZiAK +CUZNTk9STUFMSVpFR1JBUEhJQ1MgCglbL2Z5IC9meCAvZmggL2Z3IC91cnkg +L3VyeCAvbGx5IC9sbHhdIHtleGNoIGRlZn0gZm9yYWxsIAoJZnggZnkgdHJh +bnNsYXRlIAoJcm90YXRlCglmdyB1cnggbGx4IHN1YiBkaXYgZmggdXJ5IGxs +eSBzdWIgZGl2IHNjYWxlIAoJbGx4IG5lZyBsbHkgbmVnIHRyYW5zbGF0ZSAK +CX0gYmluZCBkZWYKL0ZNRU5ERVBTRiB7CglGTUVQU0YgcmVzdG9yZQoJRnJh +bWVEaWN0IGJlZ2luIAoJfSBiaW5kIGRlZgpGcmFtZURpY3QgYmVnaW4gCi9z +ZXRtYW51YWxmZWVkIHsKJSVCZWdpbkZlYXR1cmUgKk1hbnVhbEZlZWQgVHJ1 +ZQoJIHN0YXR1c2RpY3QgL21hbnVhbGZlZWQgdHJ1ZSBwdXQKJSVFbmRGZWF0 +dXJlCgl9IGRlZgovbWF4IHsyIGNvcHkgbHQge2V4Y2h9IGlmIHBvcH0gYmlu +ZCBkZWYKL21pbiB7MiBjb3B5IGd0IHtleGNofSBpZiBwb3B9IGJpbmQgZGVm +Ci9pbmNoIHs3MiBtdWx9IGRlZgovcGFnZWRpbWVuIHsgCglwYXBlcmhlaWdo +dCBzdWIgYWJzIDE2IGx0IGV4Y2ggCglwYXBlcndpZHRoIHN1YiBhYnMgMTYg +bHQgYW5kCgl7L3BhcGVybmFtZSBleGNoIGRlZn0ge3BvcH0gaWZlbHNlCgl9 +IGRlZgoJL3BhcGVyc2l6ZWRpY3QgRk1MT0NBTAovc2V0cGFwZXJuYW1lIHsg +CgkvcGFwZXJzaXplZGljdCAxNCBkaWN0IGRlZiAKCXBhcGVyc2l6ZWRpY3Qg +YmVnaW4KCS9wYXBlcm5hbWUgL3Vua25vd24gZGVmIAoJCS9MZXR0ZXIgOC41 +IGluY2ggMTEuMCBpbmNoIHBhZ2VkaW1lbgoJCS9MZXR0ZXJTbWFsbCA3LjY4 +IGluY2ggMTAuMTYgaW5jaCBwYWdlZGltZW4KCQkvVGFibG9pZCAxMS4wIGlu +Y2ggMTcuMCBpbmNoIHBhZ2VkaW1lbgoJCS9MZWRnZXIgMTcuMCBpbmNoIDEx +LjAgaW5jaCBwYWdlZGltZW4KCQkvTGVnYWwgOC41IGluY2ggMTQuMCBpbmNo +IHBhZ2VkaW1lbgoJCS9TdGF0ZW1lbnQgNS41IGluY2ggOC41IGluY2ggcGFn +ZWRpbWVuCgkJL0V4ZWN1dGl2ZSA3LjUgaW5jaCAxMC4wIGluY2ggcGFnZWRp +bWVuCgkJL0EzIDExLjY5IGluY2ggMTYuNSBpbmNoIHBhZ2VkaW1lbgoJCS9B +NCA4LjI2IGluY2ggMTEuNjkgaW5jaCBwYWdlZGltZW4KCQkvQTRTbWFsbCA3 +LjQ3IGluY2ggMTAuODUgaW5jaCBwYWdlZGltZW4KCQkvQjQgMTAuMTI1IGlu +Y2ggMTQuMzMgaW5jaCBwYWdlZGltZW4KCQkvQjUgNy4xNiBpbmNoIDEwLjEy +NSBpbmNoIHBhZ2VkaW1lbgoJZW5kCgl9IGRlZgovcGFwZXJzaXplIHsKCXBh +cGVyc2l6ZWRpY3QgYmVnaW4KCQkvTGV0dGVyIHtsZXR0ZXJ0cmF5fSBkZWYK +CQkvTGV0dGVyU21hbGwge2xldHRlcnRyYXkgbGV0dGVyc21hbGx9IGRlZgoJ +CS9UYWJsb2lkIHsxMXgxN3RyYXl9IGRlZgoJCS9MZWRnZXIge2xlZGdlcnRy +YXl9IGRlZgoJCS9MZWdhbCB7bGVnYWx0cmF5fSBkZWYKCQkvU3RhdGVtZW50 +IHtzdGF0ZW1lbnR0cmF5fSBkZWYKCQkvRXhlY3V0aXZlIHtleGVjdXRpdmV0 +cmF5fSBkZWYKCQkvQTMge2EzdHJheX0gZGVmCgkJL0E0IHthNHRyYXl9IGRl +ZgoJCS9BNFNtYWxsIHthNHRyYXkgYTRzbWFsbH0gZGVmCgkJL0I0IHtiNHRy +YXl9IGRlZgoJCS9CNSB7YjV0cmF5fSBkZWYKCQkvdW5rbm93biB7dW5rbm93 +bn0gZGVmCglwYXBlcnNpemVkaWN0IGR1cCBwYXBlcm5hbWUga25vd24ge3Bh +cGVybmFtZX0gey91bmtub3dufSBpZmVsc2UgZ2V0CgllbmQKCXN0YXR1c2Rp +Y3QgYmVnaW4gc3RvcHBlZCBlbmQgCgl9IGRlZgovbWFudWFscGFwZXJzaXpl +IHsKCXBhcGVyc2l6ZWRpY3QgYmVnaW4KCQkvTGV0dGVyIHtsZXR0ZXJ9IGRl +ZgoJCS9MZXR0ZXJTbWFsbCB7bGV0dGVyc21hbGx9IGRlZgoJCS9UYWJsb2lk +IHsxMXgxN30gZGVmCgkJL0xlZGdlciB7bGVkZ2VyfSBkZWYKCQkvTGVnYWwg +e2xlZ2FsfSBkZWYKCQkvU3RhdGVtZW50IHtzdGF0ZW1lbnR9IGRlZgoJCS9F +eGVjdXRpdmUge2V4ZWN1dGl2ZX0gZGVmCgkJL0EzIHthM30gZGVmCgkJL0E0 +IHthNH0gZGVmCgkJL0E0U21hbGwge2E0c21hbGx9IGRlZgoJCS9CNCB7YjR9 +IGRlZgoJCS9CNSB7YjV9IGRlZgoJCS91bmtub3duIHt1bmtub3dufSBkZWYK +CXBhcGVyc2l6ZWRpY3QgZHVwIHBhcGVybmFtZSBrbm93biB7cGFwZXJuYW1l +fSB7L3Vua25vd259IGlmZWxzZSBnZXQKCWVuZAoJc3RvcHBlZCAKCX0gZGVm +Ci9kZXNwZXJhdGVwYXBlcnNpemUgewoJc3RhdHVzZGljdCAvc2V0cGFnZXBh +cmFtcyBrbm93bgoJCXsKCQlwYXBlcndpZHRoIHBhcGVyaGVpZ2h0IDAgMSAK +CQlzdGF0dXNkaWN0IGJlZ2luCgkJe3NldHBhZ2VwYXJhbXN9IHN0b3BwZWQg +cG9wIAoJCWVuZAoJCX0gaWYKCX0gZGVmCi9zYXZlbWF0cml4IHsKCW9yZ21h +dHJpeCBjdXJyZW50bWF0cml4IHBvcAoJfSBiaW5kIGRlZgovcmVzdG9yZW1h +dHJpeCB7CglvcmdtYXRyaXggc2V0bWF0cml4Cgl9IGJpbmQgZGVmCi9kbWF0 +cml4IG1hdHJpeCBkZWYKL2RwaSAgICA3MiAwIGRtYXRyaXggZGVmYXVsdG1h +dHJpeCBkdHJhbnNmb3JtCiAgICBkdXAgbXVsIGV4Y2ggICBkdXAgbXVsIGFk +ZCAgIHNxcnQgZGVmCi9mcmVxIGRwaSAxOC43NSBkaXYgOCBkaXYgcm91bmQg +ZHVwIDAgZXEge3BvcCAxfSBpZiA4IG11bCBkcGkgZXhjaCBkaXYgZGVmCi9z +YW5nbGUgMSAwIGRtYXRyaXggZGVmYXVsdG1hdHJpeCBkdHJhbnNmb3JtIGV4 +Y2ggYXRhbiBkZWYKL0RpYWNyaXRpY0VuY29kaW5nIFsKLy5ub3RkZWYgLy5u +b3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYKLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYKLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYKLy5u +b3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYgLy5ub3RkZWYKLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5u +b3RkZWYgL3NwYWNlIC9leGNsYW0gL3F1b3RlZGJsCi9udW1iZXJzaWduIC9k +b2xsYXIgL3BlcmNlbnQgL2FtcGVyc2FuZCAvcXVvdGVzaW5nbGUgL3BhcmVu +bGVmdAovcGFyZW5yaWdodCAvYXN0ZXJpc2sgL3BsdXMgL2NvbW1hIC9oeXBo +ZW4gL3BlcmlvZCAvc2xhc2ggL3plcm8gL29uZQovdHdvIC90aHJlZSAvZm91 +ciAvZml2ZSAvc2l4IC9zZXZlbiAvZWlnaHQgL25pbmUgL2NvbG9uIC9zZW1p +Y29sb24KL2xlc3MgL2VxdWFsIC9ncmVhdGVyIC9xdWVzdGlvbiAvYXQgL0Eg +L0IgL0MgL0QgL0UgL0YgL0cgL0ggL0kgL0ogL0sKL0wgL00gL04gL08gL1Ag +L1EgL1IgL1MgL1QgL1UgL1YgL1cgL1ggL1kgL1ogL2JyYWNrZXRsZWZ0IC9i +YWNrc2xhc2gKL2JyYWNrZXRyaWdodCAvYXNjaWljaXJjdW0gL3VuZGVyc2Nv +cmUgL2dyYXZlIC9hIC9iIC9jIC9kIC9lIC9mIC9nIC9oCi9pIC9qIC9rIC9s +IC9tIC9uIC9vIC9wIC9xIC9yIC9zIC90IC91IC92IC93IC94IC95IC96IC9i +cmFjZWxlZnQgL2JhcgovYnJhY2VyaWdodCAvYXNjaWl0aWxkZSAvLm5vdGRl +ZiAvQWRpZXJlc2lzIC9BcmluZyAvQ2NlZGlsbGEgL0VhY3V0ZQovTnRpbGRl +IC9PZGllcmVzaXMgL1VkaWVyZXNpcyAvYWFjdXRlIC9hZ3JhdmUgL2FjaXJj +dW1mbGV4IC9hZGllcmVzaXMKL2F0aWxkZSAvYXJpbmcgL2NjZWRpbGxhIC9l +YWN1dGUgL2VncmF2ZSAvZWNpcmN1bWZsZXggL2VkaWVyZXNpcwovaWFjdXRl +IC9pZ3JhdmUgL2ljaXJjdW1mbGV4IC9pZGllcmVzaXMgL250aWxkZSAvb2Fj +dXRlIC9vZ3JhdmUKL29jaXJjdW1mbGV4IC9vZGllcmVzaXMgL290aWxkZSAv +dWFjdXRlIC91Z3JhdmUgL3VjaXJjdW1mbGV4Ci91ZGllcmVzaXMgL2RhZ2dl +ciAvLm5vdGRlZiAvY2VudCAvc3RlcmxpbmcgL3NlY3Rpb24gL2J1bGxldAov +cGFyYWdyYXBoIC9nZXJtYW5kYmxzIC9yZWdpc3RlcmVkIC9jb3B5cmlnaHQg +L3RyYWRlbWFyayAvYWN1dGUKL2RpZXJlc2lzIC8ubm90ZGVmIC9BRSAvT3Ns +YXNoIC8ubm90ZGVmIC8ubm90ZGVmIC8ubm90ZGVmIC8ubm90ZGVmCi95ZW4g +Ly5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYgLy5ub3RkZWYg +Ly5ub3RkZWYKL29yZGZlbWluaW5lIC9vcmRtYXNjdWxpbmUgLy5ub3RkZWYg +L2FlIC9vc2xhc2ggL3F1ZXN0aW9uZG93bgovZXhjbGFtZG93biAvbG9naWNh +bG5vdCAvLm5vdGRlZiAvZmxvcmluIC8ubm90ZGVmIC8ubm90ZGVmCi9ndWls +bGVtb3RsZWZ0IC9ndWlsbGVtb3RyaWdodCAvZWxsaXBzaXMgLy5ub3RkZWYg +L0FncmF2ZSAvQXRpbGRlCi9PdGlsZGUgL09FIC9vZSAvZW5kYXNoIC9lbWRh +c2ggL3F1b3RlZGJsbGVmdCAvcXVvdGVkYmxyaWdodAovcXVvdGVsZWZ0IC9x +dW90ZXJpZ2h0IC8ubm90ZGVmIC8ubm90ZGVmIC95ZGllcmVzaXMgL1lkaWVy +ZXNpcwovZnJhY3Rpb24gL2N1cnJlbmN5IC9ndWlsc2luZ2xsZWZ0IC9ndWls +c2luZ2xyaWdodCAvZmkgL2ZsIC9kYWdnZXJkYmwKL3BlcmlvZGNlbnRlcmVk +IC9xdW90ZXNpbmdsYmFzZSAvcXVvdGVkYmxiYXNlIC9wZXJ0aG91c2FuZAov +QWNpcmN1bWZsZXggL0VjaXJjdW1mbGV4IC9BYWN1dGUgL0VkaWVyZXNpcyAv +RWdyYXZlIC9JYWN1dGUKL0ljaXJjdW1mbGV4IC9JZGllcmVzaXMgL0lncmF2 +ZSAvT2FjdXRlIC9PY2lyY3VtZmxleCAvLm5vdGRlZiAvT2dyYXZlCi9VYWN1 +dGUgL1VjaXJjdW1mbGV4IC9VZ3JhdmUgL2RvdGxlc3NpIC9jaXJjdW1mbGV4 +IC90aWxkZSAvbWFjcm9uCi9icmV2ZSAvZG90YWNjZW50IC9yaW5nIC9jZWRp +bGxhIC9odW5nYXJ1bWxhdXQgL29nb25layAvY2Fyb24KXSBkZWYKL1JlRW5j +b2RlIHsgCglkdXAgCglsZW5ndGggCglkaWN0IGJlZ2luIAoJewoJMSBpbmRl +eCAvRklEIG5lIAoJCXtkZWZ9IAoJCXtwb3AgcG9wfSBpZmVsc2UgCgl9IGZv +cmFsbAoJRW5jb2RpbmcgU3RhbmRhcmRFbmNvZGluZyBlcSAKCXsKCQkvRW5j +b2RpbmcgRGlhY3JpdGljRW5jb2RpbmcgZGVmCgl9aWYKCWN1cnJlbnRkaWN0 +IAoJZW5kIAoJfSBiaW5kIGRlZgovZ3JheW1vZGUgdHJ1ZSBkZWYKCS9id2lk +dGggRk1MT0NBTAoJL2Jwc2lkZSBGTUxPQ0FMCgkvYnN0cmluZyBGTUxPQ0FM +Cgkvb25iaXRzIEZNTE9DQUwKCS9vZmZiaXRzIEZNTE9DQUwKCS94aW5kZXgg +Rk1MT0NBTAoJL3lpbmRleCBGTUxPQ0FMCgkveCBGTUxPQ0FMCgkveSBGTUxP +Q0FMCi9zZXRwYXR0ZXJuIHsKCSAvYndpZHRoICBleGNoIGRlZgoJIC9icHNp +ZGUgIGV4Y2ggZGVmCgkgL2JzdHJpbmcgZXhjaCBkZWYKCSAvb25iaXRzIDAg +ZGVmICAvb2ZmYml0cyAwIGRlZgoJIGZyZXEgc2FuZ2xlIGxhbmRzY2FwZSB7 +OTAgYWRkfSBpZiAKCQl7L3kgZXhjaCBkZWYKCQkgL3ggZXhjaCBkZWYKCQkg +L3hpbmRleCB4IDEgYWRkIDIgZGl2IGJwc2lkZSBtdWwgY3ZpIGRlZgoJCSAv +eWluZGV4IHkgMSBhZGQgMiBkaXYgYnBzaWRlIG11bCBjdmkgZGVmCgkJIGJz +dHJpbmcgeWluZGV4IGJ3aWR0aCBtdWwgeGluZGV4IDggaWRpdiBhZGQgZ2V0 +CgkJIDEgNyB4aW5kZXggOCBtb2Qgc3ViIGJpdHNoaWZ0IGFuZCAwIG5lCgkJ +IHsvb25iaXRzICBvbmJpdHMgIDEgYWRkIGRlZiAxfQoJCSB7L29mZmJpdHMg +b2ZmYml0cyAxIGFkZCBkZWYgMH0KCQkgaWZlbHNlCgkJfQoJCXNldHNjcmVl +bgoJIHt9IHNldHRyYW5zZmVyCgkgb2ZmYml0cyBvZmZiaXRzIG9uYml0cyBh +ZGQgZGl2IEZNc2V0Z3JheQoJL2dyYXltb2RlIGZhbHNlIGRlZgoJfSBiaW5k +IGRlZgovZ3JheW5lc3MgewoJRk1zZXRncmF5CglncmF5bW9kZSBub3QgewoJ +CS9ncmF5bW9kZSB0cnVlIGRlZgoJCW9yZ3hmZXIgY3Z4IHNldHRyYW5zZmVy +CgkJb3JnZnJlcSBvcmdhbmdsZSBvcmdwcm9jIGN2eCBzZXRzY3JlZW4KCQl9 +IGlmCgl9IGJpbmQgZGVmCgkvSFVFIEZNTE9DQUwKCS9TQVQgRk1MT0NBTAoJ +L0JSSUdIVCBGTUxPQ0FMCgkvQ29sb3JzIEZNTE9DQUwKRk1QcmludEluQ29s +b3IgCgkKCXsKCS9IVUUgMCBkZWYKCS9TQVQgMCBkZWYKCS9CUklHSFQgMCBk +ZWYKCSUgYXJyYXkgb2YgYXJyYXlzIEh1ZSBhbmQgU2F0IHZhbHVlcyBmb3Ig +dGhlIHNlcGFyYXRpb25zIFtIVUUgQlJJR0hUXQoJL0NvbG9ycyAgIAoJW1sw +ICAgIDAgIF0gICAgJSBibGFjawoJIFswICAgIDAgIF0gICAgJSB3aGl0ZQoJ +IFswLjAwIDEuMF0gICAgJSByZWQKCSBbMC4zNyAxLjBdICAgICUgZ3JlZW4K +CSBbMC42MCAxLjBdICAgICUgYmx1ZQoJIFswLjUwIDEuMF0gICAgJSBjeWFu +CgkgWzAuODMgMS4wXSAgICAlIG1hZ2VudGEKCSBbMC4xNiAxLjBdICAgICUg +Y29tbWVudCAvIHllbGxvdwoJIF0gZGVmCiAgICAgIAoJL0JFR0lOQklUTUFQ +Q09MT1IgeyAKCQlCSVRNQVBDT0xPUn0gZGVmCgkvQkVHSU5CSVRNQVBDT0xP +UmMgeyAKCQlCSVRNQVBDT0xPUmN9IGRlZgoJL0sgeyAKCQlDb2xvcnMgZXhj +aCBnZXQgZHVwCgkJMCBnZXQgL0hVRSBleGNoIHN0b3JlIAoJCTEgZ2V0IC9C +UklHSFQgZXhjaCBzdG9yZQoJCSAgSFVFIDAgZXEgQlJJR0hUIDAgZXEgYW5k +CgkJCXsxLjAgU0FUIHN1YiBzZXRncmF5fQoJCQl7SFVFIFNBVCBCUklHSFQg +c2V0aHNiY29sb3J9IAoJCSAgaWZlbHNlCgkJfSBkZWYKCS9GTXNldGdyYXkg +eyAKCQkvU0FUIGV4Y2ggMS4wIGV4Y2ggc3ViIHN0b3JlIAoJCSAgSFVFIDAg +ZXEgQlJJR0hUIDAgZXEgYW5kCgkJCXsxLjAgU0FUIHN1YiBzZXRncmF5fQoJ +CQl7SFVFIFNBVCBCUklHSFQgc2V0aHNiY29sb3J9IAoJCSAgaWZlbHNlCgkJ +fSBiaW5kIGRlZgoJfQoJCgl7CgkvQkVHSU5CSVRNQVBDT0xPUiB7IAoJCUJJ +VE1BUEdSQVl9IGRlZgoJL0JFR0lOQklUTUFQQ09MT1JjIHsgCgkJQklUTUFQ +R1JBWWN9IGRlZgoJL0ZNc2V0Z3JheSB7c2V0Z3JheX0gYmluZCBkZWYKCS9L +IHsgCgkJcG9wCgkJfSBkZWYKCX0KaWZlbHNlCi9ub3JtYWxpemUgewoJdHJh +bnNmb3JtIHJvdW5kIGV4Y2ggcm91bmQgZXhjaCBpdHJhbnNmb3JtCgl9IGJp +bmQgZGVmCi9kbm9ybWFsaXplIHsKCWR0cmFuc2Zvcm0gcm91bmQgZXhjaCBy +b3VuZCBleGNoIGlkdHJhbnNmb3JtCgl9IGJpbmQgZGVmCi9sbm9ybWFsaXpl +IHsgCgkwIGR0cmFuc2Zvcm0gZXhjaCBjdmkgMiBpZGl2IDIgbXVsIDEgYWRk +IGV4Y2ggaWR0cmFuc2Zvcm0gcG9wCgl9IGJpbmQgZGVmCi9IIHsgCglsbm9y +bWFsaXplIHNldGxpbmV3aWR0aAoJfSBiaW5kIGRlZgovWiB7CglzZXRsaW5l +Y2FwCgl9IGJpbmQgZGVmCi9YIHsgCglmaWxscHJvY3MgZXhjaCBnZXQgZXhl +YwoJfSBiaW5kIGRlZgovViB7IAoJZ3NhdmUgZW9maWxsIGdyZXN0b3JlCgl9 +IGJpbmQgZGVmCi9OIHsgCglzdHJva2UKCX0gYmluZCBkZWYKL00ge25ld3Bh +dGggbW92ZXRvfSBiaW5kIGRlZgovRSB7bGluZXRvfSBiaW5kIGRlZgovRCB7 +Y3VydmV0b30gYmluZCBkZWYKL08ge2Nsb3NlcGF0aH0gYmluZCBkZWYKCS9u +IEZNTE9DQUwKL0wgeyAKIAkvbiBleGNoIGRlZgoJbmV3cGF0aAoJbm9ybWFs +aXplCgltb3ZldG8gCgkyIDEgbiB7cG9wIG5vcm1hbGl6ZSBsaW5ldG99IGZv +cgoJfSBiaW5kIGRlZgovWSB7IAoJTCAKCWNsb3NlcGF0aAoJfSBiaW5kIGRl +ZgoJL3gxIEZNTE9DQUwKCS94MiBGTUxPQ0FMCgkveTEgRk1MT0NBTAoJL3ky +IEZNTE9DQUwKCS9yYWQgRk1MT0NBTAovUiB7IAoJL3kyIGV4Y2ggZGVmCgkv +eDIgZXhjaCBkZWYKCS95MSBleGNoIGRlZgoJL3gxIGV4Y2ggZGVmCgl4MSB5 +MQoJeDIgeTEKCXgyIHkyCgl4MSB5MgoJNCBZIAoJfSBiaW5kIGRlZgovUlIg +eyAKCS9yYWQgZXhjaCBkZWYKCW5vcm1hbGl6ZQoJL3kyIGV4Y2ggZGVmCgkv +eDIgZXhjaCBkZWYKCW5vcm1hbGl6ZQoJL3kxIGV4Y2ggZGVmCgkveDEgZXhj +aCBkZWYKCW5ld3BhdGgKCXgxIHkxIHJhZCBhZGQgbW92ZXRvCgl4MSB5MiB4 +MiB5MiByYWQgYXJjdG8KCXgyIHkyIHgyIHkxIHJhZCBhcmN0bwoJeDIgeTEg +eDEgeTEgcmFkIGFyY3RvCgl4MSB5MSB4MSB5MiByYWQgYXJjdG8KCWNsb3Nl +cGF0aAoJMTYge3BvcH0gcmVwZWF0Cgl9IGJpbmQgZGVmCi9DIHsgCglncmVz +dG9yZQoJZ3NhdmUKCVIgCgljbGlwCgl9IGJpbmQgZGVmCi9VIHsgCglncmVz +dG9yZQoJZ3NhdmUKCX0gYmluZCBkZWYKL0YgeyAKCUZNZm9udHMgZXhjaCBn +ZXQKCXNldGZvbnQKCX0gYmluZCBkZWYKL1QgeyAKCW1vdmV0byBzaG93Cgl9 +IGJpbmQgZGVmCi9SRiB7IAoJcm90YXRlCgkwIG5lIHstMSAxIHNjYWxlfSBp +ZgoJfSBiaW5kIGRlZgovVEYgeyAKCWdzYXZlCgltb3ZldG8gCglSRgoJc2hv +dwoJZ3Jlc3RvcmUKCX0gYmluZCBkZWYKL1AgeyAKCW1vdmV0bwoJMCAzMiAz +IDIgcm9sbCB3aWR0aHNob3cKCX0gYmluZCBkZWYKL1BGIHsgCglnc2F2ZQoJ +bW92ZXRvIAoJUkYKCTAgMzIgMyAyIHJvbGwgd2lkdGhzaG93CglncmVzdG9y +ZQoJfSBiaW5kIGRlZgovUyB7IAoJbW92ZXRvCgkwIGV4Y2ggYXNob3cKCX0g +YmluZCBkZWYKL1NGIHsgCglnc2F2ZQoJbW92ZXRvCglSRgoJMCBleGNoIGFz +aG93CglncmVzdG9yZQoJfSBiaW5kIGRlZgovQiB7IAoJbW92ZXRvCgkwIDMy +IDQgMiByb2xsIDAgZXhjaCBhd2lkdGhzaG93Cgl9IGJpbmQgZGVmCi9CRiB7 +IAoJZ3NhdmUKCW1vdmV0bwoJUkYKCTAgMzIgNCAyIHJvbGwgMCBleGNoIGF3 +aWR0aHNob3cKCWdyZXN0b3JlCgl9IGJpbmQgZGVmCgkveCBGTUxPQ0FMCgkv +eSBGTUxPQ0FMCgkvZHggRk1MT0NBTAoJL2R5IEZNTE9DQUwKCS9kbCBGTUxP +Q0FMCgkvdCBGTUxPQ0FMCgkvdDIgRk1MT0NBTAoJL0NvcyBGTUxPQ0FMCgkv +U2luIEZNTE9DQUwKCS9yIEZNTE9DQUwKL1cgeyAKCWRub3JtYWxpemUKCS9k +eSBleGNoIGRlZgoJL2R4IGV4Y2ggZGVmCglub3JtYWxpemUKCS95ICBleGNo +IGRlZgoJL3ggIGV4Y2ggZGVmCgkvZGwgZHggZHggbXVsIGR5IGR5IG11bCBh +ZGQgc3FydCBkZWYKCWRsIDAuMCBndCB7CgkJL3QgY3VycmVudGxpbmV3aWR0 +aCBkZWYKCQlzYXZlbWF0cml4CgkJL0NvcyBkeCBkbCBkaXYgZGVmCgkJL1Np +biBkeSBkbCBkaXYgZGVmCgkJL3IgW0NvcyBTaW4gU2luIG5lZyBDb3MgMC4w +IDAuMF0gZGVmCgkJL3QyIHQgMi41IG11bCAzLjUgbWF4IGRlZgoJCW5ld3Bh +dGgKCQl4IHkgdHJhbnNsYXRlCgkJciBjb25jYXQKCQkwLjAgMC4wIG1vdmV0 +bwoJCWRsIHQgMi43IG11bCBzdWIgMC4wIHJsaW5ldG8KCQlzdHJva2UKCQly +ZXN0b3JlbWF0cml4CgkJeCBkeCBhZGQgeSBkeSBhZGQgdHJhbnNsYXRlCgkJ +ciBjb25jYXQKCQl0IDAuNjcgbXVsIHNldGxpbmV3aWR0aAoJCXQgMS42MSBt +dWwgbmVnICAwLjAgdHJhbnNsYXRlCgkJMC4wIDAuMCBtb3ZldG8KCQl0MiAx +LjcgbXVsIG5lZyAgdDIgMi4wIGRpdiAgICAgbW92ZXRvCgkJMC4wIDAuMCBs +aW5ldG8KCQl0MiAxLjcgbXVsIG5lZyAgdDIgMi4wIGRpdiBuZWcgbGluZXRv +CgkJc3Ryb2tlCgkJdCBzZXRsaW5ld2lkdGgKCQlyZXN0b3JlbWF0cml4CgkJ +fSBpZgoJfSBiaW5kIGRlZgovRyB7IAoJZ3NhdmUKCW5ld3BhdGgKCW5vcm1h +bGl6ZSB0cmFuc2xhdGUgMC4wIDAuMCBtb3ZldG8gCglkbm9ybWFsaXplIHNj +YWxlIAoJMC4wIDAuMCAxLjAgNSAzIHJvbGwgYXJjIAoJY2xvc2VwYXRoIGZp +bGwKCWdyZXN0b3JlCgl9IGJpbmQgZGVmCi9BIHsgCglnc2F2ZQoJc2F2ZW1h +dHJpeAoJbmV3cGF0aAoJMiBpbmRleCAyIGRpdiBhZGQgZXhjaCAzIGluZGV4 +IDIgZGl2IHN1YiBleGNoIAoJbm9ybWFsaXplIDIgaW5kZXggMiBkaXYgc3Vi +IGV4Y2ggMyBpbmRleCAyIGRpdiBhZGQgZXhjaCAKCXRyYW5zbGF0ZSAKCXNj +YWxlIAoJMC4wIDAuMCAxLjAgNSAzIHJvbGwgYXJjIAoJcmVzdG9yZW1hdHJp +eAoJc3Ryb2tlCglncmVzdG9yZQoJfSBiaW5kIGRlZgoJL3ggRk1MT0NBTAoJ +L3kgRk1MT0NBTAoJL3cgRk1MT0NBTAoJL2ggRk1MT0NBTAoJL3h4IEZNTE9D +QUwKCS95eSBGTUxPQ0FMCgkvd3cgRk1MT0NBTAoJL2hoIEZNTE9DQUwKCS9G +TXNhdmVvYmplY3QgRk1MT0NBTAoJL0ZNb3B0b3AgRk1MT0NBTAoJL0ZNZGlj +dHRvcCBGTUxPQ0FMCi9CRUdJTlBSSU5UQ09ERSB7IAoJL0ZNZGljdHRvcCBj +b3VudGRpY3RzdGFjayAxIGFkZCBkZWYgCgkvRk1vcHRvcCBjb3VudCA0IHN1 +YiBkZWYgCgkvRk1zYXZlb2JqZWN0IHNhdmUgZGVmCgl1c2VyZGljdCBiZWdp +biAKCS9zaG93cGFnZSB7fSBkZWYgCglGTU5PUk1BTElaRUdSQVBISUNTIAoJ +MyBpbmRleCBuZWcgMyBpbmRleCBuZWcgdHJhbnNsYXRlCgl9IGJpbmQgZGVm +Ci9FTkRQUklOVENPREUgewoJY291bnQgLTEgRk1vcHRvcCB7cG9wIHBvcH0g +Zm9yIAoJY291bnRkaWN0c3RhY2sgLTEgRk1kaWN0dG9wIHtwb3AgZW5kfSBm +b3IgCglGTXNhdmVvYmplY3QgcmVzdG9yZSAKCX0gYmluZCBkZWYKL2duIHsg +CgkwIAoJewk0NiBtdWwgCgkJY2YgcmVhZCBwb3AgCgkJMzIgc3ViIAoJCWR1 +cCA0NiBsdCB7ZXhpdH0gaWYgCgkJNDYgc3ViIGFkZCAKCQl9IGxvb3AKCWFk +ZCAKCX0gYmluZCBkZWYKCS9zdHIgRk1MT0NBTAovY2ZzIHsgCgkvc3RyIHNs +IHN0cmluZyBkZWYgCgkwIDEgc2wgMSBzdWIge3N0ciBleGNoIHZhbCBwdXR9 +IGZvciAKCXN0ciBkZWYgCgl9IGJpbmQgZGVmCi9pYyBbIAoJMCAwIDAgMCAw +IDAgMCAwIDAgMCAwIDAgMCAwIDAgMDIyMwoJMCAwIDAgMCAwIDAgMCAwIDAg +MCAwIDAgMCAwIDAgMDIyMwoJMAoJezAgaHh9IHsxIGh4fSB7MiBoeH0gezMg +aHh9IHs0IGh4fSB7NSBoeH0gezYgaHh9IHs3IGh4fSB7OCBoeH0gezkgaHh9 +Cgl7MTAgaHh9IHsxMSBoeH0gezEyIGh4fSB7MTMgaHh9IHsxNCBoeH0gezE1 +IGh4fSB7MTYgaHh9IHsxNyBoeH0gezE4IGh4fQoJezE5IGh4fSB7Z24gaHh9 +IHswfSB7MX0gezJ9IHszfSB7NH0gezV9IHs2fSB7N30gezh9IHs5fSB7MTB9 +IHsxMX0gezEyfQoJezEzfSB7MTR9IHsxNX0gezE2fSB7MTd9IHsxOH0gezE5 +fSB7Z259IHswIHdofSB7MSB3aH0gezIgd2h9IHszIHdofQoJezQgd2h9IHs1 +IHdofSB7NiB3aH0gezcgd2h9IHs4IHdofSB7OSB3aH0gezEwIHdofSB7MTEg +d2h9IHsxMiB3aH0KCXsxMyB3aH0gezE0IHdofSB7Z24gd2h9IHswIGJsfSB7 +MSBibH0gezIgYmx9IHszIGJsfSB7NCBibH0gezUgYmx9IHs2IGJsfQoJezcg +Ymx9IHs4IGJsfSB7OSBibH0gezEwIGJsfSB7MTEgYmx9IHsxMiBibH0gezEz +IGJsfSB7MTQgYmx9IHtnbiBibH0KCXswIGZsfSB7MSBmbH0gezIgZmx9IHsz +IGZsfSB7NCBmbH0gezUgZmx9IHs2IGZsfSB7NyBmbH0gezggZmx9IHs5IGZs +fQoJezEwIGZsfSB7MTEgZmx9IHsxMiBmbH0gezEzIGZsfSB7MTQgZmx9IHtn +biBmbH0KCV0gZGVmCgkvc2wgRk1MT0NBTAoJL3ZhbCBGTUxPQ0FMCgkvd3Mg +Rk1MT0NBTAoJL2ltIEZNTE9DQUwKCS9icyBGTUxPQ0FMCgkvY3MgRk1MT0NB +TAoJL2xlbiBGTUxPQ0FMCgkvcG9zIEZNTE9DQUwKL21zIHsgCgkvc2wgZXhj +aCBkZWYgCgkvdmFsIDI1NSBkZWYgCgkvd3MgY2ZzIAoJL2ltIGNmcyAKCS92 +YWwgMCBkZWYgCgkvYnMgY2ZzIAoJL2NzIGNmcyAKCX0gYmluZCBkZWYKNDAw +IG1zIAovaXAgeyAKCWlzIAoJMCAKCWNmIGNzIHJlYWRsaW5lIHBvcCAKCXsJ +aWMgZXhjaCBnZXQgZXhlYyAKCQlhZGQgCgkJfSBmb3JhbGwgCglwb3AgCgkK +CX0gYmluZCBkZWYKL3doIHsgCgkvbGVuIGV4Y2ggZGVmIAoJL3BvcyBleGNo +IGRlZiAKCXdzIDAgbGVuIGdldGludGVydmFsIGltIHBvcyBsZW4gZ2V0aW50 +ZXJ2YWwgY29weSBwb3AKCXBvcyBsZW4gCgl9IGJpbmQgZGVmCi9ibCB7IAoJ +L2xlbiBleGNoIGRlZiAKCS9wb3MgZXhjaCBkZWYgCglicyAwIGxlbiBnZXRp +bnRlcnZhbCBpbSBwb3MgbGVuIGdldGludGVydmFsIGNvcHkgcG9wCglwb3Mg +bGVuIAoJfSBiaW5kIGRlZgovczEgMSBzdHJpbmcgZGVmCi9mbCB7IAoJL2xl +biBleGNoIGRlZiAKCS9wb3MgZXhjaCBkZWYgCgkvdmFsIGNmIHMxIHJlYWRo +ZXhzdHJpbmcgcG9wIDAgZ2V0IGRlZgoJcG9zIDEgcG9zIGxlbiBhZGQgMSBz +dWIge2ltIGV4Y2ggdmFsIHB1dH0gZm9yCglwb3MgbGVuIAoJfSBiaW5kIGRl +ZgovaHggeyAKCTMgY29weSBnZXRpbnRlcnZhbCAKCWNmIGV4Y2ggcmVhZGhl +eHN0cmluZyBwb3AgcG9wIAoJfSBiaW5kIGRlZgoJL2ggRk1MT0NBTAoJL3cg +Rk1MT0NBTAoJL2QgRk1MT0NBTAoJL2xiIEZNTE9DQUwKCS9iaXRtYXBzYXZl +IEZNTE9DQUwKCS9pcyBGTUxPQ0FMCgkvY2YgRk1MT0NBTAovd2J5dGVzIHsg +CglkdXAgCgk4IGVxIHtwb3B9IHsxIGVxIHs3IGFkZCA4IGlkaXZ9IHszIGFk +ZCA0IGlkaXZ9IGlmZWxzZX0gaWZlbHNlCgl9IGJpbmQgZGVmCi9CRUdJTkJJ +VE1BUEJXYyB7IAoJMSB7fSBDT01NT05CSVRNQVBjCgl9IGJpbmQgZGVmCi9C +RUdJTkJJVE1BUEdSQVljIHsgCgk4IHt9IENPTU1PTkJJVE1BUGMKCX0gYmlu +ZCBkZWYKL0JFR0lOQklUTUFQMkJJVGMgeyAKCTIge30gQ09NTU9OQklUTUFQ +YwoJfSBiaW5kIGRlZgovQ09NTU9OQklUTUFQYyB7IAoJL3IgZXhjaCBkZWYK +CS9kIGV4Y2ggZGVmCglnc2F2ZQoJdHJhbnNsYXRlIHJvdGF0ZSBzY2FsZSAv +aCBleGNoIGRlZiAvdyBleGNoIGRlZgoJL2xiIHcgZCB3Ynl0ZXMgZGVmIAoJ +c2wgbGIgbHQge2xiIG1zfSBpZiAKCS9iaXRtYXBzYXZlIHNhdmUgZGVmIAoJ +ciAgICAgICAgICAgICAgICAgICAgCgkvaXMgaW0gMCBsYiBnZXRpbnRlcnZh +bCBkZWYgCgl3cyAwIGxiIGdldGludGVydmFsIGlzIGNvcHkgcG9wIAoJL2Nm +IGN1cnJlbnRmaWxlIGRlZiAKCXcgaCBkIFt3IDAgMCBoIG5lZyAwIGhdIAoJ +e2lwfSBpbWFnZSAKCWJpdG1hcHNhdmUgcmVzdG9yZSAKCWdyZXN0b3JlCgl9 +IGJpbmQgZGVmCi9CRUdJTkJJVE1BUEJXIHsgCgkxIHt9IENPTU1PTkJJVE1B +UAoJfSBiaW5kIGRlZgovQkVHSU5CSVRNQVBHUkFZIHsgCgk4IHt9IENPTU1P +TkJJVE1BUAoJfSBiaW5kIGRlZgovQkVHSU5CSVRNQVAyQklUIHsgCgkyIHt9 +IENPTU1PTkJJVE1BUAoJfSBiaW5kIGRlZgovQ09NTU9OQklUTUFQIHsgCgkv +ciBleGNoIGRlZgoJL2QgZXhjaCBkZWYKCWdzYXZlCgl0cmFuc2xhdGUgcm90 +YXRlIHNjYWxlIC9oIGV4Y2ggZGVmIC93IGV4Y2ggZGVmCgkvYml0bWFwc2F2 +ZSBzYXZlIGRlZiAKCXIgICAgICAgICAgICAgICAgICAgIAoJL2lzIHcgZCB3 +Ynl0ZXMgc3RyaW5nIGRlZgoJL2NmIGN1cnJlbnRmaWxlIGRlZiAKCXcgaCBk +IFt3IDAgMCBoIG5lZyAwIGhdIAoJe2NmIGlzIHJlYWRoZXhzdHJpbmcgcG9w +fSBpbWFnZQoJYml0bWFwc2F2ZSByZXN0b3JlIAoJZ3Jlc3RvcmUKCX0gYmlu +ZCBkZWYKCS9wcm9jMSBGTUxPQ0FMCgkvcHJvYzIgRk1MT0NBTAoJL25ld3By +b2MgRk1MT0NBTAovRm1jYyB7CiAgICAvcHJvYzIgZXhjaCBjdmxpdCBkZWYK +ICAgIC9wcm9jMSBleGNoIGN2bGl0IGRlZgogICAgL25ld3Byb2MgcHJvYzEg +bGVuZ3RoIHByb2MyIGxlbmd0aCBhZGQgYXJyYXkgZGVmCiAgICBuZXdwcm9j +IDAgcHJvYzEgcHV0aW50ZXJ2YWwKICAgIG5ld3Byb2MgcHJvYzEgbGVuZ3Ro +IHByb2MyIHB1dGludGVydmFsCiAgICBuZXdwcm9jIGN2eAp9IGJpbmQgZGVm +Ci9uZ3JheXQgMjU2IGFycmF5IGRlZgovbnJlZHQgMjU2IGFycmF5IGRlZgov +bmJsdWV0IDI1NiBhcnJheSBkZWYKL25ncmVlbnQgMjU2IGFycmF5IGRlZgoJ +L2dyeXQgRk1MT0NBTAoJL2JsdXQgRk1MT0NBTAoJL2dybnQgRk1MT0NBTAoJ +L3JlZHQgRk1MT0NBTAoJL2luZHggRk1MT0NBTAoJL2N5bnUgRk1MT0NBTAoJ +L21hZ3UgRk1MT0NBTAoJL3llbHUgRk1MT0NBTAoJL2sgRk1MT0NBTAoJL3Ug +Rk1MT0NBTAovY29sb3JzZXR1cCB7CgljdXJyZW50Y29sb3J0cmFuc2ZlcgoJ +L2dyeXQgZXhjaCBkZWYKCS9ibHV0IGV4Y2ggZGVmCgkvZ3JudCBleGNoIGRl +ZgoJL3JlZHQgZXhjaCBkZWYKCTAgMSAyNTUgewoJCS9pbmR4IGV4Y2ggZGVm +CgkJL2N5bnUgMSByZWQgaW5keCBnZXQgMjU1IGRpdiBzdWIgZGVmCgkJL21h +Z3UgMSBncmVlbiBpbmR4IGdldCAyNTUgZGl2IHN1YiBkZWYKCQkveWVsdSAx +IGJsdWUgaW5keCBnZXQgMjU1IGRpdiBzdWIgZGVmCgkJL2sgY3ludSBtYWd1 +IG1pbiB5ZWx1IG1pbiBkZWYKCQkvdSBrIGN1cnJlbnR1bmRlcmNvbG9ycmVt +b3ZhbCBleGVjIGRlZgoJCW5yZWR0IGluZHggMSAwIGN5bnUgdSBzdWIgbWF4 +IHN1YiByZWR0IGV4ZWMgcHV0CgkJbmdyZWVudCBpbmR4IDEgMCBtYWd1IHUg +c3ViIG1heCBzdWIgZ3JudCBleGVjIHB1dAoJCW5ibHVldCBpbmR4IDEgMCB5 +ZWx1IHUgc3ViIG1heCBzdWIgYmx1dCBleGVjIHB1dAoJCW5ncmF5dCBpbmR4 +IDEgayBjdXJyZW50YmxhY2tnZW5lcmF0aW9uIGV4ZWMgc3ViIGdyeXQgZXhl +YyBwdXQKCX0gZm9yCgl7MjU1IG11bCBjdmkgbnJlZHQgZXhjaCBnZXR9Cgl7 +MjU1IG11bCBjdmkgbmdyZWVudCBleGNoIGdldH0KCXsyNTUgbXVsIGN2aSBu +Ymx1ZXQgZXhjaCBnZXR9Cgl7MjU1IG11bCBjdmkgbmdyYXl0IGV4Y2ggZ2V0 +fQoJc2V0Y29sb3J0cmFuc2ZlcgoJe3BvcCAwfSBzZXR1bmRlcmNvbG9ycmVt +b3ZhbAoJe30gc2V0YmxhY2tnZW5lcmF0aW9uCgl9IGJpbmQgZGVmCgkvdHJh +biBGTUxPQ0FMCi9mYWtlY29sb3JzZXR1cCB7CgkvdHJhbiAyNTYgc3RyaW5n +IGRlZgoJMCAxIDI1NSB7L2luZHggZXhjaCBkZWYgCgkJdHJhbiBpbmR4CgkJ +cmVkIGluZHggZ2V0IDc3IG11bAoJCWdyZWVuIGluZHggZ2V0IDE1MSBtdWwK +CQlibHVlIGluZHggZ2V0IDI4IG11bAoJCWFkZCBhZGQgMjU2IGlkaXYgcHV0 +fSBmb3IKCWN1cnJlbnR0cmFuc2ZlcgoJezI1NSBtdWwgY3ZpIHRyYW4gZXhj +aCBnZXQgMjU1LjAgZGl2fQoJZXhjaCBGbWNjIHNldHRyYW5zZmVyCn0gYmlu +ZCBkZWYKL0JJVE1BUENPTE9SIHsgCgkvZCA4IGRlZgoJZ3NhdmUKCXRyYW5z +bGF0ZSByb3RhdGUgc2NhbGUgL2ggZXhjaCBkZWYgL3cgZXhjaCBkZWYKCS9i +aXRtYXBzYXZlIHNhdmUgZGVmIAoJY29sb3JzZXR1cAoJL2lzIHcgZCB3Ynl0 +ZXMgc3RyaW5nIGRlZgoJL2NmIGN1cnJlbnRmaWxlIGRlZiAKCXcgaCBkIFt3 +IDAgMCBoIG5lZyAwIGhdIAoJe2NmIGlzIHJlYWRoZXhzdHJpbmcgcG9wfSB7 +aXN9IHtpc30gdHJ1ZSAzIGNvbG9yaW1hZ2UgCgliaXRtYXBzYXZlIHJlc3Rv +cmUgCglncmVzdG9yZQoJfSBiaW5kIGRlZgovQklUTUFQQ09MT1JjIHsgCgkv +ZCA4IGRlZgoJZ3NhdmUKCXRyYW5zbGF0ZSByb3RhdGUgc2NhbGUgL2ggZXhj +aCBkZWYgL3cgZXhjaCBkZWYKCS9sYiB3IGQgd2J5dGVzIGRlZiAKCXNsIGxi +IGx0IHtsYiBtc30gaWYgCgkvYml0bWFwc2F2ZSBzYXZlIGRlZiAKCWNvbG9y +c2V0dXAKCS9pcyBpbSAwIGxiIGdldGludGVydmFsIGRlZiAKCXdzIDAgbGIg +Z2V0aW50ZXJ2YWwgaXMgY29weSBwb3AgCgkvY2YgY3VycmVudGZpbGUgZGVm +IAoJdyBoIGQgW3cgMCAwIGggbmVnIDAgaF0gCgl7aXB9IHtpc30ge2lzfSB0 +cnVlIDMgY29sb3JpbWFnZQoJYml0bWFwc2F2ZSByZXN0b3JlIAoJZ3Jlc3Rv +cmUKCX0gYmluZCBkZWYKL0JJVE1BUEdSQVkgeyAKCTgge2Zha2Vjb2xvcnNl +dHVwfSBDT01NT05CSVRNQVAKCX0gYmluZCBkZWYKL0JJVE1BUEdSQVljIHsg +Cgk4IHtmYWtlY29sb3JzZXR1cH0gQ09NTU9OQklUTUFQYwoJfSBiaW5kIGRl +ZgovRU5EQklUTUFQIHsKCX0gYmluZCBkZWYKZW5kIAolJUVuZFByb2xvZwol +JUJlZ2luU2V0dXAKKDIuMCkgRk1WRVJTSU9OCjEgMSA2MTIgNzkyIDAgMSAx +IEZNRE9DVU1FTlQKL2ZpbGxwcm9jcyAzMiBhcnJheSBkZWYKZmlsbHByb2Nz +IDAgeyAwLjAwMDAwMCBncmF5bmVzcyB9IHB1dApmaWxscHJvY3MgMSB7IDAu +MTAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyIHsgMC4zMDAwMDAg +Z3JheW5lc3MgfSBwdXQKZmlsbHByb2NzIDMgeyAwLjUwMDAwMCBncmF5bmVz +cyB9IHB1dApmaWxscHJvY3MgNCB7IDAuNzAwMDAwIGdyYXluZXNzIH0gcHV0 +CmZpbGxwcm9jcyA1IHsgMC45MDAwMDAgZ3JheW5lc3MgfSBwdXQKZmlsbHBy +b2NzIDYgeyAwLjk3MDAwMCBncmF5bmVzcyB9IHB1dApmaWxscHJvY3MgNyB7 +IDEuMDAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyA4IHs8MGYxZTNj +NzhmMGUxYzM4Nz4gOCAxIHNldHBhdHRlcm4gfSBwdXQKZmlsbHByb2NzIDkg +ezwwZjg3YzNlMWYwNzgzYzFlPiA4IDEgc2V0cGF0dGVybiB9IHB1dApmaWxs +cHJvY3MgMTAgezxjY2NjY2NjY2NjY2NjY2NjPiA4IDEgc2V0cGF0dGVybiB9 +IHB1dApmaWxscHJvY3MgMTEgezxmZmZmMDAwMGZmZmYwMDAwPiA4IDEgc2V0 +cGF0dGVybiB9IHB1dApmaWxscHJvY3MgMTIgezw4MTQyMjQxODE4MjQ0Mjgx +PiA4IDEgc2V0cGF0dGVybiB9IHB1dApmaWxscHJvY3MgMTMgezwwMzA2MGMx +ODMwNjBjMDgxPiA4IDEgc2V0cGF0dGVybiB9IHB1dApmaWxscHJvY3MgMTQg +ezw4MDQwMjAxMDA4MDQwMjAxPiA4IDEgc2V0cGF0dGVybiB9IHB1dApmaWxs +cHJvY3MgMTUge30gcHV0CmZpbGxwcm9jcyAxNiB7IDEuMDAwMDAwIGdyYXlu +ZXNzIH0gcHV0CmZpbGxwcm9jcyAxNyB7IDAuOTAwMDAwIGdyYXluZXNzIH0g +cHV0CmZpbGxwcm9jcyAxOCB7IDAuNzAwMDAwIGdyYXluZXNzIH0gcHV0CmZp +bGxwcm9jcyAxOSB7IDAuNTAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9j +cyAyMCB7IDAuMzAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyMSB7 +IDAuMTAwMDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyMiB7IDAuMDMw +MDAwIGdyYXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyMyB7IDAuMDAwMDAwIGdy +YXluZXNzIH0gcHV0CmZpbGxwcm9jcyAyNCB7PGYwZTFjMzg3MGYxZTNjNzg+ +IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAyNSB7PGYwNzgzYzFl +MGY4N2MzZTE+IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAyNiB7 +PDMzMzMzMzMzMzMzMzMzMzM+IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxw +cm9jcyAyNyB7PDAwMDBmZmZmMDAwMGZmZmY+IDggMSBzZXRwYXR0ZXJuIH0g +cHV0CmZpbGxwcm9jcyAyOCB7PDdlYmRkYmU3ZTdkYmJkN2U+IDggMSBzZXRw +YXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAyOSB7PGZjZjlmM2U3Y2Y5ZjNmN2U+ +IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAzMCB7PDdmYmZkZmVm +ZjdmYmZkZmU+IDggMSBzZXRwYXR0ZXJuIH0gcHV0CmZpbGxwcm9jcyAzMSB7 +fSBwdXQKJSVFbmRTZXR1cAowIDYgL0hlbHZldGljYSBGTURFRklORUZPTlQK +JSVQYWdlOiAiMSIgMQolJUJlZ2luUGFwZXJTaXplOiBMZXR0ZXIKJSVFbmRQ +YXBlclNpemUKNjEyIDc5MiAwIEZNQkVHSU5QQUdFCjcyIDc0NiA1NDAgNzU2 +IFIKNyBYCjAgSwpWCjcyIDMyLjY3IDU0MCA0Mi42NyBSClYKNSBYCjExNSAx +ODAgNi4xNSA2LjE1IDMyMi42OSA0ODIuOTEgRwowLjUgSAoyIFoKMCBYCjEx +NSAxODAgNi4xNSA2LjE1IDMyMi42OSA0ODIuOTEgQQozMjAuNDkgNDg5Ljc3 +IDMyMC40OSA0ODIuOTQgMzIzLjE1IDQ4Mi4wNSAzMjcuOTYgNDg2Ljg2IDQg +TAo3IFgKVgo0NjUuMTQgMTA1LjkxIE0KIDQ2My42MSA4NS45IDQ3MC42IDY2 +Ljk4IDQ3Ni42OCA0OS41NiBECjAgWApOCjQzOCA5My4zNiBNCiA0MzguODEg +NzguMzcgNDQyLjg2IDY3Ljg0IDQ0Ny43MiA1OS43NCBECk4KNDI0LjIzIDk3 +LjgxIE0KIDQyMy40MiA4MS42MSA0MjUuODcgNjkuMTggNDMwLjczIDYxLjA4 +IEQKTgozOTYuNjkgMTAzLjA4IE0KIDM5NS44OCA4Ni44OCAzOTggODAuNTIg +NDAxLjI0IDcxLjIxIEQKTgozOTMuNTIgMTE1LjUxIE0KIDQwMi45NiAxMjQu +MSA0MzMuMTQgMTY4LjQxIDQ0NS4yOSAxNzguMjggRAogNDUxLjI0IDE1My44 +NiA0NDguNzEgMTQ5LjU1IDQ0Ni45MyAxMzguNjcgRAogNDMxLjc1IDEzMC40 +NCA0MjkuNzIgMTIzLjg2IDQ0Mi4yNSAxMjIuNDcgRAogNDQxLjQ5IDExOS4x +OCA0NDEuMjQgMTE4LjY3IDQ0MC45OSAxMTYuNjUgRAogNDIyLjYzIDExMy45 +OSAzOTUuODggMTE0LjE1IDM5NC40MSAxMTMuODYgRAo0IFgKVgo0NzUuNzkg +MTU4LjI5IDQ5OS4yMSAxMjAuODIgNDY2LjE3IDExNy4wMyA0NjkuMjEgMTM1 +LjI1IDQgTApWCjMxMC40MiA1NzguMTcgTQogMzA3LjQ4IDU4Ni42NiAzMDcu +MTggNjAxLjI1IDMxNy43MSA2MDQuOSBECiAzMTQuODcgNjE2LjY0IDMxOC45 +MiA2MTkuMDcgMzIyLjk3IDYyMi43MiBECiAzMjAuMTQgNjMzLjY1IDMyNC4x +OSA2NDEuNzYgMzMxLjg4IDY0MC41NCBECiAzMjcuMDIgNjU2LjM0IDMzNC43 +MiA2NjMuNjMgMzQxLjYgNjY0Ljg0IEQKIDMzNy41NSA2ODEuODUgMzQyLjQx +IDY4NC42OSAzNDguNzYgNjg5Ljg3IEQKIDM0Ni4wNiA3MDguNTggMzU3Ljgg +NzEyLjYzIDM2NS4xIDcxMC4yIEQKIDM2NS41IDcyNy42MiAzNzEuOTggNzI5 +LjY1IDM4MS4zIDczMi40OCBECiAzODAuODkgNzQ2LjY2IDM4OS40IDc0Ni4y +NSAzOTUuODggNzQ2LjY2IEQKIDM5OS4xMiA3NjQuODggNDEyLjA4IDc2My42 +NyA0MTguNTYgNzYyLjQ1IEQKIDQzMy45NSA3NzQuMiA0NDMuNjcgNzc0LjIg +NDUwLjUxIDc2Ny41OCBECiA0NzUuNjcgNzczLjM5IDQ3NC4wNSA3NjQuODgg +NDc2LjE1IDc1OC40MyBECiA0NzYuOTQgNzU3LjkzIDQ3Ny43MiA3NTcuNCA0 +NzguNSA3NTYuODYgRAogNDk2LjMyIDc1OCA0OTEuMDYgNzUxLjExIDQ5MS41 +MSA3NDEuNjUgRAogNTAxLjU5IDczMi40OCA0OTkuOTcgNzI0LjM4IDQ5My44 +OSA3MTcuOSBECiA0OTcuOTQgNzA4Ljk5IDQ5MS44NyA3MDEuNyA0ODcuNDEg +NzAwLjA4IEQKIDQ4Ny40MSA2ODcuOTMgNDg2LjIgNjg2LjMxIDQ3My4yMyA2 +ODYuMzEgRAogNDczLjY0IDY3Ni41OSA0NzUuNjcgNjcwLjUxIDQ1OS4wNiA2 +NjguODkgRAogNDYxLjg5IDY1Ni4zNCA0NTAuNTUgNjUzLjEgNDQ2LjEgNjUx +Ljg4IEQKIDQ0OS4zNCA2MzQuMDYgNDQwLjQzIDYzMi4wNCA0MzUuNTcgNjMw +LjgyIEQKIDQ0MC40MyA2MTcuMDUgNDM0Ljc2IDYxMy40IDQyOC4yOCA2MTEu +NzggRAogNDMzLjE0IDYwMS42NiA0MjcuMDYgNTk0Ljc3IDQyMC4xOCA1OTEu +NTMgRAogNDIyLjYxIDU3OC45OCA0MTYuNTMgNTczLjcxIDQxMS4yNyA1Njgu +ODUgRAogNDE4LjE1IDU1My4wNiA0MDguODQgNTQ1Ljc2IDQwMi44NSA1NDEu +ODcgRAogNDAzLjE3IDUyOC4zNSAzOTUuNDcgNTIyLjY4IDM4OS44IDUxOS44 +NCBECiAzODcuNzggNTA0LjQ1IDM3OC40NiA1MDQuODYgMzcxLjE3IDUwNC4w +NSBECjMgWApWCjAgWApOCjIzMi42NSA1NjYuNDIgMjU2LjY3IDU3NC4zOSAy +MzguMSA1NTMuODIgMyBMCjUgWApWCjIxOS4yMSAxMTcuODcgMjE5LjI5IDEz +NC4yNiAyMjEuNDMgMTM1LjI3IDIyNS44NiAxMzMuMjMgMjI1LjE4IDExOS41 +NiA1IEwKNCBYClYKMTcxLjkgNzcuMTYgMTc4LjMyIDcyLjMyIDIwMC42NiA1 +MC40MiAyMDEuNTkgNDYuNDYgMjAzLjkgNDYuMzcgMjE4LjUyIDY0LjA0IDIx +Ny4yNyA3My4wNQogMjEwLjYzIDc2Ljc1IDggTAowIFgKVgoxMzcuOTggODEu +MjEgMTMyLjkyIDcwLjU3IDEzMS4yNyA2NC4zNyAxNDQuMDUgNTcuOTIgMTQ5 +Ljg4IDcxLjcxIDE1My4yNyA3Ni4zNSAxNTMuMjcgODQuMTIgNyBMClYKMTUz +LjI3IDEwMi42NyBNCiAxMzIuOTIgMTIwLjE5IDEzMi45MiA5MS44NCAxMzYu +NDYgODEuNzEgRAogMTQyLjAzIDc4LjE3IDE0OC41OCA3OC43NiAxNTIuNjYg +NzkuMTggRAo0IFgKVgowIFgKTgoyNzUuNjkgMTAwLjQ0IE0KIDI5MS40MSA5 +Ni41OSAzMjguODUgNzEuMDggMzIwLjI0IDYyLjk4IEQKIDMwOC41OSA1NS44 +OSAyOTEuMDUgNjEuMTQgMjc4LjIyIDU5Ljk0IEQKVgpOCjMwNi4zMiAzMDIu +NDUgMjIyLjkzIDIyNy4wMSAyMDkuMTYgMjAzLjkzIDE2OS4wNiAyMTMuNjUg +MTcwLjY4IDIzMS4wNiAxODQuODYgMjUxLjcyIDIyNi41OCAzMDUuNTkgNyBM +CjQgWApWCjE3Mi43MSA5OC42MiAxNzIuNzEgNzYuNzUgMjE1LjY0IDc2Ljc1 +IDIxNS42NCA5OC4yMiA0IEwKVgowIFgKTgoxOTMuNzcgMTQxLjE1IDIxOS4y +OSAxMzQuMjYgMjE4Ljg4IDk4LjYyIDE3My4xMiA5OC42MiAxNzMuMTIgMTMx +LjQzIDUgTAo0IFgKVgowIFgKTgoyODEuMjYgMTYzLjAyIDI4MS4yNiA5Ny40 +MSAyNTguNTcgMTIzLjMzIDI1OC45OCAxNjMuNDIgNCBMCjQgWApWCjAgWApO +CjI4MS42NiAyNTkuMDEgMjgxLjY2IDE2Ni42NiAyMjQuMTUgMjMxLjA2IDMg +TAo0IFgKVgowIFgKTgoxNzcuMTYgMjI0LjE4IE0KIDE4My4xNSAyMTkuMzYg +MTg4LjkxIDIwMy41MiAxOTAuMTMgMTk1LjgzIEQKIDE4Ni44OCAxOTIuNTkg +MTc3LjI4IDE4OS4wNyAxNzIuMyAxODYuNTEgRAo2IFgKVgowIFgKTgoxNDku +NjIgNTAuOTYgTQogMTQzLjA0IDM4LjkzIDE2MC4zOSA0MC42MiAxNzUuOTUg +NDAuMyBECiAxOTEuMDMgMzkuOTkgMjA3LjM0IDM4LjQyIDIwMC41IDUwLjQ1 +IEQKMyBYClYKMCBYCk4KODkuMjggMTQ4LjQ0IE0KIDg3LjUzIDEzOS4yNyA5 +My4zMiAxMzkuOTMgOTQuMTQgMTMzLjg2IEQKIDkzLjYyIDExOC4yNiA5My42 +NyAxMTEuMjIgOTUuMzUgMTAzLjQ4IEQKIDExNi40MSA5Ny44MSAxMjguNTYg +MTAxLjQ2IDE1NC40OCAxMDIuNjcgRAogMTU1LjcgMTAzLjg5IDE1NC44OSAx +MDUuMSAxNTUuMjkgMTA3LjEzIEQKIDE2Mi4xOCAxMDUuOTEgMTc2LjQyIDEw +OC4wOCAxODUuNjcgMTA3LjUzIEQKIDE4Ni44OCAxMTUuMjMgMTg1LjI2IDEx +OC44NyAxODYuODggMTI4LjU5IEQKIDE5NS4zOSAxMzUuNDggMTk2LjYxIDE0 +MC43NCAxOTUuOCAxNDUuMiBECjMgWApWCjAgWApOCjIzOC43MyA2MjUuOTYg +TQogMjM0LjU2IDYzNC4yOSAyMzAuMTIgNjM3LjYgMjIxLjUxIDYzOS42MyBE +CiAyMDEuNzcgNjY4LjQ5IDE2Mi44NyA2NzQuMTYgMTM4LjQyIDY0Ny43MyBE +CiAxMTQuOTIgNjIyLjMyIDEyMS4yNyA1ODYuNDcgMTUwLjEzIDU1OC42MyBE +CiAxNjMuMTggNTQ2LjEgMTgyLjAyIDUyMS42NyAxNzcuNDcgNDkwLjc4IEQK +TgoxNzQuOTQgNTYyLjY4IDE1My4xNyA1ODEuOTEgMTU3LjcyIDU2MC4xNCAx +NDAuNTEgNTY3Ljc0IDE0OS42MiA1NDIuNDIgNSBMCk4KMTc0LjQzIDU1Mi4w +NCBNCiAxNjAuNjggNTY5LjUxIDEzNC45NCA1MzAuNzggMTY5LjM3IDUzNC4z +MiBECjcgWApWCjAgWApOCjE1OS4yNCA1MzkuODkgTQogMTYwLjc2IDU1My4w +NiAxNzAuMzggNTQ3LjQ5IDE3My40MiA1NDYuOTggRApOCjE3MC4zOCA1MzYu +MzUgTQogMTY0LjMgNTM4Ljg4IDE2NS4zMiA1NDYuNDcgMTcyLjkxIDU0Ni40 +NyBECk4KNyBYCjkwIDQ1MCAxOC40OCAxOC40OCAyMzcuNDYgNjA5LjUxIEcK +MCBYCjkwIDQ1MCAxOC40OCAxOC40OCAyMzcuNDYgNjA5LjUxIEEKNyBYCjkw +IDQ1MCAyMy4yOSAyMi4yOCAyMDkuMzYgNTk0LjA2IEcKMCBYCjkwIDQ1MCAy +My4yOSAyMi4yOCAyMDkuMzYgNTk0LjA2IEEKOTAgNDUwIDIuNzggMi43OCAy +MjEuNzcgNTgzLjY5IEcKOTAgNDUwIDIuNzggMi43OCAyMjEuNzcgNTgzLjY5 +IEEKOTAgNDUwIDIuNzggMi43OCAyNDYuNTggNTk5Ljg5IEcKOTAgNDUwIDIu +NzggMi43OCAyNDYuNTggNTk5Ljg5IEEKMjMyLjY1IDU2Ni40MiBNCiAyMDku +NTcgNTU1LjA4IDE3OC43OSA1MjkuOTcgMjAyLjI4IDUwMi45MyBECiAyMjIu +NjEgNDc5LjYgMjQ5LjM2IDQ4My4xOSAyNTAuODggNTE3LjExIEQKIDI1NC45 +MyA1MjIuMTcgMjYwLjUgNTE4LjEyIDI1OS45OSA1MzIuMyBECjUgWApWCjAg +WApOCjI1NC45MyA1NzQuMzIgTQogMjczLjE1IDU3NS44NCAzMDMuNjMgNTUy +Ljk4IDI3My42NiA1MzcuODcgRAogMjUzLjQxIDUyNy43NCAyMjUuMDYgNTIz +LjY5IDIwMy43OSA1MjUuNzIgRAo1IFgKVgowIFgKTgoyMDcuMzQgNTI5LjI2 +IDIwMC43NiA1MjEuMTYgMiBMCk4KMTY3LjM0IDY2My45MyBNCiAxNTYuOTQg +Njc5IDEyNS4zMiA2NjIuOTIgMTQyLjAzIDYzOC42MiBECk4KMTQ5LjYyIDY1 +Ni44NCBNCiAxMzAuODkgNjYzLjkzIDExNS4yIDY0NS43IDEyNy44NSA2MjYu +OTcgRApOCjE3Ny45OCA0OTguODggTQogMTUwLjY0IDQ5Ny4zNiAyMDkuMzYg +NDc0LjU4IDIzMC4xMiA0NjguNTEgRApOCjE3MC45OSA0OTYuNzYgMTUyLjE1 +IDQ2OC41MSAyIEwKTgoxNTIuMTUgNDY4LjUxIE0KIDE3My40MiA0NDguNzYg +MTk3LjcyIDQ0MC4xNiAyMjQuMDUgNDM3LjYzIEQKTgoyMzAuMTIgNDY4LjUx +IDIyNC4wNSA0MzcuNjMgMiBMCk4KMjQxLjIgNDkyLjM3IDI1MC44OCA0ODgu +MjUgMjYxIDQ4MS42NyAzIEwKTgoyNDEuMiA0OTIuMzcgTQogMjQ5Ljg3IDQ3 +My4wNiAyNzQuNjcgNDI4LjAxIDI3Ny4yIDM5OC4xNCBECiAzMDMuNTMgMzc5 +LjQgMzE0Ljc5IDM1MC41MiAzMTQuMTYgMzEwLjU1IEQKIDMxMi42NCAyOTMu +ODQgMjM4LjQyIDI5MC43IDIxNS42NCAyOTAuMiBECjcgWApWCjAgWApOCjE1 +Ni4yMSA0NjQuOTYgMTQ1LjA3IDQ1MS4yOSAyIEwKTgoxMTUuMiAzODYuNDkg +TQogMTA0LjQ3IDM5My4wMyA5Ny45OCAzOTcuNjMgOTUuNDUgNDA1LjczIEQK +IDk2LjQ2IDQyNS45OCAxMzguNDkgNDY1LjQ3IDE2OC4zNiA0NDcuNzUgRAog +MTg0LjA0IDQzOC4zNSAxNzcuNzIgMzk3LjY1IDE2OC44NiAzODUuNDggRApO +CjEwNi4wOCAzMTEuMDUgNzYuMjEgMzUxLjU2IDg3Ljg2IDM1MC4wNCA4Ny44 +NiAzNjIuMTkgOTguNDkgMzU2LjYyIDk3LjQ4IDM3Mi4zMiAxMDcuMSAzNjMu +NzEKIDEwNS4wNyAzODEuOTMgMTE3LjczIDM3MS4zIDExNi4yMSAzODkuMDIg +MTI4Ljg3IDM3OS40IDEyNy44NSAzOTUuNiAxMzguOTkgMzg3IDEzOC40OSA0 +MDEuNjggMTQ5LjYyIDM5Mi41NwogMTUwLjY0IDQwNS4yMiAxNTYuMjEgMzk2 +LjExIDE2MC4yNiA0MDUuMjIgMTggTApOCjk4LjQ5IDM5OC4xNCBNCiA2NC41 +NyAzNjAuNjcgNjQuOTIgMjkzLjQzIDkzLjkzIDI1NC4zNSBECk4KMTA2LjA4 +IDMxMS4wNSBNCiAxMTMuNjggMzAyLjk1IDExMy42OCAyOTcuODkgMTIwLjc3 +IDI4Ny43NyBECk4KMTIwLjc3IDI4Ny43NyBNCiAxNTAuMTMgMjk1LjM2IDE2 +My44IDI2MS40NCAxMjQuODIgMjY3LjAxIEQKTgozMDYuMzIgMzAyLjQ1IE0K +IDMwMS43NyAyNjYgMjYyLjUyIDIzOC42NiAyMjYuNTggMjMxLjA2IEQKNCBY +ClYKMCBYCk4KMTYwLjI2IDQwNS4yMiBNCiAxNjguMTIgMzg3Ljk2IDE3MS45 +IDM2Ny41NiAxODUuMDcgMzUwLjEgRAogMTkyLjk2IDM1MC41NSAxOTIuOTYg +MzQ5LjMzIDE5NC4xOCAzNDQuOTggRApOCjkwIDQ1MCAxNC41OCAxNy44MiAx +OTEuNzUgMzI2LjY1IEEKOTAgNDUwIDIuNjMgMi42MyAxODkuOTIgMzI5LjI4 +IEcKOTAgNDUwIDIuNjMgMi42MyAxODkuOTIgMzI5LjI4IEEKNyBYCjkwIDQ1 +MCAyMC40NSAyMS4wNiAxNjcuMjQgMzEzLjI4IEcKMCBYCjkwIDQ1MCAyMC40 +NSAyMS4wNiAxNjcuMjQgMzEzLjI4IEEKOTAgNDUwIDIuNjMgMi42MyAxNTcu +NTIgMzEzLjA4IEcKOTAgNDUwIDIuNjMgMi42MyAxNTcuNTIgMzEzLjA4IEEK +MTg3LjcgMzA5LjY0IE0KIDIyMC45MSAzMjguNjcgMjIwLjEgMjk5LjUxIDE5 +OS44NSAyOTYuNjggRAo3IFgKVgowIFgKTgoyMDguNzYgMzAwLjMyIE0KIDIx +NS42NCAyOTAuMiAyMTQuNDMgMjkyLjIyIDIyNS4zNiAyODAuMDcgRAogMjEz +LjYyIDI1OC42IDE3OC4zOCAyNjMuMDYgMTYyLjU4IDI2NC42OCBECjcgWApW +CjAgWApOCjE1OC4xMyAyNjMuMDYgMTY0LjIgMjY3LjUyIDIgTApOCjE5Mi45 +NiAyNjMuODcgTQogMTkyLjU2IDI1OS4wMSAxOTAuMTMgMjU2LjU4IDE4MS4y +MSAyNTYuMTcgRAogMTgwIDI1MC45MSAxNzYuNjYgMjM3Ljk4IDE3Mi41NCAy +MzMuMjQgRAo0IFgKVgowIFgKTgoxNTIuODYgMjM4LjM1IE0KIDE2My44IDIz +MS4wNiAxNzEuMDkgMjM1LjExIDE3NS45NSAyMzQuMyBECiAxNzcuNTcgMjE4 +LjkxIDE3NS41NCAyMTAuODEgMTc2LjM1IDE5OS44OCBECiAxOTcuNTUgMTcx +LjEgMjM2LjI5IDEzNS45NCAxNDIuMzMgMTM3LjEgRAogMTA5LjUzIDEzNy41 +IDU2LjQ3IDE0MS4xNSAxMDQuMjYgMTkxLjM3IEQKNiBYClYKMCBYCk4KMTU0 +Ljg5IDExNC40MiAxNTUuMjkgMTA2LjMyIDIgTApOCjEwNC4yNiAxOTUuMDIg +TQogMTA2LjU2IDE3NC4wOSAxMDIuMjQgMTM5LjEyIDEwNi4yOSAxMjMuNzMg +RAogMTEwLjA5IDExOS40OSAxMTQuMjkgMTE4LjkxIDEyNC4xMSAxMTkuNjgg +RAogMTMyLjIxIDEwNS4xIDEzOC42OSAxMDcuOTQgMTI3LjQ3IDEzNC44NyBE +CiAxMjcuNDcgMTQ5LjA1IDEyNi45NCAxNzIuNzQgMTMyLjYxIDE4OS43NSBE +CjcgWApWCjAgWApOCjEyNC4xMSAxMTkuNjggTQogMTEyLjM2IDg1LjY2IDEw +NS44OCAxMDYuNzIgMTExLjU1IDEwOS4xNSBECjcgWApWCjAgWApOCjEwOS4z +NyAxMjYuNzcgMTA0LjU3IDEyMy4xIDEwMC44OSAxMTQuMTEgMTE3LjIyIDEx +MC4xOSAxMjIuMDMgMTE2LjUyIDEyNS41NyAxMjMuOTkgNiBZCjcgWApWCjEw +OC43MiAxMTguNDcgTQogOTEuMyAxMDUuOTEgMTE0Ljc5IDEwMy4wOCAxMTYu +NDEgMTE2LjQ0IEQKVgowIFgKTgoxMDYuMjkgMTI0Ljk1IE0KIDk3Ljc4IDEy +MS4zIDk0Ljk0IDEwOS4xNSAxMDMuNDUgMTE0LjAxIEQKNyBYClYKMCBYCk4K +MTA3LjAzIDIyMS42MSBNCiAxMDAuNjIgMjExLjIyIDk5IDIwMy4xMiA5OS40 +IDE5OC4yNiBECiAxMDcuMjEgMTkxLjUyIDEyOS4zNyAxODguOTQgMTQwLjcx +IDE5MC4xNiBECiAxNDUuMTcgMTk4LjY2IDEzOC4wOCAyMTIuNjkgMTQxLjAy +IDIyMC40MyBECjYgWApWCjAgWApOCjExOS4yNSAyNDcuNzcgTQogMTI5LjYg +MjQwLjcyIDEzNy45IDIzNy40NSAxNDQuMDQgMjM2LjcgRAogMTYwLjkxIDIz +NC42MyAxNjIuMjggMjUyLjgzIDE0MC41MSAyNTguNCBECiAxMjguMjMgMjYx +LjYxIDEzMC44OSAyNjIuOTYgMTI0LjgyIDI2Ny4wMSBECjcgWApWCjAgWApO +CjkzLjkzIDI1NC4zNSBNCiA4OS44OCAyMTkuOTMgMTM5LjUgMTk1LjYyIDE0 +MS4wMiAyMjAuNDMgRAo3IFgKVgowIFgKTgoxMTUuNyAyMzAuNTYgTQogMTI4 +LjM2IDIxMy4zNCAxNjcuMzQgMjE5LjQyIDE0Ny42IDIzNi4xMyBECjcgWApW +CjAgWApOCjE3Mi43MSAxMDcuMjggMTcyLjcxIDc2Ljc1IDIgTApOCjE1My4y +NyAxMDIuNjcgMTUzLjI3IDc2LjM1IDIgTApOCjE1My4yNyA3Ny4xNiBNCiAx +NjIuOTkgNjguMjQgMTcyLjcxIDczLjEgMTcxLjkgNzcuMTYgRAogMTk4LjIz +IDY3LjAzIDEzNC4yMyA2NC42IDE1My4yNyA3Ny4xNiBECjcgWApWCjAgWApO +CjcgWAo5MCA0NTAgNS44NyA1LjQ3IDE1Ny41MiA2MS41NiBHCjAgWAo5MCA0 +NTAgNS44NyA1LjQ3IDE1Ny41MiA2MS41NiBBCjE3OC4zMiA3Mi4zMiBNCiAx +ODkuMjYgNjguNjcgMjAwLjI1IDYwLjk2IDIwMC42NiA1MC40MiBECjcgWApW +CjAgWApOCjIwMC42NiA1MC40MiAxNTIuMDUgNTAuNDIgMiBMCk4KMTMwLjE4 +IDcyLjcgMTMwLjE4IDEwMC42NSAyIEwKTgoxMDguMzEgOTQuMTcgMTA4LjMx +IDcyLjI5IDIgTApOCjEwOC4yNCA5NC41IE0KIDEwNS45NiA5Ni42NSAxMDQu +NTcgOTcuNjYgMTA0LjY5IDEwMS4zMyBECk4KMTI4LjQ5IDQyLjg1IE0KIDEz +MC40NiA0Mi4xNSAxMzAuMiA2NS45MSAxMzEuOSA2NS4xMyBECiAxNDMuOCA1 +OS42OCAxNTMuMjIgNDkuODcgMTUyLjg2IDQzLjEzIEQKNyBYClYKMCBYCk4K +MTQ5Ljg4IDcxLjcxIE0KIDE0Ni43MSA2Ny4wMyAxNDUuNyA2Ni42NSAxNDQu +MDUgNTcuOTIgRAo3IFgKVgowIFgKTgoxMDIuNjQgNDUuMTYgTQogOTcuMzgg +MzMuODIgMTEzLjQgMzMuNzQgMTI4Ljk3IDMzLjQxIEQKIDE0NC4wNSAzMy4x +IDE1OS43NSAzMS43OSAxNTIuNDYgNDIuMzIgRAozIFgKVgowIFgKTgoxMDQu +MjYgNjYuNjMgTQogMTAxLjgyIDU1LjI4IDEwMi4yNCA0OC40IDEwMy4wNSA0 +NC43NSBECiAxMjAuODcgNDAuMyAxNDAuNzYgNDIuMSAxNTIuOTEgNDIuMzUg +RAo3IFgKVgowIFgKTgoxMDguMzEgNzIuMjkgTQogMTE3LjIyIDY4LjY1IDEy +My4zIDcwLjY3IDEzMC4xOCA3Mi43IEQKIDE0OCA1OC41MyA4Ni4wOSA2MC4y +IDEwNy43MyA3NS4xMyBECjcgWApWCjAgWApOCjEyMi42NiA2Mi4zNSAxMjgu +ODcgNjIuODUgMTMwLjY0IDYzLjk5IDEzMS4yNyA2NC4zNyAxMzEuOSA2NC4y +NSAxMzMuNDIgNjMuNjEgMTMyLjQxIDUxLjQ2CiAxMjUuOTYgNTIuMjIgOCBM +CjcgWApWCjIyMS4zMSAxMzUuMDcgMjA5LjU3IDEyOC41OSAyMDkuNTcgMTM2 +LjI5IDE5NS4zOSAxMzAuMjEgMTk2LjIgMTQ2LjgyIDE3Ny41NyAxNTMuMyAx +ODcuMjkgMTY4LjY5CiAxNjkuNDcgMTgxLjI1IDE5MC4xMyAxOTUuODMgMTg1 +LjY3IDIxNi4wOCAyMTEuNTkgMjEzLjI0IDIyMC41IDIzNi4zMyAyMzkuNTQg +MjIxLjM0IDI2MS40MSAyMzIuMjggMjYyLjIyIDIxMi4wMwogMjc4LjQyIDIx +NC40NiAyNzIuNzUgMTk1LjAyIDI4NS43MSAxODYuOTIgMjc2LjggMTc2LjM5 +IDI4Ni4xMSAxNjUuMDQgMjY4LjQ3IDE1Ny4yNyAyMSBMClYKMCBYCk4KMjEx +LjU5IDE0NS4yIE0KIDIyMi41MyAxMzMuMDUgMjE5LjY5IDEzNC42NyAyNDAu +MzUgMTI5LjQgRApOCjkwIDQ1MCAxNC40MiAxNC45OSAyMTkuNDUgMTcyLjc0 +IEEKOTAgNDUwIDEzLjE2IDEzLjE2IDI1My41MSAxODEuODUgQQo5MCA0NTAg +Mi4wMyAyLjAzIDI1My43MSAxODguNTQgRwo5MCA0NTAgMi4wMyAyLjAzIDI1 +My43MSAxODguNTQgQQo5MCA0NTAgMi4wMyAyLjAzIDIyMi45MyAxODAuMDMg +Rwo5MCA0NTAgMi4wMyAyLjAzIDIyMi45MyAxODAuMDMgQQoxOTcuODIgMTc0 +Ljc3IDIwNS4xMSAxNzQuMzYgMiBMCk4KMjA1LjUyIDE5MC41NiAyMTAuNzgg +MTg0LjQ5IDIgTApOCjIyNS4zNiAxOTYuMjMgMjI0LjE1IDE4Ni45MiAyIEwK +TgoyNDAuMzUgMTk4LjI2IDI0NC44IDE5Mi4xOCAyIEwKTgoyNTQuNTIgMjAx +LjkgMjU0LjUyIDE5NC42MSAyIEwKTgoyNjguNyAxOTcuODUgMjYzLjg0IDE5 +MC4xNiAyIEwKTgoyMzkuMTMgMjIwLjUzIE0KIDI0My4xOCAyMTQuNDYgMjQy +Ljc4IDIxMC40MSAyNDAuMzUgMjA1LjU1IEQKTgoyMTEuNTkgMjExLjYyIE0K +IDIxMS41OSAyMDUuMTQgMjA5LjE2IDIwMy45MyAyMTcuNjcgMTk3LjA0IEQK +TgoyMTcuNjcgMTk3LjA0IDIyNi45OCAyMDMuNTIgMjMzLjQ2IDIwNS4xNCAy +NDAuMzUgMjA1LjU1IDQgTApOCjIzOS4xMyAyMjAuNTMgMjMxLjQ0IDIxMi40 +MyAyMjYuOTggMjEwLjgxIDIxMS41OSAyMTEuNjIgNCBMCk4KMjMxLjQ0IDIx +Mi40MyAyMzMuNDYgMjA1LjE0IDIgTApOCjIyNi45OCAyMTAuODEgMjI2Ljk4 +IDIwMy41MiAyIEwKTgoyMDQuMyAxNTQuNTIgTQogMTg5LjcyIDE1My4zIDIw +My45IDEzOC43MiAyMTEuNTkgMTQ1LjIgRApOCjI0MC43NSAxNjkuOTEgTQog +MjUzLjcxIDE4MC44NCAyNTguOTggMTY0LjIzIDI0My45OSAxNjAuMTggRAo3 +IFgKVgowIFgKTgoyMDQuMTEgMTUxLjY4IE0KIDE5OC44OCAxNTEuMjQgMjAz +Ljk3IDE0Ni4wMSAyMDYuNzMgMTQ4LjM0IEQKTgoyNjUuNDYgMTY3LjQ3IE0K +IDI3My41NiAxNjguNjkgMjcwLjMyIDE1NS43MyAyNjQuNjUgMTU1LjMzIEQK +TgoyNjUuNTkgMTY1LjQ1IE0KIDI2OC4zIDE2NS44NSAyNjcuMjEgMTYxLjUz +IDI2NS4zMiAxNjEuNCBECk4KMjU2LjU1IDE1MS4yOCBNCiAyNDIuMzcgMTc5 +LjYzIDIxOC4yMiAxMTguMjkgMjUzLjc5IDEzMC4xOSBECk4KMjY0LjY1IDE1 +NS4zMyBNCiAyNjMuNDMgMTUyLjA5IDI2My40MyAxNTAuMDYgMjYwLjYgMTQ3 +LjIyIEQKNyBYClYKMCBYCk4KMjI1LjM2IDEzMy44NiAyMjUuMzYgMTIwLjkg +MiBMCk4KMjI1LjM2IDEyMC45IE0KIDIwNi43MyAxMTIuOCAxOTcuNDIgODEu +MjEgMjE2LjQ1IDczLjEgRAo3IFgKVgowIFgKTgoyMjMuMzQgOTIuNTUgTQog +MjE3LjE1IDgyLjQ4IDIxNC44MyA2OS4wNSAyMjAuNSA1OS43NCBECk4KMjE4 +LjQ4IDYzLjk5IE0KIDIxMS41OSA2NC40IDIwMy4wOSA1NS4yOCAyMDMuNDkg +NDUuOTcgRAo3IFgKVgowIFgKTgoyMDMuOSA0Ni4zNyBNCiAxNzguNzkgNDcu +OTkgMTY3Ljg1IDI4LjE1IDIxNC44MyAyOS4zNiBECjcgWApWCjAgWApOCjIx +NC44MyAyOS4zNiBNCiAyMjguMiAxOC4wMiAzMDcuOTkgMjIuODggMjgwLjQ1 +IDQ1LjE2IEQKTgoyNTguNTcgMTIzLjMzIDI1OC41NyAxMzEuODMgMiBMCk4K +MjQ4LjQ1IDE1MC44NyBNCiAyNjkuMTEgMTU3LjM1IDI2OC4zIDEyMy43MyAy +NDkuMjYgMTMxLjQzIEQKNyBYClYKMCBYCk4KMjQ4LjQ1IDE0My45OCBNCiAy +NjQuNjUgMTQ1LjIgMjU1Ljc0IDEzNS44OCAyNDguNDUgMTM3LjUgRApOCjI2 +NC4zIDE1Ni42NCAyNjIuOSAxNTEuOTYgMjYxLjM4IDE0OC45MiAyNTkuMzYg +MTUwLjQ0IDI1Ny43MSAxNTEuNzEgMjU2LjQ1IDE1Ny4yNyA2IEwKNyBYClYK +MjU1LjE4IDEyMy4xIDI1OS4zNiAxMjMuMSAyNTkuMzYgMTE5Ljk0IDMgTApW +CjE5MS4zOSAyNTguMjggMTg4LjQ4IDI1Ni44OCAxODUuNyAyNTYuMTIgMTgz +LjU0IDI0OS4wNCAxOTIuOTEgMjQ4LjkxIDE5NC45MyAyNDkuMTYgNiBMCjQg +WApWCjE5MS45IDI2Mi43MSAxOTEuNjQgMjYwLjkzIDE5MC42MyAyNTkuNDEg +MTg4Ljg2IDI1OC4yOCAxODYuMDcgMjU5LjQxIDUgTAo3IFgKVgoyODEuMTMg +ODMuMjMgMjczLjAzIDgyLjcyIDI3My40MSA3MC45NSAyODIuNjUgNjYuNzgg +NCBMCjAgWApWCjI3NC43NyA3Mi43IE0KIDI4NC4wOSA2Mi4xNyAyODQuMDkg +NTAuODMgMjc5LjIzIDQwLjMgRAo3IFgKVgowIFgKTgoyNTguNiAxMjMuNzMg +TQogMjgyLjUgMTIyLjExIDI4Ni43MyA5Mi4xNCAyNzQuMzcgNzguMzcgRAo3 +IFgKVgowIFgKTgoyNjcuMDggMTA3LjEzIE0KIDI3My4xOCA5Ny4wNSAyNzYu +OCA3Ny41NiAyNzMuOTYgNjYuNjMgRAo3IFgKVgowIFgKTgoxMzcuNiA4MC44 +MyAxMzIuOTIgNzAuNTcgMiBMCk4KMjE3LjEyIDYyLjM1IDIwNi44MyA1Mi45 +OCAyMDQuNjggNDguNTUgMjA0LjQzIDQzLjg3IDIxOC44NiA0OC41NSA1IEwK +NyBYClYKMjMwLjEyIDQ2OC41MSAyNTEuODkgNDQ2LjIzIDI2MSA0ODEuNjcg +MjcyLjY1IDQ0Ni4yMyAyNjAuNSA0NTEuMjkgNSBMCjAgWApOCjIyNy44NCAx +MjAuOTUgMjIzLjQxIDExOS4zIDIyNC40MyAxMTUuNzYgMyBMCjcgWApWCjI1 +Mi45IDU5OC40MiBNCiAyNzguNDIgNTg5LjkxIDI2MSA1NjkuNjYgMjMyLjY1 +IDU2Ni40MiBEClYKMCBYCk4KNSBYCjkwIDQ1MCA2LjQ4IDYuNDggMzYxLjQ1 +IDQ3Ny4zMiBHCjAgWAo5MCA0NTAgNi40OCA2LjQ4IDM2MS40NSA0NzcuMzIg +QQo1IFgKOTAgNDUwIDYuNDggNi40OCAzNDguMDggNDc0Ljg5IEcKMCBYCjkw +IDQ1MCA2LjQ4IDYuNDggMzQ4LjA4IDQ3NC44OSBBCjUgWAo5MCA0NTAgNi40 +OCA2LjQ4IDMzMy4xIDQ3NC4wOCBHCjAgWAo5MCA0NTAgNi40OCA2LjQ4IDMz +My4xIDQ3NC4wOCBBCjUgWAowIDc4IDYuMTUgNi4xNSAzNzAgNDg5LjM5IEcK +MCBYCjAgNzggNi4xNSA2LjE1IDM3MCA0ODkuMzkgQQozMTguMTEgNTg1LjA1 +IE0KIDMyMS4zNSA1ODcuODkgMzIxLjc2IDU4OC4yOSAzMjIuNTcgNTkzLjU2 +IEQKIDMyOS40NSA1ODkuOTEgMzMyLjY5IDU5My41NiAzMzUuMTIgNTk4LjAx +IEQKIDMzOS41OCA1OTEuOTQgMzQ0LjAzIDU5NS4xOCAzNDcuMjcgNTk4LjAx +IEQKIDM0OC4wOCA1ODcuNDggMzU3LjQgNTg4LjcgMzY0LjI5IDU4OS41MSBE +CiAzNjMuNDggNTc4LjE3IDM3Mi43OSA1ODIuNjIgMzc1LjIyIDU4MC42IEQK +IDM3MS45OCA1NjguNDUgMzc5LjY3IDU2OC44NSAzODAuODkgNTY3LjY0IEQK +IDM3NS4yMiA1NjYuMDIgMzcwLjYgNTU2LjggMzc3LjY1IDU1MS44NCBECiAz +NjkuOTUgNTQwLjEgMzc4Ljg2IDUzNi44NSAzODAuODkgNTM2LjQ1IEQKIDM5 +MC42MSA1NDkuNDEgNDAwLjc0IDUxNC41OCAzNzMuMiA1MjAuMjUgRAo3IFgK +VgowIFgKTgo3IFgKOTAgNDUwIDE4LjQzIDIxLjA2IDMyNS4yIDU2NS42MSBH +CjAgWAo5MCA0NTAgMTguNDMgMjEuMDYgMzI1LjIgNTY1LjYxIEEKMzMyLjI5 +IDU1Mi4yNSBNCiAzMDUuNTYgNTc3LjM2IDI5Ni4yNCA1NDAuMSAzMjIuNTcg +NTQwLjEgRAo3IFgKVgowIFgKTgo5MCA0NTAgMi43OCAyLjc4IDMxNC4yMSA1 +NzMuMTUgRwo5MCA0NTAgMi43OCAyLjc4IDMxNC4yMSA1NzMuMTUgQQozNDQu +NDQgNTgxLjQxIDM0MS42IDU4OC4yOSAyIEwKTgozNTQuOTcgNTgxIDM1Ny44 +IDU4Ni4yNyAyIEwKTgozNjMuNDggNTc0LjEyIDM2Ny45MyA1NzkuNzkgMiBM +Ck4KMzY3LjkzIDU2MS45NyAzNzIuMzkgNTY0LjggMiBMCk4KMzI4LjY0IDU4 +Ny40OCAzMjkuMDUgNTk0Ljc3IDIgTApOCjMwOC4zOSA1NzQuOTMgMzAzLjk0 +IDU3OC41NyAyIEwKTgozMTMuMjUgNTgxLjgxIDMwOC44IDU4Ny40OCAyIEwK +TgozMTkuNzMgNTg2LjI3IDMxOC4xMSA1OTEuOTQgMiBMCk4KMzM1LjQzIDU0 +NS40NiAzMzMuMjcgNTQ4LjM3IDMyNC41NCA1NDYuOTggMzI1LjA1IDU0MC41 +MiA0IEwKNyBYClYKMzc4LjA1IDUzMC4zNyBNCiAzODYuOTcgNTM1LjY0IDM4 +Ni41NiA1MjQuMyAzNzguMDUgNTI0LjMgRAowIFgKTgozMDguOSA1MjcuMjkg +TQogMzEyLjg1IDUxOS40NCAzMTIuODUgNTE5LjQ0IDMyMC41NCA1MTMuNzcg +RApOCjM0MC43NCA1NDEuMTYgTQogMzQ4LjcyIDUzNy45OSAzNTUuMTcgNTQw +LjI3IDM1OC40NyA1NDEuNzYgRAogMzY3LjU5IDU0NS45MSAzNjUuMDkgNTI3 +LjM3IDM0My4yNyA1MjkuNTEgRAo3IFgKVgo5MCA0NTAgMTguNDMgMjEuMDYg +MzQ5LjEgNTYwLjc1IEcKMCBYCjkwIDQ1MCAxOC40MyAyMS4wNiAzNDkuMSA1 +NjAuNzUgQQo5MCA0NTAgMi43OCAyLjc4IDM0MS4zNSA1NjUuMDUgRwo5MCA0 +NTAgMi43OCAyLjc4IDM0MS4zNSA1NjUuMDUgQQozNDYuMTggNTMxLjU0IDM2 +My4yNyA1MzYuMSAzNzIuNzcgNTIyLjE3IDM3MS4zNyA1MDIuNDMgMzQ1LjQz +IDUyOS4xMyA1IEwKNyBYClYKMzA3LjE4IDU0OC42IE0KIDI1MC44OCA1MzQu +ODMgMzQ2LjU0IDUxMy4wNSAzNjQuNjkgNTI3Ljk0IEQKMCBYCk4KMzYzLjA3 +IDUzMS4xOCBNCiAzNjUuOSA1MjkuNTYgMzY1LjkgNTI3LjEzIDM2NS41IDUy +My40OSBECk4KMzczLjIgNTIwLjI1IDM3MC43NyA0ODkuODcgMiBMCk4KNSBY +CjkwIDQ1MCA2LjQ4IDYuNDggMzcyLjc5IDQ4My44IEcKMCBYCjkwIDQ1MCA2 +LjQ4IDYuNDggMzcyLjc5IDQ4My44IEEKMzE5LjIzIDQ3MC41MyBNCiAzMTUu +MTggNDM2LjExIDI5NS45NCA0NDQuNzEgMjk2Ljk1IDQxNC4zNCBECiAyOTgu +MDcgMzgwLjc1IDMzNC40MSAzNzkuNCAzMjMuMjggMzE5LjE2IEQKIDMwOC4y +NCAyMzguNzQgMjk3Ljk2IDIyMS45NSAyOTkuOTkgMTUzLjEgRAogMzA3LjA4 +IDEzOS45MyAzNjMuNzggMTI5LjMgMzkxLjEyIDEzNC4zNiBECk4KMzc0LjQx +IDQ3Ny4xMSBNCiAzOTcuNyA0NDAuNjYgNDQ5Ljg1IDQxMy44MyA0MjAuNDgg +MzQ4LjUyIEQKTgozNjUuMyA0MzUuNiBNCiAzODYuMDUgNDIwLjkyIDM5NS40 +MiAzOTMuMDcgMzkwLjM2IDM3MS44MSBECk4KMzgwLjk5IDQxOC44OSBNCiAz +ODIuNTEgMzk1LjEgMzg4LjA4IDM3Mi4zMiAzOTguMiAzNTQuNiBECk4KMzA1 +LjQzIDQ0MC4wMyBNCiAzMjUuNjggNDMxLjkzIDM0OC40NiA0MjkuMjcgMzY4 +LjcxIDQzMi44MiBECk4KMjY0LjA0IDQ0My4xOSBNCiAyODkuMzYgNDQwLjE2 +IDI5OC40NyA0NjQuNDYgMzE4LjIxIDQ2NC40NiBECk4KMjc1LjE4IDQwOS43 +OCBNCiAyODYuMzIgNDExLjggMjg2LjcgNDEyLjA2IDI5Ni44MiA0MTguNjQg +RApOCjI2OS42MSA0NTUuODUgMjg5LjM2IDQ1MC4yOCAyIEwKTgoyOTMuNDkg +MzgzLjAyIDMxMS41MiAzODEuNDIgMiBMCk4KMjg3Ljg0IDQxMi44MiAyODYu +MzggMzkwLjYzIDIgTApOCjQyMi41MSA0NDUuNzMgTQogNDUxLjM2IDQ0MC4x +NiA0MDguODQgNDAwLjY3IDQwOS44NSA0MjkuNTIgRAo3IFgKVgowIFgKTgo0 +MDguMzMgNDY0LjQ2IE0KIDQ0NS4zNCA0NjcuOSA0MDIuODkgNDAwLjY3IDM5 +NS4yOSA0NDMuNyBECjcgWApWCjAgWApOCjM4Mi42NCA0NjYuODYgTQogNDQy +LjM4IDQ5My43IDM4NC45MiA0MDguMzkgMzg2Ljk0IDQ2MS41NSBECjcgWApW +CjAgWApOCjM4MiA0NjYuNDggMzg2LjMxIDQ2MS40MiAyIEwKTgoyNDguNDUg +MTUwLjg3IDI0OC40NSAxNDMuOTggMiBMCk4KMjQ4LjQ1IDEzNy41IDI0OS4y +NiAxMzEuNDMgMiBMCk4KMzI0LjMzIDE0MC4xOCBNCiAzMjYuMjEgMTE1LjYz +IDMyMy43OCAxMDAuMjQgMjk2LjA0IDkwLjkgRApOCjMxMi4zIDc5LjA0IE0K +IDMzNS4xMiA4NC40NSAzNDcuMjcgOTAuOTMgMzUyLjEzIDk1LjM4IEQKIDM1 +Mi41NCA5MC4xMiAzNTEuMzIgODUuMjYgMzUxLjczIDc5Ljk5IEQKIDM0OC4z +NSA3Ny4xNiAzNDMuNjMgNzQuNzIgMzM2LjAzIDc1LjI4IEQKIDMzNC41NCA3 +NS4xNyAzMzguNSA3OS43OSAzMzUuNTMgNzkuMTggRAogMzMxLjcgNzguMzkg +MzI1LjMxIDcyLjk5IDMxOC4xMSA3MS44OSBECjIgWApWCjAgWApOCjM0OS43 +IDEzNS4wNyAzNTIuMTMgOTUuMzggMiBMCk4KMzc3LjY3IDEzMy4xNCBNCiAz +NzguNjMgMTA5LjcgMzk0LjYgODYuNjMgMzcxIDc4LjU2IEQKIDM1Ni4xMiA3 +My41IDM1Mi42OSA2Ni4xMSAzNDguNDkgNjMuMzkgRApOCjM4Mi45MiA1OC41 +MyBNCiAzNjYuMzEgNjAuMTUgMzUyLjk0IDUwLjgzIDM0OC40OSA2My4zOSBE +CiAzMjAuNTQgMzkuNDkgMzUwLjUxIDQ1LjU2IDM3NS42MyA0Ni4zNyBECjIg +WApWCjAgWApOCjQ0NS4yOSAyMjcuMDEgNDcyLjgzIDIyMS4zNCA0NzIuODMg +MjM4LjM1IDQ5Mi4yNyAyMzkuMTYgNDg4LjIyIDI1OC42IDUwNi40NSAyNzEu +MTYgNDg5Ljg0IDI4OC41OAogNTA2Ljg1IDMxMi4wNyA0ODAuMTIgMzE3LjMz +IDQ4Ny4wMSAzNDYuMDkgNDU1LjgyIDM0MC4wMSA0NDUuMjkgMzYyLjcgNDIy +LjIgMzQ2LjQ5IDM5Ny45IDM1NSAzOTMuMDQgMzMxLjEKIDM3MS4xNyAzMzAu +MjkgMzgwLjA4IDI5OS41MSAxNyBMCk4KNyBYCjkwIDQ1MCAxOS4wNCAyMS40 +NyAzOTIuNjQgMjgzLjcyIEcKMCBYCjkwIDQ1MCAxOS4wNCAyMS40NyAzOTIu +NjQgMjgzLjcyIEEKNDQxLjY0IDI4My4zMSA0NTAuMTUgMjg1Ljc0IDIgTApO +CjQzNS44OCAyOTQuNDQgNDQxLjY0IDI5OC4zIDIgTApOCjQyNy40MyAyOTku +NyA0MjkuMDkgMzA2LjQgMiBMCk4KNDE1LjI5IDI5OS45MyA0MTQuMSAzMDYu +OCAyIEwKTgo0MDAuODQgMzAzLjA5IDQwMy45OCAzMTEuMjYgMiBMCk4KMzky +LjY0IDMwNS4xOCAzOTEuNDIgMzE0LjUgMiBMCk4KMzgyLjg5IDMwMi4yIDM3 +OS4yNyAzMTAuMDQgMiBMCk4KMzc2LjM1IDI5NC44MyAzNzAuMzYgMjk5LjUx +IDIgTApOCjkwIDQ1MCAyLjYzIDIuNjMgMzg1Ljk1IDI5Ny42OSBHCjkwIDQ1 +MCAyLjYzIDIuNjMgMzg1Ljk1IDI5Ny42OSBBCjM3NS42MyAyNjguMzMgTQog +MzE0Ljg3IDI1OS4wMSA0MTIuMDggMjM1LjkyIDQzMi43MyAyNDQuODMgRApO +CjQzMCAyNDkuNTkgTQogNDMzLjI0IDI0NS41NCA0MzMuNjQgMjQ0LjMzIDQz +My42NCAyMzkuODcgRApOCjM4OC4yMSAyNjIuODMgTQogMzkwLjcgMjY2LjI3 +IDQwMC43NCAyNzIuMjkgNDAxLjUgMjcwLjMgRAogNDAyLjI2IDI2OC4yOCA0 +MDMuMjcgMjY2IDQwNS44IDI2My44NCBECiA0MDcuODMgMjYyLjExIDM5MC45 +OSAyNTkuNDEgMzg5LjczIDI2MC44MSBECjcgWApWCjkwIDQ1MCAyMS4wNiAy +MS40NyA0MjAuOTkgMjc5LjI2IEcKMCBYCjkwIDQ1MCAyMS4wNiAyMS40NyA0 +MjAuOTkgMjc5LjI2IEEKOTAgNDUwIDIuNjMgMi42MyA0MTEuNDcgMjg4LjM3 +IEcKOTAgNDUwIDIuNjMgMi42MyA0MTEuNDcgMjg4LjM3IEEKNDAwLjMzIDI3 +NC44MSBNCiAzODIuNTEgMjkxLjgyIDM1OS4wMiAyNjcuOTIgMzg4LjU5IDI2 +MS40NCBECjcgWApWCjAgWApOCjQ0My42NyAyNTIuMTMgTQogNDYwLjI1IDI2 +My4yMiA0NjYuNzYgMjMyLjI4IDQ0Mi40NSAyMzIuMjggRApOCjQ0Ni4yNCAy +NDYuNDggTQogNDUzLjcgMjUxLjQ3IDQ1Ni42MyAyMzcuNTQgNDQ1LjY5IDIz +Ny41NCBECk4KMzg5LjQgMjQ2LjA1IE0KIDQwNy4zNSAyMzIuOTkgNDE2LjEz +IDIwNy4xNyA0MDYuODEgMTc5LjYzIEQKTgo3IFgKOTAgNDUwIDUuODcgNS44 +NyA0MDYuMjEgMjA2Ljk3IEcKMCBYCjkwIDQ1MCA1Ljg3IDUuODcgNDA2LjIx +IDIwNi45NyBBCjcgWAo5MCA0NTAgNS44NyA1Ljg3IDQxNi4zMyAyMDMuMzIg +RwowIFgKOTAgNDUwIDUuODcgNS44NyA0MTYuMzMgMjAzLjMyIEEKNyBYCjkw +IDQ1MCA1Ljg3IDUuODcgNDI5LjI5IDIwNS43NSBHCjAgWAo5MCA0NTAgNS44 +NyA1Ljg3IDQyOS4yOSAyMDUuNzUgQQo0NDQuODggMTc4LjAxIE0KIDQyOS40 +OSAxNzUuNTggNDIwLjU4IDE3Mi43NCA0MDQuNzkgMTgwLjAzIEQKIDQwMy42 +OSAxNzQuNjEgMzk2LjY5IDEyNi4xNiAzNzQuODIgMTEwLjc3IEQKIDM4NC41 +NCAxMTAuMzcgMzg2Ljk3IDExMi44IDM5NC42NiAxMTQuMDEgRAo0IFgKVgow +IFgKTgozOTQuNjYgMTE0LjAxIDM4OC41OSA5Ny44MSA0MDQuMzggMTA3Ljk0 +IDQwNy4yMiA4Ny42OSA0MjIuNjEgMTAwLjY1IDQzMC43MSA4NC44NSA0NDIu +ODYgOTkuMDMKIDQ1OS40NiA4NC44NSA0NjMuOTIgMTA2LjMyIDQ4MS43NCA5 +NS43OSA0ODEuMzQgMTE0LjgyIDQ5OC4zNSAxMDcuMTMgNDk1LjkyIDEyMC40 +OSAxMyBMCjQgWApWCjAgWApOCjQ3NS4yOSAxNTkuNzYgTQogNDgxLjM0IDE0 +NS42IDQ5Ny45NCAxMjkuODEgNTA4LjQ4IDEyMy4zMyBECiA1MDAuMzcgMTIw +LjkgNTAwLjc4IDEyMC45IDQ5NS45MiAxMjAuNDkgRAo0IFgKVgowIFgKTgo0 +NDIuMDUgMjMyLjI4IE0KIDQ0NS42OSAyMjMuMzcgNDQ4LjkzIDIxOC4xIDQ0 +OS4zNCAyMTIuMDMgRAogNDgwLjUzIDE5Mi41OSA0NzguOTEgMTU0LjUyIDQ2 +OS4xOCAxMzUuMDcgRAogNDcxLjYxIDExNi4wNCA0NjYuMzUgMTA5Ljk2IDQ2 +Mi4zIDExMi4zOSBECjcgWApWCjAgWApOCjQ2MS4wOCAxMjAuNDkgTQogNDY0 +LjczIDEwMS40NiA0NDguMTIgMTAwLjI0IDQ1MS43NyAxMjAuMDkgRAo3IFgK +VgowIFgKTgo0NTEuNzcgMTIwLjA5IE0KIDQ0NS4yOSAxMDcuMTMgNDM2LjM4 +IDEwOS41NiA0NDMuNjcgMTI0Ljk1IEQKNyBYClYKMCBYCk4KNDQyLjQ1IDEy +Mi41MiBNCiA0MjYuNjYgMTI0LjU0IDQzNS45NyAxMzEuODMgNDQ2LjkxIDEz +OC43MiBECiA0NDkuMzQgMTQ2LjAxIDQ1MC45NiAxNjIuMjEgNDQzLjY3IDE4 +NC40OSBECk4KNyBYCjkwIDQ1MCA1Ljg3IDUuODcgNDUxLjE2IDIxNC42NiBH +CjAgWAo5MCA0NTAgNS44NyA1Ljg3IDQ1MS4xNiAyMTQuNjYgQQo3IFgKOTAg +NDUwIDUuODcgNS44NyA0NDEuMDQgMjA5LjQgRwowIFgKOTAgNDUwIDUuODcg +NS44NyA0NDEuMDQgMjA5LjQgQQo0NzYuODggNDkuMjEgTQogNDkxLjA2IDMy +LjIgMzg5LjggMTcuNiA0MzEuMTEgNDcuOTkgRAogNDMzLjU0IDQzLjU0IDQz +NC4zNSA0MS45MiA0MzcuMTkgMzcuNDYgRAogNDQwLjQzIDM5LjA4IDQ0Mi4z +IDQwLjE2IDQ0Ny4zMSA0Mi43MyBECiA0NDYuNSA0Ny45OSA0NDMuNjcgNTAu +NDIgNDQwLjgzIDU1LjY5IEQKIDQ0My45IDU3LjQxIDQ0NC45MSA1OC40MiA0 +NDcuMzEgNTkuNzQgRAogNDU0LjYgNTUuNjkgNDU2LjIyIDUwLjQyIDQ1OS40 +NiA0Mi4zMiBECiA0NjcuOTcgNDUuOTcgNDc0Ljc5IDUwLjI0IDQ3Ny4yOSA0 +OS4yMSBECjYgWApWCjAgWApOCjQzMC43MSA2MC45NiBNCiA0NDQuODggNDMu +OTQgMzQ2LjA2IDMxLjM5IDM4Ny4zNyA2MS43NyBECiAzODkuOCA1Ny4zMSAz +OTEuODMgNTYuMDkgMzk0LjY2IDUxLjY0IEQKIDM5Ny45IDUzLjI2IDM5Ni4x +MyA1MS45IDQwMS4xNCA1NC40NyBECiA0MDAuMzMgNTkuNzQgMzk3LjUgNjIu +MTcgMzk0LjY2IDY3LjQzIEQKIDM5Ni40MyA2OS4wNSAzOTguMiA3MC4xOSA0 +MDEuMTQgNzEuNDggRAogNDA4LjQzIDY3LjQzIDQxMC4wNSA2Mi4xNyA0MTMu +MjkgNTQuMDcgRAogNDIxLjggNTcuNzIgNDI4LjM2IDYxLjk4IDQzMC44NiA2 +MC45NiBECjYgWApWCjAgWApOCjQzMS4xMSA0Ny45OSA0NDAuODMgNTUuNjkg +MiBMCk4KMzg3LjM3IDYxLjc3IDM5NC42NiA2Ny40MyAyIEwKTgozMjAuNTQg +NTEzLjc3IDMyMC41NCA0ODIuOTQgMiBMCk4KNSBYCjkwIDQ1MCA2LjQ4IDYu +NDggMzE5LjczIDQ3Ni41MSBHCjAgWAo5MCA0NTAgNi40OCA2LjQ4IDMxOS43 +MyA0NzYuNTEgQQowIEYKKE9yaWdpbmFsIGltYWdlIHNjYW5uZWQgZnJvbSBM +QSBUKSAwIC0yNzAgNTgwLjM4IDE4LjMgVEYKKGltZXMgYnkgRG91ZyBLcmF1 +c2UpIDAgLTI3MCA1ODAuMzggMTA5LjA2IFRGCihUKSAwIC0yNzAgNTg2LjU3 +IDE4LjMgVEYKKHJhY2VkIGluIEZyYW1lIE1ha2VyIGJ5IENodWNrIE11c2Np +YW5vKSAwIC0yNzAgNTg2LjU3IDIxLjc0IFRGCihDb3B5cmlnaHQsIDE5OTAs +IEVsIEJhcnRvIEVudGVycHJpc2VzKSAwIC0yNzAgNTkyLjc2IDE4LjMgVEYK +Rk1FTkRQQUdFCiUlRW5kUGFnZTogIjEiIDAKJSVUcmFpbGVyCiUlQm91bmRp +bmdCb3g6IDAgMCA2MTIgNzkyCiUlUGFnZXM6IDEgLTEKJSVEb2N1bWVudEZv +bnRzOiBIZWx2ZXRpY2EKCgo= + +--16819560-2078917053-688350843:#11603 +Content-Type: BINARY;name="Alices_PDP-10" +Content-Transfer-Encoding: BASE64 +Content-Description: Alice's PDP-10 w/ TECO & DDT + +CQkJCUFsaWNlJ3MgUERQLTEwCgo7OzsgV2l0aCB0aGFua3MgKGFuZCBhcG9s +b2dpZXMpIHRvIENocmlzIFN0YWN5LCBBbGFuIFdlY2hzbGVyLCBOb2VsIENo +aWFwcGEsCjs7OyBMYXJyeSBBbGxlbiwgYW5kIG9mIGNvdXJzZSBBcmxvIEd1 +dGhyaWUsIGFuZCBwYXJ0aWN1bGFybHkgdG8gQW5uIE1hcmllIEZpbm4KOzs7 +IHdobyBpcyBhIGtpbmQgc291bCBhbmQgbm90IGF0IGFsbCBsaWtlIHRoZSBw +ZXJzb24gcG9ydHJheWVkIGhlcmVpbi4KOzs7CQkJCQkJCQktLSBzcmEgMyBN +YXkgODUKClRoaXMgc29uZyBpcyBjYWxsZWQgIkFsaWNlJ3MgUERQLTEwIi4g +IEJ1dCBBbGljZSBkb2Vzbid0IG93biBhIFBEUC0xMCwgaW4gZmFjdApBbGlj +ZSBpc24ndCBldmVuIGluIHRoZSBzb25nLiAgSXQncyBqdXN0IHRoZSBuYW1l +IG9mIHRoZSBzb25nLiAgVGhhdCdzIHdoeSBJCmNhbGxlZCB0aGlzIHNvbmcg +IkFsaWNlJ3MgUERQLTEwIi4KCllvdSBzZWUsIGl0IGFsbCBzdGFydGVkIGFi +b3V0IHR3byBpbmNvbXBhdGlibGUgbW9uaXRvciB2ZXJzaW9ucyBhZ28sIGFi +b3V0IHR3bwptb250aHMgYWdvIG9uIGEgVHVlc2RheSwgd2hlbiBteSBmcmll +bmQgYW5kIEkgU1VQRFVQJ2Qgb3ZlciB0byBNSVQtT1ogdG8gcGljawp1cCBz +b21lIGhhY2tlcnMgdG8gZ28gb3V0IGZvciBhIENoaW5lc2UgZGlubmVyLiAg +QnV0IEFJIGhhY2tlcnMgZG9uJ3QgbGl2ZSBvbgpNSVQtT1osIHRoZXkgbGl2 +ZSBvbiB2YXJpb3VzIGFzc29ydGVkIGxpc3BtcyBhbmQgc3VjaCwgYW5kIHNl +ZWluZyBhcyBhbmQgaG93CnRoZXkgbmV2ZXIgbG9nIGluIGV4Y2VwdCB2aWEg +dGhlIGZpbGUgc2VydmVyLCB0aGV5IGhhZG4ndCBnb3R0ZW4gYXJvdW5kIHRv +CmRvaW5nIGZpbGVzeXN0ZW0gZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBhIGxv +bmcgdGltZS4KCldlIGdvdCBvdmVyIHRoZXJlLCBzYXcgNjAwIHBhZ2VzIGZy +ZWUsIDEwMDAwIHBhZ2VzIGluIHVzZSBvbiBhIDUgcGFjayBQUzosIGFuZApk +ZWNpZGVkIGl0IHdvdWxkIGJlIGEgZnJpZW5kbHkgZ2VzdHVyZSB0byBydW4g +Q0hFQ0tEIGZvciB0aGVtIGFuZCB0cnkgdG8KcmVjbGFpbSBzb21lIG9mIHRo +YXQgbG9zdCBzcGFjZS4gIFNvIHdlIHJlbG9hZGVkIHRoZSBzeXN0ZW0gd2l0 +aCB0aGUgZmxvcHBpZXMKYW5kIHRoZSBzd2l0Y2ggcmVnaXN0ZXJzIGFuZCBv +dGhlciBpbXBsZW1lbnRzIG9mIGRlc3RydWN0aW9uLCBhbmQgYW5zd2VyZWQg +IlkiCnRvIFJVTiBDSEVDS0Q/CgpCdXQgd2hlbiB3ZSBnb3QgdGhlIHN5c3Rl +bSB1cCBhbmQgdHJpZWQgdG8gcmVsZWFzZSBhbGwgdGhlIGxvc3QgcGFnZXMg +dGhlcmUgd2FzCmEgbG91ZCBiZWVwaW5nIGFuZCBhIGJpZyBtZXNzYWdlIGZs +YXNoZWQgdXAgb24gb3VyIHNjcmVlbiBzYXlpbmc6CiAgICAgICAgICAgICAg +ICAgICAgICBQRVJNSVNTSU9OIERFTklFRCBCWSBBQ0oKCldlbGwsIHdlJ2Qg +bmV2ZXIgaGVhcmQgb2YgYSB2ZXJzaW9uIG9mIEFDSiB0aGF0IHdvdWxkIGxl +dCB5b3UgZ28gaW50byBNRERUIGZyb20KQU5PTllNT1VTIGJ1dCBub3QgcnVu +IENIRUNLRCwgYW5kIHNvLCB3aXRoIHRlYXJzIGluIG91ciBleWVzLCB3ZSBo +ZWFkZWQgb2ZmCm92ZXIgdGhlIENoYW9zbmV0IGxvb2tpbmcgZm9yIGEgZmls +ZXN5c3RlbSB3aXRoIGVub3VnaCBmcmVlIHBhZ2VzIHRvIHdyaXRlIG91dAp0 +aGUgTE9TVC1QQUdFUy5CSU4gZmlsZS4gIERpZG4ndCBmaW5kIG9uZS4uLgoK +VW50aWwgd2UgZ290IHRvIFhYLTExLCBhbmQgYXQgdGhlIG90aGVyIGVuZCBv +ZiBYWC0xMSB3YXMgYW5vdGhlciBNSVQgVHdlbmV4LAphbmQgaW4gUFM6PE9Q +RVJBVE9SPiBvbiB0aGF0IE1JVCBUd2VuZXggd2FzIGFub3RoZXIgTE9TVC1Q +QUdFUy5CSU4gZmlsZS4gIEFuZAp3ZSBkZWNpZGVkIHRoYXQgb25lIGJpZyBM +T1NULVBBR0VTLkJJTiBmaWxlIHdhcyBiZXR0ZXIgdGhhbiB0d28gbGl0dGxl +CkxPU1QtUEFHRVMuQklOIGZpbGUsIGFuZCByYXRoZXIgdGhhbiBwYWdlIHRo +YXQgb25lIGluIHdlIHRob3VnaHQgd2UnZCB3cml0ZQpvdXJzIG91dC4gIFNv +IHRoYXQncyB3aGF0IHdlIGRpZC4KCldlbnQgYmFjayB0byBPWiwgZm91bmQg +c29tZSBoYWNrZXJzIGFuZCB3ZW50IG91dCBmb3IgYSBDaGluZXNlIGRpbm5l +ciB0aGF0CmNvdWxkbid0IGJlIGJlYXQsIGFuZCBkaWRuJ3QgZ2V0IHVwIHVu +dGlsIHRoZSBuZXh0IG1vcm5pbmcgd2hlbiB3ZSBnb3QgYSBTRU5ECmZyb20g +QW5uIE1hcmllIEZpbm4uICBTaGUgc2FpZCwgIktpZCwgd2UgZm91bmQgeW91 +ciBpbml0aWFscyBpbiBTSVhCSVQgaW4gdGhlCnJpZ2h0IGhhbGYgb2YgYSBQ +T1BKIGF0IHRoZSBlbmQgb2YgYSB0d28gbWVnYXdvcmQgY29yZSBkdW1wIGZ1 +bGwgb2YgZ2FyYmFnZSwKanVzdCB3YW50ZWQgdG8ga25vdyBpZiB5b3UgaGFk +IGFueSBpbmZvcm1hdGlvbiBhYm91dCBpdCIuICBBbmQgSSBzYWlkLCAiWWVz +Cm1hJ2FtIEFubiBNYXJpZSwgSSBjYW5ub3QgdGVsbCBhIGxpZSwgSSBwdXQg +dGhhdCBYVU5BTUUgaW50byB0aGF0IGhhbGZ3b3JkIi4KCkFmdGVyIHRhbGtp +bmcgYmFjayBhbmQgZm9ydGggd2l0aCBBbm4gZm9yIGFib3V0IDQ1IG1lc3Nh +Z2VzIHdlIGFycml2ZWQgYXQgdGhlCnRydXRoIG9mIHRoZSBtYXR0ZXIgYW5k +IEFubiBzYWlkIHRoYXQgd2UgaGFkIHRvIGdvIHJlYnVpbGQgdGhlIGJpdHRh +YmxlIGFuZCB3ZQphbHNvIGhhZCB0byBjb21lIGRvd24gYW5kIHRhbGsgdG8g +aGVyIGluIHJvb20gTkU0My01MDEuICBOb3cgZnJpZW5kcywgdGhlcmUgd2Fz +Cm9ubHkgb25lIG9mIHR3byB0aGluZ3MgdGhhdCBBbm4gY291bGQgb2YgZG9u +ZSB3aXRoIHVzIGRvd24gYXQgcm9vbSA1MDEsIGFuZCB0aGUKZmlyc3Qgb25l +IHdhcyB0aGF0IHNoZSBjb3VsZCBoYXZlIGhpcmVkIHVzIG9uIHRoZSBzcG90 +IGZvciBhY3R1YWxseSBrbm93aW5nCmVub3VnaCBhYm91dCBUd2VuZXggdG8g +c2NyZXcgaXQgdXAgdGhhdCBiYWRseSwgd2hpY2ggd2Fzbid0IHZlcnkgbGlr +ZWx5IGFuZCB3ZQpkaWRuJ3QgZXhwZWN0IGl0LCBhbmQgdGhlIG90aGVyIHdh +cyB0aGF0IHNoZSBjb3VsZCBoYXZlIGJhd2xlZCB1cyBvdXQgYW5kIHRvbGQK +dXMgbmV2ZXIgdG8gYmUgc2VlbiBoYWNraW5nIGZpbGVzeXN0ZW1zIGFnYWlu +LCB3aGljaCB3YXMgd2hhdCB3ZSBleHBlY3RlZC4gIEJ1dAp3aGVuIHdlIGdv +dCB0byByb29tIDUwMSB3ZSBkaXNjb3ZlcmVkIHRoYXQgdGhlcmUgd2FzIGEg +dGhpcmQgcG9zc2liaWxpdHkgdGhhdAp3ZSBoYWRuJ3QgZXZlbiBjb3VudGVk +IHVwb24sIGFuZCB3ZSB3YXMgYm90aCBpbW1lZGlhdGVseSBkZS13aGVlbGVk +LgpDRCVESVInZWQuICBBbmQgSSBzYWlkICJBbm4sIEkgZG9uJ3QgdGhpbmsg +SSBjYW4gcmVidWlsZCB0aGUgYml0dGFibGUgd2l0aCB0aGlzCmhlcmUgRklM +RVMtT05MWSBiaXQgc2V0LiIgIEFuZCBzaGUgc2FpZCAiWE9GRiwga2lkLCBn +ZXQgaW50byB0aGlzIFVEUCBwYWNrZXQiCmFuZCB0aGF0J3Mgd2hhdCB3ZSBk +aWQgYW5kIHJvZGUgdXAgdG8gdGhlIHNxdWFyZSBicmFja2V0IGFzY2l6IHNs +YXNoIHNjZW5lIG9mCnRoZSBjcmltZSBzbGFzaCBjbG9zZSBzcXVhcmUgYnJh +Y2tldC4KCk5vdyBmcmllbmRzLCBJIHdhbnQgdG8gdGVsbCB5b3UgYWJvdXQg +dGhlIG5pbnRoIGZsb29yIG9mIGJ1aWxkaW5nIE5FNDMgd2hlcmUKdGhpcyBo +YXBwZW5lZC4gIFRoZXkgZ290IHRocmVlIEtMMTBzLCAyNCBMSVNQTXMsIGFu +ZCBhYm91dCAzMiBWQVhlbiBydW5uaW5nIDQuMgp1bml4LiAgQnV0IHdoZW4g +d2UgZ290IHRvIHRoZSBzcXVhcmUgYnJhY2tldCBhc2NpeiBzbGFzaCBzY2Vu +ZSBvZiB0aGUgY3JpbWUKc2xhc2ggY2xvc2Ugc3F1YXJlIGJyYWNrZXQgdGhl +cmUgd2FzIGZpdmUgdHdlbmV4IGhhY2tlcnMgcGFzdCBhbmQgcHJlc2VudCwg +dGhpcwpiZWluZyB0aGUgYmlnZ2VzdCBsb3NzYWdlIHlldCBieSBhbiBSTVMg +Y2xvbmUgYW5kIGV2ZXJ5Ym9keSB3YW50ZWQgdG8gZ2V0IGluCnRoZWlyIHN1 +Z2dlc3Rpb24gZm9yIGEgbmV3IHN5c3RlbSBkYWVtb24gdGhhdCB3b3VsZCBo +YXZlIGtlcHQgaXQgZnJvbSBldmVyCmhhdmluZyBoYXBwZW5lZCBpbiB0aGUg +Zmlyc3QgcGxhY2UuICBBbmQgdGhleSB3YXMgdXNpbmcgdXAgYWxsIGtpbmRz +IG9mCmRlYnVnZ2luZyBlcXVpcG1lbnQgdGhhdCB0aGV5IGhhZCBseWluZyBh +cm91bmQgb24gVjNBIFNXU0tJVCB0YXBlcy4gIFRoZXkgd2VyZQpkb2luZyBE +U3MsIE1PTlJEcywgYW5kIFJTVFJTSHMsIGFuZCB0aGV5IG1hZGUgMjcwMDAg +cGFnZXMgb2YgY29yZSBkdW1wcyBhbmQKcGhvdG8gZmlsZXMgb24gYW4gUlAw +NiB3aXRoIGNvbW1lbnRzIGFuZCAtUkVBRC0uLVRISVMtIGZpbGVzIHRvIGJl +IHVzZWQgYXMKZXZpZGVuY2UgYWdhaW5zdCB1cy4KCkFmdGVyIHRoZSBvcmRl +YWwsIEFubiB0b29rIHVzIGJhY2sgZG93bnN0YWlycyBhbmQgbGVmdCB1cyB3 +aXRoIHRoZSBDTFUgaGFja2Vycy4KU2hlIHNhaWQgIktpZCwgSSdtIGdvbm5h +IGxlYXZlIHlvdSB3aXRoIHRoZSBDTFUgaGFja2Vycy4gIEkgd2FudCB5b3Vy +IGpzeXMKbWFudWFsIGFuZCB5b3VyIFJPTE0gRFRJIi4gIEkgc2FpZCAiQW5u +LCBJIGNhbiB1bmRlcnN0YW5kIHlvdXIgd2FudGluZyBteSBqc3lzCm1hbnVh +bCBzbyBJIHdvbid0IHJlbWluZCB0aGUgQ0xVIGhhY2tlcnMgb2YgZ3JvZHkg +dGhpbmdzIGxpa2Ugb3BlcmF0aW5nCnN5c3RlbXMsIGJ1dCB3aGF0IGRvIHlv +dSB3YW50IG15IERUSSBmb3I/IiBhbmQgc2hlIHNhaWQgIktpZCwgd2UgZG9u +J3Qgd2FudCBhbnkKVlRTIGVycm9ycyIuICBJIHNhaWQgIkFubiwgZGlkIHlv +dSB0aGluayBJIHdhcyBnb2luZyB0byB0cnkgdG8gY3Jhc2ggdGhlIHN5c3Rl +bQpmb3IgbGl0dGVyaW5nPyIgIEFubiBzYWlkIHRoYXQgc2hlIHdhcyBtYWtp +bmcgc3VyZSwgYW5kIGZyaWVuZHMsIEFubiB3YXMsCidjYXVzZSBzaGUgY2xl +YXJlZCBhbGwgbXkgbGVmdC1oYW5kIHByaXZzIGJpdHMgc28gSSBjb3VsZG4n +dCBsb2dvdXQuICBBbmQgc2hlCmRpc2FibGVkIHRoZSBUUkVQTEFDRSBjb21t +YW5kIHNvIEkgY291bGRuJ3QgY3JvY2sgaW4gYW4gWENUIFswXSBpbnN0cnVj +dGlvbiwKY2F1c2UgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBpbnRlcnJ1cHQg +dG8gTUVYRUMsIGFuZCBzbmVhayBpbnRvIE1ERFQuICBZZWFoLApBbm4gd2Fz +IG1ha2luZyBzdXJlLCBhbmQgaXQgd2FzIGFib3V0IGZvdXIgb3IgZml2ZSBo +b3VycyBsYXRlciB0aGF0IENoaWFwcGEKKHJlbWVtYmVyIENoaWFwcGE/ICBU +aGlzIHNvbmcncyBuZXZlciBldmVuIG1lbnRpb25lZCBDaGlhcHBhKSBDaGlh +cHBhIGNhbWUgYnkKYW5kIHdpdGggYSBmZXcgZ3JhdHVpdG91cyBpbnN1bHRz +IHRvIHRoZSBDTFUgaGFja2VycyBiYWlsZWQgdXMgb3V0IG9mIHRoZXJlLAph +bmQgd2Ugd2VudCBvdXQgYW5kIGhhZCBhbm90aGVyIENoaW5lc2UgZGlubmVy +IHRoYXQgY291bGRuJ3QgYmUgYmVhdCwgYW5kCmRpZG4ndCBnZXQgdXAgdW50 +aWwgdGhlIG5leHQgbW9ybmluZyB3aGVuIHdlIGFsbCBoYWQgdG8gZ28gdG8g +TENTIENvbXB1dGF0aW9uYWwKUmVzb3VyY2VzIHN0YWZmIG1lZXRpbmcuCgpX +ZSB3YWxrZWQgaW4sIHNhdCBkb3duLiAgQW5uIGNhbWUgaW4gd2l0aCB0aGUg +UlAwNiBkaXNrIHBhY2sgd2l0aCB0aGUgMjcwMDAKcGFnZXMgd2l0aCB0aGUg +Y29tbWVudHMgYW5kIHRoZSAtUkVBRC0uLVRISVMtIGZpbGVzIGFuZCBhIHR3 +byBsaXRlciBjb2ZmZWUgbXVnLApzYXQgZG93bi4gIEVzdGhlciBGZWxpeCBj +b21lcyBpbiBzYXlzICJBbGwgcmlzZSIsIHdlIHN0b29kIHVwLCBBbm4gc3Rv +b2QgdXAKd2l0aCB0aGUgMjcwMDAgcGFnZSBSUDA2IHBhY2ssIGFuZCBEYXZl +IENsYXJrIGNvbWVzIGluIHdpdGggYW4gSUJNIFBDLiAgSGUgc2l0cwpkb3du +LCB3ZSBzaXQgZG93biwgQW5uIGxvb2tzIGF0IHRoZSBJQk0gUEMuICBUaGVu +IGF0IHRoZSAyNzAwMCBwYWdlIFJQMDYgcGFjaywKdGhlbiBhdCB0aGUgSUJN +IFBDLCB0aGVuIGF0IHRoZSAyNzAwMCBwYWdlIFJQMDYgcGFjaywgYW5kIGJl +Z2FuIHRvIGNyeSwgYmVjYXVzZQpBbm4gaGFkIGNvbWUgdG8gdGhlIHJlYWxp +emF0aW9uIHRoYXQgaXQgd2FzIGEgdHlwaWNhbCBjYXNlIG9mIDM2JTg9PTQg +YW5kIHRoYXQKdGhlcmUgd2FzIG5vIHdheSB0byBkaXNwbGF5IHRob3NlIGxh +c3QgZm91ciBiaXRzLCBhbmQgdGhhdCBEYXZlIHdhc24ndCBnb25uYQpsb29r +IGF0IHRoZSAyNzAwMCBwYWdlcyBvZiBjb3JlIGR1bXBzIGFuZCBwaG90byBm +aWxlcyBvbiB0aGUgUlAwNiBwYWNrIHdpdGggdGhlCmNvbW1lbnRzIGFuZCAt +UkVBRC0uLVRISVMtIGZpbGVzIGV4cGxhaW5pbmcgd2hhdCBlYWNoIG9uZSB3 +YXMgdG8gYmUgdXNlZCBhcwpldmlkZW5jZSBhZ2FpbnN0IHVzLgoKQW5kIHdl +IHdlcmUgcGVybWFuZW50bHkgYXNzaWduZWQgdG8gdGhlIGJhdGNoIGRyZWdz +IHF1ZXVlIGFuZCBoYWQgdG8gcmVidWlsZAp0aGUgYml0dGFibGUgKGluIHRo +ZSBiYXRjaCBkcmVncyBxdWV1ZSkuICBCdXQgdGhhdCdzIG5vdCB3aGF0IEkg +Y2FtZSBoZXJlIHRvCnRhbGsgYWJvdXQuICBJIGNhbWUgaGVyZSB0byB0YWxr +IGFib3V0IERFQy4KIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGV5 +IGdvdCBhIGJ1aWxkaW5nIHVwIHRoZXJlIGluIE1hcmxib3JvIHdoZXJlIHlv +dSB3YWxrIGluIGFuZCBnZXQgYXZlcnRlZCwKZGl2ZXJ0ZWQsIGludmVydGVk +LCByZXZlcnRlZCwgYW5kIHBlcnZlcnRlZC4gIEkgd2VudCB1cCB0aGVyZSBv +bmUgZGF5IHRvIHBpY2sKdXAgYSBuZXcgY29weSBvZiB0aGUgdG9vbHMgdGFw +ZS4gIERyb3ZlIGRvd24gdG8gUGhpbGx5IGZvciBhIEdyZWF0ZnVsIERlYWQK +Y29uY2VydCB0aGUgbmlnaHQgYmVmb3JlLCBzbyBJIGxvb2tlZCBhbmQgZmVs +dCBteSBiZXN0IHdoZW4gSSB3ZW50IGluIHRoYXQKbW9ybmluZy4gICdDYXVz +ZSBJIHdhbnRlZCB0byBsb29rIGxpa2UgYSByZWFsIGxpdmUgdHdlbmV4IGhh +Y2tlciBmcm9tIE1JVC4gIEkKd2FudGVkIHRvIGZlZWwgbGlrZSwgSSB3YW50 +ZWQgdG8gYmUgYSByZWFsIGxpdmUgdHdlbmV4IGhhY2tlciBmcm9tIE1JVC4g +IEkKd2Fsa2VkIGluIGFuZCBJIHdhcyBodW5nIGRvd24sIGJydW5nIGRvd24s +IGh1bmcgdXAsIGFuZCBzcGFjZWQgb3V0LiAgVGhlCnJlY2VwdGlvbmlzdCBo +YW5kcyBiZSBhIHBpZWNlIG9mIHBhcGVyIHNheWluZyAiS2lkLCB0aGUgRURJ +VC0yMCBtYWludGFpbmVycyBhcmUKcG9sbGluZyB1c2VyIG9waW5pb25zIHRv +ZGF5IGFuZCB3b3VsZCBsaWtlIHlvdSB0byBzdG9wIGJ5IHJvb20gNjA0IHdo +aWxlIHlvdSdyZQpoZXJlLiIKCkkgd2Fsa2VkIGluIHRoZXJlIGFuZCBJIHNh +aWQgIkRyb2lkcywgSSB3YW50IHRvIGxvc2UuICBJIG1lYW4sIEkgd2FudCB0 +byBsb3NlLgpJIHdhbnQgdG8gc2VlIGxpbmUgZWRpdG9ycyBvbiBDUlRzIGFu +ZCBudWxscyBpbiBteSBmaWxlcy4gIFdyaXRlIDM2IGJpdCBhc2NpaQp0aGF0 +IGNhbid0IGJlIHJlYWQgZXhjZXB0IHdpdGggdGhlIG1vbml0b3IgZmlsdGVy +aW5nIGl0LiAgSSBtZWFuIExPU0UsIExPU0UsCkxPU0UhIiAgQW5kIEkgc3Rh +cnRlZCBqdW1waW5nIHVwIGFuZCBkb3duIHllbGxpbmcgIkxPU0UsIExPU0Ui +LCBhbmQgS2V2aW4KUGFldHpvbGQgY2FtZSBpbiB3ZWFyaW5nIGhpcyBtb29z +ZSBlYXIgaGF0IGFuZCBzdGFydGVkIGp1bXBpbmcgdXAgYW5kIGRvd24gd2l0 +aAptZSB5ZWxsaW5nICJMT1NFLCBMT1NFIiwgYW5kIGEgREVDIHNhbGVzIHJl +cCBjYW1lIG92ZXIsIHB1dCBhbiBhcm0gYXJvdW5kIG15CnNob3VsZGVyLCBh +bmQgc2FpZCAiSG93J2QgeW91IGxpa2UgbWUgdG8gc2hvdyB5b3UgYSAqcmVh +bCogZWRpdG9yIHRoYXQgaGFzCm1hY3JvcyBhbmQgdGhpbmdzIGxpa2UgdGhh +dD8gIFdlIGhhdmUgb25lLCBpdCdzIGNhbGxlZCBUVi4uLi4iCgpEaWRuJ3Qg +ZmVlbCB0b28gZ29vZCBhYm91dCBpdC4KClByb2NlZWRlZCBvbiBkb3duIHRo +ZSBoYWxsIGdldHRpbmcgbW9yZSBkaXZlcnNpb25zIGFuZCBwZXJ2ZXJzaW9u +cy4gIE1hbiwgSSB3YXMKaW4gdGhlcmUgZm9yIHR3byBob3VycywgdGhyZWUg +aG91cnMsIGZvdXIgaG91cnMsIEkgd2FzIGluIHRoZXJlIGZvciBhIGxvbmcK +dGltZSwgYW5kIHRoZXkgd2FzIGRvaW5nIGFsbCBraW5kcyBvZiBtZWFuIG5h +c3R5IHVnbHkgdGhpbmdzLCBhbmQgSSB3YXMganVzdApoYXZpbmcgYSB0b3Vn +aCB0aW1lIHRoZXJlLiAgVGhleSB3YXMgZGl2ZXJ0aW5nIGFuZCBpbnZlcnRp +bmcgZXZlcnkgc2luZ2xlIHBhcnQKb2YgbWUgYW5kIHRoZXkgd2FzIGxlYXZp +bmcgbm8gYml0IHVudG91Y2hlZC4KCkZpbmFsbHkgSSBnb3QgdG8gdGhlIHZl +cnkgbGFzdCBvZmZpY2UgKEknZCBiZWVuIGluIGFsbCB0aGUgcmVzdCksIHRo +ZSB2ZXJ5IGxhc3QKZGVzaywgYWZ0ZXIgdGhhdCB3aG9sZSBiaWcgdGhpbmcg +dGhlcmUsIGFuZCBJIHdhbGsgb3ZlciBhbmQgc2F5ICJ3aGF0IGRvIHlvdQp3 +YW50PyIgYW5kIHRoZSBtYW4gc2F5cyAiS2lkLCB3ZSBvbmx5IGdvdCBvbmUg +cXVlc3Rpb246IGhhdmUgeW91IGV2ZXIgYmVlbgpkZXdoZWVsZWQ/IgoKU28g +SSBwcm9jZWVkZWQgdG8gdGVsbCBoaW0gdGhlIHN0b3J5IG9mIHRoZSAxMDYw +MCBwYWdlIGZpdmUgcGFjayBQUzogIHdpdGggZnVsbApvcmNoZXN0cmF0aW9u +IGFuZCBmaXZlIHBhcnQgaGFybW9ueSBhbmQgb3RoZXIgcGhlbm9tZW5hIGFu +ZCBoZSBzdG9wcGVkIG1lIHJpZ2h0CnRoZXJlIGFuZCBzYWlkICJLaWQsIGRp +ZCB5b3UgZXZlciBnZXQgaGF1bGVkIG9uIHRoZSBjYXJwZXQgZm9yIGl0PyIK +ClNvIEkgcHJvY2VlZGVkIHRvIHRlbGwgaGltIGFib3V0IHRoZSAyNzAwMCBw +YWdlIFJQMDYgcGFjayB3aXRoIHRoZSBjb21tZW50cyBhbmQKdGhlIC1SRUFE +LS4tVEhJUy0gZmlsZXMgYW5kIGhlIHN0b3BwZWQgbWUgcmlnaHQgdGhlcmUg +YW5kIHNhaWQgIktpZCwgSSB3YW50IHlvdQp0byBnbyBzaXQgb3ZlciB0aGVy +ZSBvbiB0aGF0IGJlbmNoIG1hcmtlZCBMYXJnZSBTeXN0ZW1zIFNJRy4gIE5P +VywgS0lEISIKCkksIEkgd2Fsa2VkIG92ZXIgdG8gdGhlIGJlbmNoIHRoZXJl +Li4uIFNlZSwgdGhlIExDRyBncm91cCBpcyB3aGVyZSB0aGV5IHB1dCB5b3UK +aWYgdGhleSB0aGluayB5b3UgbWF5IG5vdCBiZSBjb21wYXRpYmxlIHdpdGgg +dGhlIHJlc3Qgb2YgREVDJ3MgcHJvZHVjdCBsaW5lLgoKVGhlcmUgd2FzIGFs +bCBraW5kcyBvZiBtZWFuIG5hc3R5IHVnbHkgcGVvcGxlIHRoZXJlIG9uIHRo +ZSBiZW5jaC4uLiBDaGFvc25ldApkZXNpZ25lcnMuLi4gTGlzcCBoYWNrZXJz +Li4uIFRFQ08gaGFja2Vycy4gIFRFQ08gaGFja2VycyByaWdodCB0aGVyZSBv +biB0aGUKYmVuY2ggd2l0aCBtZSEgIEFuZCB0aGUgbWVhbmVzdCBvbmUgb2Yg +dGhlbSwgdGhlIGhhaXJpZXN0IFRFQ08gaGFja2VyIG9mIHRoZW0KYWxsIHdh +cyBjb21pbmcgb3ZlciB0byBtZS4gIEFuZCBoZSB3YXMgbWVhbiBhbmQgbmFz +dHkgYW5kIGhvcnJpYmxlIGFuZAp1bmRvY3VtZW50ZWQgYW5kIGFsbCBraW5k +cyBvZiBzdHVmZi4gIEFuZCBoZSBzYXQgZG93biBuZXh0IHRvIG1lIGFuZCBz +YWlkOgogCi4oNjc1MDQxNjQwNzQ0LmY2dzAwNzE0MTAwNDc0NS5mNnc2NDM3 +MDAwMDAwMDAuZjYpLC5meCpbMEBmdF5dMCR3XlwKCkFuZCBJIHNhaWQgIkkg +ZGlkbid0IGdldCBub3RoaW5nLCBJIGhhZCB0byByZWJ1aWxkIHRoZSBiaXR0 +YWJsZSBpbiBxdWV1ZSBzaXgiCmFuZCBoZSBzYWlkOgogCi4oNjc1MDQxNjQw +MDY3LmY2dzQxNjMwMDcxNTc2NS5mNncwMDQ0NDU2NzUwNDUuZjYKICA0NTU0 +NDU0NDAwNDYuZjZ3NTc2MjAwNTM1MTQ0LmY2dzM3MDAwMDAwMDAwMC5mNgop +LC5meCpbMEBmdF5dMCR3XlwKCkFuZCBJIHNhaWQgIkxpdHRlcmluZyIuICBB +bmQgdGhleSBhbGwgbW92ZWQgYXdheSBmcm9tIG1lIG9uIHRoZSBiZW5jaCB0 +aGVyZSwKd2l0aCB0aGUgaGFpcnkgZXllYmFsbCBhbmQgYWxsIGtpbmRzIG9m +IG1lYW4gbmFzdHkgdWdseSBzdHVmZiB1bnRpbCBJIHNhaWQgImFuZAptYWtp +bmcgdW5kb2N1bWVudGVkIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgRU1BQ1Mg +a2V5IGJpbmRpbmdzIi4gIEFuZCB0aGV5IGFsbApjYW1lIGJhY2ssIHNob29r +IG15IGhhbmQsIGFuZCB3ZSBoYWQgYSBncmVhdCB0aW1lIG9uIHRoZSBiZW5j +aCB0YWxraW5nIGFib3V0CkNoYW9zbmV0IGhhY2tpbmcgYW5kIExpc3AgaW50 +ZXJwcmV0ZXJzIHdyaXR0ZW4gaW4gVEVDTywgYW5kIGV2ZXJ5dGhpbmcgd2Fz +CmZpbmUuICBBbmQgd2Ugd2VyZSBlYXRpbmcgUGVraW5nIHJhdnMgYW5kIHNt +b2tpbmcgYWxsIGtpbmRzIG9mIHRoaW5ncyB1bnRpbCB0aGUKZ3V5IGZyb20g +RERDIGNhbWUgb3ZlciwgaGFkIHNvbWUgcGFwZXIgaW4gaGlzIGhhbmQsIHNh +aWQ6CgpLSURTLVRISVMtU1BSLUZPUk0tSEFTLUZJRlRZLUVJR0hULUxJTkVT +LVRISVJUWS1TRVZFTi1CT1hFUy1BTictU0lYVFktRUlHSFQKUVVFU1RJT05T +LVdFLVdBTlQtVE8tS05PVy1USEUtREVUQUlMUy1PRi1USEUtQlVHLVRIRS1M +T0FELUZBQ1RPUi1XSEVOLUlUCkhBUFBFTkVELUFORC1BTlktT1RIRVItS0lO +RC1PRi1USElORy1ZT1UtR09ULVRPLVNBWS1XRS1XQU5ULVRPLUtOT1ctVEhF +LUYtUwpHVVknUy1OQU1FLUFORC1IT1ctTUFOWS1UUkFDS1MtT04tWU9VUi1U +QVBFLURSSVZFLUFORC1BTlktT1RIRVItS0lORC1PRi1USElORwpZT1UtR09U +LVRPLVNBWQoKYW5kIGhlIHRhbGtlZCBmb3IgZm9ydHktZml2ZSBtaW51dGVz +IGFuZCBub2JvZHkgdW5kZXJzdG9vZCBhIHdvcmQgdGhhdCBoZSBzYWlkCm9y +IHdoeSB3ZSB3ZXJlIGRvaW5nIHRoaXMgYnV0IHdlIGhhZCBmdW4gZmlsbGlu +ZyBvdXQgdGhlIGZvcm1zIGluIHRyaXBsaWNhdGUKYW5kIHNwZWN1bGF0aW5n +IG9uIHdoeSB3ZSB3ZXJlIGZpbGxpbmcgb3V0IFNQUnMgb24gdW5zdXBwb3J0 +ZWQgcHJvZHVjdHMuCgpJIGZpbGxlZCBvdXQgdGhlIHNwZWNpYWwgZm9ybSB3 +aXRoIHRoZSBmb3VyLWxldmVsIG1hY3JvIGRlZmluaW5nIG1hY3Jvcy4gIFR5 +cGVkCml0IGluIHRoZXJlIGp1c3QgbGlrZSBpdCB3YXMgYW5kIGV2ZXJ5dGhp +bmcgd2FzIGZpbmUuICBBbmQgSSBwdXQgZG93biBteQprZXlib2FyZCwgYW5k +IEkgc3dpdGNoZWQgYnVmZmVycywgYW5kIHRoZXJlIC4uLiBpbiB0aGUgb3Ro +ZXIgYnVmZmVyLi4uIGNlbnRlcmVkCmluIHRoZSBvdGhlciBidWZmZXIuLi4g +YXdheSBmcm9tIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgYnVmZmVyLi4uIGlu +CnBhcmVudGhlc2VzLCBjYXBpdGFsIGxldHRlcnMsIGluIHJldmVyc2Ugdmlk +ZW8sIHJlYWQgdGhlIGZvbGxvd2luZyB3b3JkczoKCiJLaWQsIGhhdmUgeW91 +IHRha2VuIHRoZSBgYFZNUyBmb3IgVE9QUy0yMCBtYW5hZ2VycycnIGNvdXJz +ZSB5ZXQ/IgoKSSB3YWxrZWQgb3ZlciB0byB0aGUgbWFuIGFuZCBJIHNhaWQg +Ik1pc3RlciwgeW91IGdvdCBhIGxvdCBvZiBkYW1uZWQgZ2FsbAphc2tpbmcg +bWUgaWYgSSd2ZSB0YWtlbiB0aGUgYGBWTVMgZm9yIFRPUFMtMjAgbWFuYWdl +cnMnJyBjb3Vyc2UgeWV0LiAgSSBtZWFuLi4uCkkgbWVhbi4uLiBJIG1lYW4s +IEknbSBzaXR0aW5nIGhlcmUgb24gdGhlIGJlbmNoLCBJJ20gc2l0dGluZyBo +ZXJlIG9uIHRoZSBMQ0cKU0lHIGJlbmNoLCAnY2F1c2UgeW91IHdhbnQgdG8g +a25vdyBpZiBJJ20gYnJhaW5kYW1hZ2VkIGVub3VnaCB0cmFkZSBteSBQRFAt +MTAKZm9yIHBhcnRpYWwgY3JlZGl0IG9uIGEgc3lzdGVtIHRoYXQgZG9lc24n +dCBldmVuIGhhbmRsZSBmaWxlbmFtZSBjb21wbGV0aW9uCmFmdGVyIGJlaW5n +IGEgbGl0dGVyYnVnLiIKCkhlIGxvb2tlZCBhdCBtZSBhbmQgc2FpZCAiS2lk +LCB0aGUgZnJvbnQgb2ZmaWNlIGRvbid0IGxpa2UgeW91ciBraW5kLCBzbyB3 +ZSdyZQpnb2luZyB0byBwdXQgeW91IG9uIG91ciBWQVgvVk1TIG1haWxpbmcg +bGlzdC4iICBBbmQgZnJpZW5kcywgc29tZXdoZXJlIGRvd24gaW4KdGhlIE5F +NDMgcmVjZWl2aW5nIHJvb20gaXMgYSBsYXJnZSB0cmFzaCBiYXJyZWwgd2l0 +aCBhIGJpZyBzaWduIG9uIGl0IHRoYXQgc2F5cwoiVkFYL1ZNUyBkb2N1bWVu +dHMiLgoKQW5kIHRoZSBvbmx5IHJlYXNvbiBJJ20gc2luZ2luZyB5b3UgdGhl +IHNvbmcgbm93IGlzIHRoYXQgc29tZWRheSB5b3UgbWF5IGtub3cKc29tZWJv +ZHkgaW4gYSBzaW1pbGFyIHNpdHVhdGlvbi4uLiBvciB5b3UgbWF5IGJlIGlu +IGEgc2ltaWxhciBzaXR1YXRpb24uICBBbmQKaWYgeW91J3JlIGluIGEgc2l0 +dWF0aW9uIGxpa2UgdGhhdCB0aGVyZSdzIG9ubHkgb25lIHRoaW5nIHlvdSBj +YW4gZG8sIGFuZAp0aGF0J3MgY2FsbCB1cCB0aGUgRGlnaXRhbCBFZHVjYXRp +b25hbCBTZXJ2aWNlcyBvZmZpY2UgbmVhcmVzdCB5b3UgYW5kIHNpbmcKIllv +dSBjYW4gaGFjayBhbnl0aGluZyB5b3Ugd2FudCB3aXRoIFRFQ08gYW5kIERE +VCIgYW5kIGhhbmcgdXAuCgpZb3Uga25vdywgaWYgb25lIHBlcnNvbiwganVz +dCBvbmUgcGVyc29uLCBkb2VzIGl0LCB0aGV5IG1heSB0aGluayBoZSdzIHJl +YWxseQpkYW5nZXJvdXMgYW5kIHRoZXkgd29uJ3QgdGFrZSBoaXMgbWFjaGlu +ZS4KCkFuZCBpZiB0d28gcGVvcGxlIGRvIGl0LCBpbiBoYXJtb255LCB0aGV5 +IG1heSB0aGluayB0aGV5J3JlIGJvdGggSVRTIGhhY2tlcnMKYW5kIHRoZXkg +d29uJ3QgdG91Y2ggZWl0aGVyIG9mIHRoZW0uCgpBbmQgaWYgdGhyZWUgcGVv +cGxlIGRvIGl0ISAgQ2FuIHlvdSBpbWFnaW5lIHRocmVlIHBlb3BsZSBjYWxs +aW5nIHVwLCBzaW5naW4nIGEKYmFyIG9mICJBbGljZSdzIFBEUC0xMCIgYW5k +IGhhbmdpbmcgdXA/ICBUaGV5IG1heSB0aGluayBpdCdzIGFuIHJlLWltcGxl +bWVudGEtCnRpb24gb2YgdGhlIENoYW9zbmV0IHByb3RvY29sLgoKQW5kIGNh +biB5b3UgaW1hZ2luZSBmaWZ0eSBwZW9wbGUgYSBkYXk/ICBJIHNhaWQgRklG +VFkgcGVvcGxlIGEgZGF5LCBjYWxsaW5nIHVwLApzaW5naW4nIGEgYmFyIG9m +ICJBbGljZSdzIFBEUC0xMCIgYW5kIGhhbmdpbmcgdXA/ICBGcmllbmRzLCB0 +aGV5IG1heSB0aGluayBpdCdzCmEgTU9WRU1FTlQsIGFuZCB0aGF0J3Mgd2hh +dCBpdCBpczogVEhFIDM2LUJJVCBBTlRJLUxPU1NBR0UgTU9WRU1FTlQhICBB +bmQgYWxsCnlvdSBnb3R0YSBkbyB0byBqb2luIGlzIHRvIHNpbmcgaXQgdGhl +IG5leHQgdGltZSBpdCBjb21lcyB1cCB0byB0aGUgaGVhZCBvZiB0aGUKR09M +U1QuCiAKV2l0aCBmZWVsaW4nLgogCiAKWW91IGNhbiBoYWNrIGFueXRoaW5n +IHlvdSB3YW50LCB3aXRoIFRFQ08gYW5kIEREVC4KWW91IGNhbiBoYWNrIGFu +eXRoaW5nIHlvdSB3YW50LCB3aXRoIGp1c3QgVEVDTyBhbmQgRERULgokVSBp +biBhbmQgYmVnaW4gdG8gaGFjay4KVHdpZGRsZSBiaXRzIGluIGEgY29yZSBk +dW1wIGFuZCB3cml0ZSBpdCBiYWNrLgpZb3UgY2FuIGhhY2sgYW55dGhpbmcg +eW91IHdhbnQsIHdpdGggVEVDTyBhbmQgRERULgooQnV0IGJlIGNhcmVmdWwg +dHlwaW5nIDxSRVQ+KQpKdXN0IHdpdGggVEVDTyBhbmQgRERUIQo= + +--16819560-2078917053-688350843:#11603 +Content-Type: MESSAGE/RFC822 +Content-Description: Going deeper + +Date: Thu, 24 Oct 1991 17:08:20 -0700 (PDT) +From: Nathaniel S. Borenstein +Subject: A Multipart message +MIME-Version: 1.0 +Content-type: multipart/mixed;boundary=foobarbazola +To: nsb at thumper.bellcore.com + +--foobarbazola + +This is a text prefix. +You should be able to read this, no matter where you are. + +Once you've had a chance to read this, interesting things should start to +happen. In particular, a picture and audio should appear, +more or less *in parallel*. + +After that, an atomicmail message will ask you a few questions. +--foobarbazola +Content-type: multipart/parallel;boundary=seconddivider + +--seconddivider +Content-type: image/gif +Content-Transfer-Encoding: base64 +Content-Description: Bunny + +R0lGODdhQAHIAKMAAP///7YAAP+RkbZIALZtSP/akdq2kba2tm1tbf9tbW3/bf//bW1t//9t/23//wAAACwAAAAAQAHIAEAE/lDJSau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru987//AoHBI5D0OyKQy+XgYntBoc7l8FK/YrPAh6Hq9x2X02Sw/BugB +AOAcU98Hq3ZOr5+aazY+z++3x4CBBlNwYVRydomKi3+AZg8BkZKTkmWCl5gGSIRwSk2LoKE6jxKNgQdsCaqqD2ummbCCm3GdtYiiuLkWR3xJfb/Av0jBxHlIUrGXtHJhX85gTLrSobzF1tfY2J1NmFwC0Rjez1+b0+Z0htnq2rXtcR6Etx/iX/Ln96PuqOv8 +xvrt9vAJHDjBkD5j/fr9cxeQoENdBm1VeKVpX0IAx6BEXLjR08OP/rmOGBxZ0FMyQR0XFlIZJ49Bdu9AygSSchOsmiy5RWF56GLMmUBz4Cw0ZijRWDzftFq3FGPDoFBRGN12KYyhq0iT2vL5NOo9iiencgR7EqVWjgnLeSXohGzZt3ADMdNpdpvbsl3X6tV7 +N66jvYADF6wai2JewYgTK17MuPGoXQrsWTnsuLLly5gza97MubOMMjzLeB6dZSjKpXQdASTNukVTPXuKbbIkxczOpJRb694l1w8lSn2TcZolcbfxC20zoYJUJkATVhj9wiIuFtxxwcOHqVPi6BFe6U9ms0kiwMzq61B5KbnInl3worR+Rj4w7plV9DLDtN+P +EXe4cWpt/kDPM/LhJ81G/KV1Vm4GOiZWgtudZV2DmVX3UxsWQbjGAeFJeAiFmE11i0hlwaGah/ExNFFEDIIokBnIHYIXikpJ+Np2Lbo4TXWGcWTTSR7eGGGOOipioUnwcZQMjS0pJFKRPzxCSghHVgGeMkz2pFCBUMbwXmGg2SXll35VmdN81nhCZJczjOnm +m6KNYspsZMa1Jps61vnWnXjimRoZmTTCZ5+E+kmBZJIVqqgJU8ID46KQRirppJRWaumlmGaq6aacuvZmp5Rmh+KgoFY2VVE3FVcqZ1LSyV1RTQSQhhqunKLiqg4OWM8er5IhZRq13sYRrosJmU2dog5LLGCC/pbhUmyuMHflIB3VROqyopD1GiS/TaKncp4A +dC226EzHbbeVRDfItFCEqyy5+PS1HCurJNAKh+zKEl+V48JbA2h9qAlWhnwE960bIsVxZL/+3kEwhBl12Alh4C0zHxL1ZcdwwyVUs9/DHwPql8WlYFwfNFxyTIPHGrYc8J/dVLHLyeSkrDIMHoPsMkz/zGUGgTYXRPM3G9+sAcs7y7bg0c4E2IGuXQRttMO+ +JM2zSkU/HefUK9S0odXCBMn1gQeBHbaNY2e7EEJm9zdq2kZibZPOEGcpNdxB8HjobRpGbLfTeBMh4oqYrJdmEhqZycStgQ9h1Ig/Tqv4Sj1f7Eey/482rkLCi8vHop1/E5cTRjjem7XmGVhbWOhOBMkV6jY8XpVWthW+IHt3w051zyfmBKSNuJ8Ou5mvLLwk +jcbKZrruLCgO1khHTZdl8ml+wnwKkxtce1aspyX8pDCn+maQ+Qob+iYKfr/owVIgz36g51fBz4Q3/xF++dK5CZdY3lUV5ogbydzw3oe/bmyNcHI5BAFRcr1iFVAuDUzMAm8SQcVMkIEVZMzzbvKXDFaIFDAToAdHmLfmkbAxiUrhCTcjD0RYz3qRWeFl4ETD +T8nwhjjMoQ53yMMe+vCHQAyiEIdIxCIa8YhITKISHRemQhxwiWyZHBNgCEVcNFFMY7KF+v6q6IJkyWh12+AiOtxxGviFUYxFMM8b5MKtgtXljGg0gq6gh6/amGFWwWof4+J4A6jVQwx2vCOw2OCGd/GxTa7YFbT8gThqlWGQczrTIRF5kfdwY2mT/ExCDua8 +TL6gDdta5OWulBJrebJrvSmYc8xQiXwFUIunvANKVImuSFxQYqIrRCxHoC1a1tI5BazCHncpIOWc65f3Wlf5ZjMWYh5NmbJgA7qcpa5gdq5nW/yhvFyxigd0c0MPbNe+JOnMvSknFfWyFzjD2S6rhGaXLCpF4aJFTUKyU5xT4JcYW/WGgEXMEaMszLSWYRUv +fkiJ+klQI0l5JfEYRJHVQiLSWv62hMP9E5oje5IhaDacbOLtJR/TTnsy8j6SNWNoV5FohujWtmBw6GCzgNzQykM/IKajpfxBVkoPNVOa5g6HE8XplqZYmG/UNDI9/akMWcZSoTKSIcUTx1GFNjSlnrAaTW2pfyZSH8Ahh2ZWvWpWwYbJrxKIQX4kWhAT6tQN +lTV1UiUS1MJawZu21a20AwEVqUQPj/orInd9KjnLyYGUfA2nYiOsgMrWNuQpNnWMbSwqEvvYQ/2jrY6tbMkue1izMcmvPKxOLySbWcUeya1a/exjLcSM8JC1Iqotp94G41qX4Yt1sq2cOcWpUPPJDY6n5N9EsDRWf+oRN+cJrm5LJv8vw/XiolLMJXAPJUIj +Dq4kcSifQXOyXE74Y0xErJZHNhu5MkX3EGOxiBofVgXQwotzooMckvZ3voW5YqxN2pB739vEvQZwT/Wl3Zb2itDopepv0aVe9biIk76cV03ivJ33qjgUt5yXNoAA3uuWKKI36mN70pOwkzispN5h7XciHrFKT5wk33FPw9mwiFfXipsWlzjErltHS2Zs0xrb +mCHHQ56T6LpU2iXwml/EcY7n96QiOm92KRpJkD87YesuyIDtDU59NxzeK4czfgpWnuYwzMZG7UKKt4wwmKsMN07WN81kiB8T2Dw2Aj64vPi78zbS12Z2JRjOx5VzUF06mz6kJ86Vb7pnzEIzvoOyFa90ahwoFZ2/55EZylr8lgilFMH7URo8BNaWEwu431VJ +Sbs1THVuwscJQGtEs33UH6VLDWvaKprWtY7Mp3Gda1e/Otc98PUggO0DbQmng8QONkoEWpRk523Z3Wi2s5kIq2gTeNpz4DS2PajqbvN625Gp7tHEDW4ctLAgcylIuQUHGRWu23Htjve7t3CoM0Nm3sE2Ib5zEQEAOxoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= +--seconddivider +Content-type: audio/basic +Content-Transfer-Encoding: base64 +Content-Description: TV Theme songs + +8vp7cnRvc29ubWxcUebUX0tM1N5bauLZ5ejv2N5772hiX1lVVFdZWWPm0dDU1+LubmZhW1VXXVlfdOnZ0tHPz9TY3/ZgV1VUV2Lw7e/0cmRcV1FPUFZeb+7g2dLOzc7U5HJfYFxYWF/66uni3el0Zl5ZXFtdZnPx4djOyMXGz3FJPkzjXFVf/NfX2dzf5vj2 +fXn39OLe9k46N1zAwM1maM7wVkxLW+bQ1dzi49zW0NDX4mBAOVfHyNDcdHfe4mdbUUtHTnXYz8/U09Ta2dTQ7UhJ1cvnT0VP//fd2O9WRkI+PEVlzsC/yM7PycG+vcpFOO69zF9PbOx+YFJJOzY2MzM8X8i7u7y7uLOxtsRLQ8m+2U5KXurcWVNRRTs3My0q +LkDZv7+8tq+trrHGU9i5vtxUVW3ldFJPRzszMi4qKS9Oxbu8tq6qqay31Me3v9tRT2p3X05IPzwxLi8tKSk0aMO/vrSurKuvvb+ysr/mWGH1Z0tFPz01LS4vLiwvTcO5v8K6tK+wt7evr7nJ6+7qa05DPjs4ListLS0uO9C2tsDBvbm1trKur7W9zeF8Xk1F +Pjo3MSsrLSwtL027rrK9vbq1sa+trrK4v8vacVZORT88OTAqLCsrLDFnubK9wLixraysrrG4vszkaVtaW1tbXllDQlBd7GJLQj04NTg9RlJgeuna0tDV2dfQzczJxcPL6M2+u8VZPDQxMDM4P0pQWmfu3dbb4ePc0czIw7+/zta+t7rdRDg0MzM3PkhPVl58 +4Nra3t/b0szIw7++w9jNu7W67EM5NjY4PEFITFVgde/k3+br4tnPy8XBwdJq28a5uc9SPzk2OD1FTVRn+Ofb2Nbe3tXOysbExMjn787FurnFbEE5PTw4Nj1aU09f4dbZ29nLzc3IysnReOrWzsXBxd1NOzU0NzxBT23h1cvL2e9pX15u8drO1tvN0c/Gv8LU +fltMRkM/Pj08PT9HU23s3dbPycS+vsnMy8vBvsV3RDkxLi4zOj5FSU/XubS0srKys7S2ucJhPzQyPkc5MzAwMC8xOd2qqauqrK6xtLvLTzUxRfpMOjI5UkY6MzNdr7K2sLS1u8TdYExGPjIySeXc63xQPT7PrbPFzMjE2mlNRklOREJKbdTV5djFy7usu9No +SGzb/E5EOS8qLj7nx7/DzNi9paSrtEgzPWDyUz8/PC4wOkZ76lI/SrSpr620vs5RP2DK7z88Uezc1NPV3XTCr8htSzw0KSQkLlXi139R6b2sp6y3ppicqLfhSzcnHR0jKikpIx0dJEq1qqOYkZWXnaq9xHArJztMQTstHxoaHy05b6uorKeoqbG72i86p6m8 +v8s7Jyg38MG1pqm7zkU1LSceFhEorautyllGxqikn5yWmaKpuMZWNiccEw0bNC0eGB03rqGfn5eUmZqfpaiwyz4qHBcoRiQgKC09Rz47YcLHr6Whpq+5x1gsJXGtbU+8vMi4w+G4sdZeRDUtIx0bGxoisaO6v6edn6OjpJ6Yoayyy1UvIh0XDg8pLRwYIEW8 +pJ2dmJGVmZykrMBlPCkaHOndKh0eKCg0RztHwcy+qKOhqa+zzi4uq6fSODhvbLevytO3x0Q9LiojHRscHB6/n7G3qZyfnZ2mp6CmtLrOVDYpHxoVDxcgGh8u5K6kn6KdlpWam5+ntc1FLiQbHicocM/qOygrKCxJW8+rpqu0s7nLTC46XsiioaSwYlZKSr/Q +OjYuKSMeGxodJFN41p2Xk5ijpqmpn6Kzvuw/LiciHBQQGx0YK1Gwo6alqqeZmJydpK24yVY0IhwrLx8rab7IRDw2MzAyXL69zNrOz+o/M1TyPGquop+lqrC+3E5PRzo3NS8tLSorOT452qugnqSqrrrMYVhZT0xBNzQyLisuKy/ptauorK+1vcra19R2WlBA +Pj85LiouX7mvrK+1vM1XQT9LWFdeX0pHU2VGLzq+r62vtbq7yVA/P0VAOzk5ODY6REo3Pbyspqessba7zmpLQj04Nzc2NjY+Tzs317aurK61urrCzuDreUtLcFU+MDlKNC5NvbOwtLi9y9J9VFZST1Rk6eh+7+pnT1RcUklITVNVVFlb69LPzczN0+NfVFRT +Yebc5+PQy9V9Tz8/QUBBSVNq4NXW29TFv8LKzczS9XJgTlVkYFZPU1xeWVJJQUpia+jIt7O3uLvJ1vVOPDY6UVtPT0Y+PD88OtKnqa2tsrrCzWxFNS82S0o9NC43QGmsqq6ts7nG12tJPDg0MDE0Liw1WK+en5+pub/rW0Q3Mi0qKywsKzA/r5udo7XMyLmy +u95EOTIsKSgoKD61tbndW8m8uLu5wcv2SEg/Li25oqeuPzVETE1HPzguJiMnMdqinZ+fs97NxctNKiQzVEw6PLCdoaOseDMuLConHx0fKCwsUJ2Sko6TrkVV2MTORi4mIh4aH0tsWL21JB9Vwaiip6+3ub/UrqWuqqmlvRweIyQuMjI1NTEwOE3NtKujnKo0 +PklNTTEtMUJX07mvrqytr6u9MjhEQTUsLC88OjM+3rmup6Kr32vYzb/eTktGQjcxOU1KPWLNZM63tLS1wOZj9tzg53teSkw+KiktR7musbi7yd3i3t/Px8TXPDU4Nj5GMzXmvbW0tra5v8LBWz9Z3s3ZRDUyMDEuOtK2r7GxtcrWw73E4U5JSkpDOzY1NzI5 +5sO+tLG1u8PN0971eG1eVEY/PDY1Nzvit7KxtLi+xcjS29vwYE9FQTs2OkA+O0nNu7i4urq/xM3o1NF+b/5PPjY2Ozc2RM+7t7rBwcnT0dLS315TVEc9OT9NRkltxLq4uby8xdHkdmtcT09iWUc9PTw3RN7Curq7vsHNbU9e3+lVSU5QSkQ/OT3rwrq3ur7F +xcXM3X5uWElHS01HPkBDTdjHycu7vsy+v83T5uP9WElHSkc7NjU9a9PEvr27vcfSz8ra6eBeV1VJPjg0LS5D4sO7vL67t7m+w9j5Vz84NzU1Oz86PVzOt66xtri7wdlXOzIxLzI7Qk/jwN9S1sW4rq+6zFY+OzYvLTZGx6qwsLfZ4Fp1Tz40LS4vLzBFpJSd +p7G4v95JNSwgHBwcHDKmk5mbn6Wnv1xNNyQbFRIdapyboqOnpamtu10uIB0YEzucrKmiqq/E0EAxKiUhHCmgmaqfoq6tqLM9Jh0aFRTVnb3IzK2oqqmlsOc6Gxyfla6+LiwvKSMgHxwsNs2LiJGWq1c0RDMoHBURDxDOj5idqb6oqK23xkMqHS0mtpK3sD1J +Yy0mIB0aLKOnNJaModREqq/VQSsdHMlcHhlFqigpX7Osnpmdp5edXSQznz0ZEBMVDxgptI+LlKipi5arQxwgHRgREtCdrkYkm6RPyDK2rrr+O7OqKy0vmYytzhoZHxgXFiqdnqw0OI6RlKVduzMlHyTMwyYaCyTCITy8kY6Ynqygma88HR2j0B0RDRIRHzuo +jImSoUuVjarvGx4ZEhAVxJejbBospOinra2lv1kuM8m7s8y0jqVYIBEcFxQRFryWqzHFhYWPmjQ7OSAeHSTcKhQMFD3kl5mUj5ums8CioDUbGLQ9EwwX0jkuKTWljJGfspOOujQWFQ8aXmi6np80GSasQrexsq0+LBkkmY2YsbeTsS0dEx0XEQ4UQ5+voY+C +hZepJywpGhoaHTUrDwwZtpmMjpCTqMBSMuenNBstxB0PFzuwTSQpQaiNlLehjprbIxEYLs3KzjvCxhgYS8i7qrmqxRwfr5+Zj6ZmoqZKKxcZHhALCgwui4mTiIWPnz0tVysZFREPHRMKZpOcl5KVk5u2bz0pP8MbH14hSq7IttMnFxQgsZGdqo+atzISJaKg +r/4tI0w5Fi9fJ3Dfy7I1LKqZnJaTuradzS0bFBoTDAkJFZuBh4qEjZ3BJSksIRwWDw4VGSeamJqSm5+irb5JLSJIyBoiuq2gvTpbIhQTHUSfkaWfkr0mN06lobnELBsbTi0dPS01ukIrsp6XlqaqnKNNqaw1IRMPEgwFDTKbhYWNiouYqkIkJyEWEg4ID1TL +nJarop2fn6PDXk8mH0EdGaealZ7wNyQWDxEb4JSWqJmrL2ipl5arSycbFik0HDc3HScrLquUjo6ar7WlScGpQCgZEw8IBQ0jo4uEio+MlZ/DMzAkGg4IDBy8pK2hrbuon5uisFkvLR0cSr6elpqsPiwfFQ4PGzSllKq+nZWZnZqfvDIeGRYaOyYaHxwbMpmS +ko+YpLTWo6d4tPooGQ8LCA0VIKSQiIaRj5Ccqc81HxQLBQse9Jefs7ZOtp2YnKXRLiQZFEKopJGSotopGxcQDQ8dwpKcPKSRkI+PnbUxGxoXFio5GxwPDDiXj42Lk6K0Q7OdutBOKxwLCRYcFxcvp5GEi4+PmqT+MSMPDBgcGyOdltHSL02pnJyqxzkaDySf +k6KalavTLB8aEg4OEyG3n5qNjY+QkKC5TSIaExIYMiAPCRG2l42Oi5KfrlhZopu8RyAXCggXIh8eSLuji4iPk5SbrjgaDAwdJyIksJe8Py1Bs5uYpbgrFBo5s5SYmZi5Xi8hGBgRDA4PG5SHjI2Tjo+hyUQsHxsTDx4eDRsmLq2WjIuRnaKvzLWr1zUaDhwt +JR0aJE3dtZiTl5yoy0InFh4+P0s8Sa6pu7LC676yvzkiGSDBt8V3zqOhvLjCYVI5LSgqJSTfr6mwvqScrLPIRl9fRyseGRs6yLm3uamftbOst7hmSEQyHxwuVFhFNm+lq6usxbi6w9c8KCw8Pz9CRv2xy9WzyMXRzsA/IyxV2MLGZFCrqcK52dNNNzUpIDDV +z+rTwM2ooq6sv9FDMjIrICQ1Slla19Gqn66xvbu5zEQuKCw+RUpNRzlau8KyrbO3vdNIMjFgyM9uPDFJsbnXzM/K1WNHPjZARkJc3tvXraq0uNdnWkg4KiEvatbZ6uXYr6mzrrO9zT0vKCUvOz5W7F1OuqSqp6/Q3GFPNC88V0c6Nzg5XK+/vLK7vsz4TE5P +XubX1FY1OMfP18dcTE9ANkPZu7rXYlVMZq+vvrr2RDUwM0FORExd8fTj46qktLjOxsVoODI0NDQ0NzxOUbirsqqtt8hUOztFS0ZFRDcsLNOptbq8w8nhXERdzNNNQljuTd2uwVNIRkdESkZT89bDv9L0TPStrbjA1Fg5LCYvWHZYYllcWM2qp7G61EdFUElF +RzwzODw6PE21qbu9uLe84lRT8ONPT1A/Nis3yMe6vcbL18zGv8Pb6Gs8NjvhtuNNTlZMPEJa29JZVsa7x2PVsLa6vuFSNi0pKjdLbNzrZ92zo6iurrz9NTI7SVY7LjA6OTtnr622uMPCzdtiW9nE1lZJPDIzV3pS1MvUalLPurvCy+tVSTk43rbJ3UI6TkdE +ZdTd09bjd1dXw6+6tLfZSz04ODYzPklQXk1GvKOmrbPG3lQ+R0c6OzgxMjo9U7mysay7zn9d295MUM7HbD02O87F481PQENATcO7x9fp+G585L27xb12NDM/R0pCR3bIxs/19r+0v7yyxVc5NTw+Ojs+PkdbY82pqKuy21pIRlRNPj8/OC41QVW6tbSvuL/Z +Vunac1ppz19FPj7Sv9fuSD9GT3jwxb6/xllBT+S2sMLIYj4xMz08SElX19997+W5q7G7035SUk45OTtIXkM7SGXDrqywu95BPkdNbWxkfk47OUTkta+6zGts2dbpX1FLRUNHR0pXxrm9vdtPRkpUU2F/XVBKREBPs6qxudNSPkFKQkFEPj9AaMrPuKyvuM5s +T0ZYW0w+PU9EQUZcvK6zudFUUUxFP2X9YFZER0laxbi9xNRVS/nvWv5r4O1HRkhOzrrA9/RxUldJTevaz+NNTFxs4buwvclmTlVGQkRGTEI7PEbsw6+rs7S/1+tPRkJAOzQ0O0NJUb2rr7jJaWRaUkVDT1xoaWXy276zxX9MPkVCRExh693Vy8TJ1Me2vMpm +Pj5AP0BNa9LfTkdNb825uL2+zvJYSldfQjk0OD5JZNC1rbC1v8LGW0xKTE04LjA6S3LFtbe1wu1eTeXR3OllX313ee3Cu/BFPERJPkhf7uZeWeHJvr+6tLvUS0NCODk9P0xVbGFSUdm3sLa+xtftTUhSZE88ODhLaN2/srPAzt7Y39zkZ0hDRz9BRUtjz8K/ +wcrdVkti3PxiXVRWVVTexLrBdkE8Slnt5FpKSUt/zb+1tbO+zO1KPzw8PDs8RlHi1eLZv7Cwub/Pb09IUU5CPzk2OU7TyL7BzMnT3c/IvcVePzw/PT5LWtjP587V9nla+dfY4/vrbvrS0sW/0dhQOTk/WupuZGlqb9G6uLGxzl5JPT4/Q0Y+PkNPTmrJysO3 +t7rB08zZ/VlMRTo7NzQ8Tty8vMDM5cu/vcTL6UY+PUNUZ97CyvpvTU3n1GxWTEhe7dTEx8i6udJlRzxBR0ZNTkteaXjJv7+3s8dgQzpAWF1OQjk9RUjrw7+9t7zHzdDLyNZnTTo3OTo/Uu7QwMHKzdvVvsDM0vNQPj5KWmP21+BPUFlOW3T38/ztbGTVw7/G +xL7cUEtDQ0RLT0FARFHozbqzs7O/3W1gZUU+QTk3NkXt7tLAuLO8xtLYxdlfRz5GPDo/QU/qycJ/UmfZyM2+w31oT09ZW2xfbtpnR0Bezn5282T8du3YzsK+v8HE0FJLWklISEFDOzxK9cy/trW3vNN452ZfTz86NDQ7XOXnzsjBwcnLx8fHz3lLREM/R0pN +bdvK0Xvx08nIxsn0Vko/RVfy1N7l6mBr2M/pZGFORVb8283Hvsbb5XpYVFVNQT5BQEZHWdnHurS3vcbR325tU0I9PD88PFDfysbLx8rDur29xtxPOTs+PkVQZ3T4zt/szsa7x9PRf1NNR0ZKXV9Y8mhkYl7Kyu9oW1JV28fJwsfV21lVa1ZfXE1JRUhJXd/M +vr++t7vEzXhtWVJMQj8+SU1R2NLs2NnLvcbLwXde70ZDTl9PUU5DT2rb4Xj179rgz8fW3HtUYGFRTkZKd9jb2Np7fOt83MnEvsthUEVDZsm/yOpKQEZBQ09X2cjKv75n4sDL121NQD42NELYuM5fz1VE8ca5vL/Ob1Q/P3RGP9njWEdMVdzGxsPCvcDKzEg/ ++ExBRUFJQE/m1sO4tsta2Ng4etlIT0NIP0Bcyru2t87sw080dUs7R01ifObj2MK4tsTnz0cuU/9HXF1ZWlV7yLWsrbnS2TorOzw2RWnv7P9u3Mm8tLS3tvo0PDYvP3FrUkE6S8S0rquts3E5Pjg3Rtj7Sz4zOP26sq6srsBqRzw1MUvg+lc9Nk/Ata2ts8Ru +Pjc5MT3h3l46LTbMqqGkq7t7Oy8vKi5MUFA+Lix3opyfpLHKSjUwKClHWEczJyA4n5aZn67KRS8rKDPO0U0wJh4mrZmbn63CbjYpLVvBy08xKB8fWp2bnqjEUi4iNrOst2oxJh8eL6qam5+xezUiLbyzvN04KyQgLr6inZ6mvkclIGOyt8M/KyEdJdShm5qf +uE0pHS66rrJgKx8bHTmnnJqdrdE4JivPrK7LMCIcGS2km5yers06JibuqKe3OSUbFSWgmZyertwwHyTIqqq+NyYeFx+klpqfr8ovHTCxrrDXMyIdGRu6lZabprkuHPimr7tfPyccGBkxnZecpLc4H9GgqK3JVy0eGBgmuZ2coro3HT+eoKW00TghGRcidKad +n630HyGqoKOt2zsmHRgeSaKXm6jMKBxqoqKnyzgjGxgcRJ+WmqXELhwwqJ+kxDsmHBcVL56Ym6bBNR02pZ6fskkmHRkVJqCbnqfFLBxKnpyerlEnGxkXIKaanqLMJB+5nqCltk4qHBsdH7ydn560JiS4n6KswT8sHxoaH2Khnp6pLCK9n5+nsWItHxoXHT2v +pKCkTiDjnJugsN41JBwYGzSyp6erySQvo5qcpb8/JRwZGSm3oqGrzSUhtZuaoLtEJRsbGiiunqKszCshyZybn7s6IhscGx+0m56kyiYivJybn69KJBkZGx7Fnp+k6iEurpyaoa1LJRsbHR9IqqOlWx8+qp2bpKtxKh8bGh9Dv62juypDrJ+bo6rlLCMeGhw8 +xLqnrzZDqZ2Zo63dLSEcGho8uMyvrUUvuZ6XnavIMiYeHBktuMe7tkor96GXmqazQSgdHBwrxLqxuEEiNKiWlJ+tRicdGhokzaqotDwgO6aYlaGuRiUdGxsjS66lrjkj6qialJ+tVSYeHBsjR8Cxch4eZ72kl5ufrG0/Pzg5PDQ6LBccT8momZygp7jNc0ZA +RjUuKRgaP2y5npyfprbI0Vk/RD8zLh0YMNm1n5+oqrXI6UtJ7WM0KR4YJ9K3npujqLTH2k1FXVw6KyAXHVa8o5yjp6+/ye7mzt1ALCEYGjzPq52krLvMx9XQxMTXQCYYGzNTuqSnr7rMx9bOwMncRygdKT5YuqSjssHiytxx62BtSycfMkz0u6WgrbjZYEhE +TkE+OyghN0xN1a2hrbztWkxDTVh53zkmOWFe4ryruutCPkpjwb/SytIvOexR+8uxvt5bTlhJWkkzMMxeObm6uLarr8LkRjswNjkvNsYtKLitqqihpbjQRzQoIyMqbkRHy7Oprq+rrNE8KyYkKuitrKG58LfL2VtXUiwkIiM9sqGVmZ+zejskJCQqLSMn26ud +mZ+jrX4mIScoIiAttJ+cmaKrwVw1KCIdIR8iQ7uWjJWet0gzJyUkJB4iSSykj6Gdq7hdKh8fJy3Dpjwpm5WotjU9LSEeIiRtornp2I+VuMZBKhYXHzG9obPROcuQlK04HBgZHiuxnaOo1z+fkZ83FxwaGSC1nrevyUyejJNIEBIdJihQpLi72ii4jI+tFQ4a +ICzDmJ6uxSw2lZGlHAwWGiM6npmkpugtnYuXRQsOFx4ut5uqq8c5Y46NrxkMFhkke5eaqbRBMKiLmyEMEBsfMqqbrKetWbmLkCcPDhoeJGCdpLSvSU6Miy4XDhgpMtafmquo3DWUkSAaEBQkJDewlZygqlaYjDcaEQ0eKStTn52mo8CqjK0ZFw8dKio8oJSg +p7jUk5YdFA8YKSgvupacoaG8nY1tExISJSksP5+bqqO8rY6lFhIQHjQvOKiUn6Guu5GdGRMOFionLOCal5+fo5ObJBgSFCspISutl5+inpqdQRwYFixELz3Bm56rn6qy3B4aFiA6LznlmZCeoK68uSMZFRw6Li5Ho5Sfpp2lxSYZGBs6OTFUspiYn5+lqS8Y +FxUkNio3SKKUmpmZnMwcFRYiNikmKdGcoJ+amKkpGxssRDE0LmSfoqikr7QrHB4kPEY9LnObmJaaU8EqFRgcP2w9OOyel5SWM7y8GhURHTNE0bWek46QQT+uIhcTGSEeIjezkYuMo+CkLRsZGSMmJiorsZeRlbikxC4kGyk2OTMtyZuaoTRMvzQuJ0NgPDg4 +xJmTls0lKxYXIUW+v7/X25+Qj6YsORwRDxIhSbKmoZaKjKgvyzcZEREVFRYmrpOEhZm5rb0mGRocHBkcISacipihmpi6Ix4jKyooNDetmi0Y6Jaaxj85MzMvRcOhj6oaGiYnHje6r6q69bygjZI1HywtGw8PGEmkopuUiYqyJTRxMRgQERITFzmYhICMxtSw +0CgZGhkXFBcer4ySop6YnMMoISMkIyQor5U0FSKnkJm1RjMpLDxdn47SHBweKCZftay0uL/En4udLispNiEVCxA+pJ2clomQTlPjr+oiDgwODRBlk4SAl7a2pqHCIBUWDg4SGVmMkJuamJKgRh4lHRscHj6bzRIfooqNmzgwJR4qOLSToRsYGTFvsLS4tVxn +VqiPmUcvKDdAJQ8NHtagopWNmLHJybq0zxoLDA0WKJyJjpKcpaShoUYSERITFRk61ZqRk5KUlqsfGyEcHyA9Lh0cM5iNi5HiIicgLz+8uDEoJCooxZKcXt86Rlyvn7JqNTg8UWQcDCO0qJ6clqW/ybSvsLUvDgkMDjKWjZOXoaeloJutHAsODxMgMS+akJKP +lpWePRYZGhorKxIdNd6Zj4uMniQeJSZ6+RogQCs6PqmWl7pLzT7Gsigot2bMV0BLMx8d3rOfmL8rs7Gpo7K5SRwKDBRHlJzGoJufm56epkoPCw4PISYqn5GTj5SWm6clFBcUHyEPEi2vjouMjpfXGiEiOzoVEyUsOMGjj42bPjEuTn4gIjzZROZbSnbdNdus +o6wnKmykqKisxk8uFA4eRLP9wKeam5uanqnIIg4QFBYWId6Xjo6Pl5ykxBwYGxgOCxA1npiNjY+Tny8eLCoaDg8cT2SqmpWRlq0yV0YnGRkmw8jLwdrGsad+vKs/Ih8uqqGmpLpiMiYUHLPZLjlApZebl52pvEEXDhgPDyXHnI6UlZabn6c5GB4OCAsPLZuP +jIuQmJysKjIdDA4OGD3IqpaWj4+W2jk3FRcWGjy1v7jFsZ+fs7uuKRwcIfugp66vv3pBLSxKIygvPbeamJ2dqb9SLhgZFRUcIrmUjZGVm6Grzx8YEwwNECSpkI+PkZWapFUfGA4ODhMorqCYj4+SmKc1HxkWFBYh0b3FsKSalZW+KCEeICMvvKu0s77Cw69S +Ijs2MDFBqZufo6+9wc4mDREdHj21nZKXmJuiqLQ7EA0PDRMoxJqPjo6Vmp2oHg4PDRIWHs2cmJmTj5GU6xYZFRUWGkOuvq+dmJ2VnyImIx4jIjq1zcCutrCephseNC1HScigoq+svr6zVhIOHR9Dw7ialJqanqWoyBcKDQ4ZLEadj5OTlJaXni4NDQ4QFhcx +nJiSjpGQlawbEhQTFhgeZ8C1mpeTjpdGGx0dHyMjRrzCtL6ym5tIIiotNT9KvqWsr76/rskkFRwdKr65pZiYm6Gtq8MtEAsOFjo41paRkJGYmqbgGQsNDxUZKaGZmY6QkpefQxEQERMWGi7CqZaVlZCVpCQbHRodHCbht7Kyq5ubn1QkKyQsLDC5rLSvtbrX +3jIcJjZHa0ytnqShqLC8zScNDhsrQcSilJeZm6WrsUMSDRESGCa7m5OPj5WcoLMdDxQSFRkcR6eYk5WQk5jOGBkXFRscLr3DtKiZl5ufMigqHyQgLbS2u7C9xrioPB87Nz0+T6eosKqvt73qGw8iLy/luJ6Ynp6kq7nLJQ8SEhQnY6SSk5SXm6KuQRMQFBQY +FyWomJaPj5KZqiMUGRYXGB/ryOSnl5SSlbkkIx0cHCF8tMS5ubqunq8yUj0wLCdbr7avsLS6zjEYHzMxzMqqnKKorbGyvEkZDhEUJlC0k4+Ulp2ms9AhDxESEhUdrpSWj46Rl5/+FhIUExcaL8vOoZOUk5GcMRscFhgbLLm/urO9qZmavDI4JyEiKru3u62y +ssX9MiMwP05iXqqir6uvs7/XNhMOFiRltpmQmJufqLTDThgNERAUG9mUkY6OlJqksSUPEhITFxxQtKCTk4+Ql7QaFRYVGR1EtsO9u6GWlprOKiccHR0ysrSxub6+va3FKz1LRzhCra+2uL+/y+0kDxgxR8+plpaeoq++y8wxEQ4REhxmmpCPkJaepqxxGQ4S +EBQXKq+aj4+QlJiiMRQTExUYIsi8uKyck5GSpSUcHBgYHW26vrO5vraenOw4Ti0kJOK0xbm8ws/NShwZPE/QuqSao6att8fWWR8ODxIdWKeQjpGWn6myvDARDhAQEhq0lJCOj5OaosgaDxMSFRcywsOilJCTkZldGBgWFRgqvMu5u76umJGhPS8sIR8ow7+6 +tcj9S1M9Kjvi6dbPoaCoqrbBbEYtFAwSH+Svl5CXmJ2kt81SHw0ODw8Y1ZGQjo6WnqivOBMPExAVH2LLoI+OkJOZriIUFxMWHT931b29pJSQl6woJh0aIEPC3Mls6U5OvaxNQ9BATrqnr663w1s7NCEPETLjvJ6TmJyhqbLD2TEVCw4OF8iSkJCQmJ6pr9Yj +DxAQDxguwJ2Nj5CUm6RVFxATEhorTUDbu52Pj5GcNxkcGRoq3+vhb0pO/6SWqDFCMypMra+8uczYQTwyHhYuz22rm5uko6uvv+tEIg4KDxjElZCTlZuhqLTBQRgLDQ4TJ66Wjo+RlJylvCgODxARHj1JT66XjY+Rl64cEhcVIE31Qko9Trmbj5fKJikgJ9i3 +wcToT0s7NTw7MUlP3KifqKuwubvPRS4bCw0f052UlZmdpamvv3stEAsODh2sko+Qk5eep7DrHA0PDxUrOUiokY6RlJmjPhQUFRctPC82PlKulY6Sni4dIB49vt1hSTw4OT/Cn7IuQznWpaqwt7vCXzsxKxgOJciwmZeeoqeqsL3fPB4MCw8Wr5GTlZaanqix +wjsVDA8PHDRDppGPk5SbpLUnEhUVHDQuLzZPqJKQlZixHxsfJuXmRz80NTY/tJiaSCw6Nbyts7bJeEQ1Li4pHSXQ1qWboKSprLS+cTspFQsOGbySl5eYnaGnrLriJw4LDhQtX5+QkpWYnaSs3xwQFBYlKyg3f5+RkpeapTkYGx428jg4LzE0TKmWlqwsJClG +rr2+zVY7MTAtNVBLPEy7n6SoqK62x2k0KyISDBrOmZiamp+lqqu7dTUZCwwRH8udkpaXmp2lr7g2FQ8SGSorNtCdk5WYnKO7JBgcIz44LzAvON+flZed0h8gK9C7ztRFNi8wMkyrpEAwW7ipr6y3xd5PNSsrHxMaz6WbnZ+lq620wvNFKBMLDxvNmpWZnJ6j +qK614CURDxUiLTK+m5OXmp+mrHMdFh0sMysvLzXSnJWanKkwGyNBzHZVOS8yNTFCo5mwLC/wsLCvtct9QTIrLSshIEayoZ6kp62ts75aPC4fEA0X25mYmpyhqKuvuMY7Gg4PHCw0tZmXm5yhrK67MRcWIS4rLDA3wZyWnZ2j0R8bLF5sRTwvLi42cJ+VoVIn +Nr2vt7vOZDsuKiowN0xLdKugp6mrr7vTSTIuJxoOE12Zmp6eo6essMbbSSURDhkpNrOXmJyepK2ys/8gExkoLS0zOLuZl56hpbE7HB8+Ujo2Mi8zONWfmJ6uLCFPt7vC2UA2MS4qL02tvy7DpquurrfB2EcxLS0mGRI5nJ2enqetr7XL+04wHg8SJDyslpme +n6WuurzjMxkSHysrNEixmZmeo6ivzykYJD83NDYwMTy6nZufpdshKMzMdnFDODMxLC7Un6I9N7KstLO60WZDMiwuKyQdLqWeoKKor7S73EQ6MScaDxlBppibnqKqsL7L6zsjEhQpLzFPqJmcnqKttso/HRgrODM5ODQ/rJmcn6K1Lxww21tRQTUxNDM2vZye +vTI/try8v/xIPjYtLC0tOEvOpZ+kqLK9zHNCOjMrIhYUNJ+anJ2jrLTA3U06LhwSHC8x2Z6XnZ+irbnNUCgXHDEvMzw3Q6eYnaClslogHz1HPUU3Ly4zPK6an6pPKWq6ycd3PjIyMC4uMMetVrufp6uvvvxNQjYyLSkeFCadmZ2cpLDBxutOOy4kFRMmOMqa +l5+ipq+9zVAzHBQhNS87Qd6imp2fo7HTLxohQDs/PTAsL1ujmJ6jsysp089tZj0wLC0tMkWtnshGq6evsMNMODcxLi4rJx4lppqenaSyyORNPTwwKR0TGjywmJeeoqq0wMxVNycWFis2Nk60m5qfoaauyUEfFyk8Mjo2LzHPnZidoa4+Hi3dSUhBMi0uLjPZ +n5usP02stcDJSjg0MS4wLy0yQr6enKGotMlpRDc3NC0nGhMtoZeZnKCtutliRjYsHhMcOTVNppeanqOttc1KKRcZMjEvNzhAsJqbnp+r0CYcN0U2OzMvLjA0upqZobsw7LPS70Y8My4rLC8x8qu/tpyjrbrMVzwzLy8rKSIXIZ2Vm52jrcLvRz01LycYFCg+ +9Z6Wmp6jrr3aSDIfFSA4LTAyWqOXm56grME3HB9BODIuLC0sPKqXmp+pPCrXz0g+My8rKisuOq+brFyoorO+fEY2MC4sKysrIiellZydpbHHbkk6NC4qHxQZP7WZlpyepq/E5kc0KRgVJy4sOcydmJudoq3BVCUYKTssLSkpLX6el5udpM4kL89APzctKCgr +L1WjmKDW5ai1yN0+NC8vLCsqKzhbt5ybn6a46Uk/OjUtKCYbEimjl5ecoKq1x/lAMSwfEhkvLD2tmZqdnaKtyV81GhkxListKi7Ampeanqe3Lx4+TTU3LCclKC/AnJmdqzvltd/kPjEsKSkrKy35pa6um6GpufZDNTIwLCYmJRofoJWZmp+sxN1fQzItKBoT +IzNIoZeanqCoss5SOiYXHi4mLCs3r5qZnJ+puEsiI0YzMiwmJSY1r5manqToNMbeR0IyLScoKywvvZugvaGgsrt5RzIvMC0mJCgkKKWUnJyjr8xcWUExKiggFhkybp6WnJ6lrLfKTjwuHRgoKCUtRKSZm5yfrL3YMR8uOSkqJicoOqaXmp6iuDE+yT06Misn +JSgsObGanK+xo7bVbz82LiwpJiMlLU6rmJugpLLIaUw+NiskIBwYKLedmJyepKy6zFg5LygaHSskK3efmZydoqu/aUEmIjcrJCQjKEihmJueprNVLmBNMS8pJiQlKUWmmZ2itrCv22I9NC0pJycmJS+yoZ+Zn6m5y2xAODEsJSEgHSGumJqdn6m6zNxbOi4o +HxskKSvHnZqfoaixxvRIMyUoLCQkIylhn5qdnqaz1D47VDguKCQjIyhQn5mdoKu9uclXPDEtJiIjJyc7qJyinp+su/JQOTAvLSYiIyIpsJibnqOtvvRdTjsvLCUeICgwtZucoKWttcNtSzksJyknJiYqy56cnp+qt8tVOzc1LSgjIiIm/p2Znp+oudDbWDou +KSUgIiUpRaGZnqCmrsDtSzguLCsoIyMoPqianJ6lschuUkg9LyonJiYlM62bnqOos77NZj84NzEmIiYlLMKdnqChrLzW4e0/Li0nISAhKNKcm5+iqKu2V0o8LSkiICImKmqfmpubqbe/VT8yLSooJiMiJ22bmKKfqrnfSkE7Ny0oJScyLzCom6KlrbnL2lQ6 +NDI+OiIiJiu0np+io63E53LSxTUnKB8fHym+nJygpK2tqL42OCskIB4fISvMnpydl57Bzlo2LyooIyQjIijYl5GgpKrGc0I6MjAuJyQmMt3gp5ulp6/A7FZNOTIuM2Q2ICg0rp6lpquzyF9KSb3NJiQiHiArtJ2foaexvKynQi0uIx8eHx8stZyeoJuYrUte +NCwpJiIiJCUsvpiPlqmuzEc8My0rLCglJCrOop+epKu32k09PjcwLSxFxyojUaigp6i0vtFYRTx6rz8fIx8gMqqfpKGptcm9pbMsLCUeHh8gLqubn6Ghm51oOzcoJyMfHiInMq+alI+fw808NS4rJiYmJSUobZiTpKSsxWA/NjAzLywpNL3RKdefpKmrvPdf +TT84Qre2KR8jIECmoaqorr7q5q6kVSUnHh4eITWonaKjqaObrDUzKiQhHx4fJTumm5mPlbldQy4sKCUiIyMlJ1KVjJuoqtNHOTErLCwqJyhjr9u9naWsr8pKPT02MzBwrXAgIShgo6WrrrjRZUrSpqwuIiEcHSJNpJ+jpK2wnp3ULC0kHx4eHiRZn5yelJCh +STwvJiUjHx8hIilflouQo7PPODAuKScoJSQmNa+gn5+jrLrfPjQ2Ly0tM7+uOiEwtaOorLPCbUFAQrajyiMfHxwnwaGjpKq3ybCdqTYnJR0cHR4nvZ6foJyVmcAwLiUhIR4dHyIqvZiOjZi6ZDkrKyclJyYiJCrCl4+cp6nMTTgvLi0qKyxEr7svO6WkrK7B +ZEM6NjZVqqs5Hh8fLK2hqKivxnjWp5/AKSEfGx0eLa2doaKjnZikRykpIB4dHR4hL6yZlI2Qp0M2KyQkIiEgHyEnXJSKlKWuyjcuKykoKCcnK82suriioq+00kM2MS8vNcaovSweJU6npKqsut1LRsWjqFEiHh0bHz2mn6SkrKyenbctJCMcHBscIEKhm5uR +j5zRLi0iISAeHh4hJlyVio6ateI3KysmJSUlJCY7rp+anaaqv3s5Ly0tLS47t65vJia8paertNFOPjpEs6O3LRwdHCLRoqOmqLXArZ2maiUgHRocHCHlnp2emZKWqzcoJh8fHRwdHyjLmIyMkqhOOSkmJCIhICEhKcyZjpWoqsBINCwqKCsqK0avtkQ1raCr +rLv1Pjk2M1erqmQiGx4ntaCmqa685c2mn7A2Hh0aGxwmup6eoKCbl5/HKCQgHRwbHB4qt5qSjI+ddC4sIyMgHx4dHyREl4qOnbHEOy4qKScmKCYrzauzr6agqrHFTDcuLy80yam4Ox0eNq6iqau62UxEwqOlxiYbHBkcLayeo6OpqJycqj4hIRwaGhweLaqa +mZCOl64vKyUfHx4dHB4iOpqJjJSr6D0qKSYmJCMiIzWypJuapqq8dj0yLSwsLDm6rs4sH1CopquuxFI/O0qyoq4+HBsbHDumnqWmrriqnJ+7Kh4dGRobHzamm52YkJShViYmHx0cGxscIj2djIuPnl45KyYlJCIfHx8o5Z6RkKKst0s4Ly0oKisrQ7OzcS7b +oKmus8tBNzk3aKmnxigaHB5GpKGorbbOyKWdqU8eHBkYGh9IpJ2fnpmVnK8uIyEcGxobGyBOno+MjZe6MS8mIyIhHh0fITeejYyZrrpGLywsKCUoJirarrnFtqGosrtiPC8zNDi/p7VGHhok+6KlqbHG5Vi3n6K2KxkaGBog+6CfoaOimZmi3yIhHRoZGhsf ++52Wj4yTpDcrKCAgHx0bHSArp4uKkabYSS0rKigjIyQjN7Ospp+lqbXNTjovLjAvRa+txTAbJ76kp6u151tJ7qqfq14cGBkZIsifpaWor6Kanq0uHR0ZGBocIdOcm5aOkpzJKCghHx4dGxsfKa2Mio6Z2T0vKSgmJCAhICjLppyTnq+w7EE0LysrLC/frbfy +JyevpayuvFU+Pj/Fo6a8KxcZGiW6oKerrbuxnZym1h8bGRgaHCe/nJ6ckpGapzYjIx0dGxsbHiuwj4qNk68xLiglJCEeHR8hPKeWjZaytmM3Ly0qJykoNLmuvGQ5rKWysctLNjc4R62ks1seGB0qrqKprbbIzqicoq4vGRoXGBwrsp+hoZqUmJ/DIh8dGxoa +Gx0trJSNjZGePSkqISEfHhsdHyyskIuPo8dpMy0sKSUkJCdirrKvraqosrzhRjUwMTLWqbHGMxkcNqymrK/I71W7n6Cqzx4WGBccMqmipqWkmZiepzcdHRkYGhsdMqaYkI2RmbgpJyIeHh0bGx4mto6Kjpa+PTEoKCYjICEgMLeuppidsrLLSzkvLCwsObWu +v9onHVOprK+260hCYaqfqbI0GBcZHUWmpquprqGZnaK8IhoaFxkaHjyinJiOkpmiPiEhHRwbGRodJL6Oio6QpjUtKSQkIB4dHibVqp+Pkq681ToyLSooKS3ur7u+ZCzZprK1wUw5OT6/o6iy2SEWGR9+payws7+xnZ2kqzwaGBcXGh9foqGdkpKbnrUnHR0a +GRkZGya3j4uOj5r7JygiHx8dHBwgQKiZjY6exVE2KiomIyMlNbq2vra2r620wuk9Ly8wSayntL49HBgovaiutcPx0qadpam+JhYXFxknvKOno5mUmp6mSx0bGhcYGBsor5OMjpGYrSwgIBwdGxkaHS2pkYyNla42LiUkIx8fICfnsbusm5uzu8pCNiwrKzHA +p7O9zy4cMK2vtLzpRkK5n6SrsT8aFBcZLq2orKujmZqgpLkqGRkVFhgbMaiZj42TmKLqIB0cGhoYGRsmqo2LjZCeQycnHyAeHh4fOLazpJGQpc3dNCwoJiYnQa+xwsFmNkmstcDLRDcxU6qjrbHVKxYVHDyqra+1taCboaWtdh4VFxUYHEaln5WOlJqfrzEb +HBkXFxgaIa2MjI+QmbclIR8cHRwcGyfJrJ2Ojpi5PjMlJCEhIizMsb++v6+qs7bNVDguLDO/pauyw0kiFiDarbK3wN2xnp+nrL40FxQVFR/fpqedkpWcn6rNIRgZFRUWGCGvjoyPkZmmOx4eHBsaGRkeRaiWjI2ToDorJR8gHh8jOre6vbKel6rJzTwuKCYo +QK2qt8F4Oh4kurG7wWxCZKifqKu2fCETFBcjvamtp5qWnaCnsz0bFxYUFhgmrpONjpKZoronGxwaGRcYGyunkYyOkZnKJCEeHR0cHSV6ub6ql4+bxVI3KSUiIyrRrLvC1GY+Prqyw9BFNTXBo6irsss5GxMYK7Wss7Com52ipq7FKhYTFBQYKa6ckI6VmaGs +Vh4YGRcWFhggr46MjpCXqDAdHhwbGxscLr25pJKNk6ZCLicgIB8hM7e5xcfQuaiuwMJdOiwqOa+nrrLKUiwYFzezs7q+xaiepKetuksdERMUGDKso5mPlpuhqrkxGRcXFBYXHcKOi46Ql6DKIhscGhoZGR9isZ+OjZKaySYjHx4eHiNNusvFw6uZnMvcTi4o +Jipqqa61xGU/KB07rb3D1kzLo6GoqrbVLxgRFRo7q6ujlZadoKix3yUVFRQTFhzvkoyPkJigrz4cGRoXFxcaLbKcjY2SlqguHh8cHB0dKNfAx7ejkpOrUkIsJCQkLrqsub/pVkE3VLC83ls4Obeiqau000ElFBMdQqywr6CZnaGlsL5AGxIUExUdYpqOj5KY +oau/KxgZFxUWFx/Gl42MkZWf1B8dHRobGx0zwsawnZCQnMcuKx8gHyM8tbvHzl7wuKu9wfk7LytCrKitsM5OMx4UHt6yuLu0op2io6245CsVEhUUHtefl4+TmZ+pslsfFhcTExYaO5eMjo+Wnq80GxwaGBkZH0+9r5iOj5alLyUiHR4eJVa6zsjbxqSYrPra +MSooLOSprrPEWEAvHR+8s8jD47yhoqarudI8HhETFh7Cp6KUlJueqK/FNBgUFBEUGS2ajI+Plp6qzCQZGxcWFxorvamUjJCUnO8hIB0bHR4q28fPwLeckZ3nSjEjIyQuvq26v21JQTQwv7Lm7UE/taKoq7PNTy0ZERglu6yunpecoKSuumUjExMTExkrn46O +kZWeqLRAHBgYFBUWHVGhkYyQlJuvKxweGhobHS/M0r2rl4+XrTctIh8gIzq2usvWTlnSr7S+00Y2Lkirpq2vylY6JxYYM7m0uq6fnKKjrbnXNxkQExMYMaaWj5KXnqivzCkXFxQSFRktn46Nj5SbqGAeHBsXGRkfScO6oJGOlZ1VJiQdHh8kU7rPz/7tspuh +2dc6Kyks4aqutMVPPjQhG0SxycTOuaCipqu6z0cmFBEVGT6ooJSSmZ2nrrtLHRQUERMYI6KMjY+UnKa4LxsaFxYXGCnKtJuOj5SZsygfHhscHSrYzt7NzaaUl7lTOSYkJS+6rbm/VT89Ny7sr9PcUkqvoaeqttJRMh0SFR1oq62clZqfpa+76iwWEhIRFiGn +jY6QlJ6nsXMgFxcUFBUdTKuWjZCUmac9Hh0aGhseNtDaxbackJSiVS8mHyElQrO6yHRFR1+0r7/TTDkwUqqprrTVTjcqGRUnxrO3qpycoqWvu9dBHhESEhYpqZOPkZaeqK/ANBkWFBIUGS6kkI2QlJqkwyQbGxgZGiFS2cmplo+Vm78oIx0dHyfZvd7nTk3B +nZ3Id0AsKi3EqrK1ykw6NCUbMbXCv76qnqSnrbvRTiwXEBMXM6qckZKZnqmwvlUhFBMREhYjoY6OkJScprU6GxkXFhcZMNHDn5CPlZiqLh4dGxweNcXz+n3+q5aWrk47KCUlO7CyusVMPTk2MFC3zd1l2qelq6282EszHxMSG0StqZiUm5+ps7/vMhkQEREV +H6SNj5GVnaey0SYYFxUUFiL4tZqOkJSZo1geHBsZGyNTfVfjzaGTlJ/3LSYfHyjctMbMTD47R7mvwtJXPTq/pq6vutpLNiwbEx/dtLKgl52iqLK+4EgiEhAREyKoj4+Slp6os787GxUVEhMaO6uWjZGVmqO7KBoaGBgcLWZM5rebkZSZsyohHh0fM7vK41lC +Qe+hnLpiTS8tP62ttbjWTTYzJxolvr7Br56eqKiyvupOLxkPERQmrJWQlJifqrS/eicVEhERFymlko6RlZulsUgdFxgWGB9HVeyqlo+VmKQ6Hh0bHCV8yFVaRkjCm5WnTDorJCvPrru710g3NTErM8TF782uoaqrsb/bTDgjFA8XK6+dk5Wbn6qywNM9HRER +ERQhpY+PkZadqLHJLBcWFhQZLVz4o5KQlpmgxyAaGxkdM9ZJTU1TsJiSnL8tKB8iO7a7xdRGOzY677bD3GtG2qqqr7C+1Uo4LR4RFzi2qJiWnqOstMPdTioUDhESHamPkZOWnqm1wEgfFBQSFCJM0p+PkJWZobI0GhkZGSVOTERX8KeUkpimMiAfHSnPu9Ti +RTw4PrmerUZRMzW9rLW1vt1JNS8pGxhDuLqfmaCnrLS/4FE1Hg8PEhuuj5GUl5+ptr/iMRgREhEbOr+dj5GVmqOv5CQWGBcbMEc8TdKhkpSYnt0eHBwePsLuVkM7O0WumJ1jOC8mSLC2vL/qSjYxLyojQrnYrJ2hq6y1vtpOOSkYDhIcvJOTlpqhrLbB30Uj +EQ8RFCu5mo+TlpumsMQ9GhUXFiI+PEfAnZGVmZ2wKhkcGyjd/0dEPD5eppWYrTMpIirBtsHE/kU3MTA5X9nWbtWppa6vt8PdSTctIhMQHsqblZicpK22w+VLMxoODxIftpeQk5ecp7LB4ioWFBQZLz5Ft5qQlZmfrFwdGBodOF07Pjo/0p+UmJ9gIB8gPrvN +0l8+NzIzRaukaEhK1aqwtLjI4EY2LSsfFSC9p5mYn6avtcLdSjkmEw4RGr6TkpWYnqm1w99BHhESFCA8Qq6WkZaaoa7CLhgWGSJDNzg7Q7ybk5mcricbHifczGlYOzg0OvCfmLY4OTa/r7y70P5DNS0sLCEnxrejmqSqsrnF70g2LR0PDxnmkpOXmaCqtr/u +Uy4XDxEYMF2qk5KWmqGvvmojFRYbKzsxPUqtlpOZnKdJHBofMdRLQzY1NT2+m5WhUikqObm/yttRPjEuLDFC3dzXtaClr7O+yWpKNC0nGQ8Yb5eTmZukrLi+5E08IhEOFCLUoZGUmJylssfWOBsSFh0xMjhnppSVmZ6ovykYGiJBTTg3MTdFrJeWnK8pHyha +veDgSjswLy42vaC2QNuzqLS3v9NfRTUrKyQZGGSfl5mep7K7yOdEOywaDg8bdpuTlZmeqbPK304pFRAWIzU2y56Slpmfq7hMHxYbKUI0MzQ4aaKUmJukRh0dLt3uUEQzLi4xPauYoko3T7i1wcP8Tz0zKyssKCdcrZ6aoqq2v899RDYuIxYPF1aWk5eaoKu3 +xP5VNx4QEBsuPriYk5iboK683jAZFBwtMS41OMWbk5mcosAmGR84XUA9MC0uNHCglZyzLipNvsjRekQ6MCwrL0C7vd6rnqWvt8feWkQzLSgfFBRGmJWZm6awvcpjRzsqGA4TJEiplJSZnKSwxdVEJRQUHy0uMkOvl5SZnaS1Px0YJD8/NTAsLjm3mpWao0gf +KHPMbl4+My0sKzDNn6RM8qupt7zNXEo9MSoqJh4aO56Ymp6ouMbTXkA6Lh8SDhtXnpOVmp6ns8fYUzIcEBYlLjFxopWWmp6otm0rFxgqOi8uLS1BqJaXmqC9JRsv91lKPi8rLC04r5mcuzZds7rFzFRCPDIrKysqMlCwnZuhqbnO3FxCOS8mHBATQ5mUl5qi +rLnM+U45KBYPGiwzypuVmZugrLrdPSAUGy4uLC8uWZ+VmJufsTwcHTxWQj0vKiwvSaSWmqVKKVq+zdlWOzYvKiosNrqt966dpa672WJOPjYuKCIZEi6ZlZmbpLG9zG9MPC4eEBEjOrWXlZqcoq690kwuGhMfLisvNcmblZmcorH8JxghQzw1LikqL9udlZqf +uyUm7NNbUDovLCoqLUymncRWqae2vdZORj41LSonIhwrn5aanKW2xs9mST0vJRkPGD2plpWbnqayxNdONyQUFCYsLDyxmZaanaWy1zsdFyw+Ly4rKTG7mpaanqw4HS/QT0o9LiorKzDNnZmoR2ysucjQTT07MiwqKCgvQrSbmp+putjxWEM7LycfFRAuoJaX +m6CrtsrcUDotHA8aLSxGp5eYmp2ns9FOLBgbOC8rLSo0rpeWmp6s5iEdRVU8Oy0nKCszuJqZn78u17fc2007NC8rKiosXa2/q5qkrLzeWE1DOzEoJB0TIJ2VmZujr73L41k9MCYVESYwTJ+Wmp2fq7fTUTgfFSMxKCwrOqqWmJufrsoxGyVdOTYtJycqOq2X +mZ6qMyy/z2ZSOzEsKyosMMGeq9efo7S85VNCPzcvKSUjHB6llJycpbTL2HtPPjEpHREZNmudlpueo628zlg+LRkYLCopLkejl5mcn67HTSUbN0MvLScoKT+nlpmepe8kO8NJTDgvKSgpKziymp/RuqS6xuZMPTg0LSkmJicstZabnqe60GxpSj8yKiMZFCu6 +nJWcnqixv89kPzQiFR4uJzBjn5ibnaSxzF02HSFDLSooJypFoZaanqa9LSXeWD46LSgmKixCqZicrmGys97WRz4zMSwpKCgxz6+fmaGpvdhcT0c8MyklHxYerpqXnKCsvMnkXT00KhoXKSouwpyYnZ6otM9dQiccLTEmKSYsYJ2Wm56ouEclNew4OSwnJSct +Xp+YnKPbUbfxbEY3MCsqKCkpO6uirJyisL1nV0A/ODEpJSUeHq6Wm5ykr8ba+VY+My4hGB8vMK+amp6hq7nNWUkzHyEvJigoLcObmJyerL14LihHOi8sJCUlLs+cmJ2gujvj0kdHMy4pJycpLE+fm6ylornCaEs+OTUuKiUmJymwlZyepbjNZF1KPzEsJhwb +Kz2qmJyfprDA1VY/OSkeJykkKjGympqdoK3F60AqMD0sKiQjJi+2mZieoa9NQNlIPTQsKCQmKTHInJmkq6m43mZAOTEuKyglJSxLp5mcoKm+8E9IPjkwKSYiHidkopidoaq6z/hWPTYvJSEnJio/p5mcn6Wwy2ZROC4yLSYkIyY1q5ianqay0UVKRTYvKiQi +JCc2r5qanqazv31NPjQuLCcmJiYuuZubnqKuxV5IPzk1LygkJScsyZuZn6Ovw/hWTTwyLiomJCUrX5+an6GrudVRRj84LiglISMnQaKZnZ+pus7kTjk1LSciICMnQaOYnJ6irtRfSjgyLCklJCYoOamWmJ6nst5OPjcyLiwmIyQqRqybmqCnt99URT84MCwp +LCokL7mcnKGlscPvTD86QD0mIiQiKtKdm56grb/q18o8LS0kISAiKd+cmZ6gp6nDP0MzLSkkISElKlqfmJearrz9PjowLiooJSIkKsqZmZ6grb5bRj05Ni4rJis8KzWlmp6jqrvhX0c7NjdQLx8kIy6wm52ipbLOXVfF2SoqJB8fISy5mpqfo62trEk2Nioo +IR8fIy67m5mZlqfh9Dw2LisoJCQjJCy4kpOioa/PSjw3Ly8sJyQmPVxPn5qhpbHITUdANjAvPE4jHyg6pZyfpau55ExHark9IiUfICE2qZucn6ezuqq4LzMrJSAeHyE2qpmcnZmd8kU/LiwnJiAgIyQwrJKOnaqvY0M2MiwrKyYiJDG5qJ+aoqi56kU8PDUv +LC5aQB8q1J+do6a0wmlKPj/CvSYfIh4kQqKcn6Grvde1p0ooLSEfHR8hP6KanaCemq02Py4pJiIfHiIlPaWVj5Ksuuo6Ni0rKCgjIiMqtpWYn5+tv089NTMwLComN8YvJ7Cdn6WrvvZQPzs0SrNMHSEgJc6fnqOlsMRm4qquLCclHR4eJF+em56hqZ+d7y81 +KCUgHh0gJ2OemZWOnfVwOS8rKCUiISAjJ8aPjqGjrd9ENjAtLSooJCjpvTytmqKnr8tMRD43NDPbti0dJCu5nZ+mqrbXWk3Fps4jIh4cHibJnpyhpa+vn6c1LCshHh0dHinInJqbkpS2Pj8uKScjHx8gIirFkoqWqK7ePDQvKiopJiMkN6+opJugqrbgQDk5 +My8tNsLLJCA4rp6jqbHCa0lBSbOpNh4fHR0qt56foqi2w6yevCopIx0cHR4qtZubnpqUnU44MSglIh4dHyEsu5aMjp+84jgvLCgmJiIhIinDmJWdoqrBWzszMy8tLCpAtFYkQ6Wfpqq52k9BPzpyqrclHh8eL6yeo6Stu9nJpKFOJiQdGx0eLK6bnZ+jnJiu +Ni8pIh8dHB4gLa+Zko2UtVI8LSsoJCMgHyElRZeMl6Wpykk5MC8uKyonKs+vTFufn6qswllDPDk4N8ysUx8eITGon6eossx7W7ygrDAfHhscHy+qnKCiqKucncgtKiMeHRwdITGrmZmRjp9eOTIoJyMgHx4gJTqcio6frsk8My8rKykmIyQzs6utn5+qs85E +Ozg0MDA5vbM2HiNJp6CprLvlT0tgr6HDJR0dGx85p52ipa24qpukRCckHRscHCA3ppqdmZKXtDcvKSMiHh0dHyQ7n4yLlazuQS4tKigmIyEhKN+fl5mjqLf9PzY1Ly4tLEOxvi4mz6GlqrDGWURCP+moqjweHB0fTKOfpqq2ycSjnbUtIB4aGxwhQ6Kcn5+a +lZ/4LCoiHx0cHR4lTp6QjI6ffjwwKikmJCAfICQ3oI6Poay6RzkvLywqKSgq2q3POrueqa247UY6Ojk6w6a+KxweI9ygpKiuwdtouJ6j9CMdGxocI9yfnqKkppqarDkmJB0cGxweJeicmJCNmLkyMCglIyEeHR4iLaiLi5mtxEIwLiwqJyYkJDOyrK+noKiy +v1M+NjU0ND+xrV8kHS27oKertdpYTnarn7AxGxsaGye9nqOmqbKlmp/EJyIeGhsbHie9m5uYj5SjQysrIiEfHRweIi6rjIqQoXNHLiwqKCUiISEo0aSclqKqs+5DNTEtLi0vXa67PiExqqWrr79SQT9Cy6Sn3SEZHBstrp+nqq+/uJ6cqkEeHhoZGx4tr5ue +nZWTnLcsKCMeHhwcHCAxqI+LjpnNNDAnKCUjHx4fIzyjko6bsbVOODEuKykqKS+9rsRASqOmr7PRRzY6OUKxpLg5GxsfOKahqa+70eOsnKO9JhobGBsfO6eeoaOelpqmTCIjHRsaGxwfP6KUjY2VqjAsKCMiIB4cHiEtpY2Lk6rGTi8uLColJiYmSq2vrqql +qLS/WDsvLzEyZ6qv2igaJN+kp6y13llNyqKfrUUbGRkaIeSho6anqp2Zn7MpHx4aGhocIeedmZKNk55XJyggHx4dGxwfLKiLio+dfD4tKSgmIyAgIS64qJ2Voq616kAyLiorLDa8rr5YICmxpquvvVc+Pk+voKm9JRgaGii2n6errrepm56nUx4cGRgaHCe8 +nZ2ZkJOcrisjIB0dGxobHi2mjIqOlb0xLSYkIyEeHR4n3aKWjZmyuFQ2LiwoJygsT7G2vkc7qaexttFDMzQ416eot0MbGBwtraOqsLvPvaCdprUoGRkXGRwvrZ+inpaUnKJcICAdGxoaGx40oo6LjZKjNSonISAgHx4hKd6cko+Yvj4yJycpKyouNfqknqGi +yzxJOzYwLSwzRsSqo6OqaigtNTxRXVRMXc+5rqqqwyomKy07VNrAta+wtrOwwS4lLCsuOUf6vK6opqapujIgJyouOT9EbMKzq6ejpcQrJycoMDtHZs3BuLCrqLJBNz02NDU7SN/At7Syr7o8LjxCWezzUVDtyLy2sLg/JiwxPWjMvru3u8K/urtdKiktLjpN +2r6xq6qrrrfmKyUsLjc/SGXJta2qp6evRCcqKy45RFTnybu1rqqrwDc3NzE2O0FQ2MG7ubSzxzg1SEpZXk1KXtnHvbi2yjQqNT5Wz8XFwcHEwr67wT8pLTE5T9bEuK+ur7S7xEYnKS8xOkBO3bqvq6mqrcktJistNT5IUPXGua6rqaxtMjUwMjo+R2LPxL+7 +tLDMPEpVUltJREtvz8S+vL9rLzRMXcnFyM3Y1tDMxsHcMSkwOE7Pxbq2tLW9x8reNSgtMjZAT96+tK2srrC8RCgqLjM/R0xfzrqvrKqquD8vMS84PURT99HHv7eusu9BTUpFPz1BTPzNx8S/wFc4RV3ez9jxWF3n1szBv2cvMT5L6dDBvry7w8zKxl9i5snL +3XllZu/b3n5fVk5LTWNy78zGz9/p7m9idO/3WU9PTFZv38i/xdtfXWn/9u/iX0xOUV3t1snK0OB5amT48m75a1JTWl9cXtrLzeVxallj6eXd4mNORkpTZuPPzexjcnXt1NDXcVROTlFXduDPyM/f3Nvf7O/p9GBOTU1OYdzJw8vfZFZbbuXq9F9JSE1WddbH +yN5nXWtu9tzs+XNYU1llcnXZzdHtXm1obtzW2N9sWU5PYOjMys/7VF1269bT1nlOTFBkeOfQ09nvYm/z6ehramRaVFJfYm3XzM7be2pVU2ju5G9dTkpXet/NxMffXF9z7eng6WNZVVhp5dvY1dDY5/x1bV9mcW5gWFhXVWTfysjV9ltXW2j37eptUE5Z+NrX +y8zhbF5kZmp6Y15ma/f87OHp0svO42ZhVU9f/d3feG9faujazMnQckxOVWXr7ef9W1tk/evn2tvmcl1mXmBzaXL9Z1pZXl1h3svI2WReWVp84uLvZlBNWuzRyMTH3VlWX2Ns/mlXUlRj7uTb1c/P3GhXWVVRW2z182FdZWrw1cjJ2GRNT1p82drrblNQXu/d +2M3S911b/uft3+xubGZmZ3n3et3Q1OdfYmpm7t/h/11XT1Z23szL2W5PVGnz5e15Wk1PW/bd4NbT335hY2JjaWBfbHBxannl4c/Fx9pjWFRWbt/d9GBaWWfcz83Kz3VNTVxrdnR0ZVtfevPq4OHd2eJyYFtdZ3ro3+1mYF5eetvLyNlkV1Zf79nd621TUV/o +0M/Ny91jW2RkZXxoXGFn+e3w29jTzdJ8UlJPTV355eZlX2Vm59TOzttfSUpWauLl9fVeWmzv39rU1NzwZW52aPH4cu32aGVz8OXSyMjVX1ZWT115a2FdU1Be48/IyMvdU0xVWFljYltbX3be1tLNztHcZU9QVVNaavTkf2nw5d7QyczdZU5NVmnn431zXlRk +4tfWzs7jZFddbmZsc1xcXlxfft/h1szQ4V5UW1VYZ2lfWVdWX+PTysfS6llOWWNpbnJoXF504M7Py8jU6GdYV1teXWJyfvN8+tve2M3T/FhPT1JcbvDvcXRoaOTX2NLU9ltYXmx+ee/3aWpuanzj4NfR2ev8bHJ6am98bltbX2nn2MzHzuD2ZF9jZV5ZWVNU +YfzXz83Hz+9oXlZPU1ZYX19len7b1tfO0/lWUlNTXW196nds/m/o2dXS1+tiYXf+5d7m4m5bX2Boe+ba1t3+cX9v/v1maV1PTVNd/trOy8/rd3RfZGxhWFZRU2bk0srIyc/6XmJdVVlcW2NpceXY0s3Nz9b4WFRWVF1udPX6a/rm4NnS1eVuWVplZm1+Z2Vf +VFpu7urd19vje236bGFmWFdZVVRc/uPRycvP3v7zbV9nYFlWVlt62tHMx8vR5GdqZVlTUlJVXGN63djTy8/Z7V9WU1FWXmJob3F94Nzazs/eb1xcZGZrfH1ubGZn8+Hk3NTZ3+379fZ6em1fXFpZXvji08rM1N3s+25eW1hVT09XZt7UzsfJ1ORuYllRTk1P +UFdl/dnOzcjL23ZdV1FSV11qbHHp39XP0M3P42BZXmVud3b2fWlvbvvq7uTf63Ft+fn17XtvXlNTVVtq79fNz9vl297q/WNZU01MU2Ho183JytHe4O5tYltTUlBWafDbz8rIy9r9cG5eWlxbXltba+vc19PQ1+plXGFgZGtjYWdhZm787ujc4/hqbPd6b/Z8 +bGZcXWB48ebW0dXf6d7f7+95Zl1ZV1lp69vPztPc8fl1ZF5bVlFRVmB+49rOzdbmdnFsY11bWl5iZGvx3dvSztXpb2ViYGl5b2prb27+5N3Wz9bvaWz3fXN6e29nY2Nm++nl2Nbd7Pz09/51aWJaVVZWYfzez9DZ5/R9bGZjXVxXUVVd/eHZzcrR4fh+bWlq +X2FmaG1z6NbRzs3X9GdnXVtndHlqXmRqdOnh2tnhaVljbXB8ff79Z2Fka/jn3tvd6f309X7v+m5qXVZZX2zr1MvN1+jk5n15cV9cV09SYurZ0MvL0+v7/2JdXllWW11hbPPd08/S3W5dYFtWX2xvaV5fa/7q3dbb6mdYX2119fPy7nptcfTs5djZ3+j79v50 +7+rw/mpdWV9pcd/V2ettcP5zePh0YlpUUFz65djR1Nvs9/N3a25qXlxfYmzs39PN0Nrqdm5mX2f99XJlYGrs4NrR2OxrXl9r++vo7XRlYV908u/g6HBob399ffTr7HNgXFVZYWTx3eP/cXr+9uzq7mpXU1BZ9t7Vz9fg5+Pn6uv4e2JWWmFs7ODY0Nbm+3lk +Xl9eanVkXmBn8eHc2N10Xl5bYfjl4+h3am9v+unp5OpqXm/28uff3t/wZ2RiaHz159ze7+7s9ejh6O9tWlhYXfzc1dbefXj0fXb8cmZdUlVifebd2dnffmZpX1peXV9ramhufunb1dfe/19gXl1/4N7g83j159/c2NzwZFlgfffp4eXp+2pmaWxrevx9/3F0 ++3j75OPycWFcXGNy39LW3vdy/fp/7/BuXlhYaOXa0s7U3vJ0cG1maW1maHX+7t/d2tHU4XhfWlhXY+3m7PN6cfXj4NredFpSVGB3693h/G1sZ2x/fPPvbmZpb/Xv7uLd6XVsY2N4893P1N3rfn306unsb1pWV17r2tLP235lZ2Zna2hmXlhdcPTd2trV2e5q +ZF9eYmh+7fv7f3Lu3dnW3HtcWl1n7d7a3vptcnvy4d/g7WdaYXns39/i5/BuaWhmb3nx5Ot4dHJv/Ojn8nRdWFhbb+XZ1eFtX2ZwdvT8aV1YXG7v2tPR0trrb21uamxydPf69Ojr49zU1eB5W1ZYW2zt6up7am977Obf4XdcU1hqfuXe4uz8d3F1/v726e78 +a239/fHk3uh+aF5eaPbc09TefWpv+/Hs7HBdV1tq69zSz9frbmNgZWRiZmJkZ2z25t7a1df1YFdSVFhi+/Z+c2xy9eDd2t5zW1ZceOzi3OLveX348OHg4N/wdm9v+fj79PV4ZWNgX27x3tbd72teX2VwdHBlWVZecODW0M7a8mhiY2VraGBeX2vy5NfT0tDX +6WleWlhcavju9/Lu7eLX1Nbc/FtTVl5t++nteGx08ere3ODwaFxbXWVzev54cmdnbXL57uPf7HNnYGJpf+71/WpiZ37e1dDP2vJta3d4+/ttYV1je+rZ09TW4v5gW1xaWl1jamtv9Ozf2dTU4HxcVVVda/fs6/5ve+3f29nb7mddX2/25uLn7v51b3rz6+nh +3+n8fPz89e7q+mxfW1tl7dzU09v3a2hub29xZFpUWGby29TT2ed2Y15gYF9fYWVmbPHk29bT1N/+ZF5fZnjs5eTueP/t3tra2+5lW11p/u3o93BjXWJr9unn5Ot6bG/6/Hx9dm1gXF9n+t/W0NPd/GdobHJzbmhgXWT/39LNzdXpbGJkZ2tsZ2VmZnvl29bU +1druZVtaXWJrcnZ4bmx18eDa2uD8X1ldZXT8+m9iXV5s/Orj4ebzdG7/7erv9XhybGdv++fb1dPY4vN3dnN3empfW1pfcefZ1NPc9GlkamhiYV1bXF5x69zV1NXc6HZmYGBfZWhqbm/+8eLa08/Y7WpfYWpx+fT9bWZr/uTb2trf9G5qefXyfGxlXl9ka3rs +4tva4vF6dW1rZmZgWlZXXm7p29XV3fhrZGZpZWBcW1xo9N/Vz8/S3PF2bGhmZ2prbXB27+be2tra5GxcWl1lbXp7b2piaW/z4uHk8G5laXzu6ev9bGJeZm157efi4ury9Ozp7fhya2VeYGr84NnU1dzrfHh0endqYF1cZHjr3NjX2+lwZ2traWViX2JlbH3w +5eHi5+9tX19iZ21zcWxoZmpy9N/b3OP7cn/u5uXo83ZpYmz97eTf3uPv+vLu7PJ6Zl5dWlxjcu/i3N7p/H3/fHd8bWFdW2Fu8N7Z19rl/HX7+XZyamRjZnju5drX19vk8nNxc3N1d29saG7569/b2d3ubGNpb3v8f3JqZGRv+ern5un3bWlve/7/e2tgXV1g +aH/p4d/n9Hn87e3v735oX15r9ODY1NTa5PX69vZ4bGVfXl9s+une29vj+21paGhna2xlZGRs/+rf3Nvg+mtqdPv9+fd0a2hqdfTk4eHi6vb+8ejq7e58a2ZpbW/x4t3e6O728unq8f1uY1pbY3br4dzd6fx1c3r9dmddW1teZ33m397f7XFrbmtpaWtrZWZ0 +9erd2NnZ3vFucH3y9Pfxe21uevrr39/o8ndrbHH8/Hp4bmdgZWxtfu3m5/b+8e7q6ez5c21fXGJw7OXf3efw7urq6er0bWVhaG/+4t3c3OPy/fLyfXd2dnBobXp/7eTi6PF2aWlw/ff8fnVmZWxxffPu+m1mZnF++fH6eG9nX2Rqb3vw5+Tp8enl5OHj7H5x +ZmJoeujg3+Ht//zu7fX2d2FcW19qee3k5enydmpvfXBtb25uaGt78+be3ef7cGZlb33183tza2/16eTj4eh9bm/56enq6/p4cW1uefPz7ejr73p68vT07vpqX19eY3bu4uLtfm9x+/N6cWpeWFpic/Tq5OXu/3dxd/d+c3p3efry6uXe29rf9nJsaG998uv2 +enZ5/e/q7O58YVtfavjv8vB+cnF6enn4+Pr4enl+/Ozs7urvemtpZ2d96d7c5e739+zn6/N7amBkcPLg3Nze6vr+/H7+eW1pZ2l3+PHo4t/h63NnYmBkanP/fG9tcXz05+XseWJcXmn/7/D3eW9w+u7r5OPp8fz87Ofk5ent9XxtbW1u/Ojh4u18cnT9+/p4 +a2JdXml+5t3e5vpvbnr5+n9waGlu/u3o5N/g6vluaGtwdf3u7evu9PDt6ODe6n9pYWV57ufl7PT/fPjv7u3ue2pmaXfv7vL1/HRvbW1ubHX58vh8b213/H//emtlX19neerf3ufu8/Pr5uvw/21qbvzq4uDe3ub3fHZ2fG9qbnJzd3Z5+ezn6PNvZF5fanr2 +7fN7e/rz7efl6X5nYmh77ery8/T5/PTu7u7t7e72+/z67uvr7O31em9uc/nk3d/se3V3ffj9e29mYGJy8+jh5Oj1b2prbWtmYWJma3b79+/l4uj4bGNfYGdz8ejo7vHr5N7b2+L2al9ldPLs7/j+/n337ezr8n1sZ2Zpbm9zeXx5dnNwcn3z5eTr/mtobn/4 +8/J7bGts/+rh3eHwfHJyffT2e3Zycv7v5+Tl3+Dr/G5qZ2pucvvz+3hzfO/o4uDsb19dX2l7+/h4a2xuefbt7PdxZF9janF1cXR3cXF5/vXt5uDh6PR/eP7v7e3t/G9scP3p39zh829sbm51eG1oYWBneO/o5OPn73lucG1sbm93fHv7+fHq4t7h6n5mYmRs +//Hq7f599urm4N7l9HVrcn7x7PH09fl9/vLx7+3w9fp5eXV5+/n5enFpYmZt+efj6f1qZ2tyen12amNiZXL26ePl6vJ+eH/4+n9+/fn18O3p5N7c4ez+a2ZocX75+PxvaXD97+rl729lYGRu//b8e3VycXP47u3p6vP8e379+vT5+ndvbmt17+Xd3OHsfXl9 +9fL4+HVpaW7559/b3ebyfXd3fXdta2tqbXX57urk5Ox9cmxnZ2xtb3Jtampv/e3o5ut3ZmZpbv709/n+/vfu5t/e4Ojv+vn19vX5+/l/d3x///Tr5+vyem5tbXJ1b29tZGRree7j3uLr+nx7c3h8bmpqaW/87OTg3+Dl7/34e29zcnV7fv/47ebf3d/j73Bs +bXL99vj+enV4+O/p4+n0e29xeHl8eHBubGlqcXN3+PLx9X1zbm1xc21qamVja37p3dja3+ny+vz79n5uamxy9ubg3t7i7Pp0b21oZmZma3B1ffTu6ujr9XpsaGpufvj4fnZ5e/bt6ePo9Xt1e/rv7vT6fnl5fu/r7Ofn6+vt7/Dy8v53cW1ubnn27ePf5+76 +enV1dm5qZWFjaHbx6uXl6/l1b2tqaGVjYmNqc3v37+3q7fX9/Xt7+/v38fX48+/q5+Ti5fB9enn/9PR9eXJsbm53/vz7/3l1ff58fnxxbW1pbG9zfvfs6Ons8PT6/v50bWpkZGt67eLc3N/l7vD4fHltaGdobn7u5+He3+Pr+X51bmxpa25ydXz38+7p7PR8 +bGhpa3V4cnJuampwd3z3+n10b3J1d3v+e3d6eXz17+vl4ODj6O3u8Pb5em9tamtx/e7m4eXt+Xlxb2tqaGNjYmh19+3n4+bu+Xl3dnN3cm5zdXv57evp5+ny/np++PXv7/b4+3/98+3s6ent8Pf18fLw8Ph6dHJyc3727Ont8vj5+v55b2tpZmVobXn67uru +9P55dG9ua2dmZmdtd/Hn4N3f5+vu8vj5+316ff738Orn5+Xn7/19enp6dW9xbm5xcXl++fTy/Xp8f/379vv+eW9vb3X99u3r7/Tz7/Hy9Px4eHd3ef707efk5urt7vP7/H53dXByd//v6ubj6fV+eXRvb3JwcnN0dnr78+/u9npvbWxsbnFzdXRxcnN4e/35 +fHVyevnv6+jp6uzx9fb08e7r6+7x8e7w7uzz+3x0bmpqcHr58vf+f314eXp2b21qam53+e7q5+vx+P9+e318dXV3eX367+nl4ebs8vr9/vTx9PT6/Pj17+7s6+71/f349fH1/n96dXRxdnl/9/j7fXz/fH39eHFsaWhnam96+PX5fnwuc25kAAAAIAAA9RIA +AAABAAAfQAAAAAEAAAAAAAAAAP//////////////////////////////////////9//////////////////////////////////////////////3//////////f///////////////////////////////////////////////////////////////////// +////9/////////////////////////////////////////////////////////////////////////////////////////////f/////////9/////////////////////////f/////////9/////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9//////////3//////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////f39/f////////////////////////////////////////////////39/f39/////////////////////////////f39/f///f/////////////////////9/f3/////3d3d3d3d//3 +6+fr7/f///93d3d3d29va2/d1dXd5+93b29vb29rb29vd3f/9+/v7+/v9/93b29vb///////d3d3b3f379PT33dnY2NnZ2dra2dnZ2dr//fv7+vv7+//d3d39//r/+fr593b59vv62tr729jX1tZX2drZ2drb19dY+/3zsTN2dXr4+v3b29fWV3LvsjP0edn +WU9ITUtGP0ZAPkJMSkzn79vXzs7Lx8fKzMjHxcC6uLm8vsDHyNVda0m0vlk+PDw1Ozs6Pj4+PkQ9OD9NTEtJTlVPTl1fVWv//+/b9+vCyL6/vMO7u7y6urq8vbu2t8W/xL29z8Vn06i4Z2dJQDUxLzAmZ0g/LSssLC8zMjg9O0E+T3dv38rNysjZ69PN2dXr +193M28vL0ca7s7Kztba2tbWztsSloau2vbvNb2dTTUo+ODc2OTQxNTI2LzU0Njc7ND9DPUxPUznd4/drXcbBy8Hb511d/8jJy9HO39nCzdvGT6OrucXDt9vFzctPqry91ztCNjg6NThAODk4OD1HQUVES0w8OWNLV0VRSl1d49Nva8vMurqut7q8tLi7vsF3 +p6a1v8a/T1v//2NLPEdCPzM6NTw8PUNDS1NX7/9f/1tZTkk6R0NKQUv/V1NbU01Ta+vjv7u/wb20uru7vbefrcHM2WtR7909rsJjb005Mj04ND1LQ0xMX1XVzNnLvtHra01L92tKR11LZ05NPknbX8LLxsbMxL7Vzs1LtqrCvdXJQFFOUeddSUpfSTw9U0NB +SFFna+dvY83L3dPBz+dnREFPQ/dba1FKRU9DOV1K23fDzMbBvcLGwmO1p7bJxsVr69fXX6m7xN9PYzZBNztMQz1ZSURZ691j68vJ53dCV05DSUFEREZPPTpIV0Zr39vR2efF1dPP37KqvNfLv1vFyc/M42tn1U1PVWt3SlHvd2NjW1lvY2Pb5+NXWVE9Se9b +U0dKSj85ODpBPvfRz8e7vry/vcD3oqq+y8DGXdfPY7WmycjnTz5BQ0U9/2NKU1lJVWdvX2/R92dRUVFJS0dLRD89Pj05PUVN69nLy73Fv8m/vcetp7PJxsr348bTxs1fS1tMP0U7REBJTWdMRkJATEpRVWNbV1lESU3n691dT1VTSzhFSkhv38jIvrW5xLW0 +w7yhrsu/zvdb3VNCpsXTd1cyODk4Nz9AOkxFPkR3TE7/3f/vZ1ljY1Ff71tdVU1PPUdnRsnTz8m3u8y+vrrEsaWxx9HZTULO3c7bTkhdQzY8OzY7PkNDRFM+QFFMTXfrb2fnd2dvxs7A2dnfY11HTWtZZ8nTvb+6wcnDvMZDobDK31vvOl//OanLZ19bNi46 +NTVEP0lNSUNN6/9Ozs7f2+t322/N18rLb9njZ09DW1l3yO+8y83PyczHyDursMZXTVcwX2tf70ZATkA4Mjk3NUM/X1tJUVXr53fJz8zLzc/Z17vBu7rX281RSEREb07nw8jAytnNxczD782sw1tXTTg+Pry8XVtjQS0yNzI0PWtIZ11XZ87I78jGxsjJzczJ +yMzKwN3bzltERELfWd3Ly87b1c7X281rU6vLR0w8NzTnSlNMPz89NTU4NjdCTe9v6+fXzsjLwb++xsnP0b27ur28289dS0U5P05CzffXzuPd3cfNyvdFqrldT0s6Ojmux+tZSTgwMjM5N2tGZ9X/6/++xsbDv8HLyNvNvsHCw7/TxVdRQjpKUUXXa/9jU+/j +X9/bbzWrr+M9QUs0SmddX1VPUUU9Nz88093vzcPN18PAy8fCxtHb79u6vcjIx8ljW0I+N0VCX3dv12Nvd9vd59vZNMeu50RNWyurw+fNS0c4Pj02Pk9Z99XVwcHOvsLBysHEx9vvxcvE49nX0U9FRzw3O0HrWWNrXVtvZ3dv498/N6nJPGNVQUxZ68prX1FK +PTs83f/d58bAy9fFw8vJzMbL52/TvcPP79/fVT5APjI+RMpD99Xj69vX1+/X/0g1pclN9zy6vsrP30o6REI3NldX3/fVwr2/wr7Evc3Gztnd1dfX71HbUV08QDo6O0BnV2dd52PX3f/fd9lvYzeoyVvn909HxtfL61FLQjxAR+/rXc3Kxs3bzs/T79vra9Xd +xs3TXWtPa0E/PTxAT0vMa+PR38/T483f5+trPKnJZ+84rb7EzedjOEA+PD9Lb//rzsvEwdnRys7d3e/Z591nU0tVTUtNPTo8PU1ESclra9HXzdnbytPX1903pbPG7+frT+vE529LO0FEQD/RVevV18/Ta9/v2fdnb9f3wM7d205PTUlCOz1JSE9R0WPN38rI +ydHJy83T20y9qb1PPKvDxMdjTjg9SzxGQT7M3/fVycrn/2vj91tb1/dnXUxKU0ZLR0k/RE5VV1frwuvTvs3Iy8bHy9vfVTCnvVXb991Vx/dNR0VFPkdESmvf3d/b19tV/+t3XXfZ39vj01VdTEhJR0pCUVtbd+vTwdfIyMPLysjI3d//PLyx0UKut3fH/0M4 +PT87R09AZ87n09fNze9r2d9vb9fn6+9MU0tdS0NFXUVja9tr593dycXIzc7Gys5j42dNOKu9Y87XTUxvQkw/PTxHTkxOZ8hnb9fv22t36+vv53fC0etfX2dHRUR3Rltv99ff1cbIzcHEz8jO01v3b0wxpq/TRKu8Y19MRTM5NjxNSUVdb9vT2dXL9+9v5+Pv +1ePdUVlfUVdIS1FnZ+PRyu/Nxtm9y8vZ1cvvWUtfRlkwq7vr2WdnPkhMPj49P05vTV3rwm/f1d3MZ1vX12tvvc/V/3dfS0hLR2P3/8zFzczHv73Mxb/by+drTU1ZU1M0qOdTsNtMOj42NTw4SHdTTmPM4+fbz8fRUdXVwGvI1edfV01LTU9AWdnf1cjJyt3X +wNfL49/bZ1NFUU9dVzettcZTTT9EO1U6R0VXa+9nWcnf3d/d0c5Td8vnz8jF19dnWUxET0dG583rzcnIx928zdvF4+djVVdJTV1fT0GlXa/OZ1s2QS4+S09n3WNXyc7VzdvLzf/R08TNzs/T909LQ0hTREj3zdHZx8jT18fKb+dvUVFNSk1RWV1XNLq0Y0c+ +UzNJSk3nW+Pf4/fT1ff32eP/x3f328TOzNXjXUhIQUxKT//Ix93EwsfOzL7Z791OTFNTSU9ZX19bNLSub3dNPT08Rmtjb9lr18vX0dXX48PLzc/JztHb2VdbPUZDUUdV48/NzMXNz8drzs9RT1NPWUpMXVlbY1kvqMpHOV1FOVnv39nv2f/F62/M5/fdys3O +X8nM0ddvd1tFPz9VQXdf28vH1cfMv8zfyV3vY1tRX1tXY11n/z/VvqpVd01DRm9dd3fP39vL/9nfx+/G1cXX1c/j21lVQj45P05Ia+fb2cHb28Pd413vX0xKW2t3X/93Y/dfTy6s70JRTXdRz9vf7+vXd91nV+dj69PPzOPP29vjU1FKSjlNRVvd4+vNwdHd +vsPd32fOS2PvY+vf9+9dZ19RKc+qyetb00dV2W/r2dPbXXdX3ffXzcnK1et3/29OREM6OkpM/93d3c3KxOPNz29rb+tXVf/V5+Pb/2tjU0c4R77LR+vVTu/MY+/TV+NvV/9fZ+Pn1e+/3XdnWVVDR0JJTVXn687X183MxsXV39lja9t339Xb1d3/X09RRzon +p7DfxtnrRedfzuffUVffUV3L1c/d1dfjU1VKSz88PEhPzdfrz87b57zP3dvf91lfz3fdzs3f5/dZTD89OSiot2vT48pK3+/rd0hT409V/9vb99PHyN9XTE5LQUFRS+vd0d/O0//CzdHn79Pj9//J09vMytPrb05DPz47J6yfvMnTzT9d21lfSV9XWUvZ28rd +1dnr2U9JRE1CPlNNz8XI49fTym/JyV3b92f398rT983Na/dXSEA4OjQzU63EZ9vVRdPXVVFLTVtZW3fV2XfGz8/fUURBT0ZJV9fL2crb28bX69nR3//j1c7nwsvXz9HrWU1DPjs9PytCn7Bvy9FLWWdNXUtDTF1n493Oz+Pn43dVP0NRSkxPxMfFzePLy+dn +48FbWdvZ393Hxeff319MRDs8NTdNSjWlt0/Zx3dR9+dPSUVb39//583H19vdWW8+QU1jWdvGx9PdxNHjZ0rv62/nyszFzci819tv/0ZBPD05QkJHMZ+svMbMXTrrXUxPQUnd09/XxM3fZ2Nr/0dEWW9b1dHI0czXZ1tfXVn372vjys3V18rv/19TPj4+Oj83 +5/dCsbCyWc/bSGv3R0hIa9fV78/HyNlR/1VTUUNVX83X08vPz89bTuNJTmfO2cO/v9XPwuNrS08+Pj1DPz9TQUvTn63PxWf/R0dTS01b29HO58rJ31dbXXf/TlNfw2P/57/b/11rWVtNd9HK07zGz9XV605OQz0/PkVBOP9f9zWxrcz3ye88TVM/b3fd/8LV +1ePnU0xRd+drSNPR12vD0d9f60xTU0z/yrzDvMDG1c/rXz9BRj5DR0FHTEY3rsylvc/PSTxBTEz3V93Rzdfd7/ddTl/34+dLzu/nX9/R319fU0lXXefJvsK+v8fZ91VTP0pDRURKTEdPa8tvNaa42etXSTpKX2vdb9XKy/9Zd2NPUffr71HX3+vI3+fn3VtZ +Tldj28O+u8TAxuvrXU5BQ0VGREVXTEtMO6tPp7K5R09EOE7Va1fd49vX505b405P79P/1VN32Wtva9vrVU5bX93Lwr63yMTLX1lCTUdGR0tGTv9BV+Nnaz+9qb1HW0pFVd/348zV1W9fR0prUVXv32/dY+/f0Wdn299Zb11vzsrFvra/zNNrWU5MRUNFTEJZ +TE7nP3ey11+juj9RSU1fzs9fzW93V+9GSXdbV+vXb9Nb73dXTv/R919n5+/HwcO9vb7rb1dOQ0ZTRkhLY09K11vvZ2tnP8W3/0Rr91fj0dPO22NVb0dFZ2f3Wdd33cxXa29r7/fd93fn2dPJxcG/v1vrb1lMR09KSltXUVPnSzyvx85M67JnRGvZd9vjZ19O +XVVrUUhn9//Vb3fN51dZTmfX293b98zMyrzEzMrKRV1RS0ZJTFtOTldJ79nb/1tnYzr/s8VLz87Td83fZ3dMTFNPSHdv11VX487bTFnv/+vZz9Hb08fVxs3N2c9OTm9dSEtTWVFOU+NvT0SxxdNrRlWzx1XHxtVnd1VPTlFRVU9RY9NvY0nba2dGQ2t349HR +y83Hx8TF0e/390lFVVlKVVPZSVdTd8jX2eNMSk4xsrLHd8S/9/dj3XdNR1NVTFfr1WdPVW/nX0ZO59/308/LzdPIz9fv72NnW0x3Z01Zb19jT9vj/1HBu/9vRkqxvt/NwsVrb1VfTUdLWUxNb9lnZ0ldS11XRUtn19fOwMfIysfK2XdnTFlPS11VX1fjb19N +z+//ynfvQk06t7XH1cjFzuNjY3dVP0hTTUfdd19ZSVNOW1dNV+PX0c/HxsnPzszdV2tVWWNv/2tZa/dda2PV2Wf3d93/TMG4vt/Mw8/d911bSUtESE1RXd9nVVf3TGtVUU9X39HOyr/EyMrPy+NPWUtRVWNbXW9f3fdb1//3Z3dTSVVdu8Xb48THzd3jb2NK +T0lITU53a09bT19Ib19bY2vPz8zIw8XJ1dPnY0xPTVf/42Nvb2Pn72/P62d3619X37q+xt3Kxs3RY+ddVUFLUUJKU3ddUU9T611HY11d39PTysO/xM3J4/dnU0pMW2v3XVXd9/fd79/fVWNdTVvVwc/j783Ly93fb2dPRFNVSUxO91NNSUx3701ZV3fO0cvG +xcbDy8n/XVlPSVNn/+vvW+fj/+/PY+tOWVNZXcu9xtnPycbT391da01DSltMTVVnU1VEY2dnW1Vb49HTzcvDwsjMz3dbVVdJSf9jd1tj39vfd85jX1lOTVdbyL/G49PTydPV3/9rT0xRU1dKTlFPUUbna2f/WWvT187Kzc3Mzc/da0tLTklR92drb+fn3eff +129ZWU1Ra+PKycrR0czN3d3va1lXUVlRXVVfT1lJU2vfa3dfd9Pr0c7OzMbJ3+9rSktRS1Ffd19r3+vZ98vj71tOS0dr09nMy8vN59nT6/d3TGNVV01Ra0dNU0vvY93r6+Pd1dHPx8zJzczja19JR0tTW1dfWd3vd+9322tvU0lGV2fR083JwMjRztnn/29f +d2NVTVt3R0hPW2933efr59Pf2dfRysjK1eNbTkdHTF1ZVV/nd9/v98nd/29OREZja9fRzcTFzevT09/v/2dnX1tTa1dLSUv/72ff4/f/2Xfny8vLztvd/1VJTUZMW11ZXefn5+/P591bX09MTXfn48nNw8TLztfj929va19dTG9VU0lOb2P3d+/j/+/T5+vP +y8/M1+t3UUVMTU5rV1t37+vv09/d42NVTklOWffdzsbExc3b59vj7+v/Y1XnW09MU3dOY+Pf4/f/293v483M0dHva11OR0pOTlt3XV3369Pd/3drX1VTT2tn3dfIw8LCx9Pn9+tnb2td91NVTU3/W09r5993d//Z49vbzs3O0eN3WU1LSlVO7+dVY2fX3Xd3 +d/9bTE1Na2Pfz8vAwcnP2+fn5+//b3dbW1lOX2dZU2vd4+tn59ff39XPzs/fb1tPS0xLX1lnZ1tdb93ja/9rY09VTFvr39XJxb/AxMzX43drb2tjY1NPUWtOV19ja+/jd1v329Pf29XN2ffjVU5NTE9vX2NfX+tr5/drd3djXVFL7+/d18jDvsHO0dnnZ3dr +a1lVS1d3XVdf/2dn9+NnZ93n2dfR0c/jb2dOTE1PU/93W13jb2f3d+9jX1dRV1Hf1dPMx8LBv87X0+NVV29fV1NOXWdXW2v/Z2Nv611d3dXZ29XP2e9vY05NS1Fr9+tf9+9nY/93b29jXVtdX9vT0c7IxsbG3efjZ1NVY11VUVNnZ193b+9rY2v3/2/b09vX +ztff519TUU1PV2d3711db2djY3fnXV1XX+930cvLzMnIysrj7913TU5nWVdPY2drb//rb2dbY+vvb8/V59nX5+t3W1lRTlNr72/jZ2dva2Nrd/dvY2937+vbztHP087R2eP/a11ZV2NXUVVjb/937/f/Z19n7+Pn19nb09vr62tXXV1TX3fv9+93XWf/Y2dv +d11fZ/fn39/Tztvb0+vj3/fvb19XW2Nba3dv6+/n92dZY2v/69nX29vn5+t3X1tbWVdr7/fr6/93Y3dnb2drd2/37+/Z49fX2evbd+/va2Njb19ZX11na/fn69/rd19n///j29/b2+Pj63ddWV1jb2d36+d3/2djb2drXWdna/d33d/d2d3Z6/dnb+/3d3dn +W1lf/3f/7+vj3+trX2vvb93b3d/v7+/vZ2tdXWN3a+/n7+vrb2NrZ2dfZ29393fv29vf3df/b/93b/9vZ29nWV13b3fn793j6/9fY3dr69vj3+Pn5/drX2NjZ/9v9+Pv7+9va2tvZ29ra///7+/f3ePd3/dfX2tv5+dv92tjZ+v/9//32/f//19nb3fr29/n +6/f//2tjb11ja//36+vj7+9rb19nb2Nvd+/r/93f39/n71//b2v3/2v//29nd///7+vf3+frY11vd/ff3+Pr5+//b2NjY2N362/v/+/3d29rY2dra2dv7+/r49vZ4+P3Y11nb/fr6/fvb2//9+v/6+Pn/+9jZ3dv7+vn6/f39/93b2tnX2P/9//r6/fr92Nd +Z19rY2/n7+Pr3dnj5+93a2tfZ/93b+v3a29v6+v37+Pr929n/2f/9+fj5+/37/9nY2dja//39//r9/93Z2Nna3drb/f34+fj1+Pv92dfX2f/5+P37/d3a2vv7///9/d3a/9va/f/6+Pv9////29nZ19na+vn9+fn5/9rZ2Nja29369/n59/b5+/3/2djX2v/ +92/r529rb+/r//fv5/93b2dvb2/n3+f//+//b2tra2//6///6+v39/9vY2d3d2937+fr59vr//93XV1n/+Pj5+vj929n7+P/d3fvd2//d3dvb+vn93d393dvZ2dnXWv35+vn5+fvd2tdZ293d+/f6+/j2+fvd/drW2Nv/+/v5+t3b2vv6+v/9+Pr929rb2P/ +9+vn6//vd2tnX2tjd29v9///9/93a2Nv6+v//9/f7+PZ6+93/19Za3fn3+fr6+93Y+/r/2Nv/3f/d3dra+//4+fr/+//a2tdZ19n9+vj//fnb2trd+/j3evv6/f/9+Prd19vZ1ldY2//5+vv92d339nb9/fv/29na2dv73fr5+93/3d3b2vvb3d36+v/9/d3 +d29rd/fv///r93f34+tvZ2NjWV9v9+/v7/f/a+/f2+dv//////fvd//v//f392tn/+/j3dPf7+v//2tv/2djX1tdX/939+vr5+fn429n3ef/Y11nZ//r/29nb2f/6+vd3d/j6/dv//93/2t3X11ra2trd/9n///3/293/2N3Z2tvd/935+fn49/j/2/f53dr +b29n//drb2tjTlfAub7M2fdnY11dX1lTV2NfVWdjX2f//3fn5+/3b3d3Xdnd29/b39/Z293j729dU1VbU1vOyP/Pz99v5+/n/29ZU1NRTVFRUVNZW1NXX3f/79/r1dPP08/IzM3V09nj/+fra11PT0pMR0dNxNNJd7jG3XddT1lrXV/va11v6+fr19vf2dfZ +zt/n7/9vb3f349fnd+9jY2dbW05MSkJDRURBTFXBwNfn29/Z02/Ny8z37+/v39PJzM/P2d/d79vv73dnXWtRb19ZX1tvY29VTF1VW0pFSURLST88TaKpy9XvR0FXU/fZd1tXU09T99PZzM3Tys7Z08/3/2PvY1fR3c/OzdfZb+dra1dRT0dJRUQ/Qjs/rrfZ +729jRlt3d9Vj5+/3d2PK1crRy+vj611fXevTW1Nbd2Nf72f/5+frTvf/709OTE1fVUo1vramwW9NRjRPXUtZR0tPRkRO4+vdyca/zL/CwMvPz8PPx7zO1dXZ2efrd2dKS0tGS0k/Q09ORT5Aq85ZX1UuO0M7PElIQltLa1fJ28q9vcW9vLrDu7rDtbrVwMXN +ycXLzuNO429RTTs+Ozw4LrfbNsauXT7XSy7fXz4/Qzk1PTs/TldRz9X/08zf28/nur+1ur+8trnAvL7AwNt3Y+dRSldITltDRTkuo9NJR0kzRcx3UeNVRHdjVU/RTllTZ2NRQV33Tedn10vv18jLzb3CzLe7vc/d3WtZOtm011c4K7Hrb0FIPkzfzVlva2d3 +69nRz8n328hrRUVJTVNdT8xn7+e+yszB0cnXwcTd9853//dfX0NBPiyqzuNRP0E9wc1b/9VRT1lTWd/T28nL3/9NREc+QDs/SUdfX8n/yc3Gxr+7vr3JxsW+z8b/VUYvq61vO0lnQ1+/S1fnSmvvZ2Nnz+//d1lBPDs+TjpEXVXvysjVs7q7u760vL7Oxc1d +Y1VOST9EN++vyVFGV0rr6+9R2Vljd1FJU+/rS0hIP0A9OTw9PkNOTHfDwsmyuLS1t7q+wcS/ztdMS0hCPiuurNtBRkxFxM/bwcf/09dnS+/v91tTTD0/QTk5Pjk+TVtP1d3NvLmwr7C0s7rCzd3rU0hPSzUuU79ZSUZFSsfXy9XOxnfbWWfd2+dj918/Qj46 +Nz06Pz9ATltv18a6squtr7G6xsvv/0xNRj84R1lKSUQ/SUvZZ9vN1d3DysvZ28rP993ZWUxXS0RNSUVHPkdXTv/T18i7tbGzur3Cz2dbRDw3OkI/PjxBQUNMzu/MwcjJyci7x7+8xtPZd2NIQz8+QUFKSkhMSuN3z8zPv7q+sru7wdPvUU1XRDo1NTQ1Oj1F +Te/V2cbAwcC8u764vMPK0/9fV09MQEk9RkRBRk13TO/fz8a8urO3ssDDyVtBOjo1NDEzOEI/SU1X1+vLusS/urq+vbq7wMrX2VlNRERMPUVFTU5RSE/3Z1fXxb68u7/GwW9ORj83R0BBPDxBRUdNUf/n57mur7S8xczLzd/D13dOTVFJS0ZVTE9PV0R3T+9f +b+/Lv7q9zctXU1FTPkVKTU9OV01LS1dPxNHDzs/Myc7Hys7X219TWfdZWWNfZ1dXZ11VTGtPXU132dPFyb2wuct3X0k5QkI8PD5DOzrZrq6xvMTL79nd98//TF1vW2dvY/9bWf9RP2dXZ09NZ1NZY1nKyc7NvsLZ78rPWV9ORUBB/1NbW2tv2dXVy8vLz//Z +ztv/V1NfW1NVVUlTS0xd72Nra09IzFvL78brvqu12UxFPDo6QEo7xqy0wt/fWWf3X1VrVdld42fZ09nrd8/rd1Hdd3dZRUtAPtvbWVNTVU6vrLDO02tfRU13//9KTUhKQ0Hr4+PT19vO3eP///9jW01jUVdvV2P3y87j51nOW28909vPP8Wqz2djXUA8V0RX +O7qstsBba0NrSmNfd0tAR0tOWetj19fNzePftru/xWvJ1/9GZz9nXUs4orxGTlU/RD9rWf9OS1lNPURvZ03dyse7zr69zM3Rd+f/d11VT1tj087nyr3PTUxIOeM/NajFQEQ8ODE0S0RTRDequdVX984+48Hnt9HFvry+u726vb7EwcfH473K58Zfbzk0Njw4 +NCinvjs9OzUtNkFBV1Nd5/9rZ9dZx8rGubi2vLm7vcS7vbq8v7/LxMPHyde/zVc/UTk2OCwrRcU2LSwqJCwrMzU4PDY7q+fLa29fW8m12bWutq+vqaytqaiop6ijp6WsoaypxtdPRP8xOSOlXS4sKh8hISEkJigjJSMiJygvLi40SUA6T//Vzr66tLeztK6v +raqmqaSmqKeurq+ttsWvn6rBvdE6PDMvNjo1NTMtNMtKRiw7JSoqKiovMDBJRO9R49nIvLu6r66sq72xv8XNvdHZPJ+uvrq9413rb/fRb1dv3T9IUT5LNDczLzgsLjcuNzI3PUVARUZRb9+/uri7x8TOv75ryE3Mprjbwb9O3cZrxL7Gv7jAVaWlrLLvvjE8 +NDkzMjs0OTA1Nzk4PD5T3bnX70c/QjpJQDs9I6DjTM9jRl3Fy7+srrWvsLW2sba9vsO9ycVb5/drUd1bSVFjVU1BRndvY1E5Ni0oLTgqLR+2uTw8Sj1r08r/w7u/t7a70dWfp6yusLnfy9XdyltPx2/v18zL58i9srjCY087KysuKSMoH7Y5LjI2PTM+SFHD +47rCuby1sLa8vrnF1dnVycO/xcS6zb+9v7u+xK21tsHfUTQ1Kj0qJyJOUzIsMy0uOVc9Sc7nzsTT1VO1obC2uGNV72/Nd8TZ97/TvMS9sLiqq6qvtshnPzQ+Li4kLb41Nzw1LkZKNU3nVV3/Tf9r09d3Z+tjRUTb49tZ09tny8K+u7axrKyura+7z1M9Pj0r +Kbq16ztdSTVIW0/3zsbJyUpnb0M3qshd3TAwLjpAOT49OD3fVdnCvK6pqayos7/d4z/vKjVnt9lKZ1lKWcPnysDFyL3T99tT919LOe86MTFAPTk4QzY3R0Jda9PGs7O1tr6/XVk82TkzRbL/3W/j78vXurS2vbuwvMW9z+c1vsfC4y01Mzo5OUU8MzFTPmNb +38TJvLvLzE0/Nj45K9271+dn18nJvbG3rrGysLG9usHJ4/drPGc1NDtLPE5GQj46XTxVWWPG09/d60ZFOTcxOSg/1chJZ+PT2cSyva2zubOvube2w+9nvdvHRTg5SEFBP1VJOE132dHPu77Gx9tNRjYzLjIpLjxfZ01X99nVvb+0s72ztbe4ub7Dz9VORV1H +PkZda2tRX0hnzv/v68XAycPJ/1FAOjcuLzQ7Pkc/SENdX3e/vri+wrvAw73D1dnva1PLSVNMW29nT3dfXevVzdO+ur22u8TN40c9MTcsOTs/S1NjV1njxcS/wcG/xsjF0f9fV0g9VTdAQERjV2vZ/2vEycfMxbq4uLjL2+9HQTQ3P05ZVedd72fvzcXFwsXO +ztHL2XdbUUw6ODM1ODo/R11XUVnTzM3PycG6uLa2vczG40NEO0o+V1dj2WfZ28LHwLW4xcvLx85vTUtHOTMyOzE6PD9LV01VyevPycS/vbu5uL7P4008PUBESu9f1c/Jz+e7xry/u7zJy+tva04/RD00MzA0NjxAP1VNV8n3zcnOy8W7v72+ydXbTUFIQl/f +a+/VzsbZuce7uri4v8rF719VPj48NjQxOzc6R0VKSEzP593Mz8jFxsHAwMnXb0U7RD9FY1njy8nHxL26ura1trvIxfdrV0lBQzg2NTU5N0VBSU1ja9frzMrGysjJzc/nb09EPkRARedb9+vZ2cDHvsC3uba7wsXR/29OSkk8PTs5PkFLUW9r593N28rGyNHP +2+ff619PQjs+Qz9XY1nj08rMyMLEv7y6usfMd1NVWUpGRk9DSU5TTVdr4+fPy87Ry8jO2d//93dPRUc+RkRFR2dZZ/fT19HLzcLJvcTT091rW11TXVlVR05na2Pr18/Zz8rLysfAxM3TY2v/U0ZJQz5EQkNGS1VbX+ff49PKzMfMzv9nY0tNSk5PSEtbb2/j +3dHGx83Av8LGw8PIz8/f3/dLU0hDT1VTT11XY05r/3fn0dfb529OR0pJSUNMTUtdXVFn5//b2cjMy8HCxcXBx8zM0e/V/2dvVV9bXVtjW11j7+vj993vY993Y05PUU9KSExLS0tPZ3f349Xj583JzczMydHV3eP/1+P3/19vU19v32Nb29/n39PV49/Xd/9v +T05RT0lOXVNXTlVj99/d3/dv4+f/09Xb2dfn999rXf9n/+vv7+frb93r39nd69/343djV1dZX19ZUWdjd29j39//29vf49vf7/ff62dr919rY1lfU0xd72Pn0ePn3dHT5+fV5+Pfb2NnXVdvX1lvd//v/9vd69vn/2/r7/9r//9dV2NbY2dbWVlOZ2Nb/+/j +d93Z2d3Z2d/f329j///r/+d339XV5+vd19nVz/f///9vV/dvd1VOTExTTU5bU1lbXWNvd2/f39fX2+Pn7/fvb+f/6+/v79XRzN3/2dn/1czX3evnd2f/a3dTV1NZW1dLUU5PX2tbb2djb2//9+fv0ePv92dvd/9v92tv2dfn3evX3dPN0c/V3ffvb/fn52td +V1tnTlFOVVlXU2tf/+vv6/f3d///Z/f/9+/j39/r7+fT6+vr2dXj693ba11j4/fj1+NrX2NvWVNRUV9fZ1nvZ2djb19bY293b29vb/fn293r729349//6+fX493O3dv//99359nj73drX19dUVdZ7+v/a29vX/9fd//n3+t3XU1ZX2trd/f/d//n4//v5+Pv +4+fX7+//59/X3+f/62f/d2NnX2NrWVnj2+ff3ff3b3fvZ2NbZ19v/2/////35+9vW3f3b+/r7/d3b+v33+vnb2tjb2tnb+fv6/dv/2/v39/r79nj3eNvY2/3//93a2tna29r93fv62ff7293a19jW/f/429fY2NXa13/Y2vf4+/f593X3dHZ3dvX72Nra2f/ +6+fvXWt3/3f/7/f/7/9vb3d39+vj/+93b19bZ05XY1Nj7+Pj2dfn5//j3+fv2d3d9/fv62t3b29na/9rX2dvd//n5+/3W3frZ3fr3W9dWV1bX+t369v/d+Pn59nX6+/va93n7/9v6/9jZ/9jY13r3////2tn/+9v93dn72t34+N3/2tdZ11fZ/93/+vZ4+/f +29vj3ef392NrXWPn/+Pr92tvZ+9nY2f/b+fj9+fvb///d29nd2dfXVtbV/f379vX39/3193n6+vna2tvY1tr7/f//+9va11rb11v73fn3fff92N3d//v5993Z2NjX11vZ//n5+vf6+Pf7+fv9+vv629fY//v9+t3/2dn7+drW2dnX+//5+9r///34/9vb29j +Z29bWWf/3dvd1dfd193j6+/392djVV9rd+/n7/fva193b2f/b2d3b+/vb3f339vr9+9vZ19nZ2dra//3b/fr5+fn9+fn//fv411j9+fv63f3/29n6+9rb/9r/2Nj92dna+/d5+drd29va3f/d+/j2+//92fv6//j3+Pr7+9fVV93Z//3/2/39+/rY2tna/f3 +9+Pv92//9+v/d/fvd2v/93fv39/r9///9+N3d2939/d3b19d//fr9/f/b11vb2Nr6/9v/+vn4/d39/93d29ja2/v4+/r593n69vd3+/f/2dnb2/va/d3X293b/9jd2tb/+9nY//v/+v37+/3d+v37+93b/9rY2djd+vd3d/r4+fd4+939/df/29vZ2dvd+v/ +a2/3d2frd19ja2f/b2/v5+/v3+Pfd29vW1ddb//n69nb4+Pn3ePr7+/3d3f/d2tnX/93/2Nr/3ddd+NnY2v/b3fv59//9+9j/3dvb2Njb29n6+//d+vf493r3+/d493j93d3Y1tr/2/3a+/rb+fvd2N3b/93/2/v7293a2vra29nZ19fY/fr6/fv6/fv4+Pd +3+fr93d363dv/+vv929nb2NfZ3d3b2fv6/d33dvv63f3/2Nnb2Nj///39+vv7/fvd3f37/fn4+vvd/9rX3f3a2d3b2d3Y2/3d/9v5+fnd+f/d2v/a3d36+trb29rZ//n7+vn7+fv7+fv5+/r93f/63f//+/37+93/19jd2v3d2dnZ2t373f/72tva2ddXV9d +Z3fr493j6+/v///v9/d369/v9/f39+v3/+f/6+t3d/f///dvd+9vb/f/93d393dfXWdfXWNnb//r//d3Z2dr63f3393v7/93Z2t3/+vf5+Pn4+/r6+/r5+Pj///rd3f/7+/rb2drX1lr7/fv5+//d2NfY3dfWV9nY2dvZ2Nv9/fn7/fr6+d39+fj2+Pd2efn +3+fj3+fv7/93b29nY2dfa3f3/293Y2Nvb2d3d3dvb11nZ29rb/f/a2vv79/f69PX3dvrZ19jY2dra3dnY2t3a2/v993Z1dvn5+t37+Pnd/9vZ2/f3edra2dna19nXVdXXV9r73fj6293b+fv7+/r7/9vd11j/+/f3d/f293jd+v/3+vn93dva/d3Z2v3d29r +b2dja2dnZ2t3d99r5/fv/+fV4+vd6/ddTe9fWV1v/29dY29ra+vNzMrLzNHX193n699ja09RUU9VWVlTVW/nY19fV11ZV29ra//3///n49vb0czMz8rOy8/L1dfd2df/9+9dZ1dbWVdTTFNMTU1NS0RDU1VKR0xVY1v319nOzdXNztPKysrIyMbLytnR0dXZ +6//3Uc+1uMVnV0k7Pj0+PD07P0lIY1v/6+vV2dPZ9+djY0xrTk9Zb2tjyM/N1czLzs/RyMnPvsjJ0dfvX1tvZ0dTQUfRb1VXVWtXd11351/3291r5+9nV09NR0xHRj1HS1FHT+tf/9XLxr6/vsG8vL27u7q5wsPb4//va1NGMdGnr+tLOzguNTQ6Njk4MzQ8 +TEz/293X3XdrW19VT09jd1v3/2dn08LCv766ube2tbexsK+vr6+vuLi8xrvIsK/JQTYqJCsqKSoqJigsKzEzNENIW1dbW2NTRtfDzevVU1FCQ0ZBSf9r1ee8vbu0s66wra+vsrezt66345+fn6q50TM6MjM0OSsuLysrLjc5MjpDPTs3LjQ3NUTZb1lr40pj +Ss3Az8S8wsnA1b68vLu4vce7zuf/W2tJoayuvM3fREtRTUZHRTxEOT09Pz5RU0xGST07MzY5PeNL/+dOQ0BDQU7V59O1s7a0trCxr7WxurzH1dvRPt2fn7a690EuNS4vQjk1Pjo4P01ISv/fzsPfX1tTY0lMyu//70VDNzBDT0FGRtn/59XCvsO9u7y9w9Xf +72tDrKey173LT0lMPkNORkRNQzpFRkJH79fRz93vX1/v1dnjvM7JY1k9OjtHSkVMxMHP2cLOxcK8yufI2VdV6z5frZ+8u81KPjU3QUFDTklZQkZR41fXzMzKw83/19v351fnXWdZSDk7Qk5RSdnv503rwNHJwLzEyc3ZXUxrNqKpw9/bxz5n/0zf72/N70xE +b1U/X9NV72NRT0hLU1vvw9HvTlc+Ojo/T0jvb83V29PCvcXHwsbb3fdrWVMyuMKlt7jEPWc+TmdL18/dWWP/a1X/69PVZ2dVT0tRT07/UVFIPzwsOTxGQVnj2d//ucXIvru6vsnT1+fP5+9Do7tO50RBT1NGZ8bd2/dbU0xvTm/j719fSj9CX0FIUetVWUg7 +RzUvOz9N19PGy8G1trWus7W8v8TN2czZ0TWfR6my328/TDHO/0NXTEQ/RUo/Q+9jU1FHS09OSVFLa0lVQUA2Pjo/5+PKycjVzLu6xbW5vsPT0dPj/8/ZS622v0lVSz1G22vXT29jRz4+QU1Oa1NbT0VIUWtX/8a+53dNSD4+M01ZStPFyse/uLS/s6+7y8HR +x9/b08xnTq1HtcFTQlNOL09JPEc/PDlBSl1NV/9ZT1//b+Ndus/bSExCTkVBVW/Jx7/Cu8G/v7i8vr7T71vnd11R61E3pNs6PTc/P1Vf319jWUdAOT4+XVNVX01nY/fV62fAxsb3a00/SUhL18PJu7q4t7a4sb23ws3r3+Nrb0//SjynZya+uUdCRks2Pzcw +NTk2OldZb3fR2c7TvsC9wrO4zv9dTVFIQlNjycTGwsK+vsa0xcnZ32Pfa2dOVUo9LaldLjs4NTZET1tPPURBOj1BV0/v13fX09HFxcm7tbrDzU7vQUZGTdHfy9O4ubu5v7LBv8zLd///Z1VHSi05uzwuOia6W1/nSz43Qj43PVlT19Pb18XAwr21va2vuczf +a2s+TD1C/1nV58rGzOfCvOP3b+9j/2PjWUZXM7/LQzdANjA9W053S0BbTztIX1/d2dHbwcC/vcO/s72+zcpTVUZMTUdbym/Pzb3K3b+91W/f4+t3b19OSDgvrkozODYuMTiqu75fX0pIQ0XX1+PdyufR277JwcS3v8fVVUtEPztERE13/8/OwM3nvsXPd+/d +62tnX05FRTWyZzk2OzZKTmfXa01J519FX9XP68vbyb7Lvci+trvHztFXRDxJRD9FXev/18jZa+fF49f36/d369VZW2dNMqtnQjg2QkBJNKiqzuvK40hX0efZze/FwN3N3ce4ytvIZ0o8Nk04Oz5XW1nOzuf31cXZ0+Pj/+ff93dVX0dntVM4Nz9BU/fnzMxb +Z93d52/Kysjfz8nDzczMysnZ0edXQTw4PTk9P05OY9PX3XfZxM/V999v39vj1d/MU7W4z0VDRj3v9//XOqu/u8/fb1Xr9+9v43dra29fzt3GT0xEQTs8R0FFTmtV19Hb79PEz8rZxN3X3+tv78td97nRTkI6Qm/v5+PK/1XR583v2+fn3993//9n52/ZV9dV +QkNBOj4+REdM5+PMxtPTz8HRy8/N69PZ087Tv9FXV8nLY01HTXfr218xyrTD09/dUV1XX+NdV1FT71VV61dESU5ISENHTffdX+fPa///0cXT49fbydfNx8TC02Pr591dX1FP29XL03f32Wv/U/9na1//a1tXT07vX1dXT1NHS0E+P0lOY2//38nZ18jM09Pf +zMvMzM7Kx83N0dvj0ePrXXdd///nSUG5u87b/1lMXV9ZUVtRT2tTSk1GQkFGSUFHUU/n/+/n2d/bzc7N0dfKy8jOxsTHx8fN02PV92dvZ19r4/djXdNdZ01XTk5PV0pOT1NTX1tXd0pMTklLTFFd/9/Zzc3VzMrKzc3b/+PNx8/My8vN09vbd3fvZ1tfXVFd +XVNXV11jX2/3W2tvd/djXWt372ddWU9fT01ZT1fn79fNzNvbzdXn09Xn793J38/R0c/Zb29bWVtXW2tnY2trY1d37/9dZ/9bV2drXV1vWWdnXWdbX3dfW3dr9+fZz8/J483Rz9XV6+d358zd2+fn3ev/W1lXW2dfa2tv/1tdU1dfd//n7+tfa29v92d372tj +Y1NVW1lbXW9j9/fb3c/Xz9XZzdXV2c7VxNXT2+Pfb/9XXV9bW1dXVV1ZV19ZV2dvb2trd29v/3f36/fra29TTmN3Z1dZ6+fn1dvd1+PX39vf6+Pf49/b3d/3d+P/X01bVVv34+fnd2tnd2NXa2Njd2ddW1td9+/n9+d37+9r62/na+vj9+v37+vb4+Pn2/f3 +/3fr29Xn3W93/2dZV1tZW133b3frV1trX1Vrb3f/d+/ja+fX2dfjz9/r//936+P3/2/n92fv//fn92/3Y11nb2/v5+9ra2v3Y1lZT1tVZ+fr699v7+v3d+vf693f4+d3693b3+vn52tfb1n3Z3fr/+dva3dr9+Pr4/9vY3dvWWNr7+t3d2dZUVljd11n5+fr +2+fv43f/79fb4+vd4+vn2dnr1+vja19nZ/dn5/93//fr92NbW19jX3dbb2Nr7+vrd2tn73dZY2tnX+/d5+vj7+ff/3ff7+fv7+vvd+Pd2d/j4/dvY//vd1//72v3b2N3X1tbb2d3b2/3Y2dr/9vvY+vra1dZb11n7///69/3//9vb9nZ49/j3+Pf29Xf3d/d +5+f/a3dj52//a2NjY2tnW1FVVVNZW19dXf/v73ddb/fr5//j7+/f19PX29nX1ePv5+/v6+Prb///3ef/d29va2tna3frb2//Z2dvY1tZV1dbU1dfX29fZ/fv91/j59//793d7+Pf39vVztnj693b9+/r//f/6+Pb6/9vd19bW19ZY2tvY29fY19jX2NZV2Nj +X///6/fj2dnrXe/r7+/r29/v1dfb09vP2+Pj3+Pvb2tj//9vd/9nZ1tbXWdfa2NrY2dnd3d3d3dva2NdZ1tbX2d329/r6/9vd+Pr3+fn3dfX2evb39Xbb2/rd2trY2Nfb/fn3+frd2tvZ11na2trd29jW1tbZ2NjX1lXX2dvd/ff59XO4+Pr4+Pr3+Pj3d/d +3evf3dtv//dv/2dvW2Nv6293729nY2NnY293/3dv//9va/9rd2dfa19rZ2fvd+fd3eNv7/d34+vn2+/d3d/b59nb5/9rb19nXWtRV19n/+/jd2tvd11ZY2vr5+vn7/d373f/a2tvZ2/39/f36+fX19vn7/fn7//r6+vf4+Pv/3djX19na29jY11bb2/r7+/3 +b//vXW//d//37//372/3d+93a2tvd//j9+f33dnr4+v3/2dvb3fv5+v35+fvd29jY2NrZ2tna19v/3d35+Nra/drZ1///+P39+P36+fv92djb/93//f3//fn3+Pna2//92dfa2P/6+fv5+/vZ19va3f/929jZ//v5+PZ3e/373d3a/fr6+fv9/d3d2dra2tn +d29va3d39+Pv4+t3a/fvY2P/7+vr7+vr//93Y2Nja+t3d/93b/d39//n5+/r/2Nvd+fn3+Pf49/n63djY2tvZ3d3a1/3d//3d2trb3djXV9jZ/fn6+vjd/93d2//7+Pv7/f36+vn5+Pnb/93a2v39+/j4+Pv6//v/29v7+//9/9fZ3dr5+9vb2drX11dY/93 +a29rd/93Z2dfX/f/7+/v6+/v3ePj3d/f7+fv7+Pd2+Pn3+Pn7+v/Y11ZX2Nrb2drd293Z2NfX293b2dnZ2t3/3f/9/d3b19j7+vr4+Pn7+fd39/r4+P/7/f37+/36+fn7+v39/9na2dnb29rZ2v39/d3b29nb19jX113//93b+/r//93a3f34+vr4+vj493j +4/f/d2N3/+/j3+Pf7+937/9392dfY1tfY19rb///d2dnb+/37/dva//v5+fr5+f393dva3d3d2/rd3fr7//r62tra/93d//n7/936+fr5+fn/2dnY2/v6+/v5+vv93d3/29va2NnZ2//b3f/b/9vXWtr7+/r5+f/7+vv7+Pnb29vY2f379/r7+/v9/fn6+fn +93dra29va3f/6+v/a2dv//f/a2tvd///a/93//9rZ2Nvb+//92//6+/v6+93b/fr7+fv7+v/7/fv5+f3929vZ2tn/+v/d//f93drd3dr/3dnZ2f/729nd3dra11fd/f/7+vf6//f5+vv3e/3d+9va/f36+/////v//fv73drd2d3/2tvd+fv7/f//2/v72dv +b+/f929ra2drZ293b29v//dvb+/n7/fv/29vd/f34+vr63fv6+fr6+/v/3d3b3f39+//7/f/d/9rY3f3a29v7+frZ2/3a2NnZ2f/7+v/929vd3f39/f/b2trZ2/37+vv4+Pr7+fr4+vr7+/n///39/f/7/dv72tnb3djX2f/5/d3/29nXW93b29v/293/3dv +7+fv6+9vb/d37+vv6/fv9//39/f39+v/d/9v////5+f3/3f3d2t3d3dn//f/b2trb29ra2tn7+vv7/93/+/n5/fv7/f/d2d37+//6+/n92/3////9/93//93/3f////3//93/2tra2f37+vn6//vd2tnb/fr6+fn/293///v/+/37/9rb/9vb///b29vb/// +d+/vd3dvb3f/9/fr63dr/3f/9+/rd+fn7///d3dv////7/fv9/f/d293//f/d/f/b2d3d2t36///////d2936/f/9////+v3/+v3d////29vb3f/9+/v9+/3d293b2/n6+/393dvb/f/7+/36/93a2tva//v9/dv9/d3d/f//293b29v/2dr9+//b3fr6+/v +7/fr7+f3d293d/93/+Pvd293b293d//v//d3/29v7+v3//fv63fv/3d3d3d3a29vb/f/b2/v92t39+93d3f/9/f35/fr5+/3d2/35+v3/+/////39/93/3f/a2dra29vb29vZ2939/f39/9vd///b29v7+v3d3fv5+vv9+/3/+vn/3f/9/9v7+fv73f39+// +b/93Z29vb2dj/3dv/2Nna/93a/////f/b2t3/+/j3+/v5+Pv7+Pr7//r92937+vv/+/v/2tvd29r///v/29vd3djb///b3d3d2//d2tnb2937/f3b//3d////+vr7/fn92//6+vn5+/3//fn6+936+93b2tvb2v/b/d3d3drb2dvZ2drb/fv6/f3d2/3/+/3 +6+v/d/93d2//7+/37+v/a3f36/fv6+//b+vv9//r9/d3d3d3d///93d3/2drb3dvb//37/fv9/9vb/f///fr9293//d3d+/37+/v6/dv///39+vv93f36+/vb+/v/2trb2t3////a3d3b2tra2dnd//v5+fv/293d/f37+v39/fv9////+/v5+vn9293a3f/ +/+//a3f/b2//7/9vd///b/////939/dvb///Z2v////r5+vvd293//fv7+/3/+vr/+/r6+/v7/9nb/f/d/93d3dvd/9rb//3b2//d/9vb3d3d3fv/2937/drd/f3/+vn5+/39/93/+/vd///9/dv9+/39//v7/////f/9/93d2///2t3//f/d29r//fv//9v +//f/d3f37//37+//6+vn93dvb2tv6+f///f393d37+/3//d3b/93d///d3dvb//vb3f/93d3d/f37+f/d3f//29vd//3d/9vd3fv5+v//+//b//v73d39/f/b2/3d3dvd3dv9/f39////3d3//f/9+/3///////v6/9va293a3f/7+/37+/v//fn7+/v7/93 +/+/39//373d3d29v/3dvb293d/////93a2t3/3f/d3dvd/fv7+fn73d3//dv///37/f3d293/+vv//fr7+//9/dvb3f3d3f37/f/d29nb2//////b2t3b/9ra293///37/f36+v3a2//////6+vn4+fr9///7/f///f/b3f3929vd/9rd/9rb293b293b293 +/+//d/f/93d373dvd///9+vn5+///+/37/fv7////3d3d/f3b293///3//93b2t3//939////29vb3f/9/f//3d3/3f/b2/39+/v6+//7+vv/3f/7+/v7/fv9/f3//939/93d3d3b293d3d3b29vd2///3d3b29vb3f/7+/v9/f3//f37+/39+/v7/fv7/d3 +b//39///////9/f/b//v/3d3d/93/+/3/29vb29vb3f//3dvb2tvd//3//fv6+/3///39/f37+//9+vn7/f//29v////9/fv7/93//9vb29va29v/3dvd29vb29vd//3///3//f//+/v6+vv9///9+/3/+/v9/fv6+v3/3f/d3f//29vb3d3/3d3d29ra29v +b//37/f39/f///////f///93d3f39/fv7+/v9/f39//37+/v7+/v7/d3b3dva29vb29v/3d3b3d3d3d3d29v/2939/f///f3//fv6+/39/f39+/r6+/39/f////3/////3dv//f/d293b2tvd3d3//f3//93////d2trb//37+vr7/f39/f////r7///7+/v +9+/v9+/3/3d3d29vb3d3/3f3///3d2trb2tvb293d//3//////f////39///7+/v7/fv/+//9+/v9/////fv7//3//9vd////3d3b29vb//3//9vb29vd/////fv7/d3d3d3//9vb//v7+/r5+//9/d3d3f39/f3///v7+/v93dvb29vd29vb29vb3f///f3 +7/9rb2//b3f3//f/////////9///9/f///fv9/f////39+/39/////////f3//9vb3d3d3f//3d3d/93//f3b29vd////+/v9/f3/2939+/3///v6+/v9/f/7/f/d3d3//f//3f///f3/////3dvb293b3f/d3dv////93dvb2939//37+vv9/f/d/fr7+// +9+/v7+/393f/9/93d//v9/93b29vd3d3d2tvb29vb3d3//93d//39/fr/3d3//fv7+/r7+/v9/f/d/f3///36+/v5+vv/3f3/3f/d/f/d29vb29vb2//d293b29v//d3//////f/9/9vd///9+/37+vv7+/////v5+v///fv//f3/3dvb3dva29v//9vb3d3 +d///9/93b///d3d3////////93f393d3d//37+/v6+vv7+/3///393d39//37/f3929vb3d3d////29vd29vd//////3/3dvb3f/9//39+/v7/fv///39/fv7+/v6/f///93d///b3f/9/f39/93b29vb29rd///d29vd3d3d/f3/3d3//939+/39/f39/f3 +9/f3/3f//+/v7+/v9+/v93dvd3dvb3d3///393dvb29vb2//d3d3b2////fv7+vv93f/9//v7/f39+/v9+/39///9/////////f/9/93/////29vd//39/93d29vb29rb3d3//93b3d3/+/v7/f////3/+/v7+vv9////+/3//93d3f/9/f3//f3//93b2tr +b293//fv9/f/d3dvb293////d/////fv6+/v7/f/d//39/f///93//f39/f3////d3d3d/f3/+/39///d2tv///39/f//3d3b29rb//37/f39/939/f37/f3////////9/f39/d3d//39////29v////9/f37/f/b29va2t3d//37+/3////d3f///fv//// +///37/f39///d3d3//f39/f3//////f3////d3d3d3f////39///d3d3d3f/9+/v9/f/d3d3d3f/9/f///////fv7/f39///d3d3d//3////d3f//////3d3d////////////3dvb29vd3f/9+/39/93d3d3//fv7+/39/f/9/f39/f/d29vb3d3////d3f/ +////9/f//3f/9/f/9/fv9/f3/3f/d3f/9/fv9+///3dvb3d3d///9///////9/f39/f//3f/////9/d3d/93d////3d3//f3///39/f39/f///////////f3////d29vb2///////3d3d////3f/9/93d3d3d/f37/f37+/39/f3////9/f39/f//3d3//// +///////39/f3/3d3////d///d//39////3d3d3f//3d3////9+/v9///9//39/93d3f39/f3///39/f///93//f////39/////////////////////93d3d3d///d3dvb293d3f///////f////v7+/v6+vv9/f3//93////9/f3/////3d3//93b3f////3 +////////d3d3d3d3d293d///////////9/////fv7+/v7+/39+/3//f3//////93//93d3d3d293d293d3dvd///d///d///d3f/////////////////////9/fv7+/v7/f/////9/f39/f/9/f3//93d3dvb293d////29vd/93d///////d/////f39/f3 +9/f///f/////9+/v7/f/////d3f///f//////3f///////93d/////f3/////3d3/////3d3d3f//3d3////////9/f///f39+/v9/f///93d3f/9/f/9/f/9/f/d3d3d3d3//fv9/////////93d3d3d3d3/3f/d//////3//////93//f37/f/9/f39//3 +7/f39/f3///39/////9vb3f//////3d3//9vb3d3d3f/////9/93d3d3d3d3d//////3//fv7/f///93d/f3////////9+/3/3f//3d3d3f/d/////////93d3d3d3f/d//3//////f/////9/f/d/////f3/3f///////////f39/f39/f/////////9/fv +7/f3/3f///93d//3//93d/93d3d3d3d3d3d3d///////9+/3//////////93d/////fv9/////////////fv9/f39/////f///////93/3dvd3dvb293//93d3d3d//3//////f39/f39/f37+/v7+/v9/f//3d3d//39/f3////d//////////////3//// +/3d3d3d3d3d3d3d3////////d//////39///9+/37+/39/f393f////39///d3d3/3d3d3d3d//////////39///d3f//////////////3d3///////////39//39//39/93///39+/v9/f39/f//////////3d3////////d3f/d/////////f///////// +/3d3///////39/f39/////////f39+/39/////////////93d3d3d3d3d3f//3d3d/93d///9/f3///////////39/f39//////39/f//3d3//f39/f39/f3/3d3//////////////93d/93d3d3d3d3/3d3//f////////////39/f39/f39/f3////d3d3 +//93/3d3d///d3f//3d3////9/f///f/////////////////9/93d3f/d//////3////////////////d///////9/////93/////3f////39///////9//3//////////f39/f//3dvd3f/////d3f////////////////3///////3///39///d//////3 +////////////////////9/f3///////////3/////////////////3f////////////////3//////////f3//f///////////f////39///////d///9/////////////////////////93d////3d3/////3d3///39/f///////////////////////// +////9///////9/f3//93d/////////////////////////////////////////f////////39//37/f/////d3f/////////d//////////////39/f39////////////3d3d///////d3f/////////////d////3f///93d3f////////////3/3f///93 +////9/f39/////////f///////////////93d///////d3d3///////3//////////f3//////f39/f/////9/f3///39///d////////////////3d3d///////////////9///////d///////////////////////d///9+/39/f///////////////// +//93d///////9/////93///39///////////////////////9/f///////f39/f39/f////39/////////f//////3f/9//////////3/////3d3d/////f39////////////////3d3///39/f39/////////////////////93d3d3///v//93//////// +//////////f3////////////////////////9/f3////////////////////////////////////////////////////9/f/////////9/93d3d3d3f/////////////////////////////////////9/////////f3/////////////3d3d3d3//////93 +d/////f3///39/f/////////////////////9///////////9/f39////////3f///////93d////////3d3///////3///3////9/f39/f///////////f//////////////////3d3d////////////3d3d3f/////d3d3d/////////f3////9/f///f3 +///3//////f3//////////////f3//////93d////////3d3//93d3d3d3f///////////////f39/f39/f39//////39////////////3f///93d3f/d3f/////////d3f///////93d/////////f///////f39///////9/f////////////3//////// +9/f///93d///////////////////////////////////////9/////f/////////////////////////////////////////////////////9//////////3////////////////////////////9/////////////////////f////////////////39/f3 +///////39/////////////////////////////93d/////////93///39////3f////////3//93//////f/////9///////d////////+///3d3///////////////////////3//f3////////////////9///////9//3//////////93d/////////// +/////////////////////////3f/////////////d//////////////////////3////d3f/////////d3d3d3f//////3d3///////////////39/f3//////f///f/////////9/f39//3//////93d/////////93d3d3///////////3//////f///// +/////////////3f//////////////////////////3d3//////////93d3f////////////////////////////3//////////////////////////////////////////////f/////////9//////////3//////////////f////////////////////3 +9////////////////////////////3f/////////////9/f////////////3////////////////////////////////////////////////////////////////////////////////9////////////////3d3///////3//////////f///////////// +////////////////////////////////////d3f/////////d3d3d///////////////9/////////////////////////////////////////////f///93/////////////3f///////////////////f///////f39/////////////////////93d/// +d3f///////93//////////////////f///////////////////////////////////////////////93/3f///////////////////////////f39///////////////////////////////////////////////d3d3d/////////////////////////// +///////////////////////////////////////////////////////////////////////////////////39+/////////39/f///////////////93d3d3//////////////////////f///////////////////////////////////////////////// +////d3d3d///////////////////////9///9///9//3//////////////f3////////////9/////////////////93///////////////////////39/f///////////////////////////////////////////////////93d/////////////////// +///////////////////////////3//f39/f///93d//////////////////3//////////////f39///////9//3//////////////////////////////////////////////////////93d3f///////////////////////////////////////////// +////9/f3////////////////////////////////////////9/f39///////9//////////3/////////////////////3f//////////////////////////////////////////////////////////////////3d3d///////////////d/////f///// +//////////////////////////////////////////////////////////f///f////////////////////3////////////////////////////////d///////////////////////////////////////////////////////9/////////////////// +///////////////////////////////39/f///////////////////////////////////f/////////9///////d/////////////////////////////////////////////////////////////////////////////////////////////////////// +//////f39///////////////9//////////////////////////////////////////////////////////////39//////////////////////////////////////////////////////////////////////////////39//3//////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3//////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/////////////////////////////////// +///////////////////////////////////////////////////////////////////////////3///////////////////////////////////////////////////////////////////3////////////////////////9/////////////////////// +////////////////////////d/////////////////////////////////////f/////////////////////////////////////////////9/////////////////////////f///////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////9/////////////////////f/////////9/////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////3//////////////f///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////3////////////////////////////////////////////////////9//////////3////////////////////////9/////////////////////////////////////////////// +//////////////////////////////f39/////////f////////////////////////////////////////////////////3///39/f///////////////////////////fv9///d/////93///3/////////////3d3d3d3d///////9/f39/f39/f3//// +////////d3d3d3d3d3d3d3d3////9/f39/f3//93d29vb29vb3d3d///9+/v7+vr4+Pj5+vr7+/v9/93b2tnZ2NfX2Nr/+/r6+/v9+/v7+/r7+/v9+/n6+v3d29nY19fX11dX19ja2939+/n49/f3d3f49/j5+fr5+v3d29nXVlXV1fr1dn/Y19dXWNn49/b +69nb2dvT0dPX1+9vWVFJRENDQ0dPT13/39vTyr++vb7BxMPHzc/T5/dXUUhCPDs6NDzTwOdfW11VU1nTztXLzNHd38zKzs7R219jVU9IUU5Zb+vX19fNzM3IxsfKz9vvX1FOSkVFPz07OzUxMjUzNjXvur/N3cfBvLm5t6+0tra3vby5vr+/xtF3S0VBPz9E +P0BLTEpARVPb21VNV0tDOjo8Pj0+OUe7zedHOzo2NzastN3/49vPxbavp62wr6y5ubmxt7vFxNvvV0dRRUpPR0VGPT5APjg4PUM9ODgyMjA8OkBbW1dZUUlDR01ANq6pwl9r2dndxciwtL65ubvBura5s7m3u87L2dV329//0/frUVNXQ+NdUU5CPTAvLzEs +O87VX0c6PDYxOTc0t7bIZ11r/8jFwLS/xs3L1WfRys7R0dvX31nvz8HJvru5t7vFwsTn2b/G409PSD01OTk2ODg9PDk5Mzk+OTBTsdNIW1VJ1Wu+sL3Jw8LKv7+5vMDCxd/3d1X37/fZycPCyuPX0+9Xys/3Rz09LjCv0UxESkEzOjc2QkQ/Pi6px2/nd/d3 +58fCttPZ2cTFyrq5uMDDys7f/1/L1cvR0ctv/93Z/8zO399KSUVDP0JGPENGQjlFSUZJWWtPTarEW1FPT1N3ysfBWdfOyMTEurrD3dvva0VFR01v38/K1cr3587jb83L3WNdXy+ux9dGRTktNDQ0PUo+UWc4qLPX2//fSMjb58prd9HbzcC6vMrX29/ba1tN +39/KzdHLz9vTys3N693NT1lTRkBDST46Ozs2NkpETF3/6z3BqMVJ/1tXyNfvy3fj387Cz8C/yc9fb2dOR1ndy7/D1b7L1c3GxtXO0cDOZ0vGrV/bOjUsLS4sL0BCO1VnLE+nwU/j3V+/yM/C78nFw72/ub7EzXdfb1lCVVnP0c/nzdXX0cvL1+/fd/dTa1FL +RFE9MTMwLzEyRUZLV+tHLKW/S1lfY8vK3fe/38DFvL+7u7/O1VXnVU9j2bjBwMq9wsPRz9Ff13df90U8qudCRD8tJSwrKy9AO0XdVddDxKrB987L08fK58HDxsO4u8fKxdn3VW9vRE5M0dfZy8/K2eff2W9OTEdNW/dZTj1ERjUuLzM0NF9Lb+vX10w3pLlv +wOu7z8jZyri7u7u4vLy+0/9ZUU1FTVvn02vIxtvf92tbY0hnTFM9X7DvS0c+LywvLS45TUZv5+u81VGir9G/zb3Kx//fzrnJv8HBy7/jUUFERDY7PkpbY1Xby93/a/ffU1NJVVnJb+tXX0dFNzIzNTpZWefjvt93Obyqxd/Cy9nLwtvHscm+vsnNzudNRTtJ +PjtGQ9dR78zX2f9rT19O42t3a8+rz8FTSTQyMi42OEZLy1/IxMZTRaG577/N2cfVW+fCu8++0/fXb01EQD89Oj87UVdVd9nN729rW2NPU3fN/8Lrv1VJa1M1Oj9AT2PRz8jP0WM2n7bLyePHzcjX1b26zL7H13frR0Q4Pzw/PT5PW9tfzc/VZ1njVV/v789J +or251Ug7OjYvODtOV81vy8jD3zmktL1338930efvZ7zrws7va+9VQT9BO0E+OUbdW1XFzNFfX2tVX19fzee51cjJW1lVPjg7QlXb1dXbwd1rP6ukuWvTz+PF4//Tws3VyltVTUY9Nz46SEBAP+PDY8HFydvf12fXyNfXvqayvdFVPTs+KzI7QmNrX8zTyVkz +n6u/19/3/91XX9/R0d3OY1tdSj48QTtBRTc7791rzcLMy9vr0+PZ28XMw7zJxedfTkM4NzhTSN9P0d/ZQzOhtsjjd+9nzl1r19fT281PXVlLPztIO0xTTEz3vtnHvsHD09vV3cXRPqGtvb3/bzRGNzIyNjlCYz++X9VbMK2uvs3fY2PZ2U/Xzu+/619Id05B +Pz48P0U+U/fZ2c6+ysfN787f09/L2b/Ru83nS1E/Ozo7TEfjSdNLT0kvtLa//+NV78fT48rHd+vFW1lPUT8/P0pVVVXfxLrRwb2/y8hr42/M69+hscnO50E0PjgwOTQ7Q0tMv9drTDSftszK62fv0dnn1cld0W9dUWdJSEI/SEhDSVvI0cvCwMPDyf/V2+vX +y9XFz9VdZz9CPDU4OkJCSVfjTkdHMam1v+fOa//Ax83IvdnM1WfdT1tCTURMY1ndW8DEysDAxdHNVWNT9zqttb7I40swQD8wMTAyPEI6RtPn7102oq+7z9N3UcnZz8vH2czd51P3T1NFREpRSFt3w8PRv8DCxNXfX29fW93R78rdU0M6Pzg3Mj07RD1VU1dO +TzKgsrvby+dnxci+u8nNwsVZT+NPQEdER/dO2c++xtO/vsXI21tdSlk6obPOxsxDMDU4MjUvOkM9Odnr711LQ6GuwcfX3Vff08C778/F3VlPXVE/RD5ISD/fXc/G0cDFvsfRb29ZWdvM0V/D1UY/OTs6MjBJTEVB/01OVUM8oa69ydfL582/urfTy77vWT9L +OkA6Q1VfTtfZvsbbvsfJzeNbV0k7vKm6zr53Mjc0Miw4Mz9JPEDj59X/Vzqfr7rJzNVnz8m7us7Kx8xLQkk6QTk/TEtIW93By9u/xsPMa1dXT2PXy87v1e9KPzc8Lzg+RElNRl1f32tGxp+vyL7RyszDwrG31+u7T006PzM1Pz9vY09MucTX68LE1dFZVV1H +N6SwtcvR4zI+MTEsOTlGU0xMW8V331dHn7C9wMPT18nLtLnOZ79OXT5FODRCQVVNR07EzMfVy8vH/19MX1fj0cLGzGPVSzg3PC88S0prTllJX+PR7zilrLzKy8f/v7+yu8RvzlE3PDM3N0RP6+td586/yePK3df3U09ZOa6us7vEa0FBNDE1NjFCRVVZ729r +yddLPp+z18PK48/KyrW7z1n3UTc1STE1SEpfVVVd/77P18bT1etVV+Pd18y/xcxvX1k2NDo/PkxF3V9RT+vf3eNKobfFz7/X07++urrVd0xLLzI2NDVGY/dja+fPzMPL2dXZ51tXZ1WmsrrDwFs+QS4rPjwwSk5vV3d3a2vHX0ejtcTJz8Xrv8O/t+ddTUI6 +LzcyOExAXU5fVf/Hxd/Z2WffXffJztHCv8PKz0s6QS9XPElNU+NKY/93d9X/OJ+zws7BwNG+ybm660dEODgrPTE9TF9rZ8t30crDa8bvZ99vTc+ksbm6xOdCQTI2Mz81ONNIY13/b13/d/+/qrrX0cLDyL/EwrxXVUk4NDI5NDhrP3fr7+vXxdXVyF1b1+fP +vcLGxbzf11tNNzVJSEVAd0tdQVv/b1tbQ6apv9vOu8G+wr2/y0hHPzAsPTk9PtlfzszZ1cjJ68TKb+vn90Kfqbi8v8s9QjwvLzs5OjjvUdtVVe9n52dOp6i938zGxb2+x853U0RBNC8vQzdISff379HZzcr/wd33/87Lw7y7ysbJz29HPzc1P05EQUlvSVFT +22vrVUalqLvfvb3Ht7vHxVs+PTsxLjQ3V1V3/8jbydvAyVvE5+P/zkeun667xMNFPj43Lzs2NDHdQWtnX1nv79lvO66tvd/JvM64vMjLTD0+PDcxNTk81T7Z03fT2cbVY8Zvd9vNx723v83JvUtVQDs6O0VLN1FKU0tOX+f/90lEo7S7xru6vru2x8VENT04 +LjI6QE732+u8zs3XxtdLy1/r299Fn6m0wsfKNz44NDo1NDo+RE/P61VZ3d/JRUCisr/Xv7vAvL/dzUk0PD02NDlEX1dbytPf0d/R20z/92vLx8W+ucPM08xPQkI5OjtDPE09S0Nv3+//5+NPPZ+ywL66ubu3w8j3QC41NC84P093Vdd3vd3b49NrSGd3a9FI +raGttMLGXTw/OTo1MC9GTTtFXV/bVdHO61VEn7C8vrzDvbvf12s8MDg9ODVISWNHz+/bx3ff0V9dWWPjyb3Ht77Fz8hvSj09Pjc5PURBP0xVU8vNb9Vj42elsLy2ury4usvOVzMtMDc7OlPnTFvPztlry0zjSVVrZ+Pn36Klr7++30o+Pjo8Mi4/Pkg+4+tf +W8Vv0dVMvaavvbm8vr3CXeNVLzM1PTs9Tv9FTs/v3VP//+vfPGdn2b+8u7fExcnTTkU/RDw3O0w/RUlV3ffV687nvUS0p6q5tLm1vcNnWzooLi09O0Nn609byMj3U0LdY1dRW+vZTcykqLa6wllDPTk5OTAvW0FCT/fX2/93v+/JO6ekrr69uLvB60x3Ni4x +PEVBTGf3Q93vy11JRuPNP0Z328u8vrq8v9XOd0I4Rjo5ODpLTkRbY9fN39vKw+c5oqGru7q3u8rVSUMtKi40PkdP69FEzMrTa0FC7+dZR+/Z40GfrLOzxetMPTs3NjYuOD1GQOv/38/Z68LLykzZn6bAuLi7601JPzctL0BKR0z/d01V3dlfTD7Pb11NY8jF +ur/BvsFd42M9Rjw3OztBPz9MY2Pdy+fbvN3IVzafp7q4t7tvbz44MiwsPklPT99fd/fN129NPtXZZ1Xfx+fboLW4tedRSj06Njg1LkpEP1lb3d/V78O53dPVSqmisr+4vkNEQDc7MDRKW19ZXVdv31nV/0dvb+NOZ93Vvr29xsHNW1VPQkI2OT06Qk9JQctb +xdvTx8HNztXT05+mvLPL/0Y3MjE4MEZbb/df92vBX+d3d09I429Z091Co6y1ybtRQD5LPjU1MTlKRk9Ezsznzsm/48zOxMREoZ+uxONPODw5N0BCR1trd01N/9Vdb2fPUV9nX2/Vyb+8w8bO208+Sz5END08Qz9Mb0zrd7/KvMTRyc2+vFHTn6/L1VE4NDYy +PT1IU1PXW1fXxF1X51NnQGtby99XvKSuvtnEUzpCO0MzOS0+Qkpf28/f17rTt+vbwcDE/0WfreNvOjo1Pj9NXVVJT/dXUevba1XLTuNLVe/Tzci7u77K21tKPDs9Qzk7OUZGT1fZ19nPwcHB0dO9vL/F/6Wrv1dJNzY6QUFVU0pNb+dR293vVV//50hRZ93d +QqCsscn3XTxBOjtAOTQxP0xVa86/0cTGxr/d0cO+x85nq6y8RD46OkVXXetNS09B71Vf52ffTGvNWVF398fCvbzB6+dMOEU4PTtHPDpFXVFV277IvcTOutnDv73Ex+OvrbtPPzc6PUdMTFVEU0drZ1/r99tBQvfvWVvdQqimrbfv1TxARD07QzY4Mkhd9//I +vr6+z7rjys/Cys7R36uw0UY/O0NMWXdXS0dIQlVv/13TXVFfU8lZ39O/wbq6xuP/Qz85OThCPT09S11X58rFvMjHx3fByb3GxsS+s8DPQzs8PElNUVdIPllAd+/fV85PSVl3yV/j72ezp62/2103Szo7PD85OD1CXePjv8G40cvHW8rKw8/OxsG80+tCPENE +79tXTkxFSEVj4+Pra293Wf/E99fNvry+wet3Qz07Nzo8Qj5ET1tK99W9vcPBv9HjusO9w8XCvsTrX0Q7QERPU0pJSEBLRefb99lTW2dnd8/jyc/CtbO3xXdJPEA8Pz9FQj9TTkxjy76+xsy+4/+9zszJ38vB3VdMRD5FW/9jT01bT0tV48rbY+tj3+PnxsvH +w7y9v9HjST8zNzw+RUZFU2NVR9nGu83JycLj18HFxcPNxr7ra01ESEZXVWtLSU1XSllVzM9TW0/f3+Pby8vJv7vAzN9TQDo8PkJHS0Vrb1NT48C71czGvf/JzcnMzNPDz19KVT1KSmNjW0dFX01ZT1nK3Vv/b+fXxtO/w8K/wsz/TUA4NDg9QUtKWef/WVHT +uLzNzcK+zsnExMnJ08bnW01NRUZDTVNOS0RPV1VNT8/nTmPr18/Hyby6wLy+yNtLQzg3O0JDR1FO6+/vX86+vtfXzMDM29PLx9XR02tNTktBU1NVVU5ISFFrU0pjzudf9+PVxefDwbrExtHfVT46NzQ8QEVPV2/n/3fnyb/BzePLwMTLycu/zNPTZ09JS0RL +Y0lVTE5IW2dfVWffUVtv28vG18a/wMrK7+NMQj0+PUdLTV1Z393f3dXRv8vZ487E4+vbycrM42NTSUtHSFfdW1tMU1Nd/1lfZ83dX3fdxM/PzMfIzutZd0xCQD5CSVNfa3fn2evZ4+PE0ff31cPj29nVys/vVV9MT1NLU99va1dfW+/j/19n2W9OZ8zCzdnC +ycrPb1NbR0RAP0tKT1Nrb+/O787T27//d+fK1dnd1c/HzP9nTltfVV9nz/dZWWNZ7/9vU1vdX1lnztnNd9nZ3WtbT1FLSEVBV1db5+ff287Zz9Xjw/db68fR1ePf09XZa1NTT1tMT1n//11fZ29v52tjT99L/+/K1c7b19Hn6/dXV1FPS01fW2/v9+/T293T +0f/Kd//V69vj993X09VvW0xbX19rb9n/Y29jd193Z1NO51Xvz+/J1d3n329nW1tdU1FOU1lv79fn49fX1+ff/91rVdPj1ePr69vd32d3TlVnWWNn4/93//93//93V3dbV9XX69HP5+tva2dZXU9jT1ldWWNn2dvj3dPV32/NXf/j/93n593d387jd/dVXf/3 +b+vd9+dr72f3WV9O31dd993n2dH/91/3WVf/U2NTWWtdd+vd1dnn09133fdvY2tn3dXj39/n0+9r/1NZZ19fX+9r72//Z+9dd91bV1vr5+/X0+PrX1v3WWNj/2dn72Nr6+fV0+fX29//a2P/Z//332vX4//Z52djU1t3Y/f/5/fna+//52P/Z2dvd//b39vV +3e9vX11jZ2NrZ2N3Z1/d59/X7+v/d/9f91tna+fb7/fZ693f7/9bY/ddZ2dr5//jd+f/b/dda1lf/+fr387n929nW2Nja/93a3dna9/r2d/j9+N3a19fZ2d39+v/5+vv3d//a11j92drd/fj9+f/7993Y2/3Z2fn2Xfn0/d392NZb29na1lnX/9369/b5+fn +Y/9rZ1tvY3fb5+v/3efZ2+PnWW//Y2df9/fn52P342tjX3dXX3fvd+fV9/fvX1tb/3fn9//ja9/n2dvv699va2dbY29db+tvY//rd+Pr93dZY/dvb2ff6+fn9+ffb2dr73dr2+dv59vv63dnX/dr//9rXfdn6+vf2ffn/1tZY19rY1//4/dj9+Nv2e/n73df +b2drY+fb49135+Prd1/rb2fr43fr1+9va2NVZ2tvd29n73fn69vj7/fvZ1tdXf//Xf/j52v35+Pb//f3Z2ff/29r593j3evv6+trY/dna+P3b//r52f/XVv/b/dva1//6/fj29fvd2dnWWNfb/djb+PfY+v359/n69/3Z3fva2vd19vj6/f/62tbZ2tbd/f/ +9///b2djW2dv9/dv/+/n693Z2ff372ddWWf/72Nr/+9j6+fr729vb2tv//d3b+fX393v9/fva2drb2//b+///+t3b2N3Z/ffb2f//+/v39vb/2d3Y1lfY2/vXf//63f/49/f/+vnb19v/2v/3dnX4+93d+t3W2t3b3d373f/b2d3Z2f//+N3Z/fv7/fn3d93 +d29jWV1n9/9v73fv59/f4+t3929n9+9v93ff5+fva/dr729fZ29vb2//9+f//293///v529j9+P34+ff42tva2NZX2P/b2/v9+/3593n5//jb1tn92fv793d5+dr72//b2dn///3a//rb2v//2d3b//rb2f/4//n393372trY1tdd/d3///v/+/f4/f/Z29n +Y3f3/3d35+v37////+t3Z2d3b3dnd+Pr//frd2//6/9na+/v/+vn4+9rb29nW11vb2936+t3993n5/f/919bd3drb+ff4+t39/9rd+9na3fv/2f/4+////dr9//r62t39+f/99/n7/9na11fY3dvb2/343fn3+/3d19vW13352935/f373f393f3b3drZ/// +Z/fd5+9372f/5+t3a///63f/6+Nn/3dvY1v/b29rd+v/b9/f6+v/b19VVf/r79/T3+v/d/9nZ29ra2tvb3dvd+fn////d//v3f9v///v9+fn5/fv/2tnZ/93d2/34/933efv93dvZ11Z7/9399/v/29rd293b2NrX2NnZ3fv493v63dr63fr//fr6+/37+dv +Y/dnX1ln993Z18/V3e/j/29nX19bVVVrZ/fn3e/3d/9ja29jXWdrY293d93OztXb2+Pn4933Z2dva2Nvb29rd+f3a/fv//9jd3dnY+/X62drZ1FTa2dnb1137/937/fn3+fn29POz9PP29nvd01FPzY8ycvfa9/R43ddV2dba19f393d4+vHz7+/wcfb53dZ +TUlTXV//79/b29PN083XZ1VR/0dHPj4/PTw+Ozs7177H62Pv79vKxsLCw8THyby7uLu8ur7Av83X41FMR0ZBOjs+Q0tHSUtNSkdMVUs2M1m9y19ZVdfZb2tdRj5KTkpPW1tMY19jzMO5vru8vru5s7W2uby8v8XRyM/dZ0s8R0hET01MSD9KUT1LTD46r669 +71FHQ0JCR0c8O0tITEl3b8HBvby0tbu3ur/Ay83bZ1VPQzs2MDs8NTE3Niq4vd9JUUA2UVdCoKe0zsfZ0+ddZ1nvSe9BRXdvxc7AvLi5ure3ub/Da1VVW0g3N1FJ20NOQUz3Pf9KWU1ZT01PRN2ftl/fUUM+Rjw4b0g+REA6TE3Ty729vriyt6+/vMvd60lb +Wz9DSsfjX1NrTKG8xd/3PzRGSUFPM62p0TzvVztHPE1JT0n/SU1Md9W/ubivsriyuLTA5+M/bzs7PklIQl1n/2tJwUZHXU5fWWdCSfdFL6PIQD83Ly5FNUtNWU9DV11X1bu4r6ytrrWvsrrGW0o4LDI4V0pRWVtHob20x+9RRsjjU2tZR1csn8ZGWz4vT91A +PlE9Sk9LUdXJuriwrq+1urm61V9BVTdENlM2PDg8U1U+19O9X8vZz1PR4+dP/y6hyU9XSz9FUT1GS0NGPk9Pa+u0u7CqrLO6t8HjSUouOjpIOVtCPbesu+/DWURfwndKZ1tf929HLZ+5Y+db2Tr3Pz/I/0hva0j/zL22u7S6u9Pn30ZVRDY4NTozQjpdVVNr +18DR08nf7+9Xd+9PRy5dpsZHZ7w3b99JT11jTldPTOOxwLyyu7fT3VE+Pj04OEF3OTmmtLTb0//vzs7vsG9A4+vnWfdOMKC6TkjnPjjMSl1nTkPrW0s+xrbIvsm/wc9TRFc/RTcvRzM8QE9fzc2+vbu4z7+13VPX32dMPTOit11fTMJIa+9KSkE9Q0tBW1HB +t7u+xt3VXVNnQ1lXQVvNV8fCvsjEybzHyMfTytPIZ+fOW13bunfnSUBjR0bb2UljREhDS1NI0dPP09fvXVs8/0ZVPkFBX0/Z99fXxsHEv8rI273H7+PN51dn27/H00pMY01PS9VFU0VHSllZUUvD3e/jZ1NIQUpVz9Nn/75LznddXdHH1cDKzefjxt/n0+s+ +/8/VUUNEPUl3Z83P4//3UUdn59F32c/V59tnZ0tnX1NOU0/XVdN3z9vRwc/O19nIa+fr49vdWU1LREVIRTxDa01fZ3fv2ePXb9Hb7+PV6+/nz+fXd9H/999r59HrTHdZXf//b+/Hb//d0Wdd3WtER05HV1VNSv9f1+fjzdvV7+tj3dXb1dHP49/322/32+vr +69Nvzdtra913X//jXWP/5/frXe9dW0tZV0tITkZXWeffd9l339137/f/4+fb09n/63fj/2/j4+/NZ+vLa1NTX0pda93b3/drX9/T1dN3Sj9OT0FKa1Xvd+PM39vKzc/X0dPV09nO/+drWUFGS1dOd3dPS1FMSUdKW93v4+vT29vLz9/r3cvMwMO+zsrNzMLD +w8PCw8HKztHd12tfS0Q/ODI0MjI4NTU4Ojc8OTc4ODc8OT5JP0JjuLG0uL67vLmvuLe1ubWurqypqaimpKWprLG+zv9ZR0U+OzZXMjMvMSwrKSssKiYjIiEfHy8yLywtLjFBRNG8wL68r7Gvq6eipKajpaapq6iqrLK3ubvJycDL0/f3V04/Qj05MSssKbas +wVU0KyEoJycpLS8uNS83RW/GwLGzqquxub7Va1lPY9fT59nAtbS6sLi1uruysr/A69td97673Ts7MjMuLCkrLScxLzc8U//n1/dra9lVSefv69fj0WfTvsO+r7OtrK2yuMO5vdf/QUmfoa/XXS8rNi4uMiwmMy4wMllfZ0/Iu9lLVUlAMzAzNDQ/Y0vJwbWu +qbCssLmxtbO+2d01pafC0b7rOdfPT2dHREzrOkTr38hZ00pJODAuLygmJCYsLTE5QlNrwri/w7/Fur68ubzETqqfn6e10U1N611C3zZNX8HfuraysLCvvrTjTTQ2IiEiICksLSozPj7PzLzC0cHZtb7VX9cqn66wyUhjX8LNycP/58DCuLeyr6+zsrvCZz85 +MCsvLScsNSwxLz00SUxXymdvX3dd601fSSyfn7G2wjBvQmtGXfdVu8a1sqqmqaqoqL+tyGM7KjUoKzsvOTc5R0TTV+fDRVM7Y0c/MiwhoOs2Okw4Z0drd+tj28LLvbqsqKmqqq65229dPS8yOzQ6W1dMTVfDxLXEvsVjW09GPzcwHz+1odvvQyv3KTlCLzpB +TnfGv6alo6SrqLHDz1c8Ni45M/863W/3xruuq7DIr8RXwudAMiohoNMuLyswNyw7NEgzOjxG/1nVra6xsbzfU0BFOjg+Pv/DvbvIvbi2r6autba0ysXOSDcuJ6VO57LvRTBnMDQ7LTE1QTRVXc61tK69ve//SP85PjwwQNlb0+O+sqispqivr8XHr8VJPUMu +qPc+OiwvPjA+Oj80OkE6OU/PzrXTyEI6My03Li42PU7LzrvAt7CqpqSqr7O1v8vOTz9CKp9vrLr/VT5IND5NLjk1PztJ48O+rtdXRzk8NjYxLjM2RG9Pb925taqmrKy8ucbDyk5DOiahuF9NSzM92TzvXUhJSe9HS867v8Oz51EvLi4tMCw6MWfZb8vGvrav +r7Gyx8njb09bP0gtr7BJu6nOS8NVRkXVOlVV70vItri9urVRQj47Oi48PTs561FO68PGuLWpuLXA3UxK9zZNMSus9zg9QC5rxkrj71fTd8BvwL+zwMPOzDw4Li44OTpFY2uvwLi7t7CurrO9a/89QDQuOirbrMMpvqln38JfW0dOPF13Y/fGvr3Du+fZPDs+ +VTXva1lNw87Iw7Wzr7Krvs5vQjs1Kzo1NLzKOzU7QTxbU1v362Pb377JvsK2xsHbV1cvPD03SVFr/7vCrruyvKu0tLXNRzw0NS0sMDLdwXcwLK68wMfL61Fb1/fvz1/jx8LD1+9NRDw9X0PH48F3usi5urixrrOuw+tVOy80LjAw3ddPNzQvPkDXNsXRZ9fK +18e/x8y/1+dOUzRCNEc8W9fZxrC9rLStrq2wtctvTzYyMjMzLDvA9z0wLLvCtO/Z21VOz13fy29j51VdU1s5O1dTa2/3vcC7wbi6sbivtLi7WVdDNDY8NjI+5+ffQUo+RFddP7vj78TPa8nN0dHTW0xfOz0+W0xGT//j0bXHrbeztbrHz2NKQjg4SDg8Pl3j +z1tXX9FfuuO1ytPM12djd1lZW1FFVUY+QkZNW2vr11m+77rnzcHKxtXPXU9OTmtRW0nn09Pv5+Nfb8BRt8LDzMbZb9Vv/293QkZFQD5JT08/S1ld29m7z8TG09dnd0ZNPTxOTTtH/9/n23fP18Xbzr6+y9XFztnRy+9rVUxVTVNOd293V3fT12PjzONZW2dV +Sz9JSEhISV9Va+vv19V3//dr/9nMvL3Ry7vExMrF2dPvd1NXV1dva1dMZ2tTXf/M2ffZ729RTUZKRklLU0xdVf/f3e/b291Xa8vfZ2PM59f/63fn91nf59935+dnd9nP4+/rxd3r92vnb1dbW0tfVU9Xz9vf69/r52tZV2Nfydf399/b1+vvY29jY+/32ef3 +7/9P92fr79Pbd2tbd2//WWv/d1lvY19bWV/r3+/r691359fvXV/vX2tVUVVVa1H/69nRy87X5+fP493j3/9bVU9jW1t3Z1fj99fjzufZ1dn39/9jXevv42fvb+fna11jVVFVWW9d//d37/fv3ffX39XOU/dTd2d3a/dn/+/j59fV48/P1XdvX+dZ92//a2Pv +/3dVU0xTSFNf72fj7+NbY+fv3e/j3+9fW2Pnb3fZ5+/f2dnf09Hbzsrj9+ddU/93b2djY1H3X1tfX1Vbb29f7+Nja13ja+vb59nZa29na19d/3dj6/fjzNvv3c3N0dnb62Nr92dZXV1rb2dTXU9XT01dX/ff4+djY+tn99/X32//Vef/9//X5+fV3dff5+fd +1efj69frVWvb629v92dVTV1fV0pOa3drb/d3Y13j///349v/XW9v62dr0Wtr7+vr3+Pf39PV793v73fr//fr/2f/52Nr91tdUVNnZ2tva91fZ2f/7+Pva1tfW/drY3fr59v/79fn3+f309vra/fvVV3rd+t33f9bZ9/ra29n39vn1+Pd/3ff99vb4+djW19j +/11rb1lfa3fja11jY+/jb+fn/3dra1//Y2//Z1vn7/dn/+/n6+fn2dvr42tv99/f59trb/fvb2tn72/v7+N3593//+Pv72tjWVVd/1tdY1Vd9+NfY2Nv6+ff3c/d69/Z7+/Z/2tnX//v52935+9j92/n73fv7+/3W/f3Z13r4//n//9vWV1v/1lVWfdv9+fb +5+fj29//3+/j//f/7+v39/9j9+v/3+v/72/vb+Pj2f9rXVVrY1Vn71dXd+//W2Nn7/ff29/v793Z39vb6+/3V2//d11r6+fr79nf5+drW3dnY93vX19da2Nnb3dnX/ffb2tdXedv6+Pb193f52v3///nd2Pv6+/vZ/9j7+t3393j62/vZ+tv6193b29r/2dd +a1Vb/+//a+//a+/b2ePn/+ff793f72drZ2dnW11nb3djZ+fv6/dr793v9+/3Z1trb3f/d3dna2/j919fa+9v3dnn3e/j4//f39Vnb2f/d2tvd2tnX+/r/2vvZ2//X/fj92vrd//3a11ra1tv5+//Xet3Y93d3+dv6/f/7+vf6+/3/+vnd3dn5/9vd3fn7+Nj +a2/3b+v/719372tnY2NXZ+Pn/+f3Z29j//f3Z3fr6//v93dna2//5+/v7+fv9+vb3evvd+/v9/fv63dr5+P392djW1lfd+frd+dbW2/33/dn73dj/3frXWddX11n73fb3dnn63f33eP39+/b3+PV7///319ja19jZ+vX93djXWP37//vY2///2NjY1tnY2N3 +d2f//+///+Pb4+frZ2//7/fn///r2dvd3ffrZ2/r//dvd+tbXWtv33f/7//3629rW11nWWtda11r39fn6+Pj4+P/Z2/33+Prd+vn7+/3/29jb+fn69/n72/vd+t3b+P3/29fb19jX2NZX2dnb///d+vv4+v3b2/34+/j93d37/f/Z2vn9/fn5+f/59//X2d3 +72/v6+fr5+d3b2NvY19dX1tdd3fn4//n5/f3a+/n2+//5/93/19na2dn9+N37+Prb/f39+fr92/f4+f/b2Nja2dva+f/3+f3a2/v4///d//r99/jY1336+N3b2drXf/3/193b3fnX2f3b2t3/+//7+Prd+/363fn9/93/+/v///va//n52v/23dj7+/vd2vv +9/dj6/93a+frb2d39/9vZ+/j3ed3Z2drZ2t3d+936/939+Pj2+PvZ19fY/drZ3fr49/va2tv7+fda2/3b+/ra2drY2d359n35+vva3dd99/n4+Pn///rd2/3///n42tf/1Vjd///a19jZ2N36+/3/+djY1t3/2NjX3fn5+/n7/f33+/v293b3+P/3+vj2ePf +3ev3d/9XT1tVb29fd2dbY/9rd29nb29na3dvXWv39+9d7+v//+vr49nX2ePr9+/n6+vr4+/v5+/r92t319vrd2dvXVlrb/9n//fra2NrY19fY3dvY19rW11vZ+/v69/d3+fn6/fr3+PZ39/f5/dna+f/6+9n529ra+fvd2t3/29va29nXWNn929fb2trZ2tn +Z/fv5+vn5+vv3d1vb3fv//f/b2/v393f4+Prb2/va/93b3d3b3fvd3f3b293a2tjW1lnZ3d3/+937+9v7+fr7+fn529vd2tn9+936+//9/9r/+vr593d6/9373djd/fv73drd2drb2djZ2vr92Nva3fv6+fr6/f/7/dvZ2tr9//r9+Prd+/n72f/5+P/7+fj +7+/n6+vr/29jZ2tfa3dvZ/f/b/93//9n/+/nb29jb3f/9/fv9//j729j92//d+fb3+vj3+v3d/fr33dv////b//vb2v39/dvX2fvZ2trb29v//93a3f/6+Pvb/9va/93a/9379/36+ff6/fd5+/39/9vb2tdY2//d293/2dr7/fv5+t3b2tfd2//7+/r93fr +93d39293b//v//fr5/f3593f7+v/Z2drZ2tv//9v//9vZ2v/b+/v//dvb///d+///+/v//9nb/f3d2/v7+9r9+/v5+ff3+/v6/dna29v/+vv/3drX1lja19n5+Pn4/drZ2dv7/f/b/9vZ2t3d2Nvd//r93dv7+939+/v9+v/d3f//+vf4+fn3ef36+Pr9+fr +/29fX3drb+/r7/93/2Nna3d3Y19ja2dfd/f//+/3629vb2tra/f/79/f6/fv92dv4/fn4+/nb29rY93b2+//Z2NfX2Nnd+9va/93a2fv69/3/3drY29va2drb3fr4+/v4+/v4+vr49nf4+tjZ29rb3f//+vr6+/r5/f3d2NrZ1tZWV1jY3dd/2tZb2/b5+PT +2dfVb9v/b2dnW1dZWV9ZVWdrX+ff09vR2c7T2dfOzs/Z23djWdn/Y11NVVVNR0ZFQEBF3b7G2fdrV1dZa3fX19PMzdvN0dnTzcrNzNPb52t3a//n//9vWVVXV01IRklLRT1DXf9JR05VZ2///93TztXFxMjDxcHHycrX3efj9+/3///j69lj2c3n2XdnZ09T +UXdHZ05CUUxLTkdITVNTzbi/yf/n91tPW1ldS0I4Qrvr12tXSVdJTFXv92P/083GvsfBvrqysrW2vcHIvl3dZ1VMS0M/STw7PEFIRkRZwNtASVU/Q0FNSk9FT0JDSUpIZ1Nb32fdb2Nna1/HxsG9sbSyramrrqappKuqsbu2tsu8uG9POy4tJCcpJW8tKiEj +JyAoKy81NzZEr7/H29lfPkxLPUJBNzdCQ0pnwLu9r6mrqqempaipoqSoqKuprKirqrS4w+dXPjUlTLlGKCgpISEnKygnJyUtLSctQT4zTuNNV07/2W9T38rKsrSsra2ssKytq6q2scjPyuPvxb/Kw8XZwdHNXzGsujxVOTkqLyssMSkkxd88Kzs9JS8+Q0lP +TT9PX0Lrx7+7rayrp6yvrKKqrrevsMpf311d329Ob+9rTT0xK6fbPUJjQywzMDg9TlFAS3dN9/9COUVLTTo3OTw2MjU6Rf9vvaits6uqqKmxrq6528f/xudrb2vG729NPD0sJ6jLNUk8Rj1MRFFEOKO1yUlZP0JVPllvRTJMQzgvOkJGS9vIvbyzrKaqr6+y +wr5PyFtZS0ZOSuNNS009bzkrn7JbytdNTdU/Sc5HTk5TSWNZPD9APz9LNDc5Ni4yMTxDW8y+wL6srKqlq7K0sve2vetXY1XD087Z2UZrXyyiv79NQfc4SWdNL6TB/2NTPTI2NjZHPjk7Nj45PDQ5RUVfzcXHvruvo6+ssbuw78/JZ2PIyMDG2dtdTFlfXTKf +rc277+M8R0z/PjkxNT0vLjIyMi46NjMxODU8Nj5DVffLu7a3rqmmo6qssrm3u8bJ71m8zsHZ70s/V1NrKq6uz99vWS9MOSaqSDwvZywoMzsxMzc3PS84REVAQ//Jx765ubGmqaqop7K7uKvbwb7f78PJz8pVW1tLRkMrb63XPkk0NjdFNjY+LTM+LzY6PzY+ +QU4/PkVNVVvv18/Lt8C9saurrKiqr8Svr8LPy+v/x93V605PQ0dHTz0vq9s3P1MvPT0kql9ZM004LD86REdDRl1bTWv/01+9wcC7v7qzr7Cvr6e2t769t9/FxtPLyd9RTEE+Pzs5NDCsYzRdNygvOTc2NzE3SP9CU0tP91vr1edP2dHPY7/EwbzKubu0sLCu +r66/vcDOS11R99tv/1dHQD9GOD4zJabOTEI7My86Kay2Tj87QkNVW1NXXVfr0WPTy8jAube7uK61uri0t7m5vd9nv05JSVFETktTQT9BNjg2OTwkp77nQzo9N1NPT0Q+PldZymfZ1cbT48bE5+vOyMa/yMq4yb/Jx77K0bK6yV3/V0dETU5XTEk8Pz04Qjk4 +NSOnsv87Sz8+QjkwpsHZzMTGd8DPy8Pf27zP99vD193Ay7m8ycvIwMLVyNvjRVc7SzpPPDw+Pjo8Njo2MDo7J7euyU/n70/ny87Ld2vG27zJxsLF2+PfzVlNU/drZ2/T389ra9fdWb29xttnd1U4vlP3PkZVREhNRTw+PEEta6y7S05nV29HTqm/ytHNW+/D +68zN/13Lym9rzstVzMxr529Ma2f3U01ZZ0NES0BI2U1ZUVtrTVVNUU33/09XrLDL0/fv/2Nd6+93W9tMUcTP293ra1HfT1tX611nvmfZ929r3+PGzcnVb2NCPz/TSVFHTm9V/0lIWV1nT9W2tbvH08/ZX0qqtLvT39c/vT2/SGdRVV9PTFVRTkvOT1VXTkdT +W19KZ2NdUUrnVUxvxU1nd+vvb2/v/+tPyLquuLzN39vO2+f/11tT509HSlfbTEhPSEZATUJXTc5nUU9RU113b+Pjzd93b+NjVcl3/9XZ/+PrV99b/89TZ8W2u8PXz1XfsbW7ztlOQkTGSltHPkVJUT9LRUb/SFlZUVVvUWNMX1XK0ePj09fvusHEzsrf19fX +2dnZxdXby8/I411jT0xTUV1XZ05NRudJW01fW1NdT1FPZ+v3b9/rVWv/b3fb99HXZ+vjb3fE48ndztPR0+Pv683f1+vMzMbM2fdZU+tZWVtfTktHa0pRPkNHV1lLRUtnUWdnd2//3e/Vd/fVzcPGxcXD0by8yc/d1dXf619r1+dva9nXa2djWVFRW05HT01I +RT1VZ01OU05PTU1TW2Nd43fv4+PZ7//R19fRzMjByMrXw7zJyM7P2dHVztHV39nb39/3X05CRkBKUUdLS0REQUxvSUNGT1dXZ1VVX19vb/fX1dvT49fTz8nFxcnCx8vDusXM38/d3dHX72fra3dd619XSEpHS0RJRkhMT1FTT1VVRFVNVUtvW1Vn6+ff987f +1dfXysjExMTHy8XFzs7O0cjV7/d3919ZX1VPXV1bX11LUURNSVNRR0xKWWNXa2drXV9ra9F379nV19fN3dfZ09n3z9nRxsbK0dXR1dPV23djY11jY1tRWVdPTk9ZVUhOSV9LTllba/9312/v4//r/2vv79/369/j493d2+fj4+ffz9vb1c/R2dnd1+Pd5/dX +Y1dbX01OW1ddUV1ZTFVOY19b/1tjW2f/7//363dr7+Pd49/f2dnT093V0d/b6+/f6+PZ3+fn6+vn93fvXVVZY2NdW1VfWW9bZ2dRTk5jW0trb3dv793nW2/f3+93693f39fN09HZ1dXX3dfr593d99vdb+P/d/9vb+ddVU9ZTkxLSFlRT1lbd19nZ2tjd+Pr +/93d49/r19Hb2//v39vv/+/n2efX4933Z///687n0+trb/dfa19jY1lRV1VnWV9XX2Nna2tj/1VdXev39+/j29fP2ePn39vd6/9v3//f6+/f49/n2fdrb2Nf72trd2dfZ1tnZ11nb2dZV19XZ13362tj72vr///v63fd39fX39vd1dXd19fd693Zb2P/9//3 +b13/XU1TVVNZY2t3b2N3d3drb/fvb2Nn//f3Z2/36+/j9+v3X+/Za//vz9/b49/v9+vd3+tja//jb/fv5+tv9+Nva2djXWNfY2NnVVtdV1VbWV9fX2Nj7+Pv993f39XX09v/d9/d3c7R4+vZ5+vj5+vr//dr93d3/2f//+tj/1tTT09ZV11bW1lXV2NnW29n +63fr59/Z69vj5+fb3evd3+/n2dv349fj39/d5+/f5+vfd1t3/2dnY2drZ2NVXVlPVVVXV19nd2Nda11bd2N3b+9v6+fb29vf39fd0c7O0d/Ly9nPztXr3/dvd3djX19ZT1NbWVdVWWdfW1FbT1NPU11rd+/v6//r3+9359/n99vj0dnZ09vd2dfb3efj7+Pr +Z2ff62tv/2tnZ3drZ11VV29jY2ddY19fb/9nX19bWVlra3f/7//v5+/b3dnT1c7Tz8/P09vr59/n9/dj9+9j929vY2Nna11ZVVVfX1Vba2NbZ2f3b29jWWdfd3f/6+vr49/d99vb59ff293f3d/n49PR5/fr7+vr9///d11ZV2ddd+93W1tv/1trXVdj/3f3 +d/d37/9352Njb19rX//r4+tv7/d35+fj3ePb2dXb09fvY//v59/v//93b19rZ11dZ3djZ2NfZ/93V2Nrb2v/63f/d2fv/3fr9+Pf6//j39/n3efr5+9372/369/d5/9fb29jb3djd293a3fr9//n7+9r93dnb2NRW19rW2//d/fr/+tva+P/9//r5+vn3dvj +4+Pn5+vn6+vr9/fv/2Nbb193b2djb293b2dvZ3d363df72//42tv/9//39/3//9vd/f3/+/35+fv5//r5+vn5/93a29vZ/fv7+9rZ11ra2drb2Nna2djb+/r9+vf9+fn9///Z1t36+/r6+Pn7/9va2tvd/dvd+vr7+/n7+Pj/+vr9+/////v92djXV1na3f/ +Y2vn7+9nd+939/f/a+v3d+9vX2vv5+/f6+Pv63f3b29vb/d3///373dva/9na29r93f36+Pv79/3b/939/f/9933d3fn629v6+93d/dra19bWWf//+tv7/fvd/d3////d+//9+vj9//3/3fv7/93/2/v3/9vd2dfY29vd2dv6+Pn7//j9//n5+vn6/fj33dn +b2/r73d3Z2ddZ2NdY2//5+v///f//293b293b3fv/+/r9/fj/29392/v/2//7/f/9+/v9+/d3efv9//3/2drb/fn9+/f63dv929ra2//b29vb2tjX2tdW2dvZ293d+frZ3drY/fn7/f37+fb4+v35+vj7+Pj5+vn39/vd3fv/+/3/2trX2NjWVljZ3dva2tv +/29r9/dna3drb3f34+vr5/9nd/93//f//+/v59/n4+vv39vj5+fj9/9va3d3//9vd2tfb3dra/93d3dvd///Z13//2tnb2tja2//72dnb2/v9+/39+/n39/n4+fn5/f35+//7+vj6+/v6+/v73d3b2Nvb2dZW1tdXV1v79/b393j6//v/2tnd//vd11dX1td +Z3fn6+ff3dnb2ePn/2/3d19dX2dnX2935+Pf2dfZ4+vf4/9jX1tXU1dfa2trd/f3b+fd39XX2dHb7/dnX05XV1dfZ/f3///j39/r3ePr911ZT05OUVdn693Tzs/RzcLFzM/T2XdbSktIQ0dIS1Vf/+Pf59/Vy9Pf3XdfUU9VUU9Vd+fr1czMycjLycHEzd3/ +Z01DQ0NFR0tOT11r69/f4+Pd29v35+v/XV1r93fv3dnRzdPTz83V2+P/Y1lOTEpLTk5RV1tbb3fn29HRzc/b1dn3Z19OU1lb7+/3493Z09HRycvP3/d3W0VAQUJHT09fY2tr493ZzsfJz9ff7+9XTk1VX1/r7+ff3czPyMfHys/rX0xFRD4+QE5bZ2dv49PL +x8S/wsjP71dKQElFQ0tba+vb0c/JxcrMxs3dd19MPzw7RUlOV2vf49vMw7+/vb/GzN1rT0E+QU5JTFFbb+//39HPz9fX2+9fb11MTlNZ39/b2dnM08nDx8zZ52tdSUU/Oz5BRGddXf/v29fRzsXO29Xd519bW1VXW2vdys3bzsjCytXX71dbWUlNRD9JRkhK +W+P3b93Nx8zNzs/f2+/r/19LT09rb+vFz8rGy9vN7/9ZU0hPS09OQT9BSUxX28zNyc7Vz93MysTHzu9dTENGTEtNZ+fr17i91dff51vvZ09RSUI9PENXb93PwsLIy9XVz87j4+9rW09dT0dJa1VO/7vR3d3vb1VRUWtvT01IRD9BWe/Rz8W9vcS+wr+/2dXO +1+v/419FR1F3TevFw7tPY1lXTkhTT0tIPzw+PkNT79vnysDRa1NVa1VO3fd3991jWWdd1+fvvqywu83F087Rzc7j4/9TS0ZIT/dr3WNnv6+6yOfvTFdvY3fdRTs9Pm9DQ0PGqrJXO0M9Ozo8PUA4NjM1NztPd2/fz+N3TUZLV9/ZyMLCuMDR48W/v8q0qKOs +vtvjv8q/tbm+xsz3TUlfd3dCMkapsMxOPjk8QUZOWfdXNi8vPEU2Ok63uFk5MUg5NUtOSUg/PTk5Pmvb62fj2ed3T1Vnzcy7t7OusL/VY73F5+esoafTz1nP3czAub3J1dtLP0NLd1c4O6axwF9CNDZEQk1r0e89NjE7QTUzOK21xWc2PD8+R+fj91FPPDw8 +StXM2dnZ3+9j/1dZz9fVv7u2zVlK39NnQ8ChrbhVb0zj09vGu7jN0WM/PkBVy9HrP8antddTSTo7VVXfy1sxOTA9ODcvq8m+sUo/PlVFTdlvW1dRQD5IQvfI1//Mzutv42NnyMXNx7G0xd1vStFnO6Otvr5IUVXHXW/Cutvbb084Oj1G529FMqOtx0I+QzJd +Z0zMvzlBOTk4RjHGrcS9ukc7QFVCb2tTSmtLOj5APs/V2c3G391n4+POvLq8rKu0vM/jW8BV75+vvstjTENjSevF2UpKQz8xMzU8Sz88Pi6jvkY6RUw9PVe8zko5QT9NVS+hrr/HrVs7Z0pr0/dNV0pZSExKSMHG08y9z9NvXczj18Tnr63ZzufjRGsyzKrG +38tdOkVjRlvB41FRPTo9NTg/Yz5OWT66rXdP62syOte70WM+Rkg+d02ir+evtclP90tF2eNn31VTWd1BU8zIXb/Z0dVvRtvX61dduLPR40fZOz84zKx363dIOTxCOktH4/dnPzg8PDo9/0lj1Ui+pbxfzs1jO8Wuts1KTsxR3Uihrr6rtcvOa0RC2U1H22NM +TVFNW9fP78tv2VlRPkxdV0JTxLrNdz9TQzwsvq3n21NKPT4+OWc+OV3EXT5KPUpR21vvyGs5t6i/y87FOsSyxb5fXULHXTGisrmpzd3I31tC1UxCVWc6SUQ7X+Nfb8nN//9XPkpVSUpLvtfI1UtGPUEsvqzO0VdLNkNIPk5OOUlP3dtZRUFba1n3yff/RZ+6 +wnfZTFO6xb/H6z+5VTWlrqmu08fJvU5N59tI/19bT0VITWdVa9FrW19NPkE+RT1XyWPrX0w+PUIotqzD50ZZOUI3O11vO0r/705TY9XRze/Lyc/dOJ+uwFX/zc/DycXZ513KYzKjo6zfwt9VwEZOUW8+U13vOE9LSu//Y8vX21NRSj5BQEXNxW9310dERUUl +QKy9U0d3NkA4M0FORz5Z91U5QO/Tys7Tws3ZOJ+oumPbv7/Nv8HIyVHVRT2fpLjruudXwVdGS1NDQWNrNTk6XU1r/8vR3VVrVzg9PEfO01t33f9ERUYoya69a0ZjP1U6N0lPRD7Vz2dPREnLzr3Hus33N6apulvvu87/193F11VLPMmfsr13y19r42tLbz47 +QO8/Qz09R1NZV3fX40H/TkE+Ql3R213j3cxdZz0rq7G702P/QeM/SFVdR013zV/dSlPnY9HIvsn3QFOjv81Tx9NHU1nA0V83NVufwL7Pyf9d6+d3TzpEWU4/WT1R/1tV383j42PJ/0hFT1vGz/fv38/d/zQprqnAa1f/U28+S1FNR1tRa033S1ffU0rFusnZ +SUyft8Jnwb5ISL/bd/8vUT2osr1f103OXd/bRjlPV0hRRTpLX1tPU7zZ0+PM3VlFUc2933fny8vdWTUrqre1W1VbR2NAPEtIS1FMTVFRRUxdUUnjur1v7zpfo7vZxr9AW+9NR1vPL2OqucVvy0/Rd9HX6z9nWVVRTkFC71NTXcnGytXD0/dT27nL2eNn2Xdr +Ri86q8LDd29HTmtESU1BP0c9PUY+SFVrTktnzb7v3ec4obe+12PTRVNFT7BCJrWru8/Fz1W/ztXB70FR3U1Ob1FE41NVX9/KwsLB09l3zsHbd2/V90jvQi0sqc3b5+dAWd9XXUFPPk8/Pz89R0NdT1lZWce/2f8toa+4Rc5ZN0hNuucwJ6mqwcPrw/+9ze+8 +7z9J11dPY09B111r79nEwLfEys/MvcfvZ+vHQEzbPC42p8vnzt87RXdOWUM/O1E/PDg7OkJNSlFZSMC7x0wroqK7d2PrN1m7RU41LLSsvM3bym/H09vD2WdG2VVLV1FP11/Vzc7PvbbB2869vN/n291jQlnbTixXqblb2V9LS2tdW0I/PlM9ODg5O09OSlFX +RL68zj4quKG1RkzrOL87RV8vJqqtxcnP2ffP292+yFdf21VJQ2NVZ1vXx8jBuLi8ysm0um/B2etfTktjSinKpbtv4+tBX+dTT047Pko7MzU2N1s/Qk1nW9e450kzd5/F50b3x10xR0o4Jaitv8PP23e/29W8v2tj/1c/SE1fa+fZy8q+t7e/w72xvdvN291T +S0rrRCixp7/b59lHV+dEa0k2PUs6Li4zOkk8RU1ZVeu920M51Z+33UTFsS48XUM1Kqevv7nP2ePNzsjJvt9ZX01FPD5jVU3TysnDvLfEzbmyvU93yv9KSk5XPif3qr3X79trU093z04+QU48NDA1PD49QWfN2f/PvUw8z5+400O3xi49O0QsL62zvr3XW8/v +y8K/vtfnV0NJOjxfW0LZxLu5v7W8yriwwV/ny1dASUNLNSq8sMV3zedO30zvzuM/QkVJMTM5PkQ/S//Ly87Zz9Hf95+vyVe/Uy86OzwoS6230b69TWvjXc7Bze9nPkM9M0VZU0jVyL+7ube8trSzwOvN119PSz5FNyqrs73nxN1Pa+/XztFAQENAMjQ6P0Y+ +S9vLytHX5923PrCpxNnHRy05OS8nL6zG18W7T+dn0cbHx+P3O0A0O0BrUVPjxsa7vbe7uK/Mw9fVb09TR0A/Mi6ossHvu81Ha+PK2dlPP0E7Ojg5Q0lDTM/EzsvVX8euO66qwbY7QjE9Ni0p3bTf58K6SGdVxsRjyMjnNjM6PUBvRFfbxr/Bt7fCr7PCy7/P +WUlCQFE3MTqqtd/IudNT/+vD11VvSz42OzQ8Rk9AW9fHxcvHV8u5TLahs688MDU0NC0p37RdTse1SlFZyb/vXbpvPS89PD1TRUPnwb7AvLu8rbe+ysrHWUI/QUs5Mmuls1+9vM/r482/xVdB3UMyMTk7Qk1GTtvOxsvJd7zNRz2fuatFLzMxMisrsblPTL66 +71trx8vOWcPIRiw7OkQ+TUJvu8C+wLm3rrnKusrvb047PUQ9LTqjtmfZtd/v/8u/2c9RX0Y2Lz86RkZJTWvRzsvJU7HfYzWlr6tIMjkuLywrrrNdRM6350xn69lr79F3RSstPUBDTkJXu7vGurqyqre8v7XR/0pHP0lFMz6jtM7Rtc7Z68LDy1vbT0kwLzo6 +P0dCRHfvX9PTZ7fbTzWrpaZDMDYxLSsqvrFrR/+0zFlX1cpjTb7nUzAuPkJLSUh3vLrFubq1rrW8w7/GT01IOz8/LeensN3dvMvR99m+yU1r3UEzMjs9QUtESs3Zb9/F0bfR/1UxoZ9bNzU4KioqrrZdQFHCw+tM0cjfSdPHQTYuPT1HREvfxr7BvryvtLG5 +wMnV3UhEOzo7L6qrutfvxP/LY2vAzFNn90UwNjk7P0lCWc/rZ9/Rv7PJz28vtJ/MRzc5KSc2rb53S1fOvNFXz8nRXdfO/zszPEhGQk1v08TCwL6vt7m1wsrZWUg/OzM0LrixvuP/zt/ZY//Cyktdb0IyNz09SEpGb9Hj/8zXyrHFxMk/Tp+u2zw5LyI+rd1f +UVN3xs1Vzc3RY/dVXzw6NzpGO0d348bJv7+ttLa3wc3vW0s+PzQtNq2xznfR98nn/8/Bymv/Wz02Nz49OktL/9/v3cbVybPCxc9IPp+uxj84MCDCt99bTV1Iw8z30c7n9+tKWUdCOjdLPkXv38/Bu7qstrK1v8n/Vz8+PDAlPqvA993ZUb//X8/Iz03vTzs5 +Oz4/OUhKd9ff0cPNuri7vstZa+Oou1U3NCOyt2tbT/9HyNPT29ddd29LSExIOjo/PUbd9+u/vryturK1v83/V0I6Oi8mvq/nd9vdUch3Z8vK3U7dVz08Nz9FPj3n2d/b08nbs7y6vdHXvz2nvk89Lz28w0lRWVlP69fJ69NZa1dEPl09PEE/OGvb2+e9v7+r +tbO1vsx3XVc8OjMqrrjRV9dbTsvr79vZ60pbRjs5MzlAQDpFz2/v79Hfs7a9v9nbuy+ksWs1L0q51V9N91n3682+2etb/1dHP2NIPjw9N07r12PEx7+usri3vclvX1E5Ni0rrbXn59fbUcnZ3c/X52f3RkM7OzY8OztCze/f1+vVuLa7x93Fvyuyrd0uK8G+ +VUROZ1NRX9G+31db905BPUxbRTs6REl3zf/Oz7qvrrS0ub3vV2NDOyw9r7j//9HZXd3Vzs3b5/f3RERDODw4OjdN/2vv3V9jubW3vOPIvC7Lqdk/Ka7MT0RIa1lTTcu9xmNv71NDPkNVVzc3O1dZ1d/V2bi0rrK3t73XV2NINi13uMnvV+/v4+PVw8vXb+Nr +R0lIPkQ+OjhK/+fZ391vuba0uXfEuD0rpMc+K63OPEpBXUt3PtHEyFNTY0lEPT5ZXTcyOEzj48nfzbu1rq+4trrKW29TNC7ZvWNb9+933d/nvc/Z7+P/RUxETEQ9PDU7Z9HjyuPfvLq0umPLrkMnq6s6OK6+MEdTQFtfQVfFxVlNd0pGRDxnU1E1Okf319XT +07i8rq63ubfEVWNLMCmywUFE19tTxl/XvMd3d+PXS0pJVUk6PTs+TdXLzczrtrywuf9rrkouKadFzbfONDVKPkpPPVvX2d9OVz9DPj9Mb0Y/OkhP0cnI1bm4r6qxuLK6z2tXOje2wj9FY29V2VnbxMROW2NnRUBDTkc4Nz09RVPXy8/nubyuvcvRr0tFLsy7 +rrrfSDg+P1lTRM5f3+93W0VFRURJW0M9OUZRW87I08C+uK21vbe+z29fNPfBzTtCW09n09/MxMtjWff3TkFHX0Y2MjtESkhn09HZwcCzts7Is3dHOC+qpsZXV0g2Pl9Ta8xRXc3Pa1FVSFdTTUw9P05dV2PDwcLGt6+0vL3Lz2s/M7ndRDtBSUJHX9Xjz/// +XWvvV0tJ/0s6NDlRWU7v38u/vb+2ssXGre9VPymmp85IXVMwO0lNztNfTtPZb01LS1NTQFlEPU9jXVnjvbrGtrGutsLHyuM0y8lZOjlAR05KQde/21vfV19rV05VZ103NjhFXVv3zv+/t8G5tb7Lr/dnRCmuo8hPTmc1OEg8yr5rPtXO1UpMRFVMPD5FPUBO +T0/b29O9ubmzssfRxdc1sbtGOzs/R2dVT2O9zXfXZ+PTXVtVZ1c3NTlEU1fdyNHrsrK+urzXs9tPPj+/pcJfSVVCNz1MTOvdP1/vzE9DQltLRjpMRT5NWf/fx9fBtby0sc3Xx2NKr8U8OkU+R2NnXdnT48HnUWfXX1lRa0s9NDhDVWfrw8nbv766uLr3tc1K +ObtCpMDrSElbN0VZV1df20Jf0fc/QklJPTlPRj9DXefjzcHfxbC2tsbXyEdMrN07NEk/RVtd99vM52/EV+vfXW9rVV1CPT5Ka1fLv8TZuMnEr713ssE+P7REu7XnV0RNMkJVSlFLPVFn3V0/R0lEQDr/S09A39PRzrnMyrmuucbZ00e1tlc8OUBEQkxX1d/L +2WPPy+9bVXdfSkpGQT9D61HGyL/dtM3XvrNXwsc4yaw9b67DVVNHNkZVSF33PD3P210/TElKQD5ZY1NGb9HTy77Dy768r8z360+oxUE+O0JISz7j1f/rzV1Pd8dPUWNvTEs/RT1DVWvXx87RvMHZyb7Gy80zra89K6i2409BPUxOTkfXTDdGwONDRk5XRT9V +63dT3d/L073Eyr6/t7v/TMWqz0c+QDxHSTxdzF1j091NWdXfV0tVQUg+RD1HV3fZ48fGy77LzM7R57k3tLZAJ++syu9JQD9fU0bbZ0I/3czVP05LW0dL49dv59Hvx7vCzL+/vr3ETb2rvkZBPTxATDhFb99V/9dLY2NjWWtdQ0lNSURFV+vd3dG81bvE08zI +Wbv3sLtEOiuovr9GR0w/U01ja1NBV+/JRElFTEpEa93n2dvn777C08bBwLrTSrKowkdGQTo+SjtHd1dr5+dOW99jU1tOU0dNTUJLVXfV38rFw8S+09HA7//MsLz3Pyqssb5NR1lAPmdPX1lFTl3RTT5PRE5IS87f29vf58u+zNPAwb3JR7euv1NISzZBSD5L +XUlO22dRY9lrXU9KRlNJR0hKU1vn283Aw8W779HDyUCrssnbSS09q7pbSWNCPuNdTGdOR13VVzpLSUxCT9Pn3evZ6+PFvXfXwMPRT6q75/dJQTg8P0JRXUVf1W93W9fn609KSUxMT0dXTVl3683Ixs7A2dfIzUGuodNTZzMuqrfPZ2dIP11vT99vS/fP50NK +QUpMSe/N32vn22/Xv9FvyMrXWam7W05bQzY5OkJJSkBrd2df7+fX11U/V09IZ19nTufZ0c2+vsPFxMrLz0GqoMdHT0syqrvFWVU4Nk9XSFdvPnfj40BZTD1TVVnTznf/3ePNy8tnxsb/b6e90VdKUTo7NUZIRjlZ41Fb91vj3VNERm9FP+vvU03X18jBvLvT +u8HFz0PDorVTV0guqa2+119MM1lrR013PkNrY0Y/Wz48T1//5+9f3V/d0c5rzchP96ax59tTQ0JAOztVTEBJ0+9M3/ff2+tKTlP/SkzJW1Nf187Hx77V477Pbz/AqLFOY0ko2am9d+9GOEhnTUjvV0Fnb2NKSlNFSPfXyd//29//zsdd3cdVW6etz+/bSDpG +TjlETT1K4/9jWd3d32NHVUxVU09XX2tZ/9vLxcDG68LM7z69rqvHRU8yQaq3yVk8OjtVS1lIX0pXX2trSE1RU03du9dv98vf1cvH38NfR6atwtN3V0M+PE5FRTpK72djZ1vT03dLXW9OSWNnUUfdWf/nxcbK98LDbzy3rr6xSzs5Na27tVM6Nz5MSllPTFNN +X13dUU1N12dV1bjnVd3F187FxdHPS6arssPbT1lMPTzvQjs92/93UVlr42dLSFtLSE/jV0ZF519nd8fR2e/CXznnrb7Dvz0yNqy3yds5MjlRTl9RT01LWVnbY1lf59VZzs/H32/LzdfCxdHj96ats7/LRUlrQj9BSEE6Vef3Y1dv9+NjVV1KU1NdX01LQ3fV +V9vX39f/YzO9r8/buEItNq61x0Y9OjlMVW9nVVlXZ9nTb1/R593rwsXV783Vz92/vs9TvqiuuL7dT0hKR0dANzxHRmtnb1tfd/9Pa1NRU3dXUWtfSUpfzWPX3cfrZzqysc/rvVkvLa6yxE02NEFETl1rV0pNSmPPWWPn3WdbvcHbX9/L3+fBxMZNraiztrzK +XVFGQVdBNDY9VVNTU1tVZ1VHX1VKTfddTFvjTUtr39vTz8rrW+ett8fRt3c1NquxtU44MzhLVVt3VUdMR2PZXVt361VP18T/V1Nj9+vVz91Xr6y9u7bMXUpGR09JOTk8S2fdV+9r72dVV2djb+f/W2/341Xnb13jxc/jSL+vudvjuMU0NauzwFM4NzQ+TG9v +UUNKR13v62fj91NjzdHR51tX79vK1W9dq63CyrjCb19EU04/OzlBQ1Xv9/93b1tdWVtX1d93a9nfXWPr/1X/1c7vRLKwu+djy783PquyxkQ6ODU5RUx3TD5AR1n/d1nV/1tnzNv/92NZW/fO1/fjqa+5ybe+0+tHX2tGPD5JRVfv61fNX2Nfd/9R69Fr7+vZ +WU9n/05d78xJS7i2x+9Z9749Q6+zyj84Nzc1PUPnQkY6TVd37//T2W/nysn3Z2NrXePVy0OurLS/wLfBzeNG//9COz1ESkzvZ+dn51f3Z+tZ3dPr4+PT/2dTY1lV6/9Vd6q+1edrU75FN6+03Uc7NTQ3O0ZOTjg9RlFf/+vb4+Pf1cb/Z1FR7+/XXU6srLfD +wre6xN9Vd29DP0Y/Q1n/413ZZ1nv9+9f29/r0dXT51tdVVdZ42c7/63F3+trS8TZW6633UM7NTE0O05PQzg5Pedf//fN59XVzsjvX1lMY9XHVU2pq8S8xLq5vl9V71tAQkJAPUT/0XdjTV9b02vv29f3ys/M1WddVVdO22c9vrHBWdX3R13K0a2150JCPTI2 +O0hjRTU1RFHbY+PO2d/Nys5vZ1NIX2fXSuOtsMbOyby7v9VT30xFQ0VDO0NX09lnR1H/4+/309Hb08nF0Xf3WVFTX2dEs7vE///Xa1HMs624Z0RBPzY0PkVZSzU1QWdrXc7T09fOwc7rY1FLVf9vP/etuM/VxMO6v99rY0tFRUFBPD1X791dSk5R7/fnytvX +ytO/zev/W1lXW1FRr7bN/2PfTl/Hqa3AWUdDQjk3OkpPQDU7QGNn793H187Lycn/X05NX/dnQr+yv8rfysPAvO/ZX0pFSkI+PkFT499NSFdX/1v/38Xby8rGxdt3W2PvVUjEscLNZ1tPWUCxpa/NRUtFQzs4QU1OQTE6SFldWdPVytPLxdf3X05Td99OVbO9 +zsXdyMfByc3Pb0lCV0tDP0pX3+NIQ07vX19n487L1cfJy9t3U13/SkayuP/f51NLTTvFpLHjSkhLRT87R1VNPzM5Q/9nd+vXyMjJw9n/71td9+9X67LD3cvOzsbH2c7E70RCTElDP0JZ4/9NQEtr/2f/59fXyMbKzs/rY2dvSlG3uF3j32dHTTvIo6/PRkVE +PkY9R1VLPTU3Q1fvb/fX1cu9yd1360//52tPvLS+/9HPzMHH19/VxkZIR00/SkVZ9+NOP0hbW/fn59nd47vL0dXnY91nQVOxvU5T3U9NTzm+pLDBRkVAQj5LRU1HPDY3RE9n6+PXzs7Iu+fr62NvzWtVr7bIW8/V2b/I293bb2dNRUZGQkxXW11LREFOTWPX +09XZ18fGzszX92frS821y29R0UlLTjrBpa7bd0Y9QUFDTk9AODY6P1FTa9vVz8zDzdvLd2v/12/fsLjZd9vR3b/BzNPX/2tOU0RKR0rvY09LREdGT05v1dXf2crj077vd29dRbm80VdV3VdMRT27qq3RW0pPP0ZHV1lBOTY9QklZb+PVzMjCyev30V/v50zb +rr9fW+vT2crNytHd/+tXRWdHT1f/WVNLS0tGV1330c3Mys/V2dfFZ/9KUbTAZ0tZX11NPjpfra3Ra0w7U0NFVU8/OzU8P0dd/93Xz7+9zNndd9nb50jEsLtZV9vTz8fL083Md+9vTUFVWVdrU0hXTEhDSWP/1dfOxtHb19Hr0dlFY7G950xfW1tjQDtPrq61 +b08+PEVPVV89Njw7PUZOY+/d58m60+fb51/X30e6tMfZV+vRz8nKzNPP3//vV0hCTttrT0ZPb0pDSV/d09fPyMzbzs/T3+tVb7S/X1lZV09fRD7vsreyd0xDPz9H/1M7Njg+PkRNa+/j4829zuvf52/3/121tsj/92/nzdPKy83f49v/X0tKUffZWURZVU9D +SGPZ19nJys3OzdfR2/9G77HFW05vUUxjRkDjsb22z1NEQkZGT1c9Njw7RUJHWffd28vE09nn729vV0+vsd1vY2v/yt/Pys7V7/f/X0tLX+9XV01ZX0xMSF3d087Lx8/Px83Oz/dPzLHFX1ldZ1dPRUbbsL+/301EQ0hKUz49Ojs6PkVGT2Pn2c7H1+fn729v +TtG1uNtn51PVzuPTx8vZ1Wtfb1tO9+tfQlH/XUpFTVPr483Jy8vTzsvNzddXuLvG711XU3dKTEvEsL7GyE9JSUlTTEA5OUE5Oz9GTU9v1crJ03df52tjS9+yx3ff207ny9PZys/Ty/9VWW9d7+NPSEdNb0xCR0/n59fJzMzP1c/O0d9nsrzPVeNbU2dLWU66 +r7zGzllHU1lfSkQ7Oz5EQUJETV932c3M12NXZ2dVR8q10U1J3U5n79XZ1dvVz19OUVfn5+9KSlFXUW9VSlXjz83HxsfE1cvTzP/fr7nbV1Vra1VBSv+2tLrPd1tBR3dbSj48Oz09Rk9HTl/XzcfKyu9X//9jS7u11V1OW2/nY93Z1efd1fdVR01n2VlAQU9P +SERLU0lZ59PTzM7F08/R1XfArrvna2NX6/dMStWwsLbRd81MS93nSD4+PT5AQUtVTVHnzsnMz9VjXV1bTrm4yVtNV1td3+/b79/X0f//S0dr011HQFVTTElKRmdVa9fTy83JzMvX713Tr73vY19VWU5dR9W4sbfOa9n/S+fvSz4/P0FHS0hHb1ln18bIzt3/ +Z2tRU7W0yl9OU2djWd3NZ2vb1+f/SUZn61FJQklNTUhKQENn9/f3ysvJy87R90/jrrrVX2NfY1VIWWe4tbbJ52vZWW//SkdCPUNKVU9JT//f48vH09/vd3dTScKxxlNOT1//W1/T2VVj093rV0hv52dITkpHU01JRkZMb+d318nLy83X3U33r7POT19dW1lM +S061tb6+2Vvv2193T0VJPUBIX1tLTmf/zcbMyd/n5+9fS8S0v11OUWP/b2//2+tn79HXWUtfZ2dIS0xGT0xMREdRUVXn29/Kz83V30rvr7fNV1dbV1NOVVm6sbrLzldJ2e9nb01GPD9NXWdXT29r78XG19Xj4+NdS7uyx+9ZV1v39+//d2dr29/TX1NfY19R +T0hBWVFFRkdNV09r3c/dzs/Z70rbsrjfVV1bTVFPV2+9trrG93dM3+tXY1lJPDtjX1VbU+tn48zJzf/X299rU7Wzv2dVd1lr39/jb29b28t391tdV2NnX0o+SGNFQkpNW1Fnb9HK387Tb0VjsLr/VVNnTEZRV92/ucHO3VNP69VOXWdRPDld91VTWf/3483V +y9lv0ddrY6+vwW9Vb3dn79Xf72dnY8jRd29vWU9f/04/P1tOQ0ZOV1lda//Jz93TZ0jPsb/jV05ZXUVJXe+7vMHZ2WNFd81RTXddPTtR711XU29r2dHZ/9Xd6+NnzrCzymtdd3fv79XZb19v99/M3//vX1Nd31lIQ09RTUpMW1VnX/frytnvb07Ftb/vU1dR +TUdITv+9vL/OW/9PU+d3SllfQzxFa2NdW2dv2c7b92/X6+9X2a+2z+9j72/3287jd1nr59vjztv3V2dX72tPRU5RTE5MTFdjY2vf583d/0a6tsRdV1lTTUZOUf+9v7/PXU1ZU9tbV01XRT9IX29fa2dn49Hd////42dn1ay61f//6+9n58nda1nj29nd28zO +/0/3Z2dZTE5OT09RTVVfZ2fb3d9vW1G7ts1XUVlPS0VKWd+9v8DZXU5OV3fnTldJR0VTX3d3//dv39Pd//f3Z2NnvLC60W/v599n48zTXVPn1evZ29ff92ddd1tfV1VRV1NVT11bXf/n091rS9u3v9VNTllRR0NIXdO/v83fV09PVVHZX0VHQUhZX29v/+/3 +29vr72/nZ1dTtq+702/f3df/2c/VW1vn19/f19XXa+/3WVtXW11VWVVRU19bW2vn39ljSFe1vV1XU1NRTEVLW86/wdfnWUtXXVlva1VAQktvZ//3d2vd2evna/djZ09bta++d+/f79nn2c/nZ1/j0+fb28vPd13f70pNY19VXVdOTV9ZUfd33etbSdO6xudJ +V05RTUtRXcq+xNXrT1FXZ113Z1tGPVN3/+fva2vb0+drb11nU03Zt7rF32Pv79/n19djVe/j49nf1c/L22/va2dLd29vd1tPU1tfXW/d599XTL28yvdZS05RSkhVd8i/y+tVWUhTVVtv90hBREVn79vna2/XztlvXfddV0fZsr7T1+tj3+vn191TTtvj5+fb +79HX1f9rW1lZTmP371lTV1//d/fn1edbWbS4zmtZX0pZSUxfzcXAxmtPUU5MWVdd50ZAQk5O69vrY2Pv09trW19nSETKscLv/+v3a+Pf1edbUdfb69/r2dvP2d/nW1lPY03d329ZV1dj6+/n391La7S3zldnW1lKT05rycXCx29NV01bVVtX20w+QE5nU9PZ +a1/v1dVrWVtbSz/Ls8DZW+9f71vd2+NRU+PX4+Pv59Pb1d/bb0xOX2Nn0d9jV1ln3ePf5+tOZ7a4yl9RW09RQ1F3xcfCzG9PU09XX1dX629DPk9Xa2/N919v1dPfX1dbTELKtL3ZY1tjb3dr2+tNU+vb393n59nR29fb61NKXVVnd9N3U09v49/Z4+9KTri4 +ze9VTFlTS0nfxcXIze9VT1NXWV1P7+tLQklVX+PVzv/33czZ/11fT0DCtb7ba19T/1/3a/dLS2Pf39/369nj2+fb92tRTWNX39vfZ1Nb3dXV3/9RUbW6xvdbTklVRVFXxsPHz/9VTVNdWVNTU+9NSEtOa2vO19/n59XT3WtdT0bVtMHX729fa+9r21tMT3fv +39nr/9nZ69/r72tZTElVXddva1VZY93N63dLWbS4zu9ZVU5LTUvjzMTGzmdVVVVja1lRV2dbTExRU2frzOvf39fd3etdS0bHtsPV43dr/3fnd29KT+ff693X493T2+PZ/+9jV01OY/fnW1VTZ2/b2V1Ha7m73VtbUUtLSEpdxcvL02tNT2NvZ2NbU11jXVlV +WWfZ39Pj28/P49lrTEfBtsfX9+9n//f3/1lVS2/d2//Z0d/b193j9//3XU5RV/dna1NVd//d02tIZ7m5311XXUtJR0ldycDT3f9ZR13/W19XV1FdY19VUWfr2+vR2dvO1+t3XUjGtLzX6//v7+fr61VKUVXn2et319vf39/Ta/f/Y09LU2t3WWtfX/fj319K +S7i432NfVU1MSVH/zcfP72NbS1n//19RXVNf73djU1/v3//Z09vZ0+djW0nDtb7X/3dn4/fv709HSGN37+/369nX69/R63fvX1VVV2trVWf/Y2/V3V1RUbi8y29fVU5NSk5ryM7N419NT1tb92tVV1df599dWV9r72//ztnd5+N3TUjVtb/X52dv5+/n91tM +R/f/513f49/Z3d/X22vvWV1ZY1tnY0/da3fv32NHa7a5z/dbW1NTU0z/xdX/21tJTl1Z6+9fW1dr49dVW2tv9+vr2c3d4+93UUjMtsXb//93d+P3Z1VJP13vd2//2ePfb9fb6+///1FnY2//b1dd43fvX2tMWby0xfdnWVlTU07jxtf/a11PTFVv//dXV1Nb +99n/W29va2vr79PM33dbWUrTtrvP92tj//fvd2tLTGP3d2tZa9Xd7/fn9/ff72Nn62tZX1NM59/X/11NX762xnf/Z1lPTEvTw87ZXV9MTE1XXW93V2tnW9vnZ1nvb2/f5+/T091fWUrbt73Rb2d33dHR32NFS19b511dXd/j3d3f3evna1FZ92tZY19Va9Xr +Z1FHSLq3y+drY19bTlfTxdVrWU1VT2dfXe9vV1lbY+/Tb2NjY//R1/fjy91rSETrtrvL5+d3b83X21dPUVljWXdj6+fn39vfd3fnY1132fdTT1VRWXfbd05GRsC1wd1jd1dNSkvjyc//71lPWUlZW3d3611R7+/T3+v/69/T01v/zc//V0lVuLvZ/2fv387R +d1VTVVljV113a+f///fN29vbZ2Nj311TVWNfT2Pj/11JR8G3v/9TV1VLTVndydX3XVFJTUxdX1tjX2NXd+PR2133a9vN193V09X/TEZTubnA/1vd3cnP6/fvV05XTU9nb93R42/f2f9rb+/j/2tMXXdbW1/b21tKRWO8vtnn/1VPTk9rzNHZb01HQ0xXX2Nn +XVdXX2v37+vf1+PV3+PnZ9ffZ0lIvLfBZ+/dysnZ5+9jTVtj/11Tb+vjb+vVzuNj99vjd11db91XWVtZX2NXS1u5vsprUUxfY1ddzsfZZ1VLRUtbV1tPSk5V79/v29v3a//ZztXrd+vrXUtEv7PE73fb49XR1dHrY1FbW01NXdH/693R13fj38/V719ZZ1lf +Z/fv7+9VRUG7vchrU1lTX0xvy8PPb29FP0BLX19ZV29XW2Nf78/b7+vXzuf3Z/f/91s/TLvGb+vRzszK23fvX1VZa1dNW+/n78/O1+ff3efvZ2/vb9/nX19dZ+v/Skq8tsddVWtrXVdVzcbf/1lJREVOW0tHSl1RU1133dPX93fRxt3nb1Ndb1tGVbi8ymPb +3c3Izu/n901bW1lLZ+/v2evnb+f/0c3d611dUe9vV/9dd3djS0zRucBbV2tZV1NnyLvD41tJRkNPT1NXUVtZVVvj2c/J92/nz+tra1nv629GQsG+y2vb1c/J2+f//1VZa0xJTF9r29fbz+P/793r9/9d/2f3Z29bXWtjY0pfvMrrV29v52djyL/Ha11MS0pL +T1NfV2N3Y2/v18/R6+fLxs93XVlfX2dNRN29yvd368zEzXdfX05LTElPW2v/4+/r6//v3e/X3WtfX2ff2/9fVVFdX0trub/bY1tbZ133vr7JY1tXSklKU1dXU1VdVWfvzMfM09fRz89ra19bW3dTQeO7ws9r587I22Nd6+9OTU5MTFdr593f4+v/b+vd0edn +W13nb3dbX/9vZ05Tw8DZa29bW2PXxb3M//9PSUJDSlNOT2dnb2fvz9nd0c3X0d1vd11db/9RRVu9xut308jE0Wv/71lITU1ZTlVr993Z2dPdY2/V72dfWffLzu9dU11bU1dTz8TOXV1jW+PVv8fM709MQUpEVU1RV0hTV/f30eP3ydfX383j91VNd09PRuO5 +vM3vytPP49/T611GUU1VWVvf69Pf2eNbWevJ3+t3b2vd129fV1tbVUxFzL7K91dZU2fnxMLB3VdVR0Q/SEtXWUlVb3f/29PRyM/d/933U01f72tdUV/ExM/b0dPb2+vd/2dbW1dVX05X/+fVzNX32dnX/13352vfyP9TU133Y1NHzsDNV0xZV2/XvLvGY01V +QEJAQ05MSkxv6+t3389v39Hd/87N62dbU1dXS0nGu8rf59nTzdnX319NR1NVXVN30c/O3dnn693V02/v/2/TyNPrZ1tdTkNF/8DC31trW1Pvzr7H709OQj5FRk5PUUpZb1Nd49fj18nV3+vZZ09VY19TTELGtr7N19vj3Xf/61lTY/dvV05b6+fV0dPX/+fT +z+PR19vZ09V3W1NnV1lRTb7Fd1NZXV/bzb7J61lPR0RCPURDREtf///n3dfvb9vj4+PdWVNPXXdfVUfGu8HnY+vj09vR2f9VT19VWVFd/93b1crL1d/V1+fd4+/bycvX529nUUpFVb/F/1FXWWPPvL3N/0lDQDw+Q0lMT19vX1Nj499vY9vT4+PZ729ZW1tV +Rj/LuLzZ59fR3293//dbUVFZVVVf183b19XZ92/32c3NztHKw893Y2NbV0pGTcK/yu9nU1PbwsTNb1FNSkhDRkNFR1drXWNd9+Pr48rG099rX09TV19dU0trtr73Wevn7+drZ2drX2d3Z09RX2Nj49fV3+vVzs/X3dfLyM7jZ11ba11dT8e7zlVMTFPLvbzA +1VlMQkJEQURJTExXX9/X2d139//Z2efj9//v62dVTkdPvL3NX/9fb9vZ2d/nT01JTUdNXWvd29Pdb1Nj3dPP993N08vO1efvW0xMPVG+wuNrZ2/Ixb7L2d1OSUJDP0dVZ+9dd2Nra19r79PNv8nf62NnZ19ZZ0tHw77H29vj9+9dZ19rTlVfa11OU1Ffb2/n +d1tR/9vX08i/ztPjZ19VT1FVSPe5v9NNUVvbxL3I1+NLT09OSUtXTk5MX2/n293P09ndz8fn5//fZ1NbX2dT07zE91dTTf9r39vba05RTEpGS1Vb91lfX1v/2dXn2dfP03fd3dXv/1tNREO/v85bW19vxL+9v85ZRkxAQUNMX1vr79Xfa2tv1+PVzMbb99nZ +1ef/Z1dHS8HJ2+/3d9/Z/+tbXVdRU0hERllfd+drZ09RXWdf68rFxtvT1edZUVFNRkHJvM9db/fbxcXBx+9NRE1PU09nb1VbVd3jY2fn19/Ty7y+09nj62NZV29dU729x2tTU13bd/93a1dOWVFVS01XU05KT09na2fXzsjH0Xfb2/9vVU1NS0zZuc1jU05b +48i+v9f3WUpMRUpTV1NNXWv3Xf/Pz9fby8nK3+fZ2d3n29tdT8O6yF1PVXfn49/R0f9dV0xDQUpbXVtV/3dZUVn318/O03fn993f/1tLTUJPy8zfU1dd3cK8ydP3SkdIS0pMT11jb+Pnb2t3a//bysTCx9HX09nn/29VT9++zGtjd9nR0ev/b2NXT05RV1Vf +V1VTXV9VU1l3683Hz9HN1+d3UUpITEhOwLvVV09Md8S9yNdfR0dLVVFdX11LSUtVXW/j69vRy8bFzdfV2d3nZ1tjU9G3wdtjWV//69fR09l3W09VTllbU05TY1dRW+vTzMrL1Xf/d//fd1dbWURI177TT0hJb8vEyc7bW09OSkJETVFTT1f/d19nb+fZzcrL +zdvj087T3+frUWPBzetr59vZ08/V199fWVdVSk1RU1tj3+tfV1tr99/Zy87R2e/jd2NTU0dH78DPTklN58G9w9d3T0VGSVlbXVFMSkxfV11ZW2v3z83MzcXL0dNvW1ddTHe7vc5v7+vn18/O1+dZWWNbV1fvd2dfV1lPUWfVz9XMzM3X62/d42NTTEhFZ73H +70lITmfP1c/R909HSFFZTk5MR0xOW1dZW+/NyMXOysvf39vT393/V1vNvdX3Y2dn2dHX1+v/b29dTkpMT05b/2tvXW/r3ePRy9XX6/fR0+tnd2tRXcLHY0ZMWePKyMfL3U5FS1tOTExJSElRY2NRV2d32+fjx8DN59vb3f9fV0t3wsvba11v18vO193/VVNT +V1dfX2NnY/9rXWtrZ+vO1dPd49/VzeNbTlVIUc3A41NPTnfNx8XK31dKVW9bVVNTU09VTUxLV+vd09nTzcbJ3+Pj32ddU0hbv73X/1tnd//v99Xjb1ldVU5jZ29TW2djXVtra9PNy83d71/v19fnZ2tOSW/Az3dTSFX3ysbI22dVb+dvU0hFS01ZWVdPXff/ +39nMyszR5+vj3/f/a1NRz73jU1dv39/v69f3X11rX09TW2NPU29362///9/d99nb19nX1dffY/9jSVfHyvdPQU7vyL7Dy11RUVVfUVtPUUtOUUpdX/dvb+fXzN3Oz9XM1d1jW0RM2brDb29nd2dr19HbXV9fXVVV9293b+dnW09T693X3dPX7+/d08/Z929Z +QkLOv9FZR0tn1cvL1f9rZ3dfSkpNU09PUU9dW11ba/fNxc3M1ePn2+Pn51dPa77G0etv/2Nv39/rZ13/529vd1lVX3f/d19f/2dr59fN09fd29vfd2dnRkn3v9NJQET/zcTG1/ddV2NrVVFRTEpGSk1fa2tr9+fj3+PTzNHV299rZ1tZZ7+7xOtVV1X/0dPd +229jb11v/2f/43ddX1V343d349vd3+Pd2dHM1e9VQj9NxcjrSEdVd8jJz9PvX1tXS09JSU1MU19nV1tVY+fd193f19Pd39Pd32tTSv+6wuNva1/r2+vn6+/r3/dnY2fr6//v72djZ1ljb9/Rz9Hd39vX32dTTUVIzsdnR0dR28vN1d9bV1NXX1VNSktITlt3 +d19dZ/d359XTycnT3d/b9+tnWf+7vM5nTmN36+fv6///Y9/j/93n711bV2tvX29r9+PV1dfZ1dHP229VTENHY8HNTkNGZ9vMy9vnV1FTW0tJTEZOSU9dXVtVd/fn5+/f69fX19fP0d/3XWfDusDjY19n9+/33c/R1dv3Z+/na3f/d/djXV9jY+/X1dfv69nb +5+f3WUk9QdfRV0dKY9nNzdf/X1FbY1FHSEdGS1vd2XdjV1dZa+/b1d3Vz9fV0dnfa1/TvcP/WVv/59/r6+dvb+vj9/fjd2tnb+tjXVdnZ3f369fZzsvN6+9dTUtARu/F21NMXevPyt3jZ1FRV1FJVVlXT1NnY1tdWV9nX//f5+vb2dPV29/rXVdfxbvN/1dV +UVtd/9fV6+vd3d//b2N3d/9nV1dZ493Lztfb1d3n3evnY1FGS2vNzVlVV3fXz913X1///1dISEpHTFf/529fW2NbXXfn6//n2dnn38/P1f9f1cPRW1lRV1Vr793d///r33dnX1NZY/f3/2tv93fv69/O09fZ1d/f/1FMSlPOyGNTUefKycrbd1dXU1FRT09P +WWfn3fdnV1VXWWdja2/rzMzP0dnn/1NH3b+/409KSUxVb+/n/2v/b1tbb2v3719TTU1V793Xz8rBy83N19vj905EP0PVub7v79HP1dX3X1lNVVNTT1NMTFn/1+9VR0ZJWffj19vn29Xd187N0WtNVcG801lERElTW///b//O0W9bSklKT1VZVVFj987R283K +ztfR4+Pvb29rY1XbvcH/b9XRyMvV5/9bW1tRUUxMSk3/5+9r/1lPUUlPVW/3187X19HBzltHROPB11FEP0pZ08fb/1//Y1lRUV9RWWvn71tf59Pd49PR0dvRysfb/19PTENRx7vT3dnRx83b/1dNTU1PT0pVa+fO0f9RSkNGVVFja+fXzsfX3dPH41FHPF/D +w91bSUFPW+NjX//v519jV2tZWW9v91Vj99nZzsDCwNfX2f9ja+drW0xPx77K4+Pd2eNfV0ZJT1v3/1tNTUpf/2P/VUlNY19j7+/Ry8rva9PKy+NvT2PLyO9GRUFV19n/a93372NRUVFMR1FbY2/j0cvN59nf3///ztnj79ffa2tP98DC3+/X49fd52tdVU9d +UU1JTV/j4+/jVUpMVVdbW1fd0crN08jAw+9PQT9rxc3vVUdd3edv9+9va01MT01XXf/j32trX2Pv993X19/v0d//a93na1dHTdnD0c7N09f3W0xHSl9v92NPVe/v39nvVUtLUW9v/9/GwMLJ09fRzN1rV0tjwcDXV0tRa1tXX19fXVtfX09VT0tPV19rY2vv +3+Pf5+/v4+NbX+/j7/ddT9/DyNHfY/fnX1tPXWPv52tXUW9db93/W1dba9/n7+fXztHOzszJxcvna09dzsbTXU1NW13v9//na2NPSkRNTUtj99//Y2PX72tjXWNjb/fvb//T0+dLQE3X0dPX393nXVdVVVtj/2NKTm9v59fd32tRW2tr/+/TxsbExsjGwM7X +/01Pb8PG129jY2vna1tdUU9bV09VV01b/+djT1Fja2NbW2trb+dra2Nr711NRU33zMvX19//W1FIS2dv3/9dZ/fv3dnd72NRY9nT3dPLx8bEx9PPz87M62NRXcu/yPdbRU5bV1drW1FjVVtXUUtOXW9vY2/r6+v/Z2tnZ29jXWvXzt1XU0pK18nT12tVY1tN +UV3/52NRVU5OXWfd2WNXZ9nX19/X19fMx8fMzMTDzN9nV93Jyc/3XVdnb2trW2NjUUpJSk5RW+/3Y2dr929LSVNja+9v/+/fztX3U0Y/Y8bDxtfr92NXVV1jY1dnZ1NdZ2vf1/dra2Pr6+vd39PKx87Mz8zK2e9dW1vVv8bXVWNbY1tOU1ddW29VU1VXb+9r +W11b9+tjXV1ja+vn92/32ef3Y01DSe+/vc/rV0xLS1PvY11jV05bXVfv/2tdZ+/d2d/Z3c7Mz9PZ2c7FydPrY13Zvb7NXVNTV2dbb2tv9+9vTk5OV2f37///729jZ2djY2tra//f3efnZ05GQ1HOxdPfXVFNS1FXV2P/TkdJTFNr//dvZ2/V2d3/Z93MzM7O +08rKycjV71fvwL3J52Nbb2dr//dja/djWVlda13//2/v3/9XXVlnZ2v//+fn2+fnWUdBPUvNv8XdW0hOTlFMSFlbU0lISVlra99nWVvr1dvf/9PPz8/TzMnHz8jN62//yL3C1fdrW2dTb//32e//V1ldb29n31vr529nZ2tn713r3+vrb+vv909JPT/fyL/P +Z0xGT0xJRlNbV0xER0tRWWtrWW/v2d1r/93R0dPf08rPysvM1d/nzL3DzO9va2/39+v3393r62tvWWP37//r3f/va29vXVdd59nda2vva1tLQD5M28bL71NKV1dKRk9jU0o+P05TXWdrV2vr3dX3///b29vr28fMy8zIz9n368G+wd9ra1dv/+vf5/fr32dn +T13r7+vv3f9rXWvvY11n3dnd7+fZ529KREJM2cbD1W9ZWV1FR0xZWUpCP0pMXV1nb2f39/dnb2/33/fn383N2dvPyNXfb9W+xttvb11vb2/n//f32+djXV3f//fr39v392/3b2P31cvf5+vf629PRUlK2cjG0f9jWV1FSU5OU0hFRU9OU1lZb2/39//39+vr +3//329XO2dfXytXnb9m9yN9jVVNnb133b2/32/dZTl33///369//9/ff62/329Xf29vZ329XVU9N38rGzd/3b1NISVNjXU5FSUdHTVNd9/f39////29v92dv59vf69vPxs33X9/DyddnV11jb/f3//fn29lZTGdvb//f383jZ/f3b2/329fj29HV42dZV1NK +VdfJz9nb91dTSEpVTUZHSEZHR1Nj9/f//2f3b2/3Y2Pr2dXR3+POzNfjb+PDws7nZ2///29v/+vb3/dVX/f/6//349v3//9n9//n2+fj29n3929dU0dGT9HLx8zVb09NTE9PS0tPT0dKS09nb+P/Z2Nv/+fjb9/f6+v35+PO0dHr99vOwdH3XW9nX2NZ99vV +1edfWV9db2/319fn9/fn2ePj3+fb2+f3/2f/b11NT+fRztHb611TSE1TTExLS0VBQ0pZX29j9+P3//9vY2dv6+Pj69vKyc7n49vTyc7nZ2dvb+fj29vX511fY19jZ2Pjztvb9//n5/f392/b39vV5/9vXU1JSl3OzNHb4/dfTU1PTUtIRkY/QVP34/dfZ/dn +Z/9v9/dv69fb29XOyd/36+ffzMvR1fdnX2Nv9+fb919jZ19jZ2Pj19/rb2f/5/ff39XR3+f3b//3Y1VOTWPOxMrV3+NZTk1ISk9ITVFIQkpRW11Vb/dfX2//6/dvb+vr69/V1efb1dHTzMjP62Nnb/fr99vR62/nb11dVWf36/ff5+vV1d33Y2/d3/f3b/f3 +Z1lbVVXdx8jb4/dnXVVZY2NJRklERElRZ19j/+Nv/29n92dbXW9v69/OytPb5/dvb9fN2/9jY/fn39vb52//X1VVT2/n18/P3W/j6+f//9vX3ePj6+PrZ19ZTUxj28rNzM3Xb05JTk9JR0xLREdVb2dn//f3X19fb2Nf9+PT293X39/j4+vnb/fKzd1vY2P/ +9/fnb19vZ29nX19v//fn6/fj3eP/39PO09////d3b2dZV1t3z8XKzNf/b1lRW1dOTVFMS0dOWVFZX29fZ1/32+t3Z29n/+vb2d3Z39vd/+vTzONnW1139+Pd2d//b11NTFVn/+vr493T0933693f3+tnZ//34+NvW1lXd9fNyc/r/19db19ZUU1KSEhMUVFf +99vZ/2dvd2dnZ2//993X09PT2+v3W1vr0933Z3fb3d/3/29fXVlTS1Vf99/r39/d3/93/+Pr2dnf3+v3/3dVV11dZ//KwsbX42ddXVVVTkxMSk5XW1tnZ2d3W2dv/29vb//d49/f39vb4/93W2fry8rZb13///f3491vb19bWVldX/9n/+vf3f/32dHX2etn +/2dv//9bWWdnb//KxMvVX1tZW1dbX1tfUVFKSFFZZ2f/X2/r69v3///d4//r69HV09vj62d399PjZ2dn63fj49frZ1tNUUhNU1tvb9fP0eP/4+vd9+v/9///3evjb3dnV1/XwsnR///j/3dZW01TTkxMSFdXX2dv/3f/Z3dfX2/34+vbzs7R43dfd19n69PX +9+vr2evr2et3WVVRV1VX/3f//+Pd63f/4+Pr6+Pj6/f/9/9nW19fUV/OwsDP/2dnW1tVW1tXVVVPUVtbX1tXW2dnZ3d369nZ3f//493j4/dv/2dn68/T3fdvb2fr3ePrd29vb1dXW1tfd93Z3ffj2d3Z493db19v////d///W2fvzM3jb29rW19bX2tfX1dN +TE5NU1FTb+Pv7+//9//v7//r2d3d3e/36/9rZ+PZ43dnb//V0dnjb1dTV05XW1tr993Z2d3d6///9+Pr/+/j493d63dXU1dr0crR3e9rZ3d3a19bV09KTVNXW1tb//9nW2N3/+/j3efr1dXV2ff//2dXX//Rzt3n//fj5+f/a19rW1NXU2t39+vn7/f/Z/// +99nZ5/fvd///a29dW1df38zM1edjX11fY2NvZ19fY1dXV01PZ2t3/3f/4+PZ1d3b29/r6//36/93d//VzudvW2fv39/3/2tnW11ZVVdXW2t399/r/+/369//a3f37+Pj6/9nZ11d69XR2/9nXWv//+/n/2ddU01NT1Fda2v///fr4+Pj5//n49/d493b3/9n +XVvn1dfrb3f339vj7/dnV1VPVVtjZ//r493/Z11jb+/r9/f359/f53dnW01NV+PO0d//b293/3dvZ1tnX1VTU1dfd////2v/69/b39vZ1dXX3ePn/3dvb2vf09Prd///7/f/b3dfW19XW19vb2dfa/9ja2dn//f/7+Pr4+/v/2tnW1dRVevKyd1vV11nd+vr +92dvY11ZT1dZW193/+/j49nV29vd5+fn693b5/d3a2/v1dXvb2Nn9+vr5/f/d2tbWVVba2P/6/d3d2d36////3d36+Pn6///Y1lNTFn/1+f/Z19f/+vv/3drW1FMTFNbX3f359/d29vr7+Pb2dvd3dfX293vb2dr49fb73f/7+vj3/9rXVtfX19rZ19v6/fv +d1lfa2t37/fn39vX3/drW1FMTFH32dv/b2Njd/9rX2NfWVVMTFVZXWNrZ//v3dnj39/d29fb19PZ29/n9+/r39PX1+f3/2vv39vr/29rZ2N3a2NjY2tvY1tja2///+vn6/fv/+//Z1lRTVF319Pba1tfY/93d/9rX1lRTE1NUVtnd//r3+//59/f3//3393d +29vf3+fj6+/j3+fv7//f29vj5+vv729vY19rd/f//2v/d29rZ//v39/j9/f/Z2NTTk5Z9+Pfd2dda2//73dfVVNMT1FRWVlfY+fb2+//7/fj5+/j29fX0dvf6/frd/fb29//Z2vr39vn//93//9vXWt3b+93Y2Nna3f//+Pf39/j29/ja11VU1ld/9vZ7/93 +X1lZ/2tnX1FOTU1NWVldZ2vrd293////6//f3+ff39vf2efnd2vn29Xrb2P/79/b9+fn39///293Z/9r/+9nd2dnb+ff3+tv7///Z1tVU11Va+vn72Pfb2NjY1VZXf/vZ11dV1dda+fn/11r59/f69/f59fR0dfZzs3R62tj/9PT2e9jXWt3b29jY2dZU1NT +WVld//9na2v/d1tPW2dr/3f///fb3+9nT0lV2c7R3+//Z2dja29vZ29vY2dvd/fr93d3b////+/3593b39/n49vr/3drZ+vV1+tnb2tvZ19nZ2tnb2djZ2N3/3dvZ2f//3dra29v//f////v9/9vX1VX/9XR3f9nXVtbY/93a29nY2drZ3f/d2tr//fr9+/3 +493n5+/r59vd5+9va+/Z0+NrY2Nrb2tvd3d3/3dfY19rb3f//////29vd29vd3dv//f39/dvX1lVY+Pb3/dvZ11dY2trb/9rW11dY2///3dvd+vv6/9v9+fj4+Pr39/f2+P/Z2/f0d/3d2t3d2///3dv/29ra293b3f/d////2dva29vd//////v//9rW1lR +Xe/Z2/dvW2NjY2Nba29nXVtbX3d39/9ra//v7/f/7+fn5+/j393f3+P//2/f1dnf/3dvb2N3/3fv//9va293/2/3a///d29vd2//b//3//d3////a11RUW/f193/X1tfX11bX29nX1dbXWdrb3drd//v93d39+vr6/fr3+Pj4+Pr9//j19fj/3d3d//////3 +9///d3drb//////3//93d3dva2//9+93d/93a19ZU1/v393/Z11fa11bX29nXVdXX2dvb3drb//37////+/v7//v3+fj5+ff7///39Xb93d3a3f///f////3d3dnb//////3/3dvd/93b3f/7/f//+//d2dZWV/v39vrd29rb1tZXWtrY1tXXV1na3d3d/// +/3d3d3f3///36+fv9+/f6/f/79fd63d3a2//d//////393drb///////7///d/93b//35/f///f/d2tbX19339/r/3dra19dY2NnX11dX2dna2d3d///d//////3///37+fv7+/j7/f/79fb729nZ293b///d//3/2tjZ///////9/93//f/d//37/f39+/3 +/29nZ19349/j7/93b19fZ2tvY11dX11jZ2v/////////d3f/d3f/9/f//+vf4/dv99/f73dra293///////372tjb3d3//f35/d3//93///37/f36+/3/2tra2Nr7+Pr7/f3b2dfX2djXV1fXV1dY2//////d/93d/9vb//v7+vv/+vn6/93/+Pd6/d3d/93 +/3f///f3/2tr////////9/93/3f////39//39///d29rY11n/+fj5+v/Z2NjY2djY2NnX19jZ3d3//93b3f///93//f//////+vr6////+vd4/9vd3dvb2v//+/v/3drb29vd//v7/f////3///3//f39///d3f/b2djd+vr6+//b2tjZ2tjY2NjXVtbY2tv +d2////////93d////////+vn7///9+/n5/93d3f/////9/f/d293d3d3d//v9/////////////////f///9vZ2Njb+/r6/f///9rZ2trZ2NfX11da////3dv/3d3////////9/f/9+vn///////v6+/3//93d/////f/d3d3d3d3d//3////d///////9+/3 +//////93b2tnd+/n4/f///9nZ2Nja2Nna2NdX2dvb293/3d3//////////////f3///37+/v5+/3d3f/////9/f/////d3dvb/////////f39/93//////////93d29va//r5/f//3d3b293d2tfY19fY2t3d2///////3f//293/3f//+/r7///////9+/v +/3d3//////f/////b29rd//37+////////////f///////93d29nZ2//6+/v7/f/b2drb2djZ2djY2///3f///93d3d3/3f///f//////////////+/v//93d///////d/93/3d3d///////////////9+/3////////d29vb//v5+vv9///b2tvb2tra2tn +Y2tva293/3d3d/////93d3f////3//////////fv//9vd///////////d29nb3f///////f3//////////////////93b2///+/r9///d3d3d29ra2dnZ2dra3f/////////d3f///////f39+////93d//39////////////3d3d29nb3f///////////// +/////////////29vd3f//+/n6/f//3d3b29va2tna293d3f/d/93d/////////////////////93d//36///d///////////d3dvb3d3////////////9/f//3f/d////3d3d3f//+/r7/d3d3d3b293d3dva2tra293d/93////////////////9/f3//// +////9/////////////93d2tva2tvd/////f3//////////////////////9vd//r7/f//////3d3a2tva2trb293d3f//////3d3///////39/f//3f//3f/9/f///////////93b29vb2///////////////////////////3d3d3dvd//r6+////93d293 +d3dvb29vd3d3d3d3//////////////////////////////f/////////////////b293d3f///////////////////////////93d//39/////93d3d3//93d29vb29vb2/////////////////////////////////////////3////d293b293d/////// +/////////////////////3dvd///9/f//////////3d3b29vb3d3d3f///93d////////////////////3d3///3////////////d/93d3d3/////////////////////////////3d3d3f///f///93d3d3/////3f/d3d3b293//////////////////// +///////////3//93d/////////93d3d3d3d3////////////////////////////d3f///////93/////////3d3b29vd3f///////////////////////////93d/////////////////93d293d///////////d/////////////////93d293//////// +////////d///d3d3d/////////////////////////////////////////////////93/3d3////////////////////////////////d3d3//////93d///////////d3d3d3d3//////////////////////////////////////////////////93d3f/ +////////////////////////////d3d3d/////////////////93d3d3d///////////////////////////////////////////////////////////////////////////////////////d3d3d///////////////////d3d3d3f///////////////// +/////////////////////////////////////////////////////////////////////3d3d////////////////////3d3d3d3//////////////////////////////////////////////////////////////////////////////////////93d/// +/////////////////3d3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////LnNuZAAAACAAAHDqAAAAAQAAH0AAAAABAAAA +AAAAAADT087My8rM1W9369/j493b4+tvVVFVZ3djXUpVVVlfa2v/39/Z19vb3ePj5+/n3dvNxsLCwL+/wMXIyMzf93dnVVNVTktGQkNAPz9ERUlKV+/r7+/fzczLyMjAv7/Bw8TGycvOztXn/1dIQj89PT9DSU5TWV1j/+PbzsnLysjJxsPDwr/CxMPHy8/P +19/n19XfX1lTTElKS0pJSkpNU1FbZ//r3dfT0dXV19/3Y+u/s7vFy9t358SysLnMa0U/S+/HydtOOTIxOERv901BOTQ3R93Au8TX91X3x7qurrW91V9j6761uMF3PzUzOU3f72tKPDk9Tc67u8TdTkZT1bmytL3Ob0xjzcG3u9VnQz5La8a9xt9KOTc7TNnE +12dIOTg/a8C4uslnQ0NO17qztsLfZ1nTubCtssTdS0FP/8W+3Vc9MDA5R+fjVUI3Mjg/27u3vc13T1Xbvqumsr/rXVfvwbi5yF9HNzU9T//vSjs1LzhI97++1e9LRE3rvLCxt8brX+/Eta6wvttJPkR3v7m6zk05NThH3czNU0A9PTdZ9+fLXe/rY8XTvb/R +003Z49Ovsa2z3ds+Tc3ArbnESzUwKj13zbp3RCwpLCtVysS5X2M7O+PZr6mvrtPdT1W4tq2vx9c2RENOw9vbUTk2KjlE373bzk88Y0PIv7y41873U7/CtbHCwU9VT1XFxL7XXXc6U3dfu+//SjM4NE3Oz8JPTDk1TOe4rrm9WVFDTMG4rqi2vv9NS//AtLS7 +40QuNTtDz8xnTjMwLTFBY9PJ499V793Gtre4usfByru8v71jd1dL2efOzU4/MTAwP3fby1lBPzI7S9uytrrMWUo+/7+vqKy250tLRdO6urHPbz46TlXVvtPRSDw1PU1Z2e9OSTlFSO+7yMfTY2d3xrq0ssDD/+vDxa+wubxMRDk+2efEyk45Ky0uPPdj9z84 +Ni5EZ8KqtbfK/+vrvq2tp7fEQklnVcG7x8A/OS4zSknn/09ONkA9XcbLwdln90nN0cCxysbbX8nZvbjDy0pKOEjOybW5z+c0OTdEv8u/3UQ1KjI767a9u2NNQjrbvLWntbfRW9vfvK+xrb/RPUBTRtnvU/c1OjQ2TD9KQTo/NUlbzrbDvtXXxcqwrrCvzNVM +V8fKubvNTTYzLUDvd79ZRjQpMjZjssa63Ug9PGfPuKu6u19vXV23tLGu1Wc7RFfjvru+x0pKOE/X78ZXTkMzQDpM2WPvS0lNVc7HubfEyVPPvr2ssLG562tM37vBt8xrNy4zMU3NXWs1MCkoNDz3uMq/b1NP77+yq6iztm/Zzcu3u728T0g5QVVb3VVTPjM8 +OVfn/91GUU9Lxsy8uc3rRlHdzLextMHdWT1d09O3v8rjRkVD777HvN9OMjI4Om/L99k/PDQ4W9e9sr+763ffxLWwray9wl3Xx8+5xszNOj80O0tJUzw4MS46OlN3TndDWd/ZtbKwr77C6866ua+uu9NMRDdP093FW0g5LDEyQs3/11M8NDVHY7+xurxrU1VO +w723rL3C92PO177ByMRNW1njwsq+71VON0VJTs9XTzcyODRJ3cm+19dCTefTtKyvrsDF/+O5tq6tvMZFRTpF2e93WTo1KC4vNU9ISkQ0Oj53w7qtr7vJ27+/sa6xr8jrVU7PzsDKXU0yNj0+9/fjRDo5MkBv973FxWtKW2/NtsC8zdFHU9nJt7S+wEpKP1O+ +u7e1zGs4QEFZzdXjVTUyLTxDTcnr/19Aa+/EubWuwcXIyLS2rrK7u/9f71/J3+dLNzUtLz0/Z0tBMy4yOFG+vrG8vs1nxLiuqa+vztVRX8HAwLlvVzM4NTlnd2PnOTYsND1Lycrr40JRTc28vrbB31tNzMi2sLi451ldTsLBurvP0UxJ32PI391XOjkyNE5L +71dLOTVAVdm1u7fFzGPru7KtqK+z6+vv17q2wMZFPiswMjVNST4/LC4qNEZdwMvVz1vFwrOusq+2zMrZvLy3t83bRD5RTN/rb008OjU6U0rjY2NNOUdVz7q6t8/fRkH31cSzubrZb05Rz72+uL/MSEpra8G7y9VAPTU6RD5XWUE+Mjg/Z87LvcHV0+e+tLKt +s7W5zsG+vbK1uetJNjI7P0pRPzwsLS4ySF932/9VPlnIu7CqrrLCx+fAuLe0t8fvP0lGXc/f91E5Mi8+P1FrSkM2ND1F08m/vdX/X1PRxLm/w8hvd87FuLe4zedjSffIwre9v18/OzxI1/f3S0AtLzU8V8vRyGdVRWu/ubSstLnLxr+4r66xtMjvRUtGSFdE +OTQqLS82PERJQjs8PFPPurW2tb7JwcSxra+2wcz/Tdnby8fMX0I7OTx3Z29nSjwzNz1H1dvGx9lfY+vX2cLLx/fv79vJw8i6w8rT39PXysbZxef3/1dNRktIP0k7Pz9EPT5LUU7f68q9vL/CvLq/t7ezsbi3wMjM28tXTko9OTExNjM7NjdDP0BHTf9ny8rD +ubq0tbe1vrW4xLzGwszd90z/W0dZSldDREk5Qjk4Rz1LSUlrTGfj3cDMydXVz//d29nAy72/wMPTy9fVv8i+zdfTd+tRTudVS0JAQTxBPjtXSUpTXePdxcG+t766u7e3urC5vLW9ucff70dJOzU8NzgvLzIwNjk7T0xda/fT18i7uK+zs7a7w8jAwL66ztNv +V05JWU9P61FPRD4+PEFCS29VTVNf6+PJxc7E2+dv69/Xz8vIvMLEzs7V3czPz8LKzf9VS0VLREpXSkk/Ozk6QUVN09fKycvPxbq5uLK2tbq+xsW7u72+y2tHPzY2My42d1M9NzEsLjv/s7LKxmdNa7+rqKitum9Ob8W1r7jNXTsxO1vbxdNIQTAuNTtn3/9X +OzI5QtO4sb/Kdzk/XcyxsrrNb0VE/7eurLfMTj5FZ7+ztcVVPSwuPUzOxVNEMCouSdG8tsTIV+vbvauqrLe9WePCuKirrsxGMyo4O+/ZRTQjJCMtRee1/182Lzt3rqiirLvJPEvjsaOhr9VMKDA6a6ysrVk6JiQ0R7KvvGsvKSQwW7Cnr7hAPTI52bustbpd +O0VB2baqtLrCOFFJ2bq3tu9fLzI8PdVRY0U5Ly1BRM3Mz87j1/e5r62yvLzfycu8rrC10c9OR/dK51M7OS8tKkBDTuc/RTpBP3e1sq68wM/Xv7irq6y7a289Vde6tMr3NDMuOPfMs8dILSgoLVXMs7d3Vy4wO9mvp67Nay8uOF+tp6W01zwuP12wp6ev1zwr +MkTJt7fNNi8mJjJAwMrFXTc6PGO8pqirr1vvZ9WwqKavtE1CTVW/vMBMPickKyw+R05BOzcrO0jfuLi5xsZrx7SvqrCwxtffU83Ew9PbSztVTOvR2+9OSjM/RkX3T0dBTUFdvsO4yHdHRFtvtra6y19nR+vItqyzwUtEN03ZwK27/z0rJy1AXbnGUTgqKSpP +uKeisbtIPkzNraiirb9CNT5Xta2ruVE7JiovPd/dUzUvJyw0V7W2tNNPR0XKsqOjq7FVY1nNtqyux+8vMjQ9zb6461U3Ljg5V9/NSUc7LUFEz7u4uff/OkHjybnDwV3Z9++/ure+vVnvyeO+vcRjWz0yS0j/50E4LTErRd/ZuczZZ1vfuKmmqLPGa1Xjv6yn +rcJVOy09PeO+b0osJR8kNE23vdtDMS8127eqorC8W1VPva+oprjXPjU3W8S8s91rOy44QL67vs46MSkwPsC2u71DPjw/17mvuLtDPD5Jwq6psLhnOEZFx7uwtdt3Lzg5PdPO30Q9Ki02O9nMxd3f71vMu62wsLnMyP/FvLe5x8xGY2tryl1GNzgrMkA/WVNH +Ojo5RMC9trjH1ffvy6ypq67E2UFXTs6wucVZOyw1RHe1uMNXNSorOUq6tM9bNS8vU8uvqrzfODY0X72yqbO/7zpI47uvrLfRWzI4Pdm9ur5ENSkrMEXLyMVLPTg3Vb6rqqqz09Ndzrqtq6+4/0xESOvDuc3jOCwtKjVEa1NIQC43OkrRvbvOyevrxcKzs6++ +yMPdxsrHx9NrPltZZ83T3UlPPD/3W99vTzs6NzrPxr23z+dHTD/3uLixvdNLVf/nr66vu3c/ND9IwLS+zj8zKzE8Z77G/zwzLTRv3bGst75NTlXGs6yossBKPUNfurSuvE86LTA0Z9fX7zQvKS4707m6ulVDPTzjw6ioq693X0Zrvq6qsbpCNzg2d8W3vsxB +Lzc1T9nCyk9DMDM5Rt3EuevnT0JvWcjGv8df1WPNu7e3vb1P5+Njw8XIa1M1O0hB42tZRjkuLEpRybvJzPfvTL+urqmvuMrn/8uzsrK+3Vk3PkD/zv9INC0nLzNDytvnQToxOu/Pr7C6x1VZV7yzraq9yFM/R9G8u7HbTjowOlfEu7nfQDErNT3RvLm9UUE0 +O2+8rrOzXTw8PNu5rKuwxUdIQGPBuLjJdzc4OD5Xz81RVzU0Oz1j2cPRb1tI18y3tLi519X/zry7u7/TRFFbY8vP0VtBLC06P29v71dFOjNd58q5w8t3X0nHtrSutcLZWVnMvLe6yOdKPD5Byr2/ykk4MTc8/8TO6z82MDpvxrS1v188Nzznuq+uu8xVRF2+ +t66uxfc1MDdEzsK82z8sKi8928i/0UU9ND7ZtayqrctrV+u+sKurst9NP0jdx7q+z1kuMC0yRndZRUEvODxE38fC21s/Q+PPubS1vMzvZ7+8ube/50lVT/fR18vrTjo8S13b7/dVQzQ4Z/+/usbRb01Az8W/uMLMWU9Zz7OysbrTSz0+RcjBwM5INzE1Ot+/ +yddAOC45U8W2t7zjSz5RxrisrrrEST1K37yysL73ODM1SNnKyFU/Lis2TNPLv8NVPjQ9b8K5trTXZ2Nvybuvr7fDV09HX8i7xc3vPD8/Rd/V11lMNjQ7Q3fT08znTElnb9PGy83Xd2PJxMG5uL7J2Wtv91dvd2NKQkJBSEJIZ1VGP0VFUWfvz8DGzcbFwby7 +uLW5vL/FzcrOzL/I1+9nRUBCPkJGQz5CPjpASlFb//9jUUhZZ+vMv7q7wNPZxsrHvrzF2eNXVVVV993Zd1dMREM/TP/va1dPT2Nn58W+xd3j72/j38/DvsXGytHNysTGzt1rVURGWWfj/2dKSkA9SE9ra+9VTk1N69HPxcXGz9130cPJwsDA3+//b9vO1d93 +Uz47ODznwMZbRjQ2OmO9u8rnUzc5WcO1rbG6zE9L0cC2sLi+Yz06V93Kv83rRzQzOF3v0+dZPTg/Tc29u7/vST9L38C5ub3Ob1F3wLqyu9NTPDY6U9vIy1FGMTQ9SO/T02dbNj1HZ7u7t7XDyl3JvrewvLvT9+Pju7/ByFVAMTtf587vQjkuMDdXw7y+UT42 +Kz9Vy662u+NMPj69r6ututk1PENZuba4zEA1LTlTzLu87z8tNDNXwLixv8pMNUxXw7C5uNVdQ13KvLC3vchBSE9XzcrJ2U5EOknf69FTVz0yR0XnzN/dTlFGa8G8ubzTW0VM5760sb7bXz84S/fBt9tZOy42OVu+wL5ZSTAxP1nFusfGXVFH9721r7HAxW9b +68q+vsfdU0hDXdvdzElJPjRDSufG599ORkBI18O4vNX3RD5OzbKws71vQTlD28S2wv8/NTA0XcnIuGdNMzE2Ot+/xr/vST9j076vsrm9X2//zrS4ur3VY0zf48y+b2M7Njs+493fb0BBMj1jZ8rTXUU7PEPXtrWxv8xfQ//Ovq7Cw29FNzhdz72472cyNTk8 +28jKzFtNOk/Vzr28xtFOTVPTvcC8z9XdTsnAwLnO0UhBTkvOvb++WU41OFFdv81vRjQxMT/LvbS/2082PVvGsa6xyHdDOWfKt6u8wVs3MzJJ0cC390svMzpFzcLNxz84NDvvy7yzvcJra93Js7a6xm9fTtnPy7j/Z0o5QkFjzd1vQzsxPl/XurTO2UhISlu4 +uLi441M8SN/GtLbIbz85M0fn1b/P/0g4Qz9Xxt/XXT81Plvrx73Mx1lf2+O7uL2909lf47i8tbfNX0NPW9u8ytlBOjExQmfbvfdROTAzPWO8vcX/YzhFd8qvrre9Vz44SsW7srfTUTU6PmPFyMdMPzYxQ2/LuMjIXUFMZ8m5ub7T/z9O48aztr3BU0dIW8a9 +tsH/Rz1Ea9G5vMtJNC4uPmfbvN1dPjI4SNe3urfMYz1JY9Gzrbe3a09GVcfBubv/RDU4OknVb+tbPjw3SlVv0Vt3TE3X0bu4vcDV3XfPu723xdlvRlv30bzP50s6LzlN78zD72c6PD1jt7S2ueNKOUt3xrW3xOtGQT9vycm95048OklnzrzP204/OD5Nb9Hf +a009R0zvvLu+zfdLTXe/t7C2we9ZX+u8r7O3zko4O05nz8TdTDo0MD9j18bXZz4yPEDnt7q6xWtKS2PNvrbAxk1JUVnNwsXHUUI5PExd2e9vTDxCR2/KvrzV3V1J/9PBusfPX1Vn38O4uL7PYz5M/864t73GTT07S/fv2VVGODI1PP/M0c5XRj1Da8u9t8bG +/1/nxrq4s7nL60hf587B92NCNTk6Tevj40Q+MzVFWcK8xNFbTk/Zt7WwuMpXRU73xLS3ve9NNjdN98++32s7NzU73b29uMX/P1Fd27i4wsxIQj9bzsO8v+dGOkZJ48bFxdljTUTr18/XV006OT9H78vPZ01FQE/dx7u/w99Pa9/DsLO1u8NrWdPBvLfB00Q7 +Njxb5+PdSjsvND5M78zZ601BP2vNvbW6ye9HWV/KvL2/ylVEPk3rycf/WTo1PEL/x8jZW0tAS9PHvLjE/0lAR92+tLW+yFtDVefDtre7yV1CQuO9u7i/ZzUxMjZI3+/vSjkyNT9f0cDO2VdJU+fHuba3vcfv08K7t7vC00lFQ0vf1+NRQDUxOEVV193/RDw8 +Quu8urW6yF1O98/AtLm+z19FWf/TxMHZazs9P0vj0c/RWUxGWdnHvMDN40dFT9/Mx8bdW0tFXdXFxNXjW0VJWca7t7/jXz09TVnV21VFOjQ4P//jz9XjRT5Da9G6uba9y+fdx7q3rbO81WtOW9nNz8pdSTk7PENRV05dRTw+Q1Pn08vV0f/n18nEyszN729v +18/T3+tvSkVMTWtvX1NLSUZT3efT19frW2drd9Xbz8nK7+fXys7BysfDytPV0c/RxMPAydHdU01JQEU/Pz9BRD89PURTU11jb+/349XdyMa5tbq9wcLFz8DCyMnnb1lTQ0NVTU5KQTw6PUVHXVljb+Pnb9fCyb/CxMrR1+vRydHL1dXZb3dXWV1j519bU1lv +b93X48r/d+Pj/2v/b2ffX2fv59vr1+9n3d/b19vR2dHK2cjOz9//d01FPjtBQEpLSEZCR0tMWVnvydHV187Hwru6uLW7vsHGxc/GzNfT711TTVNMT0Y9REVGQ0RMSllnd9/by9HRyNfOz9vN29PT29n/3et3d1FZU01MSllRTf9dW11j/2vr//fdZ19n2dHd +yMvNxdPMzcS8x8PD0cvNx8fFvs3ZW0hHQkRCPkI/Pjs4RkZPT09ZV29r2cfNx769vcC6vL69v8HE0e9r42dTU1NMQ0VAPD5CREVHSUdbZ2/r08nGyMzLycnTz9HLxtHVzNn36+dvX///W2djXfd3a2vb0e/39+dnX1tVa/djZ+/3Z+/V2dnLy8/Z39XPyc/V +18mzuetfPzM2O0rX50hBMS42PPfDz9l3PztH1butrbW8zv/fw6+ur7rTU0BHW8q9yvdMOC82RWfXa01FNzRDW8O0ucHfTEdTyLe1uMf/PTtT57m2xGM+MC8668G3yVM2LTI967qtusx3NDVIY7+wvcjXR073u6+ts85vOzpfuaurrsFDMS40Uc3O51U4MTA1 +SGdjX0Q6Ok/VvK61zNFDQdfArqeossZVO0V3yb3Rd0w6NDpN1dXvPzctLDVdtrK7yE8+PEHRvK+0vsxTT2PRu73M01E6R3fZvLfdZ0gzOkvZu7O621c5Ok5fy8X/VUc+ScyzsLXOTz86P8ivqaq1008+OUTjwchvRjIyODhOyFdDOiwtNkrGr67Cz0A6Sve1 +qaissMN348nEu8FnW00+U8nBwvc5MCsqM0fHurzHUT5DROu8uL7Nd0vnyr6vts9ONS00RsmxrsNbNSssNkfTusDM2UdBb+PNyW9TRT9Vw7Kur73RTEBHb7yurrK4329vY8/F21NFOThHX93PUTcwKis4Ucq1utlfPzZH276vr7e7w9nIuLK1w+tHODhGzbS2 +v1cxKSksO+fEws1TPDxFU8m+ydNfTnfEuLGxw/9INT1b2bSuvs9bOTY9U9XF1fdZUVPZvrzHVzw0MjnrtK6wv103Mzpbuq6stb7dTWvRw7e4z2c6OEdV073dSDImJjA6a7u7zlc7NjhG0bu7vr/DxLqvrK28/0tGS+e2ra69XzssKzQ/3cPPd0g3PE33ysrj +d0Y8d8O1q628WzgtMkPMsay02z80MDZBX9l3U0tFSd+/vMVvPzg3P+e6ra+8y0U5Pk/CsrC0ut/318W8t77TVz08X8C6t79KLyYlKzrZvrrVSzoyN0Xvv77P52/rybmsqrS/XT0+T8qvrbDBTjEtLzxv1d3vRjg5P1Pv32dNPzxHzravrrzjRTY9Wc61rrrI +40FFSWfKzfdTPj5P17m0xO9AMi41TLyvsLz/OjMzQ9O+t7jA22vZwry3ucjdTUnnv7ivu2c9LCovM0XZ3VtJODY5QUVRr2tOUWfOtKqqtMlbR0fjta2rsL5NPDc/d8/L31tENTtT783MX0k3M0X3va+ss81DNjtN37qyuM1bRkRKXdvjT0E5OkNfxrvEZz04 +NTtrxLa5w89JPkdXzb3Bxs9r68+5tLS+yls+Tdu4rq2xy0AtLTI+d9HRWz01NTtEY8zrTEM8RefDsa62wv9ISvfDr62yuddGPUJrz9fbXz07P1Hn2WdLPi8vO++/trXCZ0A6R2/RubXA011K99XKu8FbRzw+U9u7t7/fPzQyOFe+tLjHWTs2OUnOxsbKX0hP +4762tLvHW0RNyLavrLHDbzk5QEVn029LOzE1O0hV/1k+Nzg9VcO0tr7bR0JL57asrLC961FNZ8i9vMjvSTlBXdnAy2dMNC44Rte4srnMRzlCVdu7t73MXUhR48/Exe9DODc+Z8S/x1U7NTM7W8y8vMjnRj5FWcm/zttfQ03bwba1vcdXPkrnvq6qrbjfPDxM +/87BxWdANzQ7RVfdY0M5NTpXzL23xGdJP0Vnx7SytbrRX13/yL3Dze9KQUvrxsXTW0AvLTdO0b28y107NjtZ0b+4xedPSG/LxLq4zl9APUZvv7i3v1E2MTM5yLy7wttPQUJJ48zR31c9QVPXvLjB1WNIQWvAuK6vtL1nS2Pjyb6/0088OD9TZ19VQzMuMjlX +w7m81UY1Nj9vu7SzutVnW+fKvba/yutDRm/Nu7rMVT80NkNdxrzGz2M/Q1Hr0cLH23dPXdHCwsfPXT8+Rl/XzcDKUT82NjxT483Ob1FHUf/Xw89vXUVDT+u+uL7Haz89R+fCtrO1u9Hn58zJycLJ71NPW3f342NEOTc3PVF31cnTa0pIRkrn1c3Gys7Oy8XC +ytXbb11308bBydfrSTw9TFNZX2v3WU9XX11VXVtZW1fXw8fNy87jW1vv38/Ry8XN519VTUpMUVVfd9vX5+fnXVFbS09r79/V2dvZ71dfb3ff2ce+vr+6vcXR1+vn793OyONfWU0+OTk/RUdTW2dfY2tbV1tXY/f33cjEycjJ09nva+fVzsvKzMzbY1tMTFtn +Z+vb4+ff92vv//9vb+/b08/TzuNvW1dfa2v31+93Z1tTT0xJSktKV//f3dvn43dXX11d69HT09tvb/9fXffr39PTx8G/wcHCx9Pn/+fX2dfN62NbRj49PkVVY11v929vZ1tvb1lf49XOys/LxtHf3+Pv19Xdzs/d29t3V01JS01NW9v/d+drVVNKT2vn79fN +2d3f7+fj/+fb3+fZ29nX3W9jTEVKT1fv3ffj929jZ11nZ2/r5/fv29vj42tn92/jzsHCv7y/xsvO0dPV19njb2NdX1VGP0FCQkVNWXfZ4+tnTExVX+fTzc3V/2t338O/yNv/UU9ryL68zWNJP0RZ18bDy9tVTFPbxr3G3WdCQ093xb7P71FAPUVdzcDF2Vc+ +Oj1N387L71dIP0vVyL/C2VlNT0PVzNXJX29MTNt3wczOy1vT19O5urfF/1k6TePOtrzPPjY1LkfbwLfP20E6Pz/NwL6+XW89Pm/3uri/wEdRP0zAvbe711kyPT//vsnD2Uw/NU5Zyr/bzEtCW0/NysfMVV8/S9PjwcfT20pXS1HN681rTU0+a+vOv3fnSENL +Ssu9vsBXXTk8TPe5uL7OV2NF58S7srfAyUdLRv/Au73XXTsvPkBnys7VZ0k+PE9rzcbR61NNY1vZ2d3vX19d58nNy9P/WU933cvAzN9fTUxrzcG9wv9rS0lb3ca1wNNNQjM4SdXAt8pbPDo3Q9/FxMFrQDc+Tt3Nw83vU0dI983CwsTXTkdGRHfNzNXfXVf3 +18vCyNvnY+PJwry9xGtTQEFMz8vE2Wc/Pz1V0b7DzF9VP0JXz7660W8/Oz1N07u4vs1RPUNJ47vEw8lJQD1R69XC53dPRFNrycHLyFdRS0X/78nKd/dOUUZr1dXOX09HTPfMwb7V/0M7Pk/Lubm82U86Oj9vvL3I209DPVHRvbS7yVNLS2/EuLa0yu8+QEVX +3cbO01lEPEdj39HR/2NPW2/Ryc//T0FCSXfXys/jS0RHV+PDw8v3V0VO2726tMTfS0E+58WwtrrRWTk9Qt/Bu89rQDk4QGfNxctdOj5BR9m8vb/dRjg+UdnAu8HJ/1FEWffV0+tnVUpjb9fI129RTVP3yr+9w833SVv/zb7AxetMQkJjx8LB1f8+OUFfybO5 +wl9FNDdC78u4xuNIRD1NY8zFxOtTQVFrz73ByNNLRUNf0cXBy9dXU1Vdzs7R91NOTFvn1ct3Uz49RF3Pv8XGY1M/RWfVyL/MzUtISF/NwMXnZ0M5R0zRubzE70o9PGfIu7S5zFVOTE/Vx8S/32NGTWfvzcjna05LTG/MxcjXb1FHTU1v22ddTENKUf/Rz91R +TT9I58a6t77OW1NN47y6uMzIV0VPW9O+vsLvUz48Stu/v89rPzU3OUnXzMXTVT5ATFvOwszPa1NPd8zIx85dTUdFT9vHzM5rTENIW9/IvMvOb05n387AxcTvW01X18K9wM3vQkFDb8LAw8b/ST5JX9/Gxt1KPz4+XdXIv91XPT1HSdO7xMHZUT9O68+9usbM +W01NX8rOyspdV0ZHZ9/IzedMPz5EVePfze9rSkn339HKzttTT1V3x72+0fdNPEVT/77Cy2tLPjxP08u8wc9VTlVfzL7Fv+NXQ0xvzsG7x8tjSkJd1c7ByNn/Sk9X/8zr3Vs/QkZNZ9/RX0w9PElrzcvJyGNMTV/Jv7i6wNFvW/fPu7y93WNEPkpd37vP2Uw9 +NDdHd9/I6088RUVryMXMxmtTRmvXwr290f9NTUvf08/O/05GQU5T3c/fd1dKb+PKx8Tf90lNX8rGvsPBd1VLWee8v73Pd0RJUd/BusXjS0E5RGPXycXrRDs7P2PVw8TbXUVBT1vPvcbF2Wdjd8zExcLvd0xKb9vO23dvQERJV+vn319HPjxR78vEzNVRRktj +wcG8wdPrS0Vn977Aw9tNPj9D/+u/yd9NSENO2cHBvNVbQkdT3by7ychfT0hjzsq9vczPSFNr38LKxcpPS0FVX2/jXVFAOkVHb+fT2VVKR03OzcHKy3dbVd3Ds7e2x+NTSFvRyrfE20M9Nj5d69HJY0s3OTpF68/J2UE9PkNExri6u8Lb29vEvby6xM93T1v3 +4+t3Z0VFSFf359l3WU1FTuvXyszRa0hGV9vEwcPL209MWeu/vb/Ld0ZGUWvZv8fvSj05PU3b18jfWUU+P1njxc3K51tLY+PGvLm/xmtfY9vLz8rGb1VFS1Nv//d3T0BJSFNb/+9XTFFX0c7JyszjX1P/17+/w9PnW01Rb+vG1/dRRkNHV9vZydH/V1fdY2Pd +68jXb1lXb/ffzc3AztfV4+fvzMjMxdXT92NdV+NnTndOTUJDRURRUW/XW11OW19d18/EvcrJ29fTzb+/ur7P219XV0/rb//3Skc9PUFMa09bY0xIPlVn38DNxcd3X2Pf08a6wcTRb/9fb2//zF9jVUNNSVNfb+tb/19Xa1/n3dnM3dHfa//vzs/Tyc/Jzd/X +18zbz8jZ0d3vd2dnV1ldSlFXTExKTVFfWU1jZ2N3b9/b1dHRyM7XzMrHxsrK1dvn/+N3Y11dXU5PTklMS0tJS0xGT11bXf/X1c/P49Pb49nOyMvLzNPX42NvXf937/9jW1FPWVNjd9vna3djV19r59XO2+//d2Pj08XJxcfT19ffzszFys3V629ZV1tOUUhF +R0FCQ0RRSldPUVdv39ndzdHOy8XDw72/xL/Ex83NytnX91VTSUpFU1dKR0c+OztT5+NrUUpJSuvCub3K12td58W6t7bE11lHWe/Rw9f/Qzw6PVfV2d1bRTxBS2/GwMrbWUdIU82/urzRb05Xb8a5tbrLd1NK59W/usfnRTg7PUzbzutNPjc4Pk3OxMfdTktL +V8i6tr7E42vny8K7v8TvX0tJZ9/Z21VEOjk/Sm/d/0g+OzxVzbq5xndTOv/bua21t29JOjvXxq+zwlU0NDJT37m10Us0MzJPzL2122M7OD5Zvbmw0f9MM05dua6srd9vOD/jvK2xsV0+Ly07U77CzEYwMCo6Ssq6w908QjxTzbustrXbWW9Ovrasr8DRP1E+ +T9nJy11LMjQ5OElM50tXSTpMSevfxMfXw13M0c7Hy7/NvsbRxWPjVetv19dbaz5APkJV68Vv20s6QjZMTM+81b9HTz1E0cGutLrZSV1DxLusrbnNPT86Y8e7s99nNy4uOWfVuOtRQCs4Ndm6ra/v9zU6XcSuraq/0z81S+u0srTRPjwqNjz3vcHdNjQrL0Bn +tLu3/z5ANWvKr623vD9XP0zGsq24vj88STvZz7jJ0WMxQDRCa8rD79E4Qkc71dm80c9rPe9IzMm8u8u+487Pz7/Iu+PH0Vt3RVk/U0w/3zpKPjw8NV9CxMXdy0z/RtnOuK64td3f/++8wa66vtU9PTNKU8jKUVkuMiwyW+u613c9Lzs5wL+vsMT3PUJJvrCu +qr/NQjhDS7m2r79LOCs3N9HIvcE+PjEyP+e5wrhNSEU0Tm+5u7jIUWtAb9e5sLW032NTR9XNt8jKXztENktMb91KWTU9P0X348Nb0/9P2d2/wbXKy7/vxcu/xMbGTtdNU11NV0BTN0trPltCTj9GS03M2cfbd2tL2WO8uLq73+dHZ9/Hsbu/d04+PF9jv8LV +SDg4L19VyLvRYzs4M1fNwrDGzU08PT+9u6yuwdlBTVG9trSw2003MjlPy93ATTk0LDY808q9z0tHOE1dvLGzstPnV1/FuK2ztddNU0Fn68TTZ0IzODQ/S2fvSUxNQkpN49W/99//RufryMi5vd3DX+fRzcnRyE/P609jU2NJYztd401rS1NDT0hDydXO019V +SutLwr3Dvtv/Su/RvrCyuM/vRkXrY76+0U08Ni5HQ9/E/2s6NjE93cyyusZdR0lOvLasrL3ZS0pLxby2sd1LNzEwQv/nv11AMy0yNdvHubtdTTpBTMC2t7DP411M78a2urfXTVVDY+vDx81bOj46Rk3Zy2d3PD5DQHfnvtfd/0dnUdXOv73OwN/ZzMm+vrjX +wc9ba0xfSnc/RF08Rj49OkRKPNV3/9lId13L57SvubXEyPfOy8mvtr3ZVz87VUnM1V1RNDArND5Xx9v3QDg2O9/JsrK9201OTMG6r6q5yldDQOvEvrLMd0E2Nznj18DJSz4vNTr3z8++Tkg9PE3dvsi641NVR93FtrK0xF3rY8/DubrM0Ts6PDtP/8dfSjgv +OjhP58XN73dCWf/LvLWzxb/f/8rGvLy439v/SVlNWU1bRDpKOD9GQUVGVTrd1/fN79lj0WPft8G7x8vj4+d3u8LAw2NMRVlOyMTV3UQ8Mz5Ga8Xb10U7OTpbWby9yudHQ0PRy7etvL7vX1Pvu7ivuNdHOTk9a1/T3UU7LzE0Xf/vxU9MQkVjwra2sMPT2f/I +vrGxsbljY0pT58HK4281MTMzPE/nTUs3Lzw5V+u/w8/rS2/bx720tMK91ePMz8jJwN1rb05nW19r309FZ0dNTUtPV189UW9R42trVf9KV8nZyc7R39XP2be7u7nG3XfjVcrG7+tKQTY+PT1vS1dEPDo+U1PCxsfE92fvyce3srm7y9vrz8PIvcXZTD8+PUk+ +TE5DRzg5O01OT81n73ddd+PK27y9zMjTy8vDzse749fjb2/b12PJX01ZSUZFY0x3W0VVRUlHV2930Wfv91tv3cjOvrzHvszVzcO9w7zH02dHQkdRRFdPRUM6ODlIP07bW+9jX2PRyM63u73AxsjJvsO4tr/C2+trZ09Lb0lIPDk4OD44RkdFTUZOTln338rR +ycjMysvDx76+v73FztXZ72vj59vva19jVUdRSlVVT1tTU0lPU0tfVV3j72dX/1/r39HGvr7IxMfLwcO/vb7T/1NGS0ZOVVdPPD85OUFFVXfrd1lbVXfbyL27vcfM08/Cwb62uMfO/1VjWV1jb0Q6OzU6PERTV11GSUpJZ+vMx8jT49vrzcTBvb2+zdXX3c/V +ztXZa09RS1VVY19VTUNJQ0hXXWdrd0hMV1H349PLysrn1dHNw766vb7L1ePr3f93Z11FPT48QENJU01TRklGT2Pvx8bGyNHV3cfCvbm6usXGzM7KysTLz19MQT09PEJAREM8PTk/QU3/d+Nj7+//09PHwcLHy8XKwcXFvsbXd/dd7/f32fdnR0hDQVVT/3dZ +TUNNRVljZ9n/b1dVVWvOyr/BxcfMycu/v7/AwL/Xa2dBOj5NX19AOzcyO0Bbzs/ZUUxDTtvAtLW703dZZ8e3rK63b1VKPNnHvrjnQy0rKzJP58PjSD4tNjpVvLi2xFNJPU/Rua6vtstd613Lv8K42edJPU5K3dffZz9HOENTU89n/1lGW0tb09fO3f/nd8rH +wb7Nxt/Kv825x85nQUo6TFtd70M/NTM+P+vL1eNJTEdMzMC4s8PJX2fNybe0srvP00jjyMi8ytdHOzkwPEVRWUE9NDc/Sffb1+9TWV9vx8LIvdHTa+PDv7a0v91TWUjfyMa+2V9ANjs+Y8vJ00s9NjY+/8a6xONAPkE+3by5scDMXVHZxrixtrzZd0BITl3j +a1tEOTs4PEhOWVVKS0xd99fK18vb08nIu729vt/O18e9vLq/00xBSEhbZ2NXPDg1MjpIXcrva0hAS0r3yL66x8hZ49PXvLm5us3fT2/Z283Ob1lISUdTW09fR0BEPV3v689nY0lJb/fFvsLLZ29N18S/srG7zk1OS//FxsfdRTovMjpMz8/3RDs8Mkfnzra/ +yPdX///Ct7Owu8Rfb9fLu7i6v/9fTUZfWV9bQjwyODo7S0hZTEVNR+fd2cV30e/vysu+u7vC2dP31crDwMbnZ0JGSl/O2d9fPj41O0ZryNfbS0NMP3fby73O0V9b29XDu7u4vszbzcbJxM1nY0JFSEZRRUxAOD04RV9f31dZQ1H/37y3urzb713bxLu1s77P +T1VX2b68wutFPC42OkXj72NGODk1RWfKuMDXT0tfZ8S8uLXDzuNrz8m9u8LRTk5PS+ff22dJSTlCRURfT/dnQU1IY87Cv8/fTVFv2cW4vL7jb05dyry6t8r/Ojw8Ru/j61k8PC85PUXb09P3Rk9H78u9tLa/zNnM2cG9u7rEzM/dz9vKzl93Q0VKP0k9QTo4 +QDtNZ1XfUVtLTffNwbnCyV9vV928tra2yNFIU1Nrv8LI0Uo/NkBKX8/fX0A4PTlV38+/02tORGNvxLy9vdvf7+vEvri1wsZna1tV0d/fXz48NDpKTu9VTjs5PkJnx8O+zdtPV8u/uLO5v/9vW/e+u7u4zd89RkRJ7/93Wzs5MTs+TNvjb1NJU0znzca+y9Xr +a87OvbvCv+Pn2+vK08vZW11GTllV/05VRDtAQ0/r69Nrd05P39PHvsjIb2dZa8TCv7zO2Vdv/9nIzttnQT82QkdM/1tNQTo/QOPT08Pnb2P30de5tb2+3+/n2726trnO60pNd+vIy+dEODcxPFVX91lJNzdAS9PBxcP/Z0pP0cO+tLu9b29nd8a+vbzTYz9H +T1fRzedZPTo1P0pj1+ddTUNVTtnNx77V3+NnzMrBvMPC0dvLzsHGy89PT0VCU09fSEo/Nz1BSWtf91VTSUR3ysC6vL3Z5+/jwby9t8nNY2vn48nH0dFMQTg/R0v3X0tCOT48TNnZzdtXU0dIXbirvb/P9+vfwLy+vNvrUUlv79XP31M9PjpBV1/db1dEOkhV +68HEws5vVUjnyMC6u8ZXTl9XyL69vNlbQT5ISGPdd19CPTc8S07r3V9fRFVrd8XHvr7PytPKv8G7w8bXd87NxcfOzlNRS0VfU11jTEM1O0NGX/frX0tPP13f2cLHydNn52/Ovr68w85nXefjz8rV401IQ0BdU1trSEY8PUhj2d3T51NbWdfFwbvBxdNj3c/C +uru6yv9XTmfn09N3WTo6PD1PW2/3RkA3PE93z8bI2Wd3Wc6/vLi8yd9b993Gur+/01tGS19j499fVzw6PEFfW3fnTEc/S2fbyMnJ3V9r98rDv7nBz29b49XKxszZU0tHSltf73dTSjpBSEvn29PdWU9Hb87JwsfL3e/v98nHysfN1/9Z2f/n2f9nR0NDSl1M +VV9LRj5GTlnd/+fnXf/r08PAvMLG19vOzMHAwL7X5/9d3+fd42NOQUREQ05RVU5JSj1MVVfn/9/vb/f308vNx8fF19HO2c/Lzc/v/1tjY1VZWVVMREZDSk1JXV9nXVdja+PXz8rMysrIzNPFx8bGx8zPz9v35+9vXVlTS0xLREdLS0pKSUdIU1dfb+vd09nb +0czKx8nIyM3Tz8/RysvP2evvb2NfVVVdU0lHTkxMTVFRWVtbXff/Z/ff3dnNz9POy83LzM/NztPf3+vn429bV1dNS05OUVlTUVVXW2f39+ff2+vr49vPy83Pz9Xd49vZ0c/X33dfTlNbVV1jW05HRkNITU9fX1lTVVlV3c/PycrM0dPRz8a/wsHGy9HR0ePP +093rX1VNS01MZ19TT0pKR0lPVe9nZ/93b2vr09PLzM3L19vb1dHXztfd3W9dWVtTRlNOS0xISkhPXWff5/f3d/fv18zJw8nMyM7PzsnGysnP2dv/a2NvW1VbU01LSUlHS0tIW1NPWWdnWWvv79XRzsrP19/V0dXMyMjFztPb43df9/frb11VTVFLSVldX2NV +T0xVW2/j6+vd3+d359HMyMfP12dV/8rCztdrXVtj3+dVS0E4QFnfxb7M60w5PUlnxrq5y99VTGfTyb/A32dvZ+/Fu8DdRDk4OkbrwLnJWT40NDdE28TK01lIUVfrwr3G1VdOZ9HBta+4zWNBSffPv7q/b01BO0dn69v/SURCQ1vbxcp3STs8QFPItbS5zE5G +SU7RurrB0UxKVVvdwMhZQDQxPUrjwLzfUUQ2PVXjv7jEztVvZ9/LwMTV7+vrzb24vMXdQzs7PF/Hyc7XRzo8PkVr91tjRT5T283Bvt1PPTZD2761rbfPZz8/Tf/Ct77O71NKWWfn510+Pz9Dd769wM9KOTY5QtG7vLvGZ2t399fN2+v/U//Fvr293Uc8MzdM +78S8xOdNPjxDV9nCwvdbWVfrxsPI1U9ASU/ZuK+xvm8+Ojo+/8m/w9lPQkVFS2dfVU9CRF/dysLKa008PVf/w7K2vMr3U13n08G+zufj69/KydNdPzg4PVvGu7rHVzo2OD13ycDDze9VX+PRxcjna0ZK682+tr7VSzYyOklnw73RVUM8PUljz8jd/+vv48vA +xM5TRktX3bixsLnOVT9ASnfHwsbTVUZMUWPfZ09IOzpX18W6v99FNjI7Vcm3s7vZV0pKU//Nv8vf493bx8HG30U7OTtI67y4wONMOzc6SdvNycj3VW/f3czV62tLSFnEube0vl87MzpJ3cO4vetJPzxFT//Iz2dZXXfTxbzFZ0U7OkFdvrGxts5NPzxA68XC +wtFZS05d//9dTD85PVPRwr/G/z82NUVn07q2xuNTTF/rz8HD0f9348y8t7zCVzo4OD/Zu7a70Ug5ODlM0cfEzWNRV1vXzs/nW0dFX8u+t7XG7z82PERdyrzF41E/QURHWf9bTFNj3cO6u7/jRj07Rtu6s7K5119MRW/Tx8HF41lPY//b1WtRQTU7U+fFu8DZ +SDY3PEnrvrnE3VtOU1v/z8znY1/30765u8FjRT89R93GvsLXWUQ/QlXb69vfV0tv38/I2fdbPjtF2762srrZQzg9TG/DvLzTWUxIUVdv1W9JR0lV1cC6vNVVQD0/S8+9u7zOW05IT9vOzMnTX2/dzcrR71NANzlN3cjBwd9FNzZAUWPKwNV3V0pv5+PMzV9N +T2vPvrW0vNdKQz9I3b27vMdXRkI+WdHP1ddbS1P/z8zZ611FPUfnyb+6vtlRPEBVXdvBxdtdTU5ZWWPvW0M/RE33xL27yFFBQkZfw7i4vddRS0ZZysDAw9drV2/XxL/P4109O0df0cC+yf8+OD1HW9HGzfdTTFlnZ93XXUlLTmvJv76+20xGR1PRwbzAz19L +SEhX18/X31FHWW/Vw8n3WUA4Q13Ovrm8zk88Pkrvy769zWdPTv/v48/fTUZHSG/Rx8LOa0tDRV/TxMHD011RSEv319HNz2v/283ExMzfUT8/S93LwsLVTDw4Pktd08PbVUtEVevfzctjSkZJXc69u7vLU0JBRuu/ury+901HQ1fn2dPM/1Nb2cvJztdrQT1E +683HvsPdVz9FX/ffyMfdW01X99vf2/dCOT5DW8rDxs9OPDw/Ucq6ur3TV0xKW9nNz87ZZ1fjyL+9wc/vSD5K983CvL/fRj5DTl3vzM1rTk5d29XV2WdAPkRV58bAwetHQT5K/8zBwsrfX1lf48vR91tOQ07bw7q9x9tFNztH787AwMlbPj9O993TxN9TS1XZ +ysfBxmNIPENX28y/v+9RRURJXdfOzddfVU7nz83ba1dGT2PPvbi7xOtHQEZj2cfByeNOR0tn6+vbd0pBPk3by8bJ51U+Oj9O3c3DwdNZTU1T99HLyN1vZ+vRyMfL41NFSFvTw8C9w9tfSU1da+PR0/dVXW/v3+vrZ05ITmfZz8zO60tCP0NVa+/j3WdXV2N3 +///f92dr78/GyM7T905GU3fZz8rDw91r/3ddWWPd1/fnzszv7+//Y1tZb93r59nP62tjV1NNTFdn9//n299rW11bWWPr28/N1d/dd1Vba3ff3dPP0ePd1etdU1VbV1Nd29/v4+drW1ddb+/3383T3d/3b1dXXWdrb/fj3dv/Z/djXWvn4+Pd393Z/2NfY2Nr +7+PZ29PMz9vvY11bXV/v1dnZ1etdVU5VXWN3593nd2Nrd11VY29fXWNn693v6+trV1tv/+vb1czX//9nY2t32c7M087K19/f93dnZ2d3b2v/4/drY2Pr92f/7/f//2tva1NRVVtVX3dv7+fr92tbXf/d1dnZ19fvd+d3Z2/359vd08Xv20xVTUPRyMG+/9dH +SVFOyMXJvf/XSFH/XdvIzNFNSjk/SErP0dHLU04+Rmdjz8fPzll3R2PbRNPn68lZzOfdxtnI2/fnTetR/9f/zf/n3T5rS1fT78HF18tPd0pOZ0/P09/RSW9KT+9TzNvjyVHjVWPV78PRa2c9TT9N/8yutdX/Mjo5Rrmvt8dnOi49S824ucTrPT07d8e/udFd +PzhMW867x9tXPjpDd92/v8tHOUnr27jL02c/PD/fr7Ouw+c7NUB3uKq1vEI5LTFXzbyrzF80MTVLx7KyvFU7KTQ/Z7K0wMQ+My893ciuuc1XPUtNzLnIxlM+PD7Vxr2x71k9O1FjwLa/40U9N1m+xLDIbz4jNLusp66vzUUyLj1rwau7zDw0MTFrysmw/1c5 +M0VXx7TJxj48MEbKzbG7zdM4Skl3uMG9zk9APXf3xsBbUzs/WWu1uLnERT0wQM3GrrvOTTI1ON+6vbVfWT4xT+e9qr3GQzguO3fCr6/GzDM6P0i+u7m7V0I0Q2/dtsXdSzpEQdXBxLpnY0k632PMvWtvQT5FWcTKwFc+PzRN08ewwc1RNjU877a0rsTVPDdA +Xbmss7VnRDY5Z927r9FjNTI1RdG+sb9vSi9GQ1+5yMTjPj08Xd3HwGtdOkNvd7i6xMtHPzpOysW30fdBOExbxbfAxEg+N0LCw7i13VM2NDvbt7GvyWM/MErdyqq950M2MjRXzLy061EuOURVvLi8v0k9NEL3zbrAyt04SVHRvsPFXVNDRcbEvbrvWTY4QFe+ +u7jZUT00TtXIsb7HSzczOee4ubTXTS4vPF25rba5TkAzPWfXt7LNZzc8PnfDubfKX0U1T2vHtcbOVzg9O2vFvLnvXTw6Xe+6uczjPz4/Tr/BvNlGMi06Vc21ur5NOzA1/8W9rsnVPTY+Sb+tsbLjSzI8a8quqbzTODYyQdPBuLlnQDE9SNW8wsRjPz4599PF +vndfOzhMTcW6wMlRRDxVyMO0w99FND9O57a6ue9DLi5TzLuuuso8NzQ7y7q4s9f3Nj5KXbuwvM5IPzlj08m3yXdEMT5B773Dwv9CODVZ27663e86OEpVwLy7yVNIOUfJwLK0wk87PEBvwb230Wc6NEpr07a9wVk9NDn/wb231VcyNTtJw7e8vk8/N0n3yrm2 +ym88QUrbw76+11FAOFvnw7bHz1M5Pj/jwr2/b044Pl/Xu7vC40JAQVW7ubfBYzYtOU3jvL3BVz4xMU7dybbHzj04PUXRt7i87001TevNtK+7yD9BPl/Iv7m8Z0Y2Q0/Ov8bJWT1APuPNv73rXzs1SlfMvsDXTEA7SdvKt8HLZzpCVeu7vrvnTDMwSNnDt73I +QTo4PtnBvLXVVzg9SvfAtb3FT0M5a86/tLjLXzU+Pm/CwL/RRjs2TVnIvNPfQDlDSszLwc1OQjk92826u8BdQEBF5768t83jQjdOd824wcJTPTU3b8O7tsn/MTc6Rsi7vb9OPTBBY867uMbrQEdFzL69uc9dQjdja8S5w8dZPD9J28+9xvdROD5b773Cwuc/ +PDxRwbuzuslBNj5M376/vWdJNDVNZ9m8z3c9OjtL3b2/wetIM0tf2bi0vslHQj3nwL23vN9HOk5fwbrDykw8Ozzfyr2701U7OEhVzsK+304+OEnnz7vBxU88Slvdurq311kzNEjvy7m/zj89OT/jw8K+50w3QU7bw7rE20c+Of/NwLe8yv89TVfHvcC+1UU6 +Pl/nwcXbazo3P07Oyr3LTDs0OU3Mvr6+XUE/SOPDvbTH0UU+V+/JuL3GW0Y2Q1/Nwb7Pazk+Pk7LxszOSzszS1/Pv8TTUT1ETsK7u7fJXUM9Y9/Du8PRWz4+TtvKvc3rTTtDUffHxcTZSj4/UePLv7/HUURNZ9W/vcTjVz9CVd/Z0eNPQz4+WefN093/SD5J +W+POytHvV0pN48rIxr/XXVdd48zBzcbOT01VU+/b087bb1FVZ/9rVe/rV1tbY1lVXffdd2vZ1d3j59/N1d/bz2dVWVdjZ2/f2+9dT1VTUW/Vztv3U19bU1nZzdXf4/9nWWPTx8jTzs7vXffd2c3P2+9fSEhOY2fr3W9dT0lNTVVVa+tnX1trY2/d38zL29PX +09/f1d/K2dvR429bXedf6+dv91lPS1VbTG/db2tXVVFTX1fR09nT1d3vd9PTy8nX1+drVV3r69fR399dUU9R///f0e//X1NTWeN308vn4/9nb+/T28vM/9vn/2tj3e93W1VbUU9TU+tVV2ddZ1lbW1VnUWvfd9nb3ef/3+fNzdXJz9nvb9v/39PdzttvVWPv +X+/d9/9TTk1Td2Pj1/dnV1lfX+fjzcjX09vZ/2/Z49/3Y+9nXVVn52tnd2v3Z19ba2NT53dv929vXV9vb9nR2cTJ3WP/2d/Ixs3O22tVV2tj9+fr91tMRk1XT2/3Z1tNTUxTX1/Rz+Pb3evn2c7RyszXztPd///jd9/b39tvX05NWV/d2V1NRkNHW+fbzmtT +Tkxj58y9v9HdSGNj27u8ue9dPzpVX8DCwNtCRDxMb8W/zd09QD1K48+6x85XREtO08a0wsxnPk9Cd8a5t9nvNkI/QNXKvN3jPDhIOmvny93j2T1XR03rzsPbv//d22PXa8bPx8b3y1tXR1HR3bvN21VBQzpn98i+13c+PjhR78a0xMJNRT1E0cCussJ3Ozo1 +79e4s89vMzo2VcK/ttddNzE6Ssy8tdN3TDFGRcK4sbNnWTM9d8ivsbB3UTcyXd+4trtfOjwuP1nKub/jODguOlvdtLq+S0E9Nd/Er662zztPPVXEtrG/yTs/RD7n27zP11c6SjhGXc/db9U7V0lI/9W/97/d99FfyefI1crG/9VIY11Zd//D69VdSFVF/1HL +yufVSE89T9/NuMvFZ1NDQMvRtbvN1UJJPdnKxLnn/z06OUzNy7rrZ0ExOjjfzby9TU0vNj/jtrivze86NlPvsrKvu2dPMURTyLS2uWNJMjZIV7i9uu88Ni0/TL60usBATTtC58CvtLdbS009a2e9wMfOPUo6QVXZwt/MRE9NP2tZzW/ja0jrSd9v087dwuPL +3d3L58lbzcrTy2/RW+dZU81f41VZSURbQNPnW1lDRTpdScq+78xTd0jry8yzxMPVXVdTysq5w9vrPEQ8/8rBuXdbMzQ2PtHRvM9bOTE9PsC8t7PR3TtJT9OytK/BXzg0Pkq8u7i+UTwuO0HJu7q6SkMzN0TXu7u2X0tIOm9rube3u0pXPkn/xrjCwk1NTENr +d8bV21M+Tj5ZT+t3TFM7S0hb4+/HUd3vb9F3xse+zOvH98/V09Hb30vT3/fZ7+tRdz5r51X3UW9GU0tHyOPN1WNvW9fju7jDxGdVQlFjzL7O20tDOkBrz77L40c7OTrv576/4282OThdxLuvucpFQUNru7exttVCOT5Lwby4vV9CMzk8z8W/vU5EMTI4QMnH +u8lTRzpLb728uLp3b1Fj3765vr9ZSkhLX9/BytFLP0U9UUzX52tnPExER2fTyOvRd+vT68jEucrN2Wf3UXd31+9r11tvT1VZV99P29dvXUldR/9r/8Pb1V1fVVvV0be7yt9TUUnd27m3zdtFQDhT3cy4zONHODQ6W3fBz2tONDU0W8q6ssPbQD4/77q3rrfK +SD0/S8LDtbvjWTc7PmfMxb33TDc3PEzKyb3OU0Y8Tuu8uri592tLXevBvcXISUZARV1rwc/dVTtFP1Pvx8z3XzlBR0rnyL3T21NHd//NwLm/091XX/fd1cTHZ+tPU1VM7+/PX1NjRE9DSk9TV0/P62trW29329+7uMfJ3+dZ09nLucnN60s/SGtvv8nraz04 +NUZdz7/d/0A6N0Pvzbq7x/dLR07GwLe2ydFHPj1Vycm7xW9DNztFz83DvF9JOztH183LvWdMQkBTyL2+utdbUUz30bq7vslJSkJKd8a/ydFAPUA/TuvL3V9CNjs/TuPFyd9rR05j29G8uMjL62ff79fKvsvr31FjVV333+9Nd2dVWU1PZ1tFa9339///Z9tf +977AwcjRZ2/3Z8bDz89vSD5HSv/K1dtnSDxASVnNyttjTDw/V1/GvMbIb0tEY8y+tLrI70Y/SdvOw73jV0I6QHfj18RvTDw3Om/j3cbfX0k/S2/Cw7u62+9VWePBvr2541tVTFPXycnKd0RDQEZv193fXUBAQUZL38/bz2dV///vzLzAycxv5+tf99PT99N3 +V1tFSP//VdnXX2NNR1n3VXfL5+9jS1nf39m+xM/R/2fj19m/vdnvY05PX2fny+tXUUxATUZO61dPTktASVlb39fv2dvvZ9/MzsbHx8jT69nV3d/V7+P3XW9vW09jX19dVVdjWUtVWV/r/+fN2+//2dnJxszDydt3/3dn49nT2WNNS0tJU2vn23dOTUtDTv/n +393/W1NOXd3OyMHFzvdfW93OzcTD3VdOSlHv99/L50xJQ0NdW1ff/1dKRUZOa+/Jxc/3/2Nv18rGvL/T2+dn69XRxtH3X1tNV2Nr5+9dSEk/P1drd/fvX1NXTvfP0cjFx9Pj/+vP19PI0etfX1Nfd2Pf52NMT05ZX2P/3+tXV1dX93f/ys/X7933483RyMjN +2dvvd+/f0c/fZ11bTVFZY/dfU0pMP0NLT2drd2tXVU//39fLz83d7+/Px87Gyc//b19r193d099rTU1MV1ld/2dfSUxMWfdv29Hbd2fd3cjLycLN42vr79vV18n3XU5VT093Z+PrV0dJTUhj3+fZX1VJTFd3zczEzNnrX1tn2c7BtLnZTEA8Re/Iu7/fQDk2 +O2vXwsH/STU1OkzJwrjJ7z8+SF2/trW4z09MV//Fu7q990c/R1nVxMjPTz83PExb0cz3WUA/Q2vZxL/N11VT/9XFvb3L/09PW9/Iys3nTkRAVV/b1dtfQkVCWdnPzudjQ0NT68e/vsvvZ1dd18XFvdnfZ0zOzs3N628+SUFEzNHNb0Q5LzhE673HzUc7Ojhf +xLe0vstHPU5nurCyuW9ZNzxn57q2wc08OjI8/9G703c+Mjs/58O8utlXRT7/z7y1vcFTS1tRyMnCv2trQExdV8332V9ARkJv3dfRWVc/PVlrz8LP0V1NTU/Gwr271+NFSv/Mvb7G70lIO1Xj08rRXTo5Oj9f3c/NX0o9P1/jxr7JzVdZa//Hv7m7zudRa9nb +x8rVZ05MT3f///dJQD8/Ud3R1W9VPT9Lb7u4u8TrXz9P3cm2usTdSTs+Vc6/uc9vPTY4Qu/CwL53QzU3SWvHvMXVTElEZ8nJurvP51Nr782+xMTdUUlP39nN1V9MPD1HSd3f428/OzpG59O9xtVPQ0ZPyru7t8zfTUdr18a5w9lNRz9O2d3MyGNOPEBGTd3v +0eNLS0lj59HEzchv49HdwMvMyuN3WePH0cjdW0hDSmPdztvfRT88PPfPzsXjUTw8QGfBu7zG41U8TWfGtLm/2Uc9P1HLvbnB6zw3OkBdysvMWUQ3OUpb18TM705MSu/PyL7Hze9Z48vCvcHL71NOVe/GyM33Sjo9SFvNzdlnPTc0Qt3Fu7/TTD1AU8m6t7fO +WUI/V9nGtr/PUT48Rl/Txb/3Uzo+RE3OzMrTSkk/Ue/VwsPOb1N378nBx8LTb19Z2dXLxe9nSEZXXdvr71dCPjhR73fN929LP0NKz7/GwtddR1Hrxry2vsdXSklXy8bFv/9OPEBNY8/T3VNAPjpRd+fH2eNPQ1vryLu9xdlrS1PZv7y7xfdFR0pfwsPCzE07 +NT9f18LJ0Ug8ODpb0ce+zmc/PEnvyre5u9NRPklr1b65wMtERUNM39fJzFVGOD1DV+Pj01tFSklv79nI3+djUdvPwsHFyOv//9vHycLP41lEUV/fzd3bW0U6PE1r3913XURFRV3PxMTE22dJVffNw77H12NRR2/Xz8fN51NCS073ztfdZ0ZGSWfV19PnX0dI +Y93DvsXLW1dRX8HAvrzZUT5HX9vCv8PvSzozRFvvydNvQzo6PlnIxr3LZz5ATWfHury9911OW8/EvrzJ50pJUXfXzMzjU0U9S1dr32tfSj1IVd/Tycrnb1NZ2cm/v8LOU1ld68bIw8dvSD9MY+PI0dVXQT4/X+ffyPddRUFMY9fHy8ffW0xvz8zBv8/dTU9b +28bOzs1PS0JO/+Pjd1tDPEFI69Xf3VtNQkXr0cfByt1PUV/bv7m5vctbQFHv076/x+dHOztL49XF0Vs6ODo/98nKwutPQUFnz8O6v8ZrTEtj2cbCv9VjQkhZa8/Tz91HRUJR993R53dLP0tj18/MzGNZT1XMycO8x+tRU2fbwsXDzllJQFXr58zb/0c9O0NX +4+PVb089SVf/y8fO01VPS+vGwr6/z/dNXefJxMnL901LQ2/b2dlvTz88R1Hn29tvT0lBUd/Jv8LF409Xa9G9vb3J90NEW9nKv8fXSj87Q/fPzsb/TT09Q2PdyszTWUc/Ue/OwL7G1VNXa9HDxL/Ea1FIVePNy9HnTT0/RF/v4+NVQzw7TffXyMzrT0ZHb8XC +u7rJ909j3dG+v77Jb0ZJXdvdyc9vQUE/RWvj999XRT5JX+/XydHbVVljzcbHxsz/W0r/08zK0edXRUlR587O1XdOPUJX/9PO0WtJRERVzMjFy9VRTV3Xyb6/wdFjSUzv0czEz+9LRkJRd93n/1NHPUVKZ+Pf3+9LSlf32dXJy9XrY+fNx9HOye939//V1dXv +b1lJS11ja1ljU0xIR1dnZ//34/9v59vRzMzJys/j3dvf1dvbz91rW2drU2fv7/9fX1FXU0pjd2dnd29TV2Nn4+Pf083T7+fT2dfVzcvX629v72Pf3+f/W1VNTEtJX11VT1FOTVljY9fj6+/j7+fXyc7JzM/T193f0czf1+frZ1lZWWNrV19TUU1VV1FXW1dv +VWv/3dvd29Pd2evZz9HX39//a+f36+fj629nV1VvZ2tv62NZU1NZd/f/6+P/X19r99fRzcrP3+fn3+PV0dHb52trZ2dn6/9nX1VOUVFXV2NdU1tfW11n7/fj6+vb2dvX1c7Zz8/Z19XX29/j/+//XV9fWVdRU09ZVU5RUU9VV2v/4+Pf3d/n2c7KzMrM09nr +99/Z2efj42dfW1trb2dbZ1dNU1tbX19vXV9dW3f36+vf2ePb29PNzs/X3d/3393n3ev/a11ZU1tdU1VTS05n62dfTUlMWf/XyNPj91Vr18vAvcTOb11r2czDwM/vTURNVXfPzudOQz4/TGvXz91RQkRJW8/Fv8jZXUxj59G/vcr3V0tP99nJw9dvR0FGTvfN +zdNbRT5EV+vKyNtrSUVM98rDvMXvXVNb48K9vclnTEhNZ+vGxutbRD5GTf/T0fdGPj9Hd9/JzG9OP0V3yr23t8h3RkFf28u9t8f3Z1FOX2Nj909FRFFr683XWUg3Oz9M07q5v9NNRE1O3by5vsTjZ//Z2cnJZ1dCPU3XzMfA60M/NjtRb8/Ax3dNS0hO79XK +1etjd9nMvrzFz1VHTVPrwru/0107PERCa9njY1VDQFdnY9HvTUxDQ+/Cvrq742tTRmPZxbu6wNn3WVXn79/dXUxNTVvPxc7nTDY2Oz5ryMbFx1NCV1ld2crPy9tjzsPJyMprU0E8W93Ov73LV0Q4OUlT38nNd/9jU/fva3dXRE9n476ztLvJSj4/R2vNvLy/ +zE5LSUhTXVlbTUNZ29nO0VNGPDVAWdfAtrjN90dHW/fTw7/Mz8vTy8bP710/PUNP38e8x+9LODQ3QV/Px8nTUVNfVf/P1dndX+fHvr65vu9MOztN78y+uc1jTDs9Q0tf3f9ja3fv19PnY0RCREz327e1u8VfTEpJ58XDvr7XW2dvW/9dT01AP0zZz8bH90U3 +MjlL98i4u9d3TUhTW9vDx8/Z29XNwcPH1U1ESUlrxL3Bx2c8Ojg8U+fr091RTFNRd/dja2dRWcu8u7m803c+PE1n0b25v9tNPkFFRm/fZ1dnX2/Ryc/bSj09QE3Ot7W4xVlKPz9j0cG9vMf/d2tdd1lPUUdBXc3HwsLnVzswOkZT172+1WdJRlVOa9HL49/X +zsS8vsPdSEVESOu8t7rDY0Q8NjtM79/O1VtRX1Vnd1NdY0ZT3cO9t7nK60E+TO/Zv7m+3VlJS0pGUf9VT1NX/8/M091EPT1BT9u8ub3BY0pEQ2/HwL+902fr59/R911bRT5K487Ev9NRODA1Qk/fv7/P50pITERV3//32dnRvry/w2tPTExT3by6vL3vTEA7 +QWNnd8/rTFFfW/drTE9BPEvVw765vM5TPT9Z98+5tcXOX0hTT03j/1NRVVFZ3dHO1Us/QT5H28C/vsdnVUZCd9PVxr7T59fXz8zvZ2tHQFvRy8XB0e9CNj1HSu/FxdtrSEdOSl3v/1tjb/fOwb/Az2NVTUr3wLu7vs/3TT5BT1//1dlnX1FTa19RW1NBSXfb +x73Bxt9HR1dv2b+5vsv3X29ZU2f3TU5PT//T0dXvQjw+PEnrwsHD2WNOQ0Zj1dPHw9XZ0dPJw93v3UdBT9vMv73M/z41O0ZLa8TG2W9IS09ETe9dVVlfd8zGxsh3T01MWdm8uLq802dMQ1Hb3+PO61FTY2/b90xOPjg+Y9XFv8PPTjw/W+/TurfAyndVb/9r +z9V3XVlRX9/X1d1IPz08RtvHxsHOVUtFRG/Z287I63fb0crJ2d9nSUj/zsu/wNH3QDpHU2PTwdf/VUZNVU5361tMT0tZ08fIyXdKR0NKzrm6u7zdX0xFZ93Zz8rdT1tnd+NbV1E/Okvr28y/zt9NPUpd/8u6usbPd2/f/93O3VNZV1XfyMvTYz07OjpPysLF +xOdRRTxL99vTwsRva9/VyMnZ1e9FTO/MyL2+zlc6PUdNX8vC0/dTSVdXUWvjTk5TU3fMyczbSkJCQlvPvL28wOtjTE3nzNXLyHdf59/X1W9bTTk8R3fbycbXXTw4QFF3zbvCy9N37/9Jwcvd//dv98/LzdFdRz87Pk7Xz8rH91FJRE13Z/fP22/j0czL0+fr +T0hb08fDwMjVU0JFTllj18rb52dfY19TWVlTUVFb78zX3+dbSkVDS+fO0cO9zN/3b29dX93G1dvNz+dnTlVbTEtn92d37+/3WVFZV09Z7+PVycfGydXvZ11j993XyMfV52dVSEdIT19bWe/f719j/19RUWPvb+vMxcfV3dv/Y2Pf19nOx8XV/29jT09VX2v3 +39nZ/2tfTkxNUVld593V7293V0tOU1lbb9PKytPOzOdna+vr79XLxMzf4+9RS0xbWV1r7+dbU1dPTExVY2v348/KzsrN3/dvY2fv3czIz9XnV0tKSk1TXe/rd2v3Z1dXW2tjb/fX09XTz9fn7+vr//ff08/T0d33Z1lVV1db/93X2d3va1VNTE5Vd9/n3+Nj +WVtXV11na3f3693Rz9PX3e9rX3fn49XKz9vrY09RVVNnd2//5+9nX1VTWVlj49/TzdXPzdv/9+t39+vr1df3d+t3WU9NTEtKU+vj5+P/U1NTVWvv387Kz9XV2+fZ29/b3+vf593X3etvW09PVVn35+PX2f9XV1VRUVn/4+vv3+NrW1NRV1Vf39XZ1c7V6+Pn +69/r49vX393X1993Z11RTVFVW+vd4/dbTUlMVXfdzMnGy93r/+//99vP2e/j2/9rZ2dnU01OWVNRZ+vjd2drZ1Vbd+ff1c7Jye/dX19nWczIycb/909b/1nZ6/f3U9X3X1tNY0//1+vMTlVXRF1b3b/R301NRUNvzb6+09tFS0xOw7+/vv9bPUZV977CyGdF +STtP69W/4+9LPktI67++v9PfSElfZ8TFzMlfX0tK5//bY1tVQVNb991n/0lNUUnP0czJ/+dZX9vXwcPJ21tnY9/NxcR3XUM9SVXdusHPX0k7PEfvv7rO20hGREfjy8zOY1E+RV3dxL/M1VdNQF/Mz77G0dVVX01f22/X3//vW+v391lJTURV5+/EzN/vTlVP +Z8jIv87rV0lT/8y8ydtIRz48V9PJu+NfPz08QmfGv7/X70tNVWfKyMrD5+9bd8/Tzev/WU9dVd3T691dZ19R53fd/1djS13f2cXV50dBQULvycm72eNKP0VO3b7DwOtvRktb/8HC1dtMVUhO0crByGtMPUZDY8vNxMzra0hjW//L48vZd+Nv09v/Y05bR13d +/85nV09CVU1dzN/VX1lRTtvRw7vT3UhTWW+/ury+d1E7P0lrxb/K41dNPUdd67/R2/9IT0lfzM/F319GP05R3czZy2NnW0v3b+PT687v39Pjze9nU0xvY9HCy8lRTURFXWfRwePvSEhJX87Jv833XUFMV926wMTVTz86R1/OvcnZTkVDPlf328n/d05RZ3fR +zNPTZ29Pd9HPwtPX2VNrW3fP/+dXX2NO2dXZ11FTQUt3/76+zuNKRD1R39O/yt9OP0lK38bMxmNZRUNfd8m4ysxXTD9Cb9G+uc7PTUpJT93f085nd0tX293V7+NjTndf1cXR0W9nVU7v79nba2tITVVX29/jb0xFQl/f0b3Hz1VNR0rjwr+6xuNMSk1dysHM +zVVPQEhn48bI3e9BRkJb1c7EzutnSVdRd9fr2e9fd1nf49/vVWtMUdvjxsjdXU1XUf/JzMbdb0xKZ+vMwdXfSkpESd/NxsHfbz9FRU3MvsLA31lCSlf3xMXV2U1OSFf33c9nX0xFW1fdz9nZXWdjW9XVztfv31v/29nEz91fTFlMX8vKyONjPkBRTuPBystr +VT9Gd+fGv9PfSk1JVc/Myc5rXUBMUV3Ly87ZVU9GZ+/bxNnd61lva9PR2dFdXV1X59fO12tnRktda8nKz+ddWUtd3dvF0+9KRk5R48/OzVtPPUFZXdfCzdNXTkFI38/Dvc/fWV9Td8bJy85vZ01fb9vN3+dTS09L99vn0W9rWVN3Y93d699VY3dn09nV/1VZ +R1fb28bM3U1MU0hvzMvF2/9ITGdnzMTO0VtdR1HXz8nI3/9CS0VOz8rJyvdbR1tf78nV1eNVWVH/39vRb19KRltf29Pd3U1RVVPf383T5+NbZ+fjxc7RX1djU/fNycff70dFT073ydHRa1FARl33zcnb505TTWPPy8rTa1dAU1nfzM7TX01JRGdv28nd32tX +X2PR0c7Lb3dfY9vOxs3Z/0lRUWPT089vY1FLX//Ry+PrS1FdY9PKzONbVT5MZ//Nzdl3T0g/T+PVxsvXX1lbWdXKzcvvZ09Z59fJyNXjS1FNX9/j2d1fX0tbW//V9+trTl1j3c7L11lbSEtv58vFzedKTENJ79nKy99ZSlNd58XLzfdjU0l3zsu/y9VfU09O +39HVzXdnSVdfXdvX5+dVWVdv0dXO2V9RRVFf28vT21dLTEdn69fR/3dMT2/rx8XK51VZS1vTysHH0W9JTk9fzs7M2WdHRU9n58/b41NVTFPfzcrH419GT1Vvz8vX21dVR1dnZ9/vZ19NW1/bzNfZd1dTW+vNw8bP3V1XX//PyM3bZ05LT2vZz9HfUUpKV2/R +yc7VX0tFTv/vzc3ra09ITGvd3dVvWU9TZ+vPx9PbX05VX9nJxcfdZ1FOXd/Iyc3nU0tJTffVztf/TUdKU/fPycvb/1dLV2vjysvRa1lOT1tr6+Pra1VbX11r/9/nd2dn9+vn39vj49/Z3dPf9+dnX/ff3+vvWVdVU13f1dXnb11XU1n31czd93dPT1lv39nd +d19VTFNn3dfT1etrXVl349/by9nvb2trb/fj183bb/9fV1Vdb2/n93d3Z1tjd+/n09Hf92ddXW/n39Xbd2dRSkxRY/fT13drV05RW+fTydXf3/9dZ+PVzsnN0d1vXWP/7+fZ22dbU1FXZ3fr1e9rZ11XXXfr49Xn72tbV1lrd//d7+f3XV1f9+fr29/f73dn +b+vv99Xd5//3d2fv9+/Z//d3Y1VVXV134+vn73dnXWt379fX3+/v/3fvd//n/3ddW1tfb11n72//d/9na+9v69vf2dvn7/fb393P2dfjd2NdX11d/2v3d2NXVV1da+/r2+v3a2N3a+vT29nrb1NTXV/v2dnd72dZWWv3383X3e9jX2t3993R3d//Y2dn9/9v +6/frb1tZXWtfb93f3efn92/vd/fZ3dfd91lZX1/v11v/Rkg+SNHCusr/QjtDQsq5t7//UzpJWce4u7xbZ0E/a9u+xsdLPkY6Z9m+v9PbOUA6Q9e/t8TMQD9EPtvFucDPUThJPXfLv7vV3T9HSE/PzLzR2VdBX0zj0cbG3dlDU1lTY1/PY9HrV/dLV0zd58/B +381MTE9X2d+9xs3jP0E9Tl/FvMjRPkA5QW/Et73FQjs9P9PHtLXCUzk5Rcm7tbDP7zc2OD/DurnBTTcwOUDMs7a8U0AzOUzItLK6U0U1MkrZubK3WTw7Lkvvu668xD8+ND3ju660yUE7OzzTvLO300g2PDd3y7y61185QD5byb+3zd1JQUxF0cW/yOtVO0hE +a9vVzP/rSk1RXfdvyevL12vnW+tbz9fTvdfN71dJV+vvws7nY0E/PFlvxsDX5z9DPVfdzLjG0UM+PkfPzbzC1WM8QUPbw7q5z2s6Pj5dvLm1x1U3NDxNvLa0v01BLzpDv7a1vUs/MDZH3bSzt9VENzVG57Ovtck/ODA9W72yu8o/OzU5Xdm1u8RMPT06d9e5 +uMPLRklFWcy+usfOSkhKR+fbyN/nT0JPSGdf5+dv21/vd9/Xa9lf3dHj32/rT/9d68XZ0/9nSExjY8PJz+NXTT9bV8+9zdFXTj5RX+e8y9NfRDxCZ2+9xM93Q0M+3c28tsvnQUNByFfXudVfQTY6SMXCtsJbSTQ9R868tbnvTjY8R8+0srDNTjo1R2u3tbnL +QD4zPU3Tub/LPz45PlvXtr7C70FFQl3dusXK1z5LRVHdwbzXzkRHV03j3cXv22NJa2PV28/3a9tTb//r1///Sut3a99351FnSWPL48rO42tRVVHTys7La1VETUjnw9XMa04+TVHru83K/0k9Qf/duLfG1UdIPuvNv7PL40g7OU7VybfMY0U0Nkbfxra85002 +Oz7TvLWx01c3NT53vLizx1FEND5TyLm5wEhCNT1O1by7vl9HPkBP2bq+vN1GSj9R77/DzNE+SUpN69G/3cpIR19R39fEd9/vQldLXe/Ra1PXT2v/a+Pr1U3d71/R79Pr12vnx+PN1ePra29Vz9Xj21lRRVdJb8j/3WNKP0Vfd7y/y9lLSj//68a50dlPQz5b +0cq3yd1POzlH38q4vddbOTo868e4ss//Ozg9Z8S/s8NbSTU8SdG+uLtdTzc8SeO8ubjTTj07QVfDwr3TRkM6RlPBv8PJQ0pDSmfXvcrGS0ldV9nOu87M40djV+/ZxudZZz9VV13f19FHZ0ZK53fN0chXZ+NN3ePOz9NvTd9v59Xd13d3SGvjY9n/71NjWVnJ +49vfZ1tM91vPxdvTXVNDXf/Zv9PTa0dCTffZvL/O40U/PmvVv7rOdz46OU7NzbrF7084O0bdyLu8/188PUrrv7q2xP9EQElvw725yVtEO0RRzMnFzkdHPD9P78HJxU9JS0r338HJy9tFVU5r08HI3eNFT1Vf28rGY29HRWdd1dPIb193Rvdv2c/V6073XWff +99Xn509X22PZ29Xv72dPztPV0e9vTVdEY83jzOddR0pOV8bNyc9VS0JPXce9x8djTUZR68m7vstbRz5E792/vtX3Pjo6S93LvNnjRTw/S8zDuLzfTz0/Ts7CvLrjWUA+S93JxL13U0I9SlXLycHvTEs/T13PxMnJTktJS+/Ows3OWUtTT/fVxs/da0lbW+vT +zMtra0dPW2ff3dFXWVVO72/f2dl3T3db59vZ0d3rTtvT083T0XdvSVXN0czb91NJRkXb29PZWU0/SEnVwMbLa1dJSVvXwcHF51tJQ19rxb/Iz0xBPEZv07/P01lCP0Xr08DC029FREXv08nB0e9ORUpv0dfG1eNdSFlf0dfLzv9vS19r6+Pj0WNfVU///9n/ +2+9bX1nr79vj5+9b///Xz9HN499VY2vv19fO/3dPS1tVd+/n71VOR1Nb/9nVzndvV13//9nOyeN3a1v/Z+PMzd9nX0xbVVnd62tZd1FTZ//R08vv/3dPa2vjz9F3zt9TX2dv19XP93dXVWNf393Z2W9fTVdXb+Pv12dfT1dnZ9/f1eNjY1V3b9/R189371/v +393O0893a2db///f2dtvVVdNVVdv5+vjV1lTWWvvz87P229rV2/rzcfNz/93VVljZ/fn2/dTS0lVa9vX2dlbVU5Zd9vT1c5jX1db9+fR1dNvVVtV//fb0dvbVVtXX+vd1dvnVU5VV+/r19Pfb05ZVffn2c3b3VtbX2/n18zV2+dfZ1/v29PO5+9XW11f6+/f +d2dXTFFTZ+/n4/f/V2Njd9fZ1d3bZ2d3b9vX19Xb91dbV2tvb9/r411VU1N3a+fd29NOY29TZ03ryM7D1ddMSVFI38PIvdV3STxJRme+xLzZVz06SUzVvMbBTlNJPuf/w7vT2z5KSVfIxr/Da+9DV//rv7/M00RXQE3Rz7/Oa1M8UUhvzNvRS1FGQdvvxsLj +d0NLa2vEwcbTT1VDW87Tv8jjWTpIQFfEy7/fVUE7VVXNusnLR0c9Qu/GvLrTaz1AQ1fLvcHCa107RUxfyL/JzVNVPk1r48rn52NRX0v349vXd/fj/9tj5+9Zd2fnw9XI/2dLSmPfxbvKy0ZLPkD318G821s7Pz1Oz8jEw2NXPUld/8a/v8VXT0JT49e+xM9r +SVFDb9nn0V1bRkzvd8/Xd19JT3fjyc/Md1NRRvfN077X60pDSFHVvsbCY1U6QlFdwcHG0UdEOkR307q80VtBSUNbxsm8zndRQVtR773Mv+NdTk93/8/I3dNPXVdT42v3d1d3UW/bb9ddU1NT29vKy+fbREtRWcLKxcZrUz1GWe+8w8lnS0Q7TefbvM3ZWURE +RV3Ny7vb90dKXVnZx8/GU2dNT9lv285390tnY+vPd/9TTl9T18/VyllTSUbf48m9zt9KRkBVy8e9v99fPT9GX7u+usBbRDg9Udm2u8JrRD43SN/TucbbUT5CRF/CxrjJY0ZDUVXTvcvEWVNLSHfvz8p390ZMY1nT0+9vUVtVd9Xnz+tbV03v2dXE0dlbS0tT +z8fLxvdfP0RRXcnCzM1RSD1HZ+O/wdn3RUlIW9XXwc7vd0RbWWvO18lvW/9V2+vn02frY2vT583r929KX1tnytnPd09CQVfX073L10xGQEfXwcO722s+P0hvwLrEw1FLO0Jj48O80d8/QDpG3c6/vfdZPURJd8TIw8tXT0BZ787Az9FTRltK48/TzVtdTkfv +b9nP629GTVtVy83GyFlPP13Z37/KzmdJR0Frxsy+zedDQExOz77Kwl1TQkZdZ86+2dVJS0VKd/fMyu/3S2tna9Xv2dNb42ff4+PZW29bT9nnztNrXUFLXWPGzM/3UUU8VdnTv8nOUUlGQ9nEy73b60dFS03Tv8vGW1E9RGN3x77f60NIRVnO1cnKZ1FBWWvR +w87NY0xTS9nTzMX3/01GZ2POx8rNUVNGR9/bwsXZWUBOTl3Jz8bbY0U+Wf/TwMnLUU1GSd3Lzr7d50hLU0/ZyNHLWVdETG9ry9X3d0hZTm/d69PnX11O6+/Xz//dVVPrb87X2+dTY1Nj0ePP729KRFld48fZzFldSEbr1dHB09VNUUhLzsnKw/9ZQEtZ98LD +0dlNT0Fd39XDzudNQ05M38/VxmNbSUj/b87J19FTU1FT09nIy293SE/v78nT1V9LWUtrz9PH7/9CQmdb08XTzFVXQ03X3cvA1ddHUUhTzNPGxWtVP05Xb8TV0f9OST9nZ9fE3d9RSl9P1dfXx2dvZ1fjZ9Pb49VRa29d0XfVXVlvUd/T585j701N92fVztvR +TltBStnjycXr/0VRS1/FzM3OY2c/X2PXws7NY0pXSNvd3cT/91FHZ1PZ2dvPU1NJStn/yMvv70VOa3fH08fvV1FCWd/TxNfXSEVPR+PL08X//0JFX1vVwszHXV1DSdvZyL/X50ZRT13L083NY1NBX2/nyc7ZY0tXSePX38jrY1lHX13dzuPTZ1FZTevrztN3 +705V/2fO29PVVV9TWdvfzNvjW0hfa2/R389bXVFG59vjx+fZT19ZXdfN185vZ0lb73fO0e/nSU9KW9Pr1dlXU0VTX9nI3ddnTFdM29HNw+/vVUhnb87LydNZU0hM79vHzNfvRExRV8zPyNNvSz9N/+PK1c1jU01Hd9vbx9fnT01VV+PN283rZ0pZ93fXz9/b +TT1RyNXv2c5vd1Nna+/na91vV/9d32v332/f/1/Z/+dr999jd/dr32N3XWfrU3fdZ+dZd3fv51vv2WfjZ+Nv69v31+dr3Xfna/fXd+/vX+tfd2/j12d3/133W9/n699f9/dZ/2vb7+d3W3dnX+fv22d371drb2fX699v/29VZ+fv1+/fa3dnUevj99v352Nn +W13r4+vX6+tXd29n4+fv1XdnU2drY+/f5+tja1d3X13d5+/vY3dbd3d30dvv4+/vXefv79fv6913b1v392vd7+/vZ3dd52t34//j/2/3Xe9nZ913//f//1vvd//b/+Pr/3dd5/9r3Xfr/29rW+dvd93/92tv92vja/ffY3d3/+f/5/dr62Nv39vb5+NbRlNX +/+/n72/nWV//b9/f2/9j/1Nn7/fV2dfnY3dbY+Pn1c7Xd1t3V2fd69Pf92dZb1dj2/fX43dfXf9b/9133/f3b1v/WV/fb9/j629f/19n43fn9/f/b99fd99nb1ln08TJb1NNRFH3x7/L/0ZBREvTwb/Hb0w9P2PVwrvEb0xFPVnHxLzJa0o9RU7vvsPK70w+ +QFPfxL3N609GRlHLw8XHW1FIR2PTvb7dXT8+RWvGwr3dSUc8Ru/NvcHVVT5ARWPCvb7TVz48SG/Dur3MTT46PufFubjOUz09QFu9ur3NT0M6SPfPuL/fW0E9RGPGv7zKTz87PU/JvsXDZ0xTWe/Pw89VSD1H38y7uMhLODY4S9PFsrzfVz0/SV3JvcP/XU9J +18TGxvdJPUBEU7m1u71fPDc5Rue5vMXPTEdHXd3Vyf9TSkNn18i5w/dAPDtH2cu6uO9fRz5JXc/KwdVJV0tPyr/EzV8+Oj9L1bW4v99COTlFZ7+6xdFMRkpVzsbG11dHO0rn07m4zW9ANTlK2cS0u9VdPz1Jb93OzltRTFHOvr6/3Uo8Oz9vvLu4vldJPT5O +98rIx+dKWWNvxsTXX0Y4PvfRvbC7zEs4NTx3Vb22xd1LQkpX39fTa1FLRuO+v7zFWUQ6N0Tnv7221V9IQERP3dnX209b59nHxMt3QTo6Rtm/srTBVTs3N0vbyrvJ401DT3fTzc5rR0c+V766ubnbSjg2O0/AvLW330c+QElrzM3Pa01TY9XGx8lbPzo8TeO6 +s7rIU0E8QE//xMLb3VFO79nOz+NRPz9AVb24t7vfPjQ2Pf+9urbDWz89SGPXycz3Q0JNa8W8vsVVPjU8TWu9s73GVzw5PlHfvsfV51FOW9/O2d9RR0RI3by5uMpbPDc7T8i/u7nrV0VCW/fb09tOP01v0b67w2tENTRGZ8ixsrrjQTc3Q3fJvcXXWUxX99HL +3WtGQTxNxby5t89RPTU4Wc/GuL3ZXUlJUWfn399OR2fjzL7AxVk8NTdL37y0t8RRPjw9U9vHxdV3S03r08jG40lCPDt3wLmzuc1HNjQ6b8K5tLvjS0RLWf/V2etKSVf3ycXGzUo5Nz5R0763vtdNP0BIVdvB0dvrTGfbzsnTY0Y/PUvXubm5wl86NDhLzcC8 +uNlPRURda+fP10tATF3Tv76/3Uo2N0RfzbS4vs5KPT5GXc/K29tjU2PdzNXnVUE9PFHFvbq601M9OUXnzse6x2tZSWPd3dvVZ0JBa+PIu7zJbz0zO0dnv7S5yFM/PT5T2cnF129LU//TxcvfWUU8PPfCwbm/21k8OEr318e6yGtXUWfr59/fXz5Ka9vDvr/M +STk4P1fVubi+3UdDP0r31cfj519Hb9XMw81dSD43Rd2+vbe97z83PEzTz7652VlKUffr2dfbTkJMZ8++v77fQjs8SFnVub7E40lFSUxnzdV3601O2czHyd9RQj08TsG9u7zRSTo4QuvLyb3IZ01Ga93f089nQUFT/8K/wcRZPTY+S2O/ub/FY0RCSFfjx9Xj +71Fb38vHze9MQT1B28K+u8l3Pzk+X9HVxb53XUlR29PX1dlVPU9n2769wc5JNzpDW8u4u8JrRz9DWefIx9//Rkpn18XF1WNJPzpZyMe8vtldPzpHb9fOvcpdUVNr39fZ2f8+RmPrxb+/yFU8OEBX17y8wttIRENP79PI6+9XQmPXzcTK/0lAOEfJw8C5xu9B +Oj5L1dnCveNPSlHr59PZ301BS2PVv8G/40Y9PU1jx7q/xmNLSU9378vd9+9NU9fKw8rbX0M8PE7Gv7y9zE86OkBr087AyV9JRmPd187P6z09TWfHvb/Ab0Y2PU5dxbnAxmdGQUhv38TL519HS//PxMrNV0M7PWPOx76/0Uk+QUz399fA53dba9nb3fd3Vz9R +69fBvsLVTjw6TmfVvsLLd0lHSe/bzs3vWUVFb8m9wMz/RTw5SsnAvLrL/0A8QWvZ0cHRX01Nd9/VytfnRD1MX9vBvb5vUT09SWfMwsXRWVNNV+vd2etjTUVZ1cbDy9FvTD1B59PRw8PPU0VPY+sf +--seconddivider-- +This is junk. + +What will it do? +--foobarbazola +Content-type: application/atomicmail + +; This is a a MAGICMAIL message that contains a survey. +; If you are reading this after receiving it in the mail, that +; means that your mail-reading program needs to be upgraded +; to know how to run MAGICMAIL programs. +; +; If you are reading this in the hope of editing your survey +; before sending it, you should start at the END of the message, +; which is where you'll find the parts you're likely to want +; to try to edit. + +(setq newline "\n") + +(setq global-survey-qid-ctr 0) +(setq total-questions 0) + +(defun nextctr () + (setq global-survey-qid-ctr (plus global-survey-qid-ctr 1))) + +; USAGE: (survey-multiple-choice "Which is best? " '("bar" "baz" "ola")) + +(defun informative (p) + (strcat + "#" + (int-to-str global-survey-qid-ctr) + " of " + (int-to-str total-questions) + ": " + p)) + +(defun survey-multiple-choice (prompt choices) + (strcat + (int-to-str (nextctr)) + " (" + prompt + "): " + (car + (car + (select (cons (list "" (informative prompt) NIL NIL) (cons (list "" "" NIL NIL) choices))))) + newline)) + +; USAGE: (survey-short-answer "How are you? ") + +(defun survey-short-answer (prompt) + (strcat + (int-to-str (nextctr)) + " (" + prompt + "): " + (getstring (informative prompt) "") + newline)) + +; USAGE: (survey-integer-answer "How old are you? ") + +(defun survey-integer-answer (prompt) + (strcat + (int-to-str (nextctr)) + " (" + prompt + "): " + (int-to-str (getinteger (informative prompt))) + newline)) + +; USAGE: (survey-boolean-answer "Do you think I'm sexy? ") + +(defun survey-boolean-answer (prompt) + (strcat + (int-to-str (nextctr)) + " (" + prompt + "): " + (cond ((getboolean (informative prompt)) "Yes") + (T "No")) + newline)) + +(defun mapcar (func args) + (cond ((null args) NIL) + (T + (append + (list (magiceval (list func (car args)))) + (mapcar func (cdr args)))))) + +(defun surv-pkg (q) + (list (strcat (int-to-str (nextctr)) + " (" + q + "): ") + (informative q) "" "s")) + +(defun surv-pkg2 (q) + (list (strcat (int-to-str (nextctr)) + " (" + (car q) + "): ") + (informative (car q)) "" (car (cdr q)))) + +(defun formatfillinlist (lis) + (cond + ((null lis) "") + (T (strcat + (car (car lis)) + (sexp-to-str (car (cdr (car lis)))) + newline + (formatfillinlist (cdr lis)))))) + +; USAGE: (survey-simple-form "preface" '("foo" "bar" "baz"))) + +(defun survey-simple-form (preface qlist) + (formatfillinlist + (fillindata + (cons (list "" preface "" "i" NIL NIL) + (mapcar 'surv-pkg qlist))))) + +; USAGE: (survey-complex-form "preface" '('("foo" "i") '("bar" "s") '("baz" "b"))) + +(defun survey-complex-form (preface qlist) + (formatfillinlist + (fillindata + (cons (list "" preface "" "i" NIL NIL) + (mapcar 'surv-pkg2 qlist))))) + +(defun ask-question-set (qlist) + (cond + ((null qlist) "") + (T (strcat + (magiceval + (cons + (car (car qlist)) + (cdr (car qlist)))) + (ask-question-set (cdr qlist)))))) + +(defun qcount (l) + (cond + ((null l) 0) + ((eq 'survey-simple-form (car (cdr (car (car l))))) + (plus (dcount (car (cdr (car (cdr (cdr (car l))))))) + (qcount (cdr l)))) + (T (plus 1 (qcount (cdr l)))))) + +(defun dcount (l) + (cond + ((null l) 0) + (T (plus 1 (dcount (cdr l)))))) + +(defun handle-survey (to cc subject qlist) + (progn + (setq total-questions (qcount qlist)) + (sendmessage + to + cc + subject + (ask-question-set qlist) + NIL + 0 + T))) + +(defun maybe-displaytext (t) + (cond + ((equal t NIL) NIL) + ((equal t "") NIL) + (T (displaytext t)))) + +; This is the user-generated portion of the survey +; Be careful in editing this, because you don't want to +; mess up the LISP syntax. (Be especially careful if you +; don't know how to program in LISP!) +; Note that lines that begin with semicolons are COMMENTS. + +(maybe-displaytext "Thank you for your patience. I would now like to ask you four questions about what this message did when you tried to read it.") +(handle-survey + "nsb" NIL + "Re: Multipart test" + '( + ('survey-multiple-choice "Were you able to read the introductory text?" + '( + "Yes" + "No" + "I don't know" + )) + ('survey-multiple-choice "What happened with the audio part?" + '( + "I heard it fine on my SPARC." + "I saw a message saying I can't read it because I'm not on a SPARC" + "I saw garbage" + "I don't know" + )) + ('survey-multiple-choice "What happened with the picture?" + '( + "I saw the picture just fine" + "I saw a message saying I can't see it unless I run X." + "I saw garbage" + "I don't know." + )) + ('survey-short-answer "Please enter any other comments: ") + )) +(maybe-displaytext "") + +--foobarbazola +Content-Type: MESSAGE/RFC822 +Content-Description: Yet another level deeper... + +Date: Thu, 24 Oct 1991 17:09:10 -0700 (PDT) +From: Nathaniel Borenstein +Subject: Monster! +MIME-Version: 1.0 +Content-Description: I'm Twying... +Content-Transfer-Encoding: base64 +Content-type: AUDIO/X-SUN + +LnNuZAAAADAAANeKAAAAAQAAH0AAAAABRWxtZXIgRnVkZCB0YWxraW5nAAAAAAAAVFZYan39 ++Flh7N3X6t7f2dzc811za3dsaWhl4tvY3ebd4ej/fnn+cGX+YWNubP3t5d7W2+b3bVhZVVlX +Vmj52s3JxcrLz83Q3d/x/V5QTFFsVllraHPf2mdqXVpcTUZJR05YXV5mYlBqyrmz3y4qKEq0 +qqK4UUU3SGho4M3Gxtpy4djHwc/sVVrTx8PH3+9dVFdNR0VIR0Q+OTpE8cfGXEJI6L64vMbO +z9LrW1dXaO3xaFFt3s/qS0VJUl7r6d/7e/LYxsPJz9Hf+NjKy3NbRUBLvp6nNyIXK7ufmbcz +LDNFzWBmyNTJWk9e2sPJUz44QmfWxNlPSEVOVlvLwL64v/JCO0Hbv7q92N79Y0c/TtO6vdxG +NzdCTEY+Ozc/WMu5vtT29+HZ3MnKz893Tz89S8S2sbK8uLreOS88v62txDswOVbc6kxDP0vp +3u1VQ0Q/Pkk+PEJPSD87NkjFtbrKx7a0vTQoLsGfnaK9X368r7TcQTxQyLe9UDc3Q1dtpZ0j +EAkOPKSMks4iJDavpLq2TGBKNTo3TdN4Qjk/t6egorfb7Mqyt66kqjYXDBVVno+cWx4ZHjRz +xs9BPz1Nzr23t+dKSNSyr7X0zJ6QnBYEBBPEj4qiMiI/rqSwxd3JtupKO07CxD8qJDi9qarq +Lz+pkpAzCQEJNpaIlMopLV2+1zA8O93sPjg94bS1YTs60a6loarH256SrScJCSmni5K2IBwk +S89JPy/lx73J4tGxr7DpMS86tainmKIiFQUNMqCMkKUuIBouMUJAMUtPyLa1uKutq7G6vb+5 +uKmamJ8cCgYQvJWNnMUhISAsKCcrMXu+tL7Bzbi7tsju3bihmp/GIRggbKCeqmAwJiUjJCgq +OUFISOi8r6yxt8C3oJqf3B0XJrKXkZrMKhwcHyQpKS0uNTpU1sq/vr/JtZmRl7IUDxjdlI2R +pkgfJCAmIR8kL0/GxHPqbcnNy7eYkZq5Dg0btoyHjJ5fGyUdHBEMDhg8tq5XPDJuwK+jnZeZ +pzsgKO6ZjoySoNYvIhgSDQ4SHzjf51FMRGHSu6uempmdqre+uKmjpazVNSkhHhwbGxwfKTJA +UVjYtaensmg7XKyZkI+Vna3MPSsfGRYWGB0lKzU8T9SvoKW2MSYsyJ2Vk5icoKCmtjkdFhYZ +HR8iKCw1RtO2pJyirMfCtKumqK29u8rGynhJNCwmIyMhIB8gJCw93LOus7y+tKykoZ+gpKit +srvPSS8mISAhISMiHyAsPXnIwbWtpp6cnJ6gpaWio6a0YzQnHxwaFhQSExgdJzjvvayjnZiX +lZWXmZ6jq7bZQzAlIx8cGhgXFxocIi9Nx7apoZyXlZSWmZ2gpaqy1TwpIR0aGBQUFRgcIS5U +xLSpoZuXlJSWmZ2foaSpuk4tJSIeHBgTEQ8TGB0mNOmvoZuXlpWUk5WZnqe230w3KiIeHBkY +FxcZGx0iKTfqs6efm5iWlJOVmJueprHKSTYqIR0aGBcXFxgbHycxRsmvqKKenZybmpudoaqv +tb9jOSoiHh0cGRYWGBwiL0nBq5+bmZiYl5ianaSuvs3hUDovJCAhIR0ZFhUXGyIuTL6ro5yX +lZSWmJmbn6m4ZD4yKighHh4dHB8mIR0eJi891LyuopuYlpWYnJ6hp7TPRDEqJiAdGxscHiEj +JSo1S2B+xL+so56cnJqZm56iq7C31zorJiIeHh4dHh8jKCouND5Wd72vpaKkoJ6enJ2kq7PG +z1AxLyglJSMiJCIjJyorMzhE9su7rquhnp6dnZ2gpbHE4F5HNzEqKCUkJiUmJCUkKzdJ4tW8 +ua6ppaGinp6io6assLznW0IzLSYhHx8gIyYoLTVBVG/cwby5ta6pqaioqq6xtb7G1GROQz46 +NS4sKSosLDA0NztP/NXAuK+urq2trK2wtLzO1Mr8Wl1KP0Q/Ojk5NjU0NTo+Q05ledzYxsDA +xL+9vbvAyczY5F1ZTEQ/P2vR2U9ISEVIWXXlxsbLzsnd2cjb3t7a4NfZ7+9fWvRJSk5DS1Bn +9HbZyMnOzNHe4dXAyNzscEk+UU5TaMrN6ONjaVtSSUhMUVVf5+/Z2H7c3XdsVmFWT1N53Vpa +XV3tZtHWzr/K2NztSExI98vCxby3yMPdz1NLR0nmSjhIVGVhbtbl9VRiU15JRk5GT2p3W2Ds +0UG3wbzD0cn+XD9WR2FXSFrg4cO+u7/Gv8LJ2eZdTUlNQEU/R0hKWFTqbtZx+XRc/lVVXOhf +bf3Szsu/xLe+u8fXyNPQa9fobHde0kx9UlzZSl08Tj5OTEdWRtFE90JN2UfWRmFnUuZGz05q +bPjIZcfevMrF2bzkYdxf2FdzUs3X3WLew87Jcda+3NhCdOlOTT9gXdg7WVPnzUJKR89PWTxG +5fb1RkruzOjV2NTCyN/haNfc+vDg1FxmTVtdb3dc5WfL//vX6szd3+/50srAycrW1tXoUEJI +VGlcRUlf8droftvPysbN2/Lo9nFZVVFNfXV35mdu/FlLTkpZ7WNOS0lqcWRwZuXP0NHR2uTe +3uR4bfrf7nXrdWjp2d7l5t3c8+DZ9W/f0vB2/tjS2d7dd1RrVUhDRV1aUktNSVJ5VE5LWdvV +yM7Z7dvN4vz+5NTT0t74YnT3ZWFVS05OU1haWPvW1dTc0sS+vcfb5dTbeWFOXm9weV1YUlFO +TU5PbdXn3d7v9dbM0NHcxsDIyeBlXnFZXF1Z6/x/b19STl5VTEpJTl1dWllUT2VpX3f6zcXG +ytfS3tnQ3d3s3e9zcWz2YWN8aF5eaWpoaldXVW3r9tnPxcbIyNLb6n5WU1pTW2ZlXlRPS09O +WltfbmxcS0tPVl5eaerZysPDx8/OzcvT097p41tKQkFGT+TMwcTEze9cQEE/PT5ASmS8tre7 +v8C9sKytuGMzKCYqMkvMubm602lNPjcvKignKi9Kv6qhnp2dnqKosLm2v8lEIhUODA4ZMLOf +m5ufrNQ7KiIiIiYw66ufl5OTlZiboKeurKy+RxwNBQIFDB+/mpGQlqTKMCMcGhkbITO1m5CM +i42Sm6Wuvlg9LSgrLCcfFg4MDxgurpyUlJijvjclHRseJDrGpJqWlpidpqy6z2XEraiv3hsK +AwMKG62QiIiMmtweEg4PFBoq+aOUjYyNk6C7Qjg1O0NDR8Kqq7ooDgUCBxbJkomIjZs9GA4L +Dhcpx52QjIyQmrFJMzNJqpaOk6gXAwAADTSXiYSLmVAZEg0QDxUbOaiRiomLmrUwKitB1b+3 +v7/Lq7DMIQ4IBg8snY2Kj6ksEw8QHCzQqpuTkpOcq0k4Pa+TjZG6EAIBCzWVh4WMsxgOCw8T +FhIYIr2WjIuRn10/RaudmpytxjwzLPC31zIRCAcOOpuMjZJfFhARIDLLuKmjmJebor7bNlmm +j4qRQwkAAAtPjoGBkWMSEhUfHRMPDzKmjYuOqSAZHL2cj5OYrO1xS9JN2jUgFw4RGUykmp20 +NBobHCxLz7aup6Ogp6i1ur3Fu6WXkJhBDgEGFKSKhIqlJA8TFR4ZFxUd7aWXm5+yrayrrsjh +fq6gi4yuGQAACC6Ng4afPBUdQCslDg0TvZWMl0UmIb6dlZ2ju6+kpab+LTaooakeAwAFJJOG +iqAdDxg4+H4sIz6pko+bu2FAz7q8USg8mouKswYAAAynhISPTxoqVKgoFw0bvJSNnUwaLsib +najM466noLjNOEM/W6+pMhcNCBpTmZWc1jcxJ1gtMTRXuqalrbg6T3nEz2m8louNUgUAAyqQ +gomfMyRPPzsTFRxqnZ22IyUyqqSnvde1pJ6rukZHSnlSPrGjWR0JBRXRk4+cMiksPccxLjre +taa2wMHEsrS1uc71mYyLpgYAABmWhoigsEDLKBUOEDK9pVYwKV61u9FJvK2co6q1vL7iVTk4 +RJuXLAwACDWbj5q8RKrHPCgdPaqnw89Wq6Sv22y7rLCoj42TFQAADKmPipumscYoDA4RPr/G +Lytqva9GR9ain6OrrqGkrko/UFLKlp4ZDAIMWZ+ZnJ+qnSsYGym1pcooybSerTwv46253OuP +ho4UAAAKqZKTm5OPnDAHDR29xCYcL6qs1SM2qZqgu8Sol568KjO+vryYmR0MAQcsq5ucl56b +KBIdL7u8Nx/Ir6zEdsKoqLnSTJ+OiZ0KAQken6WbmY6ZOhEKJTzhKi1oqa4tKTOtqa/DqqGl +sFB85Mg+K8+OmBIGARSypq6djZCZFAwg1L05LUSerGY/r6Cgxznkua2ul4+oCQQJHKOunpiN +ny8PDjEvJyBRr5+9KjvOs7yxrJ+ku8e/vs1NJkuOmQ4JBRO4draWhpWfFxRLMB8esaqa/SlI +uruxpaGctNnJvjhgnJsTBwsSsN29noyWuiMROygcHsesobQuzbvCXa6poqu+sLLJPC8rmose +BQsNRkE+n4WJqs8Y1kMYE3efqKQ9vLNFH1yvqKe0qazKKy4pLkKkrhUYEBtQQa2ajaW0JR4v +Hyg8qLClub3N7+3brLeyc8fsW9qsj6gJDBIjuUibjoitQiUeLBEVJqi2t7e4s0UvTK67t7ms +rcZHUGs3LS2ZkBMJDhNEKNWahI6vxSfLHhccqZ6nn6utPygiwrG0q6upw0csRDcmOZeeCw4O +GcItrZKFmq1fKbYfHCmkrrSwv7EzJSnLU3fXu69mSUBPO7GZmxsKFhM7K7qPiY20ty5GGxEh +Zqq4o6Sf1SotPexqtKuhr8XlTzosIx+jkxMKGRVeKEmbiZXCqSq/JBcjsLDIpK6lczE9s9Xb +trWvXz9JUisvs5urDQ0WGzYio4+ImLe3UkYSGCe5w7Ohn6I6MjJcS8yvpKO5w/ppNykizpS8 +Cg8XHTMdqY2JnKKqxdsPEiPXY62inaM8Re/jPfK+p69z3FE4KCvbnpoYBxoSKSFHkYqNppnR +wBsMFyA5OaOfl6XDur3GYrixn6q/veo+LCo2rZ4yChUUFyUcopCLm5mmwUsMDxMiLb2gmpis +rL/eP1HXr6y6sMLkPDNUuKa5DhEXEiscr5eLlJiauq4SDw8cKkKsoZKdn6euvN1tzKzDxd9I +NScmM+u2OA0aGRwvI66bjpqWoaatHRkSHiQ0RrKcnpuipKmy2s6/T0Q1Mi4sLD7PukUeLSUs +NClJ4a2vqKmmo7a6UU1GQjs2QVDJyb60rq6ytcPNdT8zMDIzNTk4MDo9NzoxMkDrwLmuqqmq +rre9ydtMNi4sMDo/Wc28r6qrqquusrzN6kw+MyYiIB8hIycuTM28s66rp6isr7S6yGY9NjY4 +OT1azLesp6Khoqiwv95NOi0hHRwbHB4iLEH9wLKqpaOlqKuxucxLODMxMjIyO2S+sKuop6Wp +sLzVTTktIh4dHh4fJCtBy7erpp+dnp+or7fDaz4uLCwvLzlvv7Krp6Wipq6/5UgzLSIbGhoZ +HB4jLk/DsKijoJ6eoqaststLNi8tMjU7eLytpKCipKartsxNNC4kHBsZGBocHypQxLCrpqCe +naCiqbHA5UMuLjFAZywxraWdnp6aoKxIN7yzSwsFCQsZExw8nY+OlZ2WoLghFxclLil3r5eR +l5ydoay5Qjs7NzctKS23np4jCQwJGBUaxpmJi42gnbojDwkPG1VbpJaNi5OdrKu5wPjdx11E +LyknO8O2wQwHCAccGcqgiYiKk8CsIBwLEh7CoaSVl5CcplfJtMm04rrM5jEnJCQ8cbs3DQwL +EyUvs5uIioqdvU4nHA8bIauinJ2bm6WvNVNKu8HT43NgMC4oLT28rMoTDAoOIy+1pY2KiZbD +OB4cEhUZUamcm52dn6PVPzZQwri//d9YST08ONWvrCQNCwsfO7Gpl42LjKHNIh8ZGhgbMMef +n52koaq9WzpJU8pcWDo7Pz0/Z7m1+xkRDRUq8q6omJSOk5quNyofIh0fJDi5p5ydm56jsMpa +NzYuLy8tLzI+0K6uSSIeHys8VubbvbSpp6OmrbPByU88KyktM0122da/urOzvcDN2WBMPjo7 +OD5HNysrLDA3SEM+V8qvopydoKKkqK28QysjISYsLS82S8y3r62qqqustcpXPTEsJx4aGhse +KCwrNVW5p5yam5qbnJyfsu45LiwrKiYqL0i9r6qnpqeqstJFNy0nIBoXFhkcJSgrOc6to5mZ +mpmZmpyit2w7MS4uLSouPuK9sa+tq6yuuMbpSzspHhkXGBkeISUtTbypnp6enp2dnqKxy04+ +OTMsLC44Zce1r6uoq6mvv+FLOSwfGhgZGx4jJCYy4LSlnp6cmpiZm6W/aUI4LiwmKTFC/cm7 +u7KvsbbF/F1iRSwfGxobHR8eIS1qtKWen5ybmpyeqb7abFk/PTMzOUjt1MC5rqurr7zSVkEy +JRsXFxkbHyEkL+2ypp6fnpyZmpyfrb7Sbz40LCktNUZezr2zrKyvxM7F110uHhgWFxofHxod +K7uknZ2emZeVm6W5zd9IOykwQr2trquurK+7XUY9MjE+yegeDQoMGSc6RKyYkpKjv0hqOSgb +HVGompuXlY+RnsVKWU1CJiQoMy4pICTon+gIAwQVSrqunIaEhJhVKSsfDQ4QQ5+WmZaQk5tp +Lju8yt5E+b5KLikpIS5LtywNDQ4mRO6sloeKj7hINiMTDxwypaiin5qerOJDzczhQ2VFTS4q +LjItNr2dZAoMDSNVyKWOgouPtshAIw4MIjusrqWfmai/393Bd/nDsOhALjU1Lx4p0qU6BgsS +KjI5o4uDk5u4rUAXDhvNy6ukl5mhZtvDUjpKubTLOGlPPSolLE6utwwKGxU5LKSTho6emsH6 +FBISQEReoJuWpK+/rFhD2aqos/tK+S4jJCkjMb68EBEZGTcwqZiJl5qbuPQaFxgxJ9annZ2q +rLCvR0RqwtPiUedNMDg7PEG2pBkLHhEmKbWWi46aj6x5FhcUHhsqpJ6cn52krjpJ5WFavrzC +fDs9NywkPaglCB4YHyLHmZCPpI6gxCAhGhocJauupZ+Ynqe5ucNrW728R0tBOzAuME22Lwss +HxIfP6Whkp2NmrftTCEUHBw9Wa6emZyanam38UhHNTNJNy81PT09uFYOKRwPHCzItZWcjpih +sMEjGB0YIy3Fp5uYkpWco6zSQi8oKScmKDM72a0fHcgUFSA6J7CfnJWcmZ+uKjYdGB0jKUyy +npeVk5Sbo6tOLCQeGRsdLNYcIKYlJ2ixIW2q5q+upbet77pILT9GLDbFwLKinZybnqKv7jss +HRsbGiQ8GDO8Izuvui6cp7mmna+6rU1CLzAvLio9SWmupamfnqWmqsBNOyshIB8jLxwe6yIl +ysIqq5/Kp5isx6TIOFZRKDFRNDfNzcevqailoaOpq7XjOy0nHx4iHxwpMitJyP7gqbG+qKvA +tK7HwrleP1Y4Lj4+Nk7n376ws7mxusbD3U9GOjU4NDE1MC8xPUlvzs65srCsq62vsr7H1FpK +QUI8PTw8P0JTf83Cwby6ubvBzdpbRD04NjQ5OTxASmRf7tnPwr2+vb2/xc7pc1dJSUlPT159 +7M7U1dfW3PDta19MRkE/Ozk8P0ZNaNbMzMO8uLi3uru8wMXGz+3xcmdXUUdLS0dMTE9PT05O +TUtJRkJETU9hb+Da29XV4ujZ3dzXyMbBwsfGzNTc6V5aWnBhX3v8dGdrY1lVVmJmZ19ZZlhO +UFJXVV9f+ufl1dPKx728ubq9v8PK2/pjTkVKR0dFSElKTEVOW1RaVVBXXV5obHB2aW9nWFpX +bNnTzsXBxsTFy83O1d7l7mrn/vn1e917eVRRTEhTTExXW15baV5dWFpeVmRvfPLU1dvc2NXX +2t3r9Pl5ZuPta9jl29ff5nphZFhealtnc2JaXmJfYmVkauDq7d3o4vNsamTz3d3Vz9LU6uHY +fOZ5+f9y8Hvt9Pbv3+Dj4NzY3d7sbXFrXlRtcGp4aV1ZZV9WVlpiX3F9eO7r+n9tXlpTT05Q +U1phZ/HZ1c7S2NTY1uPc0t7m4vv+7uXv6u7+7Wjl4uDm3uji7GJYTUpHSk5QV2d24d3Y2Nze +7Otx5fdeXl5WWWdjXV915uLc293qbvDn3uB3b2VseWxeauDa1M7LzdXY6vjs+2pYWl1eUU5W +UFFb5Orezs3U0svRzdDP2+HxX2VmWFhVUE5eb2/4/vpzaVdcXVthXF9mfurf1dfW3Nz1cWlf +XFx5afXyaGhtZWRkb+vj19fU1trf5u5iZV5iZ2NmW2d+de/b3t/r4OVyaF1YVk1SZF91X3jl +5+fj3+nj393naGBfX21uc3JfXnP5eGd26O3s6ev08eX9bmz7dPrc6ujd19zf6Ozp5O3m52pq +YWlpYl5eXWLu49rT0NPS09Xc6uNka21iaF1PWe7t7X3udm9vdnxjWVpXVFlrXVNkZ2Zq6/Xi +9HX+dfn9bmFmdPPj5Ofk9/zd3tXU3N7b2uDg2eJ3Z2N0enT+9ujf3trj+2FOTU1NS1BPTlhh +Z19jafTp3+PW3u3f7Hdxelpm/fXl39Pa39jT0tjX3+/gZOxqSnBYXmhlTV9fVXl539/VenF9 +V3zrXG3o29LNzcvW397R2dXX59/r/lVNT0pARkxRTVJqetbe2MXXzFn0Wld8VFhXXmtu73Ht +6uHPxtB+09/Z+2Vd29z9Ze/e5Ovo+HrwamlUT0paZlxrYHzy7M3O4U5L1Z6tI05L5ygsJlqm +OsG5nrizRlbdKSEgPyw5Premn6SknaeszNtFOCQeJyUlJr6jUS49Ss9GNDWqnbmvq6Gqtz40 +3CwlIzlK7Me/oKCmr7G730IsMC8tLC4vLC2+l60fMC5RQS8sxJGfoKOdnq52FxscGRQYKDip +pKCbmp2uuUtBPiwnJzIxOTk4Xe7QbNm0nZ45LDL6uL2+y5qVmqGwtnlPHhUVGB4iMj23oqCm +rrPOezcqKSksLTU3QElUV1/Vpp1MMS4v0r6u2qScnZ2nrH7LPiciICQoRUu+qqahpae8x1E1 +LikrKC4xO0E/R0VmZHDOp6C+dzk6cb2z2baxr6mvvkVBMC0rIyMlNT/xz8C0sK+/xudlZ1NK +Ozs5Pj9CRkhRc8/IvqWZp/1AMEjltsbPsbGoqa3VRz4uLykoJi0uMj5AXFzc18XAx7/JyNPk +X09MPz07Pj9RadzJzMW+tKmqt/w9OEnKxL68vb+/zn5VOzg4Nzg6OTc5O0BPdOTez7+9ub2+ +w9LP1MzMysjJxsHFxsnP3GZbZWnr82RURUZJXXhdWk5NVVpRT1NHREA9PT07PkZKbN7SycrJ +xr+8vr2/wsO/wsnT4OzwdFVUW1FXWFFYXlxYVVxoaP7c3d/T193u72BcV1BURkRCP0VMUFpf +WXZ43szJysjFxcPAwcTMz83c2/FmY1pQVFFHQ0VFPz9DSk5MT17u29jc4tDJxMPCv8zW0Pts +XVVWWF1t8fbu3dHNyMO/wsbExs3I0nZqVE9LTkxFQkJJTkhIRENKSUhMR0pRV/9s4dPZ29bN +z8rJ0czLzs3N2dz44trf2t/Y29bPz9HnbmZdXFpUUUxLVFFMV09OWWX8/uZtf2NRV3F7XFVc +c+vYztrr3NvTzdbf5tzY6e1qXV5RWFpeZFxdb+bl6X3+cfB+b+jnb2Nnafjn4uXq7Ozj/Vpb +WV5tZ/39+d7T1NbSzdXMzM/Nys3X7O5iU1BHTlBUbGhkXFhRVGbzY21xYnhgWFVPTlBoZmL1 +++Tj59/o1eHl4OPU3+Po5uTd5+bc6N/l29vu2tzc1+RyY1phVV9sT09iZ2lla/VtZWxfcur8 +4W1bZl/6bFpnbvrm2Hpl++F77NPvaWNYY2rs2NzhbfL6fOfh3t/i39jr5OxebV9naF5rZ1N9 ++FtybdzX087c19n1XXnf1dLecfDP2Hl5U0dMYvz2YltgW/7u7ub9bGZnZl9WV1VUYV5dbVpZ +8+/q39z9bebd1NTc39/Y1tPW5Hfp8Xvc3Nzy7+To7vVZWlFn7+puTVBR/mluVk9hfd74ZmFq +dmz9d2Jhbm5Xa2B88HJgZ9/Z1NvieO3a3s/Ydfnt3enZ2+z9eurd299nbWnn/1BQXGl79Vhb +WFNPV+zf2tLX187HztHOz91+al5x4+by721Vd2pYZ2NqaWVOSEtQW2RaW1VXXVx+6+x99f/s +3N/o5d/8393d2+Lf3+bf1tDM1dTvfnHm5t3c5mVeXk5eWFtkX15XTlhhbGzuY1RUU19re+/R +y87T6H10bl/6xr29zFIxJiYoNruhm5ujukIrJCMkKCwxO1zMua6rqqurrKyvtrvHzNHhRi0g +GhcaJ0qxnpyfprlPNCspLDI9YMu7sq2rq6ytrK+zvMxhQzpAVj0tHxcSExw1uqCbnqe3dDUn +IiYxdbSloqGgoqaqsbq+vLrBwsfIyk4zHhMODREdaaKUkZObri4aEQ4SHTqxnpeUlpqepq6y +tLazraqqtlcmFg4MDhQk6aGZmJ2vOR0VERIZKs+kmpSTlZuirrrEwL2zq6WkrlciEw0OEyJj +pZmXmqPdJRcRERYm5qWZlJOWnKSwzEpNwqyfnaZWGg0JCxAlxZyVkpquMxoRDhAZK8iimZSU +l5yirrS9vbyzr66zx0ImGhQTGCE9tqmipq9fLB4ZGR0u2qqcl5eboq28uq2in6XEKBcPERk6 +qpaSlqk3GA0LDA8cOLainZucnqSjpJ+enaClrrzReEI3Jx0YFhcbJUS4q6av1isfGhsfNMKj +m5eXm6Kuu7OknJmdrycUDA8aQ6SVkZWmOhkNCgsQGzXBp6KeoKOlpaWioZ+hp7HM+2xtVjcg +GA8QFSN1o5qZoLctGRMTGyy1npSSlJujt87etKGYk5qvHA0GCRE6nY+OlqorFw0NDhgjRsGt +qaanpaSkoqKkpqiwtsK8tbfaNBwRDhIZM66bm564Mx0XGSA8t5+cmZyfrrm3vLuxp5+dq+wd +EA0PJcWclZOizygbFhQWGyEsUt63r6ekop6dn6GkqbTAv7yvv3wiFg4NGCmvo5yfq0olHBse +KEjGr66qq6iqqaippqmmo5ucrEwYExAVJO+empq0OhkSDxYeL1XnurqsrKWqqq6usLWxsKmi +n6nLHxUNFia1mJOVsDQYEhEbJj/jvbKxq6+prausrrCwpJ2apNQaDQsSOaGNjJCvIQ8LDhUi +LUdlx7eqpJ+foaOpqq6sqqGepr8cDwoOIsGUkpSxKRUQFRspOkZJ0r6pqKSqs7a9trGelpGb +4RULChR7mYyOmUEYDw8XIi0yLTNeuKCen6zFycetpJ2alpurMQ8OCx+3l46UnykVDQ8THCEn +K0exo5uiqbu9rqadmpSSm7obCwoOP52NjZbPGA8OEhkeHyguv6WamKS4TuS0oZmXmJWcrS8O +DQser5aNl6kfEg4SGCAgKzy9npuYpLzoz66fmpmZl5+6Hg0ND0yjkJOkOBUPDxIWGRkjNa2c +mZyyzv23opqZm5uYnasrDQ0OPp2OjZvMGxMRFhcaFx0wtJudoLL217GhmpyfoJmZozQLCQkm +oI+OoksaGRsfGhcSHDetmp2m2UvNqZ6ZnqWjl5OePwwJCyybjo2iVB4eHx8WEQ8ZS6eXnKjA +bryopKStt6iakp1gDgkNJJyUkqn4MjU3KRYODxlTq5+nwN7Nsqelp6yrmo+Qph4IChBlnpqd +udTdxj0cDQwPIdmtqK6xrKelpKmqq6eclZaqMRIPFy6uqqy9wtnTOR4RDxMfPc62r6qnpaap +rrOxqp6Wl64uERAYL7y4tcS6t7DVKhcSFB0sP2vHr6Senp+kqKqqoZubqkEdFBojRHPpUe3Z +x8RCJx0bHicxPli+qZ+dnqCkp6ytqZ+esj4fHCAxfF1INTc/3uE/KCMjJi0xLzI7cb+zqqal +pKSkn56fr04uKCksNDMuKisuRtnM1eXe2Ma/w9hMQkRR3MO+t7WxqaGgq7h8RkFOOi0lIiEn +N0RJQz5D6svXTDQrKS04T9m+r6ifmJOTmaCtxVtFLyMdHB0hLTU2MDM0QPR/TDw3PFbGuK6s +q6ainpmWl56ns9dNNiccGhgZHSUpLC0yO1PWz3NOQUVd18W7s6ymn5yYlJSYobFPLyMcFhQU +FRgfKTA8TnbJuLm8xcvLxri0r6ypo5+dnJiXmaCwTSofGRcTEhEUGiEtPFLQvrCsrK+/7EpM +69W/s6qjnZuZlpaYnq9SKR4YFBISExYbIzRM3Mq4rqytsL3bV17bxLm2sauknpybm5udo7dM +JR0VEREQEhUdKD6/rKqjoKSoq7fbXk9GT/jCtKukn52cnZ6hpa3fMR4YExARERQWHCY507St +qaWlpqmuvNVaQkRlyLuvqKOfnJubnaGpsn0uHhcSDxASFhoiLEm7qqain6Cjpqy3xX1GOzc6 +Rfq9r6WfnZyeoqy3xEAnHBQQDg8RFRsjMX6sn5ybmZmcnqOuxWk+MjU9SF7Dtqmhn52eoqu7 +3U4wIRkRDg0OExkfLFa5opmVlZWXnJ+lsPY5KiIiKC44asqzo52dnqGqudFQQzMcFhAODQ0U +GzHNrKKYkZSWmZ6pscs7Ly8wMDxS2rqvp6KfoaWrvWk3JyAhIysgFh8dFBAeLCi1opmUjpCT +laGxzTMdHBwYHSw1U7CinZiWlpicqLRjKyMdFxUXGygfGE0fFRw1Ni+YmpWPjI+RlKSuUiUe +HRYVIR8gTLytoJiZmJqdo7VcOSgcGxwYGSQ9IRy8HhUlMDBKlZqOjIyNkZmmriwdGxMOEhkc +JlK5qJ6ZmJuip7dFNiskHh4fHh8mMfXCJWasGi9at8ifjpeMjo+Xn7F0OBoXFg8PFh0fNcy5 +q6Sfn6Koqb59UjUqJCMgISMoME2uxjKeuyrVybdVl5yYj5mWn6tXTiUUFhQQFh0pOsiuop6f +nqK0xfIyLSooJyUpLj0+W8mxnq0qorYgTd2q5ZaXl5CioLZNIB4aDg8UFRsoPtWtqaCbnqGl +rtDeRTMvLCorNDFB5Gnt672om9YtnC0cNMSuxZGdlJGjpLNMFxUUCwwRFh43xaiYmZqYnq62 +zToyLCsrLzdjzXHPy8fqYXi9osocurseMf6ht5eYm4+mu9pSGhEYDw4RFR421LWblpuamp+2 +yEc1Liw3RlRdubO5tbq8z0kzSK2nHh6qJis4p5+elbGUnkUtLSENDxATGxwm7K2xqJiboKms +sr9oPndYRU3KyMnO3cLVY07mXDszXZ2iHC6uOj44q6OUoPKWoT4eJBsPDgoSJB4fxJyenpub +mqbQyLDUPVS/s7vHvqu4R0BVTjIvMz89L1qcmyEjVDf2KDPDlZxBn52rPh4aGRwNCyBFUcam +mZGSn5+cp2Y1OUziT1mzo627yu9ZLyUjKyolKCw6+p+YPCo8Kz8rMDmckq2foKa0PBsQGRUO +FiE9sZ2dmI6Sm6a3b0tIMj3WurCqs73JSDAmIh0fIyMrOEj4qZOZOyseI0k8NzGZk5WUprG9 +7RkMCwoOGh8ss5eQjY+YnJ2pVDcuMlfBvbWprbDNNCMfHx0fHyMvUcy8oZKadTEbHjntTzqf +nJWPmrA4KxgRDwkJEyjPoZWRi4iLkJy2MCsmISItQ7ejrL1PNSkmHxgXGB4sQ1W+mY+bry4W +HjS9xKyfp5SQlaVPHg4PDwsMEhs5no+MiouQlZqrSCcaGiAy4a6mrK+30UApHRcXGh4pMj/g +npGXnVcXGR9aup+erp6cmp2qMA8LCQoRGyM1uJ6QiIeJj529PjArJiAfKG+soJ+xSiskIR8e +GxodI0GkkpCXpyIbITqtn5qoqaWln6bGIRIKBwsRGyxTuqKTjImJjpu2NyUkJSgsMT7Nraus +vD4pIR4fJSkrQ6+fnJvAJx8fOLSal5qetr7ByUwsGQsHBwsYOq+el5WRjo2Okp9oJBobJDRo +xcHKyc3XdT8vJR4gNr+xrmwfGh00qJONj5emyGNIPC8fEQsKDRc5rZ2YmZqYl5aXn7wxHxwe +K0nOwczcdeTKxNDbvLm/6SsZFhkptJeOjI+ap78+KiAWDQoJDBg0rpuWlpebnqKqvk0vJSYq +M0zm2e5QQt+mmpaYtx0PDBAppJKNjpafq7nK4C8XCwUFChlcnI+Oj5SZnaOv/yoaFRQZJjpc ++b+qpJ2g2iwbGyTJnJKMj5Wfr89TNx8UCwcIDh7AmY+Nj5GZoK9wLxwUEBEVHTC6oJ2fzS0e +HSzRnZaRlZqeoaKorFAfEAsMFCu9npiXmZucnqa9MRwUEBIVHTHVt7DJKSAbITqvm5mWnJ+k +pKirxiwbDw8VKMmgmJaUlpaanq5uKx0YFhklP1JLHxMPFCfAl5KSmaWur6y0xycVDQ4WOqSW +j5KVmZqdoK9NKBwYGSJGxsoyFQ4NGkyekpSYqLS8sbjSJhMNDxxanZOPk5WYmp6mujsmHR4q +X/FDGwwLDiSwko6Rmaiytbb1LRQMDBQypJSQkpmcn6OsuU0yLSw8u6u+SRcMCw8fzJ2dnKKo +qKa0OBwNDA8hwpyVk5SYmZ2kvF8xKz2tnZ21HAoHCxvPn5ueoaGcm6E/FQkIDiO4n5mampqZ +napOLi9KxMW8qrC/OBMNCxIet5yXlJmdoq0uHhAOEB9doZWVlZyhsslHTEdMuJyaqGsPCQoT +J76jp56cmZmeORYMChInvqKYl5SUmKTXLCk8S91SYK2mpdQYCwoUKKabnZ+hpqa4JRUMDhjv +pZiXm5+lsufXWL2nmZ++IwwMEyvIqKWmm5iYom4UDQwPHTDUrpyXk5ei5TUvSbexr9c+x52f +qR8JBw4pu5qhpqOeoaUzEg4RI9Siop6kqq+0ybafmpxeHQ0RINimp6eupqanVh4PDhYkSd2/ +vamin6m+SUi+p52eo6/Heq2lyS0RCxAus6OftLyxsV0vEw8ZMrmjoqepuvgzNs2akJlpGg0a +Uaqmt8q6np6uJBIMFyM+6O69p5ucplkxLsmpn6KlqK/E1arMLRwMDRhorZ2cqaioxisbDhUi ++6qcnZ2hukYsN7aXlbkcDg43qpyipaacmKoqDgsMGiUzP76ilpeoQSUtR7auqaadmpy6RbK+ +Ox8KCBNqppqcq6Wgrz0eDRUpxKmfpKGep7lCO76XkaMeDQkd5rGvp52Uj6UpDgsNFxgbI3me +kZSn2jpozclc27KfmqLNNLOetjUNCBI+pqmktqGWmVQeEBQ1zMDTsqycpeMuOVupl5iuIBYQ +HyksQKuWkJKvLxwaGBcRFSW4mpabp6u2vUgwNL6noKSyzE/CnLIcDwgUMq/cr52akpo/Gx4Z +Jy4vRaGbmqZINtu4wa6rm5fMHREUJEDJt5iVkpvFHhgSDg4PGEyel5aeo6u6MCQkN7yqqKWj +rLs/vasnFwwNHcitsJaVkZSsIiMdHiUkLbWcnp+zys/HRE1orJaR0xkSDiAjJzKdko+Ws0Q3 +HQ4LCRIvtqWZlpKVp1g1KzJDYLKfnJ+oxkVZrzAUDQsdNX95n5GPkqbeX0sfGRQeM8O7q6Kc +n67My7/iyLiqqS0ZFRcoLEPSlpOSm6jsPR0PDQwVIDnIoJuWl5yns345NT3rva+rp6/HOCMl +YzccGBMmRUlLrpmUlKKsq647IhocIyUoP7ignJ6dnqW6TTA3TWk4FxoZICwmSLeanJyloqi5 +LiIdHB0bHic9v6ugmJWVmZ2nsdg8LCkpKSsrLi4xS+VJODcvXVlJYMezs7a4r66ts7bAzvlK +ODk6O0VR5svJw7y4ub/S3+tuVUQ8NjY1NDQ0OUBV28bBuLO2vcLM2u9tYk9WYF524d56XmVY +U1xletvV2NHK0d1sWGFUSkdAOjo+PUv40szCu7eysbK2vsfebWRaS0BBRktOWVdf+3t45e1Y +SEA8ODg5Oz08P0NKYNfKv768ubaurrO0uLy8v8xhSUM+P0RLUk9PXE9XYE1OTUpLUmx8ZWh0 +U01UTkhLWerOv7e2tLO0tbS1vMnZeVVGREA8PDw+QE9t9eZvYlFPTUVBQEJBREhERUtYVWnf +1MrBvb27t7W3u73DztDOz9jU3/n/dFpJSkdDRUlOSEdHR0JBSEJBQ0pUXuv3ZHne2sW6tLK0 +s7a4ur/YVk4/Ozw/QUFJTVJaX25SRENDP0hZWGNzc+XZz8zLz9Hc1M7GxsbCxsbAvcbS+FtY +Tk9YTEtLUVhu8nNmVk9OV1xfXmd56vJ2Xk5MTExe6tDLyLy7ure3u8LaXkpESkY/PT9ES2Jf +XltaTUtOSENBRlVr7tra2dnV1dbKy83JxL68uLm9xcvP5m1fYFlMTlNUZWFWT0ZHQ0FDP0BL +U2zw6Op0X1hST05RTlFl2cm/ura2v8S/2M/3emNsaGrj2fpmamFqb2BITEtPYm5aXVpk9m74 +VVJNSm3YysbFvbzCvr/Axd5wTUhaYGj7919YTU1aSEE+QEZy3Gb/9HDhX01JSkhBRFDXzczL +vLe+xMPHz+NfX+fqyGBXz+7N3eXlXlVURE5s3Tw8PkRrQTpO9Fte5cOtrbe6uLXAV0RNOjAv +NENXS1bNtrS7uLW/3UxIRTYtLT/65DUvSExYLTJeur/FqZ+ZnaWoqLY7JB8iHhkbLeS5rZ+X +lpyjrbNkKB4dHx0bHSY2U72uyL69U8k8VrympJ6ampihtuA7IhcREhgdJES5oJmYl5ecqcw3 +KiAbGhoaI7yuJCknKcAlMrSUlJeUl4+aZy0nHBUPEidUdq+dk4+Smp2lbyIaGhsaGiU9VVA+ +PEE2KCQmK7ufLj60z5mmqKKOk6WasarDIxYcGxccGy+6uLyonqClueBoQSwtM0LK4PjT9z0u +KyouJyS5lr0q4jyiofXdm4ymoarRri8ZFSMiHS0zuKCkr6ejyEcpHyg0Ly9zva+35UM/OCot +Lzg7XZyXU1pIOrw9PS+WlayctrVvPxwPIxseKzy9p5iipJ+qsdpBKzY/LThP1dbDWThKTDw+ +SERZ1X1r6FVQoJVSL0U2vdToJq6X17ZKMC82PhQZIB87UcrLoJifnqq1u7bWL1fc27zFfV3A +6D5JNyokLqusMDIjMbeqrzucmp2XukgjNy4XHRYdPr6vv6Wppp+6QS01MTVRNUS7rq+7zT48 +VUI8PUBK0shSv6KnxEkkIjy5t7elu62ep88qIRgaJx4eJzfWqJicnp6qsbrQNSouKztv2sG2 +tcHB0UtCNi0rLDnFurvOPUFMta2pqN3D0t/kQDYeHiAfLjpLUsuuqJ2bnaWzyz07Pjs8O0Jc +ysTCvtpqSDMuTrjBuNwtLzfFr52bsrhOPzs/QCsqHh0oOs22sLm+tru1rrLLRTUrLDg5PUxT +VezNw7a0uMS/sru60EE5LDQ/uaKgm6Otv0IxJiYgGhoaHidAuqqenZ6fpau3wW1BNiolIyMn +METet6+ura+3x/hFQE5SatdoTUdLfrqno5+hrso9LCEfISAkJigrM0zTsKWgn6Gkq7XNZ0w/ +PTw3Mjc4PU3mxb69vb/Fx8PGzvRDOThM5Mewrq6wtslOOy0oJiYnKi84PmTIubOwsLW4v8bN +195xTklJQkE/S2njzr/K1ftNWO7Dv7mzvMThXEI9OjY9Q0xXYe3m9HFj2MrDvbu+ytlhTEg/ +OTg7PEJb49jJx8HCx8zR397qV0k/RlH1yr62tbnB2GdJPjw9PTs/SVNZX1lYW3rm1cW9u7y8 +vcPNc1VDREZIVubOz8/V4Pl3X09Xb9DL1t5/X3PCv728xtJoTkI8PTs6Ozs/SFBVS0hBQkdO +4Me8t7Kxsba/y/JbU01KVVxcZ2poXV5OTVFc2sjOzOJZVG3Yy8HK0N5qZU5KR0VIRExbUEpD +QD08QU3yybivrq2utb/YVkA9PENNU1t3e/7vWlZVTUdGUG/byL7Ey9rubHDf6dnIysbV7PdZ +VU9PPjg4MjM3PUvpw7CrqaanrbW/5k5APDk2OT5IWWTkbVVYTUpd48fL39tTS09e39O3u8TO +U0M0Njg/UF1gRTcxMjdKxbWso6Gjp624zVVFQTk3MzIxNT9GZdPM0M/tfvvazcTPe/8+Oj9Y +2MCzubvVSz85QU9dTEM5KystNmi9sKuoqamusra930w9MSwqLTJCesi+v8TN3ci1sqy9PC8j +Iy7VrKSdqblwOjYyOjc1Jx4fHy3gq5+bm5+kqq2ur71OKx8dHyc2Ud3U419i38a+w2s5OlPc +rrFUPCcnL7OclpKcquExLSsrIx0UDhEaM7CblpSVmJianaSzOyQcGh0mMD1KTFjZyb7FXzsx +KywzOkhD4aymnZ6uwkzux6eirLQ5LCcpKB8eGRocI0O2pJ6dn52cnJ6kukkyKS45RExBOTg6 +OUpOPzQrJSRSq6ag7B8eI82djpGWnbSrrbD7KhEJCg0bN9i1qqWYjYuNl7UrHx0eIBwbHSZV +pZ6frFEvLCstLiYjJSxRppSSlJ8+MzfVr6eyU/hLsaiuTx8RDREVHiouRLadj4uNkp2vwspV +MygeHy1Mvbl6PDQuOUY3KyMiMK6cm55IISs8qZ2dwF9WcK2zXSAUDRIaIjAtL9Kfk42Nkpuj +qqy9RSkcHChCcfZRRVbQu7n5Qy8oNPqrprjyKCxGtKKlqcm+v7DANh0UEhIaHR8kL86il5GT +mJqdn6i/MSIfJCw2PkBE2LCoqK7NNzI7/6+6OCocJ2mnnp+nvq2zsc0tFxAPEx0fIyo2uJyV +k5WZnZ+mrs4zJyYoLTQwMj/fua+ur8NeaGPCsPItIx8yzaqkoqurqLG5Qh8UExEWGx0kNMei +mJaVmJ2gprr9NCgpLTE1Nj/Nta2opqmvtrm7tbFDJx4cK0m2raetqaKqszocEQ8OERMVHSvJ +oJeSkZOXmqG4TS0kIyQkKjFDx7auqaanqrK4wLar0zkmHylGtbOstK6kqbRFJRkZFhQUFBcf +O7ujnJaSk5Wbpr5WNSkjHyAnL0HOua6npaqsrrKpsjYpHyU31sfMrq2hoanNOiseHBgUERYZ +IC9PrZ2WkpKVl5ymvz8qIiAfISQtRMivpaGioKSipb86KigtMjQ567uurbe+zVc0JhwaGhka +Gx4pQbmpoJyYlpeboq7OQi0kHx8jJy9MwquloJ2en5+nusxSOzkzLS8zNT48P0xGPTs2Li0q +KCkqKzA5RFzTvLCtqqSjpaaorbO6x+pPP0E8PEdSbtrHx8bBxtDidFpQU09QTE9USj9CQjs6 +OTYxMjQzOTxCQU1q58W5sa+sqKako6WorLC3wd1ZTz43ODY1NjcyMjc2Njg8PT5KfM/Hv7y9 +v73DzN5bRTs8PDo7PUFDSFdl6dfQzcS5tK+urKyurbC3v9RlR0E/Pzw6OjY1OTo4OTw9QExt +2cnDwL+9vsTcXFFGQ0JGT1dcd2BbXVpOSk5SY868ubSurrCxtLjG31ZIQD9DQkJISUdIRUA7 +PD1ETF3o2czHxcXFx+pcXWFZW97Tz9DMy8zQ6lVGT1Zl6trNxr++ubq8y+R0UUlGSUlEQENF +QkI/Ozg0NjpEVenNx7u4uLm/yNf1++nn3s3OzcW/xcnO5VhRSUdLTFll4NDMzNnhbU9NTE1N +UF5rZfbjZ1ZNST8+QkRQaeTUysHFy9njdk9UV2lr48nGv7y9xsjV8GVTT1RPTm3o38/O3O9o +VUxJTkc/SFpn6NjV4uvd3mZdbe7u2cXDwMHH0/N7cF9WT05LZO/w1NfoX1FOTUxJTE5O/NrW +2eHmXltdWVNLTU1c7tPOzMbMy83U2/diXmFo3dDR1dzM0t3T3WhUWFlPU1xbZHrt+Xp2dmRY +W2Fo9/Xwd29fW1lVVU5TW1JYfdPNyszP0tfZ6GdmZlpSbdrz7tXP39nN53Hhe1Rh7WRvb2rv +2PP02k5JX0dKb/L91M/MxdDUzt7h8nBz5Gte81Zi4O3l51lg309L22pV795W9P1N7F9WVltY +X/VZZeJsZ97iafx7U2dv4M7e2srPydjF41FkP0tISWdO1tT3ur3Dw9tubexHSuc/SV9GaGnL +SkdmQ1xZ4fZywszNw8vHaW5WSuBNU89PdMrl2snNYFfaREf0RfJgZvDnuOnMy2nRRl1dZHVK +3l1t3endR2VOPl9v1OzMxMa517W++Nlj9EXXaUrq5M3kxfBc7klRV1FLUGxKX+TbZ25gPkhA +Pk5EU3tz7M/K2djtZWT6UP3K78rHy8LHxdTW0d5QZ2dbc3rX1NbW4dJLTV1CQU9iSd5oWtDV +7V/ePVLpOEzoWU7Iz9m9d23YRkJfW0jY6VnW9crF3+Bk3lzw5fbJVdrE/cDH93lPZkvx6lbd +WuHQ4s7seU5bWEbiREjI2tm7vcPIwlLYzDxUX0JGV9RZ3NpEeGRaW2VfVdZmWcjN/Wt8aE1K +Sk9NSGHT29/Iyd7P0Pj87GVr3OJb18zo0srQZmXlcmD+4eHr28/K01pX287YQzs9MzAwQdLQ +yLqzusnJ6Vk7Lzc5OT5HZOXQwbqys7W5urvgY7GcrxUZMScbG2Gsoq2qkpWqQE/vGw8RGyYj +N6uYlJeSkJekt8c+IhwdHhsbICQjQpifGSS3eB8qqJ6XoZuMkKtErc8VEBYdHR86r56mqZ2g +yzY/NCIfJCorLzI1sZK7FtvLJxxVo6iWq5qOn91KoS8QGx8tLk2vnputoJmrP0RWJyAlJikk +JCwvPanVGjo2HyFHtq6ZrJiPn7KwoyccKiY9RMyxnqO2n6f3PUk0JionKiwjQpi6DznUHhcp +wNqeR6KOpWm7mC8ZLSxEOOeympywm5yxfLnHPj0vNTMsJjar0hEl8BwXJcM0rc+1k6xf2p82 +G0A4Pz3Nt6GkvaGhwEu3ukxRRUo5LSyrnhgduisdIrVRrsFGlqRNOKHVFikvOjtav6mlxqmh +tky7tHvUz9tJNi6/qRkY0CUZIL7orq/Ul6JIPahfGSo2Pm7CrZ+fuaunyUvLwVjp/FU+SKrT +FyotGxomQlOmRaiWtD+9rx8hLy5M7LqkmqShmqrb5tJLUU5HPjbAqC0cTiQYHS07x8DYmqNH +1K83HiopLj9MtqOlqJ6juMG+y+l2TUI/sqYhIN4dGiJCYKy1vpetO8nAIxwoIzJC96yjqqee +q7/Nb2LnZ+vJvqa+HTswFRkfLkSptJyUssO1PhweHh0mLfepoJ2YmqOsvMvaX0dN7LWlPSPC +HhQbJC9AtbqYpsarxywgJBwhKz+xqKCamp6jq7jI3ks7WLy0Rx5MHhAdIz9NqKqYoLyqXycf +HxsfK0C1qp6bm5+kr8Ta/1c/2K62UyI/Hw4ZGy0zqKGYmKmfuzgnJBoZIShYtqGamZqcoa+4 +00YyOs7LeyItKwwYHCYusqagma2frlU3LB8dKCs+y66hnZycnaSorr7sTV7OUjQeKxkOHRws +O6innZqtq9E5KSUeHiktarennpqanJ6jpq6zwOTHzVU1HSoTDhkYKDukq5iepqfXQikgGh4f +Jk3BqqCbmpqcn6auudtc4FlPNBktFhMfHCw0qbydn6ikvuc+NyYnKCc4V7qqoJ2cnZ6gqK6/ +UD88MjgdGiUOHB4oM8S0uaC5qrjS4005MzswQnrNtaumop+gn6WnrLvQWEo5Px4WJw4ZICU7 +2Ke1m6ikrMvWQTUvNC01PlbCtauopKOio6Sor7rdUkEvOR8ZIg4cHiY37LC2namhrLK7TUA8 +Ni80OErcvbCsqKSlpqWprb/uSzkxLygZKRkYKh5AO7y9q6SjoaqotcfWRTw6NzpCa9TCurOu +qqqtsbjMTDgwKywoHy8dICYiPju4wKuqp6emqa+zwtZJSUBBTF3mzMC6s7Kxtr/RVEg4MjIt +MS8oNCQoJys6PsS+rquko6Cip6myvuFXPjo2OkFLaOzOwL6+wsHM12FEPzo1NS0rKSUoJi0v +QGbMurOqp6Wnp6uutcTqUEk+QT0+Q0/nzL21s7O3uL/RVD85My8qKiUkJCYrLz9axrmtpaGf +oKGmq7C830g1LiwqKy45RvTLv7m5tba8xfZQPjYzLCgkIyQlLjlW2bqvqqCdnJudoKasuM5I +NiwmJCUoKzZF7r+zr7G2u8XqWz8yLisqKSsoKSorMj7fu6ynoZyamZqcn6e00z0sJB8eHiEl +Lj5wyr22s7W3usl1QTYsKSooKSwsLjI5TuO4rqijn52dnJ2eoqmxwlI2LSknJicoKy83P0VO +WvHp5XxoWlpJOjMvLzAzO0JKe9i+tK+rqqenpaanp6qttLvL9UM3MSwpJigmJyotMjxHU2ff +zL/Ey8/sT0xYYczAxsO4vMW8vLm7trCvsrCuub7M3E5APDQvLSwtLS8zODs8P0VKXG1g2VnM +0dC6177Rydde2GLP3v3NwsvGwb69xb2+u8fFwObS62lrR0s8NTktMS4uOS5BRl3K3sPNyM3O +y9nPxt3FscC8zbW6R/JI3jo+Xk/NPsvE+d3hxE9qS0dNPk1NUTxOSD1SRGd3WsfD2721vbvC +wt1eWEZoN098ZPrrq7dV2bDmTd/ouuhWx6nDW6++XzovNC8kJCwoJDI9T9PLsq2xsKm0wL3r +5VlDQkw7N0VMUOWnqCy+rEfCSLnBrTtVm2bLx7jnOT8qSCcbJSclKEvitq2onZ2iqavKWDIo +LCQfIi0tNVXLn5c/35xlyji7xKrCL5Wu1m/PcSIoGisqFx43dEi1qZ+cp6ahqOdnSTguIikw +LSc2Sj9NtJWqLKm7rncwzq6fHrOdt7FLuVH9Hxs5JB4fPd64urmdn6u5r8s/LCYrJyYjMz9a +zsmwsKqamzxZzjdJKjr+nsTonK2t5kMuLygTGyUkLEO9qJyjpaCovk0+NjgtLDhITEvWwru3 +v87I2dufljotxzBnLCo8n74mpri+4TQrMj4YGikmMD50r5yjrqKmtc5NOmZELDRDTFZ8zrOv +tLO2w93AoJ8mLlA9yiw52prANqbdu0cpKDY0GCEqKzk3YK2hra6nqazOTG7XPS8xN0A2Nk+/ +usPHzczQq5xBJ+Ipzjsvy6CeN6Crt7IqKicwGRkuKUM9V6+foqufpqm4W2RoPi0vLzg4LzzX +zeDDv7vL7auaZSa+K8EtINW2uSqjvq+tIUM2KR8fKCc2KkKpq6Ohnpqeqq6txEg3LDExJyo0 +R11f07231eCrodlCuTC49B2+ykXgX1K7vTHa3DZNNixGNig5OkrAz76qqq2oqq+ywNxvU0A7 +Ozg5Ozo+SkZESkpb7dDHyL28vrzBy9BiTUY5O0RCR1BTWFxUTEhFRUtPXuHOwbq3sK6trbGx +tru6u8LSXkxBMzEtKCcnKCksMzlEcdLIvLu4trKur6+ws7jF3F9EOTYzLisrLC02Qm/Hu7Ou +q6qrq6mrsLS6xM78T0Q+PToyLi0uKyYxTXrPv73Fx8C+s6+1v8PRXEpAPzkxLiwsLzM4RFjT +vLWuqqmoqq62w+lQQDs4Nzc4PU7u9e3TztLN1c2+vL28uba4vsXiUkI0LCgkIB8fIycrN0zM +tKuloJ2bnJydoaq52z4uJyIgHh8jKy4yRlNj9um9sa2pqaWioqOmrLrhPC0mHxwZGBscHyk4 +d76vqKGdnJ6en6Onr7nMTz0yLSooJyozOkFq1MXEwbmzr62urKusrbK92UYuJh8aGBYWGBof +KUDHrqSempmZmpygqbHA8ko8NC8sLC01NzQ7QU1g3b2vrKqpqKaprLTF6kIyKiUfHBoaGx0i +KDRUv6ylnpybnJ2gp6686kM6Mi4sLDI6Pj1BPkJNTOS/tK2sqaWlp6q1zWA6KyEdHRwdHyEo +Lz5uxLGqpqKhoaGkp6uyvupJPDQuLzdBQz1HSk1SbtS/s7Cxsayqq6y4yHw7LiUdHBsaGx0i +LT36va2moZ6eoKSqsbrD4FdKQj0/SUY5OTk4O0NYyretqKakpaaqtc9LNS0oIh8fHiAjKC86 +Td7Gu7GrpaOqr7G8zuRLNzz+cvE2IiQsOTVJvKqbl5ucm56ir0cqIx8cGRgaIi04RWe/r6ur +srSxtr3cUUE+PzQuNL2fomEgFxsuNvyxnI6Li5GZo6/hHxQQERkdHyQv2a+tvtHt+NVfPjVF +yL3FTzs2Nj/Gqrw3GxIbKMikmpGOi42Qn8s6IyEdGxwiL1LAxsTQ4/xFNy4vNklv2NLw6GhJ +PN+suT0aDxMdvZ2UlJWVlpepVyEdHiYuMzs+2r6wrrPNUk9qzMrXUkdDREQ7Lyguxa68LBAO +EDSgkI6VmJ6bnqNdJhoaJ0m5uMhESdC1r7Z1OzxSw7TESTAoLDA8VL5gLBoRFRpVrpuZmJyh +o6evz0UtMDR+wLK6xlZZZMy9xcToe+/c33Q7MCckMsCuvisUDw8ouZeSlqC7ycGxs8Q6LCg5 +xqylrMpCOW7LtbO+/UM8QkdEOi0qNOnSXigcFxs5r5iYma7RQ0/8wszpRUBfxaqqqrnVYXDP +t7S0wXRENTAqMlXOWy0XDw4bbJ2Pj5WtUi86XsTF6jg1P8+tpqWvzEU/UM63r7e98zwvLC01 +V0s2HhUQFS2vlZKTpNMtJys/3MPXU1natqykpKm40mp+3sC9wd9bS1TKXjgcFBEWLLuZlZam +zywmJjA+T1FPUGq8tamqqq+2wczLytXH0OBMOTxO6lw0HxcSGymum5WaqeUsKTPvvba/0kdW +WMy8r6mnp6u00FNGYr2+PR8PDQ8pqo+Nj6QuGBQbLOK7vFtOQ8m4qqmtuc3awbOqpKSpuXAy +KSYvNDgoHBYUHz2il5OeyCUaGyjeraaqtNvg2LStpqiuucjjzbSlp8shDQkLH6+Pi42fLBUP +FyjhvMg6LSlKvqeiprDBy8Gvq6iprsVTQFhs10IpHRYaJcGfmp69LRwaJFK4qa67Rj1Zwa2p +p6uzu7urnp6vJw8LCx+0kIuOnywWEBkq07jEMSsrbq2hnqez0vjNu7CutL1rXt7H0jogFxEZ +J7iemqNRJRodK92xrr7dRHC7qqGjprG7tqebm6ssDwsMJKmPi4+rHREPGi3QxU4kICdTraCf +q7560riqp6myw1XbvbfPKhsSFR5qoJyf1CkcHi3Rs6/LSTxNtKagpay2tqqcl52/GgwLFc6W +i46cMBQPFidW3zslHCIwuaejrMXTxa+kn6KqvNC+rKy8LBsTGi21nZ+xKBsXIUG5tsg2LDF/ +raimsby7p5mUnM0XCwwaqI6HjaIjERAbNsXKLh4ZIju0qau66862pp+gqrpp2biwtjkeFxgv +vJyerisVEhkvwK+7UjJB362mqrTOxa2bkI+fMw4KDiyZi4mX2RcQFillyjggGhwybrK4zEpj +tqKbm6Cxy9qzr69MHRUTKbealqBGFxEVJ3WuuuI1PNKuoqSswdG/ppiQlsAbCwwWv5GKjacn +Dw8YLmLVMSMeJkzEs9ZKO2Gtnpqaoa+/ya2nrWccExAev56UnsAfFhckPsbPPzAwf7imqKy4 +xLywo5qWne4aDA4ZtZGKjaMuEhAVJTpQLigkL/u8r8ZqQfSzpZ6epK26tqWiqj4XEA4ex5yW +n8IgGx0qQtVBLikx3K+hpKezvritp5+cmZvBJg4LDieikYyVrCQYFRwlLSohJTDKrqWrvG1X +1bWrqaqyuaqcnacqEgoLHFaZlpiuOionLzc7KSMhMs6pnZ2eqa+6urzAwbGjnqZQGg4MFTun +mpyl/jYuMzovIRoZHzq2oZ6fp7G2uba6wb+rnZqfxyIUEBksxq633D9L5LezxzAcFhggQLWn +oJ6dnp+iq7nZ17mqs1shFBMbPbemtF0yNGKypKfCKxwaIDL7u7aurqiinp+krbu0q6WvPh0R +EBcrTsZCKiMoS7Gfoa5XKiMqQtW4uru/u6+npKamra+rray/NSQdIS7fzWApHRkfNcGpq7b2 +P0Tsu7O0zU05QFvLubKusa2lnqG+PicnLmG+wzofGhghNdG9y0gvLTNRxLW1wNxq17utqqan +qKWem5yqzzUuMT/cTy0ZEg8WIT29ucdPQEjMrKWkrbvZ4Mu0rKimqKytpJ6hvjYhHiAtPDkq +GREQFyE30b/HW1zDrJ+cnKOvxNPMurGrqq2tsKyloLA3IhocIjQ5NCEYFRkmQrmqqK7Fw8Gt +qaertsZp/Ny5rqytsbbCxbmpqNEmExATHjI9PicgHCdDtqKenqq2v8C4u7nM3k9a3buqo5+j +pay6y9O5sWciDwkKDiNUqaqvwOa8saajp7g+MSs0Scy8sa2sqKejpKauus1dQzQ8Tdw9JREJ +CQseeJmTkZakrdnNZEoyIhwaIjS6o5uYl5ufo6yxxM5mUV1GRD9fxs89HgwIBQwer4+LiY+Y +qtFUMiweGRYWHzeznZeVmaCsv8tsWVtR71FWQU/MuLZdHQwHBQ8omYqFh4+dZzQmJSYcGxgd +LcqdlJCSnKvrOzU5VOzOzmBYPj04UbbC/hsLBwcUOJOIg4eRojsrIiAhHRsaHjS2m5SRlqfS +LSgtPsW6tb3Zbjg3LywuMFFCNh8QDw8prY6HhYmVqDknJCIkHh0dIDi9n5iXnK9oLyotQci8 +ucBfRzIvLS0wLTRFaU8sGBUTLK+PiIaIlKM9KCAdHxsYGhsyxpyTk5es+iYgIyhLxrKttrV1 +QS4nKSMpKjzlZOQmJR4tspqLi4mRnrwyLiQoIRkaFyQ9rpuanK5pKiEnMF26t6++zkgvKSAm +Ji02RLmyrL8mJRclbJ2LioaOl61BLx8bFQ0NDRk3rZaUlJ21ajY4TU7MeMbPx7pYRyolIiQt +M0rEuLXHLywfQ66YjI2Mm6d5LS0eHRQNDg8eRKeamZyirKu1r7pOQiw6O09hNy0mKzVWvrm1 +rK2uvDAqHSvHoo+PjZikvzYuIhoUDQwPGjyunZmdnKGfoKmvSDUrKC0vLislJio918G3uq2p +q6xPLR8gQLeYlpSbpKmzt+UxGg8LDRMeN/G4rqGYk4+Sm6tWLiUfHRgVFxspS7qrq66qn52d +qjEgGCLaoJKVmKOmqaixVB8PDAwRGSEkJCpJrJmSj5Oan6asuUciFhEUGiUxQEz8taCYlZee +xlBdza6srMroTMm1s71IKB4dHB4fHh0eJj3DrKamp6ainpyco78yIiAoMTgwJB8kNcmspKKj +paCenqbBPjZR1M1VLyUkLk/P1z0qIyMoLS4qJyk0/7Wqqqutraahn6Orsri4uL3QSTUuLS4y +MC8uLTJHx7ayuMPKxb64vdVVU+XP2E05LiwtLSonJCgxRtG+vbiuqqakpqqvr7O4vsx7VkxT +W09MSEI6PUFBP0ZQVmzhy7+9v8vc6+59Vkc/Ozw/QT0/Pjw9R1h/0MjAwLy3trS1s7i+wsfa +bVdOTVBXVVRUTUZDQ0VGSExJX/Tvz8jK0+ppV05HPzo5OztETnjSy7+8t7Oytbm6vr2/w8TW +7F9TS0NAOjg6PEBPU19za+p9/35yWVleYmX94e12XE5PTU1LQT8/QkpX6Mq/t7Kvrq6wtbq+ +xtLZ4+txWU9SRjw8Ojc2NTU5QlF83cu/vr++vcPR2uBrUF5bWFtWd2BXWE1NUl5k7c/FwsW9 +v8bJ3OpnYF5YV1VfWFZaV0xLS0dIRUdOUVNp69zLyc/W33JcWl1t7dXIwbu4u7/N3V9MTElK +TU5Za+jY3fRvYVZSTUxMTlp4f+HPz+dxVk1KPkJBSE9c7dHBwMnN0c7WdPr17d3OzMvExM/j ++HZ+XWreeXzh3eD0819aTklKQklNUmju1MjBw8vN225hUUxLS1Js9tbM1PpYUU1IR05YX/vU +z8rGxtPv7WNTTE1OT19v+enWztHa3+rvYX3mbunXztLS1NtvVllPS1VdadzLyL/BytHxWU9F +Pz0+Q01fdex7eGVdV1ptan7y3M7LxsLK3fNoUU9JRU9Ua8/Ky8jH0eD5cFxOXFlW69jX1tfa +bltSWFtUWl5u39zg1NTZ7O54ZV1aX2fr1c7EvsLEyMzQ/VdcTEhpTztqu+9T3ks3Nz2+PzJN +XdfMx3XJzkxjd1Bt/1nZyttgw7VebeBZfs5HOMbk+ri9aVHe8T85Qj1FR1rRxMPQtbrcwsvk +dd/Y6UpIV09XXEZMS0RPYmR5y8G/yMXL62dfTEhKRD5IWl1f+9ne9N7S5NvedmbW5evF0dXf +XldSWF32c37JyMbZ59Xw73lqVdxcU9Xv7dPe5dPP18zO4tdmX+tf19/3bltNQ0A5Ojs7Slpw +89PZ+t7d4vbu3tpv7rnPbM9pVlRRT1FmXfrJycbBw8jVzdDY3PxZZmlaaVZiV1dhWnZYWEhN +WFNl8fLc7V5kT1VZU1Rl9WvPxczDzMzN6mzxSUdQTllca1ZoX1peYOp48tDZzcTLys3I4NrG +WTU5Oi82Z9vAsrO3r7jBx0w+OjIsMDs+Z83FubW0s6+xubrL6WdEPTo2Mjk4Qa25JDBFIB4/ +W9inpqKfprOuuDgpKR8eKDBIvq2qpqatsbvU3G9HP0E3LjEvMzR+nJwdH7onGTmnrZ6empSb +vsG0IxceJR4lQuW8tLGutWZG3fdG78VLMjI1MDM6PTk2Ni44m440GbizLDidmJObpJaU1Rsy +LBMPHjE6UWC7rdI94Mo2NMy4v83gY085NVXaQjlJQC5OkpEeJbHGMHybmI+nup2nGA0dGxYc +ObyouH+xqjYiPttBR8m8x0kvN09BPmDJVzxAT9G8mIy4Ma+xt2qrqpekJUfaKQ8bJitSTd6x +qDUjNjYsOWnNrrLg/NQ8Mj0/SmhMO1bHvLStmYufHCUnODNHy52NtWPFVyEaIiHnxnLRsdgq +Li49xrvVv75GLi4uO87FvbCvucjL1Gaejb8bJB1Cwri/kY9OQSYeHysjMqq1urHYNUAwLte7 +52hBKCkyOOCvqa2+Vjc3NjZIpZK6IicfuKiorpeWak4eHCvr38Kls7rWKB4oMTbUv87Ibjw9 +X9C7tb7PUDQvLjFXyudSno22JBgPTKqmq5idsaglGyxLz7XKKzQ7JiUoN6ydo67AUU1MOUPL +v8ZMMDI/SXN9tJS2HBkNLaOWl5WXsKIzGSQvfbS7LTM7LDk4S6udoKxMIyYwOFvLxbrfOS8u +MD9PPjxFSdyakdo5HRylnJiipjQ8UhkcIjWvnq5sSTI+STd6raagqFEvMz16zVxDOCwuLyw8 +w66TlDsrEhm4oJqdnzjRTB8kIzS0pLxnMCI4TGK1q6iirEotJSc7SEtrRkJjWEdj8dC6v7eb +oTYuDxfEm46Plzo3Jh0iHCPvpKCeuygoKju9tLOvuctULSk1Vb6ssL5bLywrLjranpm9MxES +MK6Uk5hTODQsRSomLcmrnqNGJBweOMe3rq+6ub/eXUJG0L67t+g8OjQ5TXmumKZZJg0WMKeR +jZW5xDQ+OyIdIS7KpK/fLBseMeq0sb64vb7EUjc+WdG0tX45LCoydqKfw0EYFjCvko6PqM07 +LE4sIh4jMrahprwrHSAv2q6vs6+wra6+RjYyQNHK9jcnJSznnp6yPBEWK6qOjJK8TiYsPisk +GholvaKeqjEgJDTFqaars7iws8Y+LCcvSlxdOywoPKeXnasdDhkymIuJlbkvHTI0LB8VFiiu +m5aiRyUhLcqttrvfzbzDXzQlICs4W20/MjytmZqhMhAVH6mPio6qQB0oMi8rGhghxJ2TlbAw +HyA4yb7B1NK7tLxSLSMmL0TMzU9Jt52anbsXFBtNlYyMns4hIDIxMh4XGz+ml5WnNx8cJ0Zp +c0hB2rm1xkMpKDRPzcxYOUqqmpuiJw4UH6WOi5KuQiI72FMzGxcitJmSmMMlGx0rS09DQvqw +parNNSYrP1zTWS4pVZ6Ynb4RDBMsmYyMnsk9N6+9OB4VGDOgl5arJhsfLvLFUUvYsqGfr0ws +JzjTyt08Jiq0mp6uHQoOH6eMipKsvk29qzIbEhImqJWWoDccIy9L3T4vT6+gnqtJLC4/zOI1 +JBsd7ZujxyENGNCWioqZbtBgy7YhEhIcbZmRpF4nHzfaUUI3Pqybm6DGKSQtMzoxIx8gLKmW +p2keDyWulo+Ro9uqwcdRGRMcNb2grzQwLjbsXDdVvaibna5eLiUvPTY2MS0uNsecn3YqERjn +nI+PkqWgn8BVGA4QIEO/rkxA1cnHzUM9vKuio7RQPC8sNTQ+TkEqIjSookkgDhm7louNkaWf +pDwlDgsQKu2/r7upo61wMCk+saqts7vExGQ6MjBBSi8gJcWsQisVGLmaj5KUoJ6dORwODhkz +Q1yzq56dtTMwNF29yL+xqaiyOystMjcuIR7hpzIcFRa0m5Wak5aXlzMYExkcKy0vtp+aoLNJ +1b/+T0vcr6Sx0kw3MS0jISguxq8eFBogtKOdnI2OlptIKyklFRskMraqtLquuLvcP0XS9NfH +y8b8NScqLTE0PbS/GxsbKsSro5uMkpahvzYvHRIcHyxSuLqnoqqwtMnr803vwr/XdTs5NzEu +McupIxMcHC8yfrSPj5iZm6tQJBQbGxcaOc6soaCemqO3xcHI50xLZE08PEU+Oty3Ih0nIigq +OsyZnJ6XlaS26S4rHxUVHyEq46yhm5ycm5+tue45LiwsLCkpTLUvJmU9Li1BWrDFy6GeuLCr +veVALiwsHyAvNTjQs6mioJ6dpa+9eTosIx8fICwxLD17SVO8u7qutbSttr6urr7Cz05OSDs7 +Ozc/SU/Pu7Wur7O0vmdDNSspJSQpLi8yPVnfzr+8vri2t7KvsbCytri7wM5dOzUxLjE9Qkpt +z727tbO4v9RlUk1BNjUzNDc5OUNFSv/Xyry4trGurq2trrK8zmpBPD00LzA1O0NPX/Dna2Zc +ZnpaXPf9bVZbVERFPz5IXHjWysS+vru4uru6vcK9wNT2XFJMSEhIRkZGRUlLTFZaWu7o69TU +alZLPj5CQ0hPcHXRw8jKyMbOyMK/xsnJ3NrS2+F2XVVOTE5PS0hFS09RZ2BdXlNOYnlw+Gp8 +3c3FwsvT3F772ujrYv/w1s3X3n/+c37Rv76+wcPBxsjQ805FPjw9Ojs6ODg8RU9kZ+3b3MXD +y87S19bMztDeZllZTVFgXVxnddzNw8XW2N3u6P1xcFRWVk9ce19cYVRQ6drPy9jUzsvQ22NU +VUtNVl126n725N3Z1dr4a27x2u5yVUlIRUhKR0RGSl3s3s/Ozs7PysbM4fNlV1xmYmN0bGXp +3tja3+/27+jNyMHG1djX8mlPR0BBSE902srHyMrIys/nVlZNTVhRUVRNSk1LTVJTYmVw19PG +yM3Mz9/d52VcSklOT1Nf/+Doz8zLzNPb/WR+437i297Y931dS0dEQklW9dLMycDDxMrN8WFf +UU9PWV9VVmtWWVVdXlpvc+zkzM3U0trfe2hMQ0E+Q0pVb+HOwr+/v8fM4nJXUGTwemvo339p +VklIR1Ficc7Ix8W+y9zeVExDPT9IVt7WzcDBv73Eytbf5Ojo3ONka911Wk5CPDs5PEpRXnnn +0dHS0eJvVUxBRUxWcmvmzs3N0uDxa2vm29nKwsC9vsfP71RFPz4+SFTo0se/wMDJz/xkTkpJ +Q0VKV2B3e2NUS0pNTlZn99bKy8O/w8rmXktFPkBARlX708W/w8jJ1NXvWmRWWezb08rM1+la +S0pMSUxb886/vr3CzXxUSz48PUNGT+7Rx8PFxcnOzc/R0t565dDi6djoXEpAPT8/P0hQ+8zG +x8vN71pQTUlGOT58SdDMw8tz/UpkZnru3drQvrq4urzA2XBaTUI+P0VMXOLZ1tdpXFtbSVNQ +SlRi0tW7Z2ttTFU+WElQUdjLwb7Q19Xd6M3K6ExDRFNi48rR4evm/XpbXmRib87EyMl+an5E +Pj5ERkJP5c7Gxrq+wdvr3f9LQEFBSUrWzeHzy87UzNfM29zPxMvS2dzW3lZNR0Q+PU9cVVDn +3mZl/Nrta2N8WE5QVllWS131cF1Td+Jw88u9ube1usHT/L22fjw6OTIvMEXa8HW9r7O+0M9l +Ni40OTk3QtO+xcW3tbm7v8PVTzssQqS2Kzg7PDQoMauxOfW2vNBETLpcKjTTu7zLrp6jr6yo +sd08OkIvIyopLbDDIjItJywlLa+kv6ifoabGScVUKS85csTcsp+hp6yvrMMtKisiHx01pUkg +OzJUMSc8psI+s6+pulV1uT0qN0/HaUmxoKSmqKmu1T1WXzUmRZ1THSweOR4VIq6vS6iqna5O +bK9OKy0+s8ptraGtue/CuUovQj0u+qM9LUccWyYqUaq006zOrUQxM0IpJzX1qK2pnZ6qsb6w +uDwqLi8uLzBHv52wLd4jLSUaLsmsyp2emqdRVk4qHCIqwr6+pp2jq7zM1DwyNji5ny8vOx8t +GBwyslu/o6Sf0Ffc5yUlK1G71rekpbxaR9TC8V2+vsw7NJ6XJjwrLUUYIdKiOrvAqbEsKOdO +KjdRoqG2r6Cx+S0vPComPWzjoaNEsywhMRklWK7Pn6Ofpj84OCkeJi3Oubuon625zsu35T5K +R66dKjNKLjggKc6hRMCvrr80M+tVJDFlsrPOwaSueFfUzHA5a7nNSUOlnS8lKCUoFyO1oNmu +p6PEJiY6Lx8ryKGlrKKcr0o6SUYsJjVhpKUywFk3LyQxu6ntqaamv0I3SS8fK0bBv9a8q8JM +VfhMPjfcu89dW6iaMB82IikZIdmkvq2cnq02MkI7IjPNqq28t6q5QDpCRTk5WMi9op/W2jYl +Kx8mSLLCqqeqtD4tMiodJzXGtbOmnai92FdSPTBG3qKaPbi/LS0eKD++MaufpLJbSD0lGyk1 +VejEsKq/y8LQPzQ2PT1WpKHHvW1JNyIp6cs3v7SvvPrfwT0mOV3XxbmpoLXvz2g9Nzdey/n/ +6Vyony9DPB8jHSjaq92mn6vSNjQ0JR40S97Cr6iovMfAXz5CU85YPaSYNjtYKy4cKN6uSqmc +obF9ZEclHDdOXc+wqajHzrhvMzE4Ojk7t5qo8qzNRicmN0cuNrC5xNTAyUIpOFg/ScSvr8HH +vOpFQ1BFP0j/3lGznFw93iYpHitOsdywnKeyzc1LMyEuOjNPtKuprbWx0jw/TT0/Q01Lu6rr +z9c2MisuPvJHu6u2z9xoQzUuPj07WLy4uLiyt+xKRz89RVRSbZukLqpLLCoiLDs+MqCmqquo +tM85MzsnLTlERNzDr7TCwMdBOlJGOUajozeztUhIL1NRRi61vFXStrxLPUN4P1LGyOvBvLjJ +1MXjPTg2Ly9Lr3VAr/g9Nj5FRjtbtOjVurTP5/VpPzZEUkRuwMrExbq3wcrAzHJhQUGsvS+6 +Ty40OUZcU12uyNLFyGheSkQ9OlrkZNHDyMna0uJRTVtANi8ypK4iocE2WT9TPm48rGLPurnJ +u73YzjtVRTc891TPxsfCxsbQZkE9z7cmTbYuSkjgTMzMsLhqus5RP1NBST/q3E7Ntr6+tLzL +31VJPTY+PDMsVqk0O6Q6RU1hQltsvrfotb3H279aXEFFPzM8XWHuuLm7uLK1wdvkPS61xxi4 +OyFSL18+xEit3sO42eDUzFfNW8fc8cO95MPL3nNTT0hCS0xLTDvJpzBHoyxJPUQ2YHjWwE21 +z8rbxEFLRT1BOkjNzdSwubWytbq7ydZaNzLFvhu/xSDQTsVmscaxvty4S05NWTZPP1FTS+Db +X9C/Zez49W5eVl1FREREuswsr10sVkVTRcdbtcy4uL/Fy8ti50hLSFjf0u27trqytL7J4FI/ +Lyg2uhsisRtAU9hkt7K4rXer6Nl66zVJSD5aQd7Q0sW3wra0uLzCzd5aT2c+NUmuOB6oLidC +OT43v1Kq9ayvvLq83E7iNU01PVtRWbu8xLS1usXJ1V09Rkk8OlQ+RKtLKqcxMuRDSVHPTbNd +sbnNycpGPEEvQjg9Vnp4ta+up66zuc5JRTUuKT+rHyakH0zezWbKsVumUqi8yc/LSzjxNX05 +WNtUT7u8z7rN1mxPUlg/Sk46MUy3JS6qITI/SkzGsq2ovaG2vb+8Vkc6OT0uStrrza2ws7K5 +wc7uSTcuLS0tMz01Ua+9M62+M8ZK1Ux35q+6uqi6tsrfUko7Tjs3VFF7vbG2r7bB3UtEPS8r +K1ZZF0X1HUpCvNSur5+qtqXQ6j1ELzcuPkg33r25sKaqqa64wO5VUj82NTEyLy0pO7IqIbEj +MlRZsbuuq524pK25w1RCNi0tUC9F4M66rKursr7DTDYvLy0sLS82vfoxtHMuUTvn+d+7pa2u +p7u25l1IPCk3Ni1EfLuwqaakqaqvv+o/OC8nICImPkok0WYu5Eu4u720orC2r724Z2pwQi0/ +ODA5ReTZybSrrq6ut9JKQDcrKCYiJk44IW45O0s8r7Cvp5yfnqeoq2RGPzYtLyw5OEvHvbOu +ra61xttQPDQvKyglKD47JjU9LjYs7MDWt6WkpKqqo7bP3l03Lio0QkjItK2opqOjq7fRRy0m +JCQlJig0PjE5TVpcP1nQ1P26q6amqKalrL7O30wyLC0xMj3fvrm1sK2xu8TjUTsvLCssLDk/ +NjU8RTw7SnXMx7y3rqqrqKartr/MXDsxLSwrLTI+WeDJu7e0s7W3v8vgT0U7Nzg8Njc6NTc8 +RVX00cG5sq+tqKepqq+5xWs7LysqKSgtLjhE/cbAvLu5vc3cZ0w/Ojo3NDk7NjpDYsu8s66r +qqyrqquutbnC7Ec3LyspKy0uMztM0723r66yusxzRjg4ODEtLS4yOEThxry5r6qpqKamrbO9 +x9ZUQTozLiwtMjhDX+DPy8i+vcDH3kk2Ly4tKi0tKi03U8G1rKajo6Sjo6arsLjQVkM8Ni8u +LS0vNj9O28fCv7y9xtFaPjcvKykrKy0uMjZD3r6wq6ejoaOlpamutb3WRTcyLSwsLzY7PUFb +4ca9ur3K0+pyVT89OzcwLS8wNDlIYNC8s6unpqOio6eqrbXE5kk4MCsqKistNz9BUW7u5ePl +6+x5W01EPjw7OTU3PUNIX9nHurOuq6qqqKmtsbK2welPPDQwLi4vMTU5PD1DT+7Qy83WzM/X +zczO1X5MPz0/QEdZX2vZx8C8trSytLm5vL/J6VRIRDw6ODg5NjUzMDI6P0RV+dfIwL28uLW2 +ub/L09ja8+zc29LXz83Ixcvdb1pWT1piXWhy9251fPFkTEY+Pz49PjxASlT10MzAv8DKz87M +yNLb3NzydGZjb2ZkZV1VUFNi/OPV0s3N0NnX09tqW05MTURERklMTk9UZubo3NXa3dXQ2dvT +zMjMy8/R0Nr1Y01IT01JTllic+Ha2NbW4mZQUVFOTEpKTlBcZFxo8O7s3urk2eDZ19vQ1dDP +1c/L0HlmYVlZV11p7+bey9Hfz9TY6fnrd2Zna11dU09WWl9mZF9iavvq6HXhzNTZ0tHP2eLc +/WtoVUxFQkJCQ0lWYvbRysjIysbO43Bq/mJaW11SVFtdT0laYV116OLPzMjDwsLDw8vS3+zd +fFpYUE5IR0hJTE9VVV503dfv3tzh7/x6bFhYWVZVVFxpVFNYX3xm3dTaz8bDxMTHyM3X4H1t +T09ZS0hLUFFYX+LX0crNzt1r6G9WfN3Z4d7m3Or3Zk9KRU1OUvzWzMbDxMjHxM7edU9KVkpK +VE1IUFc/TGP37jBERvnG1rtsuL3G4V+4XsxXU0A8TkBrXc/LwsDEvcDK0cfZ5HZlVEJLTlBI +Qk5BRj1AST5QU/vp0sO7v7/DvsLX6FZPQUpHSkpffX3a6s7M2dnPz+7N68zO1cnOzOPH4GpL +Pjw1Njg9PUBY48rBwr/CyszmUldEQktX7cXOxLvnyGvn51beTc7Zwr/DtL25x9PxV0dDPzk+ +PE4/RmV6Y0R2VFtLQWpOSELS5dnQe7vLVV5fSERFQeF378K4ubm8vLLUz7/aS19oSvRATOxC +Wv5wSd9STNVF+OpYY87M1dPfv8ZXVe5FOjk4PTk8ROng0sXQwszK0sbXc+lk29zJytXU18h0 +RUVGTkBDVuPIxL+5trq9vsXfV0Y6Oj48NTg+S1t43ce+zsvMycXZ18/V0czZ6u9cemVIPz8+ +QEc+PlFw19XUzcm/wcjLwczr/33pYFFNSUVJTWT9WktBR0xOWujFvbavsLa6v8nXWko8NTc2 +NTpBT+HPzcnT2s3S1s/h6+JkYV9cUEpJSElVWk1HRUdW683BvLm3tLW5vMnb5F9RSD02NTk9 +Pj9HV2xs19LLwcLAwMXJy9J9VE1TcGNeS0FDTPjLv769v7y2tbW7y3ZMPTk2MzMzNz9Z49TU +231ZUE5MSEpLT3jY0MnJy8bAwcHPXEU+Ql7Sw7zAys7Mw7q8x+FIPDw8P0VBPj1AT+nRycnM +43fl29LS3V5NR0dV4sXAwc1aREBM+8i+w+NTSkxvzsPC1VtFPDo8QEZMSkZIWc68s7C0vvdH +PTs+S1peWktK88Gvq6qvwF07OlPTu7a7yVU/Pkhi1M3dUjkzNjxIaeBcRT0/Tde6srTC3Ec8 +Pj9TYlNNSlD6xrmxr7jG+ldZ5czGydt8SD5CTGPsellCNjI2PVfYyr68vb+9u8LM/Eo5MC8y +ND50y721sbCxtr7F1ntjXm/5amtaSU1MTExJRD45ODs8RWzTyMbCw8TIz9b7T0I7ODk/SFvP +vbWwr7O6v8PKyMPG0O9RSUM7P0ZSbmNVSEQ9QE/nwLa2uL3Hy975fE49NCspKi46T8Wwqaiq +tcbSfPHLv8HKakQ7NjpCYeTyaUU6NjZCYMe1s7S7yu9PR0tJRTswLCwuNV24qKCfpK/GZEpY +zrqytMRgOy4tMDtaaFc+My4tPOe1qaisuulCNzQ3Pj44LysqKzJYt6efn6Ktwt9S2bqvrbjX +QDEuNknZu7zORC4pKTRkuquqr8JOQDc3PkRCOS4qJyw81KyhnJ2msPZCQErJubOz00M7N0bl +yb3KQSsiJCs/vaynq7jRTDw9PD05LyolIys94LCjnp2frLtYPkdL1b65u8bS6m3t0/FsRC4p +Jiw4abWrqay73Ec2NjAtLCgnJyw7XMSvp6KfpK7APTo8XbWvrbLOWEJC69rmWjAnJCc50qyh +oKOuwfI+NjAoJyEdHyMvY72zrqekoKWvyjMsMFOsoZyeq79VPkRPPzIhHBsePbCemZqgsO1C +MiwqJB8eHiYvUb+9vLOsqqe4QSkeLW2mlZOYosFANzY5LiEcGB0twJ6Yl5qouus9MSomIyEp +NUF92eHjYVfQt6+rwS0oIz2nmpKWpMs1LTo9NSodGx41taWiqLvX+23qQy8qKDBXx7rGVzw5 +RmbetamurlssMC3ApJ+cpLbYQ0VcOCwmICxKw6yutbjDubXGXTQoKjJGY0k7Mi4/e9rgPV+t +p5+sLCEeNaabmJ/SO0xuv3YlHBkl1qykp7i7sq2t3S0fHShE/Xs+MTdL0L9YNDavnpqeLx4f +NZ+Xl6NXNUf0/DgZFh04rKWruNG9qqm1TSsqNkRtQzMwLzI3My8yPU7Zqp2en70wQEW5oqSq +sL3Cv00sIBwlMkbPxsizra+4aUA7O0ZOR1Bqan9IODYvMjRAoJmmrh8ePcmenaatpqupwCIb +GiA4TDtSyrOiqvczKjPM08vM4b+43D0lGh0nM1LU3rSuu7uknaeyMRw2yaeZnqKhqbhPHxYY +HCpDebapqa7LLiQlJCszTLKlpKW6SDsuJh8+mZ/LOhAfuramrrSmm6TWNx0qbkJOTXqtnKez +yThTRCoqLz2yq77hPi06NScnISQ5ZsytrLGvnpSf4iMaMMi/rqedmJy2LyMeHx4dKfysoai9 +ylc5MCYoN0vUzvHYy+xfTkVHNzmekLk/JBN7wy6+q6GZnnVATycsIxxVr6ueoa2muS8yKyxE +LzDY1mFYNjFTTTMvKjFbTuu+noyTvDwnT1QiKr+lpq1SY78zHhodNmpGy6ynpbpZyMRPNDBI +wuQ1NT1NWDUvdLzHeUqfjp86KiNISR87pJyfr8CsqS0ZHCI0NTOzmpyksriuZx8eJy83Ljq9 +tXI9OkQ5JB0vnZXeari0oEEzrZ2sREplrzkdJzM8LSg9p6jU2b2us0hKtrz5TUjb2zg0PTYr +KCtDakvJsa+xt6aVnT05OjE1Ijaln6yzq6vbHhgfHhweNbmrsq+mp748PE0/Mjy/tsfQwbvX +Py0srpPaHr0u9Tcdpp+otaumpVAfTjcnHx0220A/q6KkrrWstzo0QkM/MUHIWzo9SU42Kzle +RUH4t621vaiYmsLcuksuICvCWjbptK7UNk9iLCIjKi8qL9e8uK6knqeyr7PSPjhANisuRXBI +RKeStiu0LkQiFb9aVc6vn6XDuaRgNSgpMB4fMk5V6LWho6ypqbNZNDo1KisyOz09Z8HMxr++ +ucW+tre7uquryn5xTUAsLD85MjA9VURDXtpqRj9ISEZObdDKxrSurq6xs7jGzM18VlNSWlRM +TUtMTEc+UlpJaVLnztzQzMzsaklZVEdLQEc+PUZNU1JRUWLr28/FwL+9tbS3t7m/zd74clFH +QkNNT1JUUkw+PURGS1dlZG7UyMrJ0HdUTU5UX1JMU17u7fb2fVlNW2v+3NvW0Ma7u7u6vMXC +u7u9xMvN3N3rWk5JPzk5ODk5NDA0OkZTXOTWzcjDw7/AwsTEv7y5usDL6ltGQDozMTY7QVfu +2c7OzMK+v8HGzc3P0dzg6VhNRkM/PT09QEtY5dPR0NXQ0NHOyszU5d7X2uHqfV5bZXNnXk1J +T1FSUlBWXlxs5dLIxsrLycfGx83cbWxeTUlFPjw5Ojw8Pz9FS1D80snBxMnGv7+/wMXFycfJ +1OFeT0pGT1FbYFBacPHi3dDY9F557N7LzcvHwby/xcnT5GtbV05NRT8+Pj4/QUI/RU9ddGrl +2dfPysHCxczMz9rW2eBsWFFPUk1QV1ZXX37j29vifOzh3NvY0tfY2dHNy8rO0tjq/fx4VUtH +Q0A/Pz8+Pz9DTFdUWmpj6s/Mx8bAw8LAxMHG0+tx7/pfX1tUT1VZT05QUk9Xa/Ph3Orf5OHp +8uN+XVxgbfL86efv3dfOzcvM1uLqaVxYT05LUFxi++rj4uDs3NnSz9POycbHxM3l49bf9l9V +U1NJRUQ/PT0/Pz4/SlJd9ubUz9PO3dnX3dXU19zY3ujd6Ofb2dfRy8rHxsbLyc3ebFlOS0pF +R0hGRERIS0tUXvH169XSzMrKzc/N0Nvc725hV05JSUlIR0VHRkxPU2F34t/Qy8jIxsPAx83O +7l1dUk9WXWd67d3c3crHx8zN1Pd0X1hWTE1PTk5KSU1eXWnc3tfP1MjIysjR1uh3cP7q6+rr ++nNiXVlYUUtNSEdJSlJeaG18d+vt9Ojv9+/o29bS1c7V7Pvo4t7SzM7Pz8/V2+lvXVhcVkxI +SlJQTUxMS1NfX3T45ejh4HJvfeLj4dXQ09zf5+vl4eTn2dvd4O3W1tznZF9SUllUT05PTk1K +SUlNVGLrzsXDwL69wcjL093obE9FSElMTVJYbHH0fX3X2tjPzMvT1NXg4uHudFtPTU9OUFxT +T1dOS1RhbO7OyMHDwsDCys3bZ1dKRkJCQD9ITlZYYWJjbmRaZF9lcefQzMrEw7++x87l6ets +YmFdU1FWWFlacufw59ja4+frZ2RlUE1NSEhLS1VYaeLe29XP2NfW4v3zffrl4+h/6ud0a15o +YVtcavfZ1tjNzdHY19fh3n5kVkxJQUJJSUxZZ/Pazb+8urm5vL/CzOP4bVVMSUdCQE1LS09K +TFZaaW1q9+7h2Nzc7GVral9kWVBOTVJVcPXj09DMysfIyc3X2uT/amxjZWVUXWBcX1xbV+rc +3Njb5+t5dWxga2thX2RtVVtbW253Xl9jc+7n2dnd3NPY5+fvc+79bVxNTVhaa3X28v14ZWRy +e3Tf0M7P3t7W1tLWz9LZ3H1hWk1NSkpIR1Ns3cvBwcLBvsDNzs3U3HdaSkE/Pz5AUFdnbnN1 +buzr2trs8W365O/67nBlX19aT1FdeG3449/i3M/Nz8zKzc7hfmZcal1RT01HTVpeZ+Xg08nJ +ys7g535WUFNTT0xTX3Ty5Whrb112YXvuZXFvbmht7u3d19Xh7m1aUU5beGz3d2Zxe/fl2tnS +2Nrg7eDX3+79dlVOX19oed/Y+lxaVVth7eHu2NbQzczJxMfJzM7P1et9X1hOR0JEQ0dMVW7i +2Xbo2u94/ntwWltSU1NWVVtcXHPu4uzn18/P0dzf4/Dc6fXieHxyaHNt+uLc0tzy7f5s6tvd +1Nbc7e99T1BUVVRWV05TVWBgZ/ns2+Xj/Wjub2haT1dPS1FSWWvq3NbX0tbVycbN09foZGX1 +enf6eX18/WJj8+fo7O/rbGlqX1lec/b6dm5z59nKzc7V6fHf2eHf1tr3aFpURUhfXVxbWVpV +VltkeXZv5eTvfmp78uT9Z1pYV1ll+d3c497W2uLb1M7T2ezq615gXFlqanTs3tvq5NPU2955 +7G5edGBvXk5NSUxSUl737OPd2+V+7Ojz59zu9H1hTUhbWFhuXlxw7+PT1tPP0tfZ3fz93+H9 +eWN3YGj7d3r78+/n7Hlc+t7k5F9RVk9RT1hddezf1dHZ3MzEv7/Dw8ja5H9fW1VPTk5SRkpg +X1hZX15mYmRlfPhyXlpVTkhIV1tp9PDn+erW0dPWz9LX1drn2NXV3O7o5/j57tTR1OX/7P1a +UFxtfV1YV0pHSk5TXWj//u39a/3l19bk2+x45v16bmxeXl5WV1pf6dvf5t/b3NXP3NPQ5eH6 +YFFPUFr6c3z8d/Xt3drOy3flvE9HW0ZWPllJSl5b5tHCvr7Mv8rDzNTV7epZT0pUQ09PXX9l +2VZQVEtFVdxW8dDQZT7aTWxt/klKTlH81sxq2NbN0cS/x8HIxezy31VXVlpVS1deX+vf3t7P +1djY1mhNTVFAPUJGT1XZ09jJzd3d2eFWXlRhSFFKV0xb197JxsHQzuXdYuj57FFVS/bnz9LR +w9TUYtzg+Vf3WU9YRU1Rfs91yszp5ExUSkxeZE9e2/1u0by7tbi6uuPXWU5GQD06PkBFRujL +xcO+u8nX2VROTUg/PTw5OEJw7cW7urzJyU9EQz08OExFRmXu4rmtubaru8W+3NM/S1IvRkI9 +TnC+xc+8zk/1Sk9FVGpDW91d8dDMytfRTkFBPDYyNzo2Zbe4xbeqzb6w43RXXk40T/o4U9Hd +ycK4vsGvvNXNY0U4NzcvMj03PUtIU3npzr+foVCfrCuuSHvPM69APLxRUchsZXdqtjg++y09 +PEjf/LuvvrK16UY0LSMcHx4eLjhZuaSYnqCUm7ivskItODQoLklwfMWorsG2vVk/QjsuLDcy +Ljo8ODtETkc+4Fe9lLIlnS0cryjKzkSet7ecs76q5dtOJEonID8tPVpctry+rsanqE/ZKR0c +GyAnNb21rJ6lo6WfpzVctiAdbPdAyp+it6OrVTknLCAYKC42yK6hn6ekr0g6KyQjJTI9UsrH +nZQ9O5spEC1OIjqpq6WgoJu1PuMjGyAgLy5Iq6yqo6qpp7bFQx8eGhwoN8CloKGkpJqtFSvt +EBfWtrOelpifrdJcHhIbGh8zS66usKGmwMhMNyggNTc2uKqnpbdftp8aCkInD0een5uXmZul +VH5HGyAtMXVKraDkWttLOC2vmau2rjsiGBgpK1CppKCts5q3EB5vHBzCm5ubnp+hLhcmGxYf +Pqi7vJui8i8pNCQZPLavpaWeoNk2RLLPDhHYTR9KlpGvt6Gz7Swxp7Mva7O4SyQxPh8r3K+j +sbehyh4fJj1PXqSrUpubDw4sFxl0pJONm7af3xYdIUi6ZZ6dvlAlJCgdNLiml5qmtiEODxQo +qpaNjpq1vbgNAxUvPa6WjZCsJBwqGRfKmY+avsQ1HBQYMb6zpJ2erDIv4l9GNLKMkx4eeDAR +ElSmoLJWnZ4eFSA0XCzNnKdhKytZMCnPqai2MkDoOk1PO+SRmRMfQh/AXbuLjrFOTTYyFR+i +qaa02Kc/GB0iO9iykZOqJhASFRY2p5WWsEk/vjcNGK+enZ+cl6UiDRlNPueql4+5GxknWjYw +qZeYsywxMyYoLr2urpOgGRgeIC5FrpuQnSs0QSktJmybm565MEUtHjFlqapBQ0lN3jcs3JGc +EBUZHqYxP5KOlrojJGMfGS1LmZvBwkk3KRIcwp+OkKCqMRgXFSiunpmntpmxEAkKG7+km5eO +kLQmGhwoMPqtn5yrTi8jHx8gObynoau7PCftozsTFS2xn6G5p5mzKh8cPrPOvq+jmqszJiI/ +tbisqauxOSUjHRonnqBIPg8auUvCvKyYlKtvKx1TKyI1WJ+Rm6LTJDvJq5+rvMNKQTQoMjk+ +OSgzu8QtHBgfSq+tr6uopqvkLiQoODw/S8yqoKK0RztJ4sDUQjHAkpZ2IA0PQrq+tLasnJzB +Ox4fTjs6OS6xmpmcQR0uOMC0/r7F5dUwISisorHjDw8iOaqzxbWtqp+2KSkeMcpDRVNrp6Kj +o7G7xkA5NzvSt6+zemK7ud03HxslStF2WEt3ubi8Z0Pvyr2+XXDmyLr6R0FA2Ly1wnKpoL1g +GA8eJsWzOz7gu6Gfu8JFRrrT/0EpO9Ht2TM3zb2mo6mqucrA0cpoLzBBPzIsGBYkOLOosa61 +saWvxlgxPUVBTzo4TVDLvsK+xryvs85NtKS1viIUHy68qL3W7e24qspSNCE3S1XKNzE+OcOz +rqOopqi9y2E2LzqzsLdDEhYaKrS/11VOwp6gpbQvPj5Pw+FOfD9XYk+6rqOco7NPN0fpx9A7 +KCg4REIvHBkeK8+1v8jYuKelqL5AQkxP4VNW9vrCxNfW38y8zMael6CpHw0UGT2rubfLVK2h +qq46HiYqTNEtNkpirb9zwcKhnKKlvldJLiYtyWJrKA4SEiSyqp6kq6Wfo6PKJiMdJDU0Wsm3 +oZ+en6amrcHTSjw4LfuoscopEhEYJ1q/zFfcwKuirtQtKUzu10gu1KqclJmjuT47MyxMqKa1 +MQkGChS1nJSVnp6YmqDBFw4OEig5RdjEoJKQkasqIymzmpqf9iQfHykqIjn52LQxGhoaOKid +mp+vtK2srVQlHhwlPtOwq6imqrLMR0A/OyktusW+2x0cJ1efmJusUDI25Uc0IRciMr2hp6io +qqCm7jElPKaZlZzNIhUhv7arHAAAAhOqj4iKkpKPlZXOFAwIESxprayvnZyanzsjKU6el5qu +KR4fLOVBKSMjLEI9KBwfMLCXkpej50xd/NIyHxsZK76kmp2kqbq+0DssHyG1nJyeJg0PGcaV +kpquQEqxsrouDw8WKqWen6a1p5+kqywZHS+pnKHCHxQpqqCbIwQEBR6bi4WMnaassKcpEgwJ +Gc2bj5ejp7u5zj48OWisp6StcD85OjwvOD00OSsfHyVIs6Cdpa/K7spjRjIqLjA9e23Dsq2j +pa68RzowJzGvoKiuHgsOFE2XkZKcwL2xtLI8FxMTH7isoafLu7iyq1AsLTuklZScTRkPFO+p +ncEKBQYWn4qDh5jITz++XRoRChE9oZCRob4tKDlPubi4t8a+vMjURzU12ainrWIcFRcg16aj +qcw/Qtm9uE0qIyjyqaaq4DM6zaOaoL4mFxYkpZSRlCEKCQxKmY2Kmr9LRrqn0CoWDRsur5qf +r2syXsnEyy4sOcKclZajKBAMDBY1raWqayQtWKeVlZuvMysuRL68UUEvNM28rKq5vcq+rK25 +USkfHyMtx6WoqU0fHR0xsZ+dpsM6LzZM0zYoHRciNq2al5eiyj4wPtC4qrPITS4mLa2fmp4b +DQQFEzqPhYOIl8FLPk5cHxcNDBY1n5GPlao0IB0wup6YnatPJyQpRsXoRDMsLi8vLjA1QLym +nZqis0sqJCEpOUFFODzQqpqUk5m6KBgVGR9HpaGevh4cFyawnZKVpdExKDf41b86IBoUIUap +mJaYpMtNO+G2s7DdPikeHjW1qJ1IGQsDCxK3jYaDipm7Lyk4N0YnGhMQHEOfj42PnN0+OMqo +pKbsHxIOFCqrl5KYxh4PDRYtsZubo8Y0NVOyoZ+nXhwTEh6/l4uKjpvoJh0fO7+utyQQCgkU +NpmKiIqYZR8XGyg7cTwhGRQdPKSRjY6XuC8fIjW+oqCpzSkcFxkrTLWt8EAfHCU7npGNjpiv +MhwaHig/T0svIicxtJqRjpKewioeGx4mLzo2Ni4tMjvHr6qmrL5YMCwvNEL53c1zPjs77Lys +pKSlrrm6vLW5xk8qJSIkNThtPSksJkfDoJeVl56vRCofISEsMTU4LzhJ0aqemZeco7rSV0dO +QC8hGBEQFSPcpJiXnrYtHhwkWKibmJ2teywmKD6/rKizVismLF+nmpebrzQeGx8z07mzSS8j +Hyw7sp6bmaC6Nh8aGhwnM0luWnpdxa+kmpaTlZym0y0dFRMWHixZ9t47JCIfMdGilZCRl6PJ +MiQkJzhIYm88MykmL1ynl5COkZu1KRYODxUeO8u8wTMoHyA5u5ySj5CasDofHB4nOU/J0Tkp +HiNDp5GMi4+fRRwVFRkiLkM2KiIcHyhqqJmSkZegvy0fGx8pOWHLxd1aS0/OsaOZk5GXpXAj +FxAQFR0sUmvXUzMuKTm/qJyYmJ2ySSojKDBWvba9Ry4lIze4m5KTmq48Ix0fKU/IvcwyJxsa +JDqunZiXna1WKCEiKDtQxcpPPzA4RsWklo6Nkp9NHBMRFyI7X9swJhwbJ1Gfko2Nj57BJRoX +GB4pPj8yKicsSbqgmJCPk5ijwDEdFhIRFBopRb+0tbfOw7+0pqKiprdXLygrNXq/trTROywr +QMClnJyjyCwdHSpLtK65RhoUExzSn5KQl6dEJSElL0piVykbGBszsZiOjY+Xo66+wcpTPS4e +GxURFREbIz6snpSQkZWcrsUyJh4ZGhgZHyvlqp6WlZWWmJeco7gwGxIOEBUiTcmuscvmTNa1 +rKmy/DIqKzrgw7nORTYtN+60pqOptOhOTUQ9Wri9tE4aFg8XP6+Uj5ebq7OuuclLGxAODRos +xqajnZuZkpOXnsFALCcqIixRP84jExEMGS+xm5qdnKGem6u8LhkWFRooKz3auZ+alpKVmJys +wToiHRkZGyN8vba4PDpFP8LDXWxCV7u1srpeYH5a3DUkJS62nJeXnqquu07srUUiFQMIDxiu +pZiNkI2Nm7AyFBUTDRURGeGqlo6Sj5ShpOQvOC0yQC4rJj+frLglDRUZKDg3856SkI+ntc83 +LhwPExsk5syunZmVl6Cipr9LJhseHx40trCrrejOvkIvKiErNTBC2b+op7GuttlvLiUzPMis +raOfqavBQaiZNBkVCB0iETW2mo2Vn5ibulwXESQYFh0ks5memZOXlqg57c1NXDRLuj8iN6Pn +HBsMISMRJsmclZiej5Cs1CIfJBINGB1Br7aYj5WYnKijwSQlJBgZIPVcNqyurKD4ZKNxLjgs +PkYoO7S/wrzPrb4wQVFqvsvCp63Ry0suXKI9DywbEyYV75qmoJWWnaI+StAXGB8eKjVDoJef +l5qhqMs+zj4rT0lGVS4mvp0gFskYGx8awa7ao4+bnJy3plIcLScUGyIts8enkpmhmqOvvisu +LhQouxIcqSxGo76koFu4rjMrPS0uPStdxDnFrsW5vsGpuMypsN7A4jYuJ76tECO/ESU0Zqau +qJmVsqCjPkolKCodHklHOqqrpqWqp6pQ4uQrMTAsLiolLq+sFrmhF9e3Pa/RzaO526auNL3d +OUYqPUMxSbHfsqSxqaq9t8YwQS8bKa8wErmwGuGhT66mvaS7SK3BLWnWLkFcSvRF2LtUwqq5 +uKvK4FsxNCgeIUKvFRqfFyilV6SuoJ2mtKieKsvWKjwoQDs/TbjHT6a3tq2ts7rC7HwsNi8h +Jy0pJjSzqx+8mh7IpkmuzresX/6z7jfJRzY+Mkg7PL/XRri5c7vCy8xn9GI5N0I3/LA7OqdG +Ma9Ld7lXvb5Oy7td0sJk0U4+2kM/zFJRydXbynR9+FPbY0xWRD8/RUZa2cPP07rg1MzWvdXO +vs3PvL/Dw9dtRTc1My45PDpSS1tc6cbMzMHLaeF+Pm9ISFpVY2XxYcHYw8Pst+PsxObNzszM +xdb14GzM1F7jWVZMOUU/QEM7bDZZO0ZaSM5Ryl2/0ujMUbxnv97Ov0y11bvA671KzkRH2kbH +VW79TPpK8ltN0k3tZUJMNlM8TFBc3UDKR9reXsdgwdzNzru4trq3usTFyr7Fyct220lJQTPW +Ml1BOVQ0TjtfSV1ST35LTF481VJPxEDUTM9OzM5JxFa8ec3K2LjBu7y7yb3Jz8jYzOVqUUtA +P0E7QUw+TUFN80TsbEzBSOlaWfRm1j7CR+fOXb1kwefBzXjGOL1NTc9E61jRV87Kdr1bz9VU +31VLZk1LYklQYu9YvFXbzEfHRldr40TabEDBTtDF5b7HxL7B0cHSwufFWuzOOr49bz9IQ0m5 +LsNWPtI27DpmRk/ONbM+5LtJvlJ1TWFS9t9H0Gj30urh2s/PzNbLzfzo1fNjWu3lXdBj1t1m +3d70Xdf7SOptQHN1a/Fz32bh6/loUVx7Rm1IT05K3lpcbOlW0F7LvULMd13DR+xJfbk1vEfn +vma5QbVzV8I742c9WVZl/M/YyLXRucBxzldRVUA7T0pPZOVt5tPbZcrYyc5OxlZoWuJpUs9k +9Gjazmpy8WFYS+FHTVk/xGYu52E8u95z089OQ8VEVFZZble7Wsu9z7TLt9e+4UXaPE1BWk5n +10vKWcbQ4MdW5EdQTkP2OU/eS7pMz+hpx2HHRcNCPts7ak3kzM/NwM/WucnoxetFV1pDRkJC +TkhLfUn111XXyMnazWXczmrQ0c3O0dfm39hr4k3cWUfWWOpsztjixMrp09vQ4+vfSUo+SE87 +V0pb/WPPa9jJ0GrXwz9TTkVcP1lg3+5c0u3o39hw3vZPc+5q0d5dvt7aylDQyU7S2mlQ4FBO +y05PeXNtfcfc2ctn3FhsV0tlP9lkP2VXWGHnS83NS9NhXWZV4m5o/erm2tvRdtLZz9D90FpW ++OLcUuDNYO7ryeXQaGfPSkpMTkZQ8GTxXWvcWsXd6r/o3cveVOvbas3UZMjZT9Ns8uVZW93R +TlnmSvJQT+9HVUxTXvbUX1pxRk5pXun34+7PyF7XwNzOYeBpSltD6Xv7z2bJzW/Q99/f0N7s +01f620b1XWppYdlNXWhLTufURljOallj1WJM0+v9WWphT3v73OJp9tLlbs/jWszd7Nbm38/r +zsxNUU9qQ1Db6tvse0zoX1fQXNPdXMzXbWTIXl/oR11zemPeycvsyMnq1Mviychuz25SWWpF +S1FFTUlUR2vqSM1tbv5g+Fpuee1f7s/ebNHN7/3g2VVMW11HUGlZavLy7MvEyL7Gx8fZ4mJc +TEhJPFFFRk1uXFDnbM3J0cjQxN7u1llUXWpKXVP9Wk7fbul3bW9uWG7ca+DQ09DMxszN4en0 +WlRKTE9NUVJod2776tLi2NLT1X7fX15KQldJTGFtzM7UycTQ59Lj5Gzf1uPOysfN0NTX11pT +WEdETEc/QkVITk5b7tjTzdLMzNls/WpGRkZESE5ZWH3z8s7Z08fIycPP583Z09Lfz9bfX3vv +XmJSVXBVTUZPc3F23dTIzdnT6n9eWklEQj4/R01KTntm387Yzs3MzcnF0ePe6/brbHJcXGfx +5G7k9up26+9ld3Dd/uXf0srLz8rL325eSkhBPz5DVVVqZtfIxr7GwL7BzNriYVVAQkQ7S1tr +3+fb3ub69+VkXFlQWlpcWmrm6vNy+mxhfephV2RiZ/be3drOyMPHys/P0tXmYlRHRUVFSEhK +UFxl2tHS1tDT5mlZX1lu++jm6uH2ZXra4WpqWE1PS0tPW/XmzsjIy8nExdLe3F9VTE1JRUlJ +Tl3l5NnNx8LEw9HkeWFrXkxMTllha/xyfO9sXGVWUF/609TXy8i/u7y/wsbQ7FtWRz5DQz09 +PD9OdefSyMXFx9ngdFlWT0tFQENNVGL97ubc19vf6npjae725evezszJx8TCxMrU8F5PSk9M +SElPXFzo287JzNPd311PSkdEQUZDSFNZa+vWz9PP0tvm6+fo+GVYUGR6bN3Ny83i+mBYVmNx +av7tavjXzcrGwcLHz9xeUkxMS0tNSUlKSFJd8c/JyMHDycnN2WlfVU1YbXr52dfX6P3haGRf +X2dfWlVeZffkft/i7fBcT0hESEdAQkdLTWbezci/u72/w8nf2+tlZ1lbWV5q59/b2NHP0c/r +/n1xYFZWTVJOWF9n7drW4+xvUk1RTktKTE9YZ+/a087LzdDS52lfXltXUU9OTmHw5tPKxcbI +ydnxfX37W1xVUE1dcGzc1NLMzdZ9aWVPUlVXV01YX/ncz8vJx8nK2N3f7PNlXVRPTVrz4s/U +zN/n+1hcV1JOTEpEQUtTXW/26e3u+G1w/vB4W1daUlvv3NHLx8bHxs7Z4uTh4u/ycF9ra9/e +49nX2fb072FSUk1NSEZHUl97+eXW1s7O2flcXVlNT0xKR0dVd/fd2NXQz9TT1ePb4el0d3n5 +2djSz87Z4Ojv+mJZXFNXbmXo2djV2c7RcXxjTk1JSk5YWVpl9NXOzMvExMPJ0tvsWU5XTUhE +R09Vfv/q1eDfd2xhW15UX15STlZlbfX37uPc3vb0bF9lX2ZqaPDX18vHxcTEx8zU2N1+XEpI +RUpNU1ta8N3a3Njne+n7WVdMR0dASU1WYe/OztDX5Gxwb1pYWmpncdvPzczHw8jO2fZ4ZVFM +S0RCRk1f3tbLwsPExczT3N75YVBIRUpYUl9ub2ry4OvV0M/L0tjq8N3Y1M/Ozc/Y3l1geWFT +TkdDPj9CTGj+187Ky9bt+V1XWE1MRkNHSlh33NHLyMXHysnH0dbeXVBPVVhcderc29zV3Wlo +bWZiV1RVc9ze2c7KytDZ6WtXTE5KRURAPj5GVFfq0s7LzcrNztLg+GxjT09PXH772t/Tz9nY +4d7p3tt8bWRq6t3l7dvW3+j18extXFlWSEBARFRo39jKwr/Av8XJyNntZFlOSUpSVFBe3+vf +2uTm3vRmfu9mT0xZeW9oZ/t7fWhbUU9NRUZLS1Bk48vFwb6/wMXI0c7a8HleXU9NUmV/b3rv +3trX3+Ts+GVaX1hNUF5j+/l1bWBZZVhRVE9PUllZZG/dysjHy9PS1uB1fW5cUkxIREZV9/3j +09TKx8bIzc/e9WJVTUpOWGzv/WRmd93VbXNlYn9ia3bq2MzGxsPKycjN0t3lWEQ9Pj4+SFRr ++dnd28vL0NPX71tMTE5KSE5QTlRYW15+ffbY0MzO2NTX6+7bzcnNztTQ1u1x62dOTEVLTUxX +6NHS0tDKzNfe3OFrV0lGRD49QktPWnH818nLxcPE1e90VVJYW2f0+9/o3Njo3OHg6nZSUFld +ft/Z2Nni5s/O2NXe3G1OSz8/RU1Ubebi2s3Lzs3LzdD9aGJPVWFv6N3h3NzW0t3d4u/nWE5M +S09ZX13v6ejm0s/r5WlNQj08PUFFT1h62dPMx7+/wsHL1X1cWlJWZfjs3d3SzszPy8vM0OJc +SUtGREdLVFZ27uPX2NrV33RSPz4/REpTdOXezcjHwcPJyc/rWk1JS0xNU15u6tnQ0cjFycbU +7lFBQ0VITV9r5uX36+Pc2NDb4vVdWlpZUndx8NbN0czGw8K+xdJ4UlFVWF5ycOjl39vZ0M7N +3O9VQzw9P0BGR0tOVl5e5tze2el7XktKTl1aaG7m0drDxca+xMnV81JNTVxw9t/Wy8jExsfH +y9xvX1NIPkA+P0RIT1Vk6dvWzM7f7mlOPj1IU1rt39/W0dLRys3T131zVUhOXF5+6Nzk18vS +1MrO2Nb6Zk9ITlBXYPPp383KzMjJ1tb+UUs9PElSTFNp9tbMzcm/w8PGz9hdRktOTUv+9HzT +1NPM0dtlVE9LSkRQW1xj49rh2dTa62xkXFlWUkhBTFNbZ33OxsXCwb/Cx8/h9lhER0pKVGLf +2uTf1dXP0+f1al5MSVBVV1pjb/vv393g3OpfWE5MSUVJT1/v3NDPzcbLycvN3GhYT0dDSU1Z +a9/YefrWzsvHyNXjalJLRktTXnTj0dPP3ebV6u5qZF1dWVNu5d7RxsLGy87Rzs/edlBKS0E+ +R05UVvff39POzs3T3mJVTUQ7OkFJTFZ19N/OzMrGzMzQ2tj+dflr7tng1dre1NLQ0NLka1pR +SURDTFpc/dze3tnd2t7laVhbT0hJTVdrcOzW29bP0MvO0uNcT0VCP0BMUWPmzc3OzMnI0u14 +cllYS0hNWnfpzMjIxMTDwcjL1N7+TkxGRUdJTFpeZXTs2dnPztzk5l5ZW3bc3dPN3+t0Z+xr +aFxQUEhIR0lZau3S09fP18/W4vpoT0pFQEJKVl/j0MvPycPBw8nO425aU1FNVl5093zl393c +1c/Q2vRvVlRMSltpal93eltj9Ox673xZT1ROUF5+287K1NPY3NTa3ntcUkxMTUpOYfLa0tTT +zM3N09zk/lFIRUpMTG7Z3d3e3tHL0tfU4mFbVlFVXfPg1c/NyMbIxMDFxs7lYk5KSEVOWm/o +bWJzcmX7aVtOREM/Pj9GT1JUbXPdz87N0MzQ7V1iZmJm/+bfzsnNycTK1MjLb0pJTUtMVv3f +0NTW0cnFzc/R5FRMSEVCP0hLT05RXevW4e7Z0+9oXFBRU1rj3tbe4tnX2+rb2fJlT05SUWv4 +597i6eLb18/Sz9bfaFZISlpd0s7d1M/X1tBhzczffFFkQDpWcOjDxNPJx9btycrPXU5KPj9A +Q01Za19ObdnP2dXN3O3vRjhDYmz10N7SzdtPVmb05PlyV1FUXtXLzMnU1cbFztPP2vpeWk5F +X1dS/V15ZNTZ89z26eV7XEtJTUpIWV76b97b39Xj9W9QTE1ESlVZWeHk8drLx8nHycXfcWFR +YV375d7gZuzay9Dy4PXd6tria1xVXnbp+l9JTFBVbmzf1dtsVGJ+3MK7wdfTzdrTz9n5WUZU +XU5MUVlZT1dSVGdv3fj94mRsXE9XT09a5vVnaX3Z3d/d1dfu2tdvV/PyfNXe2tbPz9nM1tzb +aWFcWllo4uR8dlpfUVd0XV93WUdFTVRFVO9VTt3k2s/R2Nvm23Ro3WVlYOxsb2fczm7g0tra +ye5nfX1PSXjsatHN1trX0NprfnxGUWBSTVFjbFH7X+vS5N7vztDb29HJeuXK0dnUb+1eZ1FL +XX1oRFtSREhk2tnTwtPXyuVuctt7R0ZPQkFRTFdiUXDl28jByMa9xc7Z5V9QdPVMV/5XP27c +SUD9yklbv9JqybzBurW9yL3JVklCPjU5OzY1PD07R1hNPV73TFrPyH7Qv9zVwcPIt7O0tbO6 +xcbSZEVVQTEyODIvPE5ESNR9bMrCxL62uMnLwu7b3m/Q3ejZ39vrR1RmP0tLRlJLSGlv3spk +7cpe2dRY5dtNU2pjfc7MzcPD39ra5F1GQDo5Ny8wOi88Vu3Nus7Hr8G0r7CvrrKzsr+9x8jW +Wz42LCcpKiUpLiwwRXDfuaumpKCipqmuumxFNSglIx4hICEsPTtasr6xn6emnqesq7zRys9B +Ndo2Ikg5J01PLEXVOETTVVzCvbuxsL++t95s105p3WrbyMrGvbu9y8tbPDs6Li00JyIqJic5 +N+2xrqejoJ2en6Gprr9IQDgiKSMcKyclOD/tt66opKOkrrK2Pz43JisoHSIjIy02Rc2vpqin +nJ+mn5+ns6/KLVY0HTEnGygmICswNFPT7si6t6+rqKmnqLOwrMnFnMspoh0fshQmyB8nrCUu +sihJxUdavX1M3+NPxrbEt6vEuKu+uau3uLPjPkQ0Ky4rKjEvND5HX/e9rKytq6usrq6str26 +z0xdTSpAPio9LyYtKykuLi0zNzM6P1DYvq+pp6aloJe+rpkeq7MXsUscW8se1sQfwk897e5I +Ue87N2VAR8fCvK6wsK2tu7rLSV45LjQoKCsrOUtL2Lizta6vt7O0uL7Kzczzy8pO3VM/60lH +TkVANi8qJyknLjY5TVD+x7i2qpzbnpcnm7MeoVwqq88lrGkyrFvjvWM7SDwtPU4+5f1cxMbJ +ucS9wdbvSUE6Mi8yNTA9UklbxOhfu7/Eu7nEyrXGwazJzLjp0MVa3OJJQT00Li8tLjMvMjg3 +PHeuOTuWKjeVI0iZJ06YKVaaKK6ePairUd/YNzFUMDfQOEhvU93dyWjXzj1qSDE+OT9EPsRV +Y7PQy7jDzrzAP83dO9ntW87i7dXBx8q6ysvVRUg8LjQyLzYzMDk7vsI8sbDSura0y7ux1sCu +ylCktjOevT2fNDBwIygvLy9BUDJ1ZzvbQkhxPu6+MT6iHHelGp6sNpmqv56tv67PWEQ8LCw9 +KC05LEZS2MC7ra+urLu60kdUNS4sIyUlIyYtOTJDyV7cwbqur6SnraGksqSiuqioQsVhKzs3 +MT4/MTM+MTc/Lz5LQ7PPLJ44IpogcJwpqKE/rK5Dvls5OTkqJjolLzooSknerrGgoaKfqay3 +0cdTQC4oKSUlJi1DMEu+X8XBvLW6qK65qq6/q6pqrbU4wz8tNC0sNTYqLi8qMzEvPz1sr9k4 +mUQpkyS+liaonjqpqUqvxD1POSssPSw1SStCQTy9zLCorKarsbvZ30hFOi8vLC48KzjaNUnO +WufCvN61qMqzq9Gxrs61us/jbkMwOi0uSi8xOis2MS43Pq42OpkqSZouvZjPV5fQMJQ0QJoi +zrooRzUtNHRPO7pJ/bJSt7fPtOhVTi0tKT0xIsgqJa00Rqe9xaanWqKqLqPEO6k5O+M8XmLN +zsrBUMzuPl4/Q1IwNC8nKjs0Ir9SJ7HJVLissribunOZc1+bT92kL0zRLDg+QkrB0FK6XkvM +OEhOLTkxWDAcqR0omxmvnCyanW+co0KpwjLXPCxGRCdGPCzLXu2rt6ysuLTaaUI5QCstKCEt +MSk2aT/dwry3uq20tqm32a+8Pqy2PalYN7o7SdVcyru93NFxOz8xLjUoLkU4H7L5Fpo4LY8z +qZNUoJ5btMAvNTMlIDAjJUEiOes4srOynqmkp7Sy1lNJNjMqKSooLTlXS+2zvryutLO3rrDI +uL5Myr5JyLw06VIz0UFG2dtt/Xg+P0UtNS8pMykq2Tsgn1ookTW2jk2alsKfoUy9zyg1LyQq +MyAtLyJIPTy0wLKmrKyqtLzFeEY0NCosKyUsLjXp3v6yr7isq66vsrW+xb/oTshOPMgzO+ww +bdpay+VmXko/OTo3NjUwNjM0PV+tMLWXHp6cH5WrK5nYKaE6JaooKrgkNewxPss9fLRruazK +q6y+rLrKw0o/NCwsKCsmKDA7Qka2xsejsrCnrq+yrNHouTA63Cg7TyhTTTvT28e+vb/N0F1L +Rzg9ODE9MjM/zE0wmjgykyW1liimnjmrqDTbtidL2yhC/yU/TSf1STy3ycKvvrq8ytpnSjw2 +Ny8zLzDQRDqkSk2eVbSdt7ShuWCpTCq6JyhIHykwJzZFSOC4vLeturWzzdB5OTMxKSowKS9s +yUO2pOyspbGprquyzKi/NbXIKrq9HsHkHLlDH801KtJnPLy9VbnISchMPF5COUVLvLMunLMk +ki/Jly6mrvHj30kkXSYgMCUjOCosSjhX3cS2rqilpKOoq6+751owKycfICQiKDc8zLSrpZub +op2er6+6TTwwKysoKzQrQ+Q8vbrzt8ZteEg1Ly4pKS0tMTtGWs++tK2pqqykm73Yki4onhco +vh4wVVYsva4wtbRvxK/YSfVVKzpcKkm+TsOqt7Krt8rIVDozMSkmLissXU/YpqOpnpusqKPX +4r84LTMoISgqJy89PErU1OK+vtjFyl/i201k4lpdUFBPXN/x08XXdradxCqZrBi7qhstoDQi +nq8nqadcxau3Nb+6IS5AHiEwKytR007Gs8vBuOpd50o9Sj5EW72fdl2SOciZNrDFy/c52DEx +LDUoIkAsNVv47de/r7Gtqayvr7nVb0w/ODU3Lyw2MTNLRFzCvrSurKiiqLqsvDBTaC44bz9C +Z3N4RuzkQVRFMzI3NjA0PkRGaM3Oybu3t7q+w11QzkxBzWCqmz3VlykpsSc1P0jNP+m78UvB +xTtaYF1EOF4+Me3T9sSwtsnN3j4vNT81N1RUS3rNwsGyo5ytyJ9KK8hN3Unbt1xJUUIpJi4m +IScvNj6/r7SqpKu0u8PbSFNuQj5k7HNPaNBPU+xpR0zpbGi0n7s7o6gsNrTASr+vv8jXyc4x +M0wvKzMuLC8/Rj9LT0xLVWvb0cu5s77LwL3DwsO7vs60lpkhzrAUHxws0Sq5pK/P0sM/Lig4 +LyE0TOzHvK6puLm2v8/Rw9JrWd/4S1BhUEc9QUE0O0db0cqzuayeprnDuEw9ODhOMTpGNS8q +KC8tLz9OdM++tba3raqsrrGtr7u5v95GOjUwLC0uLTY8RVFp18e6uKCb1T2qWCIo97jAvLKj +rknGwzErJisuHSY3NDc0eslluaehp62nruNLQEJCO/XC0NPBtrrd5+ZMq6YqK0McIBslstqz +qKKmyVE9OyMfKCo0Ls+qrKumnqKtraqsut7HVzEvKiwoJzU8RERMz95lzs/R0dG+ur62raq5 +S3I/KCwmN1AxUuPc6E9XSkY+P2vy3r+xrKyppqmtr7W5y15LRTs0MTExLzAxOj5HTVj07NDL +xb26rbJhRjk3Mi5byL+7u7S1yllRUD4xLS81NTtZyL25rq2srrazu8XhYnxNUVFJXFdaal1r +Rzw3NzgyOk1W42JK3OpqafrJz8zP3s3e7mZzztXT1enp+1xRTlxzbWXQvru5trO0trq+zeNT +Pzw0Ly8vLjQ5OkZW8/Lu7Hx03cS9v9X3clVeYeLGwsrNx8TPeVpNTEY/P1Bz5dXJvru8ube2 +t7u6vsHKz9bR11tBOjcvLisqLCssLS4zO0zw2ca4sK+1urzI2NjKvru3t7q4v91VTEpKQTs5 +PD4+Qk7UwL66s6+ytrq+wdVVR0FDPzs9PTo2MzQ0NDQ0MzM4PElw3L6yraqrr7S6vcHCwMPF +v8HLyM3rW05GPjo4Nzo2MjM6SVvXvrOura2rrLG7x+VPQzo2NTAyMzIzNTY4Nzg7PEJDSl/T +wLSrp6WmqKenq7O8yV8/NDAzNTc1NDk9Q0xVX/n9YlpUVVp70cbEv727v8DByNPzXUg+Pzw8 +QUA9PDk4PEhPTExb7//Tvrevrq+wsLG5vLzI0PR5WEQ9NzY8RUlOTlVOTFBFP0ZDQUZGTV7s +3tnP0Mq/vby+wMXJyczP2u7sWUhIPTg5NTU3PEZPY9vEvLWwrq2urq6xub/F1+H1a2hcTkhK +SkRAOzMvLCsrLTU+YePNvbu7vcfN1HlRTkg8PkNLaNfJwbeztbOztLa6vcvu+FtYSUdFQUZI +REM/Pj49SE9a5c7Fwr28vLy/yNHjV0tHPjo7PEVER0lHUFpeTkxGPT9KUWvdyr+7t7W0trKy +uL/M7/NgTU1FSU9PV2Ls3M/MztTpbWRdUk5OSUtERkU/REtTSz8/SFzuz8O7t7K2ubm5vMLK +7lpIREVFSkhMVVpnZGFhV+LnTT87OzxEWXXlzcK+vbu5t7S1vcrcYVxWWE5LVllVUUtITE1Q +TUZKT19kYHzd3N3da19UR0hLRT9BRlPsx7+9uLa1tri6vLzB2XNdWE9QTElISEdDPTo7Nzw/ +NzU3PUpY3c/HuLSzsq6usbO1vs3lWE5JRz87Ozw5OTw8Qk5lXObFvry7t7m7v8twWVY/PUI+ +Ozg/S2fPy764s7G0s7a9wMXjWE1EPDs8OTg1MzY3NTQ2PURAR1Nd7c/KwLu6tLSyr7CxsbK4 +u7/J32JtWktAQEE8PDs8QkpJTVphdOHM0OH/fU9IRTo4OTs5PURO9se9ubazsK+yub6+v8r0 +YGpTSk1OTE9XT0tJQ0NGRz48QEhJVF3+7nzYzs7S2MrIxMC/uLKzsrK0ucDL5lVCPDczMTE0 +MzM6Rk5h9ODVz9nb9l10amZfW2Hz19HLx76/x8PLz9X4Z2tpZlxj5e3g0szLzth9Y11PQTw6 +MzU3Oj5FT1hdZPTOxcO/vbm2srKzrq+ytbrE90s+Ni8vLSssLS0xOT9Z68/Lzr/ByszIzvHu +3u3VycjExMXM09H4bGheYlZOWlp339DCvbm5vL7L3XdNQTg3NDAyNTo+PkBOat/UzcfHv728 +u7u1r6+ws7i8xv1NRj03MjEwMTMzNz1BP0VUVFZrYFNYXmDr2ce9ubW2uLS4wcXI0+5dUVRT +TVVa28/QyMbL3el2WExBQkFBQ0hWaE9ISkZCRUg+P0FGWFl038i8vL26tba6ury7v8zZ1s7c +5dXN2WJdSkA7Ni8tLCwuMDhAZca9u7avs7OyuLzG09/3+11s+d/da/zzWVhdWV7zd/3s3MrK +xcbKxMlwZlFGPjUvLjA0NTpDTU1d0MzKvsDEx8jAu7a2tbGyt7i8wttLPDIuLCoqLC4yPUhf +2MvAu7u3uLq9xsjO3fLm9HtbTE9aX2ZiUlNJRklYfd/JxsLAztDO5GZRSEhFOzxASW/k3en0 +6mpfYmNlXF976NTNwbi3ur3Gw8jR3/TeaVZRS0g/QEg/REtFS09QVVtnXWvd3trLw729vLzA +v8HHyNTna/vZ3Nn0ft9OQz02NzUyMjU3QFfmz8W+ura6vcbOzv5QRz88PD9GTlVU/+vu2tDD +vru3u769vsK7ury/w859alFEOzQtKioqLTU9SlJb4uTbztHNwMDAv8G/u7S1vcrT/U0+PTo3 +Oz09QEhiy76/v7+5u8PCzd3f9lJGRT9DTlRcUVllRUJCQkRKbOTcz8K7uLS3vb7Cxszd6FtP +U0xYat7Szcvdak1HRz04NjM4PD0/SlhtzMrIzNXKycnW6m/dzdXNwb27uL3D3W15WUU8NjQ8 +Pz9NeunSycPDzMvFzd1kVFlndffs3fdacm5RQT4/QD4+QU770sW9ubm6uLfA2NzpW0Q8ODxE +Umhpd/fczcrY5+LeYUhDQ0lnz8rPzszExM/d8ftgRzw9QEpx0cjHxsfBw8vdevN0UUtQUV3V +y87cbF3r3+JaSUtLSENLX+zLxc/Pz/b+YUo+OTc5ODg9Su/Buby6uLq7u8LZ5mRdT0pNUdjJ +1N3g2+rgc1dXTlNWUmB15czJzN98Z1xPTktCP0VERFN138rAwcvN2t/g4HpKSEpQUlNz3MbE +x8zL3drR9FZFSU5SVmL1y729xcnQ4v1bXk0/P0ZPS05t38nIzc7O1s/X23pTWm5hYOvl0dHZ ++mVcT1n4bU9LT1pq8dnHv8HKz99fUk5LQDg2Oz9FTmbWx8PIyc3Z1dLY8ExLV1lYXe7PwcPL +y9fd1NjdXkxSV1VPT1rv1dLa6WVZVlVIRElOWVdf6s/DvsLM2OV8ZW9XTE9eYFJYcuLP0tnm +5H1RVl9STmTr7uPSycfEy8jH0eRZU01FP0FCR01XXnXMxMTDx87g1d7o79bM0MrW4c3LzdHl +42FWTz8/SllPWFZOYezq+HBWW1hOT0hASEpLS0lZ287Jv8LDyNrqY05PXnP62c7Gv76/xs3S +2mtSSERESk9SVn7r2cbEysvV3vZcSkA7PEE8QEhIVHTu3M/Ex8zYd11g+3b32s7KxMXQe3lv +XVJKSURMXWDl187Hvr/O1NHd7WFRS0NNTURSYV7o6H3b5NrO0tfS3+zcbHnm4dfMwMDDy9Vs +VEhEPz0/Q0xfbe3UztDn8dfvYl5dU1hcXPv2d+7s2Nzx9mRYXGNtaH3m5ubw6/LfycvK0ndo +VklFQEBETVViz8nGvr/Ey9LdZFFHQ0lPXFxmfWnUyszIz97kYF9aT115Xk1NTlJqaWNj6dre +7WlbUmhs6tnb28zJx8TR3ndbS0Y/RmN57N3Mxb/DytDtfV1NSUI+RWd54dDMwL7BxdTX1t3m +Zk1AQ0ZFUU9OW+fe2c7P1dz9W01OWFhNUlNr1dXZ6VxXaF5lW1BZZW7l1dPCwcbL5mZjUVRW +UWjw2c/N0cvBv7/G2OhpT01DPjo7PDs9P1LvzMnLx83S2ONYU2VTVlhWVl/m3Nvk19nra15e +7+TayM7Tz8bHz9j5Y3NjUU1QT1J4+vPW2dXU6X1hZXBuRENGRVbc0MjExcDDx8vO1XhNP0A+ +PEdc/d3Jvb2/y9DP3l9KSkg9PUZNWE5RbWdOTVp67Pn52MzMysO/wczP1vNVTVFMTEdLW19f +79HLysS9vcLJ2W1VRD5DQUFDTm7u3N/c3HNZT0tFQkdVZmPZx8XExMPGyNDjfFtLQkxUTVpq +Yl9dZu/n2tXSz9Le6s7Rz8PH12ZabFhaS0tCPTo4NT5a5L29tLSztbq9xM3kSD07PkZU3t3Q +1OHsdmHn6nRzSU1dZ/fM1Nd1bVNLSERIS0NAP0NacdXVzdrGv8PI1Nfc1fRpX3ly0MrHxsvO +0+xSS0U/PDs8TXDIvr27vr3EzNpbRz44Njc2PkVTWHJo6NHNys/Oy87d9+/r4NfS0+/5WPz1 +3PZdWE9IRkVb4sfBwcvKzM3N9VVART5FTFDfzb6+ytvVX3hUSklLXU1YadbCvbu3u8XKytDh +X0Y/OTg6RkxRVnbv3eff1vFxXWFrX1VUbdXbzsvW7mNkWk5LREBRUHHWzLy/uL7K1e5yWVdM +R0hcXunT1M3Szc/16/NUSkNDRklRWF7c0s3Dx8vN1N9dVEQ+Qz8+T23l+3Da19bP2NXkaWRk +2+7bxcbM19fN8FBcSUlBQD9NT2zPxb3CvsPA2c7YdmFHRTs7PU5j583KxsDCysfO4GVZU1h1 +98/O2tfazs3z7lZGQDw2Nzg8Q01v3dfNzM3NztfRzeJ75+Ps39XN2G1sUFVWTlNJTkxP8t3L +vb26ury8ydjlW00/Ozo3NzxIUWLj2NPY1dfc2Nr2X3hwbuHY18/Z3XVTVEZAPjs7RE1S7cm9 +urm7uLrBzNXzWk5HTUpLS1RzbGJkcmVWW1VVYmTl1tXAvL27vMLK0d9xSz49Ojg6SFds79DB +vLu6vsbO1OhfT0RFRkRHR01IR0dITEpMT1VaVubIw7+9uru9v8LMYk5MSD45PEVLS2fZw8XJ +v769wsG/zN1bX+NnU2r6YkxEREQ+ODg7Ojk8TPHVxry2tLW0s7zM4/1QQjk2ODs+Q1Zs/PrU +ys/NxsXI1M/Jw8rb2dfaalZiTz86PDo3OD5ZfdrCure0ure7wM3j4vtaTUtQSUBHYlxPXO59 +ZPbj1t//zsTI1NbJx8zo5OdPPDU0NDMxMzo/S/3Gvbu4tba7w8XI1GNSWWNbVE5RTE1JXFxT +Y2/37NrLv7q8u7e3vMLL7VZEPjcvLi0uNDpDUuTRyr+8uLe6wsjO2/D1ZlVhaFE+Oz5CQD1F +T2D95su/vry0srm8vb/N71lPTUI3NDc6Oj5PW/zf2MS9vsC9u8POy7/E1tTM1O5MQD49Ozc6 +PD5GSnbHv7m1uLzBxsjP+l1IPj02NDM1ODpBTlZq3c/OxsS9ubi7vLu7vsPM421MQzs5Ojc5 +PENOc8/EvLe3ubm6wc3UeFRRRT9DPDU0Nzs8PUdNWHHdysK+vby7vb6+vsDT4Ox5Tzs0MzEx +NjxLZfjOvri3trOzub/H0tfkW01JQz49PTw7PURHRU5b+NjIvrm0tLS1s7i8w9D5WEY6NjM2 +Njs/PEn7yr6+v728v8XHzdp5XFdRS0A8Ozk1Njk8PkBN9tPIvLe0tLS2ube8v8r2Z1RDPDc2 +Ojo+Q0pTYtzLv7/Av8HHz8rJysnU6nFPQTw1MTAwMjU3QmLZwbq2s7O0tLe8xs33WE5CPDw/ +PDs9RkpKVG7XzsrFwb69vbq4vb/Jz9f6XkpEOjY2MzI3O0VWd83Avbq4t7i5ucLL1NrV5mlQ +RTw5NTY6Ojs8QlRu38O4sbKyr7S4u8HWaEw/NzMwLi83Oj9JW+fTxby6ubi8vr7ExcXCzPNW +SUE/Pzs5Ojo6PEdc2sW/vLq5uby9xc7W+FlIPz07Pz48PkBDQEhU7NDLxMbAwLu3t7q+wszc +/lJDPTk1MjI1OTxHcdnKwbm4t7i6usDI0N5ueU9HQzk5Nzg5PENJVePKv7u4tLKxsLK2vMHI +3WdIPjg2NjAyMzY6P0RKdtLNysbGxMPCxcXFzs3P2HBXSkI8ODg3Oz1FWN3Mvrm2t7Sys7e9 +w87XWElAPDw8Ojo6OD1BTV/j1szGw76+ubq9vsXTd01HPjw5NTIxNzxKXt3Mxr69u7q6u7y/ +xs3W1uFkXFVMRz45ODc5PD9OZNnFvrq5t7S0trq9x9xRQjo3Njg4NjU6Qkpm08nBu7q3tbKy +tri+z+ZWTkk+PDk1MjAwMzlFWuHOx8O/vbq8vb3Dz8/0XUtDSEhDQEA9P0JGUP3VycK+u7u5 +trm9v8PN8GBTS0M7Ojs4NjY8QkhZ+uHTxr66t7q6vMbZ8l9TTUNBPj46ODg8Qkxp3MvFxb64 +ubm5uLvG2epqVEtEQTs5OTo+QklYYeDNx728uLi+u73L0e5iYUZFRT9EQ0RIRld78dbLvry9 +u7y+xMvW0+FbWFVKREE8Njc5Oj9LT1Rr39HLy8XHysfJxszZ7fh8YVJMRz49PkBHVnvdz8S8 +ure1uLu9v8jpZVhKSUZCPz48ODo9Q09WZuzs2MnFwcPAx9DW72daVkxRTENFRUNHRklWX2nq +4dvQxry3s7a6v8TM315HQT07Oz1CTWbm18HBvr3Kys/gX2vv+vb0cunbfuZgUE1IRkVPV3zW +0snBwcjVZmNYT05OTU9iaGh++GJeT01PSkhPZd7PysHBxMPHyM3/XVVLSk5RXW1n8d7Z1dzn +/mVUWV9g993Rzc3HxsnP4HdUSUQ/PT0+REhV9v/q4ejqdGz98trQzs3Ozc3T3GddTUI+PkRP +X33SzMnExs3b3PZYTk9c9tzfzsvK1OZpWk1CPj5DTGvY3ce/wr/EytzV2t3mYvvr9uXoffjy +Z1VVT0xaW/vVys3MydXY+1pQRDw8PD1EVl1r4NjS0Nvu6u9tYWhidt7U0MjDysvS3/lXTEZN +VFN059zIxMXI0tfqUktJR0xZaO3TycrU4mBaTkZDRktOZ+z66GxeXU5PTEhOXOjOy8bCwcHI +0fRUS0c/Rk9c3tXHxMjAv8je4eL9a2RbXFxt5Ovz4OpoSj5EPz9FTXD43cu9vLi7wsnW3llR +T05OTUpNTlTh4/tcX15hWlrqz8vJwMPCwtVhQTo4NDU3PE5b2MC+vr7J1OJ4e+re1szHy8zG +ys7bWUY/PT1ATFrr0tLIyMjJ0+bvWE1UT05IVVRZeVttb1hST0xVbNnKycXGycfK3/RNRkhD +Q0tYceXVzMvBxsjMeWVNQENITVVy2NbCvMPCz3dXPzk9ODtJWc3Cu7i6vcPV4G9f7+biz8jH +yL/Ez3pIPTc3OEFKZG3n3m/P1XZTTUlBPkRIWN7ey8rMy81sTEY+PD5KadDEwry4ubW3v8Xa +WUVAQ0VPXWvx4uHc9GXv42JaV1383tzczcvPytdPTUI3NjY7RV/Yy8K/vsHS/FxGP0NIU8/B +v7y7vsXZTkE7MzAzO1HWw7qzrq6xuMvbZkA7NzhCUWXq29vbZlBMVFBITVhi1sG+trO0u8TP +aU5AOz0+RVj+zs3Tz/J5YElHTkpKU17q0MTAv8XfXE4+Ojg1OD5KZ869uLa5v8TnWkxFRk5o +d+HCvb25yeRmQj49Oz5IXPLPwsK9v9zrX0ZFQUFLXnblzMbGxdphUEI6OztBTGXVybq1trnC +2F5DOzo7Qk1b9M/KycPR6OhZTlFKTm3f0s28uru+0tr8TkA/Ozw/R051yb+9vr6/ytvoZWv0 +6NPOycrP7E5KQDg3Njg+Q1/Xw7q9u8rd4VRFRD9BSldifc7HwMl6WE1CQ0xKVHHjzL+7uLS6 +xs7gVU9NRklPVmTdzs3OX1RYTElMT2nf1NjLx83XfUtGQD0+P0RS+t/Mv8G/wdPha05HRkVI +XPXozMHFxMrW6VZEQERHTv3czb67vsDM62tQS0xNTlvm49fP3+dcTkpIREpabO/azsa8vL2/ +yd38X0tKR0FFU17cz8zJ2GhOS0Q+QkVGVuzRw7+8vsjY72VKQURES2Dz0MzMx8zdc15LR01S +V2/e38vDv8TO6WpnRT4/Q0hj7d3Jw8bL1l5WTz0+QEJNZHvQv7/BydRhUUM7SEdO6M/IwL69 +vcLK2t9PQ0A8PEZTcNXIwMnH2OtuSUdCQk1oc+LSxsTO0PhhTz89QENe0si9uLS6wMXU3mRP +U01Iad7dzMjJx9JtU0I5NTY2OUh72snBw8nN3mdKOzY4OT1gz8O7trW4vcvnelJIR0ZQd9nW +ycG/xM/WZ1RGQEJHU3fb18fEy9j/VEpCOj4/QlXizb+7urzJ505AODQ3PUZs1MvAvry8v8p7 +WEg8PT5EX9nKvbi3ub7PWUM5MzQ3PE9o1MG5tLi6yu9UQTs9QE3k3czCv77EzOVhVUpMWFvX +ysO9vb7I1ldBOjYxNDo+UtnJvrm4usLTVUE3Ly8yOkd70b21srS6yW9SQDs6PEdf28e+trKx +tMTvTT47PD9Oa/3Sx8LDx81tTEE5Nzc6RF7ayru3ur/USzw3Mzg6Ql/OxbqzsrS5xWBFNzM0 +Nz5gzsW2sbO1vdhgRTk2NTc+TvfNvri3ub7XUz85Njg7SvDYxrq2t7rC3GRKPj48QVnQxLqz +s7K6yV9HPDg2OkVW3OXJvb3B0H1BNy8uLjE7U+vHubOytrzSV0M5Nzc5Plnexbmysra70FtJ +PTs/Q1Dczca8uLi+x9pRRTs3NzlI8tnLvbm8x91URD05PD1AXtHMv7i7vtVWRDgwLzM4P/HD +vLOusLS91mRGOzc4OUNq3cO1sre5wtlTPTY1Nz5V3Mi9tba9wNdkSTw6Oj1G7sq/trCytsDd +WEE8PD0+Smz53MK/xdBeTEU6OT09RWvVyry4ub3PaU09NjY5Pkps0sW6tre7yNT+Rjw7Oz5P +7s7Bu7q6v83WZUpCP0BBS1v40MO/ws3tYUI6Ozw+Rm/Pxr+9vsPRd04/Ozo+QE9u07+5uLzG +5WxKPT88PkVX7s2/uri5v83STkA9Ojs9SVbcyr+/w8vO2FlNS0lKbd/Sw8O+vcXX7GBIRUdN +UW7tzsXNzM9zU1hIRkNFTVnj2Me/wsbcX0w/Ozo9QkpZbs/Gwr7Fz+Z/YEtLTE9aY+DMxcLB +y9Lkc1xUU1p72dLMyNHbc1RUSUNBP0dMUPfcyMjHxdJ9XE1DQkJESFrwz8PEwsjZ/lxMSD8+ +Slzk07+9v7zE3PxVTExGS0xbdunKxcHBzObqYE1KS1Np+nPn3+La71NXVEtNXW7TycjCvb2/ +wNJjUUQ9PDxGSlbXy8XHycvja1tPVE9KUFZmf+La3Nl9VUpIQEFJT2zm1cbBv7/EzeZ3YVZQ +UFZn3dbMw8XK22BTTEpLTlRq79XPy8XL0fJYTEA+PT4/SVj1zcbEycrXc2VVVU5NS09l+93Q +ys7cf3lYUF1hdd7TzcXCycfPW1JLQ0FER1Bfbd7Ny8vK3GtTR0ZHVnrmzsW+vL69v8zU61pP +TFNZYPrf3dHU1+teaU5ERUNGRkxOYuLn49j7XFxNSkpMUGN18dvf2c3N5G/yaWVwe+/d1MfA +v77A0+h1W1VUTE5q/d/QzdHZ2f1fWU1IRkVLTVdmamz+fGNbaV5aZXhubOTv7N3Z1N3a2O58 ++mleWWZr6ePo5+92Y/xrcO/v8nvp3NDGxcjP5u9nV1BMTk1JSk1o8evU3NPMz+Hd2uTa4tjQ +0tDN2uXlZlVMSEZIWmh16evfztt3aFpPUE1ISlBd9NfX3O5oXE1PW2B969/X0s7Lztbc4ehf +UlVVW1pi5uvc193T2NfPz9Tc43tjV0RLT0xRTVBl++De2tDc92hcZ1hPXlt429TP2NdrVEtM +UllraPDh4ePV1+PqaG9ZYfhza+fc0snK1PV0X1Rbb+zi2/RtdGJeYVlvZ1/v5tfNysTFzc/Q +0dTo3ftfX2BaXVhOUEpOVk9ea1lfZnVxbGNhVlpnYVteZW71bvplWFVUXeXUx8K9ur3Cz2pN +R0hHSk5b5NDHwby+zfVSQ0JERU1Ye9vOxcLN3XdjWUtFPj9CQ0xz7uzl2d/7+W9sYO3c3M/Y +29v6d19keWz73uHZ3O1kY2xp9G72917349rP5HpmU1hXW2dfetnc2t3ocmXmy87JxsjKz9TV +0+VlTUhRXFz4fPvl93FNQDs4Oj9IVOnNwr29vMTbbklAQD1AQ0pb3cm9vsDH5mlcS01NUm7c +y8LCyszO1d3d3N5tbF1T+PFkWExJT1nx3dfMysvXflI/PD5CR0tYftvOyL6/y3tOSklLT1Jc +/N7W2NzgWVT25+TT1NPb1M3W52hOQkZOWfra0MzHxdLcb1A+QENAUGPZzL+2t7/Oak1JTlti +9djKxry7wclkQz46OTk4P0/sztbb5e9wY/J2UkxITFz18GVsT0lMXtDLyMTCv7/Dz/dRRkxV +X2JwzsK7uby+31FIQEdMTkxV9dnO1thhSD5GVlRMSE5yyMTIze9eTk3v2t/a9P7e/e5vSkM9 +TFp9z8W8t7XAyM9UPDM1PkBFR1i+r7CytchcPkdPREFHUV95c97O5V9c3MvPysnVzMfKyc5f +R0Re1t/S09Pb3GhEPzw7ODc6QVjUw7+8vcvrRzIxPFzv7NzaxL68ubrLTz07R0pMYszAwcXL +x9NzUFV+73PkdOn4/2hNQzxCYtXPysi/vsbJ315MNjA0OlrRzcTBvr7X4WxPQDU4PkV3wcjP +xsfJz1pNTlTieejM1dbFwcrZbu5dVXBaUE1COkpdX+ns2NXWv8bVzXpLV+P0fk5CRl/FubSw +r7e7vsxuRjowNDg6yaivKRcVHsyhmpqfoqlBGxMSIE64rKqquTgsNFu1r7CysrrSUFLdv73a +PT3MxLVEFBARH7GflY6OlaM5GxscKklvzt3w4z4tNTvOrKejqb9GLS9BRTMqKCxcua+rKxUY +G76ZlI6PlZ/FHhcaHz3JraSrudUsJCotS8+7s7e4yT0uNzg6Pi83zLu3zBYTGSKglY6Li5Cc +VBUWFx8/TLysra24P0RGSrmzsLRZMCQdIS01QjwrT7zEwhoKDxRNmZCLiYyUoiQWGRk6wa2d +mp6rVygtLEHEtqimsto7LSwuMDYsJDFDTFwYDRcgq5iSjo+WqS4PEBgmuKKamJijvCocHB9G +sqOdnaxdNCguOz4+OkDGs61WDgoOH6eYkY+Ok58wFRgbLeXDq6arvVcsLjTTpqGdnatZJhsb +JUC3sK6/Wrmw7RIFBQ3ul4uJh4iSuxUNDxcnO7Wkm56qWyMfIi9et6mipbJtPVduUE0/Nyoa +FyuznrkYFBq5lZKPk5Wfxh0VGiqxq6Kio6xHGxAVHC7sqJiUl6pILCgnKzdIaE40KCIoS6aa +qRgMDh+mlIuLio2bOxIMCxgvxqaZlJuqKxsaGx8qzqKZm6Kzelo4LS4pJyUkKDXIpp2Xk5ko +CwgLN5qLh4eJj60WCgcNGiZvraCouC0bGhonQrKemZujvkFLVua6u7/lKxwdJ2G7r5+WkdcU +DxDLmY2LjJCctBQKBw0iQLy1qa2vMhkaGizKpZmXn7k5Jiwz6q6tr8owIR4hPMKvp6WdkkUS +ExK0ko6OkZmm5g8MDBE6vauor1E+IRQWHEyek4+RncEqHCM9v62xv0wsKCw/wb3StbGfli0a +GB6cj42Sm7reHwoMDiHCr6qpwTIdDhMi0JuRkZah3C4gJUXYvc1GOzc6SubDvcXPr51OICAk +nI+OkJq01B0ICgoauZ6YmqO3TxwVFh7TqJ6cqLdpNDpXclQvJCYuU7mrn6GinScNDQ1QkomG +h46Zwg8JCA0i3qidnqu2KhkYHE+ooqa4Sjg5VrOttPYmHh4eLMiel5OTIw8PE7OTioiKlJ1j +EhMNFjBJxrm/Ry8ZGBslvJ+YlqBNKR8fNGK3sMhBLCg17K6alZG2DQsLI5qMhoaLlaMbCwgI +HEysoqCu0icRExcsu6KZmJ+6RCgqOGC8wGI2JydCv6qfnZybJAoJCjqYioWHjJGqEwoHDSzS +qaWnsdcfEhESK6uZk5SfvjMeIjmynqG3Oh8bJD6vn5+Zk64VCQYWrJKJiYyOmykPCgwf9Kae +o6vKKBIODx67nZSUmac/GhUcO6WamqNVIBwkXq6kmpSnGQsHE72ZjIuNj5wtEgsLHkiupams +vSwWEhMlvZ+VkpagcR0XGzijl5ae7CIdIkWmlpVREAoLJrSZj42OlrccEw8ZOsmsp6iw8B4U +EhYrw6SamZuhvyscGyi/npicsT4iHCfQn5KSRRILCymul42MjZCqGxANFTXOqp+dpr8fExET +J8unm5mcor8qHxwjRrOfnaa/OiglKTaxmpGeGwwIEl6fkIyLj5o2Ew4PIVe0o5+kvCwTDhEc +Y6aZlZadsjchHyZFsKOforJBJx8oPd2/v7Sdk7ATCAUYrpOLjI+VqxwOCxE8r6Cgq802GxAR +GEKelJCUnrRSJh8oS6ibmp61NiIcHixMxr28rpqdHgsFCjqdjYmMkpw7EQ0OJKydmZ2vSyUS +EBcqp5aSk5yv2isfJC66npqcqjgfGhskO8avsKWYuRIJBRC8l4uJjpakHw4MDSe0oJuftUQk +FRUZKqiWkJGZqcAxHx4kyZyVlZ9OJBkYIUO4r7ekmTwPCAUbqpKKjJKZuRUMChBOqp2dq+Uy +GhEWHseYkY+Unq5dHhccPJyQkJe3JBcSGTmzpq3DopspDggJOJuOio+boD4PDAsasqKanrZO +LBcTGiarlZCQlp68IRATKaSPjpWnLxcPEyPKqa1xUJ6fGw4JEaaSi4uUnqcnDQwLIaqhm6PC +PioXExssopOPjpWrMRUPH8ebj5OezRwSExtZpqbBMDKqmzsRDRGxko+OmKGoMw8NDx+roqKq +20QtGxggO56PkZSmQyccH06pm5mrPCEZGyVKrqi6OS3LnJ0gEA8fmZKPk5yjuh8NDxY/oqaj +r85LJxgbMrCXlZykvkMtKT2yp6zpJh4eIC1Iw7bN6cOjmx4ODxadjouMlJ+zJwoKDR2qpJ+m +tl8wGhQhWpmPkZio3zstLdquqa82HxwdKETGr7xS2KabKA8OFZ6Pi4yXoLgfCgkLHa2knqe3 +yzYaExkunY+OlKXNOyorYK6ho9QqHR0pSLiqt7ulmq4PCgofmIyHi5KauBUGBgotq5+cqbFc +IBIRGu2ZkI6VpVsjGyXrpJmcsTIcGh81uKm0wKiatxMLCSObjoqNlJu6FgkIDTGuoqCtuksf +EhIa3pqRjpKjTx8YIn6jlpimPx0aIDm9sqmcmNwOCAkknY6JjZKb3hMJBw46rp6dqrc/HBAP +F0qckY2PlKAxEg4Y75iPkJxTHRQWKMquqaCZpRoMCRWrkomJjZSnHwoHCRvLo5icpb8lEQ4R +JKmWjo+Um7MiEA8cuJaPkZ9DGxIVJfGvpZuZQRIKCiqjkIqMj5jGFQsJEDmynpufrUMbDw8V +NaSVjpCYpGMkHBonxKCWlqDXJBkaIDfBr6udmUwRCQklpI+JjI+ZTxELCRVQrZudqcIpFQ8Q +G8Oaj46UnrcwHR0n26OcmqC/MB8bHyxjta6zvq6bvBUNCR+fkIuOl5+8Gg0MEVqmnJ2v9TEd +FRYdu5iSkZut8y0fHynTn5udrD8pIR4nO8WqqbtLMT6lmjMUDA7enZSUm56g7hgTDyW0rai5 ++WE/IhweMKealpigqrdJKykvw6Kcn7cwHx0dKD/KsLPBQickLfadnSgWDRLbqpmUlJWZyB4a +Film4rq+vsBWJCElNrGknZ2hrLpCLTI8uqWhp8A3KSUnNUpj1G5ROisqMMmanikYDBmtm4+O +kZSaPxkUDyQ/1rrHzNc7IyQmS6uhnZ+quNczLzhTsqyvt9RENCklKjFH82BLPT5lrperGA8L +I56Qi42QmKIjDw4PLMqzrrvWSyoZGh9XoJiWmaKv2i8qKz23pZ+gs0YmGRkdKvq3ucvatpy8 +DQkHHpiMh4qPnLEXCwsPWZ+YnKzgNB0RFBzDl46OlJ+vVB0WGjeej46Xwx8TDhIeT6qjrsO2 +n68UCggZno2Ii5GfxRcLCw47o5iZpdgqGw8QGECbjoyPl6ZCGQ8XO5yOjZSzHxANFC2unKLq +Okq3ni0NDQ+vj4yMk56/Lw0JDBi1oZyjvTsoGxMZJ6yTjo2UpT8dGSuvmZOYpy8TDREhvJ6d +qzwqXtSpnhgPFBielpCOk5/HKQsPEx+wua65czYsHhst9Z2UmJypyl1MTbmnop+4MCEcITbV +razJVTsu3Ku8mK4OFQsboJqOkpmrrB4OFQ0p4OCvyFdNQyUsOMmbl5ibr9tSOEHKxLq/RTUs +LUdz59XoYuvWTtGqr/gtHiROu6qor661TC8oJi4/SVNYT048MzleuqunqKy4/z05O0ZbeN/J +vLzgVEY9xrdTqJsrFQ4MPpeNio6itC0PDg0Xv5+anLZGLBsZHjakmJidtkNEUMmtr8NBJCMs +Pb+0uK+doqOZHAoKDMmNiIiNplgfCQgLFsKfnZ+5LyETEBs+nI+PmLYxLTrbrKmzcigfJzK/ +qKmnoaydpQ8NDhuVi4iJkKhaFQMHChmxpp+oYy4iFRUiQJ2SlJmrTzkvSLOsq7k5KSYpS7aq +rLyxo5S1DQsKLZKKhouSolgPAwYJL6iioMlAKBwQEh7Tko2NmcwqHRwru56UmK0vGx05r52f +raGcmi8JBwzEj4iGjJOsJwgDBhWvnZmofi0aDwkPIqSPjZCerGMhFRcun46Nl8UgFhYotJ6d +np2YqA8GBRKijYWHi5W3GgYFCSOmmpipUSITCwsUO5iNjJGiXiYaGSm7mY+Rm88lGxwq3Kql +rMC3oKIfCwcNu5SLi5OdvSENDA8qopuZrTcfFhARHeaWjIyUszQfGhwqwJyRkJm+IRUTHEui +k5CbZxsTGDifkJ4lEAsYO8SfmJKSnjAZFRgsPdu6trj8Kx0dJuOooZ+jqLhCKyk5u6OenqO3 +ZDQlICIuz6qmq8Q8KyUoN1zCwbSTmiMQAwkxoI2KjJGYLg8KCB++nZadreYmFBIVMJ+SjZGe +sk4oJytjoZqZn1MjGxYZHi2/qKauQSMdHit4r6Ojr18uKayVxyoRDuuilZafpqZcHRoWPKKc +mqxpSjEkJCnYnJaXo+o4LSQkKT6yqrFbKB8dGx0lPrGkp7k5KSgsRr2so6Ktt5yXTxcLC0OZ +ioiNl6Q/EgwLFdyjmZ7HMiUbGBwrq5WQlKRfLyQfJTWznZylQhsSEBgvtZ6crD8iGx83uJ+c +m4+VJg4HDcOThoWKlKQlDAkIGcykmqXfNSUaGyJSmo+Olqw/LCgmLU+qm5unNxsWFx86u6ir +cyoiJjfyt6eVrRsVDS2ekIuQl6bMGhEPEzzEq63iPTAoJjnZn5WUlaDPLB4fRKWWkZzrHA4O +EyPIqarBMiMjLUnXtq+bkzMWDxCulIyLk5/DKQwLDBnCr6KxSDYqIylYp5KOkpu7Rjk49q2m +qL4tHhgZJTrJuO4zJyc4yrm8tq2wuK/SMiAWI8aZjo+Wti0TDA0SLrGenKO5Szkzb62emZuf +rLrEw7KtuFAlHCEmKC0+7FQtISY278PG3czJy7/GvK2+TzsrMei4p6S110UwLCkoLDZH0MfH +yM+/vbuuqamqrKyssrrTaUU5ODAuMS4uMj1nUzEpLkJZW9mupLwtIjOuoq1gNSs1Vdeurb3F +YjkvKCs4TX3W18bCu62rq6uusLK0r62zyVI8OUNIS0UvJCImKi00PEqysT81O9LCJxkmro6H +iZOrNR0WERUfPrKrvD0oJC/Mp5uXm6W1wsC5sbloKhsaIUC/7jk9qbGvqQwDCAuri4aBiZat +JAsMFCKgnqCkOigeFhkquZaOkZq/LCYpU6+nquQhGRsnzq2ypqOemBoJCw+fioaFj59HGAgF +ChS5o6SsKyYdFxoj6ZyPj5SoPCcdKbqbj46ZzR4UHEOom6TUXtirzA8NDi6RjImPnLUsEQkN +F8iep7QpHBgQEBg6n46Olak7MigmL2ujlJOeySMcIzm0o6Sora6rGwsMEKyQioqSoG0eDAwQ +J6Scm60zHxgTFSBYnJGRmbkzJyElOMKgmZqlUSUfJDjHr6mswee+qMsaDw0koJKNlKHENRsU +Fh+1nZqjRR8ZFhceM6qUj5OjTSkjKjrZrJ2ZnLEuHBodLWu3pp+juy8fHyxUt6qqqJ2XUhAI +Bh+kjomNlJ9+FQ0LFtijmqLqMCMbGR01pJSQlKdXMSgpLEWunJmfxicdGx4qP72loaprIxwd +JD+5pZ6eqFglHB8+rZ2UjqofDQYUM6OQj5GZsCQXEBhGrJucqcc2IR0dKLmemJmo2DQnIyYu +7KujpcEsHRocIjPGpp6grUYoIytfr6WforM/JyQwx6GTl0wZDRA0rpmTlJmkSB0XGCvJr6iz +zkwvJiYra6adnqfHQTApKC1NsqiqyS8iHyEqOua+veY9MTdlw6qblqsdDw0mpZKMjpSfyCAV +ExtOsqetXjAnISApSqeYlpqtUy8lJCv0ppubrC0XExYfOb2rrmEpLkyktxQTEumOioiRonYu +GREYIK+cnqo0HhsdIC/GnY6Pl64rIic3uaCbm6k2GxMVI16vrXYnHh8rXbadrB8cFUiVjoqP +nLk6HBUYG1yvrK86JiIjJjjCoZaXnrk6LjJOvrKvtFAqIB8qRdLDejw0NEBwuauhlr0VEQ9B +lI2KkqHEKxEMDRZXq6SuQi0rJipNqpaPkp7MMSs07LettVwrIB4iMGu2tUwsJy1vuLStra+v +r20eFhtLl46Ola42Gw4MEB/Bo6Or5i4rK0avnpeYo7pRP+y7rq3MOSsoKjM/9cDKXD88S9nL +vMM/Tsi7rbLU8EgrJB8oyKOcnq5lKx0ZGBwqS8OyvM/eY862qJ+eo6uvrqqsrbhWMCgnMElP +TjYqNTE1Ti49a8WcpzoXCxNOlouKkJ/LIBQODh35pZ6uQi0kHyQ3q5aPkJy3TELLrau03TQp +IiMsQc/C+DcqO063lz0PEQw7lI6Kjp21NhQMDxRUp6ml4DMvJyY6y6SSkZemOyoyU6+hn6C2 +Mh8cJkm9rLQ9IyRKr5m+Dw4NMpWQjJOhwSsUCw8XVqWtrzchHxobKMuejo2Rm7jcR0XcvKqf +oq52KyUoNeHBwtJOPjUrMWCtmywPDg3bnJSPm6a6OxgUFB/DurZOKSoqJyg4vpuUlp212+Xf +zrqpm5WarS8bGyIz6b6zv0QtIiU6xaGgHxAMD86fko+UmqJSGhQSJuC/uXY9MSomKju1mpSW +na/C6EdGz66gn6jANyghICYz3q6ruzwgGRohNt+xnpWmHAwGE8iXi4uOlaQoFQ4TM7iko7dU +NCQeHyuumZKTnK/jPS8vPr+mn6O9Lh4aGyAsTbCorugoHBodKVOun52gszcnKDW9qqWkoZat +GQ0GFLuWi4ySnbUfEQ4VUqSYmKfOPScdHSe/nZeZqU4uJyQnL2iqoqnNJhoZGyU3yKSdnq5C +KyozZbiooJ+ozy4jIi1auaumqK/ONCQiKz++qaantUstJSYwVsS3vc7PpaodFA0YqJWNj5uu +cB8SEhY/pJ6fvi4lIB8nOa+XkpajVi0rLDl4t6Wfps0pHBsfLE++rKau5y0iJjHlsKmoqrLW +NigsULSmpa/bPC4uMTlrqp4zGA8RzZ2TkZifr0IcFhYmwa6pukg3MiosPbuemJmiu1tEQUhs +wqulq9coGxsiNceysbxMLiQmMtKtq8REV7ObwBEOD86OioqToMEtEQsOGc2oqcgwKisqLF2p +lo6SnrxFOjk2O166q69hJRoaHy5P1MzuQjQwOti6r66up5maMBUOGKaTjY+csjgYDQwRLayl +psc7Ni4vP7adkI+asjMoKzjFq6iuXCMXFRkq5bS2TiolK0a+raurtOi5pZmdJBERIZ6Rj5Of +vy4WDQ8aPailrbpvST476KublZmivEo6Pl3Ny0ktIB0cIS5K8VQ2MTg/Y9DAt7Gwr7XuPee5 +pqHYNzsySGpMxLK/xU8xNTI1T9m5r7m+yV5KQkrAr6+zxXFSRlHX6VA3LTEzOWja1kQtM0jv +0c7Gu8JOQ269sL1XU8q4uUI2Ly5DaLuorMHuSEBaSne5tMNWPT5NZ9rDvbm/1dPJvrm+5l1R +RjwwNUr8WzksLTA2Rlq4uFI+QEy5r7qvucHMIBok1piPkpy+Kx8ZGSI0yK+z3T0tLlOzn5yf +qb5hY+jIvsk+JBwdKlTD0EE5MzA4VbiioZ6eHQsOFaKKiouVszYZDhIfbJ+hu0ojHR8hPKua +kZKhSCIcKs+onZ+1Nx8bHy/itrPhMiUnNtOnoZ6YLQ4TENCRlI6YtW8gExQcK7uty9QvKDgx +z6KZj4+Yp80xMEBUv7i5vE4sIR8mLjtPTz82LSsvNU/CvZ+cJxkVE7ScmpKesM4jFhkeNa6u +t7FMP1g24qyelpaeqr5KTE5rs6mnqtopHBofLT/dy1kwIR4iL2/JxsanmzgXEhC2mZiTnqm3 +LxoXHDGsqbG1QjU9L0O7pZmWnKez2mxRTb2uqqu/NiMcHSMtRfvO0zwnHyIuT7qvrrC6yOrS +oqUtKh83nJ+ho3dHLxseJDKyp7G57jxGQz7QsaefqsD3PjxGRWvKys1fMygkJCw3SdrCwtBZ +Q0FGbcu6sa6vv87sXG3SuK64zE9LS0VEvaBOHRsVUJ+nm5+zq0wfHx8qzcHUzVQ7QjM4ybio +oa7JWTk2My46Y8m6xV1LOzU5Q3W9tLW5yvRUUvXNwbmxsrjKTDc3Qu/DwMHeYlA/TFrnxsSl +nEAfGhVqp62dprivOiAmJTi8yVzaQDQ1JShJxKigqK/DPTYwLkfQvLC40lg8NTQ4X72zr7fJ +Xj8/SPXBu7e1tsH7RTxN38/Ky8xpOjBZrkceHRxknaakp+xSMBsdJjHBs7u1u9bQVj7Qs6yo +s9fzRTg6Ola/vr/LT0U5MDU+f726u7/qVkdN7MK5u7vFzGNAOjXco8YnJB9enqurqMG8TR4j +LDfAvs25uc7TTkXHubSwv9bqQzg1N1DmaU49ODYuLjU9X9rm1ehWY9a8sa+3vr66qZyuKiIf +NqiurqGvvmseHCkuWM9by8lEOjM00q+rpqettXswMDA0RUJJbk0+My45S3jg8FhaXlPbwLe1 +u8jOv7KfoywfJyqvo72nqVdWJhcmOlKwsLepuEE9ND2+tbSsrrrDSTQ4ODxCOj1DODU0O1zM +wcfO2ODp7N3LwLy+y83KyNxv46+fuiUiIzKwvtKru0lBIB43PF+4xLetyU9MPm+3ubWtsbzO +OjM/PUpWTnv5Oy4wNEJke8/LzNT8fc++urrDx8DBytXoY1nOrrspHyMswLPErKrLay4jPOLZ +uLi6sMY8Pj5C0MfHub77QTEuNj9P6tPM4Ec2Nz5iz8e7vMj3VFRtzsa/wL+/ycvLztLX5GzL +rK1JKSox7sTOvLK5zEIsOFpm1MbLv9U1LjE4R1dRdeNdQzk7S19YZnTb12RJUdC/vb7Av7/J +cG3Vv77H0c/N0GhOVvvjbuft2sXA0DwxMjxh08zBvdlNPztEXmzo2c7cVUNLV05WVGXf+llO +UXTZ2d7c2dXvXmzu7Ofe4dva7ubazsbLzNXV3PNwWm9/9N/lz9Th2VxPSEVKS1hg9dXOys/T +1Otw+G5sd1lWTkpZWFtu8O7scl/q9G5tZFtoa1xfXVNWYvTf3+vl9mlcWmNo5tPOzczQzsvM +y8/R6Xp6WE9OTE5PTVRo9mZiX1xibnv3cX7ebFthWV9cXWFcWmr1fuDX19Pc5N/a39nP2N7t ++m1sbmlmdv14e9/U1NfV09Hc4+tnX1pJREVFSU1QWGzk6ere6mM= + +--foobarbazola-- +--16819560-2078917053-688350843:#11603-- +--owatagusiam-- + Added: sandbox/trunk/emailpkg/2.5/setup.py ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2.5/setup.py Sun Dec 18 04:19:13 2005 @@ -0,0 +1,26 @@ +#! /usr/bin/env python +# +# Copyright (C) 2001-2005 Python Software Foundation + +# Standard distutils setup.py install script for the `mimelib' library, a next +# generation MIME library for Python. To install into your existing Python +# distribution, run the following at the command line: +# +# % python setup.py install + +import sys +from os.path import basename + +from distutils.core import setup +from distutils.command.install_lib import install_lib + + +import email +setup(name='email', + version=email.__version__, + description='Standalone email package', + author='Barry Warsaw', + author_email='barry at python.org', + url='http://www.python.org/sigs/email-sig', + packages=['email'], + ) Added: sandbox/trunk/emailpkg/2.5/testall.py ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2.5/testall.py Sun Dec 18 04:19:13 2005 @@ -0,0 +1,78 @@ +# Copyright (C) 2002-2004 Python Software Foundation + +"""A simple test runner, which sets up sys.path properly. + +Usage: python test.py [options] +Options: + + --help / -h + Print this message and exit. + + -v + This is passed on to unittest. +""" + +import sys +import unittest +import getopt + +from email.test import test_email + +from test.test_support import TestSkipped +try: + from email.test import test_email_torture +except TestSkipped: + test_email_torture = None + +# See if we have the Japanese codecs package installed +try: + # Python 2.4 + unicode('foo', 'euc-jp') +except LookupError: + try: + unicode('foo', 'japanese.iso-2022-jp') + except LookupError: + test_email_codecs = None +else: + from email.test import test_email_codecs + + + +def suite(): + suite = unittest.TestSuite() + suite.addTest(test_email.suite()) + if test_email_codecs is not None: + suite.addTest(test_email_codecs.suite()) + if test_email_torture is not None: + suite.addTest(test_email_torture.suite()) + return suite + + + +def usage(code, msg=''): + print >> sys.stderr, __doc__ + if msg: + print >> sys.stderr, msg + sys.exit(code) + + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], 'hv', ['help']) + except getopt.error, msg: + usage(1, msg) + + if args: + usage(1) + + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + # No -v test since that's passed along to unittest + + unittest.main(defaultTest='suite') + + + +if __name__ == '__main__': + main() From python-checkins at python.org Sun Dec 18 04:34:24 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 04:34:24 +0100 (CET) Subject: [Python-checkins] commit of r41748 - in python/trunk: Lib/test/test_mmap.py Misc/NEWS Modules/mmapmodule.c Message-ID: <20051218033424.497971E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 04:34:22 2005 New Revision: 41748 Modified: python/trunk/Lib/test/test_mmap.py python/trunk/Misc/NEWS python/trunk/Modules/mmapmodule.c Log: SF Patch #1365916, mmap fails on AMD64 Fix some 64-bit issues due to mismatch format characters w/actual data types Modified: python/trunk/Lib/test/test_mmap.py ============================================================================== --- python/trunk/Lib/test/test_mmap.py (original) +++ python/trunk/Lib/test/test_mmap.py Sun Dec 18 04:34:22 2005 @@ -356,6 +356,22 @@ finally: os.unlink(TESTFN) + # make move works everywhere (64-bit format problem earlier) + f = open(TESTFN, 'w+') + + try: # unlink TESTFN no matter what + f.write("ABCDEabcde") # Arbitrary character + f.flush() + + mf = mmap.mmap(f.fileno(), 10) + mf.move(5, 0, 5) + verify(mf[:] == "ABCDEABCDE", "Map move should have duplicated front 5") + mf.close() + f.close() + + finally: + os.unlink(TESTFN) + print ' Test passed' test_both() Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Dec 18 04:34:22 2005 @@ -197,6 +197,8 @@ Extension Modules ----------------- +- Patch #1365916: fix some unsafe 64-bit mmap methods. + - Bug #1290333: Added a workaround for cjkcodecs' _codecs_cn build problem on AIX. Modified: python/trunk/Modules/mmapmodule.c ============================================================================== --- python/trunk/Modules/mmapmodule.c (original) +++ python/trunk/Modules/mmapmodule.c Sun Dec 18 04:34:22 2005 @@ -374,7 +374,7 @@ { unsigned long new_size; CHECK_VALID(NULL); - if (!PyArg_ParseTuple (args, "l:resize", &new_size) || + if (!PyArg_ParseTuple (args, "k:resize", &new_size) || !is_resizeable(self)) { return NULL; #ifdef MS_WINDOWS @@ -463,10 +463,10 @@ static PyObject * mmap_flush_method(mmap_object *self, PyObject *args) { - size_t offset = 0; - size_t size = self->size; + unsigned long offset = 0; + unsigned long size = self->size; CHECK_VALID(NULL); - if (!PyArg_ParseTuple (args, "|ll:flush", &offset, &size)) { + if (!PyArg_ParseTuple (args, "|kk:flush", &offset, &size)) { return NULL; } else if ((offset + size) > self->size) { PyErr_SetString (PyExc_ValueError, @@ -539,7 +539,7 @@ { unsigned long dest, src, count; CHECK_VALID(NULL); - if (!PyArg_ParseTuple (args, "iii:move", &dest, &src, &count) || + if (!PyArg_ParseTuple (args, "kkk:move", &dest, &src, &count) || !is_writeable(self)) { return NULL; } else { @@ -863,7 +863,7 @@ PyObject *map_size_obj = NULL; int map_size; int fd, flags = MAP_SHARED, prot = PROT_WRITE | PROT_READ; - access_mode access = ACCESS_DEFAULT; + int access = (int)ACCESS_DEFAULT; static const char *keywords[] = {"fileno", "length", "flags", "prot", "access", NULL}; @@ -876,11 +876,11 @@ if (map_size < 0) return NULL; - if ((access != ACCESS_DEFAULT) && + if ((access != (int)ACCESS_DEFAULT) && ((flags != MAP_SHARED) || ( prot != (PROT_WRITE | PROT_READ)))) return PyErr_Format(PyExc_ValueError, "mmap can't specify both access and flags, prot."); - switch(access) { + switch((access_mode)access) { case ACCESS_READ: flags = MAP_SHARED; prot = PROT_READ; @@ -935,7 +935,7 @@ PyErr_SetFromErrno(mmap_module_error); return NULL; } - m_obj->access = access; + m_obj->access = (access_mode)access; return (PyObject *)m_obj; } #endif /* UNIX */ @@ -951,7 +951,7 @@ DWORD dwErr = 0; int fileno; HANDLE fh = 0; - access_mode access = ACCESS_DEFAULT; + int access = (access_mode)ACCESS_DEFAULT; DWORD flProtect, dwDesiredAccess; static const char *keywords[] = { "fileno", "length", "tagname", @@ -963,7 +963,7 @@ return NULL; } - switch(access) { + switch((access_mode)access) { case ACCESS_READ: flProtect = PAGE_READONLY; dwDesiredAccess = FILE_MAP_READ; @@ -1048,7 +1048,7 @@ else m_obj->tagname = NULL; - m_obj->access = access; + m_obj->access = (access_mode)access; m_obj->map_handle = CreateFileMapping (m_obj->file_handle, NULL, flProtect, From nnorwitz at gmail.com Sun Dec 18 04:38:07 2005 From: nnorwitz at gmail.com (Neal Norwitz) Date: Sat, 17 Dec 2005 19:38:07 -0800 Subject: [Python-checkins] commit of r41748 - in python/trunk: Lib/test/test_mmap.py Misc/NEWS Modules/mmapmodule.c In-Reply-To: <20051218033424.497971E4002@bag.python.org> References: <20051218033424.497971E4002@bag.python.org> Message-ID: I forgot to add that this should be backported. On 12/17/05, neal.norwitz wrote: > Author: neal.norwitz > Date: Sun Dec 18 04:34:22 2005 > New Revision: 41748 > > Modified: > python/trunk/Lib/test/test_mmap.py > python/trunk/Misc/NEWS > python/trunk/Modules/mmapmodule.c > Log: > SF Patch #1365916, mmap fails on AMD64 > > Fix some 64-bit issues due to mismatch format characters w/actual data types > > > > Modified: python/trunk/Lib/test/test_mmap.py > ============================================================================== > --- python/trunk/Lib/test/test_mmap.py (original) > +++ python/trunk/Lib/test/test_mmap.py Sun Dec 18 04:34:22 2005 > @@ -356,6 +356,22 @@ > finally: > os.unlink(TESTFN) > > + # make move works everywhere (64-bit format problem earlier) > + f = open(TESTFN, 'w+') > + > + try: # unlink TESTFN no matter what > + f.write("ABCDEabcde") # Arbitrary character > + f.flush() > + > + mf = mmap.mmap(f.fileno(), 10) > + mf.move(5, 0, 5) > + verify(mf[:] == "ABCDEABCDE", "Map move should have duplicated front 5") > + mf.close() > + f.close() > + > + finally: > + os.unlink(TESTFN) > + > print ' Test passed' > > test_both() > > Modified: python/trunk/Misc/NEWS > ============================================================================== > --- python/trunk/Misc/NEWS (original) > +++ python/trunk/Misc/NEWS Sun Dec 18 04:34:22 2005 > @@ -197,6 +197,8 @@ > Extension Modules > ----------------- > > +- Patch #1365916: fix some unsafe 64-bit mmap methods. > + > - Bug #1290333: Added a workaround for cjkcodecs' _codecs_cn build > problem on AIX. > > > Modified: python/trunk/Modules/mmapmodule.c > ============================================================================== > --- python/trunk/Modules/mmapmodule.c (original) > +++ python/trunk/Modules/mmapmodule.c Sun Dec 18 04:34:22 2005 > @@ -374,7 +374,7 @@ > { > unsigned long new_size; > CHECK_VALID(NULL); > - if (!PyArg_ParseTuple (args, "l:resize", &new_size) || > + if (!PyArg_ParseTuple (args, "k:resize", &new_size) || > !is_resizeable(self)) { > return NULL; > #ifdef MS_WINDOWS > @@ -463,10 +463,10 @@ > static PyObject * > mmap_flush_method(mmap_object *self, PyObject *args) > { > - size_t offset = 0; > - size_t size = self->size; > + unsigned long offset = 0; > + unsigned long size = self->size; > CHECK_VALID(NULL); > - if (!PyArg_ParseTuple (args, "|ll:flush", &offset, &size)) { > + if (!PyArg_ParseTuple (args, "|kk:flush", &offset, &size)) { > return NULL; > } else if ((offset + size) > self->size) { > PyErr_SetString (PyExc_ValueError, > @@ -539,7 +539,7 @@ > { > unsigned long dest, src, count; > CHECK_VALID(NULL); > - if (!PyArg_ParseTuple (args, "iii:move", &dest, &src, &count) || > + if (!PyArg_ParseTuple (args, "kkk:move", &dest, &src, &count) || > !is_writeable(self)) { > return NULL; > } else { > @@ -863,7 +863,7 @@ > PyObject *map_size_obj = NULL; > int map_size; > int fd, flags = MAP_SHARED, prot = PROT_WRITE | PROT_READ; > - access_mode access = ACCESS_DEFAULT; > + int access = (int)ACCESS_DEFAULT; > static const char *keywords[] = {"fileno", "length", > "flags", "prot", > "access", NULL}; > @@ -876,11 +876,11 @@ > if (map_size < 0) > return NULL; > > - if ((access != ACCESS_DEFAULT) && > + if ((access != (int)ACCESS_DEFAULT) && > ((flags != MAP_SHARED) || ( prot != (PROT_WRITE | PROT_READ)))) > return PyErr_Format(PyExc_ValueError, > "mmap can't specify both access and flags, prot."); > - switch(access) { > + switch((access_mode)access) { > case ACCESS_READ: > flags = MAP_SHARED; > prot = PROT_READ; > @@ -935,7 +935,7 @@ > PyErr_SetFromErrno(mmap_module_error); > return NULL; > } > - m_obj->access = access; > + m_obj->access = (access_mode)access; > return (PyObject *)m_obj; > } > #endif /* UNIX */ > @@ -951,7 +951,7 @@ > DWORD dwErr = 0; > int fileno; > HANDLE fh = 0; > - access_mode access = ACCESS_DEFAULT; > + int access = (access_mode)ACCESS_DEFAULT; > DWORD flProtect, dwDesiredAccess; > static const char *keywords[] = { "fileno", "length", > "tagname", > @@ -963,7 +963,7 @@ > return NULL; > } > > - switch(access) { > + switch((access_mode)access) { > case ACCESS_READ: > flProtect = PAGE_READONLY; > dwDesiredAccess = FILE_MAP_READ; > @@ -1048,7 +1048,7 @@ > else > m_obj->tagname = NULL; > > - m_obj->access = access; > + m_obj->access = (access_mode)access; > m_obj->map_handle = CreateFileMapping (m_obj->file_handle, > NULL, > flProtect, > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From nnorwitz at gmail.com Sun Dec 18 05:04:55 2005 From: nnorwitz at gmail.com (Neal Norwitz) Date: Sat, 17 Dec 2005 20:04:55 -0800 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.tex Doc/lib/libsys.tex Include/pythonrun.h Mac Makefile.pre.in Misc/NEWS Modules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <20051218012738.591CF1E4002@bag.python.org> References: <20051218012738.591CF1E4002@bag.python.org> Message-ID: This change break test_platform. The problem is the _sys_version_parser regex and _sys_version() can't handle a non-number. n -- On 12/17/05, barry.warsaw wrote: > Author: barry.warsaw > Date: Sun Dec 18 02:27:35 2005 > New Revision: 41744 > > Modified: > python/trunk/Doc/api/init.tex > python/trunk/Doc/lib/libsys.tex > python/trunk/Include/pythonrun.h > python/trunk/Mac/ (props changed) > python/trunk/Makefile.pre.in > python/trunk/Misc/NEWS > python/trunk/Modules/getbuildinfo.c > python/trunk/Python/sysmodule.c > Log: > Expose Subversion revision number (calculated via "svnversion .") to Python. > Add C API function Py_GetBuildNumber(), add it to the interactive prompt > banner (i.e. Py_GetBuildInfo()), and add it as the sys.build_number > attribute. The build number is a string instead of an int because it may > contain a trailing 'M' if there are local modifications. > > > Modified: python/trunk/Doc/api/init.tex > ============================================================================== > --- python/trunk/Doc/api/init.tex (original) > +++ python/trunk/Doc/api/init.tex Sun Dec 18 02:27:35 2005 > @@ -272,6 +272,12 @@ > \withsubitem{(in module sys)}{\ttindex{version}} > \end{cfuncdesc} > > +\begin{cfuncdesc}{const char*}{Py_GetBuildNumber}{} > + Return a string representing the Subversion revision that this Python > + executable was built from. This number is a string because it may contain a > + trailing 'M' if Python was built from a mixed revision source tree. > +\end{cfuncdesc} > + > \begin{cfuncdesc}{const char*}{Py_GetPlatform}{} > Return the platform identifier for the current platform. On \UNIX, > this is formed from the ``official'' name of the operating system, > > Modified: python/trunk/Doc/lib/libsys.tex > ============================================================================== > --- python/trunk/Doc/lib/libsys.tex (original) > +++ python/trunk/Doc/lib/libsys.tex Sun Dec 18 02:27:35 2005 > @@ -27,6 +27,12 @@ > \versionadded{2.0} > \end{datadesc} > > +\begin{datadesc}{build_number} > + A string representing the Subversion revision that this Python executable > + was built from. This number is a string because it may contain a trailing > + 'M' if Python was built from a mixed revision source tree. > +\end{datadesc} > + > \begin{datadesc}{builtin_module_names} > A tuple of strings giving the names of all modules that are compiled > into this Python interpreter. (This information is not available in > > Modified: python/trunk/Include/pythonrun.h > ============================================================================== > --- python/trunk/Include/pythonrun.h (original) > +++ python/trunk/Include/pythonrun.h Sun Dec 18 02:27:35 2005 > @@ -108,6 +108,7 @@ > PyAPI_FUNC(const char *) Py_GetCopyright(void); > PyAPI_FUNC(const char *) Py_GetCompiler(void); > PyAPI_FUNC(const char *) Py_GetBuildInfo(void); > +PyAPI_FUNC(const char *) Py_GetBuildNumber(void); > > /* Internal -- various one-time initializations */ > PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); > > Modified: python/trunk/Makefile.pre.in > ============================================================================== > --- python/trunk/Makefile.pre.in (original) > +++ python/trunk/Makefile.pre.in Sun Dec 18 02:27:35 2005 > @@ -349,7 +349,9 @@ > $(SIGNAL_OBJS) \ > $(MODOBJS) \ > $(srcdir)/Modules/getbuildinfo.c > - if test -f buildno; then \ > + if test -d .svn; then \ > + svnversion . >buildno; \ > + elif test -f buildno; then \ > expr `cat buildno` + 1 >buildno1; \ > mv -f buildno1 buildno; \ > else echo 1 >buildno; fi > @@ -444,7 +446,7 @@ > # Special rules for object files > > Modules/getbuildinfo.o: $(srcdir)/Modules/getbuildinfo.c buildno > - $(CC) -c $(PY_CFLAGS) -DBUILD=`cat buildno` -o $@ $(srcdir)/Modules/getbuildinfo.c > + $(CC) -c $(PY_CFLAGS) -DBUILD=\"`cat buildno`\" -o $@ $(srcdir)/Modules/getbuildinfo.c > > Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile > $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ > > Modified: python/trunk/Misc/NEWS > ============================================================================== > --- python/trunk/Misc/NEWS (original) > +++ python/trunk/Misc/NEWS Sun Dec 18 02:27:35 2005 > @@ -12,6 +12,10 @@ > Core and builtins > ----------------- > > +- Patch #1382163: Expose Subversion revision number to Python. New C API > + function Py_GetBuildNumber(). New attribute sys.build_number. Build number > + is now displayed in interactive prompt banner. > + > - Implementation of PEP 341 - Unification of try/except and try/finally. > "except" clauses can now be written together with a "finally" clause in > one try statement instead of two nested ones. Patch #1355913. > > Modified: python/trunk/Modules/getbuildinfo.c > ============================================================================== > --- python/trunk/Modules/getbuildinfo.c (original) > +++ python/trunk/Modules/getbuildinfo.c Sun Dec 18 02:27:35 2005 > @@ -21,7 +21,7 @@ > #endif > > #ifndef BUILD > -#define BUILD 0 > +#define BUILD "0" > #endif > > const char * > @@ -29,6 +29,12 @@ > { > static char buildinfo[50]; > PyOS_snprintf(buildinfo, sizeof(buildinfo), > - "#%d, %.20s, %.9s", BUILD, DATE, TIME); > + "%s, %.20s, %.9s", BUILD, DATE, TIME); > return buildinfo; > } > + > +const char * > +Py_GetBuildNumber(void) > +{ > + return BUILD; > +} > > Modified: python/trunk/Python/sysmodule.c > ============================================================================== > --- python/trunk/Python/sysmodule.c (original) > +++ python/trunk/Python/sysmodule.c Sun Dec 18 02:27:35 2005 > @@ -1003,6 +1003,9 @@ > PyDict_SetItemString(sysdict, "hexversion", > v = PyInt_FromLong(PY_VERSION_HEX)); > Py_XDECREF(v); > + PyDict_SetItemString(sysdict, "build_number", > + v = PyString_FromString(Py_GetBuildNumber())); > + Py_XDECREF(v); > /* > * These release level checks are mutually exclusive and cover > * the field, so don't get too fancy with the pre-processor! > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From python-checkins at python.org Sun Dec 18 05:10:14 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 05:10:14 +0100 (CET) Subject: [Python-checkins] commit of r41749 - python/trunk/Lib/platform.py Message-ID: <20051218041014.AFB851E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 05:10:10 2005 New Revision: 41749 Modified: python/trunk/Lib/platform.py Log: Fix _sys_version() so it works with the new buildno, not sure if it is correct. test_platform passes Modified: python/trunk/Lib/platform.py ============================================================================== --- python/trunk/Lib/platform.py (original) +++ python/trunk/Lib/platform.py Sun Dec 18 05:10:10 2005 @@ -1092,7 +1092,7 @@ ### Various APIs for extracting information from sys.version _sys_version_parser = re.compile(r'([\w.+]+)\s*' - '\(#(\d+),\s*([\w ]+),\s*([\w :]+)\)\s*' + '\(#?(\d+:?\d+M?),\s*([\w ]+),\s*([\w :]+)\)\s*' '\[([^\]]+)\]?') _sys_version_cache = None @@ -1114,7 +1114,6 @@ return _sys_version_cache version, buildno, builddate, buildtime, compiler = \ _sys_version_parser.match(sys.version).groups() - buildno = int(buildno) builddate = builddate + ' ' + buildtime l = string.split(version, '.') if len(l) == 2: From python-checkins at python.org Sun Dec 18 05:12:33 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 05:12:33 +0100 (CET) Subject: [Python-checkins] commit of r41750 - in python/trunk: Grammar/Grammar Python/graminit.c Message-ID: <20051218041233.1FBB81E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 05:12:30 2005 New Revision: 41750 Modified: python/trunk/Grammar/Grammar python/trunk/Python/graminit.c Log: Wrap long lines in the grammar Modified: python/trunk/Grammar/Grammar ============================================================================== --- python/trunk/Grammar/Grammar (original) +++ python/trunk/Grammar/Grammar Sun Dec 18 05:12:30 2005 @@ -32,17 +32,23 @@ decorators: decorator+ funcdef: [decorators] 'def' NAME parameters ':' suite parameters: '(' [varargslist] ')' -varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [','] +varargslist: ((fpdef ['=' test] ',')* + ('*' NAME [',' '**' NAME] | '**' NAME) | + fpdef ['=' test] (',' fpdef ['=' test])* [',']) fpdef: NAME | '(' fplist ')' fplist: fpdef (',' fpdef)* [','] stmt: simple_stmt | compound_stmt simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE -small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | exec_stmt | assert_stmt -expr_stmt: testlist (augassign (yield_expr|testlist) | ('=' (yield_expr|testlist))*) -augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=' +small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | + import_stmt | global_stmt | exec_stmt | assert_stmt) +expr_stmt: testlist (augassign (yield_expr|testlist) | + ('=' (yield_expr|testlist))*) +augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | + '<<=' | '>>=' | '**=' | '//=') # For normal assignments, additional restrictions enforced by the interpreter -print_stmt: 'print' ( [ test (',' test)* [','] ] | '>>' test [ (',' test)+ [','] ] ) +print_stmt: 'print' ( [ test (',' test)* [','] ] | + '>>' test [ (',' test)+ [','] ] ) del_stmt: 'del' exprlist pass_stmt: 'pass' flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt @@ -53,7 +59,8 @@ raise_stmt: 'raise' [test [',' test [',' test]]] import_stmt: import_name | import_from import_name: 'import' dotted_as_names -import_from: 'from' dotted_name 'import' ('*' | '(' import_as_names ')' | import_as_names) +import_from: ('from' ('.')* dotted_name + 'import' ('*' | '(' import_as_names ')' | import_as_names)) import_as_name: NAME [NAME NAME] dotted_as_name: dotted_name [NAME NAME] import_as_names: import_as_name (',' import_as_name)* [','] @@ -67,7 +74,11 @@ if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] while_stmt: 'while' test ':' suite ['else' ':' suite] for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] -try_stmt: 'try' ':' suite ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite] | 'finally' ':' suite) +try_stmt: ('try' ':' suite + ((except_clause ':' suite)+ + ['else' ':' suite] + ['finally' ':' suite] | + 'finally' ':' suite)) # NB compile.c makes sure that the default except clause is last except_clause: 'except' [test [',' test]] suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT @@ -85,7 +96,11 @@ term: factor (('*'|'/'|'%'|'//') factor)* factor: ('+'|'-'|'~') factor | power power: atom trailer* ['**' factor] -atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']' | '{' [dictmaker] '}' | '`' testlist1 '`' | NAME | NUMBER | STRING+ +atom: ('(' [yield_expr|testlist_gexp] ')' | + '[' [listmaker] ']' | + '{' [dictmaker] '}' | + '`' testlist1 '`' | + NAME | NUMBER | STRING+) listmaker: test ( list_for | (',' test)* [','] ) testlist_gexp: test ( gen_for | (',' test)* [','] ) lambdef: 'lambda' [varargslist] ':' test @@ -117,4 +132,3 @@ encoding_decl: NAME yield_expr: 'yield' [testlist] - Modified: python/trunk/Python/graminit.c ============================================================================== --- python/trunk/Python/graminit.c (original) +++ python/trunk/Python/graminit.c Sun Dec 18 05:12:30 2005 @@ -512,7 +512,8 @@ static arc arcs_26_0[1] = { {74, 1}, }; -static arc arcs_26_1[1] = { +static arc arcs_26_1[2] = { + {75, 1}, {12, 2}, }; static arc arcs_26_2[1] = { @@ -521,20 +522,20 @@ static arc arcs_26_3[3] = { {28, 4}, {13, 5}, - {75, 4}, + {76, 4}, }; static arc arcs_26_4[1] = { {0, 4}, }; static arc arcs_26_5[1] = { - {75, 6}, + {76, 6}, }; static arc arcs_26_6[1] = { {15, 4}, }; static state states_26[7] = { {1, arcs_26_0}, - {1, arcs_26_1}, + {2, arcs_26_1}, {1, arcs_26_2}, {3, arcs_26_3}, {1, arcs_26_4}, @@ -580,14 +581,14 @@ {1, arcs_28_3}, }; static arc arcs_29_0[1] = { - {76, 1}, + {77, 1}, }; static arc arcs_29_1[2] = { {27, 2}, {0, 1}, }; static arc arcs_29_2[2] = { - {76, 1}, + {77, 1}, {0, 2}, }; static state states_29[3] = { @@ -596,7 +597,7 @@ {2, arcs_29_2}, }; static arc arcs_30_0[1] = { - {77, 1}, + {78, 1}, }; static arc arcs_30_1[2] = { {27, 0}, @@ -610,7 +611,7 @@ {19, 1}, }; static arc arcs_31_1[2] = { - {78, 0}, + {75, 0}, {0, 1}, }; static state states_31[2] = { @@ -1251,7 +1252,7 @@ static arc arcs_59_0[3] = { {13, 1}, {136, 2}, - {78, 3}, + {75, 3}, }; static arc arcs_59_1[2] = { {14, 4}, @@ -1298,12 +1299,12 @@ {2, arcs_60_2}, }; static arc arcs_61_0[3] = { - {78, 1}, + {75, 1}, {26, 2}, {21, 3}, }; static arc arcs_61_1[1] = { - {78, 4}, + {75, 4}, }; static arc arcs_61_2[2] = { {21, 3}, @@ -1315,7 +1316,7 @@ {0, 3}, }; static arc arcs_61_4[1] = { - {78, 6}, + {75, 6}, }; static arc arcs_61_5[2] = { {151, 6}, @@ -1809,11 +1810,11 @@ {314, "lambdef", 0, 5, states_58, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000"}, {315, "trailer", 0, 7, states_59, - "\000\040\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\001\000\000\000"}, + "\000\040\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\001\000\000\000"}, {316, "subscriptlist", 0, 3, states_60, - "\000\040\050\000\000\000\000\000\000\100\000\000\000\002\000\140\010\111\023\000\000"}, + "\000\040\050\000\000\000\000\000\000\010\000\000\000\002\000\140\010\111\023\000\000"}, {317, "subscript", 0, 7, states_61, - "\000\040\050\000\000\000\000\000\000\100\000\000\000\002\000\140\010\111\023\000\000"}, + "\000\040\050\000\000\000\000\000\000\010\000\000\000\002\000\140\010\111\023\000\000"}, {318, "sliceop", 0, 3, states_62, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {319, "exprlist", 0, 3, states_63, @@ -1925,10 +1926,10 @@ {1, "import"}, {286, 0}, {1, "from"}, + {23, 0}, {285, 0}, {283, 0}, {284, 0}, - {23, 0}, {1, "global"}, {1, "exec"}, {303, 0}, From python-checkins at python.org Sun Dec 18 05:42:55 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 05:42:55 +0100 (CET) Subject: [Python-checkins] commit of r41751 - python/trunk/Python/compile.c Message-ID: <20051218044255.2331E1E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 05:42:47 2005 New Revision: 41751 Modified: python/trunk/Python/compile.c Log: Set MemoryError when alloc fails Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Sun Dec 18 05:42:47 2005 @@ -1075,12 +1075,16 @@ struct compiler_unit *u; u = PyObject_Malloc(sizeof(struct compiler_unit)); + if (!u) { + PyErr_NoMemory(); + return 0; + } memset(u, 0, sizeof(struct compiler_unit)); u->u_argcount = 0; u->u_ste = PySymtable_Lookup(c->c_st, key); if (!u->u_ste) { compiler_unit_free(u); - return 0; + return 0; } Py_INCREF(name); u->u_name = name; @@ -1163,8 +1167,10 @@ u = c->u; b = (basicblock *)PyObject_Malloc(sizeof(basicblock)); - if (b == NULL) + if (b == NULL) { + PyErr_NoMemory(); return NULL; + } memset((void *)b, 0, sizeof(basicblock)); assert (b->b_next == NULL); b->b_list = u->u_blocks; @@ -3747,8 +3753,10 @@ return 0; a->a_postorder = (basicblock **)PyObject_Malloc( sizeof(basicblock *) * nblocks); - if (!a->a_postorder) + if (!a->a_postorder) { + PyErr_NoMemory(); return 0; + } return 1; } From python-checkins at python.org Sun Dec 18 06:03:20 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 06:03:20 +0100 (CET) Subject: [Python-checkins] commit of r41752 - in python/trunk: Lib/test/test_builtin.py Misc/NEWS Python/pystrtod.c Message-ID: <20051218050320.DC5F31E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 06:03:17 2005 New Revision: 41752 Modified: python/trunk/Lib/test/test_builtin.py python/trunk/Misc/NEWS python/trunk/Python/pystrtod.c Log: Get float() to be more portable across platforms. Disable hex strings. Modified: python/trunk/Lib/test/test_builtin.py ============================================================================== --- python/trunk/Lib/test/test_builtin.py (original) +++ python/trunk/Lib/test/test_builtin.py Sun Dec 18 06:03:17 2005 @@ -545,6 +545,8 @@ self.assertEqual(float(314), 314.0) self.assertEqual(float(314L), 314.0) self.assertEqual(float(" 3.14 "), 3.14) + self.assertRaises(ValueError, float, " 0x3.1 ") + self.assertRaises(ValueError, float, " -0x3.p-1 ") if have_unicode: self.assertEqual(float(unicode(" 3.14 ")), 3.14) self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14) @@ -572,8 +574,8 @@ self.assertEqual(float(" 3,14 "), 3.14) self.assertEqual(float(" +3,14 "), 3.14) self.assertEqual(float(" -3,14 "), -3.14) - self.assertEqual(float(" 0x3.1 "), 3.0625) - self.assertEqual(float(" -0x3.p-1 "), -1.5) + self.assertRaises(ValueError, float, " 0x3.1 ") + self.assertRaises(ValueError, float, " -0x3.p-1 ") self.assertEqual(float(" 25.e-1 "), 2.5) self.assertEqual(fcmp(float(" .25e-1 "), .025), 0) finally: Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Dec 18 06:03:17 2005 @@ -12,6 +12,9 @@ Core and builtins ----------------- +- Support for converting hex strings to floats no longer works. + This was not portable. float('0x3') now raises a ValueError. + - Patch #1382163: Expose Subversion revision number to Python. New C API function Py_GetBuildNumber(). New attribute sys.build_number. Build number is now displayed in interactive prompt banner. Modified: python/trunk/Python/pystrtod.c ============================================================================== --- python/trunk/Python/pystrtod.c (original) +++ python/trunk/Python/pystrtod.c Sun Dec 18 06:03:17 2005 @@ -38,8 +38,7 @@ * Return value: the #gdouble value. **/ double -PyOS_ascii_strtod(const char *nptr, - char **endptr) +PyOS_ascii_strtod(const char *nptr, char **endptr) { char *fail_pos; double val; @@ -49,7 +48,6 @@ const char *p, *decimal_point_pos; const char *end = NULL; /* Silence gcc */ -/* g_return_val_if_fail (nptr != NULL, 0); */ assert(nptr != NULL); fail_pos = NULL; @@ -73,64 +71,36 @@ if (*p == '+' || *p == '-') p++; - if (p[0] == '0' && - (p[1] == 'x' || p[1] == 'X')) + while (ISDIGIT(*p)) + p++; + + if (*p == '.') { - p += 2; - /* HEX - find the (optional) decimal point */ + decimal_point_pos = p++; - while (ISXDIGIT(*p)) + while (ISDIGIT(*p)) p++; - if (*p == '.') - { - decimal_point_pos = p++; - - while (ISXDIGIT(*p)) - p++; - - if (*p == 'p' || *p == 'P') - p++; - if (*p == '+' || *p == '-') - p++; - while (ISDIGIT(*p)) - p++; - end = p; - } - } - else - { + if (*p == 'e' || *p == 'E') + p++; + if (*p == '+' || *p == '-') + p++; while (ISDIGIT(*p)) p++; - - if (*p == '.') - { - decimal_point_pos = p++; - - while (ISDIGIT(*p)) - p++; - - if (*p == 'e' || *p == 'E') - p++; - if (*p == '+' || *p == '-') - p++; - while (ISDIGIT(*p)) - p++; - end = p; - } + end = p; } - /* For the other cases, we need not convert the decimal point */ + /* For the other cases, we need not convert the decimal point */ } - /* Set errno to zero, so that we can distinguish zero results - and underflows */ + /* Set errno to zero, so that we can distinguish zero results + and underflows */ errno = 0; if (decimal_point_pos) { char *copy, *c; - /* We need to convert the '.' to the locale specific decimal point */ + /* We need to convert the '.' to the locale specific decimal point */ copy = malloc(end - nptr + 1 + decimal_point_len); c = copy; @@ -155,8 +125,15 @@ free(copy); } - else - val = strtod(nptr, &fail_pos); + else { + unsigned i = 0; + if (nptr[i] == '-') + i++; + if (nptr[i] == '0' && (nptr[i+1] == 'x' || nptr[i+1] == 'X')) + fail_pos = nptr; + else + val = strtod(nptr, &fail_pos); + } if (endptr) *endptr = fail_pos; From python-checkins at python.org Sun Dec 18 06:29:45 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 06:29:45 +0100 (CET) Subject: [Python-checkins] commit of r41753 - in python/trunk: Lib/test/bad_coding2.py Lib/test/test_coding.py Misc/NEWS Parser/tokenizer.c Python/pythonrun.c Message-ID: <20051218052945.42E361E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 06:29:30 2005 New Revision: 41753 Added: python/trunk/Lib/test/bad_coding2.py Modified: python/trunk/Lib/test/test_coding.py python/trunk/Misc/NEWS python/trunk/Parser/tokenizer.c python/trunk/Python/pythonrun.c Log: Fix Bug #1378022, UTF-8 files with a leading BOM crashed the interpreter. Needs backport. Added: python/trunk/Lib/test/bad_coding2.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/bad_coding2.py Sun Dec 18 06:29:30 2005 @@ -0,0 +1,2 @@ +?#coding: utf8 +print '?' \ No newline at end of file Modified: python/trunk/Lib/test/test_coding.py ============================================================================== --- python/trunk/Lib/test/test_coding.py (original) +++ python/trunk/Lib/test/test_coding.py Sun Dec 18 06:29:30 2005 @@ -5,6 +5,13 @@ class CodingTest(unittest.TestCase): def test_bad_coding(self): module_name = 'bad_coding' + self.verify_bad_module(module_name) + + def test_bad_coding2(self): + module_name = 'bad_coding2' + self.verify_bad_module(module_name) + + def verify_bad_module(self, module_name): self.assertRaises(SyntaxError, __import__, 'test.' + module_name) path = os.path.dirname(__file__) Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Dec 18 06:29:30 2005 @@ -12,6 +12,8 @@ Core and builtins ----------------- +- Bug #1378022, UTF-8 files with a leading BOM crashed the interpreter. + - Support for converting hex strings to floats no longer works. This was not portable. float('0x3') now raises a ValueError. Modified: python/trunk/Parser/tokenizer.c ============================================================================== --- python/trunk/Parser/tokenizer.c (original) +++ python/trunk/Parser/tokenizer.c Sun Dec 18 06:29:30 2005 @@ -292,6 +292,12 @@ PyMem_DEL(cs); } } + if (!r) { + cs = tok->encoding; + if (!cs) + cs = "with BOM"; + PyErr_Format(PyExc_SyntaxError, "encoding problem: %s", cs); + } return r; } Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Sun Dec 18 06:29:30 2005 @@ -1439,8 +1439,8 @@ } if (msg == NULL) msg = "unknown decode error"; - Py_DECREF(type); - Py_DECREF(value); + Py_XDECREF(type); + Py_XDECREF(value); Py_XDECREF(tb); break; } From python-checkins at python.org Sun Dec 18 06:32:48 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 06:32:48 +0100 (CET) Subject: [Python-checkins] commit of r41754 - python/trunk/Python/compile.c Message-ID: <20051218053248.AE9BD1E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 06:32:41 2005 New Revision: 41754 Modified: python/trunk/Python/compile.c Log: Handle more error conditions with SystemError Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Sun Dec 18 06:32:41 2005 @@ -2760,8 +2760,7 @@ return INPLACE_FLOOR_DIVIDE; } PyErr_Format(PyExc_SystemError, - "inplace binary op %d should not be possible", - op); + "inplace binary op %d should not be possible", op); return 0; } @@ -2809,6 +2808,9 @@ case GLOBAL_EXPLICIT: optype = OP_GLOBAL; break; + default: + /* scope can be 0 */ + break; } /* XXX Leave assert here, but handle __doc__ and the like better */ @@ -2830,6 +2832,7 @@ Py_DECREF(mangled); return 0; case Param: + default: PyErr_SetString(PyExc_SystemError, "param invalid for deref variable"); return 0; @@ -2844,6 +2847,7 @@ case AugStore: break; case Param: + default: PyErr_SetString(PyExc_SystemError, "param invalid for local variable"); return 0; @@ -2860,6 +2864,7 @@ case AugStore: break; case Param: + default: PyErr_SetString(PyExc_SystemError, "param invalid for global variable"); return 0; @@ -2874,6 +2879,7 @@ case AugStore: break; case Param: + default: PyErr_SetString(PyExc_SystemError, "param invalid for name variable"); return 0; @@ -3361,6 +3367,7 @@ ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names); break; case Param: + default: PyErr_SetString(PyExc_SystemError, "param invalid in attribute expression"); return 0; @@ -3388,6 +3395,7 @@ VISIT_SLICE(c, e->v.Subscript.slice, Del); break; case Param: + default: PyErr_SetString(PyExc_SystemError, "param invalid in subscript expression"); return 0; @@ -3441,8 +3449,9 @@ ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); return compiler_nameop(c, e->v.Name.id, Store); default: - fprintf(stderr, - "invalid node type for augmented assignment\n"); + PyErr_Format(PyExc_SystemError, + "invalid node type (%d) for augmented assignment", + e->kind); return 0; } return 1; @@ -3514,9 +3523,9 @@ case Store: op = STORE_SUBSCR; break; case Del: op = DELETE_SUBSCR; break; case Param: - fprintf(stderr, - "invalid %s kind %d in subscript\n", - kind, ctx); + PyErr_Format(PyExc_SystemError, + "invalid %s kind %d in subscript\n", + kind, ctx); return 0; } if (ctx == AugLoad) { @@ -3599,6 +3608,7 @@ case Store: op = STORE_SLICE; break; case Del: op = DELETE_SLICE; break; case Param: + default: PyErr_SetString(PyExc_SystemError, "param invalid in simple slice"); return 0; @@ -3618,11 +3628,11 @@ break; case Slice_kind: return compiler_slice(c, s, ctx); - break; case Index_kind: VISIT(c, expr, s->v.Index.value); break; case ExtSlice_kind: + default: PyErr_SetString(PyExc_SystemError, "extended slice invalid in nested slice"); return 0; @@ -3664,6 +3674,10 @@ if (ctx != AugStore) VISIT(c, expr, s->v.Index.value); return compiler_handle_subscr(c, "index", ctx); + default: + PyErr_Format(PyExc_SystemError, + "invalid slice %d", s->kind); + return 0; } return 1; } From python-checkins at python.org Sun Dec 18 06:37:41 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 06:37:41 +0100 (CET) Subject: [Python-checkins] commit of r41755 - python/trunk/Python/pystrtod.c Message-ID: <20051218053741.53FC31E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 06:37:36 2005 New Revision: 41755 Modified: python/trunk/Python/pystrtod.c Log: Fix compiler warnings Modified: python/trunk/Python/pystrtod.c ============================================================================== --- python/trunk/Python/pystrtod.c (original) +++ python/trunk/Python/pystrtod.c Sun Dec 18 06:37:36 2005 @@ -41,7 +41,7 @@ PyOS_ascii_strtod(const char *nptr, char **endptr) { char *fail_pos; - double val; + double val = -1.0; struct lconv *locale_data; const char *decimal_point; int decimal_point_len; @@ -130,7 +130,7 @@ if (nptr[i] == '-') i++; if (nptr[i] == '0' && (nptr[i+1] == 'x' || nptr[i+1] == 'X')) - fail_pos = nptr; + fail_pos = (char*)nptr; else val = strtod(nptr, &fail_pos); } From barry at python.org Sun Dec 18 06:38:04 2005 From: barry at python.org (Barry Warsaw) Date: Sun, 18 Dec 2005 00:38:04 -0500 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.tex Doc/lib/libsys.tex Include/pythonrun.h Mac Makefile.pre.in Misc/NEWS Modules/getbuildinfo.c Python/sysmodule.c In-Reply-To: References: <20051218012738.591CF1E4002@bag.python.org> Message-ID: <1134884285.10352.10.camel@geddy.wooz.org> On Sat, 2005-12-17 at 20:04 -0800, Neal Norwitz wrote: > This change break test_platform. The problem is the > _sys_version_parser regex and _sys_version() can't handle a > non-number. Yep, and thanks for fixing that. Saw your checkin -- you just beat me to it. ;) -Barry -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 307 bytes Desc: This is a digitally signed message part Url : http://mail.python.org/pipermail/python-checkins/attachments/20051218/a4d89ee5/attachment.pgp From nnorwitz at gmail.com Sun Dec 18 06:51:36 2005 From: nnorwitz at gmail.com (Neal Norwitz) Date: Sat, 17 Dec 2005 21:51:36 -0800 Subject: [Python-checkins] commit of r41743 - in python/trunk: Doc/ref/ref7.tex Misc/NEWS In-Reply-To: References: <20051217222413.D224D1E4002@bag.python.org> Message-ID: On 12/17/05, Reinhold Birkenfeld wrote: > neal.norwitz wrote: > > > +\keyword{finally} clause is executed. If there is a saved exception, > > +it is re-raised at the end of the \keyword{finally} clause. > > +If the \keyword{finally} clause raises another exception or > > executes a \keyword{return} or \keyword{break} statement, the saved > > exception is lost. A \keyword{continue} statement is illegal in the > > \keyword{finally} clause. (The reason is a problem with the current > [implementation]. > > What's the status of this? Could this be addressed here, too? AFAIK, it's not related to any of these changes. I think mwh and Armin know more about fixing that problem. IIRC, it requires changes to eval frame. n From python-checkins at python.org Sun Dec 18 08:06:27 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 08:06:27 +0100 (CET) Subject: [Python-checkins] commit of r41756 - in python/trunk: Lib/test/test_dis.py Python/compile.c Message-ID: <20051218070627.F10221E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 08:06:23 2005 New Revision: 41756 Modified: python/trunk/Lib/test/test_dis.py python/trunk/Python/compile.c Log: Fix Armin's bug 1333982. He found it, he didn't created it :-) This code generated a C assertion: assert 1, ([s for s in x] + [s for s in x]) pass assert was completely broken, it needed to use the proper block. compiler_use_block() is now no longer used, so remove it. Modified: python/trunk/Lib/test/test_dis.py ============================================================================== --- python/trunk/Lib/test/test_dis.py (original) +++ python/trunk/Lib/test/test_dis.py Sun Dec 18 08:06:23 2005 @@ -46,6 +46,43 @@ bug708901.func_code.co_firstlineno + 2, bug708901.func_code.co_firstlineno + 3) + +def bug1333982(x=[]): + assert 0, ([s for s in x] + + 1) + pass + +dis_bug1333982 = """\ + %-4d 0 LOAD_CONST 1 (0) + 3 JUMP_IF_TRUE 47 (to 53) + 6 POP_TOP + 7 LOAD_GLOBAL 0 (AssertionError) + 10 BUILD_LIST 0 + 13 DUP_TOP + 14 LOAD_ATTR 1 (append) + 17 STORE_FAST 1 (_[1]) + 20 LOAD_FAST 0 (x) + 23 GET_ITER + >> 24 FOR_ITER 16 (to 43) + 27 STORE_FAST 2 (s) + 30 LOAD_FAST 1 (_[1]) + 33 LOAD_FAST 2 (s) + 36 CALL_FUNCTION 1 + 39 POP_TOP + 40 JUMP_ABSOLUTE 24 + >> 43 DELETE_FAST 1 (_[1]) + + %-4d 46 LOAD_CONST 2 (1) + 49 BINARY_ADD + 50 RAISE_VARARGS 2 + >> 53 POP_TOP + + %-4d 54 LOAD_CONST 0 (None) + 57 RETURN_VALUE +"""%(bug1333982.func_code.co_firstlineno + 1, + bug1333982.func_code.co_firstlineno + 2, + bug1333982.func_code.co_firstlineno + 3) + class DisTests(unittest.TestCase): def do_disassembly_test(self, func, expected): s = StringIO.StringIO() @@ -83,6 +120,9 @@ def test_bug_708901(self): self.do_disassembly_test(bug708901, dis_bug708901) + def test_bug_1333982(self): + self.do_disassembly_test(bug1333982, dis_bug1333982) + def test_main(): run_unittest(DisTests) Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Sun Dec 18 08:06:23 2005 @@ -171,7 +171,6 @@ static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *); static int compiler_addop_i(struct compiler *, int, int); static int compiler_addop_j(struct compiler *, int, basicblock *, int); -static void compiler_use_block(struct compiler *, basicblock *); static basicblock *compiler_use_new_block(struct compiler *); static int compiler_error(struct compiler *, const char *); static int compiler_nameop(struct compiler *, identifier, expr_context_ty); @@ -1178,13 +1177,6 @@ return b; } -static void -compiler_use_block(struct compiler *c, basicblock *block) -{ - assert (block != NULL); - c->u->u_curblock = block; -} - static basicblock * compiler_use_new_block(struct compiler *c) { @@ -2529,7 +2521,7 @@ else { ADDOP_I(c, RAISE_VARARGS, 1); } - compiler_use_block(c, end); + compiler_use_next_block(c, end); ADDOP(c, POP_TOP); return 1; } From python-checkins at python.org Sun Dec 18 09:02:39 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 09:02:39 +0100 (CET) Subject: [Python-checkins] commit of r41757 - python/trunk/Objects/bufferobject.c Message-ID: <20051218080239.7F41E1E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 09:02:38 2005 New Revision: 41757 Modified: python/trunk/Objects/bufferobject.c Log: Check return result for error Modified: python/trunk/Objects/bufferobject.c ============================================================================== --- python/trunk/Objects/bufferobject.c (original) +++ python/trunk/Objects/bufferobject.c Sun Dec 18 09:02:38 2005 @@ -356,6 +356,8 @@ return NULL; ob = PyString_FromStringAndSize(NULL, size + count); + if ( ob == NULL ) + return NULL; p = PyString_AS_STRING(ob); memcpy(p, ptr1, size); memcpy(p + size, ptr2, count); From python-checkins at python.org Sun Dec 18 10:45:55 2005 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 18 Dec 2005 10:45:55 +0100 (CET) Subject: [Python-checkins] commit of r41758 - python/branches/ast-objects/Python/ast.c Message-ID: <20051218094555.1E49C1E4002@bag.python.org> Author: martin.v.loewis Date: Sun Dec 18 10:45:54 2005 New Revision: 41758 Modified: python/branches/ast-objects/Python/ast.c Log: Make it compile up to line 1585. Modified: python/branches/ast-objects/Python/ast.c ============================================================================== --- python/branches/ast-objects/Python/ast.c (original) +++ python/branches/ast-objects/Python/ast.c Sun Dec 18 10:45:54 2005 @@ -1024,6 +1024,7 @@ PyObject *lc = NULL; PyObject *store = NULL; PyObject *ifs = NULL; + PyObject *tmp = NULL; int i, n_fors; node *ch; @@ -1067,12 +1068,13 @@ goto error; } else { - t = Tuple(t, store, LINENO(ch)); + tmp = Tuple(t, store, LINENO(ch)); if (!t) goto error; - lc = comprehension(t, expression, NULL); + lc = comprehension(tmp, expression, NULL); if (!lc) goto error; + Py_RELEASE(tmp); } Py_RELEASE(t); Py_RELEASE(expression); @@ -1121,6 +1123,7 @@ Py_XDECREF(lc); Py_XDECREF(store); Py_XDECREF(ifs); + Py_XDECREF(tmp); return result; } @@ -1195,6 +1198,11 @@ PyObject *result = NULL; PyObject *elt = NULL; PyObject *genexps = NULL; + PyObject *ge = NULL; + PyObject *t = NULL; + PyObject *expression = NULL; + PyObject *store = NULL; + PyObject *tmp = NULL; int i, n_fors; node *ch; @@ -1203,58 +1211,53 @@ elt = ast_for_expr(c, CHILD(n, 0)); if (!elt) - return NULL; + goto error; n_fors = count_gen_fors(n); if (n_fors == -1) - return NULL; + goto error; - genexps = asdl_seq_new(n_fors); - if (!genexps) { - free_expr(elt); - return NULL; - } + genexps = PyList_New(n_fors); + if (!genexps) + goto error; + + store = Store(); + if (!store) + goto error; ch = CHILD(n, 1); for (i = 0; i < n_fors; i++) { - comprehension_ty ge; - PyObject *t = NULL; - PyObject *expression = NULL; + assert(ge == NULL); + assert(t == NULL); + assert(expression == NULL); REQ(ch, gen_for); - t = ast_for_exprlist(c, CHILD(ch, 1), Store); - if (!t) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); - return NULL; - } + t = ast_for_exprlist(c, CHILD(ch, 1), store); + if (!t) + goto error; expression = ast_for_expr(c, CHILD(ch, 3)); - if (!expression) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); - return NULL; - } + if (!expression) + goto error; - if (asdl_seq_LEN(t) == 1) { - ge = comprehension(asdl_seq_GET(t, 0), expression, + if (PyList_GET_SIZE(t) == 1) { + ge = comprehension(PyList_GET_ITEM(t, 0), expression, NULL); - /* only free the sequence since we grabbed element 0 above */ - if (ge) - asdl_seq_free(t); /* ok */ } - else - ge = comprehension(Tuple(t, Store, LINENO(ch)), - expression, NULL); - - if (!ge) { - asdl_comprehension_seq_free(genexps); - asdl_expr_seq_free(t); - free_expr(elt); - return NULL; - } + else { + tmp = Tuple(t, store, LINENO(ch)); + if (!tmp) + goto error; + ge = comprehension(tmp, expression, NULL); + if (!ge) + goto error; + Py_RELEASE(tmp); + } + + if (!ge) + goto error; + Py_RELEASE(t); + Py_RELEASE(expression); if (NCH(ch) == 5) { int j, n_ifs; @@ -1262,48 +1265,43 @@ ch = CHILD(ch, 4); n_ifs = count_gen_ifs(ch); - if (n_ifs == -1) { - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); - return NULL; - } + if (n_ifs == -1) + goto error; - ifs = asdl_seq_new(n_ifs); - if (!ifs) { - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); - return NULL; - } + ifs = PyList_New(n_ifs); + if (!ifs) + goto error; for (j = 0; j < n_ifs; j++) { - PyObject *expression = NULL; REQ(ch, gen_iter); ch = CHILD(ch, 0); REQ(ch, gen_if); expression = ast_for_expr(c, CHILD(ch, 1)); - if (!expression) { - asdl_expr_seq_free(ifs); - asdl_comprehension_seq_free(genexps); - free_comprehension(ge); - free_expr(elt); - return NULL; - } - asdl_seq_APPEND(ifs, expression); + if (!expression) + goto error; + STEAL_ITEM(ifs, j, expression); if (NCH(ch) == 3) ch = CHILD(ch, 2); } /* on exit, must guarantee that ch is a gen_for */ if (TYPE(ch) == gen_iter) ch = CHILD(ch, 0); - ge->ifs = ifs; + Py_DECREF(comprehension_ifs(ge)); + Py_INCREF(ifs); + comprehension_ifs(ge) = ifs; } - asdl_seq_APPEND(genexps, ge); + STEAL_ITEM(genexps, i, ge); } - return GeneratorExp(elt, genexps, LINENO(n)); + result = GeneratorExp(elt, genexps, LINENO(n)); + error: + Py_XDECREF(elt); + Py_XDECREF(genexps); + Py_XDECREF(ge); + Py_XDECREF(t); + Py_XDECREF(expression); + return result; } static PyObject* @@ -1312,112 +1310,129 @@ /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+ */ + PyObject *tmp = NULL; + PyObject *elts = NULL; PyObject *result = NULL; + PyObject *keys = NULL; + PyObject *values = NULL; node *ch = CHILD(n, 0); switch (TYPE(ch)) { - case NAME: + case NAME: { /* All names start in Load context, but may later be changed. */ - return Name(NEW_IDENTIFIER(ch), Load, LINENO(n)); + PyObject *tmp = Load(); + if (!tmp) + goto error; + result = Name(NEW_IDENTIFIER(ch), tmp, LINENO(n)); + break; + } case STRING: { PyObject *str = parsestrplus(c, n); if (!str) - return NULL; + goto error; - return Str(str, LINENO(n)); + result = Str(str, LINENO(n)); + break; } case NUMBER: { - PyObject *pynum = parsenumber(STR(ch)); + tmp = parsenumber(STR(ch)); - if (!pynum) - return NULL; + if (!tmp) + goto error; - return Num(pynum, LINENO(n)); + result = Num(tmp, LINENO(n)); + break; } - case LPAR: /* some parenthesized expressions */ + case LPAR: {/* some parenthesized expressions */ ch = CHILD(n, 1); - if (TYPE(ch) == RPAR) - return Tuple(NULL, Load, LINENO(n)); - - if (TYPE(ch) == yield_expr) - return ast_for_expr(c, ch); - - if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for)) - return ast_for_genexp(c, ch); - - return ast_for_testlist_gexp(c, ch); + if (TYPE(ch) == RPAR) { + tmp = Load(); + if (!tmp) + goto error; + result = Tuple(NULL, tmp, LINENO(n)); + } + else if (TYPE(ch) == yield_expr) + result = ast_for_expr(c, ch); + else if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for)) + result = ast_for_genexp(c, ch); + else + result = ast_for_testlist_gexp(c, ch); + break; + } case LSQB: /* list (or list comprehension) */ + tmp = Load(); + if (!tmp) + goto error; ch = CHILD(n, 1); if (TYPE(ch) == RSQB) - return List(NULL, Load, LINENO(n)); - - REQ(ch, listmaker); - if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { - asdl_seq *elts = seq_for_testlist(c, ch); - - if (!elts) - return NULL; + result = List(NULL, tmp, LINENO(n)); + else { + REQ(ch, listmaker); + if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { + elts = seq_for_testlist(c, ch); + + if (!elts) + return NULL; - return List(elts, Load, LINENO(n)); + result = List(elts, tmp, LINENO(n)); + } + else + result = ast_for_listcomp(c, ch); } - else - return ast_for_listcomp(c, ch); + break; case LBRACE: { /* dictmaker: test ':' test (',' test ':' test)* [','] */ int i, size; - PyObject *keys = NULL; PyObject *values = NULL; ch = CHILD(n, 1); size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ - keys = asdl_seq_new(size); + keys = PyList_New(size); if (!keys) - return NULL; + goto error; - values = asdl_seq_new(size); - if (!values) { - asdl_seq_free(keys); /* ok */ - return NULL; - } + values = PyList_New(size); + if (!values) + goto error; for (i = 0; i < NCH(ch); i += 4) { - PyObject *expression = NULL; - expression = ast_for_expr(c, CHILD(ch, i)); - if (!expression) { - asdl_expr_seq_free(keys); - asdl_expr_seq_free(values); - return NULL; - } + tmp = ast_for_expr(c, CHILD(ch, i)); + if (!tmp) + goto error; - asdl_seq_SET(keys, i / 4, expression); + STEAL_ITEM(keys, i / 4, tmp); - expression = ast_for_expr(c, CHILD(ch, i + 2)); - if (!expression) { - asdl_expr_seq_free(keys); - asdl_expr_seq_free(values); - return NULL; - } + tmp = ast_for_expr(c, CHILD(ch, i + 2)); + if (!tmp) + goto error; - asdl_seq_SET(values, i / 4, expression); + STEAL_ITEM(values, i / 4, tmp); } - return Dict(keys, values, LINENO(n)); + result = Dict(keys, values, LINENO(n)); + break; } case BACKQUOTE: { /* repr */ - expr_ty expression = ast_for_testlist(c, CHILD(n, 1)); + tmp = ast_for_testlist(c, CHILD(n, 1)); - if (!expression) - return NULL; + if (!tmp) + goto error; - return Repr(expression, LINENO(n)); + result = Repr(tmp, LINENO(n)); + break; } default: PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch)); - return NULL; } + error: + Py_XDECREF(tmp); + Py_XDECREF(elts); + Py_XDECREF(keys); + Py_XDECREF(values); + return result; } static PyObject* @@ -1425,7 +1440,9 @@ { PyObject *result = NULL; node *ch; - expr_ty lower = NULL, upper = NULL, step = NULL; + PyObject *lower = NULL; + PyObject *upper = NULL; + PyObject *step = NULL; REQ(n, subscript); @@ -1442,15 +1459,16 @@ other vars */ step = ast_for_expr(c, ch); if (!step) - return NULL; + goto error; - return Index(step); + result = Index(step); + goto success; } if (TYPE(ch) == test) { lower = ast_for_expr(c, ch); if (!lower) - return NULL; + goto error; } /* If there's an upper bound it's in the second or third position. */ @@ -1461,7 +1479,7 @@ if (TYPE(n2) == test) { upper = ast_for_expr(c, n2); if (!upper) - return NULL; + goto error; } } } else if (NCH(n) > 2) { @@ -1470,7 +1488,7 @@ if (TYPE(n2) == test) { upper = ast_for_expr(c, n2); if (!upper) - return NULL; + goto error; } } @@ -1485,11 +1503,17 @@ if (TYPE(ch) == test) { step = ast_for_expr(c, ch); if (!step) - return NULL; + goto error; } } - return Slice(lower, upper, step); + result = Slice(lower, upper, step); + success: + error: + Py_XDECREF(lower); + Py_XDECREF(upper); + Py_XDECREF(step); + return result; } static PyObject* @@ -1502,8 +1526,12 @@ PyObject *result = NULL; int i, nops; - PyObject *expr1 = NULL; PyObject *expr2 = NULL; PyObject *result = NULL; - operator_ty operator; + PyObject *expr1 = NULL; + PyObject *expr2 = NULL; + PyObject *tmp_result = NULL; + PyObject *tmp1 = NULL; + PyObject *tmp2 = NULL; + PyObject *operator = NULL; expr1 = ast_for_expr(c, CHILD(n, 0)); if (!expr1) @@ -1517,30 +1545,40 @@ if (!operator) return NULL; - result = BinOp(expr1, operator, expr2, LINENO(n)); - if (!result) + tmp_result = BinOp(expr1, operator, expr2, LINENO(n)); + if (!tmp_result) return NULL; nops = (NCH(n) - 1) / 2; for (i = 1; i < nops; i++) { - PyObject *tmp_result = NULL; PyObject *tmp = NULL; const node* next_oper = CHILD(n, i * 2 + 1); operator = get_operator(next_oper); if (!operator) - return NULL; + goto error; - tmp = ast_for_expr(c, CHILD(n, i * 2 + 2)); - if (!tmp) - return NULL; + tmp1 = ast_for_expr(c, CHILD(n, i * 2 + 2)); + if (!tmp1) + goto error; - tmp_result = BinOp(result, operator, tmp, - LINENO(next_oper)); - if (!tmp) - return NULL; - result = tmp_result; + tmp2 = BinOp(tmp_result, operator, tmp1, + LINENO(next_oper)); + if (!tmp_result) + goto error; + tmp_result = tmp2; + tmp2 = NULL; + Py_RELEASE(tmp1); } - return result; + result = tmp_result; + tmp_result = NULL; + error: + Py_XDECREF(expr1); + Py_XDECREF(expr2); + Py_XDECREF(operator); + Py_XDECREF(tmp_result); + Py_XDECREF(tmp1); + Py_XDECREF(tmp2); + return NULL; } static PyObject* From mal at egenix.com Sun Dec 18 13:01:25 2005 From: mal at egenix.com (M.-A. Lemburg) Date: Sun, 18 Dec 2005 13:01:25 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.tex Doc/lib/libsys.tex Include/pythonrun.h Mac Makefile.pre.in Misc/NEWS Modules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <1134884285.10352.10.camel@geddy.wooz.org> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> Message-ID: <43A54F95.9060702@egenix.com> Barry Warsaw wrote: > On Sat, 2005-12-17 at 20:04 -0800, Neal Norwitz wrote: >> This change break test_platform. The problem is the >> _sys_version_parser regex and _sys_version() can't handle a >> non-number. > > Yep, and thanks for fixing that. Saw your checkin -- you just beat me > to it. ;) I wouldn't be surprised if other tools out there parse the sys.version string in a similar way. Wouldn't it be better to keep the old format (after all, the Subversion revision number is a single number as well - just like the old buildno) ?! -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Dec 18 2005) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From barry at python.org Sun Dec 18 13:51:01 2005 From: barry at python.org (Barry Warsaw) Date: Sun, 18 Dec 2005 07:51:01 -0500 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.tex Doc/lib/libsys.tex Include/pythonrun.h Mac Makefile.pre.in Misc/NEWS Modules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <43A54F95.9060702@egenix.com> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> Message-ID: <1134910261.10353.14.camel@geddy.wooz.org> On Sun, 2005-12-18 at 13:01 +0100, M.-A. Lemburg wrote: > I wouldn't be surprised if other tools out there parse the > sys.version string in a similar way. Wouldn't it be better > to keep the old format (after all, the Subversion revision number > is a single number as well - just like the old buildno) ?! Not if we wanted to keep the (possibly) trailing 'M', which is useful information. svnversion can also return a range of revisions, which I think we also decided was useful information. However we /could/ keep the '#' prefix which is what I think broke that test. So in the simple case the format would be the same, but in the more complicated cases (which only developers should see) it might be different. -Barry -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 307 bytes Desc: This is a digitally signed message part Url : http://mail.python.org/pipermail/python-checkins/attachments/20051218/09b9ea50/attachment.pgp From python-checkins at python.org Sun Dec 18 14:58:26 2005 From: python-checkins at python.org (fredrik.lundh) Date: Sun, 18 Dec 2005 14:58:26 +0100 (CET) Subject: [Python-checkins] commit of r41759 - python/trunk/Modules/_elementtree.c Message-ID: <20051218135826.27E971E4002@bag.python.org> Author: fredrik.lundh Date: Sun Dec 18 14:58:25 2005 New Revision: 41759 Modified: python/trunk/Modules/_elementtree.c Log: fixed None reference leaks in treebuilder class (reported by Neal Norwich) Modified: python/trunk/Modules/_elementtree.c ============================================================================== --- python/trunk/Modules/_elementtree.c (original) +++ python/trunk/Modules/_elementtree.c Sun Dec 18 14:58:25 2005 @@ -1501,10 +1501,12 @@ if (self->data) { if (self->this == self->last) { + Py_DECREF(self->last->text); self->last->text = JOIN_SET( self->data, PyList_CheckExact(self->data) ); } else { + Py_DECREF(self->last->tail); self->last->tail = JOIN_SET( self->data, PyList_CheckExact(self->data) ); @@ -1606,10 +1608,12 @@ if (self->data) { if (self->this == self->last) { + Py_DECREF(self->last->text); self->last->text = JOIN_SET( self->data, PyList_CheckExact(self->data) ); } else { + Py_DECREF(self->last->tail); self->last->tail = JOIN_SET( self->data, PyList_CheckExact(self->data) ); From mal at egenix.com Sun Dec 18 15:56:17 2005 From: mal at egenix.com (M.-A. Lemburg) Date: Sun, 18 Dec 2005 15:56:17 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.tex Doc/lib/libsys.tex Include/pythonrun.h Mac Makefile.pre.in Misc/NEWS Modules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <1134910261.10353.14.camel@geddy.wooz.org> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> <1134910261.10353.14.camel@geddy.wooz.org> Message-ID: <43A57891.1080109@egenix.com> Barry Warsaw wrote: > On Sun, 2005-12-18 at 13:01 +0100, M.-A. Lemburg wrote: > >> I wouldn't be surprised if other tools out there parse the >> sys.version string in a similar way. Wouldn't it be better >> to keep the old format (after all, the Subversion revision number >> is a single number as well - just like the old buildno) ?! > > Not if we wanted to keep the (possibly) trailing 'M', which is useful > information. svnversion can also return a range of revisions, which I > think we also decided was useful information. > > However we /could/ keep the '#' prefix which is what I think broke that > test. So in the simple case the format would be the same, but in the > more complicated cases (which only developers should see) it might be > different. Fair enough. I think this information would really only be useful for developers anyway and they can easily adapt their stuff to the new layout. It's the users of tools which use the final distributed versions which would run into problems they can't easily solve. Thanks, -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Dec 18 2005) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From python-checkins at python.org Sun Dec 18 16:44:24 2005 From: python-checkins at python.org (fredrik.lundh) Date: Sun, 18 Dec 2005 16:44:24 +0100 (CET) Subject: [Python-checkins] commit of r41760 - python/trunk/Python/compile.c python/trunk/Python/pyarena.c Message-ID: <20051218154424.350ED1E4002@bag.python.org> Author: fredrik.lundh Date: Sun Dec 18 16:44:21 2005 New Revision: 41760 Modified: python/trunk/Python/compile.c python/trunk/Python/pyarena.c Log: fixed compilation with an ordinary C89 compiler Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Sun Dec 18 16:44:21 2005 @@ -296,8 +296,7 @@ PyNode_Compile(struct _node *n, const char *filename) { PyCodeObject *co = NULL; - PyArena *arena; - arena = PyArena_New(); + PyArena *arena = PyArena_New(); mod_ty mod = PyAST_FromNode(n, NULL, filename, arena); if (mod) co = PyAST_Compile(mod, filename, NULL, arena); Modified: python/trunk/Python/pyarena.c ============================================================================== --- python/trunk/Python/pyarena.c (original) +++ python/trunk/Python/pyarena.c Sun Dec 18 16:44:21 2005 @@ -107,8 +107,8 @@ int PyArena_AddMallocPointer(PyArena *arena, void *pointer) { - assert(pointer); PyArenaList *tail = arena->a_malloc_tail; + assert(pointer); assert(tail->al_pointer != pointer); tail->al_next = PyArenaList_New(); tail->al_pointer = pointer; @@ -119,8 +119,8 @@ int PyArena_AddPyObject(PyArena *arena, PyObject *pointer) { - assert(pointer); PyArenaList *tail = arena->a_object_tail; + assert(pointer); tail->al_next = PyArenaList_New(); tail->al_pointer = pointer; arena->a_object_tail = tail->al_next; From python-checkins at python.org Sun Dec 18 18:07:03 2005 From: python-checkins at python.org (phillip.eby) Date: Sun, 18 Dec 2005 18:07:03 +0100 (CET) Subject: [Python-checkins] commit of r41761 - sandbox/trunk/setuptools/EasyInstall.txt Message-ID: <20051218170703.875EF1E4002@bag.python.org> Author: phillip.eby Date: Sun Dec 18 18:07:02 2005 New Revision: 41761 Modified: sandbox/trunk/setuptools/EasyInstall.txt Log: Incorporate Bob Ippolito's corrections to Mac OS X instructions. Modified: sandbox/trunk/setuptools/EasyInstall.txt ============================================================================== --- sandbox/trunk/setuptools/EasyInstall.txt (original) +++ sandbox/trunk/setuptools/EasyInstall.txt Sun Dec 18 18:07:02 2005 @@ -757,7 +757,7 @@ `Mac OS X "User" Installation`_ This approach produces a result similar to an administrator installation - that gives each user their own private package directory, but on Mac OS + that gives each user their own private package directory, but on Mac OS X the hard part has already been done for you. This is probably the best approach for Mac OS X users. @@ -814,7 +814,11 @@ install_lib = ~/lib/python2.3 # This next line is optional but often quite useful; it directs EasyInstall - # and the distutils to install scripts in the user's "bin" directory: + # and the distutils to install scripts in the user's "bin" directory. For + # Mac OS X framework Python builds, you should use /usr/local/bin instead, + # because neither ~/bin nor the default script installation location are on + # the system PATH. + # install_scripts = ~/bin [easy_install] @@ -857,19 +861,22 @@ [install] install_lib = ~/Library/Python$py_version_short/site-packages + install_scripts = ~/bin This will tell the distutils and EasyInstall to always install packages in -your personal ``site-packages`` directory. (Note: do *not* replace -``$py_version_short`` with an actual Python version in the configuration file! -The distutils will substitute the correct value at runtime, so that the above -configuration file should work correctly no matter what Python version you use, -now or in the future.) +your personal ``site-packages`` directory, and scripts to ``~/bin``. (Note: do +*not* replace ``$py_version_short`` with an actual Python version in the +configuration file! The distutils will substitute the correct value at +runtime, so that the above configuration file should work correctly no matter +what Python version you use, now or in the future.) Once you have done this, you can follow the normal `installation instructions`_ -and use ``easy_install`` without any other special options or steps, unless -you also want to customize where scripts are installed. (In which case, you -can add an ``install_scripts`` line to the above to set the installation -location.) +and use ``easy_install`` without any other special options or steps. + +(Note, however, that ``~/bin`` is not in the default ``PATH``, so you may have +to refer to scripts by their full location. You may want to modify your shell +startup script (likely ``.bashrc`` or ``.profile``) or your +``~/.MacOSX/environment.plist`` to include ``~/bin`` in your ``PATH``. Creating a "Virtual" Python From martin at v.loewis.de Sun Dec 18 19:05:00 2005 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Sun, 18 Dec 2005 19:05:00 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.tex Doc/lib/libsys.tex Include/pythonrun.h Mac Makefile.pre.in Misc/NEWS Modules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <43A54F95.9060702@egenix.com> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> Message-ID: <43A5A4CC.8070707@v.loewis.de> M.-A. Lemburg wrote: > I wouldn't be surprised if other tools out there parse the > sys.version string in a similar way. Wouldn't it be better > to keep the old format (after all, the Subversion revision number > is a single number as well - just like the old buildno) ?! What we are talking about here isn't a single number: a subversion working copy is denoted by a set of revision numbers, plus a set of local modifications (plus a "switched" flag, which I don't understand). svnversion reduces the notion of the set of version numbers to only print minimum and maximum (and only a single number if they are the same). Regards, Martin From martin at v.loewis.de Sun Dec 18 19:11:34 2005 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Sun, 18 Dec 2005 19:11:34 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.tex Doc/lib/libsys.tex Include/pythonrun.h Mac Makefile.pre.in Misc/NEWS Modules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <43A57891.1080109@egenix.com> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> <1134910261.10353.14.camel@geddy.wooz.org> <43A57891.1080109@egenix.com> Message-ID: <43A5A656.5090504@v.loewis.de> M.-A. Lemburg wrote: > It's the users of tools which use the final distributed versions > which would run into problems they can't easily solve. In the final distributed version, this code is dead: there won't be a .svn directory to get information from. Regards, Martin From mwh at python.net Sun Dec 18 20:02:24 2005 From: mwh at python.net (Michael Hudson) Date: Sun, 18 Dec 2005 19:02:24 +0000 Subject: [Python-checkins] commit of r41743 - in python/trunk: Doc/ref/ref7.tex Misc/NEWS In-Reply-To: (Neal Norwitz's message of "Sat, 17 Dec 2005 21:51:36 -0800") References: <20051217222413.D224D1E4002@bag.python.org> Message-ID: <2md5ju44an.fsf@starship.python.net> Neal Norwitz writes: > On 12/17/05, Reinhold Birkenfeld wrote: >> neal.norwitz wrote: >> >> > +\keyword{finally} clause is executed. If there is a saved exception, >> > +it is re-raised at the end of the \keyword{finally} clause. >> > +If the \keyword{finally} clause raises another exception or >> > executes a \keyword{return} or \keyword{break} statement, the saved >> > exception is lost. A \keyword{continue} statement is illegal in the >> > \keyword{finally} clause. (The reason is a problem with the current >> [implementation]. >> >> What's the status of this? Could this be addressed here, too? > > AFAIK, it's not related to any of these changes. I think mwh and > Armin know more about fixing that problem. I don't quite know why you think I'd know about this, but I can tell you that I have little interest in 'fixing' it -- if you think about what a 'continue' would do in a finally: block, you'll realise that it's a pretty insane thing to do (or at least I did). > IIRC, it requires changes to eval frame. Maybe :) Cheers, mwh -- I sense much distrust in you. Distrust leads to cynicism, cynicism leads to bitterness, bitterness leads to the Awareness Of True Reality which is referred to by those-who-lack-enlightenment as "paranoia". I approve. -- David P. Murphy, alt.sysadmin.recovery From nnorwitz at gmail.com Sun Dec 18 20:10:53 2005 From: nnorwitz at gmail.com (Neal Norwitz) Date: Sun, 18 Dec 2005 11:10:53 -0800 Subject: [Python-checkins] commit of r41743 - in python/trunk: Doc/ref/ref7.tex Misc/NEWS In-Reply-To: <2md5ju44an.fsf@starship.python.net> References: <20051217222413.D224D1E4002@bag.python.org> <2md5ju44an.fsf@starship.python.net> Message-ID: On 12/18/05, Michael Hudson wrote: > Neal Norwitz writes: > > > On 12/17/05, Reinhold Birkenfeld wrote: > >> neal.norwitz wrote: > >> > >> > +\keyword{finally} clause is executed. If there is a saved exception, > >> > +it is re-raised at the end of the \keyword{finally} clause. > >> > +If the \keyword{finally} clause raises another exception or > >> > executes a \keyword{return} or \keyword{break} statement, the saved > >> > exception is lost. A \keyword{continue} statement is illegal in the > >> > \keyword{finally} clause. (The reason is a problem with the current > >> [implementation]. > >> > >> What's the status of this? Could this be addressed here, too? > > > > AFAIK, it's not related to any of these changes. I think mwh and > > Armin know more about fixing that problem. > > I don't quite know why you think I'd know about this, but I can tell > you that I have little interest in 'fixing' it -- if you think about I (mis)remembered some discussion that was probably about try/finally, but not about this. Shoot, my plan to dump work on someone else fails again! :-) > what a 'continue' would do in a finally: block, you'll realise that > it's a pretty insane thing to do (or at least I did). I didn't think about it until you mentioned it. It does seem odd. I don't recall anytime I ever wanted to do finally: continue. n From python-checkins at python.org Sun Dec 18 20:39:59 2005 From: python-checkins at python.org (fredrik.lundh) Date: Sun, 18 Dec 2005 20:39:59 +0100 (CET) Subject: [Python-checkins] commit of r41762 - python/trunk/Doc/api/refcounts.dat Message-ID: <20051218193959.BB52B1E4002@bag.python.org> Author: fredrik.lundh Date: Sun Dec 18 20:39:59 2005 New Revision: 41762 Modified: python/trunk/Doc/api/refcounts.dat Log: SF#1383115 added refcount information for PyObject_Call Modified: python/trunk/Doc/api/refcounts.dat ============================================================================== --- python/trunk/Doc/api/refcounts.dat (original) +++ python/trunk/Doc/api/refcounts.dat Sun Dec 18 20:39:59 2005 @@ -751,6 +751,11 @@ PyObject_AsFileDescriptor:int::: PyObject_AsFileDescriptor:PyObject*:o:0: +PyObject_Call:PyObject*::+1: +PyObject_Call:PyObject*:callable_object:0: +PyObject_Call:PyObject*:args:0: +PyObject_Call:PyObject*:kw:0: + PyObject_CallFunction:PyObject*::+1: PyObject_CallFunction:PyObject*:callable_object:0: PyObject_CallFunction:char*:format:: From python-checkins at python.org Sun Dec 18 22:06:46 2005 From: python-checkins at python.org (fredrik.lundh) Date: Sun, 18 Dec 2005 22:06:46 +0100 (CET) Subject: [Python-checkins] commit of r41763 - python/trunk/PC/_subprocess.c Message-ID: <20051218210646.95D771E4012@bag.python.org> Author: fredrik.lundh Date: Sun Dec 18 22:06:46 2005 New Revision: 41763 Modified: python/trunk/PC/_subprocess.c Log: added TerminateProcess support to _subprocess driver Modified: python/trunk/PC/_subprocess.c ============================================================================== --- python/trunk/PC/_subprocess.c (original) +++ python/trunk/PC/_subprocess.c Sun Dec 18 22:06:46 2005 @@ -425,6 +425,26 @@ } static PyObject * +sp_TerminateProcess(PyObject* self, PyObject* args) +{ + BOOL result; + + long process; + int exit_code; + if (! PyArg_ParseTuple(args, "li:TerminateProcess", &process, + &exit_code)) + return NULL; + + result = TerminateProcess((HANDLE) process, exit_code); + + if (! result) + return PyErr_SetFromWindowsErr(GetLastError()); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * sp_GetExitCodeProcess(PyObject* self, PyObject* args) { DWORD exit_code; @@ -498,6 +518,7 @@ {"DuplicateHandle", sp_DuplicateHandle, METH_VARARGS}, {"CreatePipe", sp_CreatePipe, METH_VARARGS}, {"CreateProcess", sp_CreateProcess, METH_VARARGS}, + {"TerminateProcess", sp_TerminateProcess, METH_VARARGS}, {"GetExitCodeProcess", sp_GetExitCodeProcess, METH_VARARGS}, {"WaitForSingleObject", sp_WaitForSingleObject, METH_VARARGS}, {"GetVersion", sp_GetVersion, METH_VARARGS}, From python-checkins at python.org Sun Dec 18 22:36:41 2005 From: python-checkins at python.org (neal.norwitz) Date: Sun, 18 Dec 2005 22:36:41 +0100 (CET) Subject: [Python-checkins] commit of r41764 - python/trunk/configure python/trunk/configure.in Message-ID: <20051218213641.A338B1E4002@bag.python.org> Author: neal.norwitz Date: Sun Dec 18 22:36:39 2005 New Revision: 41764 Modified: python/trunk/configure python/trunk/configure.in Log: Jack said we don't need the Mac/Python/ directory any more. Modified: python/trunk/configure ============================================================================== --- python/trunk/configure (original) +++ python/trunk/configure Sun Dec 18 22:36:39 2005 @@ -20815,7 +20815,7 @@ done -SRCDIRS="Parser Grammar Objects Python Modules Mac Mac/Python" +SRCDIRS="Parser Grammar Objects Python Modules Mac" echo "$as_me:$LINENO: checking for build directories" >&5 echo $ECHO_N "checking for build directories... $ECHO_C" >&6 for dir in $SRCDIRS; do Modified: python/trunk/configure.in ============================================================================== --- python/trunk/configure.in (original) +++ python/trunk/configure.in Sun Dec 18 22:36:39 2005 @@ -3146,7 +3146,7 @@ done AC_SUBST(SRCDIRS) -SRCDIRS="Parser Grammar Objects Python Modules Mac Mac/Python" +SRCDIRS="Parser Grammar Objects Python Modules Mac" AC_MSG_CHECKING(for build directories) for dir in $SRCDIRS; do if test ! -d $dir; then From python-checkins at python.org Sun Dec 18 23:46:36 2005 From: python-checkins at python.org (barry.warsaw) Date: Sun, 18 Dec 2005 23:46:36 +0100 (CET) Subject: [Python-checkins] commit of r41765 - in python/trunk: Makefile.pre.in Modules/getbuildinfo.c Message-ID: <20051218224636.873121E4002@bag.python.org> Author: barry.warsaw Date: Sun Dec 18 23:46:35 2005 New Revision: 41765 Modified: python/trunk/Makefile.pre.in python/trunk/Modules/getbuildinfo.c Log: Handle a couple of use cases discussed in python-dev w.r.t. calculating the Subversion revision number. First, in an svn export, there will be no .svn directory, so use an in-file $Revision$ keyword string with the keyword chrome stripped off. Also, use $(srcdir) in the Makefile.pre.in to handle the case where Python is build outside the source tree. Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Sun Dec 18 23:46:35 2005 @@ -349,12 +349,9 @@ $(SIGNAL_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c - if test -d .svn; then \ - svnversion . >buildno; \ - elif test -f buildno; then \ - expr `cat buildno` + 1 >buildno1; \ - mv -f buildno1 buildno; \ - else echo 1 >buildno; fi + if test -d $(srcdir)/.svn; then \ + svnversion $(srcdir) >buildno; \ + fi # Build static library # avoid long command lines, same as LIBRARY_OBJS @@ -446,7 +443,11 @@ # Special rules for object files Modules/getbuildinfo.o: $(srcdir)/Modules/getbuildinfo.c buildno - $(CC) -c $(PY_CFLAGS) -DBUILD=\"`cat buildno`\" -o $@ $(srcdir)/Modules/getbuildinfo.c + if test -f buildno; then \ + $(CC) -c $(PY_CFLAGS) -DBUILD=\"`cat buildno`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ;\ + else \ + $(CC) -c $(PY_CFLAGS) -o $@ $(srcdir)/Modules/getbuildinfo.c ;\ + fi Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ Modified: python/trunk/Modules/getbuildinfo.c ============================================================================== --- python/trunk/Modules/getbuildinfo.c (original) +++ python/trunk/Modules/getbuildinfo.c Sun Dec 18 23:46:35 2005 @@ -21,20 +21,38 @@ #endif #ifndef BUILD -#define BUILD "0" +#define BUILD "$Revision$" #endif const char * -Py_GetBuildInfo(void) +Py_GetBuildNumber(void) { - static char buildinfo[50]; - PyOS_snprintf(buildinfo, sizeof(buildinfo), - "%s, %.20s, %.9s", BUILD, DATE, TIME); - return buildinfo; + static char buildno[20]; + static int buildno_okay; + + if (!buildno_okay) { + char *build = BUILD; + int len = strlen(build); + + if (len > 13 && + !strncmp(build, "$Revision: ", 11) && + !strcmp(build + len - 2, " $")) + { + memcpy(buildno, build + 11, len - 13); + } + else { + memcpy(buildno, build, 19); + } + buildno_okay = 1; + } + return buildno; } const char * -Py_GetBuildNumber(void) +Py_GetBuildInfo(void) { - return BUILD; + static char buildinfo[50]; + PyOS_snprintf(buildinfo, sizeof(buildinfo), + "#%s, %.20s, %.9s", Py_GetBuildNumber(), DATE, TIME); + return buildinfo; } From mal at egenix.com Mon Dec 19 00:44:42 2005 From: mal at egenix.com (M.-A. Lemburg) Date: Mon, 19 Dec 2005 00:44:42 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.texModules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <43A5A656.5090504@v.loewis.de> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> <1134910261.10353.14.camel@geddy.wooz.org> <43A57891.1080109@egenix.com> <43A5A656.5090504@v.loewis.de> Message-ID: <43A5F46A.8040809@egenix.com> Martin v. L?wis wrote: > M.-A. Lemburg wrote: >> It's the users of tools which use the final distributed versions >> which would run into problems they can't easily solve. > > In the final distributed version, this code is dead: there won't > be a .svn directory to get information from. Sorry, I was talking about compiled distributions versions. These will contain the build number, right ? Or should we tell people to only distribute compiled versions that were created from the source distribution ? (which then have the .svn dir and thus no issues) -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Dec 19 2005) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From mal at egenix.com Mon Dec 19 00:47:28 2005 From: mal at egenix.com (M.-A. Lemburg) Date: Mon, 19 Dec 2005 00:47:28 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.texModules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <43A5A4CC.8070707@v.loewis.de> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> <43A5A4CC.8070707@v.loewis.de> Message-ID: <43A5F510.10106@egenix.com> Martin v. L?wis wrote: > M.-A. Lemburg wrote: >> I wouldn't be surprised if other tools out there parse the >> sys.version string in a similar way. Wouldn't it be better >> to keep the old format (after all, the Subversion revision number >> is a single number as well - just like the old buildno) ?! > > What we are talking about here isn't a single number: > a subversion working copy is denoted by a set of revision > numbers, plus a set of local modifications (plus a "switched" > flag, which I don't understand). > > svnversion reduces the notion of the set of version numbers > to only print minimum and maximum (and only a single number > if they are the same). Right, but only if you haven't done an "svn update" right before building the code. I would assume this to be the standard case if you intend to build a binary distribution. -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Dec 19 2005) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From python-checkins at python.org Mon Dec 19 01:09:07 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 19 Dec 2005 01:09:07 +0100 (CET) Subject: [Python-checkins] commit of r41766 - in python/branches/ssize_t: Modules/_elementtree.c Modules/arraymodule.c Modules/collectionsmodule.c Modules/datetimemodule.c Modules/mmapmodule.c Modules/stropmodule.c Objects/listobject.c Python/ceval.c Message-ID: <20051219000907.5E7CA1E4002@bag.python.org> Author: neal.norwitz Date: Mon Dec 19 01:08:57 2005 New Revision: 41766 Modified: python/branches/ssize_t/Modules/_elementtree.c python/branches/ssize_t/Modules/arraymodule.c python/branches/ssize_t/Modules/collectionsmodule.c python/branches/ssize_t/Modules/datetimemodule.c python/branches/ssize_t/Modules/mmapmodule.c python/branches/ssize_t/Modules/stropmodule.c python/branches/ssize_t/Objects/listobject.c python/branches/ssize_t/Python/ceval.c Log: Get rid of compiler warnings on AMD64 Modified: python/branches/ssize_t/Modules/_elementtree.c ============================================================================== --- python/branches/ssize_t/Modules/_elementtree.c (original) +++ python/branches/ssize_t/Modules/_elementtree.c Mon Dec 19 01:08:57 2005 @@ -1228,7 +1228,7 @@ } static int -element_setitem(ElementObject* self, int index, PyObject* item) +element_setitem(ElementObject* self, size_t index, PyObject* item) { int i; PyObject* old; @@ -1371,10 +1371,10 @@ (inquiry) element_length, 0, /* sq_concat */ 0, /* sq_repeat */ - (intargfunc) element_getitem, - (intintargfunc) element_getslice, - (intobjargproc) element_setitem, - (intintobjargproc) element_setslice, + (ssizeargfunc) element_getitem, + (ssizessizeargfunc) element_getslice, + (sizeobjargproc) element_setitem, + (ssizessizeobjargproc) element_setslice, }; statichere PyTypeObject Element_Type = { Modified: python/branches/ssize_t/Modules/arraymodule.c ============================================================================== --- python/branches/ssize_t/Modules/arraymodule.c (original) +++ python/branches/ssize_t/Modules/arraymodule.c Mon Dec 19 01:08:57 2005 @@ -1706,7 +1706,7 @@ if (av->ob_size != slicelength) { PyErr_Format(PyExc_ValueError, - "attempt to assign array of size %d to extended slice of size %d", + "attempt to assign array of size %ld to extended slice of size %ld", av->ob_size, slicelength); return -1; } Modified: python/branches/ssize_t/Modules/collectionsmodule.c ============================================================================== --- python/branches/ssize_t/Modules/collectionsmodule.c (original) +++ python/branches/ssize_t/Modules/collectionsmodule.c Mon Dec 19 01:08:57 2005 @@ -779,9 +779,9 @@ (inquiry)deque_len, /* sq_length */ 0, /* sq_concat */ 0, /* sq_repeat */ - (intargfunc)deque_item, /* sq_item */ + (ssizeargfunc)deque_item, /* sq_item */ 0, /* sq_slice */ - (intobjargproc)deque_ass_item, /* sq_ass_item */ + (sizeobjargproc)deque_ass_item, /* sq_ass_item */ }; /* deque object ********************************************************/ Modified: python/branches/ssize_t/Modules/datetimemodule.c ============================================================================== --- python/branches/ssize_t/Modules/datetimemodule.c (original) +++ python/branches/ssize_t/Modules/datetimemodule.c Mon Dec 19 01:08:57 2005 @@ -596,7 +596,7 @@ */ static PyObject * -time_alloc(PyTypeObject *type, int aware) +time_alloc(PyTypeObject *type, Py_ssize_t aware) { PyObject *self; @@ -611,7 +611,7 @@ } static PyObject * -datetime_alloc(PyTypeObject *type, int aware) +datetime_alloc(PyTypeObject *type, Py_ssize_t aware) { PyObject *self; Modified: python/branches/ssize_t/Modules/mmapmodule.c ============================================================================== --- python/branches/ssize_t/Modules/mmapmodule.c (original) +++ python/branches/ssize_t/Modules/mmapmodule.c Mon Dec 19 01:08:57 2005 @@ -756,11 +756,11 @@ static PySequenceMethods mmap_as_sequence = { (inquiry)mmap_length, /*sq_length*/ (binaryfunc)mmap_concat, /*sq_concat*/ - (intargfunc)mmap_repeat, /*sq_repeat*/ - (intargfunc)mmap_item, /*sq_item*/ - (intintargfunc)mmap_slice, /*sq_slice*/ - (intobjargproc)mmap_ass_item, /*sq_ass_item*/ - (intintobjargproc)mmap_ass_slice, /*sq_ass_slice*/ + (ssizeargfunc)mmap_repeat, /*sq_repeat*/ + (ssizeargfunc)mmap_item, /*sq_item*/ + (ssizessizeargfunc)mmap_slice, /*sq_slice*/ + (sizeobjargproc)mmap_ass_item, /*sq_ass_item*/ + (ssizessizeobjargproc)mmap_ass_slice, /*sq_ass_slice*/ }; static PyBufferProcs mmap_as_buffer = { Modified: python/branches/ssize_t/Modules/stropmodule.c ============================================================================== --- python/branches/ssize_t/Modules/stropmodule.c (original) +++ python/branches/ssize_t/Modules/stropmodule.c Mon Dec 19 01:08:57 2005 @@ -170,7 +170,7 @@ int i, reslen = 0, slen = 0, sz = 100; PyObject *res = NULL; char* p = NULL; - intargfunc getitemfunc; + ssizeargfunc getitemfunc; WARN; if (!PyArg_ParseTuple(args, "O|t#:join", &seq, &sep, &seplen)) Modified: python/branches/ssize_t/Objects/listobject.c ============================================================================== --- python/branches/ssize_t/Objects/listobject.c (original) +++ python/branches/ssize_t/Objects/listobject.c Mon Dec 19 01:08:57 2005 @@ -2442,7 +2442,7 @@ (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */ (objobjproc)list_contains, /* sq_contains */ (binaryfunc)list_inplace_concat, /* sq_inplace_concat */ - (intargfunc)list_inplace_repeat, /* sq_inplace_repeat */ + (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */ }; PyDoc_STRVAR(list_doc, @@ -2603,7 +2603,7 @@ if (PySequence_Fast_GET_SIZE(seq) != slicelength) { /* XXX can we use %zd here? */ PyErr_Format(PyExc_ValueError, - "attempt to assign sequence of size %d to extended slice of size %d", + "attempt to assign sequence of size %d to extended slice of size %ld", (int)PySequence_Fast_GET_SIZE(seq), slicelength); Py_DECREF(seq); Modified: python/branches/ssize_t/Python/ceval.c ============================================================================== --- python/branches/ssize_t/Python/ceval.c (original) +++ python/branches/ssize_t/Python/ceval.c Mon Dec 19 01:08:57 2005 @@ -3927,7 +3927,7 @@ PySequenceMethods *sq = tp->tp_as_sequence; if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { - int ilow = 0, ihigh = INT_MAX; + Py_ssize_t ilow = 0, ihigh = INT_MAX; if (!_PyEval_SliceIndex(v, &ilow)) return NULL; if (!_PyEval_SliceIndex(w, &ihigh)) @@ -3954,7 +3954,7 @@ PySequenceMethods *sq = tp->tp_as_sequence; if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { - int ilow = 0, ihigh = INT_MAX; + Py_ssize_t ilow = 0, ihigh = INT_MAX; if (!_PyEval_SliceIndex(v, &ilow)) return -1; if (!_PyEval_SliceIndex(w, &ihigh)) From python-checkins at python.org Mon Dec 19 05:27:46 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 19 Dec 2005 05:27:46 +0100 (CET) Subject: [Python-checkins] commit of r41767 - in python/trunk: Misc/NEWS Python/symtable.c Message-ID: <20051219042746.724B01E4002@bag.python.org> Author: neal.norwitz Date: Mon Dec 19 05:27:42 2005 New Revision: 41767 Modified: python/trunk/Misc/NEWS python/trunk/Python/symtable.c Log: Bug #889500, fix line number on SyntaxWarning for global declarations. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Mon Dec 19 05:27:42 2005 @@ -12,6 +12,8 @@ Core and builtins ----------------- +- Bug #889500, fix line number on SyntaxWarning for global declarations. + - Bug #1378022, UTF-8 files with a leading BOM crashed the interpreter. - Support for converting hex strings to floats no longer works. Modified: python/trunk/Python/symtable.c ============================================================================== --- python/trunk/Python/symtable.c (original) +++ python/trunk/Python/symtable.c Mon Dec 19 05:27:42 2005 @@ -4,13 +4,16 @@ #include "symtable.h" #include "structmember.h" -/* two error strings used for warnings */ +/* error strings used for warnings */ #define GLOBAL_AFTER_ASSIGN \ "name '%.400s' is assigned to before global declaration" #define GLOBAL_AFTER_USE \ "name '%.400s' is used prior to global declaration" +#define IMPORT_STAR_WARNING "import * only allowed at module level" + + PySTEntryObject * PySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block, void *key, int lineno) @@ -152,7 +155,7 @@ }; static int symtable_analyze(struct symtable *st); -static int symtable_warn(struct symtable *st, char *msg); +static int symtable_warn(struct symtable *st, char *msg, int lineno); static int symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block, void *ast, int lineno); static int symtable_exit_block(struct symtable *st, void *ast); @@ -686,10 +689,10 @@ static int -symtable_warn(struct symtable *st, char *msg) +symtable_warn(struct symtable *st, char *msg, int lineno) { if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename, - st->st_cur->ste_lineno, NULL, NULL) < 0) { + lineno, NULL, NULL) < 0) { if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { PyErr_SetString(PyExc_SyntaxError, msg); PyErr_SyntaxLocation(st->st_filename, @@ -1028,7 +1031,7 @@ PyOS_snprintf(buf, sizeof(buf), GLOBAL_AFTER_USE, c_name); - if (!symtable_warn(st, buf)) + if (!symtable_warn(st, buf, s->lineno)) return 0; } if (!symtable_add_def(st, name, DEF_GLOBAL)) @@ -1277,8 +1280,8 @@ } else { if (st->st_cur->ste_type != ModuleBlock) { - if (!symtable_warn(st, - "import * only allowed at module level")) { + int lineno = st->st_cur->ste_lineno; + if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) { Py_DECREF(store_name); return 0; } From python-checkins at python.org Mon Dec 19 07:05:31 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 19 Dec 2005 07:05:31 +0100 (CET) Subject: [Python-checkins] commit of r41768 - in python/trunk: Modules/_hotshot.c Modules/_tkinter.c Modules/posixmodule.c Modules/pyexpat.c Modules/socketmodule.c Modules/stropmodule.c Parser/grammar.c Parser/tokenizer.c Python/ast.c Python/dynload_aix.c Python/getargs.c Message-ID: <20051219060531.009F31E4002@bag.python.org> Author: neal.norwitz Date: Mon Dec 19 07:05:18 2005 New Revision: 41768 Modified: python/trunk/Modules/_hotshot.c python/trunk/Modules/_tkinter.c python/trunk/Modules/posixmodule.c python/trunk/Modules/pyexpat.c python/trunk/Modules/socketmodule.c python/trunk/Modules/stropmodule.c python/trunk/Parser/grammar.c python/trunk/Parser/tokenizer.c python/trunk/Python/ast.c python/trunk/Python/dynload_aix.c python/trunk/Python/getargs.c Log: Fix SF bug #1072182, problems with signed characters. Most of these can be backported. Modified: python/trunk/Modules/_hotshot.c ============================================================================== --- python/trunk/Modules/_hotshot.c (original) +++ python/trunk/Modules/_hotshot.c Mon Dec 19 07:05:18 2005 @@ -1396,7 +1396,7 @@ char *buffer; int i = 0; - while (*rev && !isdigit((int)*rev)) + while (*rev && !isdigit(Py_CHARMASK(*rev))) ++rev; while (rev[i] != ' ' && rev[i] != '\0') ++i; Modified: python/trunk/Modules/_tkinter.c ============================================================================== --- python/trunk/Modules/_tkinter.c (original) +++ python/trunk/Modules/_tkinter.c Mon Dec 19 07:05:18 2005 @@ -636,7 +636,7 @@ } strcpy(argv0, className); - if (isupper((int)(argv0[0]))) + if (isupper(Py_CHARMASK((argv0[0])))) argv0[0] = tolower(argv0[0]); Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); ckfree(argv0); Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Mon Dec 19 07:05:18 2005 @@ -463,7 +463,7 @@ if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */ char *lastc = &msgbuf[ strlen(msgbuf)-1 ]; - while (lastc > msgbuf && isspace(*lastc)) + while (lastc > msgbuf && isspace(Py_CHARMASK(*lastc))) *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */ } Modified: python/trunk/Modules/pyexpat.c ============================================================================== --- python/trunk/Modules/pyexpat.c (original) +++ python/trunk/Modules/pyexpat.c Mon Dec 19 07:05:18 2005 @@ -1803,7 +1803,7 @@ char *rev = rcsid; int i = 0; - while (!isdigit((int)*rev)) + while (!isdigit(Py_CHARMASK(*rev))) ++rev; while (rev[i] != ' ' && rev[i] != '\0') ++i; Modified: python/trunk/Modules/socketmodule.c ============================================================================== --- python/trunk/Modules/socketmodule.c (original) +++ python/trunk/Modules/socketmodule.c Mon Dec 19 07:05:18 2005 @@ -506,7 +506,8 @@ if (strlen(outbuf) > 0) { /* If non-empty msg, trim CRLF */ char *lastc = &outbuf[ strlen(outbuf)-1 ]; - while (lastc > outbuf && isspace(*lastc)) { + while (lastc > outbuf && + isspace(Py_CHARMASK(*lastc))) { /* Trim trailing whitespace (CRLF) */ *lastc-- = '\0'; } Modified: python/trunk/Modules/stropmodule.c ============================================================================== --- python/trunk/Modules/stropmodule.c (original) +++ python/trunk/Modules/stropmodule.c Mon Dec 19 07:05:18 2005 @@ -757,7 +757,7 @@ x = (long) PyOS_strtoul(s, &end, base); else x = PyOS_strtol(s, &end, base); - if (end == s || !isalnum((int)end[-1])) + if (end == s || !isalnum(Py_CHARMASK(end[-1]))) goto bad; while (*end && isspace(Py_CHARMASK(*end))) end++; Modified: python/trunk/Parser/grammar.c ============================================================================== --- python/trunk/Parser/grammar.c (original) +++ python/trunk/Parser/grammar.c Mon Dec 19 07:05:18 2005 @@ -180,7 +180,8 @@ } if (lb->lb_type == STRING) { - if (isalpha((int)(lb->lb_str[1])) || lb->lb_str[1] == '_') { + if (isalpha(Py_CHARMASK(lb->lb_str[1])) || + lb->lb_str[1] == '_') { char *p; char *src; char *dest; Modified: python/trunk/Parser/tokenizer.c ============================================================================== --- python/trunk/Parser/tokenizer.c (original) +++ python/trunk/Parser/tokenizer.c Mon Dec 19 07:05:18 2005 @@ -229,7 +229,7 @@ } while (t[0] == '\x20' || t[0] == '\t'); begin = t; - while (isalnum((int)t[0]) || + while (isalnum(Py_CHARMASK(t[0])) || t[0] == '-' || t[0] == '_' || t[0] == '.') t++; Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Mon Dec 19 07:05:18 2005 @@ -2879,7 +2879,7 @@ parsestr(const char *s, const char *encoding) { size_t len; - int quote = *s; + int quote = Py_CHARMASK(*s); int rawmode = 0; int need_encoding; int unicode = 0; Modified: python/trunk/Python/dynload_aix.c ============================================================================== --- python/trunk/Python/dynload_aix.c (original) +++ python/trunk/Python/dynload_aix.c Mon Dec 19 07:05:18 2005 @@ -144,7 +144,7 @@ if (nerr == load_errtab[j].errNo && load_errtab[j].errstr) ERRBUF_APPEND(load_errtab[j].errstr); } - while (isdigit(*message[i])) message[i]++ ; + while (isdigit(Py_CHARMASK(*message[i]))) message[i]++ ; ERRBUF_APPEND(message[i]); ERRBUF_APPEND("\n"); } Modified: python/trunk/Python/getargs.c ============================================================================== --- python/trunk/Python/getargs.c (original) +++ python/trunk/Python/getargs.c Mon Dec 19 07:05:18 2005 @@ -166,7 +166,7 @@ if (level == 0) { if (c == 'O') max++; - else if (isalpha(c)) { + else if (isalpha(Py_CHARMASK(c))) { if (c != 'e') /* skip encoded */ max++; } else if (c == '|') @@ -255,7 +255,7 @@ } } - if (*format != '\0' && !isalpha((int)(*format)) && + if (*format != '\0' && !isalpha(Py_CHARMASK((*format))) && *format != '(' && *format != '|' && *format != ':' && *format != ';') { PyErr_Format(PyExc_SystemError, @@ -347,7 +347,7 @@ } else if (c == ':' || c == ';' || c == '\0') break; - else if (level == 0 && isalpha(c)) + else if (level == 0 && isalpha(Py_CHARMASK(c))) n++; } @@ -1223,7 +1223,7 @@ min = -1; max = 0; while ((i = *format++) != '\0') { - if (isalpha(i) && i != 'e') { + if (isalpha(Py_CHARMASK(i)) && i != 'e') { max++; if (*p == NULL) { PyErr_SetString(PyExc_RuntimeError, From python-checkins at python.org Mon Dec 19 07:07:16 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 19 Dec 2005 07:07:16 +0100 (CET) Subject: [Python-checkins] commit of r41769 - python/trunk/Misc/NEWS Message-ID: <20051219060716.BEEBF1E4002@bag.python.org> Author: neal.norwitz Date: Mon Dec 19 07:07:16 2005 New Revision: 41769 Modified: python/trunk/Misc/NEWS Log: Bug #1072182, fix some potential problems if characters are signed. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Mon Dec 19 07:07:16 2005 @@ -12,6 +12,8 @@ Core and builtins ----------------- +- Bug #1072182, fix some potential problems if characters are signed. + - Bug #889500, fix line number on SyntaxWarning for global declarations. - Bug #1378022, UTF-8 files with a leading BOM crashed the interpreter. From python-checkins at python.org Mon Dec 19 07:08:59 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 19 Dec 2005 07:08:59 +0100 (CET) Subject: [Python-checkins] commit of r41770 - python/trunk/Modules/_tkinter.c Message-ID: <20051219060859.00EA01E4002@bag.python.org> Author: neal.norwitz Date: Mon Dec 19 07:08:59 2005 New Revision: 41770 Modified: python/trunk/Modules/_tkinter.c Log: Remove extra parens Modified: python/trunk/Modules/_tkinter.c ============================================================================== --- python/trunk/Modules/_tkinter.c (original) +++ python/trunk/Modules/_tkinter.c Mon Dec 19 07:08:59 2005 @@ -636,7 +636,7 @@ } strcpy(argv0, className); - if (isupper(Py_CHARMASK((argv0[0])))) + if (isupper(Py_CHARMASK(argv0[0]))) argv0[0] = tolower(argv0[0]); Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); ckfree(argv0); From python-checkins at python.org Mon Dec 19 07:10:08 2005 From: python-checkins at python.org (neal.norwitz) Date: Mon, 19 Dec 2005 07:10:08 +0100 (CET) Subject: [Python-checkins] commit of r41771 - python/trunk/Python/getargs.c Message-ID: <20051219061008.7E69F1E4002@bag.python.org> Author: neal.norwitz Date: Mon Dec 19 07:10:07 2005 New Revision: 41771 Modified: python/trunk/Python/getargs.c Log: Remove extra parens Modified: python/trunk/Python/getargs.c ============================================================================== --- python/trunk/Python/getargs.c (original) +++ python/trunk/Python/getargs.c Mon Dec 19 07:10:07 2005 @@ -255,7 +255,7 @@ } } - if (*format != '\0' && !isalpha(Py_CHARMASK((*format))) && + if (*format != '\0' && !isalpha(Py_CHARMASK(*format)) && *format != '(' && *format != '|' && *format != ':' && *format != ';') { PyErr_Format(PyExc_SystemError, From martin at v.loewis.de Mon Dec 19 07:57:21 2005 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Mon, 19 Dec 2005 07:57:21 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.texModules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <43A5F46A.8040809@egenix.com> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> <1134910261.10353.14.camel@geddy.wooz.org> <43A57891.1080109@egenix.com> <43A5A656.5090504@v.loewis.de> <43A5F46A.8040809@egenix.com> Message-ID: <43A659D1.4000606@v.loewis.de> M.-A. Lemburg wrote: > Martin v. L?wis wrote: > >>M.-A. Lemburg wrote: >> >>>It's the users of tools which use the final distributed versions >>>which would run into problems they can't easily solve. >> >>In the final distributed version, this code is dead: there won't >>be a .svn directory to get information from. > > > Sorry, I was talking about compiled distributions versions. Neither was I: I was talking about the final distributed source versions. They will not contain a .svn directory, as they will be created through svn export. > These will contain the build number, right ? My current view is that the answer to this question is "no"; the build number should go away. > Or should we tell people to only distribute compiled versions > that were created from the source distribution ? (which then > have the .svn dir and thus no issues) No, the source distribution will not be a subversion working copy, just as it previously never was a CVS sandbox (i.e. it never contained a CVS directory). Regards, Martin From martin at v.loewis.de Mon Dec 19 08:00:25 2005 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Mon, 19 Dec 2005 08:00:25 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.texModules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <43A5F510.10106@egenix.com> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> <43A5A4CC.8070707@v.loewis.de> <43A5F510.10106@egenix.com> Message-ID: <43A65A89.9060200@v.loewis.de> M.-A. Lemburg wrote: > Right, but only if you haven't done an "svn update" right before > building the code. I would assume this to be the standard case > if you intend to build a binary distribution. Your assumption is (partially) wrong: if you do a binary distribution (of Python), you should be using the official tarball, not the subversion repository. I admit using CVS tags to create Windows binaries, but perhaps I should change my procedures to use the official tarball as well. Regards, Martin From mal at egenix.com Mon Dec 19 15:13:56 2005 From: mal at egenix.com (M.-A. Lemburg) Date: Mon, 19 Dec 2005 15:13:56 +0100 Subject: [Python-checkins] commit of r41744 - in python/trunk: Doc/api/init.texModules/getbuildinfo.c Python/sysmodule.c In-Reply-To: <43A659D1.4000606@v.loewis.de> References: <20051218012738.591CF1E4002@bag.python.org> <1134884285.10352.10.camel@geddy.wooz.org> <43A54F95.9060702@egenix.com> <1134910261.10353.14.camel@geddy.wooz.org> <43A57891.1080109@egenix.com> <43A5A656.5090504@v.loewis.de> <43A5F46A.8040809@egenix.com> <43A659D1.4000606@v.loewis.de> Message-ID: <43A6C024.7040706@egenix.com> Martin v. L?wis wrote: > M.-A. Lemburg wrote: >> Martin v. L?wis wrote: >> >>> M.-A. Lemburg wrote: >>> >>>> It's the users of tools which use the final distributed versions >>>> which would run into problems they can't easily solve. >>> In the final distributed version, this code is dead: there won't >>> be a .svn directory to get information from. >> >> Sorry, I was talking about compiled distributions versions. > > Neither was I: I was talking about the final distributed > source versions. They will not contain a .svn directory, > as they will be created through svn export. > >> These will contain the build number, right ? > > My current view is that the answer to this question is "no"; > the build number should go away. > >> Or should we tell people to only distribute compiled versions >> that were created from the source distribution ? (which then >> have the .svn dir and thus no issues) Shouldn't be writing emails late at night. This should have read: (which then *don't* have the .svn dir and thus no issues) > No, the source distribution will not be a subversion working > copy, just as it previously never was a CVS sandbox (i.e. > it never contained a CVS directory). -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Dec 19 2005) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From python-checkins at python.org Mon Dec 19 15:43:48 2005 From: python-checkins at python.org (barry.warsaw) Date: Mon, 19 Dec 2005 15:43:48 +0100 (CET) Subject: [Python-checkins] commit of r41772 - in python/trunk: Makefile.pre.in Modules/getbuildinfo.c Message-ID: <20051219144348.00A931E4002@bag.python.org> Author: barry.warsaw Date: Mon Dec 19 15:43:44 2005 New Revision: 41772 Modified: python/trunk/Makefile.pre.in python/trunk/Modules/getbuildinfo.c Log: Revert most of r41765. Don't use $Revision$ in Py_GetBuildNumber(). Keep the use of $(srcdir) in Makefile.pre.in so builds outside the source dir still work. Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Mon Dec 19 15:43:44 2005 @@ -351,7 +351,10 @@ $(srcdir)/Modules/getbuildinfo.c if test -d $(srcdir)/.svn; then \ svnversion $(srcdir) >buildno; \ - fi + elif test -f buildno; then \ + expr `cat buildno` + 1 >buildno1; \ + mv -f buildno1 buildno; \ + else echo 1 >buildno; fi # Build static library # avoid long command lines, same as LIBRARY_OBJS @@ -443,11 +446,7 @@ # Special rules for object files Modules/getbuildinfo.o: $(srcdir)/Modules/getbuildinfo.c buildno - if test -f buildno; then \ - $(CC) -c $(PY_CFLAGS) -DBUILD=\"`cat buildno`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ;\ - else \ - $(CC) -c $(PY_CFLAGS) -o $@ $(srcdir)/Modules/getbuildinfo.c ;\ - fi + $(CC) -c $(PY_CFLAGS) -DBUILD=\"`cat buildno`\" -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ Modified: python/trunk/Modules/getbuildinfo.c ============================================================================== --- python/trunk/Modules/getbuildinfo.c (original) +++ python/trunk/Modules/getbuildinfo.c Mon Dec 19 15:43:44 2005 @@ -21,38 +21,20 @@ #endif #ifndef BUILD -#define BUILD "$Revision$" +#define BUILD "0" #endif const char * -Py_GetBuildNumber(void) -{ - static char buildno[20]; - static int buildno_okay; - - if (!buildno_okay) { - char *build = BUILD; - int len = strlen(build); - - if (len > 13 && - !strncmp(build, "$Revision: ", 11) && - !strcmp(build + len - 2, " $")) - { - memcpy(buildno, build + 11, len - 13); - } - else { - memcpy(buildno, build, 19); - } - buildno_okay = 1; - } - return buildno; -} - -const char * Py_GetBuildInfo(void) { static char buildinfo[50]; PyOS_snprintf(buildinfo, sizeof(buildinfo), - "#%s, %.20s, %.9s", Py_GetBuildNumber(), DATE, TIME); + "%s, %.20s, %.9s", BUILD, DATE, TIME); return buildinfo; } + +const char * +Py_GetBuildNumber(void) +{ + return BUILD; +} From python-checkins at python.org Tue Dec 20 08:20:43 2005 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 20 Dec 2005 08:20:43 +0100 (CET) Subject: [Python-checkins] commit of r41773 - in python/branches/ssize_t: Include/object.h Modules/_elementtree.c Modules/arraymodule.c Modules/collectionsmodule.c Modules/mmapmodule.c Objects/bufferobject.c Objects/classobject.c Objects/listobject.c Objects/typeobject.c Python/getargs.c Message-ID: <20051220072043.7594F1E4002@bag.python.org> Author: martin.v.loewis Date: Tue Dec 20 08:20:38 2005 New Revision: 41773 Modified: python/branches/ssize_t/Include/object.h python/branches/ssize_t/Modules/_elementtree.c python/branches/ssize_t/Modules/arraymodule.c python/branches/ssize_t/Modules/collectionsmodule.c python/branches/ssize_t/Modules/mmapmodule.c python/branches/ssize_t/Objects/bufferobject.c python/branches/ssize_t/Objects/classobject.c python/branches/ssize_t/Objects/listobject.c python/branches/ssize_t/Objects/typeobject.c python/branches/ssize_t/Python/getargs.c Log: Make ass_item use Py_ssize_t also. Modified: python/branches/ssize_t/Include/object.h ============================================================================== --- python/branches/ssize_t/Include/object.h (original) +++ python/branches/ssize_t/Include/object.h Tue Dec 20 08:20:38 2005 @@ -135,7 +135,7 @@ typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); typedef int(*intobjargproc)(PyObject *, int, PyObject *); typedef int(*intintobjargproc)(PyObject *, int, int, PyObject *); -typedef int(*sizeobjargproc)(PyObject *, size_t, PyObject *); +typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *); typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); typedef Py_ssize_t (*getreadbufferproc)(PyObject *, int, void **); @@ -205,7 +205,7 @@ ssizeargfunc sq_repeat; ssizeargfunc sq_item; ssizessizeargfunc sq_slice; - sizeobjargproc sq_ass_item; + ssizeobjargproc sq_ass_item; ssizessizeobjargproc sq_ass_slice; objobjproc sq_contains; /* Added in release 2.0 */ Modified: python/branches/ssize_t/Modules/_elementtree.c ============================================================================== --- python/branches/ssize_t/Modules/_elementtree.c (original) +++ python/branches/ssize_t/Modules/_elementtree.c Tue Dec 20 08:20:38 2005 @@ -916,7 +916,7 @@ } static PyObject* -element_getitem(ElementObject* self, int index) +element_getitem(ElementObject* self, Py_ssize_t index) { if (!self->extra || index < 0 || index >= self->extra->length) { PyErr_SetString( @@ -931,9 +931,9 @@ } static PyObject* -element_getslice(ElementObject* self, int start, int end) +element_getslice(ElementObject* self, Py_ssize_t start, Py_ssize_t end) { - int i; + Py_ssize_t i; PyObject* list; if (!self->extra) @@ -1158,7 +1158,7 @@ } static int -element_setslice(ElementObject* self, int start, int end, PyObject* item) +element_setslice(ElementObject* self, Py_ssize_t start, Py_ssize_t end, PyObject* item) { int i, new, old; PyObject* recycle = NULL; @@ -2142,7 +2142,7 @@ for (i = 0; i < 256; i++) s[i] = i; - u = PyUnicode_Decode(s, 256, name, "replace"); + u = PyUnicode_Decode((char*)s, 256, name, "replace"); if (!u) return XML_STATUS_ERROR; Modified: python/branches/ssize_t/Modules/arraymodule.c ============================================================================== --- python/branches/ssize_t/Modules/arraymodule.c (original) +++ python/branches/ssize_t/Modules/arraymodule.c Tue Dec 20 08:20:38 2005 @@ -760,9 +760,8 @@ #undef b } -/* XXX should be ssize_t */ static int -array_ass_item(arrayobject *a, size_t i, PyObject *v) +array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v) { if (i < 0 || i >= a->ob_size) { PyErr_SetString(PyExc_IndexError, @@ -1707,7 +1706,7 @@ if (av->ob_size != slicelength) { PyErr_Format(PyExc_ValueError, "attempt to assign array of size %ld to extended slice of size %ld", - av->ob_size, slicelength); + /*XXX*/(long)av->ob_size, /*XXX*/(long)slicelength); return -1; } @@ -1786,7 +1785,7 @@ (ssizeargfunc)array_repeat, /*sq_repeat*/ (ssizeargfunc)array_item, /*sq_item*/ (ssizessizeargfunc)array_slice, /*sq_slice*/ - (sizeobjargproc)array_ass_item, /*sq_ass_item*/ + (ssizeobjargproc)array_ass_item, /*sq_ass_item*/ (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/ (objobjproc)array_contains, /*sq_contains*/ (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/ Modified: python/branches/ssize_t/Modules/collectionsmodule.c ============================================================================== --- python/branches/ssize_t/Modules/collectionsmodule.c (original) +++ python/branches/ssize_t/Modules/collectionsmodule.c Tue Dec 20 08:20:38 2005 @@ -314,7 +314,7 @@ "Extend the left side of the deque with elements from the iterable"); static int -_deque_rotate(dequeobject *deque, int n) +_deque_rotate(dequeobject *deque, Py_ssize_t n) { int i, len=deque->len, halflen=(len+1)>>1; PyObject *item, *rv; @@ -374,7 +374,7 @@ static PyObject * deque_remove(dequeobject *deque, PyObject *value) { - int i, n=deque->len; + Py_ssize_t i, n=deque->len; for (i=0 ; ileftblock->data[deque->leftindex]; @@ -469,7 +469,7 @@ */ static int -deque_del_item(dequeobject *deque, int i) +deque_del_item(dequeobject *deque, Py_ssize_t i) { PyObject *item; @@ -485,7 +485,7 @@ } static int -deque_ass_item(dequeobject *deque, int i, PyObject *v) +deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v) { PyObject *old_value; block *b; @@ -781,7 +781,7 @@ 0, /* sq_repeat */ (ssizeargfunc)deque_item, /* sq_item */ 0, /* sq_slice */ - (sizeobjargproc)deque_ass_item, /* sq_ass_item */ + (ssizeobjargproc)deque_ass_item, /* sq_ass_item */ }; /* deque object ********************************************************/ Modified: python/branches/ssize_t/Modules/mmapmodule.c ============================================================================== --- python/branches/ssize_t/Modules/mmapmodule.c (original) +++ python/branches/ssize_t/Modules/mmapmodule.c Tue Dec 20 08:20:38 2005 @@ -641,7 +641,7 @@ } static PyObject * -mmap_item(mmap_object *self, int i) +mmap_item(mmap_object *self, Py_ssize_t i) { CHECK_VALID(NULL); if (i < 0 || (size_t)i >= self->size) { @@ -652,7 +652,7 @@ } static PyObject * -mmap_slice(mmap_object *self, int ilow, int ihigh) +mmap_slice(mmap_object *self, Py_ssize_t ilow, Py_ssize_t ihigh) { CHECK_VALID(NULL); if (ilow < 0) @@ -679,7 +679,7 @@ } static PyObject * -mmap_repeat(mmap_object *self, int n) +mmap_repeat(mmap_object *self, Py_ssize_t n) { CHECK_VALID(NULL); PyErr_SetString(PyExc_SystemError, @@ -688,7 +688,7 @@ } static int -mmap_ass_slice(mmap_object *self, int ilow, int ihigh, PyObject *v) +mmap_ass_slice(mmap_object *self, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) { const char *buf; @@ -727,7 +727,7 @@ } static int -mmap_ass_item(mmap_object *self, int i, PyObject *v) +mmap_ass_item(mmap_object *self, Py_ssize_t i, PyObject *v) { const char *buf; @@ -757,10 +757,10 @@ (inquiry)mmap_length, /*sq_length*/ (binaryfunc)mmap_concat, /*sq_concat*/ (ssizeargfunc)mmap_repeat, /*sq_repeat*/ - (ssizeargfunc)mmap_item, /*sq_item*/ + (ssizeargfunc)mmap_item, /*sq_item*/ (ssizessizeargfunc)mmap_slice, /*sq_slice*/ - (sizeobjargproc)mmap_ass_item, /*sq_ass_item*/ - (ssizessizeobjargproc)mmap_ass_slice, /*sq_ass_slice*/ + (ssizeobjargproc)mmap_ass_item, /*sq_ass_item*/ + (ssizessizeobjargproc)mmap_ass_slice, /*sq_ass_slice*/ }; static PyBufferProcs mmap_as_buffer = { Modified: python/branches/ssize_t/Objects/bufferobject.c ============================================================================== --- python/branches/ssize_t/Objects/bufferobject.c (original) +++ python/branches/ssize_t/Objects/bufferobject.c Tue Dec 20 08:20:38 2005 @@ -445,7 +445,7 @@ if (!get_buf(self, &ptr1, &size)) return -1; - if (idx >= size) { + if (idx < 0 || idx >= size) { PyErr_SetString(PyExc_IndexError, "buffer assignment index out of range"); return -1; @@ -599,7 +599,7 @@ (ssizeargfunc)buffer_repeat, /*sq_repeat*/ (ssizeargfunc)buffer_item, /*sq_item*/ (ssizessizeargfunc)buffer_slice, /*sq_slice*/ - (sizeobjargproc)buffer_ass_item, /*sq_ass_item*/ + (ssizeobjargproc)buffer_ass_item, /*sq_ass_item*/ (ssizessizeobjargproc)buffer_ass_slice, /*sq_ass_slice*/ }; Modified: python/branches/ssize_t/Objects/classobject.c ============================================================================== --- python/branches/ssize_t/Objects/classobject.c (original) +++ python/branches/ssize_t/Objects/classobject.c Tue Dec 20 08:20:38 2005 @@ -1145,7 +1145,7 @@ static PyObject * -instance_slice(PyInstanceObject *inst, int i, int j) +instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j) { PyObject *func, *arg, *res; static PyObject *getslicestr; @@ -1179,7 +1179,7 @@ } static int -instance_ass_item(PyInstanceObject *inst, int i, PyObject *item) +instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item) { PyObject *func, *arg, *res; @@ -1213,7 +1213,7 @@ } static int -instance_ass_slice(PyInstanceObject *inst, int i, int j, PyObject *value) +instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value) { PyObject *func, *arg, *res; static PyObject *setslicestr, *delslicestr; @@ -1327,7 +1327,7 @@ 0, /* sq_repeat */ (ssizeargfunc)instance_item, /* sq_item */ (ssizessizeargfunc)instance_slice, /* sq_slice */ - (sizeobjargproc)instance_ass_item, /* sq_ass_item */ + (ssizeobjargproc)instance_ass_item, /* sq_ass_item */ (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */ (objobjproc)instance_contains, /* sq_contains */ }; Modified: python/branches/ssize_t/Objects/listobject.c ============================================================================== --- python/branches/ssize_t/Objects/listobject.c (original) +++ python/branches/ssize_t/Objects/listobject.c Tue Dec 20 08:20:38 2005 @@ -2438,7 +2438,7 @@ (ssizeargfunc)list_repeat, /* sq_repeat */ (ssizeargfunc)list_item, /* sq_item */ (ssizessizeargfunc)list_slice, /* sq_slice */ - (sizeobjargproc)list_ass_item, /* sq_ass_item */ + (ssizeobjargproc)list_ass_item, /* sq_ass_item */ (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */ (objobjproc)list_contains, /* sq_contains */ (binaryfunc)list_inplace_concat, /* sq_inplace_concat */ Modified: python/branches/ssize_t/Objects/typeobject.c ============================================================================== --- python/branches/ssize_t/Objects/typeobject.c (original) +++ python/branches/ssize_t/Objects/typeobject.c Tue Dec 20 08:20:38 2005 @@ -4102,7 +4102,7 @@ /* Super-optimized version of slot_sq_item. Other slots could do the same... */ static PyObject * -slot_sq_item(PyObject *self, int i) +slot_sq_item(PyObject *self, Py_ssize_t i) { static PyObject *getitem_str; PyObject *func, *args = NULL, *ival = NULL, *retval = NULL; @@ -4144,10 +4144,10 @@ return NULL; } -SLOT2(slot_sq_slice, "__getslice__", int, int, "ii") +SLOT2(slot_sq_slice, "__getslice__", Py_ssize_t, Py_ssize_t, "nn") static int -slot_sq_ass_item(PyObject *self, int index, PyObject *value) +slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) { PyObject *res; static PyObject *delitem_str, *setitem_str; @@ -4165,7 +4165,7 @@ } static int -slot_sq_ass_slice(PyObject *self, int i, int j, PyObject *value) +slot_sq_ass_slice(PyObject *self, Py_ssize_t i, Py_ssize_t j, PyObject *value) { PyObject *res; static PyObject *delslice_str, *setslice_str; Modified: python/branches/ssize_t/Python/getargs.c ============================================================================== --- python/branches/ssize_t/Python/getargs.c (original) +++ python/branches/ssize_t/Python/getargs.c Tue Dec 20 08:20:38 2005 @@ -652,7 +652,7 @@ break; } #endif - /* Fall through from 'L' to 'l' if Py_ssize_t is int */ + /* Fall through from 'n' to 'l' if Py_ssize_t is int */ case 'l': {/* long int */ long *p = va_arg(*p_va, long *); long ival; From python-checkins at python.org Tue Dec 20 09:52:22 2005 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 20 Dec 2005 09:52:22 +0100 (CET) Subject: [Python-checkins] commit of r41774 - python/branches/ssize_t/Modules/_elementtree.c Message-ID: <20051220085222.ABF0D1E4002@bag.python.org> Author: martin.v.loewis Date: Tue Dec 20 09:52:16 2005 New Revision: 41774 Modified: python/branches/ssize_t/Modules/_elementtree.c Log: Use Py_ssize_t in setitem. Modified: python/branches/ssize_t/Modules/_elementtree.c ============================================================================== --- python/branches/ssize_t/Modules/_elementtree.c (original) +++ python/branches/ssize_t/Modules/_elementtree.c Tue Dec 20 09:52:16 2005 @@ -1228,7 +1228,7 @@ } static int -element_setitem(ElementObject* self, size_t index, PyObject* item) +element_setitem(ElementObject* self, Py_ssize_t index, PyObject* item) { int i; PyObject* old; @@ -1373,7 +1373,7 @@ 0, /* sq_repeat */ (ssizeargfunc) element_getitem, (ssizessizeargfunc) element_getslice, - (sizeobjargproc) element_setitem, + (ssizeobjargproc) element_setitem, (ssizessizeobjargproc) element_setslice, }; From python-checkins at python.org Tue Dec 20 10:32:38 2005 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 20 Dec 2005 10:32:38 +0100 (CET) Subject: [Python-checkins] commit of r41775 - in python/branches/ssize_t: Modules/posixmodule.c Objects/bufferobject.c Objects/listobject.c Objects/obmalloc.c Objects/stringobject.c Python/getargs.c Message-ID: <20051220093238.ABFE01E4002@bag.python.org> Author: martin.v.loewis Date: Tue Dec 20 10:32:34 2005 New Revision: 41775 Modified: python/branches/ssize_t/Modules/posixmodule.c python/branches/ssize_t/Objects/bufferobject.c python/branches/ssize_t/Objects/listobject.c python/branches/ssize_t/Objects/obmalloc.c python/branches/ssize_t/Objects/stringobject.c python/branches/ssize_t/Python/getargs.c Log: Revert a number of unnecessary changes; fix bugs. Modified: python/branches/ssize_t/Modules/posixmodule.c ============================================================================== --- python/branches/ssize_t/Modules/posixmodule.c (original) +++ python/branches/ssize_t/Modules/posixmodule.c Tue Dec 20 10:32:34 2005 @@ -4220,7 +4220,7 @@ char modulepath[_MAX_PATH]; struct stat statinfo; GetModuleFileName(NULL, modulepath, sizeof(modulepath)); - for (x = i = 0; modulepath[i]; i++) + for (i = x = 0; modulepath[i]; i++) if (modulepath[i] == SEP) x = i+1; modulepath[x] = '\0'; Modified: python/branches/ssize_t/Objects/bufferobject.c ============================================================================== --- python/branches/ssize_t/Objects/bufferobject.c (original) +++ python/branches/ssize_t/Objects/bufferobject.c Tue Dec 20 10:32:34 2005 @@ -402,7 +402,7 @@ int size; if (!get_buf(self, &ptr, &size)) return NULL; - if (idx < 0 || idx >= size ) { + if ( idx < 0 || idx >= size ) { PyErr_SetString(PyExc_IndexError, "buffer index out of range"); return NULL; } Modified: python/branches/ssize_t/Objects/listobject.c ============================================================================== --- python/branches/ssize_t/Objects/listobject.c (original) +++ python/branches/ssize_t/Objects/listobject.c Tue Dec 20 10:32:34 2005 @@ -138,7 +138,7 @@ PyErr_BadInternalCall(); return NULL; } - if (i >= ((PyListObject *)op) -> ob_size) { + if (i < 0 || i >= ((PyListObject *)op) -> ob_size) { if (indexerr == NULL) indexerr = PyString_FromString( "list index out of range"); @@ -159,7 +159,7 @@ PyErr_BadInternalCall(); return -1; } - if (i >= ((PyListObject *)op) -> ob_size) { + if (i < 0 || i >= ((PyListObject *)op) -> ob_size) { Py_XDECREF(newitem); PyErr_SetString(PyExc_IndexError, "list assignment index out of range"); Modified: python/branches/ssize_t/Objects/obmalloc.c ============================================================================== --- python/branches/ssize_t/Objects/obmalloc.c (original) +++ python/branches/ssize_t/Objects/obmalloc.c Tue Dec 20 10:32:34 2005 @@ -541,8 +541,8 @@ /* This is only useful when running memory debuggers such as * Purify or Valgrind. Uncomment to use. * -#define Py_USING_MEMORY_DEBUGGER */ +#define Py_USING_MEMORY_DEBUGGER #ifdef Py_USING_MEMORY_DEBUGGER Modified: python/branches/ssize_t/Objects/stringobject.c ============================================================================== --- python/branches/ssize_t/Objects/stringobject.c (original) +++ python/branches/ssize_t/Objects/stringobject.c Tue Dec 20 10:32:34 2005 @@ -3900,17 +3900,17 @@ if (args->ob_type->tp_as_mapping && !PyTuple_Check(args) && !PyObject_TypeCheck(args, &PyBaseString_Type)) dict = args; - while (fmtcnt-- != 0) { + while (--fmtcnt >= 0) { if (*fmt != '%') { - if (rescnt == 0) { + if (--rescnt < 0) { rescnt = fmtcnt + 100; reslen += rescnt; if (_PyString_Resize(&result, reslen) < 0) return NULL; res = PyString_AS_STRING(result) + reslen - rescnt; + --rescnt; } - rescnt--; *res++ = *fmt++; } else { @@ -4192,7 +4192,7 @@ } if (width < len) width = len; - if ((rescnt - (sign != 0)) < width) { + if (rescnt - (sign != 0) < width) { reslen -= rescnt; rescnt = width + fmtcnt + 100; reslen += rescnt; Modified: python/branches/ssize_t/Python/getargs.c ============================================================================== --- python/branches/ssize_t/Python/getargs.c (original) +++ python/branches/ssize_t/Python/getargs.c Tue Dec 20 10:32:34 2005 @@ -1144,7 +1144,6 @@ const char **p = va_arg(*p_va, const char **); PyBufferProcs *pb = arg->ob_type->tp_as_buffer; int count; - FETCH_SIZE; if (*format++ != '#') return converterr( @@ -1166,7 +1165,10 @@ count = pb->bf_getcharbuffer(arg, 0, p); if (count < 0) return converterr("(unspecified)", arg, msgbuf, bufsize); - STORE_SIZE(count); + { + FETCH_SIZE; + STORE_SIZE(count); + } break; } From python-checkins at python.org Tue Dec 20 17:21:51 2005 From: python-checkins at python.org (phillip.eby) Date: Tue, 20 Dec 2005 17:21:51 +0100 (CET) Subject: [Python-checkins] commit of r41776 - sandbox/trunk/setuptools/setup.py Message-ID: <20051220162151.9CAC11E4016@bag.python.org> Author: phillip.eby Date: Tue Dec 20 17:21:50 2005 New Revision: 41776 Modified: sandbox/trunk/setuptools/setup.py Log: Changes so that upgrading an existing setuptools to a development version doesn't lose its entry points by using the already-installed setuptools as a basis for generating them. Modified: sandbox/trunk/setuptools/setup.py ============================================================================== --- sandbox/trunk/setuptools/setup.py (original) +++ sandbox/trunk/setuptools/setup.py Tue Dec 20 17:21:50 2005 @@ -15,10 +15,13 @@ f.close() return ''.join(lines) +from distutils.util import convert_path +d = {}; execfile(convert_path('setuptools/command/__init__.py'), d) +SETUP_COMMANDS = d['__all__'] + VERSION = "0.6a9" from setuptools import setup, find_packages import sys -from setuptools.command import __all__ as SETUP_COMMANDS scripts = [] if sys.platform != "win32": scripts = ["easy_install.py"] # for backward compatibility only @@ -35,8 +38,9 @@ keywords = "CPAN PyPI distutils eggs package management", url = "http://peak.telecommunity.com/DevCenter/setuptools", test_suite = 'setuptools.tests.test_suite', + packages = find_packages(), - include_package_data = True, + package_data = {'setuptools':'*.exe'}, py_modules = ['pkg_resources', 'easy_install', 'site'], zip_safe = False, # We want 'python -m easy_install' to work, for now :( @@ -76,10 +80,6 @@ - - - - classifiers = [f.strip() for f in """ Development Status :: 3 - Alpha Intended Audience :: Developers From python-checkins at python.org Tue Dec 20 17:31:29 2005 From: python-checkins at python.org (phillip.eby) Date: Tue, 20 Dec 2005 17:31:29 +0100 (CET) Subject: [Python-checkins] commit of r41777 - sandbox/trunk/setuptools/setuptools/command/install_scripts.py Message-ID: <20051220163129.8BD3B1E4007@bag.python.org> Author: phillip.eby Date: Tue Dec 20 17:31:29 2005 New Revision: 41777 Modified: sandbox/trunk/setuptools/setuptools/command/install_scripts.py Log: Fix "legacy mode" trying to install scripts when there are none. Modified: sandbox/trunk/setuptools/setuptools/command/install_scripts.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install_scripts.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install_scripts.py Tue Dec 20 17:31:29 2005 @@ -5,14 +5,15 @@ import os from distutils import log - class install_scripts(_install_scripts): """Do normal script install, plus any egg_info wrapper scripts""" def run(self): self.run_command("egg_info") - _install_scripts.run(self) # run first to set up self.outfiles - + if self.distribution.scripts: + _install_scripts.run(self) # run first to set up self.outfiles + else: + self.outfiles = [] ei_cmd = self.get_finalized_command("egg_info") dist = Distribution( ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), From python-checkins at python.org Tue Dec 20 17:48:49 2005 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 20 Dec 2005 17:48:49 +0100 (CET) Subject: [Python-checkins] commit of r41778 - python/branches/ssize_t/PC/pyconfig.h Message-ID: <20051220164849.7B0BF1E4002@bag.python.org> Author: martin.v.loewis Date: Tue Dec 20 17:48:48 2005 New Revision: 41778 Modified: python/branches/ssize_t/PC/pyconfig.h Log: Port ssize_t patch to Windows Modified: python/branches/ssize_t/PC/pyconfig.h ============================================================================== --- python/branches/ssize_t/PC/pyconfig.h (original) +++ python/branches/ssize_t/PC/pyconfig.h Tue Dec 20 17:48:48 2005 @@ -117,6 +117,14 @@ #endif #endif /* MS_WIN64 */ +/* Define like size_t, omitting the "unsigned" */ +#ifdef MS_WIN64 +typedef __int64 ssize_t; +#else +typedef _W64 int ssize_t; +#endif +#define HAVE_SSIZE_T 1 + #if defined(MS_WIN32) && !defined(MS_WIN64) #ifdef _M_IX86 #define COMPILER _Py_PASTE_VERSION("32 bit (Intel)") @@ -253,6 +261,7 @@ # define SIZEOF_OFF_T 4 # define SIZEOF_FPOS_T 8 # define SIZEOF_HKEY 8 +# define SIZEOF_SIZE_T 8 /* configure.in defines HAVE_LARGEFILE_SUPPORT iff HAVE_LONG_LONG, sizeof(off_t) > sizeof(long), and sizeof(PY_LONG_LONG) >= sizeof(off_t). On Win64 the second condition is not true, but if fpos_t replaces off_t @@ -267,6 +276,7 @@ # define SIZEOF_OFF_T 4 # define SIZEOF_FPOS_T 8 # define SIZEOF_HKEY 4 +# define SIZEOF_SIZE_T 4 #endif #ifdef _DEBUG From python-checkins at python.org Tue Dec 20 18:11:51 2005 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 20 Dec 2005 18:11:51 +0100 (CET) Subject: [Python-checkins] commit of r41779 - python/branches/ssize_t/Modules/_codecsmodule.c Message-ID: <20051220171151.B95E91E4002@bag.python.org> Author: martin.v.loewis Date: Tue Dec 20 18:11:50 2005 New Revision: 41779 Modified: python/branches/ssize_t/Modules/_codecsmodule.c Log: Add missing Py_ssize_t redeclarations. Modified: python/branches/ssize_t/Modules/_codecsmodule.c ============================================================================== --- python/branches/ssize_t/Modules/_codecsmodule.c (original) +++ python/branches/ssize_t/Modules/_codecsmodule.c Tue Dec 20 18:11:50 2005 @@ -266,7 +266,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; if (!PyArg_ParseTuple(args, "t#|z:utf_7_decode", @@ -282,7 +282,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; int final = 0; Py_ssize_t consumed; @@ -309,7 +309,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; int byteorder = 0; int final = 0; @@ -337,7 +337,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; int byteorder = -1; int final = 0; @@ -367,7 +367,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; int byteorder = 1; int final = 0; @@ -403,7 +403,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; int byteorder = 0; PyObject *unicode, *tuple; @@ -433,7 +433,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; if (!PyArg_ParseTuple(args, "t#|z:unicode_escape_decode", @@ -449,7 +449,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; if (!PyArg_ParseTuple(args, "t#|z:raw_unicode_escape_decode", @@ -465,7 +465,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; if (!PyArg_ParseTuple(args, "t#|z:latin_1_decode", @@ -481,7 +481,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; if (!PyArg_ParseTuple(args, "t#|z:ascii_decode", @@ -497,7 +497,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; PyObject *mapping = NULL; @@ -518,7 +518,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; if (!PyArg_ParseTuple(args, "t#|z:mbcs_decode", @@ -554,7 +554,7 @@ PyObject *args) { const char *data; - int size; + Py_ssize_t size; const char *errors = NULL; if (!PyArg_ParseTuple(args, "t#|z:charbuffer_encode", From python-checkins at python.org Tue Dec 20 18:18:31 2005 From: python-checkins at python.org (phillip.eby) Date: Tue, 20 Dec 2005 18:18:31 +0100 (CET) Subject: [Python-checkins] commit of r41780 - sandbox/trunk/setuptools/setup.py Message-ID: <20051220171831.F29D31E4002@bag.python.org> Author: phillip.eby Date: Tue Dec 20 18:18:31 2005 New Revision: 41780 Modified: sandbox/trunk/setuptools/setup.py Log: Fix typo. :( Modified: sandbox/trunk/setuptools/setup.py ============================================================================== --- sandbox/trunk/setuptools/setup.py (original) +++ sandbox/trunk/setuptools/setup.py Tue Dec 20 18:18:31 2005 @@ -40,7 +40,7 @@ test_suite = 'setuptools.tests.test_suite', packages = find_packages(), - package_data = {'setuptools':'*.exe'}, + package_data = {'setuptools':['*.exe']}, py_modules = ['pkg_resources', 'easy_install', 'site'], zip_safe = False, # We want 'python -m easy_install' to work, for now :( From python-checkins at python.org Tue Dec 20 23:58:22 2005 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 20 Dec 2005 23:58:22 +0100 (CET) Subject: [Python-checkins] commit of r41781 - python/branches/ssize_t/Include/unicodeobject.h Message-ID: <20051220225822.E42FE1E4002@bag.python.org> Author: martin.v.loewis Date: Tue Dec 20 23:58:21 2005 New Revision: 41781 Modified: python/branches/ssize_t/Include/unicodeobject.h Log: Make Unicode size Py_ssize_t. Modified: python/branches/ssize_t/Include/unicodeobject.h ============================================================================== --- python/branches/ssize_t/Include/unicodeobject.h (original) +++ python/branches/ssize_t/Include/unicodeobject.h Tue Dec 20 23:58:21 2005 @@ -372,7 +372,7 @@ typedef struct { PyObject_HEAD - int length; /* Length of raw Unicode data in buffer */ + Py_ssize_t length; /* Length of raw Unicode data in buffer */ Py_UNICODE *str; /* Raw Unicode buffer */ long hash; /* Hash value; -1 if not set */ PyObject *defenc; /* (Default) Encoded version as Python From python-checkins at python.org Wed Dec 21 00:57:26 2005 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 21 Dec 2005 00:57:26 +0100 (CET) Subject: [Python-checkins] commit of r41782 - python/branches/ssize_t/Objects/listobject.c Message-ID: <20051220235726.A6AB21E4002@bag.python.org> Author: martin.v.loewis Date: Wed Dec 21 00:57:25 2005 New Revision: 41782 Modified: python/branches/ssize_t/Objects/listobject.c Log: Use Py_ssize_t throughout. Modified: python/branches/ssize_t/Objects/listobject.c ============================================================================== --- python/branches/ssize_t/Objects/listobject.c (original) +++ python/branches/ssize_t/Objects/listobject.c Wed Dec 21 00:57:25 2005 @@ -26,7 +26,7 @@ { PyObject **items; size_t new_allocated; - int allocated = self->allocated; + Py_ssize_t allocated = self->allocated; /* Bypass realloc() when a previous overallocation is large enough to accommodate the newsize. If the newsize falls lower than half @@ -175,7 +175,7 @@ static int ins1(PyListObject *self, Py_ssize_t where, PyObject *v) { - int i, n = self->ob_size; + Py_ssize_t i, n = self->ob_size; PyObject **items; if (v == NULL) { PyErr_BadInternalCall(); @@ -218,7 +218,7 @@ static int app1(PyListObject *self, PyObject *v) { - int n = PyList_GET_SIZE(self); + Py_ssize_t n = PyList_GET_SIZE(self); assert (v != NULL); if (n == INT_MAX) { @@ -249,7 +249,7 @@ static void list_dealloc(PyListObject *op) { - int i; + Py_ssize_t i; PyObject_GC_UnTrack(op); Py_TRASHCAN_SAFE_BEGIN(op) if (op->ob_item != NULL) { @@ -273,7 +273,7 @@ static int list_print(PyListObject *op, FILE *fp, int flags) { - int i; + Py_ssize_t i; i = Py_ReprEnter((PyObject*)op); if (i != 0) { @@ -299,7 +299,7 @@ static PyObject * list_repr(PyListObject *v) { - int i; + Py_ssize_t i; PyObject *s, *temp; PyObject *pieces = NULL, *result = NULL; @@ -372,7 +372,8 @@ static int list_contains(PyListObject *a, PyObject *el) { - int i, cmp; + Py_ssize_t i; + int cmp; for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i) cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i), @@ -399,7 +400,7 @@ { PyListObject *np; PyObject **src, **dest; - int i, len; + Py_ssize_t i, len; if (ilow < 0) ilow = 0; else if (ilow > a->ob_size) @@ -436,8 +437,8 @@ static PyObject * list_concat(PyListObject *a, PyObject *bb) { - int size; - int i; + Py_ssize_t size; + Py_ssize_t i; PyObject **src, **dest; PyListObject *np; if (!PyList_Check(bb)) { @@ -475,8 +476,8 @@ static PyObject * list_repeat(PyListObject *a, Py_ssize_t n) { - int i, j; - int size; + Py_ssize_t i, j; + Py_ssize_t size; PyListObject *np; PyObject **p, **items; PyObject *elem; @@ -515,7 +516,7 @@ static int list_clear(PyListObject *a) { - int i; + Py_ssize_t i; PyObject **item = a->ob_item; if (item != NULL) { /* Because XDECREF can recursively invoke operations on @@ -555,10 +556,10 @@ PyObject **item; PyObject **vitem = NULL; PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */ - int n; /* # of elements in replacement list */ - int norig; /* # of elements in list getting replaced */ - int d; /* Change in size */ - int k; + Py_ssize_t n; /* # of elements in replacement list */ + Py_ssize_t norig; /* # of elements in list getting replaced */ + Py_ssize_t d; /* Change in size */ + Py_ssize_t k; size_t s; int result = -1; /* guilty until proved innocent */ #define b ((PyListObject *)v) @@ -653,7 +654,7 @@ list_inplace_repeat(PyListObject *self, Py_ssize_t n) { PyObject **items; - int size, i, j, p; + Py_ssize_t size, i, j, p; size = PyList_GET_SIZE(self); @@ -705,7 +706,7 @@ static PyObject * listinsert(PyListObject *self, PyObject *args) { - int i; + Py_ssize_t i; PyObject *v; if (!PyArg_ParseTuple(args, "iO:insert", &i, &v)) return NULL; @@ -726,10 +727,10 @@ listextend(PyListObject *self, PyObject *b) { PyObject *it; /* iter(v) */ - int m; /* size of self */ - int n; /* guess for size of b */ - int mn; /* m + n */ - int i; + Py_ssize_t m; /* size of self */ + Py_ssize_t n; /* guess for size of b */ + Py_ssize_t mn; /* m + n */ + Py_ssize_t i; PyObject *(*iternext)(PyObject *); /* Special cases: @@ -858,7 +859,7 @@ static PyObject * listpop(PyListObject *self, PyObject *args) { - int i = -1; + Py_ssize_t i = -1; PyObject *v, *arg = NULL; int status; @@ -866,7 +867,7 @@ return NULL; if (arg != NULL) { if (PyInt_Check(arg)) - i = (int)(PyInt_AS_LONG((PyIntObject*) arg)); + i = PyInt_AS_LONG((PyIntObject*) arg); else if (!PyArg_ParseTuple(args, "|i:pop", &i)) return NULL; } @@ -929,7 +930,7 @@ { PyObject *res; PyObject *args; - int i; + Py_ssize_t i; assert(compare != NULL); /* Call the user's comparison function and translate the 3-way @@ -988,7 +989,7 @@ binarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare) /* compare -- comparison function object, or NULL for default */ { - register int k; + register Py_ssize_t k; register PyObject **l, **p, **r; register PyObject *pivot; @@ -1053,8 +1054,8 @@ static int count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending) { - int k; - int n; + Py_ssize_t k; + Py_ssize_t n; assert(lo < hi); *descending = 0; @@ -1105,12 +1106,12 @@ Returns -1 on error. See listsort.txt for info on the method. */ -static int -gallop_left(PyObject *key, PyObject **a, int n, int hint, PyObject *compare) +static Py_ssize_t +gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare) { - int ofs; - int lastofs; - int k; + Py_ssize_t ofs; + Py_ssize_t lastofs; + Py_ssize_t k; assert(key && a && n > 0 && hint >= 0 && hint < n); @@ -1121,7 +1122,7 @@ /* a[hint] < key -- gallop right, until * a[hint + lastofs] < key <= a[hint + ofs] */ - const int maxofs = n - hint; /* &a[n-1] is highest */ + const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */ while (ofs < maxofs) { IFLT(a[ofs], key) { lastofs = ofs; @@ -1142,7 +1143,7 @@ /* key <= a[hint] -- gallop left, until * a[hint - ofs] < key <= a[hint - lastofs] */ - const int maxofs = hint + 1; /* &a[0] is lowest */ + const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */ while (ofs < maxofs) { IFLT(*(a-ofs), key) break; @@ -1168,7 +1169,7 @@ */ ++lastofs; while (lastofs < ofs) { - int m = lastofs + ((ofs - lastofs) >> 1); + Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1); IFLT(a[m], key) lastofs = m+1; /* a[m] < key */ @@ -1196,12 +1197,12 @@ we're sticking to "<" comparisons that it's much harder to follow if written as one routine with yet another "left or right?" flag. */ -static int -gallop_right(PyObject *key, PyObject **a, int n, int hint, PyObject *compare) +static Py_ssize_t +gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare) { - int ofs; - int lastofs; - int k; + Py_ssize_t ofs; + Py_ssize_t lastofs; + Py_ssize_t k; assert(key && a && n > 0 && hint >= 0 && hint < n); @@ -1212,7 +1213,7 @@ /* key < a[hint] -- gallop left, until * a[hint - ofs] <= key < a[hint - lastofs] */ - const int maxofs = hint + 1; /* &a[0] is lowest */ + const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */ while (ofs < maxofs) { IFLT(key, *(a-ofs)) { lastofs = ofs; @@ -1234,7 +1235,7 @@ /* a[hint] <= key -- gallop right, until * a[hint + lastofs] <= key < a[hint + ofs] */ - const int maxofs = n - hint; /* &a[n-1] is highest */ + const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */ while (ofs < maxofs) { IFLT(key, a[ofs]) break; @@ -1259,7 +1260,7 @@ */ ++lastofs; while (lastofs < ofs) { - int m = lastofs + ((ofs - lastofs) >> 1); + Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1); IFLT(key, a[m]) ofs = m; /* key < a[m] */ @@ -1294,7 +1295,7 @@ */ struct s_slice { PyObject **base; - int len; + Py_ssize_t len; }; typedef struct s_MergeState { @@ -1305,13 +1306,13 @@ * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for * random data, and lower for highly structured data. */ - int min_gallop; + Py_ssize_t min_gallop; /* 'a' is temp storage to help with merges. It contains room for * alloced entries. */ PyObject **a; /* may point to temparray below */ - int alloced; + Py_ssize_t alloced; /* A stack of n pending runs yet to be merged. Run #i starts at * address base[i] and extends for len[i] elements. It's always @@ -1359,7 +1360,7 @@ * Returns 0 on success and -1 if the memory can't be gotten. */ static int -merge_getmem(MergeState *ms, int need) +merge_getmem(MergeState *ms, Py_ssize_t need) { assert(ms != NULL); if (need <= ms->alloced) @@ -1389,7 +1390,7 @@ static int merge_lo(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb) { - int k; + Py_ssize_t k; PyObject *compare; PyObject **dest; int result = -1; /* guilty until proved innocent */ @@ -1411,8 +1412,8 @@ compare = ms->compare; for (;;) { - int acount = 0; /* # of times A won in a row */ - int bcount = 0; /* # of times B won in a row */ + Py_ssize_t acount = 0; /* # of times A won in a row */ + Py_ssize_t bcount = 0; /* # of times B won in a row */ /* Do the straightforward thing until (if ever) one run * appears to win consistently. @@ -1518,15 +1519,15 @@ * Return 0 if successful, -1 if error. */ static int -merge_hi(MergeState *ms, PyObject **pa, int na, PyObject **pb, int nb) +merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb) { - int k; + Py_ssize_t k; PyObject *compare; PyObject **dest; int result = -1; /* guilty until proved innocent */ PyObject **basea; PyObject **baseb; - int min_gallop = ms->min_gallop; + Py_ssize_t min_gallop = ms->min_gallop; assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb); if (MERGE_GETMEM(ms, nb) < 0) @@ -1547,8 +1548,8 @@ compare = ms->compare; for (;;) { - int acount = 0; /* # of times A won in a row */ - int bcount = 0; /* # of times B won in a row */ + Py_ssize_t acount = 0; /* # of times A won in a row */ + Py_ssize_t bcount = 0; /* # of times B won in a row */ /* Do the straightforward thing until (if ever) one run * appears to win consistently. @@ -1655,11 +1656,11 @@ * Returns 0 on success, -1 on error. */ static int -merge_at(MergeState *ms, int i) +merge_at(MergeState *ms, Py_ssize_t i) { PyObject **pa, **pb; - int na, nb; - int k; + Py_ssize_t na, nb; + Py_ssize_t k; PyObject *compare; assert(ms != NULL); @@ -1728,7 +1729,7 @@ assert(ms); while (ms->n > 1) { - int n = ms->n - 2; + Py_ssize_t n = ms->n - 2; if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) { if (p[n-1].len < p[n+1].len) --n; @@ -1757,7 +1758,7 @@ assert(ms); while (ms->n > 1) { - int n = ms->n - 2; + Py_ssize_t n = ms->n - 2; if (n > 0 && p[n-1].len < p[n+1].len) --n; if (merge_at(ms, n) < 0) @@ -1776,10 +1777,10 @@ * * See listsort.txt for more info. */ -static int -merge_compute_minrun(int n) +static Py_ssize_t +merge_compute_minrun(Py_ssize_t n) { - int r = 0; /* becomes 1 if any 1 bits are shifted off */ + Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */ assert(n >= 0); while (n >= 64) { @@ -1805,7 +1806,7 @@ static PyTypeObject sortwrapper_type; static PyObject * -sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op) +sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, Py_ssize_t op) { if (!PyObject_TypeCheck(b, &sortwrapper_type)) { PyErr_SetString(PyExc_TypeError, @@ -1972,16 +1973,16 @@ { MergeState ms; PyObject **lo, **hi; - int nremaining; - int minrun; - int saved_ob_size, saved_allocated; + Py_ssize_t nremaining; + Py_ssize_t minrun; + Py_ssize_t saved_ob_size, saved_allocated; PyObject **saved_ob_item; PyObject **final_ob_item; PyObject *compare = NULL; PyObject *result = NULL; /* guilty until proved innocent */ int reverse = 0; PyObject *keyfunc = NULL; - int i; + Py_ssize_t i; PyObject *key, *value, *kvpair; static const char *kwlist[] = {"cmp", "key", "reverse", 0}; @@ -2055,7 +2056,7 @@ minrun = merge_compute_minrun(nremaining); do { int descending; - int n; + Py_ssize_t n; /* Identify next run. */ n = count_run(lo, hi, compare, &descending); @@ -2065,7 +2066,7 @@ reverse_slice(lo, lo + n); /* If short, extend to min(minrun, nremaining). */ if (n < minrun) { - const int force = nremaining <= minrun ? + const Py_ssize_t force = nremaining <= minrun ? nremaining : minrun; if (binarysort(lo, lo + force, lo + n, compare) < 0) goto fail; @@ -2177,7 +2178,7 @@ { PyObject *w; PyObject **p; - int n; + Py_ssize_t n; if (v == NULL || !PyList_Check(v)) { PyErr_BadInternalCall(); return NULL; @@ -2200,7 +2201,7 @@ static PyObject * listindex(PyListObject *self, PyObject *args) { - int i, start=0, stop=self->ob_size; + Py_ssize_t i, start=0, stop=self->ob_size; PyObject *v; if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, @@ -2220,7 +2221,7 @@ for (i = start; i < stop && i < self->ob_size; i++) { int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); if (cmp > 0) - return PyInt_FromLong((long)i); + return PyInt_FromSsize_t(i); else if (cmp < 0) return NULL; } @@ -2231,8 +2232,8 @@ static PyObject * listcount(PyListObject *self, PyObject *v) { - int count = 0; - int i; + Py_ssize_t count = 0; + Py_ssize_t i; for (i = 0; i < self->ob_size; i++) { int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); @@ -2241,13 +2242,13 @@ else if (cmp < 0) return NULL; } - return PyInt_FromLong((long)count); + return PyInt_FromSsize_t(count); } static PyObject * listremove(PyListObject *self, PyObject *v) { - int i; + Py_ssize_t i; for (i = 0; i < self->ob_size; i++) { int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); @@ -2267,7 +2268,7 @@ static int list_traverse(PyListObject *o, visitproc visit, void *arg) { - int i, err; + Py_ssize_t i, err; PyObject *x; for (i = o->ob_size; --i >= 0; ) { @@ -2285,7 +2286,7 @@ list_richcompare(PyObject *v, PyObject *w, int op) { PyListObject *vl, *wl; - int i; + Py_ssize_t i; if (!PyList_Check(v) || !PyList_Check(w)) { Py_INCREF(Py_NotImplemented); @@ -2318,8 +2319,8 @@ if (i >= vl->ob_size || i >= wl->ob_size) { /* No more items to compare -- compare sizes */ - int vs = vl->ob_size; - int ws = wl->ob_size; + Py_ssize_t vs = vl->ob_size; + Py_ssize_t ws = wl->ob_size; int cmp; PyObject *res; switch (op) { @@ -2535,7 +2536,7 @@ if (value == NULL) { /* delete slice */ PyObject **garbage; - int cur, i; + Py_ssize_t cur, i; if (slicelength <= 0) return 0; @@ -2554,7 +2555,7 @@ for (cur = start, i = 0; cur < stop; cur += step, i++) { - int lim = step; + Py_ssize_t lim = step; garbage[i] = PyList_GET_ITEM(self, cur); @@ -2586,7 +2587,7 @@ else { /* assign slice */ PyObject **garbage, *ins, *seq, **seqitems, **selfitems; - int cur, i; + Py_ssize_t cur, i; /* protect against a[::-1] = a */ if (self == (PyListObject*)value) { @@ -2768,11 +2769,11 @@ static PyObject * listiter_len(listiterobject *it) { - int len; + Py_ssize_t len; if (it->it_seq) { len = PyList_GET_SIZE(it->it_seq) - it->it_index; if (len >= 0) - return PyInt_FromLong((long)len); + return PyInt_FromSsize_t(len); } return PyInt_FromLong(0); } @@ -2884,7 +2885,7 @@ static int listreviter_len(listreviterobject *it) { - int len = it->it_index + 1; + Py_ssize_t len = it->it_index + 1; if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len) return 0; return len; From python-checkins at python.org Wed Dec 21 00:58:05 2005 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 21 Dec 2005 00:58:05 +0100 (CET) Subject: [Python-checkins] commit of r41783 - in python/branches/ssize_t: Include/stringobject.h Objects/stringobject.c Message-ID: <20051220235805.B41271E4011@bag.python.org> Author: martin.v.loewis Date: Wed Dec 21 00:58:03 2005 New Revision: 41783 Modified: python/branches/ssize_t/Include/stringobject.h python/branches/ssize_t/Objects/stringobject.c Log: Use Py_ssize_t in most places. Modified: python/branches/ssize_t/Include/stringobject.h ============================================================================== --- python/branches/ssize_t/Include/stringobject.h (original) +++ python/branches/ssize_t/Include/stringobject.h Wed Dec 21 00:58:03 2005 @@ -101,7 +101,7 @@ PyAPI_FUNC(PyObject*) PyString_Decode( const char *s, /* encoded string */ - int size, /* size of buffer */ + Py_ssize_t size, /* size of buffer */ const char *encoding, /* encoding */ const char *errors /* error handling */ ); @@ -111,7 +111,7 @@ PyAPI_FUNC(PyObject*) PyString_Encode( const char *s, /* string char buffer */ - int size, /* number of chars to encode */ + Py_ssize_t size, /* number of chars to encode */ const char *encoding, /* encoding */ const char *errors /* error handling */ ); @@ -171,7 +171,7 @@ PyAPI_FUNC(int) PyString_AsStringAndSize( register PyObject *obj, /* string or Unicode object */ register char **s, /* pointer to buffer variable */ - register int *len /* pointer to length variable or NULL + register Py_ssize_t *len /* pointer to length variable or NULL (only possible for 0-terminated strings) */ ); Modified: python/branches/ssize_t/Objects/stringobject.c ============================================================================== --- python/branches/ssize_t/Objects/stringobject.c (original) +++ python/branches/ssize_t/Objects/stringobject.c Wed Dec 21 00:58:03 2005 @@ -331,7 +331,7 @@ PyObject *PyString_Decode(const char *s, - int size, + Py_ssize_t size, const char *encoding, const char *errors) { @@ -411,7 +411,7 @@ } PyObject *PyString_Encode(const char *s, - int size, + Py_ssize_t size, const char *encoding, const char *errors) { @@ -543,7 +543,7 @@ PyObject *u, *w; char *r; const char* t; - int rn; + Py_ssize_t rn; t = s; /* Decode non-ASCII bytes as UTF-8. */ while (t < end && (*t & 0x80)) t++; @@ -659,7 +659,7 @@ } } if (p-buf < newlen) - _PyString_Resize(&v, (int)(p - buf)); + _PyString_Resize(&v, p - buf); return v; failed: Py_DECREF(v); @@ -670,7 +670,7 @@ string_getsize(register PyObject *op) { char *s; - int len; + Py_ssize_t len; if (PyString_AsStringAndSize(op, &s, &len)) return -1; return len; @@ -680,7 +680,7 @@ string_getbuffer(register PyObject *op) { char *s; - int len; + Py_ssize_t len; if (PyString_AsStringAndSize(op, &s, &len)) return NULL; return s; @@ -705,7 +705,7 @@ int PyString_AsStringAndSize(register PyObject *obj, register char **s, - register int *len) + register Py_ssize_t *len) { if (s == NULL) { PyErr_BadInternalCall(); @@ -732,7 +732,7 @@ *s = PyString_AS_STRING(obj); if (len != NULL) *len = PyString_GET_SIZE(obj); - else if ((int)strlen(*s) != PyString_GET_SIZE(obj)) { + else if (strlen(*s) != PyString_GET_SIZE(obj)) { PyErr_SetString(PyExc_TypeError, "expected string without null bytes"); return -1; @@ -745,7 +745,7 @@ static int string_print(PyStringObject *op, FILE *fp, int flags) { - int i; + Py_ssize_t i; char c; int quote; @@ -810,7 +810,7 @@ return NULL; } else { - register int i; + register Py_ssize_t i; register char c; register char *p; int quote; @@ -918,8 +918,8 @@ PyObject_INIT_VAR(op, &PyString_Type, size); op->ob_shash = -1; op->ob_sstate = SSTATE_NOT_INTERNED; - memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size); - memcpy(op->ob_sval + a->ob_size, b->ob_sval, (int) b->ob_size); + memcpy(op->ob_sval, a->ob_sval, a->ob_size); + memcpy(op->ob_sval + a->ob_size, b->ob_sval, b->ob_size); op->ob_sval[size] = '\0'; return (PyObject *) op; #undef b @@ -928,8 +928,8 @@ static PyObject * string_repeat(register PyStringObject *a, register Py_ssize_t n) { - register int i; - register int j; + register Py_ssize_t i; + register Py_ssize_t j; register Py_ssize_t size; register PyStringObject *op; size_t nbytes; @@ -968,8 +968,8 @@ } i = 0; if (i < size) { - memcpy(op->ob_sval, a->ob_sval, (int) a->ob_size); - i = (int) a->ob_size; + memcpy(op->ob_sval, a->ob_sval, a->ob_size); + i = a->ob_size; } while (i < size) { j = (i <= size-i) ? i : size-i; @@ -999,7 +999,7 @@ } if (j < i) j = i; - return PyString_FromStringAndSize(a->ob_sval + i, (int) (j-i)); + return PyString_FromStringAndSize(a->ob_sval + i, j-i); } static int @@ -1008,7 +1008,7 @@ char *s = PyString_AS_STRING(a); const char *sub = PyString_AS_STRING(el); char *last; - int len_sub = PyString_GET_SIZE(el); + Py_ssize_t len_sub = PyString_GET_SIZE(el); int shortsub; char firstchar, lastchar; @@ -1075,8 +1075,8 @@ string_richcompare(PyStringObject *a, PyStringObject *b, int op) { int c; - int len_a, len_b; - int min_len; + Py_ssize_t len_a, len_b; + Py_ssize_t min_len; PyObject *result; /* Make sure both arguments are strings. */ @@ -1148,7 +1148,7 @@ static long string_hash(PyStringObject *a) { - register int len; + register Py_ssize_t len; register unsigned char *p; register long x; @@ -1223,7 +1223,7 @@ } static int -string_buffer_getreadbuf(PyStringObject *self, int index, const void **ptr) +string_buffer_getreadbuf(PyStringObject *self, /*XXX*/int index, const void **ptr) { if ( index != 0 ) { PyErr_SetString(PyExc_SystemError, @@ -1322,9 +1322,9 @@ Py_DECREF(str); static PyObject * -split_whitespace(const char *s, int len, int maxsplit) +split_whitespace(const char *s, Py_ssize_t len, int maxsplit) { - int i, j; + Py_ssize_t i, j; PyObject *str; PyObject *list = PyList_New(0); @@ -1356,9 +1356,9 @@ } static PyObject * -split_char(const char *s, int len, char ch, int maxcount) +split_char(const char *s, Py_ssize_t len, char ch, int maxcount) { - register int i, j; + register Py_ssize_t i, j; PyObject *str; PyObject *list = PyList_New(0); @@ -1395,7 +1395,8 @@ static PyObject * string_split(PyStringObject *self, PyObject *args) { - int len = PyString_GET_SIZE(self), n, i, j, err; + Py_ssize_t len = PyString_GET_SIZE(self), n, i, j; + int err; int maxsplit = -1; const char *s = PyString_AS_STRING(self), *sub; PyObject *list, *item, *subobj = Py_None; @@ -1433,7 +1434,7 @@ if (s[i] == sub[0] && memcmp(s+i, sub, n) == 0) { if (maxsplit-- <= 0) break; - item = PyString_FromStringAndSize(s+j, (int)(i-j)); + item = PyString_FromStringAndSize(s+j, i-j); if (item == NULL) goto fail; err = PyList_Append(list, item); @@ -1445,7 +1446,7 @@ else i++; } - item = PyString_FromStringAndSize(s+j, (int)(len-j)); + item = PyString_FromStringAndSize(s+j, len-j); if (item == NULL) goto fail; err = PyList_Append(list, item); @@ -1461,9 +1462,9 @@ } static PyObject * -rsplit_whitespace(const char *s, int len, int maxsplit) +rsplit_whitespace(const char *s, Py_ssize_t len, int maxsplit) { - int i, j; + Py_ssize_t i, j; PyObject *str; PyObject *list = PyList_New(0); @@ -1495,9 +1496,9 @@ } static PyObject * -rsplit_char(const char *s, int len, char ch, int maxcount) +rsplit_char(const char *s, Py_ssize_t len, char ch, int maxcount) { - register int i, j; + register Py_ssize_t i, j; PyObject *str; PyObject *list = PyList_New(0); @@ -1535,7 +1536,8 @@ static PyObject * string_rsplit(PyStringObject *self, PyObject *args) { - int len = PyString_GET_SIZE(self), n, i, j, err; + Py_ssize_t len = PyString_GET_SIZE(self), n, i, j; + int err; int maxsplit = -1; const char *s = PyString_AS_STRING(self), *sub; PyObject *list, *item, *subobj = Py_None; @@ -1574,7 +1576,7 @@ if (s[i] == sub[0] && memcmp(s+i, sub, n) == 0) { if (maxsplit-- <= 0) break; - item = PyString_FromStringAndSize(s+i+n, (int)(j-i-n)); + item = PyString_FromStringAndSize(s+i+n, j-i-n); if (item == NULL) goto fail; err = PyList_Insert(list, 0, item); @@ -1613,12 +1615,12 @@ string_join(PyStringObject *self, PyObject *orig) { char *sep = PyString_AS_STRING(self); - const int seplen = PyString_GET_SIZE(self); + const Py_ssize_t seplen = PyString_GET_SIZE(self); PyObject *res = NULL; char *p; - int seqlen = 0; + Py_ssize_t seqlen = 0; size_t sz = 0; - int i; + Py_ssize_t i; PyObject *seq, *item; seq = PySequence_Fast(orig, ""); @@ -1666,7 +1668,7 @@ PyErr_Format(PyExc_TypeError, "sequence item %i: expected string," " %.80s found", - i, item->ob_type->tp_name); + /*XXX*/(int)i, item->ob_type->tp_name); Py_DECREF(seq); return NULL; } @@ -1682,7 +1684,7 @@ } /* Allocate result space. */ - res = PyString_FromStringAndSize((char*)NULL, (int)sz); + res = PyString_FromStringAndSize((char*)NULL, sz); if (res == NULL) { Py_DECREF(seq); return NULL; @@ -1715,7 +1717,7 @@ } static void -string_adjust_indices(int *start, int *end, int len) +string_adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len) { if (*end > len) *end = len; @@ -1729,12 +1731,12 @@ *start = 0; } -static long +static Py_ssize_t string_find_internal(PyStringObject *self, PyObject *args, int dir) { const char *s = PyString_AS_STRING(self), *sub; - int len = PyString_GET_SIZE(self); - int n, i = 0, last = INT_MAX; + Py_ssize_t len = PyString_GET_SIZE(self); + Py_ssize_t n, i = 0, last = INT_MAX; PyObject *subobj; /* XXX ssize_t i */ @@ -1763,13 +1765,13 @@ return (long)i; } else { - int j; + Py_ssize_t j; if (n == 0 && i <= last) - return (long)last; + return last; for (j = last-n; j >= i; --j) if (s[j] == sub[0] && memcmp(&s[j], sub, n) == 0) - return (long)j; + return j; } return -1; @@ -1788,10 +1790,10 @@ static PyObject * string_find(PyStringObject *self, PyObject *args) { - long result = string_find_internal(self, args, +1); + Py_ssize_t result = string_find_internal(self, args, +1); if (result == -2) return NULL; - return PyInt_FromLong(result); + return PyInt_FromSsize_t(result); } @@ -1803,7 +1805,7 @@ static PyObject * string_index(PyStringObject *self, PyObject *args) { - long result = string_find_internal(self, args, +1); + Py_ssize_t result = string_find_internal(self, args, +1); if (result == -2) return NULL; if (result == -1) { @@ -1811,7 +1813,7 @@ "substring not found"); return NULL; } - return PyInt_FromLong(result); + return PyInt_FromSsize_t(result); } @@ -1827,10 +1829,10 @@ static PyObject * string_rfind(PyStringObject *self, PyObject *args) { - long result = string_find_internal(self, args, -1); + Py_ssize_t result = string_find_internal(self, args, -1); if (result == -2) return NULL; - return PyInt_FromLong(result); + return PyInt_FromSsize_t(result); } @@ -1842,7 +1844,7 @@ static PyObject * string_rindex(PyStringObject *self, PyObject *args) { - long result = string_find_internal(self, args, -1); + Py_ssize_t result = string_find_internal(self, args, -1); if (result == -2) return NULL; if (result == -1) { @@ -1850,7 +1852,7 @@ "substring not found"); return NULL; } - return PyInt_FromLong(result); + return PyInt_FromSsize_t(result); } @@ -1858,10 +1860,10 @@ do_xstrip(PyStringObject *self, int striptype, PyObject *sepobj) { char *s = PyString_AS_STRING(self); - int len = PyString_GET_SIZE(self); + Py_ssize_t len = PyString_GET_SIZE(self); char *sep = PyString_AS_STRING(sepobj); - int seplen = PyString_GET_SIZE(sepobj); - int i, j; + Py_ssize_t seplen = PyString_GET_SIZE(sepobj); + Py_ssize_t i, j; i = 0; if (striptype != RIGHTSTRIP) { @@ -1891,7 +1893,7 @@ do_strip(PyStringObject *self, int striptype) { char *s = PyString_AS_STRING(self); - int len = PyString_GET_SIZE(self), i, j; + Py_ssize_t len = PyString_GET_SIZE(self), i, j; i = 0; if (striptype != RIGHTSTRIP) { @@ -2018,7 +2020,7 @@ string_lower(PyStringObject *self) { char *s = PyString_AS_STRING(self), *s_new; - int i, n = PyString_GET_SIZE(self); + Py_ssize_t i, n = PyString_GET_SIZE(self); PyObject *new; new = PyString_FromStringAndSize(NULL, n); @@ -2046,7 +2048,7 @@ string_upper(PyStringObject *self) { char *s = PyString_AS_STRING(self), *s_new; - int i, n = PyString_GET_SIZE(self); + Py_ssize_t i, n = PyString_GET_SIZE(self); PyObject *new; new = PyString_FromStringAndSize(NULL, n); @@ -2075,7 +2077,7 @@ string_title(PyStringObject *self) { char *s = PyString_AS_STRING(self), *s_new; - int i, n = PyString_GET_SIZE(self); + Py_ssize_t i, n = PyString_GET_SIZE(self); int previous_is_cased = 0; PyObject *new; @@ -2110,7 +2112,7 @@ string_capitalize(PyStringObject *self) { char *s = PyString_AS_STRING(self), *s_new; - int i, n = PyString_GET_SIZE(self); + Py_ssize_t i, n = PyString_GET_SIZE(self); PyObject *new; new = PyString_FromStringAndSize(NULL, n); @@ -2148,9 +2150,9 @@ string_count(PyStringObject *self, PyObject *args) { const char *s = PyString_AS_STRING(self), *sub, *t; - int len = PyString_GET_SIZE(self), n; - int i = 0, last = INT_MAX; - int m, r; + Py_ssize_t len = PyString_GET_SIZE(self), n; + Py_ssize_t i = 0, last = INT_MAX; + Py_ssize_t m, r; PyObject *subobj; if (!PyArg_ParseTuple(args, "O|O&O&:count", &subobj, @@ -2163,7 +2165,7 @@ } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(subobj)) { - int count; + Py_ssize_t count; count = PyUnicode_Count((PyObject *)self, subobj, i, last); if (count == -1) return NULL; @@ -2178,7 +2180,7 @@ m = last + 1 - n; if (n == 0) - return PyInt_FromLong((long) (m-i)); + return PyInt_FromSsize_t(m-i); r = 0; while (i < m) { @@ -2195,7 +2197,7 @@ break; i = t - s; } - return PyInt_FromLong((long) r); + return PyInt_FromSsize_t(r); } PyDoc_STRVAR(swapcase__doc__, @@ -2208,7 +2210,7 @@ string_swapcase(PyStringObject *self) { char *s = PyString_AS_STRING(self), *s_new; - int i, n = PyString_GET_SIZE(self); + Py_ssize_t i, n = PyString_GET_SIZE(self); PyObject *new; new = PyString_FromStringAndSize(NULL, n); @@ -2244,10 +2246,10 @@ { register char *input, *output; register const char *table; - register int i, c, changed = 0; + register Py_ssize_t i, c, changed = 0; PyObject *input_obj = (PyObject*)self; const char *table1, *output_start, *del_table=NULL; - int inlen, tablen, dellen = 0; + Py_ssize_t inlen, tablen, dellen = 0; PyObject *result; int trans_table[256]; PyObject *tableobj, *delobj = NULL; @@ -2361,10 +2363,10 @@ found, or -1 if not found. If len of PAT is greater than length of MEM, the function returns -1. */ -static int -mymemfind(const char *mem, int len, const char *pat, int pat_len) +static Py_ssize_t +mymemfind(const char *mem, Py_ssize_t len, const char *pat, Py_ssize_t pat_len) { - register int ii; + register Py_ssize_t ii; /* pattern can not occur in the last pat_len-1 chars */ len -= pat_len; @@ -2384,11 +2386,11 @@ meaning mem=1111 and pat==11 returns 2. mem=11111 and pat==11 also return 2. */ -static int -mymemcnt(const char *mem, int len, const char *pat, int pat_len) +static Py_ssize_t +mymemcnt(const char *mem, Py_ssize_t len, const char *pat, Py_ssize_t pat_len) { - register int offset = 0; - int nfound = 0; + register Py_ssize_t offset = 0; + Py_ssize_t nfound = 0; while (len >= 0) { offset = mymemfind(mem, len, pat, pat_len); @@ -2421,15 +2423,15 @@ NULL if an error occurred. */ static char * -mymemreplace(const char *str, int len, /* input string */ - const char *pat, int pat_len, /* pattern string to find */ - const char *sub, int sub_len, /* substitution string */ - int count, /* number of replacements */ - int *out_len) +mymemreplace(const char *str, Py_ssize_t len, /* input string */ + const char *pat, Py_ssize_t pat_len, /* pattern string to find */ + const char *sub, Py_ssize_t sub_len, /* substitution string */ + Py_ssize_t count, /* number of replacements */ + Py_ssize_t *out_len) { char *out_s; char *new_s; - int nfound, offset, new_len; + Py_ssize_t nfound, offset, new_len; if (len == 0 || (pat_len == 0 && sub_len == 0) || pat_len > len) goto return_same; @@ -2512,8 +2514,8 @@ { const char *str = PyString_AS_STRING(self), *sub, *repl; char *new_s; - const int len = PyString_GET_SIZE(self); - int sub_len, repl_len, out_len; + const Py_ssize_t len = PyString_GET_SIZE(self); + Py_ssize_t sub_len, repl_len, out_len; int count = -1; PyObject *new; PyObject *subobj, *replobj; @@ -2582,11 +2584,11 @@ string_startswith(PyStringObject *self, PyObject *args) { const char* str = PyString_AS_STRING(self); - int len = PyString_GET_SIZE(self); + Py_ssize_t len = PyString_GET_SIZE(self); const char* prefix; - int plen; - int start = 0; - int end = INT_MAX; + Py_ssize_t plen; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; PyObject *subobj; if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &subobj, @@ -2598,7 +2600,7 @@ } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(subobj)) { - int rc; + Py_ssize_t rc; rc = PyUnicode_Tailmatch((PyObject *)self, subobj, start, end, -1); if (rc == -1) @@ -2633,11 +2635,11 @@ string_endswith(PyStringObject *self, PyObject *args) { const char* str = PyString_AS_STRING(self); - int len = PyString_GET_SIZE(self); + Py_ssize_t len = PyString_GET_SIZE(self); const char* suffix; - int slen; - int start = 0; - int end = INT_MAX; + Py_ssize_t slen; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; PyObject *subobj; if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &subobj, @@ -2649,7 +2651,7 @@ } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(subobj)) { - int rc; + Py_ssize_t rc; rc = PyUnicode_Tailmatch((PyObject *)self, subobj, start, end, +1); if (rc == -1) @@ -2760,7 +2762,7 @@ { const char *e, *p; char *q; - int i, j; + Py_ssize_t i, j; PyObject *u; int tabsize = 8; @@ -2811,7 +2813,7 @@ } static PyObject * -pad(PyStringObject *self, int left, int right, char fill) +pad(PyStringObject *self, Py_ssize_t left, Py_ssize_t right, char fill) { PyObject *u; @@ -3213,9 +3215,9 @@ static PyObject* string_splitlines(PyStringObject *self, PyObject *args) { - register int i; - register int j; - int len; + register Py_ssize_t i; + register Py_ssize_t j; + Py_ssize_t len; int keepends = 0; PyObject *list; PyObject *str; @@ -3344,7 +3346,7 @@ str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *tmp, *pnew; - int n; + Py_ssize_t n; assert(PyType_IsSubtype(type, &PyString_Type)); tmp = string_new(&PyString_Type, args, kwds); @@ -3659,7 +3661,7 @@ { PyObject *result = NULL; char *buf; - int i; + Py_ssize_t i; int sign; /* 1 if '-', else 0 */ int len; /* number of characters */ int numdigits; /* len == numnondigits + numdigits */ From python-checkins at python.org Wed Dec 21 00:59:06 2005 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 21 Dec 2005 00:59:06 +0100 (CET) Subject: [Python-checkins] commit of r41784 - in python/branches/ssize_t: Include/abstract.h Include/unicodeobject.h Modules/_codecsmodule.c Modules/cStringIO.c Modules/stropmodule.c Objects/abstract.c Objects/complexobject.c Objects/fileobject.c Objects/floatobject.c Objects/frameobject.c Objects/unicodeobject.c Python/bltinmodule.c Message-ID: <20051220235906.513371E4002@bag.python.org> Author: martin.v.loewis Date: Wed Dec 21 00:59:03 2005 New Revision: 41784 Modified: python/branches/ssize_t/Include/abstract.h python/branches/ssize_t/Include/unicodeobject.h python/branches/ssize_t/Modules/_codecsmodule.c python/branches/ssize_t/Modules/cStringIO.c python/branches/ssize_t/Modules/stropmodule.c python/branches/ssize_t/Objects/abstract.c python/branches/ssize_t/Objects/complexobject.c python/branches/ssize_t/Objects/fileobject.c python/branches/ssize_t/Objects/floatobject.c python/branches/ssize_t/Objects/frameobject.c python/branches/ssize_t/Objects/unicodeobject.c python/branches/ssize_t/Python/bltinmodule.c Log: Add Py_ssize_t into more places. Modified: python/branches/ssize_t/Include/abstract.h ============================================================================== --- python/branches/ssize_t/Include/abstract.h (original) +++ python/branches/ssize_t/Include/abstract.h Wed Dec 21 00:59:03 2005 @@ -472,7 +472,7 @@ PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, const char **buffer, - int *buffer_len); + Py_ssize_t *buffer_len); /* Takes an arbitrary object which must support the (character, @@ -497,7 +497,7 @@ PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, const void **buffer, - int *buffer_len); + Py_ssize_t *buffer_len); /* Same as PyObject_AsCharBuffer() except that this API expects Modified: python/branches/ssize_t/Include/unicodeobject.h ============================================================================== --- python/branches/ssize_t/Include/unicodeobject.h (original) +++ python/branches/ssize_t/Include/unicodeobject.h Wed Dec 21 00:59:03 2005 @@ -1056,11 +1056,11 @@ /* Return 1 if substr matches str[start:end] at the given tail end, 0 otherwise. */ -PyAPI_FUNC(int) PyUnicode_Tailmatch( +PyAPI_FUNC(Py_ssize_t) PyUnicode_Tailmatch( PyObject *str, /* String */ PyObject *substr, /* Prefix or Suffix string */ - int start, /* Start index */ - int end, /* Stop index */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ int direction /* Tail end: -1 prefix, +1 suffix */ ); @@ -1068,21 +1068,21 @@ given search direction or -1 if not found. -2 is returned in case an error occurred and an exception is set. */ -PyAPI_FUNC(int) PyUnicode_Find( +PyAPI_FUNC(Py_ssize_t) PyUnicode_Find( PyObject *str, /* String */ PyObject *substr, /* Substring to find */ - int start, /* Start index */ - int end, /* Stop index */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ int direction /* Find direction: +1 forward, -1 backward */ ); /* Count the number of occurrences of substr in str[start:end]. */ -PyAPI_FUNC(int) PyUnicode_Count( +PyAPI_FUNC(Py_ssize_t) PyUnicode_Count( PyObject *str, /* String */ PyObject *substr, /* Substring to count */ - int start, /* Start index */ - int end /* Stop index */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end /* Stop index */ ); /* Replace at most maxcount occurrences of substr in str with replstr Modified: python/branches/ssize_t/Modules/_codecsmodule.c ============================================================================== --- python/branches/ssize_t/Modules/_codecsmodule.c (original) +++ python/branches/ssize_t/Modules/_codecsmodule.c Wed Dec 21 00:59:03 2005 @@ -242,7 +242,7 @@ PyObject *obj; const char *errors = NULL; const char *data; - int size; + Py_ssize_t size; if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode", &obj, &errors)) @@ -572,7 +572,7 @@ PyObject *obj; const char *errors = NULL; const char *data; - int size; + Py_ssize_t size; if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode", &obj, &errors)) Modified: python/branches/ssize_t/Modules/cStringIO.c ============================================================================== --- python/branches/ssize_t/Modules/cStringIO.c (original) +++ python/branches/ssize_t/Modules/cStringIO.c Wed Dec 21 00:59:03 2005 @@ -440,7 +440,7 @@ if (it == NULL) return NULL; while ((s = PyIter_Next(it)) != NULL) { - int n; + Py_ssize_t n; char *c; if (PyString_AsStringAndSize(s, &c, &n) == -1) { Py_DECREF(it); @@ -656,7 +656,7 @@ newIobject(PyObject *s) { Iobject *self; char *buf; - int size; + Py_ssize_t size; if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) { PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found", Modified: python/branches/ssize_t/Modules/stropmodule.c ============================================================================== --- python/branches/ssize_t/Modules/stropmodule.c (original) +++ python/branches/ssize_t/Modules/stropmodule.c Wed Dec 21 00:59:03 2005 @@ -364,7 +364,7 @@ do_strip(PyObject *args, int striptype) { char *s; - int len, i, j; + Py_ssize_t len, i, j; if (PyString_AsStringAndSize(args, &s, &len)) @@ -443,7 +443,7 @@ strop_lower(PyObject *self, PyObject *args) { char *s, *s_new; - int i, n; + Py_ssize_t i, n; PyObject *new; int changed; @@ -482,7 +482,7 @@ strop_upper(PyObject *self, PyObject *args) { char *s, *s_new; - int i, n; + Py_ssize_t i, n; PyObject *new; int changed; @@ -522,7 +522,7 @@ strop_capitalize(PyObject *self, PyObject *args) { char *s, *s_new; - int i, n; + Py_ssize_t i, n; PyObject *new; int changed; @@ -688,7 +688,7 @@ strop_swapcase(PyObject *self, PyObject *args) { char *s, *s_new; - int i, n; + Py_ssize_t i, n; PyObject *new; int changed; Modified: python/branches/ssize_t/Objects/abstract.c ============================================================================== --- python/branches/ssize_t/Objects/abstract.c (original) +++ python/branches/ssize_t/Objects/abstract.c Wed Dec 21 00:59:03 2005 @@ -218,11 +218,11 @@ int PyObject_AsCharBuffer(PyObject *obj, const char **buffer, - int *buffer_len) + Py_ssize_t *buffer_len) { PyBufferProcs *pb; const char *pp; - int len; + Py_ssize_t len; if (obj == NULL || buffer == NULL || buffer_len == NULL) { null_error(); @@ -264,11 +264,11 @@ int PyObject_AsReadBuffer(PyObject *obj, const void **buffer, - int *buffer_len) + Py_ssize_t *buffer_len) { PyBufferProcs *pb; void *pp; - int len; + Py_ssize_t len; if (obj == NULL || buffer == NULL || buffer_len == NULL) { null_error(); @@ -946,7 +946,7 @@ /* Add a check for embedded NULL-bytes in the argument. */ static PyObject * -int_from_string(const char *s, int len) +int_from_string(const char *s, Py_ssize_t len) { char *end; PyObject *x; @@ -968,7 +968,7 @@ { PyNumberMethods *m; const char *buffer; - int buffer_len; + Py_ssize_t buffer_len; if (o == NULL) return null_error(); @@ -1009,7 +1009,7 @@ /* Add a check for embedded NULL-bytes in the argument. */ static PyObject * -long_from_string(const char *s, int len) +long_from_string(const char *s, Py_ssize_t len) { char *end; PyObject *x; @@ -1031,7 +1031,7 @@ { PyNumberMethods *m; const char *buffer; - int buffer_len; + Py_ssize_t buffer_len; if (o == NULL) return null_error(); Modified: python/branches/ssize_t/Objects/complexobject.c ============================================================================== --- python/branches/ssize_t/Objects/complexobject.c (original) +++ python/branches/ssize_t/Objects/complexobject.c Wed Dec 21 00:59:03 2005 @@ -680,7 +680,7 @@ #ifdef Py_USING_UNICODE char s_buffer[256]; #endif - int len; + Py_ssize_t len; if (PyString_Check(v)) { s = PyString_AS_STRING(v); @@ -699,7 +699,7 @@ NULL)) return NULL; s = s_buffer; - len = (int)strlen(s); + len = strlen(s); } #endif else if (PyObject_AsCharBuffer(v, &s, &len)) { Modified: python/branches/ssize_t/Objects/fileobject.c ============================================================================== --- python/branches/ssize_t/Objects/fileobject.c (original) +++ python/branches/ssize_t/Objects/fileobject.c Wed Dec 21 00:59:03 2005 @@ -1519,7 +1519,7 @@ PyObject *v = PyList_GET_ITEM(list, i); if (!PyString_Check(v)) { const char *buffer; - int len; + Py_ssize_t len; if (((f->f_binary && PyObject_AsReadBuffer(v, (const void**)&buffer, Modified: python/branches/ssize_t/Objects/floatobject.c ============================================================================== --- python/branches/ssize_t/Objects/floatobject.c (original) +++ python/branches/ssize_t/Objects/floatobject.c Wed Dec 21 00:59:03 2005 @@ -87,7 +87,7 @@ #ifdef Py_USING_UNICODE char s_buffer[256]; /* for objects convertible to a char buffer */ #endif - int len; + Py_ssize_t len; if (pend) *pend = NULL; @@ -108,7 +108,7 @@ NULL)) return NULL; s = s_buffer; - len = (int)strlen(s); + len = strlen(s); } #endif else if (PyObject_AsCharBuffer(v, &s, &len)) { Modified: python/branches/ssize_t/Objects/frameobject.c ============================================================================== --- python/branches/ssize_t/Objects/frameobject.c (original) +++ python/branches/ssize_t/Objects/frameobject.c Wed Dec 21 00:59:03 2005 @@ -71,9 +71,9 @@ int new_lasti = 0; /* The new value of f_lasti */ int new_iblock = 0; /* The new value of f_iblock */ char *code = NULL; /* The bytecode for the frame... */ - int code_len = 0; /* ...and its length */ + Py_ssize_t code_len = 0; /* ...and its length */ char *lnotab = NULL; /* Iterating over co_lnotab */ - int lnotab_len = 0; /* (ditto) */ + Py_ssize_t lnotab_len = 0; /* (ditto) */ int offset = 0; /* (ditto) */ int line = 0; /* (ditto) */ int addr = 0; /* (ditto) */ Modified: python/branches/ssize_t/Objects/unicodeobject.c ============================================================================== --- python/branches/ssize_t/Objects/unicodeobject.c (original) +++ python/branches/ssize_t/Objects/unicodeobject.c Wed Dec 21 00:59:03 2005 @@ -457,7 +457,7 @@ const char *errors) { const char *s = NULL; - int len; + Py_ssize_t len; PyObject *v; if (obj == NULL) { @@ -3829,12 +3829,12 @@ return count; } -int PyUnicode_Count(PyObject *str, +Py_ssize_t PyUnicode_Count(PyObject *str, PyObject *substr, - int start, - int end) + Py_ssize_t start, + Py_ssize_t end) { - int result; + Py_ssize_t result; str = PyUnicode_FromObject(str); if (str == NULL) @@ -3855,10 +3855,10 @@ } static -int findstring(PyUnicodeObject *self, +Py_ssize_t findstring(PyUnicodeObject *self, PyUnicodeObject *substring, - int start, - int end, + Py_ssize_t start, + Py_ssize_t end, int direction) { if (start < 0) @@ -3891,13 +3891,13 @@ return -1; } -int PyUnicode_Find(PyObject *str, +Py_ssize_t PyUnicode_Find(PyObject *str, PyObject *substr, - int start, - int end, + Py_ssize_t start, + Py_ssize_t end, int direction) { - int result; + Py_ssize_t result; str = PyUnicode_FromObject(str); if (str == NULL) @@ -3917,10 +3917,10 @@ } static -int tailmatch(PyUnicodeObject *self, +Py_ssize_t tailmatch(PyUnicodeObject *self, PyUnicodeObject *substring, - int start, - int end, + Py_ssize_t start, + Py_ssize_t end, int direction) { if (start < 0) @@ -3953,13 +3953,13 @@ return 0; } -int PyUnicode_Tailmatch(PyObject *str, +Py_ssize_t PyUnicode_Tailmatch(PyObject *str, PyObject *substr, - int start, - int end, + Py_ssize_t start, + Py_ssize_t end, int direction) { - int result; + Py_ssize_t result; str = PyUnicode_FromObject(str); if (str == NULL) @@ -5089,8 +5089,8 @@ unicode_count(PyUnicodeObject *self, PyObject *args) { PyUnicodeObject *substring; - int start = 0; - int end = INT_MAX; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; PyObject *result; if (!PyArg_ParseTuple(args, "O|O&O&:count", &substring, @@ -5266,8 +5266,8 @@ unicode_find(PyUnicodeObject *self, PyObject *args) { PyUnicodeObject *substring; - int start = 0; - int end = INT_MAX; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; PyObject *result; if (!PyArg_ParseTuple(args, "O|O&O&:find", &substring, @@ -5330,10 +5330,10 @@ static PyObject * unicode_index(PyUnicodeObject *self, PyObject *args) { - int result; + Py_ssize_t result; PyUnicodeObject *substring; - int start = 0; - int end = INT_MAX; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; if (!PyArg_ParseTuple(args, "O|O&O&:index", &substring, _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) @@ -5351,7 +5351,7 @@ PyErr_SetString(PyExc_ValueError, "substring not found"); return NULL; } - return PyInt_FromLong(result); + return PyInt_FromSsize_t(result); } PyDoc_STRVAR(islower__doc__, @@ -5997,8 +5997,8 @@ unicode_rfind(PyUnicodeObject *self, PyObject *args) { PyUnicodeObject *substring; - int start = 0; - int end = INT_MAX; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; PyObject *result; if (!PyArg_ParseTuple(args, "O|O&O&:rfind", &substring, @@ -6023,10 +6023,10 @@ static PyObject * unicode_rindex(PyUnicodeObject *self, PyObject *args) { - int result; + Py_ssize_t result; PyUnicodeObject *substring; - int start = 0; - int end = INT_MAX; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; if (!PyArg_ParseTuple(args, "O|O&O&:rindex", &substring, _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) @@ -6043,7 +6043,7 @@ PyErr_SetString(PyExc_ValueError, "substring not found"); return NULL; } - return PyInt_FromLong(result); + return PyInt_FromSsize_t(result); } PyDoc_STRVAR(rjust__doc__, @@ -6319,8 +6319,8 @@ PyObject *args) { PyUnicodeObject *substring; - int start = 0; - int end = INT_MAX; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; PyObject *result; if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &substring, @@ -6350,8 +6350,8 @@ PyObject *args) { PyUnicodeObject *substring; - int start = 0; - int end = INT_MAX; + Py_ssize_t start = 0; + Py_ssize_t end = INT_MAX; PyObject *result; if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &substring, Modified: python/branches/ssize_t/Python/bltinmodule.c ============================================================================== --- python/branches/ssize_t/Python/bltinmodule.c (original) +++ python/branches/ssize_t/Python/bltinmodule.c Wed Dec 21 00:59:03 2005 @@ -405,7 +405,7 @@ int supplied_flags = 0; PyCompilerFlags cf; PyObject *result = NULL, *cmd, *tmp = NULL; - int length; + Py_ssize_t length; if (!PyArg_ParseTuple(args, "Oss|ii:compile", &cmd, &filename, &startstr, &supplied_flags, &dont_inherit)) From python-checkins at python.org Wed Dec 21 16:46:33 2005 From: python-checkins at python.org (thomas.heller) Date: Wed, 21 Dec 2005 16:46:33 +0100 (CET) Subject: [Python-checkins] commit of r41785 - python/trunk/PCbuild/pythoncore.vcproj Message-ID: <20051221154633.3AC181E4007@bag.python.org> Author: thomas.heller Date: Wed Dec 21 16:46:29 2005 New Revision: 41785 Modified: python/trunk/PCbuild/pythoncore.vcproj Log: Add Python\pyarena.c to the VC project file. Fix the definition of BUILD in the VC project settings. Modified: python/trunk/PCbuild/pythoncore.vcproj ============================================================================== --- python/trunk/PCbuild/pythoncore.vcproj (original) +++ python/trunk/PCbuild/pythoncore.vcproj Wed Dec 21 16:46:29 2005 @@ -1428,7 +1428,7 @@ Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" - PreprocessorDefinitions="BUILD=60"/> + PreprocessorDefinitions="BUILD=\"60\""/> @@ -1436,7 +1436,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" - PreprocessorDefinitions="BUILD=60"/> + PreprocessorDefinitions="BUILD=\"60\""/> @@ -1444,7 +1444,7 @@ Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" - PreprocessorDefinitions="BUILD=60"/> + PreprocessorDefinitions="BUILD=\"60\""/> + + From python-checkins at python.org Thu Dec 22 06:46:04 2005 From: python-checkins at python.org (neal.norwitz) Date: Thu, 22 Dec 2005 06:46:04 +0100 (CET) Subject: [Python-checkins] commit of r41786 - python/branches/ssize_t/Modules/_bsddb.c python/branches/ssize_t/Modules/bz2module.c Message-ID: <20051222054604.B6F671E4002@bag.python.org> Author: neal.norwitz Date: Thu Dec 22 06:46:03 2005 New Revision: 41786 Modified: python/branches/ssize_t/Modules/_bsddb.c python/branches/ssize_t/Modules/bz2module.c Log: Fix a couple of warnings Modified: python/branches/ssize_t/Modules/_bsddb.c ============================================================================== --- python/branches/ssize_t/Modules/_bsddb.c (original) +++ python/branches/ssize_t/Modules/_bsddb.c Thu Dec 22 06:46:03 2005 @@ -1097,7 +1097,7 @@ } else if (PyString_Check(result)) { char* data; - int size; + Py_ssize_t size; CLEAR_DBT(*secKey); #if PYTHON_API_VERSION <= 1007 Modified: python/branches/ssize_t/Modules/bz2module.c ============================================================================== --- python/branches/ssize_t/Modules/bz2module.c (original) +++ python/branches/ssize_t/Modules/bz2module.c Thu Dec 22 06:46:03 2005 @@ -908,7 +908,7 @@ PyObject *v = PyList_GET_ITEM(list, i); if (!PyString_Check(v)) { const char *buffer; - int len; + Py_ssize_t len; if (PyObject_AsCharBuffer(v, &buffer, &len)) { PyErr_SetString(PyExc_TypeError, "writelines() " From python-checkins at python.org Thu Dec 22 17:15:01 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Thu, 22 Dec 2005 17:15:01 +0100 (CET) Subject: [Python-checkins] commit of r41787 - python/trunk/Doc/lib/libmd5.tex Message-ID: <20051222161501.7CF0E1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Thu Dec 22 17:15:00 2005 New Revision: 41787 Modified: python/trunk/Doc/lib/libmd5.tex Log: [ 1388141 ] Minor error in md5 docs Modified: python/trunk/Doc/lib/libmd5.tex ============================================================================== --- python/trunk/Doc/lib/libmd5.tex (original) +++ python/trunk/Doc/lib/libmd5.tex Thu Dec 22 17:15:00 2005 @@ -44,7 +44,7 @@ \code{16}. \end{datadesc} -md5 objects support the following methods: +The md5 module provides the following functions: \begin{funcdesc}{new}{\optional{arg}} Return a new md5 object. If \var{arg} is present, the method call From python-checkins at python.org Thu Dec 22 17:15:08 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Thu, 22 Dec 2005 17:15:08 +0100 (CET) Subject: [Python-checkins] commit of r41788 - python/branches/release24-maint/Doc/lib/libmd5.tex Message-ID: <20051222161508.928B31E4002@bag.python.org> Author: reinhold.birkenfeld Date: Thu Dec 22 17:15:08 2005 New Revision: 41788 Modified: python/branches/release24-maint/Doc/lib/libmd5.tex Log: [ 1388141 ] Minor error in md5 docs (backport) Modified: python/branches/release24-maint/Doc/lib/libmd5.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libmd5.tex (original) +++ python/branches/release24-maint/Doc/lib/libmd5.tex Thu Dec 22 17:15:08 2005 @@ -43,7 +43,7 @@ \code{16}. \end{datadesc} -md5 objects support the following methods: +The md5 module provides the following functions: \begin{funcdesc}{new}{\optional{arg}} Return a new md5 object. If \var{arg} is present, the method call From python-checkins at python.org Thu Dec 22 19:55:45 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 19:55:45 +0100 (CET) Subject: [Python-checkins] commit of r41789 - python/trunk/Doc/lib/language.tex Message-ID: <20051222185545.01A5C1E4029@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 19:55:43 2005 New Revision: 41789 Modified: python/trunk/Doc/lib/language.tex Log: Typo fix Modified: python/trunk/Doc/lib/language.tex ============================================================================== --- python/trunk/Doc/lib/language.tex (original) +++ python/trunk/Doc/lib/language.tex Thu Dec 22 19:55:43 2005 @@ -2,7 +2,7 @@ \label{language}} Python provides a number of modules to assist in working with the -Python language. These module support tokenizing, parsing, syntax +Python language. These modules support tokenizing, parsing, syntax analysis, bytecode disassembly, and various other facilities. These modules include: From python-checkins at python.org Thu Dec 22 19:56:09 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 19:56:09 +0100 (CET) Subject: [Python-checkins] commit of r41790 - python/branches/release24-maint/Doc/lib/language.tex Message-ID: <20051222185609.B48F51E4007@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 19:56:09 2005 New Revision: 41790 Modified: python/branches/release24-maint/Doc/lib/language.tex Log: Typo fix Modified: python/branches/release24-maint/Doc/lib/language.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/language.tex (original) +++ python/branches/release24-maint/Doc/lib/language.tex Thu Dec 22 19:56:09 2005 @@ -2,7 +2,7 @@ \label{language}} Python provides a number of modules to assist in working with the -Python language. These module support tokenizing, parsing, syntax +Python language. These modules support tokenizing, parsing, syntax analysis, bytecode disassembly, and various other facilities. These modules include: From python-checkins at python.org Thu Dec 22 20:31:23 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 20:31:23 +0100 (CET) Subject: [Python-checkins] commit of r41791 - python/trunk/Doc/lib/libtypes.tex Message-ID: <20051222193123.4F2651E4015@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 20:31:21 2005 New Revision: 41791 Modified: python/trunk/Doc/lib/libtypes.tex Log: Typo fix Modified: python/trunk/Doc/lib/libtypes.tex ============================================================================== --- python/trunk/Doc/lib/libtypes.tex (original) +++ python/trunk/Doc/lib/libtypes.tex Thu Dec 22 20:31:21 2005 @@ -8,7 +8,7 @@ This module defines names for some object types that are used by the standard Python interpreter, but not for the types defined by various extension modules. Also, it does not include some of the types that -arise during processing such the \code{listiterator} type. +arise during processing such as the \code{listiterator} type. It is safe to use \samp{from types import *} --- the module does not export any names besides the ones listed here. New names exported by future versions of this module will all end in From python-checkins at python.org Thu Dec 22 20:31:46 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 20:31:46 +0100 (CET) Subject: [Python-checkins] commit of r41792 - python/branches/release24-maint/Doc/lib/libtypes.tex Message-ID: <20051222193146.B22E31E4030@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 20:31:45 2005 New Revision: 41792 Modified: python/branches/release24-maint/Doc/lib/libtypes.tex Log: Typo fix Modified: python/branches/release24-maint/Doc/lib/libtypes.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libtypes.tex (original) +++ python/branches/release24-maint/Doc/lib/libtypes.tex Thu Dec 22 20:31:45 2005 @@ -8,7 +8,7 @@ This module defines names for some object types that are used by the standard Python interpreter, but not for the types defined by various extension modules. Also, it does not include some of the types that -arise during processing such the \code{listiterator} type. +arise during processing such as the \code{listiterator} type. It is safe to use \samp{from types import *} --- the module does not export any names besides the ones listed here. New names exported by future versions of this module will all end in From python-checkins at python.org Thu Dec 22 20:38:59 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 20:38:59 +0100 (CET) Subject: [Python-checkins] commit of r41793 - python/trunk/Doc/lib/libcrypto.tex Message-ID: <20051222193859.39CA21E4002@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 20:38:57 2005 New Revision: 41793 Modified: python/trunk/Doc/lib/libcrypto.tex Log: Update text Modified: python/trunk/Doc/lib/libcrypto.tex ============================================================================== --- python/trunk/Doc/lib/libcrypto.tex (original) +++ python/trunk/Doc/lib/libcrypto.tex Thu Dec 22 20:38:57 2005 @@ -9,15 +9,11 @@ \localmoduletable Hardcore cypherpunks will probably find the cryptographic modules -written by A.M. Kuchling of further interest; the package adds -built-in modules for DES and IDEA encryption, provides a Python module -for reading and decrypting PGP files, and then some. These modules +written by A.M. Kuchling of further interest; the package contains +modules for various encryption algorithms, most notably AES. These modules are not distributed with Python but available separately. See the URL \url{http://www.amk.ca/python/code/crypto.html} for more information. -\index{PGP} -\index{Pretty Good Privacy} -\indexii{DES}{cipher} -\indexii{IDEA}{cipher} +\indexii{AES}{algorithm} \index{cryptography} \index{Kuchling, Andrew} From python-checkins at python.org Thu Dec 22 21:12:41 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 21:12:41 +0100 (CET) Subject: [Python-checkins] commit of r41794 - python/trunk/Doc/lib/archiving.tex python/trunk/Doc/lib/datatypes.tex python/trunk/Doc/lib/fileformats.tex python/trunk/Doc/lib/filesys.tex python/trunk/Doc/lib/i18n.tex python/trunk/Doc/lib/ipc.tex python/trunk/Doc/lib/numeric.tex python/trunk/Doc/lib/persistence.tex Message-ID: <20051222201241.52D7F1E401D@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 21:12:39 2005 New Revision: 41794 Added: python/trunk/Doc/lib/archiving.tex python/trunk/Doc/lib/datatypes.tex python/trunk/Doc/lib/fileformats.tex python/trunk/Doc/lib/filesys.tex python/trunk/Doc/lib/i18n.tex python/trunk/Doc/lib/ipc.tex python/trunk/Doc/lib/numeric.tex python/trunk/Doc/lib/persistence.tex Log: Add some chapter introductions (not linked into the LibRef yet) Added: python/trunk/Doc/lib/archiving.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/archiving.tex Thu Dec 22 21:12:39 2005 @@ -0,0 +1,8 @@ +\chapter{Data Compression and Archiving} +\label{archiving} + +The modules described in this chapter support data compression +with the zlib, gzip, and bzip2 algorithms, and +the creation of ZIP- and tar-format archives. + +\localmoduletable Added: python/trunk/Doc/lib/datatypes.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/datatypes.tex Thu Dec 22 21:12:39 2005 @@ -0,0 +1,10 @@ +\chapter{Data Types} +\label{datatypes} + +The modules described in this chapter provide a variety of specialized +data types such as dates and times, fixed-type arrays, heap queues, +synchronized queues, and sets. + +The following modules are documented in this chapter: + +\localmoduletable Added: python/trunk/Doc/lib/fileformats.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/fileformats.tex Thu Dec 22 21:12:39 2005 @@ -0,0 +1,7 @@ +\chapter{File Formats} +\label{fileformats} + +The modules described in this chapter parse various miscellaneous file +formats that aren't markup languages or are related to e-mail. + +\localmoduletable Added: python/trunk/Doc/lib/filesys.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/filesys.tex Thu Dec 22 21:12:39 2005 @@ -0,0 +1,18 @@ +\chapter{File and Directory Access} +\label{filesys} + +The modules described in this chapter deal with disk files and +directories. For example, there are modules for reading the +properties of files, manipulating paths in a portable way, and +creating temporary files. The full list of modules in this chapter is: + +\localmoduletable + +% XXX can this be included in the seealso environment? --amk +Also see section \ref{bltin-file-objects} for a description +of Python's built-in file objects. + +\begin{seealso} + \seemodule{os}{Operating system interfaces, including functions to + work with files at a lower level than the built-in file object.} +\end{seealso} Added: python/trunk/Doc/lib/i18n.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/i18n.tex Thu Dec 22 21:12:39 2005 @@ -0,0 +1,11 @@ +\chapter{Internationalization} +\label{i18n} + +The modules described in this chapter help you write +software that is independent of language and locale +by providing mechanisms for selecting a language to be used in +program messages or by tailoring output to match local conventions. + +The list of modules described in this chapter is: + +\localmoduletable Added: python/trunk/Doc/lib/ipc.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/ipc.tex Thu Dec 22 21:12:39 2005 @@ -0,0 +1,14 @@ +\chapter{Interprocess Communication and Networking} +\label{ipc} + +The modules described in this chapter provide mechanisms for different +processes to communicate. + +Some modules only work for two processes that are on the same machine, +e.g. \module{signal} and \module{subprocess}. Other modules support +networking protocols that two or more processes can used to +communicate across machines. + +The list of modules described in this chapter is: + +\localmoduletable Added: python/trunk/Doc/lib/numeric.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/numeric.tex Thu Dec 22 21:12:39 2005 @@ -0,0 +1,13 @@ +\chapter{Numeric and Mathematical Modules} +\label{numeric} + +The modules described in this chapter provide +numeric and math-related functions and data types. +The \module{math} and \module{cmath} contain +various mathematical functions for floating-point and complex numbers. +For users more interested in decimal accuracy than in speed, the +\module{decimal} module supports exact representations of decimal numbers. + +The following modules are documented in this chapter: + +\localmoduletable Added: python/trunk/Doc/lib/persistence.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/persistence.tex Thu Dec 22 21:12:39 2005 @@ -0,0 +1,15 @@ +\chapter{Data Persistence} +\label{persistence} + +The modules described in this chapter support storing Python data in a +persistent form on disk. The \module{pickle} and \module{marshal} +modules can turn many Python data types into a stream of bytes and +then recreate the objects from the bytes. The various DBM-related +modules support a family of hash-based file formats that store a +mapping of strings to other strings. The \module{bsddb} module also +provides such disk-based string-to-string mappings based on hashing, +and also supports B-Tree and record-based formats. + +The list of modules described in this chapter is: + +\localmoduletable From python-checkins at python.org Thu Dec 22 21:12:54 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 21:12:54 +0100 (CET) Subject: [Python-checkins] commit of r41795 - python/trunk/Doc/lib/libbsddb.tex Message-ID: <20051222201254.DD0761E4017@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 21:12:54 2005 New Revision: 41795 Modified: python/trunk/Doc/lib/libbsddb.tex Log: Add markup Modified: python/trunk/Doc/lib/libbsddb.tex ============================================================================== --- python/trunk/Doc/lib/libbsddb.tex (original) +++ python/trunk/Doc/lib/libbsddb.tex Thu Dec 22 21:12:54 2005 @@ -12,7 +12,8 @@ using the appropriate open call. Bsddb objects behave generally like dictionaries. Keys and values must be strings, however, so to use other objects as keys or to store other kinds of objects the user must -serialize them somehow, typically using marshal.dumps or pickle.dumps. +serialize them somehow, typically using \function{marshal.dumps()} or +\function{pickle.dumps}. Starting with Python 2.3 the \module{bsddb} module requires the Berkeley DB library version 3.2 or later (it is known to work with 3.2 From python-checkins at python.org Thu Dec 22 21:27:45 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 21:27:45 +0100 (CET) Subject: [Python-checkins] commit of r41796 - python/trunk/Doc/lib/custominterp.tex python/trunk/Doc/lib/development.tex python/trunk/Doc/lib/frameworks.tex python/trunk/Doc/lib/modules.tex Message-ID: <20051222202745.735D91E4010@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 21:27:43 2005 New Revision: 41796 Added: python/trunk/Doc/lib/custominterp.tex python/trunk/Doc/lib/development.tex python/trunk/Doc/lib/frameworks.tex python/trunk/Doc/lib/modules.tex Log: Add more chapter intros Added: python/trunk/Doc/lib/custominterp.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/custominterp.tex Thu Dec 22 21:27:43 2005 @@ -0,0 +1,13 @@ +\chapter{Custom Python Interpreters} +\label{custominterp} + +The modules described in this chapter allow writing interfaces similar +to Python's interactive interpreter. If you want a Python interpreter +that supports some special feature in addition to the Python language, +you should look at the \module{code} module. (The \module{codeop} +module is lower-level, used to support compiling a possibly-incomplete +chunk of Python code.) + +The full list of modules described in this chapter is: + +\localmoduletable Added: python/trunk/Doc/lib/development.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/development.tex Thu Dec 22 21:27:43 2005 @@ -0,0 +1,13 @@ +\chapter{Development Tools} +\label{development} + +The modules described in this chapter help you write software. For +example, the \module{pydoc} module takes a module and generates +documentation based on the module's contents. The \module{doctest} +and \module{unittest} modules contains frameworks for writing unit tests +that automatically exercise code and verify that the expected output +is produced. + +The list of modules described in this chapter is: + +\localmoduletable Added: python/trunk/Doc/lib/frameworks.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/frameworks.tex Thu Dec 22 21:27:43 2005 @@ -0,0 +1,10 @@ +\chapter{Program Frameworks} +\label{frameworks} + +The modules described in this chapter are frameworks that will largely +dictate the structure of your program. Currently the modules described +here are all oriented toward writing command-line interfaces. + +The full list of modules described in this chapter is: + +\localmoduletable Added: python/trunk/Doc/lib/modules.tex ============================================================================== --- (empty file) +++ python/trunk/Doc/lib/modules.tex Thu Dec 22 21:27:43 2005 @@ -0,0 +1,9 @@ +\chapter{Importing Modules} +\label{modules} + +The modules described in this chapter provide new ways to import other +Python modules and hooks for customizing the import process. + +The full list of modules described in this chapter is: + +\localmoduletable From python-checkins at python.org Thu Dec 22 21:34:11 2005 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 22 Dec 2005 21:34:11 +0100 (CET) Subject: [Python-checkins] commit of r41797 - python/trunk/Doc/lib/lib.tex Message-ID: <20051222203411.A6D221E4002@bag.python.org> Author: andrew.kuchling Date: Thu Dec 22 21:34:09 2005 New Revision: 41797 Modified: python/trunk/Doc/lib/lib.tex Log: [Patch #1375417] Massive rearrangement of the Library Reference. Fred approved just checking it in; he may make further fixes. The change shrinks the 'Generic OS' and other OS chapters, which had become something of a dumping ground for random modules. It differs from the last version of the patch: 1) I've added introductions for the new chapters (still missing a few -- search for 'intro') 2) a few modules have been rearranged slightly from the version in the patch Modified: python/trunk/Doc/lib/lib.tex ============================================================================== --- python/trunk/Doc/lib/lib.tex (original) +++ python/trunk/Doc/lib/lib.tex Thu Dec 22 21:34:09 2005 @@ -12,7 +12,7 @@ % .idx file \makemodindex % ... and the module index as well. - + \begin{document} \maketitle @@ -66,129 +66,192 @@ \input{libintro} % Introduction + +% ============= +% BUILT-INs +% ============= + \input{libobjs} % Built-in Types, Exceptions and Functions \input{libfuncs} \input{libstdtypes} \input{libexcs} \input{libconsts} -\input{libpython} % Python Runtime Services -\input{libsys} -\input{libgc} -\input{libweakref} -\input{libfpectl} -\input{libatexit} -\input{libtypes} -\input{libuserdict} -\input{liboperator} -\input{libinspect} -\input{libtraceback} -\input{liblinecache} -\input{libpickle} -\input{libcopyreg} % really copy_reg -\input{libshelve} -\input{libcopy} -\input{libmarshal} -\input{libwarnings} -\input{libimp} -\input{libzipimport} -\input{libpkgutil} -\input{libmodulefinder} -\input{libcode} -\input{libcodeop} -\input{libpprint} -\input{librepr} -\input{libnew} -\input{libsite} -\input{libuser} -\input{libbltin} % really __builtin__ -\input{libmain} % really __main__ -\input{libfuture} % really __future__ + +% ============= +% BASIC/GENERAL-PURPOSE OBJECTS +% ============= + +% Strings \input{libstrings} % String Services \input{libstring} \input{libre} \input{libreconvert} -\input{libstruct} +\input{libstruct} % XXX also/better in File Formats? \input{libdifflib} -\input{libfpformat} \input{libstringio} \input{libtextwrap} \input{libcodecs} \input{libunicodedata} \input{libstringprep} +\input{libfpformat} -\input{libmisc} % Miscellaneous Services -\input{libpydoc} -\input{libdoctest} -\input{libunittest} -\input{libtest} -\input{libdecimal} -\input{libmath} -\input{libcmath} -\input{librandom} -\input{libbisect} + +\input{datatypes} % Data types and structures +\input{libdatetime} +\input{libcalendar} \input{libcollections} \input{libheapq} +\input{libbisect} \input{libarray} \input{libsets} +\input{libsched} +\input{libmutex} +\input{libqueue} +\input{libweakref} +\input{libuserdict} + +% General object services +% XXX intro +\input{libtypes} +\input{libnew} +\input{libcopy} +\input{libpprint} +\input{librepr} + + +\input{numeric} % Numeric/Mathematical modules +\input{libmath} +\input{libcmath} +\input{libdecimal} +\input{librandom} + +% Functions, Functional, Generators and Iterators +% XXX intro functional \input{libitertools} \input{libfunctional} +\input{liboperator} % from runtime - better with itertools and functional + + +% ============= +% DATA FORMATS +% ============= + +% Big move - include all the markup and internet formats here + +% MIME & email stuff +\input{netdata} % Internet Data Handling +\input{email} +\input{libmailcap} +\input{libmailbox} +\input{libmhlib} +\input{libmimetools} +\input{libmimetypes} +\input{libmimewriter} +\input{libmimify} +\input{libmultifile} +\input{librfc822} + +% encoding stuff +\input{libbase64} +\input{libbinascii} +\input{libbinhex} +\input{libquopri} +\input{libuu} + +\input{markup} % Structured Markup Processing Tools +\input{libhtmlparser} +\input{libsgmllib} +\input{libhtmllib} +\input{libpyexpat} +\input{xmldom} +\input{xmldomminidom} +\input{xmldompulldom} +\input{xmlsax} +\input{xmlsaxhandler} +\input{xmlsaxutils} +\input{xmlsaxreader} +% \input{libxmllib} + +\input{fileformats} % Miscellaneous file formats +\input{libcsv} \input{libcfgparser} -\input{libfileinput} -\input{libcalendar} -\input{libcmd} -\input{libshlex} +\input{librobotparser} +\input{libnetrc} +\input{libxdrlib} -\input{liballos} % Generic Operating System Services -\input{libos} +\input{libcrypto} % Cryptographic Services +\input{libhashlib} +\input{libhmac} +\input{libmd5} +\input{libsha} + +% ============= +% FILE & DATABASE STORAGE +% ============= + +\input{filesys} % File/directory support \input{libposixpath} % os.path -\input{libdircache} +\input{libfileinput} \input{libstat} \input{libstatvfs} \input{libfilecmp} -\input{libsubprocess} -\input{libpopen2} -\input{libdatetime} -\input{libtime} -\input{libsched} -\input{libmutex} -\input{libgetpass} -\input{libcurses} -\input{libascii} % curses.ascii -\input{libcursespanel} -\input{libgetopt} -\input{liboptparse} \input{libtempfile} -\input{liberrno} \input{libglob} \input{libfnmatch} +\input{liblinecache} \input{libshutil} -\input{liblocale} -\input{libgettext} +\input{libdircache} + + +\input{archiving} % Data compression and archiving +\input{libzlib} +\input{libgzip} +\input{libbz2} +\input{libzipfile} +\input{libtarfile} + + +\input{persistence} % Persistent storage +\input{libpickle} +\input{libcopyreg} % really copy_reg % from runtime... +\input{libshelve} +\input{libmarshal} +\input{libanydbm} +\input{libwhichdb} +\input{libdbm} +\input{libgdbm} +\input{libdbhash} +\input{libbsddb} +\input{libdumbdbm} + + +% ============= +% OS +% ============= + + +\input{liballos} % Generic Operating System Services +\input{libos} +\input{libtime} +\input{liboptparse} +\input{libgetopt} \input{liblogging} +\input{libgetpass} +\input{libcurses} +\input{libascii} % curses.ascii +\input{libcursespanel} \input{libplatform} +\input{liberrno} \input{libsomeos} % Optional Operating System Services -\input{libsignal} -\input{libsocket} \input{libselect} \input{libthread} \input{libthreading} \input{libdummythread} \input{libdummythreading} -\input{libqueue} \input{libmmap} -\input{libanydbm} -\input{libdbhash} -\input{libwhichdb} -\input{libbsddb} -\input{libdumbdbm} -\input{libzlib} -\input{libgzip} -\input{libbz2} -\input{libzipfile} -\input{libtarfile} \input{libreadline} \input{librlcompleter} @@ -199,8 +262,6 @@ \input{libgrp} \input{libcrypt} \input{libdl} -\input{libdbm} -\input{libgdbm} \input{libtermios} \input{libtty} \input{libpty} @@ -212,11 +273,18 @@ \input{libsyslog} \input{libcommands} -\input{libpdb} % The Python Debugger -\input{libprofile} % The Python Profiler -\input{libhotshot} % New profiler -\input{libtimeit} +% ============= +% NETWORK & COMMUNICATIONS +% ============= + +\input{ipc} % Interprocess communication/networking +\input{libsubprocess} +\input{libsocket} +\input{libsignal} +\input{libpopen2} +\input{libasyncore} +\input{libasynchat} \input{internet} % Internet Protocols \input{libwebbrowser} @@ -243,51 +311,10 @@ \input{libxmlrpclib} \input{libsimplexmlrpc} \input{libdocxmlrpc} -\input{libasyncore} -\input{libasynchat} -\input{netdata} % Internet Data Handling -\input{libformatter} - -% MIME & email stuff -\input{email} -\input{libmailcap} -\input{libmailbox} -\input{libmhlib} -\input{libmimetools} -\input{libmimetypes} -\input{libmimewriter} -\input{libmimify} -\input{libmultifile} -\input{librfc822} - -% encoding stuff -\input{libbase64} -\input{libbinascii} -\input{libbinhex} -\input{libquopri} -\input{libuu} -\input{libxdrlib} - -% file formats -\input{libnetrc} -\input{librobotparser} -\input{libcsv} - -\input{markup} % Structured Markup Processing Tools -\input{libhtmlparser} -\input{libsgmllib} -\input{libhtmllib} -\input{libpyexpat} -\input{xmldom} -\input{xmldomminidom} -\input{xmldompulldom} -\input{xmlsax} -\input{xmlsaxhandler} -\input{xmlsaxutils} -\input{xmlsaxreader} -\input{xmletree} -% \input{libxmllib} +% ============= +% MULTIMEDIA +% ============= \input{libmm} % Multimedia Services \input{libaudioop} @@ -302,18 +329,78 @@ \input{libsndhdr} \input{libossaudiodev} -\input{libcrypto} % Cryptographic Services -\input{libhmac} -\input{libhashlib} -\input{libmd5} -\input{libsha} - +% Tkinter is a chapter in its own right. \input{tkinter} +% % Internationalization +\input{i18n} +\input{libgettext} +\input{liblocale} + +% ============= +% PROGRAM FRAMEWORKS +% ============= +\input{frameworks} +\input{libcmd} +\input{libshlex} + + +% ============= +% DEVELOPMENT TOOLS +% ============= +% % Software development support +\input{development} +\input{libpydoc} +\input{libdoctest} +\input{libunittest} +\input{libtest} + +\input{libpdb} % The Python Debugger + +\input{libprofile} % The Python Profiler +\input{libhotshot} % New profiler +\input{libtimeit} + + +% ============= +% PYTHON ENGINE +% ============= + +% Runtime services +\input{libpython} % Python Runtime Services +\input{libsys} +\input{libbltin} % really __builtin__ +\input{libmain} % really __main__ +\input{libwarnings} +\input{libatexit} +\input{libtraceback} +\input{libfuture} % really __future__ +\input{libgc} +\input{libinspect} +\input{libsite} +\input{libuser} +\input{libfpectl} + + +\input{custominterp} % Custom interpreter +\input{libcode} +\input{libcodeop} \input{librestricted} % Restricted Execution \input{librexec} \input{libbastion} + +\input{modules} % Importing Modules +\input{libimp} +\input{libzipimport} +\input{libpkgutil} +\input{libmodulefinder} + + +% ============= +% PYTHON LANGUAGE & COMPILER +% ============= + \input{language} % Python Language Services \input{libparser} \input{libsymbol} @@ -330,6 +417,13 @@ \input{compiler} % compiler package +\input{libmisc} % Miscellaneous Services +\input{libformatter} + +% ============= +% OTHER PLATFORM-SPECIFIC STUFF +% ============= + %\input{libamoeba} % AMOEBA ONLY %\input{libstdwin} % STDWIN ONLY From python-checkins at python.org Fri Dec 23 22:24:37 2005 From: python-checkins at python.org (neal.norwitz) Date: Fri, 23 Dec 2005 22:24:37 +0100 (CET) Subject: [Python-checkins] commit of r41798 - in python/trunk/Lib: _LWPCookieJar.py _MozillaCookieJar.py cookielib.py test/test_cookielib.py Message-ID: <20051223212437.396E01E4002@bag.python.org> Author: neal.norwitz Date: Fri Dec 23 22:24:35 2005 New Revision: 41798 Modified: python/trunk/Lib/_LWPCookieJar.py python/trunk/Lib/_MozillaCookieJar.py python/trunk/Lib/cookielib.py python/trunk/Lib/test/test_cookielib.py Log: Fix SF #1117398, cookielib LWPCookieJar and MozillaCookieJar exceptions cookielib.LWPCookieJar and .MozillaCookieJar are documented to raise cookielib.LoadError on attempt to load an invalid cookies file, but raise IOError instead. Compromise by having LoadError subclass IOError. Modified: python/trunk/Lib/_LWPCookieJar.py ============================================================================== --- python/trunk/Lib/_LWPCookieJar.py (original) +++ python/trunk/Lib/_LWPCookieJar.py Fri Dec 23 22:24:35 2005 @@ -12,8 +12,8 @@ """ import time, re, logging -from cookielib import (reraise_unmasked_exceptions, FileCookieJar, Cookie, - MISSING_FILENAME_TEXT, join_header_words, split_header_words, +from cookielib import (reraise_unmasked_exceptions, FileCookieJar, LoadError, + Cookie, MISSING_FILENAME_TEXT, join_header_words, split_header_words, iso2time, time2isoz) def lwp_cookie_str(cookie): @@ -93,7 +93,7 @@ magic = f.readline() if not re.search(self.magic_re, magic): msg = "%s does not seem to contain cookies" % filename - raise IOError(msg) + raise LoadError(msg) now = time.time() @@ -161,4 +161,4 @@ self.set_cookie(c) except: reraise_unmasked_exceptions((IOError,)) - raise IOError("invalid Set-Cookie3 format file %s" % filename) + raise LoadError("invalid Set-Cookie3 format file %s" % filename) Modified: python/trunk/Lib/_MozillaCookieJar.py ============================================================================== --- python/trunk/Lib/_MozillaCookieJar.py (original) +++ python/trunk/Lib/_MozillaCookieJar.py Fri Dec 23 22:24:35 2005 @@ -2,8 +2,8 @@ import re, time, logging -from cookielib import (reraise_unmasked_exceptions, FileCookieJar, Cookie, - MISSING_FILENAME_TEXT) +from cookielib import (reraise_unmasked_exceptions, FileCookieJar, LoadError, + Cookie, MISSING_FILENAME_TEXT) class MozillaCookieJar(FileCookieJar): """ @@ -50,7 +50,7 @@ magic = f.readline() if not re.search(self.magic_re, magic): f.close() - raise IOError( + raise LoadError( "%s does not look like a Netscape format cookies file" % filename) @@ -106,8 +106,8 @@ except: reraise_unmasked_exceptions((IOError,)) - raise IOError("invalid Netscape format file %s: %s" % - (filename, line)) + raise LoadError("invalid Netscape format file %s: %s" % + (filename, line)) def save(self, filename=None, ignore_discard=False, ignore_expires=False): if filename is None: Modified: python/trunk/Lib/cookielib.py ============================================================================== --- python/trunk/Lib/cookielib.py (original) +++ python/trunk/Lib/cookielib.py Fri Dec 23 22:24:35 2005 @@ -1682,7 +1682,8 @@ return "<%s[%s]>" % (self.__class__, ", ".join(r)) -class LoadError(Exception): pass +# derives from IOError for backwards-compatibility with Python 2.4.0 +class LoadError(IOError): pass class FileCookieJar(CookieJar): """CookieJar that can be loaded from and saved to a file.""" Modified: python/trunk/Lib/test/test_cookielib.py ============================================================================== --- python/trunk/Lib/test/test_cookielib.py (original) +++ python/trunk/Lib/test/test_cookielib.py Fri Dec 23 22:24:35 2005 @@ -248,6 +248,31 @@ except OSError: pass self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) + def test_bad_magic(self): + from cookielib import LWPCookieJar, MozillaCookieJar, LoadError + # IOErrors (eg. file doesn't exist) are allowed to propagate + filename = test_support.TESTFN + for cookiejar_class in LWPCookieJar, MozillaCookieJar: + c = cookiejar_class() + try: + c.load(filename="for this test to work, a file with this " + "filename should not exist") + except IOError, exc: + # exactly IOError, not LoadError + self.assertEqual(exc.__class__, IOError) + else: + self.fail("expected IOError for invalid filename") + # Invalid contents of cookies file (eg. bad magic string) + # causes a LoadError. + try: + f = open(filename, "w") + f.write("oops\n") + for cookiejar_class in LWPCookieJar, MozillaCookieJar: + c = cookiejar_class() + self.assertRaises(LoadError, c.load, filename) + finally: + try: os.unlink(filename) + except OSError: pass class CookieTests(TestCase): # XXX From python-checkins at python.org Fri Dec 23 22:27:47 2005 From: python-checkins at python.org (neal.norwitz) Date: Fri, 23 Dec 2005 22:27:47 +0100 (CET) Subject: [Python-checkins] commit of r41799 - python/trunk/Misc/NEWS Message-ID: <20051223212747.B116F1E4002@bag.python.org> Author: neal.norwitz Date: Fri Dec 23 22:27:46 2005 New Revision: 41799 Modified: python/trunk/Misc/NEWS Log: Patch #1117398: fix cookielib LoadError Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Dec 23 22:27:46 2005 @@ -314,6 +314,10 @@ Library ------- +- Patch #1117398: cookielib.LWPCookieJar and .MozillaCookieJar now raise + LoadError as documented, instead of IOError. For compatibility, + LoadError subclasses IOError. + - Added the hashlib module. It provides secure hash functions for MD5 and SHA1, 224, 256, 384, and 512. Note that recent developments make the historic MD5 and SHA1 unsuitable for cryptographic-strength applications. From python-checkins at python.org Fri Dec 23 22:32:08 2005 From: python-checkins at python.org (neal.norwitz) Date: Fri, 23 Dec 2005 22:32:08 +0100 (CET) Subject: [Python-checkins] commit of r41800 - in python/branches/release24-maint: Lib/_LWPCookieJar.py Lib/_MozillaCookieJar.py Lib/cookielib.py Lib/test/test_cookielib.py Misc/NEWS Message-ID: <20051223213208.31EDC1E4002@bag.python.org> Author: neal.norwitz Date: Fri Dec 23 22:32:06 2005 New Revision: 41800 Modified: python/branches/release24-maint/Lib/_LWPCookieJar.py python/branches/release24-maint/Lib/_MozillaCookieJar.py python/branches/release24-maint/Lib/cookielib.py python/branches/release24-maint/Lib/test/test_cookielib.py python/branches/release24-maint/Misc/NEWS Log: Backport: Patch #1117398: fix cookielib LoadError Modified: python/branches/release24-maint/Lib/_LWPCookieJar.py ============================================================================== --- python/branches/release24-maint/Lib/_LWPCookieJar.py (original) +++ python/branches/release24-maint/Lib/_LWPCookieJar.py Fri Dec 23 22:32:06 2005 @@ -12,8 +12,8 @@ """ import time, re, logging -from cookielib import (reraise_unmasked_exceptions, FileCookieJar, Cookie, - MISSING_FILENAME_TEXT, join_header_words, split_header_words, +from cookielib import (reraise_unmasked_exceptions, FileCookieJar, LoadError, + Cookie, MISSING_FILENAME_TEXT, join_header_words, split_header_words, iso2time, time2isoz) def lwp_cookie_str(cookie): @@ -93,7 +93,7 @@ magic = f.readline() if not re.search(self.magic_re, magic): msg = "%s does not seem to contain cookies" % filename - raise IOError(msg) + raise LoadError(msg) now = time.time() @@ -161,4 +161,4 @@ self.set_cookie(c) except: reraise_unmasked_exceptions((IOError,)) - raise IOError("invalid Set-Cookie3 format file %s" % filename) + raise LoadError("invalid Set-Cookie3 format file %s" % filename) Modified: python/branches/release24-maint/Lib/_MozillaCookieJar.py ============================================================================== --- python/branches/release24-maint/Lib/_MozillaCookieJar.py (original) +++ python/branches/release24-maint/Lib/_MozillaCookieJar.py Fri Dec 23 22:32:06 2005 @@ -2,8 +2,8 @@ import re, time, logging -from cookielib import (reraise_unmasked_exceptions, FileCookieJar, Cookie, - MISSING_FILENAME_TEXT) +from cookielib import (reraise_unmasked_exceptions, FileCookieJar, LoadError, + Cookie, MISSING_FILENAME_TEXT) class MozillaCookieJar(FileCookieJar): """ @@ -50,7 +50,7 @@ magic = f.readline() if not re.search(self.magic_re, magic): f.close() - raise IOError( + raise LoadError( "%s does not look like a Netscape format cookies file" % filename) @@ -106,8 +106,8 @@ except: reraise_unmasked_exceptions((IOError,)) - raise IOError("invalid Netscape format file %s: %s" % - (filename, line)) + raise LoadError("invalid Netscape format file %s: %s" % + (filename, line)) def save(self, filename=None, ignore_discard=False, ignore_expires=False): if filename is None: Modified: python/branches/release24-maint/Lib/cookielib.py ============================================================================== --- python/branches/release24-maint/Lib/cookielib.py (original) +++ python/branches/release24-maint/Lib/cookielib.py Fri Dec 23 22:32:06 2005 @@ -1687,7 +1687,8 @@ return "<%s[%s]>" % (self.__class__, ", ".join(r)) -class LoadError(Exception): pass +# derives from IOError for backwards-compatibility with Python 2.4.0 +class LoadError(IOError): pass class FileCookieJar(CookieJar): """CookieJar that can be loaded from and saved to a file.""" Modified: python/branches/release24-maint/Lib/test/test_cookielib.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_cookielib.py (original) +++ python/branches/release24-maint/Lib/test/test_cookielib.py Fri Dec 23 22:32:06 2005 @@ -248,6 +248,31 @@ except OSError: pass self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) + def test_bad_magic(self): + from cookielib import LWPCookieJar, MozillaCookieJar, LoadError + # IOErrors (eg. file doesn't exist) are allowed to propagate + filename = test_support.TESTFN + for cookiejar_class in LWPCookieJar, MozillaCookieJar: + c = cookiejar_class() + try: + c.load(filename="for this test to work, a file with this " + "filename should not exist") + except IOError, exc: + # exactly IOError, not LoadError + self.assertEqual(exc.__class__, IOError) + else: + self.fail("expected IOError for invalid filename") + # Invalid contents of cookies file (eg. bad magic string) + # causes a LoadError. + try: + f = open(filename, "w") + f.write("oops\n") + for cookiejar_class in LWPCookieJar, MozillaCookieJar: + c = cookiejar_class() + self.assertRaises(LoadError, c.load, filename) + finally: + try: os.unlink(filename) + except OSError: pass class CookieTests(TestCase): # XXX Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Fri Dec 23 22:32:06 2005 @@ -53,6 +53,10 @@ Library ------- +- Patch #1117398: cookielib.LWPCookieJar and .MozillaCookieJar now raise + LoadError as documented, instead of IOError. For compatibility, + LoadError subclasses IOError. + - Bug #1365984: urllib now opens "data:" URLs again. - Patch #1314396: Prevent threading.Thread.join() from blocking if a previous From python-checkins at python.org Fri Dec 23 22:42:40 2005 From: python-checkins at python.org (neal.norwitz) Date: Fri, 23 Dec 2005 22:42:40 +0100 (CET) Subject: [Python-checkins] commit of r41801 - python/trunk/Doc/Makefile.deps Message-ID: <20051223214240.554DA1E4002@bag.python.org> Author: neal.norwitz Date: Fri Dec 23 22:42:39 2005 New Revision: 41801 Modified: python/trunk/Doc/Makefile.deps Log: Add missing dep for cookielib doc Modified: python/trunk/Doc/Makefile.deps ============================================================================== --- python/trunk/Doc/Makefile.deps (original) +++ python/trunk/Doc/Makefile.deps Fri Dec 23 22:42:39 2005 @@ -271,6 +271,7 @@ lib/libgettext.tex \ lib/libbasehttp.tex \ lib/libcookie.tex \ + lib/libcookielib.tex \ lib/libcopyreg.tex \ lib/libsymbol.tex \ lib/libbinhex.tex \ From python-checkins at python.org Fri Dec 23 22:43:49 2005 From: python-checkins at python.org (neal.norwitz) Date: Fri, 23 Dec 2005 22:43:49 +0100 (CET) Subject: [Python-checkins] commit of r41802 - in python/trunk: Doc/lib/libcookielib.tex Lib/cookielib.py Lib/test/test_cookielib.py Message-ID: <20051223214349.71BBB1E4002@bag.python.org> Author: neal.norwitz Date: Fri Dec 23 22:43:48 2005 New Revision: 41802 Modified: python/trunk/Doc/lib/libcookielib.tex python/trunk/Lib/cookielib.py python/trunk/Lib/test/test_cookielib.py Log: SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode Modified: python/trunk/Doc/lib/libcookielib.tex ============================================================================== --- python/trunk/Doc/lib/libcookielib.tex (original) +++ python/trunk/Doc/lib/libcookielib.tex Fri Dec 23 22:43:48 2005 @@ -18,17 +18,18 @@ Both the regular Netscape cookie protocol and the protocol defined by \rfc{2965} are handled. RFC 2965 handling is switched off by default. \rfc{2109} cookies are parsed as Netscape cookies and subsequently -treated as RFC 2965 cookies. Note that the great majority of cookies -on the Internet are Netscape cookies. \module{cookielib} attempts to -follow the de-facto Netscape cookie protocol (which differs -substantially from that set out in the original Netscape -specification), including taking note of the \code{max-age} and -\code{port} cookie-attributes introduced with RFC 2109. \note{The -various named parameters found in \mailheader{Set-Cookie} and -\mailheader{Set-Cookie2} headers (eg. \code{domain} and -\code{expires}) are conventionally referred to as \dfn{attributes}. -To distinguish them from Python attributes, the documentation for this -module uses the term \dfn{cookie-attribute} instead}. +treated either as Netscape or RFC 2965 cookies according to the +'policy' in effect. Note that the great majority of cookies on the +Internet are Netscape cookies. \module{cookielib} attempts to follow +the de-facto Netscape cookie protocol (which differs substantially +from that set out in the original Netscape specification), including +taking note of the \code{max-age} and \code{port} cookie-attributes +introduced with RFC 2109. \note{The various named parameters found in +\mailheader{Set-Cookie} and \mailheader{Set-Cookie2} headers +(eg. \code{domain} and \code{expires}) are conventionally referred to +as \dfn{attributes}. To distinguish them from Python attributes, the +documentation for this module uses the term \dfn{cookie-attribute} +instead}. The module defines the following exception: @@ -74,6 +75,7 @@ blocked_domains=\constant{None}, allowed_domains=\constant{None}, netscape=\constant{True}, rfc2965=\constant{False}, + rfc2109_as_netscape=\constant{None}, hide_cookie2=\constant{False}, strict_domain=\constant{False}, strict_rfc2965_unverifiable=\constant{True}, @@ -92,10 +94,14 @@ objects. \class{DefaultCookiePolicy} implements the standard accept / reject -rules for Netscape and RFC 2965 cookies. RFC 2109 cookies +rules for Netscape and RFC 2965 cookies. By default, RFC 2109 cookies (ie. cookies received in a \mailheader{Set-Cookie} header with a version cookie-attribute of 1) are treated according to the RFC 2965 -rules. \class{DefaultCookiePolicy} also provides some parameters to +rules. However, if RFC 2965 handling is turned off or +\member{rfc2109_as_netscape} is True, RFC 2109 cookies are +'downgraded' by the \class{CookieJar} instance to Netscape cookies, by +setting the \member{version} attribute of the \class{Cookie} instance +to 0. \class{DefaultCookiePolicy} also provides some parameters to allow some fine-tuning of policy. \end{classdesc} @@ -493,6 +499,17 @@ which are all initialised from the constructor arguments of the same name, and which may all be assigned to. +\begin{memberdesc}{rfc2109_as_netscape} +If true, request that the \class{CookieJar} instance downgrade RFC +2109 cookies (ie. cookies received in a \mailheader{Set-Cookie} header +with a version cookie-attribute of 1) to Netscape cookies by setting +the version attribute of the \class{Cookie} instance to 0. The +default value is \constant{None}, in which case RFC 2109 cookies are +downgraded if and only if RFC 2965 handling is turned off. Therefore, +RFC 2109 cookies are downgraded by default. +\versionadded{2.5} +\end{memberdesc} + General strictness switches: \begin{memberdesc}{strict_domain} @@ -567,9 +584,10 @@ \class{Cookie} instances have Python attributes roughly corresponding to the standard cookie-attributes specified in the various cookie standards. The correspondence is not one-to-one, because there are -complicated rules for assigning default values, and because the +complicated rules for assigning default values, because the \code{max-age} and \code{expires} cookie-attributes contain equivalent -information. +information, and because RFC 2109 cookies may be 'downgraded' by +\module{cookielib} from version 1 to version 0 (Netscape) cookies. Assignment to these attributes should not be necessary other than in rare circumstances in a \class{CookiePolicy} method. The class does @@ -577,8 +595,10 @@ doing if you do that. \begin{memberdesc}[Cookie]{version} -Integer or \constant{None}. Netscape cookies have version 0. RFC -2965 and RFC 2109 cookies have version 1. +Integer or \constant{None}. Netscape cookies have \member{version} 0. +RFC 2965 and RFC 2109 cookies have a \code{version} cookie-attribute +of 1. However, note that \module{cookielib} may 'downgrade' RFC 2109 +cookies to Netscape cookies, in which case \member{version} is 0. \end{memberdesc} \begin{memberdesc}[Cookie]{name} Cookie name (a string). @@ -611,6 +631,14 @@ URL linking to a comment from the server explaining the function of this cookie, or \constant{None}. \end{memberdesc} +\begin{memberdesc}[Cookie]{rfc2109} +True if this cookie was received as an RFC 2109 cookie (ie. the cookie +arrived in a \mailheader{Set-Cookie} header, and the value of the +Version cookie-attribute in that header was 1). This attribute is +provided because \module{cookielib} may 'downgrade' RFC 2109 cookies +to Netscape cookies, in which case \member{version} is 0. +\versionadded{2.5} +\end{memberdesc} \begin{memberdesc}[Cookie]{port_specified} True if a port or set of ports was explicitly specified by the server Modified: python/trunk/Lib/cookielib.py ============================================================================== --- python/trunk/Lib/cookielib.py (original) +++ python/trunk/Lib/cookielib.py Fri Dec 23 22:43:48 2005 @@ -460,10 +460,7 @@ if lc in known_attrs: k = lc if k == "version": - # This is an RFC 2109 cookie. Will be treated as RFC 2965 - # cookie in rest of code. - # Probably it should be parsed with split_header_words, but - # that's too much hassle. + # This is an RFC 2109 cookie. version_set = True if k == "expires": # convert expires date to seconds since epoch @@ -723,7 +720,9 @@ discard, comment, comment_url, - rest): + rest, + rfc2109=False, + ): if version is not None: version = int(version) if expires is not None: expires = int(expires) @@ -750,6 +749,7 @@ self.discard = discard self.comment = comment self.comment_url = comment_url + self.rfc2109 = rfc2109 self._rest = copy.copy(rest) @@ -787,6 +787,7 @@ attr = getattr(self, name) args.append("%s=%s" % (name, repr(attr))) args.append("rest=%s" % repr(self._rest)) + args.append("rfc2109=%s" % repr(self.rfc2109)) return "Cookie(%s)" % ", ".join(args) @@ -836,6 +837,7 @@ def __init__(self, blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, + rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, @@ -847,6 +849,7 @@ """Constructor arguments should be passed as keyword arguments only.""" self.netscape = netscape self.rfc2965 = rfc2965 + self.rfc2109_as_netscape = rfc2109_as_netscape self.hide_cookie2 = hide_cookie2 self.strict_domain = strict_domain self.strict_rfc2965_unverifiable = strict_rfc2965_unverifiable @@ -1518,6 +1521,18 @@ if cookie: cookies.append(cookie) return cookies + def _process_rfc2109_cookies(self, cookies): + rfc2109_as_ns = getattr(self._policy, 'rfc2109_as_netscape', None) + if rfc2109_as_ns is None: + rfc2109_as_ns = not self._policy.rfc2965 + for cookie in cookies: + if cookie.version == 1: + cookie.rfc2109 = True + if rfc2109_as_ns: + # treat 2109 cookies as Netscape cookies rather than + # as RFC2965 cookies + cookie.version = 0 + def make_cookies(self, response, request): """Return sequence of Cookie objects extracted from response object.""" # get cookie-attributes for RFC 2965 and Netscape protocols @@ -1543,11 +1558,13 @@ if ns_hdrs and netscape: try: + # RFC 2109 and Netscape cookies ns_cookies = self._cookies_from_attrs_set( parse_ns_headers(ns_hdrs), request) except: reraise_unmasked_exceptions() ns_cookies = [] + self._process_rfc2109_cookies(ns_cookies) # Look for Netscape cookies (from Set-Cookie headers) that match # corresponding RFC 2965 cookies (from Set-Cookie2 headers). Modified: python/trunk/Lib/test/test_cookielib.py ============================================================================== --- python/trunk/Lib/test/test_cookielib.py (original) +++ python/trunk/Lib/test/test_cookielib.py Fri Dec 23 22:43:48 2005 @@ -386,6 +386,39 @@ self.assertEquals(interact_netscape(c, "http://www.acme.com/foo/"), '"spam"; eggs') + def test_rfc2109_handling(self): + # RFC 2109 cookies are handled as RFC 2965 or Netscape cookies, + # dependent on policy settings + from cookielib import CookieJar, DefaultCookiePolicy + + for rfc2109_as_netscape, rfc2965, version in [ + # default according to rfc2965 if not explicitly specified + (None, False, 0), + (None, True, 1), + # explicit rfc2109_as_netscape + (False, False, None), # version None here means no cookie stored + (False, True, 1), + (True, False, 0), + (True, True, 0), + ]: + policy = DefaultCookiePolicy( + rfc2109_as_netscape=rfc2109_as_netscape, + rfc2965=rfc2965) + c = CookieJar(policy) + interact_netscape(c, "http://www.example.com/", "ni=ni; Version=1") + try: + cookie = c._cookies["www.example.com"]["/"]["ni"] + except KeyError: + self.assert_(version is None) # didn't expect a stored cookie + else: + self.assertEqual(cookie.version, version) + # 2965 cookies are unaffected + interact_2965(c, "http://www.example.com/", + "foo=bar; Version=1") + if rfc2965: + cookie2965 = c._cookies["www.example.com"]["/"]["foo"] + self.assertEqual(cookie2965.version, 1) + def test_ns_parser(self): from cookielib import CookieJar, DEFAULT_HTTP_PORT From python-checkins at python.org Fri Dec 23 22:44:37 2005 From: python-checkins at python.org (neal.norwitz) Date: Fri, 23 Dec 2005 22:44:37 +0100 (CET) Subject: [Python-checkins] commit of r41803 - python/trunk/Misc/NEWS Message-ID: <20051223214437.2F1431E4002@bag.python.org> Author: neal.norwitz Date: Fri Dec 23 22:44:36 2005 New Revision: 41803 Modified: python/trunk/Misc/NEWS Log: Patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Dec 23 22:44:36 2005 @@ -314,6 +314,8 @@ Library ------- +- Patch #1157027: cookielib mishandles RFC 2109 cookies in Netscape mode + - Patch #1117398: cookielib.LWPCookieJar and .MozillaCookieJar now raise LoadError as documented, instead of IOError. For compatibility, LoadError subclasses IOError. From python-checkins at python.org Sat Dec 24 02:49:00 2005 From: python-checkins at python.org (neal.norwitz) Date: Sat, 24 Dec 2005 02:49:00 +0100 (CET) Subject: [Python-checkins] commit of r41804 - python/trunk/Doc/tools Message-ID: <20051224014900.C77C91E4002@bag.python.org> Author: neal.norwitz Date: Sat Dec 24 02:48:56 2005 New Revision: 41804 Modified: python/trunk/Doc/tools/ (props changed) Log: Ignore pyc files for building doc From python-checkins at python.org Sat Dec 24 07:03:07 2005 From: python-checkins at python.org (tim.peters) Date: Sat, 24 Dec 2005 07:03:07 +0100 (CET) Subject: [Python-checkins] commit of r41805 - in python/trunk: Include/structmember.h PC/_winreg.c Python/structmember.c Message-ID: <20051224060307.C43701E4002@bag.python.org> Author: tim.peters Date: Sat Dec 24 07:03:06 2005 New Revision: 41805 Modified: python/trunk/Include/structmember.h python/trunk/PC/_winreg.c python/trunk/Python/structmember.c Log: const poisoning, spreading to fix new const warnings in _winreg.c. Modified: python/trunk/Include/structmember.h ============================================================================== --- python/trunk/Include/structmember.h (original) +++ python/trunk/Include/structmember.h Sat Dec 24 07:03:06 2005 @@ -79,11 +79,11 @@ /* Obsolete API, for binary backwards compatibility */ -PyAPI_FUNC(PyObject *) PyMember_Get(char *, struct memberlist *, char *); -PyAPI_FUNC(int) PyMember_Set(char *, struct memberlist *, char *, PyObject *); +PyAPI_FUNC(PyObject *) PyMember_Get(const char *, struct memberlist *, const char *); +PyAPI_FUNC(int) PyMember_Set(char *, struct memberlist *, const char *, PyObject *); /* Current API, use this */ -PyAPI_FUNC(PyObject *) PyMember_GetOne(char *, struct PyMemberDef *); +PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); Modified: python/trunk/PC/_winreg.c ============================================================================== --- python/trunk/PC/_winreg.c (original) +++ python/trunk/PC/_winreg.c Sat Dec 24 07:03:06 2005 @@ -455,7 +455,7 @@ /* fwd declare __getattr__ */ -static PyObject *PyHKEY_getattr(PyObject *self, char *name); +static PyObject *PyHKEY_getattr(PyObject *self, const char *name); /* The type itself */ PyTypeObject PyHKEY_Type = @@ -526,7 +526,7 @@ }; /*static*/ PyObject * -PyHKEY_getattr(PyObject *self, char *name) +PyHKEY_getattr(PyObject *self, const char *name) { PyObject *res; Modified: python/trunk/Python/structmember.c ============================================================================== --- python/trunk/Python/structmember.c (original) +++ python/trunk/Python/structmember.c Sat Dec 24 07:03:06 2005 @@ -29,7 +29,7 @@ } PyObject * -PyMember_Get(char *addr, struct memberlist *mlist, char *name) +PyMember_Get(const char *addr, struct memberlist *mlist, const char *name) { struct memberlist *l; @@ -51,7 +51,7 @@ } PyObject * -PyMember_GetOne(char *addr, PyMemberDef *l) +PyMember_GetOne(const char *addr, PyMemberDef *l) { PyObject *v; if ((l->flags & READ_RESTRICTED) && @@ -134,7 +134,7 @@ } int -PyMember_Set(char *addr, struct memberlist *mlist, char *name, PyObject *v) +PyMember_Set(char *addr, struct memberlist *mlist, const char *name, PyObject *v) { struct memberlist *l; From python-checkins at python.org Sat Dec 24 07:23:41 2005 From: python-checkins at python.org (tim.peters) Date: Sat, 24 Dec 2005 07:23:41 +0100 (CET) Subject: [Python-checkins] commit of r41806 - python/trunk/Python/modsupport.c Message-ID: <20051224062341.98B531E4002@bag.python.org> Author: tim.peters Date: Sat Dec 24 07:23:41 2005 New Revision: 41806 Modified: python/trunk/Python/modsupport.c Log: do_mkvalue(), 'I' and 'k' cases: squash legitimate compiler warnings about mixing signed and unsigned types in comparisons. Modified: python/trunk/Python/modsupport.c ============================================================================== --- python/trunk/Python/modsupport.c (original) +++ python/trunk/Python/modsupport.c Sat Dec 24 07:23:41 2005 @@ -307,7 +307,7 @@ { unsigned int n; n = va_arg(*p_va, unsigned int); - if (n > PyInt_GetMax()) + if (n > (unsigned long)PyInt_GetMax()) return PyLong_FromUnsignedLong((unsigned long)n); else return PyInt_FromLong(n); @@ -320,7 +320,7 @@ { unsigned long n; n = va_arg(*p_va, unsigned long); - if (n > PyInt_GetMax()) + if (n > (unsigned long)PyInt_GetMax()) return PyLong_FromUnsignedLong(n); else return PyInt_FromLong(n); From dundi-bounces at lists.digium.com Fri Dec 23 10:17:02 2005 From: dundi-bounces at lists.digium.com (dundi-bounces@lists.digium.com) Date: Fri, 23 Dec 2005 03:17:02 -0600 Subject: [Python-checkins] Your message to Dundi awaits moderator approval Message-ID: Your mail to 'Dundi' with the subject hi, ive a new mail address Is being held until the list moderator can review it for approval. The reason it is being held: Post by non-member to a members-only list Either the message will get posted to the list, or you will receive notification of the moderator's decision. If you would like to cancel this posting, please visit the following URL: http://lists.digium.com/mailman/confirm/dundi/7d126321bbd9f39ee186301ee2c24a34668c7ebe From asterisk-security-bounces at lists.digium.com Fri Dec 23 10:17:00 2005 From: asterisk-security-bounces at lists.digium.com (asterisk-security-bounces@lists.digium.com) Date: Fri, 23 Dec 2005 03:17:00 -0600 Subject: [Python-checkins] Your message to Asterisk-Security awaits moderator approval Message-ID: Your mail to 'Asterisk-Security' with the subject hi, ive a new mail address Is being held until the list moderator can review it for approval. The reason it is being held: Post by non-member to a members-only list Either the message will get posted to the list, or you will receive notification of the moderator's decision. If you would like to cancel this posting, please visit the following URL: http://lists.digium.com/mailman/confirm/asterisk-security/08e8879dfde2b8c454540b28502866dff7bf7f0d From asterisk-ss7-bounces at lists.digium.com Fri Dec 23 10:17:04 2005 From: asterisk-ss7-bounces at lists.digium.com (asterisk-ss7-bounces@lists.digium.com) Date: Fri, 23 Dec 2005 03:17:04 -0600 Subject: [Python-checkins] Your message to Asterisk-SS7 awaits moderator approval Message-ID: Your mail to 'Asterisk-SS7' with the subject hi, ive a new mail address Is being held until the list moderator can review it for approval. The reason it is being held: Post by non-member to a members-only list Either the message will get posted to the list, or you will receive notification of the moderator's decision. If you would like to cancel this posting, please visit the following URL: http://lists.digium.com/mailman/confirm/asterisk-ss7/0c3b49bb6615e123580a26cbdfc836a04028991a From python-checkins at python.org Sun Dec 25 12:36:46 2005 From: python-checkins at python.org (fredrik.lundh) Date: Sun, 25 Dec 2005 12:36:46 +0100 (CET) Subject: [Python-checkins] commit of r41807 - python/trunk/Doc/lib/libpprint.tex Message-ID: <20051225113646.1B3281E4002@bag.python.org> Author: fredrik.lundh Date: Sun Dec 25 12:36:43 2005 New Revision: 41807 Modified: python/trunk/Doc/lib/libpprint.tex Log: fixed two typos in pprint reference page Modified: python/trunk/Doc/lib/libpprint.tex ============================================================================== --- python/trunk/Doc/lib/libpprint.tex (original) +++ python/trunk/Doc/lib/libpprint.tex Sun Dec 25 12:36:43 2005 @@ -197,10 +197,10 @@ presented which is already represented in \var{context}, the third return value should be true. Recursive calls to the \method{format()} method should add additional entries for containers to this -dictionary. The fourth argument, \var{maxlevels}, gives the requested +dictionary. The third argument, \var{maxlevels}, gives the requested limit to recursion; this will be \code{0} if there is no requested limit. This argument should be passed unmodified to recursive calls. -The fourth argument, \var{level} gives the current level; recursive +The fourth argument, \var{level}, gives the current level; recursive calls should be passed a value less than that of the current call. \versionadded{2.3} \end{methoddesc} From python-checkins at python.org Sun Dec 25 12:40:20 2005 From: python-checkins at python.org (fredrik.lundh) Date: Sun, 25 Dec 2005 12:40:20 +0100 (CET) Subject: [Python-checkins] commit of r41808 - python/trunk/Modules/_elementtree.c Message-ID: <20051225114020.9EF401E4002@bag.python.org> Author: fredrik.lundh Date: Sun Dec 25 12:40:19 2005 New Revision: 41808 Modified: python/trunk/Modules/_elementtree.c Log: SF#1389809 cast first PyUnicode_Decode argument to proper type (why is "char *" used for encoded byte streams, btw? shouldn't that be "void *" or, if necessary, "unsigned char *"?) Modified: python/trunk/Modules/_elementtree.c ============================================================================== --- python/trunk/Modules/_elementtree.c (original) +++ python/trunk/Modules/_elementtree.c Sun Dec 25 12:40:19 2005 @@ -2146,7 +2146,7 @@ for (i = 0; i < 256; i++) s[i] = i; - u = PyUnicode_Decode(s, 256, name, "replace"); + u = PyUnicode_Decode((char*) s, 256, name, "replace"); if (!u) return XML_STATUS_ERROR; From python-checkins at python.org Sun Dec 25 13:05:44 2005 From: python-checkins at python.org (fredrik.lundh) Date: Sun, 25 Dec 2005 13:05:44 +0100 (CET) Subject: [Python-checkins] commit of r41809 - python/trunk/Doc/lib/libpprint.tex Message-ID: <20051225120544.5B63C1E4002@bag.python.org> Author: fredrik.lundh Date: Sun Dec 25 13:05:42 2005 New Revision: 41809 Modified: python/trunk/Doc/lib/libpprint.tex Log: fixed one more typo Modified: python/trunk/Doc/lib/libpprint.tex ============================================================================== --- python/trunk/Doc/lib/libpprint.tex (original) +++ python/trunk/Doc/lib/libpprint.tex Sun Dec 25 13:05:42 2005 @@ -156,7 +156,7 @@ \begin{methoddesc}{pformat}{object} Return the formatted representation of \var{object}. This takes into -Account the options passed to the \class{PrettyPrinter} constructor. +account the options passed to the \class{PrettyPrinter} constructor. \end{methoddesc} \begin{methoddesc}{pprint}{object} From python-checkins at python.org Sun Dec 25 17:28:49 2005 From: python-checkins at python.org (tim.peters) Date: Sun, 25 Dec 2005 17:28:49 +0100 (CET) Subject: [Python-checkins] commit of r41810 - python/trunk/PCbuild/pythoncore.vcproj Message-ID: <20051225162849.CA35A1E4002@bag.python.org> Author: tim.peters Date: Sun Dec 25 17:28:48 2005 New Revision: 41810 Modified: python/trunk/PCbuild/pythoncore.vcproj Log: Repair longstanding damage introduced by the AST merge: - Get rid of pgen.c and tokenizer_pgen.c. - Include tokenizer.c. All the -uall tests pass on my WinXP VC7.1 box now. Modified: python/trunk/PCbuild/pythoncore.vcproj ============================================================================== --- python/trunk/PCbuild/pythoncore.vcproj (original) +++ python/trunk/PCbuild/pythoncore.vcproj Sun Dec 25 17:28:48 2005 @@ -2486,9 +2486,6 @@ - - @@ -3227,7 +3224,31 @@ + RelativePath="..\Parser\tokenizer.c"> + + + + + + + + + From python-checkins at python.org Sun Dec 25 23:52:34 2005 From: python-checkins at python.org (tim.peters) Date: Sun, 25 Dec 2005 23:52:34 +0100 (CET) Subject: [Python-checkins] commit of r41811 - python/trunk/Lib/test/test_dis.py Message-ID: <20051225225234.BEDFD1E4002@bag.python.org> Author: tim.peters Date: Sun Dec 25 23:52:32 2005 New Revision: 41811 Modified: python/trunk/Lib/test/test_dis.py Log: test_bug_1333982(): This one must fail under -O. All the --all test pass using -O on WinXP now. Modified: python/trunk/Lib/test/test_dis.py ============================================================================== --- python/trunk/Lib/test/test_dis.py (original) +++ python/trunk/Lib/test/test_dis.py Sun Dec 25 23:52:32 2005 @@ -121,7 +121,10 @@ self.do_disassembly_test(bug708901, dis_bug708901) def test_bug_1333982(self): - self.do_disassembly_test(bug1333982, dis_bug1333982) + # This one is checking bytecodes generated for an `assert` statement, + # so fails if the tests are run with -O. Skip this test then. + if __debug__: + self.do_disassembly_test(bug1333982, dis_bug1333982) def test_main(): run_unittest(DisTests) From python-checkins at python.org Mon Dec 26 00:19:07 2005 From: python-checkins at python.org (tim.peters) Date: Mon, 26 Dec 2005 00:19:07 +0100 (CET) Subject: [Python-checkins] commit of r41812 - in python/trunk: Lib/SimpleXMLRPCServer.py Lib/codecs.py Lib/cookielib.py Lib/encodings/cp037.py Lib/encodings/cp1006.py Lib/encodings/cp1026.py Lib/encodings/cp1140.py Lib/encodings/cp1250.py Lib/encodings/cp1251.py Lib/encodings/cp1252.py Lib/encodings/cp1253.py Lib/encodings/cp1254.py Lib/encodings/cp1255.py Lib/encodings/cp1256.py Lib/encodings/cp1257.py Lib/encodings/cp1258.py Lib/encodings/cp424.py Lib/encodings/cp437.py Lib/encodings/cp500.py Lib/encodings/cp737.py Lib/encodings/cp775.py Lib/encodings/cp850.py Lib/encodings/cp852.py Lib/encodings/cp855.py Lib/encodings/cp856.py Lib/encodings/cp857.py Lib/encodings/cp860.py Lib/encodings/cp861.py Lib/encodings/cp862.py Lib/encodings/cp863.py Lib/encodings/cp864.py Lib/encodings/cp865.py Lib/encodings/cp866.py Lib/encodings/cp869.py Lib/encodings/cp874.py Lib/encodings/cp875.py Lib/encodings/iso8859_1.py Lib/encodings/iso8859_10.py Lib/encodings/iso8859_11.py Lib/encodings/iso8859_13.py Lib/encodings/iso8859_14.py Lib/encodings/iso8859_15.py Lib/encodings/iso8859_16.py Lib/encodings/iso8859_2.py Lib/encodings/iso8859_3.py Lib/encodings/iso8859_4.py Lib/encodings/iso8859_5.py Lib/encodings/iso8859_6.py Lib/encodings/iso8859_7.py Lib/encodings/iso8859_8.py Lib/encodings/iso8859_9.py Lib/encodings/koi8_r.py Lib/encodings/koi8_u.py Lib/encodings/mac_arabic.py Lib/encodings/mac_centeuro.py Lib/encodings/mac_croatian.py Lib/encodings/mac_cyrillic.py Lib/encodings/mac_farsi.py Lib/encodings/mac_greek.py Lib/encodings/mac_iceland.py Lib/encodings/mac_roman.py Lib/encodings/mac_romanian.py Lib/encodings/mac_turkish.py Lib/encodings/tis_620.py Lib/test/bad_coding2.py Lib/test/test_code.py Lib/test/test_exception_variations.py Lib/test/test_generators.py Lib/test/test_minidom.py Lib/test/test_poll.py Lib/test/test_quopri.py Lib/test/test_xmlrpc.py Lib/webbrowser.py Lib/xmlcore/etree/ElementInclude.py Lib/xmlcore/etree/ElementPath.py Parser/asdl.py Parser/asdl_c.py Parser/spark.py Tools/bgen/bgen/bgenGenerator.py Tools/bgen/bgen/bgenHeapBuffer.py Tools/compiler/dumppyc.py Tools/unicode/gencodec.py Message-ID: <20051225231907.A1F451E4002@bag.python.org> Author: tim.peters Date: Mon Dec 26 00:18:31 2005 New Revision: 41812 Modified: python/trunk/Lib/SimpleXMLRPCServer.py python/trunk/Lib/codecs.py python/trunk/Lib/cookielib.py python/trunk/Lib/encodings/cp037.py python/trunk/Lib/encodings/cp1006.py python/trunk/Lib/encodings/cp1026.py python/trunk/Lib/encodings/cp1140.py python/trunk/Lib/encodings/cp1250.py python/trunk/Lib/encodings/cp1251.py python/trunk/Lib/encodings/cp1252.py python/trunk/Lib/encodings/cp1253.py python/trunk/Lib/encodings/cp1254.py python/trunk/Lib/encodings/cp1255.py python/trunk/Lib/encodings/cp1256.py python/trunk/Lib/encodings/cp1257.py python/trunk/Lib/encodings/cp1258.py python/trunk/Lib/encodings/cp424.py python/trunk/Lib/encodings/cp437.py python/trunk/Lib/encodings/cp500.py python/trunk/Lib/encodings/cp737.py python/trunk/Lib/encodings/cp775.py python/trunk/Lib/encodings/cp850.py python/trunk/Lib/encodings/cp852.py python/trunk/Lib/encodings/cp855.py python/trunk/Lib/encodings/cp856.py python/trunk/Lib/encodings/cp857.py python/trunk/Lib/encodings/cp860.py python/trunk/Lib/encodings/cp861.py python/trunk/Lib/encodings/cp862.py python/trunk/Lib/encodings/cp863.py python/trunk/Lib/encodings/cp864.py python/trunk/Lib/encodings/cp865.py python/trunk/Lib/encodings/cp866.py python/trunk/Lib/encodings/cp869.py python/trunk/Lib/encodings/cp874.py python/trunk/Lib/encodings/cp875.py python/trunk/Lib/encodings/iso8859_1.py python/trunk/Lib/encodings/iso8859_10.py python/trunk/Lib/encodings/iso8859_11.py python/trunk/Lib/encodings/iso8859_13.py python/trunk/Lib/encodings/iso8859_14.py python/trunk/Lib/encodings/iso8859_15.py python/trunk/Lib/encodings/iso8859_16.py python/trunk/Lib/encodings/iso8859_2.py python/trunk/Lib/encodings/iso8859_3.py python/trunk/Lib/encodings/iso8859_4.py python/trunk/Lib/encodings/iso8859_5.py python/trunk/Lib/encodings/iso8859_6.py python/trunk/Lib/encodings/iso8859_7.py python/trunk/Lib/encodings/iso8859_8.py python/trunk/Lib/encodings/iso8859_9.py python/trunk/Lib/encodings/koi8_r.py python/trunk/Lib/encodings/koi8_u.py python/trunk/Lib/encodings/mac_arabic.py python/trunk/Lib/encodings/mac_centeuro.py python/trunk/Lib/encodings/mac_croatian.py python/trunk/Lib/encodings/mac_cyrillic.py python/trunk/Lib/encodings/mac_farsi.py python/trunk/Lib/encodings/mac_greek.py python/trunk/Lib/encodings/mac_iceland.py python/trunk/Lib/encodings/mac_roman.py python/trunk/Lib/encodings/mac_romanian.py python/trunk/Lib/encodings/mac_turkish.py python/trunk/Lib/encodings/tis_620.py python/trunk/Lib/test/bad_coding2.py python/trunk/Lib/test/test_code.py python/trunk/Lib/test/test_exception_variations.py python/trunk/Lib/test/test_generators.py python/trunk/Lib/test/test_minidom.py python/trunk/Lib/test/test_poll.py python/trunk/Lib/test/test_quopri.py python/trunk/Lib/test/test_xmlrpc.py python/trunk/Lib/webbrowser.py python/trunk/Lib/xmlcore/etree/ElementInclude.py python/trunk/Lib/xmlcore/etree/ElementPath.py python/trunk/Parser/asdl.py python/trunk/Parser/asdl_c.py python/trunk/Parser/spark.py python/trunk/Tools/bgen/bgen/bgenGenerator.py python/trunk/Tools/bgen/bgen/bgenHeapBuffer.py python/trunk/Tools/compiler/dumppyc.py python/trunk/Tools/unicode/gencodec.py Log: Whitespace normalization. Modified: python/trunk/Lib/SimpleXMLRPCServer.py ============================================================================== --- python/trunk/Lib/SimpleXMLRPCServer.py (original) +++ python/trunk/Lib/SimpleXMLRPCServer.py Mon Dec 26 00:18:31 2005 @@ -253,10 +253,10 @@ response = self._dispatch(method, params) # wrap response in a singleton tuple response = (response,) - response = xmlrpclib.dumps(response, methodresponse=1, + response = xmlrpclib.dumps(response, methodresponse=1, allow_none=self.allow_none, encoding=self.encoding) except Fault, fault: - response = xmlrpclib.dumps(fault, allow_none=self.allow_none, + response = xmlrpclib.dumps(fault, allow_none=self.allow_none, encoding=self.encoding) except: # report exception back to server @@ -427,8 +427,8 @@ """ try: - # Get arguments by reading body of request. - # We read this in chunks to avoid straining + # Get arguments by reading body of request. + # We read this in chunks to avoid straining # socket.read(); around the 10 or 15Mb mark, some platforms # begin to have problems (bug #792570). max_chunk_size = 10*1024*1024 @@ -490,8 +490,8 @@ SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) SocketServer.TCPServer.__init__(self, addr, requestHandler) - # [Bug #1222790] If possible, set close-on-exec flag; if a - # method spawns a subprocess, the subprocess shouldn't have + # [Bug #1222790] If possible, set close-on-exec flag; if a + # method spawns a subprocess, the subprocess shouldn't have # the listening socket open. if hasattr(fcntl, 'FD_CLOEXEC'): flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD) Modified: python/trunk/Lib/codecs.py ============================================================================== --- python/trunk/Lib/codecs.py (original) +++ python/trunk/Lib/codecs.py Mon Dec 26 00:18:31 2005 @@ -269,7 +269,7 @@ if self.linebuffer: self.charbuffer = "".join(self.linebuffer) self.linebuffer = None - + # read until we get the required number of characters (if available) while True: # can the request can be satisfied from the character buffer? @@ -335,7 +335,7 @@ if not keepends: line = line.splitlines(False)[0] return line - + readsize = size or 72 line = "" # If size is given, we call read() only once Modified: python/trunk/Lib/cookielib.py ============================================================================== --- python/trunk/Lib/cookielib.py (original) +++ python/trunk/Lib/cookielib.py Mon Dec 26 00:18:31 2005 @@ -1528,7 +1528,7 @@ for cookie in cookies: if cookie.version == 1: cookie.rfc2109 = True - if rfc2109_as_ns: + if rfc2109_as_ns: # treat 2109 cookies as Netscape cookies rather than # as RFC2965 cookies cookie.version = 0 Modified: python/trunk/Lib/encodings/cp037.py ============================================================================== --- python/trunk/Lib/encodings/cp037.py (original) +++ python/trunk/Lib/encodings/cp037.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x9c' # 0x04 -> CONTROL - u'\t' # 0x05 -> HORIZONTAL TABULATION - u'\x86' # 0x06 -> CONTROL - u'\x7f' # 0x07 -> DELETE - u'\x97' # 0x08 -> CONTROL - u'\x8d' # 0x09 -> CONTROL - u'\x8e' # 0x0A -> CONTROL - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x9d' # 0x14 -> CONTROL - u'\x85' # 0x15 -> CONTROL - u'\x08' # 0x16 -> BACKSPACE - u'\x87' # 0x17 -> CONTROL - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x92' # 0x1A -> CONTROL - u'\x8f' # 0x1B -> CONTROL - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u'\x80' # 0x20 -> CONTROL - u'\x81' # 0x21 -> CONTROL - u'\x82' # 0x22 -> CONTROL - u'\x83' # 0x23 -> CONTROL - u'\x84' # 0x24 -> CONTROL - u'\n' # 0x25 -> LINE FEED - u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK - u'\x1b' # 0x27 -> ESCAPE - u'\x88' # 0x28 -> CONTROL - u'\x89' # 0x29 -> CONTROL - u'\x8a' # 0x2A -> CONTROL - u'\x8b' # 0x2B -> CONTROL - u'\x8c' # 0x2C -> CONTROL - u'\x05' # 0x2D -> ENQUIRY - u'\x06' # 0x2E -> ACKNOWLEDGE - u'\x07' # 0x2F -> BELL - u'\x90' # 0x30 -> CONTROL - u'\x91' # 0x31 -> CONTROL - u'\x16' # 0x32 -> SYNCHRONOUS IDLE - u'\x93' # 0x33 -> CONTROL - u'\x94' # 0x34 -> CONTROL - u'\x95' # 0x35 -> CONTROL - u'\x96' # 0x36 -> CONTROL - u'\x04' # 0x37 -> END OF TRANSMISSION - u'\x98' # 0x38 -> CONTROL - u'\x99' # 0x39 -> CONTROL - u'\x9a' # 0x3A -> CONTROL - u'\x9b' # 0x3B -> CONTROL - u'\x14' # 0x3C -> DEVICE CONTROL FOUR - u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE - u'\x9e' # 0x3E -> CONTROL - u'\x1a' # 0x3F -> SUBSTITUTE - u' ' # 0x40 -> SPACE - u'\xa0' # 0x41 -> NO-BREAK SPACE - u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE - u'\xa2' # 0x4A -> CENT SIGN - u'.' # 0x4B -> FULL STOP - u'<' # 0x4C -> LESS-THAN SIGN - u'(' # 0x4D -> LEFT PARENTHESIS - u'+' # 0x4E -> PLUS SIGN - u'|' # 0x4F -> VERTICAL LINE - u'&' # 0x50 -> AMPERSAND - u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE - u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE - u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) - u'!' # 0x5A -> EXCLAMATION MARK - u'$' # 0x5B -> DOLLAR SIGN - u'*' # 0x5C -> ASTERISK - u')' # 0x5D -> RIGHT PARENTHESIS - u';' # 0x5E -> SEMICOLON - u'\xac' # 0x5F -> NOT SIGN - u'-' # 0x60 -> HYPHEN-MINUS - u'/' # 0x61 -> SOLIDUS - u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xa6' # 0x6A -> BROKEN BAR - u',' # 0x6B -> COMMA - u'%' # 0x6C -> PERCENT SIGN - u'_' # 0x6D -> LOW LINE - u'>' # 0x6E -> GREATER-THAN SIGN - u'?' # 0x6F -> QUESTION MARK - u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE - u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE - u'`' # 0x79 -> GRAVE ACCENT - u':' # 0x7A -> COLON - u'#' # 0x7B -> NUMBER SIGN - u'@' # 0x7C -> COMMERCIAL AT - u"'" # 0x7D -> APOSTROPHE - u'=' # 0x7E -> EQUALS SIGN - u'"' # 0x7F -> QUOTATION MARK - u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE - u'a' # 0x81 -> LATIN SMALL LETTER A - u'b' # 0x82 -> LATIN SMALL LETTER B - u'c' # 0x83 -> LATIN SMALL LETTER C - u'd' # 0x84 -> LATIN SMALL LETTER D - u'e' # 0x85 -> LATIN SMALL LETTER E - u'f' # 0x86 -> LATIN SMALL LETTER F - u'g' # 0x87 -> LATIN SMALL LETTER G - u'h' # 0x88 -> LATIN SMALL LETTER H - u'i' # 0x89 -> LATIN SMALL LETTER I - u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) - u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE - u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) - u'\xb1' # 0x8F -> PLUS-MINUS SIGN - u'\xb0' # 0x90 -> DEGREE SIGN - u'j' # 0x91 -> LATIN SMALL LETTER J - u'k' # 0x92 -> LATIN SMALL LETTER K - u'l' # 0x93 -> LATIN SMALL LETTER L - u'm' # 0x94 -> LATIN SMALL LETTER M - u'n' # 0x95 -> LATIN SMALL LETTER N - u'o' # 0x96 -> LATIN SMALL LETTER O - u'p' # 0x97 -> LATIN SMALL LETTER P - u'q' # 0x98 -> LATIN SMALL LETTER Q - u'r' # 0x99 -> LATIN SMALL LETTER R - u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR - u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE - u'\xb8' # 0x9D -> CEDILLA - u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE - u'\xa4' # 0x9F -> CURRENCY SIGN - u'\xb5' # 0xA0 -> MICRO SIGN - u'~' # 0xA1 -> TILDE - u's' # 0xA2 -> LATIN SMALL LETTER S - u't' # 0xA3 -> LATIN SMALL LETTER T - u'u' # 0xA4 -> LATIN SMALL LETTER U - u'v' # 0xA5 -> LATIN SMALL LETTER V - u'w' # 0xA6 -> LATIN SMALL LETTER W - u'x' # 0xA7 -> LATIN SMALL LETTER X - u'y' # 0xA8 -> LATIN SMALL LETTER Y - u'z' # 0xA9 -> LATIN SMALL LETTER Z - u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK - u'\xbf' # 0xAB -> INVERTED QUESTION MARK - u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) - u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) - u'\xae' # 0xAF -> REGISTERED SIGN - u'^' # 0xB0 -> CIRCUMFLEX ACCENT - u'\xa3' # 0xB1 -> POUND SIGN - u'\xa5' # 0xB2 -> YEN SIGN - u'\xb7' # 0xB3 -> MIDDLE DOT - u'\xa9' # 0xB4 -> COPYRIGHT SIGN - u'\xa7' # 0xB5 -> SECTION SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS - u'[' # 0xBA -> LEFT SQUARE BRACKET - u']' # 0xBB -> RIGHT SQUARE BRACKET - u'\xaf' # 0xBC -> MACRON - u'\xa8' # 0xBD -> DIAERESIS - u'\xb4' # 0xBE -> ACUTE ACCENT - u'\xd7' # 0xBF -> MULTIPLICATION SIGN - u'{' # 0xC0 -> LEFT CURLY BRACKET - u'A' # 0xC1 -> LATIN CAPITAL LETTER A - u'B' # 0xC2 -> LATIN CAPITAL LETTER B - u'C' # 0xC3 -> LATIN CAPITAL LETTER C - u'D' # 0xC4 -> LATIN CAPITAL LETTER D - u'E' # 0xC5 -> LATIN CAPITAL LETTER E - u'F' # 0xC6 -> LATIN CAPITAL LETTER F - u'G' # 0xC7 -> LATIN CAPITAL LETTER G - u'H' # 0xC8 -> LATIN CAPITAL LETTER H - u'I' # 0xC9 -> LATIN CAPITAL LETTER I - u'\xad' # 0xCA -> SOFT HYPHEN - u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE - u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE - u'}' # 0xD0 -> RIGHT CURLY BRACKET - u'J' # 0xD1 -> LATIN CAPITAL LETTER J - u'K' # 0xD2 -> LATIN CAPITAL LETTER K - u'L' # 0xD3 -> LATIN CAPITAL LETTER L - u'M' # 0xD4 -> LATIN CAPITAL LETTER M - u'N' # 0xD5 -> LATIN CAPITAL LETTER N - u'O' # 0xD6 -> LATIN CAPITAL LETTER O - u'P' # 0xD7 -> LATIN CAPITAL LETTER P - u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q - u'R' # 0xD9 -> LATIN CAPITAL LETTER R - u'\xb9' # 0xDA -> SUPERSCRIPT ONE - u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE - u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\\' # 0xE0 -> REVERSE SOLIDUS - u'\xf7' # 0xE1 -> DIVISION SIGN - u'S' # 0xE2 -> LATIN CAPITAL LETTER S - u'T' # 0xE3 -> LATIN CAPITAL LETTER T - u'U' # 0xE4 -> LATIN CAPITAL LETTER U - u'V' # 0xE5 -> LATIN CAPITAL LETTER V - u'W' # 0xE6 -> LATIN CAPITAL LETTER W - u'X' # 0xE7 -> LATIN CAPITAL LETTER X - u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y - u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z - u'\xb2' # 0xEA -> SUPERSCRIPT TWO - u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE - u'0' # 0xF0 -> DIGIT ZERO - u'1' # 0xF1 -> DIGIT ONE - u'2' # 0xF2 -> DIGIT TWO - u'3' # 0xF3 -> DIGIT THREE - u'4' # 0xF4 -> DIGIT FOUR - u'5' # 0xF5 -> DIGIT FIVE - u'6' # 0xF6 -> DIGIT SIX - u'7' # 0xF7 -> DIGIT SEVEN - u'8' # 0xF8 -> DIGIT EIGHT - u'9' # 0xF9 -> DIGIT NINE - u'\xb3' # 0xFA -> SUPERSCRIPT THREE - u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE - u'\x9f' # 0xFF -> CONTROL + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\xa0' # 0x41 -> NO-BREAK SPACE + u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + u'\xa2' # 0x4A -> CENT SIGN + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'|' # 0x4F -> VERTICAL LINE + u'&' # 0x50 -> AMPERSAND + u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'!' # 0x5A -> EXCLAMATION MARK + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'\xac' # 0x5F -> NOT SIGN + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xa6' # 0x6A -> BROKEN BAR + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + u'\xb8' # 0x9D -> CEDILLA + u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + u'\xa4' # 0x9F -> CURRENCY SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + u'\xbf' # 0xAB -> INVERTED QUESTION MARK + u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + u'\xae' # 0xAF -> REGISTERED SIGN + u'^' # 0xB0 -> CIRCUMFLEX ACCENT + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'[' # 0xBA -> LEFT SQUARE BRACKET + u']' # 0xBB -> RIGHT SQUARE BRACKET + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + u'\x9f' # 0xFF -> CONTROL ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x37, # END OF TRANSMISSION - 0x0005: 0x2D, # ENQUIRY - 0x0006: 0x2E, # ACKNOWLEDGE - 0x0007: 0x2F, # BELL - 0x0008: 0x16, # BACKSPACE - 0x0009: 0x05, # HORIZONTAL TABULATION - 0x000A: 0x25, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x3C, # DEVICE CONTROL FOUR - 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x32, # SYNCHRONOUS IDLE - 0x0017: 0x26, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x3F, # SUBSTITUTE - 0x001B: 0x27, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x40, # SPACE - 0x0021: 0x5A, # EXCLAMATION MARK - 0x0022: 0x7F, # QUOTATION MARK - 0x0023: 0x7B, # NUMBER SIGN - 0x0024: 0x5B, # DOLLAR SIGN - 0x0025: 0x6C, # PERCENT SIGN - 0x0026: 0x50, # AMPERSAND - 0x0027: 0x7D, # APOSTROPHE - 0x0028: 0x4D, # LEFT PARENTHESIS - 0x0029: 0x5D, # RIGHT PARENTHESIS - 0x002A: 0x5C, # ASTERISK - 0x002B: 0x4E, # PLUS SIGN - 0x002C: 0x6B, # COMMA - 0x002D: 0x60, # HYPHEN-MINUS - 0x002E: 0x4B, # FULL STOP - 0x002F: 0x61, # SOLIDUS - 0x0030: 0xF0, # DIGIT ZERO - 0x0031: 0xF1, # DIGIT ONE - 0x0032: 0xF2, # DIGIT TWO - 0x0033: 0xF3, # DIGIT THREE - 0x0034: 0xF4, # DIGIT FOUR - 0x0035: 0xF5, # DIGIT FIVE - 0x0036: 0xF6, # DIGIT SIX - 0x0037: 0xF7, # DIGIT SEVEN - 0x0038: 0xF8, # DIGIT EIGHT - 0x0039: 0xF9, # DIGIT NINE - 0x003A: 0x7A, # COLON - 0x003B: 0x5E, # SEMICOLON - 0x003C: 0x4C, # LESS-THAN SIGN - 0x003D: 0x7E, # EQUALS SIGN - 0x003E: 0x6E, # GREATER-THAN SIGN - 0x003F: 0x6F, # QUESTION MARK - 0x0040: 0x7C, # COMMERCIAL AT - 0x0041: 0xC1, # LATIN CAPITAL LETTER A - 0x0042: 0xC2, # LATIN CAPITAL LETTER B - 0x0043: 0xC3, # LATIN CAPITAL LETTER C - 0x0044: 0xC4, # LATIN CAPITAL LETTER D - 0x0045: 0xC5, # LATIN CAPITAL LETTER E - 0x0046: 0xC6, # LATIN CAPITAL LETTER F - 0x0047: 0xC7, # LATIN CAPITAL LETTER G - 0x0048: 0xC8, # LATIN CAPITAL LETTER H - 0x0049: 0xC9, # LATIN CAPITAL LETTER I - 0x004A: 0xD1, # LATIN CAPITAL LETTER J - 0x004B: 0xD2, # LATIN CAPITAL LETTER K - 0x004C: 0xD3, # LATIN CAPITAL LETTER L - 0x004D: 0xD4, # LATIN CAPITAL LETTER M - 0x004E: 0xD5, # LATIN CAPITAL LETTER N - 0x004F: 0xD6, # LATIN CAPITAL LETTER O - 0x0050: 0xD7, # LATIN CAPITAL LETTER P - 0x0051: 0xD8, # LATIN CAPITAL LETTER Q - 0x0052: 0xD9, # LATIN CAPITAL LETTER R - 0x0053: 0xE2, # LATIN CAPITAL LETTER S - 0x0054: 0xE3, # LATIN CAPITAL LETTER T - 0x0055: 0xE4, # LATIN CAPITAL LETTER U - 0x0056: 0xE5, # LATIN CAPITAL LETTER V - 0x0057: 0xE6, # LATIN CAPITAL LETTER W - 0x0058: 0xE7, # LATIN CAPITAL LETTER X - 0x0059: 0xE8, # LATIN CAPITAL LETTER Y - 0x005A: 0xE9, # LATIN CAPITAL LETTER Z - 0x005B: 0xBA, # LEFT SQUARE BRACKET - 0x005C: 0xE0, # REVERSE SOLIDUS - 0x005D: 0xBB, # RIGHT SQUARE BRACKET - 0x005E: 0xB0, # CIRCUMFLEX ACCENT - 0x005F: 0x6D, # LOW LINE - 0x0060: 0x79, # GRAVE ACCENT - 0x0061: 0x81, # LATIN SMALL LETTER A - 0x0062: 0x82, # LATIN SMALL LETTER B - 0x0063: 0x83, # LATIN SMALL LETTER C - 0x0064: 0x84, # LATIN SMALL LETTER D - 0x0065: 0x85, # LATIN SMALL LETTER E - 0x0066: 0x86, # LATIN SMALL LETTER F - 0x0067: 0x87, # LATIN SMALL LETTER G - 0x0068: 0x88, # LATIN SMALL LETTER H - 0x0069: 0x89, # LATIN SMALL LETTER I - 0x006A: 0x91, # LATIN SMALL LETTER J - 0x006B: 0x92, # LATIN SMALL LETTER K - 0x006C: 0x93, # LATIN SMALL LETTER L - 0x006D: 0x94, # LATIN SMALL LETTER M - 0x006E: 0x95, # LATIN SMALL LETTER N - 0x006F: 0x96, # LATIN SMALL LETTER O - 0x0070: 0x97, # LATIN SMALL LETTER P - 0x0071: 0x98, # LATIN SMALL LETTER Q - 0x0072: 0x99, # LATIN SMALL LETTER R - 0x0073: 0xA2, # LATIN SMALL LETTER S - 0x0074: 0xA3, # LATIN SMALL LETTER T - 0x0075: 0xA4, # LATIN SMALL LETTER U - 0x0076: 0xA5, # LATIN SMALL LETTER V - 0x0077: 0xA6, # LATIN SMALL LETTER W - 0x0078: 0xA7, # LATIN SMALL LETTER X - 0x0079: 0xA8, # LATIN SMALL LETTER Y - 0x007A: 0xA9, # LATIN SMALL LETTER Z - 0x007B: 0xC0, # LEFT CURLY BRACKET - 0x007C: 0x4F, # VERTICAL LINE - 0x007D: 0xD0, # RIGHT CURLY BRACKET - 0x007E: 0xA1, # TILDE - 0x007F: 0x07, # DELETE - 0x0080: 0x20, # CONTROL - 0x0081: 0x21, # CONTROL - 0x0082: 0x22, # CONTROL - 0x0083: 0x23, # CONTROL - 0x0084: 0x24, # CONTROL - 0x0085: 0x15, # CONTROL - 0x0086: 0x06, # CONTROL - 0x0087: 0x17, # CONTROL - 0x0088: 0x28, # CONTROL - 0x0089: 0x29, # CONTROL - 0x008A: 0x2A, # CONTROL - 0x008B: 0x2B, # CONTROL - 0x008C: 0x2C, # CONTROL - 0x008D: 0x09, # CONTROL - 0x008E: 0x0A, # CONTROL - 0x008F: 0x1B, # CONTROL - 0x0090: 0x30, # CONTROL - 0x0091: 0x31, # CONTROL - 0x0092: 0x1A, # CONTROL - 0x0093: 0x33, # CONTROL - 0x0094: 0x34, # CONTROL - 0x0095: 0x35, # CONTROL - 0x0096: 0x36, # CONTROL - 0x0097: 0x08, # CONTROL - 0x0098: 0x38, # CONTROL - 0x0099: 0x39, # CONTROL - 0x009A: 0x3A, # CONTROL - 0x009B: 0x3B, # CONTROL - 0x009C: 0x04, # CONTROL - 0x009D: 0x14, # CONTROL - 0x009E: 0x3E, # CONTROL - 0x009F: 0xFF, # CONTROL - 0x00A0: 0x41, # NO-BREAK SPACE - 0x00A1: 0xAA, # INVERTED EXCLAMATION MARK - 0x00A2: 0x4A, # CENT SIGN - 0x00A3: 0xB1, # POUND SIGN - 0x00A4: 0x9F, # CURRENCY SIGN - 0x00A5: 0xB2, # YEN SIGN - 0x00A6: 0x6A, # BROKEN BAR - 0x00A7: 0xB5, # SECTION SIGN - 0x00A8: 0xBD, # DIAERESIS - 0x00A9: 0xB4, # COPYRIGHT SIGN - 0x00AA: 0x9A, # FEMININE ORDINAL INDICATOR - 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0x5F, # NOT SIGN - 0x00AD: 0xCA, # SOFT HYPHEN - 0x00AE: 0xAF, # REGISTERED SIGN - 0x00AF: 0xBC, # MACRON - 0x00B0: 0x90, # DEGREE SIGN - 0x00B1: 0x8F, # PLUS-MINUS SIGN - 0x00B2: 0xEA, # SUPERSCRIPT TWO - 0x00B3: 0xFA, # SUPERSCRIPT THREE - 0x00B4: 0xBE, # ACUTE ACCENT - 0x00B5: 0xA0, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB3, # MIDDLE DOT - 0x00B8: 0x9D, # CEDILLA - 0x00B9: 0xDA, # SUPERSCRIPT ONE - 0x00BA: 0x9B, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF - 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xAB, # INVERTED QUESTION MARK - 0x00C0: 0x64, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0x65, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0x62, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0x66, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x63, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x67, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0x9E, # LATIN CAPITAL LIGATURE AE - 0x00C7: 0x68, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0x74, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x71, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0x72, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0x73, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0x78, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0x75, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0x76, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0x77, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D0: 0xAC, # LATIN CAPITAL LETTER ETH (ICELANDIC) - 0x00D1: 0x69, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xED, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEB, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xEF, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xEC, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xBF, # MULTIPLICATION SIGN - 0x00D8: 0x80, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xFD, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xFE, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xFB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xFC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xAD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DE: 0xAE, # LATIN CAPITAL LETTER THORN (ICELANDIC) - 0x00DF: 0x59, # LATIN SMALL LETTER SHARP S (GERMAN) - 0x00E0: 0x44, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x45, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x42, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x46, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x43, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x47, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0x9C, # LATIN SMALL LIGATURE AE - 0x00E7: 0x48, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x54, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x51, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x52, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x53, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x58, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x55, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x56, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x57, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F0: 0x8C, # LATIN SMALL LETTER ETH (ICELANDIC) - 0x00F1: 0x49, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xCD, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xCE, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xCB, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xCF, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xCC, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xE1, # DIVISION SIGN - 0x00F8: 0x70, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xDD, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xDE, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xDB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xDC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0x8D, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) - 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x37, # END OF TRANSMISSION + 0x0005: 0x2D, # ENQUIRY + 0x0006: 0x2E, # ACKNOWLEDGE + 0x0007: 0x2F, # BELL + 0x0008: 0x16, # BACKSPACE + 0x0009: 0x05, # HORIZONTAL TABULATION + 0x000A: 0x25, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x3C, # DEVICE CONTROL FOUR + 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x32, # SYNCHRONOUS IDLE + 0x0017: 0x26, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x3F, # SUBSTITUTE + 0x001B: 0x27, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x40, # SPACE + 0x0021: 0x5A, # EXCLAMATION MARK + 0x0022: 0x7F, # QUOTATION MARK + 0x0023: 0x7B, # NUMBER SIGN + 0x0024: 0x5B, # DOLLAR SIGN + 0x0025: 0x6C, # PERCENT SIGN + 0x0026: 0x50, # AMPERSAND + 0x0027: 0x7D, # APOSTROPHE + 0x0028: 0x4D, # LEFT PARENTHESIS + 0x0029: 0x5D, # RIGHT PARENTHESIS + 0x002A: 0x5C, # ASTERISK + 0x002B: 0x4E, # PLUS SIGN + 0x002C: 0x6B, # COMMA + 0x002D: 0x60, # HYPHEN-MINUS + 0x002E: 0x4B, # FULL STOP + 0x002F: 0x61, # SOLIDUS + 0x0030: 0xF0, # DIGIT ZERO + 0x0031: 0xF1, # DIGIT ONE + 0x0032: 0xF2, # DIGIT TWO + 0x0033: 0xF3, # DIGIT THREE + 0x0034: 0xF4, # DIGIT FOUR + 0x0035: 0xF5, # DIGIT FIVE + 0x0036: 0xF6, # DIGIT SIX + 0x0037: 0xF7, # DIGIT SEVEN + 0x0038: 0xF8, # DIGIT EIGHT + 0x0039: 0xF9, # DIGIT NINE + 0x003A: 0x7A, # COLON + 0x003B: 0x5E, # SEMICOLON + 0x003C: 0x4C, # LESS-THAN SIGN + 0x003D: 0x7E, # EQUALS SIGN + 0x003E: 0x6E, # GREATER-THAN SIGN + 0x003F: 0x6F, # QUESTION MARK + 0x0040: 0x7C, # COMMERCIAL AT + 0x0041: 0xC1, # LATIN CAPITAL LETTER A + 0x0042: 0xC2, # LATIN CAPITAL LETTER B + 0x0043: 0xC3, # LATIN CAPITAL LETTER C + 0x0044: 0xC4, # LATIN CAPITAL LETTER D + 0x0045: 0xC5, # LATIN CAPITAL LETTER E + 0x0046: 0xC6, # LATIN CAPITAL LETTER F + 0x0047: 0xC7, # LATIN CAPITAL LETTER G + 0x0048: 0xC8, # LATIN CAPITAL LETTER H + 0x0049: 0xC9, # LATIN CAPITAL LETTER I + 0x004A: 0xD1, # LATIN CAPITAL LETTER J + 0x004B: 0xD2, # LATIN CAPITAL LETTER K + 0x004C: 0xD3, # LATIN CAPITAL LETTER L + 0x004D: 0xD4, # LATIN CAPITAL LETTER M + 0x004E: 0xD5, # LATIN CAPITAL LETTER N + 0x004F: 0xD6, # LATIN CAPITAL LETTER O + 0x0050: 0xD7, # LATIN CAPITAL LETTER P + 0x0051: 0xD8, # LATIN CAPITAL LETTER Q + 0x0052: 0xD9, # LATIN CAPITAL LETTER R + 0x0053: 0xE2, # LATIN CAPITAL LETTER S + 0x0054: 0xE3, # LATIN CAPITAL LETTER T + 0x0055: 0xE4, # LATIN CAPITAL LETTER U + 0x0056: 0xE5, # LATIN CAPITAL LETTER V + 0x0057: 0xE6, # LATIN CAPITAL LETTER W + 0x0058: 0xE7, # LATIN CAPITAL LETTER X + 0x0059: 0xE8, # LATIN CAPITAL LETTER Y + 0x005A: 0xE9, # LATIN CAPITAL LETTER Z + 0x005B: 0xBA, # LEFT SQUARE BRACKET + 0x005C: 0xE0, # REVERSE SOLIDUS + 0x005D: 0xBB, # RIGHT SQUARE BRACKET + 0x005E: 0xB0, # CIRCUMFLEX ACCENT + 0x005F: 0x6D, # LOW LINE + 0x0060: 0x79, # GRAVE ACCENT + 0x0061: 0x81, # LATIN SMALL LETTER A + 0x0062: 0x82, # LATIN SMALL LETTER B + 0x0063: 0x83, # LATIN SMALL LETTER C + 0x0064: 0x84, # LATIN SMALL LETTER D + 0x0065: 0x85, # LATIN SMALL LETTER E + 0x0066: 0x86, # LATIN SMALL LETTER F + 0x0067: 0x87, # LATIN SMALL LETTER G + 0x0068: 0x88, # LATIN SMALL LETTER H + 0x0069: 0x89, # LATIN SMALL LETTER I + 0x006A: 0x91, # LATIN SMALL LETTER J + 0x006B: 0x92, # LATIN SMALL LETTER K + 0x006C: 0x93, # LATIN SMALL LETTER L + 0x006D: 0x94, # LATIN SMALL LETTER M + 0x006E: 0x95, # LATIN SMALL LETTER N + 0x006F: 0x96, # LATIN SMALL LETTER O + 0x0070: 0x97, # LATIN SMALL LETTER P + 0x0071: 0x98, # LATIN SMALL LETTER Q + 0x0072: 0x99, # LATIN SMALL LETTER R + 0x0073: 0xA2, # LATIN SMALL LETTER S + 0x0074: 0xA3, # LATIN SMALL LETTER T + 0x0075: 0xA4, # LATIN SMALL LETTER U + 0x0076: 0xA5, # LATIN SMALL LETTER V + 0x0077: 0xA6, # LATIN SMALL LETTER W + 0x0078: 0xA7, # LATIN SMALL LETTER X + 0x0079: 0xA8, # LATIN SMALL LETTER Y + 0x007A: 0xA9, # LATIN SMALL LETTER Z + 0x007B: 0xC0, # LEFT CURLY BRACKET + 0x007C: 0x4F, # VERTICAL LINE + 0x007D: 0xD0, # RIGHT CURLY BRACKET + 0x007E: 0xA1, # TILDE + 0x007F: 0x07, # DELETE + 0x0080: 0x20, # CONTROL + 0x0081: 0x21, # CONTROL + 0x0082: 0x22, # CONTROL + 0x0083: 0x23, # CONTROL + 0x0084: 0x24, # CONTROL + 0x0085: 0x15, # CONTROL + 0x0086: 0x06, # CONTROL + 0x0087: 0x17, # CONTROL + 0x0088: 0x28, # CONTROL + 0x0089: 0x29, # CONTROL + 0x008A: 0x2A, # CONTROL + 0x008B: 0x2B, # CONTROL + 0x008C: 0x2C, # CONTROL + 0x008D: 0x09, # CONTROL + 0x008E: 0x0A, # CONTROL + 0x008F: 0x1B, # CONTROL + 0x0090: 0x30, # CONTROL + 0x0091: 0x31, # CONTROL + 0x0092: 0x1A, # CONTROL + 0x0093: 0x33, # CONTROL + 0x0094: 0x34, # CONTROL + 0x0095: 0x35, # CONTROL + 0x0096: 0x36, # CONTROL + 0x0097: 0x08, # CONTROL + 0x0098: 0x38, # CONTROL + 0x0099: 0x39, # CONTROL + 0x009A: 0x3A, # CONTROL + 0x009B: 0x3B, # CONTROL + 0x009C: 0x04, # CONTROL + 0x009D: 0x14, # CONTROL + 0x009E: 0x3E, # CONTROL + 0x009F: 0xFF, # CONTROL + 0x00A0: 0x41, # NO-BREAK SPACE + 0x00A1: 0xAA, # INVERTED EXCLAMATION MARK + 0x00A2: 0x4A, # CENT SIGN + 0x00A3: 0xB1, # POUND SIGN + 0x00A4: 0x9F, # CURRENCY SIGN + 0x00A5: 0xB2, # YEN SIGN + 0x00A6: 0x6A, # BROKEN BAR + 0x00A7: 0xB5, # SECTION SIGN + 0x00A8: 0xBD, # DIAERESIS + 0x00A9: 0xB4, # COPYRIGHT SIGN + 0x00AA: 0x9A, # FEMININE ORDINAL INDICATOR + 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0x5F, # NOT SIGN + 0x00AD: 0xCA, # SOFT HYPHEN + 0x00AE: 0xAF, # REGISTERED SIGN + 0x00AF: 0xBC, # MACRON + 0x00B0: 0x90, # DEGREE SIGN + 0x00B1: 0x8F, # PLUS-MINUS SIGN + 0x00B2: 0xEA, # SUPERSCRIPT TWO + 0x00B3: 0xFA, # SUPERSCRIPT THREE + 0x00B4: 0xBE, # ACUTE ACCENT + 0x00B5: 0xA0, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB3, # MIDDLE DOT + 0x00B8: 0x9D, # CEDILLA + 0x00B9: 0xDA, # SUPERSCRIPT ONE + 0x00BA: 0x9B, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF + 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xAB, # INVERTED QUESTION MARK + 0x00C0: 0x64, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0x65, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0x62, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0x66, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x63, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x67, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0x9E, # LATIN CAPITAL LIGATURE AE + 0x00C7: 0x68, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0x74, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x71, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0x72, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0x73, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0x78, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0x75, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0x76, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0x77, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0: 0xAC, # LATIN CAPITAL LETTER ETH (ICELANDIC) + 0x00D1: 0x69, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xED, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEB, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xEF, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xEC, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xBF, # MULTIPLICATION SIGN + 0x00D8: 0x80, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xFD, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xFE, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xFB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xFC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xAD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE: 0xAE, # LATIN CAPITAL LETTER THORN (ICELANDIC) + 0x00DF: 0x59, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00E0: 0x44, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x45, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x42, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x46, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x43, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x47, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0x9C, # LATIN SMALL LIGATURE AE + 0x00E7: 0x48, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x54, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x51, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x52, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x53, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x58, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x55, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x56, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x57, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0: 0x8C, # LATIN SMALL LETTER ETH (ICELANDIC) + 0x00F1: 0x49, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xCD, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xCE, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xCB, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xCF, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xCC, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xE1, # DIVISION SIGN + 0x00F8: 0x70, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xDD, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xDE, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xDB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xDC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0x8D, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) + 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS } - Modified: python/trunk/Lib/encodings/cp1006.py ============================================================================== --- python/trunk/Lib/encodings/cp1006.py (original) +++ python/trunk/Lib/encodings/cp1006.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,521 +32,520 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u06f0' # 0xA1 -> EXTENDED ARABIC-INDIC DIGIT ZERO - u'\u06f1' # 0xA2 -> EXTENDED ARABIC-INDIC DIGIT ONE - u'\u06f2' # 0xA3 -> EXTENDED ARABIC-INDIC DIGIT TWO - u'\u06f3' # 0xA4 -> EXTENDED ARABIC-INDIC DIGIT THREE - u'\u06f4' # 0xA5 -> EXTENDED ARABIC-INDIC DIGIT FOUR - u'\u06f5' # 0xA6 -> EXTENDED ARABIC-INDIC DIGIT FIVE - u'\u06f6' # 0xA7 -> EXTENDED ARABIC-INDIC DIGIT SIX - u'\u06f7' # 0xA8 -> EXTENDED ARABIC-INDIC DIGIT SEVEN - u'\u06f8' # 0xA9 -> EXTENDED ARABIC-INDIC DIGIT EIGHT - u'\u06f9' # 0xAA -> EXTENDED ARABIC-INDIC DIGIT NINE - u'\u060c' # 0xAB -> ARABIC COMMA - u'\u061b' # 0xAC -> ARABIC SEMICOLON - u'\xad' # 0xAD -> SOFT HYPHEN - u'\u061f' # 0xAE -> ARABIC QUESTION MARK - u'\ufe81' # 0xAF -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM - u'\ufe8d' # 0xB0 -> ARABIC LETTER ALEF ISOLATED FORM - u'\ufe8e' # 0xB1 -> ARABIC LETTER ALEF FINAL FORM - u'\ufe8e' # 0xB2 -> ARABIC LETTER ALEF FINAL FORM - u'\ufe8f' # 0xB3 -> ARABIC LETTER BEH ISOLATED FORM - u'\ufe91' # 0xB4 -> ARABIC LETTER BEH INITIAL FORM - u'\ufb56' # 0xB5 -> ARABIC LETTER PEH ISOLATED FORM - u'\ufb58' # 0xB6 -> ARABIC LETTER PEH INITIAL FORM - u'\ufe93' # 0xB7 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM - u'\ufe95' # 0xB8 -> ARABIC LETTER TEH ISOLATED FORM - u'\ufe97' # 0xB9 -> ARABIC LETTER TEH INITIAL FORM - u'\ufb66' # 0xBA -> ARABIC LETTER TTEH ISOLATED FORM - u'\ufb68' # 0xBB -> ARABIC LETTER TTEH INITIAL FORM - u'\ufe99' # 0xBC -> ARABIC LETTER THEH ISOLATED FORM - u'\ufe9b' # 0xBD -> ARABIC LETTER THEH INITIAL FORM - u'\ufe9d' # 0xBE -> ARABIC LETTER JEEM ISOLATED FORM - u'\ufe9f' # 0xBF -> ARABIC LETTER JEEM INITIAL FORM - u'\ufb7a' # 0xC0 -> ARABIC LETTER TCHEH ISOLATED FORM - u'\ufb7c' # 0xC1 -> ARABIC LETTER TCHEH INITIAL FORM - u'\ufea1' # 0xC2 -> ARABIC LETTER HAH ISOLATED FORM - u'\ufea3' # 0xC3 -> ARABIC LETTER HAH INITIAL FORM - u'\ufea5' # 0xC4 -> ARABIC LETTER KHAH ISOLATED FORM - u'\ufea7' # 0xC5 -> ARABIC LETTER KHAH INITIAL FORM - u'\ufea9' # 0xC6 -> ARABIC LETTER DAL ISOLATED FORM - u'\ufb84' # 0xC7 -> ARABIC LETTER DAHAL ISOLATED FORMN - u'\ufeab' # 0xC8 -> ARABIC LETTER THAL ISOLATED FORM - u'\ufead' # 0xC9 -> ARABIC LETTER REH ISOLATED FORM - u'\ufb8c' # 0xCA -> ARABIC LETTER RREH ISOLATED FORM - u'\ufeaf' # 0xCB -> ARABIC LETTER ZAIN ISOLATED FORM - u'\ufb8a' # 0xCC -> ARABIC LETTER JEH ISOLATED FORM - u'\ufeb1' # 0xCD -> ARABIC LETTER SEEN ISOLATED FORM - u'\ufeb3' # 0xCE -> ARABIC LETTER SEEN INITIAL FORM - u'\ufeb5' # 0xCF -> ARABIC LETTER SHEEN ISOLATED FORM - u'\ufeb7' # 0xD0 -> ARABIC LETTER SHEEN INITIAL FORM - u'\ufeb9' # 0xD1 -> ARABIC LETTER SAD ISOLATED FORM - u'\ufebb' # 0xD2 -> ARABIC LETTER SAD INITIAL FORM - u'\ufebd' # 0xD3 -> ARABIC LETTER DAD ISOLATED FORM - u'\ufebf' # 0xD4 -> ARABIC LETTER DAD INITIAL FORM - u'\ufec1' # 0xD5 -> ARABIC LETTER TAH ISOLATED FORM - u'\ufec5' # 0xD6 -> ARABIC LETTER ZAH ISOLATED FORM - u'\ufec9' # 0xD7 -> ARABIC LETTER AIN ISOLATED FORM - u'\ufeca' # 0xD8 -> ARABIC LETTER AIN FINAL FORM - u'\ufecb' # 0xD9 -> ARABIC LETTER AIN INITIAL FORM - u'\ufecc' # 0xDA -> ARABIC LETTER AIN MEDIAL FORM - u'\ufecd' # 0xDB -> ARABIC LETTER GHAIN ISOLATED FORM - u'\ufece' # 0xDC -> ARABIC LETTER GHAIN FINAL FORM - u'\ufecf' # 0xDD -> ARABIC LETTER GHAIN INITIAL FORM - u'\ufed0' # 0xDE -> ARABIC LETTER GHAIN MEDIAL FORM - u'\ufed1' # 0xDF -> ARABIC LETTER FEH ISOLATED FORM - u'\ufed3' # 0xE0 -> ARABIC LETTER FEH INITIAL FORM - u'\ufed5' # 0xE1 -> ARABIC LETTER QAF ISOLATED FORM - u'\ufed7' # 0xE2 -> ARABIC LETTER QAF INITIAL FORM - u'\ufed9' # 0xE3 -> ARABIC LETTER KAF ISOLATED FORM - u'\ufedb' # 0xE4 -> ARABIC LETTER KAF INITIAL FORM - u'\ufb92' # 0xE5 -> ARABIC LETTER GAF ISOLATED FORM - u'\ufb94' # 0xE6 -> ARABIC LETTER GAF INITIAL FORM - u'\ufedd' # 0xE7 -> ARABIC LETTER LAM ISOLATED FORM - u'\ufedf' # 0xE8 -> ARABIC LETTER LAM INITIAL FORM - u'\ufee0' # 0xE9 -> ARABIC LETTER LAM MEDIAL FORM - u'\ufee1' # 0xEA -> ARABIC LETTER MEEM ISOLATED FORM - u'\ufee3' # 0xEB -> ARABIC LETTER MEEM INITIAL FORM - u'\ufb9e' # 0xEC -> ARABIC LETTER NOON GHUNNA ISOLATED FORM - u'\ufee5' # 0xED -> ARABIC LETTER NOON ISOLATED FORM - u'\ufee7' # 0xEE -> ARABIC LETTER NOON INITIAL FORM - u'\ufe85' # 0xEF -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM - u'\ufeed' # 0xF0 -> ARABIC LETTER WAW ISOLATED FORM - u'\ufba6' # 0xF1 -> ARABIC LETTER HEH GOAL ISOLATED FORM - u'\ufba8' # 0xF2 -> ARABIC LETTER HEH GOAL INITIAL FORM - u'\ufba9' # 0xF3 -> ARABIC LETTER HEH GOAL MEDIAL FORM - u'\ufbaa' # 0xF4 -> ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM - u'\ufe80' # 0xF5 -> ARABIC LETTER HAMZA ISOLATED FORM - u'\ufe89' # 0xF6 -> ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM - u'\ufe8a' # 0xF7 -> ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM - u'\ufe8b' # 0xF8 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM - u'\ufef1' # 0xF9 -> ARABIC LETTER YEH ISOLATED FORM - u'\ufef2' # 0xFA -> ARABIC LETTER YEH FINAL FORM - u'\ufef3' # 0xFB -> ARABIC LETTER YEH INITIAL FORM - u'\ufbb0' # 0xFC -> ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM - u'\ufbae' # 0xFD -> ARABIC LETTER YEH BARREE ISOLATED FORM - u'\ufe7c' # 0xFE -> ARABIC SHADDA ISOLATED FORM - u'\ufe7d' # 0xFF -> ARABIC SHADDA MEDIAL FORM + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u06f0' # 0xA1 -> EXTENDED ARABIC-INDIC DIGIT ZERO + u'\u06f1' # 0xA2 -> EXTENDED ARABIC-INDIC DIGIT ONE + u'\u06f2' # 0xA3 -> EXTENDED ARABIC-INDIC DIGIT TWO + u'\u06f3' # 0xA4 -> EXTENDED ARABIC-INDIC DIGIT THREE + u'\u06f4' # 0xA5 -> EXTENDED ARABIC-INDIC DIGIT FOUR + u'\u06f5' # 0xA6 -> EXTENDED ARABIC-INDIC DIGIT FIVE + u'\u06f6' # 0xA7 -> EXTENDED ARABIC-INDIC DIGIT SIX + u'\u06f7' # 0xA8 -> EXTENDED ARABIC-INDIC DIGIT SEVEN + u'\u06f8' # 0xA9 -> EXTENDED ARABIC-INDIC DIGIT EIGHT + u'\u06f9' # 0xAA -> EXTENDED ARABIC-INDIC DIGIT NINE + u'\u060c' # 0xAB -> ARABIC COMMA + u'\u061b' # 0xAC -> ARABIC SEMICOLON + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u061f' # 0xAE -> ARABIC QUESTION MARK + u'\ufe81' # 0xAF -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + u'\ufe8d' # 0xB0 -> ARABIC LETTER ALEF ISOLATED FORM + u'\ufe8e' # 0xB1 -> ARABIC LETTER ALEF FINAL FORM + u'\ufe8e' # 0xB2 -> ARABIC LETTER ALEF FINAL FORM + u'\ufe8f' # 0xB3 -> ARABIC LETTER BEH ISOLATED FORM + u'\ufe91' # 0xB4 -> ARABIC LETTER BEH INITIAL FORM + u'\ufb56' # 0xB5 -> ARABIC LETTER PEH ISOLATED FORM + u'\ufb58' # 0xB6 -> ARABIC LETTER PEH INITIAL FORM + u'\ufe93' # 0xB7 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + u'\ufe95' # 0xB8 -> ARABIC LETTER TEH ISOLATED FORM + u'\ufe97' # 0xB9 -> ARABIC LETTER TEH INITIAL FORM + u'\ufb66' # 0xBA -> ARABIC LETTER TTEH ISOLATED FORM + u'\ufb68' # 0xBB -> ARABIC LETTER TTEH INITIAL FORM + u'\ufe99' # 0xBC -> ARABIC LETTER THEH ISOLATED FORM + u'\ufe9b' # 0xBD -> ARABIC LETTER THEH INITIAL FORM + u'\ufe9d' # 0xBE -> ARABIC LETTER JEEM ISOLATED FORM + u'\ufe9f' # 0xBF -> ARABIC LETTER JEEM INITIAL FORM + u'\ufb7a' # 0xC0 -> ARABIC LETTER TCHEH ISOLATED FORM + u'\ufb7c' # 0xC1 -> ARABIC LETTER TCHEH INITIAL FORM + u'\ufea1' # 0xC2 -> ARABIC LETTER HAH ISOLATED FORM + u'\ufea3' # 0xC3 -> ARABIC LETTER HAH INITIAL FORM + u'\ufea5' # 0xC4 -> ARABIC LETTER KHAH ISOLATED FORM + u'\ufea7' # 0xC5 -> ARABIC LETTER KHAH INITIAL FORM + u'\ufea9' # 0xC6 -> ARABIC LETTER DAL ISOLATED FORM + u'\ufb84' # 0xC7 -> ARABIC LETTER DAHAL ISOLATED FORMN + u'\ufeab' # 0xC8 -> ARABIC LETTER THAL ISOLATED FORM + u'\ufead' # 0xC9 -> ARABIC LETTER REH ISOLATED FORM + u'\ufb8c' # 0xCA -> ARABIC LETTER RREH ISOLATED FORM + u'\ufeaf' # 0xCB -> ARABIC LETTER ZAIN ISOLATED FORM + u'\ufb8a' # 0xCC -> ARABIC LETTER JEH ISOLATED FORM + u'\ufeb1' # 0xCD -> ARABIC LETTER SEEN ISOLATED FORM + u'\ufeb3' # 0xCE -> ARABIC LETTER SEEN INITIAL FORM + u'\ufeb5' # 0xCF -> ARABIC LETTER SHEEN ISOLATED FORM + u'\ufeb7' # 0xD0 -> ARABIC LETTER SHEEN INITIAL FORM + u'\ufeb9' # 0xD1 -> ARABIC LETTER SAD ISOLATED FORM + u'\ufebb' # 0xD2 -> ARABIC LETTER SAD INITIAL FORM + u'\ufebd' # 0xD3 -> ARABIC LETTER DAD ISOLATED FORM + u'\ufebf' # 0xD4 -> ARABIC LETTER DAD INITIAL FORM + u'\ufec1' # 0xD5 -> ARABIC LETTER TAH ISOLATED FORM + u'\ufec5' # 0xD6 -> ARABIC LETTER ZAH ISOLATED FORM + u'\ufec9' # 0xD7 -> ARABIC LETTER AIN ISOLATED FORM + u'\ufeca' # 0xD8 -> ARABIC LETTER AIN FINAL FORM + u'\ufecb' # 0xD9 -> ARABIC LETTER AIN INITIAL FORM + u'\ufecc' # 0xDA -> ARABIC LETTER AIN MEDIAL FORM + u'\ufecd' # 0xDB -> ARABIC LETTER GHAIN ISOLATED FORM + u'\ufece' # 0xDC -> ARABIC LETTER GHAIN FINAL FORM + u'\ufecf' # 0xDD -> ARABIC LETTER GHAIN INITIAL FORM + u'\ufed0' # 0xDE -> ARABIC LETTER GHAIN MEDIAL FORM + u'\ufed1' # 0xDF -> ARABIC LETTER FEH ISOLATED FORM + u'\ufed3' # 0xE0 -> ARABIC LETTER FEH INITIAL FORM + u'\ufed5' # 0xE1 -> ARABIC LETTER QAF ISOLATED FORM + u'\ufed7' # 0xE2 -> ARABIC LETTER QAF INITIAL FORM + u'\ufed9' # 0xE3 -> ARABIC LETTER KAF ISOLATED FORM + u'\ufedb' # 0xE4 -> ARABIC LETTER KAF INITIAL FORM + u'\ufb92' # 0xE5 -> ARABIC LETTER GAF ISOLATED FORM + u'\ufb94' # 0xE6 -> ARABIC LETTER GAF INITIAL FORM + u'\ufedd' # 0xE7 -> ARABIC LETTER LAM ISOLATED FORM + u'\ufedf' # 0xE8 -> ARABIC LETTER LAM INITIAL FORM + u'\ufee0' # 0xE9 -> ARABIC LETTER LAM MEDIAL FORM + u'\ufee1' # 0xEA -> ARABIC LETTER MEEM ISOLATED FORM + u'\ufee3' # 0xEB -> ARABIC LETTER MEEM INITIAL FORM + u'\ufb9e' # 0xEC -> ARABIC LETTER NOON GHUNNA ISOLATED FORM + u'\ufee5' # 0xED -> ARABIC LETTER NOON ISOLATED FORM + u'\ufee7' # 0xEE -> ARABIC LETTER NOON INITIAL FORM + u'\ufe85' # 0xEF -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + u'\ufeed' # 0xF0 -> ARABIC LETTER WAW ISOLATED FORM + u'\ufba6' # 0xF1 -> ARABIC LETTER HEH GOAL ISOLATED FORM + u'\ufba8' # 0xF2 -> ARABIC LETTER HEH GOAL INITIAL FORM + u'\ufba9' # 0xF3 -> ARABIC LETTER HEH GOAL MEDIAL FORM + u'\ufbaa' # 0xF4 -> ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM + u'\ufe80' # 0xF5 -> ARABIC LETTER HAMZA ISOLATED FORM + u'\ufe89' # 0xF6 -> ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM + u'\ufe8a' # 0xF7 -> ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM + u'\ufe8b' # 0xF8 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + u'\ufef1' # 0xF9 -> ARABIC LETTER YEH ISOLATED FORM + u'\ufef2' # 0xFA -> ARABIC LETTER YEH FINAL FORM + u'\ufef3' # 0xFB -> ARABIC LETTER YEH INITIAL FORM + u'\ufbb0' # 0xFC -> ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + u'\ufbae' # 0xFD -> ARABIC LETTER YEH BARREE ISOLATED FORM + u'\ufe7c' # 0xFE -> ARABIC SHADDA ISOLATED FORM + u'\ufe7d' # 0xFF -> ARABIC SHADDA MEDIAL FORM ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00AD: 0xAD, # SOFT HYPHEN - 0x060C: 0xAB, # ARABIC COMMA - 0x061B: 0xAC, # ARABIC SEMICOLON - 0x061F: 0xAE, # ARABIC QUESTION MARK - 0x06F0: 0xA1, # EXTENDED ARABIC-INDIC DIGIT ZERO - 0x06F1: 0xA2, # EXTENDED ARABIC-INDIC DIGIT ONE - 0x06F2: 0xA3, # EXTENDED ARABIC-INDIC DIGIT TWO - 0x06F3: 0xA4, # EXTENDED ARABIC-INDIC DIGIT THREE - 0x06F4: 0xA5, # EXTENDED ARABIC-INDIC DIGIT FOUR - 0x06F5: 0xA6, # EXTENDED ARABIC-INDIC DIGIT FIVE - 0x06F6: 0xA7, # EXTENDED ARABIC-INDIC DIGIT SIX - 0x06F7: 0xA8, # EXTENDED ARABIC-INDIC DIGIT SEVEN - 0x06F8: 0xA9, # EXTENDED ARABIC-INDIC DIGIT EIGHT - 0x06F9: 0xAA, # EXTENDED ARABIC-INDIC DIGIT NINE - 0xFB56: 0xB5, # ARABIC LETTER PEH ISOLATED FORM - 0xFB58: 0xB6, # ARABIC LETTER PEH INITIAL FORM - 0xFB66: 0xBA, # ARABIC LETTER TTEH ISOLATED FORM - 0xFB68: 0xBB, # ARABIC LETTER TTEH INITIAL FORM - 0xFB7A: 0xC0, # ARABIC LETTER TCHEH ISOLATED FORM - 0xFB7C: 0xC1, # ARABIC LETTER TCHEH INITIAL FORM - 0xFB84: 0xC7, # ARABIC LETTER DAHAL ISOLATED FORMN - 0xFB8A: 0xCC, # ARABIC LETTER JEH ISOLATED FORM - 0xFB8C: 0xCA, # ARABIC LETTER RREH ISOLATED FORM - 0xFB92: 0xE5, # ARABIC LETTER GAF ISOLATED FORM - 0xFB94: 0xE6, # ARABIC LETTER GAF INITIAL FORM - 0xFB9E: 0xEC, # ARABIC LETTER NOON GHUNNA ISOLATED FORM - 0xFBA6: 0xF1, # ARABIC LETTER HEH GOAL ISOLATED FORM - 0xFBA8: 0xF2, # ARABIC LETTER HEH GOAL INITIAL FORM - 0xFBA9: 0xF3, # ARABIC LETTER HEH GOAL MEDIAL FORM - 0xFBAA: 0xF4, # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM - 0xFBAE: 0xFD, # ARABIC LETTER YEH BARREE ISOLATED FORM - 0xFBB0: 0xFC, # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM - 0xFE7C: 0xFE, # ARABIC SHADDA ISOLATED FORM - 0xFE7D: 0xFF, # ARABIC SHADDA MEDIAL FORM - 0xFE80: 0xF5, # ARABIC LETTER HAMZA ISOLATED FORM - 0xFE81: 0xAF, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM - 0xFE85: 0xEF, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM - 0xFE89: 0xF6, # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM - 0xFE8A: 0xF7, # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM - 0xFE8B: 0xF8, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM - 0xFE8D: 0xB0, # ARABIC LETTER ALEF ISOLATED FORM - 0xFE8E: None, # ARABIC LETTER ALEF FINAL FORM - 0xFE8F: 0xB3, # ARABIC LETTER BEH ISOLATED FORM - 0xFE91: 0xB4, # ARABIC LETTER BEH INITIAL FORM - 0xFE93: 0xB7, # ARABIC LETTER TEH MARBUTA ISOLATED FORM - 0xFE95: 0xB8, # ARABIC LETTER TEH ISOLATED FORM - 0xFE97: 0xB9, # ARABIC LETTER TEH INITIAL FORM - 0xFE99: 0xBC, # ARABIC LETTER THEH ISOLATED FORM - 0xFE9B: 0xBD, # ARABIC LETTER THEH INITIAL FORM - 0xFE9D: 0xBE, # ARABIC LETTER JEEM ISOLATED FORM - 0xFE9F: 0xBF, # ARABIC LETTER JEEM INITIAL FORM - 0xFEA1: 0xC2, # ARABIC LETTER HAH ISOLATED FORM - 0xFEA3: 0xC3, # ARABIC LETTER HAH INITIAL FORM - 0xFEA5: 0xC4, # ARABIC LETTER KHAH ISOLATED FORM - 0xFEA7: 0xC5, # ARABIC LETTER KHAH INITIAL FORM - 0xFEA9: 0xC6, # ARABIC LETTER DAL ISOLATED FORM - 0xFEAB: 0xC8, # ARABIC LETTER THAL ISOLATED FORM - 0xFEAD: 0xC9, # ARABIC LETTER REH ISOLATED FORM - 0xFEAF: 0xCB, # ARABIC LETTER ZAIN ISOLATED FORM - 0xFEB1: 0xCD, # ARABIC LETTER SEEN ISOLATED FORM - 0xFEB3: 0xCE, # ARABIC LETTER SEEN INITIAL FORM - 0xFEB5: 0xCF, # ARABIC LETTER SHEEN ISOLATED FORM - 0xFEB7: 0xD0, # ARABIC LETTER SHEEN INITIAL FORM - 0xFEB9: 0xD1, # ARABIC LETTER SAD ISOLATED FORM - 0xFEBB: 0xD2, # ARABIC LETTER SAD INITIAL FORM - 0xFEBD: 0xD3, # ARABIC LETTER DAD ISOLATED FORM - 0xFEBF: 0xD4, # ARABIC LETTER DAD INITIAL FORM - 0xFEC1: 0xD5, # ARABIC LETTER TAH ISOLATED FORM - 0xFEC5: 0xD6, # ARABIC LETTER ZAH ISOLATED FORM - 0xFEC9: 0xD7, # ARABIC LETTER AIN ISOLATED FORM - 0xFECA: 0xD8, # ARABIC LETTER AIN FINAL FORM - 0xFECB: 0xD9, # ARABIC LETTER AIN INITIAL FORM - 0xFECC: 0xDA, # ARABIC LETTER AIN MEDIAL FORM - 0xFECD: 0xDB, # ARABIC LETTER GHAIN ISOLATED FORM - 0xFECE: 0xDC, # ARABIC LETTER GHAIN FINAL FORM - 0xFECF: 0xDD, # ARABIC LETTER GHAIN INITIAL FORM - 0xFED0: 0xDE, # ARABIC LETTER GHAIN MEDIAL FORM - 0xFED1: 0xDF, # ARABIC LETTER FEH ISOLATED FORM - 0xFED3: 0xE0, # ARABIC LETTER FEH INITIAL FORM - 0xFED5: 0xE1, # ARABIC LETTER QAF ISOLATED FORM - 0xFED7: 0xE2, # ARABIC LETTER QAF INITIAL FORM - 0xFED9: 0xE3, # ARABIC LETTER KAF ISOLATED FORM - 0xFEDB: 0xE4, # ARABIC LETTER KAF INITIAL FORM - 0xFEDD: 0xE7, # ARABIC LETTER LAM ISOLATED FORM - 0xFEDF: 0xE8, # ARABIC LETTER LAM INITIAL FORM - 0xFEE0: 0xE9, # ARABIC LETTER LAM MEDIAL FORM - 0xFEE1: 0xEA, # ARABIC LETTER MEEM ISOLATED FORM - 0xFEE3: 0xEB, # ARABIC LETTER MEEM INITIAL FORM - 0xFEE5: 0xED, # ARABIC LETTER NOON ISOLATED FORM - 0xFEE7: 0xEE, # ARABIC LETTER NOON INITIAL FORM - 0xFEED: 0xF0, # ARABIC LETTER WAW ISOLATED FORM - 0xFEF1: 0xF9, # ARABIC LETTER YEH ISOLATED FORM - 0xFEF2: 0xFA, # ARABIC LETTER YEH FINAL FORM - 0xFEF3: 0xFB, # ARABIC LETTER YEH INITIAL FORM + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00AD: 0xAD, # SOFT HYPHEN + 0x060C: 0xAB, # ARABIC COMMA + 0x061B: 0xAC, # ARABIC SEMICOLON + 0x061F: 0xAE, # ARABIC QUESTION MARK + 0x06F0: 0xA1, # EXTENDED ARABIC-INDIC DIGIT ZERO + 0x06F1: 0xA2, # EXTENDED ARABIC-INDIC DIGIT ONE + 0x06F2: 0xA3, # EXTENDED ARABIC-INDIC DIGIT TWO + 0x06F3: 0xA4, # EXTENDED ARABIC-INDIC DIGIT THREE + 0x06F4: 0xA5, # EXTENDED ARABIC-INDIC DIGIT FOUR + 0x06F5: 0xA6, # EXTENDED ARABIC-INDIC DIGIT FIVE + 0x06F6: 0xA7, # EXTENDED ARABIC-INDIC DIGIT SIX + 0x06F7: 0xA8, # EXTENDED ARABIC-INDIC DIGIT SEVEN + 0x06F8: 0xA9, # EXTENDED ARABIC-INDIC DIGIT EIGHT + 0x06F9: 0xAA, # EXTENDED ARABIC-INDIC DIGIT NINE + 0xFB56: 0xB5, # ARABIC LETTER PEH ISOLATED FORM + 0xFB58: 0xB6, # ARABIC LETTER PEH INITIAL FORM + 0xFB66: 0xBA, # ARABIC LETTER TTEH ISOLATED FORM + 0xFB68: 0xBB, # ARABIC LETTER TTEH INITIAL FORM + 0xFB7A: 0xC0, # ARABIC LETTER TCHEH ISOLATED FORM + 0xFB7C: 0xC1, # ARABIC LETTER TCHEH INITIAL FORM + 0xFB84: 0xC7, # ARABIC LETTER DAHAL ISOLATED FORMN + 0xFB8A: 0xCC, # ARABIC LETTER JEH ISOLATED FORM + 0xFB8C: 0xCA, # ARABIC LETTER RREH ISOLATED FORM + 0xFB92: 0xE5, # ARABIC LETTER GAF ISOLATED FORM + 0xFB94: 0xE6, # ARABIC LETTER GAF INITIAL FORM + 0xFB9E: 0xEC, # ARABIC LETTER NOON GHUNNA ISOLATED FORM + 0xFBA6: 0xF1, # ARABIC LETTER HEH GOAL ISOLATED FORM + 0xFBA8: 0xF2, # ARABIC LETTER HEH GOAL INITIAL FORM + 0xFBA9: 0xF3, # ARABIC LETTER HEH GOAL MEDIAL FORM + 0xFBAA: 0xF4, # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM + 0xFBAE: 0xFD, # ARABIC LETTER YEH BARREE ISOLATED FORM + 0xFBB0: 0xFC, # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + 0xFE7C: 0xFE, # ARABIC SHADDA ISOLATED FORM + 0xFE7D: 0xFF, # ARABIC SHADDA MEDIAL FORM + 0xFE80: 0xF5, # ARABIC LETTER HAMZA ISOLATED FORM + 0xFE81: 0xAF, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0xFE85: 0xEF, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0xFE89: 0xF6, # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM + 0xFE8A: 0xF7, # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM + 0xFE8B: 0xF8, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0xFE8D: 0xB0, # ARABIC LETTER ALEF ISOLATED FORM + 0xFE8E: None, # ARABIC LETTER ALEF FINAL FORM + 0xFE8F: 0xB3, # ARABIC LETTER BEH ISOLATED FORM + 0xFE91: 0xB4, # ARABIC LETTER BEH INITIAL FORM + 0xFE93: 0xB7, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0xFE95: 0xB8, # ARABIC LETTER TEH ISOLATED FORM + 0xFE97: 0xB9, # ARABIC LETTER TEH INITIAL FORM + 0xFE99: 0xBC, # ARABIC LETTER THEH ISOLATED FORM + 0xFE9B: 0xBD, # ARABIC LETTER THEH INITIAL FORM + 0xFE9D: 0xBE, # ARABIC LETTER JEEM ISOLATED FORM + 0xFE9F: 0xBF, # ARABIC LETTER JEEM INITIAL FORM + 0xFEA1: 0xC2, # ARABIC LETTER HAH ISOLATED FORM + 0xFEA3: 0xC3, # ARABIC LETTER HAH INITIAL FORM + 0xFEA5: 0xC4, # ARABIC LETTER KHAH ISOLATED FORM + 0xFEA7: 0xC5, # ARABIC LETTER KHAH INITIAL FORM + 0xFEA9: 0xC6, # ARABIC LETTER DAL ISOLATED FORM + 0xFEAB: 0xC8, # ARABIC LETTER THAL ISOLATED FORM + 0xFEAD: 0xC9, # ARABIC LETTER REH ISOLATED FORM + 0xFEAF: 0xCB, # ARABIC LETTER ZAIN ISOLATED FORM + 0xFEB1: 0xCD, # ARABIC LETTER SEEN ISOLATED FORM + 0xFEB3: 0xCE, # ARABIC LETTER SEEN INITIAL FORM + 0xFEB5: 0xCF, # ARABIC LETTER SHEEN ISOLATED FORM + 0xFEB7: 0xD0, # ARABIC LETTER SHEEN INITIAL FORM + 0xFEB9: 0xD1, # ARABIC LETTER SAD ISOLATED FORM + 0xFEBB: 0xD2, # ARABIC LETTER SAD INITIAL FORM + 0xFEBD: 0xD3, # ARABIC LETTER DAD ISOLATED FORM + 0xFEBF: 0xD4, # ARABIC LETTER DAD INITIAL FORM + 0xFEC1: 0xD5, # ARABIC LETTER TAH ISOLATED FORM + 0xFEC5: 0xD6, # ARABIC LETTER ZAH ISOLATED FORM + 0xFEC9: 0xD7, # ARABIC LETTER AIN ISOLATED FORM + 0xFECA: 0xD8, # ARABIC LETTER AIN FINAL FORM + 0xFECB: 0xD9, # ARABIC LETTER AIN INITIAL FORM + 0xFECC: 0xDA, # ARABIC LETTER AIN MEDIAL FORM + 0xFECD: 0xDB, # ARABIC LETTER GHAIN ISOLATED FORM + 0xFECE: 0xDC, # ARABIC LETTER GHAIN FINAL FORM + 0xFECF: 0xDD, # ARABIC LETTER GHAIN INITIAL FORM + 0xFED0: 0xDE, # ARABIC LETTER GHAIN MEDIAL FORM + 0xFED1: 0xDF, # ARABIC LETTER FEH ISOLATED FORM + 0xFED3: 0xE0, # ARABIC LETTER FEH INITIAL FORM + 0xFED5: 0xE1, # ARABIC LETTER QAF ISOLATED FORM + 0xFED7: 0xE2, # ARABIC LETTER QAF INITIAL FORM + 0xFED9: 0xE3, # ARABIC LETTER KAF ISOLATED FORM + 0xFEDB: 0xE4, # ARABIC LETTER KAF INITIAL FORM + 0xFEDD: 0xE7, # ARABIC LETTER LAM ISOLATED FORM + 0xFEDF: 0xE8, # ARABIC LETTER LAM INITIAL FORM + 0xFEE0: 0xE9, # ARABIC LETTER LAM MEDIAL FORM + 0xFEE1: 0xEA, # ARABIC LETTER MEEM ISOLATED FORM + 0xFEE3: 0xEB, # ARABIC LETTER MEEM INITIAL FORM + 0xFEE5: 0xED, # ARABIC LETTER NOON ISOLATED FORM + 0xFEE7: 0xEE, # ARABIC LETTER NOON INITIAL FORM + 0xFEED: 0xF0, # ARABIC LETTER WAW ISOLATED FORM + 0xFEF1: 0xF9, # ARABIC LETTER YEH ISOLATED FORM + 0xFEF2: 0xFA, # ARABIC LETTER YEH FINAL FORM + 0xFEF3: 0xFB, # ARABIC LETTER YEH INITIAL FORM } - Modified: python/trunk/Lib/encodings/cp1026.py ============================================================================== --- python/trunk/Lib/encodings/cp1026.py (original) +++ python/trunk/Lib/encodings/cp1026.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x9c' # 0x04 -> CONTROL - u'\t' # 0x05 -> HORIZONTAL TABULATION - u'\x86' # 0x06 -> CONTROL - u'\x7f' # 0x07 -> DELETE - u'\x97' # 0x08 -> CONTROL - u'\x8d' # 0x09 -> CONTROL - u'\x8e' # 0x0A -> CONTROL - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x9d' # 0x14 -> CONTROL - u'\x85' # 0x15 -> CONTROL - u'\x08' # 0x16 -> BACKSPACE - u'\x87' # 0x17 -> CONTROL - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x92' # 0x1A -> CONTROL - u'\x8f' # 0x1B -> CONTROL - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u'\x80' # 0x20 -> CONTROL - u'\x81' # 0x21 -> CONTROL - u'\x82' # 0x22 -> CONTROL - u'\x83' # 0x23 -> CONTROL - u'\x84' # 0x24 -> CONTROL - u'\n' # 0x25 -> LINE FEED - u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK - u'\x1b' # 0x27 -> ESCAPE - u'\x88' # 0x28 -> CONTROL - u'\x89' # 0x29 -> CONTROL - u'\x8a' # 0x2A -> CONTROL - u'\x8b' # 0x2B -> CONTROL - u'\x8c' # 0x2C -> CONTROL - u'\x05' # 0x2D -> ENQUIRY - u'\x06' # 0x2E -> ACKNOWLEDGE - u'\x07' # 0x2F -> BELL - u'\x90' # 0x30 -> CONTROL - u'\x91' # 0x31 -> CONTROL - u'\x16' # 0x32 -> SYNCHRONOUS IDLE - u'\x93' # 0x33 -> CONTROL - u'\x94' # 0x34 -> CONTROL - u'\x95' # 0x35 -> CONTROL - u'\x96' # 0x36 -> CONTROL - u'\x04' # 0x37 -> END OF TRANSMISSION - u'\x98' # 0x38 -> CONTROL - u'\x99' # 0x39 -> CONTROL - u'\x9a' # 0x3A -> CONTROL - u'\x9b' # 0x3B -> CONTROL - u'\x14' # 0x3C -> DEVICE CONTROL FOUR - u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE - u'\x9e' # 0x3E -> CONTROL - u'\x1a' # 0x3F -> SUBSTITUTE - u' ' # 0x40 -> SPACE - u'\xa0' # 0x41 -> NO-BREAK SPACE - u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE - u'{' # 0x48 -> LEFT CURLY BRACKET - u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE - u'\xc7' # 0x4A -> LATIN CAPITAL LETTER C WITH CEDILLA - u'.' # 0x4B -> FULL STOP - u'<' # 0x4C -> LESS-THAN SIGN - u'(' # 0x4D -> LEFT PARENTHESIS - u'+' # 0x4E -> PLUS SIGN - u'!' # 0x4F -> EXCLAMATION MARK - u'&' # 0x50 -> AMPERSAND - u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE - u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE - u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) - u'\u011e' # 0x5A -> LATIN CAPITAL LETTER G WITH BREVE - u'\u0130' # 0x5B -> LATIN CAPITAL LETTER I WITH DOT ABOVE - u'*' # 0x5C -> ASTERISK - u')' # 0x5D -> RIGHT PARENTHESIS - u';' # 0x5E -> SEMICOLON - u'^' # 0x5F -> CIRCUMFLEX ACCENT - u'-' # 0x60 -> HYPHEN-MINUS - u'/' # 0x61 -> SOLIDUS - u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'[' # 0x68 -> LEFT SQUARE BRACKET - u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE - u'\u015f' # 0x6A -> LATIN SMALL LETTER S WITH CEDILLA - u',' # 0x6B -> COMMA - u'%' # 0x6C -> PERCENT SIGN - u'_' # 0x6D -> LOW LINE - u'>' # 0x6E -> GREATER-THAN SIGN - u'?' # 0x6F -> QUESTION MARK - u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE - u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE - u'\u0131' # 0x79 -> LATIN SMALL LETTER DOTLESS I - u':' # 0x7A -> COLON - u'\xd6' # 0x7B -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\u015e' # 0x7C -> LATIN CAPITAL LETTER S WITH CEDILLA - u"'" # 0x7D -> APOSTROPHE - u'=' # 0x7E -> EQUALS SIGN - u'\xdc' # 0x7F -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE - u'a' # 0x81 -> LATIN SMALL LETTER A - u'b' # 0x82 -> LATIN SMALL LETTER B - u'c' # 0x83 -> LATIN SMALL LETTER C - u'd' # 0x84 -> LATIN SMALL LETTER D - u'e' # 0x85 -> LATIN SMALL LETTER E - u'f' # 0x86 -> LATIN SMALL LETTER F - u'g' # 0x87 -> LATIN SMALL LETTER G - u'h' # 0x88 -> LATIN SMALL LETTER H - u'i' # 0x89 -> LATIN SMALL LETTER I - u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'}' # 0x8C -> RIGHT CURLY BRACKET - u'`' # 0x8D -> GRAVE ACCENT - u'\xa6' # 0x8E -> BROKEN BAR - u'\xb1' # 0x8F -> PLUS-MINUS SIGN - u'\xb0' # 0x90 -> DEGREE SIGN - u'j' # 0x91 -> LATIN SMALL LETTER J - u'k' # 0x92 -> LATIN SMALL LETTER K - u'l' # 0x93 -> LATIN SMALL LETTER L - u'm' # 0x94 -> LATIN SMALL LETTER M - u'n' # 0x95 -> LATIN SMALL LETTER N - u'o' # 0x96 -> LATIN SMALL LETTER O - u'p' # 0x97 -> LATIN SMALL LETTER P - u'q' # 0x98 -> LATIN SMALL LETTER Q - u'r' # 0x99 -> LATIN SMALL LETTER R - u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR - u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE - u'\xb8' # 0x9D -> CEDILLA - u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE - u'\xa4' # 0x9F -> CURRENCY SIGN - u'\xb5' # 0xA0 -> MICRO SIGN - u'\xf6' # 0xA1 -> LATIN SMALL LETTER O WITH DIAERESIS - u's' # 0xA2 -> LATIN SMALL LETTER S - u't' # 0xA3 -> LATIN SMALL LETTER T - u'u' # 0xA4 -> LATIN SMALL LETTER U - u'v' # 0xA5 -> LATIN SMALL LETTER V - u'w' # 0xA6 -> LATIN SMALL LETTER W - u'x' # 0xA7 -> LATIN SMALL LETTER X - u'y' # 0xA8 -> LATIN SMALL LETTER Y - u'z' # 0xA9 -> LATIN SMALL LETTER Z - u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK - u'\xbf' # 0xAB -> INVERTED QUESTION MARK - u']' # 0xAC -> RIGHT SQUARE BRACKET - u'$' # 0xAD -> DOLLAR SIGN - u'@' # 0xAE -> COMMERCIAL AT - u'\xae' # 0xAF -> REGISTERED SIGN - u'\xa2' # 0xB0 -> CENT SIGN - u'\xa3' # 0xB1 -> POUND SIGN - u'\xa5' # 0xB2 -> YEN SIGN - u'\xb7' # 0xB3 -> MIDDLE DOT - u'\xa9' # 0xB4 -> COPYRIGHT SIGN - u'\xa7' # 0xB5 -> SECTION SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS - u'\xac' # 0xBA -> NOT SIGN - u'|' # 0xBB -> VERTICAL LINE - u'\xaf' # 0xBC -> MACRON - u'\xa8' # 0xBD -> DIAERESIS - u'\xb4' # 0xBE -> ACUTE ACCENT - u'\xd7' # 0xBF -> MULTIPLICATION SIGN - u'\xe7' # 0xC0 -> LATIN SMALL LETTER C WITH CEDILLA - u'A' # 0xC1 -> LATIN CAPITAL LETTER A - u'B' # 0xC2 -> LATIN CAPITAL LETTER B - u'C' # 0xC3 -> LATIN CAPITAL LETTER C - u'D' # 0xC4 -> LATIN CAPITAL LETTER D - u'E' # 0xC5 -> LATIN CAPITAL LETTER E - u'F' # 0xC6 -> LATIN CAPITAL LETTER F - u'G' # 0xC7 -> LATIN CAPITAL LETTER G - u'H' # 0xC8 -> LATIN CAPITAL LETTER H - u'I' # 0xC9 -> LATIN CAPITAL LETTER I - u'\xad' # 0xCA -> SOFT HYPHEN - u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'~' # 0xCC -> TILDE - u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE - u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE - u'\u011f' # 0xD0 -> LATIN SMALL LETTER G WITH BREVE - u'J' # 0xD1 -> LATIN CAPITAL LETTER J - u'K' # 0xD2 -> LATIN CAPITAL LETTER K - u'L' # 0xD3 -> LATIN CAPITAL LETTER L - u'M' # 0xD4 -> LATIN CAPITAL LETTER M - u'N' # 0xD5 -> LATIN CAPITAL LETTER N - u'O' # 0xD6 -> LATIN CAPITAL LETTER O - u'P' # 0xD7 -> LATIN CAPITAL LETTER P - u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q - u'R' # 0xD9 -> LATIN CAPITAL LETTER R - u'\xb9' # 0xDA -> SUPERSCRIPT ONE - u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\\' # 0xDC -> REVERSE SOLIDUS - u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE - u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\xfc' # 0xE0 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xf7' # 0xE1 -> DIVISION SIGN - u'S' # 0xE2 -> LATIN CAPITAL LETTER S - u'T' # 0xE3 -> LATIN CAPITAL LETTER T - u'U' # 0xE4 -> LATIN CAPITAL LETTER U - u'V' # 0xE5 -> LATIN CAPITAL LETTER V - u'W' # 0xE6 -> LATIN CAPITAL LETTER W - u'X' # 0xE7 -> LATIN CAPITAL LETTER X - u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y - u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z - u'\xb2' # 0xEA -> SUPERSCRIPT TWO - u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'#' # 0xEC -> NUMBER SIGN - u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE - u'0' # 0xF0 -> DIGIT ZERO - u'1' # 0xF1 -> DIGIT ONE - u'2' # 0xF2 -> DIGIT TWO - u'3' # 0xF3 -> DIGIT THREE - u'4' # 0xF4 -> DIGIT FOUR - u'5' # 0xF5 -> DIGIT FIVE - u'6' # 0xF6 -> DIGIT SIX - u'7' # 0xF7 -> DIGIT SEVEN - u'8' # 0xF8 -> DIGIT EIGHT - u'9' # 0xF9 -> DIGIT NINE - u'\xb3' # 0xFA -> SUPERSCRIPT THREE - u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'"' # 0xFC -> QUOTATION MARK - u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE - u'\x9f' # 0xFF -> CONTROL + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\xa0' # 0x41 -> NO-BREAK SPACE + u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + u'{' # 0x48 -> LEFT CURLY BRACKET + u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + u'\xc7' # 0x4A -> LATIN CAPITAL LETTER C WITH CEDILLA + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'!' # 0x4F -> EXCLAMATION MARK + u'&' # 0x50 -> AMPERSAND + u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'\u011e' # 0x5A -> LATIN CAPITAL LETTER G WITH BREVE + u'\u0130' # 0x5B -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'^' # 0x5F -> CIRCUMFLEX ACCENT + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'[' # 0x68 -> LEFT SQUARE BRACKET + u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + u'\u015f' # 0x6A -> LATIN SMALL LETTER S WITH CEDILLA + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + u'\u0131' # 0x79 -> LATIN SMALL LETTER DOTLESS I + u':' # 0x7A -> COLON + u'\xd6' # 0x7B -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\u015e' # 0x7C -> LATIN CAPITAL LETTER S WITH CEDILLA + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'\xdc' # 0x7F -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'}' # 0x8C -> RIGHT CURLY BRACKET + u'`' # 0x8D -> GRAVE ACCENT + u'\xa6' # 0x8E -> BROKEN BAR + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + u'\xb8' # 0x9D -> CEDILLA + u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + u'\xa4' # 0x9F -> CURRENCY SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'\xf6' # 0xA1 -> LATIN SMALL LETTER O WITH DIAERESIS + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + u'\xbf' # 0xAB -> INVERTED QUESTION MARK + u']' # 0xAC -> RIGHT SQUARE BRACKET + u'$' # 0xAD -> DOLLAR SIGN + u'@' # 0xAE -> COMMERCIAL AT + u'\xae' # 0xAF -> REGISTERED SIGN + u'\xa2' # 0xB0 -> CENT SIGN + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'\xac' # 0xBA -> NOT SIGN + u'|' # 0xBB -> VERTICAL LINE + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'\xe7' # 0xC0 -> LATIN SMALL LETTER C WITH CEDILLA + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'~' # 0xCC -> TILDE + u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + u'\u011f' # 0xD0 -> LATIN SMALL LETTER G WITH BREVE + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\\' # 0xDC -> REVERSE SOLIDUS + u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xfc' # 0xE0 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'#' # 0xEC -> NUMBER SIGN + u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'"' # 0xFC -> QUOTATION MARK + u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + u'\x9f' # 0xFF -> CONTROL ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x37, # END OF TRANSMISSION - 0x0005: 0x2D, # ENQUIRY - 0x0006: 0x2E, # ACKNOWLEDGE - 0x0007: 0x2F, # BELL - 0x0008: 0x16, # BACKSPACE - 0x0009: 0x05, # HORIZONTAL TABULATION - 0x000A: 0x25, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x3C, # DEVICE CONTROL FOUR - 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x32, # SYNCHRONOUS IDLE - 0x0017: 0x26, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x3F, # SUBSTITUTE - 0x001B: 0x27, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x40, # SPACE - 0x0021: 0x4F, # EXCLAMATION MARK - 0x0022: 0xFC, # QUOTATION MARK - 0x0023: 0xEC, # NUMBER SIGN - 0x0024: 0xAD, # DOLLAR SIGN - 0x0025: 0x6C, # PERCENT SIGN - 0x0026: 0x50, # AMPERSAND - 0x0027: 0x7D, # APOSTROPHE - 0x0028: 0x4D, # LEFT PARENTHESIS - 0x0029: 0x5D, # RIGHT PARENTHESIS - 0x002A: 0x5C, # ASTERISK - 0x002B: 0x4E, # PLUS SIGN - 0x002C: 0x6B, # COMMA - 0x002D: 0x60, # HYPHEN-MINUS - 0x002E: 0x4B, # FULL STOP - 0x002F: 0x61, # SOLIDUS - 0x0030: 0xF0, # DIGIT ZERO - 0x0031: 0xF1, # DIGIT ONE - 0x0032: 0xF2, # DIGIT TWO - 0x0033: 0xF3, # DIGIT THREE - 0x0034: 0xF4, # DIGIT FOUR - 0x0035: 0xF5, # DIGIT FIVE - 0x0036: 0xF6, # DIGIT SIX - 0x0037: 0xF7, # DIGIT SEVEN - 0x0038: 0xF8, # DIGIT EIGHT - 0x0039: 0xF9, # DIGIT NINE - 0x003A: 0x7A, # COLON - 0x003B: 0x5E, # SEMICOLON - 0x003C: 0x4C, # LESS-THAN SIGN - 0x003D: 0x7E, # EQUALS SIGN - 0x003E: 0x6E, # GREATER-THAN SIGN - 0x003F: 0x6F, # QUESTION MARK - 0x0040: 0xAE, # COMMERCIAL AT - 0x0041: 0xC1, # LATIN CAPITAL LETTER A - 0x0042: 0xC2, # LATIN CAPITAL LETTER B - 0x0043: 0xC3, # LATIN CAPITAL LETTER C - 0x0044: 0xC4, # LATIN CAPITAL LETTER D - 0x0045: 0xC5, # LATIN CAPITAL LETTER E - 0x0046: 0xC6, # LATIN CAPITAL LETTER F - 0x0047: 0xC7, # LATIN CAPITAL LETTER G - 0x0048: 0xC8, # LATIN CAPITAL LETTER H - 0x0049: 0xC9, # LATIN CAPITAL LETTER I - 0x004A: 0xD1, # LATIN CAPITAL LETTER J - 0x004B: 0xD2, # LATIN CAPITAL LETTER K - 0x004C: 0xD3, # LATIN CAPITAL LETTER L - 0x004D: 0xD4, # LATIN CAPITAL LETTER M - 0x004E: 0xD5, # LATIN CAPITAL LETTER N - 0x004F: 0xD6, # LATIN CAPITAL LETTER O - 0x0050: 0xD7, # LATIN CAPITAL LETTER P - 0x0051: 0xD8, # LATIN CAPITAL LETTER Q - 0x0052: 0xD9, # LATIN CAPITAL LETTER R - 0x0053: 0xE2, # LATIN CAPITAL LETTER S - 0x0054: 0xE3, # LATIN CAPITAL LETTER T - 0x0055: 0xE4, # LATIN CAPITAL LETTER U - 0x0056: 0xE5, # LATIN CAPITAL LETTER V - 0x0057: 0xE6, # LATIN CAPITAL LETTER W - 0x0058: 0xE7, # LATIN CAPITAL LETTER X - 0x0059: 0xE8, # LATIN CAPITAL LETTER Y - 0x005A: 0xE9, # LATIN CAPITAL LETTER Z - 0x005B: 0x68, # LEFT SQUARE BRACKET - 0x005C: 0xDC, # REVERSE SOLIDUS - 0x005D: 0xAC, # RIGHT SQUARE BRACKET - 0x005E: 0x5F, # CIRCUMFLEX ACCENT - 0x005F: 0x6D, # LOW LINE - 0x0060: 0x8D, # GRAVE ACCENT - 0x0061: 0x81, # LATIN SMALL LETTER A - 0x0062: 0x82, # LATIN SMALL LETTER B - 0x0063: 0x83, # LATIN SMALL LETTER C - 0x0064: 0x84, # LATIN SMALL LETTER D - 0x0065: 0x85, # LATIN SMALL LETTER E - 0x0066: 0x86, # LATIN SMALL LETTER F - 0x0067: 0x87, # LATIN SMALL LETTER G - 0x0068: 0x88, # LATIN SMALL LETTER H - 0x0069: 0x89, # LATIN SMALL LETTER I - 0x006A: 0x91, # LATIN SMALL LETTER J - 0x006B: 0x92, # LATIN SMALL LETTER K - 0x006C: 0x93, # LATIN SMALL LETTER L - 0x006D: 0x94, # LATIN SMALL LETTER M - 0x006E: 0x95, # LATIN SMALL LETTER N - 0x006F: 0x96, # LATIN SMALL LETTER O - 0x0070: 0x97, # LATIN SMALL LETTER P - 0x0071: 0x98, # LATIN SMALL LETTER Q - 0x0072: 0x99, # LATIN SMALL LETTER R - 0x0073: 0xA2, # LATIN SMALL LETTER S - 0x0074: 0xA3, # LATIN SMALL LETTER T - 0x0075: 0xA4, # LATIN SMALL LETTER U - 0x0076: 0xA5, # LATIN SMALL LETTER V - 0x0077: 0xA6, # LATIN SMALL LETTER W - 0x0078: 0xA7, # LATIN SMALL LETTER X - 0x0079: 0xA8, # LATIN SMALL LETTER Y - 0x007A: 0xA9, # LATIN SMALL LETTER Z - 0x007B: 0x48, # LEFT CURLY BRACKET - 0x007C: 0xBB, # VERTICAL LINE - 0x007D: 0x8C, # RIGHT CURLY BRACKET - 0x007E: 0xCC, # TILDE - 0x007F: 0x07, # DELETE - 0x0080: 0x20, # CONTROL - 0x0081: 0x21, # CONTROL - 0x0082: 0x22, # CONTROL - 0x0083: 0x23, # CONTROL - 0x0084: 0x24, # CONTROL - 0x0085: 0x15, # CONTROL - 0x0086: 0x06, # CONTROL - 0x0087: 0x17, # CONTROL - 0x0088: 0x28, # CONTROL - 0x0089: 0x29, # CONTROL - 0x008A: 0x2A, # CONTROL - 0x008B: 0x2B, # CONTROL - 0x008C: 0x2C, # CONTROL - 0x008D: 0x09, # CONTROL - 0x008E: 0x0A, # CONTROL - 0x008F: 0x1B, # CONTROL - 0x0090: 0x30, # CONTROL - 0x0091: 0x31, # CONTROL - 0x0092: 0x1A, # CONTROL - 0x0093: 0x33, # CONTROL - 0x0094: 0x34, # CONTROL - 0x0095: 0x35, # CONTROL - 0x0096: 0x36, # CONTROL - 0x0097: 0x08, # CONTROL - 0x0098: 0x38, # CONTROL - 0x0099: 0x39, # CONTROL - 0x009A: 0x3A, # CONTROL - 0x009B: 0x3B, # CONTROL - 0x009C: 0x04, # CONTROL - 0x009D: 0x14, # CONTROL - 0x009E: 0x3E, # CONTROL - 0x009F: 0xFF, # CONTROL - 0x00A0: 0x41, # NO-BREAK SPACE - 0x00A1: 0xAA, # INVERTED EXCLAMATION MARK - 0x00A2: 0xB0, # CENT SIGN - 0x00A3: 0xB1, # POUND SIGN - 0x00A4: 0x9F, # CURRENCY SIGN - 0x00A5: 0xB2, # YEN SIGN - 0x00A6: 0x8E, # BROKEN BAR - 0x00A7: 0xB5, # SECTION SIGN - 0x00A8: 0xBD, # DIAERESIS - 0x00A9: 0xB4, # COPYRIGHT SIGN - 0x00AA: 0x9A, # FEMININE ORDINAL INDICATOR - 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xBA, # NOT SIGN - 0x00AD: 0xCA, # SOFT HYPHEN - 0x00AE: 0xAF, # REGISTERED SIGN - 0x00AF: 0xBC, # MACRON - 0x00B0: 0x90, # DEGREE SIGN - 0x00B1: 0x8F, # PLUS-MINUS SIGN - 0x00B2: 0xEA, # SUPERSCRIPT TWO - 0x00B3: 0xFA, # SUPERSCRIPT THREE - 0x00B4: 0xBE, # ACUTE ACCENT - 0x00B5: 0xA0, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB3, # MIDDLE DOT - 0x00B8: 0x9D, # CEDILLA - 0x00B9: 0xDA, # SUPERSCRIPT ONE - 0x00BA: 0x9B, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF - 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xAB, # INVERTED QUESTION MARK - 0x00C0: 0x64, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0x65, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0x62, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0x66, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x63, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x67, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0x9E, # LATIN CAPITAL LIGATURE AE - 0x00C7: 0x4A, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0x74, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x71, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0x72, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0x73, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0x78, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0x75, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0x76, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0x77, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0x69, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xED, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEB, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xEF, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0x7B, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xBF, # MULTIPLICATION SIGN - 0x00D8: 0x80, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xFD, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xFE, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xFB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0x7F, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0x59, # LATIN SMALL LETTER SHARP S (GERMAN) - 0x00E0: 0x44, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x45, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x42, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x46, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x43, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x47, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0x9C, # LATIN SMALL LIGATURE AE - 0x00E7: 0xC0, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x54, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x51, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x52, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x53, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x58, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x55, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x56, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x57, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0x49, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xCD, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xCE, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xCB, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xCF, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xA1, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xE1, # DIVISION SIGN - 0x00F8: 0x70, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xDD, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xDE, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xDB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xE0, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x011E: 0x5A, # LATIN CAPITAL LETTER G WITH BREVE - 0x011F: 0xD0, # LATIN SMALL LETTER G WITH BREVE - 0x0130: 0x5B, # LATIN CAPITAL LETTER I WITH DOT ABOVE - 0x0131: 0x79, # LATIN SMALL LETTER DOTLESS I - 0x015E: 0x7C, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015F: 0x6A, # LATIN SMALL LETTER S WITH CEDILLA + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x37, # END OF TRANSMISSION + 0x0005: 0x2D, # ENQUIRY + 0x0006: 0x2E, # ACKNOWLEDGE + 0x0007: 0x2F, # BELL + 0x0008: 0x16, # BACKSPACE + 0x0009: 0x05, # HORIZONTAL TABULATION + 0x000A: 0x25, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x3C, # DEVICE CONTROL FOUR + 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x32, # SYNCHRONOUS IDLE + 0x0017: 0x26, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x3F, # SUBSTITUTE + 0x001B: 0x27, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x40, # SPACE + 0x0021: 0x4F, # EXCLAMATION MARK + 0x0022: 0xFC, # QUOTATION MARK + 0x0023: 0xEC, # NUMBER SIGN + 0x0024: 0xAD, # DOLLAR SIGN + 0x0025: 0x6C, # PERCENT SIGN + 0x0026: 0x50, # AMPERSAND + 0x0027: 0x7D, # APOSTROPHE + 0x0028: 0x4D, # LEFT PARENTHESIS + 0x0029: 0x5D, # RIGHT PARENTHESIS + 0x002A: 0x5C, # ASTERISK + 0x002B: 0x4E, # PLUS SIGN + 0x002C: 0x6B, # COMMA + 0x002D: 0x60, # HYPHEN-MINUS + 0x002E: 0x4B, # FULL STOP + 0x002F: 0x61, # SOLIDUS + 0x0030: 0xF0, # DIGIT ZERO + 0x0031: 0xF1, # DIGIT ONE + 0x0032: 0xF2, # DIGIT TWO + 0x0033: 0xF3, # DIGIT THREE + 0x0034: 0xF4, # DIGIT FOUR + 0x0035: 0xF5, # DIGIT FIVE + 0x0036: 0xF6, # DIGIT SIX + 0x0037: 0xF7, # DIGIT SEVEN + 0x0038: 0xF8, # DIGIT EIGHT + 0x0039: 0xF9, # DIGIT NINE + 0x003A: 0x7A, # COLON + 0x003B: 0x5E, # SEMICOLON + 0x003C: 0x4C, # LESS-THAN SIGN + 0x003D: 0x7E, # EQUALS SIGN + 0x003E: 0x6E, # GREATER-THAN SIGN + 0x003F: 0x6F, # QUESTION MARK + 0x0040: 0xAE, # COMMERCIAL AT + 0x0041: 0xC1, # LATIN CAPITAL LETTER A + 0x0042: 0xC2, # LATIN CAPITAL LETTER B + 0x0043: 0xC3, # LATIN CAPITAL LETTER C + 0x0044: 0xC4, # LATIN CAPITAL LETTER D + 0x0045: 0xC5, # LATIN CAPITAL LETTER E + 0x0046: 0xC6, # LATIN CAPITAL LETTER F + 0x0047: 0xC7, # LATIN CAPITAL LETTER G + 0x0048: 0xC8, # LATIN CAPITAL LETTER H + 0x0049: 0xC9, # LATIN CAPITAL LETTER I + 0x004A: 0xD1, # LATIN CAPITAL LETTER J + 0x004B: 0xD2, # LATIN CAPITAL LETTER K + 0x004C: 0xD3, # LATIN CAPITAL LETTER L + 0x004D: 0xD4, # LATIN CAPITAL LETTER M + 0x004E: 0xD5, # LATIN CAPITAL LETTER N + 0x004F: 0xD6, # LATIN CAPITAL LETTER O + 0x0050: 0xD7, # LATIN CAPITAL LETTER P + 0x0051: 0xD8, # LATIN CAPITAL LETTER Q + 0x0052: 0xD9, # LATIN CAPITAL LETTER R + 0x0053: 0xE2, # LATIN CAPITAL LETTER S + 0x0054: 0xE3, # LATIN CAPITAL LETTER T + 0x0055: 0xE4, # LATIN CAPITAL LETTER U + 0x0056: 0xE5, # LATIN CAPITAL LETTER V + 0x0057: 0xE6, # LATIN CAPITAL LETTER W + 0x0058: 0xE7, # LATIN CAPITAL LETTER X + 0x0059: 0xE8, # LATIN CAPITAL LETTER Y + 0x005A: 0xE9, # LATIN CAPITAL LETTER Z + 0x005B: 0x68, # LEFT SQUARE BRACKET + 0x005C: 0xDC, # REVERSE SOLIDUS + 0x005D: 0xAC, # RIGHT SQUARE BRACKET + 0x005E: 0x5F, # CIRCUMFLEX ACCENT + 0x005F: 0x6D, # LOW LINE + 0x0060: 0x8D, # GRAVE ACCENT + 0x0061: 0x81, # LATIN SMALL LETTER A + 0x0062: 0x82, # LATIN SMALL LETTER B + 0x0063: 0x83, # LATIN SMALL LETTER C + 0x0064: 0x84, # LATIN SMALL LETTER D + 0x0065: 0x85, # LATIN SMALL LETTER E + 0x0066: 0x86, # LATIN SMALL LETTER F + 0x0067: 0x87, # LATIN SMALL LETTER G + 0x0068: 0x88, # LATIN SMALL LETTER H + 0x0069: 0x89, # LATIN SMALL LETTER I + 0x006A: 0x91, # LATIN SMALL LETTER J + 0x006B: 0x92, # LATIN SMALL LETTER K + 0x006C: 0x93, # LATIN SMALL LETTER L + 0x006D: 0x94, # LATIN SMALL LETTER M + 0x006E: 0x95, # LATIN SMALL LETTER N + 0x006F: 0x96, # LATIN SMALL LETTER O + 0x0070: 0x97, # LATIN SMALL LETTER P + 0x0071: 0x98, # LATIN SMALL LETTER Q + 0x0072: 0x99, # LATIN SMALL LETTER R + 0x0073: 0xA2, # LATIN SMALL LETTER S + 0x0074: 0xA3, # LATIN SMALL LETTER T + 0x0075: 0xA4, # LATIN SMALL LETTER U + 0x0076: 0xA5, # LATIN SMALL LETTER V + 0x0077: 0xA6, # LATIN SMALL LETTER W + 0x0078: 0xA7, # LATIN SMALL LETTER X + 0x0079: 0xA8, # LATIN SMALL LETTER Y + 0x007A: 0xA9, # LATIN SMALL LETTER Z + 0x007B: 0x48, # LEFT CURLY BRACKET + 0x007C: 0xBB, # VERTICAL LINE + 0x007D: 0x8C, # RIGHT CURLY BRACKET + 0x007E: 0xCC, # TILDE + 0x007F: 0x07, # DELETE + 0x0080: 0x20, # CONTROL + 0x0081: 0x21, # CONTROL + 0x0082: 0x22, # CONTROL + 0x0083: 0x23, # CONTROL + 0x0084: 0x24, # CONTROL + 0x0085: 0x15, # CONTROL + 0x0086: 0x06, # CONTROL + 0x0087: 0x17, # CONTROL + 0x0088: 0x28, # CONTROL + 0x0089: 0x29, # CONTROL + 0x008A: 0x2A, # CONTROL + 0x008B: 0x2B, # CONTROL + 0x008C: 0x2C, # CONTROL + 0x008D: 0x09, # CONTROL + 0x008E: 0x0A, # CONTROL + 0x008F: 0x1B, # CONTROL + 0x0090: 0x30, # CONTROL + 0x0091: 0x31, # CONTROL + 0x0092: 0x1A, # CONTROL + 0x0093: 0x33, # CONTROL + 0x0094: 0x34, # CONTROL + 0x0095: 0x35, # CONTROL + 0x0096: 0x36, # CONTROL + 0x0097: 0x08, # CONTROL + 0x0098: 0x38, # CONTROL + 0x0099: 0x39, # CONTROL + 0x009A: 0x3A, # CONTROL + 0x009B: 0x3B, # CONTROL + 0x009C: 0x04, # CONTROL + 0x009D: 0x14, # CONTROL + 0x009E: 0x3E, # CONTROL + 0x009F: 0xFF, # CONTROL + 0x00A0: 0x41, # NO-BREAK SPACE + 0x00A1: 0xAA, # INVERTED EXCLAMATION MARK + 0x00A2: 0xB0, # CENT SIGN + 0x00A3: 0xB1, # POUND SIGN + 0x00A4: 0x9F, # CURRENCY SIGN + 0x00A5: 0xB2, # YEN SIGN + 0x00A6: 0x8E, # BROKEN BAR + 0x00A7: 0xB5, # SECTION SIGN + 0x00A8: 0xBD, # DIAERESIS + 0x00A9: 0xB4, # COPYRIGHT SIGN + 0x00AA: 0x9A, # FEMININE ORDINAL INDICATOR + 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xBA, # NOT SIGN + 0x00AD: 0xCA, # SOFT HYPHEN + 0x00AE: 0xAF, # REGISTERED SIGN + 0x00AF: 0xBC, # MACRON + 0x00B0: 0x90, # DEGREE SIGN + 0x00B1: 0x8F, # PLUS-MINUS SIGN + 0x00B2: 0xEA, # SUPERSCRIPT TWO + 0x00B3: 0xFA, # SUPERSCRIPT THREE + 0x00B4: 0xBE, # ACUTE ACCENT + 0x00B5: 0xA0, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB3, # MIDDLE DOT + 0x00B8: 0x9D, # CEDILLA + 0x00B9: 0xDA, # SUPERSCRIPT ONE + 0x00BA: 0x9B, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF + 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xAB, # INVERTED QUESTION MARK + 0x00C0: 0x64, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0x65, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0x62, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0x66, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x63, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x67, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0x9E, # LATIN CAPITAL LIGATURE AE + 0x00C7: 0x4A, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0x74, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x71, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0x72, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0x73, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0x78, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0x75, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0x76, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0x77, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0x69, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xED, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEB, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xEF, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0x7B, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xBF, # MULTIPLICATION SIGN + 0x00D8: 0x80, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xFD, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xFE, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xFB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0x7F, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0x59, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00E0: 0x44, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x45, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x42, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x46, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x43, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x47, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0x9C, # LATIN SMALL LIGATURE AE + 0x00E7: 0xC0, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x54, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x51, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x52, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x53, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x58, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x55, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x56, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x57, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0x49, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xCD, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xCE, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xCB, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xCF, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xA1, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xE1, # DIVISION SIGN + 0x00F8: 0x70, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xDD, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xDE, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xDB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xE0, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011E: 0x5A, # LATIN CAPITAL LETTER G WITH BREVE + 0x011F: 0xD0, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0x5B, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0x79, # LATIN SMALL LETTER DOTLESS I + 0x015E: 0x7C, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015F: 0x6A, # LATIN SMALL LETTER S WITH CEDILLA } - Modified: python/trunk/Lib/encodings/cp1140.py ============================================================================== --- python/trunk/Lib/encodings/cp1140.py (original) +++ python/trunk/Lib/encodings/cp1140.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x9c' # 0x04 -> CONTROL - u'\t' # 0x05 -> HORIZONTAL TABULATION - u'\x86' # 0x06 -> CONTROL - u'\x7f' # 0x07 -> DELETE - u'\x97' # 0x08 -> CONTROL - u'\x8d' # 0x09 -> CONTROL - u'\x8e' # 0x0A -> CONTROL - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x9d' # 0x14 -> CONTROL - u'\x85' # 0x15 -> CONTROL - u'\x08' # 0x16 -> BACKSPACE - u'\x87' # 0x17 -> CONTROL - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x92' # 0x1A -> CONTROL - u'\x8f' # 0x1B -> CONTROL - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u'\x80' # 0x20 -> CONTROL - u'\x81' # 0x21 -> CONTROL - u'\x82' # 0x22 -> CONTROL - u'\x83' # 0x23 -> CONTROL - u'\x84' # 0x24 -> CONTROL - u'\n' # 0x25 -> LINE FEED - u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK - u'\x1b' # 0x27 -> ESCAPE - u'\x88' # 0x28 -> CONTROL - u'\x89' # 0x29 -> CONTROL - u'\x8a' # 0x2A -> CONTROL - u'\x8b' # 0x2B -> CONTROL - u'\x8c' # 0x2C -> CONTROL - u'\x05' # 0x2D -> ENQUIRY - u'\x06' # 0x2E -> ACKNOWLEDGE - u'\x07' # 0x2F -> BELL - u'\x90' # 0x30 -> CONTROL - u'\x91' # 0x31 -> CONTROL - u'\x16' # 0x32 -> SYNCHRONOUS IDLE - u'\x93' # 0x33 -> CONTROL - u'\x94' # 0x34 -> CONTROL - u'\x95' # 0x35 -> CONTROL - u'\x96' # 0x36 -> CONTROL - u'\x04' # 0x37 -> END OF TRANSMISSION - u'\x98' # 0x38 -> CONTROL - u'\x99' # 0x39 -> CONTROL - u'\x9a' # 0x3A -> CONTROL - u'\x9b' # 0x3B -> CONTROL - u'\x14' # 0x3C -> DEVICE CONTROL FOUR - u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE - u'\x9e' # 0x3E -> CONTROL - u'\x1a' # 0x3F -> SUBSTITUTE - u' ' # 0x40 -> SPACE - u'\xa0' # 0x41 -> NO-BREAK SPACE - u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE - u'\xa2' # 0x4A -> CENT SIGN - u'.' # 0x4B -> FULL STOP - u'<' # 0x4C -> LESS-THAN SIGN - u'(' # 0x4D -> LEFT PARENTHESIS - u'+' # 0x4E -> PLUS SIGN - u'|' # 0x4F -> VERTICAL LINE - u'&' # 0x50 -> AMPERSAND - u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE - u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE - u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) - u'!' # 0x5A -> EXCLAMATION MARK - u'$' # 0x5B -> DOLLAR SIGN - u'*' # 0x5C -> ASTERISK - u')' # 0x5D -> RIGHT PARENTHESIS - u';' # 0x5E -> SEMICOLON - u'\xac' # 0x5F -> NOT SIGN - u'-' # 0x60 -> HYPHEN-MINUS - u'/' # 0x61 -> SOLIDUS - u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xa6' # 0x6A -> BROKEN BAR - u',' # 0x6B -> COMMA - u'%' # 0x6C -> PERCENT SIGN - u'_' # 0x6D -> LOW LINE - u'>' # 0x6E -> GREATER-THAN SIGN - u'?' # 0x6F -> QUESTION MARK - u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE - u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE - u'`' # 0x79 -> GRAVE ACCENT - u':' # 0x7A -> COLON - u'#' # 0x7B -> NUMBER SIGN - u'@' # 0x7C -> COMMERCIAL AT - u"'" # 0x7D -> APOSTROPHE - u'=' # 0x7E -> EQUALS SIGN - u'"' # 0x7F -> QUOTATION MARK - u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE - u'a' # 0x81 -> LATIN SMALL LETTER A - u'b' # 0x82 -> LATIN SMALL LETTER B - u'c' # 0x83 -> LATIN SMALL LETTER C - u'd' # 0x84 -> LATIN SMALL LETTER D - u'e' # 0x85 -> LATIN SMALL LETTER E - u'f' # 0x86 -> LATIN SMALL LETTER F - u'g' # 0x87 -> LATIN SMALL LETTER G - u'h' # 0x88 -> LATIN SMALL LETTER H - u'i' # 0x89 -> LATIN SMALL LETTER I - u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) - u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE - u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) - u'\xb1' # 0x8F -> PLUS-MINUS SIGN - u'\xb0' # 0x90 -> DEGREE SIGN - u'j' # 0x91 -> LATIN SMALL LETTER J - u'k' # 0x92 -> LATIN SMALL LETTER K - u'l' # 0x93 -> LATIN SMALL LETTER L - u'm' # 0x94 -> LATIN SMALL LETTER M - u'n' # 0x95 -> LATIN SMALL LETTER N - u'o' # 0x96 -> LATIN SMALL LETTER O - u'p' # 0x97 -> LATIN SMALL LETTER P - u'q' # 0x98 -> LATIN SMALL LETTER Q - u'r' # 0x99 -> LATIN SMALL LETTER R - u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR - u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE - u'\xb8' # 0x9D -> CEDILLA - u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE - u'\u20ac' # 0x9F -> EURO SIGN - u'\xb5' # 0xA0 -> MICRO SIGN - u'~' # 0xA1 -> TILDE - u's' # 0xA2 -> LATIN SMALL LETTER S - u't' # 0xA3 -> LATIN SMALL LETTER T - u'u' # 0xA4 -> LATIN SMALL LETTER U - u'v' # 0xA5 -> LATIN SMALL LETTER V - u'w' # 0xA6 -> LATIN SMALL LETTER W - u'x' # 0xA7 -> LATIN SMALL LETTER X - u'y' # 0xA8 -> LATIN SMALL LETTER Y - u'z' # 0xA9 -> LATIN SMALL LETTER Z - u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK - u'\xbf' # 0xAB -> INVERTED QUESTION MARK - u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) - u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) - u'\xae' # 0xAF -> REGISTERED SIGN - u'^' # 0xB0 -> CIRCUMFLEX ACCENT - u'\xa3' # 0xB1 -> POUND SIGN - u'\xa5' # 0xB2 -> YEN SIGN - u'\xb7' # 0xB3 -> MIDDLE DOT - u'\xa9' # 0xB4 -> COPYRIGHT SIGN - u'\xa7' # 0xB5 -> SECTION SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS - u'[' # 0xBA -> LEFT SQUARE BRACKET - u']' # 0xBB -> RIGHT SQUARE BRACKET - u'\xaf' # 0xBC -> MACRON - u'\xa8' # 0xBD -> DIAERESIS - u'\xb4' # 0xBE -> ACUTE ACCENT - u'\xd7' # 0xBF -> MULTIPLICATION SIGN - u'{' # 0xC0 -> LEFT CURLY BRACKET - u'A' # 0xC1 -> LATIN CAPITAL LETTER A - u'B' # 0xC2 -> LATIN CAPITAL LETTER B - u'C' # 0xC3 -> LATIN CAPITAL LETTER C - u'D' # 0xC4 -> LATIN CAPITAL LETTER D - u'E' # 0xC5 -> LATIN CAPITAL LETTER E - u'F' # 0xC6 -> LATIN CAPITAL LETTER F - u'G' # 0xC7 -> LATIN CAPITAL LETTER G - u'H' # 0xC8 -> LATIN CAPITAL LETTER H - u'I' # 0xC9 -> LATIN CAPITAL LETTER I - u'\xad' # 0xCA -> SOFT HYPHEN - u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE - u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE - u'}' # 0xD0 -> RIGHT CURLY BRACKET - u'J' # 0xD1 -> LATIN CAPITAL LETTER J - u'K' # 0xD2 -> LATIN CAPITAL LETTER K - u'L' # 0xD3 -> LATIN CAPITAL LETTER L - u'M' # 0xD4 -> LATIN CAPITAL LETTER M - u'N' # 0xD5 -> LATIN CAPITAL LETTER N - u'O' # 0xD6 -> LATIN CAPITAL LETTER O - u'P' # 0xD7 -> LATIN CAPITAL LETTER P - u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q - u'R' # 0xD9 -> LATIN CAPITAL LETTER R - u'\xb9' # 0xDA -> SUPERSCRIPT ONE - u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE - u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\\' # 0xE0 -> REVERSE SOLIDUS - u'\xf7' # 0xE1 -> DIVISION SIGN - u'S' # 0xE2 -> LATIN CAPITAL LETTER S - u'T' # 0xE3 -> LATIN CAPITAL LETTER T - u'U' # 0xE4 -> LATIN CAPITAL LETTER U - u'V' # 0xE5 -> LATIN CAPITAL LETTER V - u'W' # 0xE6 -> LATIN CAPITAL LETTER W - u'X' # 0xE7 -> LATIN CAPITAL LETTER X - u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y - u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z - u'\xb2' # 0xEA -> SUPERSCRIPT TWO - u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE - u'0' # 0xF0 -> DIGIT ZERO - u'1' # 0xF1 -> DIGIT ONE - u'2' # 0xF2 -> DIGIT TWO - u'3' # 0xF3 -> DIGIT THREE - u'4' # 0xF4 -> DIGIT FOUR - u'5' # 0xF5 -> DIGIT FIVE - u'6' # 0xF6 -> DIGIT SIX - u'7' # 0xF7 -> DIGIT SEVEN - u'8' # 0xF8 -> DIGIT EIGHT - u'9' # 0xF9 -> DIGIT NINE - u'\xb3' # 0xFA -> SUPERSCRIPT THREE - u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE - u'\x9f' # 0xFF -> CONTROL + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\xa0' # 0x41 -> NO-BREAK SPACE + u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + u'\xa2' # 0x4A -> CENT SIGN + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'|' # 0x4F -> VERTICAL LINE + u'&' # 0x50 -> AMPERSAND + u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'!' # 0x5A -> EXCLAMATION MARK + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'\xac' # 0x5F -> NOT SIGN + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xa6' # 0x6A -> BROKEN BAR + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + u'\xb8' # 0x9D -> CEDILLA + u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + u'\u20ac' # 0x9F -> EURO SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + u'\xbf' # 0xAB -> INVERTED QUESTION MARK + u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + u'\xae' # 0xAF -> REGISTERED SIGN + u'^' # 0xB0 -> CIRCUMFLEX ACCENT + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'[' # 0xBA -> LEFT SQUARE BRACKET + u']' # 0xBB -> RIGHT SQUARE BRACKET + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + u'\x9f' # 0xFF -> CONTROL ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x37, # END OF TRANSMISSION - 0x0005: 0x2D, # ENQUIRY - 0x0006: 0x2E, # ACKNOWLEDGE - 0x0007: 0x2F, # BELL - 0x0008: 0x16, # BACKSPACE - 0x0009: 0x05, # HORIZONTAL TABULATION - 0x000A: 0x25, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x3C, # DEVICE CONTROL FOUR - 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x32, # SYNCHRONOUS IDLE - 0x0017: 0x26, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x3F, # SUBSTITUTE - 0x001B: 0x27, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x40, # SPACE - 0x0021: 0x5A, # EXCLAMATION MARK - 0x0022: 0x7F, # QUOTATION MARK - 0x0023: 0x7B, # NUMBER SIGN - 0x0024: 0x5B, # DOLLAR SIGN - 0x0025: 0x6C, # PERCENT SIGN - 0x0026: 0x50, # AMPERSAND - 0x0027: 0x7D, # APOSTROPHE - 0x0028: 0x4D, # LEFT PARENTHESIS - 0x0029: 0x5D, # RIGHT PARENTHESIS - 0x002A: 0x5C, # ASTERISK - 0x002B: 0x4E, # PLUS SIGN - 0x002C: 0x6B, # COMMA - 0x002D: 0x60, # HYPHEN-MINUS - 0x002E: 0x4B, # FULL STOP - 0x002F: 0x61, # SOLIDUS - 0x0030: 0xF0, # DIGIT ZERO - 0x0031: 0xF1, # DIGIT ONE - 0x0032: 0xF2, # DIGIT TWO - 0x0033: 0xF3, # DIGIT THREE - 0x0034: 0xF4, # DIGIT FOUR - 0x0035: 0xF5, # DIGIT FIVE - 0x0036: 0xF6, # DIGIT SIX - 0x0037: 0xF7, # DIGIT SEVEN - 0x0038: 0xF8, # DIGIT EIGHT - 0x0039: 0xF9, # DIGIT NINE - 0x003A: 0x7A, # COLON - 0x003B: 0x5E, # SEMICOLON - 0x003C: 0x4C, # LESS-THAN SIGN - 0x003D: 0x7E, # EQUALS SIGN - 0x003E: 0x6E, # GREATER-THAN SIGN - 0x003F: 0x6F, # QUESTION MARK - 0x0040: 0x7C, # COMMERCIAL AT - 0x0041: 0xC1, # LATIN CAPITAL LETTER A - 0x0042: 0xC2, # LATIN CAPITAL LETTER B - 0x0043: 0xC3, # LATIN CAPITAL LETTER C - 0x0044: 0xC4, # LATIN CAPITAL LETTER D - 0x0045: 0xC5, # LATIN CAPITAL LETTER E - 0x0046: 0xC6, # LATIN CAPITAL LETTER F - 0x0047: 0xC7, # LATIN CAPITAL LETTER G - 0x0048: 0xC8, # LATIN CAPITAL LETTER H - 0x0049: 0xC9, # LATIN CAPITAL LETTER I - 0x004A: 0xD1, # LATIN CAPITAL LETTER J - 0x004B: 0xD2, # LATIN CAPITAL LETTER K - 0x004C: 0xD3, # LATIN CAPITAL LETTER L - 0x004D: 0xD4, # LATIN CAPITAL LETTER M - 0x004E: 0xD5, # LATIN CAPITAL LETTER N - 0x004F: 0xD6, # LATIN CAPITAL LETTER O - 0x0050: 0xD7, # LATIN CAPITAL LETTER P - 0x0051: 0xD8, # LATIN CAPITAL LETTER Q - 0x0052: 0xD9, # LATIN CAPITAL LETTER R - 0x0053: 0xE2, # LATIN CAPITAL LETTER S - 0x0054: 0xE3, # LATIN CAPITAL LETTER T - 0x0055: 0xE4, # LATIN CAPITAL LETTER U - 0x0056: 0xE5, # LATIN CAPITAL LETTER V - 0x0057: 0xE6, # LATIN CAPITAL LETTER W - 0x0058: 0xE7, # LATIN CAPITAL LETTER X - 0x0059: 0xE8, # LATIN CAPITAL LETTER Y - 0x005A: 0xE9, # LATIN CAPITAL LETTER Z - 0x005B: 0xBA, # LEFT SQUARE BRACKET - 0x005C: 0xE0, # REVERSE SOLIDUS - 0x005D: 0xBB, # RIGHT SQUARE BRACKET - 0x005E: 0xB0, # CIRCUMFLEX ACCENT - 0x005F: 0x6D, # LOW LINE - 0x0060: 0x79, # GRAVE ACCENT - 0x0061: 0x81, # LATIN SMALL LETTER A - 0x0062: 0x82, # LATIN SMALL LETTER B - 0x0063: 0x83, # LATIN SMALL LETTER C - 0x0064: 0x84, # LATIN SMALL LETTER D - 0x0065: 0x85, # LATIN SMALL LETTER E - 0x0066: 0x86, # LATIN SMALL LETTER F - 0x0067: 0x87, # LATIN SMALL LETTER G - 0x0068: 0x88, # LATIN SMALL LETTER H - 0x0069: 0x89, # LATIN SMALL LETTER I - 0x006A: 0x91, # LATIN SMALL LETTER J - 0x006B: 0x92, # LATIN SMALL LETTER K - 0x006C: 0x93, # LATIN SMALL LETTER L - 0x006D: 0x94, # LATIN SMALL LETTER M - 0x006E: 0x95, # LATIN SMALL LETTER N - 0x006F: 0x96, # LATIN SMALL LETTER O - 0x0070: 0x97, # LATIN SMALL LETTER P - 0x0071: 0x98, # LATIN SMALL LETTER Q - 0x0072: 0x99, # LATIN SMALL LETTER R - 0x0073: 0xA2, # LATIN SMALL LETTER S - 0x0074: 0xA3, # LATIN SMALL LETTER T - 0x0075: 0xA4, # LATIN SMALL LETTER U - 0x0076: 0xA5, # LATIN SMALL LETTER V - 0x0077: 0xA6, # LATIN SMALL LETTER W - 0x0078: 0xA7, # LATIN SMALL LETTER X - 0x0079: 0xA8, # LATIN SMALL LETTER Y - 0x007A: 0xA9, # LATIN SMALL LETTER Z - 0x007B: 0xC0, # LEFT CURLY BRACKET - 0x007C: 0x4F, # VERTICAL LINE - 0x007D: 0xD0, # RIGHT CURLY BRACKET - 0x007E: 0xA1, # TILDE - 0x007F: 0x07, # DELETE - 0x0080: 0x20, # CONTROL - 0x0081: 0x21, # CONTROL - 0x0082: 0x22, # CONTROL - 0x0083: 0x23, # CONTROL - 0x0084: 0x24, # CONTROL - 0x0085: 0x15, # CONTROL - 0x0086: 0x06, # CONTROL - 0x0087: 0x17, # CONTROL - 0x0088: 0x28, # CONTROL - 0x0089: 0x29, # CONTROL - 0x008A: 0x2A, # CONTROL - 0x008B: 0x2B, # CONTROL - 0x008C: 0x2C, # CONTROL - 0x008D: 0x09, # CONTROL - 0x008E: 0x0A, # CONTROL - 0x008F: 0x1B, # CONTROL - 0x0090: 0x30, # CONTROL - 0x0091: 0x31, # CONTROL - 0x0092: 0x1A, # CONTROL - 0x0093: 0x33, # CONTROL - 0x0094: 0x34, # CONTROL - 0x0095: 0x35, # CONTROL - 0x0096: 0x36, # CONTROL - 0x0097: 0x08, # CONTROL - 0x0098: 0x38, # CONTROL - 0x0099: 0x39, # CONTROL - 0x009A: 0x3A, # CONTROL - 0x009B: 0x3B, # CONTROL - 0x009C: 0x04, # CONTROL - 0x009D: 0x14, # CONTROL - 0x009E: 0x3E, # CONTROL - 0x009F: 0xFF, # CONTROL - 0x00A0: 0x41, # NO-BREAK SPACE - 0x00A1: 0xAA, # INVERTED EXCLAMATION MARK - 0x00A2: 0x4A, # CENT SIGN - 0x00A3: 0xB1, # POUND SIGN - 0x00A5: 0xB2, # YEN SIGN - 0x00A6: 0x6A, # BROKEN BAR - 0x00A7: 0xB5, # SECTION SIGN - 0x00A8: 0xBD, # DIAERESIS - 0x00A9: 0xB4, # COPYRIGHT SIGN - 0x00AA: 0x9A, # FEMININE ORDINAL INDICATOR - 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0x5F, # NOT SIGN - 0x00AD: 0xCA, # SOFT HYPHEN - 0x00AE: 0xAF, # REGISTERED SIGN - 0x00AF: 0xBC, # MACRON - 0x00B0: 0x90, # DEGREE SIGN - 0x00B1: 0x8F, # PLUS-MINUS SIGN - 0x00B2: 0xEA, # SUPERSCRIPT TWO - 0x00B3: 0xFA, # SUPERSCRIPT THREE - 0x00B4: 0xBE, # ACUTE ACCENT - 0x00B5: 0xA0, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB3, # MIDDLE DOT - 0x00B8: 0x9D, # CEDILLA - 0x00B9: 0xDA, # SUPERSCRIPT ONE - 0x00BA: 0x9B, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF - 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xAB, # INVERTED QUESTION MARK - 0x00C0: 0x64, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0x65, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0x62, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0x66, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x63, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x67, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0x9E, # LATIN CAPITAL LIGATURE AE - 0x00C7: 0x68, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0x74, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x71, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0x72, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0x73, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0x78, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0x75, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0x76, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0x77, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D0: 0xAC, # LATIN CAPITAL LETTER ETH (ICELANDIC) - 0x00D1: 0x69, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xED, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEB, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xEF, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xEC, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xBF, # MULTIPLICATION SIGN - 0x00D8: 0x80, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xFD, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xFE, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xFB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xFC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xAD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DE: 0xAE, # LATIN CAPITAL LETTER THORN (ICELANDIC) - 0x00DF: 0x59, # LATIN SMALL LETTER SHARP S (GERMAN) - 0x00E0: 0x44, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x45, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x42, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x46, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x43, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x47, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0x9C, # LATIN SMALL LIGATURE AE - 0x00E7: 0x48, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x54, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x51, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x52, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x53, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x58, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x55, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x56, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x57, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F0: 0x8C, # LATIN SMALL LETTER ETH (ICELANDIC) - 0x00F1: 0x49, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xCD, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xCE, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xCB, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xCF, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xCC, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xE1, # DIVISION SIGN - 0x00F8: 0x70, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xDD, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xDE, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xDB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xDC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0x8D, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) - 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x20AC: 0x9F, # EURO SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x37, # END OF TRANSMISSION + 0x0005: 0x2D, # ENQUIRY + 0x0006: 0x2E, # ACKNOWLEDGE + 0x0007: 0x2F, # BELL + 0x0008: 0x16, # BACKSPACE + 0x0009: 0x05, # HORIZONTAL TABULATION + 0x000A: 0x25, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x3C, # DEVICE CONTROL FOUR + 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x32, # SYNCHRONOUS IDLE + 0x0017: 0x26, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x3F, # SUBSTITUTE + 0x001B: 0x27, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x40, # SPACE + 0x0021: 0x5A, # EXCLAMATION MARK + 0x0022: 0x7F, # QUOTATION MARK + 0x0023: 0x7B, # NUMBER SIGN + 0x0024: 0x5B, # DOLLAR SIGN + 0x0025: 0x6C, # PERCENT SIGN + 0x0026: 0x50, # AMPERSAND + 0x0027: 0x7D, # APOSTROPHE + 0x0028: 0x4D, # LEFT PARENTHESIS + 0x0029: 0x5D, # RIGHT PARENTHESIS + 0x002A: 0x5C, # ASTERISK + 0x002B: 0x4E, # PLUS SIGN + 0x002C: 0x6B, # COMMA + 0x002D: 0x60, # HYPHEN-MINUS + 0x002E: 0x4B, # FULL STOP + 0x002F: 0x61, # SOLIDUS + 0x0030: 0xF0, # DIGIT ZERO + 0x0031: 0xF1, # DIGIT ONE + 0x0032: 0xF2, # DIGIT TWO + 0x0033: 0xF3, # DIGIT THREE + 0x0034: 0xF4, # DIGIT FOUR + 0x0035: 0xF5, # DIGIT FIVE + 0x0036: 0xF6, # DIGIT SIX + 0x0037: 0xF7, # DIGIT SEVEN + 0x0038: 0xF8, # DIGIT EIGHT + 0x0039: 0xF9, # DIGIT NINE + 0x003A: 0x7A, # COLON + 0x003B: 0x5E, # SEMICOLON + 0x003C: 0x4C, # LESS-THAN SIGN + 0x003D: 0x7E, # EQUALS SIGN + 0x003E: 0x6E, # GREATER-THAN SIGN + 0x003F: 0x6F, # QUESTION MARK + 0x0040: 0x7C, # COMMERCIAL AT + 0x0041: 0xC1, # LATIN CAPITAL LETTER A + 0x0042: 0xC2, # LATIN CAPITAL LETTER B + 0x0043: 0xC3, # LATIN CAPITAL LETTER C + 0x0044: 0xC4, # LATIN CAPITAL LETTER D + 0x0045: 0xC5, # LATIN CAPITAL LETTER E + 0x0046: 0xC6, # LATIN CAPITAL LETTER F + 0x0047: 0xC7, # LATIN CAPITAL LETTER G + 0x0048: 0xC8, # LATIN CAPITAL LETTER H + 0x0049: 0xC9, # LATIN CAPITAL LETTER I + 0x004A: 0xD1, # LATIN CAPITAL LETTER J + 0x004B: 0xD2, # LATIN CAPITAL LETTER K + 0x004C: 0xD3, # LATIN CAPITAL LETTER L + 0x004D: 0xD4, # LATIN CAPITAL LETTER M + 0x004E: 0xD5, # LATIN CAPITAL LETTER N + 0x004F: 0xD6, # LATIN CAPITAL LETTER O + 0x0050: 0xD7, # LATIN CAPITAL LETTER P + 0x0051: 0xD8, # LATIN CAPITAL LETTER Q + 0x0052: 0xD9, # LATIN CAPITAL LETTER R + 0x0053: 0xE2, # LATIN CAPITAL LETTER S + 0x0054: 0xE3, # LATIN CAPITAL LETTER T + 0x0055: 0xE4, # LATIN CAPITAL LETTER U + 0x0056: 0xE5, # LATIN CAPITAL LETTER V + 0x0057: 0xE6, # LATIN CAPITAL LETTER W + 0x0058: 0xE7, # LATIN CAPITAL LETTER X + 0x0059: 0xE8, # LATIN CAPITAL LETTER Y + 0x005A: 0xE9, # LATIN CAPITAL LETTER Z + 0x005B: 0xBA, # LEFT SQUARE BRACKET + 0x005C: 0xE0, # REVERSE SOLIDUS + 0x005D: 0xBB, # RIGHT SQUARE BRACKET + 0x005E: 0xB0, # CIRCUMFLEX ACCENT + 0x005F: 0x6D, # LOW LINE + 0x0060: 0x79, # GRAVE ACCENT + 0x0061: 0x81, # LATIN SMALL LETTER A + 0x0062: 0x82, # LATIN SMALL LETTER B + 0x0063: 0x83, # LATIN SMALL LETTER C + 0x0064: 0x84, # LATIN SMALL LETTER D + 0x0065: 0x85, # LATIN SMALL LETTER E + 0x0066: 0x86, # LATIN SMALL LETTER F + 0x0067: 0x87, # LATIN SMALL LETTER G + 0x0068: 0x88, # LATIN SMALL LETTER H + 0x0069: 0x89, # LATIN SMALL LETTER I + 0x006A: 0x91, # LATIN SMALL LETTER J + 0x006B: 0x92, # LATIN SMALL LETTER K + 0x006C: 0x93, # LATIN SMALL LETTER L + 0x006D: 0x94, # LATIN SMALL LETTER M + 0x006E: 0x95, # LATIN SMALL LETTER N + 0x006F: 0x96, # LATIN SMALL LETTER O + 0x0070: 0x97, # LATIN SMALL LETTER P + 0x0071: 0x98, # LATIN SMALL LETTER Q + 0x0072: 0x99, # LATIN SMALL LETTER R + 0x0073: 0xA2, # LATIN SMALL LETTER S + 0x0074: 0xA3, # LATIN SMALL LETTER T + 0x0075: 0xA4, # LATIN SMALL LETTER U + 0x0076: 0xA5, # LATIN SMALL LETTER V + 0x0077: 0xA6, # LATIN SMALL LETTER W + 0x0078: 0xA7, # LATIN SMALL LETTER X + 0x0079: 0xA8, # LATIN SMALL LETTER Y + 0x007A: 0xA9, # LATIN SMALL LETTER Z + 0x007B: 0xC0, # LEFT CURLY BRACKET + 0x007C: 0x4F, # VERTICAL LINE + 0x007D: 0xD0, # RIGHT CURLY BRACKET + 0x007E: 0xA1, # TILDE + 0x007F: 0x07, # DELETE + 0x0080: 0x20, # CONTROL + 0x0081: 0x21, # CONTROL + 0x0082: 0x22, # CONTROL + 0x0083: 0x23, # CONTROL + 0x0084: 0x24, # CONTROL + 0x0085: 0x15, # CONTROL + 0x0086: 0x06, # CONTROL + 0x0087: 0x17, # CONTROL + 0x0088: 0x28, # CONTROL + 0x0089: 0x29, # CONTROL + 0x008A: 0x2A, # CONTROL + 0x008B: 0x2B, # CONTROL + 0x008C: 0x2C, # CONTROL + 0x008D: 0x09, # CONTROL + 0x008E: 0x0A, # CONTROL + 0x008F: 0x1B, # CONTROL + 0x0090: 0x30, # CONTROL + 0x0091: 0x31, # CONTROL + 0x0092: 0x1A, # CONTROL + 0x0093: 0x33, # CONTROL + 0x0094: 0x34, # CONTROL + 0x0095: 0x35, # CONTROL + 0x0096: 0x36, # CONTROL + 0x0097: 0x08, # CONTROL + 0x0098: 0x38, # CONTROL + 0x0099: 0x39, # CONTROL + 0x009A: 0x3A, # CONTROL + 0x009B: 0x3B, # CONTROL + 0x009C: 0x04, # CONTROL + 0x009D: 0x14, # CONTROL + 0x009E: 0x3E, # CONTROL + 0x009F: 0xFF, # CONTROL + 0x00A0: 0x41, # NO-BREAK SPACE + 0x00A1: 0xAA, # INVERTED EXCLAMATION MARK + 0x00A2: 0x4A, # CENT SIGN + 0x00A3: 0xB1, # POUND SIGN + 0x00A5: 0xB2, # YEN SIGN + 0x00A6: 0x6A, # BROKEN BAR + 0x00A7: 0xB5, # SECTION SIGN + 0x00A8: 0xBD, # DIAERESIS + 0x00A9: 0xB4, # COPYRIGHT SIGN + 0x00AA: 0x9A, # FEMININE ORDINAL INDICATOR + 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0x5F, # NOT SIGN + 0x00AD: 0xCA, # SOFT HYPHEN + 0x00AE: 0xAF, # REGISTERED SIGN + 0x00AF: 0xBC, # MACRON + 0x00B0: 0x90, # DEGREE SIGN + 0x00B1: 0x8F, # PLUS-MINUS SIGN + 0x00B2: 0xEA, # SUPERSCRIPT TWO + 0x00B3: 0xFA, # SUPERSCRIPT THREE + 0x00B4: 0xBE, # ACUTE ACCENT + 0x00B5: 0xA0, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB3, # MIDDLE DOT + 0x00B8: 0x9D, # CEDILLA + 0x00B9: 0xDA, # SUPERSCRIPT ONE + 0x00BA: 0x9B, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF + 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xAB, # INVERTED QUESTION MARK + 0x00C0: 0x64, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0x65, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0x62, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0x66, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x63, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x67, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0x9E, # LATIN CAPITAL LIGATURE AE + 0x00C7: 0x68, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0x74, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x71, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0x72, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0x73, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0x78, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0x75, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0x76, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0x77, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0: 0xAC, # LATIN CAPITAL LETTER ETH (ICELANDIC) + 0x00D1: 0x69, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xED, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEB, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xEF, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xEC, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xBF, # MULTIPLICATION SIGN + 0x00D8: 0x80, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xFD, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xFE, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xFB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xFC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xAD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE: 0xAE, # LATIN CAPITAL LETTER THORN (ICELANDIC) + 0x00DF: 0x59, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00E0: 0x44, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x45, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x42, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x46, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x43, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x47, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0x9C, # LATIN SMALL LIGATURE AE + 0x00E7: 0x48, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x54, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x51, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x52, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x53, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x58, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x55, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x56, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x57, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0: 0x8C, # LATIN SMALL LETTER ETH (ICELANDIC) + 0x00F1: 0x49, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xCD, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xCE, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xCB, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xCF, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xCC, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xE1, # DIVISION SIGN + 0x00F8: 0x70, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xDD, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xDE, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xDB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xDC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0x8D, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) + 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x20AC: 0x9F, # EURO SIGN } - Modified: python/trunk/Lib/encodings/cp1250.py ============================================================================== --- python/trunk/Lib/encodings/cp1250.py (original) +++ python/trunk/Lib/encodings/cp1250.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,517 +32,516 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\ufffe' # 0x81 -> UNDEFINED - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\ufffe' # 0x83 -> UNDEFINED - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\ufffe' # 0x88 -> UNDEFINED - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u015a' # 0x8C -> LATIN CAPITAL LETTER S WITH ACUTE - u'\u0164' # 0x8D -> LATIN CAPITAL LETTER T WITH CARON - u'\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON - u'\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\ufffe' # 0x90 -> UNDEFINED - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\ufffe' # 0x98 -> UNDEFINED - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u015b' # 0x9C -> LATIN SMALL LETTER S WITH ACUTE - u'\u0165' # 0x9D -> LATIN SMALL LETTER T WITH CARON - u'\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON - u'\u017a' # 0x9F -> LATIN SMALL LETTER Z WITH ACUTE - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u02c7' # 0xA1 -> CARON - u'\u02d8' # 0xA2 -> BREVE - u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\u0104' # 0xA5 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u02db' # 0xB2 -> OGONEK - u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\u0105' # 0xB9 -> LATIN SMALL LETTER A WITH OGONEK - u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u013d' # 0xBC -> LATIN CAPITAL LETTER L WITH CARON - u'\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT - u'\u013e' # 0xBE -> LATIN SMALL LETTER L WITH CARON - u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE - u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON - u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE - u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON - u'\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE - u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON - u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE - u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE - u'\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON - u'\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE - u'\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA - u'\u02d9' # 0xFF -> DOT ABOVE + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\ufffe' # 0x83 -> UNDEFINED + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\ufffe' # 0x88 -> UNDEFINED + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u015a' # 0x8C -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u0164' # 0x8D -> LATIN CAPITAL LETTER T WITH CARON + u'\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + u'\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u015b' # 0x9C -> LATIN SMALL LETTER S WITH ACUTE + u'\u0165' # 0x9D -> LATIN SMALL LETTER T WITH CARON + u'\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + u'\u017a' # 0x9F -> LATIN SMALL LETTER Z WITH ACUTE + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u02c7' # 0xA1 -> CARON + u'\u02d8' # 0xA2 -> BREVE + u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u0104' # 0xA5 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u02db' # 0xB2 -> OGONEK + u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\u0105' # 0xB9 -> LATIN SMALL LETTER A WITH OGONEK + u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u013d' # 0xBC -> LATIN CAPITAL LETTER L WITH CARON + u'\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + u'\u013e' # 0xBE -> LATIN SMALL LETTER L WITH CARON + u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + u'\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + u'\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + u'\u02d9' # 0xFF -> DOT ABOVE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE - 0x0102: 0xC3, # LATIN CAPITAL LETTER A WITH BREVE - 0x0103: 0xE3, # LATIN SMALL LETTER A WITH BREVE - 0x0104: 0xA5, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0xB9, # LATIN SMALL LETTER A WITH OGONEK - 0x0106: 0xC6, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0xE6, # LATIN SMALL LETTER C WITH ACUTE - 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON - 0x010E: 0xCF, # LATIN CAPITAL LETTER D WITH CARON - 0x010F: 0xEF, # LATIN SMALL LETTER D WITH CARON - 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE - 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE - 0x0118: 0xCA, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0xEA, # LATIN SMALL LETTER E WITH OGONEK - 0x011A: 0xCC, # LATIN CAPITAL LETTER E WITH CARON - 0x011B: 0xEC, # LATIN SMALL LETTER E WITH CARON - 0x0139: 0xC5, # LATIN CAPITAL LETTER L WITH ACUTE - 0x013A: 0xE5, # LATIN SMALL LETTER L WITH ACUTE - 0x013D: 0xBC, # LATIN CAPITAL LETTER L WITH CARON - 0x013E: 0xBE, # LATIN SMALL LETTER L WITH CARON - 0x0141: 0xA3, # LATIN CAPITAL LETTER L WITH STROKE - 0x0142: 0xB3, # LATIN SMALL LETTER L WITH STROKE - 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE - 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE - 0x0147: 0xD2, # LATIN CAPITAL LETTER N WITH CARON - 0x0148: 0xF2, # LATIN SMALL LETTER N WITH CARON - 0x0150: 0xD5, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - 0x0151: 0xF5, # LATIN SMALL LETTER O WITH DOUBLE ACUTE - 0x0154: 0xC0, # LATIN CAPITAL LETTER R WITH ACUTE - 0x0155: 0xE0, # LATIN SMALL LETTER R WITH ACUTE - 0x0158: 0xD8, # LATIN CAPITAL LETTER R WITH CARON - 0x0159: 0xF8, # LATIN SMALL LETTER R WITH CARON - 0x015A: 0x8C, # LATIN CAPITAL LETTER S WITH ACUTE - 0x015B: 0x9C, # LATIN SMALL LETTER S WITH ACUTE - 0x015E: 0xAA, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015F: 0xBA, # LATIN SMALL LETTER S WITH CEDILLA - 0x0160: 0x8A, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0x9A, # LATIN SMALL LETTER S WITH CARON - 0x0162: 0xDE, # LATIN CAPITAL LETTER T WITH CEDILLA - 0x0163: 0xFE, # LATIN SMALL LETTER T WITH CEDILLA - 0x0164: 0x8D, # LATIN CAPITAL LETTER T WITH CARON - 0x0165: 0x9D, # LATIN SMALL LETTER T WITH CARON - 0x016E: 0xD9, # LATIN CAPITAL LETTER U WITH RING ABOVE - 0x016F: 0xF9, # LATIN SMALL LETTER U WITH RING ABOVE - 0x0170: 0xDB, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - 0x0171: 0xFB, # LATIN SMALL LETTER U WITH DOUBLE ACUTE - 0x0179: 0x8F, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x017A: 0x9F, # LATIN SMALL LETTER Z WITH ACUTE - 0x017B: 0xAF, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017C: 0xBF, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x017D: 0x8E, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0x9E, # LATIN SMALL LETTER Z WITH CARON - 0x02C7: 0xA1, # CARON - 0x02D8: 0xA2, # BREVE - 0x02D9: 0xFF, # DOT ABOVE - 0x02DB: 0xB2, # OGONEK - 0x02DD: 0xBD, # DOUBLE ACUTE ACCENT - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AC: 0x80, # EURO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE + 0x0102: 0xC3, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0xE3, # LATIN SMALL LETTER A WITH BREVE + 0x0104: 0xA5, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0xB9, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0xC6, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0xE6, # LATIN SMALL LETTER C WITH ACUTE + 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON + 0x010E: 0xCF, # LATIN CAPITAL LETTER D WITH CARON + 0x010F: 0xEF, # LATIN SMALL LETTER D WITH CARON + 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE + 0x0118: 0xCA, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0xEA, # LATIN SMALL LETTER E WITH OGONEK + 0x011A: 0xCC, # LATIN CAPITAL LETTER E WITH CARON + 0x011B: 0xEC, # LATIN SMALL LETTER E WITH CARON + 0x0139: 0xC5, # LATIN CAPITAL LETTER L WITH ACUTE + 0x013A: 0xE5, # LATIN SMALL LETTER L WITH ACUTE + 0x013D: 0xBC, # LATIN CAPITAL LETTER L WITH CARON + 0x013E: 0xBE, # LATIN SMALL LETTER L WITH CARON + 0x0141: 0xA3, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0xB3, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE + 0x0147: 0xD2, # LATIN CAPITAL LETTER N WITH CARON + 0x0148: 0xF2, # LATIN SMALL LETTER N WITH CARON + 0x0150: 0xD5, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0xF5, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0154: 0xC0, # LATIN CAPITAL LETTER R WITH ACUTE + 0x0155: 0xE0, # LATIN SMALL LETTER R WITH ACUTE + 0x0158: 0xD8, # LATIN CAPITAL LETTER R WITH CARON + 0x0159: 0xF8, # LATIN SMALL LETTER R WITH CARON + 0x015A: 0x8C, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015B: 0x9C, # LATIN SMALL LETTER S WITH ACUTE + 0x015E: 0xAA, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015F: 0xBA, # LATIN SMALL LETTER S WITH CEDILLA + 0x0160: 0x8A, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x9A, # LATIN SMALL LETTER S WITH CARON + 0x0162: 0xDE, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x0163: 0xFE, # LATIN SMALL LETTER T WITH CEDILLA + 0x0164: 0x8D, # LATIN CAPITAL LETTER T WITH CARON + 0x0165: 0x9D, # LATIN SMALL LETTER T WITH CARON + 0x016E: 0xD9, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x016F: 0xF9, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0170: 0xDB, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0xFB, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0179: 0x8F, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017A: 0x9F, # LATIN SMALL LETTER Z WITH ACUTE + 0x017B: 0xAF, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017C: 0xBF, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017D: 0x8E, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0x9E, # LATIN SMALL LETTER Z WITH CARON + 0x02C7: 0xA1, # CARON + 0x02D8: 0xA2, # BREVE + 0x02D9: 0xFF, # DOT ABOVE + 0x02DB: 0xB2, # OGONEK + 0x02DD: 0xBD, # DOUBLE ACUTE ACCENT + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AC: 0x80, # EURO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1251.py ============================================================================== --- python/trunk/Lib/encodings/cp1251.py (original) +++ python/trunk/Lib/encodings/cp1251.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,521 +32,520 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE - u'\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\u20ac' # 0x88 -> EURO SIGN - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE - u'\u040c' # 0x8D -> CYRILLIC CAPITAL LETTER KJE - u'\u040b' # 0x8E -> CYRILLIC CAPITAL LETTER TSHE - u'\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE - u'\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\ufffe' # 0x98 -> UNDEFINED - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE - u'\u045c' # 0x9D -> CYRILLIC SMALL LETTER KJE - u'\u045b' # 0x9E -> CYRILLIC SMALL LETTER TSHE - u'\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U - u'\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U - u'\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\u0490' # 0xA5 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u0404' # 0xAA -> CYRILLIC CAPITAL LETTER UKRAINIAN IE - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\u0407' # 0xAF -> CYRILLIC CAPITAL LETTER YI - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0491' # 0xB4 -> CYRILLIC SMALL LETTER GHE WITH UPTURN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO - u'\u2116' # 0xB9 -> NUMERO SIGN - u'\u0454' # 0xBA -> CYRILLIC SMALL LETTER UKRAINIAN IE - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE - u'\u0405' # 0xBD -> CYRILLIC CAPITAL LETTER DZE - u'\u0455' # 0xBE -> CYRILLIC SMALL LETTER DZE - u'\u0457' # 0xBF -> CYRILLIC SMALL LETTER YI - u'\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A - u'\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE - u'\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE - u'\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE - u'\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE - u'\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE - u'\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE - u'\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE - u'\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I - u'\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I - u'\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA - u'\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL - u'\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM - u'\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN - u'\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O - u'\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE - u'\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER - u'\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES - u'\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE - u'\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U - u'\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF - u'\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA - u'\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE - u'\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE - u'\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA - u'\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA - u'\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN - u'\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU - u'\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E - u'\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU - u'\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA - u'\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A - u'\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE - u'\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE - u'\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE - u'\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE - u'\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE - u'\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE - u'\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE - u'\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I - u'\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I - u'\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA - u'\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL - u'\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM - u'\u043d' # 0xED -> CYRILLIC SMALL LETTER EN - u'\u043e' # 0xEE -> CYRILLIC SMALL LETTER O - u'\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE - u'\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER - u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES - u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE - u'\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U - u'\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF - u'\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA - u'\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE - u'\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE - u'\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA - u'\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA - u'\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN - u'\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU - u'\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u044d' # 0xFD -> CYRILLIC SMALL LETTER E - u'\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU - u'\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE + u'\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u20ac' # 0x88 -> EURO SIGN + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE + u'\u040c' # 0x8D -> CYRILLIC CAPITAL LETTER KJE + u'\u040b' # 0x8E -> CYRILLIC CAPITAL LETTER TSHE + u'\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE + u'\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE + u'\u045c' # 0x9D -> CYRILLIC SMALL LETTER KJE + u'\u045b' # 0x9E -> CYRILLIC SMALL LETTER TSHE + u'\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U + u'\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U + u'\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u0490' # 0xA5 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u0404' # 0xAA -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\u0407' # 0xAF -> CYRILLIC CAPITAL LETTER YI + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0491' # 0xB4 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + u'\u2116' # 0xB9 -> NUMERO SIGN + u'\u0454' # 0xBA -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE + u'\u0405' # 0xBD -> CYRILLIC CAPITAL LETTER DZE + u'\u0455' # 0xBE -> CYRILLIC SMALL LETTER DZE + u'\u0457' # 0xBF -> CYRILLIC SMALL LETTER YI + u'\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + u'\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + u'\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + u'\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + u'\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + u'\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + u'\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + u'\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + u'\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + u'\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + u'\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + u'\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + u'\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + u'\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + u'\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + u'\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + u'\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + u'\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + u'\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + u'\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + u'\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + u'\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + u'\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + u'\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + u'\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + u'\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + u'\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + u'\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + u'\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + u'\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + u'\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + u'\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + u'\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + u'\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + u'\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + u'\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x0401: 0xA8, # CYRILLIC CAPITAL LETTER IO - 0x0402: 0x80, # CYRILLIC CAPITAL LETTER DJE - 0x0403: 0x81, # CYRILLIC CAPITAL LETTER GJE - 0x0404: 0xAA, # CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x0405: 0xBD, # CYRILLIC CAPITAL LETTER DZE - 0x0406: 0xB2, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0407: 0xAF, # CYRILLIC CAPITAL LETTER YI - 0x0408: 0xA3, # CYRILLIC CAPITAL LETTER JE - 0x0409: 0x8A, # CYRILLIC CAPITAL LETTER LJE - 0x040A: 0x8C, # CYRILLIC CAPITAL LETTER NJE - 0x040B: 0x8E, # CYRILLIC CAPITAL LETTER TSHE - 0x040C: 0x8D, # CYRILLIC CAPITAL LETTER KJE - 0x040E: 0xA1, # CYRILLIC CAPITAL LETTER SHORT U - 0x040F: 0x8F, # CYRILLIC CAPITAL LETTER DZHE - 0x0410: 0xC0, # CYRILLIC CAPITAL LETTER A - 0x0411: 0xC1, # CYRILLIC CAPITAL LETTER BE - 0x0412: 0xC2, # CYRILLIC CAPITAL LETTER VE - 0x0413: 0xC3, # CYRILLIC CAPITAL LETTER GHE - 0x0414: 0xC4, # CYRILLIC CAPITAL LETTER DE - 0x0415: 0xC5, # CYRILLIC CAPITAL LETTER IE - 0x0416: 0xC6, # CYRILLIC CAPITAL LETTER ZHE - 0x0417: 0xC7, # CYRILLIC CAPITAL LETTER ZE - 0x0418: 0xC8, # CYRILLIC CAPITAL LETTER I - 0x0419: 0xC9, # CYRILLIC CAPITAL LETTER SHORT I - 0x041A: 0xCA, # CYRILLIC CAPITAL LETTER KA - 0x041B: 0xCB, # CYRILLIC CAPITAL LETTER EL - 0x041C: 0xCC, # CYRILLIC CAPITAL LETTER EM - 0x041D: 0xCD, # CYRILLIC CAPITAL LETTER EN - 0x041E: 0xCE, # CYRILLIC CAPITAL LETTER O - 0x041F: 0xCF, # CYRILLIC CAPITAL LETTER PE - 0x0420: 0xD0, # CYRILLIC CAPITAL LETTER ER - 0x0421: 0xD1, # CYRILLIC CAPITAL LETTER ES - 0x0422: 0xD2, # CYRILLIC CAPITAL LETTER TE - 0x0423: 0xD3, # CYRILLIC CAPITAL LETTER U - 0x0424: 0xD4, # CYRILLIC CAPITAL LETTER EF - 0x0425: 0xD5, # CYRILLIC CAPITAL LETTER HA - 0x0426: 0xD6, # CYRILLIC CAPITAL LETTER TSE - 0x0427: 0xD7, # CYRILLIC CAPITAL LETTER CHE - 0x0428: 0xD8, # CYRILLIC CAPITAL LETTER SHA - 0x0429: 0xD9, # CYRILLIC CAPITAL LETTER SHCHA - 0x042A: 0xDA, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x042B: 0xDB, # CYRILLIC CAPITAL LETTER YERU - 0x042C: 0xDC, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x042D: 0xDD, # CYRILLIC CAPITAL LETTER E - 0x042E: 0xDE, # CYRILLIC CAPITAL LETTER YU - 0x042F: 0xDF, # CYRILLIC CAPITAL LETTER YA - 0x0430: 0xE0, # CYRILLIC SMALL LETTER A - 0x0431: 0xE1, # CYRILLIC SMALL LETTER BE - 0x0432: 0xE2, # CYRILLIC SMALL LETTER VE - 0x0433: 0xE3, # CYRILLIC SMALL LETTER GHE - 0x0434: 0xE4, # CYRILLIC SMALL LETTER DE - 0x0435: 0xE5, # CYRILLIC SMALL LETTER IE - 0x0436: 0xE6, # CYRILLIC SMALL LETTER ZHE - 0x0437: 0xE7, # CYRILLIC SMALL LETTER ZE - 0x0438: 0xE8, # CYRILLIC SMALL LETTER I - 0x0439: 0xE9, # CYRILLIC SMALL LETTER SHORT I - 0x043A: 0xEA, # CYRILLIC SMALL LETTER KA - 0x043B: 0xEB, # CYRILLIC SMALL LETTER EL - 0x043C: 0xEC, # CYRILLIC SMALL LETTER EM - 0x043D: 0xED, # CYRILLIC SMALL LETTER EN - 0x043E: 0xEE, # CYRILLIC SMALL LETTER O - 0x043F: 0xEF, # CYRILLIC SMALL LETTER PE - 0x0440: 0xF0, # CYRILLIC SMALL LETTER ER - 0x0441: 0xF1, # CYRILLIC SMALL LETTER ES - 0x0442: 0xF2, # CYRILLIC SMALL LETTER TE - 0x0443: 0xF3, # CYRILLIC SMALL LETTER U - 0x0444: 0xF4, # CYRILLIC SMALL LETTER EF - 0x0445: 0xF5, # CYRILLIC SMALL LETTER HA - 0x0446: 0xF6, # CYRILLIC SMALL LETTER TSE - 0x0447: 0xF7, # CYRILLIC SMALL LETTER CHE - 0x0448: 0xF8, # CYRILLIC SMALL LETTER SHA - 0x0449: 0xF9, # CYRILLIC SMALL LETTER SHCHA - 0x044A: 0xFA, # CYRILLIC SMALL LETTER HARD SIGN - 0x044B: 0xFB, # CYRILLIC SMALL LETTER YERU - 0x044C: 0xFC, # CYRILLIC SMALL LETTER SOFT SIGN - 0x044D: 0xFD, # CYRILLIC SMALL LETTER E - 0x044E: 0xFE, # CYRILLIC SMALL LETTER YU - 0x044F: 0xFF, # CYRILLIC SMALL LETTER YA - 0x0451: 0xB8, # CYRILLIC SMALL LETTER IO - 0x0452: 0x90, # CYRILLIC SMALL LETTER DJE - 0x0453: 0x83, # CYRILLIC SMALL LETTER GJE - 0x0454: 0xBA, # CYRILLIC SMALL LETTER UKRAINIAN IE - 0x0455: 0xBE, # CYRILLIC SMALL LETTER DZE - 0x0456: 0xB3, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0457: 0xBF, # CYRILLIC SMALL LETTER YI - 0x0458: 0xBC, # CYRILLIC SMALL LETTER JE - 0x0459: 0x9A, # CYRILLIC SMALL LETTER LJE - 0x045A: 0x9C, # CYRILLIC SMALL LETTER NJE - 0x045B: 0x9E, # CYRILLIC SMALL LETTER TSHE - 0x045C: 0x9D, # CYRILLIC SMALL LETTER KJE - 0x045E: 0xA2, # CYRILLIC SMALL LETTER SHORT U - 0x045F: 0x9F, # CYRILLIC SMALL LETTER DZHE - 0x0490: 0xA5, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN - 0x0491: 0xB4, # CYRILLIC SMALL LETTER GHE WITH UPTURN - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AC: 0x88, # EURO SIGN - 0x2116: 0xB9, # NUMERO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x0401: 0xA8, # CYRILLIC CAPITAL LETTER IO + 0x0402: 0x80, # CYRILLIC CAPITAL LETTER DJE + 0x0403: 0x81, # CYRILLIC CAPITAL LETTER GJE + 0x0404: 0xAA, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0405: 0xBD, # CYRILLIC CAPITAL LETTER DZE + 0x0406: 0xB2, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0xAF, # CYRILLIC CAPITAL LETTER YI + 0x0408: 0xA3, # CYRILLIC CAPITAL LETTER JE + 0x0409: 0x8A, # CYRILLIC CAPITAL LETTER LJE + 0x040A: 0x8C, # CYRILLIC CAPITAL LETTER NJE + 0x040B: 0x8E, # CYRILLIC CAPITAL LETTER TSHE + 0x040C: 0x8D, # CYRILLIC CAPITAL LETTER KJE + 0x040E: 0xA1, # CYRILLIC CAPITAL LETTER SHORT U + 0x040F: 0x8F, # CYRILLIC CAPITAL LETTER DZHE + 0x0410: 0xC0, # CYRILLIC CAPITAL LETTER A + 0x0411: 0xC1, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0xC2, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0xC3, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0xC4, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0xC5, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0xC6, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0xC7, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0xC8, # CYRILLIC CAPITAL LETTER I + 0x0419: 0xC9, # CYRILLIC CAPITAL LETTER SHORT I + 0x041A: 0xCA, # CYRILLIC CAPITAL LETTER KA + 0x041B: 0xCB, # CYRILLIC CAPITAL LETTER EL + 0x041C: 0xCC, # CYRILLIC CAPITAL LETTER EM + 0x041D: 0xCD, # CYRILLIC CAPITAL LETTER EN + 0x041E: 0xCE, # CYRILLIC CAPITAL LETTER O + 0x041F: 0xCF, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0xD0, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0xD1, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0xD2, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0xD3, # CYRILLIC CAPITAL LETTER U + 0x0424: 0xD4, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0xD5, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0xD6, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0xD7, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0xD8, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0xD9, # CYRILLIC CAPITAL LETTER SHCHA + 0x042A: 0xDA, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042B: 0xDB, # CYRILLIC CAPITAL LETTER YERU + 0x042C: 0xDC, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042D: 0xDD, # CYRILLIC CAPITAL LETTER E + 0x042E: 0xDE, # CYRILLIC CAPITAL LETTER YU + 0x042F: 0xDF, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0xE0, # CYRILLIC SMALL LETTER A + 0x0431: 0xE1, # CYRILLIC SMALL LETTER BE + 0x0432: 0xE2, # CYRILLIC SMALL LETTER VE + 0x0433: 0xE3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0xE4, # CYRILLIC SMALL LETTER DE + 0x0435: 0xE5, # CYRILLIC SMALL LETTER IE + 0x0436: 0xE6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0xE7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0xE8, # CYRILLIC SMALL LETTER I + 0x0439: 0xE9, # CYRILLIC SMALL LETTER SHORT I + 0x043A: 0xEA, # CYRILLIC SMALL LETTER KA + 0x043B: 0xEB, # CYRILLIC SMALL LETTER EL + 0x043C: 0xEC, # CYRILLIC SMALL LETTER EM + 0x043D: 0xED, # CYRILLIC SMALL LETTER EN + 0x043E: 0xEE, # CYRILLIC SMALL LETTER O + 0x043F: 0xEF, # CYRILLIC SMALL LETTER PE + 0x0440: 0xF0, # CYRILLIC SMALL LETTER ER + 0x0441: 0xF1, # CYRILLIC SMALL LETTER ES + 0x0442: 0xF2, # CYRILLIC SMALL LETTER TE + 0x0443: 0xF3, # CYRILLIC SMALL LETTER U + 0x0444: 0xF4, # CYRILLIC SMALL LETTER EF + 0x0445: 0xF5, # CYRILLIC SMALL LETTER HA + 0x0446: 0xF6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0xF7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0xF8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0xF9, # CYRILLIC SMALL LETTER SHCHA + 0x044A: 0xFA, # CYRILLIC SMALL LETTER HARD SIGN + 0x044B: 0xFB, # CYRILLIC SMALL LETTER YERU + 0x044C: 0xFC, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044D: 0xFD, # CYRILLIC SMALL LETTER E + 0x044E: 0xFE, # CYRILLIC SMALL LETTER YU + 0x044F: 0xFF, # CYRILLIC SMALL LETTER YA + 0x0451: 0xB8, # CYRILLIC SMALL LETTER IO + 0x0452: 0x90, # CYRILLIC SMALL LETTER DJE + 0x0453: 0x83, # CYRILLIC SMALL LETTER GJE + 0x0454: 0xBA, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0455: 0xBE, # CYRILLIC SMALL LETTER DZE + 0x0456: 0xB3, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0xBF, # CYRILLIC SMALL LETTER YI + 0x0458: 0xBC, # CYRILLIC SMALL LETTER JE + 0x0459: 0x9A, # CYRILLIC SMALL LETTER LJE + 0x045A: 0x9C, # CYRILLIC SMALL LETTER NJE + 0x045B: 0x9E, # CYRILLIC SMALL LETTER TSHE + 0x045C: 0x9D, # CYRILLIC SMALL LETTER KJE + 0x045E: 0xA2, # CYRILLIC SMALL LETTER SHORT U + 0x045F: 0x9F, # CYRILLIC SMALL LETTER DZHE + 0x0490: 0xA5, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x0491: 0xB4, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AC: 0x88, # EURO SIGN + 0x2116: 0xB9, # NUMERO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1252.py ============================================================================== --- python/trunk/Lib/encodings/cp1252.py (original) +++ python/trunk/Lib/encodings/cp1252.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,517 +32,516 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\ufffe' # 0x81 -> UNDEFINED - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE - u'\ufffe' # 0x8D -> UNDEFINED - u'\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON - u'\ufffe' # 0x8F -> UNDEFINED - u'\ufffe' # 0x90 -> UNDEFINED - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\u02dc' # 0x98 -> SMALL TILDE - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE - u'\ufffe' # 0x9D -> UNDEFINED - u'\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON - u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\xbf' # 0xBF -> INVERTED QUESTION MARK - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH - u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH - u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE - u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE - u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN - u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + u'\ufffe' # 0x8D -> UNDEFINED + u'\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u02dc' # 0x98 -> SMALL TILDE + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + u'\ufffe' # 0x9D -> UNDEFINED + u'\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xBF, # INVERTED QUESTION MARK - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D0: 0xD0, # LATIN CAPITAL LETTER ETH - 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F0: 0xF0, # LATIN SMALL LETTER ETH - 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FE: 0xFE, # LATIN SMALL LETTER THORN - 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0152: 0x8C, # LATIN CAPITAL LIGATURE OE - 0x0153: 0x9C, # LATIN SMALL LIGATURE OE - 0x0160: 0x8A, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0x9A, # LATIN SMALL LETTER S WITH CARON - 0x0178: 0x9F, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x017D: 0x8E, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0x9E, # LATIN SMALL LETTER Z WITH CARON - 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK - 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02DC: 0x98, # SMALL TILDE - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AC: 0x80, # EURO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xBF, # INVERTED QUESTION MARK + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0: 0xD0, # LATIN CAPITAL LETTER ETH + 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0: 0xF0, # LATIN SMALL LETTER ETH + 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FE: 0xFE, # LATIN SMALL LETTER THORN + 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0152: 0x8C, # LATIN CAPITAL LIGATURE OE + 0x0153: 0x9C, # LATIN SMALL LIGATURE OE + 0x0160: 0x8A, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x9A, # LATIN SMALL LETTER S WITH CARON + 0x0178: 0x9F, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x017D: 0x8E, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0x9E, # LATIN SMALL LETTER Z WITH CARON + 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK + 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02DC: 0x98, # SMALL TILDE + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AC: 0x80, # EURO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1253.py ============================================================================== --- python/trunk/Lib/encodings/cp1253.py (original) +++ python/trunk/Lib/encodings/cp1253.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,505 +32,504 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\ufffe' # 0x81 -> UNDEFINED - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\ufffe' # 0x88 -> UNDEFINED - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\ufffe' # 0x8A -> UNDEFINED - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\ufffe' # 0x8C -> UNDEFINED - u'\ufffe' # 0x8D -> UNDEFINED - u'\ufffe' # 0x8E -> UNDEFINED - u'\ufffe' # 0x8F -> UNDEFINED - u'\ufffe' # 0x90 -> UNDEFINED - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\ufffe' # 0x98 -> UNDEFINED - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\ufffe' # 0x9A -> UNDEFINED - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\ufffe' # 0x9C -> UNDEFINED - u'\ufffe' # 0x9D -> UNDEFINED - u'\ufffe' # 0x9E -> UNDEFINED - u'\ufffe' # 0x9F -> UNDEFINED - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0385' # 0xA1 -> GREEK DIALYTIKA TONOS - u'\u0386' # 0xA2 -> GREEK CAPITAL LETTER ALPHA WITH TONOS - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\ufffe' # 0xAA -> UNDEFINED - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\u2015' # 0xAF -> HORIZONTAL BAR - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\u0384' # 0xB4 -> GREEK TONOS - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS - u'\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS - u'\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS - u'\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS - u'\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - u'\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA - u'\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA - u'\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA - u'\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA - u'\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON - u'\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA - u'\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA - u'\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA - u'\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA - u'\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA - u'\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA - u'\u039c' # 0xCC -> GREEK CAPITAL LETTER MU - u'\u039d' # 0xCD -> GREEK CAPITAL LETTER NU - u'\u039e' # 0xCE -> GREEK CAPITAL LETTER XI - u'\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON - u'\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI - u'\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO - u'\ufffe' # 0xD2 -> UNDEFINED - u'\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA - u'\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU - u'\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON - u'\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI - u'\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI - u'\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI - u'\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA - u'\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - u'\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - u'\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS - u'\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS - u'\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS - u'\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS - u'\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA - u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA - u'\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA - u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA - u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON - u'\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA - u'\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA - u'\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA - u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA - u'\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA - u'\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA - u'\u03bc' # 0xEC -> GREEK SMALL LETTER MU - u'\u03bd' # 0xED -> GREEK SMALL LETTER NU - u'\u03be' # 0xEE -> GREEK SMALL LETTER XI - u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON - u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI - u'\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO - u'\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA - u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA - u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU - u'\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON - u'\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI - u'\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI - u'\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI - u'\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA - u'\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA - u'\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA - u'\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS - u'\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS - u'\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS - u'\ufffe' # 0xFF -> UNDEFINED + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\ufffe' # 0x88 -> UNDEFINED + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\ufffe' # 0x8A -> UNDEFINED + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x8C -> UNDEFINED + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\ufffe' # 0x9A -> UNDEFINED + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x9C -> UNDEFINED + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\ufffe' # 0x9F -> UNDEFINED + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0385' # 0xA1 -> GREEK DIALYTIKA TONOS + u'\u0386' # 0xA2 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\ufffe' # 0xAA -> UNDEFINED + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\u2015' # 0xAF -> HORIZONTAL BAR + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\u0384' # 0xB4 -> GREEK TONOS + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + u'\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + u'\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + u'\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + u'\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + u'\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + u'\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + u'\ufffe' # 0xD2 -> UNDEFINED + u'\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + u'\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + u'\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + u'\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + u'\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + u'\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + u'\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0xEC -> GREEK SMALL LETTER MU + u'\u03bd' # 0xED -> GREEK SMALL LETTER NU + u'\u03be' # 0xEE -> GREEK SMALL LETTER XI + u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + u'\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + u'\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + u'\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + u'\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + u'\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + u'\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + u'\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\ufffe' # 0xFF -> UNDEFINED ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK - 0x0384: 0xB4, # GREEK TONOS - 0x0385: 0xA1, # GREEK DIALYTIKA TONOS - 0x0386: 0xA2, # GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x0388: 0xB8, # GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x0389: 0xB9, # GREEK CAPITAL LETTER ETA WITH TONOS - 0x038A: 0xBA, # GREEK CAPITAL LETTER IOTA WITH TONOS - 0x038C: 0xBC, # GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x038E: 0xBE, # GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x038F: 0xBF, # GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x0390: 0xC0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - 0x0391: 0xC1, # GREEK CAPITAL LETTER ALPHA - 0x0392: 0xC2, # GREEK CAPITAL LETTER BETA - 0x0393: 0xC3, # GREEK CAPITAL LETTER GAMMA - 0x0394: 0xC4, # GREEK CAPITAL LETTER DELTA - 0x0395: 0xC5, # GREEK CAPITAL LETTER EPSILON - 0x0396: 0xC6, # GREEK CAPITAL LETTER ZETA - 0x0397: 0xC7, # GREEK CAPITAL LETTER ETA - 0x0398: 0xC8, # GREEK CAPITAL LETTER THETA - 0x0399: 0xC9, # GREEK CAPITAL LETTER IOTA - 0x039A: 0xCA, # GREEK CAPITAL LETTER KAPPA - 0x039B: 0xCB, # GREEK CAPITAL LETTER LAMDA - 0x039C: 0xCC, # GREEK CAPITAL LETTER MU - 0x039D: 0xCD, # GREEK CAPITAL LETTER NU - 0x039E: 0xCE, # GREEK CAPITAL LETTER XI - 0x039F: 0xCF, # GREEK CAPITAL LETTER OMICRON - 0x03A0: 0xD0, # GREEK CAPITAL LETTER PI - 0x03A1: 0xD1, # GREEK CAPITAL LETTER RHO - 0x03A3: 0xD3, # GREEK CAPITAL LETTER SIGMA - 0x03A4: 0xD4, # GREEK CAPITAL LETTER TAU - 0x03A5: 0xD5, # GREEK CAPITAL LETTER UPSILON - 0x03A6: 0xD6, # GREEK CAPITAL LETTER PHI - 0x03A7: 0xD7, # GREEK CAPITAL LETTER CHI - 0x03A8: 0xD8, # GREEK CAPITAL LETTER PSI - 0x03A9: 0xD9, # GREEK CAPITAL LETTER OMEGA - 0x03AA: 0xDA, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x03AB: 0xDB, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x03AC: 0xDC, # GREEK SMALL LETTER ALPHA WITH TONOS - 0x03AD: 0xDD, # GREEK SMALL LETTER EPSILON WITH TONOS - 0x03AE: 0xDE, # GREEK SMALL LETTER ETA WITH TONOS - 0x03AF: 0xDF, # GREEK SMALL LETTER IOTA WITH TONOS - 0x03B0: 0xE0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - 0x03B1: 0xE1, # GREEK SMALL LETTER ALPHA - 0x03B2: 0xE2, # GREEK SMALL LETTER BETA - 0x03B3: 0xE3, # GREEK SMALL LETTER GAMMA - 0x03B4: 0xE4, # GREEK SMALL LETTER DELTA - 0x03B5: 0xE5, # GREEK SMALL LETTER EPSILON - 0x03B6: 0xE6, # GREEK SMALL LETTER ZETA - 0x03B7: 0xE7, # GREEK SMALL LETTER ETA - 0x03B8: 0xE8, # GREEK SMALL LETTER THETA - 0x03B9: 0xE9, # GREEK SMALL LETTER IOTA - 0x03BA: 0xEA, # GREEK SMALL LETTER KAPPA - 0x03BB: 0xEB, # GREEK SMALL LETTER LAMDA - 0x03BC: 0xEC, # GREEK SMALL LETTER MU - 0x03BD: 0xED, # GREEK SMALL LETTER NU - 0x03BE: 0xEE, # GREEK SMALL LETTER XI - 0x03BF: 0xEF, # GREEK SMALL LETTER OMICRON - 0x03C0: 0xF0, # GREEK SMALL LETTER PI - 0x03C1: 0xF1, # GREEK SMALL LETTER RHO - 0x03C2: 0xF2, # GREEK SMALL LETTER FINAL SIGMA - 0x03C3: 0xF3, # GREEK SMALL LETTER SIGMA - 0x03C4: 0xF4, # GREEK SMALL LETTER TAU - 0x03C5: 0xF5, # GREEK SMALL LETTER UPSILON - 0x03C6: 0xF6, # GREEK SMALL LETTER PHI - 0x03C7: 0xF7, # GREEK SMALL LETTER CHI - 0x03C8: 0xF8, # GREEK SMALL LETTER PSI - 0x03C9: 0xF9, # GREEK SMALL LETTER OMEGA - 0x03CA: 0xFA, # GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x03CB: 0xFB, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x03CC: 0xFC, # GREEK SMALL LETTER OMICRON WITH TONOS - 0x03CD: 0xFD, # GREEK SMALL LETTER UPSILON WITH TONOS - 0x03CE: 0xFE, # GREEK SMALL LETTER OMEGA WITH TONOS - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2015: 0xAF, # HORIZONTAL BAR - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AC: 0x80, # EURO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK + 0x0384: 0xB4, # GREEK TONOS + 0x0385: 0xA1, # GREEK DIALYTIKA TONOS + 0x0386: 0xA2, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0xB8, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0xB9, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038A: 0xBA, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038C: 0xBC, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038E: 0xBE, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038F: 0xBF, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0xC0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0xC1, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0xC2, # GREEK CAPITAL LETTER BETA + 0x0393: 0xC3, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0xC4, # GREEK CAPITAL LETTER DELTA + 0x0395: 0xC5, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0xC6, # GREEK CAPITAL LETTER ZETA + 0x0397: 0xC7, # GREEK CAPITAL LETTER ETA + 0x0398: 0xC8, # GREEK CAPITAL LETTER THETA + 0x0399: 0xC9, # GREEK CAPITAL LETTER IOTA + 0x039A: 0xCA, # GREEK CAPITAL LETTER KAPPA + 0x039B: 0xCB, # GREEK CAPITAL LETTER LAMDA + 0x039C: 0xCC, # GREEK CAPITAL LETTER MU + 0x039D: 0xCD, # GREEK CAPITAL LETTER NU + 0x039E: 0xCE, # GREEK CAPITAL LETTER XI + 0x039F: 0xCF, # GREEK CAPITAL LETTER OMICRON + 0x03A0: 0xD0, # GREEK CAPITAL LETTER PI + 0x03A1: 0xD1, # GREEK CAPITAL LETTER RHO + 0x03A3: 0xD3, # GREEK CAPITAL LETTER SIGMA + 0x03A4: 0xD4, # GREEK CAPITAL LETTER TAU + 0x03A5: 0xD5, # GREEK CAPITAL LETTER UPSILON + 0x03A6: 0xD6, # GREEK CAPITAL LETTER PHI + 0x03A7: 0xD7, # GREEK CAPITAL LETTER CHI + 0x03A8: 0xD8, # GREEK CAPITAL LETTER PSI + 0x03A9: 0xD9, # GREEK CAPITAL LETTER OMEGA + 0x03AA: 0xDA, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03AB: 0xDB, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03AC: 0xDC, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03AD: 0xDD, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03AE: 0xDE, # GREEK SMALL LETTER ETA WITH TONOS + 0x03AF: 0xDF, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03B0: 0xE0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03B1: 0xE1, # GREEK SMALL LETTER ALPHA + 0x03B2: 0xE2, # GREEK SMALL LETTER BETA + 0x03B3: 0xE3, # GREEK SMALL LETTER GAMMA + 0x03B4: 0xE4, # GREEK SMALL LETTER DELTA + 0x03B5: 0xE5, # GREEK SMALL LETTER EPSILON + 0x03B6: 0xE6, # GREEK SMALL LETTER ZETA + 0x03B7: 0xE7, # GREEK SMALL LETTER ETA + 0x03B8: 0xE8, # GREEK SMALL LETTER THETA + 0x03B9: 0xE9, # GREEK SMALL LETTER IOTA + 0x03BA: 0xEA, # GREEK SMALL LETTER KAPPA + 0x03BB: 0xEB, # GREEK SMALL LETTER LAMDA + 0x03BC: 0xEC, # GREEK SMALL LETTER MU + 0x03BD: 0xED, # GREEK SMALL LETTER NU + 0x03BE: 0xEE, # GREEK SMALL LETTER XI + 0x03BF: 0xEF, # GREEK SMALL LETTER OMICRON + 0x03C0: 0xF0, # GREEK SMALL LETTER PI + 0x03C1: 0xF1, # GREEK SMALL LETTER RHO + 0x03C2: 0xF2, # GREEK SMALL LETTER FINAL SIGMA + 0x03C3: 0xF3, # GREEK SMALL LETTER SIGMA + 0x03C4: 0xF4, # GREEK SMALL LETTER TAU + 0x03C5: 0xF5, # GREEK SMALL LETTER UPSILON + 0x03C6: 0xF6, # GREEK SMALL LETTER PHI + 0x03C7: 0xF7, # GREEK SMALL LETTER CHI + 0x03C8: 0xF8, # GREEK SMALL LETTER PSI + 0x03C9: 0xF9, # GREEK SMALL LETTER OMEGA + 0x03CA: 0xFA, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03CB: 0xFB, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03CC: 0xFC, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03CD: 0xFD, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03CE: 0xFE, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2015: 0xAF, # HORIZONTAL BAR + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AC: 0x80, # EURO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1254.py ============================================================================== --- python/trunk/Lib/encodings/cp1254.py (original) +++ python/trunk/Lib/encodings/cp1254.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,515 +32,514 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\ufffe' # 0x81 -> UNDEFINED - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE - u'\ufffe' # 0x8D -> UNDEFINED - u'\ufffe' # 0x8E -> UNDEFINED - u'\ufffe' # 0x8F -> UNDEFINED - u'\ufffe' # 0x90 -> UNDEFINED - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\u02dc' # 0x98 -> SMALL TILDE - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE - u'\ufffe' # 0x9D -> UNDEFINED - u'\ufffe' # 0x9E -> UNDEFINED - u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\xbf' # 0xBF -> INVERTED QUESTION MARK - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE - u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE - u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE - u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE - u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I - u'\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA - u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u02dc' # 0x98 -> SMALL TILDE + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + u'\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xBF, # INVERTED QUESTION MARK - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x011E: 0xD0, # LATIN CAPITAL LETTER G WITH BREVE - 0x011F: 0xF0, # LATIN SMALL LETTER G WITH BREVE - 0x0130: 0xDD, # LATIN CAPITAL LETTER I WITH DOT ABOVE - 0x0131: 0xFD, # LATIN SMALL LETTER DOTLESS I - 0x0152: 0x8C, # LATIN CAPITAL LIGATURE OE - 0x0153: 0x9C, # LATIN SMALL LIGATURE OE - 0x015E: 0xDE, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015F: 0xFE, # LATIN SMALL LETTER S WITH CEDILLA - 0x0160: 0x8A, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0x9A, # LATIN SMALL LETTER S WITH CARON - 0x0178: 0x9F, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK - 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02DC: 0x98, # SMALL TILDE - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AC: 0x80, # EURO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xBF, # INVERTED QUESTION MARK + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011E: 0xD0, # LATIN CAPITAL LETTER G WITH BREVE + 0x011F: 0xF0, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0xDD, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0xFD, # LATIN SMALL LETTER DOTLESS I + 0x0152: 0x8C, # LATIN CAPITAL LIGATURE OE + 0x0153: 0x9C, # LATIN SMALL LIGATURE OE + 0x015E: 0xDE, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015F: 0xFE, # LATIN SMALL LETTER S WITH CEDILLA + 0x0160: 0x8A, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x9A, # LATIN SMALL LETTER S WITH CARON + 0x0178: 0x9F, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK + 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02DC: 0x98, # SMALL TILDE + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AC: 0x80, # EURO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1255.py ============================================================================== --- python/trunk/Lib/encodings/cp1255.py (original) +++ python/trunk/Lib/encodings/cp1255.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,499 +32,498 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\ufffe' # 0x81 -> UNDEFINED - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\ufffe' # 0x8A -> UNDEFINED - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\ufffe' # 0x8C -> UNDEFINED - u'\ufffe' # 0x8D -> UNDEFINED - u'\ufffe' # 0x8E -> UNDEFINED - u'\ufffe' # 0x8F -> UNDEFINED - u'\ufffe' # 0x90 -> UNDEFINED - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\u02dc' # 0x98 -> SMALL TILDE - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\ufffe' # 0x9A -> UNDEFINED - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\ufffe' # 0x9C -> UNDEFINED - u'\ufffe' # 0x9D -> UNDEFINED - u'\ufffe' # 0x9E -> UNDEFINED - u'\ufffe' # 0x9F -> UNDEFINED - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\u20aa' # 0xA4 -> NEW SHEQEL SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\xd7' # 0xAA -> MULTIPLICATION SIGN - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\xf7' # 0xBA -> DIVISION SIGN - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\xbf' # 0xBF -> INVERTED QUESTION MARK - u'\u05b0' # 0xC0 -> HEBREW POINT SHEVA - u'\u05b1' # 0xC1 -> HEBREW POINT HATAF SEGOL - u'\u05b2' # 0xC2 -> HEBREW POINT HATAF PATAH - u'\u05b3' # 0xC3 -> HEBREW POINT HATAF QAMATS - u'\u05b4' # 0xC4 -> HEBREW POINT HIRIQ - u'\u05b5' # 0xC5 -> HEBREW POINT TSERE - u'\u05b6' # 0xC6 -> HEBREW POINT SEGOL - u'\u05b7' # 0xC7 -> HEBREW POINT PATAH - u'\u05b8' # 0xC8 -> HEBREW POINT QAMATS - u'\u05b9' # 0xC9 -> HEBREW POINT HOLAM - u'\ufffe' # 0xCA -> UNDEFINED - u'\u05bb' # 0xCB -> HEBREW POINT QUBUTS - u'\u05bc' # 0xCC -> HEBREW POINT DAGESH OR MAPIQ - u'\u05bd' # 0xCD -> HEBREW POINT METEG - u'\u05be' # 0xCE -> HEBREW PUNCTUATION MAQAF - u'\u05bf' # 0xCF -> HEBREW POINT RAFE - u'\u05c0' # 0xD0 -> HEBREW PUNCTUATION PASEQ - u'\u05c1' # 0xD1 -> HEBREW POINT SHIN DOT - u'\u05c2' # 0xD2 -> HEBREW POINT SIN DOT - u'\u05c3' # 0xD3 -> HEBREW PUNCTUATION SOF PASUQ - u'\u05f0' # 0xD4 -> HEBREW LIGATURE YIDDISH DOUBLE VAV - u'\u05f1' # 0xD5 -> HEBREW LIGATURE YIDDISH VAV YOD - u'\u05f2' # 0xD6 -> HEBREW LIGATURE YIDDISH DOUBLE YOD - u'\u05f3' # 0xD7 -> HEBREW PUNCTUATION GERESH - u'\u05f4' # 0xD8 -> HEBREW PUNCTUATION GERSHAYIM - u'\ufffe' # 0xD9 -> UNDEFINED - u'\ufffe' # 0xDA -> UNDEFINED - u'\ufffe' # 0xDB -> UNDEFINED - u'\ufffe' # 0xDC -> UNDEFINED - u'\ufffe' # 0xDD -> UNDEFINED - u'\ufffe' # 0xDE -> UNDEFINED - u'\ufffe' # 0xDF -> UNDEFINED - u'\u05d0' # 0xE0 -> HEBREW LETTER ALEF - u'\u05d1' # 0xE1 -> HEBREW LETTER BET - u'\u05d2' # 0xE2 -> HEBREW LETTER GIMEL - u'\u05d3' # 0xE3 -> HEBREW LETTER DALET - u'\u05d4' # 0xE4 -> HEBREW LETTER HE - u'\u05d5' # 0xE5 -> HEBREW LETTER VAV - u'\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN - u'\u05d7' # 0xE7 -> HEBREW LETTER HET - u'\u05d8' # 0xE8 -> HEBREW LETTER TET - u'\u05d9' # 0xE9 -> HEBREW LETTER YOD - u'\u05da' # 0xEA -> HEBREW LETTER FINAL KAF - u'\u05db' # 0xEB -> HEBREW LETTER KAF - u'\u05dc' # 0xEC -> HEBREW LETTER LAMED - u'\u05dd' # 0xED -> HEBREW LETTER FINAL MEM - u'\u05de' # 0xEE -> HEBREW LETTER MEM - u'\u05df' # 0xEF -> HEBREW LETTER FINAL NUN - u'\u05e0' # 0xF0 -> HEBREW LETTER NUN - u'\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH - u'\u05e2' # 0xF2 -> HEBREW LETTER AYIN - u'\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE - u'\u05e4' # 0xF4 -> HEBREW LETTER PE - u'\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI - u'\u05e6' # 0xF6 -> HEBREW LETTER TSADI - u'\u05e7' # 0xF7 -> HEBREW LETTER QOF - u'\u05e8' # 0xF8 -> HEBREW LETTER RESH - u'\u05e9' # 0xF9 -> HEBREW LETTER SHIN - u'\u05ea' # 0xFA -> HEBREW LETTER TAV - u'\ufffe' # 0xFB -> UNDEFINED - u'\ufffe' # 0xFC -> UNDEFINED - u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK - u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK - u'\ufffe' # 0xFF -> UNDEFINED + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\ufffe' # 0x8A -> UNDEFINED + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x8C -> UNDEFINED + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u02dc' # 0x98 -> SMALL TILDE + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\ufffe' # 0x9A -> UNDEFINED + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x9C -> UNDEFINED + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\ufffe' # 0x9F -> UNDEFINED + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\u20aa' # 0xA4 -> NEW SHEQEL SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xd7' # 0xAA -> MULTIPLICATION SIGN + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xf7' # 0xBA -> DIVISION SIGN + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\u05b0' # 0xC0 -> HEBREW POINT SHEVA + u'\u05b1' # 0xC1 -> HEBREW POINT HATAF SEGOL + u'\u05b2' # 0xC2 -> HEBREW POINT HATAF PATAH + u'\u05b3' # 0xC3 -> HEBREW POINT HATAF QAMATS + u'\u05b4' # 0xC4 -> HEBREW POINT HIRIQ + u'\u05b5' # 0xC5 -> HEBREW POINT TSERE + u'\u05b6' # 0xC6 -> HEBREW POINT SEGOL + u'\u05b7' # 0xC7 -> HEBREW POINT PATAH + u'\u05b8' # 0xC8 -> HEBREW POINT QAMATS + u'\u05b9' # 0xC9 -> HEBREW POINT HOLAM + u'\ufffe' # 0xCA -> UNDEFINED + u'\u05bb' # 0xCB -> HEBREW POINT QUBUTS + u'\u05bc' # 0xCC -> HEBREW POINT DAGESH OR MAPIQ + u'\u05bd' # 0xCD -> HEBREW POINT METEG + u'\u05be' # 0xCE -> HEBREW PUNCTUATION MAQAF + u'\u05bf' # 0xCF -> HEBREW POINT RAFE + u'\u05c0' # 0xD0 -> HEBREW PUNCTUATION PASEQ + u'\u05c1' # 0xD1 -> HEBREW POINT SHIN DOT + u'\u05c2' # 0xD2 -> HEBREW POINT SIN DOT + u'\u05c3' # 0xD3 -> HEBREW PUNCTUATION SOF PASUQ + u'\u05f0' # 0xD4 -> HEBREW LIGATURE YIDDISH DOUBLE VAV + u'\u05f1' # 0xD5 -> HEBREW LIGATURE YIDDISH VAV YOD + u'\u05f2' # 0xD6 -> HEBREW LIGATURE YIDDISH DOUBLE YOD + u'\u05f3' # 0xD7 -> HEBREW PUNCTUATION GERESH + u'\u05f4' # 0xD8 -> HEBREW PUNCTUATION GERSHAYIM + u'\ufffe' # 0xD9 -> UNDEFINED + u'\ufffe' # 0xDA -> UNDEFINED + u'\ufffe' # 0xDB -> UNDEFINED + u'\ufffe' # 0xDC -> UNDEFINED + u'\ufffe' # 0xDD -> UNDEFINED + u'\ufffe' # 0xDE -> UNDEFINED + u'\ufffe' # 0xDF -> UNDEFINED + u'\u05d0' # 0xE0 -> HEBREW LETTER ALEF + u'\u05d1' # 0xE1 -> HEBREW LETTER BET + u'\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + u'\u05d3' # 0xE3 -> HEBREW LETTER DALET + u'\u05d4' # 0xE4 -> HEBREW LETTER HE + u'\u05d5' # 0xE5 -> HEBREW LETTER VAV + u'\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0xE7 -> HEBREW LETTER HET + u'\u05d8' # 0xE8 -> HEBREW LETTER TET + u'\u05d9' # 0xE9 -> HEBREW LETTER YOD + u'\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + u'\u05db' # 0xEB -> HEBREW LETTER KAF + u'\u05dc' # 0xEC -> HEBREW LETTER LAMED + u'\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + u'\u05de' # 0xEE -> HEBREW LETTER MEM + u'\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0xF0 -> HEBREW LETTER NUN + u'\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + u'\u05e2' # 0xF2 -> HEBREW LETTER AYIN + u'\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0xF4 -> HEBREW LETTER PE + u'\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0xF6 -> HEBREW LETTER TSADI + u'\u05e7' # 0xF7 -> HEBREW LETTER QOF + u'\u05e8' # 0xF8 -> HEBREW LETTER RESH + u'\u05e9' # 0xF9 -> HEBREW LETTER SHIN + u'\u05ea' # 0xFA -> HEBREW LETTER TAV + u'\ufffe' # 0xFB -> UNDEFINED + u'\ufffe' # 0xFC -> UNDEFINED + u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + u'\ufffe' # 0xFF -> UNDEFINED ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xBF, # INVERTED QUESTION MARK - 0x00D7: 0xAA, # MULTIPLICATION SIGN - 0x00F7: 0xBA, # DIVISION SIGN - 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK - 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02DC: 0x98, # SMALL TILDE - 0x05B0: 0xC0, # HEBREW POINT SHEVA - 0x05B1: 0xC1, # HEBREW POINT HATAF SEGOL - 0x05B2: 0xC2, # HEBREW POINT HATAF PATAH - 0x05B3: 0xC3, # HEBREW POINT HATAF QAMATS - 0x05B4: 0xC4, # HEBREW POINT HIRIQ - 0x05B5: 0xC5, # HEBREW POINT TSERE - 0x05B6: 0xC6, # HEBREW POINT SEGOL - 0x05B7: 0xC7, # HEBREW POINT PATAH - 0x05B8: 0xC8, # HEBREW POINT QAMATS - 0x05B9: 0xC9, # HEBREW POINT HOLAM - 0x05BB: 0xCB, # HEBREW POINT QUBUTS - 0x05BC: 0xCC, # HEBREW POINT DAGESH OR MAPIQ - 0x05BD: 0xCD, # HEBREW POINT METEG - 0x05BE: 0xCE, # HEBREW PUNCTUATION MAQAF - 0x05BF: 0xCF, # HEBREW POINT RAFE - 0x05C0: 0xD0, # HEBREW PUNCTUATION PASEQ - 0x05C1: 0xD1, # HEBREW POINT SHIN DOT - 0x05C2: 0xD2, # HEBREW POINT SIN DOT - 0x05C3: 0xD3, # HEBREW PUNCTUATION SOF PASUQ - 0x05D0: 0xE0, # HEBREW LETTER ALEF - 0x05D1: 0xE1, # HEBREW LETTER BET - 0x05D2: 0xE2, # HEBREW LETTER GIMEL - 0x05D3: 0xE3, # HEBREW LETTER DALET - 0x05D4: 0xE4, # HEBREW LETTER HE - 0x05D5: 0xE5, # HEBREW LETTER VAV - 0x05D6: 0xE6, # HEBREW LETTER ZAYIN - 0x05D7: 0xE7, # HEBREW LETTER HET - 0x05D8: 0xE8, # HEBREW LETTER TET - 0x05D9: 0xE9, # HEBREW LETTER YOD - 0x05DA: 0xEA, # HEBREW LETTER FINAL KAF - 0x05DB: 0xEB, # HEBREW LETTER KAF - 0x05DC: 0xEC, # HEBREW LETTER LAMED - 0x05DD: 0xED, # HEBREW LETTER FINAL MEM - 0x05DE: 0xEE, # HEBREW LETTER MEM - 0x05DF: 0xEF, # HEBREW LETTER FINAL NUN - 0x05E0: 0xF0, # HEBREW LETTER NUN - 0x05E1: 0xF1, # HEBREW LETTER SAMEKH - 0x05E2: 0xF2, # HEBREW LETTER AYIN - 0x05E3: 0xF3, # HEBREW LETTER FINAL PE - 0x05E4: 0xF4, # HEBREW LETTER PE - 0x05E5: 0xF5, # HEBREW LETTER FINAL TSADI - 0x05E6: 0xF6, # HEBREW LETTER TSADI - 0x05E7: 0xF7, # HEBREW LETTER QOF - 0x05E8: 0xF8, # HEBREW LETTER RESH - 0x05E9: 0xF9, # HEBREW LETTER SHIN - 0x05EA: 0xFA, # HEBREW LETTER TAV - 0x05F0: 0xD4, # HEBREW LIGATURE YIDDISH DOUBLE VAV - 0x05F1: 0xD5, # HEBREW LIGATURE YIDDISH VAV YOD - 0x05F2: 0xD6, # HEBREW LIGATURE YIDDISH DOUBLE YOD - 0x05F3: 0xD7, # HEBREW PUNCTUATION GERESH - 0x05F4: 0xD8, # HEBREW PUNCTUATION GERSHAYIM - 0x200E: 0xFD, # LEFT-TO-RIGHT MARK - 0x200F: 0xFE, # RIGHT-TO-LEFT MARK - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AA: 0xA4, # NEW SHEQEL SIGN - 0x20AC: 0x80, # EURO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xBF, # INVERTED QUESTION MARK + 0x00D7: 0xAA, # MULTIPLICATION SIGN + 0x00F7: 0xBA, # DIVISION SIGN + 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK + 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02DC: 0x98, # SMALL TILDE + 0x05B0: 0xC0, # HEBREW POINT SHEVA + 0x05B1: 0xC1, # HEBREW POINT HATAF SEGOL + 0x05B2: 0xC2, # HEBREW POINT HATAF PATAH + 0x05B3: 0xC3, # HEBREW POINT HATAF QAMATS + 0x05B4: 0xC4, # HEBREW POINT HIRIQ + 0x05B5: 0xC5, # HEBREW POINT TSERE + 0x05B6: 0xC6, # HEBREW POINT SEGOL + 0x05B7: 0xC7, # HEBREW POINT PATAH + 0x05B8: 0xC8, # HEBREW POINT QAMATS + 0x05B9: 0xC9, # HEBREW POINT HOLAM + 0x05BB: 0xCB, # HEBREW POINT QUBUTS + 0x05BC: 0xCC, # HEBREW POINT DAGESH OR MAPIQ + 0x05BD: 0xCD, # HEBREW POINT METEG + 0x05BE: 0xCE, # HEBREW PUNCTUATION MAQAF + 0x05BF: 0xCF, # HEBREW POINT RAFE + 0x05C0: 0xD0, # HEBREW PUNCTUATION PASEQ + 0x05C1: 0xD1, # HEBREW POINT SHIN DOT + 0x05C2: 0xD2, # HEBREW POINT SIN DOT + 0x05C3: 0xD3, # HEBREW PUNCTUATION SOF PASUQ + 0x05D0: 0xE0, # HEBREW LETTER ALEF + 0x05D1: 0xE1, # HEBREW LETTER BET + 0x05D2: 0xE2, # HEBREW LETTER GIMEL + 0x05D3: 0xE3, # HEBREW LETTER DALET + 0x05D4: 0xE4, # HEBREW LETTER HE + 0x05D5: 0xE5, # HEBREW LETTER VAV + 0x05D6: 0xE6, # HEBREW LETTER ZAYIN + 0x05D7: 0xE7, # HEBREW LETTER HET + 0x05D8: 0xE8, # HEBREW LETTER TET + 0x05D9: 0xE9, # HEBREW LETTER YOD + 0x05DA: 0xEA, # HEBREW LETTER FINAL KAF + 0x05DB: 0xEB, # HEBREW LETTER KAF + 0x05DC: 0xEC, # HEBREW LETTER LAMED + 0x05DD: 0xED, # HEBREW LETTER FINAL MEM + 0x05DE: 0xEE, # HEBREW LETTER MEM + 0x05DF: 0xEF, # HEBREW LETTER FINAL NUN + 0x05E0: 0xF0, # HEBREW LETTER NUN + 0x05E1: 0xF1, # HEBREW LETTER SAMEKH + 0x05E2: 0xF2, # HEBREW LETTER AYIN + 0x05E3: 0xF3, # HEBREW LETTER FINAL PE + 0x05E4: 0xF4, # HEBREW LETTER PE + 0x05E5: 0xF5, # HEBREW LETTER FINAL TSADI + 0x05E6: 0xF6, # HEBREW LETTER TSADI + 0x05E7: 0xF7, # HEBREW LETTER QOF + 0x05E8: 0xF8, # HEBREW LETTER RESH + 0x05E9: 0xF9, # HEBREW LETTER SHIN + 0x05EA: 0xFA, # HEBREW LETTER TAV + 0x05F0: 0xD4, # HEBREW LIGATURE YIDDISH DOUBLE VAV + 0x05F1: 0xD5, # HEBREW LIGATURE YIDDISH VAV YOD + 0x05F2: 0xD6, # HEBREW LIGATURE YIDDISH DOUBLE YOD + 0x05F3: 0xD7, # HEBREW PUNCTUATION GERESH + 0x05F4: 0xD8, # HEBREW PUNCTUATION GERSHAYIM + 0x200E: 0xFD, # LEFT-TO-RIGHT MARK + 0x200F: 0xFE, # RIGHT-TO-LEFT MARK + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AA: 0xA4, # NEW SHEQEL SIGN + 0x20AC: 0x80, # EURO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1256.py ============================================================================== --- python/trunk/Lib/encodings/cp1256.py (original) +++ python/trunk/Lib/encodings/cp1256.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\u067e' # 0x81 -> ARABIC LETTER PEH - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\u0679' # 0x8A -> ARABIC LETTER TTEH - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE - u'\u0686' # 0x8D -> ARABIC LETTER TCHEH - u'\u0698' # 0x8E -> ARABIC LETTER JEH - u'\u0688' # 0x8F -> ARABIC LETTER DDAL - u'\u06af' # 0x90 -> ARABIC LETTER GAF - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\u06a9' # 0x98 -> ARABIC LETTER KEHEH - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\u0691' # 0x9A -> ARABIC LETTER RREH - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE - u'\u200c' # 0x9D -> ZERO WIDTH NON-JOINER - u'\u200d' # 0x9E -> ZERO WIDTH JOINER - u'\u06ba' # 0x9F -> ARABIC LETTER NOON GHUNNA - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u060c' # 0xA1 -> ARABIC COMMA - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u06be' # 0xAA -> ARABIC LETTER HEH DOACHASHMEE - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\u061b' # 0xBA -> ARABIC SEMICOLON - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\u061f' # 0xBF -> ARABIC QUESTION MARK - u'\u06c1' # 0xC0 -> ARABIC LETTER HEH GOAL - u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA - u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE - u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE - u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE - u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW - u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE - u'\u0627' # 0xC7 -> ARABIC LETTER ALEF - u'\u0628' # 0xC8 -> ARABIC LETTER BEH - u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA - u'\u062a' # 0xCA -> ARABIC LETTER TEH - u'\u062b' # 0xCB -> ARABIC LETTER THEH - u'\u062c' # 0xCC -> ARABIC LETTER JEEM - u'\u062d' # 0xCD -> ARABIC LETTER HAH - u'\u062e' # 0xCE -> ARABIC LETTER KHAH - u'\u062f' # 0xCF -> ARABIC LETTER DAL - u'\u0630' # 0xD0 -> ARABIC LETTER THAL - u'\u0631' # 0xD1 -> ARABIC LETTER REH - u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN - u'\u0633' # 0xD3 -> ARABIC LETTER SEEN - u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN - u'\u0635' # 0xD5 -> ARABIC LETTER SAD - u'\u0636' # 0xD6 -> ARABIC LETTER DAD - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\u0637' # 0xD8 -> ARABIC LETTER TAH - u'\u0638' # 0xD9 -> ARABIC LETTER ZAH - u'\u0639' # 0xDA -> ARABIC LETTER AIN - u'\u063a' # 0xDB -> ARABIC LETTER GHAIN - u'\u0640' # 0xDC -> ARABIC TATWEEL - u'\u0641' # 0xDD -> ARABIC LETTER FEH - u'\u0642' # 0xDE -> ARABIC LETTER QAF - u'\u0643' # 0xDF -> ARABIC LETTER KAF - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\u0644' # 0xE1 -> ARABIC LETTER LAM - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\u0645' # 0xE3 -> ARABIC LETTER MEEM - u'\u0646' # 0xE4 -> ARABIC LETTER NOON - u'\u0647' # 0xE5 -> ARABIC LETTER HEH - u'\u0648' # 0xE6 -> ARABIC LETTER WAW - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\u0649' # 0xEC -> ARABIC LETTER ALEF MAKSURA - u'\u064a' # 0xED -> ARABIC LETTER YEH - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\u064b' # 0xF0 -> ARABIC FATHATAN - u'\u064c' # 0xF1 -> ARABIC DAMMATAN - u'\u064d' # 0xF2 -> ARABIC KASRATAN - u'\u064e' # 0xF3 -> ARABIC FATHA - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\u064f' # 0xF5 -> ARABIC DAMMA - u'\u0650' # 0xF6 -> ARABIC KASRA - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\u0651' # 0xF8 -> ARABIC SHADDA - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\u0652' # 0xFA -> ARABIC SUKUN - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK - u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK - u'\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\u067e' # 0x81 -> ARABIC LETTER PEH + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\u0679' # 0x8A -> ARABIC LETTER TTEH + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + u'\u0686' # 0x8D -> ARABIC LETTER TCHEH + u'\u0698' # 0x8E -> ARABIC LETTER JEH + u'\u0688' # 0x8F -> ARABIC LETTER DDAL + u'\u06af' # 0x90 -> ARABIC LETTER GAF + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u06a9' # 0x98 -> ARABIC LETTER KEHEH + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\u0691' # 0x9A -> ARABIC LETTER RREH + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + u'\u200c' # 0x9D -> ZERO WIDTH NON-JOINER + u'\u200d' # 0x9E -> ZERO WIDTH JOINER + u'\u06ba' # 0x9F -> ARABIC LETTER NOON GHUNNA + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u060c' # 0xA1 -> ARABIC COMMA + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u06be' # 0xAA -> ARABIC LETTER HEH DOACHASHMEE + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\u061b' # 0xBA -> ARABIC SEMICOLON + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\u061f' # 0xBF -> ARABIC QUESTION MARK + u'\u06c1' # 0xC0 -> ARABIC LETTER HEH GOAL + u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA + u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0xC7 -> ARABIC LETTER ALEF + u'\u0628' # 0xC8 -> ARABIC LETTER BEH + u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0xCA -> ARABIC LETTER TEH + u'\u062b' # 0xCB -> ARABIC LETTER THEH + u'\u062c' # 0xCC -> ARABIC LETTER JEEM + u'\u062d' # 0xCD -> ARABIC LETTER HAH + u'\u062e' # 0xCE -> ARABIC LETTER KHAH + u'\u062f' # 0xCF -> ARABIC LETTER DAL + u'\u0630' # 0xD0 -> ARABIC LETTER THAL + u'\u0631' # 0xD1 -> ARABIC LETTER REH + u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN + u'\u0633' # 0xD3 -> ARABIC LETTER SEEN + u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN + u'\u0635' # 0xD5 -> ARABIC LETTER SAD + u'\u0636' # 0xD6 -> ARABIC LETTER DAD + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0637' # 0xD8 -> ARABIC LETTER TAH + u'\u0638' # 0xD9 -> ARABIC LETTER ZAH + u'\u0639' # 0xDA -> ARABIC LETTER AIN + u'\u063a' # 0xDB -> ARABIC LETTER GHAIN + u'\u0640' # 0xDC -> ARABIC TATWEEL + u'\u0641' # 0xDD -> ARABIC LETTER FEH + u'\u0642' # 0xDE -> ARABIC LETTER QAF + u'\u0643' # 0xDF -> ARABIC LETTER KAF + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\u0644' # 0xE1 -> ARABIC LETTER LAM + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0645' # 0xE3 -> ARABIC LETTER MEEM + u'\u0646' # 0xE4 -> ARABIC LETTER NOON + u'\u0647' # 0xE5 -> ARABIC LETTER HEH + u'\u0648' # 0xE6 -> ARABIC LETTER WAW + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0649' # 0xEC -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0xED -> ARABIC LETTER YEH + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u064b' # 0xF0 -> ARABIC FATHATAN + u'\u064c' # 0xF1 -> ARABIC DAMMATAN + u'\u064d' # 0xF2 -> ARABIC KASRATAN + u'\u064e' # 0xF3 -> ARABIC FATHA + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u064f' # 0xF5 -> ARABIC DAMMA + u'\u0650' # 0xF6 -> ARABIC KASRA + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0651' # 0xF8 -> ARABIC SHADDA + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\u0652' # 0xFA -> ARABIC SUKUN + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + u'\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0152: 0x8C, # LATIN CAPITAL LIGATURE OE - 0x0153: 0x9C, # LATIN SMALL LIGATURE OE - 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK - 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x060C: 0xA1, # ARABIC COMMA - 0x061B: 0xBA, # ARABIC SEMICOLON - 0x061F: 0xBF, # ARABIC QUESTION MARK - 0x0621: 0xC1, # ARABIC LETTER HAMZA - 0x0622: 0xC2, # ARABIC LETTER ALEF WITH MADDA ABOVE - 0x0623: 0xC3, # ARABIC LETTER ALEF WITH HAMZA ABOVE - 0x0624: 0xC4, # ARABIC LETTER WAW WITH HAMZA ABOVE - 0x0625: 0xC5, # ARABIC LETTER ALEF WITH HAMZA BELOW - 0x0626: 0xC6, # ARABIC LETTER YEH WITH HAMZA ABOVE - 0x0627: 0xC7, # ARABIC LETTER ALEF - 0x0628: 0xC8, # ARABIC LETTER BEH - 0x0629: 0xC9, # ARABIC LETTER TEH MARBUTA - 0x062A: 0xCA, # ARABIC LETTER TEH - 0x062B: 0xCB, # ARABIC LETTER THEH - 0x062C: 0xCC, # ARABIC LETTER JEEM - 0x062D: 0xCD, # ARABIC LETTER HAH - 0x062E: 0xCE, # ARABIC LETTER KHAH - 0x062F: 0xCF, # ARABIC LETTER DAL - 0x0630: 0xD0, # ARABIC LETTER THAL - 0x0631: 0xD1, # ARABIC LETTER REH - 0x0632: 0xD2, # ARABIC LETTER ZAIN - 0x0633: 0xD3, # ARABIC LETTER SEEN - 0x0634: 0xD4, # ARABIC LETTER SHEEN - 0x0635: 0xD5, # ARABIC LETTER SAD - 0x0636: 0xD6, # ARABIC LETTER DAD - 0x0637: 0xD8, # ARABIC LETTER TAH - 0x0638: 0xD9, # ARABIC LETTER ZAH - 0x0639: 0xDA, # ARABIC LETTER AIN - 0x063A: 0xDB, # ARABIC LETTER GHAIN - 0x0640: 0xDC, # ARABIC TATWEEL - 0x0641: 0xDD, # ARABIC LETTER FEH - 0x0642: 0xDE, # ARABIC LETTER QAF - 0x0643: 0xDF, # ARABIC LETTER KAF - 0x0644: 0xE1, # ARABIC LETTER LAM - 0x0645: 0xE3, # ARABIC LETTER MEEM - 0x0646: 0xE4, # ARABIC LETTER NOON - 0x0647: 0xE5, # ARABIC LETTER HEH - 0x0648: 0xE6, # ARABIC LETTER WAW - 0x0649: 0xEC, # ARABIC LETTER ALEF MAKSURA - 0x064A: 0xED, # ARABIC LETTER YEH - 0x064B: 0xF0, # ARABIC FATHATAN - 0x064C: 0xF1, # ARABIC DAMMATAN - 0x064D: 0xF2, # ARABIC KASRATAN - 0x064E: 0xF3, # ARABIC FATHA - 0x064F: 0xF5, # ARABIC DAMMA - 0x0650: 0xF6, # ARABIC KASRA - 0x0651: 0xF8, # ARABIC SHADDA - 0x0652: 0xFA, # ARABIC SUKUN - 0x0679: 0x8A, # ARABIC LETTER TTEH - 0x067E: 0x81, # ARABIC LETTER PEH - 0x0686: 0x8D, # ARABIC LETTER TCHEH - 0x0688: 0x8F, # ARABIC LETTER DDAL - 0x0691: 0x9A, # ARABIC LETTER RREH - 0x0698: 0x8E, # ARABIC LETTER JEH - 0x06A9: 0x98, # ARABIC LETTER KEHEH - 0x06AF: 0x90, # ARABIC LETTER GAF - 0x06BA: 0x9F, # ARABIC LETTER NOON GHUNNA - 0x06BE: 0xAA, # ARABIC LETTER HEH DOACHASHMEE - 0x06C1: 0xC0, # ARABIC LETTER HEH GOAL - 0x06D2: 0xFF, # ARABIC LETTER YEH BARREE - 0x200C: 0x9D, # ZERO WIDTH NON-JOINER - 0x200D: 0x9E, # ZERO WIDTH JOINER - 0x200E: 0xFD, # LEFT-TO-RIGHT MARK - 0x200F: 0xFE, # RIGHT-TO-LEFT MARK - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AC: 0x80, # EURO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0152: 0x8C, # LATIN CAPITAL LIGATURE OE + 0x0153: 0x9C, # LATIN SMALL LIGATURE OE + 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK + 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x060C: 0xA1, # ARABIC COMMA + 0x061B: 0xBA, # ARABIC SEMICOLON + 0x061F: 0xBF, # ARABIC QUESTION MARK + 0x0621: 0xC1, # ARABIC LETTER HAMZA + 0x0622: 0xC2, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x0623: 0xC3, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x0624: 0xC4, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x0625: 0xC5, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x0626: 0xC6, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x0627: 0xC7, # ARABIC LETTER ALEF + 0x0628: 0xC8, # ARABIC LETTER BEH + 0x0629: 0xC9, # ARABIC LETTER TEH MARBUTA + 0x062A: 0xCA, # ARABIC LETTER TEH + 0x062B: 0xCB, # ARABIC LETTER THEH + 0x062C: 0xCC, # ARABIC LETTER JEEM + 0x062D: 0xCD, # ARABIC LETTER HAH + 0x062E: 0xCE, # ARABIC LETTER KHAH + 0x062F: 0xCF, # ARABIC LETTER DAL + 0x0630: 0xD0, # ARABIC LETTER THAL + 0x0631: 0xD1, # ARABIC LETTER REH + 0x0632: 0xD2, # ARABIC LETTER ZAIN + 0x0633: 0xD3, # ARABIC LETTER SEEN + 0x0634: 0xD4, # ARABIC LETTER SHEEN + 0x0635: 0xD5, # ARABIC LETTER SAD + 0x0636: 0xD6, # ARABIC LETTER DAD + 0x0637: 0xD8, # ARABIC LETTER TAH + 0x0638: 0xD9, # ARABIC LETTER ZAH + 0x0639: 0xDA, # ARABIC LETTER AIN + 0x063A: 0xDB, # ARABIC LETTER GHAIN + 0x0640: 0xDC, # ARABIC TATWEEL + 0x0641: 0xDD, # ARABIC LETTER FEH + 0x0642: 0xDE, # ARABIC LETTER QAF + 0x0643: 0xDF, # ARABIC LETTER KAF + 0x0644: 0xE1, # ARABIC LETTER LAM + 0x0645: 0xE3, # ARABIC LETTER MEEM + 0x0646: 0xE4, # ARABIC LETTER NOON + 0x0647: 0xE5, # ARABIC LETTER HEH + 0x0648: 0xE6, # ARABIC LETTER WAW + 0x0649: 0xEC, # ARABIC LETTER ALEF MAKSURA + 0x064A: 0xED, # ARABIC LETTER YEH + 0x064B: 0xF0, # ARABIC FATHATAN + 0x064C: 0xF1, # ARABIC DAMMATAN + 0x064D: 0xF2, # ARABIC KASRATAN + 0x064E: 0xF3, # ARABIC FATHA + 0x064F: 0xF5, # ARABIC DAMMA + 0x0650: 0xF6, # ARABIC KASRA + 0x0651: 0xF8, # ARABIC SHADDA + 0x0652: 0xFA, # ARABIC SUKUN + 0x0679: 0x8A, # ARABIC LETTER TTEH + 0x067E: 0x81, # ARABIC LETTER PEH + 0x0686: 0x8D, # ARABIC LETTER TCHEH + 0x0688: 0x8F, # ARABIC LETTER DDAL + 0x0691: 0x9A, # ARABIC LETTER RREH + 0x0698: 0x8E, # ARABIC LETTER JEH + 0x06A9: 0x98, # ARABIC LETTER KEHEH + 0x06AF: 0x90, # ARABIC LETTER GAF + 0x06BA: 0x9F, # ARABIC LETTER NOON GHUNNA + 0x06BE: 0xAA, # ARABIC LETTER HEH DOACHASHMEE + 0x06C1: 0xC0, # ARABIC LETTER HEH GOAL + 0x06D2: 0xFF, # ARABIC LETTER YEH BARREE + 0x200C: 0x9D, # ZERO WIDTH NON-JOINER + 0x200D: 0x9E, # ZERO WIDTH JOINER + 0x200E: 0xFD, # LEFT-TO-RIGHT MARK + 0x200F: 0xFE, # RIGHT-TO-LEFT MARK + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AC: 0x80, # EURO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1257.py ============================================================================== --- python/trunk/Lib/encodings/cp1257.py (original) +++ python/trunk/Lib/encodings/cp1257.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,510 +32,509 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\ufffe' # 0x81 -> UNDEFINED - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\ufffe' # 0x83 -> UNDEFINED - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\ufffe' # 0x88 -> UNDEFINED - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\ufffe' # 0x8A -> UNDEFINED - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\ufffe' # 0x8C -> UNDEFINED - u'\xa8' # 0x8D -> DIAERESIS - u'\u02c7' # 0x8E -> CARON - u'\xb8' # 0x8F -> CEDILLA - u'\ufffe' # 0x90 -> UNDEFINED - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\ufffe' # 0x98 -> UNDEFINED - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\ufffe' # 0x9A -> UNDEFINED - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\ufffe' # 0x9C -> UNDEFINED - u'\xaf' # 0x9D -> MACRON - u'\u02db' # 0x9E -> OGONEK - u'\ufffe' # 0x9F -> UNDEFINED - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\ufffe' # 0xA1 -> UNDEFINED - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\ufffe' # 0xA5 -> UNDEFINED - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xc6' # 0xAF -> LATIN CAPITAL LETTER AE - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\xe6' # 0xBF -> LATIN SMALL LETTER AE - u'\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK - u'\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON - u'\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK - u'\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON - u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE - u'\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA - u'\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA - u'\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON - u'\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA - u'\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON - u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK - u'\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE - u'\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE - u'\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK - u'\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK - u'\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON - u'\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK - u'\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON - u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE - u'\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE - u'\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA - u'\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA - u'\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON - u'\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA - u'\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON - u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE - u'\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK - u'\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE - u'\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE - u'\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON - u'\u02d9' # 0xFF -> DOT ABOVE + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\ufffe' # 0x83 -> UNDEFINED + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\ufffe' # 0x88 -> UNDEFINED + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\ufffe' # 0x8A -> UNDEFINED + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x8C -> UNDEFINED + u'\xa8' # 0x8D -> DIAERESIS + u'\u02c7' # 0x8E -> CARON + u'\xb8' # 0x8F -> CEDILLA + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\ufffe' # 0x9A -> UNDEFINED + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\ufffe' # 0x9C -> UNDEFINED + u'\xaf' # 0x9D -> MACRON + u'\u02db' # 0x9E -> OGONEK + u'\ufffe' # 0x9F -> UNDEFINED + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\ufffe' # 0xA1 -> UNDEFINED + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\ufffe' # 0xA5 -> UNDEFINED + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xe6' # 0xBF -> LATIN SMALL LETTER AE + u'\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + u'\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + u'\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + u'\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + u'\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + u'\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + u'\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + u'\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + u'\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + u'\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + u'\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + u'\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + u'\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + u'\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + u'\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + u'\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + u'\u02d9' # 0xFF -> DOT ABOVE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0x8D, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0x9D, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0x8F, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xAF, # LATIN CAPITAL LETTER AE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xA8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xBF, # LATIN SMALL LETTER AE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xB8, # LATIN SMALL LETTER O WITH STROKE - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0100: 0xC2, # LATIN CAPITAL LETTER A WITH MACRON - 0x0101: 0xE2, # LATIN SMALL LETTER A WITH MACRON - 0x0104: 0xC0, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0xE0, # LATIN SMALL LETTER A WITH OGONEK - 0x0106: 0xC3, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0xE3, # LATIN SMALL LETTER C WITH ACUTE - 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON - 0x0112: 0xC7, # LATIN CAPITAL LETTER E WITH MACRON - 0x0113: 0xE7, # LATIN SMALL LETTER E WITH MACRON - 0x0116: 0xCB, # LATIN CAPITAL LETTER E WITH DOT ABOVE - 0x0117: 0xEB, # LATIN SMALL LETTER E WITH DOT ABOVE - 0x0118: 0xC6, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0xE6, # LATIN SMALL LETTER E WITH OGONEK - 0x0122: 0xCC, # LATIN CAPITAL LETTER G WITH CEDILLA - 0x0123: 0xEC, # LATIN SMALL LETTER G WITH CEDILLA - 0x012A: 0xCE, # LATIN CAPITAL LETTER I WITH MACRON - 0x012B: 0xEE, # LATIN SMALL LETTER I WITH MACRON - 0x012E: 0xC1, # LATIN CAPITAL LETTER I WITH OGONEK - 0x012F: 0xE1, # LATIN SMALL LETTER I WITH OGONEK - 0x0136: 0xCD, # LATIN CAPITAL LETTER K WITH CEDILLA - 0x0137: 0xED, # LATIN SMALL LETTER K WITH CEDILLA - 0x013B: 0xCF, # LATIN CAPITAL LETTER L WITH CEDILLA - 0x013C: 0xEF, # LATIN SMALL LETTER L WITH CEDILLA - 0x0141: 0xD9, # LATIN CAPITAL LETTER L WITH STROKE - 0x0142: 0xF9, # LATIN SMALL LETTER L WITH STROKE - 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE - 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE - 0x0145: 0xD2, # LATIN CAPITAL LETTER N WITH CEDILLA - 0x0146: 0xF2, # LATIN SMALL LETTER N WITH CEDILLA - 0x014C: 0xD4, # LATIN CAPITAL LETTER O WITH MACRON - 0x014D: 0xF4, # LATIN SMALL LETTER O WITH MACRON - 0x0156: 0xAA, # LATIN CAPITAL LETTER R WITH CEDILLA - 0x0157: 0xBA, # LATIN SMALL LETTER R WITH CEDILLA - 0x015A: 0xDA, # LATIN CAPITAL LETTER S WITH ACUTE - 0x015B: 0xFA, # LATIN SMALL LETTER S WITH ACUTE - 0x0160: 0xD0, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xF0, # LATIN SMALL LETTER S WITH CARON - 0x016A: 0xDB, # LATIN CAPITAL LETTER U WITH MACRON - 0x016B: 0xFB, # LATIN SMALL LETTER U WITH MACRON - 0x0172: 0xD8, # LATIN CAPITAL LETTER U WITH OGONEK - 0x0173: 0xF8, # LATIN SMALL LETTER U WITH OGONEK - 0x0179: 0xCA, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x017A: 0xEA, # LATIN SMALL LETTER Z WITH ACUTE - 0x017B: 0xDD, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017C: 0xFD, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x017D: 0xDE, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xFE, # LATIN SMALL LETTER Z WITH CARON - 0x02C7: 0x8E, # CARON - 0x02D9: 0xFF, # DOT ABOVE - 0x02DB: 0x9E, # OGONEK - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AC: 0x80, # EURO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0x8D, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0x9D, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0x8F, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xAF, # LATIN CAPITAL LETTER AE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xA8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xBF, # LATIN SMALL LETTER AE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xB8, # LATIN SMALL LETTER O WITH STROKE + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0100: 0xC2, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0xE2, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0xC0, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0xE0, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0xC3, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0xE3, # LATIN SMALL LETTER C WITH ACUTE + 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON + 0x0112: 0xC7, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0xE7, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0xCB, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0xEB, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0xC6, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0xE6, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0xCC, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0xEC, # LATIN SMALL LETTER G WITH CEDILLA + 0x012A: 0xCE, # LATIN CAPITAL LETTER I WITH MACRON + 0x012B: 0xEE, # LATIN SMALL LETTER I WITH MACRON + 0x012E: 0xC1, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012F: 0xE1, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0xCD, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0xED, # LATIN SMALL LETTER K WITH CEDILLA + 0x013B: 0xCF, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013C: 0xEF, # LATIN SMALL LETTER L WITH CEDILLA + 0x0141: 0xD9, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0xF9, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE + 0x0145: 0xD2, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0xF2, # LATIN SMALL LETTER N WITH CEDILLA + 0x014C: 0xD4, # LATIN CAPITAL LETTER O WITH MACRON + 0x014D: 0xF4, # LATIN SMALL LETTER O WITH MACRON + 0x0156: 0xAA, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0xBA, # LATIN SMALL LETTER R WITH CEDILLA + 0x015A: 0xDA, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015B: 0xFA, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0xD0, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xF0, # LATIN SMALL LETTER S WITH CARON + 0x016A: 0xDB, # LATIN CAPITAL LETTER U WITH MACRON + 0x016B: 0xFB, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0xD8, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0xF8, # LATIN SMALL LETTER U WITH OGONEK + 0x0179: 0xCA, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017A: 0xEA, # LATIN SMALL LETTER Z WITH ACUTE + 0x017B: 0xDD, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017C: 0xFD, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017D: 0xDE, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xFE, # LATIN SMALL LETTER Z WITH CARON + 0x02C7: 0x8E, # CARON + 0x02D9: 0xFF, # DOT ABOVE + 0x02DB: 0x9E, # OGONEK + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AC: 0x80, # EURO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1258.py ============================================================================== --- python/trunk/Lib/encodings/cp1258.py (original) +++ python/trunk/Lib/encodings/cp1258.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,513 +32,512 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\ufffe' # 0x81 -> UNDEFINED - u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK - u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK - u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\u2020' # 0x86 -> DAGGER - u'\u2021' # 0x87 -> DOUBLE DAGGER - u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u2030' # 0x89 -> PER MILLE SIGN - u'\ufffe' # 0x8A -> UNDEFINED - u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE - u'\ufffe' # 0x8D -> UNDEFINED - u'\ufffe' # 0x8E -> UNDEFINED - u'\ufffe' # 0x8F -> UNDEFINED - u'\ufffe' # 0x90 -> UNDEFINED - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\u02dc' # 0x98 -> SMALL TILDE - u'\u2122' # 0x99 -> TRADE MARK SIGN - u'\ufffe' # 0x9A -> UNDEFINED - u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE - u'\ufffe' # 0x9D -> UNDEFINED - u'\ufffe' # 0x9E -> UNDEFINED - u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\xbf' # 0xBF -> INVERTED QUESTION MARK - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\u0300' # 0xCC -> COMBINING GRAVE ACCENT - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE - u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE - u'\u0309' # 0xD2 -> COMBINING HOOK ABOVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u01a0' # 0xD5 -> LATIN CAPITAL LETTER O WITH HORN - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u01af' # 0xDD -> LATIN CAPITAL LETTER U WITH HORN - u'\u0303' # 0xDE -> COMBINING TILDE - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\u0301' # 0xEC -> COMBINING ACUTE ACCENT - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE - u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE - u'\u0323' # 0xF2 -> COMBINING DOT BELOW - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\u01a1' # 0xF5 -> LATIN SMALL LETTER O WITH HORN - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u01b0' # 0xFD -> LATIN SMALL LETTER U WITH HORN - u'\u20ab' # 0xFE -> DONG SIGN - u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + u'\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + u'\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\u2020' # 0x86 -> DAGGER + u'\u2021' # 0x87 -> DOUBLE DAGGER + u'\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u2030' # 0x89 -> PER MILLE SIGN + u'\ufffe' # 0x8A -> UNDEFINED + u'\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\u02dc' # 0x98 -> SMALL TILDE + u'\u2122' # 0x99 -> TRADE MARK SIGN + u'\ufffe' # 0x9A -> UNDEFINED + u'\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u0300' # 0xCC -> COMBINING GRAVE ACCENT + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\u0309' # 0xD2 -> COMBINING HOOK ABOVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u01a0' # 0xD5 -> LATIN CAPITAL LETTER O WITH HORN + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u01af' # 0xDD -> LATIN CAPITAL LETTER U WITH HORN + u'\u0303' # 0xDE -> COMBINING TILDE + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0301' # 0xEC -> COMBINING ACUTE ACCENT + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\u0323' # 0xF2 -> COMBINING DOT BELOW + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u01a1' # 0xF5 -> LATIN SMALL LETTER O WITH HORN + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u01b0' # 0xFD -> LATIN SMALL LETTER U WITH HORN + u'\u20ab' # 0xFE -> DONG SIGN + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xBF, # INVERTED QUESTION MARK - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0102: 0xC3, # LATIN CAPITAL LETTER A WITH BREVE - 0x0103: 0xE3, # LATIN SMALL LETTER A WITH BREVE - 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE - 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE - 0x0152: 0x8C, # LATIN CAPITAL LIGATURE OE - 0x0153: 0x9C, # LATIN SMALL LIGATURE OE - 0x0178: 0x9F, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK - 0x01A0: 0xD5, # LATIN CAPITAL LETTER O WITH HORN - 0x01A1: 0xF5, # LATIN SMALL LETTER O WITH HORN - 0x01AF: 0xDD, # LATIN CAPITAL LETTER U WITH HORN - 0x01B0: 0xFD, # LATIN SMALL LETTER U WITH HORN - 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02DC: 0x98, # SMALL TILDE - 0x0300: 0xCC, # COMBINING GRAVE ACCENT - 0x0301: 0xEC, # COMBINING ACUTE ACCENT - 0x0303: 0xDE, # COMBINING TILDE - 0x0309: 0xD2, # COMBINING HOOK ABOVE - 0x0323: 0xF2, # COMBINING DOT BELOW - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0x86, # DAGGER - 0x2021: 0x87, # DOUBLE DAGGER - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x2030: 0x89, # PER MILLE SIGN - 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x20AB: 0xFE, # DONG SIGN - 0x20AC: 0x80, # EURO SIGN - 0x2122: 0x99, # TRADE MARK SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xBF, # INVERTED QUESTION MARK + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0102: 0xC3, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0xE3, # LATIN SMALL LETTER A WITH BREVE + 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE + 0x0152: 0x8C, # LATIN CAPITAL LIGATURE OE + 0x0153: 0x9C, # LATIN SMALL LIGATURE OE + 0x0178: 0x9F, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x0192: 0x83, # LATIN SMALL LETTER F WITH HOOK + 0x01A0: 0xD5, # LATIN CAPITAL LETTER O WITH HORN + 0x01A1: 0xF5, # LATIN SMALL LETTER O WITH HORN + 0x01AF: 0xDD, # LATIN CAPITAL LETTER U WITH HORN + 0x01B0: 0xFD, # LATIN SMALL LETTER U WITH HORN + 0x02C6: 0x88, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02DC: 0x98, # SMALL TILDE + 0x0300: 0xCC, # COMBINING GRAVE ACCENT + 0x0301: 0xEC, # COMBINING ACUTE ACCENT + 0x0303: 0xDE, # COMBINING TILDE + 0x0309: 0xD2, # COMBINING HOOK ABOVE + 0x0323: 0xF2, # COMBINING DOT BELOW + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0x82, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0x84, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0x86, # DAGGER + 0x2021: 0x87, # DOUBLE DAGGER + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x2030: 0x89, # PER MILLE SIGN + 0x2039: 0x8B, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0x9B, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x20AB: 0xFE, # DONG SIGN + 0x20AC: 0x80, # EURO SIGN + 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp424.py ============================================================================== --- python/trunk/Lib/encodings/cp424.py (original) +++ python/trunk/Lib/encodings/cp424.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,484 +32,483 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x9c' # 0x04 -> SELECT - u'\t' # 0x05 -> HORIZONTAL TABULATION - u'\x86' # 0x06 -> REQUIRED NEW LINE - u'\x7f' # 0x07 -> DELETE - u'\x97' # 0x08 -> GRAPHIC ESCAPE - u'\x8d' # 0x09 -> SUPERSCRIPT - u'\x8e' # 0x0A -> REPEAT - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x9d' # 0x14 -> RESTORE/ENABLE PRESENTATION - u'\x85' # 0x15 -> NEW LINE - u'\x08' # 0x16 -> BACKSPACE - u'\x87' # 0x17 -> PROGRAM OPERATOR COMMUNICATION - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x92' # 0x1A -> UNIT BACK SPACE - u'\x8f' # 0x1B -> CUSTOMER USE ONE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u'\x80' # 0x20 -> DIGIT SELECT - u'\x81' # 0x21 -> START OF SIGNIFICANCE - u'\x82' # 0x22 -> FIELD SEPARATOR - u'\x83' # 0x23 -> WORD UNDERSCORE - u'\x84' # 0x24 -> BYPASS OR INHIBIT PRESENTATION - u'\n' # 0x25 -> LINE FEED - u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK - u'\x1b' # 0x27 -> ESCAPE - u'\x88' # 0x28 -> SET ATTRIBUTE - u'\x89' # 0x29 -> START FIELD EXTENDED - u'\x8a' # 0x2A -> SET MODE OR SWITCH - u'\x8b' # 0x2B -> CONTROL SEQUENCE PREFIX - u'\x8c' # 0x2C -> MODIFY FIELD ATTRIBUTE - u'\x05' # 0x2D -> ENQUIRY - u'\x06' # 0x2E -> ACKNOWLEDGE - u'\x07' # 0x2F -> BELL - u'\x90' # 0x30 -> - u'\x91' # 0x31 -> - u'\x16' # 0x32 -> SYNCHRONOUS IDLE - u'\x93' # 0x33 -> INDEX RETURN - u'\x94' # 0x34 -> PRESENTATION POSITION - u'\x95' # 0x35 -> TRANSPARENT - u'\x96' # 0x36 -> NUMERIC BACKSPACE - u'\x04' # 0x37 -> END OF TRANSMISSION - u'\x98' # 0x38 -> SUBSCRIPT - u'\x99' # 0x39 -> INDENT TABULATION - u'\x9a' # 0x3A -> REVERSE FORM FEED - u'\x9b' # 0x3B -> CUSTOMER USE THREE - u'\x14' # 0x3C -> DEVICE CONTROL FOUR - u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE - u'\x9e' # 0x3E -> - u'\x1a' # 0x3F -> SUBSTITUTE - u' ' # 0x40 -> SPACE - u'\u05d0' # 0x41 -> HEBREW LETTER ALEF - u'\u05d1' # 0x42 -> HEBREW LETTER BET - u'\u05d2' # 0x43 -> HEBREW LETTER GIMEL - u'\u05d3' # 0x44 -> HEBREW LETTER DALET - u'\u05d4' # 0x45 -> HEBREW LETTER HE - u'\u05d5' # 0x46 -> HEBREW LETTER VAV - u'\u05d6' # 0x47 -> HEBREW LETTER ZAYIN - u'\u05d7' # 0x48 -> HEBREW LETTER HET - u'\u05d8' # 0x49 -> HEBREW LETTER TET - u'\xa2' # 0x4A -> CENT SIGN - u'.' # 0x4B -> FULL STOP - u'<' # 0x4C -> LESS-THAN SIGN - u'(' # 0x4D -> LEFT PARENTHESIS - u'+' # 0x4E -> PLUS SIGN - u'|' # 0x4F -> VERTICAL LINE - u'&' # 0x50 -> AMPERSAND - u'\u05d9' # 0x51 -> HEBREW LETTER YOD - u'\u05da' # 0x52 -> HEBREW LETTER FINAL KAF - u'\u05db' # 0x53 -> HEBREW LETTER KAF - u'\u05dc' # 0x54 -> HEBREW LETTER LAMED - u'\u05dd' # 0x55 -> HEBREW LETTER FINAL MEM - u'\u05de' # 0x56 -> HEBREW LETTER MEM - u'\u05df' # 0x57 -> HEBREW LETTER FINAL NUN - u'\u05e0' # 0x58 -> HEBREW LETTER NUN - u'\u05e1' # 0x59 -> HEBREW LETTER SAMEKH - u'!' # 0x5A -> EXCLAMATION MARK - u'$' # 0x5B -> DOLLAR SIGN - u'*' # 0x5C -> ASTERISK - u')' # 0x5D -> RIGHT PARENTHESIS - u';' # 0x5E -> SEMICOLON - u'\xac' # 0x5F -> NOT SIGN - u'-' # 0x60 -> HYPHEN-MINUS - u'/' # 0x61 -> SOLIDUS - u'\u05e2' # 0x62 -> HEBREW LETTER AYIN - u'\u05e3' # 0x63 -> HEBREW LETTER FINAL PE - u'\u05e4' # 0x64 -> HEBREW LETTER PE - u'\u05e5' # 0x65 -> HEBREW LETTER FINAL TSADI - u'\u05e6' # 0x66 -> HEBREW LETTER TSADI - u'\u05e7' # 0x67 -> HEBREW LETTER QOF - u'\u05e8' # 0x68 -> HEBREW LETTER RESH - u'\u05e9' # 0x69 -> HEBREW LETTER SHIN - u'\xa6' # 0x6A -> BROKEN BAR - u',' # 0x6B -> COMMA - u'%' # 0x6C -> PERCENT SIGN - u'_' # 0x6D -> LOW LINE - u'>' # 0x6E -> GREATER-THAN SIGN - u'?' # 0x6F -> QUESTION MARK - u'\ufffe' # 0x70 -> UNDEFINED - u'\u05ea' # 0x71 -> HEBREW LETTER TAV - u'\ufffe' # 0x72 -> UNDEFINED - u'\ufffe' # 0x73 -> UNDEFINED - u'\xa0' # 0x74 -> NO-BREAK SPACE - u'\ufffe' # 0x75 -> UNDEFINED - u'\ufffe' # 0x76 -> UNDEFINED - u'\ufffe' # 0x77 -> UNDEFINED - u'\u2017' # 0x78 -> DOUBLE LOW LINE - u'`' # 0x79 -> GRAVE ACCENT - u':' # 0x7A -> COLON - u'#' # 0x7B -> NUMBER SIGN - u'@' # 0x7C -> COMMERCIAL AT - u"'" # 0x7D -> APOSTROPHE - u'=' # 0x7E -> EQUALS SIGN - u'"' # 0x7F -> QUOTATION MARK - u'\ufffe' # 0x80 -> UNDEFINED - u'a' # 0x81 -> LATIN SMALL LETTER A - u'b' # 0x82 -> LATIN SMALL LETTER B - u'c' # 0x83 -> LATIN SMALL LETTER C - u'd' # 0x84 -> LATIN SMALL LETTER D - u'e' # 0x85 -> LATIN SMALL LETTER E - u'f' # 0x86 -> LATIN SMALL LETTER F - u'g' # 0x87 -> LATIN SMALL LETTER G - u'h' # 0x88 -> LATIN SMALL LETTER H - u'i' # 0x89 -> LATIN SMALL LETTER I - u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\ufffe' # 0x8C -> UNDEFINED - u'\ufffe' # 0x8D -> UNDEFINED - u'\ufffe' # 0x8E -> UNDEFINED - u'\xb1' # 0x8F -> PLUS-MINUS SIGN - u'\xb0' # 0x90 -> DEGREE SIGN - u'j' # 0x91 -> LATIN SMALL LETTER J - u'k' # 0x92 -> LATIN SMALL LETTER K - u'l' # 0x93 -> LATIN SMALL LETTER L - u'm' # 0x94 -> LATIN SMALL LETTER M - u'n' # 0x95 -> LATIN SMALL LETTER N - u'o' # 0x96 -> LATIN SMALL LETTER O - u'p' # 0x97 -> LATIN SMALL LETTER P - u'q' # 0x98 -> LATIN SMALL LETTER Q - u'r' # 0x99 -> LATIN SMALL LETTER R - u'\ufffe' # 0x9A -> UNDEFINED - u'\ufffe' # 0x9B -> UNDEFINED - u'\ufffe' # 0x9C -> UNDEFINED - u'\xb8' # 0x9D -> CEDILLA - u'\ufffe' # 0x9E -> UNDEFINED - u'\xa4' # 0x9F -> CURRENCY SIGN - u'\xb5' # 0xA0 -> MICRO SIGN - u'~' # 0xA1 -> TILDE - u's' # 0xA2 -> LATIN SMALL LETTER S - u't' # 0xA3 -> LATIN SMALL LETTER T - u'u' # 0xA4 -> LATIN SMALL LETTER U - u'v' # 0xA5 -> LATIN SMALL LETTER V - u'w' # 0xA6 -> LATIN SMALL LETTER W - u'x' # 0xA7 -> LATIN SMALL LETTER X - u'y' # 0xA8 -> LATIN SMALL LETTER Y - u'z' # 0xA9 -> LATIN SMALL LETTER Z - u'\ufffe' # 0xAA -> UNDEFINED - u'\ufffe' # 0xAB -> UNDEFINED - u'\ufffe' # 0xAC -> UNDEFINED - u'\ufffe' # 0xAD -> UNDEFINED - u'\ufffe' # 0xAE -> UNDEFINED - u'\xae' # 0xAF -> REGISTERED SIGN - u'^' # 0xB0 -> CIRCUMFLEX ACCENT - u'\xa3' # 0xB1 -> POUND SIGN - u'\xa5' # 0xB2 -> YEN SIGN - u'\xb7' # 0xB3 -> MIDDLE DOT - u'\xa9' # 0xB4 -> COPYRIGHT SIGN - u'\xa7' # 0xB5 -> SECTION SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS - u'[' # 0xBA -> LEFT SQUARE BRACKET - u']' # 0xBB -> RIGHT SQUARE BRACKET - u'\xaf' # 0xBC -> MACRON - u'\xa8' # 0xBD -> DIAERESIS - u'\xb4' # 0xBE -> ACUTE ACCENT - u'\xd7' # 0xBF -> MULTIPLICATION SIGN - u'{' # 0xC0 -> LEFT CURLY BRACKET - u'A' # 0xC1 -> LATIN CAPITAL LETTER A - u'B' # 0xC2 -> LATIN CAPITAL LETTER B - u'C' # 0xC3 -> LATIN CAPITAL LETTER C - u'D' # 0xC4 -> LATIN CAPITAL LETTER D - u'E' # 0xC5 -> LATIN CAPITAL LETTER E - u'F' # 0xC6 -> LATIN CAPITAL LETTER F - u'G' # 0xC7 -> LATIN CAPITAL LETTER G - u'H' # 0xC8 -> LATIN CAPITAL LETTER H - u'I' # 0xC9 -> LATIN CAPITAL LETTER I - u'\xad' # 0xCA -> SOFT HYPHEN - u'\ufffe' # 0xCB -> UNDEFINED - u'\ufffe' # 0xCC -> UNDEFINED - u'\ufffe' # 0xCD -> UNDEFINED - u'\ufffe' # 0xCE -> UNDEFINED - u'\ufffe' # 0xCF -> UNDEFINED - u'}' # 0xD0 -> RIGHT CURLY BRACKET - u'J' # 0xD1 -> LATIN CAPITAL LETTER J - u'K' # 0xD2 -> LATIN CAPITAL LETTER K - u'L' # 0xD3 -> LATIN CAPITAL LETTER L - u'M' # 0xD4 -> LATIN CAPITAL LETTER M - u'N' # 0xD5 -> LATIN CAPITAL LETTER N - u'O' # 0xD6 -> LATIN CAPITAL LETTER O - u'P' # 0xD7 -> LATIN CAPITAL LETTER P - u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q - u'R' # 0xD9 -> LATIN CAPITAL LETTER R - u'\xb9' # 0xDA -> SUPERSCRIPT ONE - u'\ufffe' # 0xDB -> UNDEFINED - u'\ufffe' # 0xDC -> UNDEFINED - u'\ufffe' # 0xDD -> UNDEFINED - u'\ufffe' # 0xDE -> UNDEFINED - u'\ufffe' # 0xDF -> UNDEFINED - u'\\' # 0xE0 -> REVERSE SOLIDUS - u'\xf7' # 0xE1 -> DIVISION SIGN - u'S' # 0xE2 -> LATIN CAPITAL LETTER S - u'T' # 0xE3 -> LATIN CAPITAL LETTER T - u'U' # 0xE4 -> LATIN CAPITAL LETTER U - u'V' # 0xE5 -> LATIN CAPITAL LETTER V - u'W' # 0xE6 -> LATIN CAPITAL LETTER W - u'X' # 0xE7 -> LATIN CAPITAL LETTER X - u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y - u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z - u'\xb2' # 0xEA -> SUPERSCRIPT TWO - u'\ufffe' # 0xEB -> UNDEFINED - u'\ufffe' # 0xEC -> UNDEFINED - u'\ufffe' # 0xED -> UNDEFINED - u'\ufffe' # 0xEE -> UNDEFINED - u'\ufffe' # 0xEF -> UNDEFINED - u'0' # 0xF0 -> DIGIT ZERO - u'1' # 0xF1 -> DIGIT ONE - u'2' # 0xF2 -> DIGIT TWO - u'3' # 0xF3 -> DIGIT THREE - u'4' # 0xF4 -> DIGIT FOUR - u'5' # 0xF5 -> DIGIT FIVE - u'6' # 0xF6 -> DIGIT SIX - u'7' # 0xF7 -> DIGIT SEVEN - u'8' # 0xF8 -> DIGIT EIGHT - u'9' # 0xF9 -> DIGIT NINE - u'\xb3' # 0xFA -> SUPERSCRIPT THREE - u'\ufffe' # 0xFB -> UNDEFINED - u'\ufffe' # 0xFC -> UNDEFINED - u'\ufffe' # 0xFD -> UNDEFINED - u'\ufffe' # 0xFE -> UNDEFINED - u'\x9f' # 0xFF -> EIGHT ONES + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> SELECT + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> REQUIRED NEW LINE + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> GRAPHIC ESCAPE + u'\x8d' # 0x09 -> SUPERSCRIPT + u'\x8e' # 0x0A -> REPEAT + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> RESTORE/ENABLE PRESENTATION + u'\x85' # 0x15 -> NEW LINE + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> PROGRAM OPERATOR COMMUNICATION + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> UNIT BACK SPACE + u'\x8f' # 0x1B -> CUSTOMER USE ONE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> DIGIT SELECT + u'\x81' # 0x21 -> START OF SIGNIFICANCE + u'\x82' # 0x22 -> FIELD SEPARATOR + u'\x83' # 0x23 -> WORD UNDERSCORE + u'\x84' # 0x24 -> BYPASS OR INHIBIT PRESENTATION + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> SET ATTRIBUTE + u'\x89' # 0x29 -> START FIELD EXTENDED + u'\x8a' # 0x2A -> SET MODE OR SWITCH + u'\x8b' # 0x2B -> CONTROL SEQUENCE PREFIX + u'\x8c' # 0x2C -> MODIFY FIELD ATTRIBUTE + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> + u'\x91' # 0x31 -> + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> INDEX RETURN + u'\x94' # 0x34 -> PRESENTATION POSITION + u'\x95' # 0x35 -> TRANSPARENT + u'\x96' # 0x36 -> NUMERIC BACKSPACE + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> SUBSCRIPT + u'\x99' # 0x39 -> INDENT TABULATION + u'\x9a' # 0x3A -> REVERSE FORM FEED + u'\x9b' # 0x3B -> CUSTOMER USE THREE + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\u05d0' # 0x41 -> HEBREW LETTER ALEF + u'\u05d1' # 0x42 -> HEBREW LETTER BET + u'\u05d2' # 0x43 -> HEBREW LETTER GIMEL + u'\u05d3' # 0x44 -> HEBREW LETTER DALET + u'\u05d4' # 0x45 -> HEBREW LETTER HE + u'\u05d5' # 0x46 -> HEBREW LETTER VAV + u'\u05d6' # 0x47 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0x48 -> HEBREW LETTER HET + u'\u05d8' # 0x49 -> HEBREW LETTER TET + u'\xa2' # 0x4A -> CENT SIGN + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'|' # 0x4F -> VERTICAL LINE + u'&' # 0x50 -> AMPERSAND + u'\u05d9' # 0x51 -> HEBREW LETTER YOD + u'\u05da' # 0x52 -> HEBREW LETTER FINAL KAF + u'\u05db' # 0x53 -> HEBREW LETTER KAF + u'\u05dc' # 0x54 -> HEBREW LETTER LAMED + u'\u05dd' # 0x55 -> HEBREW LETTER FINAL MEM + u'\u05de' # 0x56 -> HEBREW LETTER MEM + u'\u05df' # 0x57 -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0x58 -> HEBREW LETTER NUN + u'\u05e1' # 0x59 -> HEBREW LETTER SAMEKH + u'!' # 0x5A -> EXCLAMATION MARK + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'\xac' # 0x5F -> NOT SIGN + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\u05e2' # 0x62 -> HEBREW LETTER AYIN + u'\u05e3' # 0x63 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0x64 -> HEBREW LETTER PE + u'\u05e5' # 0x65 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0x66 -> HEBREW LETTER TSADI + u'\u05e7' # 0x67 -> HEBREW LETTER QOF + u'\u05e8' # 0x68 -> HEBREW LETTER RESH + u'\u05e9' # 0x69 -> HEBREW LETTER SHIN + u'\xa6' # 0x6A -> BROKEN BAR + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\ufffe' # 0x70 -> UNDEFINED + u'\u05ea' # 0x71 -> HEBREW LETTER TAV + u'\ufffe' # 0x72 -> UNDEFINED + u'\ufffe' # 0x73 -> UNDEFINED + u'\xa0' # 0x74 -> NO-BREAK SPACE + u'\ufffe' # 0x75 -> UNDEFINED + u'\ufffe' # 0x76 -> UNDEFINED + u'\ufffe' # 0x77 -> UNDEFINED + u'\u2017' # 0x78 -> DOUBLE LOW LINE + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\ufffe' # 0x80 -> UNDEFINED + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\ufffe' # 0x8C -> UNDEFINED + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\ufffe' # 0x9A -> UNDEFINED + u'\ufffe' # 0x9B -> UNDEFINED + u'\ufffe' # 0x9C -> UNDEFINED + u'\xb8' # 0x9D -> CEDILLA + u'\ufffe' # 0x9E -> UNDEFINED + u'\xa4' # 0x9F -> CURRENCY SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\ufffe' # 0xAA -> UNDEFINED + u'\ufffe' # 0xAB -> UNDEFINED + u'\ufffe' # 0xAC -> UNDEFINED + u'\ufffe' # 0xAD -> UNDEFINED + u'\ufffe' # 0xAE -> UNDEFINED + u'\xae' # 0xAF -> REGISTERED SIGN + u'^' # 0xB0 -> CIRCUMFLEX ACCENT + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'[' # 0xBA -> LEFT SQUARE BRACKET + u']' # 0xBB -> RIGHT SQUARE BRACKET + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\ufffe' # 0xCB -> UNDEFINED + u'\ufffe' # 0xCC -> UNDEFINED + u'\ufffe' # 0xCD -> UNDEFINED + u'\ufffe' # 0xCE -> UNDEFINED + u'\ufffe' # 0xCF -> UNDEFINED + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\ufffe' # 0xDB -> UNDEFINED + u'\ufffe' # 0xDC -> UNDEFINED + u'\ufffe' # 0xDD -> UNDEFINED + u'\ufffe' # 0xDE -> UNDEFINED + u'\ufffe' # 0xDF -> UNDEFINED + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\ufffe' # 0xEB -> UNDEFINED + u'\ufffe' # 0xEC -> UNDEFINED + u'\ufffe' # 0xED -> UNDEFINED + u'\ufffe' # 0xEE -> UNDEFINED + u'\ufffe' # 0xEF -> UNDEFINED + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\ufffe' # 0xFB -> UNDEFINED + u'\ufffe' # 0xFC -> UNDEFINED + u'\ufffe' # 0xFD -> UNDEFINED + u'\ufffe' # 0xFE -> UNDEFINED + u'\x9f' # 0xFF -> EIGHT ONES ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x37, # END OF TRANSMISSION - 0x0005: 0x2D, # ENQUIRY - 0x0006: 0x2E, # ACKNOWLEDGE - 0x0007: 0x2F, # BELL - 0x0008: 0x16, # BACKSPACE - 0x0009: 0x05, # HORIZONTAL TABULATION - 0x000A: 0x25, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x3C, # DEVICE CONTROL FOUR - 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x32, # SYNCHRONOUS IDLE - 0x0017: 0x26, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x3F, # SUBSTITUTE - 0x001B: 0x27, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x40, # SPACE - 0x0021: 0x5A, # EXCLAMATION MARK - 0x0022: 0x7F, # QUOTATION MARK - 0x0023: 0x7B, # NUMBER SIGN - 0x0024: 0x5B, # DOLLAR SIGN - 0x0025: 0x6C, # PERCENT SIGN - 0x0026: 0x50, # AMPERSAND - 0x0027: 0x7D, # APOSTROPHE - 0x0028: 0x4D, # LEFT PARENTHESIS - 0x0029: 0x5D, # RIGHT PARENTHESIS - 0x002A: 0x5C, # ASTERISK - 0x002B: 0x4E, # PLUS SIGN - 0x002C: 0x6B, # COMMA - 0x002D: 0x60, # HYPHEN-MINUS - 0x002E: 0x4B, # FULL STOP - 0x002F: 0x61, # SOLIDUS - 0x0030: 0xF0, # DIGIT ZERO - 0x0031: 0xF1, # DIGIT ONE - 0x0032: 0xF2, # DIGIT TWO - 0x0033: 0xF3, # DIGIT THREE - 0x0034: 0xF4, # DIGIT FOUR - 0x0035: 0xF5, # DIGIT FIVE - 0x0036: 0xF6, # DIGIT SIX - 0x0037: 0xF7, # DIGIT SEVEN - 0x0038: 0xF8, # DIGIT EIGHT - 0x0039: 0xF9, # DIGIT NINE - 0x003A: 0x7A, # COLON - 0x003B: 0x5E, # SEMICOLON - 0x003C: 0x4C, # LESS-THAN SIGN - 0x003D: 0x7E, # EQUALS SIGN - 0x003E: 0x6E, # GREATER-THAN SIGN - 0x003F: 0x6F, # QUESTION MARK - 0x0040: 0x7C, # COMMERCIAL AT - 0x0041: 0xC1, # LATIN CAPITAL LETTER A - 0x0042: 0xC2, # LATIN CAPITAL LETTER B - 0x0043: 0xC3, # LATIN CAPITAL LETTER C - 0x0044: 0xC4, # LATIN CAPITAL LETTER D - 0x0045: 0xC5, # LATIN CAPITAL LETTER E - 0x0046: 0xC6, # LATIN CAPITAL LETTER F - 0x0047: 0xC7, # LATIN CAPITAL LETTER G - 0x0048: 0xC8, # LATIN CAPITAL LETTER H - 0x0049: 0xC9, # LATIN CAPITAL LETTER I - 0x004A: 0xD1, # LATIN CAPITAL LETTER J - 0x004B: 0xD2, # LATIN CAPITAL LETTER K - 0x004C: 0xD3, # LATIN CAPITAL LETTER L - 0x004D: 0xD4, # LATIN CAPITAL LETTER M - 0x004E: 0xD5, # LATIN CAPITAL LETTER N - 0x004F: 0xD6, # LATIN CAPITAL LETTER O - 0x0050: 0xD7, # LATIN CAPITAL LETTER P - 0x0051: 0xD8, # LATIN CAPITAL LETTER Q - 0x0052: 0xD9, # LATIN CAPITAL LETTER R - 0x0053: 0xE2, # LATIN CAPITAL LETTER S - 0x0054: 0xE3, # LATIN CAPITAL LETTER T - 0x0055: 0xE4, # LATIN CAPITAL LETTER U - 0x0056: 0xE5, # LATIN CAPITAL LETTER V - 0x0057: 0xE6, # LATIN CAPITAL LETTER W - 0x0058: 0xE7, # LATIN CAPITAL LETTER X - 0x0059: 0xE8, # LATIN CAPITAL LETTER Y - 0x005A: 0xE9, # LATIN CAPITAL LETTER Z - 0x005B: 0xBA, # LEFT SQUARE BRACKET - 0x005C: 0xE0, # REVERSE SOLIDUS - 0x005D: 0xBB, # RIGHT SQUARE BRACKET - 0x005E: 0xB0, # CIRCUMFLEX ACCENT - 0x005F: 0x6D, # LOW LINE - 0x0060: 0x79, # GRAVE ACCENT - 0x0061: 0x81, # LATIN SMALL LETTER A - 0x0062: 0x82, # LATIN SMALL LETTER B - 0x0063: 0x83, # LATIN SMALL LETTER C - 0x0064: 0x84, # LATIN SMALL LETTER D - 0x0065: 0x85, # LATIN SMALL LETTER E - 0x0066: 0x86, # LATIN SMALL LETTER F - 0x0067: 0x87, # LATIN SMALL LETTER G - 0x0068: 0x88, # LATIN SMALL LETTER H - 0x0069: 0x89, # LATIN SMALL LETTER I - 0x006A: 0x91, # LATIN SMALL LETTER J - 0x006B: 0x92, # LATIN SMALL LETTER K - 0x006C: 0x93, # LATIN SMALL LETTER L - 0x006D: 0x94, # LATIN SMALL LETTER M - 0x006E: 0x95, # LATIN SMALL LETTER N - 0x006F: 0x96, # LATIN SMALL LETTER O - 0x0070: 0x97, # LATIN SMALL LETTER P - 0x0071: 0x98, # LATIN SMALL LETTER Q - 0x0072: 0x99, # LATIN SMALL LETTER R - 0x0073: 0xA2, # LATIN SMALL LETTER S - 0x0074: 0xA3, # LATIN SMALL LETTER T - 0x0075: 0xA4, # LATIN SMALL LETTER U - 0x0076: 0xA5, # LATIN SMALL LETTER V - 0x0077: 0xA6, # LATIN SMALL LETTER W - 0x0078: 0xA7, # LATIN SMALL LETTER X - 0x0079: 0xA8, # LATIN SMALL LETTER Y - 0x007A: 0xA9, # LATIN SMALL LETTER Z - 0x007B: 0xC0, # LEFT CURLY BRACKET - 0x007C: 0x4F, # VERTICAL LINE - 0x007D: 0xD0, # RIGHT CURLY BRACKET - 0x007E: 0xA1, # TILDE - 0x007F: 0x07, # DELETE - 0x0080: 0x20, # DIGIT SELECT - 0x0081: 0x21, # START OF SIGNIFICANCE - 0x0082: 0x22, # FIELD SEPARATOR - 0x0083: 0x23, # WORD UNDERSCORE - 0x0084: 0x24, # BYPASS OR INHIBIT PRESENTATION - 0x0085: 0x15, # NEW LINE - 0x0086: 0x06, # REQUIRED NEW LINE - 0x0087: 0x17, # PROGRAM OPERATOR COMMUNICATION - 0x0088: 0x28, # SET ATTRIBUTE - 0x0089: 0x29, # START FIELD EXTENDED - 0x008A: 0x2A, # SET MODE OR SWITCH - 0x008B: 0x2B, # CONTROL SEQUENCE PREFIX - 0x008C: 0x2C, # MODIFY FIELD ATTRIBUTE - 0x008D: 0x09, # SUPERSCRIPT - 0x008E: 0x0A, # REPEAT - 0x008F: 0x1B, # CUSTOMER USE ONE - 0x0090: 0x30, # - 0x0091: 0x31, # - 0x0092: 0x1A, # UNIT BACK SPACE - 0x0093: 0x33, # INDEX RETURN - 0x0094: 0x34, # PRESENTATION POSITION - 0x0095: 0x35, # TRANSPARENT - 0x0096: 0x36, # NUMERIC BACKSPACE - 0x0097: 0x08, # GRAPHIC ESCAPE - 0x0098: 0x38, # SUBSCRIPT - 0x0099: 0x39, # INDENT TABULATION - 0x009A: 0x3A, # REVERSE FORM FEED - 0x009B: 0x3B, # CUSTOMER USE THREE - 0x009C: 0x04, # SELECT - 0x009D: 0x14, # RESTORE/ENABLE PRESENTATION - 0x009E: 0x3E, # - 0x009F: 0xFF, # EIGHT ONES - 0x00A0: 0x74, # NO-BREAK SPACE - 0x00A2: 0x4A, # CENT SIGN - 0x00A3: 0xB1, # POUND SIGN - 0x00A4: 0x9F, # CURRENCY SIGN - 0x00A5: 0xB2, # YEN SIGN - 0x00A6: 0x6A, # BROKEN BAR - 0x00A7: 0xB5, # SECTION SIGN - 0x00A8: 0xBD, # DIAERESIS - 0x00A9: 0xB4, # COPYRIGHT SIGN - 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0x5F, # NOT SIGN - 0x00AD: 0xCA, # SOFT HYPHEN - 0x00AE: 0xAF, # REGISTERED SIGN - 0x00AF: 0xBC, # MACRON - 0x00B0: 0x90, # DEGREE SIGN - 0x00B1: 0x8F, # PLUS-MINUS SIGN - 0x00B2: 0xEA, # SUPERSCRIPT TWO - 0x00B3: 0xFA, # SUPERSCRIPT THREE - 0x00B4: 0xBE, # ACUTE ACCENT - 0x00B5: 0xA0, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB3, # MIDDLE DOT - 0x00B8: 0x9D, # CEDILLA - 0x00B9: 0xDA, # SUPERSCRIPT ONE - 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF - 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS - 0x00D7: 0xBF, # MULTIPLICATION SIGN - 0x00F7: 0xE1, # DIVISION SIGN - 0x05D0: 0x41, # HEBREW LETTER ALEF - 0x05D1: 0x42, # HEBREW LETTER BET - 0x05D2: 0x43, # HEBREW LETTER GIMEL - 0x05D3: 0x44, # HEBREW LETTER DALET - 0x05D4: 0x45, # HEBREW LETTER HE - 0x05D5: 0x46, # HEBREW LETTER VAV - 0x05D6: 0x47, # HEBREW LETTER ZAYIN - 0x05D7: 0x48, # HEBREW LETTER HET - 0x05D8: 0x49, # HEBREW LETTER TET - 0x05D9: 0x51, # HEBREW LETTER YOD - 0x05DA: 0x52, # HEBREW LETTER FINAL KAF - 0x05DB: 0x53, # HEBREW LETTER KAF - 0x05DC: 0x54, # HEBREW LETTER LAMED - 0x05DD: 0x55, # HEBREW LETTER FINAL MEM - 0x05DE: 0x56, # HEBREW LETTER MEM - 0x05DF: 0x57, # HEBREW LETTER FINAL NUN - 0x05E0: 0x58, # HEBREW LETTER NUN - 0x05E1: 0x59, # HEBREW LETTER SAMEKH - 0x05E2: 0x62, # HEBREW LETTER AYIN - 0x05E3: 0x63, # HEBREW LETTER FINAL PE - 0x05E4: 0x64, # HEBREW LETTER PE - 0x05E5: 0x65, # HEBREW LETTER FINAL TSADI - 0x05E6: 0x66, # HEBREW LETTER TSADI - 0x05E7: 0x67, # HEBREW LETTER QOF - 0x05E8: 0x68, # HEBREW LETTER RESH - 0x05E9: 0x69, # HEBREW LETTER SHIN - 0x05EA: 0x71, # HEBREW LETTER TAV - 0x2017: 0x78, # DOUBLE LOW LINE + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x37, # END OF TRANSMISSION + 0x0005: 0x2D, # ENQUIRY + 0x0006: 0x2E, # ACKNOWLEDGE + 0x0007: 0x2F, # BELL + 0x0008: 0x16, # BACKSPACE + 0x0009: 0x05, # HORIZONTAL TABULATION + 0x000A: 0x25, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x3C, # DEVICE CONTROL FOUR + 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x32, # SYNCHRONOUS IDLE + 0x0017: 0x26, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x3F, # SUBSTITUTE + 0x001B: 0x27, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x40, # SPACE + 0x0021: 0x5A, # EXCLAMATION MARK + 0x0022: 0x7F, # QUOTATION MARK + 0x0023: 0x7B, # NUMBER SIGN + 0x0024: 0x5B, # DOLLAR SIGN + 0x0025: 0x6C, # PERCENT SIGN + 0x0026: 0x50, # AMPERSAND + 0x0027: 0x7D, # APOSTROPHE + 0x0028: 0x4D, # LEFT PARENTHESIS + 0x0029: 0x5D, # RIGHT PARENTHESIS + 0x002A: 0x5C, # ASTERISK + 0x002B: 0x4E, # PLUS SIGN + 0x002C: 0x6B, # COMMA + 0x002D: 0x60, # HYPHEN-MINUS + 0x002E: 0x4B, # FULL STOP + 0x002F: 0x61, # SOLIDUS + 0x0030: 0xF0, # DIGIT ZERO + 0x0031: 0xF1, # DIGIT ONE + 0x0032: 0xF2, # DIGIT TWO + 0x0033: 0xF3, # DIGIT THREE + 0x0034: 0xF4, # DIGIT FOUR + 0x0035: 0xF5, # DIGIT FIVE + 0x0036: 0xF6, # DIGIT SIX + 0x0037: 0xF7, # DIGIT SEVEN + 0x0038: 0xF8, # DIGIT EIGHT + 0x0039: 0xF9, # DIGIT NINE + 0x003A: 0x7A, # COLON + 0x003B: 0x5E, # SEMICOLON + 0x003C: 0x4C, # LESS-THAN SIGN + 0x003D: 0x7E, # EQUALS SIGN + 0x003E: 0x6E, # GREATER-THAN SIGN + 0x003F: 0x6F, # QUESTION MARK + 0x0040: 0x7C, # COMMERCIAL AT + 0x0041: 0xC1, # LATIN CAPITAL LETTER A + 0x0042: 0xC2, # LATIN CAPITAL LETTER B + 0x0043: 0xC3, # LATIN CAPITAL LETTER C + 0x0044: 0xC4, # LATIN CAPITAL LETTER D + 0x0045: 0xC5, # LATIN CAPITAL LETTER E + 0x0046: 0xC6, # LATIN CAPITAL LETTER F + 0x0047: 0xC7, # LATIN CAPITAL LETTER G + 0x0048: 0xC8, # LATIN CAPITAL LETTER H + 0x0049: 0xC9, # LATIN CAPITAL LETTER I + 0x004A: 0xD1, # LATIN CAPITAL LETTER J + 0x004B: 0xD2, # LATIN CAPITAL LETTER K + 0x004C: 0xD3, # LATIN CAPITAL LETTER L + 0x004D: 0xD4, # LATIN CAPITAL LETTER M + 0x004E: 0xD5, # LATIN CAPITAL LETTER N + 0x004F: 0xD6, # LATIN CAPITAL LETTER O + 0x0050: 0xD7, # LATIN CAPITAL LETTER P + 0x0051: 0xD8, # LATIN CAPITAL LETTER Q + 0x0052: 0xD9, # LATIN CAPITAL LETTER R + 0x0053: 0xE2, # LATIN CAPITAL LETTER S + 0x0054: 0xE3, # LATIN CAPITAL LETTER T + 0x0055: 0xE4, # LATIN CAPITAL LETTER U + 0x0056: 0xE5, # LATIN CAPITAL LETTER V + 0x0057: 0xE6, # LATIN CAPITAL LETTER W + 0x0058: 0xE7, # LATIN CAPITAL LETTER X + 0x0059: 0xE8, # LATIN CAPITAL LETTER Y + 0x005A: 0xE9, # LATIN CAPITAL LETTER Z + 0x005B: 0xBA, # LEFT SQUARE BRACKET + 0x005C: 0xE0, # REVERSE SOLIDUS + 0x005D: 0xBB, # RIGHT SQUARE BRACKET + 0x005E: 0xB0, # CIRCUMFLEX ACCENT + 0x005F: 0x6D, # LOW LINE + 0x0060: 0x79, # GRAVE ACCENT + 0x0061: 0x81, # LATIN SMALL LETTER A + 0x0062: 0x82, # LATIN SMALL LETTER B + 0x0063: 0x83, # LATIN SMALL LETTER C + 0x0064: 0x84, # LATIN SMALL LETTER D + 0x0065: 0x85, # LATIN SMALL LETTER E + 0x0066: 0x86, # LATIN SMALL LETTER F + 0x0067: 0x87, # LATIN SMALL LETTER G + 0x0068: 0x88, # LATIN SMALL LETTER H + 0x0069: 0x89, # LATIN SMALL LETTER I + 0x006A: 0x91, # LATIN SMALL LETTER J + 0x006B: 0x92, # LATIN SMALL LETTER K + 0x006C: 0x93, # LATIN SMALL LETTER L + 0x006D: 0x94, # LATIN SMALL LETTER M + 0x006E: 0x95, # LATIN SMALL LETTER N + 0x006F: 0x96, # LATIN SMALL LETTER O + 0x0070: 0x97, # LATIN SMALL LETTER P + 0x0071: 0x98, # LATIN SMALL LETTER Q + 0x0072: 0x99, # LATIN SMALL LETTER R + 0x0073: 0xA2, # LATIN SMALL LETTER S + 0x0074: 0xA3, # LATIN SMALL LETTER T + 0x0075: 0xA4, # LATIN SMALL LETTER U + 0x0076: 0xA5, # LATIN SMALL LETTER V + 0x0077: 0xA6, # LATIN SMALL LETTER W + 0x0078: 0xA7, # LATIN SMALL LETTER X + 0x0079: 0xA8, # LATIN SMALL LETTER Y + 0x007A: 0xA9, # LATIN SMALL LETTER Z + 0x007B: 0xC0, # LEFT CURLY BRACKET + 0x007C: 0x4F, # VERTICAL LINE + 0x007D: 0xD0, # RIGHT CURLY BRACKET + 0x007E: 0xA1, # TILDE + 0x007F: 0x07, # DELETE + 0x0080: 0x20, # DIGIT SELECT + 0x0081: 0x21, # START OF SIGNIFICANCE + 0x0082: 0x22, # FIELD SEPARATOR + 0x0083: 0x23, # WORD UNDERSCORE + 0x0084: 0x24, # BYPASS OR INHIBIT PRESENTATION + 0x0085: 0x15, # NEW LINE + 0x0086: 0x06, # REQUIRED NEW LINE + 0x0087: 0x17, # PROGRAM OPERATOR COMMUNICATION + 0x0088: 0x28, # SET ATTRIBUTE + 0x0089: 0x29, # START FIELD EXTENDED + 0x008A: 0x2A, # SET MODE OR SWITCH + 0x008B: 0x2B, # CONTROL SEQUENCE PREFIX + 0x008C: 0x2C, # MODIFY FIELD ATTRIBUTE + 0x008D: 0x09, # SUPERSCRIPT + 0x008E: 0x0A, # REPEAT + 0x008F: 0x1B, # CUSTOMER USE ONE + 0x0090: 0x30, # + 0x0091: 0x31, # + 0x0092: 0x1A, # UNIT BACK SPACE + 0x0093: 0x33, # INDEX RETURN + 0x0094: 0x34, # PRESENTATION POSITION + 0x0095: 0x35, # TRANSPARENT + 0x0096: 0x36, # NUMERIC BACKSPACE + 0x0097: 0x08, # GRAPHIC ESCAPE + 0x0098: 0x38, # SUBSCRIPT + 0x0099: 0x39, # INDENT TABULATION + 0x009A: 0x3A, # REVERSE FORM FEED + 0x009B: 0x3B, # CUSTOMER USE THREE + 0x009C: 0x04, # SELECT + 0x009D: 0x14, # RESTORE/ENABLE PRESENTATION + 0x009E: 0x3E, # + 0x009F: 0xFF, # EIGHT ONES + 0x00A0: 0x74, # NO-BREAK SPACE + 0x00A2: 0x4A, # CENT SIGN + 0x00A3: 0xB1, # POUND SIGN + 0x00A4: 0x9F, # CURRENCY SIGN + 0x00A5: 0xB2, # YEN SIGN + 0x00A6: 0x6A, # BROKEN BAR + 0x00A7: 0xB5, # SECTION SIGN + 0x00A8: 0xBD, # DIAERESIS + 0x00A9: 0xB4, # COPYRIGHT SIGN + 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0x5F, # NOT SIGN + 0x00AD: 0xCA, # SOFT HYPHEN + 0x00AE: 0xAF, # REGISTERED SIGN + 0x00AF: 0xBC, # MACRON + 0x00B0: 0x90, # DEGREE SIGN + 0x00B1: 0x8F, # PLUS-MINUS SIGN + 0x00B2: 0xEA, # SUPERSCRIPT TWO + 0x00B3: 0xFA, # SUPERSCRIPT THREE + 0x00B4: 0xBE, # ACUTE ACCENT + 0x00B5: 0xA0, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB3, # MIDDLE DOT + 0x00B8: 0x9D, # CEDILLA + 0x00B9: 0xDA, # SUPERSCRIPT ONE + 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF + 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS + 0x00D7: 0xBF, # MULTIPLICATION SIGN + 0x00F7: 0xE1, # DIVISION SIGN + 0x05D0: 0x41, # HEBREW LETTER ALEF + 0x05D1: 0x42, # HEBREW LETTER BET + 0x05D2: 0x43, # HEBREW LETTER GIMEL + 0x05D3: 0x44, # HEBREW LETTER DALET + 0x05D4: 0x45, # HEBREW LETTER HE + 0x05D5: 0x46, # HEBREW LETTER VAV + 0x05D6: 0x47, # HEBREW LETTER ZAYIN + 0x05D7: 0x48, # HEBREW LETTER HET + 0x05D8: 0x49, # HEBREW LETTER TET + 0x05D9: 0x51, # HEBREW LETTER YOD + 0x05DA: 0x52, # HEBREW LETTER FINAL KAF + 0x05DB: 0x53, # HEBREW LETTER KAF + 0x05DC: 0x54, # HEBREW LETTER LAMED + 0x05DD: 0x55, # HEBREW LETTER FINAL MEM + 0x05DE: 0x56, # HEBREW LETTER MEM + 0x05DF: 0x57, # HEBREW LETTER FINAL NUN + 0x05E0: 0x58, # HEBREW LETTER NUN + 0x05E1: 0x59, # HEBREW LETTER SAMEKH + 0x05E2: 0x62, # HEBREW LETTER AYIN + 0x05E3: 0x63, # HEBREW LETTER FINAL PE + 0x05E4: 0x64, # HEBREW LETTER PE + 0x05E5: 0x65, # HEBREW LETTER FINAL TSADI + 0x05E6: 0x66, # HEBREW LETTER TSADI + 0x05E7: 0x67, # HEBREW LETTER QOF + 0x05E8: 0x68, # HEBREW LETTER RESH + 0x05E9: 0x69, # HEBREW LETTER SHIN + 0x05EA: 0x71, # HEBREW LETTER TAV + 0x2017: 0x78, # DOUBLE LOW LINE } - Modified: python/trunk/Lib/encodings/cp437.py ============================================================================== --- python/trunk/Lib/encodings/cp437.py (original) +++ python/trunk/Lib/encodings/cp437.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS - 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE - 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE - 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE - 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE - 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE - 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x00a2, # CENT SIGN - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00a5, # YEN SIGN - 0x009e: 0x20a7, # PESETA SIGN - 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE - 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR - 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR - 0x00a8: 0x00bf, # INVERTED QUESTION MARK - 0x00a9: 0x2310, # REVERSED NOT SIGN - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x00e3: 0x03c0, # GREEK SMALL LETTER PI - 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU - 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA - 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA - 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA - 0x00ec: 0x221e, # INFINITY - 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI - 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x00ef: 0x2229, # INTERSECTION - 0x00f0: 0x2261, # IDENTICAL TO - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO - 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO - 0x00f4: 0x2320, # TOP HALF INTEGRAL - 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x2248, # ALMOST EQUAL TO - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x221a, # SQUARE ROOT - 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE - u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE - u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE - u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE - u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE - u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE - u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xa2' # 0x009b -> CENT SIGN - u'\xa3' # 0x009c -> POUND SIGN - u'\xa5' # 0x009d -> YEN SIGN - u'\u20a7' # 0x009e -> PESETA SIGN - u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK - u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE - u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE - u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR - u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK - u'\u2310' # 0x00a9 -> REVERSED NOT SIGN - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S - u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA - u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI - u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA - u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU - u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI - u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA - u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA - u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA - u'\u221e' # 0x00ec -> INFINITY - u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI - u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON - u'\u2229' # 0x00ef -> INTERSECTION - u'\u2261' # 0x00f0 -> IDENTICAL TO - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO - u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO - u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL - u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\u2248' # 0x00f7 -> ALMOST EQUAL TO - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\u221a' # 0x00fb -> SQUARE ROOT - u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xa2' # 0x009b -> CENT SIGN + u'\xa3' # 0x009c -> POUND SIGN + u'\xa5' # 0x009d -> YEN SIGN + u'\u20a7' # 0x009e -> PESETA SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK - 0x00a2: 0x009b, # CENT SIGN - 0x00a3: 0x009c, # POUND SIGN - 0x00a5: 0x009d, # YEN SIGN - 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00bf: 0x00a8, # INVERTED QUESTION MARK - 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE - 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE - 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S - 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE - 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE - 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE - 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE - 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE - 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK - 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA - 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA - 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA - 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI - 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA - 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA - 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA - 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON - 0x03c0: 0x00e3, # GREEK SMALL LETTER PI - 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA - 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU - 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI - 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N - 0x20a7: 0x009e, # PESETA SIGN - 0x2219: 0x00f9, # BULLET OPERATOR - 0x221a: 0x00fb, # SQUARE ROOT - 0x221e: 0x00ec, # INFINITY - 0x2229: 0x00ef, # INTERSECTION - 0x2248: 0x00f7, # ALMOST EQUAL TO - 0x2261: 0x00f0, # IDENTICAL TO - 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO - 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO - 0x2310: 0x00a9, # REVERSED NOT SIGN - 0x2320: 0x00f4, # TOP HALF INTEGRAL - 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp500.py ============================================================================== --- python/trunk/Lib/encodings/cp500.py (original) +++ python/trunk/Lib/encodings/cp500.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x9c' # 0x04 -> CONTROL - u'\t' # 0x05 -> HORIZONTAL TABULATION - u'\x86' # 0x06 -> CONTROL - u'\x7f' # 0x07 -> DELETE - u'\x97' # 0x08 -> CONTROL - u'\x8d' # 0x09 -> CONTROL - u'\x8e' # 0x0A -> CONTROL - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x9d' # 0x14 -> CONTROL - u'\x85' # 0x15 -> CONTROL - u'\x08' # 0x16 -> BACKSPACE - u'\x87' # 0x17 -> CONTROL - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x92' # 0x1A -> CONTROL - u'\x8f' # 0x1B -> CONTROL - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u'\x80' # 0x20 -> CONTROL - u'\x81' # 0x21 -> CONTROL - u'\x82' # 0x22 -> CONTROL - u'\x83' # 0x23 -> CONTROL - u'\x84' # 0x24 -> CONTROL - u'\n' # 0x25 -> LINE FEED - u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK - u'\x1b' # 0x27 -> ESCAPE - u'\x88' # 0x28 -> CONTROL - u'\x89' # 0x29 -> CONTROL - u'\x8a' # 0x2A -> CONTROL - u'\x8b' # 0x2B -> CONTROL - u'\x8c' # 0x2C -> CONTROL - u'\x05' # 0x2D -> ENQUIRY - u'\x06' # 0x2E -> ACKNOWLEDGE - u'\x07' # 0x2F -> BELL - u'\x90' # 0x30 -> CONTROL - u'\x91' # 0x31 -> CONTROL - u'\x16' # 0x32 -> SYNCHRONOUS IDLE - u'\x93' # 0x33 -> CONTROL - u'\x94' # 0x34 -> CONTROL - u'\x95' # 0x35 -> CONTROL - u'\x96' # 0x36 -> CONTROL - u'\x04' # 0x37 -> END OF TRANSMISSION - u'\x98' # 0x38 -> CONTROL - u'\x99' # 0x39 -> CONTROL - u'\x9a' # 0x3A -> CONTROL - u'\x9b' # 0x3B -> CONTROL - u'\x14' # 0x3C -> DEVICE CONTROL FOUR - u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE - u'\x9e' # 0x3E -> CONTROL - u'\x1a' # 0x3F -> SUBSTITUTE - u' ' # 0x40 -> SPACE - u'\xa0' # 0x41 -> NO-BREAK SPACE - u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE - u'[' # 0x4A -> LEFT SQUARE BRACKET - u'.' # 0x4B -> FULL STOP - u'<' # 0x4C -> LESS-THAN SIGN - u'(' # 0x4D -> LEFT PARENTHESIS - u'+' # 0x4E -> PLUS SIGN - u'!' # 0x4F -> EXCLAMATION MARK - u'&' # 0x50 -> AMPERSAND - u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE - u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE - u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) - u']' # 0x5A -> RIGHT SQUARE BRACKET - u'$' # 0x5B -> DOLLAR SIGN - u'*' # 0x5C -> ASTERISK - u')' # 0x5D -> RIGHT PARENTHESIS - u';' # 0x5E -> SEMICOLON - u'^' # 0x5F -> CIRCUMFLEX ACCENT - u'-' # 0x60 -> HYPHEN-MINUS - u'/' # 0x61 -> SOLIDUS - u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xa6' # 0x6A -> BROKEN BAR - u',' # 0x6B -> COMMA - u'%' # 0x6C -> PERCENT SIGN - u'_' # 0x6D -> LOW LINE - u'>' # 0x6E -> GREATER-THAN SIGN - u'?' # 0x6F -> QUESTION MARK - u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE - u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE - u'`' # 0x79 -> GRAVE ACCENT - u':' # 0x7A -> COLON - u'#' # 0x7B -> NUMBER SIGN - u'@' # 0x7C -> COMMERCIAL AT - u"'" # 0x7D -> APOSTROPHE - u'=' # 0x7E -> EQUALS SIGN - u'"' # 0x7F -> QUOTATION MARK - u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE - u'a' # 0x81 -> LATIN SMALL LETTER A - u'b' # 0x82 -> LATIN SMALL LETTER B - u'c' # 0x83 -> LATIN SMALL LETTER C - u'd' # 0x84 -> LATIN SMALL LETTER D - u'e' # 0x85 -> LATIN SMALL LETTER E - u'f' # 0x86 -> LATIN SMALL LETTER F - u'g' # 0x87 -> LATIN SMALL LETTER G - u'h' # 0x88 -> LATIN SMALL LETTER H - u'i' # 0x89 -> LATIN SMALL LETTER I - u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) - u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE - u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) - u'\xb1' # 0x8F -> PLUS-MINUS SIGN - u'\xb0' # 0x90 -> DEGREE SIGN - u'j' # 0x91 -> LATIN SMALL LETTER J - u'k' # 0x92 -> LATIN SMALL LETTER K - u'l' # 0x93 -> LATIN SMALL LETTER L - u'm' # 0x94 -> LATIN SMALL LETTER M - u'n' # 0x95 -> LATIN SMALL LETTER N - u'o' # 0x96 -> LATIN SMALL LETTER O - u'p' # 0x97 -> LATIN SMALL LETTER P - u'q' # 0x98 -> LATIN SMALL LETTER Q - u'r' # 0x99 -> LATIN SMALL LETTER R - u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR - u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE - u'\xb8' # 0x9D -> CEDILLA - u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE - u'\xa4' # 0x9F -> CURRENCY SIGN - u'\xb5' # 0xA0 -> MICRO SIGN - u'~' # 0xA1 -> TILDE - u's' # 0xA2 -> LATIN SMALL LETTER S - u't' # 0xA3 -> LATIN SMALL LETTER T - u'u' # 0xA4 -> LATIN SMALL LETTER U - u'v' # 0xA5 -> LATIN SMALL LETTER V - u'w' # 0xA6 -> LATIN SMALL LETTER W - u'x' # 0xA7 -> LATIN SMALL LETTER X - u'y' # 0xA8 -> LATIN SMALL LETTER Y - u'z' # 0xA9 -> LATIN SMALL LETTER Z - u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK - u'\xbf' # 0xAB -> INVERTED QUESTION MARK - u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) - u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) - u'\xae' # 0xAF -> REGISTERED SIGN - u'\xa2' # 0xB0 -> CENT SIGN - u'\xa3' # 0xB1 -> POUND SIGN - u'\xa5' # 0xB2 -> YEN SIGN - u'\xb7' # 0xB3 -> MIDDLE DOT - u'\xa9' # 0xB4 -> COPYRIGHT SIGN - u'\xa7' # 0xB5 -> SECTION SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS - u'\xac' # 0xBA -> NOT SIGN - u'|' # 0xBB -> VERTICAL LINE - u'\xaf' # 0xBC -> MACRON - u'\xa8' # 0xBD -> DIAERESIS - u'\xb4' # 0xBE -> ACUTE ACCENT - u'\xd7' # 0xBF -> MULTIPLICATION SIGN - u'{' # 0xC0 -> LEFT CURLY BRACKET - u'A' # 0xC1 -> LATIN CAPITAL LETTER A - u'B' # 0xC2 -> LATIN CAPITAL LETTER B - u'C' # 0xC3 -> LATIN CAPITAL LETTER C - u'D' # 0xC4 -> LATIN CAPITAL LETTER D - u'E' # 0xC5 -> LATIN CAPITAL LETTER E - u'F' # 0xC6 -> LATIN CAPITAL LETTER F - u'G' # 0xC7 -> LATIN CAPITAL LETTER G - u'H' # 0xC8 -> LATIN CAPITAL LETTER H - u'I' # 0xC9 -> LATIN CAPITAL LETTER I - u'\xad' # 0xCA -> SOFT HYPHEN - u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE - u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE - u'}' # 0xD0 -> RIGHT CURLY BRACKET - u'J' # 0xD1 -> LATIN CAPITAL LETTER J - u'K' # 0xD2 -> LATIN CAPITAL LETTER K - u'L' # 0xD3 -> LATIN CAPITAL LETTER L - u'M' # 0xD4 -> LATIN CAPITAL LETTER M - u'N' # 0xD5 -> LATIN CAPITAL LETTER N - u'O' # 0xD6 -> LATIN CAPITAL LETTER O - u'P' # 0xD7 -> LATIN CAPITAL LETTER P - u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q - u'R' # 0xD9 -> LATIN CAPITAL LETTER R - u'\xb9' # 0xDA -> SUPERSCRIPT ONE - u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE - u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\\' # 0xE0 -> REVERSE SOLIDUS - u'\xf7' # 0xE1 -> DIVISION SIGN - u'S' # 0xE2 -> LATIN CAPITAL LETTER S - u'T' # 0xE3 -> LATIN CAPITAL LETTER T - u'U' # 0xE4 -> LATIN CAPITAL LETTER U - u'V' # 0xE5 -> LATIN CAPITAL LETTER V - u'W' # 0xE6 -> LATIN CAPITAL LETTER W - u'X' # 0xE7 -> LATIN CAPITAL LETTER X - u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y - u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z - u'\xb2' # 0xEA -> SUPERSCRIPT TWO - u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE - u'0' # 0xF0 -> DIGIT ZERO - u'1' # 0xF1 -> DIGIT ONE - u'2' # 0xF2 -> DIGIT TWO - u'3' # 0xF3 -> DIGIT THREE - u'4' # 0xF4 -> DIGIT FOUR - u'5' # 0xF5 -> DIGIT FIVE - u'6' # 0xF6 -> DIGIT SIX - u'7' # 0xF7 -> DIGIT SEVEN - u'8' # 0xF8 -> DIGIT EIGHT - u'9' # 0xF9 -> DIGIT NINE - u'\xb3' # 0xFA -> SUPERSCRIPT THREE - u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE - u'\x9f' # 0xFF -> CONTROL + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\xa0' # 0x41 -> NO-BREAK SPACE + u'\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + u'[' # 0x4A -> LEFT SQUARE BRACKET + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'!' # 0x4F -> EXCLAMATION MARK + u'&' # 0x50 -> AMPERSAND + u'\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + u'\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + u'\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + u']' # 0x5A -> RIGHT SQUARE BRACKET + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'^' # 0x5F -> CIRCUMFLEX ACCENT + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xa6' # 0x6A -> BROKEN BAR + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + u'\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + u'\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + u'\xb1' # 0x8F -> PLUS-MINUS SIGN + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + u'\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + u'\xb8' # 0x9D -> CEDILLA + u'\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + u'\xa4' # 0x9F -> CURRENCY SIGN + u'\xb5' # 0xA0 -> MICRO SIGN + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + u'\xbf' # 0xAB -> INVERTED QUESTION MARK + u'\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + u'\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + u'\xae' # 0xAF -> REGISTERED SIGN + u'\xa2' # 0xB0 -> CENT SIGN + u'\xa3' # 0xB1 -> POUND SIGN + u'\xa5' # 0xB2 -> YEN SIGN + u'\xb7' # 0xB3 -> MIDDLE DOT + u'\xa9' # 0xB4 -> COPYRIGHT SIGN + u'\xa7' # 0xB5 -> SECTION SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + u'\xac' # 0xBA -> NOT SIGN + u'|' # 0xBB -> VERTICAL LINE + u'\xaf' # 0xBC -> MACRON + u'\xa8' # 0xBD -> DIAERESIS + u'\xb4' # 0xBE -> ACUTE ACCENT + u'\xd7' # 0xBF -> MULTIPLICATION SIGN + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + u'\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb9' # 0xDA -> SUPERSCRIPT ONE + u'\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + u'\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\xf7' # 0xE1 -> DIVISION SIGN + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + u'\x9f' # 0xFF -> CONTROL ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x37, # END OF TRANSMISSION - 0x0005: 0x2D, # ENQUIRY - 0x0006: 0x2E, # ACKNOWLEDGE - 0x0007: 0x2F, # BELL - 0x0008: 0x16, # BACKSPACE - 0x0009: 0x05, # HORIZONTAL TABULATION - 0x000A: 0x25, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x3C, # DEVICE CONTROL FOUR - 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x32, # SYNCHRONOUS IDLE - 0x0017: 0x26, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x3F, # SUBSTITUTE - 0x001B: 0x27, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x40, # SPACE - 0x0021: 0x4F, # EXCLAMATION MARK - 0x0022: 0x7F, # QUOTATION MARK - 0x0023: 0x7B, # NUMBER SIGN - 0x0024: 0x5B, # DOLLAR SIGN - 0x0025: 0x6C, # PERCENT SIGN - 0x0026: 0x50, # AMPERSAND - 0x0027: 0x7D, # APOSTROPHE - 0x0028: 0x4D, # LEFT PARENTHESIS - 0x0029: 0x5D, # RIGHT PARENTHESIS - 0x002A: 0x5C, # ASTERISK - 0x002B: 0x4E, # PLUS SIGN - 0x002C: 0x6B, # COMMA - 0x002D: 0x60, # HYPHEN-MINUS - 0x002E: 0x4B, # FULL STOP - 0x002F: 0x61, # SOLIDUS - 0x0030: 0xF0, # DIGIT ZERO - 0x0031: 0xF1, # DIGIT ONE - 0x0032: 0xF2, # DIGIT TWO - 0x0033: 0xF3, # DIGIT THREE - 0x0034: 0xF4, # DIGIT FOUR - 0x0035: 0xF5, # DIGIT FIVE - 0x0036: 0xF6, # DIGIT SIX - 0x0037: 0xF7, # DIGIT SEVEN - 0x0038: 0xF8, # DIGIT EIGHT - 0x0039: 0xF9, # DIGIT NINE - 0x003A: 0x7A, # COLON - 0x003B: 0x5E, # SEMICOLON - 0x003C: 0x4C, # LESS-THAN SIGN - 0x003D: 0x7E, # EQUALS SIGN - 0x003E: 0x6E, # GREATER-THAN SIGN - 0x003F: 0x6F, # QUESTION MARK - 0x0040: 0x7C, # COMMERCIAL AT - 0x0041: 0xC1, # LATIN CAPITAL LETTER A - 0x0042: 0xC2, # LATIN CAPITAL LETTER B - 0x0043: 0xC3, # LATIN CAPITAL LETTER C - 0x0044: 0xC4, # LATIN CAPITAL LETTER D - 0x0045: 0xC5, # LATIN CAPITAL LETTER E - 0x0046: 0xC6, # LATIN CAPITAL LETTER F - 0x0047: 0xC7, # LATIN CAPITAL LETTER G - 0x0048: 0xC8, # LATIN CAPITAL LETTER H - 0x0049: 0xC9, # LATIN CAPITAL LETTER I - 0x004A: 0xD1, # LATIN CAPITAL LETTER J - 0x004B: 0xD2, # LATIN CAPITAL LETTER K - 0x004C: 0xD3, # LATIN CAPITAL LETTER L - 0x004D: 0xD4, # LATIN CAPITAL LETTER M - 0x004E: 0xD5, # LATIN CAPITAL LETTER N - 0x004F: 0xD6, # LATIN CAPITAL LETTER O - 0x0050: 0xD7, # LATIN CAPITAL LETTER P - 0x0051: 0xD8, # LATIN CAPITAL LETTER Q - 0x0052: 0xD9, # LATIN CAPITAL LETTER R - 0x0053: 0xE2, # LATIN CAPITAL LETTER S - 0x0054: 0xE3, # LATIN CAPITAL LETTER T - 0x0055: 0xE4, # LATIN CAPITAL LETTER U - 0x0056: 0xE5, # LATIN CAPITAL LETTER V - 0x0057: 0xE6, # LATIN CAPITAL LETTER W - 0x0058: 0xE7, # LATIN CAPITAL LETTER X - 0x0059: 0xE8, # LATIN CAPITAL LETTER Y - 0x005A: 0xE9, # LATIN CAPITAL LETTER Z - 0x005B: 0x4A, # LEFT SQUARE BRACKET - 0x005C: 0xE0, # REVERSE SOLIDUS - 0x005D: 0x5A, # RIGHT SQUARE BRACKET - 0x005E: 0x5F, # CIRCUMFLEX ACCENT - 0x005F: 0x6D, # LOW LINE - 0x0060: 0x79, # GRAVE ACCENT - 0x0061: 0x81, # LATIN SMALL LETTER A - 0x0062: 0x82, # LATIN SMALL LETTER B - 0x0063: 0x83, # LATIN SMALL LETTER C - 0x0064: 0x84, # LATIN SMALL LETTER D - 0x0065: 0x85, # LATIN SMALL LETTER E - 0x0066: 0x86, # LATIN SMALL LETTER F - 0x0067: 0x87, # LATIN SMALL LETTER G - 0x0068: 0x88, # LATIN SMALL LETTER H - 0x0069: 0x89, # LATIN SMALL LETTER I - 0x006A: 0x91, # LATIN SMALL LETTER J - 0x006B: 0x92, # LATIN SMALL LETTER K - 0x006C: 0x93, # LATIN SMALL LETTER L - 0x006D: 0x94, # LATIN SMALL LETTER M - 0x006E: 0x95, # LATIN SMALL LETTER N - 0x006F: 0x96, # LATIN SMALL LETTER O - 0x0070: 0x97, # LATIN SMALL LETTER P - 0x0071: 0x98, # LATIN SMALL LETTER Q - 0x0072: 0x99, # LATIN SMALL LETTER R - 0x0073: 0xA2, # LATIN SMALL LETTER S - 0x0074: 0xA3, # LATIN SMALL LETTER T - 0x0075: 0xA4, # LATIN SMALL LETTER U - 0x0076: 0xA5, # LATIN SMALL LETTER V - 0x0077: 0xA6, # LATIN SMALL LETTER W - 0x0078: 0xA7, # LATIN SMALL LETTER X - 0x0079: 0xA8, # LATIN SMALL LETTER Y - 0x007A: 0xA9, # LATIN SMALL LETTER Z - 0x007B: 0xC0, # LEFT CURLY BRACKET - 0x007C: 0xBB, # VERTICAL LINE - 0x007D: 0xD0, # RIGHT CURLY BRACKET - 0x007E: 0xA1, # TILDE - 0x007F: 0x07, # DELETE - 0x0080: 0x20, # CONTROL - 0x0081: 0x21, # CONTROL - 0x0082: 0x22, # CONTROL - 0x0083: 0x23, # CONTROL - 0x0084: 0x24, # CONTROL - 0x0085: 0x15, # CONTROL - 0x0086: 0x06, # CONTROL - 0x0087: 0x17, # CONTROL - 0x0088: 0x28, # CONTROL - 0x0089: 0x29, # CONTROL - 0x008A: 0x2A, # CONTROL - 0x008B: 0x2B, # CONTROL - 0x008C: 0x2C, # CONTROL - 0x008D: 0x09, # CONTROL - 0x008E: 0x0A, # CONTROL - 0x008F: 0x1B, # CONTROL - 0x0090: 0x30, # CONTROL - 0x0091: 0x31, # CONTROL - 0x0092: 0x1A, # CONTROL - 0x0093: 0x33, # CONTROL - 0x0094: 0x34, # CONTROL - 0x0095: 0x35, # CONTROL - 0x0096: 0x36, # CONTROL - 0x0097: 0x08, # CONTROL - 0x0098: 0x38, # CONTROL - 0x0099: 0x39, # CONTROL - 0x009A: 0x3A, # CONTROL - 0x009B: 0x3B, # CONTROL - 0x009C: 0x04, # CONTROL - 0x009D: 0x14, # CONTROL - 0x009E: 0x3E, # CONTROL - 0x009F: 0xFF, # CONTROL - 0x00A0: 0x41, # NO-BREAK SPACE - 0x00A1: 0xAA, # INVERTED EXCLAMATION MARK - 0x00A2: 0xB0, # CENT SIGN - 0x00A3: 0xB1, # POUND SIGN - 0x00A4: 0x9F, # CURRENCY SIGN - 0x00A5: 0xB2, # YEN SIGN - 0x00A6: 0x6A, # BROKEN BAR - 0x00A7: 0xB5, # SECTION SIGN - 0x00A8: 0xBD, # DIAERESIS - 0x00A9: 0xB4, # COPYRIGHT SIGN - 0x00AA: 0x9A, # FEMININE ORDINAL INDICATOR - 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xBA, # NOT SIGN - 0x00AD: 0xCA, # SOFT HYPHEN - 0x00AE: 0xAF, # REGISTERED SIGN - 0x00AF: 0xBC, # MACRON - 0x00B0: 0x90, # DEGREE SIGN - 0x00B1: 0x8F, # PLUS-MINUS SIGN - 0x00B2: 0xEA, # SUPERSCRIPT TWO - 0x00B3: 0xFA, # SUPERSCRIPT THREE - 0x00B4: 0xBE, # ACUTE ACCENT - 0x00B5: 0xA0, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB3, # MIDDLE DOT - 0x00B8: 0x9D, # CEDILLA - 0x00B9: 0xDA, # SUPERSCRIPT ONE - 0x00BA: 0x9B, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF - 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xAB, # INVERTED QUESTION MARK - 0x00C0: 0x64, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0x65, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0x62, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0x66, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x63, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x67, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0x9E, # LATIN CAPITAL LIGATURE AE - 0x00C7: 0x68, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0x74, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x71, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0x72, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0x73, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0x78, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0x75, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0x76, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0x77, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D0: 0xAC, # LATIN CAPITAL LETTER ETH (ICELANDIC) - 0x00D1: 0x69, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xED, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEB, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xEF, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xEC, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xBF, # MULTIPLICATION SIGN - 0x00D8: 0x80, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xFD, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xFE, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xFB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xFC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xAD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DE: 0xAE, # LATIN CAPITAL LETTER THORN (ICELANDIC) - 0x00DF: 0x59, # LATIN SMALL LETTER SHARP S (GERMAN) - 0x00E0: 0x44, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x45, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x42, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x46, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x43, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x47, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0x9C, # LATIN SMALL LIGATURE AE - 0x00E7: 0x48, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x54, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x51, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x52, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x53, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x58, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x55, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x56, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x57, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F0: 0x8C, # LATIN SMALL LETTER ETH (ICELANDIC) - 0x00F1: 0x49, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xCD, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xCE, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xCB, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xCF, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xCC, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xE1, # DIVISION SIGN - 0x00F8: 0x70, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xDD, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xDE, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xDB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xDC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0x8D, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) - 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x37, # END OF TRANSMISSION + 0x0005: 0x2D, # ENQUIRY + 0x0006: 0x2E, # ACKNOWLEDGE + 0x0007: 0x2F, # BELL + 0x0008: 0x16, # BACKSPACE + 0x0009: 0x05, # HORIZONTAL TABULATION + 0x000A: 0x25, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x3C, # DEVICE CONTROL FOUR + 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x32, # SYNCHRONOUS IDLE + 0x0017: 0x26, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x3F, # SUBSTITUTE + 0x001B: 0x27, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x40, # SPACE + 0x0021: 0x4F, # EXCLAMATION MARK + 0x0022: 0x7F, # QUOTATION MARK + 0x0023: 0x7B, # NUMBER SIGN + 0x0024: 0x5B, # DOLLAR SIGN + 0x0025: 0x6C, # PERCENT SIGN + 0x0026: 0x50, # AMPERSAND + 0x0027: 0x7D, # APOSTROPHE + 0x0028: 0x4D, # LEFT PARENTHESIS + 0x0029: 0x5D, # RIGHT PARENTHESIS + 0x002A: 0x5C, # ASTERISK + 0x002B: 0x4E, # PLUS SIGN + 0x002C: 0x6B, # COMMA + 0x002D: 0x60, # HYPHEN-MINUS + 0x002E: 0x4B, # FULL STOP + 0x002F: 0x61, # SOLIDUS + 0x0030: 0xF0, # DIGIT ZERO + 0x0031: 0xF1, # DIGIT ONE + 0x0032: 0xF2, # DIGIT TWO + 0x0033: 0xF3, # DIGIT THREE + 0x0034: 0xF4, # DIGIT FOUR + 0x0035: 0xF5, # DIGIT FIVE + 0x0036: 0xF6, # DIGIT SIX + 0x0037: 0xF7, # DIGIT SEVEN + 0x0038: 0xF8, # DIGIT EIGHT + 0x0039: 0xF9, # DIGIT NINE + 0x003A: 0x7A, # COLON + 0x003B: 0x5E, # SEMICOLON + 0x003C: 0x4C, # LESS-THAN SIGN + 0x003D: 0x7E, # EQUALS SIGN + 0x003E: 0x6E, # GREATER-THAN SIGN + 0x003F: 0x6F, # QUESTION MARK + 0x0040: 0x7C, # COMMERCIAL AT + 0x0041: 0xC1, # LATIN CAPITAL LETTER A + 0x0042: 0xC2, # LATIN CAPITAL LETTER B + 0x0043: 0xC3, # LATIN CAPITAL LETTER C + 0x0044: 0xC4, # LATIN CAPITAL LETTER D + 0x0045: 0xC5, # LATIN CAPITAL LETTER E + 0x0046: 0xC6, # LATIN CAPITAL LETTER F + 0x0047: 0xC7, # LATIN CAPITAL LETTER G + 0x0048: 0xC8, # LATIN CAPITAL LETTER H + 0x0049: 0xC9, # LATIN CAPITAL LETTER I + 0x004A: 0xD1, # LATIN CAPITAL LETTER J + 0x004B: 0xD2, # LATIN CAPITAL LETTER K + 0x004C: 0xD3, # LATIN CAPITAL LETTER L + 0x004D: 0xD4, # LATIN CAPITAL LETTER M + 0x004E: 0xD5, # LATIN CAPITAL LETTER N + 0x004F: 0xD6, # LATIN CAPITAL LETTER O + 0x0050: 0xD7, # LATIN CAPITAL LETTER P + 0x0051: 0xD8, # LATIN CAPITAL LETTER Q + 0x0052: 0xD9, # LATIN CAPITAL LETTER R + 0x0053: 0xE2, # LATIN CAPITAL LETTER S + 0x0054: 0xE3, # LATIN CAPITAL LETTER T + 0x0055: 0xE4, # LATIN CAPITAL LETTER U + 0x0056: 0xE5, # LATIN CAPITAL LETTER V + 0x0057: 0xE6, # LATIN CAPITAL LETTER W + 0x0058: 0xE7, # LATIN CAPITAL LETTER X + 0x0059: 0xE8, # LATIN CAPITAL LETTER Y + 0x005A: 0xE9, # LATIN CAPITAL LETTER Z + 0x005B: 0x4A, # LEFT SQUARE BRACKET + 0x005C: 0xE0, # REVERSE SOLIDUS + 0x005D: 0x5A, # RIGHT SQUARE BRACKET + 0x005E: 0x5F, # CIRCUMFLEX ACCENT + 0x005F: 0x6D, # LOW LINE + 0x0060: 0x79, # GRAVE ACCENT + 0x0061: 0x81, # LATIN SMALL LETTER A + 0x0062: 0x82, # LATIN SMALL LETTER B + 0x0063: 0x83, # LATIN SMALL LETTER C + 0x0064: 0x84, # LATIN SMALL LETTER D + 0x0065: 0x85, # LATIN SMALL LETTER E + 0x0066: 0x86, # LATIN SMALL LETTER F + 0x0067: 0x87, # LATIN SMALL LETTER G + 0x0068: 0x88, # LATIN SMALL LETTER H + 0x0069: 0x89, # LATIN SMALL LETTER I + 0x006A: 0x91, # LATIN SMALL LETTER J + 0x006B: 0x92, # LATIN SMALL LETTER K + 0x006C: 0x93, # LATIN SMALL LETTER L + 0x006D: 0x94, # LATIN SMALL LETTER M + 0x006E: 0x95, # LATIN SMALL LETTER N + 0x006F: 0x96, # LATIN SMALL LETTER O + 0x0070: 0x97, # LATIN SMALL LETTER P + 0x0071: 0x98, # LATIN SMALL LETTER Q + 0x0072: 0x99, # LATIN SMALL LETTER R + 0x0073: 0xA2, # LATIN SMALL LETTER S + 0x0074: 0xA3, # LATIN SMALL LETTER T + 0x0075: 0xA4, # LATIN SMALL LETTER U + 0x0076: 0xA5, # LATIN SMALL LETTER V + 0x0077: 0xA6, # LATIN SMALL LETTER W + 0x0078: 0xA7, # LATIN SMALL LETTER X + 0x0079: 0xA8, # LATIN SMALL LETTER Y + 0x007A: 0xA9, # LATIN SMALL LETTER Z + 0x007B: 0xC0, # LEFT CURLY BRACKET + 0x007C: 0xBB, # VERTICAL LINE + 0x007D: 0xD0, # RIGHT CURLY BRACKET + 0x007E: 0xA1, # TILDE + 0x007F: 0x07, # DELETE + 0x0080: 0x20, # CONTROL + 0x0081: 0x21, # CONTROL + 0x0082: 0x22, # CONTROL + 0x0083: 0x23, # CONTROL + 0x0084: 0x24, # CONTROL + 0x0085: 0x15, # CONTROL + 0x0086: 0x06, # CONTROL + 0x0087: 0x17, # CONTROL + 0x0088: 0x28, # CONTROL + 0x0089: 0x29, # CONTROL + 0x008A: 0x2A, # CONTROL + 0x008B: 0x2B, # CONTROL + 0x008C: 0x2C, # CONTROL + 0x008D: 0x09, # CONTROL + 0x008E: 0x0A, # CONTROL + 0x008F: 0x1B, # CONTROL + 0x0090: 0x30, # CONTROL + 0x0091: 0x31, # CONTROL + 0x0092: 0x1A, # CONTROL + 0x0093: 0x33, # CONTROL + 0x0094: 0x34, # CONTROL + 0x0095: 0x35, # CONTROL + 0x0096: 0x36, # CONTROL + 0x0097: 0x08, # CONTROL + 0x0098: 0x38, # CONTROL + 0x0099: 0x39, # CONTROL + 0x009A: 0x3A, # CONTROL + 0x009B: 0x3B, # CONTROL + 0x009C: 0x04, # CONTROL + 0x009D: 0x14, # CONTROL + 0x009E: 0x3E, # CONTROL + 0x009F: 0xFF, # CONTROL + 0x00A0: 0x41, # NO-BREAK SPACE + 0x00A1: 0xAA, # INVERTED EXCLAMATION MARK + 0x00A2: 0xB0, # CENT SIGN + 0x00A3: 0xB1, # POUND SIGN + 0x00A4: 0x9F, # CURRENCY SIGN + 0x00A5: 0xB2, # YEN SIGN + 0x00A6: 0x6A, # BROKEN BAR + 0x00A7: 0xB5, # SECTION SIGN + 0x00A8: 0xBD, # DIAERESIS + 0x00A9: 0xB4, # COPYRIGHT SIGN + 0x00AA: 0x9A, # FEMININE ORDINAL INDICATOR + 0x00AB: 0x8A, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xBA, # NOT SIGN + 0x00AD: 0xCA, # SOFT HYPHEN + 0x00AE: 0xAF, # REGISTERED SIGN + 0x00AF: 0xBC, # MACRON + 0x00B0: 0x90, # DEGREE SIGN + 0x00B1: 0x8F, # PLUS-MINUS SIGN + 0x00B2: 0xEA, # SUPERSCRIPT TWO + 0x00B3: 0xFA, # SUPERSCRIPT THREE + 0x00B4: 0xBE, # ACUTE ACCENT + 0x00B5: 0xA0, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB3, # MIDDLE DOT + 0x00B8: 0x9D, # CEDILLA + 0x00B9: 0xDA, # SUPERSCRIPT ONE + 0x00BA: 0x9B, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0x8B, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xB7, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xB8, # VULGAR FRACTION ONE HALF + 0x00BE: 0xB9, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xAB, # INVERTED QUESTION MARK + 0x00C0: 0x64, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0x65, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0x62, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0x66, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x63, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x67, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0x9E, # LATIN CAPITAL LIGATURE AE + 0x00C7: 0x68, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0x74, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x71, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0x72, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0x73, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0x78, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0x75, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0x76, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0x77, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0: 0xAC, # LATIN CAPITAL LETTER ETH (ICELANDIC) + 0x00D1: 0x69, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xED, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEB, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xEF, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xEC, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xBF, # MULTIPLICATION SIGN + 0x00D8: 0x80, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xFD, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xFE, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xFB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xFC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xAD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE: 0xAE, # LATIN CAPITAL LETTER THORN (ICELANDIC) + 0x00DF: 0x59, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00E0: 0x44, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x45, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x42, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x46, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x43, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x47, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0x9C, # LATIN SMALL LIGATURE AE + 0x00E7: 0x48, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x54, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x51, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x52, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x53, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x58, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x55, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x56, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x57, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0: 0x8C, # LATIN SMALL LETTER ETH (ICELANDIC) + 0x00F1: 0x49, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xCD, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xCE, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xCB, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xCF, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xCC, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xE1, # DIVISION SIGN + 0x00F8: 0x70, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xDD, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xDE, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xDB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xDC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0x8D, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) + 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS } - Modified: python/trunk/Lib/encodings/cp737.py ============================================================================== --- python/trunk/Lib/encodings/cp737.py (original) +++ python/trunk/Lib/encodings/cp737.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x0391, # GREEK CAPITAL LETTER ALPHA - 0x0081: 0x0392, # GREEK CAPITAL LETTER BETA - 0x0082: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x0083: 0x0394, # GREEK CAPITAL LETTER DELTA - 0x0084: 0x0395, # GREEK CAPITAL LETTER EPSILON - 0x0085: 0x0396, # GREEK CAPITAL LETTER ZETA - 0x0086: 0x0397, # GREEK CAPITAL LETTER ETA - 0x0087: 0x0398, # GREEK CAPITAL LETTER THETA - 0x0088: 0x0399, # GREEK CAPITAL LETTER IOTA - 0x0089: 0x039a, # GREEK CAPITAL LETTER KAPPA - 0x008a: 0x039b, # GREEK CAPITAL LETTER LAMDA - 0x008b: 0x039c, # GREEK CAPITAL LETTER MU - 0x008c: 0x039d, # GREEK CAPITAL LETTER NU - 0x008d: 0x039e, # GREEK CAPITAL LETTER XI - 0x008e: 0x039f, # GREEK CAPITAL LETTER OMICRON - 0x008f: 0x03a0, # GREEK CAPITAL LETTER PI - 0x0090: 0x03a1, # GREEK CAPITAL LETTER RHO - 0x0091: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x0092: 0x03a4, # GREEK CAPITAL LETTER TAU - 0x0093: 0x03a5, # GREEK CAPITAL LETTER UPSILON - 0x0094: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x0095: 0x03a7, # GREEK CAPITAL LETTER CHI - 0x0096: 0x03a8, # GREEK CAPITAL LETTER PSI - 0x0097: 0x03a9, # GREEK CAPITAL LETTER OMEGA - 0x0098: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x0099: 0x03b2, # GREEK SMALL LETTER BETA - 0x009a: 0x03b3, # GREEK SMALL LETTER GAMMA - 0x009b: 0x03b4, # GREEK SMALL LETTER DELTA - 0x009c: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x009d: 0x03b6, # GREEK SMALL LETTER ZETA - 0x009e: 0x03b7, # GREEK SMALL LETTER ETA - 0x009f: 0x03b8, # GREEK SMALL LETTER THETA - 0x00a0: 0x03b9, # GREEK SMALL LETTER IOTA - 0x00a1: 0x03ba, # GREEK SMALL LETTER KAPPA - 0x00a2: 0x03bb, # GREEK SMALL LETTER LAMDA - 0x00a3: 0x03bc, # GREEK SMALL LETTER MU - 0x00a4: 0x03bd, # GREEK SMALL LETTER NU - 0x00a5: 0x03be, # GREEK SMALL LETTER XI - 0x00a6: 0x03bf, # GREEK SMALL LETTER OMICRON - 0x00a7: 0x03c0, # GREEK SMALL LETTER PI - 0x00a8: 0x03c1, # GREEK SMALL LETTER RHO - 0x00a9: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x00aa: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA - 0x00ab: 0x03c4, # GREEK SMALL LETTER TAU - 0x00ac: 0x03c5, # GREEK SMALL LETTER UPSILON - 0x00ad: 0x03c6, # GREEK SMALL LETTER PHI - 0x00ae: 0x03c7, # GREEK SMALL LETTER CHI - 0x00af: 0x03c8, # GREEK SMALL LETTER PSI - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x03c9, # GREEK SMALL LETTER OMEGA - 0x00e1: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS - 0x00e2: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS - 0x00e3: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS - 0x00e4: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x00e5: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS - 0x00e6: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS - 0x00e7: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS - 0x00e8: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x00e9: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS - 0x00ea: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x00eb: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x00ec: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS - 0x00ed: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS - 0x00ee: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x00ef: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x00f0: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO - 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO - 0x00f4: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x00f5: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x2248, # ALMOST EQUAL TO - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x221a, # SQUARE ROOT - 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x0081: 0x0392, # GREEK CAPITAL LETTER BETA + 0x0082: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x0083: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x0084: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x0085: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x0086: 0x0397, # GREEK CAPITAL LETTER ETA + 0x0087: 0x0398, # GREEK CAPITAL LETTER THETA + 0x0088: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x0089: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x008a: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x008b: 0x039c, # GREEK CAPITAL LETTER MU + 0x008c: 0x039d, # GREEK CAPITAL LETTER NU + 0x008d: 0x039e, # GREEK CAPITAL LETTER XI + 0x008e: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x008f: 0x03a0, # GREEK CAPITAL LETTER PI + 0x0090: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x0091: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x0092: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x0093: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x0094: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x0095: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x0096: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x0097: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x0098: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x0099: 0x03b2, # GREEK SMALL LETTER BETA + 0x009a: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x009b: 0x03b4, # GREEK SMALL LETTER DELTA + 0x009c: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x009d: 0x03b6, # GREEK SMALL LETTER ZETA + 0x009e: 0x03b7, # GREEK SMALL LETTER ETA + 0x009f: 0x03b8, # GREEK SMALL LETTER THETA + 0x00a0: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00a1: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00a2: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00a3: 0x03bc, # GREEK SMALL LETTER MU + 0x00a4: 0x03bd, # GREEK SMALL LETTER NU + 0x00a5: 0x03be, # GREEK SMALL LETTER XI + 0x00a6: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00a7: 0x03c0, # GREEK SMALL LETTER PI + 0x00a8: 0x03c1, # GREEK SMALL LETTER RHO + 0x00a9: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00aa: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ab: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ac: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00ad: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ae: 0x03c7, # GREEK SMALL LETTER CHI + 0x00af: 0x03c8, # GREEK SMALL LETTER PSI + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00e1: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00e2: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00e3: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00e4: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00e5: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00e6: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00e7: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00e8: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00e9: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ea: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00eb: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00ec: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00ed: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00ee: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00ef: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00f0: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00f5: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\u0391' # 0x0080 -> GREEK CAPITAL LETTER ALPHA - u'\u0392' # 0x0081 -> GREEK CAPITAL LETTER BETA - u'\u0393' # 0x0082 -> GREEK CAPITAL LETTER GAMMA - u'\u0394' # 0x0083 -> GREEK CAPITAL LETTER DELTA - u'\u0395' # 0x0084 -> GREEK CAPITAL LETTER EPSILON - u'\u0396' # 0x0085 -> GREEK CAPITAL LETTER ZETA - u'\u0397' # 0x0086 -> GREEK CAPITAL LETTER ETA - u'\u0398' # 0x0087 -> GREEK CAPITAL LETTER THETA - u'\u0399' # 0x0088 -> GREEK CAPITAL LETTER IOTA - u'\u039a' # 0x0089 -> GREEK CAPITAL LETTER KAPPA - u'\u039b' # 0x008a -> GREEK CAPITAL LETTER LAMDA - u'\u039c' # 0x008b -> GREEK CAPITAL LETTER MU - u'\u039d' # 0x008c -> GREEK CAPITAL LETTER NU - u'\u039e' # 0x008d -> GREEK CAPITAL LETTER XI - u'\u039f' # 0x008e -> GREEK CAPITAL LETTER OMICRON - u'\u03a0' # 0x008f -> GREEK CAPITAL LETTER PI - u'\u03a1' # 0x0090 -> GREEK CAPITAL LETTER RHO - u'\u03a3' # 0x0091 -> GREEK CAPITAL LETTER SIGMA - u'\u03a4' # 0x0092 -> GREEK CAPITAL LETTER TAU - u'\u03a5' # 0x0093 -> GREEK CAPITAL LETTER UPSILON - u'\u03a6' # 0x0094 -> GREEK CAPITAL LETTER PHI - u'\u03a7' # 0x0095 -> GREEK CAPITAL LETTER CHI - u'\u03a8' # 0x0096 -> GREEK CAPITAL LETTER PSI - u'\u03a9' # 0x0097 -> GREEK CAPITAL LETTER OMEGA - u'\u03b1' # 0x0098 -> GREEK SMALL LETTER ALPHA - u'\u03b2' # 0x0099 -> GREEK SMALL LETTER BETA - u'\u03b3' # 0x009a -> GREEK SMALL LETTER GAMMA - u'\u03b4' # 0x009b -> GREEK SMALL LETTER DELTA - u'\u03b5' # 0x009c -> GREEK SMALL LETTER EPSILON - u'\u03b6' # 0x009d -> GREEK SMALL LETTER ZETA - u'\u03b7' # 0x009e -> GREEK SMALL LETTER ETA - u'\u03b8' # 0x009f -> GREEK SMALL LETTER THETA - u'\u03b9' # 0x00a0 -> GREEK SMALL LETTER IOTA - u'\u03ba' # 0x00a1 -> GREEK SMALL LETTER KAPPA - u'\u03bb' # 0x00a2 -> GREEK SMALL LETTER LAMDA - u'\u03bc' # 0x00a3 -> GREEK SMALL LETTER MU - u'\u03bd' # 0x00a4 -> GREEK SMALL LETTER NU - u'\u03be' # 0x00a5 -> GREEK SMALL LETTER XI - u'\u03bf' # 0x00a6 -> GREEK SMALL LETTER OMICRON - u'\u03c0' # 0x00a7 -> GREEK SMALL LETTER PI - u'\u03c1' # 0x00a8 -> GREEK SMALL LETTER RHO - u'\u03c3' # 0x00a9 -> GREEK SMALL LETTER SIGMA - u'\u03c2' # 0x00aa -> GREEK SMALL LETTER FINAL SIGMA - u'\u03c4' # 0x00ab -> GREEK SMALL LETTER TAU - u'\u03c5' # 0x00ac -> GREEK SMALL LETTER UPSILON - u'\u03c6' # 0x00ad -> GREEK SMALL LETTER PHI - u'\u03c7' # 0x00ae -> GREEK SMALL LETTER CHI - u'\u03c8' # 0x00af -> GREEK SMALL LETTER PSI - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u03c9' # 0x00e0 -> GREEK SMALL LETTER OMEGA - u'\u03ac' # 0x00e1 -> GREEK SMALL LETTER ALPHA WITH TONOS - u'\u03ad' # 0x00e2 -> GREEK SMALL LETTER EPSILON WITH TONOS - u'\u03ae' # 0x00e3 -> GREEK SMALL LETTER ETA WITH TONOS - u'\u03ca' # 0x00e4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA - u'\u03af' # 0x00e5 -> GREEK SMALL LETTER IOTA WITH TONOS - u'\u03cc' # 0x00e6 -> GREEK SMALL LETTER OMICRON WITH TONOS - u'\u03cd' # 0x00e7 -> GREEK SMALL LETTER UPSILON WITH TONOS - u'\u03cb' # 0x00e8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA - u'\u03ce' # 0x00e9 -> GREEK SMALL LETTER OMEGA WITH TONOS - u'\u0386' # 0x00ea -> GREEK CAPITAL LETTER ALPHA WITH TONOS - u'\u0388' # 0x00eb -> GREEK CAPITAL LETTER EPSILON WITH TONOS - u'\u0389' # 0x00ec -> GREEK CAPITAL LETTER ETA WITH TONOS - u'\u038a' # 0x00ed -> GREEK CAPITAL LETTER IOTA WITH TONOS - u'\u038c' # 0x00ee -> GREEK CAPITAL LETTER OMICRON WITH TONOS - u'\u038e' # 0x00ef -> GREEK CAPITAL LETTER UPSILON WITH TONOS - u'\u038f' # 0x00f0 -> GREEK CAPITAL LETTER OMEGA WITH TONOS - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO - u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO - u'\u03aa' # 0x00f4 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - u'\u03ab' # 0x00f5 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\u2248' # 0x00f7 -> ALMOST EQUAL TO - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\u221a' # 0x00fb -> SQUARE ROOT - u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u0391' # 0x0080 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0x0081 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0x0082 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0x0083 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0x0084 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0x0085 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0x0086 -> GREEK CAPITAL LETTER ETA + u'\u0398' # 0x0087 -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0x0088 -> GREEK CAPITAL LETTER IOTA + u'\u039a' # 0x0089 -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0x008a -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0x008b -> GREEK CAPITAL LETTER MU + u'\u039d' # 0x008c -> GREEK CAPITAL LETTER NU + u'\u039e' # 0x008d -> GREEK CAPITAL LETTER XI + u'\u039f' # 0x008e -> GREEK CAPITAL LETTER OMICRON + u'\u03a0' # 0x008f -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0x0090 -> GREEK CAPITAL LETTER RHO + u'\u03a3' # 0x0091 -> GREEK CAPITAL LETTER SIGMA + u'\u03a4' # 0x0092 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0x0093 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0x0094 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0x0095 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0x0096 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0x0097 -> GREEK CAPITAL LETTER OMEGA + u'\u03b1' # 0x0098 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0x0099 -> GREEK SMALL LETTER BETA + u'\u03b3' # 0x009a -> GREEK SMALL LETTER GAMMA + u'\u03b4' # 0x009b -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0x009c -> GREEK SMALL LETTER EPSILON + u'\u03b6' # 0x009d -> GREEK SMALL LETTER ZETA + u'\u03b7' # 0x009e -> GREEK SMALL LETTER ETA + u'\u03b8' # 0x009f -> GREEK SMALL LETTER THETA + u'\u03b9' # 0x00a0 -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0x00a1 -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0x00a2 -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0x00a3 -> GREEK SMALL LETTER MU + u'\u03bd' # 0x00a4 -> GREEK SMALL LETTER NU + u'\u03be' # 0x00a5 -> GREEK SMALL LETTER XI + u'\u03bf' # 0x00a6 -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0x00a7 -> GREEK SMALL LETTER PI + u'\u03c1' # 0x00a8 -> GREEK SMALL LETTER RHO + u'\u03c3' # 0x00a9 -> GREEK SMALL LETTER SIGMA + u'\u03c2' # 0x00aa -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c4' # 0x00ab -> GREEK SMALL LETTER TAU + u'\u03c5' # 0x00ac -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0x00ad -> GREEK SMALL LETTER PHI + u'\u03c7' # 0x00ae -> GREEK SMALL LETTER CHI + u'\u03c8' # 0x00af -> GREEK SMALL LETTER PSI + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03c9' # 0x00e0 -> GREEK SMALL LETTER OMEGA + u'\u03ac' # 0x00e1 -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u03ad' # 0x00e2 -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0x00e3 -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03ca' # 0x00e4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03af' # 0x00e5 -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03cc' # 0x00e6 -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0x00e7 -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03cb' # 0x00e8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03ce' # 0x00e9 -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u0386' # 0x00ea -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\u0388' # 0x00eb -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0389' # 0x00ec -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0x00ed -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\u038c' # 0x00ee -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\u038e' # 0x00ef -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u038f' # 0x00f0 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u03aa' # 0x00f4 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u03ab' # 0x00f5 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00f7: 0x00f6, # DIVISION SIGN - 0x0386: 0x00ea, # GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x0388: 0x00eb, # GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x0389: 0x00ec, # GREEK CAPITAL LETTER ETA WITH TONOS - 0x038a: 0x00ed, # GREEK CAPITAL LETTER IOTA WITH TONOS - 0x038c: 0x00ee, # GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x038e: 0x00ef, # GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x038f: 0x00f0, # GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x0391: 0x0080, # GREEK CAPITAL LETTER ALPHA - 0x0392: 0x0081, # GREEK CAPITAL LETTER BETA - 0x0393: 0x0082, # GREEK CAPITAL LETTER GAMMA - 0x0394: 0x0083, # GREEK CAPITAL LETTER DELTA - 0x0395: 0x0084, # GREEK CAPITAL LETTER EPSILON - 0x0396: 0x0085, # GREEK CAPITAL LETTER ZETA - 0x0397: 0x0086, # GREEK CAPITAL LETTER ETA - 0x0398: 0x0087, # GREEK CAPITAL LETTER THETA - 0x0399: 0x0088, # GREEK CAPITAL LETTER IOTA - 0x039a: 0x0089, # GREEK CAPITAL LETTER KAPPA - 0x039b: 0x008a, # GREEK CAPITAL LETTER LAMDA - 0x039c: 0x008b, # GREEK CAPITAL LETTER MU - 0x039d: 0x008c, # GREEK CAPITAL LETTER NU - 0x039e: 0x008d, # GREEK CAPITAL LETTER XI - 0x039f: 0x008e, # GREEK CAPITAL LETTER OMICRON - 0x03a0: 0x008f, # GREEK CAPITAL LETTER PI - 0x03a1: 0x0090, # GREEK CAPITAL LETTER RHO - 0x03a3: 0x0091, # GREEK CAPITAL LETTER SIGMA - 0x03a4: 0x0092, # GREEK CAPITAL LETTER TAU - 0x03a5: 0x0093, # GREEK CAPITAL LETTER UPSILON - 0x03a6: 0x0094, # GREEK CAPITAL LETTER PHI - 0x03a7: 0x0095, # GREEK CAPITAL LETTER CHI - 0x03a8: 0x0096, # GREEK CAPITAL LETTER PSI - 0x03a9: 0x0097, # GREEK CAPITAL LETTER OMEGA - 0x03aa: 0x00f4, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x03ab: 0x00f5, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x03ac: 0x00e1, # GREEK SMALL LETTER ALPHA WITH TONOS - 0x03ad: 0x00e2, # GREEK SMALL LETTER EPSILON WITH TONOS - 0x03ae: 0x00e3, # GREEK SMALL LETTER ETA WITH TONOS - 0x03af: 0x00e5, # GREEK SMALL LETTER IOTA WITH TONOS - 0x03b1: 0x0098, # GREEK SMALL LETTER ALPHA - 0x03b2: 0x0099, # GREEK SMALL LETTER BETA - 0x03b3: 0x009a, # GREEK SMALL LETTER GAMMA - 0x03b4: 0x009b, # GREEK SMALL LETTER DELTA - 0x03b5: 0x009c, # GREEK SMALL LETTER EPSILON - 0x03b6: 0x009d, # GREEK SMALL LETTER ZETA - 0x03b7: 0x009e, # GREEK SMALL LETTER ETA - 0x03b8: 0x009f, # GREEK SMALL LETTER THETA - 0x03b9: 0x00a0, # GREEK SMALL LETTER IOTA - 0x03ba: 0x00a1, # GREEK SMALL LETTER KAPPA - 0x03bb: 0x00a2, # GREEK SMALL LETTER LAMDA - 0x03bc: 0x00a3, # GREEK SMALL LETTER MU - 0x03bd: 0x00a4, # GREEK SMALL LETTER NU - 0x03be: 0x00a5, # GREEK SMALL LETTER XI - 0x03bf: 0x00a6, # GREEK SMALL LETTER OMICRON - 0x03c0: 0x00a7, # GREEK SMALL LETTER PI - 0x03c1: 0x00a8, # GREEK SMALL LETTER RHO - 0x03c2: 0x00aa, # GREEK SMALL LETTER FINAL SIGMA - 0x03c3: 0x00a9, # GREEK SMALL LETTER SIGMA - 0x03c4: 0x00ab, # GREEK SMALL LETTER TAU - 0x03c5: 0x00ac, # GREEK SMALL LETTER UPSILON - 0x03c6: 0x00ad, # GREEK SMALL LETTER PHI - 0x03c7: 0x00ae, # GREEK SMALL LETTER CHI - 0x03c8: 0x00af, # GREEK SMALL LETTER PSI - 0x03c9: 0x00e0, # GREEK SMALL LETTER OMEGA - 0x03ca: 0x00e4, # GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x03cb: 0x00e8, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x03cc: 0x00e6, # GREEK SMALL LETTER OMICRON WITH TONOS - 0x03cd: 0x00e7, # GREEK SMALL LETTER UPSILON WITH TONOS - 0x03ce: 0x00e9, # GREEK SMALL LETTER OMEGA WITH TONOS - 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N - 0x2219: 0x00f9, # BULLET OPERATOR - 0x221a: 0x00fb, # SQUARE ROOT - 0x2248: 0x00f7, # ALMOST EQUAL TO - 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO - 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00f7: 0x00f6, # DIVISION SIGN + 0x0386: 0x00ea, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x00eb, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x00ec, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x00ed, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x00ee, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x00ef, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x00f0, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0391: 0x0080, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x0081, # GREEK CAPITAL LETTER BETA + 0x0393: 0x0082, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x0083, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x0084, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x0085, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x0086, # GREEK CAPITAL LETTER ETA + 0x0398: 0x0087, # GREEK CAPITAL LETTER THETA + 0x0399: 0x0088, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x0089, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x008a, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x008b, # GREEK CAPITAL LETTER MU + 0x039d: 0x008c, # GREEK CAPITAL LETTER NU + 0x039e: 0x008d, # GREEK CAPITAL LETTER XI + 0x039f: 0x008e, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x008f, # GREEK CAPITAL LETTER PI + 0x03a1: 0x0090, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x0091, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x0092, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x0093, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x0094, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x0095, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x0096, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x0097, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x00f4, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x00f5, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x00e1, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x00e2, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x00e3, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x00e5, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b1: 0x0098, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x0099, # GREEK SMALL LETTER BETA + 0x03b3: 0x009a, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x009b, # GREEK SMALL LETTER DELTA + 0x03b5: 0x009c, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x009d, # GREEK SMALL LETTER ZETA + 0x03b7: 0x009e, # GREEK SMALL LETTER ETA + 0x03b8: 0x009f, # GREEK SMALL LETTER THETA + 0x03b9: 0x00a0, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00a1, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00a2, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00a3, # GREEK SMALL LETTER MU + 0x03bd: 0x00a4, # GREEK SMALL LETTER NU + 0x03be: 0x00a5, # GREEK SMALL LETTER XI + 0x03bf: 0x00a6, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00a7, # GREEK SMALL LETTER PI + 0x03c1: 0x00a8, # GREEK SMALL LETTER RHO + 0x03c2: 0x00aa, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00a9, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ab, # GREEK SMALL LETTER TAU + 0x03c5: 0x00ac, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00ad, # GREEK SMALL LETTER PHI + 0x03c7: 0x00ae, # GREEK SMALL LETTER CHI + 0x03c8: 0x00af, # GREEK SMALL LETTER PSI + 0x03c9: 0x00e0, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00e4, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00e8, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00e6, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00e7, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00e9, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp775.py ============================================================================== --- python/trunk/Lib/encodings/cp775.py (original) +++ python/trunk/Lib/encodings/cp775.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x0101, # LATIN SMALL LETTER A WITH MACRON - 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x0085: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA - 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x0087: 0x0107, # LATIN SMALL LETTER C WITH ACUTE - 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE - 0x0089: 0x0113, # LATIN SMALL LETTER E WITH MACRON - 0x008a: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA - 0x008b: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA - 0x008c: 0x012b, # LATIN SMALL LETTER I WITH MACRON - 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE - 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE - 0x0093: 0x014d, # LATIN SMALL LETTER O WITH MACRON - 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x0095: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA - 0x0096: 0x00a2, # CENT SIGN - 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE - 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE - 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE - 0x009e: 0x00d7, # MULTIPLICATION SIGN - 0x009f: 0x00a4, # CURRENCY SIGN - 0x00a0: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON - 0x00a1: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x00a4: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x00a5: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE - 0x00a6: 0x201d, # RIGHT DOUBLE QUOTATION MARK - 0x00a7: 0x00a6, # BROKEN BAR - 0x00a8: 0x00a9, # COPYRIGHT SIGN - 0x00a9: 0x00ae, # REGISTERED SIGN - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK - 0x00b6: 0x010c, # LATIN CAPITAL LETTER C WITH CARON - 0x00b7: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK - 0x00b8: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK - 0x00be: 0x0160, # LATIN CAPITAL LETTER S WITH CARON - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK - 0x00c7: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON - 0x00d0: 0x0105, # LATIN SMALL LETTER A WITH OGONEK - 0x00d1: 0x010d, # LATIN SMALL LETTER C WITH CARON - 0x00d2: 0x0119, # LATIN SMALL LETTER E WITH OGONEK - 0x00d3: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE - 0x00d4: 0x012f, # LATIN SMALL LETTER I WITH OGONEK - 0x00d5: 0x0161, # LATIN SMALL LETTER S WITH CARON - 0x00d6: 0x0173, # LATIN SMALL LETTER U WITH OGONEK - 0x00d7: 0x016b, # LATIN SMALL LETTER U WITH MACRON - 0x00d8: 0x017e, # LATIN SMALL LETTER Z WITH CARON - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) - 0x00e2: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON - 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE - 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE - 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: 0x0144, # LATIN SMALL LETTER N WITH ACUTE - 0x00e8: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA - 0x00e9: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA - 0x00ea: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA - 0x00eb: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA - 0x00ec: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA - 0x00ed: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON - 0x00ee: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA - 0x00ef: 0x2019, # RIGHT SINGLE QUOTATION MARK - 0x00f0: 0x00ad, # SOFT HYPHEN - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x201c, # LEFT DOUBLE QUOTATION MARK - 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS - 0x00f4: 0x00b6, # PILCROW SIGN - 0x00f5: 0x00a7, # SECTION SIGN - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x201e, # DOUBLE LOW-9 QUOTATION MARK - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x00b9, # SUPERSCRIPT ONE - 0x00fc: 0x00b3, # SUPERSCRIPT THREE - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x008a: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x008b: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x008c: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0096: 0x00a2, # CENT SIGN + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00a1: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00a4: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00a5: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00a6: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00a7: 0x00a6, # BROKEN BAR + 0x00a8: 0x00a9, # COPYRIGHT SIGN + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00b6: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00b7: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00b8: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00be: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00c7: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00d0: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00d1: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00d2: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00d3: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00d4: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00d5: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00d6: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00d7: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00d8: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e8: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00e9: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00ea: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00eb: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00ec: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00ed: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00ee: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00ef: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\u0106' # 0x0080 -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\u0101' # 0x0083 -> LATIN SMALL LETTER A WITH MACRON - u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u0123' # 0x0085 -> LATIN SMALL LETTER G WITH CEDILLA - u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\u0107' # 0x0087 -> LATIN SMALL LETTER C WITH ACUTE - u'\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE - u'\u0113' # 0x0089 -> LATIN SMALL LETTER E WITH MACRON - u'\u0156' # 0x008a -> LATIN CAPITAL LETTER R WITH CEDILLA - u'\u0157' # 0x008b -> LATIN SMALL LETTER R WITH CEDILLA - u'\u012b' # 0x008c -> LATIN SMALL LETTER I WITH MACRON - u'\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE - u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE - u'\u014d' # 0x0093 -> LATIN SMALL LETTER O WITH MACRON - u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\u0122' # 0x0095 -> LATIN CAPITAL LETTER G WITH CEDILLA - u'\xa2' # 0x0096 -> CENT SIGN - u'\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE - u'\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE - u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE - u'\xa3' # 0x009c -> POUND SIGN - u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd7' # 0x009e -> MULTIPLICATION SIGN - u'\xa4' # 0x009f -> CURRENCY SIGN - u'\u0100' # 0x00a0 -> LATIN CAPITAL LETTER A WITH MACRON - u'\u012a' # 0x00a1 -> LATIN CAPITAL LETTER I WITH MACRON - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\u017b' # 0x00a3 -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\u017c' # 0x00a4 -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\u017a' # 0x00a5 -> LATIN SMALL LETTER Z WITH ACUTE - u'\u201d' # 0x00a6 -> RIGHT DOUBLE QUOTATION MARK - u'\xa6' # 0x00a7 -> BROKEN BAR - u'\xa9' # 0x00a8 -> COPYRIGHT SIGN - u'\xae' # 0x00a9 -> REGISTERED SIGN - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\u0141' # 0x00ad -> LATIN CAPITAL LETTER L WITH STROKE - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u0104' # 0x00b5 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\u010c' # 0x00b6 -> LATIN CAPITAL LETTER C WITH CARON - u'\u0118' # 0x00b7 -> LATIN CAPITAL LETTER E WITH OGONEK - u'\u0116' # 0x00b8 -> LATIN CAPITAL LETTER E WITH DOT ABOVE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u012e' # 0x00bd -> LATIN CAPITAL LETTER I WITH OGONEK - u'\u0160' # 0x00be -> LATIN CAPITAL LETTER S WITH CARON - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u0172' # 0x00c6 -> LATIN CAPITAL LETTER U WITH OGONEK - u'\u016a' # 0x00c7 -> LATIN CAPITAL LETTER U WITH MACRON - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u017d' # 0x00cf -> LATIN CAPITAL LETTER Z WITH CARON - u'\u0105' # 0x00d0 -> LATIN SMALL LETTER A WITH OGONEK - u'\u010d' # 0x00d1 -> LATIN SMALL LETTER C WITH CARON - u'\u0119' # 0x00d2 -> LATIN SMALL LETTER E WITH OGONEK - u'\u0117' # 0x00d3 -> LATIN SMALL LETTER E WITH DOT ABOVE - u'\u012f' # 0x00d4 -> LATIN SMALL LETTER I WITH OGONEK - u'\u0161' # 0x00d5 -> LATIN SMALL LETTER S WITH CARON - u'\u0173' # 0x00d6 -> LATIN SMALL LETTER U WITH OGONEK - u'\u016b' # 0x00d7 -> LATIN SMALL LETTER U WITH MACRON - u'\u017e' # 0x00d8 -> LATIN SMALL LETTER Z WITH CARON - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) - u'\u014c' # 0x00e2 -> LATIN CAPITAL LETTER O WITH MACRON - u'\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE - u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\u0144' # 0x00e7 -> LATIN SMALL LETTER N WITH ACUTE - u'\u0136' # 0x00e8 -> LATIN CAPITAL LETTER K WITH CEDILLA - u'\u0137' # 0x00e9 -> LATIN SMALL LETTER K WITH CEDILLA - u'\u013b' # 0x00ea -> LATIN CAPITAL LETTER L WITH CEDILLA - u'\u013c' # 0x00eb -> LATIN SMALL LETTER L WITH CEDILLA - u'\u0146' # 0x00ec -> LATIN SMALL LETTER N WITH CEDILLA - u'\u0112' # 0x00ed -> LATIN CAPITAL LETTER E WITH MACRON - u'\u0145' # 0x00ee -> LATIN CAPITAL LETTER N WITH CEDILLA - u'\u2019' # 0x00ef -> RIGHT SINGLE QUOTATION MARK - u'\xad' # 0x00f0 -> SOFT HYPHEN - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u201c' # 0x00f2 -> LEFT DOUBLE QUOTATION MARK - u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS - u'\xb6' # 0x00f4 -> PILCROW SIGN - u'\xa7' # 0x00f5 -> SECTION SIGN - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\u201e' # 0x00f7 -> DOUBLE LOW-9 QUOTATION MARK - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\xb9' # 0x00fb -> SUPERSCRIPT ONE - u'\xb3' # 0x00fc -> SUPERSCRIPT THREE - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u0106' # 0x0080 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0101' # 0x0083 -> LATIN SMALL LETTER A WITH MACRON + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u0123' # 0x0085 -> LATIN SMALL LETTER G WITH CEDILLA + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\u0107' # 0x0087 -> LATIN SMALL LETTER C WITH ACUTE + u'\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + u'\u0113' # 0x0089 -> LATIN SMALL LETTER E WITH MACRON + u'\u0156' # 0x008a -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\u0157' # 0x008b -> LATIN SMALL LETTER R WITH CEDILLA + u'\u012b' # 0x008c -> LATIN SMALL LETTER I WITH MACRON + u'\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\u014d' # 0x0093 -> LATIN SMALL LETTER O WITH MACRON + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u0122' # 0x0095 -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\xa2' # 0x0096 -> CENT SIGN + u'\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd7' # 0x009e -> MULTIPLICATION SIGN + u'\xa4' # 0x009f -> CURRENCY SIGN + u'\u0100' # 0x00a0 -> LATIN CAPITAL LETTER A WITH MACRON + u'\u012a' # 0x00a1 -> LATIN CAPITAL LETTER I WITH MACRON + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\u017b' # 0x00a3 -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u017c' # 0x00a4 -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u017a' # 0x00a5 -> LATIN SMALL LETTER Z WITH ACUTE + u'\u201d' # 0x00a6 -> RIGHT DOUBLE QUOTATION MARK + u'\xa6' # 0x00a7 -> BROKEN BAR + u'\xa9' # 0x00a8 -> COPYRIGHT SIGN + u'\xae' # 0x00a9 -> REGISTERED SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\u0141' # 0x00ad -> LATIN CAPITAL LETTER L WITH STROKE + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u0104' # 0x00b5 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u010c' # 0x00b6 -> LATIN CAPITAL LETTER C WITH CARON + u'\u0118' # 0x00b7 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u0116' # 0x00b8 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u012e' # 0x00bd -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u0160' # 0x00be -> LATIN CAPITAL LETTER S WITH CARON + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u0172' # 0x00c6 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\u016a' # 0x00c7 -> LATIN CAPITAL LETTER U WITH MACRON + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u017d' # 0x00cf -> LATIN CAPITAL LETTER Z WITH CARON + u'\u0105' # 0x00d0 -> LATIN SMALL LETTER A WITH OGONEK + u'\u010d' # 0x00d1 -> LATIN SMALL LETTER C WITH CARON + u'\u0119' # 0x00d2 -> LATIN SMALL LETTER E WITH OGONEK + u'\u0117' # 0x00d3 -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\u012f' # 0x00d4 -> LATIN SMALL LETTER I WITH OGONEK + u'\u0161' # 0x00d5 -> LATIN SMALL LETTER S WITH CARON + u'\u0173' # 0x00d6 -> LATIN SMALL LETTER U WITH OGONEK + u'\u016b' # 0x00d7 -> LATIN SMALL LETTER U WITH MACRON + u'\u017e' # 0x00d8 -> LATIN SMALL LETTER Z WITH CARON + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'\u014c' # 0x00e2 -> LATIN CAPITAL LETTER O WITH MACRON + u'\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u0144' # 0x00e7 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0136' # 0x00e8 -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\u0137' # 0x00e9 -> LATIN SMALL LETTER K WITH CEDILLA + u'\u013b' # 0x00ea -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u013c' # 0x00eb -> LATIN SMALL LETTER L WITH CEDILLA + u'\u0146' # 0x00ec -> LATIN SMALL LETTER N WITH CEDILLA + u'\u0112' # 0x00ed -> LATIN CAPITAL LETTER E WITH MACRON + u'\u0145' # 0x00ee -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\u2019' # 0x00ef -> RIGHT SINGLE QUOTATION MARK + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u201c' # 0x00f2 -> LEFT DOUBLE QUOTATION MARK + u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0x00f4 -> PILCROW SIGN + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u201e' # 0x00f7 -> DOUBLE LOW-9 QUOTATION MARK + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\xb9' # 0x00fb -> SUPERSCRIPT ONE + u'\xb3' # 0x00fc -> SUPERSCRIPT THREE + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a2: 0x0096, # CENT SIGN - 0x00a3: 0x009c, # POUND SIGN - 0x00a4: 0x009f, # CURRENCY SIGN - 0x00a6: 0x00a7, # BROKEN BAR - 0x00a7: 0x00f5, # SECTION SIGN - 0x00a9: 0x00a8, # COPYRIGHT SIGN - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00ad: 0x00f0, # SOFT HYPHEN - 0x00ae: 0x00a9, # REGISTERED SIGN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b3: 0x00fc, # SUPERSCRIPT THREE - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b6: 0x00f4, # PILCROW SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00b9: 0x00fb, # SUPERSCRIPT ONE - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS - 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00d7: 0x009e, # MULTIPLICATION SIGN - 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) - 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE - 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0100: 0x00a0, # LATIN CAPITAL LETTER A WITH MACRON - 0x0101: 0x0083, # LATIN SMALL LETTER A WITH MACRON - 0x0104: 0x00b5, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0x00d0, # LATIN SMALL LETTER A WITH OGONEK - 0x0106: 0x0080, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0x0087, # LATIN SMALL LETTER C WITH ACUTE - 0x010c: 0x00b6, # LATIN CAPITAL LETTER C WITH CARON - 0x010d: 0x00d1, # LATIN SMALL LETTER C WITH CARON - 0x0112: 0x00ed, # LATIN CAPITAL LETTER E WITH MACRON - 0x0113: 0x0089, # LATIN SMALL LETTER E WITH MACRON - 0x0116: 0x00b8, # LATIN CAPITAL LETTER E WITH DOT ABOVE - 0x0117: 0x00d3, # LATIN SMALL LETTER E WITH DOT ABOVE - 0x0118: 0x00b7, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0x00d2, # LATIN SMALL LETTER E WITH OGONEK - 0x0122: 0x0095, # LATIN CAPITAL LETTER G WITH CEDILLA - 0x0123: 0x0085, # LATIN SMALL LETTER G WITH CEDILLA - 0x012a: 0x00a1, # LATIN CAPITAL LETTER I WITH MACRON - 0x012b: 0x008c, # LATIN SMALL LETTER I WITH MACRON - 0x012e: 0x00bd, # LATIN CAPITAL LETTER I WITH OGONEK - 0x012f: 0x00d4, # LATIN SMALL LETTER I WITH OGONEK - 0x0136: 0x00e8, # LATIN CAPITAL LETTER K WITH CEDILLA - 0x0137: 0x00e9, # LATIN SMALL LETTER K WITH CEDILLA - 0x013b: 0x00ea, # LATIN CAPITAL LETTER L WITH CEDILLA - 0x013c: 0x00eb, # LATIN SMALL LETTER L WITH CEDILLA - 0x0141: 0x00ad, # LATIN CAPITAL LETTER L WITH STROKE - 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE - 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE - 0x0144: 0x00e7, # LATIN SMALL LETTER N WITH ACUTE - 0x0145: 0x00ee, # LATIN CAPITAL LETTER N WITH CEDILLA - 0x0146: 0x00ec, # LATIN SMALL LETTER N WITH CEDILLA - 0x014c: 0x00e2, # LATIN CAPITAL LETTER O WITH MACRON - 0x014d: 0x0093, # LATIN SMALL LETTER O WITH MACRON - 0x0156: 0x008a, # LATIN CAPITAL LETTER R WITH CEDILLA - 0x0157: 0x008b, # LATIN SMALL LETTER R WITH CEDILLA - 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE - 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE - 0x0160: 0x00be, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0x00d5, # LATIN SMALL LETTER S WITH CARON - 0x016a: 0x00c7, # LATIN CAPITAL LETTER U WITH MACRON - 0x016b: 0x00d7, # LATIN SMALL LETTER U WITH MACRON - 0x0172: 0x00c6, # LATIN CAPITAL LETTER U WITH OGONEK - 0x0173: 0x00d6, # LATIN SMALL LETTER U WITH OGONEK - 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x017a: 0x00a5, # LATIN SMALL LETTER Z WITH ACUTE - 0x017b: 0x00a3, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017c: 0x00a4, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x017d: 0x00cf, # LATIN CAPITAL LETTER Z WITH CARON - 0x017e: 0x00d8, # LATIN SMALL LETTER Z WITH CARON - 0x2019: 0x00ef, # RIGHT SINGLE QUOTATION MARK - 0x201c: 0x00f2, # LEFT DOUBLE QUOTATION MARK - 0x201d: 0x00a6, # RIGHT DOUBLE QUOTATION MARK - 0x201e: 0x00f7, # DOUBLE LOW-9 QUOTATION MARK - 0x2219: 0x00f9, # BULLET OPERATOR - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x0096, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x009f, # CURRENCY SIGN + 0x00a6: 0x00a7, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a9: 0x00a8, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0100: 0x00a0, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0x0083, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0x00b5, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00d0, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x0080, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0087, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00b6, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x00d1, # LATIN SMALL LETTER C WITH CARON + 0x0112: 0x00ed, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0x0089, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0x00b8, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0x00d3, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0x00b7, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00d2, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0x0095, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0x0085, # LATIN SMALL LETTER G WITH CEDILLA + 0x012a: 0x00a1, # LATIN CAPITAL LETTER I WITH MACRON + 0x012b: 0x008c, # LATIN SMALL LETTER I WITH MACRON + 0x012e: 0x00bd, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012f: 0x00d4, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0x00e8, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0x00e9, # LATIN SMALL LETTER K WITH CEDILLA + 0x013b: 0x00ea, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013c: 0x00eb, # LATIN SMALL LETTER L WITH CEDILLA + 0x0141: 0x00ad, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e7, # LATIN SMALL LETTER N WITH ACUTE + 0x0145: 0x00ee, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0x00ec, # LATIN SMALL LETTER N WITH CEDILLA + 0x014c: 0x00e2, # LATIN CAPITAL LETTER O WITH MACRON + 0x014d: 0x0093, # LATIN SMALL LETTER O WITH MACRON + 0x0156: 0x008a, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0x008b, # LATIN SMALL LETTER R WITH CEDILLA + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0x00be, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00d5, # LATIN SMALL LETTER S WITH CARON + 0x016a: 0x00c7, # LATIN CAPITAL LETTER U WITH MACRON + 0x016b: 0x00d7, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0x00c6, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0x00d6, # LATIN SMALL LETTER U WITH OGONEK + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00a5, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00a3, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00a4, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00cf, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00d8, # LATIN SMALL LETTER Z WITH CARON + 0x2019: 0x00ef, # RIGHT SINGLE QUOTATION MARK + 0x201c: 0x00f2, # LEFT DOUBLE QUOTATION MARK + 0x201d: 0x00a6, # RIGHT DOUBLE QUOTATION MARK + 0x201e: 0x00f7, # DOUBLE LOW-9 QUOTATION MARK + 0x2219: 0x00f9, # BULLET OPERATOR + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp850.py ============================================================================== --- python/trunk/Lib/encodings/cp850.py (original) +++ python/trunk/Lib/encodings/cp850.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS - 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE - 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE - 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE - 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE - 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE - 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE - 0x009e: 0x00d7, # MULTIPLICATION SIGN - 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE - 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR - 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR - 0x00a8: 0x00bf, # INVERTED QUESTION MARK - 0x00a9: 0x00ae, # REGISTERED SIGN - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00b8: 0x00a9, # COPYRIGHT SIGN - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x00a2, # CENT SIGN - 0x00be: 0x00a5, # YEN SIGN - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE - 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x00a4, # CURRENCY SIGN - 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH - 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH - 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00d5: 0x0131, # LATIN SMALL LETTER DOTLESS I - 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x00a6, # BROKEN BAR - 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE - 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN - 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN - 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE - 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00ee: 0x00af, # MACRON - 0x00ef: 0x00b4, # ACUTE ACCENT - 0x00f0: 0x00ad, # SOFT HYPHEN - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x2017, # DOUBLE LOW LINE - 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS - 0x00f4: 0x00b6, # PILCROW SIGN - 0x00f5: 0x00a7, # SECTION SIGN - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x00b8, # CEDILLA - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x00a8, # DIAERESIS - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x00b9, # SUPERSCRIPT ONE - 0x00fc: 0x00b3, # SUPERSCRIPT THREE - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE - u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE - u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE - u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE - u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE - u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE - u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE - u'\xa3' # 0x009c -> POUND SIGN - u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd7' # 0x009e -> MULTIPLICATION SIGN - u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK - u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE - u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE - u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR - u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK - u'\xae' # 0x00a9 -> REGISTERED SIGN - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xa9' # 0x00b8 -> COPYRIGHT SIGN - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\xa2' # 0x00bd -> CENT SIGN - u'\xa5' # 0x00be -> YEN SIGN - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE - u'\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\xa4' # 0x00cf -> CURRENCY SIGN - u'\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH - u'\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH - u'\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\u0131' # 0x00d5 -> LATIN SMALL LETTER DOTLESS I - u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\xa6' # 0x00dd -> BROKEN BAR - u'\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S - u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE - u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN - u'\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN - u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE - u'\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xaf' # 0x00ee -> MACRON - u'\xb4' # 0x00ef -> ACUTE ACCENT - u'\xad' # 0x00f0 -> SOFT HYPHEN - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u2017' # 0x00f2 -> DOUBLE LOW LINE - u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS - u'\xb6' # 0x00f4 -> PILCROW SIGN - u'\xa7' # 0x00f5 -> SECTION SIGN - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\xb8' # 0x00f7 -> CEDILLA - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\xa8' # 0x00f9 -> DIAERESIS - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\xb9' # 0x00fb -> SUPERSCRIPT ONE - u'\xb3' # 0x00fc -> SUPERSCRIPT THREE - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd7' # 0x009e -> MULTIPLICATION SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\xae' # 0x00a9 -> REGISTERED SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xa9' # 0x00b8 -> COPYRIGHT SIGN + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\xa2' # 0x00bd -> CENT SIGN + u'\xa5' # 0x00be -> YEN SIGN + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + u'\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + u'\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + u'\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\u0131' # 0x00d5 -> LATIN SMALL LETTER DOTLESS I + u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\xa6' # 0x00dd -> BROKEN BAR + u'\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + u'\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + u'\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xaf' # 0x00ee -> MACRON + u'\xb4' # 0x00ef -> ACUTE ACCENT + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2017' # 0x00f2 -> DOUBLE LOW LINE + u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0x00f4 -> PILCROW SIGN + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\xb8' # 0x00f7 -> CEDILLA + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\xb9' # 0x00fb -> SUPERSCRIPT ONE + u'\xb3' # 0x00fc -> SUPERSCRIPT THREE + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK - 0x00a2: 0x00bd, # CENT SIGN - 0x00a3: 0x009c, # POUND SIGN - 0x00a4: 0x00cf, # CURRENCY SIGN - 0x00a5: 0x00be, # YEN SIGN - 0x00a6: 0x00dd, # BROKEN BAR - 0x00a7: 0x00f5, # SECTION SIGN - 0x00a8: 0x00f9, # DIAERESIS - 0x00a9: 0x00b8, # COPYRIGHT SIGN - 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00ad: 0x00f0, # SOFT HYPHEN - 0x00ae: 0x00a9, # REGISTERED SIGN - 0x00af: 0x00ee, # MACRON - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b3: 0x00fc, # SUPERSCRIPT THREE - 0x00b4: 0x00ef, # ACUTE ACCENT - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b6: 0x00f4, # PILCROW SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00b8: 0x00f7, # CEDILLA - 0x00b9: 0x00fb, # SUPERSCRIPT ONE - 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS - 0x00bf: 0x00a8, # INVERTED QUESTION MARK - 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE - 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE - 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH - 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE - 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00d7: 0x009e, # MULTIPLICATION SIGN - 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE - 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S - 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE - 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE - 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE - 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE - 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE - 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH - 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE - 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE - 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE - 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE - 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN - 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0131: 0x00d5, # LATIN SMALL LETTER DOTLESS I - 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK - 0x2017: 0x00f2, # DOUBLE LOW LINE - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0131: 0x00d5, # LATIN SMALL LETTER DOTLESS I + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp852.py ============================================================================== --- python/trunk/Lib/encodings/cp852.py (original) +++ python/trunk/Lib/encodings/cp852.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x0085: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE - 0x0086: 0x0107, # LATIN SMALL LETTER C WITH ACUTE - 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE - 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x008a: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - 0x008b: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE - 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x008f: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE - 0x0092: 0x013a, # LATIN SMALL LETTER L WITH ACUTE - 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x0095: 0x013d, # LATIN CAPITAL LETTER L WITH CARON - 0x0096: 0x013e, # LATIN SMALL LETTER L WITH CARON - 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE - 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE - 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x0164, # LATIN CAPITAL LETTER T WITH CARON - 0x009c: 0x0165, # LATIN SMALL LETTER T WITH CARON - 0x009d: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE - 0x009e: 0x00d7, # MULTIPLICATION SIGN - 0x009f: 0x010d, # LATIN SMALL LETTER C WITH CARON - 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK - 0x00a5: 0x0105, # LATIN SMALL LETTER A WITH OGONEK - 0x00a6: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON - 0x00a7: 0x017e, # LATIN SMALL LETTER Z WITH CARON - 0x00a8: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK - 0x00a9: 0x0119, # LATIN SMALL LETTER E WITH OGONEK - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE - 0x00ac: 0x010c, # LATIN CAPITAL LETTER C WITH CARON - 0x00ad: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00b7: 0x011a, # LATIN CAPITAL LETTER E WITH CARON - 0x00b8: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x00be: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE - 0x00c7: 0x0103, # LATIN SMALL LETTER A WITH BREVE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x00a4, # CURRENCY SIGN - 0x00d0: 0x0111, # LATIN SMALL LETTER D WITH STROKE - 0x00d1: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE - 0x00d2: 0x010e, # LATIN CAPITAL LETTER D WITH CARON - 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00d4: 0x010f, # LATIN SMALL LETTER D WITH CARON - 0x00d5: 0x0147, # LATIN CAPITAL LETTER N WITH CARON - 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00d8: 0x011b, # LATIN SMALL LETTER E WITH CARON - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x0162, # LATIN CAPITAL LETTER T WITH CEDILLA - 0x00de: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE - 0x00e4: 0x0144, # LATIN SMALL LETTER N WITH ACUTE - 0x00e5: 0x0148, # LATIN SMALL LETTER N WITH CARON - 0x00e6: 0x0160, # LATIN CAPITAL LETTER S WITH CARON - 0x00e7: 0x0161, # LATIN SMALL LETTER S WITH CARON - 0x00e8: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE - 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00ea: 0x0155, # LATIN SMALL LETTER R WITH ACUTE - 0x00eb: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE - 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00ee: 0x0163, # LATIN SMALL LETTER T WITH CEDILLA - 0x00ef: 0x00b4, # ACUTE ACCENT - 0x00f0: 0x00ad, # SOFT HYPHEN - 0x00f1: 0x02dd, # DOUBLE ACUTE ACCENT - 0x00f2: 0x02db, # OGONEK - 0x00f3: 0x02c7, # CARON - 0x00f4: 0x02d8, # BREVE - 0x00f5: 0x00a7, # SECTION SIGN - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x00b8, # CEDILLA - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x00a8, # DIAERESIS - 0x00fa: 0x02d9, # DOT ABOVE - 0x00fb: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE - 0x00fc: 0x0158, # LATIN CAPITAL LETTER R WITH CARON - 0x00fd: 0x0159, # LATIN SMALL LETTER R WITH CARON - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0086: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x008b: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE + 0x0092: 0x013a, # LATIN SMALL LETTER L WITH ACUTE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x013d, # LATIN CAPITAL LETTER L WITH CARON + 0x0096: 0x013e, # LATIN SMALL LETTER L WITH CARON + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x0164, # LATIN CAPITAL LETTER T WITH CARON + 0x009c: 0x0165, # LATIN SMALL LETTER T WITH CARON + 0x009d: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00a5: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00a6: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00a7: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00a8: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00a9: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00ac: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ad: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x011a, # LATIN CAPITAL LETTER E WITH CARON + 0x00b8: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00be: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE + 0x00c7: 0x0103, # LATIN SMALL LETTER A WITH BREVE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00d1: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d2: 0x010e, # LATIN CAPITAL LETTER D WITH CARON + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x010f, # LATIN SMALL LETTER D WITH CARON + 0x00d5: 0x0147, # LATIN CAPITAL LETTER N WITH CARON + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x011b, # LATIN SMALL LETTER E WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x0162, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x00de: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e5: 0x0148, # LATIN SMALL LETTER N WITH CARON + 0x00e6: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00e7: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00e8: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x0155, # LATIN SMALL LETTER R WITH ACUTE + 0x00eb: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x0163, # LATIN SMALL LETTER T WITH CEDILLA + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00f2: 0x02db, # OGONEK + 0x00f3: 0x02c7, # CARON + 0x00f4: 0x02d8, # BREVE + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x02d9, # DOT ABOVE + 0x00fb: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x00fc: 0x0158, # LATIN CAPITAL LETTER R WITH CARON + 0x00fd: 0x0159, # LATIN SMALL LETTER R WITH CARON + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u016f' # 0x0085 -> LATIN SMALL LETTER U WITH RING ABOVE - u'\u0107' # 0x0086 -> LATIN SMALL LETTER C WITH ACUTE - u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA - u'\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE - u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\u0150' # 0x008a -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - u'\u0151' # 0x008b -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\u0106' # 0x008f -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0139' # 0x0091 -> LATIN CAPITAL LETTER L WITH ACUTE - u'\u013a' # 0x0092 -> LATIN SMALL LETTER L WITH ACUTE - u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\u013d' # 0x0095 -> LATIN CAPITAL LETTER L WITH CARON - u'\u013e' # 0x0096 -> LATIN SMALL LETTER L WITH CARON - u'\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE - u'\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE - u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u0164' # 0x009b -> LATIN CAPITAL LETTER T WITH CARON - u'\u0165' # 0x009c -> LATIN SMALL LETTER T WITH CARON - u'\u0141' # 0x009d -> LATIN CAPITAL LETTER L WITH STROKE - u'\xd7' # 0x009e -> MULTIPLICATION SIGN - u'\u010d' # 0x009f -> LATIN SMALL LETTER C WITH CARON - u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE - u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\u0104' # 0x00a4 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\u0105' # 0x00a5 -> LATIN SMALL LETTER A WITH OGONEK - u'\u017d' # 0x00a6 -> LATIN CAPITAL LETTER Z WITH CARON - u'\u017e' # 0x00a7 -> LATIN SMALL LETTER Z WITH CARON - u'\u0118' # 0x00a8 -> LATIN CAPITAL LETTER E WITH OGONEK - u'\u0119' # 0x00a9 -> LATIN SMALL LETTER E WITH OGONEK - u'\xac' # 0x00aa -> NOT SIGN - u'\u017a' # 0x00ab -> LATIN SMALL LETTER Z WITH ACUTE - u'\u010c' # 0x00ac -> LATIN CAPITAL LETTER C WITH CARON - u'\u015f' # 0x00ad -> LATIN SMALL LETTER S WITH CEDILLA - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\u011a' # 0x00b7 -> LATIN CAPITAL LETTER E WITH CARON - u'\u015e' # 0x00b8 -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u017b' # 0x00bd -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\u017c' # 0x00be -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u0102' # 0x00c6 -> LATIN CAPITAL LETTER A WITH BREVE - u'\u0103' # 0x00c7 -> LATIN SMALL LETTER A WITH BREVE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\xa4' # 0x00cf -> CURRENCY SIGN - u'\u0111' # 0x00d0 -> LATIN SMALL LETTER D WITH STROKE - u'\u0110' # 0x00d1 -> LATIN CAPITAL LETTER D WITH STROKE - u'\u010e' # 0x00d2 -> LATIN CAPITAL LETTER D WITH CARON - u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\u010f' # 0x00d4 -> LATIN SMALL LETTER D WITH CARON - u'\u0147' # 0x00d5 -> LATIN CAPITAL LETTER N WITH CARON - u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\u011b' # 0x00d8 -> LATIN SMALL LETTER E WITH CARON - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u0162' # 0x00dd -> LATIN CAPITAL LETTER T WITH CEDILLA - u'\u016e' # 0x00de -> LATIN CAPITAL LETTER U WITH RING ABOVE - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S - u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\u0144' # 0x00e4 -> LATIN SMALL LETTER N WITH ACUTE - u'\u0148' # 0x00e5 -> LATIN SMALL LETTER N WITH CARON - u'\u0160' # 0x00e6 -> LATIN CAPITAL LETTER S WITH CARON - u'\u0161' # 0x00e7 -> LATIN SMALL LETTER S WITH CARON - u'\u0154' # 0x00e8 -> LATIN CAPITAL LETTER R WITH ACUTE - u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\u0155' # 0x00ea -> LATIN SMALL LETTER R WITH ACUTE - u'\u0170' # 0x00eb -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - u'\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE - u'\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\u0163' # 0x00ee -> LATIN SMALL LETTER T WITH CEDILLA - u'\xb4' # 0x00ef -> ACUTE ACCENT - u'\xad' # 0x00f0 -> SOFT HYPHEN - u'\u02dd' # 0x00f1 -> DOUBLE ACUTE ACCENT - u'\u02db' # 0x00f2 -> OGONEK - u'\u02c7' # 0x00f3 -> CARON - u'\u02d8' # 0x00f4 -> BREVE - u'\xa7' # 0x00f5 -> SECTION SIGN - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\xb8' # 0x00f7 -> CEDILLA - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\xa8' # 0x00f9 -> DIAERESIS - u'\u02d9' # 0x00fa -> DOT ABOVE - u'\u0171' # 0x00fb -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - u'\u0158' # 0x00fc -> LATIN CAPITAL LETTER R WITH CARON - u'\u0159' # 0x00fd -> LATIN SMALL LETTER R WITH CARON - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u016f' # 0x0085 -> LATIN SMALL LETTER U WITH RING ABOVE + u'\u0107' # 0x0086 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0150' # 0x008a -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\u0151' # 0x008b -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0106' # 0x008f -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0139' # 0x0091 -> LATIN CAPITAL LETTER L WITH ACUTE + u'\u013a' # 0x0092 -> LATIN SMALL LETTER L WITH ACUTE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u013d' # 0x0095 -> LATIN CAPITAL LETTER L WITH CARON + u'\u013e' # 0x0096 -> LATIN SMALL LETTER L WITH CARON + u'\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0164' # 0x009b -> LATIN CAPITAL LETTER T WITH CARON + u'\u0165' # 0x009c -> LATIN SMALL LETTER T WITH CARON + u'\u0141' # 0x009d -> LATIN CAPITAL LETTER L WITH STROKE + u'\xd7' # 0x009e -> MULTIPLICATION SIGN + u'\u010d' # 0x009f -> LATIN SMALL LETTER C WITH CARON + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\u0104' # 0x00a4 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u0105' # 0x00a5 -> LATIN SMALL LETTER A WITH OGONEK + u'\u017d' # 0x00a6 -> LATIN CAPITAL LETTER Z WITH CARON + u'\u017e' # 0x00a7 -> LATIN SMALL LETTER Z WITH CARON + u'\u0118' # 0x00a8 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u0119' # 0x00a9 -> LATIN SMALL LETTER E WITH OGONEK + u'\xac' # 0x00aa -> NOT SIGN + u'\u017a' # 0x00ab -> LATIN SMALL LETTER Z WITH ACUTE + u'\u010c' # 0x00ac -> LATIN CAPITAL LETTER C WITH CARON + u'\u015f' # 0x00ad -> LATIN SMALL LETTER S WITH CEDILLA + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u011a' # 0x00b7 -> LATIN CAPITAL LETTER E WITH CARON + u'\u015e' # 0x00b8 -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u017b' # 0x00bd -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u017c' # 0x00be -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u0102' # 0x00c6 -> LATIN CAPITAL LETTER A WITH BREVE + u'\u0103' # 0x00c7 -> LATIN SMALL LETTER A WITH BREVE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\u0111' # 0x00d0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0110' # 0x00d1 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u010e' # 0x00d2 -> LATIN CAPITAL LETTER D WITH CARON + u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u010f' # 0x00d4 -> LATIN SMALL LETTER D WITH CARON + u'\u0147' # 0x00d5 -> LATIN CAPITAL LETTER N WITH CARON + u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u011b' # 0x00d8 -> LATIN SMALL LETTER E WITH CARON + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u0162' # 0x00dd -> LATIN CAPITAL LETTER T WITH CEDILLA + u'\u016e' # 0x00de -> LATIN CAPITAL LETTER U WITH RING ABOVE + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0144' # 0x00e4 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0148' # 0x00e5 -> LATIN SMALL LETTER N WITH CARON + u'\u0160' # 0x00e6 -> LATIN CAPITAL LETTER S WITH CARON + u'\u0161' # 0x00e7 -> LATIN SMALL LETTER S WITH CARON + u'\u0154' # 0x00e8 -> LATIN CAPITAL LETTER R WITH ACUTE + u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\u0155' # 0x00ea -> LATIN SMALL LETTER R WITH ACUTE + u'\u0170' # 0x00eb -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + u'\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\u0163' # 0x00ee -> LATIN SMALL LETTER T WITH CEDILLA + u'\xb4' # 0x00ef -> ACUTE ACCENT + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\u02dd' # 0x00f1 -> DOUBLE ACUTE ACCENT + u'\u02db' # 0x00f2 -> OGONEK + u'\u02c7' # 0x00f3 -> CARON + u'\u02d8' # 0x00f4 -> BREVE + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\xb8' # 0x00f7 -> CEDILLA + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\u02d9' # 0x00fa -> DOT ABOVE + u'\u0171' # 0x00fb -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\u0158' # 0x00fc -> LATIN CAPITAL LETTER R WITH CARON + u'\u0159' # 0x00fd -> LATIN SMALL LETTER R WITH CARON + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a4: 0x00cf, # CURRENCY SIGN - 0x00a7: 0x00f5, # SECTION SIGN - 0x00a8: 0x00f9, # DIAERESIS - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00ad: 0x00f0, # SOFT HYPHEN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b4: 0x00ef, # ACUTE ACCENT - 0x00b8: 0x00f7, # CEDILLA - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00d7: 0x009e, # MULTIPLICATION SIGN - 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S - 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE - 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE - 0x0102: 0x00c6, # LATIN CAPITAL LETTER A WITH BREVE - 0x0103: 0x00c7, # LATIN SMALL LETTER A WITH BREVE - 0x0104: 0x00a4, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0x00a5, # LATIN SMALL LETTER A WITH OGONEK - 0x0106: 0x008f, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0x0086, # LATIN SMALL LETTER C WITH ACUTE - 0x010c: 0x00ac, # LATIN CAPITAL LETTER C WITH CARON - 0x010d: 0x009f, # LATIN SMALL LETTER C WITH CARON - 0x010e: 0x00d2, # LATIN CAPITAL LETTER D WITH CARON - 0x010f: 0x00d4, # LATIN SMALL LETTER D WITH CARON - 0x0110: 0x00d1, # LATIN CAPITAL LETTER D WITH STROKE - 0x0111: 0x00d0, # LATIN SMALL LETTER D WITH STROKE - 0x0118: 0x00a8, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0x00a9, # LATIN SMALL LETTER E WITH OGONEK - 0x011a: 0x00b7, # LATIN CAPITAL LETTER E WITH CARON - 0x011b: 0x00d8, # LATIN SMALL LETTER E WITH CARON - 0x0139: 0x0091, # LATIN CAPITAL LETTER L WITH ACUTE - 0x013a: 0x0092, # LATIN SMALL LETTER L WITH ACUTE - 0x013d: 0x0095, # LATIN CAPITAL LETTER L WITH CARON - 0x013e: 0x0096, # LATIN SMALL LETTER L WITH CARON - 0x0141: 0x009d, # LATIN CAPITAL LETTER L WITH STROKE - 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE - 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE - 0x0144: 0x00e4, # LATIN SMALL LETTER N WITH ACUTE - 0x0147: 0x00d5, # LATIN CAPITAL LETTER N WITH CARON - 0x0148: 0x00e5, # LATIN SMALL LETTER N WITH CARON - 0x0150: 0x008a, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - 0x0151: 0x008b, # LATIN SMALL LETTER O WITH DOUBLE ACUTE - 0x0154: 0x00e8, # LATIN CAPITAL LETTER R WITH ACUTE - 0x0155: 0x00ea, # LATIN SMALL LETTER R WITH ACUTE - 0x0158: 0x00fc, # LATIN CAPITAL LETTER R WITH CARON - 0x0159: 0x00fd, # LATIN SMALL LETTER R WITH CARON - 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE - 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE - 0x015e: 0x00b8, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015f: 0x00ad, # LATIN SMALL LETTER S WITH CEDILLA - 0x0160: 0x00e6, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0x00e7, # LATIN SMALL LETTER S WITH CARON - 0x0162: 0x00dd, # LATIN CAPITAL LETTER T WITH CEDILLA - 0x0163: 0x00ee, # LATIN SMALL LETTER T WITH CEDILLA - 0x0164: 0x009b, # LATIN CAPITAL LETTER T WITH CARON - 0x0165: 0x009c, # LATIN SMALL LETTER T WITH CARON - 0x016e: 0x00de, # LATIN CAPITAL LETTER U WITH RING ABOVE - 0x016f: 0x0085, # LATIN SMALL LETTER U WITH RING ABOVE - 0x0170: 0x00eb, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - 0x0171: 0x00fb, # LATIN SMALL LETTER U WITH DOUBLE ACUTE - 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x017a: 0x00ab, # LATIN SMALL LETTER Z WITH ACUTE - 0x017b: 0x00bd, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017c: 0x00be, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x017d: 0x00a6, # LATIN CAPITAL LETTER Z WITH CARON - 0x017e: 0x00a7, # LATIN SMALL LETTER Z WITH CARON - 0x02c7: 0x00f3, # CARON - 0x02d8: 0x00f4, # BREVE - 0x02d9: 0x00fa, # DOT ABOVE - 0x02db: 0x00f2, # OGONEK - 0x02dd: 0x00f1, # DOUBLE ACUTE ACCENT - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b8: 0x00f7, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x0102: 0x00c6, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0x00c7, # LATIN SMALL LETTER A WITH BREVE + 0x0104: 0x00a4, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00a5, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x008f, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0086, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00ac, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x009f, # LATIN SMALL LETTER C WITH CARON + 0x010e: 0x00d2, # LATIN CAPITAL LETTER D WITH CARON + 0x010f: 0x00d4, # LATIN SMALL LETTER D WITH CARON + 0x0110: 0x00d1, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0x00d0, # LATIN SMALL LETTER D WITH STROKE + 0x0118: 0x00a8, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00a9, # LATIN SMALL LETTER E WITH OGONEK + 0x011a: 0x00b7, # LATIN CAPITAL LETTER E WITH CARON + 0x011b: 0x00d8, # LATIN SMALL LETTER E WITH CARON + 0x0139: 0x0091, # LATIN CAPITAL LETTER L WITH ACUTE + 0x013a: 0x0092, # LATIN SMALL LETTER L WITH ACUTE + 0x013d: 0x0095, # LATIN CAPITAL LETTER L WITH CARON + 0x013e: 0x0096, # LATIN SMALL LETTER L WITH CARON + 0x0141: 0x009d, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e4, # LATIN SMALL LETTER N WITH ACUTE + 0x0147: 0x00d5, # LATIN CAPITAL LETTER N WITH CARON + 0x0148: 0x00e5, # LATIN SMALL LETTER N WITH CARON + 0x0150: 0x008a, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0x008b, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0154: 0x00e8, # LATIN CAPITAL LETTER R WITH ACUTE + 0x0155: 0x00ea, # LATIN SMALL LETTER R WITH ACUTE + 0x0158: 0x00fc, # LATIN CAPITAL LETTER R WITH CARON + 0x0159: 0x00fd, # LATIN SMALL LETTER R WITH CARON + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x015e: 0x00b8, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x00ad, # LATIN SMALL LETTER S WITH CEDILLA + 0x0160: 0x00e6, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00e7, # LATIN SMALL LETTER S WITH CARON + 0x0162: 0x00dd, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x0163: 0x00ee, # LATIN SMALL LETTER T WITH CEDILLA + 0x0164: 0x009b, # LATIN CAPITAL LETTER T WITH CARON + 0x0165: 0x009c, # LATIN SMALL LETTER T WITH CARON + 0x016e: 0x00de, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x016f: 0x0085, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0170: 0x00eb, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0x00fb, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00ab, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00bd, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00be, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00a6, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00a7, # LATIN SMALL LETTER Z WITH CARON + 0x02c7: 0x00f3, # CARON + 0x02d8: 0x00f4, # BREVE + 0x02d9: 0x00fa, # DOT ABOVE + 0x02db: 0x00f2, # OGONEK + 0x02dd: 0x00f1, # DOUBLE ACUTE ACCENT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp855.py ============================================================================== --- python/trunk/Lib/encodings/cp855.py (original) +++ python/trunk/Lib/encodings/cp855.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x0452, # CYRILLIC SMALL LETTER DJE - 0x0081: 0x0402, # CYRILLIC CAPITAL LETTER DJE - 0x0082: 0x0453, # CYRILLIC SMALL LETTER GJE - 0x0083: 0x0403, # CYRILLIC CAPITAL LETTER GJE - 0x0084: 0x0451, # CYRILLIC SMALL LETTER IO - 0x0085: 0x0401, # CYRILLIC CAPITAL LETTER IO - 0x0086: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE - 0x0087: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x0088: 0x0455, # CYRILLIC SMALL LETTER DZE - 0x0089: 0x0405, # CYRILLIC CAPITAL LETTER DZE - 0x008a: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 0x008b: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 0x008c: 0x0457, # CYRILLIC SMALL LETTER YI - 0x008d: 0x0407, # CYRILLIC CAPITAL LETTER YI - 0x008e: 0x0458, # CYRILLIC SMALL LETTER JE - 0x008f: 0x0408, # CYRILLIC CAPITAL LETTER JE - 0x0090: 0x0459, # CYRILLIC SMALL LETTER LJE - 0x0091: 0x0409, # CYRILLIC CAPITAL LETTER LJE - 0x0092: 0x045a, # CYRILLIC SMALL LETTER NJE - 0x0093: 0x040a, # CYRILLIC CAPITAL LETTER NJE - 0x0094: 0x045b, # CYRILLIC SMALL LETTER TSHE - 0x0095: 0x040b, # CYRILLIC CAPITAL LETTER TSHE - 0x0096: 0x045c, # CYRILLIC SMALL LETTER KJE - 0x0097: 0x040c, # CYRILLIC CAPITAL LETTER KJE - 0x0098: 0x045e, # CYRILLIC SMALL LETTER SHORT U - 0x0099: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U - 0x009a: 0x045f, # CYRILLIC SMALL LETTER DZHE - 0x009b: 0x040f, # CYRILLIC CAPITAL LETTER DZHE - 0x009c: 0x044e, # CYRILLIC SMALL LETTER YU - 0x009d: 0x042e, # CYRILLIC CAPITAL LETTER YU - 0x009e: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN - 0x009f: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A - 0x00a1: 0x0410, # CYRILLIC CAPITAL LETTER A - 0x00a2: 0x0431, # CYRILLIC SMALL LETTER BE - 0x00a3: 0x0411, # CYRILLIC CAPITAL LETTER BE - 0x00a4: 0x0446, # CYRILLIC SMALL LETTER TSE - 0x00a5: 0x0426, # CYRILLIC CAPITAL LETTER TSE - 0x00a6: 0x0434, # CYRILLIC SMALL LETTER DE - 0x00a7: 0x0414, # CYRILLIC CAPITAL LETTER DE - 0x00a8: 0x0435, # CYRILLIC SMALL LETTER IE - 0x00a9: 0x0415, # CYRILLIC CAPITAL LETTER IE - 0x00aa: 0x0444, # CYRILLIC SMALL LETTER EF - 0x00ab: 0x0424, # CYRILLIC CAPITAL LETTER EF - 0x00ac: 0x0433, # CYRILLIC SMALL LETTER GHE - 0x00ad: 0x0413, # CYRILLIC CAPITAL LETTER GHE - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x0445, # CYRILLIC SMALL LETTER HA - 0x00b6: 0x0425, # CYRILLIC CAPITAL LETTER HA - 0x00b7: 0x0438, # CYRILLIC SMALL LETTER I - 0x00b8: 0x0418, # CYRILLIC CAPITAL LETTER I - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x0439, # CYRILLIC SMALL LETTER SHORT I - 0x00be: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x043a, # CYRILLIC SMALL LETTER KA - 0x00c7: 0x041a, # CYRILLIC CAPITAL LETTER KA - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x00a4, # CURRENCY SIGN - 0x00d0: 0x043b, # CYRILLIC SMALL LETTER EL - 0x00d1: 0x041b, # CYRILLIC CAPITAL LETTER EL - 0x00d2: 0x043c, # CYRILLIC SMALL LETTER EM - 0x00d3: 0x041c, # CYRILLIC CAPITAL LETTER EM - 0x00d4: 0x043d, # CYRILLIC SMALL LETTER EN - 0x00d5: 0x041d, # CYRILLIC CAPITAL LETTER EN - 0x00d6: 0x043e, # CYRILLIC SMALL LETTER O - 0x00d7: 0x041e, # CYRILLIC CAPITAL LETTER O - 0x00d8: 0x043f, # CYRILLIC SMALL LETTER PE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x041f, # CYRILLIC CAPITAL LETTER PE - 0x00de: 0x044f, # CYRILLIC SMALL LETTER YA - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x042f, # CYRILLIC CAPITAL LETTER YA - 0x00e1: 0x0440, # CYRILLIC SMALL LETTER ER - 0x00e2: 0x0420, # CYRILLIC CAPITAL LETTER ER - 0x00e3: 0x0441, # CYRILLIC SMALL LETTER ES - 0x00e4: 0x0421, # CYRILLIC CAPITAL LETTER ES - 0x00e5: 0x0442, # CYRILLIC SMALL LETTER TE - 0x00e6: 0x0422, # CYRILLIC CAPITAL LETTER TE - 0x00e7: 0x0443, # CYRILLIC SMALL LETTER U - 0x00e8: 0x0423, # CYRILLIC CAPITAL LETTER U - 0x00e9: 0x0436, # CYRILLIC SMALL LETTER ZHE - 0x00ea: 0x0416, # CYRILLIC CAPITAL LETTER ZHE - 0x00eb: 0x0432, # CYRILLIC SMALL LETTER VE - 0x00ec: 0x0412, # CYRILLIC CAPITAL LETTER VE - 0x00ed: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN - 0x00ee: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x00ef: 0x2116, # NUMERO SIGN - 0x00f0: 0x00ad, # SOFT HYPHEN - 0x00f1: 0x044b, # CYRILLIC SMALL LETTER YERU - 0x00f2: 0x042b, # CYRILLIC CAPITAL LETTER YERU - 0x00f3: 0x0437, # CYRILLIC SMALL LETTER ZE - 0x00f4: 0x0417, # CYRILLIC CAPITAL LETTER ZE - 0x00f5: 0x0448, # CYRILLIC SMALL LETTER SHA - 0x00f6: 0x0428, # CYRILLIC CAPITAL LETTER SHA - 0x00f7: 0x044d, # CYRILLIC SMALL LETTER E - 0x00f8: 0x042d, # CYRILLIC CAPITAL LETTER E - 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA - 0x00fa: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA - 0x00fb: 0x0447, # CYRILLIC SMALL LETTER CHE - 0x00fc: 0x0427, # CYRILLIC CAPITAL LETTER CHE - 0x00fd: 0x00a7, # SECTION SIGN - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x0081: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x0082: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x0083: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x0084: 0x0451, # CYRILLIC SMALL LETTER IO + 0x0085: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x0086: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0087: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0088: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x0089: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x008a: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008b: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008c: 0x0457, # CYRILLIC SMALL LETTER YI + 0x008d: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x008e: 0x0458, # CYRILLIC SMALL LETTER JE + 0x008f: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x0090: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x0091: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x0092: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x0093: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x0094: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x0095: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x0096: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x0097: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x0098: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x0099: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x009a: 0x045f, # CYRILLIC SMALL LETTER DZHE + 0x009b: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x009c: 0x044e, # CYRILLIC SMALL LETTER YU + 0x009d: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009e: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x009f: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00a2: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a3: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00a4: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00a5: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00a6: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a7: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00a8: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a9: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00aa: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00ab: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00ac: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00ad: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00b6: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00b7: 0x0438, # CYRILLIC SMALL LETTER I + 0x00b8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00be: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00c7: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00d1: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00d2: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00d3: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00d4: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00d5: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00d6: 0x043e, # CYRILLIC SMALL LETTER O + 0x00d7: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00d8: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00de: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00e1: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e2: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00e3: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e4: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00e5: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e6: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00e7: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e8: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00e9: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00ea: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00eb: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00ec: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00ed: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ee: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00ef: 0x2116, # NUMERO SIGN + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00f2: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00f3: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00f4: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00f5: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f6: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00f7: 0x044d, # CYRILLIC SMALL LETTER E + 0x00f8: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00fb: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00fc: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00fd: 0x00a7, # SECTION SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\u0452' # 0x0080 -> CYRILLIC SMALL LETTER DJE - u'\u0402' # 0x0081 -> CYRILLIC CAPITAL LETTER DJE - u'\u0453' # 0x0082 -> CYRILLIC SMALL LETTER GJE - u'\u0403' # 0x0083 -> CYRILLIC CAPITAL LETTER GJE - u'\u0451' # 0x0084 -> CYRILLIC SMALL LETTER IO - u'\u0401' # 0x0085 -> CYRILLIC CAPITAL LETTER IO - u'\u0454' # 0x0086 -> CYRILLIC SMALL LETTER UKRAINIAN IE - u'\u0404' # 0x0087 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE - u'\u0455' # 0x0088 -> CYRILLIC SMALL LETTER DZE - u'\u0405' # 0x0089 -> CYRILLIC CAPITAL LETTER DZE - u'\u0456' # 0x008a -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0406' # 0x008b -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0457' # 0x008c -> CYRILLIC SMALL LETTER YI - u'\u0407' # 0x008d -> CYRILLIC CAPITAL LETTER YI - u'\u0458' # 0x008e -> CYRILLIC SMALL LETTER JE - u'\u0408' # 0x008f -> CYRILLIC CAPITAL LETTER JE - u'\u0459' # 0x0090 -> CYRILLIC SMALL LETTER LJE - u'\u0409' # 0x0091 -> CYRILLIC CAPITAL LETTER LJE - u'\u045a' # 0x0092 -> CYRILLIC SMALL LETTER NJE - u'\u040a' # 0x0093 -> CYRILLIC CAPITAL LETTER NJE - u'\u045b' # 0x0094 -> CYRILLIC SMALL LETTER TSHE - u'\u040b' # 0x0095 -> CYRILLIC CAPITAL LETTER TSHE - u'\u045c' # 0x0096 -> CYRILLIC SMALL LETTER KJE - u'\u040c' # 0x0097 -> CYRILLIC CAPITAL LETTER KJE - u'\u045e' # 0x0098 -> CYRILLIC SMALL LETTER SHORT U - u'\u040e' # 0x0099 -> CYRILLIC CAPITAL LETTER SHORT U - u'\u045f' # 0x009a -> CYRILLIC SMALL LETTER DZHE - u'\u040f' # 0x009b -> CYRILLIC CAPITAL LETTER DZHE - u'\u044e' # 0x009c -> CYRILLIC SMALL LETTER YU - u'\u042e' # 0x009d -> CYRILLIC CAPITAL LETTER YU - u'\u044a' # 0x009e -> CYRILLIC SMALL LETTER HARD SIGN - u'\u042a' # 0x009f -> CYRILLIC CAPITAL LETTER HARD SIGN - u'\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A - u'\u0410' # 0x00a1 -> CYRILLIC CAPITAL LETTER A - u'\u0431' # 0x00a2 -> CYRILLIC SMALL LETTER BE - u'\u0411' # 0x00a3 -> CYRILLIC CAPITAL LETTER BE - u'\u0446' # 0x00a4 -> CYRILLIC SMALL LETTER TSE - u'\u0426' # 0x00a5 -> CYRILLIC CAPITAL LETTER TSE - u'\u0434' # 0x00a6 -> CYRILLIC SMALL LETTER DE - u'\u0414' # 0x00a7 -> CYRILLIC CAPITAL LETTER DE - u'\u0435' # 0x00a8 -> CYRILLIC SMALL LETTER IE - u'\u0415' # 0x00a9 -> CYRILLIC CAPITAL LETTER IE - u'\u0444' # 0x00aa -> CYRILLIC SMALL LETTER EF - u'\u0424' # 0x00ab -> CYRILLIC CAPITAL LETTER EF - u'\u0433' # 0x00ac -> CYRILLIC SMALL LETTER GHE - u'\u0413' # 0x00ad -> CYRILLIC CAPITAL LETTER GHE - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u0445' # 0x00b5 -> CYRILLIC SMALL LETTER HA - u'\u0425' # 0x00b6 -> CYRILLIC CAPITAL LETTER HA - u'\u0438' # 0x00b7 -> CYRILLIC SMALL LETTER I - u'\u0418' # 0x00b8 -> CYRILLIC CAPITAL LETTER I - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u0439' # 0x00bd -> CYRILLIC SMALL LETTER SHORT I - u'\u0419' # 0x00be -> CYRILLIC CAPITAL LETTER SHORT I - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u043a' # 0x00c6 -> CYRILLIC SMALL LETTER KA - u'\u041a' # 0x00c7 -> CYRILLIC CAPITAL LETTER KA - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\xa4' # 0x00cf -> CURRENCY SIGN - u'\u043b' # 0x00d0 -> CYRILLIC SMALL LETTER EL - u'\u041b' # 0x00d1 -> CYRILLIC CAPITAL LETTER EL - u'\u043c' # 0x00d2 -> CYRILLIC SMALL LETTER EM - u'\u041c' # 0x00d3 -> CYRILLIC CAPITAL LETTER EM - u'\u043d' # 0x00d4 -> CYRILLIC SMALL LETTER EN - u'\u041d' # 0x00d5 -> CYRILLIC CAPITAL LETTER EN - u'\u043e' # 0x00d6 -> CYRILLIC SMALL LETTER O - u'\u041e' # 0x00d7 -> CYRILLIC CAPITAL LETTER O - u'\u043f' # 0x00d8 -> CYRILLIC SMALL LETTER PE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u041f' # 0x00dd -> CYRILLIC CAPITAL LETTER PE - u'\u044f' # 0x00de -> CYRILLIC SMALL LETTER YA - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u042f' # 0x00e0 -> CYRILLIC CAPITAL LETTER YA - u'\u0440' # 0x00e1 -> CYRILLIC SMALL LETTER ER - u'\u0420' # 0x00e2 -> CYRILLIC CAPITAL LETTER ER - u'\u0441' # 0x00e3 -> CYRILLIC SMALL LETTER ES - u'\u0421' # 0x00e4 -> CYRILLIC CAPITAL LETTER ES - u'\u0442' # 0x00e5 -> CYRILLIC SMALL LETTER TE - u'\u0422' # 0x00e6 -> CYRILLIC CAPITAL LETTER TE - u'\u0443' # 0x00e7 -> CYRILLIC SMALL LETTER U - u'\u0423' # 0x00e8 -> CYRILLIC CAPITAL LETTER U - u'\u0436' # 0x00e9 -> CYRILLIC SMALL LETTER ZHE - u'\u0416' # 0x00ea -> CYRILLIC CAPITAL LETTER ZHE - u'\u0432' # 0x00eb -> CYRILLIC SMALL LETTER VE - u'\u0412' # 0x00ec -> CYRILLIC CAPITAL LETTER VE - u'\u044c' # 0x00ed -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u042c' # 0x00ee -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u2116' # 0x00ef -> NUMERO SIGN - u'\xad' # 0x00f0 -> SOFT HYPHEN - u'\u044b' # 0x00f1 -> CYRILLIC SMALL LETTER YERU - u'\u042b' # 0x00f2 -> CYRILLIC CAPITAL LETTER YERU - u'\u0437' # 0x00f3 -> CYRILLIC SMALL LETTER ZE - u'\u0417' # 0x00f4 -> CYRILLIC CAPITAL LETTER ZE - u'\u0448' # 0x00f5 -> CYRILLIC SMALL LETTER SHA - u'\u0428' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHA - u'\u044d' # 0x00f7 -> CYRILLIC SMALL LETTER E - u'\u042d' # 0x00f8 -> CYRILLIC CAPITAL LETTER E - u'\u0449' # 0x00f9 -> CYRILLIC SMALL LETTER SHCHA - u'\u0429' # 0x00fa -> CYRILLIC CAPITAL LETTER SHCHA - u'\u0447' # 0x00fb -> CYRILLIC SMALL LETTER CHE - u'\u0427' # 0x00fc -> CYRILLIC CAPITAL LETTER CHE - u'\xa7' # 0x00fd -> SECTION SIGN - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u0452' # 0x0080 -> CYRILLIC SMALL LETTER DJE + u'\u0402' # 0x0081 -> CYRILLIC CAPITAL LETTER DJE + u'\u0453' # 0x0082 -> CYRILLIC SMALL LETTER GJE + u'\u0403' # 0x0083 -> CYRILLIC CAPITAL LETTER GJE + u'\u0451' # 0x0084 -> CYRILLIC SMALL LETTER IO + u'\u0401' # 0x0085 -> CYRILLIC CAPITAL LETTER IO + u'\u0454' # 0x0086 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u0404' # 0x0087 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u0455' # 0x0088 -> CYRILLIC SMALL LETTER DZE + u'\u0405' # 0x0089 -> CYRILLIC CAPITAL LETTER DZE + u'\u0456' # 0x008a -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0406' # 0x008b -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0457' # 0x008c -> CYRILLIC SMALL LETTER YI + u'\u0407' # 0x008d -> CYRILLIC CAPITAL LETTER YI + u'\u0458' # 0x008e -> CYRILLIC SMALL LETTER JE + u'\u0408' # 0x008f -> CYRILLIC CAPITAL LETTER JE + u'\u0459' # 0x0090 -> CYRILLIC SMALL LETTER LJE + u'\u0409' # 0x0091 -> CYRILLIC CAPITAL LETTER LJE + u'\u045a' # 0x0092 -> CYRILLIC SMALL LETTER NJE + u'\u040a' # 0x0093 -> CYRILLIC CAPITAL LETTER NJE + u'\u045b' # 0x0094 -> CYRILLIC SMALL LETTER TSHE + u'\u040b' # 0x0095 -> CYRILLIC CAPITAL LETTER TSHE + u'\u045c' # 0x0096 -> CYRILLIC SMALL LETTER KJE + u'\u040c' # 0x0097 -> CYRILLIC CAPITAL LETTER KJE + u'\u045e' # 0x0098 -> CYRILLIC SMALL LETTER SHORT U + u'\u040e' # 0x0099 -> CYRILLIC CAPITAL LETTER SHORT U + u'\u045f' # 0x009a -> CYRILLIC SMALL LETTER DZHE + u'\u040f' # 0x009b -> CYRILLIC CAPITAL LETTER DZHE + u'\u044e' # 0x009c -> CYRILLIC SMALL LETTER YU + u'\u042e' # 0x009d -> CYRILLIC CAPITAL LETTER YU + u'\u044a' # 0x009e -> CYRILLIC SMALL LETTER HARD SIGN + u'\u042a' # 0x009f -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + u'\u0410' # 0x00a1 -> CYRILLIC CAPITAL LETTER A + u'\u0431' # 0x00a2 -> CYRILLIC SMALL LETTER BE + u'\u0411' # 0x00a3 -> CYRILLIC CAPITAL LETTER BE + u'\u0446' # 0x00a4 -> CYRILLIC SMALL LETTER TSE + u'\u0426' # 0x00a5 -> CYRILLIC CAPITAL LETTER TSE + u'\u0434' # 0x00a6 -> CYRILLIC SMALL LETTER DE + u'\u0414' # 0x00a7 -> CYRILLIC CAPITAL LETTER DE + u'\u0435' # 0x00a8 -> CYRILLIC SMALL LETTER IE + u'\u0415' # 0x00a9 -> CYRILLIC CAPITAL LETTER IE + u'\u0444' # 0x00aa -> CYRILLIC SMALL LETTER EF + u'\u0424' # 0x00ab -> CYRILLIC CAPITAL LETTER EF + u'\u0433' # 0x00ac -> CYRILLIC SMALL LETTER GHE + u'\u0413' # 0x00ad -> CYRILLIC CAPITAL LETTER GHE + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u0445' # 0x00b5 -> CYRILLIC SMALL LETTER HA + u'\u0425' # 0x00b6 -> CYRILLIC CAPITAL LETTER HA + u'\u0438' # 0x00b7 -> CYRILLIC SMALL LETTER I + u'\u0418' # 0x00b8 -> CYRILLIC CAPITAL LETTER I + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u0439' # 0x00bd -> CYRILLIC SMALL LETTER SHORT I + u'\u0419' # 0x00be -> CYRILLIC CAPITAL LETTER SHORT I + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u043a' # 0x00c6 -> CYRILLIC SMALL LETTER KA + u'\u041a' # 0x00c7 -> CYRILLIC CAPITAL LETTER KA + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\u043b' # 0x00d0 -> CYRILLIC SMALL LETTER EL + u'\u041b' # 0x00d1 -> CYRILLIC CAPITAL LETTER EL + u'\u043c' # 0x00d2 -> CYRILLIC SMALL LETTER EM + u'\u041c' # 0x00d3 -> CYRILLIC CAPITAL LETTER EM + u'\u043d' # 0x00d4 -> CYRILLIC SMALL LETTER EN + u'\u041d' # 0x00d5 -> CYRILLIC CAPITAL LETTER EN + u'\u043e' # 0x00d6 -> CYRILLIC SMALL LETTER O + u'\u041e' # 0x00d7 -> CYRILLIC CAPITAL LETTER O + u'\u043f' # 0x00d8 -> CYRILLIC SMALL LETTER PE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u041f' # 0x00dd -> CYRILLIC CAPITAL LETTER PE + u'\u044f' # 0x00de -> CYRILLIC SMALL LETTER YA + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u042f' # 0x00e0 -> CYRILLIC CAPITAL LETTER YA + u'\u0440' # 0x00e1 -> CYRILLIC SMALL LETTER ER + u'\u0420' # 0x00e2 -> CYRILLIC CAPITAL LETTER ER + u'\u0441' # 0x00e3 -> CYRILLIC SMALL LETTER ES + u'\u0421' # 0x00e4 -> CYRILLIC CAPITAL LETTER ES + u'\u0442' # 0x00e5 -> CYRILLIC SMALL LETTER TE + u'\u0422' # 0x00e6 -> CYRILLIC CAPITAL LETTER TE + u'\u0443' # 0x00e7 -> CYRILLIC SMALL LETTER U + u'\u0423' # 0x00e8 -> CYRILLIC CAPITAL LETTER U + u'\u0436' # 0x00e9 -> CYRILLIC SMALL LETTER ZHE + u'\u0416' # 0x00ea -> CYRILLIC CAPITAL LETTER ZHE + u'\u0432' # 0x00eb -> CYRILLIC SMALL LETTER VE + u'\u0412' # 0x00ec -> CYRILLIC CAPITAL LETTER VE + u'\u044c' # 0x00ed -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u042c' # 0x00ee -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u2116' # 0x00ef -> NUMERO SIGN + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\u044b' # 0x00f1 -> CYRILLIC SMALL LETTER YERU + u'\u042b' # 0x00f2 -> CYRILLIC CAPITAL LETTER YERU + u'\u0437' # 0x00f3 -> CYRILLIC SMALL LETTER ZE + u'\u0417' # 0x00f4 -> CYRILLIC CAPITAL LETTER ZE + u'\u0448' # 0x00f5 -> CYRILLIC SMALL LETTER SHA + u'\u0428' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHA + u'\u044d' # 0x00f7 -> CYRILLIC SMALL LETTER E + u'\u042d' # 0x00f8 -> CYRILLIC CAPITAL LETTER E + u'\u0449' # 0x00f9 -> CYRILLIC SMALL LETTER SHCHA + u'\u0429' # 0x00fa -> CYRILLIC CAPITAL LETTER SHCHA + u'\u0447' # 0x00fb -> CYRILLIC SMALL LETTER CHE + u'\u0427' # 0x00fc -> CYRILLIC CAPITAL LETTER CHE + u'\xa7' # 0x00fd -> SECTION SIGN + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a4: 0x00cf, # CURRENCY SIGN - 0x00a7: 0x00fd, # SECTION SIGN - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ad: 0x00f0, # SOFT HYPHEN - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x0401: 0x0085, # CYRILLIC CAPITAL LETTER IO - 0x0402: 0x0081, # CYRILLIC CAPITAL LETTER DJE - 0x0403: 0x0083, # CYRILLIC CAPITAL LETTER GJE - 0x0404: 0x0087, # CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x0405: 0x0089, # CYRILLIC CAPITAL LETTER DZE - 0x0406: 0x008b, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0407: 0x008d, # CYRILLIC CAPITAL LETTER YI - 0x0408: 0x008f, # CYRILLIC CAPITAL LETTER JE - 0x0409: 0x0091, # CYRILLIC CAPITAL LETTER LJE - 0x040a: 0x0093, # CYRILLIC CAPITAL LETTER NJE - 0x040b: 0x0095, # CYRILLIC CAPITAL LETTER TSHE - 0x040c: 0x0097, # CYRILLIC CAPITAL LETTER KJE - 0x040e: 0x0099, # CYRILLIC CAPITAL LETTER SHORT U - 0x040f: 0x009b, # CYRILLIC CAPITAL LETTER DZHE - 0x0410: 0x00a1, # CYRILLIC CAPITAL LETTER A - 0x0411: 0x00a3, # CYRILLIC CAPITAL LETTER BE - 0x0412: 0x00ec, # CYRILLIC CAPITAL LETTER VE - 0x0413: 0x00ad, # CYRILLIC CAPITAL LETTER GHE - 0x0414: 0x00a7, # CYRILLIC CAPITAL LETTER DE - 0x0415: 0x00a9, # CYRILLIC CAPITAL LETTER IE - 0x0416: 0x00ea, # CYRILLIC CAPITAL LETTER ZHE - 0x0417: 0x00f4, # CYRILLIC CAPITAL LETTER ZE - 0x0418: 0x00b8, # CYRILLIC CAPITAL LETTER I - 0x0419: 0x00be, # CYRILLIC CAPITAL LETTER SHORT I - 0x041a: 0x00c7, # CYRILLIC CAPITAL LETTER KA - 0x041b: 0x00d1, # CYRILLIC CAPITAL LETTER EL - 0x041c: 0x00d3, # CYRILLIC CAPITAL LETTER EM - 0x041d: 0x00d5, # CYRILLIC CAPITAL LETTER EN - 0x041e: 0x00d7, # CYRILLIC CAPITAL LETTER O - 0x041f: 0x00dd, # CYRILLIC CAPITAL LETTER PE - 0x0420: 0x00e2, # CYRILLIC CAPITAL LETTER ER - 0x0421: 0x00e4, # CYRILLIC CAPITAL LETTER ES - 0x0422: 0x00e6, # CYRILLIC CAPITAL LETTER TE - 0x0423: 0x00e8, # CYRILLIC CAPITAL LETTER U - 0x0424: 0x00ab, # CYRILLIC CAPITAL LETTER EF - 0x0425: 0x00b6, # CYRILLIC CAPITAL LETTER HA - 0x0426: 0x00a5, # CYRILLIC CAPITAL LETTER TSE - 0x0427: 0x00fc, # CYRILLIC CAPITAL LETTER CHE - 0x0428: 0x00f6, # CYRILLIC CAPITAL LETTER SHA - 0x0429: 0x00fa, # CYRILLIC CAPITAL LETTER SHCHA - 0x042a: 0x009f, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x042b: 0x00f2, # CYRILLIC CAPITAL LETTER YERU - 0x042c: 0x00ee, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x042d: 0x00f8, # CYRILLIC CAPITAL LETTER E - 0x042e: 0x009d, # CYRILLIC CAPITAL LETTER YU - 0x042f: 0x00e0, # CYRILLIC CAPITAL LETTER YA - 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A - 0x0431: 0x00a2, # CYRILLIC SMALL LETTER BE - 0x0432: 0x00eb, # CYRILLIC SMALL LETTER VE - 0x0433: 0x00ac, # CYRILLIC SMALL LETTER GHE - 0x0434: 0x00a6, # CYRILLIC SMALL LETTER DE - 0x0435: 0x00a8, # CYRILLIC SMALL LETTER IE - 0x0436: 0x00e9, # CYRILLIC SMALL LETTER ZHE - 0x0437: 0x00f3, # CYRILLIC SMALL LETTER ZE - 0x0438: 0x00b7, # CYRILLIC SMALL LETTER I - 0x0439: 0x00bd, # CYRILLIC SMALL LETTER SHORT I - 0x043a: 0x00c6, # CYRILLIC SMALL LETTER KA - 0x043b: 0x00d0, # CYRILLIC SMALL LETTER EL - 0x043c: 0x00d2, # CYRILLIC SMALL LETTER EM - 0x043d: 0x00d4, # CYRILLIC SMALL LETTER EN - 0x043e: 0x00d6, # CYRILLIC SMALL LETTER O - 0x043f: 0x00d8, # CYRILLIC SMALL LETTER PE - 0x0440: 0x00e1, # CYRILLIC SMALL LETTER ER - 0x0441: 0x00e3, # CYRILLIC SMALL LETTER ES - 0x0442: 0x00e5, # CYRILLIC SMALL LETTER TE - 0x0443: 0x00e7, # CYRILLIC SMALL LETTER U - 0x0444: 0x00aa, # CYRILLIC SMALL LETTER EF - 0x0445: 0x00b5, # CYRILLIC SMALL LETTER HA - 0x0446: 0x00a4, # CYRILLIC SMALL LETTER TSE - 0x0447: 0x00fb, # CYRILLIC SMALL LETTER CHE - 0x0448: 0x00f5, # CYRILLIC SMALL LETTER SHA - 0x0449: 0x00f9, # CYRILLIC SMALL LETTER SHCHA - 0x044a: 0x009e, # CYRILLIC SMALL LETTER HARD SIGN - 0x044b: 0x00f1, # CYRILLIC SMALL LETTER YERU - 0x044c: 0x00ed, # CYRILLIC SMALL LETTER SOFT SIGN - 0x044d: 0x00f7, # CYRILLIC SMALL LETTER E - 0x044e: 0x009c, # CYRILLIC SMALL LETTER YU - 0x044f: 0x00de, # CYRILLIC SMALL LETTER YA - 0x0451: 0x0084, # CYRILLIC SMALL LETTER IO - 0x0452: 0x0080, # CYRILLIC SMALL LETTER DJE - 0x0453: 0x0082, # CYRILLIC SMALL LETTER GJE - 0x0454: 0x0086, # CYRILLIC SMALL LETTER UKRAINIAN IE - 0x0455: 0x0088, # CYRILLIC SMALL LETTER DZE - 0x0456: 0x008a, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0457: 0x008c, # CYRILLIC SMALL LETTER YI - 0x0458: 0x008e, # CYRILLIC SMALL LETTER JE - 0x0459: 0x0090, # CYRILLIC SMALL LETTER LJE - 0x045a: 0x0092, # CYRILLIC SMALL LETTER NJE - 0x045b: 0x0094, # CYRILLIC SMALL LETTER TSHE - 0x045c: 0x0096, # CYRILLIC SMALL LETTER KJE - 0x045e: 0x0098, # CYRILLIC SMALL LETTER SHORT U - 0x045f: 0x009a, # CYRILLIC SMALL LETTER DZHE - 0x2116: 0x00ef, # NUMERO SIGN - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00fd, # SECTION SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x0401: 0x0085, # CYRILLIC CAPITAL LETTER IO + 0x0402: 0x0081, # CYRILLIC CAPITAL LETTER DJE + 0x0403: 0x0083, # CYRILLIC CAPITAL LETTER GJE + 0x0404: 0x0087, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0405: 0x0089, # CYRILLIC CAPITAL LETTER DZE + 0x0406: 0x008b, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0x008d, # CYRILLIC CAPITAL LETTER YI + 0x0408: 0x008f, # CYRILLIC CAPITAL LETTER JE + 0x0409: 0x0091, # CYRILLIC CAPITAL LETTER LJE + 0x040a: 0x0093, # CYRILLIC CAPITAL LETTER NJE + 0x040b: 0x0095, # CYRILLIC CAPITAL LETTER TSHE + 0x040c: 0x0097, # CYRILLIC CAPITAL LETTER KJE + 0x040e: 0x0099, # CYRILLIC CAPITAL LETTER SHORT U + 0x040f: 0x009b, # CYRILLIC CAPITAL LETTER DZHE + 0x0410: 0x00a1, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x00a3, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x00ec, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x00ad, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x00a7, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x00a9, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x00ea, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x00f4, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x00b8, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x00be, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x00c7, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x00d1, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x00d3, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x00d5, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x00d7, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x00dd, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x00e2, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x00e4, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x00e6, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x00e8, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x00ab, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x00b6, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x00a5, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x00fc, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x00f6, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x00fa, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009f, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x00f2, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x00ee, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x00f8, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009d, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x00e0, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a2, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00eb, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00ac, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a6, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a8, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00e9, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00f3, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00b7, # CYRILLIC SMALL LETTER I + 0x0439: 0x00bd, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00c6, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00d0, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00d2, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00d4, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00d6, # CYRILLIC SMALL LETTER O + 0x043f: 0x00d8, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e1, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e3, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e5, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e7, # CYRILLIC SMALL LETTER U + 0x0444: 0x00aa, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00b5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00a4, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00fb, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00f5, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00f9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x009e, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00f1, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ed, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00f7, # CYRILLIC SMALL LETTER E + 0x044e: 0x009c, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00de, # CYRILLIC SMALL LETTER YA + 0x0451: 0x0084, # CYRILLIC SMALL LETTER IO + 0x0452: 0x0080, # CYRILLIC SMALL LETTER DJE + 0x0453: 0x0082, # CYRILLIC SMALL LETTER GJE + 0x0454: 0x0086, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0455: 0x0088, # CYRILLIC SMALL LETTER DZE + 0x0456: 0x008a, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0x008c, # CYRILLIC SMALL LETTER YI + 0x0458: 0x008e, # CYRILLIC SMALL LETTER JE + 0x0459: 0x0090, # CYRILLIC SMALL LETTER LJE + 0x045a: 0x0092, # CYRILLIC SMALL LETTER NJE + 0x045b: 0x0094, # CYRILLIC SMALL LETTER TSHE + 0x045c: 0x0096, # CYRILLIC SMALL LETTER KJE + 0x045e: 0x0098, # CYRILLIC SMALL LETTER SHORT U + 0x045f: 0x009a, # CYRILLIC SMALL LETTER DZHE + 0x2116: 0x00ef, # NUMERO SIGN + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp856.py ============================================================================== --- python/trunk/Lib/encodings/cp856.py (original) +++ python/trunk/Lib/encodings/cp856.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,481 +32,480 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u05d0' # 0x80 -> HEBREW LETTER ALEF - u'\u05d1' # 0x81 -> HEBREW LETTER BET - u'\u05d2' # 0x82 -> HEBREW LETTER GIMEL - u'\u05d3' # 0x83 -> HEBREW LETTER DALET - u'\u05d4' # 0x84 -> HEBREW LETTER HE - u'\u05d5' # 0x85 -> HEBREW LETTER VAV - u'\u05d6' # 0x86 -> HEBREW LETTER ZAYIN - u'\u05d7' # 0x87 -> HEBREW LETTER HET - u'\u05d8' # 0x88 -> HEBREW LETTER TET - u'\u05d9' # 0x89 -> HEBREW LETTER YOD - u'\u05da' # 0x8A -> HEBREW LETTER FINAL KAF - u'\u05db' # 0x8B -> HEBREW LETTER KAF - u'\u05dc' # 0x8C -> HEBREW LETTER LAMED - u'\u05dd' # 0x8D -> HEBREW LETTER FINAL MEM - u'\u05de' # 0x8E -> HEBREW LETTER MEM - u'\u05df' # 0x8F -> HEBREW LETTER FINAL NUN - u'\u05e0' # 0x90 -> HEBREW LETTER NUN - u'\u05e1' # 0x91 -> HEBREW LETTER SAMEKH - u'\u05e2' # 0x92 -> HEBREW LETTER AYIN - u'\u05e3' # 0x93 -> HEBREW LETTER FINAL PE - u'\u05e4' # 0x94 -> HEBREW LETTER PE - u'\u05e5' # 0x95 -> HEBREW LETTER FINAL TSADI - u'\u05e6' # 0x96 -> HEBREW LETTER TSADI - u'\u05e7' # 0x97 -> HEBREW LETTER QOF - u'\u05e8' # 0x98 -> HEBREW LETTER RESH - u'\u05e9' # 0x99 -> HEBREW LETTER SHIN - u'\u05ea' # 0x9A -> HEBREW LETTER TAV - u'\ufffe' # 0x9B -> UNDEFINED - u'\xa3' # 0x9C -> POUND SIGN - u'\ufffe' # 0x9D -> UNDEFINED - u'\xd7' # 0x9E -> MULTIPLICATION SIGN - u'\ufffe' # 0x9F -> UNDEFINED - u'\ufffe' # 0xA0 -> UNDEFINED - u'\ufffe' # 0xA1 -> UNDEFINED - u'\ufffe' # 0xA2 -> UNDEFINED - u'\ufffe' # 0xA3 -> UNDEFINED - u'\ufffe' # 0xA4 -> UNDEFINED - u'\ufffe' # 0xA5 -> UNDEFINED - u'\ufffe' # 0xA6 -> UNDEFINED - u'\ufffe' # 0xA7 -> UNDEFINED - u'\ufffe' # 0xA8 -> UNDEFINED - u'\xae' # 0xA9 -> REGISTERED SIGN - u'\xac' # 0xAA -> NOT SIGN - u'\xbd' # 0xAB -> VULGAR FRACTION ONE HALF - u'\xbc' # 0xAC -> VULGAR FRACTION ONE QUARTER - u'\ufffe' # 0xAD -> UNDEFINED - u'\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0xB0 -> LIGHT SHADE - u'\u2592' # 0xB1 -> MEDIUM SHADE - u'\u2593' # 0xB2 -> DARK SHADE - u'\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\ufffe' # 0xB5 -> UNDEFINED - u'\ufffe' # 0xB6 -> UNDEFINED - u'\ufffe' # 0xB7 -> UNDEFINED - u'\xa9' # 0xB8 -> COPYRIGHT SIGN - u'\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\xa2' # 0xBD -> CENT SIGN - u'\xa5' # 0xBE -> YEN SIGN - u'\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\ufffe' # 0xC6 -> UNDEFINED - u'\ufffe' # 0xC7 -> UNDEFINED - u'\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\xa4' # 0xCF -> CURRENCY SIGN - u'\ufffe' # 0xD0 -> UNDEFINED - u'\ufffe' # 0xD1 -> UNDEFINED - u'\ufffe' # 0xD2 -> UNDEFINED - u'\ufffe' # 0xD3 -> UNDEFINEDS - u'\ufffe' # 0xD4 -> UNDEFINED - u'\ufffe' # 0xD5 -> UNDEFINED - u'\ufffe' # 0xD6 -> UNDEFINEDE - u'\ufffe' # 0xD7 -> UNDEFINED - u'\ufffe' # 0xD8 -> UNDEFINED - u'\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0xDB -> FULL BLOCK - u'\u2584' # 0xDC -> LOWER HALF BLOCK - u'\xa6' # 0xDD -> BROKEN BAR - u'\ufffe' # 0xDE -> UNDEFINED - u'\u2580' # 0xDF -> UPPER HALF BLOCK - u'\ufffe' # 0xE0 -> UNDEFINED - u'\ufffe' # 0xE1 -> UNDEFINED - u'\ufffe' # 0xE2 -> UNDEFINED - u'\ufffe' # 0xE3 -> UNDEFINED - u'\ufffe' # 0xE4 -> UNDEFINED - u'\ufffe' # 0xE5 -> UNDEFINED - u'\xb5' # 0xE6 -> MICRO SIGN - u'\ufffe' # 0xE7 -> UNDEFINED - u'\ufffe' # 0xE8 -> UNDEFINED - u'\ufffe' # 0xE9 -> UNDEFINED - u'\ufffe' # 0xEA -> UNDEFINED - u'\ufffe' # 0xEB -> UNDEFINED - u'\ufffe' # 0xEC -> UNDEFINED - u'\ufffe' # 0xED -> UNDEFINED - u'\xaf' # 0xEE -> MACRON - u'\xb4' # 0xEF -> ACUTE ACCENT - u'\xad' # 0xF0 -> SOFT HYPHEN - u'\xb1' # 0xF1 -> PLUS-MINUS SIGN - u'\u2017' # 0xF2 -> DOUBLE LOW LINE - u'\xbe' # 0xF3 -> VULGAR FRACTION THREE QUARTERS - u'\xb6' # 0xF4 -> PILCROW SIGN - u'\xa7' # 0xF5 -> SECTION SIGN - u'\xf7' # 0xF6 -> DIVISION SIGN - u'\xb8' # 0xF7 -> CEDILLA - u'\xb0' # 0xF8 -> DEGREE SIGN - u'\xa8' # 0xF9 -> DIAERESIS - u'\xb7' # 0xFA -> MIDDLE DOT - u'\xb9' # 0xFB -> SUPERSCRIPT ONE - u'\xb3' # 0xFC -> SUPERSCRIPT THREE - u'\xb2' # 0xFD -> SUPERSCRIPT TWO - u'\u25a0' # 0xFE -> BLACK SQUARE - u'\xa0' # 0xFF -> NO-BREAK SPACE + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u05d0' # 0x80 -> HEBREW LETTER ALEF + u'\u05d1' # 0x81 -> HEBREW LETTER BET + u'\u05d2' # 0x82 -> HEBREW LETTER GIMEL + u'\u05d3' # 0x83 -> HEBREW LETTER DALET + u'\u05d4' # 0x84 -> HEBREW LETTER HE + u'\u05d5' # 0x85 -> HEBREW LETTER VAV + u'\u05d6' # 0x86 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0x87 -> HEBREW LETTER HET + u'\u05d8' # 0x88 -> HEBREW LETTER TET + u'\u05d9' # 0x89 -> HEBREW LETTER YOD + u'\u05da' # 0x8A -> HEBREW LETTER FINAL KAF + u'\u05db' # 0x8B -> HEBREW LETTER KAF + u'\u05dc' # 0x8C -> HEBREW LETTER LAMED + u'\u05dd' # 0x8D -> HEBREW LETTER FINAL MEM + u'\u05de' # 0x8E -> HEBREW LETTER MEM + u'\u05df' # 0x8F -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0x90 -> HEBREW LETTER NUN + u'\u05e1' # 0x91 -> HEBREW LETTER SAMEKH + u'\u05e2' # 0x92 -> HEBREW LETTER AYIN + u'\u05e3' # 0x93 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0x94 -> HEBREW LETTER PE + u'\u05e5' # 0x95 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0x96 -> HEBREW LETTER TSADI + u'\u05e7' # 0x97 -> HEBREW LETTER QOF + u'\u05e8' # 0x98 -> HEBREW LETTER RESH + u'\u05e9' # 0x99 -> HEBREW LETTER SHIN + u'\u05ea' # 0x9A -> HEBREW LETTER TAV + u'\ufffe' # 0x9B -> UNDEFINED + u'\xa3' # 0x9C -> POUND SIGN + u'\ufffe' # 0x9D -> UNDEFINED + u'\xd7' # 0x9E -> MULTIPLICATION SIGN + u'\ufffe' # 0x9F -> UNDEFINED + u'\ufffe' # 0xA0 -> UNDEFINED + u'\ufffe' # 0xA1 -> UNDEFINED + u'\ufffe' # 0xA2 -> UNDEFINED + u'\ufffe' # 0xA3 -> UNDEFINED + u'\ufffe' # 0xA4 -> UNDEFINED + u'\ufffe' # 0xA5 -> UNDEFINED + u'\ufffe' # 0xA6 -> UNDEFINED + u'\ufffe' # 0xA7 -> UNDEFINED + u'\ufffe' # 0xA8 -> UNDEFINED + u'\xae' # 0xA9 -> REGISTERED SIGN + u'\xac' # 0xAA -> NOT SIGN + u'\xbd' # 0xAB -> VULGAR FRACTION ONE HALF + u'\xbc' # 0xAC -> VULGAR FRACTION ONE QUARTER + u'\ufffe' # 0xAD -> UNDEFINED + u'\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0xB0 -> LIGHT SHADE + u'\u2592' # 0xB1 -> MEDIUM SHADE + u'\u2593' # 0xB2 -> DARK SHADE + u'\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\ufffe' # 0xB5 -> UNDEFINED + u'\ufffe' # 0xB6 -> UNDEFINED + u'\ufffe' # 0xB7 -> UNDEFINED + u'\xa9' # 0xB8 -> COPYRIGHT SIGN + u'\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\xa2' # 0xBD -> CENT SIGN + u'\xa5' # 0xBE -> YEN SIGN + u'\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\ufffe' # 0xC6 -> UNDEFINED + u'\ufffe' # 0xC7 -> UNDEFINED + u'\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0xCF -> CURRENCY SIGN + u'\ufffe' # 0xD0 -> UNDEFINED + u'\ufffe' # 0xD1 -> UNDEFINED + u'\ufffe' # 0xD2 -> UNDEFINED + u'\ufffe' # 0xD3 -> UNDEFINEDS + u'\ufffe' # 0xD4 -> UNDEFINED + u'\ufffe' # 0xD5 -> UNDEFINED + u'\ufffe' # 0xD6 -> UNDEFINEDE + u'\ufffe' # 0xD7 -> UNDEFINED + u'\ufffe' # 0xD8 -> UNDEFINED + u'\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0xDB -> FULL BLOCK + u'\u2584' # 0xDC -> LOWER HALF BLOCK + u'\xa6' # 0xDD -> BROKEN BAR + u'\ufffe' # 0xDE -> UNDEFINED + u'\u2580' # 0xDF -> UPPER HALF BLOCK + u'\ufffe' # 0xE0 -> UNDEFINED + u'\ufffe' # 0xE1 -> UNDEFINED + u'\ufffe' # 0xE2 -> UNDEFINED + u'\ufffe' # 0xE3 -> UNDEFINED + u'\ufffe' # 0xE4 -> UNDEFINED + u'\ufffe' # 0xE5 -> UNDEFINED + u'\xb5' # 0xE6 -> MICRO SIGN + u'\ufffe' # 0xE7 -> UNDEFINED + u'\ufffe' # 0xE8 -> UNDEFINED + u'\ufffe' # 0xE9 -> UNDEFINED + u'\ufffe' # 0xEA -> UNDEFINED + u'\ufffe' # 0xEB -> UNDEFINED + u'\ufffe' # 0xEC -> UNDEFINED + u'\ufffe' # 0xED -> UNDEFINED + u'\xaf' # 0xEE -> MACRON + u'\xb4' # 0xEF -> ACUTE ACCENT + u'\xad' # 0xF0 -> SOFT HYPHEN + u'\xb1' # 0xF1 -> PLUS-MINUS SIGN + u'\u2017' # 0xF2 -> DOUBLE LOW LINE + u'\xbe' # 0xF3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0xF4 -> PILCROW SIGN + u'\xa7' # 0xF5 -> SECTION SIGN + u'\xf7' # 0xF6 -> DIVISION SIGN + u'\xb8' # 0xF7 -> CEDILLA + u'\xb0' # 0xF8 -> DEGREE SIGN + u'\xa8' # 0xF9 -> DIAERESIS + u'\xb7' # 0xFA -> MIDDLE DOT + u'\xb9' # 0xFB -> SUPERSCRIPT ONE + u'\xb3' # 0xFC -> SUPERSCRIPT THREE + u'\xb2' # 0xFD -> SUPERSCRIPT TWO + u'\u25a0' # 0xFE -> BLACK SQUARE + u'\xa0' # 0xFF -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xFF, # NO-BREAK SPACE - 0x00A2: 0xBD, # CENT SIGN - 0x00A3: 0x9C, # POUND SIGN - 0x00A4: 0xCF, # CURRENCY SIGN - 0x00A5: 0xBE, # YEN SIGN - 0x00A6: 0xDD, # BROKEN BAR - 0x00A7: 0xF5, # SECTION SIGN - 0x00A8: 0xF9, # DIAERESIS - 0x00A9: 0xB8, # COPYRIGHT SIGN - 0x00AB: 0xAE, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAA, # NOT SIGN - 0x00AD: 0xF0, # SOFT HYPHEN - 0x00AE: 0xA9, # REGISTERED SIGN - 0x00AF: 0xEE, # MACRON - 0x00B0: 0xF8, # DEGREE SIGN - 0x00B1: 0xF1, # PLUS-MINUS SIGN - 0x00B2: 0xFD, # SUPERSCRIPT TWO - 0x00B3: 0xFC, # SUPERSCRIPT THREE - 0x00B4: 0xEF, # ACUTE ACCENT - 0x00B5: 0xE6, # MICRO SIGN - 0x00B6: 0xF4, # PILCROW SIGN - 0x00B7: 0xFA, # MIDDLE DOT - 0x00B8: 0xF7, # CEDILLA - 0x00B9: 0xFB, # SUPERSCRIPT ONE - 0x00BB: 0xAF, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xAC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xAB, # VULGAR FRACTION ONE HALF - 0x00BE: 0xF3, # VULGAR FRACTION THREE QUARTERS - 0x00D7: 0x9E, # MULTIPLICATION SIGN - 0x00F7: 0xF6, # DIVISION SIGN - 0x05D0: 0x80, # HEBREW LETTER ALEF - 0x05D1: 0x81, # HEBREW LETTER BET - 0x05D2: 0x82, # HEBREW LETTER GIMEL - 0x05D3: 0x83, # HEBREW LETTER DALET - 0x05D4: 0x84, # HEBREW LETTER HE - 0x05D5: 0x85, # HEBREW LETTER VAV - 0x05D6: 0x86, # HEBREW LETTER ZAYIN - 0x05D7: 0x87, # HEBREW LETTER HET - 0x05D8: 0x88, # HEBREW LETTER TET - 0x05D9: 0x89, # HEBREW LETTER YOD - 0x05DA: 0x8A, # HEBREW LETTER FINAL KAF - 0x05DB: 0x8B, # HEBREW LETTER KAF - 0x05DC: 0x8C, # HEBREW LETTER LAMED - 0x05DD: 0x8D, # HEBREW LETTER FINAL MEM - 0x05DE: 0x8E, # HEBREW LETTER MEM - 0x05DF: 0x8F, # HEBREW LETTER FINAL NUN - 0x05E0: 0x90, # HEBREW LETTER NUN - 0x05E1: 0x91, # HEBREW LETTER SAMEKH - 0x05E2: 0x92, # HEBREW LETTER AYIN - 0x05E3: 0x93, # HEBREW LETTER FINAL PE - 0x05E4: 0x94, # HEBREW LETTER PE - 0x05E5: 0x95, # HEBREW LETTER FINAL TSADI - 0x05E6: 0x96, # HEBREW LETTER TSADI - 0x05E7: 0x97, # HEBREW LETTER QOF - 0x05E8: 0x98, # HEBREW LETTER RESH - 0x05E9: 0x99, # HEBREW LETTER SHIN - 0x05EA: 0x9A, # HEBREW LETTER TAV - 0x2017: 0xF2, # DOUBLE LOW LINE - 0x2500: 0xC4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0xB3, # BOX DRAWINGS LIGHT VERTICAL - 0x250C: 0xDA, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0xBF, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0xC0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0xD9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251C: 0xC3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0xB4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252C: 0xC2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0xC1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253C: 0xC5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0xCD, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0xBA, # BOX DRAWINGS DOUBLE VERTICAL - 0x2554: 0xC9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2557: 0xBB, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x255A: 0xC8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255D: 0xBC, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x2560: 0xCC, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2563: 0xB9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2566: 0xCB, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2569: 0xCA, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256C: 0xCE, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0xDF, # UPPER HALF BLOCK - 0x2584: 0xDC, # LOWER HALF BLOCK - 0x2588: 0xDB, # FULL BLOCK - 0x2591: 0xB0, # LIGHT SHADE - 0x2592: 0xB1, # MEDIUM SHADE - 0x2593: 0xB2, # DARK SHADE - 0x25A0: 0xFE, # BLACK SQUARE + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xFF, # NO-BREAK SPACE + 0x00A2: 0xBD, # CENT SIGN + 0x00A3: 0x9C, # POUND SIGN + 0x00A4: 0xCF, # CURRENCY SIGN + 0x00A5: 0xBE, # YEN SIGN + 0x00A6: 0xDD, # BROKEN BAR + 0x00A7: 0xF5, # SECTION SIGN + 0x00A8: 0xF9, # DIAERESIS + 0x00A9: 0xB8, # COPYRIGHT SIGN + 0x00AB: 0xAE, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAA, # NOT SIGN + 0x00AD: 0xF0, # SOFT HYPHEN + 0x00AE: 0xA9, # REGISTERED SIGN + 0x00AF: 0xEE, # MACRON + 0x00B0: 0xF8, # DEGREE SIGN + 0x00B1: 0xF1, # PLUS-MINUS SIGN + 0x00B2: 0xFD, # SUPERSCRIPT TWO + 0x00B3: 0xFC, # SUPERSCRIPT THREE + 0x00B4: 0xEF, # ACUTE ACCENT + 0x00B5: 0xE6, # MICRO SIGN + 0x00B6: 0xF4, # PILCROW SIGN + 0x00B7: 0xFA, # MIDDLE DOT + 0x00B8: 0xF7, # CEDILLA + 0x00B9: 0xFB, # SUPERSCRIPT ONE + 0x00BB: 0xAF, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xAC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xAB, # VULGAR FRACTION ONE HALF + 0x00BE: 0xF3, # VULGAR FRACTION THREE QUARTERS + 0x00D7: 0x9E, # MULTIPLICATION SIGN + 0x00F7: 0xF6, # DIVISION SIGN + 0x05D0: 0x80, # HEBREW LETTER ALEF + 0x05D1: 0x81, # HEBREW LETTER BET + 0x05D2: 0x82, # HEBREW LETTER GIMEL + 0x05D3: 0x83, # HEBREW LETTER DALET + 0x05D4: 0x84, # HEBREW LETTER HE + 0x05D5: 0x85, # HEBREW LETTER VAV + 0x05D6: 0x86, # HEBREW LETTER ZAYIN + 0x05D7: 0x87, # HEBREW LETTER HET + 0x05D8: 0x88, # HEBREW LETTER TET + 0x05D9: 0x89, # HEBREW LETTER YOD + 0x05DA: 0x8A, # HEBREW LETTER FINAL KAF + 0x05DB: 0x8B, # HEBREW LETTER KAF + 0x05DC: 0x8C, # HEBREW LETTER LAMED + 0x05DD: 0x8D, # HEBREW LETTER FINAL MEM + 0x05DE: 0x8E, # HEBREW LETTER MEM + 0x05DF: 0x8F, # HEBREW LETTER FINAL NUN + 0x05E0: 0x90, # HEBREW LETTER NUN + 0x05E1: 0x91, # HEBREW LETTER SAMEKH + 0x05E2: 0x92, # HEBREW LETTER AYIN + 0x05E3: 0x93, # HEBREW LETTER FINAL PE + 0x05E4: 0x94, # HEBREW LETTER PE + 0x05E5: 0x95, # HEBREW LETTER FINAL TSADI + 0x05E6: 0x96, # HEBREW LETTER TSADI + 0x05E7: 0x97, # HEBREW LETTER QOF + 0x05E8: 0x98, # HEBREW LETTER RESH + 0x05E9: 0x99, # HEBREW LETTER SHIN + 0x05EA: 0x9A, # HEBREW LETTER TAV + 0x2017: 0xF2, # DOUBLE LOW LINE + 0x2500: 0xC4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0xB3, # BOX DRAWINGS LIGHT VERTICAL + 0x250C: 0xDA, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0xBF, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0xC0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0xD9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251C: 0xC3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0xB4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252C: 0xC2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0xC1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253C: 0xC5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0xCD, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0xBA, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0xC9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0xBB, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255A: 0xC8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255D: 0xBC, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0xCC, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0xB9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0xCB, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0xCA, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256C: 0xCE, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0xDF, # UPPER HALF BLOCK + 0x2584: 0xDC, # LOWER HALF BLOCK + 0x2588: 0xDB, # FULL BLOCK + 0x2591: 0xB0, # LIGHT SHADE + 0x2592: 0xB1, # MEDIUM SHADE + 0x2593: 0xB2, # DARK SHADE + 0x25A0: 0xFE, # BLACK SQUARE } - Modified: python/trunk/Lib/encodings/cp857.py ============================================================================== --- python/trunk/Lib/encodings/cp857.py (original) +++ python/trunk/Lib/encodings/cp857.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,650 +32,650 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS - 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x008d: 0x0131, # LATIN SMALL LETTER DOTLESS I - 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE - 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE - 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE - 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE - 0x0098: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE - 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE - 0x009e: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x009f: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA - 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE - 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00a6: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE - 0x00a7: 0x011f, # LATIN SMALL LETTER G WITH BREVE - 0x00a8: 0x00bf, # INVERTED QUESTION MARK - 0x00a9: 0x00ae, # REGISTERED SIGN - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00b8: 0x00a9, # COPYRIGHT SIGN - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x00a2, # CENT SIGN - 0x00be: 0x00a5, # YEN SIGN - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE - 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x00a4, # CURRENCY SIGN - 0x00d0: 0x00ba, # MASCULINE ORDINAL INDICATOR - 0x00d1: 0x00aa, # FEMININE ORDINAL INDICATOR - 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00d5: None, # UNDEFINED - 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x00a6, # BROKEN BAR - 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE - 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: None, # UNDEFINED - 0x00e8: 0x00d7, # MULTIPLICATION SIGN - 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00ed: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x00ee: 0x00af, # MACRON - 0x00ef: 0x00b4, # ACUTE ACCENT - 0x00f0: 0x00ad, # SOFT HYPHEN - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: None, # UNDEFINED - 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS - 0x00f4: 0x00b6, # PILCROW SIGN - 0x00f5: 0x00a7, # SECTION SIGN - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x00b8, # CEDILLA - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x00a8, # DIAERESIS - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x00b9, # SUPERSCRIPT ONE - 0x00fc: 0x00b3, # SUPERSCRIPT THREE - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x009f: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00a7: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00d1: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: None, # UNDEFINED + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: None, # UNDEFINED + 0x00e8: 0x00d7, # MULTIPLICATION SIGN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ed: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: None, # UNDEFINED + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE - u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\u0131' # 0x008d -> LATIN SMALL LETTER DOTLESS I - u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE - u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE - u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE - u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE - u'\u0130' # 0x0098 -> LATIN CAPITAL LETTER I WITH DOT ABOVE - u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE - u'\xa3' # 0x009c -> POUND SIGN - u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE - u'\u015e' # 0x009e -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\u015f' # 0x009f -> LATIN SMALL LETTER S WITH CEDILLA - u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE - u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE - u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE - u'\u011e' # 0x00a6 -> LATIN CAPITAL LETTER G WITH BREVE - u'\u011f' # 0x00a7 -> LATIN SMALL LETTER G WITH BREVE - u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK - u'\xae' # 0x00a9 -> REGISTERED SIGN - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xa9' # 0x00b8 -> COPYRIGHT SIGN - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\xa2' # 0x00bd -> CENT SIGN - u'\xa5' # 0x00be -> YEN SIGN - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE - u'\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\xa4' # 0x00cf -> CURRENCY SIGN - u'\xba' # 0x00d0 -> MASCULINE ORDINAL INDICATOR - u'\xaa' # 0x00d1 -> FEMININE ORDINAL INDICATOR - u'\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\ufffe' # 0x00d5 -> UNDEFINED - u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\xa6' # 0x00dd -> BROKEN BAR - u'\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S - u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE - u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\ufffe' # 0x00e7 -> UNDEFINED - u'\xd7' # 0x00e8 -> MULTIPLICATION SIGN - u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xec' # 0x00ec -> LATIN SMALL LETTER I WITH GRAVE - u'\xff' # 0x00ed -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\xaf' # 0x00ee -> MACRON - u'\xb4' # 0x00ef -> ACUTE ACCENT - u'\xad' # 0x00f0 -> SOFT HYPHEN - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\ufffe' # 0x00f2 -> UNDEFINED - u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS - u'\xb6' # 0x00f4 -> PILCROW SIGN - u'\xa7' # 0x00f5 -> SECTION SIGN - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\xb8' # 0x00f7 -> CEDILLA - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\xa8' # 0x00f9 -> DIAERESIS - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\xb9' # 0x00fb -> SUPERSCRIPT ONE - u'\xb3' # 0x00fc -> SUPERSCRIPT THREE - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u0131' # 0x008d -> LATIN SMALL LETTER DOTLESS I + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\u0130' # 0x0098 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\u015e' # 0x009e -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u015f' # 0x009f -> LATIN SMALL LETTER S WITH CEDILLA + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\u011e' # 0x00a6 -> LATIN CAPITAL LETTER G WITH BREVE + u'\u011f' # 0x00a7 -> LATIN SMALL LETTER G WITH BREVE + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\xae' # 0x00a9 -> REGISTERED SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xa9' # 0x00b8 -> COPYRIGHT SIGN + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\xa2' # 0x00bd -> CENT SIGN + u'\xa5' # 0x00be -> YEN SIGN + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + u'\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa4' # 0x00cf -> CURRENCY SIGN + u'\xba' # 0x00d0 -> MASCULINE ORDINAL INDICATOR + u'\xaa' # 0x00d1 -> FEMININE ORDINAL INDICATOR + u'\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\ufffe' # 0x00d5 -> UNDEFINED + u'\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\xa6' # 0x00dd -> BROKEN BAR + u'\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + u'\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\ufffe' # 0x00e7 -> UNDEFINED + u'\xd7' # 0x00e8 -> MULTIPLICATION SIGN + u'\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xec' # 0x00ec -> LATIN SMALL LETTER I WITH GRAVE + u'\xff' # 0x00ed -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xaf' # 0x00ee -> MACRON + u'\xb4' # 0x00ef -> ACUTE ACCENT + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\ufffe' # 0x00f2 -> UNDEFINED + u'\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + u'\xb6' # 0x00f4 -> PILCROW SIGN + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\xb8' # 0x00f7 -> CEDILLA + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\xb9' # 0x00fb -> SUPERSCRIPT ONE + u'\xb3' # 0x00fc -> SUPERSCRIPT THREE + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK - 0x00a2: 0x00bd, # CENT SIGN - 0x00a3: 0x009c, # POUND SIGN - 0x00a4: 0x00cf, # CURRENCY SIGN - 0x00a5: 0x00be, # YEN SIGN - 0x00a6: 0x00dd, # BROKEN BAR - 0x00a7: 0x00f5, # SECTION SIGN - 0x00a8: 0x00f9, # DIAERESIS - 0x00a9: 0x00b8, # COPYRIGHT SIGN - 0x00aa: 0x00d1, # FEMININE ORDINAL INDICATOR - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00ad: 0x00f0, # SOFT HYPHEN - 0x00ae: 0x00a9, # REGISTERED SIGN - 0x00af: 0x00ee, # MACRON - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b3: 0x00fc, # SUPERSCRIPT THREE - 0x00b4: 0x00ef, # ACUTE ACCENT - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b6: 0x00f4, # PILCROW SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00b8: 0x00f7, # CEDILLA - 0x00b9: 0x00fb, # SUPERSCRIPT ONE - 0x00ba: 0x00d0, # MASCULINE ORDINAL INDICATOR - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS - 0x00bf: 0x00a8, # INVERTED QUESTION MARK - 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE - 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE - 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE - 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00d7: 0x00e8, # MULTIPLICATION SIGN - 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE - 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S - 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE - 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE - 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE - 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ec: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE - 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE - 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE - 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE - 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE - 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00ff: 0x00ed, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x011e: 0x00a6, # LATIN CAPITAL LETTER G WITH BREVE - 0x011f: 0x00a7, # LATIN SMALL LETTER G WITH BREVE - 0x0130: 0x0098, # LATIN CAPITAL LETTER I WITH DOT ABOVE - 0x0131: 0x008d, # LATIN SMALL LETTER DOTLESS I - 0x015e: 0x009e, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015f: 0x009f, # LATIN SMALL LETTER S WITH CEDILLA - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00d1, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00d0, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x00e8, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x00ed, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011e: 0x00a6, # LATIN CAPITAL LETTER G WITH BREVE + 0x011f: 0x00a7, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0x0098, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0x008d, # LATIN SMALL LETTER DOTLESS I + 0x015e: 0x009e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x009f, # LATIN SMALL LETTER S WITH CEDILLA + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp860.py ============================================================================== --- python/trunk/Lib/encodings/cp860.py (original) +++ python/trunk/Lib/encodings/cp860.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x0084: 0x00e3, # LATIN SMALL LETTER A WITH TILDE - 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0086: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0089: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x008b: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE - 0x008c: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE - 0x008e: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE - 0x008f: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x0092: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x0094: 0x00f5, # LATIN SMALL LETTER O WITH TILDE - 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE - 0x0096: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE - 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE - 0x0098: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE - 0x0099: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x00a2, # CENT SIGN - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x009e: 0x20a7, # PESETA SIGN - 0x009f: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE - 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR - 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR - 0x00a8: 0x00bf, # INVERTED QUESTION MARK - 0x00a9: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x00e3: 0x03c0, # GREEK SMALL LETTER PI - 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU - 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA - 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA - 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA - 0x00ec: 0x221e, # INFINITY - 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI - 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x00ef: 0x2229, # INTERSECTION - 0x00f0: 0x2261, # IDENTICAL TO - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO - 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO - 0x00f4: 0x2320, # TOP HALF INTEGRAL - 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x2248, # ALMOST EQUAL TO - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x221a, # SQUARE ROOT - 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x008c: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x008f: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0092: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0099: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0x0084 -> LATIN SMALL LETTER A WITH TILDE - u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE - u'\xc1' # 0x0086 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xca' # 0x0089 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE - u'\xcd' # 0x008b -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xd4' # 0x008c -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE - u'\xc3' # 0x008e -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc2' # 0x008f -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xc0' # 0x0091 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc8' # 0x0092 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0x0094 -> LATIN SMALL LETTER O WITH TILDE - u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE - u'\xda' # 0x0096 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE - u'\xcc' # 0x0098 -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd5' # 0x0099 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xa2' # 0x009b -> CENT SIGN - u'\xa3' # 0x009c -> POUND SIGN - u'\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u20a7' # 0x009e -> PESETA SIGN - u'\xd3' # 0x009f -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE - u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE - u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR - u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK - u'\xd2' # 0x00a9 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S - u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA - u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI - u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA - u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU - u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI - u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA - u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA - u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA - u'\u221e' # 0x00ec -> INFINITY - u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI - u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON - u'\u2229' # 0x00ef -> INTERSECTION - u'\u2261' # 0x00f0 -> IDENTICAL TO - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO - u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO - u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL - u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\u2248' # 0x00f7 -> ALMOST EQUAL TO - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\u221a' # 0x00fb -> SQUARE ROOT - u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0x0084 -> LATIN SMALL LETTER A WITH TILDE + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xc1' # 0x0086 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xca' # 0x0089 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xcd' # 0x008b -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xd4' # 0x008c -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc3' # 0x008e -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc2' # 0x008f -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xc0' # 0x0091 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc8' # 0x0092 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0x0094 -> LATIN SMALL LETTER O WITH TILDE + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xda' # 0x0096 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xcc' # 0x0098 -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd5' # 0x0099 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xa2' # 0x009b -> CENT SIGN + u'\xa3' # 0x009c -> POUND SIGN + u'\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u20a7' # 0x009e -> PESETA SIGN + u'\xd3' # 0x009f -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\xd2' # 0x00a9 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK - 0x00a2: 0x009b, # CENT SIGN - 0x00a3: 0x009c, # POUND SIGN - 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00bf: 0x00a8, # INVERTED QUESTION MARK - 0x00c0: 0x0091, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00c1: 0x0086, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00c2: 0x008f, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00c3: 0x008e, # LATIN CAPITAL LETTER A WITH TILDE - 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c8: 0x0092, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00ca: 0x0089, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00cc: 0x0098, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00cd: 0x008b, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE - 0x00d2: 0x00a9, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00d3: 0x009f, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00d4: 0x008c, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00d5: 0x0099, # LATIN CAPITAL LETTER O WITH TILDE - 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00da: 0x0096, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S - 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE - 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e3: 0x0084, # LATIN SMALL LETTER A WITH TILDE - 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE - 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE - 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE - 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f5: 0x0094, # LATIN SMALL LETTER O WITH TILDE - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA - 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA - 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA - 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI - 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA - 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA - 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA - 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON - 0x03c0: 0x00e3, # GREEK SMALL LETTER PI - 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA - 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU - 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI - 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N - 0x20a7: 0x009e, # PESETA SIGN - 0x2219: 0x00f9, # BULLET OPERATOR - 0x221a: 0x00fb, # SQUARE ROOT - 0x221e: 0x00ec, # INFINITY - 0x2229: 0x00ef, # INTERSECTION - 0x2248: 0x00f7, # ALMOST EQUAL TO - 0x2261: 0x00f0, # IDENTICAL TO - 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO - 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO - 0x2320: 0x00f4, # TOP HALF INTEGRAL - 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x0091, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x0086, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x008f, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x008e, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0092, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0089, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cc: 0x0098, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x008b, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00a9, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x009f, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x008c, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x0099, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x0096, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x0084, # LATIN SMALL LETTER A WITH TILDE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x0094, # LATIN SMALL LETTER O WITH TILDE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp861.py ============================================================================== --- python/trunk/Lib/encodings/cp861.py (original) +++ python/trunk/Lib/encodings/cp861.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x008b: 0x00d0, # LATIN CAPITAL LETTER ETH - 0x008c: 0x00f0, # LATIN SMALL LETTER ETH - 0x008d: 0x00de, # LATIN CAPITAL LETTER THORN - 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE - 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE - 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x0095: 0x00fe, # LATIN SMALL LETTER THORN - 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x0097: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x0098: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE - 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE - 0x009e: 0x20a7, # PESETA SIGN - 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00a5: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00a6: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00a7: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00a8: 0x00bf, # INVERTED QUESTION MARK - 0x00a9: 0x2310, # REVERSED NOT SIGN - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x00e3: 0x03c0, # GREEK SMALL LETTER PI - 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU - 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA - 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA - 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA - 0x00ec: 0x221e, # INFINITY - 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI - 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x00ef: 0x2229, # INTERSECTION - 0x00f0: 0x2261, # IDENTICAL TO - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO - 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO - 0x00f4: 0x2320, # TOP HALF INTEGRAL - 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x2248, # ALMOST EQUAL TO - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x221a, # SQUARE ROOT - 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x008c: 0x00f0, # LATIN SMALL LETTER ETH + 0x008d: 0x00de, # LATIN CAPITAL LETTER THORN + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00fe, # LATIN SMALL LETTER THORN + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x0098: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00a5: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00a6: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a7: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE - u'\xd0' # 0x008b -> LATIN CAPITAL LETTER ETH - u'\xf0' # 0x008c -> LATIN SMALL LETTER ETH - u'\xde' # 0x008d -> LATIN CAPITAL LETTER THORN - u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE - u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE - u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xfe' # 0x0095 -> LATIN SMALL LETTER THORN - u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xdd' # 0x0097 -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xfd' # 0x0098 -> LATIN SMALL LETTER Y WITH ACUTE - u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE - u'\xa3' # 0x009c -> POUND SIGN - u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE - u'\u20a7' # 0x009e -> PESETA SIGN - u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK - u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE - u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\xc1' # 0x00a4 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcd' # 0x00a5 -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xd3' # 0x00a6 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xda' # 0x00a7 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK - u'\u2310' # 0x00a9 -> REVERSED NOT SIGN - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S - u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA - u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI - u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA - u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU - u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI - u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA - u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA - u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA - u'\u221e' # 0x00ec -> INFINITY - u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI - u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON - u'\u2229' # 0x00ef -> INTERSECTION - u'\u2261' # 0x00f0 -> IDENTICAL TO - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO - u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO - u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL - u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\u2248' # 0x00f7 -> ALMOST EQUAL TO - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\u221a' # 0x00fb -> SQUARE ROOT - u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xd0' # 0x008b -> LATIN CAPITAL LETTER ETH + u'\xf0' # 0x008c -> LATIN SMALL LETTER ETH + u'\xde' # 0x008d -> LATIN CAPITAL LETTER THORN + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xfe' # 0x0095 -> LATIN SMALL LETTER THORN + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xdd' # 0x0097 -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xfd' # 0x0098 -> LATIN SMALL LETTER Y WITH ACUTE + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\u20a7' # 0x009e -> PESETA SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xc1' # 0x00a4 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcd' # 0x00a5 -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xd3' # 0x00a6 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xda' # 0x00a7 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK - 0x00a3: 0x009c, # POUND SIGN - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00bf: 0x00a8, # INVERTED QUESTION MARK - 0x00c1: 0x00a4, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE - 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00cd: 0x00a5, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00d0: 0x008b, # LATIN CAPITAL LETTER ETH - 0x00d3: 0x00a6, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE - 0x00da: 0x00a7, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00dd: 0x0097, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00de: 0x008d, # LATIN CAPITAL LETTER THORN - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S - 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE - 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE - 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE - 0x00f0: 0x008c, # LATIN SMALL LETTER ETH - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00fd: 0x0098, # LATIN SMALL LETTER Y WITH ACUTE - 0x00fe: 0x0095, # LATIN SMALL LETTER THORN - 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK - 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA - 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA - 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA - 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI - 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA - 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA - 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA - 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON - 0x03c0: 0x00e3, # GREEK SMALL LETTER PI - 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA - 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU - 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI - 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N - 0x20a7: 0x009e, # PESETA SIGN - 0x2219: 0x00f9, # BULLET OPERATOR - 0x221a: 0x00fb, # SQUARE ROOT - 0x221e: 0x00ec, # INFINITY - 0x2229: 0x00ef, # INTERSECTION - 0x2248: 0x00f7, # ALMOST EQUAL TO - 0x2261: 0x00f0, # IDENTICAL TO - 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO - 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO - 0x2310: 0x00a9, # REVERSED NOT SIGN - 0x2320: 0x00f4, # TOP HALF INTEGRAL - 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c1: 0x00a4, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cd: 0x00a5, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d0: 0x008b, # LATIN CAPITAL LETTER ETH + 0x00d3: 0x00a6, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00da: 0x00a7, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x0097, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x008d, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f0: 0x008c, # LATIN SMALL LETTER ETH + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x0098, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x0095, # LATIN SMALL LETTER THORN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp862.py ============================================================================== --- python/trunk/Lib/encodings/cp862.py (original) +++ python/trunk/Lib/encodings/cp862.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x05d0, # HEBREW LETTER ALEF - 0x0081: 0x05d1, # HEBREW LETTER BET - 0x0082: 0x05d2, # HEBREW LETTER GIMEL - 0x0083: 0x05d3, # HEBREW LETTER DALET - 0x0084: 0x05d4, # HEBREW LETTER HE - 0x0085: 0x05d5, # HEBREW LETTER VAV - 0x0086: 0x05d6, # HEBREW LETTER ZAYIN - 0x0087: 0x05d7, # HEBREW LETTER HET - 0x0088: 0x05d8, # HEBREW LETTER TET - 0x0089: 0x05d9, # HEBREW LETTER YOD - 0x008a: 0x05da, # HEBREW LETTER FINAL KAF - 0x008b: 0x05db, # HEBREW LETTER KAF - 0x008c: 0x05dc, # HEBREW LETTER LAMED - 0x008d: 0x05dd, # HEBREW LETTER FINAL MEM - 0x008e: 0x05de, # HEBREW LETTER MEM - 0x008f: 0x05df, # HEBREW LETTER FINAL NUN - 0x0090: 0x05e0, # HEBREW LETTER NUN - 0x0091: 0x05e1, # HEBREW LETTER SAMEKH - 0x0092: 0x05e2, # HEBREW LETTER AYIN - 0x0093: 0x05e3, # HEBREW LETTER FINAL PE - 0x0094: 0x05e4, # HEBREW LETTER PE - 0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI - 0x0096: 0x05e6, # HEBREW LETTER TSADI - 0x0097: 0x05e7, # HEBREW LETTER QOF - 0x0098: 0x05e8, # HEBREW LETTER RESH - 0x0099: 0x05e9, # HEBREW LETTER SHIN - 0x009a: 0x05ea, # HEBREW LETTER TAV - 0x009b: 0x00a2, # CENT SIGN - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00a5, # YEN SIGN - 0x009e: 0x20a7, # PESETA SIGN - 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE - 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR - 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR - 0x00a8: 0x00bf, # INVERTED QUESTION MARK - 0x00a9: 0x2310, # REVERSED NOT SIGN - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) - 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x00e3: 0x03c0, # GREEK SMALL LETTER PI - 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU - 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA - 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA - 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA - 0x00ec: 0x221e, # INFINITY - 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI - 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x00ef: 0x2229, # INTERSECTION - 0x00f0: 0x2261, # IDENTICAL TO - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO - 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO - 0x00f4: 0x2320, # TOP HALF INTEGRAL - 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x2248, # ALMOST EQUAL TO - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x221a, # SQUARE ROOT - 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x05d0, # HEBREW LETTER ALEF + 0x0081: 0x05d1, # HEBREW LETTER BET + 0x0082: 0x05d2, # HEBREW LETTER GIMEL + 0x0083: 0x05d3, # HEBREW LETTER DALET + 0x0084: 0x05d4, # HEBREW LETTER HE + 0x0085: 0x05d5, # HEBREW LETTER VAV + 0x0086: 0x05d6, # HEBREW LETTER ZAYIN + 0x0087: 0x05d7, # HEBREW LETTER HET + 0x0088: 0x05d8, # HEBREW LETTER TET + 0x0089: 0x05d9, # HEBREW LETTER YOD + 0x008a: 0x05da, # HEBREW LETTER FINAL KAF + 0x008b: 0x05db, # HEBREW LETTER KAF + 0x008c: 0x05dc, # HEBREW LETTER LAMED + 0x008d: 0x05dd, # HEBREW LETTER FINAL MEM + 0x008e: 0x05de, # HEBREW LETTER MEM + 0x008f: 0x05df, # HEBREW LETTER FINAL NUN + 0x0090: 0x05e0, # HEBREW LETTER NUN + 0x0091: 0x05e1, # HEBREW LETTER SAMEKH + 0x0092: 0x05e2, # HEBREW LETTER AYIN + 0x0093: 0x05e3, # HEBREW LETTER FINAL PE + 0x0094: 0x05e4, # HEBREW LETTER PE + 0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x0096: 0x05e6, # HEBREW LETTER TSADI + 0x0097: 0x05e7, # HEBREW LETTER QOF + 0x0098: 0x05e8, # HEBREW LETTER RESH + 0x0099: 0x05e9, # HEBREW LETTER SHIN + 0x009a: 0x05ea, # HEBREW LETTER TAV + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\u05d0' # 0x0080 -> HEBREW LETTER ALEF - u'\u05d1' # 0x0081 -> HEBREW LETTER BET - u'\u05d2' # 0x0082 -> HEBREW LETTER GIMEL - u'\u05d3' # 0x0083 -> HEBREW LETTER DALET - u'\u05d4' # 0x0084 -> HEBREW LETTER HE - u'\u05d5' # 0x0085 -> HEBREW LETTER VAV - u'\u05d6' # 0x0086 -> HEBREW LETTER ZAYIN - u'\u05d7' # 0x0087 -> HEBREW LETTER HET - u'\u05d8' # 0x0088 -> HEBREW LETTER TET - u'\u05d9' # 0x0089 -> HEBREW LETTER YOD - u'\u05da' # 0x008a -> HEBREW LETTER FINAL KAF - u'\u05db' # 0x008b -> HEBREW LETTER KAF - u'\u05dc' # 0x008c -> HEBREW LETTER LAMED - u'\u05dd' # 0x008d -> HEBREW LETTER FINAL MEM - u'\u05de' # 0x008e -> HEBREW LETTER MEM - u'\u05df' # 0x008f -> HEBREW LETTER FINAL NUN - u'\u05e0' # 0x0090 -> HEBREW LETTER NUN - u'\u05e1' # 0x0091 -> HEBREW LETTER SAMEKH - u'\u05e2' # 0x0092 -> HEBREW LETTER AYIN - u'\u05e3' # 0x0093 -> HEBREW LETTER FINAL PE - u'\u05e4' # 0x0094 -> HEBREW LETTER PE - u'\u05e5' # 0x0095 -> HEBREW LETTER FINAL TSADI - u'\u05e6' # 0x0096 -> HEBREW LETTER TSADI - u'\u05e7' # 0x0097 -> HEBREW LETTER QOF - u'\u05e8' # 0x0098 -> HEBREW LETTER RESH - u'\u05e9' # 0x0099 -> HEBREW LETTER SHIN - u'\u05ea' # 0x009a -> HEBREW LETTER TAV - u'\xa2' # 0x009b -> CENT SIGN - u'\xa3' # 0x009c -> POUND SIGN - u'\xa5' # 0x009d -> YEN SIGN - u'\u20a7' # 0x009e -> PESETA SIGN - u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK - u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE - u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE - u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR - u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK - u'\u2310' # 0x00a9 -> REVERSED NOT SIGN - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) - u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA - u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI - u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA - u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU - u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI - u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA - u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA - u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA - u'\u221e' # 0x00ec -> INFINITY - u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI - u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON - u'\u2229' # 0x00ef -> INTERSECTION - u'\u2261' # 0x00f0 -> IDENTICAL TO - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO - u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO - u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL - u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\u2248' # 0x00f7 -> ALMOST EQUAL TO - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\u221a' # 0x00fb -> SQUARE ROOT - u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u05d0' # 0x0080 -> HEBREW LETTER ALEF + u'\u05d1' # 0x0081 -> HEBREW LETTER BET + u'\u05d2' # 0x0082 -> HEBREW LETTER GIMEL + u'\u05d3' # 0x0083 -> HEBREW LETTER DALET + u'\u05d4' # 0x0084 -> HEBREW LETTER HE + u'\u05d5' # 0x0085 -> HEBREW LETTER VAV + u'\u05d6' # 0x0086 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0x0087 -> HEBREW LETTER HET + u'\u05d8' # 0x0088 -> HEBREW LETTER TET + u'\u05d9' # 0x0089 -> HEBREW LETTER YOD + u'\u05da' # 0x008a -> HEBREW LETTER FINAL KAF + u'\u05db' # 0x008b -> HEBREW LETTER KAF + u'\u05dc' # 0x008c -> HEBREW LETTER LAMED + u'\u05dd' # 0x008d -> HEBREW LETTER FINAL MEM + u'\u05de' # 0x008e -> HEBREW LETTER MEM + u'\u05df' # 0x008f -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0x0090 -> HEBREW LETTER NUN + u'\u05e1' # 0x0091 -> HEBREW LETTER SAMEKH + u'\u05e2' # 0x0092 -> HEBREW LETTER AYIN + u'\u05e3' # 0x0093 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0x0094 -> HEBREW LETTER PE + u'\u05e5' # 0x0095 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0x0096 -> HEBREW LETTER TSADI + u'\u05e7' # 0x0097 -> HEBREW LETTER QOF + u'\u05e8' # 0x0098 -> HEBREW LETTER RESH + u'\u05e9' # 0x0099 -> HEBREW LETTER SHIN + u'\u05ea' # 0x009a -> HEBREW LETTER TAV + u'\xa2' # 0x009b -> CENT SIGN + u'\xa3' # 0x009c -> POUND SIGN + u'\xa5' # 0x009d -> YEN SIGN + u'\u20a7' # 0x009e -> PESETA SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK - 0x00a2: 0x009b, # CENT SIGN - 0x00a3: 0x009c, # POUND SIGN - 0x00a5: 0x009d, # YEN SIGN - 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00bf: 0x00a8, # INVERTED QUESTION MARK - 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) - 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE - 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE - 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK - 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA - 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA - 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA - 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI - 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA - 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA - 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA - 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON - 0x03c0: 0x00e3, # GREEK SMALL LETTER PI - 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA - 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU - 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI - 0x05d0: 0x0080, # HEBREW LETTER ALEF - 0x05d1: 0x0081, # HEBREW LETTER BET - 0x05d2: 0x0082, # HEBREW LETTER GIMEL - 0x05d3: 0x0083, # HEBREW LETTER DALET - 0x05d4: 0x0084, # HEBREW LETTER HE - 0x05d5: 0x0085, # HEBREW LETTER VAV - 0x05d6: 0x0086, # HEBREW LETTER ZAYIN - 0x05d7: 0x0087, # HEBREW LETTER HET - 0x05d8: 0x0088, # HEBREW LETTER TET - 0x05d9: 0x0089, # HEBREW LETTER YOD - 0x05da: 0x008a, # HEBREW LETTER FINAL KAF - 0x05db: 0x008b, # HEBREW LETTER KAF - 0x05dc: 0x008c, # HEBREW LETTER LAMED - 0x05dd: 0x008d, # HEBREW LETTER FINAL MEM - 0x05de: 0x008e, # HEBREW LETTER MEM - 0x05df: 0x008f, # HEBREW LETTER FINAL NUN - 0x05e0: 0x0090, # HEBREW LETTER NUN - 0x05e1: 0x0091, # HEBREW LETTER SAMEKH - 0x05e2: 0x0092, # HEBREW LETTER AYIN - 0x05e3: 0x0093, # HEBREW LETTER FINAL PE - 0x05e4: 0x0094, # HEBREW LETTER PE - 0x05e5: 0x0095, # HEBREW LETTER FINAL TSADI - 0x05e6: 0x0096, # HEBREW LETTER TSADI - 0x05e7: 0x0097, # HEBREW LETTER QOF - 0x05e8: 0x0098, # HEBREW LETTER RESH - 0x05e9: 0x0099, # HEBREW LETTER SHIN - 0x05ea: 0x009a, # HEBREW LETTER TAV - 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N - 0x20a7: 0x009e, # PESETA SIGN - 0x2219: 0x00f9, # BULLET OPERATOR - 0x221a: 0x00fb, # SQUARE ROOT - 0x221e: 0x00ec, # INFINITY - 0x2229: 0x00ef, # INTERSECTION - 0x2248: 0x00f7, # ALMOST EQUAL TO - 0x2261: 0x00f0, # IDENTICAL TO - 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO - 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO - 0x2310: 0x00a9, # REVERSED NOT SIGN - 0x2320: 0x00f4, # TOP HALF INTEGRAL - 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x05d0: 0x0080, # HEBREW LETTER ALEF + 0x05d1: 0x0081, # HEBREW LETTER BET + 0x05d2: 0x0082, # HEBREW LETTER GIMEL + 0x05d3: 0x0083, # HEBREW LETTER DALET + 0x05d4: 0x0084, # HEBREW LETTER HE + 0x05d5: 0x0085, # HEBREW LETTER VAV + 0x05d6: 0x0086, # HEBREW LETTER ZAYIN + 0x05d7: 0x0087, # HEBREW LETTER HET + 0x05d8: 0x0088, # HEBREW LETTER TET + 0x05d9: 0x0089, # HEBREW LETTER YOD + 0x05da: 0x008a, # HEBREW LETTER FINAL KAF + 0x05db: 0x008b, # HEBREW LETTER KAF + 0x05dc: 0x008c, # HEBREW LETTER LAMED + 0x05dd: 0x008d, # HEBREW LETTER FINAL MEM + 0x05de: 0x008e, # HEBREW LETTER MEM + 0x05df: 0x008f, # HEBREW LETTER FINAL NUN + 0x05e0: 0x0090, # HEBREW LETTER NUN + 0x05e1: 0x0091, # HEBREW LETTER SAMEKH + 0x05e2: 0x0092, # HEBREW LETTER AYIN + 0x05e3: 0x0093, # HEBREW LETTER FINAL PE + 0x05e4: 0x0094, # HEBREW LETTER PE + 0x05e5: 0x0095, # HEBREW LETTER FINAL TSADI + 0x05e6: 0x0096, # HEBREW LETTER TSADI + 0x05e7: 0x0097, # HEBREW LETTER QOF + 0x05e8: 0x0098, # HEBREW LETTER RESH + 0x05e9: 0x0099, # HEBREW LETTER SHIN + 0x05ea: 0x009a, # HEBREW LETTER TAV + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp863.py ============================================================================== --- python/trunk/Lib/encodings/cp863.py (original) +++ python/trunk/Lib/encodings/cp863.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x0084: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0086: 0x00b6, # PILCROW SIGN - 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS - 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x008d: 0x2017, # DOUBLE LOW LINE - 0x008e: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x008f: 0x00a7, # SECTION SIGN - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x0092: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x0094: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x0095: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE - 0x0098: 0x00a4, # CURRENCY SIGN - 0x0099: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x00a2, # CENT SIGN - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x009e: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00a0: 0x00a6, # BROKEN BAR - 0x00a1: 0x00b4, # ACUTE ACCENT - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x00a8, # DIAERESIS - 0x00a5: 0x00b8, # CEDILLA - 0x00a6: 0x00b3, # SUPERSCRIPT THREE - 0x00a7: 0x00af, # MACRON - 0x00a8: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00a9: 0x2310, # REVERSED NOT SIGN - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x00be, # VULGAR FRACTION THREE QUARTERS - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x00e3: 0x03c0, # GREEK SMALL LETTER PI - 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU - 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA - 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA - 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA - 0x00ec: 0x221e, # INFINITY - 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI - 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x00ef: 0x2229, # INTERSECTION - 0x00f0: 0x2261, # IDENTICAL TO - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO - 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO - 0x00f4: 0x2320, # TOP HALF INTEGRAL - 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x2248, # ALMOST EQUAL TO - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x221a, # SQUARE ROOT - 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00b6, # PILCROW SIGN + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x2017, # DOUBLE LOW LINE + 0x008e: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x008f: 0x00a7, # SECTION SIGN + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0092: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0095: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00a4, # CURRENCY SIGN + 0x0099: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00a6, # BROKEN BAR + 0x00a1: 0x00b4, # ACUTE ACCENT + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00a8, # DIAERESIS + 0x00a5: 0x00b8, # CEDILLA + 0x00a6: 0x00b3, # SUPERSCRIPT THREE + 0x00a7: 0x00af, # MACRON + 0x00a8: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xc2' # 0x0084 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE - u'\xb6' # 0x0086 -> PILCROW SIGN - u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE - u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\u2017' # 0x008d -> DOUBLE LOW LINE - u'\xc0' # 0x008e -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xa7' # 0x008f -> SECTION SIGN - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xc8' # 0x0091 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xca' # 0x0092 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xcb' # 0x0094 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcf' # 0x0095 -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE - u'\xa4' # 0x0098 -> CURRENCY SIGN - u'\xd4' # 0x0099 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xa2' # 0x009b -> CENT SIGN - u'\xa3' # 0x009c -> POUND SIGN - u'\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xdb' # 0x009e -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK - u'\xa6' # 0x00a0 -> BROKEN BAR - u'\xb4' # 0x00a1 -> ACUTE ACCENT - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\xa8' # 0x00a4 -> DIAERESIS - u'\xb8' # 0x00a5 -> CEDILLA - u'\xb3' # 0x00a6 -> SUPERSCRIPT THREE - u'\xaf' # 0x00a7 -> MACRON - u'\xce' # 0x00a8 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\u2310' # 0x00a9 -> REVERSED NOT SIGN - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\xbe' # 0x00ad -> VULGAR FRACTION THREE QUARTERS - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S - u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA - u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI - u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA - u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU - u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI - u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA - u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA - u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA - u'\u221e' # 0x00ec -> INFINITY - u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI - u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON - u'\u2229' # 0x00ef -> INTERSECTION - u'\u2261' # 0x00f0 -> IDENTICAL TO - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO - u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO - u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL - u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\u2248' # 0x00f7 -> ALMOST EQUAL TO - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\u221a' # 0x00fb -> SQUARE ROOT - u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xc2' # 0x0084 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xb6' # 0x0086 -> PILCROW SIGN + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u2017' # 0x008d -> DOUBLE LOW LINE + u'\xc0' # 0x008e -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xa7' # 0x008f -> SECTION SIGN + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xc8' # 0x0091 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xca' # 0x0092 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xcb' # 0x0094 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcf' # 0x0095 -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xa4' # 0x0098 -> CURRENCY SIGN + u'\xd4' # 0x0099 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xa2' # 0x009b -> CENT SIGN + u'\xa3' # 0x009c -> POUND SIGN + u'\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xdb' # 0x009e -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xa6' # 0x00a0 -> BROKEN BAR + u'\xb4' # 0x00a1 -> ACUTE ACCENT + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xa8' # 0x00a4 -> DIAERESIS + u'\xb8' # 0x00a5 -> CEDILLA + u'\xb3' # 0x00a6 -> SUPERSCRIPT THREE + u'\xaf' # 0x00a7 -> MACRON + u'\xce' # 0x00a8 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xbe' # 0x00ad -> VULGAR FRACTION THREE QUARTERS + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a2: 0x009b, # CENT SIGN - 0x00a3: 0x009c, # POUND SIGN - 0x00a4: 0x0098, # CURRENCY SIGN - 0x00a6: 0x00a0, # BROKEN BAR - 0x00a7: 0x008f, # SECTION SIGN - 0x00a8: 0x00a4, # DIAERESIS - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00af: 0x00a7, # MACRON - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b3: 0x00a6, # SUPERSCRIPT THREE - 0x00b4: 0x00a1, # ACUTE ACCENT - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b6: 0x0086, # PILCROW SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00b8: 0x00a5, # CEDILLA - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00be: 0x00ad, # VULGAR FRACTION THREE QUARTERS - 0x00c0: 0x008e, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00c2: 0x0084, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c8: 0x0091, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00ca: 0x0092, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00cb: 0x0094, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00ce: 0x00a8, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00cf: 0x0095, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00d4: 0x0099, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00db: 0x009e, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S - 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE - 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK - 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA - 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA - 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA - 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI - 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA - 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA - 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA - 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON - 0x03c0: 0x00e3, # GREEK SMALL LETTER PI - 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA - 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU - 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI - 0x2017: 0x008d, # DOUBLE LOW LINE - 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N - 0x2219: 0x00f9, # BULLET OPERATOR - 0x221a: 0x00fb, # SQUARE ROOT - 0x221e: 0x00ec, # INFINITY - 0x2229: 0x00ef, # INTERSECTION - 0x2248: 0x00f7, # ALMOST EQUAL TO - 0x2261: 0x00f0, # IDENTICAL TO - 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO - 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO - 0x2310: 0x00a9, # REVERSED NOT SIGN - 0x2320: 0x00f4, # TOP HALF INTEGRAL - 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x0098, # CURRENCY SIGN + 0x00a6: 0x00a0, # BROKEN BAR + 0x00a7: 0x008f, # SECTION SIGN + 0x00a8: 0x00a4, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00af: 0x00a7, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00a6, # SUPERSCRIPT THREE + 0x00b4: 0x00a1, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x0086, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00a5, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00ad, # VULGAR FRACTION THREE QUARTERS + 0x00c0: 0x008e, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c2: 0x0084, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0091, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0092, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x0094, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00ce: 0x00a8, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x0095, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d4: 0x0099, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00db: 0x009e, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x2017: 0x008d, # DOUBLE LOW LINE + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp864.py ============================================================================== --- python/trunk/Lib/encodings/cp864.py (original) +++ python/trunk/Lib/encodings/cp864.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,646 +32,646 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0025: 0x066a, # ARABIC PERCENT SIGN - 0x0080: 0x00b0, # DEGREE SIGN - 0x0081: 0x00b7, # MIDDLE DOT - 0x0082: 0x2219, # BULLET OPERATOR - 0x0083: 0x221a, # SQUARE ROOT - 0x0084: 0x2592, # MEDIUM SHADE - 0x0085: 0x2500, # FORMS LIGHT HORIZONTAL - 0x0086: 0x2502, # FORMS LIGHT VERTICAL - 0x0087: 0x253c, # FORMS LIGHT VERTICAL AND HORIZONTAL - 0x0088: 0x2524, # FORMS LIGHT VERTICAL AND LEFT - 0x0089: 0x252c, # FORMS LIGHT DOWN AND HORIZONTAL - 0x008a: 0x251c, # FORMS LIGHT VERTICAL AND RIGHT - 0x008b: 0x2534, # FORMS LIGHT UP AND HORIZONTAL - 0x008c: 0x2510, # FORMS LIGHT DOWN AND LEFT - 0x008d: 0x250c, # FORMS LIGHT DOWN AND RIGHT - 0x008e: 0x2514, # FORMS LIGHT UP AND RIGHT - 0x008f: 0x2518, # FORMS LIGHT UP AND LEFT - 0x0090: 0x03b2, # GREEK SMALL BETA - 0x0091: 0x221e, # INFINITY - 0x0092: 0x03c6, # GREEK SMALL PHI - 0x0093: 0x00b1, # PLUS-OR-MINUS SIGN - 0x0094: 0x00bd, # FRACTION 1/2 - 0x0095: 0x00bc, # FRACTION 1/4 - 0x0096: 0x2248, # ALMOST EQUAL TO - 0x0097: 0x00ab, # LEFT POINTING GUILLEMET - 0x0098: 0x00bb, # RIGHT POINTING GUILLEMET - 0x0099: 0xfef7, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM - 0x009a: 0xfef8, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM - 0x009b: None, # UNDEFINED - 0x009c: None, # UNDEFINED - 0x009d: 0xfefb, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM - 0x009e: 0xfefc, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM - 0x009f: None, # UNDEFINED - 0x00a1: 0x00ad, # SOFT HYPHEN - 0x00a2: 0xfe82, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM - 0x00a5: 0xfe84, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM - 0x00a6: None, # UNDEFINED - 0x00a7: None, # UNDEFINED - 0x00a8: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM - 0x00a9: 0xfe8f, # ARABIC LETTER BEH ISOLATED FORM - 0x00aa: 0xfe95, # ARABIC LETTER TEH ISOLATED FORM - 0x00ab: 0xfe99, # ARABIC LETTER THEH ISOLATED FORM - 0x00ac: 0x060c, # ARABIC COMMA - 0x00ad: 0xfe9d, # ARABIC LETTER JEEM ISOLATED FORM - 0x00ae: 0xfea1, # ARABIC LETTER HAH ISOLATED FORM - 0x00af: 0xfea5, # ARABIC LETTER KHAH ISOLATED FORM - 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO - 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE - 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO - 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE - 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR - 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE - 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX - 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN - 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT - 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE - 0x00ba: 0xfed1, # ARABIC LETTER FEH ISOLATED FORM - 0x00bb: 0x061b, # ARABIC SEMICOLON - 0x00bc: 0xfeb1, # ARABIC LETTER SEEN ISOLATED FORM - 0x00bd: 0xfeb5, # ARABIC LETTER SHEEN ISOLATED FORM - 0x00be: 0xfeb9, # ARABIC LETTER SAD ISOLATED FORM - 0x00bf: 0x061f, # ARABIC QUESTION MARK - 0x00c0: 0x00a2, # CENT SIGN - 0x00c1: 0xfe80, # ARABIC LETTER HAMZA ISOLATED FORM - 0x00c2: 0xfe81, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM - 0x00c3: 0xfe83, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM - 0x00c4: 0xfe85, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM - 0x00c5: 0xfeca, # ARABIC LETTER AIN FINAL FORM - 0x00c6: 0xfe8b, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM - 0x00c7: 0xfe8d, # ARABIC LETTER ALEF ISOLATED FORM - 0x00c8: 0xfe91, # ARABIC LETTER BEH INITIAL FORM - 0x00c9: 0xfe93, # ARABIC LETTER TEH MARBUTA ISOLATED FORM - 0x00ca: 0xfe97, # ARABIC LETTER TEH INITIAL FORM - 0x00cb: 0xfe9b, # ARABIC LETTER THEH INITIAL FORM - 0x00cc: 0xfe9f, # ARABIC LETTER JEEM INITIAL FORM - 0x00cd: 0xfea3, # ARABIC LETTER HAH INITIAL FORM - 0x00ce: 0xfea7, # ARABIC LETTER KHAH INITIAL FORM - 0x00cf: 0xfea9, # ARABIC LETTER DAL ISOLATED FORM - 0x00d0: 0xfeab, # ARABIC LETTER THAL ISOLATED FORM - 0x00d1: 0xfead, # ARABIC LETTER REH ISOLATED FORM - 0x00d2: 0xfeaf, # ARABIC LETTER ZAIN ISOLATED FORM - 0x00d3: 0xfeb3, # ARABIC LETTER SEEN INITIAL FORM - 0x00d4: 0xfeb7, # ARABIC LETTER SHEEN INITIAL FORM - 0x00d5: 0xfebb, # ARABIC LETTER SAD INITIAL FORM - 0x00d6: 0xfebf, # ARABIC LETTER DAD INITIAL FORM - 0x00d7: 0xfec1, # ARABIC LETTER TAH ISOLATED FORM - 0x00d8: 0xfec5, # ARABIC LETTER ZAH ISOLATED FORM - 0x00d9: 0xfecb, # ARABIC LETTER AIN INITIAL FORM - 0x00da: 0xfecf, # ARABIC LETTER GHAIN INITIAL FORM - 0x00db: 0x00a6, # BROKEN VERTICAL BAR - 0x00dc: 0x00ac, # NOT SIGN - 0x00dd: 0x00f7, # DIVISION SIGN - 0x00de: 0x00d7, # MULTIPLICATION SIGN - 0x00df: 0xfec9, # ARABIC LETTER AIN ISOLATED FORM - 0x00e0: 0x0640, # ARABIC TATWEEL - 0x00e1: 0xfed3, # ARABIC LETTER FEH INITIAL FORM - 0x00e2: 0xfed7, # ARABIC LETTER QAF INITIAL FORM - 0x00e3: 0xfedb, # ARABIC LETTER KAF INITIAL FORM - 0x00e4: 0xfedf, # ARABIC LETTER LAM INITIAL FORM - 0x00e5: 0xfee3, # ARABIC LETTER MEEM INITIAL FORM - 0x00e6: 0xfee7, # ARABIC LETTER NOON INITIAL FORM - 0x00e7: 0xfeeb, # ARABIC LETTER HEH INITIAL FORM - 0x00e8: 0xfeed, # ARABIC LETTER WAW ISOLATED FORM - 0x00e9: 0xfeef, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM - 0x00ea: 0xfef3, # ARABIC LETTER YEH INITIAL FORM - 0x00eb: 0xfebd, # ARABIC LETTER DAD ISOLATED FORM - 0x00ec: 0xfecc, # ARABIC LETTER AIN MEDIAL FORM - 0x00ed: 0xfece, # ARABIC LETTER GHAIN FINAL FORM - 0x00ee: 0xfecd, # ARABIC LETTER GHAIN ISOLATED FORM - 0x00ef: 0xfee1, # ARABIC LETTER MEEM ISOLATED FORM - 0x00f0: 0xfe7d, # ARABIC SHADDA MEDIAL FORM - 0x00f1: 0x0651, # ARABIC SHADDAH - 0x00f2: 0xfee5, # ARABIC LETTER NOON ISOLATED FORM - 0x00f3: 0xfee9, # ARABIC LETTER HEH ISOLATED FORM - 0x00f4: 0xfeec, # ARABIC LETTER HEH MEDIAL FORM - 0x00f5: 0xfef0, # ARABIC LETTER ALEF MAKSURA FINAL FORM - 0x00f6: 0xfef2, # ARABIC LETTER YEH FINAL FORM - 0x00f7: 0xfed0, # ARABIC LETTER GHAIN MEDIAL FORM - 0x00f8: 0xfed5, # ARABIC LETTER QAF ISOLATED FORM - 0x00f9: 0xfef5, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM - 0x00fa: 0xfef6, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM - 0x00fb: 0xfedd, # ARABIC LETTER LAM ISOLATED FORM - 0x00fc: 0xfed9, # ARABIC LETTER KAF ISOLATED FORM - 0x00fd: 0xfef1, # ARABIC LETTER YEH ISOLATED FORM - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: None, # UNDEFINED + 0x0025: 0x066a, # ARABIC PERCENT SIGN + 0x0080: 0x00b0, # DEGREE SIGN + 0x0081: 0x00b7, # MIDDLE DOT + 0x0082: 0x2219, # BULLET OPERATOR + 0x0083: 0x221a, # SQUARE ROOT + 0x0084: 0x2592, # MEDIUM SHADE + 0x0085: 0x2500, # FORMS LIGHT HORIZONTAL + 0x0086: 0x2502, # FORMS LIGHT VERTICAL + 0x0087: 0x253c, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x0088: 0x2524, # FORMS LIGHT VERTICAL AND LEFT + 0x0089: 0x252c, # FORMS LIGHT DOWN AND HORIZONTAL + 0x008a: 0x251c, # FORMS LIGHT VERTICAL AND RIGHT + 0x008b: 0x2534, # FORMS LIGHT UP AND HORIZONTAL + 0x008c: 0x2510, # FORMS LIGHT DOWN AND LEFT + 0x008d: 0x250c, # FORMS LIGHT DOWN AND RIGHT + 0x008e: 0x2514, # FORMS LIGHT UP AND RIGHT + 0x008f: 0x2518, # FORMS LIGHT UP AND LEFT + 0x0090: 0x03b2, # GREEK SMALL BETA + 0x0091: 0x221e, # INFINITY + 0x0092: 0x03c6, # GREEK SMALL PHI + 0x0093: 0x00b1, # PLUS-OR-MINUS SIGN + 0x0094: 0x00bd, # FRACTION 1/2 + 0x0095: 0x00bc, # FRACTION 1/4 + 0x0096: 0x2248, # ALMOST EQUAL TO + 0x0097: 0x00ab, # LEFT POINTING GUILLEMET + 0x0098: 0x00bb, # RIGHT POINTING GUILLEMET + 0x0099: 0xfef7, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x009a: 0xfef8, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0x009b: None, # UNDEFINED + 0x009c: None, # UNDEFINED + 0x009d: 0xfefb, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0x009e: 0xfefc, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM + 0x009f: None, # UNDEFINED + 0x00a1: 0x00ad, # SOFT HYPHEN + 0x00a2: 0xfe82, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0x00a5: 0xfe84, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0x00a6: None, # UNDEFINED + 0x00a7: None, # UNDEFINED + 0x00a8: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM + 0x00a9: 0xfe8f, # ARABIC LETTER BEH ISOLATED FORM + 0x00aa: 0xfe95, # ARABIC LETTER TEH ISOLATED FORM + 0x00ab: 0xfe99, # ARABIC LETTER THEH ISOLATED FORM + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0xfe9d, # ARABIC LETTER JEEM ISOLATED FORM + 0x00ae: 0xfea1, # ARABIC LETTER HAH ISOLATED FORM + 0x00af: 0xfea5, # ARABIC LETTER KHAH ISOLATED FORM + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE + 0x00ba: 0xfed1, # ARABIC LETTER FEH ISOLATED FORM + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0xfeb1, # ARABIC LETTER SEEN ISOLATED FORM + 0x00bd: 0xfeb5, # ARABIC LETTER SHEEN ISOLATED FORM + 0x00be: 0xfeb9, # ARABIC LETTER SAD ISOLATED FORM + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x00a2, # CENT SIGN + 0x00c1: 0xfe80, # ARABIC LETTER HAMZA ISOLATED FORM + 0x00c2: 0xfe81, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00c3: 0xfe83, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x00c4: 0xfe85, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0x00c5: 0xfeca, # ARABIC LETTER AIN FINAL FORM + 0x00c6: 0xfe8b, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0x00c7: 0xfe8d, # ARABIC LETTER ALEF ISOLATED FORM + 0x00c8: 0xfe91, # ARABIC LETTER BEH INITIAL FORM + 0x00c9: 0xfe93, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0x00ca: 0xfe97, # ARABIC LETTER TEH INITIAL FORM + 0x00cb: 0xfe9b, # ARABIC LETTER THEH INITIAL FORM + 0x00cc: 0xfe9f, # ARABIC LETTER JEEM INITIAL FORM + 0x00cd: 0xfea3, # ARABIC LETTER HAH INITIAL FORM + 0x00ce: 0xfea7, # ARABIC LETTER KHAH INITIAL FORM + 0x00cf: 0xfea9, # ARABIC LETTER DAL ISOLATED FORM + 0x00d0: 0xfeab, # ARABIC LETTER THAL ISOLATED FORM + 0x00d1: 0xfead, # ARABIC LETTER REH ISOLATED FORM + 0x00d2: 0xfeaf, # ARABIC LETTER ZAIN ISOLATED FORM + 0x00d3: 0xfeb3, # ARABIC LETTER SEEN INITIAL FORM + 0x00d4: 0xfeb7, # ARABIC LETTER SHEEN INITIAL FORM + 0x00d5: 0xfebb, # ARABIC LETTER SAD INITIAL FORM + 0x00d6: 0xfebf, # ARABIC LETTER DAD INITIAL FORM + 0x00d7: 0xfec1, # ARABIC LETTER TAH ISOLATED FORM + 0x00d8: 0xfec5, # ARABIC LETTER ZAH ISOLATED FORM + 0x00d9: 0xfecb, # ARABIC LETTER AIN INITIAL FORM + 0x00da: 0xfecf, # ARABIC LETTER GHAIN INITIAL FORM + 0x00db: 0x00a6, # BROKEN VERTICAL BAR + 0x00dc: 0x00ac, # NOT SIGN + 0x00dd: 0x00f7, # DIVISION SIGN + 0x00de: 0x00d7, # MULTIPLICATION SIGN + 0x00df: 0xfec9, # ARABIC LETTER AIN ISOLATED FORM + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0xfed3, # ARABIC LETTER FEH INITIAL FORM + 0x00e2: 0xfed7, # ARABIC LETTER QAF INITIAL FORM + 0x00e3: 0xfedb, # ARABIC LETTER KAF INITIAL FORM + 0x00e4: 0xfedf, # ARABIC LETTER LAM INITIAL FORM + 0x00e5: 0xfee3, # ARABIC LETTER MEEM INITIAL FORM + 0x00e6: 0xfee7, # ARABIC LETTER NOON INITIAL FORM + 0x00e7: 0xfeeb, # ARABIC LETTER HEH INITIAL FORM + 0x00e8: 0xfeed, # ARABIC LETTER WAW ISOLATED FORM + 0x00e9: 0xfeef, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0x00ea: 0xfef3, # ARABIC LETTER YEH INITIAL FORM + 0x00eb: 0xfebd, # ARABIC LETTER DAD ISOLATED FORM + 0x00ec: 0xfecc, # ARABIC LETTER AIN MEDIAL FORM + 0x00ed: 0xfece, # ARABIC LETTER GHAIN FINAL FORM + 0x00ee: 0xfecd, # ARABIC LETTER GHAIN ISOLATED FORM + 0x00ef: 0xfee1, # ARABIC LETTER MEEM ISOLATED FORM + 0x00f0: 0xfe7d, # ARABIC SHADDA MEDIAL FORM + 0x00f1: 0x0651, # ARABIC SHADDAH + 0x00f2: 0xfee5, # ARABIC LETTER NOON ISOLATED FORM + 0x00f3: 0xfee9, # ARABIC LETTER HEH ISOLATED FORM + 0x00f4: 0xfeec, # ARABIC LETTER HEH MEDIAL FORM + 0x00f5: 0xfef0, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0x00f6: 0xfef2, # ARABIC LETTER YEH FINAL FORM + 0x00f7: 0xfed0, # ARABIC LETTER GHAIN MEDIAL FORM + 0x00f8: 0xfed5, # ARABIC LETTER QAF ISOLATED FORM + 0x00f9: 0xfef5, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00fa: 0xfef6, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0x00fb: 0xfedd, # ARABIC LETTER LAM ISOLATED FORM + 0x00fc: 0xfed9, # ARABIC LETTER KAF ISOLATED FORM + 0x00fd: 0xfef1, # ARABIC LETTER YEH ISOLATED FORM + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: None, # UNDEFINED }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'\u066a' # 0x0025 -> ARABIC PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xb0' # 0x0080 -> DEGREE SIGN - u'\xb7' # 0x0081 -> MIDDLE DOT - u'\u2219' # 0x0082 -> BULLET OPERATOR - u'\u221a' # 0x0083 -> SQUARE ROOT - u'\u2592' # 0x0084 -> MEDIUM SHADE - u'\u2500' # 0x0085 -> FORMS LIGHT HORIZONTAL - u'\u2502' # 0x0086 -> FORMS LIGHT VERTICAL - u'\u253c' # 0x0087 -> FORMS LIGHT VERTICAL AND HORIZONTAL - u'\u2524' # 0x0088 -> FORMS LIGHT VERTICAL AND LEFT - u'\u252c' # 0x0089 -> FORMS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x008a -> FORMS LIGHT VERTICAL AND RIGHT - u'\u2534' # 0x008b -> FORMS LIGHT UP AND HORIZONTAL - u'\u2510' # 0x008c -> FORMS LIGHT DOWN AND LEFT - u'\u250c' # 0x008d -> FORMS LIGHT DOWN AND RIGHT - u'\u2514' # 0x008e -> FORMS LIGHT UP AND RIGHT - u'\u2518' # 0x008f -> FORMS LIGHT UP AND LEFT - u'\u03b2' # 0x0090 -> GREEK SMALL BETA - u'\u221e' # 0x0091 -> INFINITY - u'\u03c6' # 0x0092 -> GREEK SMALL PHI - u'\xb1' # 0x0093 -> PLUS-OR-MINUS SIGN - u'\xbd' # 0x0094 -> FRACTION 1/2 - u'\xbc' # 0x0095 -> FRACTION 1/4 - u'\u2248' # 0x0096 -> ALMOST EQUAL TO - u'\xab' # 0x0097 -> LEFT POINTING GUILLEMET - u'\xbb' # 0x0098 -> RIGHT POINTING GUILLEMET - u'\ufef7' # 0x0099 -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM - u'\ufef8' # 0x009a -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM - u'\ufffe' # 0x009b -> UNDEFINED - u'\ufffe' # 0x009c -> UNDEFINED - u'\ufefb' # 0x009d -> ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM - u'\ufefc' # 0x009e -> ARABIC LIGATURE LAM WITH ALEF FINAL FORM - u'\ufffe' # 0x009f -> UNDEFINED - u'\xa0' # 0x00a0 -> NON-BREAKING SPACE - u'\xad' # 0x00a1 -> SOFT HYPHEN - u'\ufe82' # 0x00a2 -> ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM - u'\xa3' # 0x00a3 -> POUND SIGN - u'\xa4' # 0x00a4 -> CURRENCY SIGN - u'\ufe84' # 0x00a5 -> ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM - u'\ufffe' # 0x00a6 -> UNDEFINED - u'\ufffe' # 0x00a7 -> UNDEFINED - u'\ufe8e' # 0x00a8 -> ARABIC LETTER ALEF FINAL FORM - u'\ufe8f' # 0x00a9 -> ARABIC LETTER BEH ISOLATED FORM - u'\ufe95' # 0x00aa -> ARABIC LETTER TEH ISOLATED FORM - u'\ufe99' # 0x00ab -> ARABIC LETTER THEH ISOLATED FORM - u'\u060c' # 0x00ac -> ARABIC COMMA - u'\ufe9d' # 0x00ad -> ARABIC LETTER JEEM ISOLATED FORM - u'\ufea1' # 0x00ae -> ARABIC LETTER HAH ISOLATED FORM - u'\ufea5' # 0x00af -> ARABIC LETTER KHAH ISOLATED FORM - u'\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO - u'\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE - u'\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO - u'\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE - u'\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR - u'\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE - u'\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX - u'\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN - u'\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT - u'\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE - u'\ufed1' # 0x00ba -> ARABIC LETTER FEH ISOLATED FORM - u'\u061b' # 0x00bb -> ARABIC SEMICOLON - u'\ufeb1' # 0x00bc -> ARABIC LETTER SEEN ISOLATED FORM - u'\ufeb5' # 0x00bd -> ARABIC LETTER SHEEN ISOLATED FORM - u'\ufeb9' # 0x00be -> ARABIC LETTER SAD ISOLATED FORM - u'\u061f' # 0x00bf -> ARABIC QUESTION MARK - u'\xa2' # 0x00c0 -> CENT SIGN - u'\ufe80' # 0x00c1 -> ARABIC LETTER HAMZA ISOLATED FORM - u'\ufe81' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM - u'\ufe83' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM - u'\ufe85' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM - u'\ufeca' # 0x00c5 -> ARABIC LETTER AIN FINAL FORM - u'\ufe8b' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM - u'\ufe8d' # 0x00c7 -> ARABIC LETTER ALEF ISOLATED FORM - u'\ufe91' # 0x00c8 -> ARABIC LETTER BEH INITIAL FORM - u'\ufe93' # 0x00c9 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM - u'\ufe97' # 0x00ca -> ARABIC LETTER TEH INITIAL FORM - u'\ufe9b' # 0x00cb -> ARABIC LETTER THEH INITIAL FORM - u'\ufe9f' # 0x00cc -> ARABIC LETTER JEEM INITIAL FORM - u'\ufea3' # 0x00cd -> ARABIC LETTER HAH INITIAL FORM - u'\ufea7' # 0x00ce -> ARABIC LETTER KHAH INITIAL FORM - u'\ufea9' # 0x00cf -> ARABIC LETTER DAL ISOLATED FORM - u'\ufeab' # 0x00d0 -> ARABIC LETTER THAL ISOLATED FORM - u'\ufead' # 0x00d1 -> ARABIC LETTER REH ISOLATED FORM - u'\ufeaf' # 0x00d2 -> ARABIC LETTER ZAIN ISOLATED FORM - u'\ufeb3' # 0x00d3 -> ARABIC LETTER SEEN INITIAL FORM - u'\ufeb7' # 0x00d4 -> ARABIC LETTER SHEEN INITIAL FORM - u'\ufebb' # 0x00d5 -> ARABIC LETTER SAD INITIAL FORM - u'\ufebf' # 0x00d6 -> ARABIC LETTER DAD INITIAL FORM - u'\ufec1' # 0x00d7 -> ARABIC LETTER TAH ISOLATED FORM - u'\ufec5' # 0x00d8 -> ARABIC LETTER ZAH ISOLATED FORM - u'\ufecb' # 0x00d9 -> ARABIC LETTER AIN INITIAL FORM - u'\ufecf' # 0x00da -> ARABIC LETTER GHAIN INITIAL FORM - u'\xa6' # 0x00db -> BROKEN VERTICAL BAR - u'\xac' # 0x00dc -> NOT SIGN - u'\xf7' # 0x00dd -> DIVISION SIGN - u'\xd7' # 0x00de -> MULTIPLICATION SIGN - u'\ufec9' # 0x00df -> ARABIC LETTER AIN ISOLATED FORM - u'\u0640' # 0x00e0 -> ARABIC TATWEEL - u'\ufed3' # 0x00e1 -> ARABIC LETTER FEH INITIAL FORM - u'\ufed7' # 0x00e2 -> ARABIC LETTER QAF INITIAL FORM - u'\ufedb' # 0x00e3 -> ARABIC LETTER KAF INITIAL FORM - u'\ufedf' # 0x00e4 -> ARABIC LETTER LAM INITIAL FORM - u'\ufee3' # 0x00e5 -> ARABIC LETTER MEEM INITIAL FORM - u'\ufee7' # 0x00e6 -> ARABIC LETTER NOON INITIAL FORM - u'\ufeeb' # 0x00e7 -> ARABIC LETTER HEH INITIAL FORM - u'\ufeed' # 0x00e8 -> ARABIC LETTER WAW ISOLATED FORM - u'\ufeef' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA ISOLATED FORM - u'\ufef3' # 0x00ea -> ARABIC LETTER YEH INITIAL FORM - u'\ufebd' # 0x00eb -> ARABIC LETTER DAD ISOLATED FORM - u'\ufecc' # 0x00ec -> ARABIC LETTER AIN MEDIAL FORM - u'\ufece' # 0x00ed -> ARABIC LETTER GHAIN FINAL FORM - u'\ufecd' # 0x00ee -> ARABIC LETTER GHAIN ISOLATED FORM - u'\ufee1' # 0x00ef -> ARABIC LETTER MEEM ISOLATED FORM - u'\ufe7d' # 0x00f0 -> ARABIC SHADDA MEDIAL FORM - u'\u0651' # 0x00f1 -> ARABIC SHADDAH - u'\ufee5' # 0x00f2 -> ARABIC LETTER NOON ISOLATED FORM - u'\ufee9' # 0x00f3 -> ARABIC LETTER HEH ISOLATED FORM - u'\ufeec' # 0x00f4 -> ARABIC LETTER HEH MEDIAL FORM - u'\ufef0' # 0x00f5 -> ARABIC LETTER ALEF MAKSURA FINAL FORM - u'\ufef2' # 0x00f6 -> ARABIC LETTER YEH FINAL FORM - u'\ufed0' # 0x00f7 -> ARABIC LETTER GHAIN MEDIAL FORM - u'\ufed5' # 0x00f8 -> ARABIC LETTER QAF ISOLATED FORM - u'\ufef5' # 0x00f9 -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM - u'\ufef6' # 0x00fa -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM - u'\ufedd' # 0x00fb -> ARABIC LETTER LAM ISOLATED FORM - u'\ufed9' # 0x00fc -> ARABIC LETTER KAF ISOLATED FORM - u'\ufef1' # 0x00fd -> ARABIC LETTER YEH ISOLATED FORM - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\ufffe' # 0x00ff -> UNDEFINED + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'\u066a' # 0x0025 -> ARABIC PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xb0' # 0x0080 -> DEGREE SIGN + u'\xb7' # 0x0081 -> MIDDLE DOT + u'\u2219' # 0x0082 -> BULLET OPERATOR + u'\u221a' # 0x0083 -> SQUARE ROOT + u'\u2592' # 0x0084 -> MEDIUM SHADE + u'\u2500' # 0x0085 -> FORMS LIGHT HORIZONTAL + u'\u2502' # 0x0086 -> FORMS LIGHT VERTICAL + u'\u253c' # 0x0087 -> FORMS LIGHT VERTICAL AND HORIZONTAL + u'\u2524' # 0x0088 -> FORMS LIGHT VERTICAL AND LEFT + u'\u252c' # 0x0089 -> FORMS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x008a -> FORMS LIGHT VERTICAL AND RIGHT + u'\u2534' # 0x008b -> FORMS LIGHT UP AND HORIZONTAL + u'\u2510' # 0x008c -> FORMS LIGHT DOWN AND LEFT + u'\u250c' # 0x008d -> FORMS LIGHT DOWN AND RIGHT + u'\u2514' # 0x008e -> FORMS LIGHT UP AND RIGHT + u'\u2518' # 0x008f -> FORMS LIGHT UP AND LEFT + u'\u03b2' # 0x0090 -> GREEK SMALL BETA + u'\u221e' # 0x0091 -> INFINITY + u'\u03c6' # 0x0092 -> GREEK SMALL PHI + u'\xb1' # 0x0093 -> PLUS-OR-MINUS SIGN + u'\xbd' # 0x0094 -> FRACTION 1/2 + u'\xbc' # 0x0095 -> FRACTION 1/4 + u'\u2248' # 0x0096 -> ALMOST EQUAL TO + u'\xab' # 0x0097 -> LEFT POINTING GUILLEMET + u'\xbb' # 0x0098 -> RIGHT POINTING GUILLEMET + u'\ufef7' # 0x0099 -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + u'\ufef8' # 0x009a -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + u'\ufffe' # 0x009b -> UNDEFINED + u'\ufffe' # 0x009c -> UNDEFINED + u'\ufefb' # 0x009d -> ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + u'\ufefc' # 0x009e -> ARABIC LIGATURE LAM WITH ALEF FINAL FORM + u'\ufffe' # 0x009f -> UNDEFINED + u'\xa0' # 0x00a0 -> NON-BREAKING SPACE + u'\xad' # 0x00a1 -> SOFT HYPHEN + u'\ufe82' # 0x00a2 -> ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + u'\xa3' # 0x00a3 -> POUND SIGN + u'\xa4' # 0x00a4 -> CURRENCY SIGN + u'\ufe84' # 0x00a5 -> ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + u'\ufffe' # 0x00a6 -> UNDEFINED + u'\ufffe' # 0x00a7 -> UNDEFINED + u'\ufe8e' # 0x00a8 -> ARABIC LETTER ALEF FINAL FORM + u'\ufe8f' # 0x00a9 -> ARABIC LETTER BEH ISOLATED FORM + u'\ufe95' # 0x00aa -> ARABIC LETTER TEH ISOLATED FORM + u'\ufe99' # 0x00ab -> ARABIC LETTER THEH ISOLATED FORM + u'\u060c' # 0x00ac -> ARABIC COMMA + u'\ufe9d' # 0x00ad -> ARABIC LETTER JEEM ISOLATED FORM + u'\ufea1' # 0x00ae -> ARABIC LETTER HAH ISOLATED FORM + u'\ufea5' # 0x00af -> ARABIC LETTER KHAH ISOLATED FORM + u'\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO + u'\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE + u'\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO + u'\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE + u'\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR + u'\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE + u'\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX + u'\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN + u'\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT + u'\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE + u'\ufed1' # 0x00ba -> ARABIC LETTER FEH ISOLATED FORM + u'\u061b' # 0x00bb -> ARABIC SEMICOLON + u'\ufeb1' # 0x00bc -> ARABIC LETTER SEEN ISOLATED FORM + u'\ufeb5' # 0x00bd -> ARABIC LETTER SHEEN ISOLATED FORM + u'\ufeb9' # 0x00be -> ARABIC LETTER SAD ISOLATED FORM + u'\u061f' # 0x00bf -> ARABIC QUESTION MARK + u'\xa2' # 0x00c0 -> CENT SIGN + u'\ufe80' # 0x00c1 -> ARABIC LETTER HAMZA ISOLATED FORM + u'\ufe81' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + u'\ufe83' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + u'\ufe85' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + u'\ufeca' # 0x00c5 -> ARABIC LETTER AIN FINAL FORM + u'\ufe8b' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + u'\ufe8d' # 0x00c7 -> ARABIC LETTER ALEF ISOLATED FORM + u'\ufe91' # 0x00c8 -> ARABIC LETTER BEH INITIAL FORM + u'\ufe93' # 0x00c9 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + u'\ufe97' # 0x00ca -> ARABIC LETTER TEH INITIAL FORM + u'\ufe9b' # 0x00cb -> ARABIC LETTER THEH INITIAL FORM + u'\ufe9f' # 0x00cc -> ARABIC LETTER JEEM INITIAL FORM + u'\ufea3' # 0x00cd -> ARABIC LETTER HAH INITIAL FORM + u'\ufea7' # 0x00ce -> ARABIC LETTER KHAH INITIAL FORM + u'\ufea9' # 0x00cf -> ARABIC LETTER DAL ISOLATED FORM + u'\ufeab' # 0x00d0 -> ARABIC LETTER THAL ISOLATED FORM + u'\ufead' # 0x00d1 -> ARABIC LETTER REH ISOLATED FORM + u'\ufeaf' # 0x00d2 -> ARABIC LETTER ZAIN ISOLATED FORM + u'\ufeb3' # 0x00d3 -> ARABIC LETTER SEEN INITIAL FORM + u'\ufeb7' # 0x00d4 -> ARABIC LETTER SHEEN INITIAL FORM + u'\ufebb' # 0x00d5 -> ARABIC LETTER SAD INITIAL FORM + u'\ufebf' # 0x00d6 -> ARABIC LETTER DAD INITIAL FORM + u'\ufec1' # 0x00d7 -> ARABIC LETTER TAH ISOLATED FORM + u'\ufec5' # 0x00d8 -> ARABIC LETTER ZAH ISOLATED FORM + u'\ufecb' # 0x00d9 -> ARABIC LETTER AIN INITIAL FORM + u'\ufecf' # 0x00da -> ARABIC LETTER GHAIN INITIAL FORM + u'\xa6' # 0x00db -> BROKEN VERTICAL BAR + u'\xac' # 0x00dc -> NOT SIGN + u'\xf7' # 0x00dd -> DIVISION SIGN + u'\xd7' # 0x00de -> MULTIPLICATION SIGN + u'\ufec9' # 0x00df -> ARABIC LETTER AIN ISOLATED FORM + u'\u0640' # 0x00e0 -> ARABIC TATWEEL + u'\ufed3' # 0x00e1 -> ARABIC LETTER FEH INITIAL FORM + u'\ufed7' # 0x00e2 -> ARABIC LETTER QAF INITIAL FORM + u'\ufedb' # 0x00e3 -> ARABIC LETTER KAF INITIAL FORM + u'\ufedf' # 0x00e4 -> ARABIC LETTER LAM INITIAL FORM + u'\ufee3' # 0x00e5 -> ARABIC LETTER MEEM INITIAL FORM + u'\ufee7' # 0x00e6 -> ARABIC LETTER NOON INITIAL FORM + u'\ufeeb' # 0x00e7 -> ARABIC LETTER HEH INITIAL FORM + u'\ufeed' # 0x00e8 -> ARABIC LETTER WAW ISOLATED FORM + u'\ufeef' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA ISOLATED FORM + u'\ufef3' # 0x00ea -> ARABIC LETTER YEH INITIAL FORM + u'\ufebd' # 0x00eb -> ARABIC LETTER DAD ISOLATED FORM + u'\ufecc' # 0x00ec -> ARABIC LETTER AIN MEDIAL FORM + u'\ufece' # 0x00ed -> ARABIC LETTER GHAIN FINAL FORM + u'\ufecd' # 0x00ee -> ARABIC LETTER GHAIN ISOLATED FORM + u'\ufee1' # 0x00ef -> ARABIC LETTER MEEM ISOLATED FORM + u'\ufe7d' # 0x00f0 -> ARABIC SHADDA MEDIAL FORM + u'\u0651' # 0x00f1 -> ARABIC SHADDAH + u'\ufee5' # 0x00f2 -> ARABIC LETTER NOON ISOLATED FORM + u'\ufee9' # 0x00f3 -> ARABIC LETTER HEH ISOLATED FORM + u'\ufeec' # 0x00f4 -> ARABIC LETTER HEH MEDIAL FORM + u'\ufef0' # 0x00f5 -> ARABIC LETTER ALEF MAKSURA FINAL FORM + u'\ufef2' # 0x00f6 -> ARABIC LETTER YEH FINAL FORM + u'\ufed0' # 0x00f7 -> ARABIC LETTER GHAIN MEDIAL FORM + u'\ufed5' # 0x00f8 -> ARABIC LETTER QAF ISOLATED FORM + u'\ufef5' # 0x00f9 -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + u'\ufef6' # 0x00fa -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + u'\ufedd' # 0x00fb -> ARABIC LETTER LAM ISOLATED FORM + u'\ufed9' # 0x00fc -> ARABIC LETTER KAF ISOLATED FORM + u'\ufef1' # 0x00fd -> ARABIC LETTER YEH ISOLATED FORM + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\ufffe' # 0x00ff -> UNDEFINED ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00a0, # NON-BREAKING SPACE - 0x00a2: 0x00c0, # CENT SIGN - 0x00a3: 0x00a3, # POUND SIGN - 0x00a4: 0x00a4, # CURRENCY SIGN - 0x00a6: 0x00db, # BROKEN VERTICAL BAR - 0x00ab: 0x0097, # LEFT POINTING GUILLEMET - 0x00ac: 0x00dc, # NOT SIGN - 0x00ad: 0x00a1, # SOFT HYPHEN - 0x00b0: 0x0080, # DEGREE SIGN - 0x00b1: 0x0093, # PLUS-OR-MINUS SIGN - 0x00b7: 0x0081, # MIDDLE DOT - 0x00bb: 0x0098, # RIGHT POINTING GUILLEMET - 0x00bc: 0x0095, # FRACTION 1/4 - 0x00bd: 0x0094, # FRACTION 1/2 - 0x00d7: 0x00de, # MULTIPLICATION SIGN - 0x00f7: 0x00dd, # DIVISION SIGN - 0x03b2: 0x0090, # GREEK SMALL BETA - 0x03c6: 0x0092, # GREEK SMALL PHI - 0x060c: 0x00ac, # ARABIC COMMA - 0x061b: 0x00bb, # ARABIC SEMICOLON - 0x061f: 0x00bf, # ARABIC QUESTION MARK - 0x0640: 0x00e0, # ARABIC TATWEEL - 0x0651: 0x00f1, # ARABIC SHADDAH - 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO - 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE - 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO - 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE - 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR - 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE - 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX - 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN - 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT - 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE - 0x066a: 0x0025, # ARABIC PERCENT SIGN - 0x2219: 0x0082, # BULLET OPERATOR - 0x221a: 0x0083, # SQUARE ROOT - 0x221e: 0x0091, # INFINITY - 0x2248: 0x0096, # ALMOST EQUAL TO - 0x2500: 0x0085, # FORMS LIGHT HORIZONTAL - 0x2502: 0x0086, # FORMS LIGHT VERTICAL - 0x250c: 0x008d, # FORMS LIGHT DOWN AND RIGHT - 0x2510: 0x008c, # FORMS LIGHT DOWN AND LEFT - 0x2514: 0x008e, # FORMS LIGHT UP AND RIGHT - 0x2518: 0x008f, # FORMS LIGHT UP AND LEFT - 0x251c: 0x008a, # FORMS LIGHT VERTICAL AND RIGHT - 0x2524: 0x0088, # FORMS LIGHT VERTICAL AND LEFT - 0x252c: 0x0089, # FORMS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x008b, # FORMS LIGHT UP AND HORIZONTAL - 0x253c: 0x0087, # FORMS LIGHT VERTICAL AND HORIZONTAL - 0x2592: 0x0084, # MEDIUM SHADE - 0x25a0: 0x00fe, # BLACK SQUARE - 0xfe7d: 0x00f0, # ARABIC SHADDA MEDIAL FORM - 0xfe80: 0x00c1, # ARABIC LETTER HAMZA ISOLATED FORM - 0xfe81: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM - 0xfe82: 0x00a2, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM - 0xfe83: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM - 0xfe84: 0x00a5, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM - 0xfe85: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM - 0xfe8b: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM - 0xfe8d: 0x00c7, # ARABIC LETTER ALEF ISOLATED FORM - 0xfe8e: 0x00a8, # ARABIC LETTER ALEF FINAL FORM - 0xfe8f: 0x00a9, # ARABIC LETTER BEH ISOLATED FORM - 0xfe91: 0x00c8, # ARABIC LETTER BEH INITIAL FORM - 0xfe93: 0x00c9, # ARABIC LETTER TEH MARBUTA ISOLATED FORM - 0xfe95: 0x00aa, # ARABIC LETTER TEH ISOLATED FORM - 0xfe97: 0x00ca, # ARABIC LETTER TEH INITIAL FORM - 0xfe99: 0x00ab, # ARABIC LETTER THEH ISOLATED FORM - 0xfe9b: 0x00cb, # ARABIC LETTER THEH INITIAL FORM - 0xfe9d: 0x00ad, # ARABIC LETTER JEEM ISOLATED FORM - 0xfe9f: 0x00cc, # ARABIC LETTER JEEM INITIAL FORM - 0xfea1: 0x00ae, # ARABIC LETTER HAH ISOLATED FORM - 0xfea3: 0x00cd, # ARABIC LETTER HAH INITIAL FORM - 0xfea5: 0x00af, # ARABIC LETTER KHAH ISOLATED FORM - 0xfea7: 0x00ce, # ARABIC LETTER KHAH INITIAL FORM - 0xfea9: 0x00cf, # ARABIC LETTER DAL ISOLATED FORM - 0xfeab: 0x00d0, # ARABIC LETTER THAL ISOLATED FORM - 0xfead: 0x00d1, # ARABIC LETTER REH ISOLATED FORM - 0xfeaf: 0x00d2, # ARABIC LETTER ZAIN ISOLATED FORM - 0xfeb1: 0x00bc, # ARABIC LETTER SEEN ISOLATED FORM - 0xfeb3: 0x00d3, # ARABIC LETTER SEEN INITIAL FORM - 0xfeb5: 0x00bd, # ARABIC LETTER SHEEN ISOLATED FORM - 0xfeb7: 0x00d4, # ARABIC LETTER SHEEN INITIAL FORM - 0xfeb9: 0x00be, # ARABIC LETTER SAD ISOLATED FORM - 0xfebb: 0x00d5, # ARABIC LETTER SAD INITIAL FORM - 0xfebd: 0x00eb, # ARABIC LETTER DAD ISOLATED FORM - 0xfebf: 0x00d6, # ARABIC LETTER DAD INITIAL FORM - 0xfec1: 0x00d7, # ARABIC LETTER TAH ISOLATED FORM - 0xfec5: 0x00d8, # ARABIC LETTER ZAH ISOLATED FORM - 0xfec9: 0x00df, # ARABIC LETTER AIN ISOLATED FORM - 0xfeca: 0x00c5, # ARABIC LETTER AIN FINAL FORM - 0xfecb: 0x00d9, # ARABIC LETTER AIN INITIAL FORM - 0xfecc: 0x00ec, # ARABIC LETTER AIN MEDIAL FORM - 0xfecd: 0x00ee, # ARABIC LETTER GHAIN ISOLATED FORM - 0xfece: 0x00ed, # ARABIC LETTER GHAIN FINAL FORM - 0xfecf: 0x00da, # ARABIC LETTER GHAIN INITIAL FORM - 0xfed0: 0x00f7, # ARABIC LETTER GHAIN MEDIAL FORM - 0xfed1: 0x00ba, # ARABIC LETTER FEH ISOLATED FORM - 0xfed3: 0x00e1, # ARABIC LETTER FEH INITIAL FORM - 0xfed5: 0x00f8, # ARABIC LETTER QAF ISOLATED FORM - 0xfed7: 0x00e2, # ARABIC LETTER QAF INITIAL FORM - 0xfed9: 0x00fc, # ARABIC LETTER KAF ISOLATED FORM - 0xfedb: 0x00e3, # ARABIC LETTER KAF INITIAL FORM - 0xfedd: 0x00fb, # ARABIC LETTER LAM ISOLATED FORM - 0xfedf: 0x00e4, # ARABIC LETTER LAM INITIAL FORM - 0xfee1: 0x00ef, # ARABIC LETTER MEEM ISOLATED FORM - 0xfee3: 0x00e5, # ARABIC LETTER MEEM INITIAL FORM - 0xfee5: 0x00f2, # ARABIC LETTER NOON ISOLATED FORM - 0xfee7: 0x00e6, # ARABIC LETTER NOON INITIAL FORM - 0xfee9: 0x00f3, # ARABIC LETTER HEH ISOLATED FORM - 0xfeeb: 0x00e7, # ARABIC LETTER HEH INITIAL FORM - 0xfeec: 0x00f4, # ARABIC LETTER HEH MEDIAL FORM - 0xfeed: 0x00e8, # ARABIC LETTER WAW ISOLATED FORM - 0xfeef: 0x00e9, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM - 0xfef0: 0x00f5, # ARABIC LETTER ALEF MAKSURA FINAL FORM - 0xfef1: 0x00fd, # ARABIC LETTER YEH ISOLATED FORM - 0xfef2: 0x00f6, # ARABIC LETTER YEH FINAL FORM - 0xfef3: 0x00ea, # ARABIC LETTER YEH INITIAL FORM - 0xfef5: 0x00f9, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM - 0xfef6: 0x00fa, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM - 0xfef7: 0x0099, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM - 0xfef8: 0x009a, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM - 0xfefb: 0x009d, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM - 0xfefc: 0x009e, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00a0, # NON-BREAKING SPACE + 0x00a2: 0x00c0, # CENT SIGN + 0x00a3: 0x00a3, # POUND SIGN + 0x00a4: 0x00a4, # CURRENCY SIGN + 0x00a6: 0x00db, # BROKEN VERTICAL BAR + 0x00ab: 0x0097, # LEFT POINTING GUILLEMET + 0x00ac: 0x00dc, # NOT SIGN + 0x00ad: 0x00a1, # SOFT HYPHEN + 0x00b0: 0x0080, # DEGREE SIGN + 0x00b1: 0x0093, # PLUS-OR-MINUS SIGN + 0x00b7: 0x0081, # MIDDLE DOT + 0x00bb: 0x0098, # RIGHT POINTING GUILLEMET + 0x00bc: 0x0095, # FRACTION 1/4 + 0x00bd: 0x0094, # FRACTION 1/2 + 0x00d7: 0x00de, # MULTIPLICATION SIGN + 0x00f7: 0x00dd, # DIVISION SIGN + 0x03b2: 0x0090, # GREEK SMALL BETA + 0x03c6: 0x0092, # GREEK SMALL PHI + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0651: 0x00f1, # ARABIC SHADDAH + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE + 0x066a: 0x0025, # ARABIC PERCENT SIGN + 0x2219: 0x0082, # BULLET OPERATOR + 0x221a: 0x0083, # SQUARE ROOT + 0x221e: 0x0091, # INFINITY + 0x2248: 0x0096, # ALMOST EQUAL TO + 0x2500: 0x0085, # FORMS LIGHT HORIZONTAL + 0x2502: 0x0086, # FORMS LIGHT VERTICAL + 0x250c: 0x008d, # FORMS LIGHT DOWN AND RIGHT + 0x2510: 0x008c, # FORMS LIGHT DOWN AND LEFT + 0x2514: 0x008e, # FORMS LIGHT UP AND RIGHT + 0x2518: 0x008f, # FORMS LIGHT UP AND LEFT + 0x251c: 0x008a, # FORMS LIGHT VERTICAL AND RIGHT + 0x2524: 0x0088, # FORMS LIGHT VERTICAL AND LEFT + 0x252c: 0x0089, # FORMS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x008b, # FORMS LIGHT UP AND HORIZONTAL + 0x253c: 0x0087, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x2592: 0x0084, # MEDIUM SHADE + 0x25a0: 0x00fe, # BLACK SQUARE + 0xfe7d: 0x00f0, # ARABIC SHADDA MEDIAL FORM + 0xfe80: 0x00c1, # ARABIC LETTER HAMZA ISOLATED FORM + 0xfe81: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfe82: 0x00a2, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0xfe83: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfe84: 0x00a5, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0xfe85: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0xfe8b: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0xfe8d: 0x00c7, # ARABIC LETTER ALEF ISOLATED FORM + 0xfe8e: 0x00a8, # ARABIC LETTER ALEF FINAL FORM + 0xfe8f: 0x00a9, # ARABIC LETTER BEH ISOLATED FORM + 0xfe91: 0x00c8, # ARABIC LETTER BEH INITIAL FORM + 0xfe93: 0x00c9, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0xfe95: 0x00aa, # ARABIC LETTER TEH ISOLATED FORM + 0xfe97: 0x00ca, # ARABIC LETTER TEH INITIAL FORM + 0xfe99: 0x00ab, # ARABIC LETTER THEH ISOLATED FORM + 0xfe9b: 0x00cb, # ARABIC LETTER THEH INITIAL FORM + 0xfe9d: 0x00ad, # ARABIC LETTER JEEM ISOLATED FORM + 0xfe9f: 0x00cc, # ARABIC LETTER JEEM INITIAL FORM + 0xfea1: 0x00ae, # ARABIC LETTER HAH ISOLATED FORM + 0xfea3: 0x00cd, # ARABIC LETTER HAH INITIAL FORM + 0xfea5: 0x00af, # ARABIC LETTER KHAH ISOLATED FORM + 0xfea7: 0x00ce, # ARABIC LETTER KHAH INITIAL FORM + 0xfea9: 0x00cf, # ARABIC LETTER DAL ISOLATED FORM + 0xfeab: 0x00d0, # ARABIC LETTER THAL ISOLATED FORM + 0xfead: 0x00d1, # ARABIC LETTER REH ISOLATED FORM + 0xfeaf: 0x00d2, # ARABIC LETTER ZAIN ISOLATED FORM + 0xfeb1: 0x00bc, # ARABIC LETTER SEEN ISOLATED FORM + 0xfeb3: 0x00d3, # ARABIC LETTER SEEN INITIAL FORM + 0xfeb5: 0x00bd, # ARABIC LETTER SHEEN ISOLATED FORM + 0xfeb7: 0x00d4, # ARABIC LETTER SHEEN INITIAL FORM + 0xfeb9: 0x00be, # ARABIC LETTER SAD ISOLATED FORM + 0xfebb: 0x00d5, # ARABIC LETTER SAD INITIAL FORM + 0xfebd: 0x00eb, # ARABIC LETTER DAD ISOLATED FORM + 0xfebf: 0x00d6, # ARABIC LETTER DAD INITIAL FORM + 0xfec1: 0x00d7, # ARABIC LETTER TAH ISOLATED FORM + 0xfec5: 0x00d8, # ARABIC LETTER ZAH ISOLATED FORM + 0xfec9: 0x00df, # ARABIC LETTER AIN ISOLATED FORM + 0xfeca: 0x00c5, # ARABIC LETTER AIN FINAL FORM + 0xfecb: 0x00d9, # ARABIC LETTER AIN INITIAL FORM + 0xfecc: 0x00ec, # ARABIC LETTER AIN MEDIAL FORM + 0xfecd: 0x00ee, # ARABIC LETTER GHAIN ISOLATED FORM + 0xfece: 0x00ed, # ARABIC LETTER GHAIN FINAL FORM + 0xfecf: 0x00da, # ARABIC LETTER GHAIN INITIAL FORM + 0xfed0: 0x00f7, # ARABIC LETTER GHAIN MEDIAL FORM + 0xfed1: 0x00ba, # ARABIC LETTER FEH ISOLATED FORM + 0xfed3: 0x00e1, # ARABIC LETTER FEH INITIAL FORM + 0xfed5: 0x00f8, # ARABIC LETTER QAF ISOLATED FORM + 0xfed7: 0x00e2, # ARABIC LETTER QAF INITIAL FORM + 0xfed9: 0x00fc, # ARABIC LETTER KAF ISOLATED FORM + 0xfedb: 0x00e3, # ARABIC LETTER KAF INITIAL FORM + 0xfedd: 0x00fb, # ARABIC LETTER LAM ISOLATED FORM + 0xfedf: 0x00e4, # ARABIC LETTER LAM INITIAL FORM + 0xfee1: 0x00ef, # ARABIC LETTER MEEM ISOLATED FORM + 0xfee3: 0x00e5, # ARABIC LETTER MEEM INITIAL FORM + 0xfee5: 0x00f2, # ARABIC LETTER NOON ISOLATED FORM + 0xfee7: 0x00e6, # ARABIC LETTER NOON INITIAL FORM + 0xfee9: 0x00f3, # ARABIC LETTER HEH ISOLATED FORM + 0xfeeb: 0x00e7, # ARABIC LETTER HEH INITIAL FORM + 0xfeec: 0x00f4, # ARABIC LETTER HEH MEDIAL FORM + 0xfeed: 0x00e8, # ARABIC LETTER WAW ISOLATED FORM + 0xfeef: 0x00e9, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0xfef0: 0x00f5, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0xfef1: 0x00fd, # ARABIC LETTER YEH ISOLATED FORM + 0xfef2: 0x00f6, # ARABIC LETTER YEH FINAL FORM + 0xfef3: 0x00ea, # ARABIC LETTER YEH INITIAL FORM + 0xfef5: 0x00f9, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfef6: 0x00fa, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0xfef7: 0x0099, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfef8: 0x009a, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0xfefb: 0x009d, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0xfefc: 0x009e, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +} Modified: python/trunk/Lib/encodings/cp865.py ============================================================================== --- python/trunk/Lib/encodings/cp865.py (original) +++ python/trunk/Lib/encodings/cp865.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS - 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE - 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE - 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE - 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE - 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE - 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE - 0x009e: 0x20a7, # PESETA SIGN - 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE - 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR - 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR - 0x00a8: 0x00bf, # INVERTED QUESTION MARK - 0x00a9: 0x2310, # REVERSED NOT SIGN - 0x00aa: 0x00ac, # NOT SIGN - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00a4, # CURRENCY SIGN - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x00e3: 0x03c0, # GREEK SMALL LETTER PI - 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x00e6: 0x00b5, # MICRO SIGN - 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU - 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA - 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA - 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA - 0x00ec: 0x221e, # INFINITY - 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI - 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x00ef: 0x2229, # INTERSECTION - 0x00f0: 0x2261, # IDENTICAL TO - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO - 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO - 0x00f4: 0x2320, # TOP HALF INTEGRAL - 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL - 0x00f6: 0x00f7, # DIVISION SIGN - 0x00f7: 0x2248, # ALMOST EQUAL TO - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x221a, # SQUARE ROOT - 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N - 0x00fd: 0x00b2, # SUPERSCRIPT TWO - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00a4, # CURRENCY SIGN + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE - u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE - u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE - u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE - u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE - u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE - u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE - u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE - u'\xa3' # 0x009c -> POUND SIGN - u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE - u'\u20a7' # 0x009e -> PESETA SIGN - u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK - u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE - u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE - u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE - u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE - u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE - u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR - u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR - u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK - u'\u2310' # 0x00a9 -> REVERSED NOT SIGN - u'\xac' # 0x00aa -> NOT SIGN - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER - u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xa4' # 0x00af -> CURRENCY SIGN - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA - u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S - u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA - u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI - u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA - u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA - u'\xb5' # 0x00e6 -> MICRO SIGN - u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU - u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI - u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA - u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA - u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA - u'\u221e' # 0x00ec -> INFINITY - u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI - u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON - u'\u2229' # 0x00ef -> INTERSECTION - u'\u2261' # 0x00f0 -> IDENTICAL TO - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO - u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO - u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL - u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL - u'\xf7' # 0x00f6 -> DIVISION SIGN - u'\u2248' # 0x00f7 -> ALMOST EQUAL TO - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\u221a' # 0x00fb -> SQUARE ROOT - u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N - u'\xb2' # 0x00fd -> SUPERSCRIPT TWO - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + u'\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + u'\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + u'\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + u'\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + u'\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + u'\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + u'\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + u'\xa3' # 0x009c -> POUND SIGN + u'\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + u'\u20a7' # 0x009e -> PESETA SIGN + u'\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + u'\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + u'\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + u'\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + u'\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + u'\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + u'\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + u'\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + u'\xbf' # 0x00a8 -> INVERTED QUESTION MARK + u'\u2310' # 0x00a9 -> REVERSED NOT SIGN + u'\xac' # 0x00aa -> NOT SIGN + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + u'\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xa4' # 0x00af -> CURRENCY SIGN + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + u'\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + u'\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + u'\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + u'\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + u'\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + u'\xb5' # 0x00e6 -> MICRO SIGN + u'\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + u'\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + u'\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + u'\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + u'\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + u'\u221e' # 0x00ec -> INFINITY + u'\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + u'\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + u'\u2229' # 0x00ef -> INTERSECTION + u'\u2261' # 0x00f0 -> IDENTICAL TO + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + u'\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + u'\u2320' # 0x00f4 -> TOP HALF INTEGRAL + u'\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + u'\xf7' # 0x00f6 -> DIVISION SIGN + u'\u2248' # 0x00f7 -> ALMOST EQUAL TO + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + u'\xb2' # 0x00fd -> SUPERSCRIPT TWO + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK - 0x00a3: 0x009c, # POUND SIGN - 0x00a4: 0x00af, # CURRENCY SIGN - 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x00aa, # NOT SIGN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x00fd, # SUPERSCRIPT TWO - 0x00b5: 0x00e6, # MICRO SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR - 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x00bf: 0x00a8, # INVERTED QUESTION MARK - 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE - 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE - 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE - 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S - 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE - 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE - 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE - 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE - 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE - 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE - 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x00f6, # DIVISION SIGN - 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE - 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE - 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE - 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK - 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA - 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA - 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA - 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI - 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA - 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA - 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA - 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON - 0x03c0: 0x00e3, # GREEK SMALL LETTER PI - 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA - 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU - 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI - 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N - 0x20a7: 0x009e, # PESETA SIGN - 0x2219: 0x00f9, # BULLET OPERATOR - 0x221a: 0x00fb, # SQUARE ROOT - 0x221e: 0x00ec, # INFINITY - 0x2229: 0x00ef, # INTERSECTION - 0x2248: 0x00f7, # ALMOST EQUAL TO - 0x2261: 0x00f0, # IDENTICAL TO - 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO - 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO - 0x2310: 0x00a9, # REVERSED NOT SIGN - 0x2320: 0x00f4, # TOP HALF INTEGRAL - 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00af, # CURRENCY SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp866.py ============================================================================== --- python/trunk/Lib/encodings/cp866.py (original) +++ python/trunk/Lib/encodings/cp866.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A - 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE - 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE - 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE - 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE - 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE - 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE - 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE - 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I - 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I - 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA - 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL - 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM - 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN - 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O - 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE - 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER - 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES - 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE - 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U - 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF - 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA - 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE - 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE - 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA - 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA - 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU - 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E - 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU - 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA - 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A - 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE - 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE - 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE - 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE - 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE - 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE - 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE - 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I - 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I - 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA - 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL - 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM - 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN - 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O - 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x258c, # LEFT HALF BLOCK - 0x00de: 0x2590, # RIGHT HALF BLOCK - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER - 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES - 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE - 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U - 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF - 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA - 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE - 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE - 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA - 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA - 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN - 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU - 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN - 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E - 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU - 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA - 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO - 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO - 0x00f2: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x00f3: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE - 0x00f4: 0x0407, # CYRILLIC CAPITAL LETTER YI - 0x00f5: 0x0457, # CYRILLIC SMALL LETTER YI - 0x00f6: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U - 0x00f7: 0x045e, # CYRILLIC SMALL LETTER SHORT U - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x2219, # BULLET OPERATOR - 0x00fa: 0x00b7, # MIDDLE DOT - 0x00fb: 0x221a, # SQUARE ROOT - 0x00fc: 0x2116, # NUMERO SIGN - 0x00fd: 0x00a4, # CURRENCY SIGN - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f3: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f4: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f5: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00f6: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00f7: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A - u'\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE - u'\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE - u'\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE - u'\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE - u'\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE - u'\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE - u'\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE - u'\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I - u'\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I - u'\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA - u'\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL - u'\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM - u'\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN - u'\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O - u'\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE - u'\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER - u'\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES - u'\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE - u'\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U - u'\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF - u'\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA - u'\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE - u'\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE - u'\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA - u'\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA - u'\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN - u'\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU - u'\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E - u'\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU - u'\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA - u'\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A - u'\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE - u'\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE - u'\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE - u'\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE - u'\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE - u'\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE - u'\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE - u'\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I - u'\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I - u'\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA - u'\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL - u'\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM - u'\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN - u'\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O - u'\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u258c' # 0x00dd -> LEFT HALF BLOCK - u'\u2590' # 0x00de -> RIGHT HALF BLOCK - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER - u'\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES - u'\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE - u'\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U - u'\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF - u'\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA - u'\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE - u'\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE - u'\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA - u'\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA - u'\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN - u'\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU - u'\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E - u'\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU - u'\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA - u'\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO - u'\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO - u'\u0404' # 0x00f2 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE - u'\u0454' # 0x00f3 -> CYRILLIC SMALL LETTER UKRAINIAN IE - u'\u0407' # 0x00f4 -> CYRILLIC CAPITAL LETTER YI - u'\u0457' # 0x00f5 -> CYRILLIC SMALL LETTER YI - u'\u040e' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHORT U - u'\u045e' # 0x00f7 -> CYRILLIC SMALL LETTER SHORT U - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\u2219' # 0x00f9 -> BULLET OPERATOR - u'\xb7' # 0x00fa -> MIDDLE DOT - u'\u221a' # 0x00fb -> SQUARE ROOT - u'\u2116' # 0x00fc -> NUMERO SIGN - u'\xa4' # 0x00fd -> CURRENCY SIGN - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE + u'\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE + u'\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE + u'\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE + u'\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE + u'\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE + u'\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U + u'\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF + u'\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA + u'\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE + u'\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE + u'\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA + u'\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA + u'\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU + u'\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E + u'\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU + u'\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA + u'\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE + u'\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE + u'\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE + u'\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE + u'\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE + u'\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE + u'\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O + u'\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u258c' # 0x00dd -> LEFT HALF BLOCK + u'\u2590' # 0x00de -> RIGHT HALF BLOCK + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U + u'\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF + u'\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA + u'\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE + u'\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE + u'\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA + u'\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA + u'\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN + u'\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU + u'\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E + u'\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU + u'\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA + u'\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO + u'\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO + u'\u0404' # 0x00f2 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u0454' # 0x00f3 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u0407' # 0x00f4 -> CYRILLIC CAPITAL LETTER YI + u'\u0457' # 0x00f5 -> CYRILLIC SMALL LETTER YI + u'\u040e' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHORT U + u'\u045e' # 0x00f7 -> CYRILLIC SMALL LETTER SHORT U + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\u2219' # 0x00f9 -> BULLET OPERATOR + u'\xb7' # 0x00fa -> MIDDLE DOT + u'\u221a' # 0x00fb -> SQUARE ROOT + u'\u2116' # 0x00fc -> NUMERO SIGN + u'\xa4' # 0x00fd -> CURRENCY SIGN + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a4: 0x00fd, # CURRENCY SIGN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b7: 0x00fa, # MIDDLE DOT - 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO - 0x0404: 0x00f2, # CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x0407: 0x00f4, # CYRILLIC CAPITAL LETTER YI - 0x040e: 0x00f6, # CYRILLIC CAPITAL LETTER SHORT U - 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A - 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE - 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE - 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE - 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE - 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE - 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE - 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE - 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I - 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I - 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA - 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL - 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM - 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN - 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O - 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE - 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER - 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES - 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE - 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U - 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF - 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA - 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE - 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE - 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA - 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA - 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU - 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E - 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU - 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA - 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A - 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE - 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE - 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE - 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE - 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE - 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE - 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE - 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I - 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I - 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA - 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL - 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM - 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN - 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O - 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE - 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER - 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES - 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE - 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U - 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF - 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA - 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE - 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE - 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA - 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA - 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN - 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU - 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN - 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E - 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU - 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA - 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO - 0x0454: 0x00f3, # CYRILLIC SMALL LETTER UKRAINIAN IE - 0x0457: 0x00f5, # CYRILLIC SMALL LETTER YI - 0x045e: 0x00f7, # CYRILLIC SMALL LETTER SHORT U - 0x2116: 0x00fc, # NUMERO SIGN - 0x2219: 0x00f9, # BULLET OPERATOR - 0x221a: 0x00fb, # SQUARE ROOT - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x258c: 0x00dd, # LEFT HALF BLOCK - 0x2590: 0x00de, # RIGHT HALF BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00fd, # CURRENCY SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0x00f2, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0407: 0x00f4, # CYRILLIC CAPITAL LETTER YI + 0x040e: 0x00f6, # CYRILLIC CAPITAL LETTER SHORT U + 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I + 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O + 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U + 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E + 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA + 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO + 0x0454: 0x00f3, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0457: 0x00f5, # CYRILLIC SMALL LETTER YI + 0x045e: 0x00f7, # CYRILLIC SMALL LETTER SHORT U + 0x2116: 0x00fc, # NUMERO SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp869.py ============================================================================== --- python/trunk/Lib/encodings/cp869.py (original) +++ python/trunk/Lib/encodings/cp869.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,645 +32,645 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: None, # UNDEFINED - 0x0081: None, # UNDEFINED - 0x0082: None, # UNDEFINED - 0x0083: None, # UNDEFINED - 0x0084: None, # UNDEFINED - 0x0085: None, # UNDEFINED - 0x0086: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x0087: None, # UNDEFINED - 0x0088: 0x00b7, # MIDDLE DOT - 0x0089: 0x00ac, # NOT SIGN - 0x008a: 0x00a6, # BROKEN BAR - 0x008b: 0x2018, # LEFT SINGLE QUOTATION MARK - 0x008c: 0x2019, # RIGHT SINGLE QUOTATION MARK - 0x008d: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x008e: 0x2015, # HORIZONTAL BAR - 0x008f: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS - 0x0090: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS - 0x0091: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x0092: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x0093: None, # UNDEFINED - 0x0094: None, # UNDEFINED - 0x0095: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x0096: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x0097: 0x00a9, # COPYRIGHT SIGN - 0x0098: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x0099: 0x00b2, # SUPERSCRIPT TWO - 0x009a: 0x00b3, # SUPERSCRIPT THREE - 0x009b: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS - 0x009c: 0x00a3, # POUND SIGN - 0x009d: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS - 0x009e: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS - 0x009f: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS - 0x00a0: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x00a1: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - 0x00a2: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS - 0x00a3: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS - 0x00a4: 0x0391, # GREEK CAPITAL LETTER ALPHA - 0x00a5: 0x0392, # GREEK CAPITAL LETTER BETA - 0x00a6: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x00a7: 0x0394, # GREEK CAPITAL LETTER DELTA - 0x00a8: 0x0395, # GREEK CAPITAL LETTER EPSILON - 0x00a9: 0x0396, # GREEK CAPITAL LETTER ZETA - 0x00aa: 0x0397, # GREEK CAPITAL LETTER ETA - 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF - 0x00ac: 0x0398, # GREEK CAPITAL LETTER THETA - 0x00ad: 0x0399, # GREEK CAPITAL LETTER IOTA - 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00b0: 0x2591, # LIGHT SHADE - 0x00b1: 0x2592, # MEDIUM SHADE - 0x00b2: 0x2593, # DARK SHADE - 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL - 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x00b5: 0x039a, # GREEK CAPITAL LETTER KAPPA - 0x00b6: 0x039b, # GREEK CAPITAL LETTER LAMDA - 0x00b7: 0x039c, # GREEK CAPITAL LETTER MU - 0x00b8: 0x039d, # GREEK CAPITAL LETTER NU - 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL - 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x00bd: 0x039e, # GREEK CAPITAL LETTER XI - 0x00be: 0x039f, # GREEK CAPITAL LETTER OMICRON - 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL - 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x00c6: 0x03a0, # GREEK CAPITAL LETTER PI - 0x00c7: 0x03a1, # GREEK CAPITAL LETTER RHO - 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x00cf: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x00d0: 0x03a4, # GREEK CAPITAL LETTER TAU - 0x00d1: 0x03a5, # GREEK CAPITAL LETTER UPSILON - 0x00d2: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x00d3: 0x03a7, # GREEK CAPITAL LETTER CHI - 0x00d4: 0x03a8, # GREEK CAPITAL LETTER PSI - 0x00d5: 0x03a9, # GREEK CAPITAL LETTER OMEGA - 0x00d6: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x00d7: 0x03b2, # GREEK SMALL LETTER BETA - 0x00d8: 0x03b3, # GREEK SMALL LETTER GAMMA - 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT - 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x00db: 0x2588, # FULL BLOCK - 0x00dc: 0x2584, # LOWER HALF BLOCK - 0x00dd: 0x03b4, # GREEK SMALL LETTER DELTA - 0x00de: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x00df: 0x2580, # UPPER HALF BLOCK - 0x00e0: 0x03b6, # GREEK SMALL LETTER ZETA - 0x00e1: 0x03b7, # GREEK SMALL LETTER ETA - 0x00e2: 0x03b8, # GREEK SMALL LETTER THETA - 0x00e3: 0x03b9, # GREEK SMALL LETTER IOTA - 0x00e4: 0x03ba, # GREEK SMALL LETTER KAPPA - 0x00e5: 0x03bb, # GREEK SMALL LETTER LAMDA - 0x00e6: 0x03bc, # GREEK SMALL LETTER MU - 0x00e7: 0x03bd, # GREEK SMALL LETTER NU - 0x00e8: 0x03be, # GREEK SMALL LETTER XI - 0x00e9: 0x03bf, # GREEK SMALL LETTER OMICRON - 0x00ea: 0x03c0, # GREEK SMALL LETTER PI - 0x00eb: 0x03c1, # GREEK SMALL LETTER RHO - 0x00ec: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x00ed: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA - 0x00ee: 0x03c4, # GREEK SMALL LETTER TAU - 0x00ef: 0x0384, # GREEK TONOS - 0x00f0: 0x00ad, # SOFT HYPHEN - 0x00f1: 0x00b1, # PLUS-MINUS SIGN - 0x00f2: 0x03c5, # GREEK SMALL LETTER UPSILON - 0x00f3: 0x03c6, # GREEK SMALL LETTER PHI - 0x00f4: 0x03c7, # GREEK SMALL LETTER CHI - 0x00f5: 0x00a7, # SECTION SIGN - 0x00f6: 0x03c8, # GREEK SMALL LETTER PSI - 0x00f7: 0x0385, # GREEK DIALYTIKA TONOS - 0x00f8: 0x00b0, # DEGREE SIGN - 0x00f9: 0x00a8, # DIAERESIS - 0x00fa: 0x03c9, # GREEK SMALL LETTER OMEGA - 0x00fb: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x00fc: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - 0x00fd: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS - 0x00fe: 0x25a0, # BLACK SQUARE - 0x00ff: 0x00a0, # NO-BREAK SPACE + 0x0080: None, # UNDEFINED + 0x0081: None, # UNDEFINED + 0x0082: None, # UNDEFINED + 0x0083: None, # UNDEFINED + 0x0084: None, # UNDEFINED + 0x0085: None, # UNDEFINED + 0x0086: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0087: None, # UNDEFINED + 0x0088: 0x00b7, # MIDDLE DOT + 0x0089: 0x00ac, # NOT SIGN + 0x008a: 0x00a6, # BROKEN BAR + 0x008b: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x008c: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x008d: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x008e: 0x2015, # HORIZONTAL BAR + 0x008f: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x0090: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x0091: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x0092: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x0093: None, # UNDEFINED + 0x0094: None, # UNDEFINED + 0x0095: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x0096: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x0097: 0x00a9, # COPYRIGHT SIGN + 0x0098: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0099: 0x00b2, # SUPERSCRIPT TWO + 0x009a: 0x00b3, # SUPERSCRIPT THREE + 0x009b: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x009e: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x009f: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00a0: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00a1: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00a2: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00a3: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00a4: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x00a5: 0x0392, # GREEK CAPITAL LETTER BETA + 0x00a6: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00a7: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x00a8: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x00a9: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x00aa: 0x0397, # GREEK CAPITAL LETTER ETA + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ad: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x00b6: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x00b7: 0x039c, # GREEK CAPITAL LETTER MU + 0x00b8: 0x039d, # GREEK CAPITAL LETTER NU + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x039e, # GREEK CAPITAL LETTER XI + 0x00be: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x03a0, # GREEK CAPITAL LETTER PI + 0x00c7: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00d0: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x00d1: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x00d2: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00d3: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x00d4: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x00d5: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00d6: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00d7: 0x03b2, # GREEK SMALL LETTER BETA + 0x00d8: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00de: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b6, # GREEK SMALL LETTER ZETA + 0x00e1: 0x03b7, # GREEK SMALL LETTER ETA + 0x00e2: 0x03b8, # GREEK SMALL LETTER THETA + 0x00e3: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00e4: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00e5: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00e6: 0x03bc, # GREEK SMALL LETTER MU + 0x00e7: 0x03bd, # GREEK SMALL LETTER NU + 0x00e8: 0x03be, # GREEK SMALL LETTER XI + 0x00e9: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00ea: 0x03c0, # GREEK SMALL LETTER PI + 0x00eb: 0x03c1, # GREEK SMALL LETTER RHO + 0x00ec: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00ed: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ee: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ef: 0x0384, # GREEK TONOS + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00f3: 0x03c6, # GREEK SMALL LETTER PHI + 0x00f4: 0x03c7, # GREEK SMALL LETTER CHI + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x03c8, # GREEK SMALL LETTER PSI + 0x00f7: 0x0385, # GREEK DIALYTIKA TONOS + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00fb: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00fc: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00fd: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> NULL - u'\x01' # 0x0001 -> START OF HEADING - u'\x02' # 0x0002 -> START OF TEXT - u'\x03' # 0x0003 -> END OF TEXT - u'\x04' # 0x0004 -> END OF TRANSMISSION - u'\x05' # 0x0005 -> ENQUIRY - u'\x06' # 0x0006 -> ACKNOWLEDGE - u'\x07' # 0x0007 -> BELL - u'\x08' # 0x0008 -> BACKSPACE - u'\t' # 0x0009 -> HORIZONTAL TABULATION - u'\n' # 0x000a -> LINE FEED - u'\x0b' # 0x000b -> VERTICAL TABULATION - u'\x0c' # 0x000c -> FORM FEED - u'\r' # 0x000d -> CARRIAGE RETURN - u'\x0e' # 0x000e -> SHIFT OUT - u'\x0f' # 0x000f -> SHIFT IN - u'\x10' # 0x0010 -> DATA LINK ESCAPE - u'\x11' # 0x0011 -> DEVICE CONTROL ONE - u'\x12' # 0x0012 -> DEVICE CONTROL TWO - u'\x13' # 0x0013 -> DEVICE CONTROL THREE - u'\x14' # 0x0014 -> DEVICE CONTROL FOUR - u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x0016 -> SYNCHRONOUS IDLE - u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x0018 -> CANCEL - u'\x19' # 0x0019 -> END OF MEDIUM - u'\x1a' # 0x001a -> SUBSTITUTE - u'\x1b' # 0x001b -> ESCAPE - u'\x1c' # 0x001c -> FILE SEPARATOR - u'\x1d' # 0x001d -> GROUP SEPARATOR - u'\x1e' # 0x001e -> RECORD SEPARATOR - u'\x1f' # 0x001f -> UNIT SEPARATOR - u' ' # 0x0020 -> SPACE - u'!' # 0x0021 -> EXCLAMATION MARK - u'"' # 0x0022 -> QUOTATION MARK - u'#' # 0x0023 -> NUMBER SIGN - u'$' # 0x0024 -> DOLLAR SIGN - u'%' # 0x0025 -> PERCENT SIGN - u'&' # 0x0026 -> AMPERSAND - u"'" # 0x0027 -> APOSTROPHE - u'(' # 0x0028 -> LEFT PARENTHESIS - u')' # 0x0029 -> RIGHT PARENTHESIS - u'*' # 0x002a -> ASTERISK - u'+' # 0x002b -> PLUS SIGN - u',' # 0x002c -> COMMA - u'-' # 0x002d -> HYPHEN-MINUS - u'.' # 0x002e -> FULL STOP - u'/' # 0x002f -> SOLIDUS - u'0' # 0x0030 -> DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE - u':' # 0x003a -> COLON - u';' # 0x003b -> SEMICOLON - u'<' # 0x003c -> LESS-THAN SIGN - u'=' # 0x003d -> EQUALS SIGN - u'>' # 0x003e -> GREATER-THAN SIGN - u'?' # 0x003f -> QUESTION MARK - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET - u'\\' # 0x005c -> REVERSE SOLIDUS - u']' # 0x005d -> RIGHT SQUARE BRACKET - u'^' # 0x005e -> CIRCUMFLEX ACCENT - u'_' # 0x005f -> LOW LINE - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET - u'|' # 0x007c -> VERTICAL LINE - u'}' # 0x007d -> RIGHT CURLY BRACKET - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> DELETE - u'\ufffe' # 0x0080 -> UNDEFINED - u'\ufffe' # 0x0081 -> UNDEFINED - u'\ufffe' # 0x0082 -> UNDEFINED - u'\ufffe' # 0x0083 -> UNDEFINED - u'\ufffe' # 0x0084 -> UNDEFINED - u'\ufffe' # 0x0085 -> UNDEFINED - u'\u0386' # 0x0086 -> GREEK CAPITAL LETTER ALPHA WITH TONOS - u'\ufffe' # 0x0087 -> UNDEFINED - u'\xb7' # 0x0088 -> MIDDLE DOT - u'\xac' # 0x0089 -> NOT SIGN - u'\xa6' # 0x008a -> BROKEN BAR - u'\u2018' # 0x008b -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x008c -> RIGHT SINGLE QUOTATION MARK - u'\u0388' # 0x008d -> GREEK CAPITAL LETTER EPSILON WITH TONOS - u'\u2015' # 0x008e -> HORIZONTAL BAR - u'\u0389' # 0x008f -> GREEK CAPITAL LETTER ETA WITH TONOS - u'\u038a' # 0x0090 -> GREEK CAPITAL LETTER IOTA WITH TONOS - u'\u03aa' # 0x0091 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - u'\u038c' # 0x0092 -> GREEK CAPITAL LETTER OMICRON WITH TONOS - u'\ufffe' # 0x0093 -> UNDEFINED - u'\ufffe' # 0x0094 -> UNDEFINED - u'\u038e' # 0x0095 -> GREEK CAPITAL LETTER UPSILON WITH TONOS - u'\u03ab' # 0x0096 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - u'\xa9' # 0x0097 -> COPYRIGHT SIGN - u'\u038f' # 0x0098 -> GREEK CAPITAL LETTER OMEGA WITH TONOS - u'\xb2' # 0x0099 -> SUPERSCRIPT TWO - u'\xb3' # 0x009a -> SUPERSCRIPT THREE - u'\u03ac' # 0x009b -> GREEK SMALL LETTER ALPHA WITH TONOS - u'\xa3' # 0x009c -> POUND SIGN - u'\u03ad' # 0x009d -> GREEK SMALL LETTER EPSILON WITH TONOS - u'\u03ae' # 0x009e -> GREEK SMALL LETTER ETA WITH TONOS - u'\u03af' # 0x009f -> GREEK SMALL LETTER IOTA WITH TONOS - u'\u03ca' # 0x00a0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA - u'\u0390' # 0x00a1 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - u'\u03cc' # 0x00a2 -> GREEK SMALL LETTER OMICRON WITH TONOS - u'\u03cd' # 0x00a3 -> GREEK SMALL LETTER UPSILON WITH TONOS - u'\u0391' # 0x00a4 -> GREEK CAPITAL LETTER ALPHA - u'\u0392' # 0x00a5 -> GREEK CAPITAL LETTER BETA - u'\u0393' # 0x00a6 -> GREEK CAPITAL LETTER GAMMA - u'\u0394' # 0x00a7 -> GREEK CAPITAL LETTER DELTA - u'\u0395' # 0x00a8 -> GREEK CAPITAL LETTER EPSILON - u'\u0396' # 0x00a9 -> GREEK CAPITAL LETTER ZETA - u'\u0397' # 0x00aa -> GREEK CAPITAL LETTER ETA - u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF - u'\u0398' # 0x00ac -> GREEK CAPITAL LETTER THETA - u'\u0399' # 0x00ad -> GREEK CAPITAL LETTER IOTA - u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2591' # 0x00b0 -> LIGHT SHADE - u'\u2592' # 0x00b1 -> MEDIUM SHADE - u'\u2593' # 0x00b2 -> DARK SHADE - u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL - u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u039a' # 0x00b5 -> GREEK CAPITAL LETTER KAPPA - u'\u039b' # 0x00b6 -> GREEK CAPITAL LETTER LAMDA - u'\u039c' # 0x00b7 -> GREEK CAPITAL LETTER MU - u'\u039d' # 0x00b8 -> GREEK CAPITAL LETTER NU - u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u039e' # 0x00bd -> GREEK CAPITAL LETTER XI - u'\u039f' # 0x00be -> GREEK CAPITAL LETTER OMICRON - u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u03a0' # 0x00c6 -> GREEK CAPITAL LETTER PI - u'\u03a1' # 0x00c7 -> GREEK CAPITAL LETTER RHO - u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\u03a3' # 0x00cf -> GREEK CAPITAL LETTER SIGMA - u'\u03a4' # 0x00d0 -> GREEK CAPITAL LETTER TAU - u'\u03a5' # 0x00d1 -> GREEK CAPITAL LETTER UPSILON - u'\u03a6' # 0x00d2 -> GREEK CAPITAL LETTER PHI - u'\u03a7' # 0x00d3 -> GREEK CAPITAL LETTER CHI - u'\u03a8' # 0x00d4 -> GREEK CAPITAL LETTER PSI - u'\u03a9' # 0x00d5 -> GREEK CAPITAL LETTER OMEGA - u'\u03b1' # 0x00d6 -> GREEK SMALL LETTER ALPHA - u'\u03b2' # 0x00d7 -> GREEK SMALL LETTER BETA - u'\u03b3' # 0x00d8 -> GREEK SMALL LETTER GAMMA - u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2588' # 0x00db -> FULL BLOCK - u'\u2584' # 0x00dc -> LOWER HALF BLOCK - u'\u03b4' # 0x00dd -> GREEK SMALL LETTER DELTA - u'\u03b5' # 0x00de -> GREEK SMALL LETTER EPSILON - u'\u2580' # 0x00df -> UPPER HALF BLOCK - u'\u03b6' # 0x00e0 -> GREEK SMALL LETTER ZETA - u'\u03b7' # 0x00e1 -> GREEK SMALL LETTER ETA - u'\u03b8' # 0x00e2 -> GREEK SMALL LETTER THETA - u'\u03b9' # 0x00e3 -> GREEK SMALL LETTER IOTA - u'\u03ba' # 0x00e4 -> GREEK SMALL LETTER KAPPA - u'\u03bb' # 0x00e5 -> GREEK SMALL LETTER LAMDA - u'\u03bc' # 0x00e6 -> GREEK SMALL LETTER MU - u'\u03bd' # 0x00e7 -> GREEK SMALL LETTER NU - u'\u03be' # 0x00e8 -> GREEK SMALL LETTER XI - u'\u03bf' # 0x00e9 -> GREEK SMALL LETTER OMICRON - u'\u03c0' # 0x00ea -> GREEK SMALL LETTER PI - u'\u03c1' # 0x00eb -> GREEK SMALL LETTER RHO - u'\u03c3' # 0x00ec -> GREEK SMALL LETTER SIGMA - u'\u03c2' # 0x00ed -> GREEK SMALL LETTER FINAL SIGMA - u'\u03c4' # 0x00ee -> GREEK SMALL LETTER TAU - u'\u0384' # 0x00ef -> GREEK TONOS - u'\xad' # 0x00f0 -> SOFT HYPHEN - u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN - u'\u03c5' # 0x00f2 -> GREEK SMALL LETTER UPSILON - u'\u03c6' # 0x00f3 -> GREEK SMALL LETTER PHI - u'\u03c7' # 0x00f4 -> GREEK SMALL LETTER CHI - u'\xa7' # 0x00f5 -> SECTION SIGN - u'\u03c8' # 0x00f6 -> GREEK SMALL LETTER PSI - u'\u0385' # 0x00f7 -> GREEK DIALYTIKA TONOS - u'\xb0' # 0x00f8 -> DEGREE SIGN - u'\xa8' # 0x00f9 -> DIAERESIS - u'\u03c9' # 0x00fa -> GREEK SMALL LETTER OMEGA - u'\u03cb' # 0x00fb -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA - u'\u03b0' # 0x00fc -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - u'\u03ce' # 0x00fd -> GREEK SMALL LETTER OMEGA WITH TONOS - u'\u25a0' # 0x00fe -> BLACK SQUARE - u'\xa0' # 0x00ff -> NO-BREAK SPACE + u'\x00' # 0x0000 -> NULL + u'\x01' # 0x0001 -> START OF HEADING + u'\x02' # 0x0002 -> START OF TEXT + u'\x03' # 0x0003 -> END OF TEXT + u'\x04' # 0x0004 -> END OF TRANSMISSION + u'\x05' # 0x0005 -> ENQUIRY + u'\x06' # 0x0006 -> ACKNOWLEDGE + u'\x07' # 0x0007 -> BELL + u'\x08' # 0x0008 -> BACKSPACE + u'\t' # 0x0009 -> HORIZONTAL TABULATION + u'\n' # 0x000a -> LINE FEED + u'\x0b' # 0x000b -> VERTICAL TABULATION + u'\x0c' # 0x000c -> FORM FEED + u'\r' # 0x000d -> CARRIAGE RETURN + u'\x0e' # 0x000e -> SHIFT OUT + u'\x0f' # 0x000f -> SHIFT IN + u'\x10' # 0x0010 -> DATA LINK ESCAPE + u'\x11' # 0x0011 -> DEVICE CONTROL ONE + u'\x12' # 0x0012 -> DEVICE CONTROL TWO + u'\x13' # 0x0013 -> DEVICE CONTROL THREE + u'\x14' # 0x0014 -> DEVICE CONTROL FOUR + u'\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x0016 -> SYNCHRONOUS IDLE + u'\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x0018 -> CANCEL + u'\x19' # 0x0019 -> END OF MEDIUM + u'\x1a' # 0x001a -> SUBSTITUTE + u'\x1b' # 0x001b -> ESCAPE + u'\x1c' # 0x001c -> FILE SEPARATOR + u'\x1d' # 0x001d -> GROUP SEPARATOR + u'\x1e' # 0x001e -> RECORD SEPARATOR + u'\x1f' # 0x001f -> UNIT SEPARATOR + u' ' # 0x0020 -> SPACE + u'!' # 0x0021 -> EXCLAMATION MARK + u'"' # 0x0022 -> QUOTATION MARK + u'#' # 0x0023 -> NUMBER SIGN + u'$' # 0x0024 -> DOLLAR SIGN + u'%' # 0x0025 -> PERCENT SIGN + u'&' # 0x0026 -> AMPERSAND + u"'" # 0x0027 -> APOSTROPHE + u'(' # 0x0028 -> LEFT PARENTHESIS + u')' # 0x0029 -> RIGHT PARENTHESIS + u'*' # 0x002a -> ASTERISK + u'+' # 0x002b -> PLUS SIGN + u',' # 0x002c -> COMMA + u'-' # 0x002d -> HYPHEN-MINUS + u'.' # 0x002e -> FULL STOP + u'/' # 0x002f -> SOLIDUS + u'0' # 0x0030 -> DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE + u':' # 0x003a -> COLON + u';' # 0x003b -> SEMICOLON + u'<' # 0x003c -> LESS-THAN SIGN + u'=' # 0x003d -> EQUALS SIGN + u'>' # 0x003e -> GREATER-THAN SIGN + u'?' # 0x003f -> QUESTION MARK + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET + u'\\' # 0x005c -> REVERSE SOLIDUS + u']' # 0x005d -> RIGHT SQUARE BRACKET + u'^' # 0x005e -> CIRCUMFLEX ACCENT + u'_' # 0x005f -> LOW LINE + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET + u'|' # 0x007c -> VERTICAL LINE + u'}' # 0x007d -> RIGHT CURLY BRACKET + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> DELETE + u'\ufffe' # 0x0080 -> UNDEFINED + u'\ufffe' # 0x0081 -> UNDEFINED + u'\ufffe' # 0x0082 -> UNDEFINED + u'\ufffe' # 0x0083 -> UNDEFINED + u'\ufffe' # 0x0084 -> UNDEFINED + u'\ufffe' # 0x0085 -> UNDEFINED + u'\u0386' # 0x0086 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\ufffe' # 0x0087 -> UNDEFINED + u'\xb7' # 0x0088 -> MIDDLE DOT + u'\xac' # 0x0089 -> NOT SIGN + u'\xa6' # 0x008a -> BROKEN BAR + u'\u2018' # 0x008b -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x008c -> RIGHT SINGLE QUOTATION MARK + u'\u0388' # 0x008d -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u2015' # 0x008e -> HORIZONTAL BAR + u'\u0389' # 0x008f -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0x0090 -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\u03aa' # 0x0091 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u038c' # 0x0092 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\ufffe' # 0x0093 -> UNDEFINED + u'\ufffe' # 0x0094 -> UNDEFINED + u'\u038e' # 0x0095 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u03ab' # 0x0096 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\xa9' # 0x0097 -> COPYRIGHT SIGN + u'\u038f' # 0x0098 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\xb2' # 0x0099 -> SUPERSCRIPT TWO + u'\xb3' # 0x009a -> SUPERSCRIPT THREE + u'\u03ac' # 0x009b -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\xa3' # 0x009c -> POUND SIGN + u'\u03ad' # 0x009d -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0x009e -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03af' # 0x009f -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03ca' # 0x00a0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u0390' # 0x00a1 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u03cc' # 0x00a2 -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0x00a3 -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u0391' # 0x00a4 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0x00a5 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0x00a6 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0x00a7 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0x00a8 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0x00a9 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0x00aa -> GREEK CAPITAL LETTER ETA + u'\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + u'\u0398' # 0x00ac -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0x00ad -> GREEK CAPITAL LETTER IOTA + u'\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2591' # 0x00b0 -> LIGHT SHADE + u'\u2592' # 0x00b1 -> MEDIUM SHADE + u'\u2593' # 0x00b2 -> DARK SHADE + u'\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + u'\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u039a' # 0x00b5 -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0x00b6 -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0x00b7 -> GREEK CAPITAL LETTER MU + u'\u039d' # 0x00b8 -> GREEK CAPITAL LETTER NU + u'\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u039e' # 0x00bd -> GREEK CAPITAL LETTER XI + u'\u039f' # 0x00be -> GREEK CAPITAL LETTER OMICRON + u'\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u03a0' # 0x00c6 -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0x00c7 -> GREEK CAPITAL LETTER RHO + u'\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\u03a3' # 0x00cf -> GREEK CAPITAL LETTER SIGMA + u'\u03a4' # 0x00d0 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0x00d1 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0x00d2 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0x00d3 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0x00d4 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0x00d5 -> GREEK CAPITAL LETTER OMEGA + u'\u03b1' # 0x00d6 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0x00d7 -> GREEK SMALL LETTER BETA + u'\u03b3' # 0x00d8 -> GREEK SMALL LETTER GAMMA + u'\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2588' # 0x00db -> FULL BLOCK + u'\u2584' # 0x00dc -> LOWER HALF BLOCK + u'\u03b4' # 0x00dd -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0x00de -> GREEK SMALL LETTER EPSILON + u'\u2580' # 0x00df -> UPPER HALF BLOCK + u'\u03b6' # 0x00e0 -> GREEK SMALL LETTER ZETA + u'\u03b7' # 0x00e1 -> GREEK SMALL LETTER ETA + u'\u03b8' # 0x00e2 -> GREEK SMALL LETTER THETA + u'\u03b9' # 0x00e3 -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0x00e4 -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0x00e5 -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0x00e6 -> GREEK SMALL LETTER MU + u'\u03bd' # 0x00e7 -> GREEK SMALL LETTER NU + u'\u03be' # 0x00e8 -> GREEK SMALL LETTER XI + u'\u03bf' # 0x00e9 -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0x00ea -> GREEK SMALL LETTER PI + u'\u03c1' # 0x00eb -> GREEK SMALL LETTER RHO + u'\u03c3' # 0x00ec -> GREEK SMALL LETTER SIGMA + u'\u03c2' # 0x00ed -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c4' # 0x00ee -> GREEK SMALL LETTER TAU + u'\u0384' # 0x00ef -> GREEK TONOS + u'\xad' # 0x00f0 -> SOFT HYPHEN + u'\xb1' # 0x00f1 -> PLUS-MINUS SIGN + u'\u03c5' # 0x00f2 -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0x00f3 -> GREEK SMALL LETTER PHI + u'\u03c7' # 0x00f4 -> GREEK SMALL LETTER CHI + u'\xa7' # 0x00f5 -> SECTION SIGN + u'\u03c8' # 0x00f6 -> GREEK SMALL LETTER PSI + u'\u0385' # 0x00f7 -> GREEK DIALYTIKA TONOS + u'\xb0' # 0x00f8 -> DEGREE SIGN + u'\xa8' # 0x00f9 -> DIAERESIS + u'\u03c9' # 0x00fa -> GREEK SMALL LETTER OMEGA + u'\u03cb' # 0x00fb -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03b0' # 0x00fc -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\u03ce' # 0x00fd -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u25a0' # 0x00fe -> BLACK SQUARE + u'\xa0' # 0x00ff -> NO-BREAK SPACE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # NULL - 0x0001: 0x0001, # START OF HEADING - 0x0002: 0x0002, # START OF TEXT - 0x0003: 0x0003, # END OF TEXT - 0x0004: 0x0004, # END OF TRANSMISSION - 0x0005: 0x0005, # ENQUIRY - 0x0006: 0x0006, # ACKNOWLEDGE - 0x0007: 0x0007, # BELL - 0x0008: 0x0008, # BACKSPACE - 0x0009: 0x0009, # HORIZONTAL TABULATION - 0x000a: 0x000a, # LINE FEED - 0x000b: 0x000b, # VERTICAL TABULATION - 0x000c: 0x000c, # FORM FEED - 0x000d: 0x000d, # CARRIAGE RETURN - 0x000e: 0x000e, # SHIFT OUT - 0x000f: 0x000f, # SHIFT IN - 0x0010: 0x0010, # DATA LINK ESCAPE - 0x0011: 0x0011, # DEVICE CONTROL ONE - 0x0012: 0x0012, # DEVICE CONTROL TWO - 0x0013: 0x0013, # DEVICE CONTROL THREE - 0x0014: 0x0014, # DEVICE CONTROL FOUR - 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x0016, # SYNCHRONOUS IDLE - 0x0017: 0x0017, # END OF TRANSMISSION BLOCK - 0x0018: 0x0018, # CANCEL - 0x0019: 0x0019, # END OF MEDIUM - 0x001a: 0x001a, # SUBSTITUTE - 0x001b: 0x001b, # ESCAPE - 0x001c: 0x001c, # FILE SEPARATOR - 0x001d: 0x001d, # GROUP SEPARATOR - 0x001e: 0x001e, # RECORD SEPARATOR - 0x001f: 0x001f, # UNIT SEPARATOR - 0x0020: 0x0020, # SPACE - 0x0021: 0x0021, # EXCLAMATION MARK - 0x0022: 0x0022, # QUOTATION MARK - 0x0023: 0x0023, # NUMBER SIGN - 0x0024: 0x0024, # DOLLAR SIGN - 0x0025: 0x0025, # PERCENT SIGN - 0x0026: 0x0026, # AMPERSAND - 0x0027: 0x0027, # APOSTROPHE - 0x0028: 0x0028, # LEFT PARENTHESIS - 0x0029: 0x0029, # RIGHT PARENTHESIS - 0x002a: 0x002a, # ASTERISK - 0x002b: 0x002b, # PLUS SIGN - 0x002c: 0x002c, # COMMA - 0x002d: 0x002d, # HYPHEN-MINUS - 0x002e: 0x002e, # FULL STOP - 0x002f: 0x002f, # SOLIDUS - 0x0030: 0x0030, # DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE - 0x003a: 0x003a, # COLON - 0x003b: 0x003b, # SEMICOLON - 0x003c: 0x003c, # LESS-THAN SIGN - 0x003d: 0x003d, # EQUALS SIGN - 0x003e: 0x003e, # GREATER-THAN SIGN - 0x003f: 0x003f, # QUESTION MARK - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET - 0x005c: 0x005c, # REVERSE SOLIDUS - 0x005d: 0x005d, # RIGHT SQUARE BRACKET - 0x005e: 0x005e, # CIRCUMFLEX ACCENT - 0x005f: 0x005f, # LOW LINE - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET - 0x007c: 0x007c, # VERTICAL LINE - 0x007d: 0x007d, # RIGHT CURLY BRACKET - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # DELETE - 0x00a0: 0x00ff, # NO-BREAK SPACE - 0x00a3: 0x009c, # POUND SIGN - 0x00a6: 0x008a, # BROKEN BAR - 0x00a7: 0x00f5, # SECTION SIGN - 0x00a8: 0x00f9, # DIAERESIS - 0x00a9: 0x0097, # COPYRIGHT SIGN - 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00ac: 0x0089, # NOT SIGN - 0x00ad: 0x00f0, # SOFT HYPHEN - 0x00b0: 0x00f8, # DEGREE SIGN - 0x00b1: 0x00f1, # PLUS-MINUS SIGN - 0x00b2: 0x0099, # SUPERSCRIPT TWO - 0x00b3: 0x009a, # SUPERSCRIPT THREE - 0x00b7: 0x0088, # MIDDLE DOT - 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF - 0x0384: 0x00ef, # GREEK TONOS - 0x0385: 0x00f7, # GREEK DIALYTIKA TONOS - 0x0386: 0x0086, # GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x0388: 0x008d, # GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x0389: 0x008f, # GREEK CAPITAL LETTER ETA WITH TONOS - 0x038a: 0x0090, # GREEK CAPITAL LETTER IOTA WITH TONOS - 0x038c: 0x0092, # GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x038e: 0x0095, # GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x038f: 0x0098, # GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x0390: 0x00a1, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - 0x0391: 0x00a4, # GREEK CAPITAL LETTER ALPHA - 0x0392: 0x00a5, # GREEK CAPITAL LETTER BETA - 0x0393: 0x00a6, # GREEK CAPITAL LETTER GAMMA - 0x0394: 0x00a7, # GREEK CAPITAL LETTER DELTA - 0x0395: 0x00a8, # GREEK CAPITAL LETTER EPSILON - 0x0396: 0x00a9, # GREEK CAPITAL LETTER ZETA - 0x0397: 0x00aa, # GREEK CAPITAL LETTER ETA - 0x0398: 0x00ac, # GREEK CAPITAL LETTER THETA - 0x0399: 0x00ad, # GREEK CAPITAL LETTER IOTA - 0x039a: 0x00b5, # GREEK CAPITAL LETTER KAPPA - 0x039b: 0x00b6, # GREEK CAPITAL LETTER LAMDA - 0x039c: 0x00b7, # GREEK CAPITAL LETTER MU - 0x039d: 0x00b8, # GREEK CAPITAL LETTER NU - 0x039e: 0x00bd, # GREEK CAPITAL LETTER XI - 0x039f: 0x00be, # GREEK CAPITAL LETTER OMICRON - 0x03a0: 0x00c6, # GREEK CAPITAL LETTER PI - 0x03a1: 0x00c7, # GREEK CAPITAL LETTER RHO - 0x03a3: 0x00cf, # GREEK CAPITAL LETTER SIGMA - 0x03a4: 0x00d0, # GREEK CAPITAL LETTER TAU - 0x03a5: 0x00d1, # GREEK CAPITAL LETTER UPSILON - 0x03a6: 0x00d2, # GREEK CAPITAL LETTER PHI - 0x03a7: 0x00d3, # GREEK CAPITAL LETTER CHI - 0x03a8: 0x00d4, # GREEK CAPITAL LETTER PSI - 0x03a9: 0x00d5, # GREEK CAPITAL LETTER OMEGA - 0x03aa: 0x0091, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x03ab: 0x0096, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x03ac: 0x009b, # GREEK SMALL LETTER ALPHA WITH TONOS - 0x03ad: 0x009d, # GREEK SMALL LETTER EPSILON WITH TONOS - 0x03ae: 0x009e, # GREEK SMALL LETTER ETA WITH TONOS - 0x03af: 0x009f, # GREEK SMALL LETTER IOTA WITH TONOS - 0x03b0: 0x00fc, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - 0x03b1: 0x00d6, # GREEK SMALL LETTER ALPHA - 0x03b2: 0x00d7, # GREEK SMALL LETTER BETA - 0x03b3: 0x00d8, # GREEK SMALL LETTER GAMMA - 0x03b4: 0x00dd, # GREEK SMALL LETTER DELTA - 0x03b5: 0x00de, # GREEK SMALL LETTER EPSILON - 0x03b6: 0x00e0, # GREEK SMALL LETTER ZETA - 0x03b7: 0x00e1, # GREEK SMALL LETTER ETA - 0x03b8: 0x00e2, # GREEK SMALL LETTER THETA - 0x03b9: 0x00e3, # GREEK SMALL LETTER IOTA - 0x03ba: 0x00e4, # GREEK SMALL LETTER KAPPA - 0x03bb: 0x00e5, # GREEK SMALL LETTER LAMDA - 0x03bc: 0x00e6, # GREEK SMALL LETTER MU - 0x03bd: 0x00e7, # GREEK SMALL LETTER NU - 0x03be: 0x00e8, # GREEK SMALL LETTER XI - 0x03bf: 0x00e9, # GREEK SMALL LETTER OMICRON - 0x03c0: 0x00ea, # GREEK SMALL LETTER PI - 0x03c1: 0x00eb, # GREEK SMALL LETTER RHO - 0x03c2: 0x00ed, # GREEK SMALL LETTER FINAL SIGMA - 0x03c3: 0x00ec, # GREEK SMALL LETTER SIGMA - 0x03c4: 0x00ee, # GREEK SMALL LETTER TAU - 0x03c5: 0x00f2, # GREEK SMALL LETTER UPSILON - 0x03c6: 0x00f3, # GREEK SMALL LETTER PHI - 0x03c7: 0x00f4, # GREEK SMALL LETTER CHI - 0x03c8: 0x00f6, # GREEK SMALL LETTER PSI - 0x03c9: 0x00fa, # GREEK SMALL LETTER OMEGA - 0x03ca: 0x00a0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x03cb: 0x00fb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x03cc: 0x00a2, # GREEK SMALL LETTER OMICRON WITH TONOS - 0x03cd: 0x00a3, # GREEK SMALL LETTER UPSILON WITH TONOS - 0x03ce: 0x00fd, # GREEK SMALL LETTER OMEGA WITH TONOS - 0x2015: 0x008e, # HORIZONTAL BAR - 0x2018: 0x008b, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x008c, # RIGHT SINGLE QUOTATION MARK - 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL - 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL - 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x00df, # UPPER HALF BLOCK - 0x2584: 0x00dc, # LOWER HALF BLOCK - 0x2588: 0x00db, # FULL BLOCK - 0x2591: 0x00b0, # LIGHT SHADE - 0x2592: 0x00b1, # MEDIUM SHADE - 0x2593: 0x00b2, # DARK SHADE - 0x25a0: 0x00fe, # BLACK SQUARE -} \ No newline at end of file + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a3: 0x009c, # POUND SIGN + 0x00a6: 0x008a, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x0097, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x0089, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x0099, # SUPERSCRIPT TWO + 0x00b3: 0x009a, # SUPERSCRIPT THREE + 0x00b7: 0x0088, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x0384: 0x00ef, # GREEK TONOS + 0x0385: 0x00f7, # GREEK DIALYTIKA TONOS + 0x0386: 0x0086, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x008d, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x008f, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x0090, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x0092, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x0095, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x0098, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0x00a1, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0x00a4, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x00a5, # GREEK CAPITAL LETTER BETA + 0x0393: 0x00a6, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x00a7, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x00a8, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x00a9, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x00aa, # GREEK CAPITAL LETTER ETA + 0x0398: 0x00ac, # GREEK CAPITAL LETTER THETA + 0x0399: 0x00ad, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x00b5, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x00b6, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x00b7, # GREEK CAPITAL LETTER MU + 0x039d: 0x00b8, # GREEK CAPITAL LETTER NU + 0x039e: 0x00bd, # GREEK CAPITAL LETTER XI + 0x039f: 0x00be, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x00c6, # GREEK CAPITAL LETTER PI + 0x03a1: 0x00c7, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x00cf, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x00d0, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x00d1, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x00d2, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x00d3, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x00d4, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x00d5, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x0091, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x0096, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x009b, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x009d, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x009e, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x009f, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b0: 0x00fc, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03b1: 0x00d6, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x00d7, # GREEK SMALL LETTER BETA + 0x03b3: 0x00d8, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x00dd, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00de, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x00e0, # GREEK SMALL LETTER ZETA + 0x03b7: 0x00e1, # GREEK SMALL LETTER ETA + 0x03b8: 0x00e2, # GREEK SMALL LETTER THETA + 0x03b9: 0x00e3, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00e4, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00e5, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00e6, # GREEK SMALL LETTER MU + 0x03bd: 0x00e7, # GREEK SMALL LETTER NU + 0x03be: 0x00e8, # GREEK SMALL LETTER XI + 0x03bf: 0x00e9, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00ea, # GREEK SMALL LETTER PI + 0x03c1: 0x00eb, # GREEK SMALL LETTER RHO + 0x03c2: 0x00ed, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00ec, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ee, # GREEK SMALL LETTER TAU + 0x03c5: 0x00f2, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00f3, # GREEK SMALL LETTER PHI + 0x03c7: 0x00f4, # GREEK SMALL LETTER CHI + 0x03c8: 0x00f6, # GREEK SMALL LETTER PSI + 0x03c9: 0x00fa, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00a0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00fb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00a2, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00a3, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00fd, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2015: 0x008e, # HORIZONTAL BAR + 0x2018: 0x008b, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x008c, # RIGHT SINGLE QUOTATION MARK + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} Modified: python/trunk/Lib/encodings/cp874.py ============================================================================== --- python/trunk/Lib/encodings/cp874.py (original) +++ python/trunk/Lib/encodings/cp874.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,491 +32,490 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u20ac' # 0x80 -> EURO SIGN - u'\ufffe' # 0x81 -> UNDEFINED - u'\ufffe' # 0x82 -> UNDEFINED - u'\ufffe' # 0x83 -> UNDEFINED - u'\ufffe' # 0x84 -> UNDEFINED - u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS - u'\ufffe' # 0x86 -> UNDEFINED - u'\ufffe' # 0x87 -> UNDEFINED - u'\ufffe' # 0x88 -> UNDEFINED - u'\ufffe' # 0x89 -> UNDEFINED - u'\ufffe' # 0x8A -> UNDEFINED - u'\ufffe' # 0x8B -> UNDEFINED - u'\ufffe' # 0x8C -> UNDEFINED - u'\ufffe' # 0x8D -> UNDEFINED - u'\ufffe' # 0x8E -> UNDEFINED - u'\ufffe' # 0x8F -> UNDEFINED - u'\ufffe' # 0x90 -> UNDEFINED - u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK - u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK - u'\u2022' # 0x95 -> BULLET - u'\u2013' # 0x96 -> EN DASH - u'\u2014' # 0x97 -> EM DASH - u'\ufffe' # 0x98 -> UNDEFINED - u'\ufffe' # 0x99 -> UNDEFINED - u'\ufffe' # 0x9A -> UNDEFINED - u'\ufffe' # 0x9B -> UNDEFINED - u'\ufffe' # 0x9C -> UNDEFINED - u'\ufffe' # 0x9D -> UNDEFINED - u'\ufffe' # 0x9E -> UNDEFINED - u'\ufffe' # 0x9F -> UNDEFINED - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI - u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI - u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT - u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI - u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON - u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG - u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU - u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN - u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING - u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG - u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO - u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE - u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING - u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA - u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK - u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN - u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO - u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO - u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN - u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK - u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO - u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG - u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN - u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG - u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU - u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI - u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA - u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG - u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA - u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN - u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN - u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO - u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA - u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK - u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA - u'\u0e24' # 0xC4 -> THAI CHARACTER RU - u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING - u'\u0e26' # 0xC6 -> THAI CHARACTER LU - u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN - u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA - u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI - u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA - u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP - u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA - u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG - u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK - u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI - u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A - u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT - u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA - u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM - u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I - u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II - u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE - u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE - u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U - u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU - u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU - u'\ufffe' # 0xDB -> UNDEFINED - u'\ufffe' # 0xDC -> UNDEFINED - u'\ufffe' # 0xDD -> UNDEFINED - u'\ufffe' # 0xDE -> UNDEFINED - u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT - u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E - u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE - u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O - u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN - u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI - u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO - u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK - u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU - u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK - u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO - u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI - u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA - u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT - u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT - u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN - u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN - u'\u0e50' # 0xF0 -> THAI DIGIT ZERO - u'\u0e51' # 0xF1 -> THAI DIGIT ONE - u'\u0e52' # 0xF2 -> THAI DIGIT TWO - u'\u0e53' # 0xF3 -> THAI DIGIT THREE - u'\u0e54' # 0xF4 -> THAI DIGIT FOUR - u'\u0e55' # 0xF5 -> THAI DIGIT FIVE - u'\u0e56' # 0xF6 -> THAI DIGIT SIX - u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN - u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT - u'\u0e59' # 0xF9 -> THAI DIGIT NINE - u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU - u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT - u'\ufffe' # 0xFC -> UNDEFINED - u'\ufffe' # 0xFD -> UNDEFINED - u'\ufffe' # 0xFE -> UNDEFINED - u'\ufffe' # 0xFF -> UNDEFINED + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u20ac' # 0x80 -> EURO SIGN + u'\ufffe' # 0x81 -> UNDEFINED + u'\ufffe' # 0x82 -> UNDEFINED + u'\ufffe' # 0x83 -> UNDEFINED + u'\ufffe' # 0x84 -> UNDEFINED + u'\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + u'\ufffe' # 0x86 -> UNDEFINED + u'\ufffe' # 0x87 -> UNDEFINED + u'\ufffe' # 0x88 -> UNDEFINED + u'\ufffe' # 0x89 -> UNDEFINED + u'\ufffe' # 0x8A -> UNDEFINED + u'\ufffe' # 0x8B -> UNDEFINED + u'\ufffe' # 0x8C -> UNDEFINED + u'\ufffe' # 0x8D -> UNDEFINED + u'\ufffe' # 0x8E -> UNDEFINED + u'\ufffe' # 0x8F -> UNDEFINED + u'\ufffe' # 0x90 -> UNDEFINED + u'\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + u'\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + u'\u2022' # 0x95 -> BULLET + u'\u2013' # 0x96 -> EN DASH + u'\u2014' # 0x97 -> EM DASH + u'\ufffe' # 0x98 -> UNDEFINED + u'\ufffe' # 0x99 -> UNDEFINED + u'\ufffe' # 0x9A -> UNDEFINED + u'\ufffe' # 0x9B -> UNDEFINED + u'\ufffe' # 0x9C -> UNDEFINED + u'\ufffe' # 0x9D -> UNDEFINED + u'\ufffe' # 0x9E -> UNDEFINED + u'\ufffe' # 0x9F -> UNDEFINED + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO + u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING + u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU + u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA + u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA + u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + u'\u0e24' # 0xC4 -> THAI CHARACTER RU + u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING + u'\u0e26' # 0xC6 -> THAI CHARACTER LU + u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG + u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A + u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I + u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II + u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U + u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + u'\ufffe' # 0xDB -> UNDEFINED + u'\ufffe' # 0xDC -> UNDEFINED + u'\ufffe' # 0xDD -> UNDEFINED + u'\ufffe' # 0xDE -> UNDEFINED + u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E + u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O + u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + u'\u0e50' # 0xF0 -> THAI DIGIT ZERO + u'\u0e51' # 0xF1 -> THAI DIGIT ONE + u'\u0e52' # 0xF2 -> THAI DIGIT TWO + u'\u0e53' # 0xF3 -> THAI DIGIT THREE + u'\u0e54' # 0xF4 -> THAI DIGIT FOUR + u'\u0e55' # 0xF5 -> THAI DIGIT FIVE + u'\u0e56' # 0xF6 -> THAI DIGIT SIX + u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN + u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT + u'\u0e59' # 0xF9 -> THAI DIGIT NINE + u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + u'\ufffe' # 0xFC -> UNDEFINED + u'\ufffe' # 0xFD -> UNDEFINED + u'\ufffe' # 0xFE -> UNDEFINED + u'\ufffe' # 0xFF -> UNDEFINED ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x0E01: 0xA1, # THAI CHARACTER KO KAI - 0x0E02: 0xA2, # THAI CHARACTER KHO KHAI - 0x0E03: 0xA3, # THAI CHARACTER KHO KHUAT - 0x0E04: 0xA4, # THAI CHARACTER KHO KHWAI - 0x0E05: 0xA5, # THAI CHARACTER KHO KHON - 0x0E06: 0xA6, # THAI CHARACTER KHO RAKHANG - 0x0E07: 0xA7, # THAI CHARACTER NGO NGU - 0x0E08: 0xA8, # THAI CHARACTER CHO CHAN - 0x0E09: 0xA9, # THAI CHARACTER CHO CHING - 0x0E0A: 0xAA, # THAI CHARACTER CHO CHANG - 0x0E0B: 0xAB, # THAI CHARACTER SO SO - 0x0E0C: 0xAC, # THAI CHARACTER CHO CHOE - 0x0E0D: 0xAD, # THAI CHARACTER YO YING - 0x0E0E: 0xAE, # THAI CHARACTER DO CHADA - 0x0E0F: 0xAF, # THAI CHARACTER TO PATAK - 0x0E10: 0xB0, # THAI CHARACTER THO THAN - 0x0E11: 0xB1, # THAI CHARACTER THO NANGMONTHO - 0x0E12: 0xB2, # THAI CHARACTER THO PHUTHAO - 0x0E13: 0xB3, # THAI CHARACTER NO NEN - 0x0E14: 0xB4, # THAI CHARACTER DO DEK - 0x0E15: 0xB5, # THAI CHARACTER TO TAO - 0x0E16: 0xB6, # THAI CHARACTER THO THUNG - 0x0E17: 0xB7, # THAI CHARACTER THO THAHAN - 0x0E18: 0xB8, # THAI CHARACTER THO THONG - 0x0E19: 0xB9, # THAI CHARACTER NO NU - 0x0E1A: 0xBA, # THAI CHARACTER BO BAIMAI - 0x0E1B: 0xBB, # THAI CHARACTER PO PLA - 0x0E1C: 0xBC, # THAI CHARACTER PHO PHUNG - 0x0E1D: 0xBD, # THAI CHARACTER FO FA - 0x0E1E: 0xBE, # THAI CHARACTER PHO PHAN - 0x0E1F: 0xBF, # THAI CHARACTER FO FAN - 0x0E20: 0xC0, # THAI CHARACTER PHO SAMPHAO - 0x0E21: 0xC1, # THAI CHARACTER MO MA - 0x0E22: 0xC2, # THAI CHARACTER YO YAK - 0x0E23: 0xC3, # THAI CHARACTER RO RUA - 0x0E24: 0xC4, # THAI CHARACTER RU - 0x0E25: 0xC5, # THAI CHARACTER LO LING - 0x0E26: 0xC6, # THAI CHARACTER LU - 0x0E27: 0xC7, # THAI CHARACTER WO WAEN - 0x0E28: 0xC8, # THAI CHARACTER SO SALA - 0x0E29: 0xC9, # THAI CHARACTER SO RUSI - 0x0E2A: 0xCA, # THAI CHARACTER SO SUA - 0x0E2B: 0xCB, # THAI CHARACTER HO HIP - 0x0E2C: 0xCC, # THAI CHARACTER LO CHULA - 0x0E2D: 0xCD, # THAI CHARACTER O ANG - 0x0E2E: 0xCE, # THAI CHARACTER HO NOKHUK - 0x0E2F: 0xCF, # THAI CHARACTER PAIYANNOI - 0x0E30: 0xD0, # THAI CHARACTER SARA A - 0x0E31: 0xD1, # THAI CHARACTER MAI HAN-AKAT - 0x0E32: 0xD2, # THAI CHARACTER SARA AA - 0x0E33: 0xD3, # THAI CHARACTER SARA AM - 0x0E34: 0xD4, # THAI CHARACTER SARA I - 0x0E35: 0xD5, # THAI CHARACTER SARA II - 0x0E36: 0xD6, # THAI CHARACTER SARA UE - 0x0E37: 0xD7, # THAI CHARACTER SARA UEE - 0x0E38: 0xD8, # THAI CHARACTER SARA U - 0x0E39: 0xD9, # THAI CHARACTER SARA UU - 0x0E3A: 0xDA, # THAI CHARACTER PHINTHU - 0x0E3F: 0xDF, # THAI CURRENCY SYMBOL BAHT - 0x0E40: 0xE0, # THAI CHARACTER SARA E - 0x0E41: 0xE1, # THAI CHARACTER SARA AE - 0x0E42: 0xE2, # THAI CHARACTER SARA O - 0x0E43: 0xE3, # THAI CHARACTER SARA AI MAIMUAN - 0x0E44: 0xE4, # THAI CHARACTER SARA AI MAIMALAI - 0x0E45: 0xE5, # THAI CHARACTER LAKKHANGYAO - 0x0E46: 0xE6, # THAI CHARACTER MAIYAMOK - 0x0E47: 0xE7, # THAI CHARACTER MAITAIKHU - 0x0E48: 0xE8, # THAI CHARACTER MAI EK - 0x0E49: 0xE9, # THAI CHARACTER MAI THO - 0x0E4A: 0xEA, # THAI CHARACTER MAI TRI - 0x0E4B: 0xEB, # THAI CHARACTER MAI CHATTAWA - 0x0E4C: 0xEC, # THAI CHARACTER THANTHAKHAT - 0x0E4D: 0xED, # THAI CHARACTER NIKHAHIT - 0x0E4E: 0xEE, # THAI CHARACTER YAMAKKAN - 0x0E4F: 0xEF, # THAI CHARACTER FONGMAN - 0x0E50: 0xF0, # THAI DIGIT ZERO - 0x0E51: 0xF1, # THAI DIGIT ONE - 0x0E52: 0xF2, # THAI DIGIT TWO - 0x0E53: 0xF3, # THAI DIGIT THREE - 0x0E54: 0xF4, # THAI DIGIT FOUR - 0x0E55: 0xF5, # THAI DIGIT FIVE - 0x0E56: 0xF6, # THAI DIGIT SIX - 0x0E57: 0xF7, # THAI DIGIT SEVEN - 0x0E58: 0xF8, # THAI DIGIT EIGHT - 0x0E59: 0xF9, # THAI DIGIT NINE - 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU - 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT - 0x2013: 0x96, # EN DASH - 0x2014: 0x97, # EM DASH - 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK - 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK - 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK - 0x2022: 0x95, # BULLET - 0x2026: 0x85, # HORIZONTAL ELLIPSIS - 0x20AC: 0x80, # EURO SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x0E01: 0xA1, # THAI CHARACTER KO KAI + 0x0E02: 0xA2, # THAI CHARACTER KHO KHAI + 0x0E03: 0xA3, # THAI CHARACTER KHO KHUAT + 0x0E04: 0xA4, # THAI CHARACTER KHO KHWAI + 0x0E05: 0xA5, # THAI CHARACTER KHO KHON + 0x0E06: 0xA6, # THAI CHARACTER KHO RAKHANG + 0x0E07: 0xA7, # THAI CHARACTER NGO NGU + 0x0E08: 0xA8, # THAI CHARACTER CHO CHAN + 0x0E09: 0xA9, # THAI CHARACTER CHO CHING + 0x0E0A: 0xAA, # THAI CHARACTER CHO CHANG + 0x0E0B: 0xAB, # THAI CHARACTER SO SO + 0x0E0C: 0xAC, # THAI CHARACTER CHO CHOE + 0x0E0D: 0xAD, # THAI CHARACTER YO YING + 0x0E0E: 0xAE, # THAI CHARACTER DO CHADA + 0x0E0F: 0xAF, # THAI CHARACTER TO PATAK + 0x0E10: 0xB0, # THAI CHARACTER THO THAN + 0x0E11: 0xB1, # THAI CHARACTER THO NANGMONTHO + 0x0E12: 0xB2, # THAI CHARACTER THO PHUTHAO + 0x0E13: 0xB3, # THAI CHARACTER NO NEN + 0x0E14: 0xB4, # THAI CHARACTER DO DEK + 0x0E15: 0xB5, # THAI CHARACTER TO TAO + 0x0E16: 0xB6, # THAI CHARACTER THO THUNG + 0x0E17: 0xB7, # THAI CHARACTER THO THAHAN + 0x0E18: 0xB8, # THAI CHARACTER THO THONG + 0x0E19: 0xB9, # THAI CHARACTER NO NU + 0x0E1A: 0xBA, # THAI CHARACTER BO BAIMAI + 0x0E1B: 0xBB, # THAI CHARACTER PO PLA + 0x0E1C: 0xBC, # THAI CHARACTER PHO PHUNG + 0x0E1D: 0xBD, # THAI CHARACTER FO FA + 0x0E1E: 0xBE, # THAI CHARACTER PHO PHAN + 0x0E1F: 0xBF, # THAI CHARACTER FO FAN + 0x0E20: 0xC0, # THAI CHARACTER PHO SAMPHAO + 0x0E21: 0xC1, # THAI CHARACTER MO MA + 0x0E22: 0xC2, # THAI CHARACTER YO YAK + 0x0E23: 0xC3, # THAI CHARACTER RO RUA + 0x0E24: 0xC4, # THAI CHARACTER RU + 0x0E25: 0xC5, # THAI CHARACTER LO LING + 0x0E26: 0xC6, # THAI CHARACTER LU + 0x0E27: 0xC7, # THAI CHARACTER WO WAEN + 0x0E28: 0xC8, # THAI CHARACTER SO SALA + 0x0E29: 0xC9, # THAI CHARACTER SO RUSI + 0x0E2A: 0xCA, # THAI CHARACTER SO SUA + 0x0E2B: 0xCB, # THAI CHARACTER HO HIP + 0x0E2C: 0xCC, # THAI CHARACTER LO CHULA + 0x0E2D: 0xCD, # THAI CHARACTER O ANG + 0x0E2E: 0xCE, # THAI CHARACTER HO NOKHUK + 0x0E2F: 0xCF, # THAI CHARACTER PAIYANNOI + 0x0E30: 0xD0, # THAI CHARACTER SARA A + 0x0E31: 0xD1, # THAI CHARACTER MAI HAN-AKAT + 0x0E32: 0xD2, # THAI CHARACTER SARA AA + 0x0E33: 0xD3, # THAI CHARACTER SARA AM + 0x0E34: 0xD4, # THAI CHARACTER SARA I + 0x0E35: 0xD5, # THAI CHARACTER SARA II + 0x0E36: 0xD6, # THAI CHARACTER SARA UE + 0x0E37: 0xD7, # THAI CHARACTER SARA UEE + 0x0E38: 0xD8, # THAI CHARACTER SARA U + 0x0E39: 0xD9, # THAI CHARACTER SARA UU + 0x0E3A: 0xDA, # THAI CHARACTER PHINTHU + 0x0E3F: 0xDF, # THAI CURRENCY SYMBOL BAHT + 0x0E40: 0xE0, # THAI CHARACTER SARA E + 0x0E41: 0xE1, # THAI CHARACTER SARA AE + 0x0E42: 0xE2, # THAI CHARACTER SARA O + 0x0E43: 0xE3, # THAI CHARACTER SARA AI MAIMUAN + 0x0E44: 0xE4, # THAI CHARACTER SARA AI MAIMALAI + 0x0E45: 0xE5, # THAI CHARACTER LAKKHANGYAO + 0x0E46: 0xE6, # THAI CHARACTER MAIYAMOK + 0x0E47: 0xE7, # THAI CHARACTER MAITAIKHU + 0x0E48: 0xE8, # THAI CHARACTER MAI EK + 0x0E49: 0xE9, # THAI CHARACTER MAI THO + 0x0E4A: 0xEA, # THAI CHARACTER MAI TRI + 0x0E4B: 0xEB, # THAI CHARACTER MAI CHATTAWA + 0x0E4C: 0xEC, # THAI CHARACTER THANTHAKHAT + 0x0E4D: 0xED, # THAI CHARACTER NIKHAHIT + 0x0E4E: 0xEE, # THAI CHARACTER YAMAKKAN + 0x0E4F: 0xEF, # THAI CHARACTER FONGMAN + 0x0E50: 0xF0, # THAI DIGIT ZERO + 0x0E51: 0xF1, # THAI DIGIT ONE + 0x0E52: 0xF2, # THAI DIGIT TWO + 0x0E53: 0xF3, # THAI DIGIT THREE + 0x0E54: 0xF4, # THAI DIGIT FOUR + 0x0E55: 0xF5, # THAI DIGIT FIVE + 0x0E56: 0xF6, # THAI DIGIT SIX + 0x0E57: 0xF7, # THAI DIGIT SEVEN + 0x0E58: 0xF8, # THAI DIGIT EIGHT + 0x0E59: 0xF9, # THAI DIGIT NINE + 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU + 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT + 0x2013: 0x96, # EN DASH + 0x2014: 0x97, # EM DASH + 0x2018: 0x91, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x92, # RIGHT SINGLE QUOTATION MARK + 0x201C: 0x93, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0x94, # RIGHT DOUBLE QUOTATION MARK + 0x2022: 0x95, # BULLET + 0x2026: 0x85, # HORIZONTAL ELLIPSIS + 0x20AC: 0x80, # EURO SIGN } - Modified: python/trunk/Lib/encodings/cp875.py ============================================================================== --- python/trunk/Lib/encodings/cp875.py (original) +++ python/trunk/Lib/encodings/cp875.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,516 +32,515 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x9c' # 0x04 -> CONTROL - u'\t' # 0x05 -> HORIZONTAL TABULATION - u'\x86' # 0x06 -> CONTROL - u'\x7f' # 0x07 -> DELETE - u'\x97' # 0x08 -> CONTROL - u'\x8d' # 0x09 -> CONTROL - u'\x8e' # 0x0A -> CONTROL - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x9d' # 0x14 -> CONTROL - u'\x85' # 0x15 -> CONTROL - u'\x08' # 0x16 -> BACKSPACE - u'\x87' # 0x17 -> CONTROL - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x92' # 0x1A -> CONTROL - u'\x8f' # 0x1B -> CONTROL - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u'\x80' # 0x20 -> CONTROL - u'\x81' # 0x21 -> CONTROL - u'\x82' # 0x22 -> CONTROL - u'\x83' # 0x23 -> CONTROL - u'\x84' # 0x24 -> CONTROL - u'\n' # 0x25 -> LINE FEED - u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK - u'\x1b' # 0x27 -> ESCAPE - u'\x88' # 0x28 -> CONTROL - u'\x89' # 0x29 -> CONTROL - u'\x8a' # 0x2A -> CONTROL - u'\x8b' # 0x2B -> CONTROL - u'\x8c' # 0x2C -> CONTROL - u'\x05' # 0x2D -> ENQUIRY - u'\x06' # 0x2E -> ACKNOWLEDGE - u'\x07' # 0x2F -> BELL - u'\x90' # 0x30 -> CONTROL - u'\x91' # 0x31 -> CONTROL - u'\x16' # 0x32 -> SYNCHRONOUS IDLE - u'\x93' # 0x33 -> CONTROL - u'\x94' # 0x34 -> CONTROL - u'\x95' # 0x35 -> CONTROL - u'\x96' # 0x36 -> CONTROL - u'\x04' # 0x37 -> END OF TRANSMISSION - u'\x98' # 0x38 -> CONTROL - u'\x99' # 0x39 -> CONTROL - u'\x9a' # 0x3A -> CONTROL - u'\x9b' # 0x3B -> CONTROL - u'\x14' # 0x3C -> DEVICE CONTROL FOUR - u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE - u'\x9e' # 0x3E -> CONTROL - u'\x1a' # 0x3F -> SUBSTITUTE - u' ' # 0x40 -> SPACE - u'\u0391' # 0x41 -> GREEK CAPITAL LETTER ALPHA - u'\u0392' # 0x42 -> GREEK CAPITAL LETTER BETA - u'\u0393' # 0x43 -> GREEK CAPITAL LETTER GAMMA - u'\u0394' # 0x44 -> GREEK CAPITAL LETTER DELTA - u'\u0395' # 0x45 -> GREEK CAPITAL LETTER EPSILON - u'\u0396' # 0x46 -> GREEK CAPITAL LETTER ZETA - u'\u0397' # 0x47 -> GREEK CAPITAL LETTER ETA - u'\u0398' # 0x48 -> GREEK CAPITAL LETTER THETA - u'\u0399' # 0x49 -> GREEK CAPITAL LETTER IOTA - u'[' # 0x4A -> LEFT SQUARE BRACKET - u'.' # 0x4B -> FULL STOP - u'<' # 0x4C -> LESS-THAN SIGN - u'(' # 0x4D -> LEFT PARENTHESIS - u'+' # 0x4E -> PLUS SIGN - u'!' # 0x4F -> EXCLAMATION MARK - u'&' # 0x50 -> AMPERSAND - u'\u039a' # 0x51 -> GREEK CAPITAL LETTER KAPPA - u'\u039b' # 0x52 -> GREEK CAPITAL LETTER LAMDA - u'\u039c' # 0x53 -> GREEK CAPITAL LETTER MU - u'\u039d' # 0x54 -> GREEK CAPITAL LETTER NU - u'\u039e' # 0x55 -> GREEK CAPITAL LETTER XI - u'\u039f' # 0x56 -> GREEK CAPITAL LETTER OMICRON - u'\u03a0' # 0x57 -> GREEK CAPITAL LETTER PI - u'\u03a1' # 0x58 -> GREEK CAPITAL LETTER RHO - u'\u03a3' # 0x59 -> GREEK CAPITAL LETTER SIGMA - u']' # 0x5A -> RIGHT SQUARE BRACKET - u'$' # 0x5B -> DOLLAR SIGN - u'*' # 0x5C -> ASTERISK - u')' # 0x5D -> RIGHT PARENTHESIS - u';' # 0x5E -> SEMICOLON - u'^' # 0x5F -> CIRCUMFLEX ACCENT - u'-' # 0x60 -> HYPHEN-MINUS - u'/' # 0x61 -> SOLIDUS - u'\u03a4' # 0x62 -> GREEK CAPITAL LETTER TAU - u'\u03a5' # 0x63 -> GREEK CAPITAL LETTER UPSILON - u'\u03a6' # 0x64 -> GREEK CAPITAL LETTER PHI - u'\u03a7' # 0x65 -> GREEK CAPITAL LETTER CHI - u'\u03a8' # 0x66 -> GREEK CAPITAL LETTER PSI - u'\u03a9' # 0x67 -> GREEK CAPITAL LETTER OMEGA - u'\u03aa' # 0x68 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - u'\u03ab' # 0x69 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - u'|' # 0x6A -> VERTICAL LINE - u',' # 0x6B -> COMMA - u'%' # 0x6C -> PERCENT SIGN - u'_' # 0x6D -> LOW LINE - u'>' # 0x6E -> GREATER-THAN SIGN - u'?' # 0x6F -> QUESTION MARK - u'\xa8' # 0x70 -> DIAERESIS - u'\u0386' # 0x71 -> GREEK CAPITAL LETTER ALPHA WITH TONOS - u'\u0388' # 0x72 -> GREEK CAPITAL LETTER EPSILON WITH TONOS - u'\u0389' # 0x73 -> GREEK CAPITAL LETTER ETA WITH TONOS - u'\xa0' # 0x74 -> NO-BREAK SPACE - u'\u038a' # 0x75 -> GREEK CAPITAL LETTER IOTA WITH TONOS - u'\u038c' # 0x76 -> GREEK CAPITAL LETTER OMICRON WITH TONOS - u'\u038e' # 0x77 -> GREEK CAPITAL LETTER UPSILON WITH TONOS - u'\u038f' # 0x78 -> GREEK CAPITAL LETTER OMEGA WITH TONOS - u'`' # 0x79 -> GRAVE ACCENT - u':' # 0x7A -> COLON - u'#' # 0x7B -> NUMBER SIGN - u'@' # 0x7C -> COMMERCIAL AT - u"'" # 0x7D -> APOSTROPHE - u'=' # 0x7E -> EQUALS SIGN - u'"' # 0x7F -> QUOTATION MARK - u'\u0385' # 0x80 -> GREEK DIALYTIKA TONOS - u'a' # 0x81 -> LATIN SMALL LETTER A - u'b' # 0x82 -> LATIN SMALL LETTER B - u'c' # 0x83 -> LATIN SMALL LETTER C - u'd' # 0x84 -> LATIN SMALL LETTER D - u'e' # 0x85 -> LATIN SMALL LETTER E - u'f' # 0x86 -> LATIN SMALL LETTER F - u'g' # 0x87 -> LATIN SMALL LETTER G - u'h' # 0x88 -> LATIN SMALL LETTER H - u'i' # 0x89 -> LATIN SMALL LETTER I - u'\u03b1' # 0x8A -> GREEK SMALL LETTER ALPHA - u'\u03b2' # 0x8B -> GREEK SMALL LETTER BETA - u'\u03b3' # 0x8C -> GREEK SMALL LETTER GAMMA - u'\u03b4' # 0x8D -> GREEK SMALL LETTER DELTA - u'\u03b5' # 0x8E -> GREEK SMALL LETTER EPSILON - u'\u03b6' # 0x8F -> GREEK SMALL LETTER ZETA - u'\xb0' # 0x90 -> DEGREE SIGN - u'j' # 0x91 -> LATIN SMALL LETTER J - u'k' # 0x92 -> LATIN SMALL LETTER K - u'l' # 0x93 -> LATIN SMALL LETTER L - u'm' # 0x94 -> LATIN SMALL LETTER M - u'n' # 0x95 -> LATIN SMALL LETTER N - u'o' # 0x96 -> LATIN SMALL LETTER O - u'p' # 0x97 -> LATIN SMALL LETTER P - u'q' # 0x98 -> LATIN SMALL LETTER Q - u'r' # 0x99 -> LATIN SMALL LETTER R - u'\u03b7' # 0x9A -> GREEK SMALL LETTER ETA - u'\u03b8' # 0x9B -> GREEK SMALL LETTER THETA - u'\u03b9' # 0x9C -> GREEK SMALL LETTER IOTA - u'\u03ba' # 0x9D -> GREEK SMALL LETTER KAPPA - u'\u03bb' # 0x9E -> GREEK SMALL LETTER LAMDA - u'\u03bc' # 0x9F -> GREEK SMALL LETTER MU - u'\xb4' # 0xA0 -> ACUTE ACCENT - u'~' # 0xA1 -> TILDE - u's' # 0xA2 -> LATIN SMALL LETTER S - u't' # 0xA3 -> LATIN SMALL LETTER T - u'u' # 0xA4 -> LATIN SMALL LETTER U - u'v' # 0xA5 -> LATIN SMALL LETTER V - u'w' # 0xA6 -> LATIN SMALL LETTER W - u'x' # 0xA7 -> LATIN SMALL LETTER X - u'y' # 0xA8 -> LATIN SMALL LETTER Y - u'z' # 0xA9 -> LATIN SMALL LETTER Z - u'\u03bd' # 0xAA -> GREEK SMALL LETTER NU - u'\u03be' # 0xAB -> GREEK SMALL LETTER XI - u'\u03bf' # 0xAC -> GREEK SMALL LETTER OMICRON - u'\u03c0' # 0xAD -> GREEK SMALL LETTER PI - u'\u03c1' # 0xAE -> GREEK SMALL LETTER RHO - u'\u03c3' # 0xAF -> GREEK SMALL LETTER SIGMA - u'\xa3' # 0xB0 -> POUND SIGN - u'\u03ac' # 0xB1 -> GREEK SMALL LETTER ALPHA WITH TONOS - u'\u03ad' # 0xB2 -> GREEK SMALL LETTER EPSILON WITH TONOS - u'\u03ae' # 0xB3 -> GREEK SMALL LETTER ETA WITH TONOS - u'\u03ca' # 0xB4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA - u'\u03af' # 0xB5 -> GREEK SMALL LETTER IOTA WITH TONOS - u'\u03cc' # 0xB6 -> GREEK SMALL LETTER OMICRON WITH TONOS - u'\u03cd' # 0xB7 -> GREEK SMALL LETTER UPSILON WITH TONOS - u'\u03cb' # 0xB8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA - u'\u03ce' # 0xB9 -> GREEK SMALL LETTER OMEGA WITH TONOS - u'\u03c2' # 0xBA -> GREEK SMALL LETTER FINAL SIGMA - u'\u03c4' # 0xBB -> GREEK SMALL LETTER TAU - u'\u03c5' # 0xBC -> GREEK SMALL LETTER UPSILON - u'\u03c6' # 0xBD -> GREEK SMALL LETTER PHI - u'\u03c7' # 0xBE -> GREEK SMALL LETTER CHI - u'\u03c8' # 0xBF -> GREEK SMALL LETTER PSI - u'{' # 0xC0 -> LEFT CURLY BRACKET - u'A' # 0xC1 -> LATIN CAPITAL LETTER A - u'B' # 0xC2 -> LATIN CAPITAL LETTER B - u'C' # 0xC3 -> LATIN CAPITAL LETTER C - u'D' # 0xC4 -> LATIN CAPITAL LETTER D - u'E' # 0xC5 -> LATIN CAPITAL LETTER E - u'F' # 0xC6 -> LATIN CAPITAL LETTER F - u'G' # 0xC7 -> LATIN CAPITAL LETTER G - u'H' # 0xC8 -> LATIN CAPITAL LETTER H - u'I' # 0xC9 -> LATIN CAPITAL LETTER I - u'\xad' # 0xCA -> SOFT HYPHEN - u'\u03c9' # 0xCB -> GREEK SMALL LETTER OMEGA - u'\u0390' # 0xCC -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - u'\u03b0' # 0xCD -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - u'\u2018' # 0xCE -> LEFT SINGLE QUOTATION MARK - u'\u2015' # 0xCF -> HORIZONTAL BAR - u'}' # 0xD0 -> RIGHT CURLY BRACKET - u'J' # 0xD1 -> LATIN CAPITAL LETTER J - u'K' # 0xD2 -> LATIN CAPITAL LETTER K - u'L' # 0xD3 -> LATIN CAPITAL LETTER L - u'M' # 0xD4 -> LATIN CAPITAL LETTER M - u'N' # 0xD5 -> LATIN CAPITAL LETTER N - u'O' # 0xD6 -> LATIN CAPITAL LETTER O - u'P' # 0xD7 -> LATIN CAPITAL LETTER P - u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q - u'R' # 0xD9 -> LATIN CAPITAL LETTER R - u'\xb1' # 0xDA -> PLUS-MINUS SIGN - u'\xbd' # 0xDB -> VULGAR FRACTION ONE HALF - u'\x1a' # 0xDC -> SUBSTITUTE - u'\u0387' # 0xDD -> GREEK ANO TELEIA - u'\u2019' # 0xDE -> RIGHT SINGLE QUOTATION MARK - u'\xa6' # 0xDF -> BROKEN BAR - u'\\' # 0xE0 -> REVERSE SOLIDUS - u'\x1a' # 0xE1 -> SUBSTITUTE - u'S' # 0xE2 -> LATIN CAPITAL LETTER S - u'T' # 0xE3 -> LATIN CAPITAL LETTER T - u'U' # 0xE4 -> LATIN CAPITAL LETTER U - u'V' # 0xE5 -> LATIN CAPITAL LETTER V - u'W' # 0xE6 -> LATIN CAPITAL LETTER W - u'X' # 0xE7 -> LATIN CAPITAL LETTER X - u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y - u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z - u'\xb2' # 0xEA -> SUPERSCRIPT TWO - u'\xa7' # 0xEB -> SECTION SIGN - u'\x1a' # 0xEC -> SUBSTITUTE - u'\x1a' # 0xED -> SUBSTITUTE - u'\xab' # 0xEE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xEF -> NOT SIGN - u'0' # 0xF0 -> DIGIT ZERO - u'1' # 0xF1 -> DIGIT ONE - u'2' # 0xF2 -> DIGIT TWO - u'3' # 0xF3 -> DIGIT THREE - u'4' # 0xF4 -> DIGIT FOUR - u'5' # 0xF5 -> DIGIT FIVE - u'6' # 0xF6 -> DIGIT SIX - u'7' # 0xF7 -> DIGIT SEVEN - u'8' # 0xF8 -> DIGIT EIGHT - u'9' # 0xF9 -> DIGIT NINE - u'\xb3' # 0xFA -> SUPERSCRIPT THREE - u'\xa9' # 0xFB -> COPYRIGHT SIGN - u'\x1a' # 0xFC -> SUBSTITUTE - u'\x1a' # 0xFD -> SUBSTITUTE - u'\xbb' # 0xFE -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\x9f' # 0xFF -> CONTROL + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x9c' # 0x04 -> CONTROL + u'\t' # 0x05 -> HORIZONTAL TABULATION + u'\x86' # 0x06 -> CONTROL + u'\x7f' # 0x07 -> DELETE + u'\x97' # 0x08 -> CONTROL + u'\x8d' # 0x09 -> CONTROL + u'\x8e' # 0x0A -> CONTROL + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x9d' # 0x14 -> CONTROL + u'\x85' # 0x15 -> CONTROL + u'\x08' # 0x16 -> BACKSPACE + u'\x87' # 0x17 -> CONTROL + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x92' # 0x1A -> CONTROL + u'\x8f' # 0x1B -> CONTROL + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u'\x80' # 0x20 -> CONTROL + u'\x81' # 0x21 -> CONTROL + u'\x82' # 0x22 -> CONTROL + u'\x83' # 0x23 -> CONTROL + u'\x84' # 0x24 -> CONTROL + u'\n' # 0x25 -> LINE FEED + u'\x17' # 0x26 -> END OF TRANSMISSION BLOCK + u'\x1b' # 0x27 -> ESCAPE + u'\x88' # 0x28 -> CONTROL + u'\x89' # 0x29 -> CONTROL + u'\x8a' # 0x2A -> CONTROL + u'\x8b' # 0x2B -> CONTROL + u'\x8c' # 0x2C -> CONTROL + u'\x05' # 0x2D -> ENQUIRY + u'\x06' # 0x2E -> ACKNOWLEDGE + u'\x07' # 0x2F -> BELL + u'\x90' # 0x30 -> CONTROL + u'\x91' # 0x31 -> CONTROL + u'\x16' # 0x32 -> SYNCHRONOUS IDLE + u'\x93' # 0x33 -> CONTROL + u'\x94' # 0x34 -> CONTROL + u'\x95' # 0x35 -> CONTROL + u'\x96' # 0x36 -> CONTROL + u'\x04' # 0x37 -> END OF TRANSMISSION + u'\x98' # 0x38 -> CONTROL + u'\x99' # 0x39 -> CONTROL + u'\x9a' # 0x3A -> CONTROL + u'\x9b' # 0x3B -> CONTROL + u'\x14' # 0x3C -> DEVICE CONTROL FOUR + u'\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + u'\x9e' # 0x3E -> CONTROL + u'\x1a' # 0x3F -> SUBSTITUTE + u' ' # 0x40 -> SPACE + u'\u0391' # 0x41 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0x42 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0x43 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0x44 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0x45 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0x46 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0x47 -> GREEK CAPITAL LETTER ETA + u'\u0398' # 0x48 -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0x49 -> GREEK CAPITAL LETTER IOTA + u'[' # 0x4A -> LEFT SQUARE BRACKET + u'.' # 0x4B -> FULL STOP + u'<' # 0x4C -> LESS-THAN SIGN + u'(' # 0x4D -> LEFT PARENTHESIS + u'+' # 0x4E -> PLUS SIGN + u'!' # 0x4F -> EXCLAMATION MARK + u'&' # 0x50 -> AMPERSAND + u'\u039a' # 0x51 -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0x52 -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0x53 -> GREEK CAPITAL LETTER MU + u'\u039d' # 0x54 -> GREEK CAPITAL LETTER NU + u'\u039e' # 0x55 -> GREEK CAPITAL LETTER XI + u'\u039f' # 0x56 -> GREEK CAPITAL LETTER OMICRON + u'\u03a0' # 0x57 -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0x58 -> GREEK CAPITAL LETTER RHO + u'\u03a3' # 0x59 -> GREEK CAPITAL LETTER SIGMA + u']' # 0x5A -> RIGHT SQUARE BRACKET + u'$' # 0x5B -> DOLLAR SIGN + u'*' # 0x5C -> ASTERISK + u')' # 0x5D -> RIGHT PARENTHESIS + u';' # 0x5E -> SEMICOLON + u'^' # 0x5F -> CIRCUMFLEX ACCENT + u'-' # 0x60 -> HYPHEN-MINUS + u'/' # 0x61 -> SOLIDUS + u'\u03a4' # 0x62 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0x63 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0x64 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0x65 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0x66 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0x67 -> GREEK CAPITAL LETTER OMEGA + u'\u03aa' # 0x68 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u03ab' # 0x69 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'|' # 0x6A -> VERTICAL LINE + u',' # 0x6B -> COMMA + u'%' # 0x6C -> PERCENT SIGN + u'_' # 0x6D -> LOW LINE + u'>' # 0x6E -> GREATER-THAN SIGN + u'?' # 0x6F -> QUESTION MARK + u'\xa8' # 0x70 -> DIAERESIS + u'\u0386' # 0x71 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\u0388' # 0x72 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0389' # 0x73 -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\xa0' # 0x74 -> NO-BREAK SPACE + u'\u038a' # 0x75 -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\u038c' # 0x76 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\u038e' # 0x77 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u038f' # 0x78 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'`' # 0x79 -> GRAVE ACCENT + u':' # 0x7A -> COLON + u'#' # 0x7B -> NUMBER SIGN + u'@' # 0x7C -> COMMERCIAL AT + u"'" # 0x7D -> APOSTROPHE + u'=' # 0x7E -> EQUALS SIGN + u'"' # 0x7F -> QUOTATION MARK + u'\u0385' # 0x80 -> GREEK DIALYTIKA TONOS + u'a' # 0x81 -> LATIN SMALL LETTER A + u'b' # 0x82 -> LATIN SMALL LETTER B + u'c' # 0x83 -> LATIN SMALL LETTER C + u'd' # 0x84 -> LATIN SMALL LETTER D + u'e' # 0x85 -> LATIN SMALL LETTER E + u'f' # 0x86 -> LATIN SMALL LETTER F + u'g' # 0x87 -> LATIN SMALL LETTER G + u'h' # 0x88 -> LATIN SMALL LETTER H + u'i' # 0x89 -> LATIN SMALL LETTER I + u'\u03b1' # 0x8A -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0x8B -> GREEK SMALL LETTER BETA + u'\u03b3' # 0x8C -> GREEK SMALL LETTER GAMMA + u'\u03b4' # 0x8D -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0x8E -> GREEK SMALL LETTER EPSILON + u'\u03b6' # 0x8F -> GREEK SMALL LETTER ZETA + u'\xb0' # 0x90 -> DEGREE SIGN + u'j' # 0x91 -> LATIN SMALL LETTER J + u'k' # 0x92 -> LATIN SMALL LETTER K + u'l' # 0x93 -> LATIN SMALL LETTER L + u'm' # 0x94 -> LATIN SMALL LETTER M + u'n' # 0x95 -> LATIN SMALL LETTER N + u'o' # 0x96 -> LATIN SMALL LETTER O + u'p' # 0x97 -> LATIN SMALL LETTER P + u'q' # 0x98 -> LATIN SMALL LETTER Q + u'r' # 0x99 -> LATIN SMALL LETTER R + u'\u03b7' # 0x9A -> GREEK SMALL LETTER ETA + u'\u03b8' # 0x9B -> GREEK SMALL LETTER THETA + u'\u03b9' # 0x9C -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0x9D -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0x9E -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0x9F -> GREEK SMALL LETTER MU + u'\xb4' # 0xA0 -> ACUTE ACCENT + u'~' # 0xA1 -> TILDE + u's' # 0xA2 -> LATIN SMALL LETTER S + u't' # 0xA3 -> LATIN SMALL LETTER T + u'u' # 0xA4 -> LATIN SMALL LETTER U + u'v' # 0xA5 -> LATIN SMALL LETTER V + u'w' # 0xA6 -> LATIN SMALL LETTER W + u'x' # 0xA7 -> LATIN SMALL LETTER X + u'y' # 0xA8 -> LATIN SMALL LETTER Y + u'z' # 0xA9 -> LATIN SMALL LETTER Z + u'\u03bd' # 0xAA -> GREEK SMALL LETTER NU + u'\u03be' # 0xAB -> GREEK SMALL LETTER XI + u'\u03bf' # 0xAC -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0xAD -> GREEK SMALL LETTER PI + u'\u03c1' # 0xAE -> GREEK SMALL LETTER RHO + u'\u03c3' # 0xAF -> GREEK SMALL LETTER SIGMA + u'\xa3' # 0xB0 -> POUND SIGN + u'\u03ac' # 0xB1 -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u03ad' # 0xB2 -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0xB3 -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03ca' # 0xB4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03af' # 0xB5 -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03cc' # 0xB6 -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0xB7 -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03cb' # 0xB8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03ce' # 0xB9 -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u03c2' # 0xBA -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c4' # 0xBB -> GREEK SMALL LETTER TAU + u'\u03c5' # 0xBC -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0xBD -> GREEK SMALL LETTER PHI + u'\u03c7' # 0xBE -> GREEK SMALL LETTER CHI + u'\u03c8' # 0xBF -> GREEK SMALL LETTER PSI + u'{' # 0xC0 -> LEFT CURLY BRACKET + u'A' # 0xC1 -> LATIN CAPITAL LETTER A + u'B' # 0xC2 -> LATIN CAPITAL LETTER B + u'C' # 0xC3 -> LATIN CAPITAL LETTER C + u'D' # 0xC4 -> LATIN CAPITAL LETTER D + u'E' # 0xC5 -> LATIN CAPITAL LETTER E + u'F' # 0xC6 -> LATIN CAPITAL LETTER F + u'G' # 0xC7 -> LATIN CAPITAL LETTER G + u'H' # 0xC8 -> LATIN CAPITAL LETTER H + u'I' # 0xC9 -> LATIN CAPITAL LETTER I + u'\xad' # 0xCA -> SOFT HYPHEN + u'\u03c9' # 0xCB -> GREEK SMALL LETTER OMEGA + u'\u0390' # 0xCC -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u03b0' # 0xCD -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\u2018' # 0xCE -> LEFT SINGLE QUOTATION MARK + u'\u2015' # 0xCF -> HORIZONTAL BAR + u'}' # 0xD0 -> RIGHT CURLY BRACKET + u'J' # 0xD1 -> LATIN CAPITAL LETTER J + u'K' # 0xD2 -> LATIN CAPITAL LETTER K + u'L' # 0xD3 -> LATIN CAPITAL LETTER L + u'M' # 0xD4 -> LATIN CAPITAL LETTER M + u'N' # 0xD5 -> LATIN CAPITAL LETTER N + u'O' # 0xD6 -> LATIN CAPITAL LETTER O + u'P' # 0xD7 -> LATIN CAPITAL LETTER P + u'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + u'R' # 0xD9 -> LATIN CAPITAL LETTER R + u'\xb1' # 0xDA -> PLUS-MINUS SIGN + u'\xbd' # 0xDB -> VULGAR FRACTION ONE HALF + u'\x1a' # 0xDC -> SUBSTITUTE + u'\u0387' # 0xDD -> GREEK ANO TELEIA + u'\u2019' # 0xDE -> RIGHT SINGLE QUOTATION MARK + u'\xa6' # 0xDF -> BROKEN BAR + u'\\' # 0xE0 -> REVERSE SOLIDUS + u'\x1a' # 0xE1 -> SUBSTITUTE + u'S' # 0xE2 -> LATIN CAPITAL LETTER S + u'T' # 0xE3 -> LATIN CAPITAL LETTER T + u'U' # 0xE4 -> LATIN CAPITAL LETTER U + u'V' # 0xE5 -> LATIN CAPITAL LETTER V + u'W' # 0xE6 -> LATIN CAPITAL LETTER W + u'X' # 0xE7 -> LATIN CAPITAL LETTER X + u'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + u'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + u'\xb2' # 0xEA -> SUPERSCRIPT TWO + u'\xa7' # 0xEB -> SECTION SIGN + u'\x1a' # 0xEC -> SUBSTITUTE + u'\x1a' # 0xED -> SUBSTITUTE + u'\xab' # 0xEE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xEF -> NOT SIGN + u'0' # 0xF0 -> DIGIT ZERO + u'1' # 0xF1 -> DIGIT ONE + u'2' # 0xF2 -> DIGIT TWO + u'3' # 0xF3 -> DIGIT THREE + u'4' # 0xF4 -> DIGIT FOUR + u'5' # 0xF5 -> DIGIT FIVE + u'6' # 0xF6 -> DIGIT SIX + u'7' # 0xF7 -> DIGIT SEVEN + u'8' # 0xF8 -> DIGIT EIGHT + u'9' # 0xF9 -> DIGIT NINE + u'\xb3' # 0xFA -> SUPERSCRIPT THREE + u'\xa9' # 0xFB -> COPYRIGHT SIGN + u'\x1a' # 0xFC -> SUBSTITUTE + u'\x1a' # 0xFD -> SUBSTITUTE + u'\xbb' # 0xFE -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\x9f' # 0xFF -> CONTROL ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x37, # END OF TRANSMISSION - 0x0005: 0x2D, # ENQUIRY - 0x0006: 0x2E, # ACKNOWLEDGE - 0x0007: 0x2F, # BELL - 0x0008: 0x16, # BACKSPACE - 0x0009: 0x05, # HORIZONTAL TABULATION - 0x000A: 0x25, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x3C, # DEVICE CONTROL FOUR - 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x32, # SYNCHRONOUS IDLE - 0x0017: 0x26, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: None, # SUBSTITUTE - 0x001B: 0x27, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x40, # SPACE - 0x0021: 0x4F, # EXCLAMATION MARK - 0x0022: 0x7F, # QUOTATION MARK - 0x0023: 0x7B, # NUMBER SIGN - 0x0024: 0x5B, # DOLLAR SIGN - 0x0025: 0x6C, # PERCENT SIGN - 0x0026: 0x50, # AMPERSAND - 0x0027: 0x7D, # APOSTROPHE - 0x0028: 0x4D, # LEFT PARENTHESIS - 0x0029: 0x5D, # RIGHT PARENTHESIS - 0x002A: 0x5C, # ASTERISK - 0x002B: 0x4E, # PLUS SIGN - 0x002C: 0x6B, # COMMA - 0x002D: 0x60, # HYPHEN-MINUS - 0x002E: 0x4B, # FULL STOP - 0x002F: 0x61, # SOLIDUS - 0x0030: 0xF0, # DIGIT ZERO - 0x0031: 0xF1, # DIGIT ONE - 0x0032: 0xF2, # DIGIT TWO - 0x0033: 0xF3, # DIGIT THREE - 0x0034: 0xF4, # DIGIT FOUR - 0x0035: 0xF5, # DIGIT FIVE - 0x0036: 0xF6, # DIGIT SIX - 0x0037: 0xF7, # DIGIT SEVEN - 0x0038: 0xF8, # DIGIT EIGHT - 0x0039: 0xF9, # DIGIT NINE - 0x003A: 0x7A, # COLON - 0x003B: 0x5E, # SEMICOLON - 0x003C: 0x4C, # LESS-THAN SIGN - 0x003D: 0x7E, # EQUALS SIGN - 0x003E: 0x6E, # GREATER-THAN SIGN - 0x003F: 0x6F, # QUESTION MARK - 0x0040: 0x7C, # COMMERCIAL AT - 0x0041: 0xC1, # LATIN CAPITAL LETTER A - 0x0042: 0xC2, # LATIN CAPITAL LETTER B - 0x0043: 0xC3, # LATIN CAPITAL LETTER C - 0x0044: 0xC4, # LATIN CAPITAL LETTER D - 0x0045: 0xC5, # LATIN CAPITAL LETTER E - 0x0046: 0xC6, # LATIN CAPITAL LETTER F - 0x0047: 0xC7, # LATIN CAPITAL LETTER G - 0x0048: 0xC8, # LATIN CAPITAL LETTER H - 0x0049: 0xC9, # LATIN CAPITAL LETTER I - 0x004A: 0xD1, # LATIN CAPITAL LETTER J - 0x004B: 0xD2, # LATIN CAPITAL LETTER K - 0x004C: 0xD3, # LATIN CAPITAL LETTER L - 0x004D: 0xD4, # LATIN CAPITAL LETTER M - 0x004E: 0xD5, # LATIN CAPITAL LETTER N - 0x004F: 0xD6, # LATIN CAPITAL LETTER O - 0x0050: 0xD7, # LATIN CAPITAL LETTER P - 0x0051: 0xD8, # LATIN CAPITAL LETTER Q - 0x0052: 0xD9, # LATIN CAPITAL LETTER R - 0x0053: 0xE2, # LATIN CAPITAL LETTER S - 0x0054: 0xE3, # LATIN CAPITAL LETTER T - 0x0055: 0xE4, # LATIN CAPITAL LETTER U - 0x0056: 0xE5, # LATIN CAPITAL LETTER V - 0x0057: 0xE6, # LATIN CAPITAL LETTER W - 0x0058: 0xE7, # LATIN CAPITAL LETTER X - 0x0059: 0xE8, # LATIN CAPITAL LETTER Y - 0x005A: 0xE9, # LATIN CAPITAL LETTER Z - 0x005B: 0x4A, # LEFT SQUARE BRACKET - 0x005C: 0xE0, # REVERSE SOLIDUS - 0x005D: 0x5A, # RIGHT SQUARE BRACKET - 0x005E: 0x5F, # CIRCUMFLEX ACCENT - 0x005F: 0x6D, # LOW LINE - 0x0060: 0x79, # GRAVE ACCENT - 0x0061: 0x81, # LATIN SMALL LETTER A - 0x0062: 0x82, # LATIN SMALL LETTER B - 0x0063: 0x83, # LATIN SMALL LETTER C - 0x0064: 0x84, # LATIN SMALL LETTER D - 0x0065: 0x85, # LATIN SMALL LETTER E - 0x0066: 0x86, # LATIN SMALL LETTER F - 0x0067: 0x87, # LATIN SMALL LETTER G - 0x0068: 0x88, # LATIN SMALL LETTER H - 0x0069: 0x89, # LATIN SMALL LETTER I - 0x006A: 0x91, # LATIN SMALL LETTER J - 0x006B: 0x92, # LATIN SMALL LETTER K - 0x006C: 0x93, # LATIN SMALL LETTER L - 0x006D: 0x94, # LATIN SMALL LETTER M - 0x006E: 0x95, # LATIN SMALL LETTER N - 0x006F: 0x96, # LATIN SMALL LETTER O - 0x0070: 0x97, # LATIN SMALL LETTER P - 0x0071: 0x98, # LATIN SMALL LETTER Q - 0x0072: 0x99, # LATIN SMALL LETTER R - 0x0073: 0xA2, # LATIN SMALL LETTER S - 0x0074: 0xA3, # LATIN SMALL LETTER T - 0x0075: 0xA4, # LATIN SMALL LETTER U - 0x0076: 0xA5, # LATIN SMALL LETTER V - 0x0077: 0xA6, # LATIN SMALL LETTER W - 0x0078: 0xA7, # LATIN SMALL LETTER X - 0x0079: 0xA8, # LATIN SMALL LETTER Y - 0x007A: 0xA9, # LATIN SMALL LETTER Z - 0x007B: 0xC0, # LEFT CURLY BRACKET - 0x007C: 0x6A, # VERTICAL LINE - 0x007D: 0xD0, # RIGHT CURLY BRACKET - 0x007E: 0xA1, # TILDE - 0x007F: 0x07, # DELETE - 0x0080: 0x20, # CONTROL - 0x0081: 0x21, # CONTROL - 0x0082: 0x22, # CONTROL - 0x0083: 0x23, # CONTROL - 0x0084: 0x24, # CONTROL - 0x0085: 0x15, # CONTROL - 0x0086: 0x06, # CONTROL - 0x0087: 0x17, # CONTROL - 0x0088: 0x28, # CONTROL - 0x0089: 0x29, # CONTROL - 0x008A: 0x2A, # CONTROL - 0x008B: 0x2B, # CONTROL - 0x008C: 0x2C, # CONTROL - 0x008D: 0x09, # CONTROL - 0x008E: 0x0A, # CONTROL - 0x008F: 0x1B, # CONTROL - 0x0090: 0x30, # CONTROL - 0x0091: 0x31, # CONTROL - 0x0092: 0x1A, # CONTROL - 0x0093: 0x33, # CONTROL - 0x0094: 0x34, # CONTROL - 0x0095: 0x35, # CONTROL - 0x0096: 0x36, # CONTROL - 0x0097: 0x08, # CONTROL - 0x0098: 0x38, # CONTROL - 0x0099: 0x39, # CONTROL - 0x009A: 0x3A, # CONTROL - 0x009B: 0x3B, # CONTROL - 0x009C: 0x04, # CONTROL - 0x009D: 0x14, # CONTROL - 0x009E: 0x3E, # CONTROL - 0x009F: 0xFF, # CONTROL - 0x00A0: 0x74, # NO-BREAK SPACE - 0x00A3: 0xB0, # POUND SIGN - 0x00A6: 0xDF, # BROKEN BAR - 0x00A7: 0xEB, # SECTION SIGN - 0x00A8: 0x70, # DIAERESIS - 0x00A9: 0xFB, # COPYRIGHT SIGN - 0x00AB: 0xEE, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xEF, # NOT SIGN - 0x00AD: 0xCA, # SOFT HYPHEN - 0x00B0: 0x90, # DEGREE SIGN - 0x00B1: 0xDA, # PLUS-MINUS SIGN - 0x00B2: 0xEA, # SUPERSCRIPT TWO - 0x00B3: 0xFA, # SUPERSCRIPT THREE - 0x00B4: 0xA0, # ACUTE ACCENT - 0x00BB: 0xFE, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BD: 0xDB, # VULGAR FRACTION ONE HALF - 0x0385: 0x80, # GREEK DIALYTIKA TONOS - 0x0386: 0x71, # GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x0387: 0xDD, # GREEK ANO TELEIA - 0x0388: 0x72, # GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x0389: 0x73, # GREEK CAPITAL LETTER ETA WITH TONOS - 0x038A: 0x75, # GREEK CAPITAL LETTER IOTA WITH TONOS - 0x038C: 0x76, # GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x038E: 0x77, # GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x038F: 0x78, # GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x0390: 0xCC, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - 0x0391: 0x41, # GREEK CAPITAL LETTER ALPHA - 0x0392: 0x42, # GREEK CAPITAL LETTER BETA - 0x0393: 0x43, # GREEK CAPITAL LETTER GAMMA - 0x0394: 0x44, # GREEK CAPITAL LETTER DELTA - 0x0395: 0x45, # GREEK CAPITAL LETTER EPSILON - 0x0396: 0x46, # GREEK CAPITAL LETTER ZETA - 0x0397: 0x47, # GREEK CAPITAL LETTER ETA - 0x0398: 0x48, # GREEK CAPITAL LETTER THETA - 0x0399: 0x49, # GREEK CAPITAL LETTER IOTA - 0x039A: 0x51, # GREEK CAPITAL LETTER KAPPA - 0x039B: 0x52, # GREEK CAPITAL LETTER LAMDA - 0x039C: 0x53, # GREEK CAPITAL LETTER MU - 0x039D: 0x54, # GREEK CAPITAL LETTER NU - 0x039E: 0x55, # GREEK CAPITAL LETTER XI - 0x039F: 0x56, # GREEK CAPITAL LETTER OMICRON - 0x03A0: 0x57, # GREEK CAPITAL LETTER PI - 0x03A1: 0x58, # GREEK CAPITAL LETTER RHO - 0x03A3: 0x59, # GREEK CAPITAL LETTER SIGMA - 0x03A4: 0x62, # GREEK CAPITAL LETTER TAU - 0x03A5: 0x63, # GREEK CAPITAL LETTER UPSILON - 0x03A6: 0x64, # GREEK CAPITAL LETTER PHI - 0x03A7: 0x65, # GREEK CAPITAL LETTER CHI - 0x03A8: 0x66, # GREEK CAPITAL LETTER PSI - 0x03A9: 0x67, # GREEK CAPITAL LETTER OMEGA - 0x03AA: 0x68, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x03AB: 0x69, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x03AC: 0xB1, # GREEK SMALL LETTER ALPHA WITH TONOS - 0x03AD: 0xB2, # GREEK SMALL LETTER EPSILON WITH TONOS - 0x03AE: 0xB3, # GREEK SMALL LETTER ETA WITH TONOS - 0x03AF: 0xB5, # GREEK SMALL LETTER IOTA WITH TONOS - 0x03B0: 0xCD, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - 0x03B1: 0x8A, # GREEK SMALL LETTER ALPHA - 0x03B2: 0x8B, # GREEK SMALL LETTER BETA - 0x03B3: 0x8C, # GREEK SMALL LETTER GAMMA - 0x03B4: 0x8D, # GREEK SMALL LETTER DELTA - 0x03B5: 0x8E, # GREEK SMALL LETTER EPSILON - 0x03B6: 0x8F, # GREEK SMALL LETTER ZETA - 0x03B7: 0x9A, # GREEK SMALL LETTER ETA - 0x03B8: 0x9B, # GREEK SMALL LETTER THETA - 0x03B9: 0x9C, # GREEK SMALL LETTER IOTA - 0x03BA: 0x9D, # GREEK SMALL LETTER KAPPA - 0x03BB: 0x9E, # GREEK SMALL LETTER LAMDA - 0x03BC: 0x9F, # GREEK SMALL LETTER MU - 0x03BD: 0xAA, # GREEK SMALL LETTER NU - 0x03BE: 0xAB, # GREEK SMALL LETTER XI - 0x03BF: 0xAC, # GREEK SMALL LETTER OMICRON - 0x03C0: 0xAD, # GREEK SMALL LETTER PI - 0x03C1: 0xAE, # GREEK SMALL LETTER RHO - 0x03C2: 0xBA, # GREEK SMALL LETTER FINAL SIGMA - 0x03C3: 0xAF, # GREEK SMALL LETTER SIGMA - 0x03C4: 0xBB, # GREEK SMALL LETTER TAU - 0x03C5: 0xBC, # GREEK SMALL LETTER UPSILON - 0x03C6: 0xBD, # GREEK SMALL LETTER PHI - 0x03C7: 0xBE, # GREEK SMALL LETTER CHI - 0x03C8: 0xBF, # GREEK SMALL LETTER PSI - 0x03C9: 0xCB, # GREEK SMALL LETTER OMEGA - 0x03CA: 0xB4, # GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x03CB: 0xB8, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x03CC: 0xB6, # GREEK SMALL LETTER OMICRON WITH TONOS - 0x03CD: 0xB7, # GREEK SMALL LETTER UPSILON WITH TONOS - 0x03CE: 0xB9, # GREEK SMALL LETTER OMEGA WITH TONOS - 0x2015: 0xCF, # HORIZONTAL BAR - 0x2018: 0xCE, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xDE, # RIGHT SINGLE QUOTATION MARK + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x37, # END OF TRANSMISSION + 0x0005: 0x2D, # ENQUIRY + 0x0006: 0x2E, # ACKNOWLEDGE + 0x0007: 0x2F, # BELL + 0x0008: 0x16, # BACKSPACE + 0x0009: 0x05, # HORIZONTAL TABULATION + 0x000A: 0x25, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x3C, # DEVICE CONTROL FOUR + 0x0015: 0x3D, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x32, # SYNCHRONOUS IDLE + 0x0017: 0x26, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: None, # SUBSTITUTE + 0x001B: 0x27, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x40, # SPACE + 0x0021: 0x4F, # EXCLAMATION MARK + 0x0022: 0x7F, # QUOTATION MARK + 0x0023: 0x7B, # NUMBER SIGN + 0x0024: 0x5B, # DOLLAR SIGN + 0x0025: 0x6C, # PERCENT SIGN + 0x0026: 0x50, # AMPERSAND + 0x0027: 0x7D, # APOSTROPHE + 0x0028: 0x4D, # LEFT PARENTHESIS + 0x0029: 0x5D, # RIGHT PARENTHESIS + 0x002A: 0x5C, # ASTERISK + 0x002B: 0x4E, # PLUS SIGN + 0x002C: 0x6B, # COMMA + 0x002D: 0x60, # HYPHEN-MINUS + 0x002E: 0x4B, # FULL STOP + 0x002F: 0x61, # SOLIDUS + 0x0030: 0xF0, # DIGIT ZERO + 0x0031: 0xF1, # DIGIT ONE + 0x0032: 0xF2, # DIGIT TWO + 0x0033: 0xF3, # DIGIT THREE + 0x0034: 0xF4, # DIGIT FOUR + 0x0035: 0xF5, # DIGIT FIVE + 0x0036: 0xF6, # DIGIT SIX + 0x0037: 0xF7, # DIGIT SEVEN + 0x0038: 0xF8, # DIGIT EIGHT + 0x0039: 0xF9, # DIGIT NINE + 0x003A: 0x7A, # COLON + 0x003B: 0x5E, # SEMICOLON + 0x003C: 0x4C, # LESS-THAN SIGN + 0x003D: 0x7E, # EQUALS SIGN + 0x003E: 0x6E, # GREATER-THAN SIGN + 0x003F: 0x6F, # QUESTION MARK + 0x0040: 0x7C, # COMMERCIAL AT + 0x0041: 0xC1, # LATIN CAPITAL LETTER A + 0x0042: 0xC2, # LATIN CAPITAL LETTER B + 0x0043: 0xC3, # LATIN CAPITAL LETTER C + 0x0044: 0xC4, # LATIN CAPITAL LETTER D + 0x0045: 0xC5, # LATIN CAPITAL LETTER E + 0x0046: 0xC6, # LATIN CAPITAL LETTER F + 0x0047: 0xC7, # LATIN CAPITAL LETTER G + 0x0048: 0xC8, # LATIN CAPITAL LETTER H + 0x0049: 0xC9, # LATIN CAPITAL LETTER I + 0x004A: 0xD1, # LATIN CAPITAL LETTER J + 0x004B: 0xD2, # LATIN CAPITAL LETTER K + 0x004C: 0xD3, # LATIN CAPITAL LETTER L + 0x004D: 0xD4, # LATIN CAPITAL LETTER M + 0x004E: 0xD5, # LATIN CAPITAL LETTER N + 0x004F: 0xD6, # LATIN CAPITAL LETTER O + 0x0050: 0xD7, # LATIN CAPITAL LETTER P + 0x0051: 0xD8, # LATIN CAPITAL LETTER Q + 0x0052: 0xD9, # LATIN CAPITAL LETTER R + 0x0053: 0xE2, # LATIN CAPITAL LETTER S + 0x0054: 0xE3, # LATIN CAPITAL LETTER T + 0x0055: 0xE4, # LATIN CAPITAL LETTER U + 0x0056: 0xE5, # LATIN CAPITAL LETTER V + 0x0057: 0xE6, # LATIN CAPITAL LETTER W + 0x0058: 0xE7, # LATIN CAPITAL LETTER X + 0x0059: 0xE8, # LATIN CAPITAL LETTER Y + 0x005A: 0xE9, # LATIN CAPITAL LETTER Z + 0x005B: 0x4A, # LEFT SQUARE BRACKET + 0x005C: 0xE0, # REVERSE SOLIDUS + 0x005D: 0x5A, # RIGHT SQUARE BRACKET + 0x005E: 0x5F, # CIRCUMFLEX ACCENT + 0x005F: 0x6D, # LOW LINE + 0x0060: 0x79, # GRAVE ACCENT + 0x0061: 0x81, # LATIN SMALL LETTER A + 0x0062: 0x82, # LATIN SMALL LETTER B + 0x0063: 0x83, # LATIN SMALL LETTER C + 0x0064: 0x84, # LATIN SMALL LETTER D + 0x0065: 0x85, # LATIN SMALL LETTER E + 0x0066: 0x86, # LATIN SMALL LETTER F + 0x0067: 0x87, # LATIN SMALL LETTER G + 0x0068: 0x88, # LATIN SMALL LETTER H + 0x0069: 0x89, # LATIN SMALL LETTER I + 0x006A: 0x91, # LATIN SMALL LETTER J + 0x006B: 0x92, # LATIN SMALL LETTER K + 0x006C: 0x93, # LATIN SMALL LETTER L + 0x006D: 0x94, # LATIN SMALL LETTER M + 0x006E: 0x95, # LATIN SMALL LETTER N + 0x006F: 0x96, # LATIN SMALL LETTER O + 0x0070: 0x97, # LATIN SMALL LETTER P + 0x0071: 0x98, # LATIN SMALL LETTER Q + 0x0072: 0x99, # LATIN SMALL LETTER R + 0x0073: 0xA2, # LATIN SMALL LETTER S + 0x0074: 0xA3, # LATIN SMALL LETTER T + 0x0075: 0xA4, # LATIN SMALL LETTER U + 0x0076: 0xA5, # LATIN SMALL LETTER V + 0x0077: 0xA6, # LATIN SMALL LETTER W + 0x0078: 0xA7, # LATIN SMALL LETTER X + 0x0079: 0xA8, # LATIN SMALL LETTER Y + 0x007A: 0xA9, # LATIN SMALL LETTER Z + 0x007B: 0xC0, # LEFT CURLY BRACKET + 0x007C: 0x6A, # VERTICAL LINE + 0x007D: 0xD0, # RIGHT CURLY BRACKET + 0x007E: 0xA1, # TILDE + 0x007F: 0x07, # DELETE + 0x0080: 0x20, # CONTROL + 0x0081: 0x21, # CONTROL + 0x0082: 0x22, # CONTROL + 0x0083: 0x23, # CONTROL + 0x0084: 0x24, # CONTROL + 0x0085: 0x15, # CONTROL + 0x0086: 0x06, # CONTROL + 0x0087: 0x17, # CONTROL + 0x0088: 0x28, # CONTROL + 0x0089: 0x29, # CONTROL + 0x008A: 0x2A, # CONTROL + 0x008B: 0x2B, # CONTROL + 0x008C: 0x2C, # CONTROL + 0x008D: 0x09, # CONTROL + 0x008E: 0x0A, # CONTROL + 0x008F: 0x1B, # CONTROL + 0x0090: 0x30, # CONTROL + 0x0091: 0x31, # CONTROL + 0x0092: 0x1A, # CONTROL + 0x0093: 0x33, # CONTROL + 0x0094: 0x34, # CONTROL + 0x0095: 0x35, # CONTROL + 0x0096: 0x36, # CONTROL + 0x0097: 0x08, # CONTROL + 0x0098: 0x38, # CONTROL + 0x0099: 0x39, # CONTROL + 0x009A: 0x3A, # CONTROL + 0x009B: 0x3B, # CONTROL + 0x009C: 0x04, # CONTROL + 0x009D: 0x14, # CONTROL + 0x009E: 0x3E, # CONTROL + 0x009F: 0xFF, # CONTROL + 0x00A0: 0x74, # NO-BREAK SPACE + 0x00A3: 0xB0, # POUND SIGN + 0x00A6: 0xDF, # BROKEN BAR + 0x00A7: 0xEB, # SECTION SIGN + 0x00A8: 0x70, # DIAERESIS + 0x00A9: 0xFB, # COPYRIGHT SIGN + 0x00AB: 0xEE, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xEF, # NOT SIGN + 0x00AD: 0xCA, # SOFT HYPHEN + 0x00B0: 0x90, # DEGREE SIGN + 0x00B1: 0xDA, # PLUS-MINUS SIGN + 0x00B2: 0xEA, # SUPERSCRIPT TWO + 0x00B3: 0xFA, # SUPERSCRIPT THREE + 0x00B4: 0xA0, # ACUTE ACCENT + 0x00BB: 0xFE, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BD: 0xDB, # VULGAR FRACTION ONE HALF + 0x0385: 0x80, # GREEK DIALYTIKA TONOS + 0x0386: 0x71, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0387: 0xDD, # GREEK ANO TELEIA + 0x0388: 0x72, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x73, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038A: 0x75, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038C: 0x76, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038E: 0x77, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038F: 0x78, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0xCC, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0x41, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x42, # GREEK CAPITAL LETTER BETA + 0x0393: 0x43, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x44, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x45, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x46, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x47, # GREEK CAPITAL LETTER ETA + 0x0398: 0x48, # GREEK CAPITAL LETTER THETA + 0x0399: 0x49, # GREEK CAPITAL LETTER IOTA + 0x039A: 0x51, # GREEK CAPITAL LETTER KAPPA + 0x039B: 0x52, # GREEK CAPITAL LETTER LAMDA + 0x039C: 0x53, # GREEK CAPITAL LETTER MU + 0x039D: 0x54, # GREEK CAPITAL LETTER NU + 0x039E: 0x55, # GREEK CAPITAL LETTER XI + 0x039F: 0x56, # GREEK CAPITAL LETTER OMICRON + 0x03A0: 0x57, # GREEK CAPITAL LETTER PI + 0x03A1: 0x58, # GREEK CAPITAL LETTER RHO + 0x03A3: 0x59, # GREEK CAPITAL LETTER SIGMA + 0x03A4: 0x62, # GREEK CAPITAL LETTER TAU + 0x03A5: 0x63, # GREEK CAPITAL LETTER UPSILON + 0x03A6: 0x64, # GREEK CAPITAL LETTER PHI + 0x03A7: 0x65, # GREEK CAPITAL LETTER CHI + 0x03A8: 0x66, # GREEK CAPITAL LETTER PSI + 0x03A9: 0x67, # GREEK CAPITAL LETTER OMEGA + 0x03AA: 0x68, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03AB: 0x69, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03AC: 0xB1, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03AD: 0xB2, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03AE: 0xB3, # GREEK SMALL LETTER ETA WITH TONOS + 0x03AF: 0xB5, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03B0: 0xCD, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03B1: 0x8A, # GREEK SMALL LETTER ALPHA + 0x03B2: 0x8B, # GREEK SMALL LETTER BETA + 0x03B3: 0x8C, # GREEK SMALL LETTER GAMMA + 0x03B4: 0x8D, # GREEK SMALL LETTER DELTA + 0x03B5: 0x8E, # GREEK SMALL LETTER EPSILON + 0x03B6: 0x8F, # GREEK SMALL LETTER ZETA + 0x03B7: 0x9A, # GREEK SMALL LETTER ETA + 0x03B8: 0x9B, # GREEK SMALL LETTER THETA + 0x03B9: 0x9C, # GREEK SMALL LETTER IOTA + 0x03BA: 0x9D, # GREEK SMALL LETTER KAPPA + 0x03BB: 0x9E, # GREEK SMALL LETTER LAMDA + 0x03BC: 0x9F, # GREEK SMALL LETTER MU + 0x03BD: 0xAA, # GREEK SMALL LETTER NU + 0x03BE: 0xAB, # GREEK SMALL LETTER XI + 0x03BF: 0xAC, # GREEK SMALL LETTER OMICRON + 0x03C0: 0xAD, # GREEK SMALL LETTER PI + 0x03C1: 0xAE, # GREEK SMALL LETTER RHO + 0x03C2: 0xBA, # GREEK SMALL LETTER FINAL SIGMA + 0x03C3: 0xAF, # GREEK SMALL LETTER SIGMA + 0x03C4: 0xBB, # GREEK SMALL LETTER TAU + 0x03C5: 0xBC, # GREEK SMALL LETTER UPSILON + 0x03C6: 0xBD, # GREEK SMALL LETTER PHI + 0x03C7: 0xBE, # GREEK SMALL LETTER CHI + 0x03C8: 0xBF, # GREEK SMALL LETTER PSI + 0x03C9: 0xCB, # GREEK SMALL LETTER OMEGA + 0x03CA: 0xB4, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03CB: 0xB8, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03CC: 0xB6, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03CD: 0xB7, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03CE: 0xB9, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2015: 0xCF, # HORIZONTAL BAR + 0x2018: 0xCE, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xDE, # RIGHT SINGLE QUOTATION MARK } - Modified: python/trunk/Lib/encodings/iso8859_1.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_1.py (original) +++ python/trunk/Lib/encodings/iso8859_1.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\xbf' # 0xBF -> INVERTED QUESTION MARK - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) - u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) - u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE - u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE - u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) - u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xBF, # INVERTED QUESTION MARK - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D0: 0xD0, # LATIN CAPITAL LETTER ETH (Icelandic) - 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN (Icelandic) - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S (German) - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F0: 0xF0, # LATIN SMALL LETTER ETH (Icelandic) - 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FE: 0xFE, # LATIN SMALL LETTER THORN (Icelandic) - 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xBF, # INVERTED QUESTION MARK + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0: 0xD0, # LATIN CAPITAL LETTER ETH (Icelandic) + 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN (Icelandic) + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S (German) + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0: 0xF0, # LATIN SMALL LETTER ETH (Icelandic) + 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FE: 0xFE, # LATIN SMALL LETTER THORN (Icelandic) + 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS } - Modified: python/trunk/Lib/encodings/iso8859_10.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_10.py (original) +++ python/trunk/Lib/encodings/iso8859_10.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\u0112' # 0xA2 -> LATIN CAPITAL LETTER E WITH MACRON - u'\u0122' # 0xA3 -> LATIN CAPITAL LETTER G WITH CEDILLA - u'\u012a' # 0xA4 -> LATIN CAPITAL LETTER I WITH MACRON - u'\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE - u'\u0136' # 0xA6 -> LATIN CAPITAL LETTER K WITH CEDILLA - u'\xa7' # 0xA7 -> SECTION SIGN - u'\u013b' # 0xA8 -> LATIN CAPITAL LETTER L WITH CEDILLA - u'\u0110' # 0xA9 -> LATIN CAPITAL LETTER D WITH STROKE - u'\u0160' # 0xAA -> LATIN CAPITAL LETTER S WITH CARON - u'\u0166' # 0xAB -> LATIN CAPITAL LETTER T WITH STROKE - u'\u017d' # 0xAC -> LATIN CAPITAL LETTER Z WITH CARON - u'\xad' # 0xAD -> SOFT HYPHEN - u'\u016a' # 0xAE -> LATIN CAPITAL LETTER U WITH MACRON - u'\u014a' # 0xAF -> LATIN CAPITAL LETTER ENG - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK - u'\u0113' # 0xB2 -> LATIN SMALL LETTER E WITH MACRON - u'\u0123' # 0xB3 -> LATIN SMALL LETTER G WITH CEDILLA - u'\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON - u'\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE - u'\u0137' # 0xB6 -> LATIN SMALL LETTER K WITH CEDILLA - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\u013c' # 0xB8 -> LATIN SMALL LETTER L WITH CEDILLA - u'\u0111' # 0xB9 -> LATIN SMALL LETTER D WITH STROKE - u'\u0161' # 0xBA -> LATIN SMALL LETTER S WITH CARON - u'\u0167' # 0xBB -> LATIN SMALL LETTER T WITH STROKE - u'\u017e' # 0xBC -> LATIN SMALL LETTER Z WITH CARON - u'\u2015' # 0xBD -> HORIZONTAL BAR - u'\u016b' # 0xBE -> LATIN SMALL LETTER U WITH MACRON - u'\u014b' # 0xBF -> LATIN SMALL LETTER ENG - u'\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK - u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) - u'\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA - u'\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\u0168' # 0xD7 -> LATIN CAPITAL LETTER U WITH TILDE - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) - u'\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK - u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) - u'\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA - u'\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\u0169' # 0xF7 -> LATIN SMALL LETTER U WITH TILDE - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE - u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) - u'\u0138' # 0xFF -> LATIN SMALL LETTER KRA + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u0112' # 0xA2 -> LATIN CAPITAL LETTER E WITH MACRON + u'\u0122' # 0xA3 -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u012a' # 0xA4 -> LATIN CAPITAL LETTER I WITH MACRON + u'\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + u'\u0136' # 0xA6 -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u013b' # 0xA8 -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u0110' # 0xA9 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0160' # 0xAA -> LATIN CAPITAL LETTER S WITH CARON + u'\u0166' # 0xAB -> LATIN CAPITAL LETTER T WITH STROKE + u'\u017d' # 0xAC -> LATIN CAPITAL LETTER Z WITH CARON + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u016a' # 0xAE -> LATIN CAPITAL LETTER U WITH MACRON + u'\u014a' # 0xAF -> LATIN CAPITAL LETTER ENG + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + u'\u0113' # 0xB2 -> LATIN SMALL LETTER E WITH MACRON + u'\u0123' # 0xB3 -> LATIN SMALL LETTER G WITH CEDILLA + u'\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + u'\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + u'\u0137' # 0xB6 -> LATIN SMALL LETTER K WITH CEDILLA + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u013c' # 0xB8 -> LATIN SMALL LETTER L WITH CEDILLA + u'\u0111' # 0xB9 -> LATIN SMALL LETTER D WITH STROKE + u'\u0161' # 0xBA -> LATIN SMALL LETTER S WITH CARON + u'\u0167' # 0xBB -> LATIN SMALL LETTER T WITH STROKE + u'\u017e' # 0xBC -> LATIN SMALL LETTER Z WITH CARON + u'\u2015' # 0xBD -> HORIZONTAL BAR + u'\u016b' # 0xBE -> LATIN SMALL LETTER U WITH MACRON + u'\u014b' # 0xBF -> LATIN SMALL LETTER ENG + u'\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + u'\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\u0168' # 0xD7 -> LATIN CAPITAL LETTER U WITH TILDE + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + u'\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + u'\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + u'\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u0169' # 0xF7 -> LATIN SMALL LETTER U WITH TILDE + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + u'\u0138' # 0xFF -> LATIN SMALL LETTER KRA ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A7: 0xA7, # SECTION SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D0: 0xD0, # LATIN CAPITAL LETTER ETH (Icelandic) - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN (Icelandic) - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S (German) - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F0: 0xF0, # LATIN SMALL LETTER ETH (Icelandic) - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FE: 0xFE, # LATIN SMALL LETTER THORN (Icelandic) - 0x0100: 0xC0, # LATIN CAPITAL LETTER A WITH MACRON - 0x0101: 0xE0, # LATIN SMALL LETTER A WITH MACRON - 0x0104: 0xA1, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0xB1, # LATIN SMALL LETTER A WITH OGONEK - 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON - 0x0110: 0xA9, # LATIN CAPITAL LETTER D WITH STROKE - 0x0111: 0xB9, # LATIN SMALL LETTER D WITH STROKE - 0x0112: 0xA2, # LATIN CAPITAL LETTER E WITH MACRON - 0x0113: 0xB2, # LATIN SMALL LETTER E WITH MACRON - 0x0116: 0xCC, # LATIN CAPITAL LETTER E WITH DOT ABOVE - 0x0117: 0xEC, # LATIN SMALL LETTER E WITH DOT ABOVE - 0x0118: 0xCA, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0xEA, # LATIN SMALL LETTER E WITH OGONEK - 0x0122: 0xA3, # LATIN CAPITAL LETTER G WITH CEDILLA - 0x0123: 0xB3, # LATIN SMALL LETTER G WITH CEDILLA - 0x0128: 0xA5, # LATIN CAPITAL LETTER I WITH TILDE - 0x0129: 0xB5, # LATIN SMALL LETTER I WITH TILDE - 0x012A: 0xA4, # LATIN CAPITAL LETTER I WITH MACRON - 0x012B: 0xB4, # LATIN SMALL LETTER I WITH MACRON - 0x012E: 0xC7, # LATIN CAPITAL LETTER I WITH OGONEK - 0x012F: 0xE7, # LATIN SMALL LETTER I WITH OGONEK - 0x0136: 0xA6, # LATIN CAPITAL LETTER K WITH CEDILLA - 0x0137: 0xB6, # LATIN SMALL LETTER K WITH CEDILLA - 0x0138: 0xFF, # LATIN SMALL LETTER KRA - 0x013B: 0xA8, # LATIN CAPITAL LETTER L WITH CEDILLA - 0x013C: 0xB8, # LATIN SMALL LETTER L WITH CEDILLA - 0x0145: 0xD1, # LATIN CAPITAL LETTER N WITH CEDILLA - 0x0146: 0xF1, # LATIN SMALL LETTER N WITH CEDILLA - 0x014A: 0xAF, # LATIN CAPITAL LETTER ENG - 0x014B: 0xBF, # LATIN SMALL LETTER ENG - 0x014C: 0xD2, # LATIN CAPITAL LETTER O WITH MACRON - 0x014D: 0xF2, # LATIN SMALL LETTER O WITH MACRON - 0x0160: 0xAA, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xBA, # LATIN SMALL LETTER S WITH CARON - 0x0166: 0xAB, # LATIN CAPITAL LETTER T WITH STROKE - 0x0167: 0xBB, # LATIN SMALL LETTER T WITH STROKE - 0x0168: 0xD7, # LATIN CAPITAL LETTER U WITH TILDE - 0x0169: 0xF7, # LATIN SMALL LETTER U WITH TILDE - 0x016A: 0xAE, # LATIN CAPITAL LETTER U WITH MACRON - 0x016B: 0xBE, # LATIN SMALL LETTER U WITH MACRON - 0x0172: 0xD9, # LATIN CAPITAL LETTER U WITH OGONEK - 0x0173: 0xF9, # LATIN SMALL LETTER U WITH OGONEK - 0x017D: 0xAC, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xBC, # LATIN SMALL LETTER Z WITH CARON - 0x2015: 0xBD, # HORIZONTAL BAR + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A7: 0xA7, # SECTION SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0: 0xD0, # LATIN CAPITAL LETTER ETH (Icelandic) + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN (Icelandic) + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S (German) + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0: 0xF0, # LATIN SMALL LETTER ETH (Icelandic) + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FE: 0xFE, # LATIN SMALL LETTER THORN (Icelandic) + 0x0100: 0xC0, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0xE0, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0xA1, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0xB1, # LATIN SMALL LETTER A WITH OGONEK + 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON + 0x0110: 0xA9, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0xB9, # LATIN SMALL LETTER D WITH STROKE + 0x0112: 0xA2, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0xB2, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0xCC, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0xEC, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0xCA, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0xEA, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0xA3, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0xB3, # LATIN SMALL LETTER G WITH CEDILLA + 0x0128: 0xA5, # LATIN CAPITAL LETTER I WITH TILDE + 0x0129: 0xB5, # LATIN SMALL LETTER I WITH TILDE + 0x012A: 0xA4, # LATIN CAPITAL LETTER I WITH MACRON + 0x012B: 0xB4, # LATIN SMALL LETTER I WITH MACRON + 0x012E: 0xC7, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012F: 0xE7, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0xA6, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0xB6, # LATIN SMALL LETTER K WITH CEDILLA + 0x0138: 0xFF, # LATIN SMALL LETTER KRA + 0x013B: 0xA8, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013C: 0xB8, # LATIN SMALL LETTER L WITH CEDILLA + 0x0145: 0xD1, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0xF1, # LATIN SMALL LETTER N WITH CEDILLA + 0x014A: 0xAF, # LATIN CAPITAL LETTER ENG + 0x014B: 0xBF, # LATIN SMALL LETTER ENG + 0x014C: 0xD2, # LATIN CAPITAL LETTER O WITH MACRON + 0x014D: 0xF2, # LATIN SMALL LETTER O WITH MACRON + 0x0160: 0xAA, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xBA, # LATIN SMALL LETTER S WITH CARON + 0x0166: 0xAB, # LATIN CAPITAL LETTER T WITH STROKE + 0x0167: 0xBB, # LATIN SMALL LETTER T WITH STROKE + 0x0168: 0xD7, # LATIN CAPITAL LETTER U WITH TILDE + 0x0169: 0xF7, # LATIN SMALL LETTER U WITH TILDE + 0x016A: 0xAE, # LATIN CAPITAL LETTER U WITH MACRON + 0x016B: 0xBE, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0xD9, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0xF9, # LATIN SMALL LETTER U WITH OGONEK + 0x017D: 0xAC, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xBC, # LATIN SMALL LETTER Z WITH CARON + 0x2015: 0xBD, # HORIZONTAL BAR } - Modified: python/trunk/Lib/encodings/iso8859_11.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_11.py (original) +++ python/trunk/Lib/encodings/iso8859_11.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,258 +32,258 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI - u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI - u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT - u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI - u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON - u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG - u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU - u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN - u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING - u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG - u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO - u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE - u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING - u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA - u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK - u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN - u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO - u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO - u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN - u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK - u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO - u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG - u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN - u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG - u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU - u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI - u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA - u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG - u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA - u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN - u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN - u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO - u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA - u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK - u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA - u'\u0e24' # 0xC4 -> THAI CHARACTER RU - u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING - u'\u0e26' # 0xC6 -> THAI CHARACTER LU - u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN - u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA - u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI - u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA - u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP - u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA - u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG - u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK - u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI - u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A - u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT - u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA - u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM - u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I - u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II - u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE - u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE - u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U - u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU - u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO + u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING + u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU + u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA + u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA + u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + u'\u0e24' # 0xC4 -> THAI CHARACTER RU + u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING + u'\u0e26' # 0xC6 -> THAI CHARACTER LU + u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG + u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A + u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I + u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II + u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U + u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU u'\ufffe' u'\ufffe' u'\ufffe' u'\ufffe' - u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT - u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E - u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE - u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O - u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN - u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI - u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO - u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK - u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU - u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK - u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO - u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI - u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA - u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT - u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT - u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN - u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN - u'\u0e50' # 0xF0 -> THAI DIGIT ZERO - u'\u0e51' # 0xF1 -> THAI DIGIT ONE - u'\u0e52' # 0xF2 -> THAI DIGIT TWO - u'\u0e53' # 0xF3 -> THAI DIGIT THREE - u'\u0e54' # 0xF4 -> THAI DIGIT FOUR - u'\u0e55' # 0xF5 -> THAI DIGIT FIVE - u'\u0e56' # 0xF6 -> THAI DIGIT SIX - u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN - u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT - u'\u0e59' # 0xF9 -> THAI DIGIT NINE - u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU - u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E + u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O + u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + u'\u0e50' # 0xF0 -> THAI DIGIT ZERO + u'\u0e51' # 0xF1 -> THAI DIGIT ONE + u'\u0e52' # 0xF2 -> THAI DIGIT TWO + u'\u0e53' # 0xF3 -> THAI DIGIT THREE + u'\u0e54' # 0xF4 -> THAI DIGIT FOUR + u'\u0e55' # 0xF5 -> THAI DIGIT FIVE + u'\u0e56' # 0xF6 -> THAI DIGIT SIX + u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN + u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT + u'\u0e59' # 0xF9 -> THAI DIGIT NINE + u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT u'\ufffe' u'\ufffe' u'\ufffe' @@ -293,253 +293,252 @@ ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x0E01: 0xA1, # THAI CHARACTER KO KAI - 0x0E02: 0xA2, # THAI CHARACTER KHO KHAI - 0x0E03: 0xA3, # THAI CHARACTER KHO KHUAT - 0x0E04: 0xA4, # THAI CHARACTER KHO KHWAI - 0x0E05: 0xA5, # THAI CHARACTER KHO KHON - 0x0E06: 0xA6, # THAI CHARACTER KHO RAKHANG - 0x0E07: 0xA7, # THAI CHARACTER NGO NGU - 0x0E08: 0xA8, # THAI CHARACTER CHO CHAN - 0x0E09: 0xA9, # THAI CHARACTER CHO CHING - 0x0E0A: 0xAA, # THAI CHARACTER CHO CHANG - 0x0E0B: 0xAB, # THAI CHARACTER SO SO - 0x0E0C: 0xAC, # THAI CHARACTER CHO CHOE - 0x0E0D: 0xAD, # THAI CHARACTER YO YING - 0x0E0E: 0xAE, # THAI CHARACTER DO CHADA - 0x0E0F: 0xAF, # THAI CHARACTER TO PATAK - 0x0E10: 0xB0, # THAI CHARACTER THO THAN - 0x0E11: 0xB1, # THAI CHARACTER THO NANGMONTHO - 0x0E12: 0xB2, # THAI CHARACTER THO PHUTHAO - 0x0E13: 0xB3, # THAI CHARACTER NO NEN - 0x0E14: 0xB4, # THAI CHARACTER DO DEK - 0x0E15: 0xB5, # THAI CHARACTER TO TAO - 0x0E16: 0xB6, # THAI CHARACTER THO THUNG - 0x0E17: 0xB7, # THAI CHARACTER THO THAHAN - 0x0E18: 0xB8, # THAI CHARACTER THO THONG - 0x0E19: 0xB9, # THAI CHARACTER NO NU - 0x0E1A: 0xBA, # THAI CHARACTER BO BAIMAI - 0x0E1B: 0xBB, # THAI CHARACTER PO PLA - 0x0E1C: 0xBC, # THAI CHARACTER PHO PHUNG - 0x0E1D: 0xBD, # THAI CHARACTER FO FA - 0x0E1E: 0xBE, # THAI CHARACTER PHO PHAN - 0x0E1F: 0xBF, # THAI CHARACTER FO FAN - 0x0E20: 0xC0, # THAI CHARACTER PHO SAMPHAO - 0x0E21: 0xC1, # THAI CHARACTER MO MA - 0x0E22: 0xC2, # THAI CHARACTER YO YAK - 0x0E23: 0xC3, # THAI CHARACTER RO RUA - 0x0E24: 0xC4, # THAI CHARACTER RU - 0x0E25: 0xC5, # THAI CHARACTER LO LING - 0x0E26: 0xC6, # THAI CHARACTER LU - 0x0E27: 0xC7, # THAI CHARACTER WO WAEN - 0x0E28: 0xC8, # THAI CHARACTER SO SALA - 0x0E29: 0xC9, # THAI CHARACTER SO RUSI - 0x0E2A: 0xCA, # THAI CHARACTER SO SUA - 0x0E2B: 0xCB, # THAI CHARACTER HO HIP - 0x0E2C: 0xCC, # THAI CHARACTER LO CHULA - 0x0E2D: 0xCD, # THAI CHARACTER O ANG - 0x0E2E: 0xCE, # THAI CHARACTER HO NOKHUK - 0x0E2F: 0xCF, # THAI CHARACTER PAIYANNOI - 0x0E30: 0xD0, # THAI CHARACTER SARA A - 0x0E31: 0xD1, # THAI CHARACTER MAI HAN-AKAT - 0x0E32: 0xD2, # THAI CHARACTER SARA AA - 0x0E33: 0xD3, # THAI CHARACTER SARA AM - 0x0E34: 0xD4, # THAI CHARACTER SARA I - 0x0E35: 0xD5, # THAI CHARACTER SARA II - 0x0E36: 0xD6, # THAI CHARACTER SARA UE - 0x0E37: 0xD7, # THAI CHARACTER SARA UEE - 0x0E38: 0xD8, # THAI CHARACTER SARA U - 0x0E39: 0xD9, # THAI CHARACTER SARA UU - 0x0E3A: 0xDA, # THAI CHARACTER PHINTHU - 0x0E3F: 0xDF, # THAI CURRENCY SYMBOL BAHT - 0x0E40: 0xE0, # THAI CHARACTER SARA E - 0x0E41: 0xE1, # THAI CHARACTER SARA AE - 0x0E42: 0xE2, # THAI CHARACTER SARA O - 0x0E43: 0xE3, # THAI CHARACTER SARA AI MAIMUAN - 0x0E44: 0xE4, # THAI CHARACTER SARA AI MAIMALAI - 0x0E45: 0xE5, # THAI CHARACTER LAKKHANGYAO - 0x0E46: 0xE6, # THAI CHARACTER MAIYAMOK - 0x0E47: 0xE7, # THAI CHARACTER MAITAIKHU - 0x0E48: 0xE8, # THAI CHARACTER MAI EK - 0x0E49: 0xE9, # THAI CHARACTER MAI THO - 0x0E4A: 0xEA, # THAI CHARACTER MAI TRI - 0x0E4B: 0xEB, # THAI CHARACTER MAI CHATTAWA - 0x0E4C: 0xEC, # THAI CHARACTER THANTHAKHAT - 0x0E4D: 0xED, # THAI CHARACTER NIKHAHIT - 0x0E4E: 0xEE, # THAI CHARACTER YAMAKKAN - 0x0E4F: 0xEF, # THAI CHARACTER FONGMAN - 0x0E50: 0xF0, # THAI DIGIT ZERO - 0x0E51: 0xF1, # THAI DIGIT ONE - 0x0E52: 0xF2, # THAI DIGIT TWO - 0x0E53: 0xF3, # THAI DIGIT THREE - 0x0E54: 0xF4, # THAI DIGIT FOUR - 0x0E55: 0xF5, # THAI DIGIT FIVE - 0x0E56: 0xF6, # THAI DIGIT SIX - 0x0E57: 0xF7, # THAI DIGIT SEVEN - 0x0E58: 0xF8, # THAI DIGIT EIGHT - 0x0E59: 0xF9, # THAI DIGIT NINE - 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU - 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x0E01: 0xA1, # THAI CHARACTER KO KAI + 0x0E02: 0xA2, # THAI CHARACTER KHO KHAI + 0x0E03: 0xA3, # THAI CHARACTER KHO KHUAT + 0x0E04: 0xA4, # THAI CHARACTER KHO KHWAI + 0x0E05: 0xA5, # THAI CHARACTER KHO KHON + 0x0E06: 0xA6, # THAI CHARACTER KHO RAKHANG + 0x0E07: 0xA7, # THAI CHARACTER NGO NGU + 0x0E08: 0xA8, # THAI CHARACTER CHO CHAN + 0x0E09: 0xA9, # THAI CHARACTER CHO CHING + 0x0E0A: 0xAA, # THAI CHARACTER CHO CHANG + 0x0E0B: 0xAB, # THAI CHARACTER SO SO + 0x0E0C: 0xAC, # THAI CHARACTER CHO CHOE + 0x0E0D: 0xAD, # THAI CHARACTER YO YING + 0x0E0E: 0xAE, # THAI CHARACTER DO CHADA + 0x0E0F: 0xAF, # THAI CHARACTER TO PATAK + 0x0E10: 0xB0, # THAI CHARACTER THO THAN + 0x0E11: 0xB1, # THAI CHARACTER THO NANGMONTHO + 0x0E12: 0xB2, # THAI CHARACTER THO PHUTHAO + 0x0E13: 0xB3, # THAI CHARACTER NO NEN + 0x0E14: 0xB4, # THAI CHARACTER DO DEK + 0x0E15: 0xB5, # THAI CHARACTER TO TAO + 0x0E16: 0xB6, # THAI CHARACTER THO THUNG + 0x0E17: 0xB7, # THAI CHARACTER THO THAHAN + 0x0E18: 0xB8, # THAI CHARACTER THO THONG + 0x0E19: 0xB9, # THAI CHARACTER NO NU + 0x0E1A: 0xBA, # THAI CHARACTER BO BAIMAI + 0x0E1B: 0xBB, # THAI CHARACTER PO PLA + 0x0E1C: 0xBC, # THAI CHARACTER PHO PHUNG + 0x0E1D: 0xBD, # THAI CHARACTER FO FA + 0x0E1E: 0xBE, # THAI CHARACTER PHO PHAN + 0x0E1F: 0xBF, # THAI CHARACTER FO FAN + 0x0E20: 0xC0, # THAI CHARACTER PHO SAMPHAO + 0x0E21: 0xC1, # THAI CHARACTER MO MA + 0x0E22: 0xC2, # THAI CHARACTER YO YAK + 0x0E23: 0xC3, # THAI CHARACTER RO RUA + 0x0E24: 0xC4, # THAI CHARACTER RU + 0x0E25: 0xC5, # THAI CHARACTER LO LING + 0x0E26: 0xC6, # THAI CHARACTER LU + 0x0E27: 0xC7, # THAI CHARACTER WO WAEN + 0x0E28: 0xC8, # THAI CHARACTER SO SALA + 0x0E29: 0xC9, # THAI CHARACTER SO RUSI + 0x0E2A: 0xCA, # THAI CHARACTER SO SUA + 0x0E2B: 0xCB, # THAI CHARACTER HO HIP + 0x0E2C: 0xCC, # THAI CHARACTER LO CHULA + 0x0E2D: 0xCD, # THAI CHARACTER O ANG + 0x0E2E: 0xCE, # THAI CHARACTER HO NOKHUK + 0x0E2F: 0xCF, # THAI CHARACTER PAIYANNOI + 0x0E30: 0xD0, # THAI CHARACTER SARA A + 0x0E31: 0xD1, # THAI CHARACTER MAI HAN-AKAT + 0x0E32: 0xD2, # THAI CHARACTER SARA AA + 0x0E33: 0xD3, # THAI CHARACTER SARA AM + 0x0E34: 0xD4, # THAI CHARACTER SARA I + 0x0E35: 0xD5, # THAI CHARACTER SARA II + 0x0E36: 0xD6, # THAI CHARACTER SARA UE + 0x0E37: 0xD7, # THAI CHARACTER SARA UEE + 0x0E38: 0xD8, # THAI CHARACTER SARA U + 0x0E39: 0xD9, # THAI CHARACTER SARA UU + 0x0E3A: 0xDA, # THAI CHARACTER PHINTHU + 0x0E3F: 0xDF, # THAI CURRENCY SYMBOL BAHT + 0x0E40: 0xE0, # THAI CHARACTER SARA E + 0x0E41: 0xE1, # THAI CHARACTER SARA AE + 0x0E42: 0xE2, # THAI CHARACTER SARA O + 0x0E43: 0xE3, # THAI CHARACTER SARA AI MAIMUAN + 0x0E44: 0xE4, # THAI CHARACTER SARA AI MAIMALAI + 0x0E45: 0xE5, # THAI CHARACTER LAKKHANGYAO + 0x0E46: 0xE6, # THAI CHARACTER MAIYAMOK + 0x0E47: 0xE7, # THAI CHARACTER MAITAIKHU + 0x0E48: 0xE8, # THAI CHARACTER MAI EK + 0x0E49: 0xE9, # THAI CHARACTER MAI THO + 0x0E4A: 0xEA, # THAI CHARACTER MAI TRI + 0x0E4B: 0xEB, # THAI CHARACTER MAI CHATTAWA + 0x0E4C: 0xEC, # THAI CHARACTER THANTHAKHAT + 0x0E4D: 0xED, # THAI CHARACTER NIKHAHIT + 0x0E4E: 0xEE, # THAI CHARACTER YAMAKKAN + 0x0E4F: 0xEF, # THAI CHARACTER FONGMAN + 0x0E50: 0xF0, # THAI DIGIT ZERO + 0x0E51: 0xF1, # THAI DIGIT ONE + 0x0E52: 0xF2, # THAI DIGIT TWO + 0x0E53: 0xF3, # THAI DIGIT THREE + 0x0E54: 0xF4, # THAI DIGIT FOUR + 0x0E55: 0xF5, # THAI DIGIT FIVE + 0x0E56: 0xF6, # THAI DIGIT SIX + 0x0E57: 0xF7, # THAI DIGIT SEVEN + 0x0E58: 0xF8, # THAI DIGIT EIGHT + 0x0E59: 0xF9, # THAI DIGIT NINE + 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU + 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT } - Modified: python/trunk/Lib/encodings/iso8859_13.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_13.py (original) +++ python/trunk/Lib/encodings/iso8859_13.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u201d' # 0xA1 -> RIGHT DOUBLE QUOTATION MARK - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xc6' # 0xAF -> LATIN CAPITAL LETTER AE - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\u201c' # 0xB4 -> LEFT DOUBLE QUOTATION MARK - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\xe6' # 0xBF -> LATIN SMALL LETTER AE - u'\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK - u'\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON - u'\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK - u'\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON - u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE - u'\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA - u'\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA - u'\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON - u'\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA - u'\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON - u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK - u'\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE - u'\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE - u'\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) - u'\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK - u'\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK - u'\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON - u'\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK - u'\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON - u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE - u'\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE - u'\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA - u'\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA - u'\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON - u'\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA - u'\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON - u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE - u'\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK - u'\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE - u'\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE - u'\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON - u'\u2019' # 0xFF -> RIGHT SINGLE QUOTATION MARK + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u201d' # 0xA1 -> RIGHT DOUBLE QUOTATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\u201c' # 0xB4 -> LEFT DOUBLE QUOTATION MARK + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xe6' # 0xBF -> LATIN SMALL LETTER AE + u'\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + u'\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + u'\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + u'\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + u'\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + u'\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + u'\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + u'\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + u'\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + u'\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + u'\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + u'\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + u'\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + u'\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + u'\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + u'\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + u'\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + u'\u2019' # 0xFF -> RIGHT SINGLE QUOTATION MARK ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xAF, # LATIN CAPITAL LETTER AE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xA8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S (German) - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xBF, # LATIN SMALL LETTER AE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xB8, # LATIN SMALL LETTER O WITH STROKE - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0100: 0xC2, # LATIN CAPITAL LETTER A WITH MACRON - 0x0101: 0xE2, # LATIN SMALL LETTER A WITH MACRON - 0x0104: 0xC0, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0xE0, # LATIN SMALL LETTER A WITH OGONEK - 0x0106: 0xC3, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0xE3, # LATIN SMALL LETTER C WITH ACUTE - 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON - 0x0112: 0xC7, # LATIN CAPITAL LETTER E WITH MACRON - 0x0113: 0xE7, # LATIN SMALL LETTER E WITH MACRON - 0x0116: 0xCB, # LATIN CAPITAL LETTER E WITH DOT ABOVE - 0x0117: 0xEB, # LATIN SMALL LETTER E WITH DOT ABOVE - 0x0118: 0xC6, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0xE6, # LATIN SMALL LETTER E WITH OGONEK - 0x0122: 0xCC, # LATIN CAPITAL LETTER G WITH CEDILLA - 0x0123: 0xEC, # LATIN SMALL LETTER G WITH CEDILLA - 0x012A: 0xCE, # LATIN CAPITAL LETTER I WITH MACRON - 0x012B: 0xEE, # LATIN SMALL LETTER I WITH MACRON - 0x012E: 0xC1, # LATIN CAPITAL LETTER I WITH OGONEK - 0x012F: 0xE1, # LATIN SMALL LETTER I WITH OGONEK - 0x0136: 0xCD, # LATIN CAPITAL LETTER K WITH CEDILLA - 0x0137: 0xED, # LATIN SMALL LETTER K WITH CEDILLA - 0x013B: 0xCF, # LATIN CAPITAL LETTER L WITH CEDILLA - 0x013C: 0xEF, # LATIN SMALL LETTER L WITH CEDILLA - 0x0141: 0xD9, # LATIN CAPITAL LETTER L WITH STROKE - 0x0142: 0xF9, # LATIN SMALL LETTER L WITH STROKE - 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE - 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE - 0x0145: 0xD2, # LATIN CAPITAL LETTER N WITH CEDILLA - 0x0146: 0xF2, # LATIN SMALL LETTER N WITH CEDILLA - 0x014C: 0xD4, # LATIN CAPITAL LETTER O WITH MACRON - 0x014D: 0xF4, # LATIN SMALL LETTER O WITH MACRON - 0x0156: 0xAA, # LATIN CAPITAL LETTER R WITH CEDILLA - 0x0157: 0xBA, # LATIN SMALL LETTER R WITH CEDILLA - 0x015A: 0xDA, # LATIN CAPITAL LETTER S WITH ACUTE - 0x015B: 0xFA, # LATIN SMALL LETTER S WITH ACUTE - 0x0160: 0xD0, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xF0, # LATIN SMALL LETTER S WITH CARON - 0x016A: 0xDB, # LATIN CAPITAL LETTER U WITH MACRON - 0x016B: 0xFB, # LATIN SMALL LETTER U WITH MACRON - 0x0172: 0xD8, # LATIN CAPITAL LETTER U WITH OGONEK - 0x0173: 0xF8, # LATIN SMALL LETTER U WITH OGONEK - 0x0179: 0xCA, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x017A: 0xEA, # LATIN SMALL LETTER Z WITH ACUTE - 0x017B: 0xDD, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017C: 0xFD, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x017D: 0xDE, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xFE, # LATIN SMALL LETTER Z WITH CARON - 0x2019: 0xFF, # RIGHT SINGLE QUOTATION MARK - 0x201C: 0xB4, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xA1, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xA5, # DOUBLE LOW-9 QUOTATION MARK + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xAF, # LATIN CAPITAL LETTER AE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xA8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S (German) + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xBF, # LATIN SMALL LETTER AE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xB8, # LATIN SMALL LETTER O WITH STROKE + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0100: 0xC2, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0xE2, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0xC0, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0xE0, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0xC3, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0xE3, # LATIN SMALL LETTER C WITH ACUTE + 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON + 0x0112: 0xC7, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0xE7, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0xCB, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0xEB, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0xC6, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0xE6, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0xCC, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0xEC, # LATIN SMALL LETTER G WITH CEDILLA + 0x012A: 0xCE, # LATIN CAPITAL LETTER I WITH MACRON + 0x012B: 0xEE, # LATIN SMALL LETTER I WITH MACRON + 0x012E: 0xC1, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012F: 0xE1, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0xCD, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0xED, # LATIN SMALL LETTER K WITH CEDILLA + 0x013B: 0xCF, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013C: 0xEF, # LATIN SMALL LETTER L WITH CEDILLA + 0x0141: 0xD9, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0xF9, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE + 0x0145: 0xD2, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0xF2, # LATIN SMALL LETTER N WITH CEDILLA + 0x014C: 0xD4, # LATIN CAPITAL LETTER O WITH MACRON + 0x014D: 0xF4, # LATIN SMALL LETTER O WITH MACRON + 0x0156: 0xAA, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0xBA, # LATIN SMALL LETTER R WITH CEDILLA + 0x015A: 0xDA, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015B: 0xFA, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0xD0, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xF0, # LATIN SMALL LETTER S WITH CARON + 0x016A: 0xDB, # LATIN CAPITAL LETTER U WITH MACRON + 0x016B: 0xFB, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0xD8, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0xF8, # LATIN SMALL LETTER U WITH OGONEK + 0x0179: 0xCA, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017A: 0xEA, # LATIN SMALL LETTER Z WITH ACUTE + 0x017B: 0xDD, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017C: 0xFD, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017D: 0xDE, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xFE, # LATIN SMALL LETTER Z WITH CARON + 0x2019: 0xFF, # RIGHT SINGLE QUOTATION MARK + 0x201C: 0xB4, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xA1, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xA5, # DOUBLE LOW-9 QUOTATION MARK } - Modified: python/trunk/Lib/encodings/iso8859_14.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_14.py (original) +++ python/trunk/Lib/encodings/iso8859_14.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u1e02' # 0xA1 -> LATIN CAPITAL LETTER B WITH DOT ABOVE - u'\u1e03' # 0xA2 -> LATIN SMALL LETTER B WITH DOT ABOVE - u'\xa3' # 0xA3 -> POUND SIGN - u'\u010a' # 0xA4 -> LATIN CAPITAL LETTER C WITH DOT ABOVE - u'\u010b' # 0xA5 -> LATIN SMALL LETTER C WITH DOT ABOVE - u'\u1e0a' # 0xA6 -> LATIN CAPITAL LETTER D WITH DOT ABOVE - u'\xa7' # 0xA7 -> SECTION SIGN - u'\u1e80' # 0xA8 -> LATIN CAPITAL LETTER W WITH GRAVE - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u1e82' # 0xAA -> LATIN CAPITAL LETTER W WITH ACUTE - u'\u1e0b' # 0xAB -> LATIN SMALL LETTER D WITH DOT ABOVE - u'\u1ef2' # 0xAC -> LATIN CAPITAL LETTER Y WITH GRAVE - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\u0178' # 0xAF -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u1e1e' # 0xB0 -> LATIN CAPITAL LETTER F WITH DOT ABOVE - u'\u1e1f' # 0xB1 -> LATIN SMALL LETTER F WITH DOT ABOVE - u'\u0120' # 0xB2 -> LATIN CAPITAL LETTER G WITH DOT ABOVE - u'\u0121' # 0xB3 -> LATIN SMALL LETTER G WITH DOT ABOVE - u'\u1e40' # 0xB4 -> LATIN CAPITAL LETTER M WITH DOT ABOVE - u'\u1e41' # 0xB5 -> LATIN SMALL LETTER M WITH DOT ABOVE - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\u1e56' # 0xB7 -> LATIN CAPITAL LETTER P WITH DOT ABOVE - u'\u1e81' # 0xB8 -> LATIN SMALL LETTER W WITH GRAVE - u'\u1e57' # 0xB9 -> LATIN SMALL LETTER P WITH DOT ABOVE - u'\u1e83' # 0xBA -> LATIN SMALL LETTER W WITH ACUTE - u'\u1e60' # 0xBB -> LATIN CAPITAL LETTER S WITH DOT ABOVE - u'\u1ef3' # 0xBC -> LATIN SMALL LETTER Y WITH GRAVE - u'\u1e84' # 0xBD -> LATIN CAPITAL LETTER W WITH DIAERESIS - u'\u1e85' # 0xBE -> LATIN SMALL LETTER W WITH DIAERESIS - u'\u1e61' # 0xBF -> LATIN SMALL LETTER S WITH DOT ABOVE - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\u0174' # 0xD0 -> LATIN CAPITAL LETTER W WITH CIRCUMFLEX - u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\u1e6a' # 0xD7 -> LATIN CAPITAL LETTER T WITH DOT ABOVE - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\u0176' # 0xDE -> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\u0175' # 0xF0 -> LATIN SMALL LETTER W WITH CIRCUMFLEX - u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE - u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\u1e6b' # 0xF7 -> LATIN SMALL LETTER T WITH DOT ABOVE - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE - u'\u0177' # 0xFE -> LATIN SMALL LETTER Y WITH CIRCUMFLEX - u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u1e02' # 0xA1 -> LATIN CAPITAL LETTER B WITH DOT ABOVE + u'\u1e03' # 0xA2 -> LATIN SMALL LETTER B WITH DOT ABOVE + u'\xa3' # 0xA3 -> POUND SIGN + u'\u010a' # 0xA4 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + u'\u010b' # 0xA5 -> LATIN SMALL LETTER C WITH DOT ABOVE + u'\u1e0a' # 0xA6 -> LATIN CAPITAL LETTER D WITH DOT ABOVE + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u1e80' # 0xA8 -> LATIN CAPITAL LETTER W WITH GRAVE + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u1e82' # 0xAA -> LATIN CAPITAL LETTER W WITH ACUTE + u'\u1e0b' # 0xAB -> LATIN SMALL LETTER D WITH DOT ABOVE + u'\u1ef2' # 0xAC -> LATIN CAPITAL LETTER Y WITH GRAVE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\u0178' # 0xAF -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u1e1e' # 0xB0 -> LATIN CAPITAL LETTER F WITH DOT ABOVE + u'\u1e1f' # 0xB1 -> LATIN SMALL LETTER F WITH DOT ABOVE + u'\u0120' # 0xB2 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + u'\u0121' # 0xB3 -> LATIN SMALL LETTER G WITH DOT ABOVE + u'\u1e40' # 0xB4 -> LATIN CAPITAL LETTER M WITH DOT ABOVE + u'\u1e41' # 0xB5 -> LATIN SMALL LETTER M WITH DOT ABOVE + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\u1e56' # 0xB7 -> LATIN CAPITAL LETTER P WITH DOT ABOVE + u'\u1e81' # 0xB8 -> LATIN SMALL LETTER W WITH GRAVE + u'\u1e57' # 0xB9 -> LATIN SMALL LETTER P WITH DOT ABOVE + u'\u1e83' # 0xBA -> LATIN SMALL LETTER W WITH ACUTE + u'\u1e60' # 0xBB -> LATIN CAPITAL LETTER S WITH DOT ABOVE + u'\u1ef3' # 0xBC -> LATIN SMALL LETTER Y WITH GRAVE + u'\u1e84' # 0xBD -> LATIN CAPITAL LETTER W WITH DIAERESIS + u'\u1e85' # 0xBE -> LATIN SMALL LETTER W WITH DIAERESIS + u'\u1e61' # 0xBF -> LATIN SMALL LETTER S WITH DOT ABOVE + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u0174' # 0xD0 -> LATIN CAPITAL LETTER W WITH CIRCUMFLEX + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\u1e6a' # 0xD7 -> LATIN CAPITAL LETTER T WITH DOT ABOVE + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\u0176' # 0xDE -> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u0175' # 0xF0 -> LATIN SMALL LETTER W WITH CIRCUMFLEX + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u1e6b' # 0xF7 -> LATIN SMALL LETTER T WITH DOT ABOVE + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\u0177' # 0xFE -> LATIN SMALL LETTER Y WITH CIRCUMFLEX + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A3: 0xA3, # POUND SIGN - 0x00A7: 0xA7, # SECTION SIGN - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x010A: 0xA4, # LATIN CAPITAL LETTER C WITH DOT ABOVE - 0x010B: 0xA5, # LATIN SMALL LETTER C WITH DOT ABOVE - 0x0120: 0xB2, # LATIN CAPITAL LETTER G WITH DOT ABOVE - 0x0121: 0xB3, # LATIN SMALL LETTER G WITH DOT ABOVE - 0x0174: 0xD0, # LATIN CAPITAL LETTER W WITH CIRCUMFLEX - 0x0175: 0xF0, # LATIN SMALL LETTER W WITH CIRCUMFLEX - 0x0176: 0xDE, # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX - 0x0177: 0xFE, # LATIN SMALL LETTER Y WITH CIRCUMFLEX - 0x0178: 0xAF, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x1E02: 0xA1, # LATIN CAPITAL LETTER B WITH DOT ABOVE - 0x1E03: 0xA2, # LATIN SMALL LETTER B WITH DOT ABOVE - 0x1E0A: 0xA6, # LATIN CAPITAL LETTER D WITH DOT ABOVE - 0x1E0B: 0xAB, # LATIN SMALL LETTER D WITH DOT ABOVE - 0x1E1E: 0xB0, # LATIN CAPITAL LETTER F WITH DOT ABOVE - 0x1E1F: 0xB1, # LATIN SMALL LETTER F WITH DOT ABOVE - 0x1E40: 0xB4, # LATIN CAPITAL LETTER M WITH DOT ABOVE - 0x1E41: 0xB5, # LATIN SMALL LETTER M WITH DOT ABOVE - 0x1E56: 0xB7, # LATIN CAPITAL LETTER P WITH DOT ABOVE - 0x1E57: 0xB9, # LATIN SMALL LETTER P WITH DOT ABOVE - 0x1E60: 0xBB, # LATIN CAPITAL LETTER S WITH DOT ABOVE - 0x1E61: 0xBF, # LATIN SMALL LETTER S WITH DOT ABOVE - 0x1E6A: 0xD7, # LATIN CAPITAL LETTER T WITH DOT ABOVE - 0x1E6B: 0xF7, # LATIN SMALL LETTER T WITH DOT ABOVE - 0x1E80: 0xA8, # LATIN CAPITAL LETTER W WITH GRAVE - 0x1E81: 0xB8, # LATIN SMALL LETTER W WITH GRAVE - 0x1E82: 0xAA, # LATIN CAPITAL LETTER W WITH ACUTE - 0x1E83: 0xBA, # LATIN SMALL LETTER W WITH ACUTE - 0x1E84: 0xBD, # LATIN CAPITAL LETTER W WITH DIAERESIS - 0x1E85: 0xBE, # LATIN SMALL LETTER W WITH DIAERESIS - 0x1EF2: 0xAC, # LATIN CAPITAL LETTER Y WITH GRAVE - 0x1EF3: 0xBC, # LATIN SMALL LETTER Y WITH GRAVE + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A3: 0xA3, # POUND SIGN + 0x00A7: 0xA7, # SECTION SIGN + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x010A: 0xA4, # LATIN CAPITAL LETTER C WITH DOT ABOVE + 0x010B: 0xA5, # LATIN SMALL LETTER C WITH DOT ABOVE + 0x0120: 0xB2, # LATIN CAPITAL LETTER G WITH DOT ABOVE + 0x0121: 0xB3, # LATIN SMALL LETTER G WITH DOT ABOVE + 0x0174: 0xD0, # LATIN CAPITAL LETTER W WITH CIRCUMFLEX + 0x0175: 0xF0, # LATIN SMALL LETTER W WITH CIRCUMFLEX + 0x0176: 0xDE, # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + 0x0177: 0xFE, # LATIN SMALL LETTER Y WITH CIRCUMFLEX + 0x0178: 0xAF, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x1E02: 0xA1, # LATIN CAPITAL LETTER B WITH DOT ABOVE + 0x1E03: 0xA2, # LATIN SMALL LETTER B WITH DOT ABOVE + 0x1E0A: 0xA6, # LATIN CAPITAL LETTER D WITH DOT ABOVE + 0x1E0B: 0xAB, # LATIN SMALL LETTER D WITH DOT ABOVE + 0x1E1E: 0xB0, # LATIN CAPITAL LETTER F WITH DOT ABOVE + 0x1E1F: 0xB1, # LATIN SMALL LETTER F WITH DOT ABOVE + 0x1E40: 0xB4, # LATIN CAPITAL LETTER M WITH DOT ABOVE + 0x1E41: 0xB5, # LATIN SMALL LETTER M WITH DOT ABOVE + 0x1E56: 0xB7, # LATIN CAPITAL LETTER P WITH DOT ABOVE + 0x1E57: 0xB9, # LATIN SMALL LETTER P WITH DOT ABOVE + 0x1E60: 0xBB, # LATIN CAPITAL LETTER S WITH DOT ABOVE + 0x1E61: 0xBF, # LATIN SMALL LETTER S WITH DOT ABOVE + 0x1E6A: 0xD7, # LATIN CAPITAL LETTER T WITH DOT ABOVE + 0x1E6B: 0xF7, # LATIN SMALL LETTER T WITH DOT ABOVE + 0x1E80: 0xA8, # LATIN CAPITAL LETTER W WITH GRAVE + 0x1E81: 0xB8, # LATIN SMALL LETTER W WITH GRAVE + 0x1E82: 0xAA, # LATIN CAPITAL LETTER W WITH ACUTE + 0x1E83: 0xBA, # LATIN SMALL LETTER W WITH ACUTE + 0x1E84: 0xBD, # LATIN CAPITAL LETTER W WITH DIAERESIS + 0x1E85: 0xBE, # LATIN SMALL LETTER W WITH DIAERESIS + 0x1EF2: 0xAC, # LATIN CAPITAL LETTER Y WITH GRAVE + 0x1EF3: 0xBC, # LATIN SMALL LETTER Y WITH GRAVE } - Modified: python/trunk/Lib/encodings/iso8859_15.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_15.py (original) +++ python/trunk/Lib/encodings/iso8859_15.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\u20ac' # 0xA4 -> EURO SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON - u'\xa7' # 0xA7 -> SECTION SIGN - u'\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xBD -> LATIN SMALL LIGATURE OE - u'\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\xbf' # 0xBF -> INVERTED QUESTION MARK - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH - u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH - u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE - u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE - u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN - u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\u20ac' # 0xA4 -> EURO SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + u'\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\xfe' # 0xFE -> LATIN SMALL LETTER THORN + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A7: 0xA7, # SECTION SIGN - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BF: 0xBF, # INVERTED QUESTION MARK - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D0: 0xD0, # LATIN CAPITAL LETTER ETH - 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F0: 0xF0, # LATIN SMALL LETTER ETH - 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FE: 0xFE, # LATIN SMALL LETTER THORN - 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0152: 0xBC, # LATIN CAPITAL LIGATURE OE - 0x0153: 0xBD, # LATIN SMALL LIGATURE OE - 0x0160: 0xA6, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xA8, # LATIN SMALL LETTER S WITH CARON - 0x0178: 0xBE, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x017D: 0xB4, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xB8, # LATIN SMALL LETTER Z WITH CARON - 0x20AC: 0xA4, # EURO SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A7: 0xA7, # SECTION SIGN + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BF: 0xBF, # INVERTED QUESTION MARK + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0: 0xD0, # LATIN CAPITAL LETTER ETH + 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0: 0xF0, # LATIN SMALL LETTER ETH + 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FE: 0xFE, # LATIN SMALL LETTER THORN + 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0152: 0xBC, # LATIN CAPITAL LIGATURE OE + 0x0153: 0xBD, # LATIN SMALL LIGATURE OE + 0x0160: 0xA6, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xA8, # LATIN SMALL LETTER S WITH CARON + 0x0178: 0xBE, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x017D: 0xB4, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xB8, # LATIN SMALL LETTER Z WITH CARON + 0x20AC: 0xA4, # EURO SIGN } - Modified: python/trunk/Lib/encodings/iso8859_16.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_16.py (original) +++ python/trunk/Lib/encodings/iso8859_16.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\u0105' # 0xA2 -> LATIN SMALL LETTER A WITH OGONEK - u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE - u'\u20ac' # 0xA4 -> EURO SIGN - u'\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK - u'\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON - u'\xa7' # 0xA7 -> SECTION SIGN - u'\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u0218' # 0xAA -> LATIN CAPITAL LETTER S WITH COMMA BELOW - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\xad' # 0xAD -> SOFT HYPHEN - u'\u017a' # 0xAE -> LATIN SMALL LETTER Z WITH ACUTE - u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u010c' # 0xB2 -> LATIN CAPITAL LETTER C WITH CARON - u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE - u'\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON - u'\u201d' # 0xB5 -> RIGHT DOUBLE QUOTATION MARK - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON - u'\u010d' # 0xB9 -> LATIN SMALL LETTER C WITH CARON - u'\u0219' # 0xBA -> LATIN SMALL LETTER S WITH COMMA BELOW - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xBD -> LATIN SMALL LIGATURE OE - u'\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\u0106' # 0xC5 -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE - u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\u015a' # 0xD7 -> LATIN CAPITAL LETTER S WITH ACUTE - u'\u0170' # 0xD8 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u0118' # 0xDD -> LATIN CAPITAL LETTER E WITH OGONEK - u'\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u0107' # 0xE5 -> LATIN SMALL LETTER C WITH ACUTE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE - u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE - u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\u015b' # 0xF7 -> LATIN SMALL LETTER S WITH ACUTE - u'\u0171' # 0xF8 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u0119' # 0xFD -> LATIN SMALL LETTER E WITH OGONEK - u'\u021b' # 0xFE -> LATIN SMALL LETTER T WITH COMMA BELOW - u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u0105' # 0xA2 -> LATIN SMALL LETTER A WITH OGONEK + u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + u'\u20ac' # 0xA4 -> EURO SIGN + u'\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + u'\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + u'\xa7' # 0xA7 -> SECTION SIGN + u'\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u0218' # 0xAA -> LATIN CAPITAL LETTER S WITH COMMA BELOW + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u017a' # 0xAE -> LATIN SMALL LETTER Z WITH ACUTE + u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u010c' # 0xB2 -> LATIN CAPITAL LETTER C WITH CARON + u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + u'\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + u'\u201d' # 0xB5 -> RIGHT DOUBLE QUOTATION MARK + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + u'\u010d' # 0xB9 -> LATIN SMALL LETTER C WITH CARON + u'\u0219' # 0xBA -> LATIN SMALL LETTER S WITH COMMA BELOW + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + u'\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0106' # 0xC5 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\u015a' # 0xD7 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u0170' # 0xD8 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0118' # 0xDD -> LATIN CAPITAL LETTER E WITH OGONEK + u'\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u0107' # 0xE5 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\u015b' # 0xF7 -> LATIN SMALL LETTER S WITH ACUTE + u'\u0171' # 0xF8 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u0119' # 0xFD -> LATIN SMALL LETTER E WITH OGONEK + u'\u021b' # 0xFE -> LATIN SMALL LETTER T WITH COMMA BELOW + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A7: 0xA7, # SECTION SIGN - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0102: 0xC3, # LATIN CAPITAL LETTER A WITH BREVE - 0x0103: 0xE3, # LATIN SMALL LETTER A WITH BREVE - 0x0104: 0xA1, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0xA2, # LATIN SMALL LETTER A WITH OGONEK - 0x0106: 0xC5, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0xE5, # LATIN SMALL LETTER C WITH ACUTE - 0x010C: 0xB2, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0xB9, # LATIN SMALL LETTER C WITH CARON - 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE - 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE - 0x0118: 0xDD, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0xFD, # LATIN SMALL LETTER E WITH OGONEK - 0x0141: 0xA3, # LATIN CAPITAL LETTER L WITH STROKE - 0x0142: 0xB3, # LATIN SMALL LETTER L WITH STROKE - 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE - 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE - 0x0150: 0xD5, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - 0x0151: 0xF5, # LATIN SMALL LETTER O WITH DOUBLE ACUTE - 0x0152: 0xBC, # LATIN CAPITAL LIGATURE OE - 0x0153: 0xBD, # LATIN SMALL LIGATURE OE - 0x015A: 0xD7, # LATIN CAPITAL LETTER S WITH ACUTE - 0x015B: 0xF7, # LATIN SMALL LETTER S WITH ACUTE - 0x0160: 0xA6, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xA8, # LATIN SMALL LETTER S WITH CARON - 0x0170: 0xD8, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - 0x0171: 0xF8, # LATIN SMALL LETTER U WITH DOUBLE ACUTE - 0x0178: 0xBE, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x0179: 0xAC, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x017A: 0xAE, # LATIN SMALL LETTER Z WITH ACUTE - 0x017B: 0xAF, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017C: 0xBF, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x017D: 0xB4, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xB8, # LATIN SMALL LETTER Z WITH CARON - 0x0218: 0xAA, # LATIN CAPITAL LETTER S WITH COMMA BELOW - 0x0219: 0xBA, # LATIN SMALL LETTER S WITH COMMA BELOW - 0x021A: 0xDE, # LATIN CAPITAL LETTER T WITH COMMA BELOW - 0x021B: 0xFE, # LATIN SMALL LETTER T WITH COMMA BELOW - 0x201D: 0xB5, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xA5, # DOUBLE LOW-9 QUOTATION MARK - 0x20AC: 0xA4, # EURO SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A7: 0xA7, # SECTION SIGN + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0102: 0xC3, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0xE3, # LATIN SMALL LETTER A WITH BREVE + 0x0104: 0xA1, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0xA2, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0xC5, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0xE5, # LATIN SMALL LETTER C WITH ACUTE + 0x010C: 0xB2, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0xB9, # LATIN SMALL LETTER C WITH CARON + 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE + 0x0118: 0xDD, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0xFD, # LATIN SMALL LETTER E WITH OGONEK + 0x0141: 0xA3, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0xB3, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE + 0x0150: 0xD5, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0xF5, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0152: 0xBC, # LATIN CAPITAL LIGATURE OE + 0x0153: 0xBD, # LATIN SMALL LIGATURE OE + 0x015A: 0xD7, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015B: 0xF7, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0xA6, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xA8, # LATIN SMALL LETTER S WITH CARON + 0x0170: 0xD8, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0xF8, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0178: 0xBE, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x0179: 0xAC, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017A: 0xAE, # LATIN SMALL LETTER Z WITH ACUTE + 0x017B: 0xAF, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017C: 0xBF, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017D: 0xB4, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xB8, # LATIN SMALL LETTER Z WITH CARON + 0x0218: 0xAA, # LATIN CAPITAL LETTER S WITH COMMA BELOW + 0x0219: 0xBA, # LATIN SMALL LETTER S WITH COMMA BELOW + 0x021A: 0xDE, # LATIN CAPITAL LETTER T WITH COMMA BELOW + 0x021B: 0xFE, # LATIN SMALL LETTER T WITH COMMA BELOW + 0x201D: 0xB5, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xA5, # DOUBLE LOW-9 QUOTATION MARK + 0x20AC: 0xA4, # EURO SIGN } - Modified: python/trunk/Lib/encodings/iso8859_2.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_2.py (original) +++ python/trunk/Lib/encodings/iso8859_2.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\u02d8' # 0xA2 -> BREVE - u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\u013d' # 0xA5 -> LATIN CAPITAL LETTER L WITH CARON - u'\u015a' # 0xA6 -> LATIN CAPITAL LETTER S WITH ACUTE - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON - u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\u0164' # 0xAB -> LATIN CAPITAL LETTER T WITH CARON - u'\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\xad' # 0xAD -> SOFT HYPHEN - u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON - u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK - u'\u02db' # 0xB2 -> OGONEK - u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\u013e' # 0xB5 -> LATIN SMALL LETTER L WITH CARON - u'\u015b' # 0xB6 -> LATIN SMALL LETTER S WITH ACUTE - u'\u02c7' # 0xB7 -> CARON - u'\xb8' # 0xB8 -> CEDILLA - u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON - u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA - u'\u0165' # 0xBB -> LATIN SMALL LETTER T WITH CARON - u'\u017a' # 0xBC -> LATIN SMALL LETTER Z WITH ACUTE - u'\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT - u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON - u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE - u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON - u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE - u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON - u'\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE - u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON - u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE - u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE - u'\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON - u'\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE - u'\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA - u'\u02d9' # 0xFF -> DOT ABOVE + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u02d8' # 0xA2 -> BREVE + u'\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u013d' # 0xA5 -> LATIN CAPITAL LETTER L WITH CARON + u'\u015a' # 0xA6 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u0164' # 0xAB -> LATIN CAPITAL LETTER T WITH CARON + u'\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + u'\u02db' # 0xB2 -> OGONEK + u'\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\u013e' # 0xB5 -> LATIN SMALL LETTER L WITH CARON + u'\u015b' # 0xB6 -> LATIN SMALL LETTER S WITH ACUTE + u'\u02c7' # 0xB7 -> CARON + u'\xb8' # 0xB8 -> CEDILLA + u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + u'\u0165' # 0xBB -> LATIN SMALL LETTER T WITH CARON + u'\u017a' # 0xBC -> LATIN SMALL LETTER Z WITH ACUTE + u'\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + u'\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + u'\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + u'\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + u'\u02d9' # 0xFF -> DOT ABOVE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B8: 0xB8, # CEDILLA - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE - 0x0102: 0xC3, # LATIN CAPITAL LETTER A WITH BREVE - 0x0103: 0xE3, # LATIN SMALL LETTER A WITH BREVE - 0x0104: 0xA1, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0xB1, # LATIN SMALL LETTER A WITH OGONEK - 0x0106: 0xC6, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0xE6, # LATIN SMALL LETTER C WITH ACUTE - 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON - 0x010E: 0xCF, # LATIN CAPITAL LETTER D WITH CARON - 0x010F: 0xEF, # LATIN SMALL LETTER D WITH CARON - 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE - 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE - 0x0118: 0xCA, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0xEA, # LATIN SMALL LETTER E WITH OGONEK - 0x011A: 0xCC, # LATIN CAPITAL LETTER E WITH CARON - 0x011B: 0xEC, # LATIN SMALL LETTER E WITH CARON - 0x0139: 0xC5, # LATIN CAPITAL LETTER L WITH ACUTE - 0x013A: 0xE5, # LATIN SMALL LETTER L WITH ACUTE - 0x013D: 0xA5, # LATIN CAPITAL LETTER L WITH CARON - 0x013E: 0xB5, # LATIN SMALL LETTER L WITH CARON - 0x0141: 0xA3, # LATIN CAPITAL LETTER L WITH STROKE - 0x0142: 0xB3, # LATIN SMALL LETTER L WITH STROKE - 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE - 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE - 0x0147: 0xD2, # LATIN CAPITAL LETTER N WITH CARON - 0x0148: 0xF2, # LATIN SMALL LETTER N WITH CARON - 0x0150: 0xD5, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - 0x0151: 0xF5, # LATIN SMALL LETTER O WITH DOUBLE ACUTE - 0x0154: 0xC0, # LATIN CAPITAL LETTER R WITH ACUTE - 0x0155: 0xE0, # LATIN SMALL LETTER R WITH ACUTE - 0x0158: 0xD8, # LATIN CAPITAL LETTER R WITH CARON - 0x0159: 0xF8, # LATIN SMALL LETTER R WITH CARON - 0x015A: 0xA6, # LATIN CAPITAL LETTER S WITH ACUTE - 0x015B: 0xB6, # LATIN SMALL LETTER S WITH ACUTE - 0x015E: 0xAA, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015F: 0xBA, # LATIN SMALL LETTER S WITH CEDILLA - 0x0160: 0xA9, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xB9, # LATIN SMALL LETTER S WITH CARON - 0x0162: 0xDE, # LATIN CAPITAL LETTER T WITH CEDILLA - 0x0163: 0xFE, # LATIN SMALL LETTER T WITH CEDILLA - 0x0164: 0xAB, # LATIN CAPITAL LETTER T WITH CARON - 0x0165: 0xBB, # LATIN SMALL LETTER T WITH CARON - 0x016E: 0xD9, # LATIN CAPITAL LETTER U WITH RING ABOVE - 0x016F: 0xF9, # LATIN SMALL LETTER U WITH RING ABOVE - 0x0170: 0xDB, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - 0x0171: 0xFB, # LATIN SMALL LETTER U WITH DOUBLE ACUTE - 0x0179: 0xAC, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x017A: 0xBC, # LATIN SMALL LETTER Z WITH ACUTE - 0x017B: 0xAF, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017C: 0xBF, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x017D: 0xAE, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xBE, # LATIN SMALL LETTER Z WITH CARON - 0x02C7: 0xB7, # CARON - 0x02D8: 0xA2, # BREVE - 0x02D9: 0xFF, # DOT ABOVE - 0x02DB: 0xB2, # OGONEK - 0x02DD: 0xBD, # DOUBLE ACUTE ACCENT + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B8: 0xB8, # CEDILLA + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xDD, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xFD, # LATIN SMALL LETTER Y WITH ACUTE + 0x0102: 0xC3, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0xE3, # LATIN SMALL LETTER A WITH BREVE + 0x0104: 0xA1, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0xB1, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0xC6, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0xE6, # LATIN SMALL LETTER C WITH ACUTE + 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON + 0x010E: 0xCF, # LATIN CAPITAL LETTER D WITH CARON + 0x010F: 0xEF, # LATIN SMALL LETTER D WITH CARON + 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE + 0x0118: 0xCA, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0xEA, # LATIN SMALL LETTER E WITH OGONEK + 0x011A: 0xCC, # LATIN CAPITAL LETTER E WITH CARON + 0x011B: 0xEC, # LATIN SMALL LETTER E WITH CARON + 0x0139: 0xC5, # LATIN CAPITAL LETTER L WITH ACUTE + 0x013A: 0xE5, # LATIN SMALL LETTER L WITH ACUTE + 0x013D: 0xA5, # LATIN CAPITAL LETTER L WITH CARON + 0x013E: 0xB5, # LATIN SMALL LETTER L WITH CARON + 0x0141: 0xA3, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0xB3, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0xD1, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0xF1, # LATIN SMALL LETTER N WITH ACUTE + 0x0147: 0xD2, # LATIN CAPITAL LETTER N WITH CARON + 0x0148: 0xF2, # LATIN SMALL LETTER N WITH CARON + 0x0150: 0xD5, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0xF5, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0154: 0xC0, # LATIN CAPITAL LETTER R WITH ACUTE + 0x0155: 0xE0, # LATIN SMALL LETTER R WITH ACUTE + 0x0158: 0xD8, # LATIN CAPITAL LETTER R WITH CARON + 0x0159: 0xF8, # LATIN SMALL LETTER R WITH CARON + 0x015A: 0xA6, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015B: 0xB6, # LATIN SMALL LETTER S WITH ACUTE + 0x015E: 0xAA, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015F: 0xBA, # LATIN SMALL LETTER S WITH CEDILLA + 0x0160: 0xA9, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xB9, # LATIN SMALL LETTER S WITH CARON + 0x0162: 0xDE, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x0163: 0xFE, # LATIN SMALL LETTER T WITH CEDILLA + 0x0164: 0xAB, # LATIN CAPITAL LETTER T WITH CARON + 0x0165: 0xBB, # LATIN SMALL LETTER T WITH CARON + 0x016E: 0xD9, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x016F: 0xF9, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0170: 0xDB, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0xFB, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0179: 0xAC, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017A: 0xBC, # LATIN SMALL LETTER Z WITH ACUTE + 0x017B: 0xAF, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017C: 0xBF, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017D: 0xAE, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xBE, # LATIN SMALL LETTER Z WITH CARON + 0x02C7: 0xB7, # CARON + 0x02D8: 0xA2, # BREVE + 0x02D9: 0xFF, # DOT ABOVE + 0x02DB: 0xB2, # OGONEK + 0x02DD: 0xBD, # DOUBLE ACUTE ACCENT } - Modified: python/trunk/Lib/encodings/iso8859_3.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_3.py (original) +++ python/trunk/Lib/encodings/iso8859_3.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,515 +32,514 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0126' # 0xA1 -> LATIN CAPITAL LETTER H WITH STROKE - u'\u02d8' # 0xA2 -> BREVE - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0126' # 0xA1 -> LATIN CAPITAL LETTER H WITH STROKE + u'\u02d8' # 0xA2 -> BREVE + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN u'\ufffe' - u'\u0124' # 0xA6 -> LATIN CAPITAL LETTER H WITH CIRCUMFLEX - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\u0130' # 0xA9 -> LATIN CAPITAL LETTER I WITH DOT ABOVE - u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\u011e' # 0xAB -> LATIN CAPITAL LETTER G WITH BREVE - u'\u0134' # 0xAC -> LATIN CAPITAL LETTER J WITH CIRCUMFLEX - u'\xad' # 0xAD -> SOFT HYPHEN + u'\u0124' # 0xA6 -> LATIN CAPITAL LETTER H WITH CIRCUMFLEX + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\u0130' # 0xA9 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u011e' # 0xAB -> LATIN CAPITAL LETTER G WITH BREVE + u'\u0134' # 0xAC -> LATIN CAPITAL LETTER J WITH CIRCUMFLEX + u'\xad' # 0xAD -> SOFT HYPHEN u'\ufffe' - u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\u0127' # 0xB1 -> LATIN SMALL LETTER H WITH STROKE - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u0125' # 0xB6 -> LATIN SMALL LETTER H WITH CIRCUMFLEX - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\u0131' # 0xB9 -> LATIN SMALL LETTER DOTLESS I - u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA - u'\u011f' # 0xBB -> LATIN SMALL LETTER G WITH BREVE - u'\u0135' # 0xBC -> LATIN SMALL LETTER J WITH CIRCUMFLEX - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\u0127' # 0xB1 -> LATIN SMALL LETTER H WITH STROKE + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u0125' # 0xB6 -> LATIN SMALL LETTER H WITH CIRCUMFLEX + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\u0131' # 0xB9 -> LATIN SMALL LETTER DOTLESS I + u'\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + u'\u011f' # 0xBB -> LATIN SMALL LETTER G WITH BREVE + u'\u0135' # 0xBC -> LATIN SMALL LETTER J WITH CIRCUMFLEX + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF u'\ufffe' - u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX u'\ufffe' - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\u010a' # 0xC5 -> LATIN CAPITAL LETTER C WITH DOT ABOVE - u'\u0108' # 0xC6 -> LATIN CAPITAL LETTER C WITH CIRCUMFLEX - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u010a' # 0xC5 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + u'\u0108' # 0xC6 -> LATIN CAPITAL LETTER C WITH CIRCUMFLEX + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS u'\ufffe' - u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u0120' # 0xD5 -> LATIN CAPITAL LETTER G WITH DOT ABOVE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\u011c' # 0xD8 -> LATIN CAPITAL LETTER G WITH CIRCUMFLEX - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u016c' # 0xDD -> LATIN CAPITAL LETTER U WITH BREVE - u'\u015c' # 0xDE -> LATIN CAPITAL LETTER S WITH CIRCUMFLEX - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0120' # 0xD5 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\u011c' # 0xD8 -> LATIN CAPITAL LETTER G WITH CIRCUMFLEX + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u016c' # 0xDD -> LATIN CAPITAL LETTER U WITH BREVE + u'\u015c' # 0xDE -> LATIN CAPITAL LETTER S WITH CIRCUMFLEX + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX u'\ufffe' - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u010b' # 0xE5 -> LATIN SMALL LETTER C WITH DOT ABOVE - u'\u0109' # 0xE6 -> LATIN SMALL LETTER C WITH CIRCUMFLEX - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u010b' # 0xE5 -> LATIN SMALL LETTER C WITH DOT ABOVE + u'\u0109' # 0xE6 -> LATIN SMALL LETTER C WITH CIRCUMFLEX + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS u'\ufffe' - u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE - u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\u0121' # 0xF5 -> LATIN SMALL LETTER G WITH DOT ABOVE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\u011d' # 0xF8 -> LATIN SMALL LETTER G WITH CIRCUMFLEX - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u016d' # 0xFD -> LATIN SMALL LETTER U WITH BREVE - u'\u015d' # 0xFE -> LATIN SMALL LETTER S WITH CIRCUMFLEX - u'\u02d9' # 0xFF -> DOT ABOVE + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\u0121' # 0xF5 -> LATIN SMALL LETTER G WITH DOT ABOVE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\u011d' # 0xF8 -> LATIN SMALL LETTER G WITH CIRCUMFLEX + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u016d' # 0xFD -> LATIN SMALL LETTER U WITH BREVE + u'\u015d' # 0xFE -> LATIN SMALL LETTER S WITH CIRCUMFLEX + u'\u02d9' # 0xFF -> DOT ABOVE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0108: 0xC6, # LATIN CAPITAL LETTER C WITH CIRCUMFLEX - 0x0109: 0xE6, # LATIN SMALL LETTER C WITH CIRCUMFLEX - 0x010A: 0xC5, # LATIN CAPITAL LETTER C WITH DOT ABOVE - 0x010B: 0xE5, # LATIN SMALL LETTER C WITH DOT ABOVE - 0x011C: 0xD8, # LATIN CAPITAL LETTER G WITH CIRCUMFLEX - 0x011D: 0xF8, # LATIN SMALL LETTER G WITH CIRCUMFLEX - 0x011E: 0xAB, # LATIN CAPITAL LETTER G WITH BREVE - 0x011F: 0xBB, # LATIN SMALL LETTER G WITH BREVE - 0x0120: 0xD5, # LATIN CAPITAL LETTER G WITH DOT ABOVE - 0x0121: 0xF5, # LATIN SMALL LETTER G WITH DOT ABOVE - 0x0124: 0xA6, # LATIN CAPITAL LETTER H WITH CIRCUMFLEX - 0x0125: 0xB6, # LATIN SMALL LETTER H WITH CIRCUMFLEX - 0x0126: 0xA1, # LATIN CAPITAL LETTER H WITH STROKE - 0x0127: 0xB1, # LATIN SMALL LETTER H WITH STROKE - 0x0130: 0xA9, # LATIN CAPITAL LETTER I WITH DOT ABOVE - 0x0131: 0xB9, # LATIN SMALL LETTER DOTLESS I - 0x0134: 0xAC, # LATIN CAPITAL LETTER J WITH CIRCUMFLEX - 0x0135: 0xBC, # LATIN SMALL LETTER J WITH CIRCUMFLEX - 0x015C: 0xDE, # LATIN CAPITAL LETTER S WITH CIRCUMFLEX - 0x015D: 0xFE, # LATIN SMALL LETTER S WITH CIRCUMFLEX - 0x015E: 0xAA, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015F: 0xBA, # LATIN SMALL LETTER S WITH CEDILLA - 0x016C: 0xDD, # LATIN CAPITAL LETTER U WITH BREVE - 0x016D: 0xFD, # LATIN SMALL LETTER U WITH BREVE - 0x017B: 0xAF, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017C: 0xBF, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x02D8: 0xA2, # BREVE - 0x02D9: 0xFF, # DOT ABOVE + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0108: 0xC6, # LATIN CAPITAL LETTER C WITH CIRCUMFLEX + 0x0109: 0xE6, # LATIN SMALL LETTER C WITH CIRCUMFLEX + 0x010A: 0xC5, # LATIN CAPITAL LETTER C WITH DOT ABOVE + 0x010B: 0xE5, # LATIN SMALL LETTER C WITH DOT ABOVE + 0x011C: 0xD8, # LATIN CAPITAL LETTER G WITH CIRCUMFLEX + 0x011D: 0xF8, # LATIN SMALL LETTER G WITH CIRCUMFLEX + 0x011E: 0xAB, # LATIN CAPITAL LETTER G WITH BREVE + 0x011F: 0xBB, # LATIN SMALL LETTER G WITH BREVE + 0x0120: 0xD5, # LATIN CAPITAL LETTER G WITH DOT ABOVE + 0x0121: 0xF5, # LATIN SMALL LETTER G WITH DOT ABOVE + 0x0124: 0xA6, # LATIN CAPITAL LETTER H WITH CIRCUMFLEX + 0x0125: 0xB6, # LATIN SMALL LETTER H WITH CIRCUMFLEX + 0x0126: 0xA1, # LATIN CAPITAL LETTER H WITH STROKE + 0x0127: 0xB1, # LATIN SMALL LETTER H WITH STROKE + 0x0130: 0xA9, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0xB9, # LATIN SMALL LETTER DOTLESS I + 0x0134: 0xAC, # LATIN CAPITAL LETTER J WITH CIRCUMFLEX + 0x0135: 0xBC, # LATIN SMALL LETTER J WITH CIRCUMFLEX + 0x015C: 0xDE, # LATIN CAPITAL LETTER S WITH CIRCUMFLEX + 0x015D: 0xFE, # LATIN SMALL LETTER S WITH CIRCUMFLEX + 0x015E: 0xAA, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015F: 0xBA, # LATIN SMALL LETTER S WITH CEDILLA + 0x016C: 0xDD, # LATIN CAPITAL LETTER U WITH BREVE + 0x016D: 0xFD, # LATIN SMALL LETTER U WITH BREVE + 0x017B: 0xAF, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017C: 0xBF, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x02D8: 0xA2, # BREVE + 0x02D9: 0xFF, # DOT ABOVE } - Modified: python/trunk/Lib/encodings/iso8859_4.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_4.py (original) +++ python/trunk/Lib/encodings/iso8859_4.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\u0138' # 0xA2 -> LATIN SMALL LETTER KRA - u'\u0156' # 0xA3 -> LATIN CAPITAL LETTER R WITH CEDILLA - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE - u'\u013b' # 0xA6 -> LATIN CAPITAL LETTER L WITH CEDILLA - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON - u'\u0112' # 0xAA -> LATIN CAPITAL LETTER E WITH MACRON - u'\u0122' # 0xAB -> LATIN CAPITAL LETTER G WITH CEDILLA - u'\u0166' # 0xAC -> LATIN CAPITAL LETTER T WITH STROKE - u'\xad' # 0xAD -> SOFT HYPHEN - u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK - u'\u02db' # 0xB2 -> OGONEK - u'\u0157' # 0xB3 -> LATIN SMALL LETTER R WITH CEDILLA - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE - u'\u013c' # 0xB6 -> LATIN SMALL LETTER L WITH CEDILLA - u'\u02c7' # 0xB7 -> CARON - u'\xb8' # 0xB8 -> CEDILLA - u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON - u'\u0113' # 0xBA -> LATIN SMALL LETTER E WITH MACRON - u'\u0123' # 0xBB -> LATIN SMALL LETTER G WITH CEDILLA - u'\u0167' # 0xBC -> LATIN SMALL LETTER T WITH STROKE - u'\u014a' # 0xBD -> LATIN CAPITAL LETTER ENG - u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON - u'\u014b' # 0xBF -> LATIN SMALL LETTER ENG - u'\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK - u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\u012a' # 0xCF -> LATIN CAPITAL LETTER I WITH MACRON - u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE - u'\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA - u'\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON - u'\u0136' # 0xD3 -> LATIN CAPITAL LETTER K WITH CEDILLA - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u0168' # 0xDD -> LATIN CAPITAL LETTER U WITH TILDE - u'\u016a' # 0xDE -> LATIN CAPITAL LETTER U WITH MACRON - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK - u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\u012b' # 0xEF -> LATIN SMALL LETTER I WITH MACRON - u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE - u'\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA - u'\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON - u'\u0137' # 0xF3 -> LATIN SMALL LETTER K WITH CEDILLA - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u0169' # 0xFD -> LATIN SMALL LETTER U WITH TILDE - u'\u016b' # 0xFE -> LATIN SMALL LETTER U WITH MACRON - u'\u02d9' # 0xFF -> DOT ABOVE + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\u0138' # 0xA2 -> LATIN SMALL LETTER KRA + u'\u0156' # 0xA3 -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + u'\u013b' # 0xA6 -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + u'\u0112' # 0xAA -> LATIN CAPITAL LETTER E WITH MACRON + u'\u0122' # 0xAB -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u0166' # 0xAC -> LATIN CAPITAL LETTER T WITH STROKE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + u'\u02db' # 0xB2 -> OGONEK + u'\u0157' # 0xB3 -> LATIN SMALL LETTER R WITH CEDILLA + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + u'\u013c' # 0xB6 -> LATIN SMALL LETTER L WITH CEDILLA + u'\u02c7' # 0xB7 -> CARON + u'\xb8' # 0xB8 -> CEDILLA + u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + u'\u0113' # 0xBA -> LATIN SMALL LETTER E WITH MACRON + u'\u0123' # 0xBB -> LATIN SMALL LETTER G WITH CEDILLA + u'\u0167' # 0xBC -> LATIN SMALL LETTER T WITH STROKE + u'\u014a' # 0xBD -> LATIN CAPITAL LETTER ENG + u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + u'\u014b' # 0xBF -> LATIN SMALL LETTER ENG + u'\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\u012a' # 0xCF -> LATIN CAPITAL LETTER I WITH MACRON + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + u'\u0136' # 0xD3 -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0168' # 0xDD -> LATIN CAPITAL LETTER U WITH TILDE + u'\u016a' # 0xDE -> LATIN CAPITAL LETTER U WITH MACRON + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\u012b' # 0xEF -> LATIN SMALL LETTER I WITH MACRON + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + u'\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + u'\u0137' # 0xF3 -> LATIN SMALL LETTER K WITH CEDILLA + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u0169' # 0xFD -> LATIN SMALL LETTER U WITH TILDE + u'\u016b' # 0xFE -> LATIN SMALL LETTER U WITH MACRON + u'\u02d9' # 0xFF -> DOT ABOVE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B8: 0xB8, # CEDILLA - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0100: 0xC0, # LATIN CAPITAL LETTER A WITH MACRON - 0x0101: 0xE0, # LATIN SMALL LETTER A WITH MACRON - 0x0104: 0xA1, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0xB1, # LATIN SMALL LETTER A WITH OGONEK - 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON - 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE - 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE - 0x0112: 0xAA, # LATIN CAPITAL LETTER E WITH MACRON - 0x0113: 0xBA, # LATIN SMALL LETTER E WITH MACRON - 0x0116: 0xCC, # LATIN CAPITAL LETTER E WITH DOT ABOVE - 0x0117: 0xEC, # LATIN SMALL LETTER E WITH DOT ABOVE - 0x0118: 0xCA, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0xEA, # LATIN SMALL LETTER E WITH OGONEK - 0x0122: 0xAB, # LATIN CAPITAL LETTER G WITH CEDILLA - 0x0123: 0xBB, # LATIN SMALL LETTER G WITH CEDILLA - 0x0128: 0xA5, # LATIN CAPITAL LETTER I WITH TILDE - 0x0129: 0xB5, # LATIN SMALL LETTER I WITH TILDE - 0x012A: 0xCF, # LATIN CAPITAL LETTER I WITH MACRON - 0x012B: 0xEF, # LATIN SMALL LETTER I WITH MACRON - 0x012E: 0xC7, # LATIN CAPITAL LETTER I WITH OGONEK - 0x012F: 0xE7, # LATIN SMALL LETTER I WITH OGONEK - 0x0136: 0xD3, # LATIN CAPITAL LETTER K WITH CEDILLA - 0x0137: 0xF3, # LATIN SMALL LETTER K WITH CEDILLA - 0x0138: 0xA2, # LATIN SMALL LETTER KRA - 0x013B: 0xA6, # LATIN CAPITAL LETTER L WITH CEDILLA - 0x013C: 0xB6, # LATIN SMALL LETTER L WITH CEDILLA - 0x0145: 0xD1, # LATIN CAPITAL LETTER N WITH CEDILLA - 0x0146: 0xF1, # LATIN SMALL LETTER N WITH CEDILLA - 0x014A: 0xBD, # LATIN CAPITAL LETTER ENG - 0x014B: 0xBF, # LATIN SMALL LETTER ENG - 0x014C: 0xD2, # LATIN CAPITAL LETTER O WITH MACRON - 0x014D: 0xF2, # LATIN SMALL LETTER O WITH MACRON - 0x0156: 0xA3, # LATIN CAPITAL LETTER R WITH CEDILLA - 0x0157: 0xB3, # LATIN SMALL LETTER R WITH CEDILLA - 0x0160: 0xA9, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xB9, # LATIN SMALL LETTER S WITH CARON - 0x0166: 0xAC, # LATIN CAPITAL LETTER T WITH STROKE - 0x0167: 0xBC, # LATIN SMALL LETTER T WITH STROKE - 0x0168: 0xDD, # LATIN CAPITAL LETTER U WITH TILDE - 0x0169: 0xFD, # LATIN SMALL LETTER U WITH TILDE - 0x016A: 0xDE, # LATIN CAPITAL LETTER U WITH MACRON - 0x016B: 0xFE, # LATIN SMALL LETTER U WITH MACRON - 0x0172: 0xD9, # LATIN CAPITAL LETTER U WITH OGONEK - 0x0173: 0xF9, # LATIN SMALL LETTER U WITH OGONEK - 0x017D: 0xAE, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xBE, # LATIN SMALL LETTER Z WITH CARON - 0x02C7: 0xB7, # CARON - 0x02D9: 0xFF, # DOT ABOVE - 0x02DB: 0xB2, # OGONEK + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B8: 0xB8, # CEDILLA + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0100: 0xC0, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0xE0, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0xA1, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0xB1, # LATIN SMALL LETTER A WITH OGONEK + 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON + 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE + 0x0112: 0xAA, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0xBA, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0xCC, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0xEC, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0xCA, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0xEA, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0xAB, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0xBB, # LATIN SMALL LETTER G WITH CEDILLA + 0x0128: 0xA5, # LATIN CAPITAL LETTER I WITH TILDE + 0x0129: 0xB5, # LATIN SMALL LETTER I WITH TILDE + 0x012A: 0xCF, # LATIN CAPITAL LETTER I WITH MACRON + 0x012B: 0xEF, # LATIN SMALL LETTER I WITH MACRON + 0x012E: 0xC7, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012F: 0xE7, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0xD3, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0xF3, # LATIN SMALL LETTER K WITH CEDILLA + 0x0138: 0xA2, # LATIN SMALL LETTER KRA + 0x013B: 0xA6, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013C: 0xB6, # LATIN SMALL LETTER L WITH CEDILLA + 0x0145: 0xD1, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0xF1, # LATIN SMALL LETTER N WITH CEDILLA + 0x014A: 0xBD, # LATIN CAPITAL LETTER ENG + 0x014B: 0xBF, # LATIN SMALL LETTER ENG + 0x014C: 0xD2, # LATIN CAPITAL LETTER O WITH MACRON + 0x014D: 0xF2, # LATIN SMALL LETTER O WITH MACRON + 0x0156: 0xA3, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0xB3, # LATIN SMALL LETTER R WITH CEDILLA + 0x0160: 0xA9, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xB9, # LATIN SMALL LETTER S WITH CARON + 0x0166: 0xAC, # LATIN CAPITAL LETTER T WITH STROKE + 0x0167: 0xBC, # LATIN SMALL LETTER T WITH STROKE + 0x0168: 0xDD, # LATIN CAPITAL LETTER U WITH TILDE + 0x0169: 0xFD, # LATIN SMALL LETTER U WITH TILDE + 0x016A: 0xDE, # LATIN CAPITAL LETTER U WITH MACRON + 0x016B: 0xFE, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0xD9, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0xF9, # LATIN SMALL LETTER U WITH OGONEK + 0x017D: 0xAE, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xBE, # LATIN SMALL LETTER Z WITH CARON + 0x02C7: 0xB7, # CARON + 0x02D9: 0xFF, # DOT ABOVE + 0x02DB: 0xB2, # OGONEK } - Modified: python/trunk/Lib/encodings/iso8859_5.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_5.py (original) +++ python/trunk/Lib/encodings/iso8859_5.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u0401' # 0xA1 -> CYRILLIC CAPITAL LETTER IO - u'\u0402' # 0xA2 -> CYRILLIC CAPITAL LETTER DJE - u'\u0403' # 0xA3 -> CYRILLIC CAPITAL LETTER GJE - u'\u0404' # 0xA4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE - u'\u0405' # 0xA5 -> CYRILLIC CAPITAL LETTER DZE - u'\u0406' # 0xA6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0407' # 0xA7 -> CYRILLIC CAPITAL LETTER YI - u'\u0408' # 0xA8 -> CYRILLIC CAPITAL LETTER JE - u'\u0409' # 0xA9 -> CYRILLIC CAPITAL LETTER LJE - u'\u040a' # 0xAA -> CYRILLIC CAPITAL LETTER NJE - u'\u040b' # 0xAB -> CYRILLIC CAPITAL LETTER TSHE - u'\u040c' # 0xAC -> CYRILLIC CAPITAL LETTER KJE - u'\xad' # 0xAD -> SOFT HYPHEN - u'\u040e' # 0xAE -> CYRILLIC CAPITAL LETTER SHORT U - u'\u040f' # 0xAF -> CYRILLIC CAPITAL LETTER DZHE - u'\u0410' # 0xB0 -> CYRILLIC CAPITAL LETTER A - u'\u0411' # 0xB1 -> CYRILLIC CAPITAL LETTER BE - u'\u0412' # 0xB2 -> CYRILLIC CAPITAL LETTER VE - u'\u0413' # 0xB3 -> CYRILLIC CAPITAL LETTER GHE - u'\u0414' # 0xB4 -> CYRILLIC CAPITAL LETTER DE - u'\u0415' # 0xB5 -> CYRILLIC CAPITAL LETTER IE - u'\u0416' # 0xB6 -> CYRILLIC CAPITAL LETTER ZHE - u'\u0417' # 0xB7 -> CYRILLIC CAPITAL LETTER ZE - u'\u0418' # 0xB8 -> CYRILLIC CAPITAL LETTER I - u'\u0419' # 0xB9 -> CYRILLIC CAPITAL LETTER SHORT I - u'\u041a' # 0xBA -> CYRILLIC CAPITAL LETTER KA - u'\u041b' # 0xBB -> CYRILLIC CAPITAL LETTER EL - u'\u041c' # 0xBC -> CYRILLIC CAPITAL LETTER EM - u'\u041d' # 0xBD -> CYRILLIC CAPITAL LETTER EN - u'\u041e' # 0xBE -> CYRILLIC CAPITAL LETTER O - u'\u041f' # 0xBF -> CYRILLIC CAPITAL LETTER PE - u'\u0420' # 0xC0 -> CYRILLIC CAPITAL LETTER ER - u'\u0421' # 0xC1 -> CYRILLIC CAPITAL LETTER ES - u'\u0422' # 0xC2 -> CYRILLIC CAPITAL LETTER TE - u'\u0423' # 0xC3 -> CYRILLIC CAPITAL LETTER U - u'\u0424' # 0xC4 -> CYRILLIC CAPITAL LETTER EF - u'\u0425' # 0xC5 -> CYRILLIC CAPITAL LETTER HA - u'\u0426' # 0xC6 -> CYRILLIC CAPITAL LETTER TSE - u'\u0427' # 0xC7 -> CYRILLIC CAPITAL LETTER CHE - u'\u0428' # 0xC8 -> CYRILLIC CAPITAL LETTER SHA - u'\u0429' # 0xC9 -> CYRILLIC CAPITAL LETTER SHCHA - u'\u042a' # 0xCA -> CYRILLIC CAPITAL LETTER HARD SIGN - u'\u042b' # 0xCB -> CYRILLIC CAPITAL LETTER YERU - u'\u042c' # 0xCC -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u042d' # 0xCD -> CYRILLIC CAPITAL LETTER E - u'\u042e' # 0xCE -> CYRILLIC CAPITAL LETTER YU - u'\u042f' # 0xCF -> CYRILLIC CAPITAL LETTER YA - u'\u0430' # 0xD0 -> CYRILLIC SMALL LETTER A - u'\u0431' # 0xD1 -> CYRILLIC SMALL LETTER BE - u'\u0432' # 0xD2 -> CYRILLIC SMALL LETTER VE - u'\u0433' # 0xD3 -> CYRILLIC SMALL LETTER GHE - u'\u0434' # 0xD4 -> CYRILLIC SMALL LETTER DE - u'\u0435' # 0xD5 -> CYRILLIC SMALL LETTER IE - u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE - u'\u0437' # 0xD7 -> CYRILLIC SMALL LETTER ZE - u'\u0438' # 0xD8 -> CYRILLIC SMALL LETTER I - u'\u0439' # 0xD9 -> CYRILLIC SMALL LETTER SHORT I - u'\u043a' # 0xDA -> CYRILLIC SMALL LETTER KA - u'\u043b' # 0xDB -> CYRILLIC SMALL LETTER EL - u'\u043c' # 0xDC -> CYRILLIC SMALL LETTER EM - u'\u043d' # 0xDD -> CYRILLIC SMALL LETTER EN - u'\u043e' # 0xDE -> CYRILLIC SMALL LETTER O - u'\u043f' # 0xDF -> CYRILLIC SMALL LETTER PE - u'\u0440' # 0xE0 -> CYRILLIC SMALL LETTER ER - u'\u0441' # 0xE1 -> CYRILLIC SMALL LETTER ES - u'\u0442' # 0xE2 -> CYRILLIC SMALL LETTER TE - u'\u0443' # 0xE3 -> CYRILLIC SMALL LETTER U - u'\u0444' # 0xE4 -> CYRILLIC SMALL LETTER EF - u'\u0445' # 0xE5 -> CYRILLIC SMALL LETTER HA - u'\u0446' # 0xE6 -> CYRILLIC SMALL LETTER TSE - u'\u0447' # 0xE7 -> CYRILLIC SMALL LETTER CHE - u'\u0448' # 0xE8 -> CYRILLIC SMALL LETTER SHA - u'\u0449' # 0xE9 -> CYRILLIC SMALL LETTER SHCHA - u'\u044a' # 0xEA -> CYRILLIC SMALL LETTER HARD SIGN - u'\u044b' # 0xEB -> CYRILLIC SMALL LETTER YERU - u'\u044c' # 0xEC -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u044d' # 0xED -> CYRILLIC SMALL LETTER E - u'\u044e' # 0xEE -> CYRILLIC SMALL LETTER YU - u'\u044f' # 0xEF -> CYRILLIC SMALL LETTER YA - u'\u2116' # 0xF0 -> NUMERO SIGN - u'\u0451' # 0xF1 -> CYRILLIC SMALL LETTER IO - u'\u0452' # 0xF2 -> CYRILLIC SMALL LETTER DJE - u'\u0453' # 0xF3 -> CYRILLIC SMALL LETTER GJE - u'\u0454' # 0xF4 -> CYRILLIC SMALL LETTER UKRAINIAN IE - u'\u0455' # 0xF5 -> CYRILLIC SMALL LETTER DZE - u'\u0456' # 0xF6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0457' # 0xF7 -> CYRILLIC SMALL LETTER YI - u'\u0458' # 0xF8 -> CYRILLIC SMALL LETTER JE - u'\u0459' # 0xF9 -> CYRILLIC SMALL LETTER LJE - u'\u045a' # 0xFA -> CYRILLIC SMALL LETTER NJE - u'\u045b' # 0xFB -> CYRILLIC SMALL LETTER TSHE - u'\u045c' # 0xFC -> CYRILLIC SMALL LETTER KJE - u'\xa7' # 0xFD -> SECTION SIGN - u'\u045e' # 0xFE -> CYRILLIC SMALL LETTER SHORT U - u'\u045f' # 0xFF -> CYRILLIC SMALL LETTER DZHE + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u0401' # 0xA1 -> CYRILLIC CAPITAL LETTER IO + u'\u0402' # 0xA2 -> CYRILLIC CAPITAL LETTER DJE + u'\u0403' # 0xA3 -> CYRILLIC CAPITAL LETTER GJE + u'\u0404' # 0xA4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u0405' # 0xA5 -> CYRILLIC CAPITAL LETTER DZE + u'\u0406' # 0xA6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0407' # 0xA7 -> CYRILLIC CAPITAL LETTER YI + u'\u0408' # 0xA8 -> CYRILLIC CAPITAL LETTER JE + u'\u0409' # 0xA9 -> CYRILLIC CAPITAL LETTER LJE + u'\u040a' # 0xAA -> CYRILLIC CAPITAL LETTER NJE + u'\u040b' # 0xAB -> CYRILLIC CAPITAL LETTER TSHE + u'\u040c' # 0xAC -> CYRILLIC CAPITAL LETTER KJE + u'\xad' # 0xAD -> SOFT HYPHEN + u'\u040e' # 0xAE -> CYRILLIC CAPITAL LETTER SHORT U + u'\u040f' # 0xAF -> CYRILLIC CAPITAL LETTER DZHE + u'\u0410' # 0xB0 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0xB1 -> CYRILLIC CAPITAL LETTER BE + u'\u0412' # 0xB2 -> CYRILLIC CAPITAL LETTER VE + u'\u0413' # 0xB3 -> CYRILLIC CAPITAL LETTER GHE + u'\u0414' # 0xB4 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0xB5 -> CYRILLIC CAPITAL LETTER IE + u'\u0416' # 0xB6 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0417' # 0xB7 -> CYRILLIC CAPITAL LETTER ZE + u'\u0418' # 0xB8 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0xB9 -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0xBA -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0xBB -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0xBC -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0xBD -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0xBE -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0xBF -> CYRILLIC CAPITAL LETTER PE + u'\u0420' # 0xC0 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0xC1 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0xC2 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0xC3 -> CYRILLIC CAPITAL LETTER U + u'\u0424' # 0xC4 -> CYRILLIC CAPITAL LETTER EF + u'\u0425' # 0xC5 -> CYRILLIC CAPITAL LETTER HA + u'\u0426' # 0xC6 -> CYRILLIC CAPITAL LETTER TSE + u'\u0427' # 0xC7 -> CYRILLIC CAPITAL LETTER CHE + u'\u0428' # 0xC8 -> CYRILLIC CAPITAL LETTER SHA + u'\u0429' # 0xC9 -> CYRILLIC CAPITAL LETTER SHCHA + u'\u042a' # 0xCA -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u042b' # 0xCB -> CYRILLIC CAPITAL LETTER YERU + u'\u042c' # 0xCC -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042d' # 0xCD -> CYRILLIC CAPITAL LETTER E + u'\u042e' # 0xCE -> CYRILLIC CAPITAL LETTER YU + u'\u042f' # 0xCF -> CYRILLIC CAPITAL LETTER YA + u'\u0430' # 0xD0 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xD1 -> CYRILLIC SMALL LETTER BE + u'\u0432' # 0xD2 -> CYRILLIC SMALL LETTER VE + u'\u0433' # 0xD3 -> CYRILLIC SMALL LETTER GHE + u'\u0434' # 0xD4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xD5 -> CYRILLIC SMALL LETTER IE + u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + u'\u0437' # 0xD7 -> CYRILLIC SMALL LETTER ZE + u'\u0438' # 0xD8 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xD9 -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xDA -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xDB -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xDC -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xDD -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xDE -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xDF -> CYRILLIC SMALL LETTER PE + u'\u0440' # 0xE0 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xE1 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xE2 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xE3 -> CYRILLIC SMALL LETTER U + u'\u0444' # 0xE4 -> CYRILLIC SMALL LETTER EF + u'\u0445' # 0xE5 -> CYRILLIC SMALL LETTER HA + u'\u0446' # 0xE6 -> CYRILLIC SMALL LETTER TSE + u'\u0447' # 0xE7 -> CYRILLIC SMALL LETTER CHE + u'\u0448' # 0xE8 -> CYRILLIC SMALL LETTER SHA + u'\u0449' # 0xE9 -> CYRILLIC SMALL LETTER SHCHA + u'\u044a' # 0xEA -> CYRILLIC SMALL LETTER HARD SIGN + u'\u044b' # 0xEB -> CYRILLIC SMALL LETTER YERU + u'\u044c' # 0xEC -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044d' # 0xED -> CYRILLIC SMALL LETTER E + u'\u044e' # 0xEE -> CYRILLIC SMALL LETTER YU + u'\u044f' # 0xEF -> CYRILLIC SMALL LETTER YA + u'\u2116' # 0xF0 -> NUMERO SIGN + u'\u0451' # 0xF1 -> CYRILLIC SMALL LETTER IO + u'\u0452' # 0xF2 -> CYRILLIC SMALL LETTER DJE + u'\u0453' # 0xF3 -> CYRILLIC SMALL LETTER GJE + u'\u0454' # 0xF4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u0455' # 0xF5 -> CYRILLIC SMALL LETTER DZE + u'\u0456' # 0xF6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0457' # 0xF7 -> CYRILLIC SMALL LETTER YI + u'\u0458' # 0xF8 -> CYRILLIC SMALL LETTER JE + u'\u0459' # 0xF9 -> CYRILLIC SMALL LETTER LJE + u'\u045a' # 0xFA -> CYRILLIC SMALL LETTER NJE + u'\u045b' # 0xFB -> CYRILLIC SMALL LETTER TSHE + u'\u045c' # 0xFC -> CYRILLIC SMALL LETTER KJE + u'\xa7' # 0xFD -> SECTION SIGN + u'\u045e' # 0xFE -> CYRILLIC SMALL LETTER SHORT U + u'\u045f' # 0xFF -> CYRILLIC SMALL LETTER DZHE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A7: 0xFD, # SECTION SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x0401: 0xA1, # CYRILLIC CAPITAL LETTER IO - 0x0402: 0xA2, # CYRILLIC CAPITAL LETTER DJE - 0x0403: 0xA3, # CYRILLIC CAPITAL LETTER GJE - 0x0404: 0xA4, # CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x0405: 0xA5, # CYRILLIC CAPITAL LETTER DZE - 0x0406: 0xA6, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0407: 0xA7, # CYRILLIC CAPITAL LETTER YI - 0x0408: 0xA8, # CYRILLIC CAPITAL LETTER JE - 0x0409: 0xA9, # CYRILLIC CAPITAL LETTER LJE - 0x040A: 0xAA, # CYRILLIC CAPITAL LETTER NJE - 0x040B: 0xAB, # CYRILLIC CAPITAL LETTER TSHE - 0x040C: 0xAC, # CYRILLIC CAPITAL LETTER KJE - 0x040E: 0xAE, # CYRILLIC CAPITAL LETTER SHORT U - 0x040F: 0xAF, # CYRILLIC CAPITAL LETTER DZHE - 0x0410: 0xB0, # CYRILLIC CAPITAL LETTER A - 0x0411: 0xB1, # CYRILLIC CAPITAL LETTER BE - 0x0412: 0xB2, # CYRILLIC CAPITAL LETTER VE - 0x0413: 0xB3, # CYRILLIC CAPITAL LETTER GHE - 0x0414: 0xB4, # CYRILLIC CAPITAL LETTER DE - 0x0415: 0xB5, # CYRILLIC CAPITAL LETTER IE - 0x0416: 0xB6, # CYRILLIC CAPITAL LETTER ZHE - 0x0417: 0xB7, # CYRILLIC CAPITAL LETTER ZE - 0x0418: 0xB8, # CYRILLIC CAPITAL LETTER I - 0x0419: 0xB9, # CYRILLIC CAPITAL LETTER SHORT I - 0x041A: 0xBA, # CYRILLIC CAPITAL LETTER KA - 0x041B: 0xBB, # CYRILLIC CAPITAL LETTER EL - 0x041C: 0xBC, # CYRILLIC CAPITAL LETTER EM - 0x041D: 0xBD, # CYRILLIC CAPITAL LETTER EN - 0x041E: 0xBE, # CYRILLIC CAPITAL LETTER O - 0x041F: 0xBF, # CYRILLIC CAPITAL LETTER PE - 0x0420: 0xC0, # CYRILLIC CAPITAL LETTER ER - 0x0421: 0xC1, # CYRILLIC CAPITAL LETTER ES - 0x0422: 0xC2, # CYRILLIC CAPITAL LETTER TE - 0x0423: 0xC3, # CYRILLIC CAPITAL LETTER U - 0x0424: 0xC4, # CYRILLIC CAPITAL LETTER EF - 0x0425: 0xC5, # CYRILLIC CAPITAL LETTER HA - 0x0426: 0xC6, # CYRILLIC CAPITAL LETTER TSE - 0x0427: 0xC7, # CYRILLIC CAPITAL LETTER CHE - 0x0428: 0xC8, # CYRILLIC CAPITAL LETTER SHA - 0x0429: 0xC9, # CYRILLIC CAPITAL LETTER SHCHA - 0x042A: 0xCA, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x042B: 0xCB, # CYRILLIC CAPITAL LETTER YERU - 0x042C: 0xCC, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x042D: 0xCD, # CYRILLIC CAPITAL LETTER E - 0x042E: 0xCE, # CYRILLIC CAPITAL LETTER YU - 0x042F: 0xCF, # CYRILLIC CAPITAL LETTER YA - 0x0430: 0xD0, # CYRILLIC SMALL LETTER A - 0x0431: 0xD1, # CYRILLIC SMALL LETTER BE - 0x0432: 0xD2, # CYRILLIC SMALL LETTER VE - 0x0433: 0xD3, # CYRILLIC SMALL LETTER GHE - 0x0434: 0xD4, # CYRILLIC SMALL LETTER DE - 0x0435: 0xD5, # CYRILLIC SMALL LETTER IE - 0x0436: 0xD6, # CYRILLIC SMALL LETTER ZHE - 0x0437: 0xD7, # CYRILLIC SMALL LETTER ZE - 0x0438: 0xD8, # CYRILLIC SMALL LETTER I - 0x0439: 0xD9, # CYRILLIC SMALL LETTER SHORT I - 0x043A: 0xDA, # CYRILLIC SMALL LETTER KA - 0x043B: 0xDB, # CYRILLIC SMALL LETTER EL - 0x043C: 0xDC, # CYRILLIC SMALL LETTER EM - 0x043D: 0xDD, # CYRILLIC SMALL LETTER EN - 0x043E: 0xDE, # CYRILLIC SMALL LETTER O - 0x043F: 0xDF, # CYRILLIC SMALL LETTER PE - 0x0440: 0xE0, # CYRILLIC SMALL LETTER ER - 0x0441: 0xE1, # CYRILLIC SMALL LETTER ES - 0x0442: 0xE2, # CYRILLIC SMALL LETTER TE - 0x0443: 0xE3, # CYRILLIC SMALL LETTER U - 0x0444: 0xE4, # CYRILLIC SMALL LETTER EF - 0x0445: 0xE5, # CYRILLIC SMALL LETTER HA - 0x0446: 0xE6, # CYRILLIC SMALL LETTER TSE - 0x0447: 0xE7, # CYRILLIC SMALL LETTER CHE - 0x0448: 0xE8, # CYRILLIC SMALL LETTER SHA - 0x0449: 0xE9, # CYRILLIC SMALL LETTER SHCHA - 0x044A: 0xEA, # CYRILLIC SMALL LETTER HARD SIGN - 0x044B: 0xEB, # CYRILLIC SMALL LETTER YERU - 0x044C: 0xEC, # CYRILLIC SMALL LETTER SOFT SIGN - 0x044D: 0xED, # CYRILLIC SMALL LETTER E - 0x044E: 0xEE, # CYRILLIC SMALL LETTER YU - 0x044F: 0xEF, # CYRILLIC SMALL LETTER YA - 0x0451: 0xF1, # CYRILLIC SMALL LETTER IO - 0x0452: 0xF2, # CYRILLIC SMALL LETTER DJE - 0x0453: 0xF3, # CYRILLIC SMALL LETTER GJE - 0x0454: 0xF4, # CYRILLIC SMALL LETTER UKRAINIAN IE - 0x0455: 0xF5, # CYRILLIC SMALL LETTER DZE - 0x0456: 0xF6, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0457: 0xF7, # CYRILLIC SMALL LETTER YI - 0x0458: 0xF8, # CYRILLIC SMALL LETTER JE - 0x0459: 0xF9, # CYRILLIC SMALL LETTER LJE - 0x045A: 0xFA, # CYRILLIC SMALL LETTER NJE - 0x045B: 0xFB, # CYRILLIC SMALL LETTER TSHE - 0x045C: 0xFC, # CYRILLIC SMALL LETTER KJE - 0x045E: 0xFE, # CYRILLIC SMALL LETTER SHORT U - 0x045F: 0xFF, # CYRILLIC SMALL LETTER DZHE - 0x2116: 0xF0, # NUMERO SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A7: 0xFD, # SECTION SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x0401: 0xA1, # CYRILLIC CAPITAL LETTER IO + 0x0402: 0xA2, # CYRILLIC CAPITAL LETTER DJE + 0x0403: 0xA3, # CYRILLIC CAPITAL LETTER GJE + 0x0404: 0xA4, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0405: 0xA5, # CYRILLIC CAPITAL LETTER DZE + 0x0406: 0xA6, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0xA7, # CYRILLIC CAPITAL LETTER YI + 0x0408: 0xA8, # CYRILLIC CAPITAL LETTER JE + 0x0409: 0xA9, # CYRILLIC CAPITAL LETTER LJE + 0x040A: 0xAA, # CYRILLIC CAPITAL LETTER NJE + 0x040B: 0xAB, # CYRILLIC CAPITAL LETTER TSHE + 0x040C: 0xAC, # CYRILLIC CAPITAL LETTER KJE + 0x040E: 0xAE, # CYRILLIC CAPITAL LETTER SHORT U + 0x040F: 0xAF, # CYRILLIC CAPITAL LETTER DZHE + 0x0410: 0xB0, # CYRILLIC CAPITAL LETTER A + 0x0411: 0xB1, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0xB2, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0xB3, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0xB4, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0xB5, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0xB6, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0xB7, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0xB8, # CYRILLIC CAPITAL LETTER I + 0x0419: 0xB9, # CYRILLIC CAPITAL LETTER SHORT I + 0x041A: 0xBA, # CYRILLIC CAPITAL LETTER KA + 0x041B: 0xBB, # CYRILLIC CAPITAL LETTER EL + 0x041C: 0xBC, # CYRILLIC CAPITAL LETTER EM + 0x041D: 0xBD, # CYRILLIC CAPITAL LETTER EN + 0x041E: 0xBE, # CYRILLIC CAPITAL LETTER O + 0x041F: 0xBF, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0xC0, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0xC1, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0xC2, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0xC3, # CYRILLIC CAPITAL LETTER U + 0x0424: 0xC4, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0xC5, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0xC6, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0xC7, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0xC8, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0xC9, # CYRILLIC CAPITAL LETTER SHCHA + 0x042A: 0xCA, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042B: 0xCB, # CYRILLIC CAPITAL LETTER YERU + 0x042C: 0xCC, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042D: 0xCD, # CYRILLIC CAPITAL LETTER E + 0x042E: 0xCE, # CYRILLIC CAPITAL LETTER YU + 0x042F: 0xCF, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0xD0, # CYRILLIC SMALL LETTER A + 0x0431: 0xD1, # CYRILLIC SMALL LETTER BE + 0x0432: 0xD2, # CYRILLIC SMALL LETTER VE + 0x0433: 0xD3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0xD4, # CYRILLIC SMALL LETTER DE + 0x0435: 0xD5, # CYRILLIC SMALL LETTER IE + 0x0436: 0xD6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0xD7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0xD8, # CYRILLIC SMALL LETTER I + 0x0439: 0xD9, # CYRILLIC SMALL LETTER SHORT I + 0x043A: 0xDA, # CYRILLIC SMALL LETTER KA + 0x043B: 0xDB, # CYRILLIC SMALL LETTER EL + 0x043C: 0xDC, # CYRILLIC SMALL LETTER EM + 0x043D: 0xDD, # CYRILLIC SMALL LETTER EN + 0x043E: 0xDE, # CYRILLIC SMALL LETTER O + 0x043F: 0xDF, # CYRILLIC SMALL LETTER PE + 0x0440: 0xE0, # CYRILLIC SMALL LETTER ER + 0x0441: 0xE1, # CYRILLIC SMALL LETTER ES + 0x0442: 0xE2, # CYRILLIC SMALL LETTER TE + 0x0443: 0xE3, # CYRILLIC SMALL LETTER U + 0x0444: 0xE4, # CYRILLIC SMALL LETTER EF + 0x0445: 0xE5, # CYRILLIC SMALL LETTER HA + 0x0446: 0xE6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0xE7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0xE8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0xE9, # CYRILLIC SMALL LETTER SHCHA + 0x044A: 0xEA, # CYRILLIC SMALL LETTER HARD SIGN + 0x044B: 0xEB, # CYRILLIC SMALL LETTER YERU + 0x044C: 0xEC, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044D: 0xED, # CYRILLIC SMALL LETTER E + 0x044E: 0xEE, # CYRILLIC SMALL LETTER YU + 0x044F: 0xEF, # CYRILLIC SMALL LETTER YA + 0x0451: 0xF1, # CYRILLIC SMALL LETTER IO + 0x0452: 0xF2, # CYRILLIC SMALL LETTER DJE + 0x0453: 0xF3, # CYRILLIC SMALL LETTER GJE + 0x0454: 0xF4, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0455: 0xF5, # CYRILLIC SMALL LETTER DZE + 0x0456: 0xF6, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0xF7, # CYRILLIC SMALL LETTER YI + 0x0458: 0xF8, # CYRILLIC SMALL LETTER JE + 0x0459: 0xF9, # CYRILLIC SMALL LETTER LJE + 0x045A: 0xFA, # CYRILLIC SMALL LETTER NJE + 0x045B: 0xFB, # CYRILLIC SMALL LETTER TSHE + 0x045C: 0xFC, # CYRILLIC SMALL LETTER KJE + 0x045E: 0xFE, # CYRILLIC SMALL LETTER SHORT U + 0x045F: 0xFF, # CYRILLIC SMALL LETTER DZHE + 0x2116: 0xF0, # NUMERO SIGN } - Modified: python/trunk/Lib/encodings/iso8859_6.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_6.py (original) +++ python/trunk/Lib/encodings/iso8859_6.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,171 +32,171 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\ufffe' - u'\ufffe' - u'\ufffe' - u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\xa4' # 0xA4 -> CURRENCY SIGN u'\ufffe' u'\ufffe' u'\ufffe' @@ -204,8 +204,8 @@ u'\ufffe' u'\ufffe' u'\ufffe' - u'\u060c' # 0xAC -> ARABIC COMMA - u'\xad' # 0xAD -> SOFT HYPHEN + u'\u060c' # 0xAC -> ARABIC COMMA + u'\xad' # 0xAD -> SOFT HYPHEN u'\ufffe' u'\ufffe' u'\ufffe' @@ -219,62 +219,62 @@ u'\ufffe' u'\ufffe' u'\ufffe' - u'\u061b' # 0xBB -> ARABIC SEMICOLON - u'\ufffe' - u'\ufffe' - u'\ufffe' - u'\u061f' # 0xBF -> ARABIC QUESTION MARK - u'\ufffe' - u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA - u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE - u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE - u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE - u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW - u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE - u'\u0627' # 0xC7 -> ARABIC LETTER ALEF - u'\u0628' # 0xC8 -> ARABIC LETTER BEH - u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA - u'\u062a' # 0xCA -> ARABIC LETTER TEH - u'\u062b' # 0xCB -> ARABIC LETTER THEH - u'\u062c' # 0xCC -> ARABIC LETTER JEEM - u'\u062d' # 0xCD -> ARABIC LETTER HAH - u'\u062e' # 0xCE -> ARABIC LETTER KHAH - u'\u062f' # 0xCF -> ARABIC LETTER DAL - u'\u0630' # 0xD0 -> ARABIC LETTER THAL - u'\u0631' # 0xD1 -> ARABIC LETTER REH - u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN - u'\u0633' # 0xD3 -> ARABIC LETTER SEEN - u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN - u'\u0635' # 0xD5 -> ARABIC LETTER SAD - u'\u0636' # 0xD6 -> ARABIC LETTER DAD - u'\u0637' # 0xD7 -> ARABIC LETTER TAH - u'\u0638' # 0xD8 -> ARABIC LETTER ZAH - u'\u0639' # 0xD9 -> ARABIC LETTER AIN - u'\u063a' # 0xDA -> ARABIC LETTER GHAIN + u'\u061b' # 0xBB -> ARABIC SEMICOLON + u'\ufffe' + u'\ufffe' + u'\ufffe' + u'\u061f' # 0xBF -> ARABIC QUESTION MARK + u'\ufffe' + u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA + u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0xC7 -> ARABIC LETTER ALEF + u'\u0628' # 0xC8 -> ARABIC LETTER BEH + u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0xCA -> ARABIC LETTER TEH + u'\u062b' # 0xCB -> ARABIC LETTER THEH + u'\u062c' # 0xCC -> ARABIC LETTER JEEM + u'\u062d' # 0xCD -> ARABIC LETTER HAH + u'\u062e' # 0xCE -> ARABIC LETTER KHAH + u'\u062f' # 0xCF -> ARABIC LETTER DAL + u'\u0630' # 0xD0 -> ARABIC LETTER THAL + u'\u0631' # 0xD1 -> ARABIC LETTER REH + u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN + u'\u0633' # 0xD3 -> ARABIC LETTER SEEN + u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN + u'\u0635' # 0xD5 -> ARABIC LETTER SAD + u'\u0636' # 0xD6 -> ARABIC LETTER DAD + u'\u0637' # 0xD7 -> ARABIC LETTER TAH + u'\u0638' # 0xD8 -> ARABIC LETTER ZAH + u'\u0639' # 0xD9 -> ARABIC LETTER AIN + u'\u063a' # 0xDA -> ARABIC LETTER GHAIN u'\ufffe' u'\ufffe' u'\ufffe' u'\ufffe' u'\ufffe' - u'\u0640' # 0xE0 -> ARABIC TATWEEL - u'\u0641' # 0xE1 -> ARABIC LETTER FEH - u'\u0642' # 0xE2 -> ARABIC LETTER QAF - u'\u0643' # 0xE3 -> ARABIC LETTER KAF - u'\u0644' # 0xE4 -> ARABIC LETTER LAM - u'\u0645' # 0xE5 -> ARABIC LETTER MEEM - u'\u0646' # 0xE6 -> ARABIC LETTER NOON - u'\u0647' # 0xE7 -> ARABIC LETTER HEH - u'\u0648' # 0xE8 -> ARABIC LETTER WAW - u'\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA - u'\u064a' # 0xEA -> ARABIC LETTER YEH - u'\u064b' # 0xEB -> ARABIC FATHATAN - u'\u064c' # 0xEC -> ARABIC DAMMATAN - u'\u064d' # 0xED -> ARABIC KASRATAN - u'\u064e' # 0xEE -> ARABIC FATHA - u'\u064f' # 0xEF -> ARABIC DAMMA - u'\u0650' # 0xF0 -> ARABIC KASRA - u'\u0651' # 0xF1 -> ARABIC SHADDA - u'\u0652' # 0xF2 -> ARABIC SUKUN + u'\u0640' # 0xE0 -> ARABIC TATWEEL + u'\u0641' # 0xE1 -> ARABIC LETTER FEH + u'\u0642' # 0xE2 -> ARABIC LETTER QAF + u'\u0643' # 0xE3 -> ARABIC LETTER KAF + u'\u0644' # 0xE4 -> ARABIC LETTER LAM + u'\u0645' # 0xE5 -> ARABIC LETTER MEEM + u'\u0646' # 0xE6 -> ARABIC LETTER NOON + u'\u0647' # 0xE7 -> ARABIC LETTER HEH + u'\u0648' # 0xE8 -> ARABIC LETTER WAW + u'\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0xEA -> ARABIC LETTER YEH + u'\u064b' # 0xEB -> ARABIC FATHATAN + u'\u064c' # 0xEC -> ARABIC DAMMATAN + u'\u064d' # 0xED -> ARABIC KASRATAN + u'\u064e' # 0xEE -> ARABIC FATHA + u'\u064f' # 0xEF -> ARABIC DAMMA + u'\u0650' # 0xF0 -> ARABIC KASRA + u'\u0651' # 0xF1 -> ARABIC SHADDA + u'\u0652' # 0xF2 -> ARABIC SUKUN u'\ufffe' u'\ufffe' u'\ufffe' @@ -293,216 +293,215 @@ ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x060C: 0xAC, # ARABIC COMMA - 0x061B: 0xBB, # ARABIC SEMICOLON - 0x061F: 0xBF, # ARABIC QUESTION MARK - 0x0621: 0xC1, # ARABIC LETTER HAMZA - 0x0622: 0xC2, # ARABIC LETTER ALEF WITH MADDA ABOVE - 0x0623: 0xC3, # ARABIC LETTER ALEF WITH HAMZA ABOVE - 0x0624: 0xC4, # ARABIC LETTER WAW WITH HAMZA ABOVE - 0x0625: 0xC5, # ARABIC LETTER ALEF WITH HAMZA BELOW - 0x0626: 0xC6, # ARABIC LETTER YEH WITH HAMZA ABOVE - 0x0627: 0xC7, # ARABIC LETTER ALEF - 0x0628: 0xC8, # ARABIC LETTER BEH - 0x0629: 0xC9, # ARABIC LETTER TEH MARBUTA - 0x062A: 0xCA, # ARABIC LETTER TEH - 0x062B: 0xCB, # ARABIC LETTER THEH - 0x062C: 0xCC, # ARABIC LETTER JEEM - 0x062D: 0xCD, # ARABIC LETTER HAH - 0x062E: 0xCE, # ARABIC LETTER KHAH - 0x062F: 0xCF, # ARABIC LETTER DAL - 0x0630: 0xD0, # ARABIC LETTER THAL - 0x0631: 0xD1, # ARABIC LETTER REH - 0x0632: 0xD2, # ARABIC LETTER ZAIN - 0x0633: 0xD3, # ARABIC LETTER SEEN - 0x0634: 0xD4, # ARABIC LETTER SHEEN - 0x0635: 0xD5, # ARABIC LETTER SAD - 0x0636: 0xD6, # ARABIC LETTER DAD - 0x0637: 0xD7, # ARABIC LETTER TAH - 0x0638: 0xD8, # ARABIC LETTER ZAH - 0x0639: 0xD9, # ARABIC LETTER AIN - 0x063A: 0xDA, # ARABIC LETTER GHAIN - 0x0640: 0xE0, # ARABIC TATWEEL - 0x0641: 0xE1, # ARABIC LETTER FEH - 0x0642: 0xE2, # ARABIC LETTER QAF - 0x0643: 0xE3, # ARABIC LETTER KAF - 0x0644: 0xE4, # ARABIC LETTER LAM - 0x0645: 0xE5, # ARABIC LETTER MEEM - 0x0646: 0xE6, # ARABIC LETTER NOON - 0x0647: 0xE7, # ARABIC LETTER HEH - 0x0648: 0xE8, # ARABIC LETTER WAW - 0x0649: 0xE9, # ARABIC LETTER ALEF MAKSURA - 0x064A: 0xEA, # ARABIC LETTER YEH - 0x064B: 0xEB, # ARABIC FATHATAN - 0x064C: 0xEC, # ARABIC DAMMATAN - 0x064D: 0xED, # ARABIC KASRATAN - 0x064E: 0xEE, # ARABIC FATHA - 0x064F: 0xEF, # ARABIC DAMMA - 0x0650: 0xF0, # ARABIC KASRA - 0x0651: 0xF1, # ARABIC SHADDA - 0x0652: 0xF2, # ARABIC SUKUN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x060C: 0xAC, # ARABIC COMMA + 0x061B: 0xBB, # ARABIC SEMICOLON + 0x061F: 0xBF, # ARABIC QUESTION MARK + 0x0621: 0xC1, # ARABIC LETTER HAMZA + 0x0622: 0xC2, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x0623: 0xC3, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x0624: 0xC4, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x0625: 0xC5, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x0626: 0xC6, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x0627: 0xC7, # ARABIC LETTER ALEF + 0x0628: 0xC8, # ARABIC LETTER BEH + 0x0629: 0xC9, # ARABIC LETTER TEH MARBUTA + 0x062A: 0xCA, # ARABIC LETTER TEH + 0x062B: 0xCB, # ARABIC LETTER THEH + 0x062C: 0xCC, # ARABIC LETTER JEEM + 0x062D: 0xCD, # ARABIC LETTER HAH + 0x062E: 0xCE, # ARABIC LETTER KHAH + 0x062F: 0xCF, # ARABIC LETTER DAL + 0x0630: 0xD0, # ARABIC LETTER THAL + 0x0631: 0xD1, # ARABIC LETTER REH + 0x0632: 0xD2, # ARABIC LETTER ZAIN + 0x0633: 0xD3, # ARABIC LETTER SEEN + 0x0634: 0xD4, # ARABIC LETTER SHEEN + 0x0635: 0xD5, # ARABIC LETTER SAD + 0x0636: 0xD6, # ARABIC LETTER DAD + 0x0637: 0xD7, # ARABIC LETTER TAH + 0x0638: 0xD8, # ARABIC LETTER ZAH + 0x0639: 0xD9, # ARABIC LETTER AIN + 0x063A: 0xDA, # ARABIC LETTER GHAIN + 0x0640: 0xE0, # ARABIC TATWEEL + 0x0641: 0xE1, # ARABIC LETTER FEH + 0x0642: 0xE2, # ARABIC LETTER QAF + 0x0643: 0xE3, # ARABIC LETTER KAF + 0x0644: 0xE4, # ARABIC LETTER LAM + 0x0645: 0xE5, # ARABIC LETTER MEEM + 0x0646: 0xE6, # ARABIC LETTER NOON + 0x0647: 0xE7, # ARABIC LETTER HEH + 0x0648: 0xE8, # ARABIC LETTER WAW + 0x0649: 0xE9, # ARABIC LETTER ALEF MAKSURA + 0x064A: 0xEA, # ARABIC LETTER YEH + 0x064B: 0xEB, # ARABIC FATHATAN + 0x064C: 0xEC, # ARABIC DAMMATAN + 0x064D: 0xED, # ARABIC KASRATAN + 0x064E: 0xEE, # ARABIC FATHA + 0x064F: 0xEF, # ARABIC DAMMA + 0x0650: 0xF0, # ARABIC KASRA + 0x0651: 0xF1, # ARABIC SHADDA + 0x0652: 0xF2, # ARABIC SUKUN } - Modified: python/trunk/Lib/encodings/iso8859_7.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_7.py (original) +++ python/trunk/Lib/encodings/iso8859_7.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,519 +32,518 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\u2018' # 0xA1 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xA2 -> RIGHT SINGLE QUOTATION MARK - u'\xa3' # 0xA3 -> POUND SIGN - u'\u20ac' # 0xA4 -> EURO SIGN - u'\u20af' # 0xA5 -> DRACHMA SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u037a' # 0xAA -> GREEK YPOGEGRAMMENI - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\u2018' # 0xA1 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xA2 -> RIGHT SINGLE QUOTATION MARK + u'\xa3' # 0xA3 -> POUND SIGN + u'\u20ac' # 0xA4 -> EURO SIGN + u'\u20af' # 0xA5 -> DRACHMA SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u037a' # 0xAA -> GREEK YPOGEGRAMMENI + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN u'\ufffe' - u'\u2015' # 0xAF -> HORIZONTAL BAR - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\u0384' # 0xB4 -> GREEK TONOS - u'\u0385' # 0xB5 -> GREEK DIALYTIKA TONOS - u'\u0386' # 0xB6 -> GREEK CAPITAL LETTER ALPHA WITH TONOS - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS - u'\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS - u'\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS - u'\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS - u'\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - u'\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA - u'\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA - u'\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA - u'\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA - u'\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON - u'\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA - u'\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA - u'\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA - u'\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA - u'\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA - u'\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA - u'\u039c' # 0xCC -> GREEK CAPITAL LETTER MU - u'\u039d' # 0xCD -> GREEK CAPITAL LETTER NU - u'\u039e' # 0xCE -> GREEK CAPITAL LETTER XI - u'\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON - u'\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI - u'\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + u'\u2015' # 0xAF -> HORIZONTAL BAR + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\u0384' # 0xB4 -> GREEK TONOS + u'\u0385' # 0xB5 -> GREEK DIALYTIKA TONOS + u'\u0386' # 0xB6 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + u'\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + u'\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + u'\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + u'\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + u'\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + u'\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + u'\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + u'\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + u'\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + u'\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + u'\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + u'\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + u'\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO u'\ufffe' - u'\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA - u'\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU - u'\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON - u'\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI - u'\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI - u'\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI - u'\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA - u'\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - u'\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - u'\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS - u'\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS - u'\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS - u'\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS - u'\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA - u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA - u'\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA - u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA - u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON - u'\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA - u'\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA - u'\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA - u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA - u'\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA - u'\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA - u'\u03bc' # 0xEC -> GREEK SMALL LETTER MU - u'\u03bd' # 0xED -> GREEK SMALL LETTER NU - u'\u03be' # 0xEE -> GREEK SMALL LETTER XI - u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON - u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI - u'\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO - u'\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA - u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA - u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU - u'\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON - u'\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI - u'\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI - u'\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI - u'\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA - u'\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA - u'\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA - u'\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS - u'\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS - u'\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + u'\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + u'\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + u'\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + u'\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + u'\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + u'\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + u'\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + u'\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + u'\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + u'\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + u'\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0xEC -> GREEK SMALL LETTER MU + u'\u03bd' # 0xED -> GREEK SMALL LETTER NU + u'\u03be' # 0xEE -> GREEK SMALL LETTER XI + u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + u'\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + u'\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + u'\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + u'\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + u'\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + u'\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + u'\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + u'\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS u'\ufffe' ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A3: 0xA3, # POUND SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B7: 0xB7, # MIDDLE DOT - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x037A: 0xAA, # GREEK YPOGEGRAMMENI - 0x0384: 0xB4, # GREEK TONOS - 0x0385: 0xB5, # GREEK DIALYTIKA TONOS - 0x0386: 0xB6, # GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x0388: 0xB8, # GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x0389: 0xB9, # GREEK CAPITAL LETTER ETA WITH TONOS - 0x038A: 0xBA, # GREEK CAPITAL LETTER IOTA WITH TONOS - 0x038C: 0xBC, # GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x038E: 0xBE, # GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x038F: 0xBF, # GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x0390: 0xC0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - 0x0391: 0xC1, # GREEK CAPITAL LETTER ALPHA - 0x0392: 0xC2, # GREEK CAPITAL LETTER BETA - 0x0393: 0xC3, # GREEK CAPITAL LETTER GAMMA - 0x0394: 0xC4, # GREEK CAPITAL LETTER DELTA - 0x0395: 0xC5, # GREEK CAPITAL LETTER EPSILON - 0x0396: 0xC6, # GREEK CAPITAL LETTER ZETA - 0x0397: 0xC7, # GREEK CAPITAL LETTER ETA - 0x0398: 0xC8, # GREEK CAPITAL LETTER THETA - 0x0399: 0xC9, # GREEK CAPITAL LETTER IOTA - 0x039A: 0xCA, # GREEK CAPITAL LETTER KAPPA - 0x039B: 0xCB, # GREEK CAPITAL LETTER LAMDA - 0x039C: 0xCC, # GREEK CAPITAL LETTER MU - 0x039D: 0xCD, # GREEK CAPITAL LETTER NU - 0x039E: 0xCE, # GREEK CAPITAL LETTER XI - 0x039F: 0xCF, # GREEK CAPITAL LETTER OMICRON - 0x03A0: 0xD0, # GREEK CAPITAL LETTER PI - 0x03A1: 0xD1, # GREEK CAPITAL LETTER RHO - 0x03A3: 0xD3, # GREEK CAPITAL LETTER SIGMA - 0x03A4: 0xD4, # GREEK CAPITAL LETTER TAU - 0x03A5: 0xD5, # GREEK CAPITAL LETTER UPSILON - 0x03A6: 0xD6, # GREEK CAPITAL LETTER PHI - 0x03A7: 0xD7, # GREEK CAPITAL LETTER CHI - 0x03A8: 0xD8, # GREEK CAPITAL LETTER PSI - 0x03A9: 0xD9, # GREEK CAPITAL LETTER OMEGA - 0x03AA: 0xDA, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x03AB: 0xDB, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x03AC: 0xDC, # GREEK SMALL LETTER ALPHA WITH TONOS - 0x03AD: 0xDD, # GREEK SMALL LETTER EPSILON WITH TONOS - 0x03AE: 0xDE, # GREEK SMALL LETTER ETA WITH TONOS - 0x03AF: 0xDF, # GREEK SMALL LETTER IOTA WITH TONOS - 0x03B0: 0xE0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - 0x03B1: 0xE1, # GREEK SMALL LETTER ALPHA - 0x03B2: 0xE2, # GREEK SMALL LETTER BETA - 0x03B3: 0xE3, # GREEK SMALL LETTER GAMMA - 0x03B4: 0xE4, # GREEK SMALL LETTER DELTA - 0x03B5: 0xE5, # GREEK SMALL LETTER EPSILON - 0x03B6: 0xE6, # GREEK SMALL LETTER ZETA - 0x03B7: 0xE7, # GREEK SMALL LETTER ETA - 0x03B8: 0xE8, # GREEK SMALL LETTER THETA - 0x03B9: 0xE9, # GREEK SMALL LETTER IOTA - 0x03BA: 0xEA, # GREEK SMALL LETTER KAPPA - 0x03BB: 0xEB, # GREEK SMALL LETTER LAMDA - 0x03BC: 0xEC, # GREEK SMALL LETTER MU - 0x03BD: 0xED, # GREEK SMALL LETTER NU - 0x03BE: 0xEE, # GREEK SMALL LETTER XI - 0x03BF: 0xEF, # GREEK SMALL LETTER OMICRON - 0x03C0: 0xF0, # GREEK SMALL LETTER PI - 0x03C1: 0xF1, # GREEK SMALL LETTER RHO - 0x03C2: 0xF2, # GREEK SMALL LETTER FINAL SIGMA - 0x03C3: 0xF3, # GREEK SMALL LETTER SIGMA - 0x03C4: 0xF4, # GREEK SMALL LETTER TAU - 0x03C5: 0xF5, # GREEK SMALL LETTER UPSILON - 0x03C6: 0xF6, # GREEK SMALL LETTER PHI - 0x03C7: 0xF7, # GREEK SMALL LETTER CHI - 0x03C8: 0xF8, # GREEK SMALL LETTER PSI - 0x03C9: 0xF9, # GREEK SMALL LETTER OMEGA - 0x03CA: 0xFA, # GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x03CB: 0xFB, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x03CC: 0xFC, # GREEK SMALL LETTER OMICRON WITH TONOS - 0x03CD: 0xFD, # GREEK SMALL LETTER UPSILON WITH TONOS - 0x03CE: 0xFE, # GREEK SMALL LETTER OMEGA WITH TONOS - 0x2015: 0xAF, # HORIZONTAL BAR - 0x2018: 0xA1, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xA2, # RIGHT SINGLE QUOTATION MARK - 0x20AC: 0xA4, # EURO SIGN - 0x20AF: 0xA5, # DRACHMA SIGN + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A3: 0xA3, # POUND SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B7: 0xB7, # MIDDLE DOT + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x037A: 0xAA, # GREEK YPOGEGRAMMENI + 0x0384: 0xB4, # GREEK TONOS + 0x0385: 0xB5, # GREEK DIALYTIKA TONOS + 0x0386: 0xB6, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0xB8, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0xB9, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038A: 0xBA, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038C: 0xBC, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038E: 0xBE, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038F: 0xBF, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0xC0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0xC1, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0xC2, # GREEK CAPITAL LETTER BETA + 0x0393: 0xC3, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0xC4, # GREEK CAPITAL LETTER DELTA + 0x0395: 0xC5, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0xC6, # GREEK CAPITAL LETTER ZETA + 0x0397: 0xC7, # GREEK CAPITAL LETTER ETA + 0x0398: 0xC8, # GREEK CAPITAL LETTER THETA + 0x0399: 0xC9, # GREEK CAPITAL LETTER IOTA + 0x039A: 0xCA, # GREEK CAPITAL LETTER KAPPA + 0x039B: 0xCB, # GREEK CAPITAL LETTER LAMDA + 0x039C: 0xCC, # GREEK CAPITAL LETTER MU + 0x039D: 0xCD, # GREEK CAPITAL LETTER NU + 0x039E: 0xCE, # GREEK CAPITAL LETTER XI + 0x039F: 0xCF, # GREEK CAPITAL LETTER OMICRON + 0x03A0: 0xD0, # GREEK CAPITAL LETTER PI + 0x03A1: 0xD1, # GREEK CAPITAL LETTER RHO + 0x03A3: 0xD3, # GREEK CAPITAL LETTER SIGMA + 0x03A4: 0xD4, # GREEK CAPITAL LETTER TAU + 0x03A5: 0xD5, # GREEK CAPITAL LETTER UPSILON + 0x03A6: 0xD6, # GREEK CAPITAL LETTER PHI + 0x03A7: 0xD7, # GREEK CAPITAL LETTER CHI + 0x03A8: 0xD8, # GREEK CAPITAL LETTER PSI + 0x03A9: 0xD9, # GREEK CAPITAL LETTER OMEGA + 0x03AA: 0xDA, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03AB: 0xDB, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03AC: 0xDC, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03AD: 0xDD, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03AE: 0xDE, # GREEK SMALL LETTER ETA WITH TONOS + 0x03AF: 0xDF, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03B0: 0xE0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03B1: 0xE1, # GREEK SMALL LETTER ALPHA + 0x03B2: 0xE2, # GREEK SMALL LETTER BETA + 0x03B3: 0xE3, # GREEK SMALL LETTER GAMMA + 0x03B4: 0xE4, # GREEK SMALL LETTER DELTA + 0x03B5: 0xE5, # GREEK SMALL LETTER EPSILON + 0x03B6: 0xE6, # GREEK SMALL LETTER ZETA + 0x03B7: 0xE7, # GREEK SMALL LETTER ETA + 0x03B8: 0xE8, # GREEK SMALL LETTER THETA + 0x03B9: 0xE9, # GREEK SMALL LETTER IOTA + 0x03BA: 0xEA, # GREEK SMALL LETTER KAPPA + 0x03BB: 0xEB, # GREEK SMALL LETTER LAMDA + 0x03BC: 0xEC, # GREEK SMALL LETTER MU + 0x03BD: 0xED, # GREEK SMALL LETTER NU + 0x03BE: 0xEE, # GREEK SMALL LETTER XI + 0x03BF: 0xEF, # GREEK SMALL LETTER OMICRON + 0x03C0: 0xF0, # GREEK SMALL LETTER PI + 0x03C1: 0xF1, # GREEK SMALL LETTER RHO + 0x03C2: 0xF2, # GREEK SMALL LETTER FINAL SIGMA + 0x03C3: 0xF3, # GREEK SMALL LETTER SIGMA + 0x03C4: 0xF4, # GREEK SMALL LETTER TAU + 0x03C5: 0xF5, # GREEK SMALL LETTER UPSILON + 0x03C6: 0xF6, # GREEK SMALL LETTER PHI + 0x03C7: 0xF7, # GREEK SMALL LETTER CHI + 0x03C8: 0xF8, # GREEK SMALL LETTER PSI + 0x03C9: 0xF9, # GREEK SMALL LETTER OMEGA + 0x03CA: 0xFA, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03CB: 0xFB, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03CC: 0xFC, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03CD: 0xFD, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03CE: 0xFE, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2015: 0xAF, # HORIZONTAL BAR + 0x2018: 0xA1, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xA2, # RIGHT SINGLE QUOTATION MARK + 0x20AC: 0xA4, # EURO SIGN + 0x20AF: 0xA5, # DRACHMA SIGN } - Modified: python/trunk/Lib/encodings/iso8859_8.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_8.py (original) +++ python/trunk/Lib/encodings/iso8859_8.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,197 +32,197 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\ufffe' - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\xd7' # 0xAA -> MULTIPLICATION SIGN - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\xf7' # 0xBA -> DIVISION SIGN - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\ufffe' + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xd7' # 0xAA -> MULTIPLICATION SIGN + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xf7' # 0xBA -> DIVISION SIGN + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS u'\ufffe' u'\ufffe' u'\ufffe' @@ -255,263 +255,262 @@ u'\ufffe' u'\ufffe' u'\ufffe' - u'\u2017' # 0xDF -> DOUBLE LOW LINE - u'\u05d0' # 0xE0 -> HEBREW LETTER ALEF - u'\u05d1' # 0xE1 -> HEBREW LETTER BET - u'\u05d2' # 0xE2 -> HEBREW LETTER GIMEL - u'\u05d3' # 0xE3 -> HEBREW LETTER DALET - u'\u05d4' # 0xE4 -> HEBREW LETTER HE - u'\u05d5' # 0xE5 -> HEBREW LETTER VAV - u'\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN - u'\u05d7' # 0xE7 -> HEBREW LETTER HET - u'\u05d8' # 0xE8 -> HEBREW LETTER TET - u'\u05d9' # 0xE9 -> HEBREW LETTER YOD - u'\u05da' # 0xEA -> HEBREW LETTER FINAL KAF - u'\u05db' # 0xEB -> HEBREW LETTER KAF - u'\u05dc' # 0xEC -> HEBREW LETTER LAMED - u'\u05dd' # 0xED -> HEBREW LETTER FINAL MEM - u'\u05de' # 0xEE -> HEBREW LETTER MEM - u'\u05df' # 0xEF -> HEBREW LETTER FINAL NUN - u'\u05e0' # 0xF0 -> HEBREW LETTER NUN - u'\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH - u'\u05e2' # 0xF2 -> HEBREW LETTER AYIN - u'\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE - u'\u05e4' # 0xF4 -> HEBREW LETTER PE - u'\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI - u'\u05e6' # 0xF6 -> HEBREW LETTER TSADI - u'\u05e7' # 0xF7 -> HEBREW LETTER QOF - u'\u05e8' # 0xF8 -> HEBREW LETTER RESH - u'\u05e9' # 0xF9 -> HEBREW LETTER SHIN - u'\u05ea' # 0xFA -> HEBREW LETTER TAV + u'\u2017' # 0xDF -> DOUBLE LOW LINE + u'\u05d0' # 0xE0 -> HEBREW LETTER ALEF + u'\u05d1' # 0xE1 -> HEBREW LETTER BET + u'\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + u'\u05d3' # 0xE3 -> HEBREW LETTER DALET + u'\u05d4' # 0xE4 -> HEBREW LETTER HE + u'\u05d5' # 0xE5 -> HEBREW LETTER VAV + u'\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + u'\u05d7' # 0xE7 -> HEBREW LETTER HET + u'\u05d8' # 0xE8 -> HEBREW LETTER TET + u'\u05d9' # 0xE9 -> HEBREW LETTER YOD + u'\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + u'\u05db' # 0xEB -> HEBREW LETTER KAF + u'\u05dc' # 0xEC -> HEBREW LETTER LAMED + u'\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + u'\u05de' # 0xEE -> HEBREW LETTER MEM + u'\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + u'\u05e0' # 0xF0 -> HEBREW LETTER NUN + u'\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + u'\u05e2' # 0xF2 -> HEBREW LETTER AYIN + u'\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + u'\u05e4' # 0xF4 -> HEBREW LETTER PE + u'\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + u'\u05e6' # 0xF6 -> HEBREW LETTER TSADI + u'\u05e7' # 0xF7 -> HEBREW LETTER QOF + u'\u05e8' # 0xF8 -> HEBREW LETTER RESH + u'\u05e9' # 0xF9 -> HEBREW LETTER SHIN + u'\u05ea' # 0xFA -> HEBREW LETTER TAV u'\ufffe' u'\ufffe' - u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK - u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + u'\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + u'\u200f' # 0xFE -> RIGHT-TO-LEFT MARK u'\ufffe' ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00D7: 0xAA, # MULTIPLICATION SIGN - 0x00F7: 0xBA, # DIVISION SIGN - 0x05D0: 0xE0, # HEBREW LETTER ALEF - 0x05D1: 0xE1, # HEBREW LETTER BET - 0x05D2: 0xE2, # HEBREW LETTER GIMEL - 0x05D3: 0xE3, # HEBREW LETTER DALET - 0x05D4: 0xE4, # HEBREW LETTER HE - 0x05D5: 0xE5, # HEBREW LETTER VAV - 0x05D6: 0xE6, # HEBREW LETTER ZAYIN - 0x05D7: 0xE7, # HEBREW LETTER HET - 0x05D8: 0xE8, # HEBREW LETTER TET - 0x05D9: 0xE9, # HEBREW LETTER YOD - 0x05DA: 0xEA, # HEBREW LETTER FINAL KAF - 0x05DB: 0xEB, # HEBREW LETTER KAF - 0x05DC: 0xEC, # HEBREW LETTER LAMED - 0x05DD: 0xED, # HEBREW LETTER FINAL MEM - 0x05DE: 0xEE, # HEBREW LETTER MEM - 0x05DF: 0xEF, # HEBREW LETTER FINAL NUN - 0x05E0: 0xF0, # HEBREW LETTER NUN - 0x05E1: 0xF1, # HEBREW LETTER SAMEKH - 0x05E2: 0xF2, # HEBREW LETTER AYIN - 0x05E3: 0xF3, # HEBREW LETTER FINAL PE - 0x05E4: 0xF4, # HEBREW LETTER PE - 0x05E5: 0xF5, # HEBREW LETTER FINAL TSADI - 0x05E6: 0xF6, # HEBREW LETTER TSADI - 0x05E7: 0xF7, # HEBREW LETTER QOF - 0x05E8: 0xF8, # HEBREW LETTER RESH - 0x05E9: 0xF9, # HEBREW LETTER SHIN - 0x05EA: 0xFA, # HEBREW LETTER TAV - 0x200E: 0xFD, # LEFT-TO-RIGHT MARK - 0x200F: 0xFE, # RIGHT-TO-LEFT MARK - 0x2017: 0xDF, # DOUBLE LOW LINE + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00D7: 0xAA, # MULTIPLICATION SIGN + 0x00F7: 0xBA, # DIVISION SIGN + 0x05D0: 0xE0, # HEBREW LETTER ALEF + 0x05D1: 0xE1, # HEBREW LETTER BET + 0x05D2: 0xE2, # HEBREW LETTER GIMEL + 0x05D3: 0xE3, # HEBREW LETTER DALET + 0x05D4: 0xE4, # HEBREW LETTER HE + 0x05D5: 0xE5, # HEBREW LETTER VAV + 0x05D6: 0xE6, # HEBREW LETTER ZAYIN + 0x05D7: 0xE7, # HEBREW LETTER HET + 0x05D8: 0xE8, # HEBREW LETTER TET + 0x05D9: 0xE9, # HEBREW LETTER YOD + 0x05DA: 0xEA, # HEBREW LETTER FINAL KAF + 0x05DB: 0xEB, # HEBREW LETTER KAF + 0x05DC: 0xEC, # HEBREW LETTER LAMED + 0x05DD: 0xED, # HEBREW LETTER FINAL MEM + 0x05DE: 0xEE, # HEBREW LETTER MEM + 0x05DF: 0xEF, # HEBREW LETTER FINAL NUN + 0x05E0: 0xF0, # HEBREW LETTER NUN + 0x05E1: 0xF1, # HEBREW LETTER SAMEKH + 0x05E2: 0xF2, # HEBREW LETTER AYIN + 0x05E3: 0xF3, # HEBREW LETTER FINAL PE + 0x05E4: 0xF4, # HEBREW LETTER PE + 0x05E5: 0xF5, # HEBREW LETTER FINAL TSADI + 0x05E6: 0xF6, # HEBREW LETTER TSADI + 0x05E7: 0xF7, # HEBREW LETTER QOF + 0x05E8: 0xF8, # HEBREW LETTER RESH + 0x05E9: 0xF9, # HEBREW LETTER SHIN + 0x05EA: 0xFA, # HEBREW LETTER TAV + 0x200E: 0xFD, # LEFT-TO-RIGHT MARK + 0x200F: 0xFE, # RIGHT-TO-LEFT MARK + 0x2017: 0xDF, # DOUBLE LOW LINE } - Modified: python/trunk/Lib/encodings/iso8859_9.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_9.py (original) +++ python/trunk/Lib/encodings/iso8859_9.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\xa0' # 0xA0 -> NO-BREAK SPACE - u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa4' # 0xA4 -> CURRENCY SIGN - u'\xa5' # 0xA5 -> YEN SIGN - u'\xa6' # 0xA6 -> BROKEN BAR - u'\xa7' # 0xA7 -> SECTION SIGN - u'\xa8' # 0xA8 -> DIAERESIS - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR - u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xac' # 0xAC -> NOT SIGN - u'\xad' # 0xAD -> SOFT HYPHEN - u'\xae' # 0xAE -> REGISTERED SIGN - u'\xaf' # 0xAF -> MACRON - u'\xb0' # 0xB0 -> DEGREE SIGN - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\xb2' # 0xB2 -> SUPERSCRIPT TWO - u'\xb3' # 0xB3 -> SUPERSCRIPT THREE - u'\xb4' # 0xB4 -> ACUTE ACCENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\xb6' # 0xB6 -> PILCROW SIGN - u'\xb7' # 0xB7 -> MIDDLE DOT - u'\xb8' # 0xB8 -> CEDILLA - u'\xb9' # 0xB9 -> SUPERSCRIPT ONE - u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR - u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER - u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF - u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS - u'\xbf' # 0xBF -> INVERTED QUESTION MARK - u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE - u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE - u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE - u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE - u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xd7' # 0xD7 -> MULTIPLICATION SIGN - u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE - u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE - u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S - u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE - u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE - u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE - u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE - u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE - u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE - u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS - u'\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE - u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE - u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE - u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0xF7 -> DIVISION SIGN - u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE - u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE - u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE - u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I - u'\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA - u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> + u'\xa0' # 0xA0 -> NO-BREAK SPACE + u'\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa4' # 0xA4 -> CURRENCY SIGN + u'\xa5' # 0xA5 -> YEN SIGN + u'\xa6' # 0xA6 -> BROKEN BAR + u'\xa7' # 0xA7 -> SECTION SIGN + u'\xa8' # 0xA8 -> DIAERESIS + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + u'\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xac' # 0xAC -> NOT SIGN + u'\xad' # 0xAD -> SOFT HYPHEN + u'\xae' # 0xAE -> REGISTERED SIGN + u'\xaf' # 0xAF -> MACRON + u'\xb0' # 0xB0 -> DEGREE SIGN + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\xb2' # 0xB2 -> SUPERSCRIPT TWO + u'\xb3' # 0xB3 -> SUPERSCRIPT THREE + u'\xb4' # 0xB4 -> ACUTE ACCENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\xb6' # 0xB6 -> PILCROW SIGN + u'\xb7' # 0xB7 -> MIDDLE DOT + u'\xb8' # 0xB8 -> CEDILLA + u'\xb9' # 0xB9 -> SUPERSCRIPT ONE + u'\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + u'\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + u'\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + u'\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + u'\xbf' # 0xBF -> INVERTED QUESTION MARK + u'\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + u'\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + u'\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + u'\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + u'\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xd7' # 0xD7 -> MULTIPLICATION SIGN + u'\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + u'\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + u'\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + u'\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe6' # 0xE6 -> LATIN SMALL LETTER AE + u'\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + u'\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + u'\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + u'\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + u'\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + u'\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + u'\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + u'\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0xF7 -> DIVISION SIGN + u'\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + u'\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + u'\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + u'\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + u'\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + u'\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x00A0: 0xA0, # NO-BREAK SPACE - 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A4: 0xA4, # CURRENCY SIGN - 0x00A5: 0xA5, # YEN SIGN - 0x00A6: 0xA6, # BROKEN BAR - 0x00A7: 0xA7, # SECTION SIGN - 0x00A8: 0xA8, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xAC, # NOT SIGN - 0x00AD: 0xAD, # SOFT HYPHEN - 0x00AE: 0xAE, # REGISTERED SIGN - 0x00AF: 0xAF, # MACRON - 0x00B0: 0xB0, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0xB2, # SUPERSCRIPT TWO - 0x00B3: 0xB3, # SUPERSCRIPT THREE - 0x00B4: 0xB4, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xB6, # PILCROW SIGN - 0x00B7: 0xB7, # MIDDLE DOT - 0x00B8: 0xB8, # CEDILLA - 0x00B9: 0xB9, # SUPERSCRIPT ONE - 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER - 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF - 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS - 0x00BF: 0xBF, # INVERTED QUESTION MARK - 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE - 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D7: 0xD7, # MULTIPLICATION SIGN - 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S - 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xE6, # LATIN SMALL LETTER AE - 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xF7, # DIVISION SIGN - 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x011E: 0xD0, # LATIN CAPITAL LETTER G WITH BREVE - 0x011F: 0xF0, # LATIN SMALL LETTER G WITH BREVE - 0x0130: 0xDD, # LATIN CAPITAL LETTER I WITH DOT ABOVE - 0x0131: 0xFD, # LATIN SMALL LETTER DOTLESS I - 0x015E: 0xDE, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015F: 0xFE, # LATIN SMALL LETTER S WITH CEDILLA + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x00A0: 0xA0, # NO-BREAK SPACE + 0x00A1: 0xA1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A4: 0xA4, # CURRENCY SIGN + 0x00A5: 0xA5, # YEN SIGN + 0x00A6: 0xA6, # BROKEN BAR + 0x00A7: 0xA7, # SECTION SIGN + 0x00A8: 0xA8, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xAA, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xAB, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xAC, # NOT SIGN + 0x00AD: 0xAD, # SOFT HYPHEN + 0x00AE: 0xAE, # REGISTERED SIGN + 0x00AF: 0xAF, # MACRON + 0x00B0: 0xB0, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0xB2, # SUPERSCRIPT TWO + 0x00B3: 0xB3, # SUPERSCRIPT THREE + 0x00B4: 0xB4, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xB6, # PILCROW SIGN + 0x00B7: 0xB7, # MIDDLE DOT + 0x00B8: 0xB8, # CEDILLA + 0x00B9: 0xB9, # SUPERSCRIPT ONE + 0x00BA: 0xBA, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xBB, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC: 0xBC, # VULGAR FRACTION ONE QUARTER + 0x00BD: 0xBD, # VULGAR FRACTION ONE HALF + 0x00BE: 0xBE, # VULGAR FRACTION THREE QUARTERS + 0x00BF: 0xBF, # INVERTED QUESTION MARK + 0x00C0: 0xC0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xC1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xC2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xC3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0xC4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0xC5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xC6, # LATIN CAPITAL LETTER AE + 0x00C7: 0xC7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xC8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0xC9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xCA, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xCB, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xCC, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xCD, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xCE, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xCF, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0xD1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xD2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xD3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xD4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xD5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0xD6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7: 0xD7, # MULTIPLICATION SIGN + 0x00D8: 0xD8, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xD9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xDA, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xDB, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0xDC, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xDF, # LATIN SMALL LETTER SHARP S + 0x00E0: 0xE0, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0xE1, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0xE2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0xE3, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0xE4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0xE5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xE6, # LATIN SMALL LETTER AE + 0x00E7: 0xE7, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0xE8, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0xE9, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0xEA, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0xEB, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0xEC, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0xED, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0xEE, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0xEF, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0xF1, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0xF2, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0xF3, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0xF4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0xF5, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0xF6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xF7, # DIVISION SIGN + 0x00F8: 0xF8, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0xF9, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0xFA, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0xFB, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0xFC, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011E: 0xD0, # LATIN CAPITAL LETTER G WITH BREVE + 0x011F: 0xF0, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0xDD, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0xFD, # LATIN SMALL LETTER DOTLESS I + 0x015E: 0xDE, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015F: 0xFE, # LATIN SMALL LETTER S WITH CEDILLA } - Modified: python/trunk/Lib/encodings/koi8_r.py ============================================================================== --- python/trunk/Lib/encodings/koi8_r.py (original) +++ python/trunk/Lib/encodings/koi8_r.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL - u'\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u2580' # 0x8B -> UPPER HALF BLOCK - u'\u2584' # 0x8C -> LOWER HALF BLOCK - u'\u2588' # 0x8D -> FULL BLOCK - u'\u258c' # 0x8E -> LEFT HALF BLOCK - u'\u2590' # 0x8F -> RIGHT HALF BLOCK - u'\u2591' # 0x90 -> LIGHT SHADE - u'\u2592' # 0x91 -> MEDIUM SHADE - u'\u2593' # 0x92 -> DARK SHADE - u'\u2320' # 0x93 -> TOP HALF INTEGRAL - u'\u25a0' # 0x94 -> BLACK SQUARE - u'\u2219' # 0x95 -> BULLET OPERATOR - u'\u221a' # 0x96 -> SQUARE ROOT - u'\u2248' # 0x97 -> ALMOST EQUAL TO - u'\u2264' # 0x98 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO - u'\xa0' # 0x9A -> NO-BREAK SPACE - u'\u2321' # 0x9B -> BOTTOM HALF INTEGRAL - u'\xb0' # 0x9C -> DEGREE SIGN - u'\xb2' # 0x9D -> SUPERSCRIPT TWO - u'\xb7' # 0x9E -> MIDDLE DOT - u'\xf7' # 0x9F -> DIVISION SIGN - u'\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO - u'\u2553' # 0xA4 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - u'\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u2555' # 0xA6 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - u'\u2556' # 0xA7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - u'\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u255c' # 0xAD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - u'\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO - u'\u2562' # 0xB4 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - u'\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u2564' # 0xB6 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - u'\u2565' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - u'\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u256b' # 0xBD -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - u'\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\xa9' # 0xBF -> COPYRIGHT SIGN - u'\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU - u'\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A - u'\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE - u'\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE - u'\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE - u'\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE - u'\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF - u'\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE - u'\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA - u'\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I - u'\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I - u'\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA - u'\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL - u'\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM - u'\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN - u'\u043e' # 0xCF -> CYRILLIC SMALL LETTER O - u'\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE - u'\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA - u'\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER - u'\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES - u'\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE - u'\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U - u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE - u'\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE - u'\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU - u'\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE - u'\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA - u'\u044d' # 0xDC -> CYRILLIC SMALL LETTER E - u'\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA - u'\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE - u'\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN - u'\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU - u'\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A - u'\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE - u'\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE - u'\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE - u'\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE - u'\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF - u'\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE - u'\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA - u'\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I - u'\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I - u'\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA - u'\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL - u'\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM - u'\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN - u'\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O - u'\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE - u'\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA - u'\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER - u'\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES - u'\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE - u'\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U - u'\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE - u'\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE - u'\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU - u'\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE - u'\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA - u'\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E - u'\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA - u'\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE - u'\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + u'\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u2580' # 0x8B -> UPPER HALF BLOCK + u'\u2584' # 0x8C -> LOWER HALF BLOCK + u'\u2588' # 0x8D -> FULL BLOCK + u'\u258c' # 0x8E -> LEFT HALF BLOCK + u'\u2590' # 0x8F -> RIGHT HALF BLOCK + u'\u2591' # 0x90 -> LIGHT SHADE + u'\u2592' # 0x91 -> MEDIUM SHADE + u'\u2593' # 0x92 -> DARK SHADE + u'\u2320' # 0x93 -> TOP HALF INTEGRAL + u'\u25a0' # 0x94 -> BLACK SQUARE + u'\u2219' # 0x95 -> BULLET OPERATOR + u'\u221a' # 0x96 -> SQUARE ROOT + u'\u2248' # 0x97 -> ALMOST EQUAL TO + u'\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + u'\xa0' # 0x9A -> NO-BREAK SPACE + u'\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + u'\xb0' # 0x9C -> DEGREE SIGN + u'\xb2' # 0x9D -> SUPERSCRIPT TWO + u'\xb7' # 0x9E -> MIDDLE DOT + u'\xf7' # 0x9F -> DIVISION SIGN + u'\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + u'\u2553' # 0xA4 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + u'\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u2555' # 0xA6 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + u'\u2556' # 0xA7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + u'\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u255c' # 0xAD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + u'\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + u'\u2562' # 0xB4 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + u'\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u2564' # 0xB6 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + u'\u2565' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + u'\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u256b' # 0xBD -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + u'\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa9' # 0xBF -> COPYRIGHT SIGN + u'\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + u'\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + u'\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + u'\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + u'\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + u'\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + u'\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + u'\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + u'\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + u'\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + u'\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + u'\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + u'\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + u'\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + u'\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + u'\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + u'\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + u'\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + u'\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + u'\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + u'\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + u'\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + u'\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + u'\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + u'\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + u'\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + u'\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + u'\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + u'\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + u'\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + u'\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + u'\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + u'\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + u'\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + u'\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + u'\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0x9A, # NO-BREAK SPACE - 0x00A9: 0xBF, # COPYRIGHT SIGN - 0x00B0: 0x9C, # DEGREE SIGN - 0x00B2: 0x9D, # SUPERSCRIPT TWO - 0x00B7: 0x9E, # MIDDLE DOT - 0x00F7: 0x9F, # DIVISION SIGN - 0x0401: 0xB3, # CYRILLIC CAPITAL LETTER IO - 0x0410: 0xE1, # CYRILLIC CAPITAL LETTER A - 0x0411: 0xE2, # CYRILLIC CAPITAL LETTER BE - 0x0412: 0xF7, # CYRILLIC CAPITAL LETTER VE - 0x0413: 0xE7, # CYRILLIC CAPITAL LETTER GHE - 0x0414: 0xE4, # CYRILLIC CAPITAL LETTER DE - 0x0415: 0xE5, # CYRILLIC CAPITAL LETTER IE - 0x0416: 0xF6, # CYRILLIC CAPITAL LETTER ZHE - 0x0417: 0xFA, # CYRILLIC CAPITAL LETTER ZE - 0x0418: 0xE9, # CYRILLIC CAPITAL LETTER I - 0x0419: 0xEA, # CYRILLIC CAPITAL LETTER SHORT I - 0x041A: 0xEB, # CYRILLIC CAPITAL LETTER KA - 0x041B: 0xEC, # CYRILLIC CAPITAL LETTER EL - 0x041C: 0xED, # CYRILLIC CAPITAL LETTER EM - 0x041D: 0xEE, # CYRILLIC CAPITAL LETTER EN - 0x041E: 0xEF, # CYRILLIC CAPITAL LETTER O - 0x041F: 0xF0, # CYRILLIC CAPITAL LETTER PE - 0x0420: 0xF2, # CYRILLIC CAPITAL LETTER ER - 0x0421: 0xF3, # CYRILLIC CAPITAL LETTER ES - 0x0422: 0xF4, # CYRILLIC CAPITAL LETTER TE - 0x0423: 0xF5, # CYRILLIC CAPITAL LETTER U - 0x0424: 0xE6, # CYRILLIC CAPITAL LETTER EF - 0x0425: 0xE8, # CYRILLIC CAPITAL LETTER HA - 0x0426: 0xE3, # CYRILLIC CAPITAL LETTER TSE - 0x0427: 0xFE, # CYRILLIC CAPITAL LETTER CHE - 0x0428: 0xFB, # CYRILLIC CAPITAL LETTER SHA - 0x0429: 0xFD, # CYRILLIC CAPITAL LETTER SHCHA - 0x042A: 0xFF, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x042B: 0xF9, # CYRILLIC CAPITAL LETTER YERU - 0x042C: 0xF8, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x042D: 0xFC, # CYRILLIC CAPITAL LETTER E - 0x042E: 0xE0, # CYRILLIC CAPITAL LETTER YU - 0x042F: 0xF1, # CYRILLIC CAPITAL LETTER YA - 0x0430: 0xC1, # CYRILLIC SMALL LETTER A - 0x0431: 0xC2, # CYRILLIC SMALL LETTER BE - 0x0432: 0xD7, # CYRILLIC SMALL LETTER VE - 0x0433: 0xC7, # CYRILLIC SMALL LETTER GHE - 0x0434: 0xC4, # CYRILLIC SMALL LETTER DE - 0x0435: 0xC5, # CYRILLIC SMALL LETTER IE - 0x0436: 0xD6, # CYRILLIC SMALL LETTER ZHE - 0x0437: 0xDA, # CYRILLIC SMALL LETTER ZE - 0x0438: 0xC9, # CYRILLIC SMALL LETTER I - 0x0439: 0xCA, # CYRILLIC SMALL LETTER SHORT I - 0x043A: 0xCB, # CYRILLIC SMALL LETTER KA - 0x043B: 0xCC, # CYRILLIC SMALL LETTER EL - 0x043C: 0xCD, # CYRILLIC SMALL LETTER EM - 0x043D: 0xCE, # CYRILLIC SMALL LETTER EN - 0x043E: 0xCF, # CYRILLIC SMALL LETTER O - 0x043F: 0xD0, # CYRILLIC SMALL LETTER PE - 0x0440: 0xD2, # CYRILLIC SMALL LETTER ER - 0x0441: 0xD3, # CYRILLIC SMALL LETTER ES - 0x0442: 0xD4, # CYRILLIC SMALL LETTER TE - 0x0443: 0xD5, # CYRILLIC SMALL LETTER U - 0x0444: 0xC6, # CYRILLIC SMALL LETTER EF - 0x0445: 0xC8, # CYRILLIC SMALL LETTER HA - 0x0446: 0xC3, # CYRILLIC SMALL LETTER TSE - 0x0447: 0xDE, # CYRILLIC SMALL LETTER CHE - 0x0448: 0xDB, # CYRILLIC SMALL LETTER SHA - 0x0449: 0xDD, # CYRILLIC SMALL LETTER SHCHA - 0x044A: 0xDF, # CYRILLIC SMALL LETTER HARD SIGN - 0x044B: 0xD9, # CYRILLIC SMALL LETTER YERU - 0x044C: 0xD8, # CYRILLIC SMALL LETTER SOFT SIGN - 0x044D: 0xDC, # CYRILLIC SMALL LETTER E - 0x044E: 0xC0, # CYRILLIC SMALL LETTER YU - 0x044F: 0xD1, # CYRILLIC SMALL LETTER YA - 0x0451: 0xA3, # CYRILLIC SMALL LETTER IO - 0x2219: 0x95, # BULLET OPERATOR - 0x221A: 0x96, # SQUARE ROOT - 0x2248: 0x97, # ALMOST EQUAL TO - 0x2264: 0x98, # LESS-THAN OR EQUAL TO - 0x2265: 0x99, # GREATER-THAN OR EQUAL TO - 0x2320: 0x93, # TOP HALF INTEGRAL - 0x2321: 0x9B, # BOTTOM HALF INTEGRAL - 0x2500: 0x80, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x81, # BOX DRAWINGS LIGHT VERTICAL - 0x250C: 0x82, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x83, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x84, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x85, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251C: 0x86, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x87, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252C: 0x88, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x89, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253C: 0x8A, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0xA0, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0xA1, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0xA2, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2553: 0xA4, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - 0x2554: 0xA5, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2555: 0xA6, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - 0x2556: 0xA7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - 0x2557: 0xA8, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0xA9, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0xAA, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255A: 0xAB, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255B: 0xAC, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255C: 0xAD, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - 0x255D: 0xAE, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255E: 0xAF, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255F: 0xB0, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0xB1, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0xB2, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2562: 0xB4, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - 0x2563: 0xB5, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2564: 0xB6, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - 0x2565: 0xB7, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - 0x2566: 0xB8, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0xB9, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0xBA, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0xBB, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256A: 0xBC, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256B: 0xBD, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - 0x256C: 0xBE, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x8B, # UPPER HALF BLOCK - 0x2584: 0x8C, # LOWER HALF BLOCK - 0x2588: 0x8D, # FULL BLOCK - 0x258C: 0x8E, # LEFT HALF BLOCK - 0x2590: 0x8F, # RIGHT HALF BLOCK - 0x2591: 0x90, # LIGHT SHADE - 0x2592: 0x91, # MEDIUM SHADE - 0x2593: 0x92, # DARK SHADE - 0x25A0: 0x94, # BLACK SQUARE + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0x9A, # NO-BREAK SPACE + 0x00A9: 0xBF, # COPYRIGHT SIGN + 0x00B0: 0x9C, # DEGREE SIGN + 0x00B2: 0x9D, # SUPERSCRIPT TWO + 0x00B7: 0x9E, # MIDDLE DOT + 0x00F7: 0x9F, # DIVISION SIGN + 0x0401: 0xB3, # CYRILLIC CAPITAL LETTER IO + 0x0410: 0xE1, # CYRILLIC CAPITAL LETTER A + 0x0411: 0xE2, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0xF7, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0xE7, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0xE4, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0xE5, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0xF6, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0xFA, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0xE9, # CYRILLIC CAPITAL LETTER I + 0x0419: 0xEA, # CYRILLIC CAPITAL LETTER SHORT I + 0x041A: 0xEB, # CYRILLIC CAPITAL LETTER KA + 0x041B: 0xEC, # CYRILLIC CAPITAL LETTER EL + 0x041C: 0xED, # CYRILLIC CAPITAL LETTER EM + 0x041D: 0xEE, # CYRILLIC CAPITAL LETTER EN + 0x041E: 0xEF, # CYRILLIC CAPITAL LETTER O + 0x041F: 0xF0, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0xF2, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0xF3, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0xF4, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0xF5, # CYRILLIC CAPITAL LETTER U + 0x0424: 0xE6, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0xE8, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0xE3, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0xFE, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0xFB, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0xFD, # CYRILLIC CAPITAL LETTER SHCHA + 0x042A: 0xFF, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042B: 0xF9, # CYRILLIC CAPITAL LETTER YERU + 0x042C: 0xF8, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042D: 0xFC, # CYRILLIC CAPITAL LETTER E + 0x042E: 0xE0, # CYRILLIC CAPITAL LETTER YU + 0x042F: 0xF1, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0xC1, # CYRILLIC SMALL LETTER A + 0x0431: 0xC2, # CYRILLIC SMALL LETTER BE + 0x0432: 0xD7, # CYRILLIC SMALL LETTER VE + 0x0433: 0xC7, # CYRILLIC SMALL LETTER GHE + 0x0434: 0xC4, # CYRILLIC SMALL LETTER DE + 0x0435: 0xC5, # CYRILLIC SMALL LETTER IE + 0x0436: 0xD6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0xDA, # CYRILLIC SMALL LETTER ZE + 0x0438: 0xC9, # CYRILLIC SMALL LETTER I + 0x0439: 0xCA, # CYRILLIC SMALL LETTER SHORT I + 0x043A: 0xCB, # CYRILLIC SMALL LETTER KA + 0x043B: 0xCC, # CYRILLIC SMALL LETTER EL + 0x043C: 0xCD, # CYRILLIC SMALL LETTER EM + 0x043D: 0xCE, # CYRILLIC SMALL LETTER EN + 0x043E: 0xCF, # CYRILLIC SMALL LETTER O + 0x043F: 0xD0, # CYRILLIC SMALL LETTER PE + 0x0440: 0xD2, # CYRILLIC SMALL LETTER ER + 0x0441: 0xD3, # CYRILLIC SMALL LETTER ES + 0x0442: 0xD4, # CYRILLIC SMALL LETTER TE + 0x0443: 0xD5, # CYRILLIC SMALL LETTER U + 0x0444: 0xC6, # CYRILLIC SMALL LETTER EF + 0x0445: 0xC8, # CYRILLIC SMALL LETTER HA + 0x0446: 0xC3, # CYRILLIC SMALL LETTER TSE + 0x0447: 0xDE, # CYRILLIC SMALL LETTER CHE + 0x0448: 0xDB, # CYRILLIC SMALL LETTER SHA + 0x0449: 0xDD, # CYRILLIC SMALL LETTER SHCHA + 0x044A: 0xDF, # CYRILLIC SMALL LETTER HARD SIGN + 0x044B: 0xD9, # CYRILLIC SMALL LETTER YERU + 0x044C: 0xD8, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044D: 0xDC, # CYRILLIC SMALL LETTER E + 0x044E: 0xC0, # CYRILLIC SMALL LETTER YU + 0x044F: 0xD1, # CYRILLIC SMALL LETTER YA + 0x0451: 0xA3, # CYRILLIC SMALL LETTER IO + 0x2219: 0x95, # BULLET OPERATOR + 0x221A: 0x96, # SQUARE ROOT + 0x2248: 0x97, # ALMOST EQUAL TO + 0x2264: 0x98, # LESS-THAN OR EQUAL TO + 0x2265: 0x99, # GREATER-THAN OR EQUAL TO + 0x2320: 0x93, # TOP HALF INTEGRAL + 0x2321: 0x9B, # BOTTOM HALF INTEGRAL + 0x2500: 0x80, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x81, # BOX DRAWINGS LIGHT VERTICAL + 0x250C: 0x82, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x83, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x84, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x85, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251C: 0x86, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x87, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252C: 0x88, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x89, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253C: 0x8A, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0xA0, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0xA1, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0xA2, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0xA4, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0xA5, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0xA6, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0xA7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0xA8, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0xA9, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0xAA, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255A: 0xAB, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255B: 0xAC, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255C: 0xAD, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255D: 0xAE, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255E: 0xAF, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255F: 0xB0, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0xB1, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0xB2, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0xB4, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0xB5, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0xB6, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0xB7, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0xB8, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0xB9, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0xBA, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0xBB, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256A: 0xBC, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256B: 0xBD, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256C: 0xBE, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x8B, # UPPER HALF BLOCK + 0x2584: 0x8C, # LOWER HALF BLOCK + 0x2588: 0x8D, # FULL BLOCK + 0x258C: 0x8E, # LEFT HALF BLOCK + 0x2590: 0x8F, # RIGHT HALF BLOCK + 0x2591: 0x90, # LIGHT SHADE + 0x2592: 0x91, # MEDIUM SHADE + 0x2593: 0x92, # DARK SHADE + 0x25A0: 0x94, # BLACK SQUARE } - Modified: python/trunk/Lib/encodings/koi8_u.py ============================================================================== --- python/trunk/Lib/encodings/koi8_u.py (original) +++ python/trunk/Lib/encodings/koi8_u.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL - u'\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u2580' # 0x8B -> UPPER HALF BLOCK - u'\u2584' # 0x8C -> LOWER HALF BLOCK - u'\u2588' # 0x8D -> FULL BLOCK - u'\u258c' # 0x8E -> LEFT HALF BLOCK - u'\u2590' # 0x8F -> RIGHT HALF BLOCK - u'\u2591' # 0x90 -> LIGHT SHADE - u'\u2592' # 0x91 -> MEDIUM SHADE - u'\u2593' # 0x92 -> DARK SHADE - u'\u2320' # 0x93 -> TOP HALF INTEGRAL - u'\u25a0' # 0x94 -> BLACK SQUARE - u'\u2219' # 0x95 -> BULLET OPERATOR - u'\u221a' # 0x96 -> SQUARE ROOT - u'\u2248' # 0x97 -> ALMOST EQUAL TO - u'\u2264' # 0x98 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO - u'\xa0' # 0x9A -> NO-BREAK SPACE - u'\u2321' # 0x9B -> BOTTOM HALF INTEGRAL - u'\xb0' # 0x9C -> DEGREE SIGN - u'\xb2' # 0x9D -> SUPERSCRIPT TWO - u'\xb7' # 0x9E -> MIDDLE DOT - u'\xf7' # 0x9F -> DIVISION SIGN - u'\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO - u'\u0454' # 0xA4 -> CYRILLIC SMALL LETTER UKRAINIAN IE - u'\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u0456' # 0xA6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0457' # 0xA7 -> CYRILLIC SMALL LETTER YI (UKRAINIAN) - u'\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u0491' # 0xAD -> CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN - u'\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO - u'\u0404' # 0xB4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE - u'\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u0406' # 0xB6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0407' # 0xB7 -> CYRILLIC CAPITAL LETTER YI (UKRAINIAN) - u'\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u0490' # 0xBD -> CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN - u'\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\xa9' # 0xBF -> COPYRIGHT SIGN - u'\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU - u'\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A - u'\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE - u'\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE - u'\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE - u'\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE - u'\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF - u'\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE - u'\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA - u'\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I - u'\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I - u'\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA - u'\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL - u'\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM - u'\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN - u'\u043e' # 0xCF -> CYRILLIC SMALL LETTER O - u'\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE - u'\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA - u'\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER - u'\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES - u'\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE - u'\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U - u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE - u'\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE - u'\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU - u'\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE - u'\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA - u'\u044d' # 0xDC -> CYRILLIC SMALL LETTER E - u'\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA - u'\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE - u'\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN - u'\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU - u'\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A - u'\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE - u'\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE - u'\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE - u'\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE - u'\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF - u'\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE - u'\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA - u'\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I - u'\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I - u'\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA - u'\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL - u'\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM - u'\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN - u'\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O - u'\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE - u'\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA - u'\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER - u'\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES - u'\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE - u'\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U - u'\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE - u'\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE - u'\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU - u'\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE - u'\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA - u'\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E - u'\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA - u'\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE - u'\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + u'\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + u'\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + u'\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + u'\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + u'\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + u'\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + u'\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + u'\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + u'\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + u'\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + u'\u2580' # 0x8B -> UPPER HALF BLOCK + u'\u2584' # 0x8C -> LOWER HALF BLOCK + u'\u2588' # 0x8D -> FULL BLOCK + u'\u258c' # 0x8E -> LEFT HALF BLOCK + u'\u2590' # 0x8F -> RIGHT HALF BLOCK + u'\u2591' # 0x90 -> LIGHT SHADE + u'\u2592' # 0x91 -> MEDIUM SHADE + u'\u2593' # 0x92 -> DARK SHADE + u'\u2320' # 0x93 -> TOP HALF INTEGRAL + u'\u25a0' # 0x94 -> BLACK SQUARE + u'\u2219' # 0x95 -> BULLET OPERATOR + u'\u221a' # 0x96 -> SQUARE ROOT + u'\u2248' # 0x97 -> ALMOST EQUAL TO + u'\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + u'\xa0' # 0x9A -> NO-BREAK SPACE + u'\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + u'\xb0' # 0x9C -> DEGREE SIGN + u'\xb2' # 0x9D -> SUPERSCRIPT TWO + u'\xb7' # 0x9E -> MIDDLE DOT + u'\xf7' # 0x9F -> DIVISION SIGN + u'\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + u'\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + u'\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + u'\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + u'\u0454' # 0xA4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + u'\u0456' # 0xA6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0457' # 0xA7 -> CYRILLIC SMALL LETTER YI (UKRAINIAN) + u'\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + u'\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + u'\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + u'\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + u'\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + u'\u0491' # 0xAD -> CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN + u'\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + u'\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + u'\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + u'\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + u'\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + u'\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + u'\u0404' # 0xB4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + u'\u0406' # 0xB6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\u0407' # 0xB7 -> CYRILLIC CAPITAL LETTER YI (UKRAINIAN) + u'\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + u'\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + u'\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + u'\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + u'\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + u'\u0490' # 0xBD -> CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN + u'\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + u'\xa9' # 0xBF -> COPYRIGHT SIGN + u'\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + u'\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + u'\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + u'\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + u'\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + u'\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + u'\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + u'\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + u'\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + u'\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + u'\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + u'\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + u'\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + u'\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + u'\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + u'\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + u'\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + u'\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + u'\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + u'\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + u'\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + u'\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + u'\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + u'\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + u'\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + u'\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + u'\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + u'\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + u'\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + u'\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + u'\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + u'\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + u'\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + u'\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + u'\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + u'\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x00A0: 0x9A, # NO-BREAK SPACE - 0x00A9: 0xBF, # COPYRIGHT SIGN - 0x00B0: 0x9C, # DEGREE SIGN - 0x00B2: 0x9D, # SUPERSCRIPT TWO - 0x00B7: 0x9E, # MIDDLE DOT - 0x00F7: 0x9F, # DIVISION SIGN - 0x0401: 0xB3, # CYRILLIC CAPITAL LETTER IO - 0x0404: 0xB4, # CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x0406: 0xB6, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0407: 0xB7, # CYRILLIC CAPITAL LETTER YI (UKRAINIAN) - 0x0410: 0xE1, # CYRILLIC CAPITAL LETTER A - 0x0411: 0xE2, # CYRILLIC CAPITAL LETTER BE - 0x0412: 0xF7, # CYRILLIC CAPITAL LETTER VE - 0x0413: 0xE7, # CYRILLIC CAPITAL LETTER GHE - 0x0414: 0xE4, # CYRILLIC CAPITAL LETTER DE - 0x0415: 0xE5, # CYRILLIC CAPITAL LETTER IE - 0x0416: 0xF6, # CYRILLIC CAPITAL LETTER ZHE - 0x0417: 0xFA, # CYRILLIC CAPITAL LETTER ZE - 0x0418: 0xE9, # CYRILLIC CAPITAL LETTER I - 0x0419: 0xEA, # CYRILLIC CAPITAL LETTER SHORT I - 0x041A: 0xEB, # CYRILLIC CAPITAL LETTER KA - 0x041B: 0xEC, # CYRILLIC CAPITAL LETTER EL - 0x041C: 0xED, # CYRILLIC CAPITAL LETTER EM - 0x041D: 0xEE, # CYRILLIC CAPITAL LETTER EN - 0x041E: 0xEF, # CYRILLIC CAPITAL LETTER O - 0x041F: 0xF0, # CYRILLIC CAPITAL LETTER PE - 0x0420: 0xF2, # CYRILLIC CAPITAL LETTER ER - 0x0421: 0xF3, # CYRILLIC CAPITAL LETTER ES - 0x0422: 0xF4, # CYRILLIC CAPITAL LETTER TE - 0x0423: 0xF5, # CYRILLIC CAPITAL LETTER U - 0x0424: 0xE6, # CYRILLIC CAPITAL LETTER EF - 0x0425: 0xE8, # CYRILLIC CAPITAL LETTER HA - 0x0426: 0xE3, # CYRILLIC CAPITAL LETTER TSE - 0x0427: 0xFE, # CYRILLIC CAPITAL LETTER CHE - 0x0428: 0xFB, # CYRILLIC CAPITAL LETTER SHA - 0x0429: 0xFD, # CYRILLIC CAPITAL LETTER SHCHA - 0x042A: 0xFF, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x042B: 0xF9, # CYRILLIC CAPITAL LETTER YERU - 0x042C: 0xF8, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x042D: 0xFC, # CYRILLIC CAPITAL LETTER E - 0x042E: 0xE0, # CYRILLIC CAPITAL LETTER YU - 0x042F: 0xF1, # CYRILLIC CAPITAL LETTER YA - 0x0430: 0xC1, # CYRILLIC SMALL LETTER A - 0x0431: 0xC2, # CYRILLIC SMALL LETTER BE - 0x0432: 0xD7, # CYRILLIC SMALL LETTER VE - 0x0433: 0xC7, # CYRILLIC SMALL LETTER GHE - 0x0434: 0xC4, # CYRILLIC SMALL LETTER DE - 0x0435: 0xC5, # CYRILLIC SMALL LETTER IE - 0x0436: 0xD6, # CYRILLIC SMALL LETTER ZHE - 0x0437: 0xDA, # CYRILLIC SMALL LETTER ZE - 0x0438: 0xC9, # CYRILLIC SMALL LETTER I - 0x0439: 0xCA, # CYRILLIC SMALL LETTER SHORT I - 0x043A: 0xCB, # CYRILLIC SMALL LETTER KA - 0x043B: 0xCC, # CYRILLIC SMALL LETTER EL - 0x043C: 0xCD, # CYRILLIC SMALL LETTER EM - 0x043D: 0xCE, # CYRILLIC SMALL LETTER EN - 0x043E: 0xCF, # CYRILLIC SMALL LETTER O - 0x043F: 0xD0, # CYRILLIC SMALL LETTER PE - 0x0440: 0xD2, # CYRILLIC SMALL LETTER ER - 0x0441: 0xD3, # CYRILLIC SMALL LETTER ES - 0x0442: 0xD4, # CYRILLIC SMALL LETTER TE - 0x0443: 0xD5, # CYRILLIC SMALL LETTER U - 0x0444: 0xC6, # CYRILLIC SMALL LETTER EF - 0x0445: 0xC8, # CYRILLIC SMALL LETTER HA - 0x0446: 0xC3, # CYRILLIC SMALL LETTER TSE - 0x0447: 0xDE, # CYRILLIC SMALL LETTER CHE - 0x0448: 0xDB, # CYRILLIC SMALL LETTER SHA - 0x0449: 0xDD, # CYRILLIC SMALL LETTER SHCHA - 0x044A: 0xDF, # CYRILLIC SMALL LETTER HARD SIGN - 0x044B: 0xD9, # CYRILLIC SMALL LETTER YERU - 0x044C: 0xD8, # CYRILLIC SMALL LETTER SOFT SIGN - 0x044D: 0xDC, # CYRILLIC SMALL LETTER E - 0x044E: 0xC0, # CYRILLIC SMALL LETTER YU - 0x044F: 0xD1, # CYRILLIC SMALL LETTER YA - 0x0451: 0xA3, # CYRILLIC SMALL LETTER IO - 0x0454: 0xA4, # CYRILLIC SMALL LETTER UKRAINIAN IE - 0x0456: 0xA6, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0457: 0xA7, # CYRILLIC SMALL LETTER YI (UKRAINIAN) - 0x0490: 0xBD, # CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN - 0x0491: 0xAD, # CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN - 0x2219: 0x95, # BULLET OPERATOR - 0x221A: 0x96, # SQUARE ROOT - 0x2248: 0x97, # ALMOST EQUAL TO - 0x2264: 0x98, # LESS-THAN OR EQUAL TO - 0x2265: 0x99, # GREATER-THAN OR EQUAL TO - 0x2320: 0x93, # TOP HALF INTEGRAL - 0x2321: 0x9B, # BOTTOM HALF INTEGRAL - 0x2500: 0x80, # BOX DRAWINGS LIGHT HORIZONTAL - 0x2502: 0x81, # BOX DRAWINGS LIGHT VERTICAL - 0x250C: 0x82, # BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x2510: 0x83, # BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2514: 0x84, # BOX DRAWINGS LIGHT UP AND RIGHT - 0x2518: 0x85, # BOX DRAWINGS LIGHT UP AND LEFT - 0x251C: 0x86, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x2524: 0x87, # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x252C: 0x88, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x2534: 0x89, # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x253C: 0x8A, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x2550: 0xA0, # BOX DRAWINGS DOUBLE HORIZONTAL - 0x2551: 0xA1, # BOX DRAWINGS DOUBLE VERTICAL - 0x2552: 0xA2, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - 0x2554: 0xA5, # BOX DRAWINGS DOUBLE DOWN AND RIGHT - 0x2557: 0xA8, # BOX DRAWINGS DOUBLE DOWN AND LEFT - 0x2558: 0xA9, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - 0x2559: 0xAA, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - 0x255A: 0xAB, # BOX DRAWINGS DOUBLE UP AND RIGHT - 0x255B: 0xAC, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - 0x255D: 0xAE, # BOX DRAWINGS DOUBLE UP AND LEFT - 0x255E: 0xAF, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - 0x255F: 0xB0, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - 0x2560: 0xB1, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - 0x2561: 0xB2, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - 0x2563: 0xB5, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - 0x2566: 0xB8, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - 0x2567: 0xB9, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - 0x2568: 0xBA, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - 0x2569: 0xBB, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - 0x256A: 0xBC, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - 0x256C: 0xBE, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - 0x2580: 0x8B, # UPPER HALF BLOCK - 0x2584: 0x8C, # LOWER HALF BLOCK - 0x2588: 0x8D, # FULL BLOCK - 0x258C: 0x8E, # LEFT HALF BLOCK - 0x2590: 0x8F, # RIGHT HALF BLOCK - 0x2591: 0x90, # LIGHT SHADE - 0x2592: 0x91, # MEDIUM SHADE - 0x2593: 0x92, # DARK SHADE - 0x25A0: 0x94, # BLACK SQUARE + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x00A0: 0x9A, # NO-BREAK SPACE + 0x00A9: 0xBF, # COPYRIGHT SIGN + 0x00B0: 0x9C, # DEGREE SIGN + 0x00B2: 0x9D, # SUPERSCRIPT TWO + 0x00B7: 0x9E, # MIDDLE DOT + 0x00F7: 0x9F, # DIVISION SIGN + 0x0401: 0xB3, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0xB4, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0406: 0xB6, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0xB7, # CYRILLIC CAPITAL LETTER YI (UKRAINIAN) + 0x0410: 0xE1, # CYRILLIC CAPITAL LETTER A + 0x0411: 0xE2, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0xF7, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0xE7, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0xE4, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0xE5, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0xF6, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0xFA, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0xE9, # CYRILLIC CAPITAL LETTER I + 0x0419: 0xEA, # CYRILLIC CAPITAL LETTER SHORT I + 0x041A: 0xEB, # CYRILLIC CAPITAL LETTER KA + 0x041B: 0xEC, # CYRILLIC CAPITAL LETTER EL + 0x041C: 0xED, # CYRILLIC CAPITAL LETTER EM + 0x041D: 0xEE, # CYRILLIC CAPITAL LETTER EN + 0x041E: 0xEF, # CYRILLIC CAPITAL LETTER O + 0x041F: 0xF0, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0xF2, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0xF3, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0xF4, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0xF5, # CYRILLIC CAPITAL LETTER U + 0x0424: 0xE6, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0xE8, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0xE3, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0xFE, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0xFB, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0xFD, # CYRILLIC CAPITAL LETTER SHCHA + 0x042A: 0xFF, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042B: 0xF9, # CYRILLIC CAPITAL LETTER YERU + 0x042C: 0xF8, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042D: 0xFC, # CYRILLIC CAPITAL LETTER E + 0x042E: 0xE0, # CYRILLIC CAPITAL LETTER YU + 0x042F: 0xF1, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0xC1, # CYRILLIC SMALL LETTER A + 0x0431: 0xC2, # CYRILLIC SMALL LETTER BE + 0x0432: 0xD7, # CYRILLIC SMALL LETTER VE + 0x0433: 0xC7, # CYRILLIC SMALL LETTER GHE + 0x0434: 0xC4, # CYRILLIC SMALL LETTER DE + 0x0435: 0xC5, # CYRILLIC SMALL LETTER IE + 0x0436: 0xD6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0xDA, # CYRILLIC SMALL LETTER ZE + 0x0438: 0xC9, # CYRILLIC SMALL LETTER I + 0x0439: 0xCA, # CYRILLIC SMALL LETTER SHORT I + 0x043A: 0xCB, # CYRILLIC SMALL LETTER KA + 0x043B: 0xCC, # CYRILLIC SMALL LETTER EL + 0x043C: 0xCD, # CYRILLIC SMALL LETTER EM + 0x043D: 0xCE, # CYRILLIC SMALL LETTER EN + 0x043E: 0xCF, # CYRILLIC SMALL LETTER O + 0x043F: 0xD0, # CYRILLIC SMALL LETTER PE + 0x0440: 0xD2, # CYRILLIC SMALL LETTER ER + 0x0441: 0xD3, # CYRILLIC SMALL LETTER ES + 0x0442: 0xD4, # CYRILLIC SMALL LETTER TE + 0x0443: 0xD5, # CYRILLIC SMALL LETTER U + 0x0444: 0xC6, # CYRILLIC SMALL LETTER EF + 0x0445: 0xC8, # CYRILLIC SMALL LETTER HA + 0x0446: 0xC3, # CYRILLIC SMALL LETTER TSE + 0x0447: 0xDE, # CYRILLIC SMALL LETTER CHE + 0x0448: 0xDB, # CYRILLIC SMALL LETTER SHA + 0x0449: 0xDD, # CYRILLIC SMALL LETTER SHCHA + 0x044A: 0xDF, # CYRILLIC SMALL LETTER HARD SIGN + 0x044B: 0xD9, # CYRILLIC SMALL LETTER YERU + 0x044C: 0xD8, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044D: 0xDC, # CYRILLIC SMALL LETTER E + 0x044E: 0xC0, # CYRILLIC SMALL LETTER YU + 0x044F: 0xD1, # CYRILLIC SMALL LETTER YA + 0x0451: 0xA3, # CYRILLIC SMALL LETTER IO + 0x0454: 0xA4, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0456: 0xA6, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0xA7, # CYRILLIC SMALL LETTER YI (UKRAINIAN) + 0x0490: 0xBD, # CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN + 0x0491: 0xAD, # CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN + 0x2219: 0x95, # BULLET OPERATOR + 0x221A: 0x96, # SQUARE ROOT + 0x2248: 0x97, # ALMOST EQUAL TO + 0x2264: 0x98, # LESS-THAN OR EQUAL TO + 0x2265: 0x99, # GREATER-THAN OR EQUAL TO + 0x2320: 0x93, # TOP HALF INTEGRAL + 0x2321: 0x9B, # BOTTOM HALF INTEGRAL + 0x2500: 0x80, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x81, # BOX DRAWINGS LIGHT VERTICAL + 0x250C: 0x82, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x83, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x84, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x85, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251C: 0x86, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x87, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252C: 0x88, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x89, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253C: 0x8A, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0xA0, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0xA1, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0xA2, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2554: 0xA5, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0xA8, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0xA9, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0xAA, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255A: 0xAB, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255B: 0xAC, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255D: 0xAE, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255E: 0xAF, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255F: 0xB0, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0xB1, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0xB2, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2563: 0xB5, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0xB8, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0xB9, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0xBA, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0xBB, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256A: 0xBC, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256C: 0xBE, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x8B, # UPPER HALF BLOCK + 0x2584: 0x8C, # LOWER HALF BLOCK + 0x2588: 0x8D, # FULL BLOCK + 0x258C: 0x8E, # LEFT HALF BLOCK + 0x2590: 0x8F, # RIGHT HALF BLOCK + 0x2591: 0x90, # LIGHT SHADE + 0x2592: 0x91, # MEDIUM SHADE + 0x2593: 0x92, # DARK SHADE + 0x25A0: 0x94, # BLACK SQUARE } - Modified: python/trunk/Lib/encodings/mac_arabic.py ============================================================================== --- python/trunk/Lib/encodings/mac_arabic.py (original) +++ python/trunk/Lib/encodings/mac_arabic.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,654 +32,654 @@ decoding_map = codecs.make_identity_dict(range(256)) decoding_map.update({ - 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x0081: 0x00a0, # NO-BREAK SPACE, right-left - 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE - 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x008b: 0x06ba, # ARABIC LETTER NOON GHUNNA - 0x008c: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x0093: 0x2026, # HORIZONTAL ELLIPSIS, right-left - 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS - 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE - 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x0098: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x009b: 0x00f7, # DIVISION SIGN, right-left - 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE - 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00a0: 0x0020, # SPACE, right-left - 0x00a1: 0x0021, # EXCLAMATION MARK, right-left - 0x00a2: 0x0022, # QUOTATION MARK, right-left - 0x00a3: 0x0023, # NUMBER SIGN, right-left - 0x00a4: 0x0024, # DOLLAR SIGN, right-left - 0x00a5: 0x066a, # ARABIC PERCENT SIGN - 0x00a6: 0x0026, # AMPERSAND, right-left - 0x00a7: 0x0027, # APOSTROPHE, right-left - 0x00a8: 0x0028, # LEFT PARENTHESIS, right-left - 0x00a9: 0x0029, # RIGHT PARENTHESIS, right-left - 0x00aa: 0x002a, # ASTERISK, right-left - 0x00ab: 0x002b, # PLUS SIGN, right-left - 0x00ac: 0x060c, # ARABIC COMMA - 0x00ad: 0x002d, # HYPHEN-MINUS, right-left - 0x00ae: 0x002e, # FULL STOP, right-left - 0x00af: 0x002f, # SOLIDUS, right-left - 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO, right-left (need override) - 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE, right-left (need override) - 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO, right-left (need override) - 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE, right-left (need override) - 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR, right-left (need override) - 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE, right-left (need override) - 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX, right-left (need override) - 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) - 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) - 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE, right-left (need override) - 0x00ba: 0x003a, # COLON, right-left - 0x00bb: 0x061b, # ARABIC SEMICOLON - 0x00bc: 0x003c, # LESS-THAN SIGN, right-left - 0x00bd: 0x003d, # EQUALS SIGN, right-left - 0x00be: 0x003e, # GREATER-THAN SIGN, right-left - 0x00bf: 0x061f, # ARABIC QUESTION MARK - 0x00c0: 0x274a, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left - 0x00c1: 0x0621, # ARABIC LETTER HAMZA - 0x00c2: 0x0622, # ARABIC LETTER ALEF WITH MADDA ABOVE - 0x00c3: 0x0623, # ARABIC LETTER ALEF WITH HAMZA ABOVE - 0x00c4: 0x0624, # ARABIC LETTER WAW WITH HAMZA ABOVE - 0x00c5: 0x0625, # ARABIC LETTER ALEF WITH HAMZA BELOW - 0x00c6: 0x0626, # ARABIC LETTER YEH WITH HAMZA ABOVE - 0x00c7: 0x0627, # ARABIC LETTER ALEF - 0x00c8: 0x0628, # ARABIC LETTER BEH - 0x00c9: 0x0629, # ARABIC LETTER TEH MARBUTA - 0x00ca: 0x062a, # ARABIC LETTER TEH - 0x00cb: 0x062b, # ARABIC LETTER THEH - 0x00cc: 0x062c, # ARABIC LETTER JEEM - 0x00cd: 0x062d, # ARABIC LETTER HAH - 0x00ce: 0x062e, # ARABIC LETTER KHAH - 0x00cf: 0x062f, # ARABIC LETTER DAL - 0x00d0: 0x0630, # ARABIC LETTER THAL - 0x00d1: 0x0631, # ARABIC LETTER REH - 0x00d2: 0x0632, # ARABIC LETTER ZAIN - 0x00d3: 0x0633, # ARABIC LETTER SEEN - 0x00d4: 0x0634, # ARABIC LETTER SHEEN - 0x00d5: 0x0635, # ARABIC LETTER SAD - 0x00d6: 0x0636, # ARABIC LETTER DAD - 0x00d7: 0x0637, # ARABIC LETTER TAH - 0x00d8: 0x0638, # ARABIC LETTER ZAH - 0x00d9: 0x0639, # ARABIC LETTER AIN - 0x00da: 0x063a, # ARABIC LETTER GHAIN - 0x00db: 0x005b, # LEFT SQUARE BRACKET, right-left - 0x00dc: 0x005c, # REVERSE SOLIDUS, right-left - 0x00dd: 0x005d, # RIGHT SQUARE BRACKET, right-left - 0x00de: 0x005e, # CIRCUMFLEX ACCENT, right-left - 0x00df: 0x005f, # LOW LINE, right-left - 0x00e0: 0x0640, # ARABIC TATWEEL - 0x00e1: 0x0641, # ARABIC LETTER FEH - 0x00e2: 0x0642, # ARABIC LETTER QAF - 0x00e3: 0x0643, # ARABIC LETTER KAF - 0x00e4: 0x0644, # ARABIC LETTER LAM - 0x00e5: 0x0645, # ARABIC LETTER MEEM - 0x00e6: 0x0646, # ARABIC LETTER NOON - 0x00e7: 0x0647, # ARABIC LETTER HEH - 0x00e8: 0x0648, # ARABIC LETTER WAW - 0x00e9: 0x0649, # ARABIC LETTER ALEF MAKSURA - 0x00ea: 0x064a, # ARABIC LETTER YEH - 0x00eb: 0x064b, # ARABIC FATHATAN - 0x00ec: 0x064c, # ARABIC DAMMATAN - 0x00ed: 0x064d, # ARABIC KASRATAN - 0x00ee: 0x064e, # ARABIC FATHA - 0x00ef: 0x064f, # ARABIC DAMMA - 0x00f0: 0x0650, # ARABIC KASRA - 0x00f1: 0x0651, # ARABIC SHADDA - 0x00f2: 0x0652, # ARABIC SUKUN - 0x00f3: 0x067e, # ARABIC LETTER PEH - 0x00f4: 0x0679, # ARABIC LETTER TTEH - 0x00f5: 0x0686, # ARABIC LETTER TCHEH - 0x00f6: 0x06d5, # ARABIC LETTER AE - 0x00f7: 0x06a4, # ARABIC LETTER VEH - 0x00f8: 0x06af, # ARABIC LETTER GAF - 0x00f9: 0x0688, # ARABIC LETTER DDAL - 0x00fa: 0x0691, # ARABIC LETTER RREH - 0x00fb: 0x007b, # LEFT CURLY BRACKET, right-left - 0x00fc: 0x007c, # VERTICAL LINE, right-left - 0x00fd: 0x007d, # RIGHT CURLY BRACKET, right-left - 0x00fe: 0x0698, # ARABIC LETTER JEH - 0x00ff: 0x06d2, # ARABIC LETTER YEH BARREE + 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x00a0, # NO-BREAK SPACE, right-left + 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x06ba, # ARABIC LETTER NOON GHUNNA + 0x008c: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0093: 0x2026, # HORIZONTAL ELLIPSIS, right-left + 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x0098: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00f7, # DIVISION SIGN, right-left + 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x0020, # SPACE, right-left + 0x00a1: 0x0021, # EXCLAMATION MARK, right-left + 0x00a2: 0x0022, # QUOTATION MARK, right-left + 0x00a3: 0x0023, # NUMBER SIGN, right-left + 0x00a4: 0x0024, # DOLLAR SIGN, right-left + 0x00a5: 0x066a, # ARABIC PERCENT SIGN + 0x00a6: 0x0026, # AMPERSAND, right-left + 0x00a7: 0x0027, # APOSTROPHE, right-left + 0x00a8: 0x0028, # LEFT PARENTHESIS, right-left + 0x00a9: 0x0029, # RIGHT PARENTHESIS, right-left + 0x00aa: 0x002a, # ASTERISK, right-left + 0x00ab: 0x002b, # PLUS SIGN, right-left + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0x002d, # HYPHEN-MINUS, right-left + 0x00ae: 0x002e, # FULL STOP, right-left + 0x00af: 0x002f, # SOLIDUS, right-left + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x00ba: 0x003a, # COLON, right-left + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0x003c, # LESS-THAN SIGN, right-left + 0x00bd: 0x003d, # EQUALS SIGN, right-left + 0x00be: 0x003e, # GREATER-THAN SIGN, right-left + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x274a, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + 0x00c1: 0x0621, # ARABIC LETTER HAMZA + 0x00c2: 0x0622, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x00c3: 0x0623, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x00c4: 0x0624, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x00c5: 0x0625, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x00c6: 0x0626, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x00c7: 0x0627, # ARABIC LETTER ALEF + 0x00c8: 0x0628, # ARABIC LETTER BEH + 0x00c9: 0x0629, # ARABIC LETTER TEH MARBUTA + 0x00ca: 0x062a, # ARABIC LETTER TEH + 0x00cb: 0x062b, # ARABIC LETTER THEH + 0x00cc: 0x062c, # ARABIC LETTER JEEM + 0x00cd: 0x062d, # ARABIC LETTER HAH + 0x00ce: 0x062e, # ARABIC LETTER KHAH + 0x00cf: 0x062f, # ARABIC LETTER DAL + 0x00d0: 0x0630, # ARABIC LETTER THAL + 0x00d1: 0x0631, # ARABIC LETTER REH + 0x00d2: 0x0632, # ARABIC LETTER ZAIN + 0x00d3: 0x0633, # ARABIC LETTER SEEN + 0x00d4: 0x0634, # ARABIC LETTER SHEEN + 0x00d5: 0x0635, # ARABIC LETTER SAD + 0x00d6: 0x0636, # ARABIC LETTER DAD + 0x00d7: 0x0637, # ARABIC LETTER TAH + 0x00d8: 0x0638, # ARABIC LETTER ZAH + 0x00d9: 0x0639, # ARABIC LETTER AIN + 0x00da: 0x063a, # ARABIC LETTER GHAIN + 0x00db: 0x005b, # LEFT SQUARE BRACKET, right-left + 0x00dc: 0x005c, # REVERSE SOLIDUS, right-left + 0x00dd: 0x005d, # RIGHT SQUARE BRACKET, right-left + 0x00de: 0x005e, # CIRCUMFLEX ACCENT, right-left + 0x00df: 0x005f, # LOW LINE, right-left + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0x0641, # ARABIC LETTER FEH + 0x00e2: 0x0642, # ARABIC LETTER QAF + 0x00e3: 0x0643, # ARABIC LETTER KAF + 0x00e4: 0x0644, # ARABIC LETTER LAM + 0x00e5: 0x0645, # ARABIC LETTER MEEM + 0x00e6: 0x0646, # ARABIC LETTER NOON + 0x00e7: 0x0647, # ARABIC LETTER HEH + 0x00e8: 0x0648, # ARABIC LETTER WAW + 0x00e9: 0x0649, # ARABIC LETTER ALEF MAKSURA + 0x00ea: 0x064a, # ARABIC LETTER YEH + 0x00eb: 0x064b, # ARABIC FATHATAN + 0x00ec: 0x064c, # ARABIC DAMMATAN + 0x00ed: 0x064d, # ARABIC KASRATAN + 0x00ee: 0x064e, # ARABIC FATHA + 0x00ef: 0x064f, # ARABIC DAMMA + 0x00f0: 0x0650, # ARABIC KASRA + 0x00f1: 0x0651, # ARABIC SHADDA + 0x00f2: 0x0652, # ARABIC SUKUN + 0x00f3: 0x067e, # ARABIC LETTER PEH + 0x00f4: 0x0679, # ARABIC LETTER TTEH + 0x00f5: 0x0686, # ARABIC LETTER TCHEH + 0x00f6: 0x06d5, # ARABIC LETTER AE + 0x00f7: 0x06a4, # ARABIC LETTER VEH + 0x00f8: 0x06af, # ARABIC LETTER GAF + 0x00f9: 0x0688, # ARABIC LETTER DDAL + 0x00fa: 0x0691, # ARABIC LETTER RREH + 0x00fb: 0x007b, # LEFT CURLY BRACKET, right-left + 0x00fc: 0x007c, # VERTICAL LINE, right-left + 0x00fd: 0x007d, # RIGHT CURLY BRACKET, right-left + 0x00fe: 0x0698, # ARABIC LETTER JEH + 0x00ff: 0x06d2, # ARABIC LETTER YEH BARREE }) ### Decoding Table decoding_table = ( - u'\x00' # 0x0000 -> CONTROL CHARACTER - u'\x01' # 0x0001 -> CONTROL CHARACTER - u'\x02' # 0x0002 -> CONTROL CHARACTER - u'\x03' # 0x0003 -> CONTROL CHARACTER - u'\x04' # 0x0004 -> CONTROL CHARACTER - u'\x05' # 0x0005 -> CONTROL CHARACTER - u'\x06' # 0x0006 -> CONTROL CHARACTER - u'\x07' # 0x0007 -> CONTROL CHARACTER - u'\x08' # 0x0008 -> CONTROL CHARACTER - u'\t' # 0x0009 -> CONTROL CHARACTER - u'\n' # 0x000a -> CONTROL CHARACTER - u'\x0b' # 0x000b -> CONTROL CHARACTER - u'\x0c' # 0x000c -> CONTROL CHARACTER - u'\r' # 0x000d -> CONTROL CHARACTER - u'\x0e' # 0x000e -> CONTROL CHARACTER - u'\x0f' # 0x000f -> CONTROL CHARACTER - u'\x10' # 0x0010 -> CONTROL CHARACTER - u'\x11' # 0x0011 -> CONTROL CHARACTER - u'\x12' # 0x0012 -> CONTROL CHARACTER - u'\x13' # 0x0013 -> CONTROL CHARACTER - u'\x14' # 0x0014 -> CONTROL CHARACTER - u'\x15' # 0x0015 -> CONTROL CHARACTER - u'\x16' # 0x0016 -> CONTROL CHARACTER - u'\x17' # 0x0017 -> CONTROL CHARACTER - u'\x18' # 0x0018 -> CONTROL CHARACTER - u'\x19' # 0x0019 -> CONTROL CHARACTER - u'\x1a' # 0x001a -> CONTROL CHARACTER - u'\x1b' # 0x001b -> CONTROL CHARACTER - u'\x1c' # 0x001c -> CONTROL CHARACTER - u'\x1d' # 0x001d -> CONTROL CHARACTER - u'\x1e' # 0x001e -> CONTROL CHARACTER - u'\x1f' # 0x001f -> CONTROL CHARACTER - u' ' # 0x0020 -> SPACE, left-right - u'!' # 0x0021 -> EXCLAMATION MARK, left-right - u'"' # 0x0022 -> QUOTATION MARK, left-right - u'#' # 0x0023 -> NUMBER SIGN, left-right - u'$' # 0x0024 -> DOLLAR SIGN, left-right - u'%' # 0x0025 -> PERCENT SIGN, left-right - u'&' # 0x0026 -> AMPERSAND, left-right - u"'" # 0x0027 -> APOSTROPHE, left-right - u'(' # 0x0028 -> LEFT PARENTHESIS, left-right - u')' # 0x0029 -> RIGHT PARENTHESIS, left-right - u'*' # 0x002a -> ASTERISK, left-right - u'+' # 0x002b -> PLUS SIGN, left-right - u',' # 0x002c -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR - u'-' # 0x002d -> HYPHEN-MINUS, left-right - u'.' # 0x002e -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR - u'/' # 0x002f -> SOLIDUS, left-right - u'0' # 0x0030 -> DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE - u':' # 0x003a -> COLON, left-right - u';' # 0x003b -> SEMICOLON, left-right - u'<' # 0x003c -> LESS-THAN SIGN, left-right - u'=' # 0x003d -> EQUALS SIGN, left-right - u'>' # 0x003e -> GREATER-THAN SIGN, left-right - u'?' # 0x003f -> QUESTION MARK, left-right - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET, left-right - u'\\' # 0x005c -> REVERSE SOLIDUS, left-right - u']' # 0x005d -> RIGHT SQUARE BRACKET, left-right - u'^' # 0x005e -> CIRCUMFLEX ACCENT, left-right - u'_' # 0x005f -> LOW LINE, left-right - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET, left-right - u'|' # 0x007c -> VERTICAL LINE, left-right - u'}' # 0x007d -> RIGHT CURLY BRACKET, left-right - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> CONTROL CHARACTER - u'\xc4' # 0x0080 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xa0' # 0x0081 -> NO-BREAK SPACE, right-left - u'\xc7' # 0x0082 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x0083 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x0084 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x0085 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x0086 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x0087 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x0088 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x0089 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x008a -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u06ba' # 0x008b -> ARABIC LETTER NOON GHUNNA - u'\xab' # 0x008c -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - u'\xe7' # 0x008d -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x008e -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x008f -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x0090 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x0091 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x0092 -> LATIN SMALL LETTER I WITH ACUTE - u'\u2026' # 0x0093 -> HORIZONTAL ELLIPSIS, right-left - u'\xee' # 0x0094 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x0095 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x0096 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x0097 -> LATIN SMALL LETTER O WITH ACUTE - u'\xbb' # 0x0098 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - u'\xf4' # 0x0099 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x009a -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0x009b -> DIVISION SIGN, right-left - u'\xfa' # 0x009c -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x009d -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x009e -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x009f -> LATIN SMALL LETTER U WITH DIAERESIS - u' ' # 0x00a0 -> SPACE, right-left - u'!' # 0x00a1 -> EXCLAMATION MARK, right-left - u'"' # 0x00a2 -> QUOTATION MARK, right-left - u'#' # 0x00a3 -> NUMBER SIGN, right-left - u'$' # 0x00a4 -> DOLLAR SIGN, right-left - u'\u066a' # 0x00a5 -> ARABIC PERCENT SIGN - u'&' # 0x00a6 -> AMPERSAND, right-left - u"'" # 0x00a7 -> APOSTROPHE, right-left - u'(' # 0x00a8 -> LEFT PARENTHESIS, right-left - u')' # 0x00a9 -> RIGHT PARENTHESIS, right-left - u'*' # 0x00aa -> ASTERISK, right-left - u'+' # 0x00ab -> PLUS SIGN, right-left - u'\u060c' # 0x00ac -> ARABIC COMMA - u'-' # 0x00ad -> HYPHEN-MINUS, right-left - u'.' # 0x00ae -> FULL STOP, right-left - u'/' # 0x00af -> SOLIDUS, right-left - u'\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO, right-left (need override) - u'\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE, right-left (need override) - u'\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO, right-left (need override) - u'\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE, right-left (need override) - u'\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR, right-left (need override) - u'\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE, right-left (need override) - u'\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX, right-left (need override) - u'\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN, right-left (need override) - u'\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT, right-left (need override) - u'\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE, right-left (need override) - u':' # 0x00ba -> COLON, right-left - u'\u061b' # 0x00bb -> ARABIC SEMICOLON - u'<' # 0x00bc -> LESS-THAN SIGN, right-left - u'=' # 0x00bd -> EQUALS SIGN, right-left - u'>' # 0x00be -> GREATER-THAN SIGN, right-left - u'\u061f' # 0x00bf -> ARABIC QUESTION MARK - u'\u274a' # 0x00c0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left - u'\u0621' # 0x00c1 -> ARABIC LETTER HAMZA - u'\u0622' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE - u'\u0623' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE - u'\u0624' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE - u'\u0625' # 0x00c5 -> ARABIC LETTER ALEF WITH HAMZA BELOW - u'\u0626' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE - u'\u0627' # 0x00c7 -> ARABIC LETTER ALEF - u'\u0628' # 0x00c8 -> ARABIC LETTER BEH - u'\u0629' # 0x00c9 -> ARABIC LETTER TEH MARBUTA - u'\u062a' # 0x00ca -> ARABIC LETTER TEH - u'\u062b' # 0x00cb -> ARABIC LETTER THEH - u'\u062c' # 0x00cc -> ARABIC LETTER JEEM - u'\u062d' # 0x00cd -> ARABIC LETTER HAH - u'\u062e' # 0x00ce -> ARABIC LETTER KHAH - u'\u062f' # 0x00cf -> ARABIC LETTER DAL - u'\u0630' # 0x00d0 -> ARABIC LETTER THAL - u'\u0631' # 0x00d1 -> ARABIC LETTER REH - u'\u0632' # 0x00d2 -> ARABIC LETTER ZAIN - u'\u0633' # 0x00d3 -> ARABIC LETTER SEEN - u'\u0634' # 0x00d4 -> ARABIC LETTER SHEEN - u'\u0635' # 0x00d5 -> ARABIC LETTER SAD - u'\u0636' # 0x00d6 -> ARABIC LETTER DAD - u'\u0637' # 0x00d7 -> ARABIC LETTER TAH - u'\u0638' # 0x00d8 -> ARABIC LETTER ZAH - u'\u0639' # 0x00d9 -> ARABIC LETTER AIN - u'\u063a' # 0x00da -> ARABIC LETTER GHAIN - u'[' # 0x00db -> LEFT SQUARE BRACKET, right-left - u'\\' # 0x00dc -> REVERSE SOLIDUS, right-left - u']' # 0x00dd -> RIGHT SQUARE BRACKET, right-left - u'^' # 0x00de -> CIRCUMFLEX ACCENT, right-left - u'_' # 0x00df -> LOW LINE, right-left - u'\u0640' # 0x00e0 -> ARABIC TATWEEL - u'\u0641' # 0x00e1 -> ARABIC LETTER FEH - u'\u0642' # 0x00e2 -> ARABIC LETTER QAF - u'\u0643' # 0x00e3 -> ARABIC LETTER KAF - u'\u0644' # 0x00e4 -> ARABIC LETTER LAM - u'\u0645' # 0x00e5 -> ARABIC LETTER MEEM - u'\u0646' # 0x00e6 -> ARABIC LETTER NOON - u'\u0647' # 0x00e7 -> ARABIC LETTER HEH - u'\u0648' # 0x00e8 -> ARABIC LETTER WAW - u'\u0649' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA - u'\u064a' # 0x00ea -> ARABIC LETTER YEH - u'\u064b' # 0x00eb -> ARABIC FATHATAN - u'\u064c' # 0x00ec -> ARABIC DAMMATAN - u'\u064d' # 0x00ed -> ARABIC KASRATAN - u'\u064e' # 0x00ee -> ARABIC FATHA - u'\u064f' # 0x00ef -> ARABIC DAMMA - u'\u0650' # 0x00f0 -> ARABIC KASRA - u'\u0651' # 0x00f1 -> ARABIC SHADDA - u'\u0652' # 0x00f2 -> ARABIC SUKUN - u'\u067e' # 0x00f3 -> ARABIC LETTER PEH - u'\u0679' # 0x00f4 -> ARABIC LETTER TTEH - u'\u0686' # 0x00f5 -> ARABIC LETTER TCHEH - u'\u06d5' # 0x00f6 -> ARABIC LETTER AE - u'\u06a4' # 0x00f7 -> ARABIC LETTER VEH - u'\u06af' # 0x00f8 -> ARABIC LETTER GAF - u'\u0688' # 0x00f9 -> ARABIC LETTER DDAL - u'\u0691' # 0x00fa -> ARABIC LETTER RREH - u'{' # 0x00fb -> LEFT CURLY BRACKET, right-left - u'|' # 0x00fc -> VERTICAL LINE, right-left - u'}' # 0x00fd -> RIGHT CURLY BRACKET, right-left - u'\u0698' # 0x00fe -> ARABIC LETTER JEH - u'\u06d2' # 0x00ff -> ARABIC LETTER YEH BARREE + u'\x00' # 0x0000 -> CONTROL CHARACTER + u'\x01' # 0x0001 -> CONTROL CHARACTER + u'\x02' # 0x0002 -> CONTROL CHARACTER + u'\x03' # 0x0003 -> CONTROL CHARACTER + u'\x04' # 0x0004 -> CONTROL CHARACTER + u'\x05' # 0x0005 -> CONTROL CHARACTER + u'\x06' # 0x0006 -> CONTROL CHARACTER + u'\x07' # 0x0007 -> CONTROL CHARACTER + u'\x08' # 0x0008 -> CONTROL CHARACTER + u'\t' # 0x0009 -> CONTROL CHARACTER + u'\n' # 0x000a -> CONTROL CHARACTER + u'\x0b' # 0x000b -> CONTROL CHARACTER + u'\x0c' # 0x000c -> CONTROL CHARACTER + u'\r' # 0x000d -> CONTROL CHARACTER + u'\x0e' # 0x000e -> CONTROL CHARACTER + u'\x0f' # 0x000f -> CONTROL CHARACTER + u'\x10' # 0x0010 -> CONTROL CHARACTER + u'\x11' # 0x0011 -> CONTROL CHARACTER + u'\x12' # 0x0012 -> CONTROL CHARACTER + u'\x13' # 0x0013 -> CONTROL CHARACTER + u'\x14' # 0x0014 -> CONTROL CHARACTER + u'\x15' # 0x0015 -> CONTROL CHARACTER + u'\x16' # 0x0016 -> CONTROL CHARACTER + u'\x17' # 0x0017 -> CONTROL CHARACTER + u'\x18' # 0x0018 -> CONTROL CHARACTER + u'\x19' # 0x0019 -> CONTROL CHARACTER + u'\x1a' # 0x001a -> CONTROL CHARACTER + u'\x1b' # 0x001b -> CONTROL CHARACTER + u'\x1c' # 0x001c -> CONTROL CHARACTER + u'\x1d' # 0x001d -> CONTROL CHARACTER + u'\x1e' # 0x001e -> CONTROL CHARACTER + u'\x1f' # 0x001f -> CONTROL CHARACTER + u' ' # 0x0020 -> SPACE, left-right + u'!' # 0x0021 -> EXCLAMATION MARK, left-right + u'"' # 0x0022 -> QUOTATION MARK, left-right + u'#' # 0x0023 -> NUMBER SIGN, left-right + u'$' # 0x0024 -> DOLLAR SIGN, left-right + u'%' # 0x0025 -> PERCENT SIGN, left-right + u'&' # 0x0026 -> AMPERSAND, left-right + u"'" # 0x0027 -> APOSTROPHE, left-right + u'(' # 0x0028 -> LEFT PARENTHESIS, left-right + u')' # 0x0029 -> RIGHT PARENTHESIS, left-right + u'*' # 0x002a -> ASTERISK, left-right + u'+' # 0x002b -> PLUS SIGN, left-right + u',' # 0x002c -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + u'-' # 0x002d -> HYPHEN-MINUS, left-right + u'.' # 0x002e -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + u'/' # 0x002f -> SOLIDUS, left-right + u'0' # 0x0030 -> DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + u'1' # 0x0031 -> DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + u'2' # 0x0032 -> DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + u'3' # 0x0033 -> DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + u'4' # 0x0034 -> DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + u'5' # 0x0035 -> DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + u'6' # 0x0036 -> DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + u'7' # 0x0037 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + u'8' # 0x0038 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + u'9' # 0x0039 -> DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + u':' # 0x003a -> COLON, left-right + u';' # 0x003b -> SEMICOLON, left-right + u'<' # 0x003c -> LESS-THAN SIGN, left-right + u'=' # 0x003d -> EQUALS SIGN, left-right + u'>' # 0x003e -> GREATER-THAN SIGN, left-right + u'?' # 0x003f -> QUESTION MARK, left-right + u'@' # 0x0040 -> COMMERCIAL AT + u'A' # 0x0041 -> LATIN CAPITAL LETTER A + u'B' # 0x0042 -> LATIN CAPITAL LETTER B + u'C' # 0x0043 -> LATIN CAPITAL LETTER C + u'D' # 0x0044 -> LATIN CAPITAL LETTER D + u'E' # 0x0045 -> LATIN CAPITAL LETTER E + u'F' # 0x0046 -> LATIN CAPITAL LETTER F + u'G' # 0x0047 -> LATIN CAPITAL LETTER G + u'H' # 0x0048 -> LATIN CAPITAL LETTER H + u'I' # 0x0049 -> LATIN CAPITAL LETTER I + u'J' # 0x004a -> LATIN CAPITAL LETTER J + u'K' # 0x004b -> LATIN CAPITAL LETTER K + u'L' # 0x004c -> LATIN CAPITAL LETTER L + u'M' # 0x004d -> LATIN CAPITAL LETTER M + u'N' # 0x004e -> LATIN CAPITAL LETTER N + u'O' # 0x004f -> LATIN CAPITAL LETTER O + u'P' # 0x0050 -> LATIN CAPITAL LETTER P + u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + u'R' # 0x0052 -> LATIN CAPITAL LETTER R + u'S' # 0x0053 -> LATIN CAPITAL LETTER S + u'T' # 0x0054 -> LATIN CAPITAL LETTER T + u'U' # 0x0055 -> LATIN CAPITAL LETTER U + u'V' # 0x0056 -> LATIN CAPITAL LETTER V + u'W' # 0x0057 -> LATIN CAPITAL LETTER W + u'X' # 0x0058 -> LATIN CAPITAL LETTER X + u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + u'Z' # 0x005a -> LATIN CAPITAL LETTER Z + u'[' # 0x005b -> LEFT SQUARE BRACKET, left-right + u'\\' # 0x005c -> REVERSE SOLIDUS, left-right + u']' # 0x005d -> RIGHT SQUARE BRACKET, left-right + u'^' # 0x005e -> CIRCUMFLEX ACCENT, left-right + u'_' # 0x005f -> LOW LINE, left-right + u'`' # 0x0060 -> GRAVE ACCENT + u'a' # 0x0061 -> LATIN SMALL LETTER A + u'b' # 0x0062 -> LATIN SMALL LETTER B + u'c' # 0x0063 -> LATIN SMALL LETTER C + u'd' # 0x0064 -> LATIN SMALL LETTER D + u'e' # 0x0065 -> LATIN SMALL LETTER E + u'f' # 0x0066 -> LATIN SMALL LETTER F + u'g' # 0x0067 -> LATIN SMALL LETTER G + u'h' # 0x0068 -> LATIN SMALL LETTER H + u'i' # 0x0069 -> LATIN SMALL LETTER I + u'j' # 0x006a -> LATIN SMALL LETTER J + u'k' # 0x006b -> LATIN SMALL LETTER K + u'l' # 0x006c -> LATIN SMALL LETTER L + u'm' # 0x006d -> LATIN SMALL LETTER M + u'n' # 0x006e -> LATIN SMALL LETTER N + u'o' # 0x006f -> LATIN SMALL LETTER O + u'p' # 0x0070 -> LATIN SMALL LETTER P + u'q' # 0x0071 -> LATIN SMALL LETTER Q + u'r' # 0x0072 -> LATIN SMALL LETTER R + u's' # 0x0073 -> LATIN SMALL LETTER S + u't' # 0x0074 -> LATIN SMALL LETTER T + u'u' # 0x0075 -> LATIN SMALL LETTER U + u'v' # 0x0076 -> LATIN SMALL LETTER V + u'w' # 0x0077 -> LATIN SMALL LETTER W + u'x' # 0x0078 -> LATIN SMALL LETTER X + u'y' # 0x0079 -> LATIN SMALL LETTER Y + u'z' # 0x007a -> LATIN SMALL LETTER Z + u'{' # 0x007b -> LEFT CURLY BRACKET, left-right + u'|' # 0x007c -> VERTICAL LINE, left-right + u'}' # 0x007d -> RIGHT CURLY BRACKET, left-right + u'~' # 0x007e -> TILDE + u'\x7f' # 0x007f -> CONTROL CHARACTER + u'\xc4' # 0x0080 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xa0' # 0x0081 -> NO-BREAK SPACE, right-left + u'\xc7' # 0x0082 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x0083 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x0084 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x0085 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x0086 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x0087 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x0088 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x0089 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x008a -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u06ba' # 0x008b -> ARABIC LETTER NOON GHUNNA + u'\xab' # 0x008c -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + u'\xe7' # 0x008d -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x008e -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x008f -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x0090 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x0091 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x0092 -> LATIN SMALL LETTER I WITH ACUTE + u'\u2026' # 0x0093 -> HORIZONTAL ELLIPSIS, right-left + u'\xee' # 0x0094 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x0095 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x0096 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x0097 -> LATIN SMALL LETTER O WITH ACUTE + u'\xbb' # 0x0098 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + u'\xf4' # 0x0099 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x009a -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0x009b -> DIVISION SIGN, right-left + u'\xfa' # 0x009c -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x009d -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x009e -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x009f -> LATIN SMALL LETTER U WITH DIAERESIS + u' ' # 0x00a0 -> SPACE, right-left + u'!' # 0x00a1 -> EXCLAMATION MARK, right-left + u'"' # 0x00a2 -> QUOTATION MARK, right-left + u'#' # 0x00a3 -> NUMBER SIGN, right-left + u'$' # 0x00a4 -> DOLLAR SIGN, right-left + u'\u066a' # 0x00a5 -> ARABIC PERCENT SIGN + u'&' # 0x00a6 -> AMPERSAND, right-left + u"'" # 0x00a7 -> APOSTROPHE, right-left + u'(' # 0x00a8 -> LEFT PARENTHESIS, right-left + u')' # 0x00a9 -> RIGHT PARENTHESIS, right-left + u'*' # 0x00aa -> ASTERISK, right-left + u'+' # 0x00ab -> PLUS SIGN, right-left + u'\u060c' # 0x00ac -> ARABIC COMMA + u'-' # 0x00ad -> HYPHEN-MINUS, right-left + u'.' # 0x00ae -> FULL STOP, right-left + u'/' # 0x00af -> SOLIDUS, right-left + u'\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO, right-left (need override) + u'\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE, right-left (need override) + u'\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO, right-left (need override) + u'\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE, right-left (need override) + u'\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR, right-left (need override) + u'\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE, right-left (need override) + u'\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX, right-left (need override) + u'\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN, right-left (need override) + u'\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT, right-left (need override) + u'\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE, right-left (need override) + u':' # 0x00ba -> COLON, right-left + u'\u061b' # 0x00bb -> ARABIC SEMICOLON + u'<' # 0x00bc -> LESS-THAN SIGN, right-left + u'=' # 0x00bd -> EQUALS SIGN, right-left + u'>' # 0x00be -> GREATER-THAN SIGN, right-left + u'\u061f' # 0x00bf -> ARABIC QUESTION MARK + u'\u274a' # 0x00c0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + u'\u0621' # 0x00c1 -> ARABIC LETTER HAMZA + u'\u0622' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\u0625' # 0x00c5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0x00c7 -> ARABIC LETTER ALEF + u'\u0628' # 0x00c8 -> ARABIC LETTER BEH + u'\u0629' # 0x00c9 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0x00ca -> ARABIC LETTER TEH + u'\u062b' # 0x00cb -> ARABIC LETTER THEH + u'\u062c' # 0x00cc -> ARABIC LETTER JEEM + u'\u062d' # 0x00cd -> ARABIC LETTER HAH + u'\u062e' # 0x00ce -> ARABIC LETTER KHAH + u'\u062f' # 0x00cf -> ARABIC LETTER DAL + u'\u0630' # 0x00d0 -> ARABIC LETTER THAL + u'\u0631' # 0x00d1 -> ARABIC LETTER REH + u'\u0632' # 0x00d2 -> ARABIC LETTER ZAIN + u'\u0633' # 0x00d3 -> ARABIC LETTER SEEN + u'\u0634' # 0x00d4 -> ARABIC LETTER SHEEN + u'\u0635' # 0x00d5 -> ARABIC LETTER SAD + u'\u0636' # 0x00d6 -> ARABIC LETTER DAD + u'\u0637' # 0x00d7 -> ARABIC LETTER TAH + u'\u0638' # 0x00d8 -> ARABIC LETTER ZAH + u'\u0639' # 0x00d9 -> ARABIC LETTER AIN + u'\u063a' # 0x00da -> ARABIC LETTER GHAIN + u'[' # 0x00db -> LEFT SQUARE BRACKET, right-left + u'\\' # 0x00dc -> REVERSE SOLIDUS, right-left + u']' # 0x00dd -> RIGHT SQUARE BRACKET, right-left + u'^' # 0x00de -> CIRCUMFLEX ACCENT, right-left + u'_' # 0x00df -> LOW LINE, right-left + u'\u0640' # 0x00e0 -> ARABIC TATWEEL + u'\u0641' # 0x00e1 -> ARABIC LETTER FEH + u'\u0642' # 0x00e2 -> ARABIC LETTER QAF + u'\u0643' # 0x00e3 -> ARABIC LETTER KAF + u'\u0644' # 0x00e4 -> ARABIC LETTER LAM + u'\u0645' # 0x00e5 -> ARABIC LETTER MEEM + u'\u0646' # 0x00e6 -> ARABIC LETTER NOON + u'\u0647' # 0x00e7 -> ARABIC LETTER HEH + u'\u0648' # 0x00e8 -> ARABIC LETTER WAW + u'\u0649' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0x00ea -> ARABIC LETTER YEH + u'\u064b' # 0x00eb -> ARABIC FATHATAN + u'\u064c' # 0x00ec -> ARABIC DAMMATAN + u'\u064d' # 0x00ed -> ARABIC KASRATAN + u'\u064e' # 0x00ee -> ARABIC FATHA + u'\u064f' # 0x00ef -> ARABIC DAMMA + u'\u0650' # 0x00f0 -> ARABIC KASRA + u'\u0651' # 0x00f1 -> ARABIC SHADDA + u'\u0652' # 0x00f2 -> ARABIC SUKUN + u'\u067e' # 0x00f3 -> ARABIC LETTER PEH + u'\u0679' # 0x00f4 -> ARABIC LETTER TTEH + u'\u0686' # 0x00f5 -> ARABIC LETTER TCHEH + u'\u06d5' # 0x00f6 -> ARABIC LETTER AE + u'\u06a4' # 0x00f7 -> ARABIC LETTER VEH + u'\u06af' # 0x00f8 -> ARABIC LETTER GAF + u'\u0688' # 0x00f9 -> ARABIC LETTER DDAL + u'\u0691' # 0x00fa -> ARABIC LETTER RREH + u'{' # 0x00fb -> LEFT CURLY BRACKET, right-left + u'|' # 0x00fc -> VERTICAL LINE, right-left + u'}' # 0x00fd -> RIGHT CURLY BRACKET, right-left + u'\u0698' # 0x00fe -> ARABIC LETTER JEH + u'\u06d2' # 0x00ff -> ARABIC LETTER YEH BARREE ) ### Encoding Map encoding_map = { - 0x0000: 0x0000, # CONTROL CHARACTER - 0x0001: 0x0001, # CONTROL CHARACTER - 0x0002: 0x0002, # CONTROL CHARACTER - 0x0003: 0x0003, # CONTROL CHARACTER - 0x0004: 0x0004, # CONTROL CHARACTER - 0x0005: 0x0005, # CONTROL CHARACTER - 0x0006: 0x0006, # CONTROL CHARACTER - 0x0007: 0x0007, # CONTROL CHARACTER - 0x0008: 0x0008, # CONTROL CHARACTER - 0x0009: 0x0009, # CONTROL CHARACTER - 0x000a: 0x000a, # CONTROL CHARACTER - 0x000b: 0x000b, # CONTROL CHARACTER - 0x000c: 0x000c, # CONTROL CHARACTER - 0x000d: 0x000d, # CONTROL CHARACTER - 0x000e: 0x000e, # CONTROL CHARACTER - 0x000f: 0x000f, # CONTROL CHARACTER - 0x0010: 0x0010, # CONTROL CHARACTER - 0x0011: 0x0011, # CONTROL CHARACTER - 0x0012: 0x0012, # CONTROL CHARACTER - 0x0013: 0x0013, # CONTROL CHARACTER - 0x0014: 0x0014, # CONTROL CHARACTER - 0x0015: 0x0015, # CONTROL CHARACTER - 0x0016: 0x0016, # CONTROL CHARACTER - 0x0017: 0x0017, # CONTROL CHARACTER - 0x0018: 0x0018, # CONTROL CHARACTER - 0x0019: 0x0019, # CONTROL CHARACTER - 0x001a: 0x001a, # CONTROL CHARACTER - 0x001b: 0x001b, # CONTROL CHARACTER - 0x001c: 0x001c, # CONTROL CHARACTER - 0x001d: 0x001d, # CONTROL CHARACTER - 0x001e: 0x001e, # CONTROL CHARACTER - 0x001f: 0x001f, # CONTROL CHARACTER - 0x0020: 0x0020, # SPACE, left-right - 0x0020: 0x00a0, # SPACE, right-left - 0x0021: 0x0021, # EXCLAMATION MARK, left-right - 0x0021: 0x00a1, # EXCLAMATION MARK, right-left - 0x0022: 0x0022, # QUOTATION MARK, left-right - 0x0022: 0x00a2, # QUOTATION MARK, right-left - 0x0023: 0x0023, # NUMBER SIGN, left-right - 0x0023: 0x00a3, # NUMBER SIGN, right-left - 0x0024: 0x0024, # DOLLAR SIGN, left-right - 0x0024: 0x00a4, # DOLLAR SIGN, right-left - 0x0025: 0x0025, # PERCENT SIGN, left-right - 0x0026: 0x0026, # AMPERSAND, left-right - 0x0026: 0x00a6, # AMPERSAND, right-left - 0x0027: 0x0027, # APOSTROPHE, left-right - 0x0027: 0x00a7, # APOSTROPHE, right-left - 0x0028: 0x0028, # LEFT PARENTHESIS, left-right - 0x0028: 0x00a8, # LEFT PARENTHESIS, right-left - 0x0029: 0x0029, # RIGHT PARENTHESIS, left-right - 0x0029: 0x00a9, # RIGHT PARENTHESIS, right-left - 0x002a: 0x002a, # ASTERISK, left-right - 0x002a: 0x00aa, # ASTERISK, right-left - 0x002b: 0x002b, # PLUS SIGN, left-right - 0x002b: 0x00ab, # PLUS SIGN, right-left - 0x002c: 0x002c, # COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR - 0x002d: 0x002d, # HYPHEN-MINUS, left-right - 0x002d: 0x00ad, # HYPHEN-MINUS, right-left - 0x002e: 0x002e, # FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR - 0x002e: 0x00ae, # FULL STOP, right-left - 0x002f: 0x002f, # SOLIDUS, left-right - 0x002f: 0x00af, # SOLIDUS, right-left - 0x0030: 0x0030, # DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE - 0x003a: 0x003a, # COLON, left-right - 0x003a: 0x00ba, # COLON, right-left - 0x003b: 0x003b, # SEMICOLON, left-right - 0x003c: 0x003c, # LESS-THAN SIGN, left-right - 0x003c: 0x00bc, # LESS-THAN SIGN, right-left - 0x003d: 0x003d, # EQUALS SIGN, left-right - 0x003d: 0x00bd, # EQUALS SIGN, right-left - 0x003e: 0x003e, # GREATER-THAN SIGN, left-right - 0x003e: 0x00be, # GREATER-THAN SIGN, right-left - 0x003f: 0x003f, # QUESTION MARK, left-right - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET, left-right - 0x005b: 0x00db, # LEFT SQUARE BRACKET, right-left - 0x005c: 0x005c, # REVERSE SOLIDUS, left-right - 0x005c: 0x00dc, # REVERSE SOLIDUS, right-left - 0x005d: 0x005d, # RIGHT SQUARE BRACKET, left-right - 0x005d: 0x00dd, # RIGHT SQUARE BRACKET, right-left - 0x005e: 0x005e, # CIRCUMFLEX ACCENT, left-right - 0x005e: 0x00de, # CIRCUMFLEX ACCENT, right-left - 0x005f: 0x005f, # LOW LINE, left-right - 0x005f: 0x00df, # LOW LINE, right-left - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET, left-right - 0x007b: 0x00fb, # LEFT CURLY BRACKET, right-left - 0x007c: 0x007c, # VERTICAL LINE, left-right - 0x007c: 0x00fc, # VERTICAL LINE, right-left - 0x007d: 0x007d, # RIGHT CURLY BRACKET, left-right - 0x007d: 0x00fd, # RIGHT CURLY BRACKET, right-left - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # CONTROL CHARACTER - 0x00a0: 0x0081, # NO-BREAK SPACE, right-left - 0x00ab: 0x008c, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - 0x00bb: 0x0098, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - 0x00c4: 0x0080, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c7: 0x0082, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c9: 0x0083, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00d1: 0x0084, # LATIN CAPITAL LETTER N WITH TILDE - 0x00d6: 0x0085, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00dc: 0x0086, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00e0: 0x0088, # LATIN SMALL LETTER A WITH GRAVE - 0x00e1: 0x0087, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0089, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e4: 0x008a, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e7: 0x008d, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008f, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x008e, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0090, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00eb: 0x0091, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ed: 0x0092, # LATIN SMALL LETTER I WITH ACUTE - 0x00ee: 0x0094, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00ef: 0x0095, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00f1: 0x0096, # LATIN SMALL LETTER N WITH TILDE - 0x00f3: 0x0097, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0099, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f6: 0x009a, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x009b, # DIVISION SIGN, right-left - 0x00f9: 0x009d, # LATIN SMALL LETTER U WITH GRAVE - 0x00fa: 0x009c, # LATIN SMALL LETTER U WITH ACUTE - 0x00fb: 0x009e, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00fc: 0x009f, # LATIN SMALL LETTER U WITH DIAERESIS - 0x060c: 0x00ac, # ARABIC COMMA - 0x061b: 0x00bb, # ARABIC SEMICOLON - 0x061f: 0x00bf, # ARABIC QUESTION MARK - 0x0621: 0x00c1, # ARABIC LETTER HAMZA - 0x0622: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE - 0x0623: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE - 0x0624: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE - 0x0625: 0x00c5, # ARABIC LETTER ALEF WITH HAMZA BELOW - 0x0626: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE - 0x0627: 0x00c7, # ARABIC LETTER ALEF - 0x0628: 0x00c8, # ARABIC LETTER BEH - 0x0629: 0x00c9, # ARABIC LETTER TEH MARBUTA - 0x062a: 0x00ca, # ARABIC LETTER TEH - 0x062b: 0x00cb, # ARABIC LETTER THEH - 0x062c: 0x00cc, # ARABIC LETTER JEEM - 0x062d: 0x00cd, # ARABIC LETTER HAH - 0x062e: 0x00ce, # ARABIC LETTER KHAH - 0x062f: 0x00cf, # ARABIC LETTER DAL - 0x0630: 0x00d0, # ARABIC LETTER THAL - 0x0631: 0x00d1, # ARABIC LETTER REH - 0x0632: 0x00d2, # ARABIC LETTER ZAIN - 0x0633: 0x00d3, # ARABIC LETTER SEEN - 0x0634: 0x00d4, # ARABIC LETTER SHEEN - 0x0635: 0x00d5, # ARABIC LETTER SAD - 0x0636: 0x00d6, # ARABIC LETTER DAD - 0x0637: 0x00d7, # ARABIC LETTER TAH - 0x0638: 0x00d8, # ARABIC LETTER ZAH - 0x0639: 0x00d9, # ARABIC LETTER AIN - 0x063a: 0x00da, # ARABIC LETTER GHAIN - 0x0640: 0x00e0, # ARABIC TATWEEL - 0x0641: 0x00e1, # ARABIC LETTER FEH - 0x0642: 0x00e2, # ARABIC LETTER QAF - 0x0643: 0x00e3, # ARABIC LETTER KAF - 0x0644: 0x00e4, # ARABIC LETTER LAM - 0x0645: 0x00e5, # ARABIC LETTER MEEM - 0x0646: 0x00e6, # ARABIC LETTER NOON - 0x0647: 0x00e7, # ARABIC LETTER HEH - 0x0648: 0x00e8, # ARABIC LETTER WAW - 0x0649: 0x00e9, # ARABIC LETTER ALEF MAKSURA - 0x064a: 0x00ea, # ARABIC LETTER YEH - 0x064b: 0x00eb, # ARABIC FATHATAN - 0x064c: 0x00ec, # ARABIC DAMMATAN - 0x064d: 0x00ed, # ARABIC KASRATAN - 0x064e: 0x00ee, # ARABIC FATHA - 0x064f: 0x00ef, # ARABIC DAMMA - 0x0650: 0x00f0, # ARABIC KASRA - 0x0651: 0x00f1, # ARABIC SHADDA - 0x0652: 0x00f2, # ARABIC SUKUN - 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO, right-left (need override) - 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE, right-left (need override) - 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO, right-left (need override) - 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE, right-left (need override) - 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR, right-left (need override) - 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE, right-left (need override) - 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX, right-left (need override) - 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) - 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) - 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE, right-left (need override) - 0x066a: 0x00a5, # ARABIC PERCENT SIGN - 0x0679: 0x00f4, # ARABIC LETTER TTEH - 0x067e: 0x00f3, # ARABIC LETTER PEH - 0x0686: 0x00f5, # ARABIC LETTER TCHEH - 0x0688: 0x00f9, # ARABIC LETTER DDAL - 0x0691: 0x00fa, # ARABIC LETTER RREH - 0x0698: 0x00fe, # ARABIC LETTER JEH - 0x06a4: 0x00f7, # ARABIC LETTER VEH - 0x06af: 0x00f8, # ARABIC LETTER GAF - 0x06ba: 0x008b, # ARABIC LETTER NOON GHUNNA - 0x06d2: 0x00ff, # ARABIC LETTER YEH BARREE - 0x06d5: 0x00f6, # ARABIC LETTER AE - 0x2026: 0x0093, # HORIZONTAL ELLIPSIS, right-left - 0x274a: 0x00c0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left -} \ No newline at end of file + 0x0000: 0x0000, # CONTROL CHARACTER + 0x0001: 0x0001, # CONTROL CHARACTER + 0x0002: 0x0002, # CONTROL CHARACTER + 0x0003: 0x0003, # CONTROL CHARACTER + 0x0004: 0x0004, # CONTROL CHARACTER + 0x0005: 0x0005, # CONTROL CHARACTER + 0x0006: 0x0006, # CONTROL CHARACTER + 0x0007: 0x0007, # CONTROL CHARACTER + 0x0008: 0x0008, # CONTROL CHARACTER + 0x0009: 0x0009, # CONTROL CHARACTER + 0x000a: 0x000a, # CONTROL CHARACTER + 0x000b: 0x000b, # CONTROL CHARACTER + 0x000c: 0x000c, # CONTROL CHARACTER + 0x000d: 0x000d, # CONTROL CHARACTER + 0x000e: 0x000e, # CONTROL CHARACTER + 0x000f: 0x000f, # CONTROL CHARACTER + 0x0010: 0x0010, # CONTROL CHARACTER + 0x0011: 0x0011, # CONTROL CHARACTER + 0x0012: 0x0012, # CONTROL CHARACTER + 0x0013: 0x0013, # CONTROL CHARACTER + 0x0014: 0x0014, # CONTROL CHARACTER + 0x0015: 0x0015, # CONTROL CHARACTER + 0x0016: 0x0016, # CONTROL CHARACTER + 0x0017: 0x0017, # CONTROL CHARACTER + 0x0018: 0x0018, # CONTROL CHARACTER + 0x0019: 0x0019, # CONTROL CHARACTER + 0x001a: 0x001a, # CONTROL CHARACTER + 0x001b: 0x001b, # CONTROL CHARACTER + 0x001c: 0x001c, # CONTROL CHARACTER + 0x001d: 0x001d, # CONTROL CHARACTER + 0x001e: 0x001e, # CONTROL CHARACTER + 0x001f: 0x001f, # CONTROL CHARACTER + 0x0020: 0x0020, # SPACE, left-right + 0x0020: 0x00a0, # SPACE, right-left + 0x0021: 0x0021, # EXCLAMATION MARK, left-right + 0x0021: 0x00a1, # EXCLAMATION MARK, right-left + 0x0022: 0x0022, # QUOTATION MARK, left-right + 0x0022: 0x00a2, # QUOTATION MARK, right-left + 0x0023: 0x0023, # NUMBER SIGN, left-right + 0x0023: 0x00a3, # NUMBER SIGN, right-left + 0x0024: 0x0024, # DOLLAR SIGN, left-right + 0x0024: 0x00a4, # DOLLAR SIGN, right-left + 0x0025: 0x0025, # PERCENT SIGN, left-right + 0x0026: 0x0026, # AMPERSAND, left-right + 0x0026: 0x00a6, # AMPERSAND, right-left + 0x0027: 0x0027, # APOSTROPHE, left-right + 0x0027: 0x00a7, # APOSTROPHE, right-left + 0x0028: 0x0028, # LEFT PARENTHESIS, left-right + 0x0028: 0x00a8, # LEFT PARENTHESIS, right-left + 0x0029: 0x0029, # RIGHT PARENTHESIS, left-right + 0x0029: 0x00a9, # RIGHT PARENTHESIS, right-left + 0x002a: 0x002a, # ASTERISK, left-right + 0x002a: 0x00aa, # ASTERISK, right-left + 0x002b: 0x002b, # PLUS SIGN, left-right + 0x002b: 0x00ab, # PLUS SIGN, right-left + 0x002c: 0x002c, # COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + 0x002d: 0x002d, # HYPHEN-MINUS, left-right + 0x002d: 0x00ad, # HYPHEN-MINUS, right-left + 0x002e: 0x002e, # FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + 0x002e: 0x00ae, # FULL STOP, right-left + 0x002f: 0x002f, # SOLIDUS, left-right + 0x002f: 0x00af, # SOLIDUS, right-left + 0x0030: 0x0030, # DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + 0x003a: 0x003a, # COLON, left-right + 0x003a: 0x00ba, # COLON, right-left + 0x003b: 0x003b, # SEMICOLON, left-right + 0x003c: 0x003c, # LESS-THAN SIGN, left-right + 0x003c: 0x00bc, # LESS-THAN SIGN, right-left + 0x003d: 0x003d, # EQUALS SIGN, left-right + 0x003d: 0x00bd, # EQUALS SIGN, right-left + 0x003e: 0x003e, # GREATER-THAN SIGN, left-right + 0x003e: 0x00be, # GREATER-THAN SIGN, right-left + 0x003f: 0x003f, # QUESTION MARK, left-right + 0x0040: 0x0040, # COMMERCIAL AT + 0x0041: 0x0041, # LATIN CAPITAL LETTER A + 0x0042: 0x0042, # LATIN CAPITAL LETTER B + 0x0043: 0x0043, # LATIN CAPITAL LETTER C + 0x0044: 0x0044, # LATIN CAPITAL LETTER D + 0x0045: 0x0045, # LATIN CAPITAL LETTER E + 0x0046: 0x0046, # LATIN CAPITAL LETTER F + 0x0047: 0x0047, # LATIN CAPITAL LETTER G + 0x0048: 0x0048, # LATIN CAPITAL LETTER H + 0x0049: 0x0049, # LATIN CAPITAL LETTER I + 0x004a: 0x004a, # LATIN CAPITAL LETTER J + 0x004b: 0x004b, # LATIN CAPITAL LETTER K + 0x004c: 0x004c, # LATIN CAPITAL LETTER L + 0x004d: 0x004d, # LATIN CAPITAL LETTER M + 0x004e: 0x004e, # LATIN CAPITAL LETTER N + 0x004f: 0x004f, # LATIN CAPITAL LETTER O + 0x0050: 0x0050, # LATIN CAPITAL LETTER P + 0x0051: 0x0051, # LATIN CAPITAL LETTER Q + 0x0052: 0x0052, # LATIN CAPITAL LETTER R + 0x0053: 0x0053, # LATIN CAPITAL LETTER S + 0x0054: 0x0054, # LATIN CAPITAL LETTER T + 0x0055: 0x0055, # LATIN CAPITAL LETTER U + 0x0056: 0x0056, # LATIN CAPITAL LETTER V + 0x0057: 0x0057, # LATIN CAPITAL LETTER W + 0x0058: 0x0058, # LATIN CAPITAL LETTER X + 0x0059: 0x0059, # LATIN CAPITAL LETTER Y + 0x005a: 0x005a, # LATIN CAPITAL LETTER Z + 0x005b: 0x005b, # LEFT SQUARE BRACKET, left-right + 0x005b: 0x00db, # LEFT SQUARE BRACKET, right-left + 0x005c: 0x005c, # REVERSE SOLIDUS, left-right + 0x005c: 0x00dc, # REVERSE SOLIDUS, right-left + 0x005d: 0x005d, # RIGHT SQUARE BRACKET, left-right + 0x005d: 0x00dd, # RIGHT SQUARE BRACKET, right-left + 0x005e: 0x005e, # CIRCUMFLEX ACCENT, left-right + 0x005e: 0x00de, # CIRCUMFLEX ACCENT, right-left + 0x005f: 0x005f, # LOW LINE, left-right + 0x005f: 0x00df, # LOW LINE, right-left + 0x0060: 0x0060, # GRAVE ACCENT + 0x0061: 0x0061, # LATIN SMALL LETTER A + 0x0062: 0x0062, # LATIN SMALL LETTER B + 0x0063: 0x0063, # LATIN SMALL LETTER C + 0x0064: 0x0064, # LATIN SMALL LETTER D + 0x0065: 0x0065, # LATIN SMALL LETTER E + 0x0066: 0x0066, # LATIN SMALL LETTER F + 0x0067: 0x0067, # LATIN SMALL LETTER G + 0x0068: 0x0068, # LATIN SMALL LETTER H + 0x0069: 0x0069, # LATIN SMALL LETTER I + 0x006a: 0x006a, # LATIN SMALL LETTER J + 0x006b: 0x006b, # LATIN SMALL LETTER K + 0x006c: 0x006c, # LATIN SMALL LETTER L + 0x006d: 0x006d, # LATIN SMALL LETTER M + 0x006e: 0x006e, # LATIN SMALL LETTER N + 0x006f: 0x006f, # LATIN SMALL LETTER O + 0x0070: 0x0070, # LATIN SMALL LETTER P + 0x0071: 0x0071, # LATIN SMALL LETTER Q + 0x0072: 0x0072, # LATIN SMALL LETTER R + 0x0073: 0x0073, # LATIN SMALL LETTER S + 0x0074: 0x0074, # LATIN SMALL LETTER T + 0x0075: 0x0075, # LATIN SMALL LETTER U + 0x0076: 0x0076, # LATIN SMALL LETTER V + 0x0077: 0x0077, # LATIN SMALL LETTER W + 0x0078: 0x0078, # LATIN SMALL LETTER X + 0x0079: 0x0079, # LATIN SMALL LETTER Y + 0x007a: 0x007a, # LATIN SMALL LETTER Z + 0x007b: 0x007b, # LEFT CURLY BRACKET, left-right + 0x007b: 0x00fb, # LEFT CURLY BRACKET, right-left + 0x007c: 0x007c, # VERTICAL LINE, left-right + 0x007c: 0x00fc, # VERTICAL LINE, right-left + 0x007d: 0x007d, # RIGHT CURLY BRACKET, left-right + 0x007d: 0x00fd, # RIGHT CURLY BRACKET, right-left + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # CONTROL CHARACTER + 0x00a0: 0x0081, # NO-BREAK SPACE, right-left + 0x00ab: 0x008c, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00bb: 0x0098, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00c4: 0x0080, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0082, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0083, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x0084, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0085, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x0086, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00e0: 0x0088, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x0087, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0089, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x008a, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x008d, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008f, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x008e, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0090, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0091, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x0092, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x0094, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x0095, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x0096, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x0097, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0099, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x009a, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x009b, # DIVISION SIGN, right-left + 0x00f9: 0x009d, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x009c, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x009e, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x009f, # LATIN SMALL LETTER U WITH DIAERESIS + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0621: 0x00c1, # ARABIC LETTER HAMZA + 0x0622: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x0623: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x0624: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x0625: 0x00c5, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x0626: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x0627: 0x00c7, # ARABIC LETTER ALEF + 0x0628: 0x00c8, # ARABIC LETTER BEH + 0x0629: 0x00c9, # ARABIC LETTER TEH MARBUTA + 0x062a: 0x00ca, # ARABIC LETTER TEH + 0x062b: 0x00cb, # ARABIC LETTER THEH + 0x062c: 0x00cc, # ARABIC LETTER JEEM + 0x062d: 0x00cd, # ARABIC LETTER HAH + 0x062e: 0x00ce, # ARABIC LETTER KHAH + 0x062f: 0x00cf, # ARABIC LETTER DAL + 0x0630: 0x00d0, # ARABIC LETTER THAL + 0x0631: 0x00d1, # ARABIC LETTER REH + 0x0632: 0x00d2, # ARABIC LETTER ZAIN + 0x0633: 0x00d3, # ARABIC LETTER SEEN + 0x0634: 0x00d4, # ARABIC LETTER SHEEN + 0x0635: 0x00d5, # ARABIC LETTER SAD + 0x0636: 0x00d6, # ARABIC LETTER DAD + 0x0637: 0x00d7, # ARABIC LETTER TAH + 0x0638: 0x00d8, # ARABIC LETTER ZAH + 0x0639: 0x00d9, # ARABIC LETTER AIN + 0x063a: 0x00da, # ARABIC LETTER GHAIN + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0641: 0x00e1, # ARABIC LETTER FEH + 0x0642: 0x00e2, # ARABIC LETTER QAF + 0x0643: 0x00e3, # ARABIC LETTER KAF + 0x0644: 0x00e4, # ARABIC LETTER LAM + 0x0645: 0x00e5, # ARABIC LETTER MEEM + 0x0646: 0x00e6, # ARABIC LETTER NOON + 0x0647: 0x00e7, # ARABIC LETTER HEH + 0x0648: 0x00e8, # ARABIC LETTER WAW + 0x0649: 0x00e9, # ARABIC LETTER ALEF MAKSURA + 0x064a: 0x00ea, # ARABIC LETTER YEH + 0x064b: 0x00eb, # ARABIC FATHATAN + 0x064c: 0x00ec, # ARABIC DAMMATAN + 0x064d: 0x00ed, # ARABIC KASRATAN + 0x064e: 0x00ee, # ARABIC FATHA + 0x064f: 0x00ef, # ARABIC DAMMA + 0x0650: 0x00f0, # ARABIC KASRA + 0x0651: 0x00f1, # ARABIC SHADDA + 0x0652: 0x00f2, # ARABIC SUKUN + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x066a: 0x00a5, # ARABIC PERCENT SIGN + 0x0679: 0x00f4, # ARABIC LETTER TTEH + 0x067e: 0x00f3, # ARABIC LETTER PEH + 0x0686: 0x00f5, # ARABIC LETTER TCHEH + 0x0688: 0x00f9, # ARABIC LETTER DDAL + 0x0691: 0x00fa, # ARABIC LETTER RREH + 0x0698: 0x00fe, # ARABIC LETTER JEH + 0x06a4: 0x00f7, # ARABIC LETTER VEH + 0x06af: 0x00f8, # ARABIC LETTER GAF + 0x06ba: 0x008b, # ARABIC LETTER NOON GHUNNA + 0x06d2: 0x00ff, # ARABIC LETTER YEH BARREE + 0x06d5: 0x00f6, # ARABIC LETTER AE + 0x2026: 0x0093, # HORIZONTAL ELLIPSIS, right-left + 0x274a: 0x00c0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left +} Modified: python/trunk/Lib/encodings/mac_centeuro.py ============================================================================== --- python/trunk/Lib/encodings/mac_centeuro.py (original) +++ python/trunk/Lib/encodings/mac_centeuro.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON - u'\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK - u'\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON - u'\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE - u'\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE - u'\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON - u'\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON - u'\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON - u'\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON - u'\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA - u'\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK - u'\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK - u'\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON - u'\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE - u'\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA - u'\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA - u'\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON - u'\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON - u'\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE - u'\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE - u'\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA - u'\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA - u'\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE - u'\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON - u'\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - u'\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON - u'\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE - u'\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE - u'\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON - u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON - u'\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA - u'\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA - u'\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON - u'\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE - u'\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON - u'\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON - u'\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON - u'\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON - u'\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE - u'\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - u'\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - u'\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK - u'\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK - u'\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE - u'\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA - u'\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE - u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA - u'\u02c7' # 0xFF -> CARON + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON + u'\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK + u'\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON + u'\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE + u'\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + u'\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE + u'\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON + u'\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON + u'\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON + u'\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON + u'\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA + u'\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK + u'\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK + u'\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + u'\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE + u'\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA + u'\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA + u'\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON + u'\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON + u'\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE + u'\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE + u'\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA + u'\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA + u'\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE + u'\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON + u'\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + u'\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON + u'\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE + u'\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE + u'\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON + u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON + u'\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA + u'\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA + u'\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON + u'\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE + u'\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON + u'\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON + u'\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON + u'\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON + u'\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE + u'\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + u'\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + u'\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK + u'\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK + u'\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE + u'\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA + u'\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + u'\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE + u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + u'\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA + u'\u02c7' # 0xFF -> CARON ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0xCA, # NO-BREAK SPACE - 0x00A3: 0xA3, # POUND SIGN - 0x00A7: 0xA4, # SECTION SIGN - 0x00A8: 0xAC, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xC2, # NOT SIGN - 0x00AE: 0xA8, # REGISTERED SIGN - 0x00B0: 0xA1, # DEGREE SIGN - 0x00B6: 0xA6, # PILCROW SIGN - 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xF8, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S - 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE - 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE - 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE - 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xD6, # DIVISION SIGN - 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE - 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xF9, # LATIN SMALL LETTER Y WITH ACUTE - 0x0100: 0x81, # LATIN CAPITAL LETTER A WITH MACRON - 0x0101: 0x82, # LATIN SMALL LETTER A WITH MACRON - 0x0104: 0x84, # LATIN CAPITAL LETTER A WITH OGONEK - 0x0105: 0x88, # LATIN SMALL LETTER A WITH OGONEK - 0x0106: 0x8C, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0x8D, # LATIN SMALL LETTER C WITH ACUTE - 0x010C: 0x89, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0x8B, # LATIN SMALL LETTER C WITH CARON - 0x010E: 0x91, # LATIN CAPITAL LETTER D WITH CARON - 0x010F: 0x93, # LATIN SMALL LETTER D WITH CARON - 0x0112: 0x94, # LATIN CAPITAL LETTER E WITH MACRON - 0x0113: 0x95, # LATIN SMALL LETTER E WITH MACRON - 0x0116: 0x96, # LATIN CAPITAL LETTER E WITH DOT ABOVE - 0x0117: 0x98, # LATIN SMALL LETTER E WITH DOT ABOVE - 0x0118: 0xA2, # LATIN CAPITAL LETTER E WITH OGONEK - 0x0119: 0xAB, # LATIN SMALL LETTER E WITH OGONEK - 0x011A: 0x9D, # LATIN CAPITAL LETTER E WITH CARON - 0x011B: 0x9E, # LATIN SMALL LETTER E WITH CARON - 0x0122: 0xFE, # LATIN CAPITAL LETTER G WITH CEDILLA - 0x0123: 0xAE, # LATIN SMALL LETTER G WITH CEDILLA - 0x012A: 0xB1, # LATIN CAPITAL LETTER I WITH MACRON - 0x012B: 0xB4, # LATIN SMALL LETTER I WITH MACRON - 0x012E: 0xAF, # LATIN CAPITAL LETTER I WITH OGONEK - 0x012F: 0xB0, # LATIN SMALL LETTER I WITH OGONEK - 0x0136: 0xB5, # LATIN CAPITAL LETTER K WITH CEDILLA - 0x0137: 0xFA, # LATIN SMALL LETTER K WITH CEDILLA - 0x0139: 0xBD, # LATIN CAPITAL LETTER L WITH ACUTE - 0x013A: 0xBE, # LATIN SMALL LETTER L WITH ACUTE - 0x013B: 0xB9, # LATIN CAPITAL LETTER L WITH CEDILLA - 0x013C: 0xBA, # LATIN SMALL LETTER L WITH CEDILLA - 0x013D: 0xBB, # LATIN CAPITAL LETTER L WITH CARON - 0x013E: 0xBC, # LATIN SMALL LETTER L WITH CARON - 0x0141: 0xFC, # LATIN CAPITAL LETTER L WITH STROKE - 0x0142: 0xB8, # LATIN SMALL LETTER L WITH STROKE - 0x0143: 0xC1, # LATIN CAPITAL LETTER N WITH ACUTE - 0x0144: 0xC4, # LATIN SMALL LETTER N WITH ACUTE - 0x0145: 0xBF, # LATIN CAPITAL LETTER N WITH CEDILLA - 0x0146: 0xC0, # LATIN SMALL LETTER N WITH CEDILLA - 0x0147: 0xC5, # LATIN CAPITAL LETTER N WITH CARON - 0x0148: 0xCB, # LATIN SMALL LETTER N WITH CARON - 0x014C: 0xCF, # LATIN CAPITAL LETTER O WITH MACRON - 0x014D: 0xD8, # LATIN SMALL LETTER O WITH MACRON - 0x0150: 0xCC, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - 0x0151: 0xCE, # LATIN SMALL LETTER O WITH DOUBLE ACUTE - 0x0154: 0xD9, # LATIN CAPITAL LETTER R WITH ACUTE - 0x0155: 0xDA, # LATIN SMALL LETTER R WITH ACUTE - 0x0156: 0xDF, # LATIN CAPITAL LETTER R WITH CEDILLA - 0x0157: 0xE0, # LATIN SMALL LETTER R WITH CEDILLA - 0x0158: 0xDB, # LATIN CAPITAL LETTER R WITH CARON - 0x0159: 0xDE, # LATIN SMALL LETTER R WITH CARON - 0x015A: 0xE5, # LATIN CAPITAL LETTER S WITH ACUTE - 0x015B: 0xE6, # LATIN SMALL LETTER S WITH ACUTE - 0x0160: 0xE1, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xE4, # LATIN SMALL LETTER S WITH CARON - 0x0164: 0xE8, # LATIN CAPITAL LETTER T WITH CARON - 0x0165: 0xE9, # LATIN SMALL LETTER T WITH CARON - 0x016A: 0xED, # LATIN CAPITAL LETTER U WITH MACRON - 0x016B: 0xF0, # LATIN SMALL LETTER U WITH MACRON - 0x016E: 0xF1, # LATIN CAPITAL LETTER U WITH RING ABOVE - 0x016F: 0xF3, # LATIN SMALL LETTER U WITH RING ABOVE - 0x0170: 0xF4, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - 0x0171: 0xF5, # LATIN SMALL LETTER U WITH DOUBLE ACUTE - 0x0172: 0xF6, # LATIN CAPITAL LETTER U WITH OGONEK - 0x0173: 0xF7, # LATIN SMALL LETTER U WITH OGONEK - 0x0179: 0x8F, # LATIN CAPITAL LETTER Z WITH ACUTE - 0x017A: 0x90, # LATIN SMALL LETTER Z WITH ACUTE - 0x017B: 0xFB, # LATIN CAPITAL LETTER Z WITH DOT ABOVE - 0x017C: 0xFD, # LATIN SMALL LETTER Z WITH DOT ABOVE - 0x017D: 0xEB, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xEC, # LATIN SMALL LETTER Z WITH CARON - 0x02C7: 0xFF, # CARON - 0x2013: 0xD0, # EN DASH - 0x2014: 0xD1, # EM DASH - 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0xA0, # DAGGER - 0x2022: 0xA5, # BULLET - 0x2026: 0xC9, # HORIZONTAL ELLIPSIS - 0x2039: 0xDC, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0xDD, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x2122: 0xAA, # TRADE MARK SIGN - 0x2202: 0xB6, # PARTIAL DIFFERENTIAL - 0x2206: 0xC6, # INCREMENT - 0x2211: 0xB7, # N-ARY SUMMATION - 0x221A: 0xC3, # SQUARE ROOT - 0x2260: 0xAD, # NOT EQUAL TO - 0x2264: 0xB2, # LESS-THAN OR EQUAL TO - 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO - 0x25CA: 0xD7, # LOZENGE + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0xCA, # NO-BREAK SPACE + 0x00A3: 0xA3, # POUND SIGN + 0x00A7: 0xA4, # SECTION SIGN + 0x00A8: 0xAC, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xC2, # NOT SIGN + 0x00AE: 0xA8, # REGISTERED SIGN + 0x00B0: 0xA1, # DEGREE SIGN + 0x00B6: 0xA6, # PILCROW SIGN + 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xF8, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S + 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE + 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE + 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE + 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xD6, # DIVISION SIGN + 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE + 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xF9, # LATIN SMALL LETTER Y WITH ACUTE + 0x0100: 0x81, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0x82, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0x84, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x88, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x8C, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x8D, # LATIN SMALL LETTER C WITH ACUTE + 0x010C: 0x89, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0x8B, # LATIN SMALL LETTER C WITH CARON + 0x010E: 0x91, # LATIN CAPITAL LETTER D WITH CARON + 0x010F: 0x93, # LATIN SMALL LETTER D WITH CARON + 0x0112: 0x94, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0x95, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0x96, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0x98, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0xA2, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0xAB, # LATIN SMALL LETTER E WITH OGONEK + 0x011A: 0x9D, # LATIN CAPITAL LETTER E WITH CARON + 0x011B: 0x9E, # LATIN SMALL LETTER E WITH CARON + 0x0122: 0xFE, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0xAE, # LATIN SMALL LETTER G WITH CEDILLA + 0x012A: 0xB1, # LATIN CAPITAL LETTER I WITH MACRON + 0x012B: 0xB4, # LATIN SMALL LETTER I WITH MACRON + 0x012E: 0xAF, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012F: 0xB0, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0xB5, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0xFA, # LATIN SMALL LETTER K WITH CEDILLA + 0x0139: 0xBD, # LATIN CAPITAL LETTER L WITH ACUTE + 0x013A: 0xBE, # LATIN SMALL LETTER L WITH ACUTE + 0x013B: 0xB9, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013C: 0xBA, # LATIN SMALL LETTER L WITH CEDILLA + 0x013D: 0xBB, # LATIN CAPITAL LETTER L WITH CARON + 0x013E: 0xBC, # LATIN SMALL LETTER L WITH CARON + 0x0141: 0xFC, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0xB8, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0xC1, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0xC4, # LATIN SMALL LETTER N WITH ACUTE + 0x0145: 0xBF, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0xC0, # LATIN SMALL LETTER N WITH CEDILLA + 0x0147: 0xC5, # LATIN CAPITAL LETTER N WITH CARON + 0x0148: 0xCB, # LATIN SMALL LETTER N WITH CARON + 0x014C: 0xCF, # LATIN CAPITAL LETTER O WITH MACRON + 0x014D: 0xD8, # LATIN SMALL LETTER O WITH MACRON + 0x0150: 0xCC, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0xCE, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0154: 0xD9, # LATIN CAPITAL LETTER R WITH ACUTE + 0x0155: 0xDA, # LATIN SMALL LETTER R WITH ACUTE + 0x0156: 0xDF, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0xE0, # LATIN SMALL LETTER R WITH CEDILLA + 0x0158: 0xDB, # LATIN CAPITAL LETTER R WITH CARON + 0x0159: 0xDE, # LATIN SMALL LETTER R WITH CARON + 0x015A: 0xE5, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015B: 0xE6, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0xE1, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xE4, # LATIN SMALL LETTER S WITH CARON + 0x0164: 0xE8, # LATIN CAPITAL LETTER T WITH CARON + 0x0165: 0xE9, # LATIN SMALL LETTER T WITH CARON + 0x016A: 0xED, # LATIN CAPITAL LETTER U WITH MACRON + 0x016B: 0xF0, # LATIN SMALL LETTER U WITH MACRON + 0x016E: 0xF1, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x016F: 0xF3, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0170: 0xF4, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0xF5, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0172: 0xF6, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0xF7, # LATIN SMALL LETTER U WITH OGONEK + 0x0179: 0x8F, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017A: 0x90, # LATIN SMALL LETTER Z WITH ACUTE + 0x017B: 0xFB, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017C: 0xFD, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017D: 0xEB, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xEC, # LATIN SMALL LETTER Z WITH CARON + 0x02C7: 0xFF, # CARON + 0x2013: 0xD0, # EN DASH + 0x2014: 0xD1, # EM DASH + 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0xA0, # DAGGER + 0x2022: 0xA5, # BULLET + 0x2026: 0xC9, # HORIZONTAL ELLIPSIS + 0x2039: 0xDC, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0xDD, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x2122: 0xAA, # TRADE MARK SIGN + 0x2202: 0xB6, # PARTIAL DIFFERENTIAL + 0x2206: 0xC6, # INCREMENT + 0x2211: 0xB7, # N-ARY SUMMATION + 0x221A: 0xC3, # SQUARE ROOT + 0x2260: 0xAD, # NOT EQUAL TO + 0x2264: 0xB2, # LESS-THAN OR EQUAL TO + 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO + 0x25CA: 0xD7, # LOZENGE } - Modified: python/trunk/Lib/encodings/mac_croatian.py ============================================================================== --- python/trunk/Lib/encodings/mac_croatian.py (original) +++ python/trunk/Lib/encodings/mac_croatian.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON - u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\u2206' # 0xB4 -> INCREMENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON - u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\uf8ff' # 0xD8 -> Apple logo - u'\xa9' # 0xD9 -> COPYRIGHT SIGN - u'\u2044' # 0xDA -> FRACTION SLASH - u'\u20ac' # 0xDB -> EURO SIGN - u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\xc6' # 0xDE -> LATIN CAPITAL LETTER AE - u'\xbb' # 0xDF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2013' # 0xE0 -> EN DASH - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u03c0' # 0xF9 -> GREEK SMALL LETTER PI - u'\xcb' # 0xFA -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\xca' # 0xFD -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xe6' # 0xFE -> LATIN SMALL LETTER AE - u'\u02c7' # 0xFF -> CARON + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\u2206' # 0xB4 -> INCREMENT + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\uf8ff' # 0xD8 -> Apple logo + u'\xa9' # 0xD9 -> COPYRIGHT SIGN + u'\u2044' # 0xDA -> FRACTION SLASH + u'\u20ac' # 0xDB -> EURO SIGN + u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\xc6' # 0xDE -> LATIN CAPITAL LETTER AE + u'\xbb' # 0xDF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2013' # 0xE0 -> EN DASH + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u03c0' # 0xF9 -> GREEK SMALL LETTER PI + u'\xcb' # 0xFA -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\xca' # 0xFD -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xe6' # 0xFE -> LATIN SMALL LETTER AE + u'\u02c7' # 0xFF -> CARON ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0xCA, # NO-BREAK SPACE - 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A7: 0xA4, # SECTION SIGN - 0x00A8: 0xAC, # DIAERESIS - 0x00A9: 0xD9, # COPYRIGHT SIGN - 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xC2, # NOT SIGN - 0x00AE: 0xA8, # REGISTERED SIGN - 0x00AF: 0xF8, # MACRON - 0x00B0: 0xA1, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B4: 0xAB, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xA6, # PILCROW SIGN - 0x00B7: 0xE1, # MIDDLE DOT - 0x00B8: 0xFC, # CEDILLA - 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xDF, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BF: 0xC0, # INVERTED QUESTION MARK - 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xDE, # LATIN CAPITAL LETTER AE - 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xFD, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xFA, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D8: 0xAF, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S - 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xFE, # LATIN SMALL LETTER AE - 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xD6, # DIVISION SIGN - 0x00F8: 0xBF, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0106: 0xC6, # LATIN CAPITAL LETTER C WITH ACUTE - 0x0107: 0xE6, # LATIN SMALL LETTER C WITH ACUTE - 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON - 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON - 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE - 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE - 0x0131: 0xF5, # LATIN SMALL LETTER DOTLESS I - 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE - 0x0153: 0xCF, # LATIN SMALL LIGATURE OE - 0x0160: 0xA9, # LATIN CAPITAL LETTER S WITH CARON - 0x0161: 0xB9, # LATIN SMALL LETTER S WITH CARON - 0x017D: 0xAE, # LATIN CAPITAL LETTER Z WITH CARON - 0x017E: 0xBE, # LATIN SMALL LETTER Z WITH CARON - 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK - 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02C7: 0xFF, # CARON - 0x02DA: 0xFB, # RING ABOVE - 0x02DC: 0xF7, # SMALL TILDE - 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA - 0x03C0: 0xF9, # GREEK SMALL LETTER PI - 0x2013: 0xE0, # EN DASH - 0x2014: 0xD1, # EM DASH - 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0xA0, # DAGGER - 0x2022: 0xA5, # BULLET - 0x2026: 0xC9, # HORIZONTAL ELLIPSIS - 0x2030: 0xE4, # PER MILLE SIGN - 0x2039: 0xDC, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0xDD, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x2044: 0xDA, # FRACTION SLASH - 0x20AC: 0xDB, # EURO SIGN - 0x2122: 0xAA, # TRADE MARK SIGN - 0x2202: 0xB6, # PARTIAL DIFFERENTIAL - 0x2206: 0xB4, # INCREMENT - 0x220F: 0xB8, # N-ARY PRODUCT - 0x2211: 0xB7, # N-ARY SUMMATION - 0x221A: 0xC3, # SQUARE ROOT - 0x221E: 0xB0, # INFINITY - 0x222B: 0xBA, # INTEGRAL - 0x2248: 0xC5, # ALMOST EQUAL TO - 0x2260: 0xAD, # NOT EQUAL TO - 0x2264: 0xB2, # LESS-THAN OR EQUAL TO - 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO - 0x25CA: 0xD7, # LOZENGE - 0xF8FF: 0xD8, # Apple logo + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0xCA, # NO-BREAK SPACE + 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A7: 0xA4, # SECTION SIGN + 0x00A8: 0xAC, # DIAERESIS + 0x00A9: 0xD9, # COPYRIGHT SIGN + 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xC2, # NOT SIGN + 0x00AE: 0xA8, # REGISTERED SIGN + 0x00AF: 0xF8, # MACRON + 0x00B0: 0xA1, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B4: 0xAB, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xA6, # PILCROW SIGN + 0x00B7: 0xE1, # MIDDLE DOT + 0x00B8: 0xFC, # CEDILLA + 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xDF, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BF: 0xC0, # INVERTED QUESTION MARK + 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xDE, # LATIN CAPITAL LETTER AE + 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xFD, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xFA, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D8: 0xAF, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S + 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xFE, # LATIN SMALL LETTER AE + 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xD6, # DIVISION SIGN + 0x00F8: 0xBF, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0106: 0xC6, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0xE6, # LATIN SMALL LETTER C WITH ACUTE + 0x010C: 0xC8, # LATIN CAPITAL LETTER C WITH CARON + 0x010D: 0xE8, # LATIN SMALL LETTER C WITH CARON + 0x0110: 0xD0, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0xF0, # LATIN SMALL LETTER D WITH STROKE + 0x0131: 0xF5, # LATIN SMALL LETTER DOTLESS I + 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE + 0x0153: 0xCF, # LATIN SMALL LIGATURE OE + 0x0160: 0xA9, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0xB9, # LATIN SMALL LETTER S WITH CARON + 0x017D: 0xAE, # LATIN CAPITAL LETTER Z WITH CARON + 0x017E: 0xBE, # LATIN SMALL LETTER Z WITH CARON + 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK + 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02C7: 0xFF, # CARON + 0x02DA: 0xFB, # RING ABOVE + 0x02DC: 0xF7, # SMALL TILDE + 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA + 0x03C0: 0xF9, # GREEK SMALL LETTER PI + 0x2013: 0xE0, # EN DASH + 0x2014: 0xD1, # EM DASH + 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0xA0, # DAGGER + 0x2022: 0xA5, # BULLET + 0x2026: 0xC9, # HORIZONTAL ELLIPSIS + 0x2030: 0xE4, # PER MILLE SIGN + 0x2039: 0xDC, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0xDD, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x2044: 0xDA, # FRACTION SLASH + 0x20AC: 0xDB, # EURO SIGN + 0x2122: 0xAA, # TRADE MARK SIGN + 0x2202: 0xB6, # PARTIAL DIFFERENTIAL + 0x2206: 0xB4, # INCREMENT + 0x220F: 0xB8, # N-ARY PRODUCT + 0x2211: 0xB7, # N-ARY SUMMATION + 0x221A: 0xC3, # SQUARE ROOT + 0x221E: 0xB0, # INFINITY + 0x222B: 0xBA, # INTEGRAL + 0x2248: 0xC5, # ALMOST EQUAL TO + 0x2260: 0xAD, # NOT EQUAL TO + 0x2264: 0xB2, # LESS-THAN OR EQUAL TO + 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO + 0x25CA: 0xD7, # LOZENGE + 0xF8FF: 0xD8, # Apple logo } - Modified: python/trunk/Lib/encodings/mac_cyrillic.py ============================================================================== --- python/trunk/Lib/encodings/mac_cyrillic.py (original) +++ python/trunk/Lib/encodings/mac_cyrillic.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\u0410' # 0x80 -> CYRILLIC CAPITAL LETTER A - u'\u0411' # 0x81 -> CYRILLIC CAPITAL LETTER BE - u'\u0412' # 0x82 -> CYRILLIC CAPITAL LETTER VE - u'\u0413' # 0x83 -> CYRILLIC CAPITAL LETTER GHE - u'\u0414' # 0x84 -> CYRILLIC CAPITAL LETTER DE - u'\u0415' # 0x85 -> CYRILLIC CAPITAL LETTER IE - u'\u0416' # 0x86 -> CYRILLIC CAPITAL LETTER ZHE - u'\u0417' # 0x87 -> CYRILLIC CAPITAL LETTER ZE - u'\u0418' # 0x88 -> CYRILLIC CAPITAL LETTER I - u'\u0419' # 0x89 -> CYRILLIC CAPITAL LETTER SHORT I - u'\u041a' # 0x8A -> CYRILLIC CAPITAL LETTER KA - u'\u041b' # 0x8B -> CYRILLIC CAPITAL LETTER EL - u'\u041c' # 0x8C -> CYRILLIC CAPITAL LETTER EM - u'\u041d' # 0x8D -> CYRILLIC CAPITAL LETTER EN - u'\u041e' # 0x8E -> CYRILLIC CAPITAL LETTER O - u'\u041f' # 0x8F -> CYRILLIC CAPITAL LETTER PE - u'\u0420' # 0x90 -> CYRILLIC CAPITAL LETTER ER - u'\u0421' # 0x91 -> CYRILLIC CAPITAL LETTER ES - u'\u0422' # 0x92 -> CYRILLIC CAPITAL LETTER TE - u'\u0423' # 0x93 -> CYRILLIC CAPITAL LETTER U - u'\u0424' # 0x94 -> CYRILLIC CAPITAL LETTER EF - u'\u0425' # 0x95 -> CYRILLIC CAPITAL LETTER HA - u'\u0426' # 0x96 -> CYRILLIC CAPITAL LETTER TSE - u'\u0427' # 0x97 -> CYRILLIC CAPITAL LETTER CHE - u'\u0428' # 0x98 -> CYRILLIC CAPITAL LETTER SHA - u'\u0429' # 0x99 -> CYRILLIC CAPITAL LETTER SHCHA - u'\u042a' # 0x9A -> CYRILLIC CAPITAL LETTER HARD SIGN - u'\u042b' # 0x9B -> CYRILLIC CAPITAL LETTER YERU - u'\u042c' # 0x9C -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u042d' # 0x9D -> CYRILLIC CAPITAL LETTER E - u'\u042e' # 0x9E -> CYRILLIC CAPITAL LETTER YU - u'\u042f' # 0x9F -> CYRILLIC CAPITAL LETTER YA - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\u0490' # 0xA2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\u0406' # 0xA7 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\u0402' # 0xAB -> CYRILLIC CAPITAL LETTER DJE - u'\u0452' # 0xAC -> CYRILLIC SMALL LETTER DJE - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\u0403' # 0xAE -> CYRILLIC CAPITAL LETTER GJE - u'\u0453' # 0xAF -> CYRILLIC SMALL LETTER GJE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\u0456' # 0xB4 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u0491' # 0xB6 -> CYRILLIC SMALL LETTER GHE WITH UPTURN - u'\u0408' # 0xB7 -> CYRILLIC CAPITAL LETTER JE - u'\u0404' # 0xB8 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE - u'\u0454' # 0xB9 -> CYRILLIC SMALL LETTER UKRAINIAN IE - u'\u0407' # 0xBA -> CYRILLIC CAPITAL LETTER YI - u'\u0457' # 0xBB -> CYRILLIC SMALL LETTER YI - u'\u0409' # 0xBC -> CYRILLIC CAPITAL LETTER LJE - u'\u0459' # 0xBD -> CYRILLIC SMALL LETTER LJE - u'\u040a' # 0xBE -> CYRILLIC CAPITAL LETTER NJE - u'\u045a' # 0xBF -> CYRILLIC SMALL LETTER NJE - u'\u0458' # 0xC0 -> CYRILLIC SMALL LETTER JE - u'\u0405' # 0xC1 -> CYRILLIC CAPITAL LETTER DZE - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\u040b' # 0xCB -> CYRILLIC CAPITAL LETTER TSHE - u'\u045b' # 0xCC -> CYRILLIC SMALL LETTER TSHE - u'\u040c' # 0xCD -> CYRILLIC CAPITAL LETTER KJE - u'\u045c' # 0xCE -> CYRILLIC SMALL LETTER KJE - u'\u0455' # 0xCF -> CYRILLIC SMALL LETTER DZE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u201e' # 0xD7 -> DOUBLE LOW-9 QUOTATION MARK - u'\u040e' # 0xD8 -> CYRILLIC CAPITAL LETTER SHORT U - u'\u045e' # 0xD9 -> CYRILLIC SMALL LETTER SHORT U - u'\u040f' # 0xDA -> CYRILLIC CAPITAL LETTER DZHE - u'\u045f' # 0xDB -> CYRILLIC SMALL LETTER DZHE - u'\u2116' # 0xDC -> NUMERO SIGN - u'\u0401' # 0xDD -> CYRILLIC CAPITAL LETTER IO - u'\u0451' # 0xDE -> CYRILLIC SMALL LETTER IO - u'\u044f' # 0xDF -> CYRILLIC SMALL LETTER YA - u'\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A - u'\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE - u'\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE - u'\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE - u'\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE - u'\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE - u'\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE - u'\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE - u'\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I - u'\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I - u'\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA - u'\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL - u'\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM - u'\u043d' # 0xED -> CYRILLIC SMALL LETTER EN - u'\u043e' # 0xEE -> CYRILLIC SMALL LETTER O - u'\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE - u'\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER - u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES - u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE - u'\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U - u'\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF - u'\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA - u'\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE - u'\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE - u'\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA - u'\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA - u'\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN - u'\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU - u'\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u044d' # 0xFD -> CYRILLIC SMALL LETTER E - u'\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU - u'\u20ac' # 0xFF -> EURO SIGN + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\u0410' # 0x80 -> CYRILLIC CAPITAL LETTER A + u'\u0411' # 0x81 -> CYRILLIC CAPITAL LETTER BE + u'\u0412' # 0x82 -> CYRILLIC CAPITAL LETTER VE + u'\u0413' # 0x83 -> CYRILLIC CAPITAL LETTER GHE + u'\u0414' # 0x84 -> CYRILLIC CAPITAL LETTER DE + u'\u0415' # 0x85 -> CYRILLIC CAPITAL LETTER IE + u'\u0416' # 0x86 -> CYRILLIC CAPITAL LETTER ZHE + u'\u0417' # 0x87 -> CYRILLIC CAPITAL LETTER ZE + u'\u0418' # 0x88 -> CYRILLIC CAPITAL LETTER I + u'\u0419' # 0x89 -> CYRILLIC CAPITAL LETTER SHORT I + u'\u041a' # 0x8A -> CYRILLIC CAPITAL LETTER KA + u'\u041b' # 0x8B -> CYRILLIC CAPITAL LETTER EL + u'\u041c' # 0x8C -> CYRILLIC CAPITAL LETTER EM + u'\u041d' # 0x8D -> CYRILLIC CAPITAL LETTER EN + u'\u041e' # 0x8E -> CYRILLIC CAPITAL LETTER O + u'\u041f' # 0x8F -> CYRILLIC CAPITAL LETTER PE + u'\u0420' # 0x90 -> CYRILLIC CAPITAL LETTER ER + u'\u0421' # 0x91 -> CYRILLIC CAPITAL LETTER ES + u'\u0422' # 0x92 -> CYRILLIC CAPITAL LETTER TE + u'\u0423' # 0x93 -> CYRILLIC CAPITAL LETTER U + u'\u0424' # 0x94 -> CYRILLIC CAPITAL LETTER EF + u'\u0425' # 0x95 -> CYRILLIC CAPITAL LETTER HA + u'\u0426' # 0x96 -> CYRILLIC CAPITAL LETTER TSE + u'\u0427' # 0x97 -> CYRILLIC CAPITAL LETTER CHE + u'\u0428' # 0x98 -> CYRILLIC CAPITAL LETTER SHA + u'\u0429' # 0x99 -> CYRILLIC CAPITAL LETTER SHCHA + u'\u042a' # 0x9A -> CYRILLIC CAPITAL LETTER HARD SIGN + u'\u042b' # 0x9B -> CYRILLIC CAPITAL LETTER YERU + u'\u042c' # 0x9C -> CYRILLIC CAPITAL LETTER SOFT SIGN + u'\u042d' # 0x9D -> CYRILLIC CAPITAL LETTER E + u'\u042e' # 0x9E -> CYRILLIC CAPITAL LETTER YU + u'\u042f' # 0x9F -> CYRILLIC CAPITAL LETTER YA + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\u0490' # 0xA2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\u0406' # 0xA7 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\u0402' # 0xAB -> CYRILLIC CAPITAL LETTER DJE + u'\u0452' # 0xAC -> CYRILLIC SMALL LETTER DJE + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\u0403' # 0xAE -> CYRILLIC CAPITAL LETTER GJE + u'\u0453' # 0xAF -> CYRILLIC SMALL LETTER GJE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\u0456' # 0xB4 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u0491' # 0xB6 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + u'\u0408' # 0xB7 -> CYRILLIC CAPITAL LETTER JE + u'\u0404' # 0xB8 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + u'\u0454' # 0xB9 -> CYRILLIC SMALL LETTER UKRAINIAN IE + u'\u0407' # 0xBA -> CYRILLIC CAPITAL LETTER YI + u'\u0457' # 0xBB -> CYRILLIC SMALL LETTER YI + u'\u0409' # 0xBC -> CYRILLIC CAPITAL LETTER LJE + u'\u0459' # 0xBD -> CYRILLIC SMALL LETTER LJE + u'\u040a' # 0xBE -> CYRILLIC CAPITAL LETTER NJE + u'\u045a' # 0xBF -> CYRILLIC SMALL LETTER NJE + u'\u0458' # 0xC0 -> CYRILLIC SMALL LETTER JE + u'\u0405' # 0xC1 -> CYRILLIC CAPITAL LETTER DZE + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\u040b' # 0xCB -> CYRILLIC CAPITAL LETTER TSHE + u'\u045b' # 0xCC -> CYRILLIC SMALL LETTER TSHE + u'\u040c' # 0xCD -> CYRILLIC CAPITAL LETTER KJE + u'\u045c' # 0xCE -> CYRILLIC SMALL LETTER KJE + u'\u0455' # 0xCF -> CYRILLIC SMALL LETTER DZE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u201e' # 0xD7 -> DOUBLE LOW-9 QUOTATION MARK + u'\u040e' # 0xD8 -> CYRILLIC CAPITAL LETTER SHORT U + u'\u045e' # 0xD9 -> CYRILLIC SMALL LETTER SHORT U + u'\u040f' # 0xDA -> CYRILLIC CAPITAL LETTER DZHE + u'\u045f' # 0xDB -> CYRILLIC SMALL LETTER DZHE + u'\u2116' # 0xDC -> NUMERO SIGN + u'\u0401' # 0xDD -> CYRILLIC CAPITAL LETTER IO + u'\u0451' # 0xDE -> CYRILLIC SMALL LETTER IO + u'\u044f' # 0xDF -> CYRILLIC SMALL LETTER YA + u'\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + u'\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + u'\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + u'\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + u'\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + u'\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + u'\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + u'\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + u'\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + u'\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + u'\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + u'\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + u'\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + u'\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + u'\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + u'\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + u'\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + u'\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + u'\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + u'\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + u'\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + u'\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + u'\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + u'\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + u'\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + u'\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + u'\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + u'\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + u'\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + u'\u20ac' # 0xFF -> EURO SIGN ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0xCA, # NO-BREAK SPACE - 0x00A3: 0xA3, # POUND SIGN - 0x00A7: 0xA4, # SECTION SIGN - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xC2, # NOT SIGN - 0x00AE: 0xA8, # REGISTERED SIGN - 0x00B0: 0xA1, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xA6, # PILCROW SIGN - 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00F7: 0xD6, # DIVISION SIGN - 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK - 0x0401: 0xDD, # CYRILLIC CAPITAL LETTER IO - 0x0402: 0xAB, # CYRILLIC CAPITAL LETTER DJE - 0x0403: 0xAE, # CYRILLIC CAPITAL LETTER GJE - 0x0404: 0xB8, # CYRILLIC CAPITAL LETTER UKRAINIAN IE - 0x0405: 0xC1, # CYRILLIC CAPITAL LETTER DZE - 0x0406: 0xA7, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0407: 0xBA, # CYRILLIC CAPITAL LETTER YI - 0x0408: 0xB7, # CYRILLIC CAPITAL LETTER JE - 0x0409: 0xBC, # CYRILLIC CAPITAL LETTER LJE - 0x040A: 0xBE, # CYRILLIC CAPITAL LETTER NJE - 0x040B: 0xCB, # CYRILLIC CAPITAL LETTER TSHE - 0x040C: 0xCD, # CYRILLIC CAPITAL LETTER KJE - 0x040E: 0xD8, # CYRILLIC CAPITAL LETTER SHORT U - 0x040F: 0xDA, # CYRILLIC CAPITAL LETTER DZHE - 0x0410: 0x80, # CYRILLIC CAPITAL LETTER A - 0x0411: 0x81, # CYRILLIC CAPITAL LETTER BE - 0x0412: 0x82, # CYRILLIC CAPITAL LETTER VE - 0x0413: 0x83, # CYRILLIC CAPITAL LETTER GHE - 0x0414: 0x84, # CYRILLIC CAPITAL LETTER DE - 0x0415: 0x85, # CYRILLIC CAPITAL LETTER IE - 0x0416: 0x86, # CYRILLIC CAPITAL LETTER ZHE - 0x0417: 0x87, # CYRILLIC CAPITAL LETTER ZE - 0x0418: 0x88, # CYRILLIC CAPITAL LETTER I - 0x0419: 0x89, # CYRILLIC CAPITAL LETTER SHORT I - 0x041A: 0x8A, # CYRILLIC CAPITAL LETTER KA - 0x041B: 0x8B, # CYRILLIC CAPITAL LETTER EL - 0x041C: 0x8C, # CYRILLIC CAPITAL LETTER EM - 0x041D: 0x8D, # CYRILLIC CAPITAL LETTER EN - 0x041E: 0x8E, # CYRILLIC CAPITAL LETTER O - 0x041F: 0x8F, # CYRILLIC CAPITAL LETTER PE - 0x0420: 0x90, # CYRILLIC CAPITAL LETTER ER - 0x0421: 0x91, # CYRILLIC CAPITAL LETTER ES - 0x0422: 0x92, # CYRILLIC CAPITAL LETTER TE - 0x0423: 0x93, # CYRILLIC CAPITAL LETTER U - 0x0424: 0x94, # CYRILLIC CAPITAL LETTER EF - 0x0425: 0x95, # CYRILLIC CAPITAL LETTER HA - 0x0426: 0x96, # CYRILLIC CAPITAL LETTER TSE - 0x0427: 0x97, # CYRILLIC CAPITAL LETTER CHE - 0x0428: 0x98, # CYRILLIC CAPITAL LETTER SHA - 0x0429: 0x99, # CYRILLIC CAPITAL LETTER SHCHA - 0x042A: 0x9A, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x042B: 0x9B, # CYRILLIC CAPITAL LETTER YERU - 0x042C: 0x9C, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x042D: 0x9D, # CYRILLIC CAPITAL LETTER E - 0x042E: 0x9E, # CYRILLIC CAPITAL LETTER YU - 0x042F: 0x9F, # CYRILLIC CAPITAL LETTER YA - 0x0430: 0xE0, # CYRILLIC SMALL LETTER A - 0x0431: 0xE1, # CYRILLIC SMALL LETTER BE - 0x0432: 0xE2, # CYRILLIC SMALL LETTER VE - 0x0433: 0xE3, # CYRILLIC SMALL LETTER GHE - 0x0434: 0xE4, # CYRILLIC SMALL LETTER DE - 0x0435: 0xE5, # CYRILLIC SMALL LETTER IE - 0x0436: 0xE6, # CYRILLIC SMALL LETTER ZHE - 0x0437: 0xE7, # CYRILLIC SMALL LETTER ZE - 0x0438: 0xE8, # CYRILLIC SMALL LETTER I - 0x0439: 0xE9, # CYRILLIC SMALL LETTER SHORT I - 0x043A: 0xEA, # CYRILLIC SMALL LETTER KA - 0x043B: 0xEB, # CYRILLIC SMALL LETTER EL - 0x043C: 0xEC, # CYRILLIC SMALL LETTER EM - 0x043D: 0xED, # CYRILLIC SMALL LETTER EN - 0x043E: 0xEE, # CYRILLIC SMALL LETTER O - 0x043F: 0xEF, # CYRILLIC SMALL LETTER PE - 0x0440: 0xF0, # CYRILLIC SMALL LETTER ER - 0x0441: 0xF1, # CYRILLIC SMALL LETTER ES - 0x0442: 0xF2, # CYRILLIC SMALL LETTER TE - 0x0443: 0xF3, # CYRILLIC SMALL LETTER U - 0x0444: 0xF4, # CYRILLIC SMALL LETTER EF - 0x0445: 0xF5, # CYRILLIC SMALL LETTER HA - 0x0446: 0xF6, # CYRILLIC SMALL LETTER TSE - 0x0447: 0xF7, # CYRILLIC SMALL LETTER CHE - 0x0448: 0xF8, # CYRILLIC SMALL LETTER SHA - 0x0449: 0xF9, # CYRILLIC SMALL LETTER SHCHA - 0x044A: 0xFA, # CYRILLIC SMALL LETTER HARD SIGN - 0x044B: 0xFB, # CYRILLIC SMALL LETTER YERU - 0x044C: 0xFC, # CYRILLIC SMALL LETTER SOFT SIGN - 0x044D: 0xFD, # CYRILLIC SMALL LETTER E - 0x044E: 0xFE, # CYRILLIC SMALL LETTER YU - 0x044F: 0xDF, # CYRILLIC SMALL LETTER YA - 0x0451: 0xDE, # CYRILLIC SMALL LETTER IO - 0x0452: 0xAC, # CYRILLIC SMALL LETTER DJE - 0x0453: 0xAF, # CYRILLIC SMALL LETTER GJE - 0x0454: 0xB9, # CYRILLIC SMALL LETTER UKRAINIAN IE - 0x0455: 0xCF, # CYRILLIC SMALL LETTER DZE - 0x0456: 0xB4, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 0x0457: 0xBB, # CYRILLIC SMALL LETTER YI - 0x0458: 0xC0, # CYRILLIC SMALL LETTER JE - 0x0459: 0xBD, # CYRILLIC SMALL LETTER LJE - 0x045A: 0xBF, # CYRILLIC SMALL LETTER NJE - 0x045B: 0xCC, # CYRILLIC SMALL LETTER TSHE - 0x045C: 0xCE, # CYRILLIC SMALL LETTER KJE - 0x045E: 0xD9, # CYRILLIC SMALL LETTER SHORT U - 0x045F: 0xDB, # CYRILLIC SMALL LETTER DZHE - 0x0490: 0xA2, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN - 0x0491: 0xB6, # CYRILLIC SMALL LETTER GHE WITH UPTURN - 0x2013: 0xD0, # EN DASH - 0x2014: 0xD1, # EM DASH - 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK - 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xD7, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0xA0, # DAGGER - 0x2022: 0xA5, # BULLET - 0x2026: 0xC9, # HORIZONTAL ELLIPSIS - 0x20AC: 0xFF, # EURO SIGN - 0x2116: 0xDC, # NUMERO SIGN - 0x2122: 0xAA, # TRADE MARK SIGN - 0x2206: 0xC6, # INCREMENT - 0x221A: 0xC3, # SQUARE ROOT - 0x221E: 0xB0, # INFINITY - 0x2248: 0xC5, # ALMOST EQUAL TO - 0x2260: 0xAD, # NOT EQUAL TO - 0x2264: 0xB2, # LESS-THAN OR EQUAL TO - 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0xCA, # NO-BREAK SPACE + 0x00A3: 0xA3, # POUND SIGN + 0x00A7: 0xA4, # SECTION SIGN + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xC2, # NOT SIGN + 0x00AE: 0xA8, # REGISTERED SIGN + 0x00B0: 0xA1, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xA6, # PILCROW SIGN + 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00F7: 0xD6, # DIVISION SIGN + 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK + 0x0401: 0xDD, # CYRILLIC CAPITAL LETTER IO + 0x0402: 0xAB, # CYRILLIC CAPITAL LETTER DJE + 0x0403: 0xAE, # CYRILLIC CAPITAL LETTER GJE + 0x0404: 0xB8, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0405: 0xC1, # CYRILLIC CAPITAL LETTER DZE + 0x0406: 0xA7, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0xBA, # CYRILLIC CAPITAL LETTER YI + 0x0408: 0xB7, # CYRILLIC CAPITAL LETTER JE + 0x0409: 0xBC, # CYRILLIC CAPITAL LETTER LJE + 0x040A: 0xBE, # CYRILLIC CAPITAL LETTER NJE + 0x040B: 0xCB, # CYRILLIC CAPITAL LETTER TSHE + 0x040C: 0xCD, # CYRILLIC CAPITAL LETTER KJE + 0x040E: 0xD8, # CYRILLIC CAPITAL LETTER SHORT U + 0x040F: 0xDA, # CYRILLIC CAPITAL LETTER DZHE + 0x0410: 0x80, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x81, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x82, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x83, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x84, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x85, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x86, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x87, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x88, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x89, # CYRILLIC CAPITAL LETTER SHORT I + 0x041A: 0x8A, # CYRILLIC CAPITAL LETTER KA + 0x041B: 0x8B, # CYRILLIC CAPITAL LETTER EL + 0x041C: 0x8C, # CYRILLIC CAPITAL LETTER EM + 0x041D: 0x8D, # CYRILLIC CAPITAL LETTER EN + 0x041E: 0x8E, # CYRILLIC CAPITAL LETTER O + 0x041F: 0x8F, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x90, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x91, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x92, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x93, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x94, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x95, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x96, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x97, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x98, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x99, # CYRILLIC CAPITAL LETTER SHCHA + 0x042A: 0x9A, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042B: 0x9B, # CYRILLIC CAPITAL LETTER YERU + 0x042C: 0x9C, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042D: 0x9D, # CYRILLIC CAPITAL LETTER E + 0x042E: 0x9E, # CYRILLIC CAPITAL LETTER YU + 0x042F: 0x9F, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0xE0, # CYRILLIC SMALL LETTER A + 0x0431: 0xE1, # CYRILLIC SMALL LETTER BE + 0x0432: 0xE2, # CYRILLIC SMALL LETTER VE + 0x0433: 0xE3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0xE4, # CYRILLIC SMALL LETTER DE + 0x0435: 0xE5, # CYRILLIC SMALL LETTER IE + 0x0436: 0xE6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0xE7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0xE8, # CYRILLIC SMALL LETTER I + 0x0439: 0xE9, # CYRILLIC SMALL LETTER SHORT I + 0x043A: 0xEA, # CYRILLIC SMALL LETTER KA + 0x043B: 0xEB, # CYRILLIC SMALL LETTER EL + 0x043C: 0xEC, # CYRILLIC SMALL LETTER EM + 0x043D: 0xED, # CYRILLIC SMALL LETTER EN + 0x043E: 0xEE, # CYRILLIC SMALL LETTER O + 0x043F: 0xEF, # CYRILLIC SMALL LETTER PE + 0x0440: 0xF0, # CYRILLIC SMALL LETTER ER + 0x0441: 0xF1, # CYRILLIC SMALL LETTER ES + 0x0442: 0xF2, # CYRILLIC SMALL LETTER TE + 0x0443: 0xF3, # CYRILLIC SMALL LETTER U + 0x0444: 0xF4, # CYRILLIC SMALL LETTER EF + 0x0445: 0xF5, # CYRILLIC SMALL LETTER HA + 0x0446: 0xF6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0xF7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0xF8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0xF9, # CYRILLIC SMALL LETTER SHCHA + 0x044A: 0xFA, # CYRILLIC SMALL LETTER HARD SIGN + 0x044B: 0xFB, # CYRILLIC SMALL LETTER YERU + 0x044C: 0xFC, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044D: 0xFD, # CYRILLIC SMALL LETTER E + 0x044E: 0xFE, # CYRILLIC SMALL LETTER YU + 0x044F: 0xDF, # CYRILLIC SMALL LETTER YA + 0x0451: 0xDE, # CYRILLIC SMALL LETTER IO + 0x0452: 0xAC, # CYRILLIC SMALL LETTER DJE + 0x0453: 0xAF, # CYRILLIC SMALL LETTER GJE + 0x0454: 0xB9, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0455: 0xCF, # CYRILLIC SMALL LETTER DZE + 0x0456: 0xB4, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0xBB, # CYRILLIC SMALL LETTER YI + 0x0458: 0xC0, # CYRILLIC SMALL LETTER JE + 0x0459: 0xBD, # CYRILLIC SMALL LETTER LJE + 0x045A: 0xBF, # CYRILLIC SMALL LETTER NJE + 0x045B: 0xCC, # CYRILLIC SMALL LETTER TSHE + 0x045C: 0xCE, # CYRILLIC SMALL LETTER KJE + 0x045E: 0xD9, # CYRILLIC SMALL LETTER SHORT U + 0x045F: 0xDB, # CYRILLIC SMALL LETTER DZHE + 0x0490: 0xA2, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x0491: 0xB6, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x2013: 0xD0, # EN DASH + 0x2014: 0xD1, # EM DASH + 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK + 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xD7, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0xA0, # DAGGER + 0x2022: 0xA5, # BULLET + 0x2026: 0xC9, # HORIZONTAL ELLIPSIS + 0x20AC: 0xFF, # EURO SIGN + 0x2116: 0xDC, # NUMERO SIGN + 0x2122: 0xAA, # TRADE MARK SIGN + 0x2206: 0xC6, # INCREMENT + 0x221A: 0xC3, # SQUARE ROOT + 0x221E: 0xB0, # INFINITY + 0x2248: 0xC5, # ALMOST EQUAL TO + 0x2260: 0xAD, # NOT EQUAL TO + 0x2264: 0xB2, # LESS-THAN OR EQUAL TO + 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO } - Modified: python/trunk/Lib/encodings/mac_farsi.py ============================================================================== --- python/trunk/Lib/encodings/mac_farsi.py (original) +++ python/trunk/Lib/encodings/mac_farsi.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE, left-right - u'!' # 0x21 -> EXCLAMATION MARK, left-right - u'"' # 0x22 -> QUOTATION MARK, left-right - u'#' # 0x23 -> NUMBER SIGN, left-right - u'$' # 0x24 -> DOLLAR SIGN, left-right - u'%' # 0x25 -> PERCENT SIGN, left-right - u'&' # 0x26 -> AMPERSAND, left-right - u"'" # 0x27 -> APOSTROPHE, left-right - u'(' # 0x28 -> LEFT PARENTHESIS, left-right - u')' # 0x29 -> RIGHT PARENTHESIS, left-right - u'*' # 0x2A -> ASTERISK, left-right - u'+' # 0x2B -> PLUS SIGN, left-right - u',' # 0x2C -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR - u'-' # 0x2D -> HYPHEN-MINUS, left-right - u'.' # 0x2E -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR - u'/' # 0x2F -> SOLIDUS, left-right - u'0' # 0x30 -> DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE - u'2' # 0x32 -> DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO - u'3' # 0x33 -> DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE - u':' # 0x3A -> COLON, left-right - u';' # 0x3B -> SEMICOLON, left-right - u'<' # 0x3C -> LESS-THAN SIGN, left-right - u'=' # 0x3D -> EQUALS SIGN, left-right - u'>' # 0x3E -> GREATER-THAN SIGN, left-right - u'?' # 0x3F -> QUESTION MARK, left-right - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET, left-right - u'\\' # 0x5C -> REVERSE SOLIDUS, left-right - u']' # 0x5D -> RIGHT SQUARE BRACKET, left-right - u'^' # 0x5E -> CIRCUMFLEX ACCENT, left-right - u'_' # 0x5F -> LOW LINE, left-right - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET, left-right - u'|' # 0x7C -> VERTICAL LINE, left-right - u'}' # 0x7D -> RIGHT CURLY BRACKET, left-right - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xa0' # 0x81 -> NO-BREAK SPACE, right-left - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u06ba' # 0x8B -> ARABIC LETTER NOON GHUNNA - u'\xab' # 0x8C -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\u2026' # 0x93 -> HORIZONTAL ELLIPSIS, right-left - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xbb' # 0x98 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0x9B -> DIVISION SIGN, right-left - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u' ' # 0xA0 -> SPACE, right-left - u'!' # 0xA1 -> EXCLAMATION MARK, right-left - u'"' # 0xA2 -> QUOTATION MARK, right-left - u'#' # 0xA3 -> NUMBER SIGN, right-left - u'$' # 0xA4 -> DOLLAR SIGN, right-left - u'\u066a' # 0xA5 -> ARABIC PERCENT SIGN - u'&' # 0xA6 -> AMPERSAND, right-left - u"'" # 0xA7 -> APOSTROPHE, right-left - u'(' # 0xA8 -> LEFT PARENTHESIS, right-left - u')' # 0xA9 -> RIGHT PARENTHESIS, right-left - u'*' # 0xAA -> ASTERISK, right-left - u'+' # 0xAB -> PLUS SIGN, right-left - u'\u060c' # 0xAC -> ARABIC COMMA - u'-' # 0xAD -> HYPHEN-MINUS, right-left - u'.' # 0xAE -> FULL STOP, right-left - u'/' # 0xAF -> SOLIDUS, right-left - u'\u06f0' # 0xB0 -> EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) - u'\u06f1' # 0xB1 -> EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) - u'\u06f2' # 0xB2 -> EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) - u'\u06f3' # 0xB3 -> EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) - u'\u06f4' # 0xB4 -> EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) - u'\u06f5' # 0xB5 -> EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) - u'\u06f6' # 0xB6 -> EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) - u'\u06f7' # 0xB7 -> EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) - u'\u06f8' # 0xB8 -> EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) - u'\u06f9' # 0xB9 -> EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) - u':' # 0xBA -> COLON, right-left - u'\u061b' # 0xBB -> ARABIC SEMICOLON - u'<' # 0xBC -> LESS-THAN SIGN, right-left - u'=' # 0xBD -> EQUALS SIGN, right-left - u'>' # 0xBE -> GREATER-THAN SIGN, right-left - u'\u061f' # 0xBF -> ARABIC QUESTION MARK - u'\u274a' # 0xC0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left - u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA - u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE - u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE - u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE - u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW - u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE - u'\u0627' # 0xC7 -> ARABIC LETTER ALEF - u'\u0628' # 0xC8 -> ARABIC LETTER BEH - u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA - u'\u062a' # 0xCA -> ARABIC LETTER TEH - u'\u062b' # 0xCB -> ARABIC LETTER THEH - u'\u062c' # 0xCC -> ARABIC LETTER JEEM - u'\u062d' # 0xCD -> ARABIC LETTER HAH - u'\u062e' # 0xCE -> ARABIC LETTER KHAH - u'\u062f' # 0xCF -> ARABIC LETTER DAL - u'\u0630' # 0xD0 -> ARABIC LETTER THAL - u'\u0631' # 0xD1 -> ARABIC LETTER REH - u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN - u'\u0633' # 0xD3 -> ARABIC LETTER SEEN - u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN - u'\u0635' # 0xD5 -> ARABIC LETTER SAD - u'\u0636' # 0xD6 -> ARABIC LETTER DAD - u'\u0637' # 0xD7 -> ARABIC LETTER TAH - u'\u0638' # 0xD8 -> ARABIC LETTER ZAH - u'\u0639' # 0xD9 -> ARABIC LETTER AIN - u'\u063a' # 0xDA -> ARABIC LETTER GHAIN - u'[' # 0xDB -> LEFT SQUARE BRACKET, right-left - u'\\' # 0xDC -> REVERSE SOLIDUS, right-left - u']' # 0xDD -> RIGHT SQUARE BRACKET, right-left - u'^' # 0xDE -> CIRCUMFLEX ACCENT, right-left - u'_' # 0xDF -> LOW LINE, right-left - u'\u0640' # 0xE0 -> ARABIC TATWEEL - u'\u0641' # 0xE1 -> ARABIC LETTER FEH - u'\u0642' # 0xE2 -> ARABIC LETTER QAF - u'\u0643' # 0xE3 -> ARABIC LETTER KAF - u'\u0644' # 0xE4 -> ARABIC LETTER LAM - u'\u0645' # 0xE5 -> ARABIC LETTER MEEM - u'\u0646' # 0xE6 -> ARABIC LETTER NOON - u'\u0647' # 0xE7 -> ARABIC LETTER HEH - u'\u0648' # 0xE8 -> ARABIC LETTER WAW - u'\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA - u'\u064a' # 0xEA -> ARABIC LETTER YEH - u'\u064b' # 0xEB -> ARABIC FATHATAN - u'\u064c' # 0xEC -> ARABIC DAMMATAN - u'\u064d' # 0xED -> ARABIC KASRATAN - u'\u064e' # 0xEE -> ARABIC FATHA - u'\u064f' # 0xEF -> ARABIC DAMMA - u'\u0650' # 0xF0 -> ARABIC KASRA - u'\u0651' # 0xF1 -> ARABIC SHADDA - u'\u0652' # 0xF2 -> ARABIC SUKUN - u'\u067e' # 0xF3 -> ARABIC LETTER PEH - u'\u0679' # 0xF4 -> ARABIC LETTER TTEH - u'\u0686' # 0xF5 -> ARABIC LETTER TCHEH - u'\u06d5' # 0xF6 -> ARABIC LETTER AE - u'\u06a4' # 0xF7 -> ARABIC LETTER VEH - u'\u06af' # 0xF8 -> ARABIC LETTER GAF - u'\u0688' # 0xF9 -> ARABIC LETTER DDAL - u'\u0691' # 0xFA -> ARABIC LETTER RREH - u'{' # 0xFB -> LEFT CURLY BRACKET, right-left - u'|' # 0xFC -> VERTICAL LINE, right-left - u'}' # 0xFD -> RIGHT CURLY BRACKET, right-left - u'\u0698' # 0xFE -> ARABIC LETTER JEH - u'\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE, left-right + u'!' # 0x21 -> EXCLAMATION MARK, left-right + u'"' # 0x22 -> QUOTATION MARK, left-right + u'#' # 0x23 -> NUMBER SIGN, left-right + u'$' # 0x24 -> DOLLAR SIGN, left-right + u'%' # 0x25 -> PERCENT SIGN, left-right + u'&' # 0x26 -> AMPERSAND, left-right + u"'" # 0x27 -> APOSTROPHE, left-right + u'(' # 0x28 -> LEFT PARENTHESIS, left-right + u')' # 0x29 -> RIGHT PARENTHESIS, left-right + u'*' # 0x2A -> ASTERISK, left-right + u'+' # 0x2B -> PLUS SIGN, left-right + u',' # 0x2C -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + u'-' # 0x2D -> HYPHEN-MINUS, left-right + u'.' # 0x2E -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + u'/' # 0x2F -> SOLIDUS, left-right + u'0' # 0x30 -> DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE + u'2' # 0x32 -> DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO + u'3' # 0x33 -> DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE + u':' # 0x3A -> COLON, left-right + u';' # 0x3B -> SEMICOLON, left-right + u'<' # 0x3C -> LESS-THAN SIGN, left-right + u'=' # 0x3D -> EQUALS SIGN, left-right + u'>' # 0x3E -> GREATER-THAN SIGN, left-right + u'?' # 0x3F -> QUESTION MARK, left-right + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET, left-right + u'\\' # 0x5C -> REVERSE SOLIDUS, left-right + u']' # 0x5D -> RIGHT SQUARE BRACKET, left-right + u'^' # 0x5E -> CIRCUMFLEX ACCENT, left-right + u'_' # 0x5F -> LOW LINE, left-right + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET, left-right + u'|' # 0x7C -> VERTICAL LINE, left-right + u'}' # 0x7D -> RIGHT CURLY BRACKET, left-right + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xa0' # 0x81 -> NO-BREAK SPACE, right-left + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u06ba' # 0x8B -> ARABIC LETTER NOON GHUNNA + u'\xab' # 0x8C -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\u2026' # 0x93 -> HORIZONTAL ELLIPSIS, right-left + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xbb' # 0x98 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf7' # 0x9B -> DIVISION SIGN, right-left + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u' ' # 0xA0 -> SPACE, right-left + u'!' # 0xA1 -> EXCLAMATION MARK, right-left + u'"' # 0xA2 -> QUOTATION MARK, right-left + u'#' # 0xA3 -> NUMBER SIGN, right-left + u'$' # 0xA4 -> DOLLAR SIGN, right-left + u'\u066a' # 0xA5 -> ARABIC PERCENT SIGN + u'&' # 0xA6 -> AMPERSAND, right-left + u"'" # 0xA7 -> APOSTROPHE, right-left + u'(' # 0xA8 -> LEFT PARENTHESIS, right-left + u')' # 0xA9 -> RIGHT PARENTHESIS, right-left + u'*' # 0xAA -> ASTERISK, right-left + u'+' # 0xAB -> PLUS SIGN, right-left + u'\u060c' # 0xAC -> ARABIC COMMA + u'-' # 0xAD -> HYPHEN-MINUS, right-left + u'.' # 0xAE -> FULL STOP, right-left + u'/' # 0xAF -> SOLIDUS, right-left + u'\u06f0' # 0xB0 -> EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) + u'\u06f1' # 0xB1 -> EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) + u'\u06f2' # 0xB2 -> EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) + u'\u06f3' # 0xB3 -> EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) + u'\u06f4' # 0xB4 -> EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) + u'\u06f5' # 0xB5 -> EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) + u'\u06f6' # 0xB6 -> EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) + u'\u06f7' # 0xB7 -> EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) + u'\u06f8' # 0xB8 -> EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) + u'\u06f9' # 0xB9 -> EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) + u':' # 0xBA -> COLON, right-left + u'\u061b' # 0xBB -> ARABIC SEMICOLON + u'<' # 0xBC -> LESS-THAN SIGN, right-left + u'=' # 0xBD -> EQUALS SIGN, right-left + u'>' # 0xBE -> GREATER-THAN SIGN, right-left + u'\u061f' # 0xBF -> ARABIC QUESTION MARK + u'\u274a' # 0xC0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA + u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + u'\u0627' # 0xC7 -> ARABIC LETTER ALEF + u'\u0628' # 0xC8 -> ARABIC LETTER BEH + u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + u'\u062a' # 0xCA -> ARABIC LETTER TEH + u'\u062b' # 0xCB -> ARABIC LETTER THEH + u'\u062c' # 0xCC -> ARABIC LETTER JEEM + u'\u062d' # 0xCD -> ARABIC LETTER HAH + u'\u062e' # 0xCE -> ARABIC LETTER KHAH + u'\u062f' # 0xCF -> ARABIC LETTER DAL + u'\u0630' # 0xD0 -> ARABIC LETTER THAL + u'\u0631' # 0xD1 -> ARABIC LETTER REH + u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN + u'\u0633' # 0xD3 -> ARABIC LETTER SEEN + u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN + u'\u0635' # 0xD5 -> ARABIC LETTER SAD + u'\u0636' # 0xD6 -> ARABIC LETTER DAD + u'\u0637' # 0xD7 -> ARABIC LETTER TAH + u'\u0638' # 0xD8 -> ARABIC LETTER ZAH + u'\u0639' # 0xD9 -> ARABIC LETTER AIN + u'\u063a' # 0xDA -> ARABIC LETTER GHAIN + u'[' # 0xDB -> LEFT SQUARE BRACKET, right-left + u'\\' # 0xDC -> REVERSE SOLIDUS, right-left + u']' # 0xDD -> RIGHT SQUARE BRACKET, right-left + u'^' # 0xDE -> CIRCUMFLEX ACCENT, right-left + u'_' # 0xDF -> LOW LINE, right-left + u'\u0640' # 0xE0 -> ARABIC TATWEEL + u'\u0641' # 0xE1 -> ARABIC LETTER FEH + u'\u0642' # 0xE2 -> ARABIC LETTER QAF + u'\u0643' # 0xE3 -> ARABIC LETTER KAF + u'\u0644' # 0xE4 -> ARABIC LETTER LAM + u'\u0645' # 0xE5 -> ARABIC LETTER MEEM + u'\u0646' # 0xE6 -> ARABIC LETTER NOON + u'\u0647' # 0xE7 -> ARABIC LETTER HEH + u'\u0648' # 0xE8 -> ARABIC LETTER WAW + u'\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + u'\u064a' # 0xEA -> ARABIC LETTER YEH + u'\u064b' # 0xEB -> ARABIC FATHATAN + u'\u064c' # 0xEC -> ARABIC DAMMATAN + u'\u064d' # 0xED -> ARABIC KASRATAN + u'\u064e' # 0xEE -> ARABIC FATHA + u'\u064f' # 0xEF -> ARABIC DAMMA + u'\u0650' # 0xF0 -> ARABIC KASRA + u'\u0651' # 0xF1 -> ARABIC SHADDA + u'\u0652' # 0xF2 -> ARABIC SUKUN + u'\u067e' # 0xF3 -> ARABIC LETTER PEH + u'\u0679' # 0xF4 -> ARABIC LETTER TTEH + u'\u0686' # 0xF5 -> ARABIC LETTER TCHEH + u'\u06d5' # 0xF6 -> ARABIC LETTER AE + u'\u06a4' # 0xF7 -> ARABIC LETTER VEH + u'\u06af' # 0xF8 -> ARABIC LETTER GAF + u'\u0688' # 0xF9 -> ARABIC LETTER DDAL + u'\u0691' # 0xFA -> ARABIC LETTER RREH + u'{' # 0xFB -> LEFT CURLY BRACKET, right-left + u'|' # 0xFC -> VERTICAL LINE, right-left + u'}' # 0xFD -> RIGHT CURLY BRACKET, right-left + u'\u0698' # 0xFE -> ARABIC LETTER JEH + u'\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE, left-right - 0x0020: 0xA0, # SPACE, right-left - 0x0021: 0x21, # EXCLAMATION MARK, left-right - 0x0021: 0xA1, # EXCLAMATION MARK, right-left - 0x0022: 0x22, # QUOTATION MARK, left-right - 0x0022: 0xA2, # QUOTATION MARK, right-left - 0x0023: 0x23, # NUMBER SIGN, left-right - 0x0023: 0xA3, # NUMBER SIGN, right-left - 0x0024: 0x24, # DOLLAR SIGN, left-right - 0x0024: 0xA4, # DOLLAR SIGN, right-left - 0x0025: 0x25, # PERCENT SIGN, left-right - 0x0026: 0x26, # AMPERSAND, left-right - 0x0026: 0xA6, # AMPERSAND, right-left - 0x0027: 0x27, # APOSTROPHE, left-right - 0x0027: 0xA7, # APOSTROPHE, right-left - 0x0028: 0x28, # LEFT PARENTHESIS, left-right - 0x0028: 0xA8, # LEFT PARENTHESIS, right-left - 0x0029: 0x29, # RIGHT PARENTHESIS, left-right - 0x0029: 0xA9, # RIGHT PARENTHESIS, right-left - 0x002A: 0x2A, # ASTERISK, left-right - 0x002A: 0xAA, # ASTERISK, right-left - 0x002B: 0x2B, # PLUS SIGN, left-right - 0x002B: 0xAB, # PLUS SIGN, right-left - 0x002C: 0x2C, # COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR - 0x002D: 0x2D, # HYPHEN-MINUS, left-right - 0x002D: 0xAD, # HYPHEN-MINUS, right-left - 0x002E: 0x2E, # FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR - 0x002E: 0xAE, # FULL STOP, right-left - 0x002F: 0x2F, # SOLIDUS, left-right - 0x002F: 0xAF, # SOLIDUS, right-left - 0x0030: 0x30, # DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE - 0x0032: 0x32, # DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO - 0x0033: 0x33, # DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE - 0x003A: 0x3A, # COLON, left-right - 0x003A: 0xBA, # COLON, right-left - 0x003B: 0x3B, # SEMICOLON, left-right - 0x003C: 0x3C, # LESS-THAN SIGN, left-right - 0x003C: 0xBC, # LESS-THAN SIGN, right-left - 0x003D: 0x3D, # EQUALS SIGN, left-right - 0x003D: 0xBD, # EQUALS SIGN, right-left - 0x003E: 0x3E, # GREATER-THAN SIGN, left-right - 0x003E: 0xBE, # GREATER-THAN SIGN, right-left - 0x003F: 0x3F, # QUESTION MARK, left-right - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET, left-right - 0x005B: 0xDB, # LEFT SQUARE BRACKET, right-left - 0x005C: 0x5C, # REVERSE SOLIDUS, left-right - 0x005C: 0xDC, # REVERSE SOLIDUS, right-left - 0x005D: 0x5D, # RIGHT SQUARE BRACKET, left-right - 0x005D: 0xDD, # RIGHT SQUARE BRACKET, right-left - 0x005E: 0x5E, # CIRCUMFLEX ACCENT, left-right - 0x005E: 0xDE, # CIRCUMFLEX ACCENT, right-left - 0x005F: 0x5F, # LOW LINE, left-right - 0x005F: 0xDF, # LOW LINE, right-left - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET, left-right - 0x007B: 0xFB, # LEFT CURLY BRACKET, right-left - 0x007C: 0x7C, # VERTICAL LINE, left-right - 0x007C: 0xFC, # VERTICAL LINE, right-left - 0x007D: 0x7D, # RIGHT CURLY BRACKET, left-right - 0x007D: 0xFD, # RIGHT CURLY BRACKET, right-left - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0x81, # NO-BREAK SPACE, right-left - 0x00AB: 0x8C, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - 0x00BB: 0x98, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE - 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0x9B, # DIVISION SIGN, right-left - 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS - 0x060C: 0xAC, # ARABIC COMMA - 0x061B: 0xBB, # ARABIC SEMICOLON - 0x061F: 0xBF, # ARABIC QUESTION MARK - 0x0621: 0xC1, # ARABIC LETTER HAMZA - 0x0622: 0xC2, # ARABIC LETTER ALEF WITH MADDA ABOVE - 0x0623: 0xC3, # ARABIC LETTER ALEF WITH HAMZA ABOVE - 0x0624: 0xC4, # ARABIC LETTER WAW WITH HAMZA ABOVE - 0x0625: 0xC5, # ARABIC LETTER ALEF WITH HAMZA BELOW - 0x0626: 0xC6, # ARABIC LETTER YEH WITH HAMZA ABOVE - 0x0627: 0xC7, # ARABIC LETTER ALEF - 0x0628: 0xC8, # ARABIC LETTER BEH - 0x0629: 0xC9, # ARABIC LETTER TEH MARBUTA - 0x062A: 0xCA, # ARABIC LETTER TEH - 0x062B: 0xCB, # ARABIC LETTER THEH - 0x062C: 0xCC, # ARABIC LETTER JEEM - 0x062D: 0xCD, # ARABIC LETTER HAH - 0x062E: 0xCE, # ARABIC LETTER KHAH - 0x062F: 0xCF, # ARABIC LETTER DAL - 0x0630: 0xD0, # ARABIC LETTER THAL - 0x0631: 0xD1, # ARABIC LETTER REH - 0x0632: 0xD2, # ARABIC LETTER ZAIN - 0x0633: 0xD3, # ARABIC LETTER SEEN - 0x0634: 0xD4, # ARABIC LETTER SHEEN - 0x0635: 0xD5, # ARABIC LETTER SAD - 0x0636: 0xD6, # ARABIC LETTER DAD - 0x0637: 0xD7, # ARABIC LETTER TAH - 0x0638: 0xD8, # ARABIC LETTER ZAH - 0x0639: 0xD9, # ARABIC LETTER AIN - 0x063A: 0xDA, # ARABIC LETTER GHAIN - 0x0640: 0xE0, # ARABIC TATWEEL - 0x0641: 0xE1, # ARABIC LETTER FEH - 0x0642: 0xE2, # ARABIC LETTER QAF - 0x0643: 0xE3, # ARABIC LETTER KAF - 0x0644: 0xE4, # ARABIC LETTER LAM - 0x0645: 0xE5, # ARABIC LETTER MEEM - 0x0646: 0xE6, # ARABIC LETTER NOON - 0x0647: 0xE7, # ARABIC LETTER HEH - 0x0648: 0xE8, # ARABIC LETTER WAW - 0x0649: 0xE9, # ARABIC LETTER ALEF MAKSURA - 0x064A: 0xEA, # ARABIC LETTER YEH - 0x064B: 0xEB, # ARABIC FATHATAN - 0x064C: 0xEC, # ARABIC DAMMATAN - 0x064D: 0xED, # ARABIC KASRATAN - 0x064E: 0xEE, # ARABIC FATHA - 0x064F: 0xEF, # ARABIC DAMMA - 0x0650: 0xF0, # ARABIC KASRA - 0x0651: 0xF1, # ARABIC SHADDA - 0x0652: 0xF2, # ARABIC SUKUN - 0x066A: 0xA5, # ARABIC PERCENT SIGN - 0x0679: 0xF4, # ARABIC LETTER TTEH - 0x067E: 0xF3, # ARABIC LETTER PEH - 0x0686: 0xF5, # ARABIC LETTER TCHEH - 0x0688: 0xF9, # ARABIC LETTER DDAL - 0x0691: 0xFA, # ARABIC LETTER RREH - 0x0698: 0xFE, # ARABIC LETTER JEH - 0x06A4: 0xF7, # ARABIC LETTER VEH - 0x06AF: 0xF8, # ARABIC LETTER GAF - 0x06BA: 0x8B, # ARABIC LETTER NOON GHUNNA - 0x06D2: 0xFF, # ARABIC LETTER YEH BARREE - 0x06D5: 0xF6, # ARABIC LETTER AE - 0x06F0: 0xB0, # EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) - 0x06F1: 0xB1, # EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) - 0x06F2: 0xB2, # EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) - 0x06F3: 0xB3, # EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) - 0x06F4: 0xB4, # EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) - 0x06F5: 0xB5, # EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) - 0x06F6: 0xB6, # EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) - 0x06F7: 0xB7, # EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) - 0x06F8: 0xB8, # EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) - 0x06F9: 0xB9, # EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) - 0x2026: 0x93, # HORIZONTAL ELLIPSIS, right-left - 0x274A: 0xC0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE, left-right + 0x0020: 0xA0, # SPACE, right-left + 0x0021: 0x21, # EXCLAMATION MARK, left-right + 0x0021: 0xA1, # EXCLAMATION MARK, right-left + 0x0022: 0x22, # QUOTATION MARK, left-right + 0x0022: 0xA2, # QUOTATION MARK, right-left + 0x0023: 0x23, # NUMBER SIGN, left-right + 0x0023: 0xA3, # NUMBER SIGN, right-left + 0x0024: 0x24, # DOLLAR SIGN, left-right + 0x0024: 0xA4, # DOLLAR SIGN, right-left + 0x0025: 0x25, # PERCENT SIGN, left-right + 0x0026: 0x26, # AMPERSAND, left-right + 0x0026: 0xA6, # AMPERSAND, right-left + 0x0027: 0x27, # APOSTROPHE, left-right + 0x0027: 0xA7, # APOSTROPHE, right-left + 0x0028: 0x28, # LEFT PARENTHESIS, left-right + 0x0028: 0xA8, # LEFT PARENTHESIS, right-left + 0x0029: 0x29, # RIGHT PARENTHESIS, left-right + 0x0029: 0xA9, # RIGHT PARENTHESIS, right-left + 0x002A: 0x2A, # ASTERISK, left-right + 0x002A: 0xAA, # ASTERISK, right-left + 0x002B: 0x2B, # PLUS SIGN, left-right + 0x002B: 0xAB, # PLUS SIGN, right-left + 0x002C: 0x2C, # COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + 0x002D: 0x2D, # HYPHEN-MINUS, left-right + 0x002D: 0xAD, # HYPHEN-MINUS, right-left + 0x002E: 0x2E, # FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + 0x002E: 0xAE, # FULL STOP, right-left + 0x002F: 0x2F, # SOLIDUS, left-right + 0x002F: 0xAF, # SOLIDUS, right-left + 0x0030: 0x30, # DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE + 0x0032: 0x32, # DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO + 0x0033: 0x33, # DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE + 0x003A: 0x3A, # COLON, left-right + 0x003A: 0xBA, # COLON, right-left + 0x003B: 0x3B, # SEMICOLON, left-right + 0x003C: 0x3C, # LESS-THAN SIGN, left-right + 0x003C: 0xBC, # LESS-THAN SIGN, right-left + 0x003D: 0x3D, # EQUALS SIGN, left-right + 0x003D: 0xBD, # EQUALS SIGN, right-left + 0x003E: 0x3E, # GREATER-THAN SIGN, left-right + 0x003E: 0xBE, # GREATER-THAN SIGN, right-left + 0x003F: 0x3F, # QUESTION MARK, left-right + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET, left-right + 0x005B: 0xDB, # LEFT SQUARE BRACKET, right-left + 0x005C: 0x5C, # REVERSE SOLIDUS, left-right + 0x005C: 0xDC, # REVERSE SOLIDUS, right-left + 0x005D: 0x5D, # RIGHT SQUARE BRACKET, left-right + 0x005D: 0xDD, # RIGHT SQUARE BRACKET, right-left + 0x005E: 0x5E, # CIRCUMFLEX ACCENT, left-right + 0x005E: 0xDE, # CIRCUMFLEX ACCENT, right-left + 0x005F: 0x5F, # LOW LINE, left-right + 0x005F: 0xDF, # LOW LINE, right-left + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET, left-right + 0x007B: 0xFB, # LEFT CURLY BRACKET, right-left + 0x007C: 0x7C, # VERTICAL LINE, left-right + 0x007C: 0xFC, # VERTICAL LINE, right-left + 0x007D: 0x7D, # RIGHT CURLY BRACKET, left-right + 0x007D: 0xFD, # RIGHT CURLY BRACKET, right-left + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0x81, # NO-BREAK SPACE, right-left + 0x00AB: 0x8C, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00BB: 0x98, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE + 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0x9B, # DIVISION SIGN, right-left + 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS + 0x060C: 0xAC, # ARABIC COMMA + 0x061B: 0xBB, # ARABIC SEMICOLON + 0x061F: 0xBF, # ARABIC QUESTION MARK + 0x0621: 0xC1, # ARABIC LETTER HAMZA + 0x0622: 0xC2, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x0623: 0xC3, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x0624: 0xC4, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x0625: 0xC5, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x0626: 0xC6, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x0627: 0xC7, # ARABIC LETTER ALEF + 0x0628: 0xC8, # ARABIC LETTER BEH + 0x0629: 0xC9, # ARABIC LETTER TEH MARBUTA + 0x062A: 0xCA, # ARABIC LETTER TEH + 0x062B: 0xCB, # ARABIC LETTER THEH + 0x062C: 0xCC, # ARABIC LETTER JEEM + 0x062D: 0xCD, # ARABIC LETTER HAH + 0x062E: 0xCE, # ARABIC LETTER KHAH + 0x062F: 0xCF, # ARABIC LETTER DAL + 0x0630: 0xD0, # ARABIC LETTER THAL + 0x0631: 0xD1, # ARABIC LETTER REH + 0x0632: 0xD2, # ARABIC LETTER ZAIN + 0x0633: 0xD3, # ARABIC LETTER SEEN + 0x0634: 0xD4, # ARABIC LETTER SHEEN + 0x0635: 0xD5, # ARABIC LETTER SAD + 0x0636: 0xD6, # ARABIC LETTER DAD + 0x0637: 0xD7, # ARABIC LETTER TAH + 0x0638: 0xD8, # ARABIC LETTER ZAH + 0x0639: 0xD9, # ARABIC LETTER AIN + 0x063A: 0xDA, # ARABIC LETTER GHAIN + 0x0640: 0xE0, # ARABIC TATWEEL + 0x0641: 0xE1, # ARABIC LETTER FEH + 0x0642: 0xE2, # ARABIC LETTER QAF + 0x0643: 0xE3, # ARABIC LETTER KAF + 0x0644: 0xE4, # ARABIC LETTER LAM + 0x0645: 0xE5, # ARABIC LETTER MEEM + 0x0646: 0xE6, # ARABIC LETTER NOON + 0x0647: 0xE7, # ARABIC LETTER HEH + 0x0648: 0xE8, # ARABIC LETTER WAW + 0x0649: 0xE9, # ARABIC LETTER ALEF MAKSURA + 0x064A: 0xEA, # ARABIC LETTER YEH + 0x064B: 0xEB, # ARABIC FATHATAN + 0x064C: 0xEC, # ARABIC DAMMATAN + 0x064D: 0xED, # ARABIC KASRATAN + 0x064E: 0xEE, # ARABIC FATHA + 0x064F: 0xEF, # ARABIC DAMMA + 0x0650: 0xF0, # ARABIC KASRA + 0x0651: 0xF1, # ARABIC SHADDA + 0x0652: 0xF2, # ARABIC SUKUN + 0x066A: 0xA5, # ARABIC PERCENT SIGN + 0x0679: 0xF4, # ARABIC LETTER TTEH + 0x067E: 0xF3, # ARABIC LETTER PEH + 0x0686: 0xF5, # ARABIC LETTER TCHEH + 0x0688: 0xF9, # ARABIC LETTER DDAL + 0x0691: 0xFA, # ARABIC LETTER RREH + 0x0698: 0xFE, # ARABIC LETTER JEH + 0x06A4: 0xF7, # ARABIC LETTER VEH + 0x06AF: 0xF8, # ARABIC LETTER GAF + 0x06BA: 0x8B, # ARABIC LETTER NOON GHUNNA + 0x06D2: 0xFF, # ARABIC LETTER YEH BARREE + 0x06D5: 0xF6, # ARABIC LETTER AE + 0x06F0: 0xB0, # EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x06F1: 0xB1, # EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x06F2: 0xB2, # EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x06F3: 0xB3, # EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x06F4: 0xB4, # EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x06F5: 0xB5, # EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x06F6: 0xB6, # EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x06F7: 0xB7, # EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x06F8: 0xB8, # EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x06F9: 0xB9, # EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x2026: 0x93, # HORIZONTAL ELLIPSIS, right-left + 0x274A: 0xC0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left } - Modified: python/trunk/Lib/encodings/mac_greek.py ============================================================================== --- python/trunk/Lib/encodings/mac_greek.py (original) +++ python/trunk/Lib/encodings/mac_greek.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xb9' # 0x81 -> SUPERSCRIPT ONE - u'\xb2' # 0x82 -> SUPERSCRIPT TWO - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xb3' # 0x84 -> SUPERSCRIPT THREE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u0385' # 0x87 -> GREEK DIALYTIKA TONOS - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u0384' # 0x8B -> GREEK TONOS - u'\xa8' # 0x8C -> DIAERESIS - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xa3' # 0x92 -> POUND SIGN - u'\u2122' # 0x93 -> TRADE MARK SIGN - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\u2022' # 0x96 -> BULLET - u'\xbd' # 0x97 -> VULGAR FRACTION ONE HALF - u'\u2030' # 0x98 -> PER MILLE SIGN - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xa6' # 0x9B -> BROKEN BAR - u'\u20ac' # 0x9C -> EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\u0393' # 0xA1 -> GREEK CAPITAL LETTER GAMMA - u'\u0394' # 0xA2 -> GREEK CAPITAL LETTER DELTA - u'\u0398' # 0xA3 -> GREEK CAPITAL LETTER THETA - u'\u039b' # 0xA4 -> GREEK CAPITAL LETTER LAMDA - u'\u039e' # 0xA5 -> GREEK CAPITAL LETTER XI - u'\u03a0' # 0xA6 -> GREEK CAPITAL LETTER PI - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u03a3' # 0xAA -> GREEK CAPITAL LETTER SIGMA - u'\u03aa' # 0xAB -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - u'\xa7' # 0xAC -> SECTION SIGN - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\xb0' # 0xAE -> DEGREE SIGN - u'\xb7' # 0xAF -> MIDDLE DOT - u'\u0391' # 0xB0 -> GREEK CAPITAL LETTER ALPHA - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\u0392' # 0xB5 -> GREEK CAPITAL LETTER BETA - u'\u0395' # 0xB6 -> GREEK CAPITAL LETTER EPSILON - u'\u0396' # 0xB7 -> GREEK CAPITAL LETTER ZETA - u'\u0397' # 0xB8 -> GREEK CAPITAL LETTER ETA - u'\u0399' # 0xB9 -> GREEK CAPITAL LETTER IOTA - u'\u039a' # 0xBA -> GREEK CAPITAL LETTER KAPPA - u'\u039c' # 0xBB -> GREEK CAPITAL LETTER MU - u'\u03a6' # 0xBC -> GREEK CAPITAL LETTER PHI - u'\u03ab' # 0xBD -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - u'\u03a8' # 0xBE -> GREEK CAPITAL LETTER PSI - u'\u03a9' # 0xBF -> GREEK CAPITAL LETTER OMEGA - u'\u03ac' # 0xC0 -> GREEK SMALL LETTER ALPHA WITH TONOS - u'\u039d' # 0xC1 -> GREEK CAPITAL LETTER NU - u'\xac' # 0xC2 -> NOT SIGN - u'\u039f' # 0xC3 -> GREEK CAPITAL LETTER OMICRON - u'\u03a1' # 0xC4 -> GREEK CAPITAL LETTER RHO - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u03a4' # 0xC6 -> GREEK CAPITAL LETTER TAU - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\u03a5' # 0xCB -> GREEK CAPITAL LETTER UPSILON - u'\u03a7' # 0xCC -> GREEK CAPITAL LETTER CHI - u'\u0386' # 0xCD -> GREEK CAPITAL LETTER ALPHA WITH TONOS - u'\u0388' # 0xCE -> GREEK CAPITAL LETTER EPSILON WITH TONOS - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2015' # 0xD1 -> HORIZONTAL BAR - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u0389' # 0xD7 -> GREEK CAPITAL LETTER ETA WITH TONOS - u'\u038a' # 0xD8 -> GREEK CAPITAL LETTER IOTA WITH TONOS - u'\u038c' # 0xD9 -> GREEK CAPITAL LETTER OMICRON WITH TONOS - u'\u038e' # 0xDA -> GREEK CAPITAL LETTER UPSILON WITH TONOS - u'\u03ad' # 0xDB -> GREEK SMALL LETTER EPSILON WITH TONOS - u'\u03ae' # 0xDC -> GREEK SMALL LETTER ETA WITH TONOS - u'\u03af' # 0xDD -> GREEK SMALL LETTER IOTA WITH TONOS - u'\u03cc' # 0xDE -> GREEK SMALL LETTER OMICRON WITH TONOS - u'\u038f' # 0xDF -> GREEK CAPITAL LETTER OMEGA WITH TONOS - u'\u03cd' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH TONOS - u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA - u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA - u'\u03c8' # 0xE3 -> GREEK SMALL LETTER PSI - u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA - u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON - u'\u03c6' # 0xE6 -> GREEK SMALL LETTER PHI - u'\u03b3' # 0xE7 -> GREEK SMALL LETTER GAMMA - u'\u03b7' # 0xE8 -> GREEK SMALL LETTER ETA - u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA - u'\u03be' # 0xEA -> GREEK SMALL LETTER XI - u'\u03ba' # 0xEB -> GREEK SMALL LETTER KAPPA - u'\u03bb' # 0xEC -> GREEK SMALL LETTER LAMDA - u'\u03bc' # 0xED -> GREEK SMALL LETTER MU - u'\u03bd' # 0xEE -> GREEK SMALL LETTER NU - u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON - u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI - u'\u03ce' # 0xF1 -> GREEK SMALL LETTER OMEGA WITH TONOS - u'\u03c1' # 0xF2 -> GREEK SMALL LETTER RHO - u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA - u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU - u'\u03b8' # 0xF5 -> GREEK SMALL LETTER THETA - u'\u03c9' # 0xF6 -> GREEK SMALL LETTER OMEGA - u'\u03c2' # 0xF7 -> GREEK SMALL LETTER FINAL SIGMA - u'\u03c7' # 0xF8 -> GREEK SMALL LETTER CHI - u'\u03c5' # 0xF9 -> GREEK SMALL LETTER UPSILON - u'\u03b6' # 0xFA -> GREEK SMALL LETTER ZETA - u'\u03ca' # 0xFB -> GREEK SMALL LETTER IOTA WITH DIALYTIKA - u'\u03cb' # 0xFC -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA - u'\u0390' # 0xFD -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - u'\u03b0' # 0xFE -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - u'\xad' # 0xFF -> SOFT HYPHEN # before Mac OS 9.2.2, was undefined + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xb9' # 0x81 -> SUPERSCRIPT ONE + u'\xb2' # 0x82 -> SUPERSCRIPT TWO + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xb3' # 0x84 -> SUPERSCRIPT THREE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\u0385' # 0x87 -> GREEK DIALYTIKA TONOS + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\u0384' # 0x8B -> GREEK TONOS + u'\xa8' # 0x8C -> DIAERESIS + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xa3' # 0x92 -> POUND SIGN + u'\u2122' # 0x93 -> TRADE MARK SIGN + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\u2022' # 0x96 -> BULLET + u'\xbd' # 0x97 -> VULGAR FRACTION ONE HALF + u'\u2030' # 0x98 -> PER MILLE SIGN + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xa6' # 0x9B -> BROKEN BAR + u'\u20ac' # 0x9C -> EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\u0393' # 0xA1 -> GREEK CAPITAL LETTER GAMMA + u'\u0394' # 0xA2 -> GREEK CAPITAL LETTER DELTA + u'\u0398' # 0xA3 -> GREEK CAPITAL LETTER THETA + u'\u039b' # 0xA4 -> GREEK CAPITAL LETTER LAMDA + u'\u039e' # 0xA5 -> GREEK CAPITAL LETTER XI + u'\u03a0' # 0xA6 -> GREEK CAPITAL LETTER PI + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u03a3' # 0xAA -> GREEK CAPITAL LETTER SIGMA + u'\u03aa' # 0xAB -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + u'\xa7' # 0xAC -> SECTION SIGN + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\xb0' # 0xAE -> DEGREE SIGN + u'\xb7' # 0xAF -> MIDDLE DOT + u'\u0391' # 0xB0 -> GREEK CAPITAL LETTER ALPHA + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\u0392' # 0xB5 -> GREEK CAPITAL LETTER BETA + u'\u0395' # 0xB6 -> GREEK CAPITAL LETTER EPSILON + u'\u0396' # 0xB7 -> GREEK CAPITAL LETTER ZETA + u'\u0397' # 0xB8 -> GREEK CAPITAL LETTER ETA + u'\u0399' # 0xB9 -> GREEK CAPITAL LETTER IOTA + u'\u039a' # 0xBA -> GREEK CAPITAL LETTER KAPPA + u'\u039c' # 0xBB -> GREEK CAPITAL LETTER MU + u'\u03a6' # 0xBC -> GREEK CAPITAL LETTER PHI + u'\u03ab' # 0xBD -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + u'\u03a8' # 0xBE -> GREEK CAPITAL LETTER PSI + u'\u03a9' # 0xBF -> GREEK CAPITAL LETTER OMEGA + u'\u03ac' # 0xC0 -> GREEK SMALL LETTER ALPHA WITH TONOS + u'\u039d' # 0xC1 -> GREEK CAPITAL LETTER NU + u'\xac' # 0xC2 -> NOT SIGN + u'\u039f' # 0xC3 -> GREEK CAPITAL LETTER OMICRON + u'\u03a1' # 0xC4 -> GREEK CAPITAL LETTER RHO + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u03a4' # 0xC6 -> GREEK CAPITAL LETTER TAU + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\u03a5' # 0xCB -> GREEK CAPITAL LETTER UPSILON + u'\u03a7' # 0xCC -> GREEK CAPITAL LETTER CHI + u'\u0386' # 0xCD -> GREEK CAPITAL LETTER ALPHA WITH TONOS + u'\u0388' # 0xCE -> GREEK CAPITAL LETTER EPSILON WITH TONOS + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2015' # 0xD1 -> HORIZONTAL BAR + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u0389' # 0xD7 -> GREEK CAPITAL LETTER ETA WITH TONOS + u'\u038a' # 0xD8 -> GREEK CAPITAL LETTER IOTA WITH TONOS + u'\u038c' # 0xD9 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + u'\u038e' # 0xDA -> GREEK CAPITAL LETTER UPSILON WITH TONOS + u'\u03ad' # 0xDB -> GREEK SMALL LETTER EPSILON WITH TONOS + u'\u03ae' # 0xDC -> GREEK SMALL LETTER ETA WITH TONOS + u'\u03af' # 0xDD -> GREEK SMALL LETTER IOTA WITH TONOS + u'\u03cc' # 0xDE -> GREEK SMALL LETTER OMICRON WITH TONOS + u'\u038f' # 0xDF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + u'\u03cd' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH TONOS + u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + u'\u03c8' # 0xE3 -> GREEK SMALL LETTER PSI + u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + u'\u03c6' # 0xE6 -> GREEK SMALL LETTER PHI + u'\u03b3' # 0xE7 -> GREEK SMALL LETTER GAMMA + u'\u03b7' # 0xE8 -> GREEK SMALL LETTER ETA + u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + u'\u03be' # 0xEA -> GREEK SMALL LETTER XI + u'\u03ba' # 0xEB -> GREEK SMALL LETTER KAPPA + u'\u03bb' # 0xEC -> GREEK SMALL LETTER LAMDA + u'\u03bc' # 0xED -> GREEK SMALL LETTER MU + u'\u03bd' # 0xEE -> GREEK SMALL LETTER NU + u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + u'\u03ce' # 0xF1 -> GREEK SMALL LETTER OMEGA WITH TONOS + u'\u03c1' # 0xF2 -> GREEK SMALL LETTER RHO + u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + u'\u03b8' # 0xF5 -> GREEK SMALL LETTER THETA + u'\u03c9' # 0xF6 -> GREEK SMALL LETTER OMEGA + u'\u03c2' # 0xF7 -> GREEK SMALL LETTER FINAL SIGMA + u'\u03c7' # 0xF8 -> GREEK SMALL LETTER CHI + u'\u03c5' # 0xF9 -> GREEK SMALL LETTER UPSILON + u'\u03b6' # 0xFA -> GREEK SMALL LETTER ZETA + u'\u03ca' # 0xFB -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + u'\u03cb' # 0xFC -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + u'\u0390' # 0xFD -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + u'\u03b0' # 0xFE -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + u'\xad' # 0xFF -> SOFT HYPHEN # before Mac OS 9.2.2, was undefined ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0xCA, # NO-BREAK SPACE - 0x00A3: 0x92, # POUND SIGN - 0x00A5: 0xB4, # YEN SIGN - 0x00A6: 0x9B, # BROKEN BAR - 0x00A7: 0xAC, # SECTION SIGN - 0x00A8: 0x8C, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xC2, # NOT SIGN - 0x00AD: 0xFF, # SOFT HYPHEN # before Mac OS 9.2.2, was undefined - 0x00AE: 0xA8, # REGISTERED SIGN - 0x00B0: 0xAE, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B2: 0x82, # SUPERSCRIPT TWO - 0x00B3: 0x84, # SUPERSCRIPT THREE - 0x00B7: 0xAF, # MIDDLE DOT - 0x00B9: 0x81, # SUPERSCRIPT ONE - 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BD: 0x97, # VULGAR FRACTION ONE HALF - 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S - 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE - 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xD6, # DIVISION SIGN - 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE - 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS - 0x0153: 0xCF, # LATIN SMALL LIGATURE OE - 0x0384: 0x8B, # GREEK TONOS - 0x0385: 0x87, # GREEK DIALYTIKA TONOS - 0x0386: 0xCD, # GREEK CAPITAL LETTER ALPHA WITH TONOS - 0x0388: 0xCE, # GREEK CAPITAL LETTER EPSILON WITH TONOS - 0x0389: 0xD7, # GREEK CAPITAL LETTER ETA WITH TONOS - 0x038A: 0xD8, # GREEK CAPITAL LETTER IOTA WITH TONOS - 0x038C: 0xD9, # GREEK CAPITAL LETTER OMICRON WITH TONOS - 0x038E: 0xDA, # GREEK CAPITAL LETTER UPSILON WITH TONOS - 0x038F: 0xDF, # GREEK CAPITAL LETTER OMEGA WITH TONOS - 0x0390: 0xFD, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - 0x0391: 0xB0, # GREEK CAPITAL LETTER ALPHA - 0x0392: 0xB5, # GREEK CAPITAL LETTER BETA - 0x0393: 0xA1, # GREEK CAPITAL LETTER GAMMA - 0x0394: 0xA2, # GREEK CAPITAL LETTER DELTA - 0x0395: 0xB6, # GREEK CAPITAL LETTER EPSILON - 0x0396: 0xB7, # GREEK CAPITAL LETTER ZETA - 0x0397: 0xB8, # GREEK CAPITAL LETTER ETA - 0x0398: 0xA3, # GREEK CAPITAL LETTER THETA - 0x0399: 0xB9, # GREEK CAPITAL LETTER IOTA - 0x039A: 0xBA, # GREEK CAPITAL LETTER KAPPA - 0x039B: 0xA4, # GREEK CAPITAL LETTER LAMDA - 0x039C: 0xBB, # GREEK CAPITAL LETTER MU - 0x039D: 0xC1, # GREEK CAPITAL LETTER NU - 0x039E: 0xA5, # GREEK CAPITAL LETTER XI - 0x039F: 0xC3, # GREEK CAPITAL LETTER OMICRON - 0x03A0: 0xA6, # GREEK CAPITAL LETTER PI - 0x03A1: 0xC4, # GREEK CAPITAL LETTER RHO - 0x03A3: 0xAA, # GREEK CAPITAL LETTER SIGMA - 0x03A4: 0xC6, # GREEK CAPITAL LETTER TAU - 0x03A5: 0xCB, # GREEK CAPITAL LETTER UPSILON - 0x03A6: 0xBC, # GREEK CAPITAL LETTER PHI - 0x03A7: 0xCC, # GREEK CAPITAL LETTER CHI - 0x03A8: 0xBE, # GREEK CAPITAL LETTER PSI - 0x03A9: 0xBF, # GREEK CAPITAL LETTER OMEGA - 0x03AA: 0xAB, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - 0x03AB: 0xBD, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - 0x03AC: 0xC0, # GREEK SMALL LETTER ALPHA WITH TONOS - 0x03AD: 0xDB, # GREEK SMALL LETTER EPSILON WITH TONOS - 0x03AE: 0xDC, # GREEK SMALL LETTER ETA WITH TONOS - 0x03AF: 0xDD, # GREEK SMALL LETTER IOTA WITH TONOS - 0x03B0: 0xFE, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - 0x03B1: 0xE1, # GREEK SMALL LETTER ALPHA - 0x03B2: 0xE2, # GREEK SMALL LETTER BETA - 0x03B3: 0xE7, # GREEK SMALL LETTER GAMMA - 0x03B4: 0xE4, # GREEK SMALL LETTER DELTA - 0x03B5: 0xE5, # GREEK SMALL LETTER EPSILON - 0x03B6: 0xFA, # GREEK SMALL LETTER ZETA - 0x03B7: 0xE8, # GREEK SMALL LETTER ETA - 0x03B8: 0xF5, # GREEK SMALL LETTER THETA - 0x03B9: 0xE9, # GREEK SMALL LETTER IOTA - 0x03BA: 0xEB, # GREEK SMALL LETTER KAPPA - 0x03BB: 0xEC, # GREEK SMALL LETTER LAMDA - 0x03BC: 0xED, # GREEK SMALL LETTER MU - 0x03BD: 0xEE, # GREEK SMALL LETTER NU - 0x03BE: 0xEA, # GREEK SMALL LETTER XI - 0x03BF: 0xEF, # GREEK SMALL LETTER OMICRON - 0x03C0: 0xF0, # GREEK SMALL LETTER PI - 0x03C1: 0xF2, # GREEK SMALL LETTER RHO - 0x03C2: 0xF7, # GREEK SMALL LETTER FINAL SIGMA - 0x03C3: 0xF3, # GREEK SMALL LETTER SIGMA - 0x03C4: 0xF4, # GREEK SMALL LETTER TAU - 0x03C5: 0xF9, # GREEK SMALL LETTER UPSILON - 0x03C6: 0xE6, # GREEK SMALL LETTER PHI - 0x03C7: 0xF8, # GREEK SMALL LETTER CHI - 0x03C8: 0xE3, # GREEK SMALL LETTER PSI - 0x03C9: 0xF6, # GREEK SMALL LETTER OMEGA - 0x03CA: 0xFB, # GREEK SMALL LETTER IOTA WITH DIALYTIKA - 0x03CB: 0xFC, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA - 0x03CC: 0xDE, # GREEK SMALL LETTER OMICRON WITH TONOS - 0x03CD: 0xE0, # GREEK SMALL LETTER UPSILON WITH TONOS - 0x03CE: 0xF1, # GREEK SMALL LETTER OMEGA WITH TONOS - 0x2013: 0xD0, # EN DASH - 0x2015: 0xD1, # HORIZONTAL BAR - 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK - 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK - 0x2020: 0xA0, # DAGGER - 0x2022: 0x96, # BULLET - 0x2026: 0xC9, # HORIZONTAL ELLIPSIS - 0x2030: 0x98, # PER MILLE SIGN - 0x20AC: 0x9C, # EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN - 0x2122: 0x93, # TRADE MARK SIGN - 0x2248: 0xC5, # ALMOST EQUAL TO - 0x2260: 0xAD, # NOT EQUAL TO - 0x2264: 0xB2, # LESS-THAN OR EQUAL TO - 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0xCA, # NO-BREAK SPACE + 0x00A3: 0x92, # POUND SIGN + 0x00A5: 0xB4, # YEN SIGN + 0x00A6: 0x9B, # BROKEN BAR + 0x00A7: 0xAC, # SECTION SIGN + 0x00A8: 0x8C, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xC2, # NOT SIGN + 0x00AD: 0xFF, # SOFT HYPHEN # before Mac OS 9.2.2, was undefined + 0x00AE: 0xA8, # REGISTERED SIGN + 0x00B0: 0xAE, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B2: 0x82, # SUPERSCRIPT TWO + 0x00B3: 0x84, # SUPERSCRIPT THREE + 0x00B7: 0xAF, # MIDDLE DOT + 0x00B9: 0x81, # SUPERSCRIPT ONE + 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BD: 0x97, # VULGAR FRACTION ONE HALF + 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S + 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE + 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xD6, # DIVISION SIGN + 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE + 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0153: 0xCF, # LATIN SMALL LIGATURE OE + 0x0384: 0x8B, # GREEK TONOS + 0x0385: 0x87, # GREEK DIALYTIKA TONOS + 0x0386: 0xCD, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0xCE, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0xD7, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038A: 0xD8, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038C: 0xD9, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038E: 0xDA, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038F: 0xDF, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0xFD, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0xB0, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0xB5, # GREEK CAPITAL LETTER BETA + 0x0393: 0xA1, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0xA2, # GREEK CAPITAL LETTER DELTA + 0x0395: 0xB6, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0xB7, # GREEK CAPITAL LETTER ZETA + 0x0397: 0xB8, # GREEK CAPITAL LETTER ETA + 0x0398: 0xA3, # GREEK CAPITAL LETTER THETA + 0x0399: 0xB9, # GREEK CAPITAL LETTER IOTA + 0x039A: 0xBA, # GREEK CAPITAL LETTER KAPPA + 0x039B: 0xA4, # GREEK CAPITAL LETTER LAMDA + 0x039C: 0xBB, # GREEK CAPITAL LETTER MU + 0x039D: 0xC1, # GREEK CAPITAL LETTER NU + 0x039E: 0xA5, # GREEK CAPITAL LETTER XI + 0x039F: 0xC3, # GREEK CAPITAL LETTER OMICRON + 0x03A0: 0xA6, # GREEK CAPITAL LETTER PI + 0x03A1: 0xC4, # GREEK CAPITAL LETTER RHO + 0x03A3: 0xAA, # GREEK CAPITAL LETTER SIGMA + 0x03A4: 0xC6, # GREEK CAPITAL LETTER TAU + 0x03A5: 0xCB, # GREEK CAPITAL LETTER UPSILON + 0x03A6: 0xBC, # GREEK CAPITAL LETTER PHI + 0x03A7: 0xCC, # GREEK CAPITAL LETTER CHI + 0x03A8: 0xBE, # GREEK CAPITAL LETTER PSI + 0x03A9: 0xBF, # GREEK CAPITAL LETTER OMEGA + 0x03AA: 0xAB, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03AB: 0xBD, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03AC: 0xC0, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03AD: 0xDB, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03AE: 0xDC, # GREEK SMALL LETTER ETA WITH TONOS + 0x03AF: 0xDD, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03B0: 0xFE, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03B1: 0xE1, # GREEK SMALL LETTER ALPHA + 0x03B2: 0xE2, # GREEK SMALL LETTER BETA + 0x03B3: 0xE7, # GREEK SMALL LETTER GAMMA + 0x03B4: 0xE4, # GREEK SMALL LETTER DELTA + 0x03B5: 0xE5, # GREEK SMALL LETTER EPSILON + 0x03B6: 0xFA, # GREEK SMALL LETTER ZETA + 0x03B7: 0xE8, # GREEK SMALL LETTER ETA + 0x03B8: 0xF5, # GREEK SMALL LETTER THETA + 0x03B9: 0xE9, # GREEK SMALL LETTER IOTA + 0x03BA: 0xEB, # GREEK SMALL LETTER KAPPA + 0x03BB: 0xEC, # GREEK SMALL LETTER LAMDA + 0x03BC: 0xED, # GREEK SMALL LETTER MU + 0x03BD: 0xEE, # GREEK SMALL LETTER NU + 0x03BE: 0xEA, # GREEK SMALL LETTER XI + 0x03BF: 0xEF, # GREEK SMALL LETTER OMICRON + 0x03C0: 0xF0, # GREEK SMALL LETTER PI + 0x03C1: 0xF2, # GREEK SMALL LETTER RHO + 0x03C2: 0xF7, # GREEK SMALL LETTER FINAL SIGMA + 0x03C3: 0xF3, # GREEK SMALL LETTER SIGMA + 0x03C4: 0xF4, # GREEK SMALL LETTER TAU + 0x03C5: 0xF9, # GREEK SMALL LETTER UPSILON + 0x03C6: 0xE6, # GREEK SMALL LETTER PHI + 0x03C7: 0xF8, # GREEK SMALL LETTER CHI + 0x03C8: 0xE3, # GREEK SMALL LETTER PSI + 0x03C9: 0xF6, # GREEK SMALL LETTER OMEGA + 0x03CA: 0xFB, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03CB: 0xFC, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03CC: 0xDE, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03CD: 0xE0, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03CE: 0xF1, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2013: 0xD0, # EN DASH + 0x2015: 0xD1, # HORIZONTAL BAR + 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK + 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK + 0x2020: 0xA0, # DAGGER + 0x2022: 0x96, # BULLET + 0x2026: 0xC9, # HORIZONTAL ELLIPSIS + 0x2030: 0x98, # PER MILLE SIGN + 0x20AC: 0x9C, # EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN + 0x2122: 0x93, # TRADE MARK SIGN + 0x2248: 0xC5, # ALMOST EQUAL TO + 0x2260: 0xAD, # NOT EQUAL TO + 0x2264: 0xB2, # LESS-THAN OR EQUAL TO + 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO } - Modified: python/trunk/Lib/encodings/mac_iceland.py ============================================================================== --- python/trunk/Lib/encodings/mac_iceland.py (original) +++ python/trunk/Lib/encodings/mac_iceland.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xdd' # 0xA0 -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE - u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\xe6' # 0xBE -> LATIN SMALL LETTER AE - u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u2044' # 0xDA -> FRACTION SLASH - u'\u20ac' # 0xDB -> EURO SIGN - u'\xd0' # 0xDC -> LATIN CAPITAL LETTER ETH - u'\xf0' # 0xDD -> LATIN SMALL LETTER ETH - u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN - u'\xfe' # 0xDF -> LATIN SMALL LETTER THORN - u'\xfd' # 0xE0 -> LATIN SMALL LETTER Y WITH ACUTE - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\uf8ff' # 0xF0 -> Apple logo - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u02d8' # 0xF9 -> BREVE - u'\u02d9' # 0xFA -> DOT ABOVE - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT - u'\u02db' # 0xFE -> OGONEK - u'\u02c7' # 0xFF -> CARON + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\xdd' # 0xA0 -> LATIN CAPITAL LETTER Y WITH ACUTE + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\xe6' # 0xBE -> LATIN SMALL LETTER AE + u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u2044' # 0xDA -> FRACTION SLASH + u'\u20ac' # 0xDB -> EURO SIGN + u'\xd0' # 0xDC -> LATIN CAPITAL LETTER ETH + u'\xf0' # 0xDD -> LATIN SMALL LETTER ETH + u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + u'\xfe' # 0xDF -> LATIN SMALL LETTER THORN + u'\xfd' # 0xE0 -> LATIN SMALL LETTER Y WITH ACUTE + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\uf8ff' # 0xF0 -> Apple logo + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u02d8' # 0xF9 -> BREVE + u'\u02d9' # 0xFA -> DOT ABOVE + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + u'\u02db' # 0xFE -> OGONEK + u'\u02c7' # 0xFF -> CARON ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0xCA, # NO-BREAK SPACE - 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A5: 0xB4, # YEN SIGN - 0x00A7: 0xA4, # SECTION SIGN - 0x00A8: 0xAC, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xC2, # NOT SIGN - 0x00AE: 0xA8, # REGISTERED SIGN - 0x00AF: 0xF8, # MACRON - 0x00B0: 0xA1, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B4: 0xAB, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xA6, # PILCROW SIGN - 0x00B7: 0xE1, # MIDDLE DOT - 0x00B8: 0xFC, # CEDILLA - 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BF: 0xC0, # INVERTED QUESTION MARK - 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xAE, # LATIN CAPITAL LETTER AE - 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xE6, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xE8, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D0: 0xDC, # LATIN CAPITAL LETTER ETH - 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D8: 0xAF, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DD: 0xA0, # LATIN CAPITAL LETTER Y WITH ACUTE - 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN - 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S - 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xBE, # LATIN SMALL LETTER AE - 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F0: 0xDD, # LATIN SMALL LETTER ETH - 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xD6, # DIVISION SIGN - 0x00F8: 0xBF, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FD: 0xE0, # LATIN SMALL LETTER Y WITH ACUTE - 0x00FE: 0xDF, # LATIN SMALL LETTER THORN - 0x00FF: 0xD8, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0131: 0xF5, # LATIN SMALL LETTER DOTLESS I - 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE - 0x0153: 0xCF, # LATIN SMALL LIGATURE OE - 0x0178: 0xD9, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK - 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02C7: 0xFF, # CARON - 0x02D8: 0xF9, # BREVE - 0x02D9: 0xFA, # DOT ABOVE - 0x02DA: 0xFB, # RING ABOVE - 0x02DB: 0xFE, # OGONEK - 0x02DC: 0xF7, # SMALL TILDE - 0x02DD: 0xFD, # DOUBLE ACUTE ACCENT - 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA - 0x03C0: 0xB9, # GREEK SMALL LETTER PI - 0x2013: 0xD0, # EN DASH - 0x2014: 0xD1, # EM DASH - 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK - 0x2022: 0xA5, # BULLET - 0x2026: 0xC9, # HORIZONTAL ELLIPSIS - 0x2030: 0xE4, # PER MILLE SIGN - 0x2044: 0xDA, # FRACTION SLASH - 0x20AC: 0xDB, # EURO SIGN - 0x2122: 0xAA, # TRADE MARK SIGN - 0x2202: 0xB6, # PARTIAL DIFFERENTIAL - 0x2206: 0xC6, # INCREMENT - 0x220F: 0xB8, # N-ARY PRODUCT - 0x2211: 0xB7, # N-ARY SUMMATION - 0x221A: 0xC3, # SQUARE ROOT - 0x221E: 0xB0, # INFINITY - 0x222B: 0xBA, # INTEGRAL - 0x2248: 0xC5, # ALMOST EQUAL TO - 0x2260: 0xAD, # NOT EQUAL TO - 0x2264: 0xB2, # LESS-THAN OR EQUAL TO - 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO - 0x25CA: 0xD7, # LOZENGE - 0xF8FF: 0xF0, # Apple logo + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0xCA, # NO-BREAK SPACE + 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A5: 0xB4, # YEN SIGN + 0x00A7: 0xA4, # SECTION SIGN + 0x00A8: 0xAC, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xC2, # NOT SIGN + 0x00AE: 0xA8, # REGISTERED SIGN + 0x00AF: 0xF8, # MACRON + 0x00B0: 0xA1, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B4: 0xAB, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xA6, # PILCROW SIGN + 0x00B7: 0xE1, # MIDDLE DOT + 0x00B8: 0xFC, # CEDILLA + 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BF: 0xC0, # INVERTED QUESTION MARK + 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xAE, # LATIN CAPITAL LETTER AE + 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xE6, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xE8, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0: 0xDC, # LATIN CAPITAL LETTER ETH + 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D8: 0xAF, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD: 0xA0, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE: 0xDE, # LATIN CAPITAL LETTER THORN + 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S + 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xBE, # LATIN SMALL LETTER AE + 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0: 0xDD, # LATIN SMALL LETTER ETH + 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xD6, # DIVISION SIGN + 0x00F8: 0xBF, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD: 0xE0, # LATIN SMALL LETTER Y WITH ACUTE + 0x00FE: 0xDF, # LATIN SMALL LETTER THORN + 0x00FF: 0xD8, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0131: 0xF5, # LATIN SMALL LETTER DOTLESS I + 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE + 0x0153: 0xCF, # LATIN SMALL LIGATURE OE + 0x0178: 0xD9, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK + 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02C7: 0xFF, # CARON + 0x02D8: 0xF9, # BREVE + 0x02D9: 0xFA, # DOT ABOVE + 0x02DA: 0xFB, # RING ABOVE + 0x02DB: 0xFE, # OGONEK + 0x02DC: 0xF7, # SMALL TILDE + 0x02DD: 0xFD, # DOUBLE ACUTE ACCENT + 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA + 0x03C0: 0xB9, # GREEK SMALL LETTER PI + 0x2013: 0xD0, # EN DASH + 0x2014: 0xD1, # EM DASH + 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK + 0x2022: 0xA5, # BULLET + 0x2026: 0xC9, # HORIZONTAL ELLIPSIS + 0x2030: 0xE4, # PER MILLE SIGN + 0x2044: 0xDA, # FRACTION SLASH + 0x20AC: 0xDB, # EURO SIGN + 0x2122: 0xAA, # TRADE MARK SIGN + 0x2202: 0xB6, # PARTIAL DIFFERENTIAL + 0x2206: 0xC6, # INCREMENT + 0x220F: 0xB8, # N-ARY PRODUCT + 0x2211: 0xB7, # N-ARY SUMMATION + 0x221A: 0xC3, # SQUARE ROOT + 0x221E: 0xB0, # INFINITY + 0x222B: 0xBA, # INTEGRAL + 0x2248: 0xC5, # ALMOST EQUAL TO + 0x2260: 0xAD, # NOT EQUAL TO + 0x2264: 0xB2, # LESS-THAN OR EQUAL TO + 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO + 0x25CA: 0xD7, # LOZENGE + 0xF8FF: 0xF0, # Apple logo } - Modified: python/trunk/Lib/encodings/mac_roman.py ============================================================================== --- python/trunk/Lib/encodings/mac_roman.py (original) +++ python/trunk/Lib/encodings/mac_roman.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE - u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\xe6' # 0xBE -> LATIN SMALL LETTER AE - u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u2044' # 0xDA -> FRACTION SLASH - u'\u20ac' # 0xDB -> EURO SIGN - u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\ufb01' # 0xDE -> LATIN SMALL LIGATURE FI - u'\ufb02' # 0xDF -> LATIN SMALL LIGATURE FL - u'\u2021' # 0xE0 -> DOUBLE DAGGER - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\uf8ff' # 0xF0 -> Apple logo - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u02d8' # 0xF9 -> BREVE - u'\u02d9' # 0xFA -> DOT ABOVE - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT - u'\u02db' # 0xFE -> OGONEK - u'\u02c7' # 0xFF -> CARON + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\xe6' # 0xBE -> LATIN SMALL LETTER AE + u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u2044' # 0xDA -> FRACTION SLASH + u'\u20ac' # 0xDB -> EURO SIGN + u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\ufb01' # 0xDE -> LATIN SMALL LIGATURE FI + u'\ufb02' # 0xDF -> LATIN SMALL LIGATURE FL + u'\u2021' # 0xE0 -> DOUBLE DAGGER + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\uf8ff' # 0xF0 -> Apple logo + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u02d8' # 0xF9 -> BREVE + u'\u02d9' # 0xFA -> DOT ABOVE + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + u'\u02db' # 0xFE -> OGONEK + u'\u02c7' # 0xFF -> CARON ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0xCA, # NO-BREAK SPACE - 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A5: 0xB4, # YEN SIGN - 0x00A7: 0xA4, # SECTION SIGN - 0x00A8: 0xAC, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xC2, # NOT SIGN - 0x00AE: 0xA8, # REGISTERED SIGN - 0x00AF: 0xF8, # MACRON - 0x00B0: 0xA1, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B4: 0xAB, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xA6, # PILCROW SIGN - 0x00B7: 0xE1, # MIDDLE DOT - 0x00B8: 0xFC, # CEDILLA - 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BF: 0xC0, # INVERTED QUESTION MARK - 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xAE, # LATIN CAPITAL LETTER AE - 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xE6, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xE8, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D8: 0xAF, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S - 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xBE, # LATIN SMALL LETTER AE - 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xD6, # DIVISION SIGN - 0x00F8: 0xBF, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FF: 0xD8, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0131: 0xF5, # LATIN SMALL LETTER DOTLESS I - 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE - 0x0153: 0xCF, # LATIN SMALL LIGATURE OE - 0x0178: 0xD9, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK - 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02C7: 0xFF, # CARON - 0x02D8: 0xF9, # BREVE - 0x02D9: 0xFA, # DOT ABOVE - 0x02DA: 0xFB, # RING ABOVE - 0x02DB: 0xFE, # OGONEK - 0x02DC: 0xF7, # SMALL TILDE - 0x02DD: 0xFD, # DOUBLE ACUTE ACCENT - 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA - 0x03C0: 0xB9, # GREEK SMALL LETTER PI - 0x2013: 0xD0, # EN DASH - 0x2014: 0xD1, # EM DASH - 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0xA0, # DAGGER - 0x2021: 0xE0, # DOUBLE DAGGER - 0x2022: 0xA5, # BULLET - 0x2026: 0xC9, # HORIZONTAL ELLIPSIS - 0x2030: 0xE4, # PER MILLE SIGN - 0x2039: 0xDC, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0xDD, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x2044: 0xDA, # FRACTION SLASH - 0x20AC: 0xDB, # EURO SIGN - 0x2122: 0xAA, # TRADE MARK SIGN - 0x2202: 0xB6, # PARTIAL DIFFERENTIAL - 0x2206: 0xC6, # INCREMENT - 0x220F: 0xB8, # N-ARY PRODUCT - 0x2211: 0xB7, # N-ARY SUMMATION - 0x221A: 0xC3, # SQUARE ROOT - 0x221E: 0xB0, # INFINITY - 0x222B: 0xBA, # INTEGRAL - 0x2248: 0xC5, # ALMOST EQUAL TO - 0x2260: 0xAD, # NOT EQUAL TO - 0x2264: 0xB2, # LESS-THAN OR EQUAL TO - 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO - 0x25CA: 0xD7, # LOZENGE - 0xF8FF: 0xF0, # Apple logo - 0xFB01: 0xDE, # LATIN SMALL LIGATURE FI - 0xFB02: 0xDF, # LATIN SMALL LIGATURE FL + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0xCA, # NO-BREAK SPACE + 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A5: 0xB4, # YEN SIGN + 0x00A7: 0xA4, # SECTION SIGN + 0x00A8: 0xAC, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xC2, # NOT SIGN + 0x00AE: 0xA8, # REGISTERED SIGN + 0x00AF: 0xF8, # MACRON + 0x00B0: 0xA1, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B4: 0xAB, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xA6, # PILCROW SIGN + 0x00B7: 0xE1, # MIDDLE DOT + 0x00B8: 0xFC, # CEDILLA + 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BF: 0xC0, # INVERTED QUESTION MARK + 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xAE, # LATIN CAPITAL LETTER AE + 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xE6, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xE8, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D8: 0xAF, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S + 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xBE, # LATIN SMALL LETTER AE + 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xD6, # DIVISION SIGN + 0x00F8: 0xBF, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FF: 0xD8, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0131: 0xF5, # LATIN SMALL LETTER DOTLESS I + 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE + 0x0153: 0xCF, # LATIN SMALL LIGATURE OE + 0x0178: 0xD9, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK + 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02C7: 0xFF, # CARON + 0x02D8: 0xF9, # BREVE + 0x02D9: 0xFA, # DOT ABOVE + 0x02DA: 0xFB, # RING ABOVE + 0x02DB: 0xFE, # OGONEK + 0x02DC: 0xF7, # SMALL TILDE + 0x02DD: 0xFD, # DOUBLE ACUTE ACCENT + 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA + 0x03C0: 0xB9, # GREEK SMALL LETTER PI + 0x2013: 0xD0, # EN DASH + 0x2014: 0xD1, # EM DASH + 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0xA0, # DAGGER + 0x2021: 0xE0, # DOUBLE DAGGER + 0x2022: 0xA5, # BULLET + 0x2026: 0xC9, # HORIZONTAL ELLIPSIS + 0x2030: 0xE4, # PER MILLE SIGN + 0x2039: 0xDC, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0xDD, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x2044: 0xDA, # FRACTION SLASH + 0x20AC: 0xDB, # EURO SIGN + 0x2122: 0xAA, # TRADE MARK SIGN + 0x2202: 0xB6, # PARTIAL DIFFERENTIAL + 0x2206: 0xC6, # INCREMENT + 0x220F: 0xB8, # N-ARY PRODUCT + 0x2211: 0xB7, # N-ARY SUMMATION + 0x221A: 0xC3, # SQUARE ROOT + 0x221E: 0xB0, # INFINITY + 0x222B: 0xBA, # INTEGRAL + 0x2248: 0xC5, # ALMOST EQUAL TO + 0x2260: 0xAD, # NOT EQUAL TO + 0x2264: 0xB2, # LESS-THAN OR EQUAL TO + 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO + 0x25CA: 0xD7, # LOZENGE + 0xF8FF: 0xF0, # Apple logo + 0xFB01: 0xDE, # LATIN SMALL LIGATURE FI + 0xFB02: 0xDF, # LATIN SMALL LIGATURE FL } - Modified: python/trunk/Lib/encodings/mac_romanian.py ============================================================================== --- python/trunk/Lib/encodings/mac_romanian.py (original) +++ python/trunk/Lib/encodings/mac_romanian.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\u0102' # 0xAE -> LATIN CAPITAL LETTER A WITH BREVE - u'\u0218' # 0xAF -> LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\u0103' # 0xBE -> LATIN SMALL LETTER A WITH BREVE - u'\u0219' # 0xBF -> LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u2044' # 0xDA -> FRACTION SLASH - u'\u20ac' # 0xDB -> EURO SIGN - u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later - u'\u021b' # 0xDF -> LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later - u'\u2021' # 0xE0 -> DOUBLE DAGGER - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\uf8ff' # 0xF0 -> Apple logo - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u02d8' # 0xF9 -> BREVE - u'\u02d9' # 0xFA -> DOT ABOVE - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT - u'\u02db' # 0xFE -> OGONEK - u'\u02c7' # 0xFF -> CARON + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\u0102' # 0xAE -> LATIN CAPITAL LETTER A WITH BREVE + u'\u0218' # 0xAF -> LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\u0103' # 0xBE -> LATIN SMALL LETTER A WITH BREVE + u'\u0219' # 0xBF -> LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u2044' # 0xDA -> FRACTION SLASH + u'\u20ac' # 0xDB -> EURO SIGN + u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + u'\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + u'\u021b' # 0xDF -> LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + u'\u2021' # 0xE0 -> DOUBLE DAGGER + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\uf8ff' # 0xF0 -> Apple logo + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u02d8' # 0xF9 -> BREVE + u'\u02d9' # 0xFA -> DOT ABOVE + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + u'\u02db' # 0xFE -> OGONEK + u'\u02c7' # 0xFF -> CARON ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0xCA, # NO-BREAK SPACE - 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A5: 0xB4, # YEN SIGN - 0x00A7: 0xA4, # SECTION SIGN - 0x00A8: 0xAC, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xC2, # NOT SIGN - 0x00AE: 0xA8, # REGISTERED SIGN - 0x00AF: 0xF8, # MACRON - 0x00B0: 0xA1, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B4: 0xAB, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xA6, # PILCROW SIGN - 0x00B7: 0xE1, # MIDDLE DOT - 0x00B8: 0xFC, # CEDILLA - 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BF: 0xC0, # INVERTED QUESTION MARK - 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xE6, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xE8, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S - 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xD6, # DIVISION SIGN - 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FF: 0xD8, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x0102: 0xAE, # LATIN CAPITAL LETTER A WITH BREVE - 0x0103: 0xBE, # LATIN SMALL LETTER A WITH BREVE - 0x0131: 0xF5, # LATIN SMALL LETTER DOTLESS I - 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE - 0x0153: 0xCF, # LATIN SMALL LIGATURE OE - 0x0178: 0xD9, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK - 0x0218: 0xAF, # LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later - 0x0219: 0xBF, # LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later - 0x021A: 0xDE, # LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later - 0x021B: 0xDF, # LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later - 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02C7: 0xFF, # CARON - 0x02D8: 0xF9, # BREVE - 0x02D9: 0xFA, # DOT ABOVE - 0x02DA: 0xFB, # RING ABOVE - 0x02DB: 0xFE, # OGONEK - 0x02DC: 0xF7, # SMALL TILDE - 0x02DD: 0xFD, # DOUBLE ACUTE ACCENT - 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA - 0x03C0: 0xB9, # GREEK SMALL LETTER PI - 0x2013: 0xD0, # EN DASH - 0x2014: 0xD1, # EM DASH - 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0xA0, # DAGGER - 0x2021: 0xE0, # DOUBLE DAGGER - 0x2022: 0xA5, # BULLET - 0x2026: 0xC9, # HORIZONTAL ELLIPSIS - 0x2030: 0xE4, # PER MILLE SIGN - 0x2039: 0xDC, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x203A: 0xDD, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x2044: 0xDA, # FRACTION SLASH - 0x20AC: 0xDB, # EURO SIGN - 0x2122: 0xAA, # TRADE MARK SIGN - 0x2202: 0xB6, # PARTIAL DIFFERENTIAL - 0x2206: 0xC6, # INCREMENT - 0x220F: 0xB8, # N-ARY PRODUCT - 0x2211: 0xB7, # N-ARY SUMMATION - 0x221A: 0xC3, # SQUARE ROOT - 0x221E: 0xB0, # INFINITY - 0x222B: 0xBA, # INTEGRAL - 0x2248: 0xC5, # ALMOST EQUAL TO - 0x2260: 0xAD, # NOT EQUAL TO - 0x2264: 0xB2, # LESS-THAN OR EQUAL TO - 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO - 0x25CA: 0xD7, # LOZENGE - 0xF8FF: 0xF0, # Apple logo + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0xCA, # NO-BREAK SPACE + 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A5: 0xB4, # YEN SIGN + 0x00A7: 0xA4, # SECTION SIGN + 0x00A8: 0xAC, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xC2, # NOT SIGN + 0x00AE: 0xA8, # REGISTERED SIGN + 0x00AF: 0xF8, # MACRON + 0x00B0: 0xA1, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B4: 0xAB, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xA6, # PILCROW SIGN + 0x00B7: 0xE1, # MIDDLE DOT + 0x00B8: 0xFC, # CEDILLA + 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BF: 0xC0, # INVERTED QUESTION MARK + 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xE6, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xE8, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S + 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xD6, # DIVISION SIGN + 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FF: 0xD8, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0102: 0xAE, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0xBE, # LATIN SMALL LETTER A WITH BREVE + 0x0131: 0xF5, # LATIN SMALL LETTER DOTLESS I + 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE + 0x0153: 0xCF, # LATIN SMALL LIGATURE OE + 0x0178: 0xD9, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK + 0x0218: 0xAF, # LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + 0x0219: 0xBF, # LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + 0x021A: 0xDE, # LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + 0x021B: 0xDF, # LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02C7: 0xFF, # CARON + 0x02D8: 0xF9, # BREVE + 0x02D9: 0xFA, # DOT ABOVE + 0x02DA: 0xFB, # RING ABOVE + 0x02DB: 0xFE, # OGONEK + 0x02DC: 0xF7, # SMALL TILDE + 0x02DD: 0xFD, # DOUBLE ACUTE ACCENT + 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA + 0x03C0: 0xB9, # GREEK SMALL LETTER PI + 0x2013: 0xD0, # EN DASH + 0x2014: 0xD1, # EM DASH + 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0xA0, # DAGGER + 0x2021: 0xE0, # DOUBLE DAGGER + 0x2022: 0xA5, # BULLET + 0x2026: 0xC9, # HORIZONTAL ELLIPSIS + 0x2030: 0xE4, # PER MILLE SIGN + 0x2039: 0xDC, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x203A: 0xDD, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x2044: 0xDA, # FRACTION SLASH + 0x20AC: 0xDB, # EURO SIGN + 0x2122: 0xAA, # TRADE MARK SIGN + 0x2202: 0xB6, # PARTIAL DIFFERENTIAL + 0x2206: 0xC6, # INCREMENT + 0x220F: 0xB8, # N-ARY PRODUCT + 0x2211: 0xB7, # N-ARY SUMMATION + 0x221A: 0xC3, # SQUARE ROOT + 0x221E: 0xB0, # INFINITY + 0x222B: 0xBA, # INTEGRAL + 0x2248: 0xC5, # ALMOST EQUAL TO + 0x2260: 0xAD, # NOT EQUAL TO + 0x2264: 0xB2, # LESS-THAN OR EQUAL TO + 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO + 0x25CA: 0xD7, # LOZENGE + 0xF8FF: 0xF0, # Apple logo } - Modified: python/trunk/Lib/encodings/mac_turkish.py ============================================================================== --- python/trunk/Lib/encodings/mac_turkish.py (original) +++ python/trunk/Lib/encodings/mac_turkish.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,522 +32,521 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE - u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\xe6' # 0xBE -> LATIN SMALL LETTER AE - u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u011e' # 0xDA -> LATIN CAPITAL LETTER G WITH BREVE - u'\u011f' # 0xDB -> LATIN SMALL LETTER G WITH BREVE - u'\u0130' # 0xDC -> LATIN CAPITAL LETTER I WITH DOT ABOVE - u'\u0131' # 0xDD -> LATIN SMALL LETTER DOTLESS I - u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\u015f' # 0xDF -> LATIN SMALL LETTER S WITH CEDILLA - u'\u2021' # 0xE0 -> DOUBLE DAGGER - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\uf8ff' # 0xF0 -> Apple logo - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\uf8a0' # 0xF5 -> undefined1 - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u02d8' # 0xF9 -> BREVE - u'\u02d9' # 0xFA -> DOT ABOVE - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT - u'\u02db' # 0xFE -> OGONEK - u'\u02c7' # 0xFF -> CARON + u'\x00' # 0x00 -> CONTROL CHARACTER + u'\x01' # 0x01 -> CONTROL CHARACTER + u'\x02' # 0x02 -> CONTROL CHARACTER + u'\x03' # 0x03 -> CONTROL CHARACTER + u'\x04' # 0x04 -> CONTROL CHARACTER + u'\x05' # 0x05 -> CONTROL CHARACTER + u'\x06' # 0x06 -> CONTROL CHARACTER + u'\x07' # 0x07 -> CONTROL CHARACTER + u'\x08' # 0x08 -> CONTROL CHARACTER + u'\t' # 0x09 -> CONTROL CHARACTER + u'\n' # 0x0A -> CONTROL CHARACTER + u'\x0b' # 0x0B -> CONTROL CHARACTER + u'\x0c' # 0x0C -> CONTROL CHARACTER + u'\r' # 0x0D -> CONTROL CHARACTER + u'\x0e' # 0x0E -> CONTROL CHARACTER + u'\x0f' # 0x0F -> CONTROL CHARACTER + u'\x10' # 0x10 -> CONTROL CHARACTER + u'\x11' # 0x11 -> CONTROL CHARACTER + u'\x12' # 0x12 -> CONTROL CHARACTER + u'\x13' # 0x13 -> CONTROL CHARACTER + u'\x14' # 0x14 -> CONTROL CHARACTER + u'\x15' # 0x15 -> CONTROL CHARACTER + u'\x16' # 0x16 -> CONTROL CHARACTER + u'\x17' # 0x17 -> CONTROL CHARACTER + u'\x18' # 0x18 -> CONTROL CHARACTER + u'\x19' # 0x19 -> CONTROL CHARACTER + u'\x1a' # 0x1A -> CONTROL CHARACTER + u'\x1b' # 0x1B -> CONTROL CHARACTER + u'\x1c' # 0x1C -> CONTROL CHARACTER + u'\x1d' # 0x1D -> CONTROL CHARACTER + u'\x1e' # 0x1E -> CONTROL CHARACTER + u'\x1f' # 0x1F -> CONTROL CHARACTER + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> CONTROL CHARACTER + u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + u'\u2020' # 0xA0 -> DAGGER + u'\xb0' # 0xA1 -> DEGREE SIGN + u'\xa2' # 0xA2 -> CENT SIGN + u'\xa3' # 0xA3 -> POUND SIGN + u'\xa7' # 0xA4 -> SECTION SIGN + u'\u2022' # 0xA5 -> BULLET + u'\xb6' # 0xA6 -> PILCROW SIGN + u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + u'\xae' # 0xA8 -> REGISTERED SIGN + u'\xa9' # 0xA9 -> COPYRIGHT SIGN + u'\u2122' # 0xAA -> TRADE MARK SIGN + u'\xb4' # 0xAB -> ACUTE ACCENT + u'\xa8' # 0xAC -> DIAERESIS + u'\u2260' # 0xAD -> NOT EQUAL TO + u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + u'\u221e' # 0xB0 -> INFINITY + u'\xb1' # 0xB1 -> PLUS-MINUS SIGN + u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + u'\xa5' # 0xB4 -> YEN SIGN + u'\xb5' # 0xB5 -> MICRO SIGN + u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + u'\u2211' # 0xB7 -> N-ARY SUMMATION + u'\u220f' # 0xB8 -> N-ARY PRODUCT + u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + u'\u222b' # 0xBA -> INTEGRAL + u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + u'\xe6' # 0xBE -> LATIN SMALL LETTER AE + u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + u'\xbf' # 0xC0 -> INVERTED QUESTION MARK + u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + u'\xac' # 0xC2 -> NOT SIGN + u'\u221a' # 0xC3 -> SQUARE ROOT + u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + u'\u2248' # 0xC5 -> ALMOST EQUAL TO + u'\u2206' # 0xC6 -> INCREMENT + u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + u'\xa0' # 0xCA -> NO-BREAK SPACE + u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + u'\u2013' # 0xD0 -> EN DASH + u'\u2014' # 0xD1 -> EM DASH + u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + u'\xf7' # 0xD6 -> DIVISION SIGN + u'\u25ca' # 0xD7 -> LOZENGE + u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + u'\u011e' # 0xDA -> LATIN CAPITAL LETTER G WITH BREVE + u'\u011f' # 0xDB -> LATIN SMALL LETTER G WITH BREVE + u'\u0130' # 0xDC -> LATIN CAPITAL LETTER I WITH DOT ABOVE + u'\u0131' # 0xDD -> LATIN SMALL LETTER DOTLESS I + u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + u'\u015f' # 0xDF -> LATIN SMALL LETTER S WITH CEDILLA + u'\u2021' # 0xE0 -> DOUBLE DAGGER + u'\xb7' # 0xE1 -> MIDDLE DOT + u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + u'\u2030' # 0xE4 -> PER MILLE SIGN + u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + u'\uf8ff' # 0xF0 -> Apple logo + u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + u'\uf8a0' # 0xF5 -> undefined1 + u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + u'\u02dc' # 0xF7 -> SMALL TILDE + u'\xaf' # 0xF8 -> MACRON + u'\u02d8' # 0xF9 -> BREVE + u'\u02d9' # 0xFA -> DOT ABOVE + u'\u02da' # 0xFB -> RING ABOVE + u'\xb8' # 0xFC -> CEDILLA + u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + u'\u02db' # 0xFE -> OGONEK + u'\u02c7' # 0xFF -> CARON ) ### Encoding Map encoding_map = { - 0x0000: 0x00, # CONTROL CHARACTER - 0x0001: 0x01, # CONTROL CHARACTER - 0x0002: 0x02, # CONTROL CHARACTER - 0x0003: 0x03, # CONTROL CHARACTER - 0x0004: 0x04, # CONTROL CHARACTER - 0x0005: 0x05, # CONTROL CHARACTER - 0x0006: 0x06, # CONTROL CHARACTER - 0x0007: 0x07, # CONTROL CHARACTER - 0x0008: 0x08, # CONTROL CHARACTER - 0x0009: 0x09, # CONTROL CHARACTER - 0x000A: 0x0A, # CONTROL CHARACTER - 0x000B: 0x0B, # CONTROL CHARACTER - 0x000C: 0x0C, # CONTROL CHARACTER - 0x000D: 0x0D, # CONTROL CHARACTER - 0x000E: 0x0E, # CONTROL CHARACTER - 0x000F: 0x0F, # CONTROL CHARACTER - 0x0010: 0x10, # CONTROL CHARACTER - 0x0011: 0x11, # CONTROL CHARACTER - 0x0012: 0x12, # CONTROL CHARACTER - 0x0013: 0x13, # CONTROL CHARACTER - 0x0014: 0x14, # CONTROL CHARACTER - 0x0015: 0x15, # CONTROL CHARACTER - 0x0016: 0x16, # CONTROL CHARACTER - 0x0017: 0x17, # CONTROL CHARACTER - 0x0018: 0x18, # CONTROL CHARACTER - 0x0019: 0x19, # CONTROL CHARACTER - 0x001A: 0x1A, # CONTROL CHARACTER - 0x001B: 0x1B, # CONTROL CHARACTER - 0x001C: 0x1C, # CONTROL CHARACTER - 0x001D: 0x1D, # CONTROL CHARACTER - 0x001E: 0x1E, # CONTROL CHARACTER - 0x001F: 0x1F, # CONTROL CHARACTER - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # CONTROL CHARACTER - 0x00A0: 0xCA, # NO-BREAK SPACE - 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK - 0x00A2: 0xA2, # CENT SIGN - 0x00A3: 0xA3, # POUND SIGN - 0x00A5: 0xB4, # YEN SIGN - 0x00A7: 0xA4, # SECTION SIGN - 0x00A8: 0xAC, # DIAERESIS - 0x00A9: 0xA9, # COPYRIGHT SIGN - 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR - 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00AC: 0xC2, # NOT SIGN - 0x00AE: 0xA8, # REGISTERED SIGN - 0x00AF: 0xF8, # MACRON - 0x00B0: 0xA1, # DEGREE SIGN - 0x00B1: 0xB1, # PLUS-MINUS SIGN - 0x00B4: 0xAB, # ACUTE ACCENT - 0x00B5: 0xB5, # MICRO SIGN - 0x00B6: 0xA6, # PILCROW SIGN - 0x00B7: 0xE1, # MIDDLE DOT - 0x00B8: 0xFC, # CEDILLA - 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR - 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00BF: 0xC0, # INVERTED QUESTION MARK - 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE - 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x00C6: 0xAE, # LATIN CAPITAL LETTER AE - 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00CA: 0xE6, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00CB: 0xE8, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE - 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE - 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00D8: 0xAF, # LATIN CAPITAL LETTER O WITH STROKE - 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S - 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE - 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE - 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE - 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE - 0x00E6: 0xBE, # LATIN SMALL LETTER AE - 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA - 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE - 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE - 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE - 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE - 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE - 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE - 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE - 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE - 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00F7: 0xD6, # DIVISION SIGN - 0x00F8: 0xBF, # LATIN SMALL LETTER O WITH STROKE - 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE - 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE - 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00FF: 0xD8, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x011E: 0xDA, # LATIN CAPITAL LETTER G WITH BREVE - 0x011F: 0xDB, # LATIN SMALL LETTER G WITH BREVE - 0x0130: 0xDC, # LATIN CAPITAL LETTER I WITH DOT ABOVE - 0x0131: 0xDD, # LATIN SMALL LETTER DOTLESS I - 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE - 0x0153: 0xCF, # LATIN SMALL LIGATURE OE - 0x015E: 0xDE, # LATIN CAPITAL LETTER S WITH CEDILLA - 0x015F: 0xDF, # LATIN SMALL LETTER S WITH CEDILLA - 0x0178: 0xD9, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK - 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x02C7: 0xFF, # CARON - 0x02D8: 0xF9, # BREVE - 0x02D9: 0xFA, # DOT ABOVE - 0x02DA: 0xFB, # RING ABOVE - 0x02DB: 0xFE, # OGONEK - 0x02DC: 0xF7, # SMALL TILDE - 0x02DD: 0xFD, # DOUBLE ACUTE ACCENT - 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA - 0x03C0: 0xB9, # GREEK SMALL LETTER PI - 0x2013: 0xD0, # EN DASH - 0x2014: 0xD1, # EM DASH - 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK - 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK - 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK - 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK - 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK - 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK - 0x2020: 0xA0, # DAGGER - 0x2021: 0xE0, # DOUBLE DAGGER - 0x2022: 0xA5, # BULLET - 0x2026: 0xC9, # HORIZONTAL ELLIPSIS - 0x2030: 0xE4, # PER MILLE SIGN - 0x2122: 0xAA, # TRADE MARK SIGN - 0x2202: 0xB6, # PARTIAL DIFFERENTIAL - 0x2206: 0xC6, # INCREMENT - 0x220F: 0xB8, # N-ARY PRODUCT - 0x2211: 0xB7, # N-ARY SUMMATION - 0x221A: 0xC3, # SQUARE ROOT - 0x221E: 0xB0, # INFINITY - 0x222B: 0xBA, # INTEGRAL - 0x2248: 0xC5, # ALMOST EQUAL TO - 0x2260: 0xAD, # NOT EQUAL TO - 0x2264: 0xB2, # LESS-THAN OR EQUAL TO - 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO - 0x25CA: 0xD7, # LOZENGE - 0xF8A0: 0xF5, # undefined1 - 0xF8FF: 0xF0, # Apple logo + 0x0000: 0x00, # CONTROL CHARACTER + 0x0001: 0x01, # CONTROL CHARACTER + 0x0002: 0x02, # CONTROL CHARACTER + 0x0003: 0x03, # CONTROL CHARACTER + 0x0004: 0x04, # CONTROL CHARACTER + 0x0005: 0x05, # CONTROL CHARACTER + 0x0006: 0x06, # CONTROL CHARACTER + 0x0007: 0x07, # CONTROL CHARACTER + 0x0008: 0x08, # CONTROL CHARACTER + 0x0009: 0x09, # CONTROL CHARACTER + 0x000A: 0x0A, # CONTROL CHARACTER + 0x000B: 0x0B, # CONTROL CHARACTER + 0x000C: 0x0C, # CONTROL CHARACTER + 0x000D: 0x0D, # CONTROL CHARACTER + 0x000E: 0x0E, # CONTROL CHARACTER + 0x000F: 0x0F, # CONTROL CHARACTER + 0x0010: 0x10, # CONTROL CHARACTER + 0x0011: 0x11, # CONTROL CHARACTER + 0x0012: 0x12, # CONTROL CHARACTER + 0x0013: 0x13, # CONTROL CHARACTER + 0x0014: 0x14, # CONTROL CHARACTER + 0x0015: 0x15, # CONTROL CHARACTER + 0x0016: 0x16, # CONTROL CHARACTER + 0x0017: 0x17, # CONTROL CHARACTER + 0x0018: 0x18, # CONTROL CHARACTER + 0x0019: 0x19, # CONTROL CHARACTER + 0x001A: 0x1A, # CONTROL CHARACTER + 0x001B: 0x1B, # CONTROL CHARACTER + 0x001C: 0x1C, # CONTROL CHARACTER + 0x001D: 0x1D, # CONTROL CHARACTER + 0x001E: 0x1E, # CONTROL CHARACTER + 0x001F: 0x1F, # CONTROL CHARACTER + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # CONTROL CHARACTER + 0x00A0: 0xCA, # NO-BREAK SPACE + 0x00A1: 0xC1, # INVERTED EXCLAMATION MARK + 0x00A2: 0xA2, # CENT SIGN + 0x00A3: 0xA3, # POUND SIGN + 0x00A5: 0xB4, # YEN SIGN + 0x00A7: 0xA4, # SECTION SIGN + 0x00A8: 0xAC, # DIAERESIS + 0x00A9: 0xA9, # COPYRIGHT SIGN + 0x00AA: 0xBB, # FEMININE ORDINAL INDICATOR + 0x00AB: 0xC7, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC: 0xC2, # NOT SIGN + 0x00AE: 0xA8, # REGISTERED SIGN + 0x00AF: 0xF8, # MACRON + 0x00B0: 0xA1, # DEGREE SIGN + 0x00B1: 0xB1, # PLUS-MINUS SIGN + 0x00B4: 0xAB, # ACUTE ACCENT + 0x00B5: 0xB5, # MICRO SIGN + 0x00B6: 0xA6, # PILCROW SIGN + 0x00B7: 0xE1, # MIDDLE DOT + 0x00B8: 0xFC, # CEDILLA + 0x00BA: 0xBC, # MASCULINE ORDINAL INDICATOR + 0x00BB: 0xC8, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BF: 0xC0, # INVERTED QUESTION MARK + 0x00C0: 0xCB, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1: 0xE7, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2: 0xE5, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3: 0xCC, # LATIN CAPITAL LETTER A WITH TILDE + 0x00C4: 0x80, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5: 0x81, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6: 0xAE, # LATIN CAPITAL LETTER AE + 0x00C7: 0x82, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8: 0xE9, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9: 0x83, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA: 0xE6, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB: 0xE8, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC: 0xED, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD: 0xEA, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE: 0xEB, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF: 0xEC, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D1: 0x84, # LATIN CAPITAL LETTER N WITH TILDE + 0x00D2: 0xF1, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3: 0xEE, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4: 0xEF, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5: 0xCD, # LATIN CAPITAL LETTER O WITH TILDE + 0x00D6: 0x85, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D8: 0xAF, # LATIN CAPITAL LETTER O WITH STROKE + 0x00D9: 0xF4, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA: 0xF2, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB: 0xF3, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC: 0x86, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DF: 0xA7, # LATIN SMALL LETTER SHARP S + 0x00E0: 0x88, # LATIN SMALL LETTER A WITH GRAVE + 0x00E1: 0x87, # LATIN SMALL LETTER A WITH ACUTE + 0x00E2: 0x89, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3: 0x8B, # LATIN SMALL LETTER A WITH TILDE + 0x00E4: 0x8A, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5: 0x8C, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6: 0xBE, # LATIN SMALL LETTER AE + 0x00E7: 0x8D, # LATIN SMALL LETTER C WITH CEDILLA + 0x00E8: 0x8F, # LATIN SMALL LETTER E WITH GRAVE + 0x00E9: 0x8E, # LATIN SMALL LETTER E WITH ACUTE + 0x00EA: 0x90, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB: 0x91, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC: 0x93, # LATIN SMALL LETTER I WITH GRAVE + 0x00ED: 0x92, # LATIN SMALL LETTER I WITH ACUTE + 0x00EE: 0x94, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF: 0x95, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00F1: 0x96, # LATIN SMALL LETTER N WITH TILDE + 0x00F2: 0x98, # LATIN SMALL LETTER O WITH GRAVE + 0x00F3: 0x97, # LATIN SMALL LETTER O WITH ACUTE + 0x00F4: 0x99, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5: 0x9B, # LATIN SMALL LETTER O WITH TILDE + 0x00F6: 0x9A, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7: 0xD6, # DIVISION SIGN + 0x00F8: 0xBF, # LATIN SMALL LETTER O WITH STROKE + 0x00F9: 0x9D, # LATIN SMALL LETTER U WITH GRAVE + 0x00FA: 0x9C, # LATIN SMALL LETTER U WITH ACUTE + 0x00FB: 0x9E, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC: 0x9F, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00FF: 0xD8, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011E: 0xDA, # LATIN CAPITAL LETTER G WITH BREVE + 0x011F: 0xDB, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0xDC, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0xDD, # LATIN SMALL LETTER DOTLESS I + 0x0152: 0xCE, # LATIN CAPITAL LIGATURE OE + 0x0153: 0xCF, # LATIN SMALL LIGATURE OE + 0x015E: 0xDE, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015F: 0xDF, # LATIN SMALL LETTER S WITH CEDILLA + 0x0178: 0xD9, # LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x0192: 0xC4, # LATIN SMALL LETTER F WITH HOOK + 0x02C6: 0xF6, # MODIFIER LETTER CIRCUMFLEX ACCENT + 0x02C7: 0xFF, # CARON + 0x02D8: 0xF9, # BREVE + 0x02D9: 0xFA, # DOT ABOVE + 0x02DA: 0xFB, # RING ABOVE + 0x02DB: 0xFE, # OGONEK + 0x02DC: 0xF7, # SMALL TILDE + 0x02DD: 0xFD, # DOUBLE ACUTE ACCENT + 0x03A9: 0xBD, # GREEK CAPITAL LETTER OMEGA + 0x03C0: 0xB9, # GREEK SMALL LETTER PI + 0x2013: 0xD0, # EN DASH + 0x2014: 0xD1, # EM DASH + 0x2018: 0xD4, # LEFT SINGLE QUOTATION MARK + 0x2019: 0xD5, # RIGHT SINGLE QUOTATION MARK + 0x201A: 0xE2, # SINGLE LOW-9 QUOTATION MARK + 0x201C: 0xD2, # LEFT DOUBLE QUOTATION MARK + 0x201D: 0xD3, # RIGHT DOUBLE QUOTATION MARK + 0x201E: 0xE3, # DOUBLE LOW-9 QUOTATION MARK + 0x2020: 0xA0, # DAGGER + 0x2021: 0xE0, # DOUBLE DAGGER + 0x2022: 0xA5, # BULLET + 0x2026: 0xC9, # HORIZONTAL ELLIPSIS + 0x2030: 0xE4, # PER MILLE SIGN + 0x2122: 0xAA, # TRADE MARK SIGN + 0x2202: 0xB6, # PARTIAL DIFFERENTIAL + 0x2206: 0xC6, # INCREMENT + 0x220F: 0xB8, # N-ARY PRODUCT + 0x2211: 0xB7, # N-ARY SUMMATION + 0x221A: 0xC3, # SQUARE ROOT + 0x221E: 0xB0, # INFINITY + 0x222B: 0xBA, # INTEGRAL + 0x2248: 0xC5, # ALMOST EQUAL TO + 0x2260: 0xAD, # NOT EQUAL TO + 0x2264: 0xB2, # LESS-THAN OR EQUAL TO + 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO + 0x25CA: 0xD7, # LOZENGE + 0xF8A0: 0xF5, # undefined1 + 0xF8FF: 0xF0, # Apple logo } - Modified: python/trunk/Lib/encodings/tis_620.py ============================================================================== --- python/trunk/Lib/encodings/tis_620.py (original) +++ python/trunk/Lib/encodings/tis_620.py Mon Dec 26 00:18:31 2005 @@ -15,7 +15,7 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_table) - + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,258 +32,258 @@ ### Decoding Table decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> + u'\x00' # 0x00 -> NULL + u'\x01' # 0x01 -> START OF HEADING + u'\x02' # 0x02 -> START OF TEXT + u'\x03' # 0x03 -> END OF TEXT + u'\x04' # 0x04 -> END OF TRANSMISSION + u'\x05' # 0x05 -> ENQUIRY + u'\x06' # 0x06 -> ACKNOWLEDGE + u'\x07' # 0x07 -> BELL + u'\x08' # 0x08 -> BACKSPACE + u'\t' # 0x09 -> HORIZONTAL TABULATION + u'\n' # 0x0A -> LINE FEED + u'\x0b' # 0x0B -> VERTICAL TABULATION + u'\x0c' # 0x0C -> FORM FEED + u'\r' # 0x0D -> CARRIAGE RETURN + u'\x0e' # 0x0E -> SHIFT OUT + u'\x0f' # 0x0F -> SHIFT IN + u'\x10' # 0x10 -> DATA LINK ESCAPE + u'\x11' # 0x11 -> DEVICE CONTROL ONE + u'\x12' # 0x12 -> DEVICE CONTROL TWO + u'\x13' # 0x13 -> DEVICE CONTROL THREE + u'\x14' # 0x14 -> DEVICE CONTROL FOUR + u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + u'\x16' # 0x16 -> SYNCHRONOUS IDLE + u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK + u'\x18' # 0x18 -> CANCEL + u'\x19' # 0x19 -> END OF MEDIUM + u'\x1a' # 0x1A -> SUBSTITUTE + u'\x1b' # 0x1B -> ESCAPE + u'\x1c' # 0x1C -> FILE SEPARATOR + u'\x1d' # 0x1D -> GROUP SEPARATOR + u'\x1e' # 0x1E -> RECORD SEPARATOR + u'\x1f' # 0x1F -> UNIT SEPARATOR + u' ' # 0x20 -> SPACE + u'!' # 0x21 -> EXCLAMATION MARK + u'"' # 0x22 -> QUOTATION MARK + u'#' # 0x23 -> NUMBER SIGN + u'$' # 0x24 -> DOLLAR SIGN + u'%' # 0x25 -> PERCENT SIGN + u'&' # 0x26 -> AMPERSAND + u"'" # 0x27 -> APOSTROPHE + u'(' # 0x28 -> LEFT PARENTHESIS + u')' # 0x29 -> RIGHT PARENTHESIS + u'*' # 0x2A -> ASTERISK + u'+' # 0x2B -> PLUS SIGN + u',' # 0x2C -> COMMA + u'-' # 0x2D -> HYPHEN-MINUS + u'.' # 0x2E -> FULL STOP + u'/' # 0x2F -> SOLIDUS + u'0' # 0x30 -> DIGIT ZERO + u'1' # 0x31 -> DIGIT ONE + u'2' # 0x32 -> DIGIT TWO + u'3' # 0x33 -> DIGIT THREE + u'4' # 0x34 -> DIGIT FOUR + u'5' # 0x35 -> DIGIT FIVE + u'6' # 0x36 -> DIGIT SIX + u'7' # 0x37 -> DIGIT SEVEN + u'8' # 0x38 -> DIGIT EIGHT + u'9' # 0x39 -> DIGIT NINE + u':' # 0x3A -> COLON + u';' # 0x3B -> SEMICOLON + u'<' # 0x3C -> LESS-THAN SIGN + u'=' # 0x3D -> EQUALS SIGN + u'>' # 0x3E -> GREATER-THAN SIGN + u'?' # 0x3F -> QUESTION MARK + u'@' # 0x40 -> COMMERCIAL AT + u'A' # 0x41 -> LATIN CAPITAL LETTER A + u'B' # 0x42 -> LATIN CAPITAL LETTER B + u'C' # 0x43 -> LATIN CAPITAL LETTER C + u'D' # 0x44 -> LATIN CAPITAL LETTER D + u'E' # 0x45 -> LATIN CAPITAL LETTER E + u'F' # 0x46 -> LATIN CAPITAL LETTER F + u'G' # 0x47 -> LATIN CAPITAL LETTER G + u'H' # 0x48 -> LATIN CAPITAL LETTER H + u'I' # 0x49 -> LATIN CAPITAL LETTER I + u'J' # 0x4A -> LATIN CAPITAL LETTER J + u'K' # 0x4B -> LATIN CAPITAL LETTER K + u'L' # 0x4C -> LATIN CAPITAL LETTER L + u'M' # 0x4D -> LATIN CAPITAL LETTER M + u'N' # 0x4E -> LATIN CAPITAL LETTER N + u'O' # 0x4F -> LATIN CAPITAL LETTER O + u'P' # 0x50 -> LATIN CAPITAL LETTER P + u'Q' # 0x51 -> LATIN CAPITAL LETTER Q + u'R' # 0x52 -> LATIN CAPITAL LETTER R + u'S' # 0x53 -> LATIN CAPITAL LETTER S + u'T' # 0x54 -> LATIN CAPITAL LETTER T + u'U' # 0x55 -> LATIN CAPITAL LETTER U + u'V' # 0x56 -> LATIN CAPITAL LETTER V + u'W' # 0x57 -> LATIN CAPITAL LETTER W + u'X' # 0x58 -> LATIN CAPITAL LETTER X + u'Y' # 0x59 -> LATIN CAPITAL LETTER Y + u'Z' # 0x5A -> LATIN CAPITAL LETTER Z + u'[' # 0x5B -> LEFT SQUARE BRACKET + u'\\' # 0x5C -> REVERSE SOLIDUS + u']' # 0x5D -> RIGHT SQUARE BRACKET + u'^' # 0x5E -> CIRCUMFLEX ACCENT + u'_' # 0x5F -> LOW LINE + u'`' # 0x60 -> GRAVE ACCENT + u'a' # 0x61 -> LATIN SMALL LETTER A + u'b' # 0x62 -> LATIN SMALL LETTER B + u'c' # 0x63 -> LATIN SMALL LETTER C + u'd' # 0x64 -> LATIN SMALL LETTER D + u'e' # 0x65 -> LATIN SMALL LETTER E + u'f' # 0x66 -> LATIN SMALL LETTER F + u'g' # 0x67 -> LATIN SMALL LETTER G + u'h' # 0x68 -> LATIN SMALL LETTER H + u'i' # 0x69 -> LATIN SMALL LETTER I + u'j' # 0x6A -> LATIN SMALL LETTER J + u'k' # 0x6B -> LATIN SMALL LETTER K + u'l' # 0x6C -> LATIN SMALL LETTER L + u'm' # 0x6D -> LATIN SMALL LETTER M + u'n' # 0x6E -> LATIN SMALL LETTER N + u'o' # 0x6F -> LATIN SMALL LETTER O + u'p' # 0x70 -> LATIN SMALL LETTER P + u'q' # 0x71 -> LATIN SMALL LETTER Q + u'r' # 0x72 -> LATIN SMALL LETTER R + u's' # 0x73 -> LATIN SMALL LETTER S + u't' # 0x74 -> LATIN SMALL LETTER T + u'u' # 0x75 -> LATIN SMALL LETTER U + u'v' # 0x76 -> LATIN SMALL LETTER V + u'w' # 0x77 -> LATIN SMALL LETTER W + u'x' # 0x78 -> LATIN SMALL LETTER X + u'y' # 0x79 -> LATIN SMALL LETTER Y + u'z' # 0x7A -> LATIN SMALL LETTER Z + u'{' # 0x7B -> LEFT CURLY BRACKET + u'|' # 0x7C -> VERTICAL LINE + u'}' # 0x7D -> RIGHT CURLY BRACKET + u'~' # 0x7E -> TILDE + u'\x7f' # 0x7F -> DELETE + u'\x80' # 0x80 -> + u'\x81' # 0x81 -> + u'\x82' # 0x82 -> + u'\x83' # 0x83 -> + u'\x84' # 0x84 -> + u'\x85' # 0x85 -> + u'\x86' # 0x86 -> + u'\x87' # 0x87 -> + u'\x88' # 0x88 -> + u'\x89' # 0x89 -> + u'\x8a' # 0x8A -> + u'\x8b' # 0x8B -> + u'\x8c' # 0x8C -> + u'\x8d' # 0x8D -> + u'\x8e' # 0x8E -> + u'\x8f' # 0x8F -> + u'\x90' # 0x90 -> + u'\x91' # 0x91 -> + u'\x92' # 0x92 -> + u'\x93' # 0x93 -> + u'\x94' # 0x94 -> + u'\x95' # 0x95 -> + u'\x96' # 0x96 -> + u'\x97' # 0x97 -> + u'\x98' # 0x98 -> + u'\x99' # 0x99 -> + u'\x9a' # 0x9A -> + u'\x9b' # 0x9B -> + u'\x9c' # 0x9C -> + u'\x9d' # 0x9D -> + u'\x9e' # 0x9E -> + u'\x9f' # 0x9F -> u'\ufffe' - u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI - u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI - u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT - u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI - u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON - u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG - u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU - u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN - u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING - u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG - u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO - u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE - u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING - u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA - u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK - u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN - u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO - u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO - u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN - u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK - u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO - u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG - u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN - u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG - u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU - u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI - u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA - u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG - u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA - u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN - u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN - u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO - u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA - u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK - u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA - u'\u0e24' # 0xC4 -> THAI CHARACTER RU - u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING - u'\u0e26' # 0xC6 -> THAI CHARACTER LU - u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN - u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA - u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI - u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA - u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP - u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA - u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG - u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK - u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI - u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A - u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT - u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA - u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM - u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I - u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II - u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE - u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE - u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U - u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU - u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO + u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING + u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU + u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA + u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA + u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + u'\u0e24' # 0xC4 -> THAI CHARACTER RU + u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING + u'\u0e26' # 0xC6 -> THAI CHARACTER LU + u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG + u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A + u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I + u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II + u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U + u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU u'\ufffe' u'\ufffe' u'\ufffe' u'\ufffe' - u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT - u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E - u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE - u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O - u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN - u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI - u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO - u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK - u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU - u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK - u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO - u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI - u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA - u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT - u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT - u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN - u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN - u'\u0e50' # 0xF0 -> THAI DIGIT ZERO - u'\u0e51' # 0xF1 -> THAI DIGIT ONE - u'\u0e52' # 0xF2 -> THAI DIGIT TWO - u'\u0e53' # 0xF3 -> THAI DIGIT THREE - u'\u0e54' # 0xF4 -> THAI DIGIT FOUR - u'\u0e55' # 0xF5 -> THAI DIGIT FIVE - u'\u0e56' # 0xF6 -> THAI DIGIT SIX - u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN - u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT - u'\u0e59' # 0xF9 -> THAI DIGIT NINE - u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU - u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E + u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O + u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + u'\u0e50' # 0xF0 -> THAI DIGIT ZERO + u'\u0e51' # 0xF1 -> THAI DIGIT ONE + u'\u0e52' # 0xF2 -> THAI DIGIT TWO + u'\u0e53' # 0xF3 -> THAI DIGIT THREE + u'\u0e54' # 0xF4 -> THAI DIGIT FOUR + u'\u0e55' # 0xF5 -> THAI DIGIT FIVE + u'\u0e56' # 0xF6 -> THAI DIGIT SIX + u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN + u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT + u'\u0e59' # 0xF9 -> THAI DIGIT NINE + u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT u'\ufffe' u'\ufffe' u'\ufffe' @@ -293,252 +293,251 @@ ### Encoding Map encoding_map = { - 0x0000: 0x00, # NULL - 0x0001: 0x01, # START OF HEADING - 0x0002: 0x02, # START OF TEXT - 0x0003: 0x03, # END OF TEXT - 0x0004: 0x04, # END OF TRANSMISSION - 0x0005: 0x05, # ENQUIRY - 0x0006: 0x06, # ACKNOWLEDGE - 0x0007: 0x07, # BELL - 0x0008: 0x08, # BACKSPACE - 0x0009: 0x09, # HORIZONTAL TABULATION - 0x000A: 0x0A, # LINE FEED - 0x000B: 0x0B, # VERTICAL TABULATION - 0x000C: 0x0C, # FORM FEED - 0x000D: 0x0D, # CARRIAGE RETURN - 0x000E: 0x0E, # SHIFT OUT - 0x000F: 0x0F, # SHIFT IN - 0x0010: 0x10, # DATA LINK ESCAPE - 0x0011: 0x11, # DEVICE CONTROL ONE - 0x0012: 0x12, # DEVICE CONTROL TWO - 0x0013: 0x13, # DEVICE CONTROL THREE - 0x0014: 0x14, # DEVICE CONTROL FOUR - 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE - 0x0016: 0x16, # SYNCHRONOUS IDLE - 0x0017: 0x17, # END OF TRANSMISSION BLOCK - 0x0018: 0x18, # CANCEL - 0x0019: 0x19, # END OF MEDIUM - 0x001A: 0x1A, # SUBSTITUTE - 0x001B: 0x1B, # ESCAPE - 0x001C: 0x1C, # FILE SEPARATOR - 0x001D: 0x1D, # GROUP SEPARATOR - 0x001E: 0x1E, # RECORD SEPARATOR - 0x001F: 0x1F, # UNIT SEPARATOR - 0x0020: 0x20, # SPACE - 0x0021: 0x21, # EXCLAMATION MARK - 0x0022: 0x22, # QUOTATION MARK - 0x0023: 0x23, # NUMBER SIGN - 0x0024: 0x24, # DOLLAR SIGN - 0x0025: 0x25, # PERCENT SIGN - 0x0026: 0x26, # AMPERSAND - 0x0027: 0x27, # APOSTROPHE - 0x0028: 0x28, # LEFT PARENTHESIS - 0x0029: 0x29, # RIGHT PARENTHESIS - 0x002A: 0x2A, # ASTERISK - 0x002B: 0x2B, # PLUS SIGN - 0x002C: 0x2C, # COMMA - 0x002D: 0x2D, # HYPHEN-MINUS - 0x002E: 0x2E, # FULL STOP - 0x002F: 0x2F, # SOLIDUS - 0x0030: 0x30, # DIGIT ZERO - 0x0031: 0x31, # DIGIT ONE - 0x0032: 0x32, # DIGIT TWO - 0x0033: 0x33, # DIGIT THREE - 0x0034: 0x34, # DIGIT FOUR - 0x0035: 0x35, # DIGIT FIVE - 0x0036: 0x36, # DIGIT SIX - 0x0037: 0x37, # DIGIT SEVEN - 0x0038: 0x38, # DIGIT EIGHT - 0x0039: 0x39, # DIGIT NINE - 0x003A: 0x3A, # COLON - 0x003B: 0x3B, # SEMICOLON - 0x003C: 0x3C, # LESS-THAN SIGN - 0x003D: 0x3D, # EQUALS SIGN - 0x003E: 0x3E, # GREATER-THAN SIGN - 0x003F: 0x3F, # QUESTION MARK - 0x0040: 0x40, # COMMERCIAL AT - 0x0041: 0x41, # LATIN CAPITAL LETTER A - 0x0042: 0x42, # LATIN CAPITAL LETTER B - 0x0043: 0x43, # LATIN CAPITAL LETTER C - 0x0044: 0x44, # LATIN CAPITAL LETTER D - 0x0045: 0x45, # LATIN CAPITAL LETTER E - 0x0046: 0x46, # LATIN CAPITAL LETTER F - 0x0047: 0x47, # LATIN CAPITAL LETTER G - 0x0048: 0x48, # LATIN CAPITAL LETTER H - 0x0049: 0x49, # LATIN CAPITAL LETTER I - 0x004A: 0x4A, # LATIN CAPITAL LETTER J - 0x004B: 0x4B, # LATIN CAPITAL LETTER K - 0x004C: 0x4C, # LATIN CAPITAL LETTER L - 0x004D: 0x4D, # LATIN CAPITAL LETTER M - 0x004E: 0x4E, # LATIN CAPITAL LETTER N - 0x004F: 0x4F, # LATIN CAPITAL LETTER O - 0x0050: 0x50, # LATIN CAPITAL LETTER P - 0x0051: 0x51, # LATIN CAPITAL LETTER Q - 0x0052: 0x52, # LATIN CAPITAL LETTER R - 0x0053: 0x53, # LATIN CAPITAL LETTER S - 0x0054: 0x54, # LATIN CAPITAL LETTER T - 0x0055: 0x55, # LATIN CAPITAL LETTER U - 0x0056: 0x56, # LATIN CAPITAL LETTER V - 0x0057: 0x57, # LATIN CAPITAL LETTER W - 0x0058: 0x58, # LATIN CAPITAL LETTER X - 0x0059: 0x59, # LATIN CAPITAL LETTER Y - 0x005A: 0x5A, # LATIN CAPITAL LETTER Z - 0x005B: 0x5B, # LEFT SQUARE BRACKET - 0x005C: 0x5C, # REVERSE SOLIDUS - 0x005D: 0x5D, # RIGHT SQUARE BRACKET - 0x005E: 0x5E, # CIRCUMFLEX ACCENT - 0x005F: 0x5F, # LOW LINE - 0x0060: 0x60, # GRAVE ACCENT - 0x0061: 0x61, # LATIN SMALL LETTER A - 0x0062: 0x62, # LATIN SMALL LETTER B - 0x0063: 0x63, # LATIN SMALL LETTER C - 0x0064: 0x64, # LATIN SMALL LETTER D - 0x0065: 0x65, # LATIN SMALL LETTER E - 0x0066: 0x66, # LATIN SMALL LETTER F - 0x0067: 0x67, # LATIN SMALL LETTER G - 0x0068: 0x68, # LATIN SMALL LETTER H - 0x0069: 0x69, # LATIN SMALL LETTER I - 0x006A: 0x6A, # LATIN SMALL LETTER J - 0x006B: 0x6B, # LATIN SMALL LETTER K - 0x006C: 0x6C, # LATIN SMALL LETTER L - 0x006D: 0x6D, # LATIN SMALL LETTER M - 0x006E: 0x6E, # LATIN SMALL LETTER N - 0x006F: 0x6F, # LATIN SMALL LETTER O - 0x0070: 0x70, # LATIN SMALL LETTER P - 0x0071: 0x71, # LATIN SMALL LETTER Q - 0x0072: 0x72, # LATIN SMALL LETTER R - 0x0073: 0x73, # LATIN SMALL LETTER S - 0x0074: 0x74, # LATIN SMALL LETTER T - 0x0075: 0x75, # LATIN SMALL LETTER U - 0x0076: 0x76, # LATIN SMALL LETTER V - 0x0077: 0x77, # LATIN SMALL LETTER W - 0x0078: 0x78, # LATIN SMALL LETTER X - 0x0079: 0x79, # LATIN SMALL LETTER Y - 0x007A: 0x7A, # LATIN SMALL LETTER Z - 0x007B: 0x7B, # LEFT CURLY BRACKET - 0x007C: 0x7C, # VERTICAL LINE - 0x007D: 0x7D, # RIGHT CURLY BRACKET - 0x007E: 0x7E, # TILDE - 0x007F: 0x7F, # DELETE - 0x0080: 0x80, # - 0x0081: 0x81, # - 0x0082: 0x82, # - 0x0083: 0x83, # - 0x0084: 0x84, # - 0x0085: 0x85, # - 0x0086: 0x86, # - 0x0087: 0x87, # - 0x0088: 0x88, # - 0x0089: 0x89, # - 0x008A: 0x8A, # - 0x008B: 0x8B, # - 0x008C: 0x8C, # - 0x008D: 0x8D, # - 0x008E: 0x8E, # - 0x008F: 0x8F, # - 0x0090: 0x90, # - 0x0091: 0x91, # - 0x0092: 0x92, # - 0x0093: 0x93, # - 0x0094: 0x94, # - 0x0095: 0x95, # - 0x0096: 0x96, # - 0x0097: 0x97, # - 0x0098: 0x98, # - 0x0099: 0x99, # - 0x009A: 0x9A, # - 0x009B: 0x9B, # - 0x009C: 0x9C, # - 0x009D: 0x9D, # - 0x009E: 0x9E, # - 0x009F: 0x9F, # - 0x0E01: 0xA1, # THAI CHARACTER KO KAI - 0x0E02: 0xA2, # THAI CHARACTER KHO KHAI - 0x0E03: 0xA3, # THAI CHARACTER KHO KHUAT - 0x0E04: 0xA4, # THAI CHARACTER KHO KHWAI - 0x0E05: 0xA5, # THAI CHARACTER KHO KHON - 0x0E06: 0xA6, # THAI CHARACTER KHO RAKHANG - 0x0E07: 0xA7, # THAI CHARACTER NGO NGU - 0x0E08: 0xA8, # THAI CHARACTER CHO CHAN - 0x0E09: 0xA9, # THAI CHARACTER CHO CHING - 0x0E0A: 0xAA, # THAI CHARACTER CHO CHANG - 0x0E0B: 0xAB, # THAI CHARACTER SO SO - 0x0E0C: 0xAC, # THAI CHARACTER CHO CHOE - 0x0E0D: 0xAD, # THAI CHARACTER YO YING - 0x0E0E: 0xAE, # THAI CHARACTER DO CHADA - 0x0E0F: 0xAF, # THAI CHARACTER TO PATAK - 0x0E10: 0xB0, # THAI CHARACTER THO THAN - 0x0E11: 0xB1, # THAI CHARACTER THO NANGMONTHO - 0x0E12: 0xB2, # THAI CHARACTER THO PHUTHAO - 0x0E13: 0xB3, # THAI CHARACTER NO NEN - 0x0E14: 0xB4, # THAI CHARACTER DO DEK - 0x0E15: 0xB5, # THAI CHARACTER TO TAO - 0x0E16: 0xB6, # THAI CHARACTER THO THUNG - 0x0E17: 0xB7, # THAI CHARACTER THO THAHAN - 0x0E18: 0xB8, # THAI CHARACTER THO THONG - 0x0E19: 0xB9, # THAI CHARACTER NO NU - 0x0E1A: 0xBA, # THAI CHARACTER BO BAIMAI - 0x0E1B: 0xBB, # THAI CHARACTER PO PLA - 0x0E1C: 0xBC, # THAI CHARACTER PHO PHUNG - 0x0E1D: 0xBD, # THAI CHARACTER FO FA - 0x0E1E: 0xBE, # THAI CHARACTER PHO PHAN - 0x0E1F: 0xBF, # THAI CHARACTER FO FAN - 0x0E20: 0xC0, # THAI CHARACTER PHO SAMPHAO - 0x0E21: 0xC1, # THAI CHARACTER MO MA - 0x0E22: 0xC2, # THAI CHARACTER YO YAK - 0x0E23: 0xC3, # THAI CHARACTER RO RUA - 0x0E24: 0xC4, # THAI CHARACTER RU - 0x0E25: 0xC5, # THAI CHARACTER LO LING - 0x0E26: 0xC6, # THAI CHARACTER LU - 0x0E27: 0xC7, # THAI CHARACTER WO WAEN - 0x0E28: 0xC8, # THAI CHARACTER SO SALA - 0x0E29: 0xC9, # THAI CHARACTER SO RUSI - 0x0E2A: 0xCA, # THAI CHARACTER SO SUA - 0x0E2B: 0xCB, # THAI CHARACTER HO HIP - 0x0E2C: 0xCC, # THAI CHARACTER LO CHULA - 0x0E2D: 0xCD, # THAI CHARACTER O ANG - 0x0E2E: 0xCE, # THAI CHARACTER HO NOKHUK - 0x0E2F: 0xCF, # THAI CHARACTER PAIYANNOI - 0x0E30: 0xD0, # THAI CHARACTER SARA A - 0x0E31: 0xD1, # THAI CHARACTER MAI HAN-AKAT - 0x0E32: 0xD2, # THAI CHARACTER SARA AA - 0x0E33: 0xD3, # THAI CHARACTER SARA AM - 0x0E34: 0xD4, # THAI CHARACTER SARA I - 0x0E35: 0xD5, # THAI CHARACTER SARA II - 0x0E36: 0xD6, # THAI CHARACTER SARA UE - 0x0E37: 0xD7, # THAI CHARACTER SARA UEE - 0x0E38: 0xD8, # THAI CHARACTER SARA U - 0x0E39: 0xD9, # THAI CHARACTER SARA UU - 0x0E3A: 0xDA, # THAI CHARACTER PHINTHU - 0x0E3F: 0xDF, # THAI CURRENCY SYMBOL BAHT - 0x0E40: 0xE0, # THAI CHARACTER SARA E - 0x0E41: 0xE1, # THAI CHARACTER SARA AE - 0x0E42: 0xE2, # THAI CHARACTER SARA O - 0x0E43: 0xE3, # THAI CHARACTER SARA AI MAIMUAN - 0x0E44: 0xE4, # THAI CHARACTER SARA AI MAIMALAI - 0x0E45: 0xE5, # THAI CHARACTER LAKKHANGYAO - 0x0E46: 0xE6, # THAI CHARACTER MAIYAMOK - 0x0E47: 0xE7, # THAI CHARACTER MAITAIKHU - 0x0E48: 0xE8, # THAI CHARACTER MAI EK - 0x0E49: 0xE9, # THAI CHARACTER MAI THO - 0x0E4A: 0xEA, # THAI CHARACTER MAI TRI - 0x0E4B: 0xEB, # THAI CHARACTER MAI CHATTAWA - 0x0E4C: 0xEC, # THAI CHARACTER THANTHAKHAT - 0x0E4D: 0xED, # THAI CHARACTER NIKHAHIT - 0x0E4E: 0xEE, # THAI CHARACTER YAMAKKAN - 0x0E4F: 0xEF, # THAI CHARACTER FONGMAN - 0x0E50: 0xF0, # THAI DIGIT ZERO - 0x0E51: 0xF1, # THAI DIGIT ONE - 0x0E52: 0xF2, # THAI DIGIT TWO - 0x0E53: 0xF3, # THAI DIGIT THREE - 0x0E54: 0xF4, # THAI DIGIT FOUR - 0x0E55: 0xF5, # THAI DIGIT FIVE - 0x0E56: 0xF6, # THAI DIGIT SIX - 0x0E57: 0xF7, # THAI DIGIT SEVEN - 0x0E58: 0xF8, # THAI DIGIT EIGHT - 0x0E59: 0xF9, # THAI DIGIT NINE - 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU - 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT + 0x0000: 0x00, # NULL + 0x0001: 0x01, # START OF HEADING + 0x0002: 0x02, # START OF TEXT + 0x0003: 0x03, # END OF TEXT + 0x0004: 0x04, # END OF TRANSMISSION + 0x0005: 0x05, # ENQUIRY + 0x0006: 0x06, # ACKNOWLEDGE + 0x0007: 0x07, # BELL + 0x0008: 0x08, # BACKSPACE + 0x0009: 0x09, # HORIZONTAL TABULATION + 0x000A: 0x0A, # LINE FEED + 0x000B: 0x0B, # VERTICAL TABULATION + 0x000C: 0x0C, # FORM FEED + 0x000D: 0x0D, # CARRIAGE RETURN + 0x000E: 0x0E, # SHIFT OUT + 0x000F: 0x0F, # SHIFT IN + 0x0010: 0x10, # DATA LINK ESCAPE + 0x0011: 0x11, # DEVICE CONTROL ONE + 0x0012: 0x12, # DEVICE CONTROL TWO + 0x0013: 0x13, # DEVICE CONTROL THREE + 0x0014: 0x14, # DEVICE CONTROL FOUR + 0x0015: 0x15, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x16, # SYNCHRONOUS IDLE + 0x0017: 0x17, # END OF TRANSMISSION BLOCK + 0x0018: 0x18, # CANCEL + 0x0019: 0x19, # END OF MEDIUM + 0x001A: 0x1A, # SUBSTITUTE + 0x001B: 0x1B, # ESCAPE + 0x001C: 0x1C, # FILE SEPARATOR + 0x001D: 0x1D, # GROUP SEPARATOR + 0x001E: 0x1E, # RECORD SEPARATOR + 0x001F: 0x1F, # UNIT SEPARATOR + 0x0020: 0x20, # SPACE + 0x0021: 0x21, # EXCLAMATION MARK + 0x0022: 0x22, # QUOTATION MARK + 0x0023: 0x23, # NUMBER SIGN + 0x0024: 0x24, # DOLLAR SIGN + 0x0025: 0x25, # PERCENT SIGN + 0x0026: 0x26, # AMPERSAND + 0x0027: 0x27, # APOSTROPHE + 0x0028: 0x28, # LEFT PARENTHESIS + 0x0029: 0x29, # RIGHT PARENTHESIS + 0x002A: 0x2A, # ASTERISK + 0x002B: 0x2B, # PLUS SIGN + 0x002C: 0x2C, # COMMA + 0x002D: 0x2D, # HYPHEN-MINUS + 0x002E: 0x2E, # FULL STOP + 0x002F: 0x2F, # SOLIDUS + 0x0030: 0x30, # DIGIT ZERO + 0x0031: 0x31, # DIGIT ONE + 0x0032: 0x32, # DIGIT TWO + 0x0033: 0x33, # DIGIT THREE + 0x0034: 0x34, # DIGIT FOUR + 0x0035: 0x35, # DIGIT FIVE + 0x0036: 0x36, # DIGIT SIX + 0x0037: 0x37, # DIGIT SEVEN + 0x0038: 0x38, # DIGIT EIGHT + 0x0039: 0x39, # DIGIT NINE + 0x003A: 0x3A, # COLON + 0x003B: 0x3B, # SEMICOLON + 0x003C: 0x3C, # LESS-THAN SIGN + 0x003D: 0x3D, # EQUALS SIGN + 0x003E: 0x3E, # GREATER-THAN SIGN + 0x003F: 0x3F, # QUESTION MARK + 0x0040: 0x40, # COMMERCIAL AT + 0x0041: 0x41, # LATIN CAPITAL LETTER A + 0x0042: 0x42, # LATIN CAPITAL LETTER B + 0x0043: 0x43, # LATIN CAPITAL LETTER C + 0x0044: 0x44, # LATIN CAPITAL LETTER D + 0x0045: 0x45, # LATIN CAPITAL LETTER E + 0x0046: 0x46, # LATIN CAPITAL LETTER F + 0x0047: 0x47, # LATIN CAPITAL LETTER G + 0x0048: 0x48, # LATIN CAPITAL LETTER H + 0x0049: 0x49, # LATIN CAPITAL LETTER I + 0x004A: 0x4A, # LATIN CAPITAL LETTER J + 0x004B: 0x4B, # LATIN CAPITAL LETTER K + 0x004C: 0x4C, # LATIN CAPITAL LETTER L + 0x004D: 0x4D, # LATIN CAPITAL LETTER M + 0x004E: 0x4E, # LATIN CAPITAL LETTER N + 0x004F: 0x4F, # LATIN CAPITAL LETTER O + 0x0050: 0x50, # LATIN CAPITAL LETTER P + 0x0051: 0x51, # LATIN CAPITAL LETTER Q + 0x0052: 0x52, # LATIN CAPITAL LETTER R + 0x0053: 0x53, # LATIN CAPITAL LETTER S + 0x0054: 0x54, # LATIN CAPITAL LETTER T + 0x0055: 0x55, # LATIN CAPITAL LETTER U + 0x0056: 0x56, # LATIN CAPITAL LETTER V + 0x0057: 0x57, # LATIN CAPITAL LETTER W + 0x0058: 0x58, # LATIN CAPITAL LETTER X + 0x0059: 0x59, # LATIN CAPITAL LETTER Y + 0x005A: 0x5A, # LATIN CAPITAL LETTER Z + 0x005B: 0x5B, # LEFT SQUARE BRACKET + 0x005C: 0x5C, # REVERSE SOLIDUS + 0x005D: 0x5D, # RIGHT SQUARE BRACKET + 0x005E: 0x5E, # CIRCUMFLEX ACCENT + 0x005F: 0x5F, # LOW LINE + 0x0060: 0x60, # GRAVE ACCENT + 0x0061: 0x61, # LATIN SMALL LETTER A + 0x0062: 0x62, # LATIN SMALL LETTER B + 0x0063: 0x63, # LATIN SMALL LETTER C + 0x0064: 0x64, # LATIN SMALL LETTER D + 0x0065: 0x65, # LATIN SMALL LETTER E + 0x0066: 0x66, # LATIN SMALL LETTER F + 0x0067: 0x67, # LATIN SMALL LETTER G + 0x0068: 0x68, # LATIN SMALL LETTER H + 0x0069: 0x69, # LATIN SMALL LETTER I + 0x006A: 0x6A, # LATIN SMALL LETTER J + 0x006B: 0x6B, # LATIN SMALL LETTER K + 0x006C: 0x6C, # LATIN SMALL LETTER L + 0x006D: 0x6D, # LATIN SMALL LETTER M + 0x006E: 0x6E, # LATIN SMALL LETTER N + 0x006F: 0x6F, # LATIN SMALL LETTER O + 0x0070: 0x70, # LATIN SMALL LETTER P + 0x0071: 0x71, # LATIN SMALL LETTER Q + 0x0072: 0x72, # LATIN SMALL LETTER R + 0x0073: 0x73, # LATIN SMALL LETTER S + 0x0074: 0x74, # LATIN SMALL LETTER T + 0x0075: 0x75, # LATIN SMALL LETTER U + 0x0076: 0x76, # LATIN SMALL LETTER V + 0x0077: 0x77, # LATIN SMALL LETTER W + 0x0078: 0x78, # LATIN SMALL LETTER X + 0x0079: 0x79, # LATIN SMALL LETTER Y + 0x007A: 0x7A, # LATIN SMALL LETTER Z + 0x007B: 0x7B, # LEFT CURLY BRACKET + 0x007C: 0x7C, # VERTICAL LINE + 0x007D: 0x7D, # RIGHT CURLY BRACKET + 0x007E: 0x7E, # TILDE + 0x007F: 0x7F, # DELETE + 0x0080: 0x80, # + 0x0081: 0x81, # + 0x0082: 0x82, # + 0x0083: 0x83, # + 0x0084: 0x84, # + 0x0085: 0x85, # + 0x0086: 0x86, # + 0x0087: 0x87, # + 0x0088: 0x88, # + 0x0089: 0x89, # + 0x008A: 0x8A, # + 0x008B: 0x8B, # + 0x008C: 0x8C, # + 0x008D: 0x8D, # + 0x008E: 0x8E, # + 0x008F: 0x8F, # + 0x0090: 0x90, # + 0x0091: 0x91, # + 0x0092: 0x92, # + 0x0093: 0x93, # + 0x0094: 0x94, # + 0x0095: 0x95, # + 0x0096: 0x96, # + 0x0097: 0x97, # + 0x0098: 0x98, # + 0x0099: 0x99, # + 0x009A: 0x9A, # + 0x009B: 0x9B, # + 0x009C: 0x9C, # + 0x009D: 0x9D, # + 0x009E: 0x9E, # + 0x009F: 0x9F, # + 0x0E01: 0xA1, # THAI CHARACTER KO KAI + 0x0E02: 0xA2, # THAI CHARACTER KHO KHAI + 0x0E03: 0xA3, # THAI CHARACTER KHO KHUAT + 0x0E04: 0xA4, # THAI CHARACTER KHO KHWAI + 0x0E05: 0xA5, # THAI CHARACTER KHO KHON + 0x0E06: 0xA6, # THAI CHARACTER KHO RAKHANG + 0x0E07: 0xA7, # THAI CHARACTER NGO NGU + 0x0E08: 0xA8, # THAI CHARACTER CHO CHAN + 0x0E09: 0xA9, # THAI CHARACTER CHO CHING + 0x0E0A: 0xAA, # THAI CHARACTER CHO CHANG + 0x0E0B: 0xAB, # THAI CHARACTER SO SO + 0x0E0C: 0xAC, # THAI CHARACTER CHO CHOE + 0x0E0D: 0xAD, # THAI CHARACTER YO YING + 0x0E0E: 0xAE, # THAI CHARACTER DO CHADA + 0x0E0F: 0xAF, # THAI CHARACTER TO PATAK + 0x0E10: 0xB0, # THAI CHARACTER THO THAN + 0x0E11: 0xB1, # THAI CHARACTER THO NANGMONTHO + 0x0E12: 0xB2, # THAI CHARACTER THO PHUTHAO + 0x0E13: 0xB3, # THAI CHARACTER NO NEN + 0x0E14: 0xB4, # THAI CHARACTER DO DEK + 0x0E15: 0xB5, # THAI CHARACTER TO TAO + 0x0E16: 0xB6, # THAI CHARACTER THO THUNG + 0x0E17: 0xB7, # THAI CHARACTER THO THAHAN + 0x0E18: 0xB8, # THAI CHARACTER THO THONG + 0x0E19: 0xB9, # THAI CHARACTER NO NU + 0x0E1A: 0xBA, # THAI CHARACTER BO BAIMAI + 0x0E1B: 0xBB, # THAI CHARACTER PO PLA + 0x0E1C: 0xBC, # THAI CHARACTER PHO PHUNG + 0x0E1D: 0xBD, # THAI CHARACTER FO FA + 0x0E1E: 0xBE, # THAI CHARACTER PHO PHAN + 0x0E1F: 0xBF, # THAI CHARACTER FO FAN + 0x0E20: 0xC0, # THAI CHARACTER PHO SAMPHAO + 0x0E21: 0xC1, # THAI CHARACTER MO MA + 0x0E22: 0xC2, # THAI CHARACTER YO YAK + 0x0E23: 0xC3, # THAI CHARACTER RO RUA + 0x0E24: 0xC4, # THAI CHARACTER RU + 0x0E25: 0xC5, # THAI CHARACTER LO LING + 0x0E26: 0xC6, # THAI CHARACTER LU + 0x0E27: 0xC7, # THAI CHARACTER WO WAEN + 0x0E28: 0xC8, # THAI CHARACTER SO SALA + 0x0E29: 0xC9, # THAI CHARACTER SO RUSI + 0x0E2A: 0xCA, # THAI CHARACTER SO SUA + 0x0E2B: 0xCB, # THAI CHARACTER HO HIP + 0x0E2C: 0xCC, # THAI CHARACTER LO CHULA + 0x0E2D: 0xCD, # THAI CHARACTER O ANG + 0x0E2E: 0xCE, # THAI CHARACTER HO NOKHUK + 0x0E2F: 0xCF, # THAI CHARACTER PAIYANNOI + 0x0E30: 0xD0, # THAI CHARACTER SARA A + 0x0E31: 0xD1, # THAI CHARACTER MAI HAN-AKAT + 0x0E32: 0xD2, # THAI CHARACTER SARA AA + 0x0E33: 0xD3, # THAI CHARACTER SARA AM + 0x0E34: 0xD4, # THAI CHARACTER SARA I + 0x0E35: 0xD5, # THAI CHARACTER SARA II + 0x0E36: 0xD6, # THAI CHARACTER SARA UE + 0x0E37: 0xD7, # THAI CHARACTER SARA UEE + 0x0E38: 0xD8, # THAI CHARACTER SARA U + 0x0E39: 0xD9, # THAI CHARACTER SARA UU + 0x0E3A: 0xDA, # THAI CHARACTER PHINTHU + 0x0E3F: 0xDF, # THAI CURRENCY SYMBOL BAHT + 0x0E40: 0xE0, # THAI CHARACTER SARA E + 0x0E41: 0xE1, # THAI CHARACTER SARA AE + 0x0E42: 0xE2, # THAI CHARACTER SARA O + 0x0E43: 0xE3, # THAI CHARACTER SARA AI MAIMUAN + 0x0E44: 0xE4, # THAI CHARACTER SARA AI MAIMALAI + 0x0E45: 0xE5, # THAI CHARACTER LAKKHANGYAO + 0x0E46: 0xE6, # THAI CHARACTER MAIYAMOK + 0x0E47: 0xE7, # THAI CHARACTER MAITAIKHU + 0x0E48: 0xE8, # THAI CHARACTER MAI EK + 0x0E49: 0xE9, # THAI CHARACTER MAI THO + 0x0E4A: 0xEA, # THAI CHARACTER MAI TRI + 0x0E4B: 0xEB, # THAI CHARACTER MAI CHATTAWA + 0x0E4C: 0xEC, # THAI CHARACTER THANTHAKHAT + 0x0E4D: 0xED, # THAI CHARACTER NIKHAHIT + 0x0E4E: 0xEE, # THAI CHARACTER YAMAKKAN + 0x0E4F: 0xEF, # THAI CHARACTER FONGMAN + 0x0E50: 0xF0, # THAI DIGIT ZERO + 0x0E51: 0xF1, # THAI DIGIT ONE + 0x0E52: 0xF2, # THAI DIGIT TWO + 0x0E53: 0xF3, # THAI DIGIT THREE + 0x0E54: 0xF4, # THAI DIGIT FOUR + 0x0E55: 0xF5, # THAI DIGIT FIVE + 0x0E56: 0xF6, # THAI DIGIT SIX + 0x0E57: 0xF7, # THAI DIGIT SEVEN + 0x0E58: 0xF8, # THAI DIGIT EIGHT + 0x0E59: 0xF9, # THAI DIGIT NINE + 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU + 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT } - Modified: python/trunk/Lib/test/bad_coding2.py ============================================================================== --- python/trunk/Lib/test/bad_coding2.py (original) +++ python/trunk/Lib/test/bad_coding2.py Mon Dec 26 00:18:31 2005 @@ -1,2 +1,2 @@ ?#coding: utf8 -print '?' \ No newline at end of file +print '?' Modified: python/trunk/Lib/test/test_code.py ============================================================================== --- python/trunk/Lib/test/test_code.py (original) +++ python/trunk/Lib/test/test_code.py Mon Dec 26 00:18:31 2005 @@ -33,7 +33,7 @@ ... b = x - y ... c = a * b ... return c -... +... >>> dump(h.func_code) name: h argcount: 2 Modified: python/trunk/Lib/test/test_exception_variations.py ============================================================================== --- python/trunk/Lib/test/test_exception_variations.py (original) +++ python/trunk/Lib/test/test_exception_variations.py Mon Dec 26 00:18:31 2005 @@ -1,180 +1,180 @@ - -from test.test_support import run_unittest -import unittest - -class ExceptionTestCase(unittest.TestCase): - def test_try_except_else_finally(self): - hit_except = False - hit_else = False - hit_finally = False - - try: - raise Exception, 'nyaa!' - except: - hit_except = True - else: - hit_else = True - finally: - hit_finally = True - - self.assertTrue(hit_except) - self.assertTrue(hit_finally) - self.assertFalse(hit_else) - - def test_try_except_else_finally_no_exception(self): - hit_except = False - hit_else = False - hit_finally = False - - try: - pass - except: - hit_except = True - else: - hit_else = True - finally: - hit_finally = True - - self.assertFalse(hit_except) - self.assertTrue(hit_finally) - self.assertTrue(hit_else) - - def test_try_except_finally(self): - hit_except = False - hit_finally = False - - try: - raise Exception, 'yarr!' - except: - hit_except = True - finally: - hit_finally = True - - self.assertTrue(hit_except) - self.assertTrue(hit_finally) - - def test_try_except_finally_no_exception(self): - hit_except = False - hit_finally = False - - try: - pass - except: - hit_except = True - finally: - hit_finally = True - - self.assertFalse(hit_except) - self.assertTrue(hit_finally) - - def test_try_except(self): - hit_except = False - - try: - raise Exception, 'ahoy!' - except: - hit_except = True - - self.assertTrue(hit_except) - - def test_try_except_no_exception(self): - hit_except = False - - try: - pass - except: - hit_except = True - - self.assertFalse(hit_except) - - def test_try_except_else(self): - hit_except = False - hit_else = False - - try: - raise Exception, 'foo!' - except: - hit_except = True - else: - hit_else = True - - self.assertFalse(hit_else) - self.assertTrue(hit_except) - - def test_try_except_else_no_exception(self): - hit_except = False - hit_else = False - - try: - pass - except: - hit_except = True - else: - hit_else = True - - self.assertFalse(hit_except) - self.assertTrue(hit_else) - - def test_try_finally_no_exception(self): - hit_finally = False - - try: - pass - finally: - hit_finally = True - - self.assertTrue(hit_finally) - - def test_nested(self): - hit_finally = False - hit_inner_except = False - hit_inner_finally = False - - try: - try: - raise Exception, 'inner exception' - except: - hit_inner_except = True - finally: - hit_inner_finally = True - finally: - hit_finally = True - - self.assertTrue(hit_inner_except) - self.assertTrue(hit_inner_finally) - self.assertTrue(hit_finally) - - def test_nested_else(self): - hit_else = False - hit_finally = False - hit_except = False - hit_inner_except = False - hit_inner_else = False - - try: - try: - pass - except: - hit_inner_except = True - else: - hit_inner_else = True - - raise Exception, 'outer exception' - except: - hit_except = True - else: - hit_else = True - finally: - hit_finally = True - - self.assertFalse(hit_inner_except) - self.assertTrue(hit_inner_else) - self.assertFalse(hit_else) - self.assertTrue(hit_finally) - self.assertTrue(hit_except) - -def test_main(): - run_unittest(ExceptionTestCase) - -if __name__ == '__main__': - test_main() + +from test.test_support import run_unittest +import unittest + +class ExceptionTestCase(unittest.TestCase): + def test_try_except_else_finally(self): + hit_except = False + hit_else = False + hit_finally = False + + try: + raise Exception, 'nyaa!' + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertTrue(hit_except) + self.assertTrue(hit_finally) + self.assertFalse(hit_else) + + def test_try_except_else_finally_no_exception(self): + hit_except = False + hit_else = False + hit_finally = False + + try: + pass + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertFalse(hit_except) + self.assertTrue(hit_finally) + self.assertTrue(hit_else) + + def test_try_except_finally(self): + hit_except = False + hit_finally = False + + try: + raise Exception, 'yarr!' + except: + hit_except = True + finally: + hit_finally = True + + self.assertTrue(hit_except) + self.assertTrue(hit_finally) + + def test_try_except_finally_no_exception(self): + hit_except = False + hit_finally = False + + try: + pass + except: + hit_except = True + finally: + hit_finally = True + + self.assertFalse(hit_except) + self.assertTrue(hit_finally) + + def test_try_except(self): + hit_except = False + + try: + raise Exception, 'ahoy!' + except: + hit_except = True + + self.assertTrue(hit_except) + + def test_try_except_no_exception(self): + hit_except = False + + try: + pass + except: + hit_except = True + + self.assertFalse(hit_except) + + def test_try_except_else(self): + hit_except = False + hit_else = False + + try: + raise Exception, 'foo!' + except: + hit_except = True + else: + hit_else = True + + self.assertFalse(hit_else) + self.assertTrue(hit_except) + + def test_try_except_else_no_exception(self): + hit_except = False + hit_else = False + + try: + pass + except: + hit_except = True + else: + hit_else = True + + self.assertFalse(hit_except) + self.assertTrue(hit_else) + + def test_try_finally_no_exception(self): + hit_finally = False + + try: + pass + finally: + hit_finally = True + + self.assertTrue(hit_finally) + + def test_nested(self): + hit_finally = False + hit_inner_except = False + hit_inner_finally = False + + try: + try: + raise Exception, 'inner exception' + except: + hit_inner_except = True + finally: + hit_inner_finally = True + finally: + hit_finally = True + + self.assertTrue(hit_inner_except) + self.assertTrue(hit_inner_finally) + self.assertTrue(hit_finally) + + def test_nested_else(self): + hit_else = False + hit_finally = False + hit_except = False + hit_inner_except = False + hit_inner_else = False + + try: + try: + pass + except: + hit_inner_except = True + else: + hit_inner_else = True + + raise Exception, 'outer exception' + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertFalse(hit_inner_except) + self.assertTrue(hit_inner_else) + self.assertFalse(hit_else) + self.assertTrue(hit_finally) + self.assertTrue(hit_except) + +def test_main(): + run_unittest(ExceptionTestCase) + +if __name__ == '__main__': + test_main() Modified: python/trunk/Lib/test/test_generators.py ============================================================================== --- python/trunk/Lib/test/test_generators.py (original) +++ python/trunk/Lib/test/test_generators.py Mon Dec 26 00:18:31 2005 @@ -774,7 +774,7 @@ ... try: ... 1//0 ... except ZeroDivisionError: -... yield 666 +... yield 666 ... except: ... pass ... finally: Modified: python/trunk/Lib/test/test_minidom.py ============================================================================== --- python/trunk/Lib/test/test_minidom.py (original) +++ python/trunk/Lib/test/test_minidom.py Mon Dec 26 00:18:31 2005 @@ -1137,9 +1137,9 @@ # Check that replacing a child with itself leaves the tree unchanged elem.replaceChild(e, e) confirm(e.parentNode is elem, "After replaceChild()") - - - + + + def testReplaceWholeText(): def setup(): doc = parseString("ad") Modified: python/trunk/Lib/test/test_poll.py ============================================================================== --- python/trunk/Lib/test/test_poll.py (original) +++ python/trunk/Lib/test/test_poll.py Mon Dec 26 00:18:31 2005 @@ -185,7 +185,7 @@ if x != 5: print 'Overflow must have occurred' print 'Poll test 3 complete' - + test_poll1() test_poll2() Modified: python/trunk/Lib/test/test_quopri.py ============================================================================== --- python/trunk/Lib/test/test_quopri.py (original) +++ python/trunk/Lib/test/test_quopri.py Mon Dec 26 00:18:31 2005 @@ -175,18 +175,18 @@ self.assert_(quopri.decodestring(e, header=True) == p) def test_scriptencode(self): - (p, e) = self.STRINGS[-1] - (cin, cout) = os.popen2("%s -mquopri" % sys.executable) - cin.write(p) - cin.close() - self.assert_(cout.read() == e) + (p, e) = self.STRINGS[-1] + (cin, cout) = os.popen2("%s -mquopri" % sys.executable) + cin.write(p) + cin.close() + self.assert_(cout.read() == e) def test_scriptdecode(self): - (p, e) = self.STRINGS[-1] - (cin, cout) = os.popen2("%s -mquopri -d" % sys.executable) - cin.write(e) - cin.close() - self.assert_(cout.read() == p) + (p, e) = self.STRINGS[-1] + (cin, cout) = os.popen2("%s -mquopri -d" % sys.executable) + cin.write(e) + cin.close() + self.assert_(cout.read() == p) def test_main(): test_support.run_unittest(QuopriTestCase) Modified: python/trunk/Lib/test/test_xmlrpc.py ============================================================================== --- python/trunk/Lib/test/test_xmlrpc.py (original) +++ python/trunk/Lib/test/test_xmlrpc.py Mon Dec 26 00:18:31 2005 @@ -78,7 +78,7 @@ def test_bug_1164912 (self): d = xmlrpclib.DateTime() - ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), + ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), methodresponse=True)) self.assert_(isinstance(new_d.value, str)) Modified: python/trunk/Lib/webbrowser.py ============================================================================== --- python/trunk/Lib/webbrowser.py (original) +++ python/trunk/Lib/webbrowser.py Mon Dec 26 00:18:31 2005 @@ -96,7 +96,7 @@ if sys.platform[:3] == "win": def _isexecutable(cmd): cmd = cmd.lower() - if os.path.isfile(cmd) and (cmd.endswith(".exe") or + if os.path.isfile(cmd) and (cmd.endswith(".exe") or cmd.endswith(".bat")): return True for ext in ".exe", ".bat": @@ -134,7 +134,7 @@ def __init__(self, name=""): self.name = name self.basename = name - + def open(self, url, new=0, autoraise=1): raise NotImplementedError Modified: python/trunk/Lib/xmlcore/etree/ElementInclude.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/ElementInclude.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementInclude.py Mon Dec 26 00:18:31 2005 @@ -141,4 +141,3 @@ else: include(e, loader) i = i + 1 - Modified: python/trunk/Lib/xmlcore/etree/ElementPath.py ============================================================================== --- python/trunk/Lib/xmlcore/etree/ElementPath.py (original) +++ python/trunk/Lib/xmlcore/etree/ElementPath.py Mon Dec 26 00:18:31 2005 @@ -196,4 +196,3 @@ def findall(element, path): return _compile(path).findall(element) - Modified: python/trunk/Parser/asdl.py ============================================================================== --- python/trunk/Parser/asdl.py (original) +++ python/trunk/Parser/asdl.py Mon Dec 26 00:18:31 2005 @@ -142,7 +142,7 @@ def p_product(self, (_0, fields, _1)): " product ::= ( fields ) " # XXX can't I just construct things in the right order? - fields.reverse() + fields.reverse() return Product(fields) def p_sum_0(self, (constructor,)): @@ -164,7 +164,7 @@ def p_constructor_1(self, (id, _0, fields, _1)): " constructor ::= Id ( fields ) " # XXX can't I just construct things in the right order? - fields.reverse() + fields.reverse() return Constructor(id, fields) def p_fields_0(self, (field,)): @@ -355,7 +355,7 @@ v.errors += 1 uses = ", ".join(v.types[t]) print "Undefined type %s, used in %s" % (t, uses) - + return not v.errors def parse(file): @@ -380,7 +380,7 @@ else: testdir = "tests" files = glob.glob(testdir + "/*.asdl") - + for file in files: print file mod = parse(file) Modified: python/trunk/Parser/asdl_c.py ============================================================================== --- python/trunk/Parser/asdl_c.py (original) +++ python/trunk/Parser/asdl_c.py Mon Dec 26 00:18:31 2005 @@ -439,7 +439,7 @@ self.emit("", 0) self.emit("free(o);", 1) self.func_end() - + def visitConstructor(self, cons, enum, name): self.emit("case %s_kind:" % cons.name, 1) for f in cons.fields: @@ -487,76 +487,76 @@ else: ctype = get_c_type(field.type) self.emit("free_%s((%s)%s);" % (field.type, ctype, value), depth) - + class MarshalUtilVisitor(StaticVisitor): CODE = ''' #define CHECKSIZE(BUF, OFF, MIN) { \\ - int need = *(OFF) + MIN; \\ - if (need >= PyString_GET_SIZE(*(BUF))) { \\ - int newsize = PyString_GET_SIZE(*(BUF)) * 2; \\ - if (newsize < need) \\ - newsize = need; \\ - if (_PyString_Resize((BUF), newsize) < 0) \\ - return 0; \\ - } \\ -} + int need = *(OFF) + MIN; \\ + if (need >= PyString_GET_SIZE(*(BUF))) { \\ + int newsize = PyString_GET_SIZE(*(BUF)) * 2; \\ + if (newsize < need) \\ + newsize = need; \\ + if (_PyString_Resize((BUF), newsize) < 0) \\ + return 0; \\ + } \\ +} -static int +static int marshal_write_int(PyObject **buf, int *offset, int x) { - char *s; + char *s; - CHECKSIZE(buf, offset, 4) - s = PyString_AS_STRING(*buf) + (*offset); - s[0] = (x & 0xff); - s[1] = (x >> 8) & 0xff; - s[2] = (x >> 16) & 0xff; - s[3] = (x >> 24) & 0xff; - *offset += 4; - return 1; + CHECKSIZE(buf, offset, 4) + s = PyString_AS_STRING(*buf) + (*offset); + s[0] = (x & 0xff); + s[1] = (x >> 8) & 0xff; + s[2] = (x >> 16) & 0xff; + s[3] = (x >> 24) & 0xff; + *offset += 4; + return 1; } -static int +static int marshal_write_bool(PyObject **buf, int *offset, bool b) { - if (b) - marshal_write_int(buf, offset, 1); - else - marshal_write_int(buf, offset, 0); - return 1; + if (b) + marshal_write_int(buf, offset, 1); + else + marshal_write_int(buf, offset, 0); + return 1; } -static int +static int marshal_write_identifier(PyObject **buf, int *offset, identifier id) { - int l = PyString_GET_SIZE(id); - marshal_write_int(buf, offset, l); - CHECKSIZE(buf, offset, l); - memcpy(PyString_AS_STRING(*buf) + *offset, - PyString_AS_STRING(id), l); - *offset += l; - return 1; + int l = PyString_GET_SIZE(id); + marshal_write_int(buf, offset, l); + CHECKSIZE(buf, offset, l); + memcpy(PyString_AS_STRING(*buf) + *offset, + PyString_AS_STRING(id), l); + *offset += l; + return 1; } -static int +static int marshal_write_string(PyObject **buf, int *offset, string s) { - int len = PyString_GET_SIZE(s); - marshal_write_int(buf, offset, len); - CHECKSIZE(buf, offset, len); - memcpy(PyString_AS_STRING(*buf) + *offset, - PyString_AS_STRING(s), len); - *offset += len; - return 1; + int len = PyString_GET_SIZE(s); + marshal_write_int(buf, offset, len); + CHECKSIZE(buf, offset, len); + memcpy(PyString_AS_STRING(*buf) + *offset, + PyString_AS_STRING(s), len); + *offset += len; + return 1; } -static int +static int marshal_write_object(PyObject **buf, int *offset, object s) { - /* XXX */ - return 0; + /* XXX */ + return 0; } ''' @@ -575,7 +575,7 @@ self.emit("return 1;", 1) self.emit("}", 0) self.emit("", 0) - + def visitSum(self, sum, name): self.func_begin(name, has_sequence(sum.types, False)) simple = is_simple(sum) @@ -594,7 +594,7 @@ for field in prod.fields: self.visitField(field, name, 1, 1) self.func_end() - + def visitConstructor(self, cons, enum, name, simple): if simple: self.emit("case %s:" % cons.name, 1) Modified: python/trunk/Parser/spark.py ============================================================================== --- python/trunk/Parser/spark.py (original) +++ python/trunk/Parser/spark.py Mon Dec 26 00:18:31 2005 @@ -1,5 +1,5 @@ # Copyright (c) 1998-2002 John Aycock -# +# # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including @@ -7,10 +7,10 @@ # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: -# +# # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. -# +# # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. @@ -26,651 +26,651 @@ import string def _namelist(instance): - namelist, namedict, classlist = [], {}, [instance.__class__] - for c in classlist: - for b in c.__bases__: - classlist.append(b) - for name in c.__dict__.keys(): - if not namedict.has_key(name): - namelist.append(name) - namedict[name] = 1 - return namelist + namelist, namedict, classlist = [], {}, [instance.__class__] + for c in classlist: + for b in c.__bases__: + classlist.append(b) + for name in c.__dict__.keys(): + if not namedict.has_key(name): + namelist.append(name) + namedict[name] = 1 + return namelist class GenericScanner: - def __init__(self, flags=0): - pattern = self.reflect() - self.re = re.compile(pattern, re.VERBOSE|flags) - - self.index2func = {} - for name, number in self.re.groupindex.items(): - self.index2func[number-1] = getattr(self, 't_' + name) - - def makeRE(self, name): - doc = getattr(self, name).__doc__ - rv = '(?P<%s>%s)' % (name[2:], doc) - return rv - - def reflect(self): - rv = [] - for name in _namelist(self): - if name[:2] == 't_' and name != 't_default': - rv.append(self.makeRE(name)) - - rv.append(self.makeRE('t_default')) - return string.join(rv, '|') - - def error(self, s, pos): - print "Lexical error at position %s" % pos - raise SystemExit - - def tokenize(self, s): - pos = 0 - n = len(s) - while pos < n: - m = self.re.match(s, pos) - if m is None: - self.error(s, pos) - - groups = m.groups() - for i in range(len(groups)): - if groups[i] and self.index2func.has_key(i): - self.index2func[i](groups[i]) - pos = m.end() - - def t_default(self, s): - r'( . | \n )+' - print "Specification error: unmatched input" - raise SystemExit + def __init__(self, flags=0): + pattern = self.reflect() + self.re = re.compile(pattern, re.VERBOSE|flags) + + self.index2func = {} + for name, number in self.re.groupindex.items(): + self.index2func[number-1] = getattr(self, 't_' + name) + + def makeRE(self, name): + doc = getattr(self, name).__doc__ + rv = '(?P<%s>%s)' % (name[2:], doc) + return rv + + def reflect(self): + rv = [] + for name in _namelist(self): + if name[:2] == 't_' and name != 't_default': + rv.append(self.makeRE(name)) + + rv.append(self.makeRE('t_default')) + return string.join(rv, '|') + + def error(self, s, pos): + print "Lexical error at position %s" % pos + raise SystemExit + + def tokenize(self, s): + pos = 0 + n = len(s) + while pos < n: + m = self.re.match(s, pos) + if m is None: + self.error(s, pos) + + groups = m.groups() + for i in range(len(groups)): + if groups[i] and self.index2func.has_key(i): + self.index2func[i](groups[i]) + pos = m.end() + + def t_default(self, s): + r'( . | \n )+' + print "Specification error: unmatched input" + raise SystemExit # # Extracted from GenericParser and made global so that [un]picking works. # class _State: - def __init__(self, stateno, items): - self.T, self.complete, self.items = [], [], items - self.stateno = stateno + def __init__(self, stateno, items): + self.T, self.complete, self.items = [], [], items + self.stateno = stateno class GenericParser: - # - # An Earley parser, as per J. Earley, "An Efficient Context-Free - # Parsing Algorithm", CACM 13(2), pp. 94-102. Also J. C. Earley, - # "An Efficient Context-Free Parsing Algorithm", Ph.D. thesis, - # Carnegie-Mellon University, August 1968. New formulation of - # the parser according to J. Aycock, "Practical Earley Parsing - # and the SPARK Toolkit", Ph.D. thesis, University of Victoria, - # 2001, and J. Aycock and R. N. Horspool, "Practical Earley - # Parsing", unpublished paper, 2001. - # - - def __init__(self, start): - self.rules = {} - self.rule2func = {} - self.rule2name = {} - self.collectRules() - self.augment(start) - self.ruleschanged = 1 - - _NULLABLE = '\e_' - _START = 'START' - _BOF = '|-' - - # - # When pickling, take the time to generate the full state machine; - # some information is then extraneous, too. Unfortunately we - # can't save the rule2func map. - # - def __getstate__(self): - if self.ruleschanged: - # - # XXX - duplicated from parse() - # - self.computeNull() - self.newrules = {} - self.new2old = {} - self.makeNewRules() - self.ruleschanged = 0 - self.edges, self.cores = {}, {} - self.states = { 0: self.makeState0() } - self.makeState(0, self._BOF) - # - # XXX - should find a better way to do this.. - # - changes = 1 - while changes: - changes = 0 - for k, v in self.edges.items(): - if v is None: - state, sym = k - if self.states.has_key(state): - self.goto(state, sym) - changes = 1 - rv = self.__dict__.copy() - for s in self.states.values(): - del s.items - del rv['rule2func'] - del rv['nullable'] - del rv['cores'] - return rv - - def __setstate__(self, D): - self.rules = {} - self.rule2func = {} - self.rule2name = {} - self.collectRules() - start = D['rules'][self._START][0][1][1] # Blech. - self.augment(start) - D['rule2func'] = self.rule2func - D['makeSet'] = self.makeSet_fast - self.__dict__ = D - - # - # A hook for GenericASTBuilder and GenericASTMatcher. Mess - # thee not with this; nor shall thee toucheth the _preprocess - # argument to addRule. - # - def preprocess(self, rule, func): return rule, func - - def addRule(self, doc, func, _preprocess=1): - fn = func - rules = string.split(doc) - - index = [] - for i in range(len(rules)): - if rules[i] == '::=': - index.append(i-1) - index.append(len(rules)) - - for i in range(len(index)-1): - lhs = rules[index[i]] - rhs = rules[index[i]+2:index[i+1]] - rule = (lhs, tuple(rhs)) - - if _preprocess: - rule, fn = self.preprocess(rule, func) - - if self.rules.has_key(lhs): - self.rules[lhs].append(rule) - else: - self.rules[lhs] = [ rule ] - self.rule2func[rule] = fn - self.rule2name[rule] = func.__name__[2:] - self.ruleschanged = 1 - - def collectRules(self): - for name in _namelist(self): - if name[:2] == 'p_': - func = getattr(self, name) - doc = func.__doc__ - self.addRule(doc, func) - - def augment(self, start): - rule = '%s ::= %s %s' % (self._START, self._BOF, start) - self.addRule(rule, lambda args: args[1], 0) - - def computeNull(self): - self.nullable = {} - tbd = [] - - for rulelist in self.rules.values(): - lhs = rulelist[0][0] - self.nullable[lhs] = 0 - for rule in rulelist: - rhs = rule[1] - if len(rhs) == 0: - self.nullable[lhs] = 1 - continue - # - # We only need to consider rules which - # consist entirely of nonterminal symbols. - # This should be a savings on typical - # grammars. - # - for sym in rhs: - if not self.rules.has_key(sym): - break - else: - tbd.append(rule) - changes = 1 - while changes: - changes = 0 - for lhs, rhs in tbd: - if self.nullable[lhs]: - continue - for sym in rhs: - if not self.nullable[sym]: - break - else: - self.nullable[lhs] = 1 - changes = 1 - - def makeState0(self): - s0 = _State(0, []) - for rule in self.newrules[self._START]: - s0.items.append((rule, 0)) - return s0 - - def finalState(self, tokens): - # - # Yuck. - # - if len(self.newrules[self._START]) == 2 and len(tokens) == 0: - return 1 - start = self.rules[self._START][0][1][1] - return self.goto(1, start) - - def makeNewRules(self): - worklist = [] - for rulelist in self.rules.values(): - for rule in rulelist: - worklist.append((rule, 0, 1, rule)) - - for rule, i, candidate, oldrule in worklist: - lhs, rhs = rule - n = len(rhs) - while i < n: - sym = rhs[i] - if not self.rules.has_key(sym) or \ - not self.nullable[sym]: - candidate = 0 - i = i + 1 - continue - - newrhs = list(rhs) - newrhs[i] = self._NULLABLE+sym - newrule = (lhs, tuple(newrhs)) - worklist.append((newrule, i+1, - candidate, oldrule)) - candidate = 0 - i = i + 1 - else: - if candidate: - lhs = self._NULLABLE+lhs - rule = (lhs, rhs) - if self.newrules.has_key(lhs): - self.newrules[lhs].append(rule) - else: - self.newrules[lhs] = [ rule ] - self.new2old[rule] = oldrule - - def typestring(self, token): - return None - - def error(self, token): - print "Syntax error at or near `%s' token" % token - raise SystemExit - - def parse(self, tokens): - sets = [ [(1,0), (2,0)] ] - self.links = {} - - if self.ruleschanged: - self.computeNull() - self.newrules = {} - self.new2old = {} - self.makeNewRules() - self.ruleschanged = 0 - self.edges, self.cores = {}, {} - self.states = { 0: self.makeState0() } - self.makeState(0, self._BOF) - - for i in xrange(len(tokens)): - sets.append([]) - - if sets[i] == []: - break - self.makeSet(tokens[i], sets, i) - else: - sets.append([]) - self.makeSet(None, sets, len(tokens)) - - #_dump(tokens, sets, self.states) - - finalitem = (self.finalState(tokens), 0) - if finalitem not in sets[-2]: - if len(tokens) > 0: - self.error(tokens[i-1]) - else: - self.error(None) - - return self.buildTree(self._START, finalitem, - tokens, len(sets)-2) - - def isnullable(self, sym): - # - # For symbols in G_e only. If we weren't supporting 1.5, - # could just use sym.startswith(). - # - return self._NULLABLE == sym[0:len(self._NULLABLE)] - - def skip(self, (lhs, rhs), pos=0): - n = len(rhs) - while pos < n: - if not self.isnullable(rhs[pos]): - break - pos = pos + 1 - return pos - - def makeState(self, state, sym): - assert sym is not None - # - # Compute \epsilon-kernel state's core and see if - # it exists already. - # - kitems = [] - for rule, pos in self.states[state].items: - lhs, rhs = rule - if rhs[pos:pos+1] == (sym,): - kitems.append((rule, self.skip(rule, pos+1))) - core = kitems - - core.sort() - tcore = tuple(core) - if self.cores.has_key(tcore): - return self.cores[tcore] - # - # Nope, doesn't exist. Compute it and the associated - # \epsilon-nonkernel state together; we'll need it right away. - # - k = self.cores[tcore] = len(self.states) - K, NK = _State(k, kitems), _State(k+1, []) - self.states[k] = K - predicted = {} - - edges = self.edges - rules = self.newrules - for X in K, NK: - worklist = X.items - for item in worklist: - rule, pos = item - lhs, rhs = rule - if pos == len(rhs): - X.complete.append(rule) - continue - - nextSym = rhs[pos] - key = (X.stateno, nextSym) - if not rules.has_key(nextSym): - if not edges.has_key(key): - edges[key] = None - X.T.append(nextSym) - else: - edges[key] = None - if not predicted.has_key(nextSym): - predicted[nextSym] = 1 - for prule in rules[nextSym]: - ppos = self.skip(prule) - new = (prule, ppos) - NK.items.append(new) - # - # Problem: we know K needs generating, but we - # don't yet know about NK. Can't commit anything - # regarding NK to self.edges until we're sure. Should - # we delay committing on both K and NK to avoid this - # hacky code? This creates other problems.. - # - if X is K: - edges = {} - - if NK.items == []: - return k - - # - # Check for \epsilon-nonkernel's core. Unfortunately we - # need to know the entire set of predicted nonterminals - # to do this without accidentally duplicating states. - # - core = predicted.keys() - core.sort() - tcore = tuple(core) - if self.cores.has_key(tcore): - self.edges[(k, None)] = self.cores[tcore] - return k - - nk = self.cores[tcore] = self.edges[(k, None)] = NK.stateno - self.edges.update(edges) - self.states[nk] = NK - return k - - def goto(self, state, sym): - key = (state, sym) - if not self.edges.has_key(key): - # - # No transitions from state on sym. - # - return None - - rv = self.edges[key] - if rv is None: - # - # Target state isn't generated yet. Remedy this. - # - rv = self.makeState(state, sym) - self.edges[key] = rv - return rv - - def gotoT(self, state, t): - return [self.goto(state, t)] - - def gotoST(self, state, st): - rv = [] - for t in self.states[state].T: - if st == t: - rv.append(self.goto(state, t)) - return rv - - def add(self, set, item, i=None, predecessor=None, causal=None): - if predecessor is None: - if item not in set: - set.append(item) - else: - key = (item, i) - if item not in set: - self.links[key] = [] - set.append(item) - self.links[key].append((predecessor, causal)) - - def makeSet(self, token, sets, i): - cur, next = sets[i], sets[i+1] - - ttype = token is not None and self.typestring(token) or None - if ttype is not None: - fn, arg = self.gotoT, ttype - else: - fn, arg = self.gotoST, token - - for item in cur: - ptr = (item, i) - state, parent = item - add = fn(state, arg) - for k in add: - if k is not None: - self.add(next, (k, parent), i+1, ptr) - nk = self.goto(k, None) - if nk is not None: - self.add(next, (nk, i+1)) - - if parent == i: - continue - - for rule in self.states[state].complete: - lhs, rhs = rule - for pitem in sets[parent]: - pstate, pparent = pitem - k = self.goto(pstate, lhs) - if k is not None: - why = (item, i, rule) - pptr = (pitem, parent) - self.add(cur, (k, pparent), - i, pptr, why) - nk = self.goto(k, None) - if nk is not None: - self.add(cur, (nk, i)) - - def makeSet_fast(self, token, sets, i): - # - # Call *only* when the entire state machine has been built! - # It relies on self.edges being filled in completely, and - # then duplicates and inlines code to boost speed at the - # cost of extreme ugliness. - # - cur, next = sets[i], sets[i+1] - ttype = token is not None and self.typestring(token) or None - - for item in cur: - ptr = (item, i) - state, parent = item - if ttype is not None: - k = self.edges.get((state, ttype), None) - if k is not None: - #self.add(next, (k, parent), i+1, ptr) - #INLINED --v - new = (k, parent) - key = (new, i+1) - if new not in next: - self.links[key] = [] - next.append(new) - self.links[key].append((ptr, None)) - #INLINED --^ - #nk = self.goto(k, None) - nk = self.edges.get((k, None), None) - if nk is not None: - #self.add(next, (nk, i+1)) - #INLINED --v - new = (nk, i+1) - if new not in next: - next.append(new) - #INLINED --^ - else: - add = self.gotoST(state, token) - for k in add: - if k is not None: - self.add(next, (k, parent), i+1, ptr) - #nk = self.goto(k, None) - nk = self.edges.get((k, None), None) - if nk is not None: - self.add(next, (nk, i+1)) - - if parent == i: - continue - - for rule in self.states[state].complete: - lhs, rhs = rule - for pitem in sets[parent]: - pstate, pparent = pitem - #k = self.goto(pstate, lhs) - k = self.edges.get((pstate, lhs), None) - if k is not None: - why = (item, i, rule) - pptr = (pitem, parent) - #self.add(cur, (k, pparent), - # i, pptr, why) - #INLINED --v - new = (k, pparent) - key = (new, i) - if new not in cur: - self.links[key] = [] - cur.append(new) - self.links[key].append((pptr, why)) - #INLINED --^ - #nk = self.goto(k, None) - nk = self.edges.get((k, None), None) - if nk is not None: - #self.add(cur, (nk, i)) - #INLINED --v - new = (nk, i) - if new not in cur: - cur.append(new) - #INLINED --^ - - def predecessor(self, key, causal): - for p, c in self.links[key]: - if c == causal: - return p - assert 0 - - def causal(self, key): - links = self.links[key] - if len(links) == 1: - return links[0][1] - choices = [] - rule2cause = {} - for p, c in links: - rule = c[2] - choices.append(rule) - rule2cause[rule] = c - return rule2cause[self.ambiguity(choices)] - - def deriveEpsilon(self, nt): - if len(self.newrules[nt]) > 1: - rule = self.ambiguity(self.newrules[nt]) - else: - rule = self.newrules[nt][0] - #print rule - - rhs = rule[1] - attr = [None] * len(rhs) - - for i in range(len(rhs)-1, -1, -1): - attr[i] = self.deriveEpsilon(rhs[i]) - return self.rule2func[self.new2old[rule]](attr) - - def buildTree(self, nt, item, tokens, k): - state, parent = item - - choices = [] - for rule in self.states[state].complete: - if rule[0] == nt: - choices.append(rule) - rule = choices[0] - if len(choices) > 1: - rule = self.ambiguity(choices) - #print rule - - rhs = rule[1] - attr = [None] * len(rhs) - - for i in range(len(rhs)-1, -1, -1): - sym = rhs[i] - if not self.newrules.has_key(sym): - if sym != self._BOF: - attr[i] = tokens[k-1] - key = (item, k) - item, k = self.predecessor(key, None) - #elif self.isnullable(sym): - elif self._NULLABLE == sym[0:len(self._NULLABLE)]: - attr[i] = self.deriveEpsilon(sym) - else: - key = (item, k) - why = self.causal(key) - attr[i] = self.buildTree(sym, why[0], - tokens, why[1]) - item, k = self.predecessor(key, why) - return self.rule2func[self.new2old[rule]](attr) - - def ambiguity(self, rules): - # - # XXX - problem here and in collectRules() if the same rule - # appears in >1 method. Also undefined results if rules - # causing the ambiguity appear in the same method. - # - sortlist = [] - name2index = {} - for i in range(len(rules)): - lhs, rhs = rule = rules[i] - name = self.rule2name[self.new2old[rule]] - sortlist.append((len(rhs), name)) - name2index[name] = i - sortlist.sort() - list = map(lambda (a,b): b, sortlist) - return rules[name2index[self.resolve(list)]] - - def resolve(self, list): - # - # Resolve ambiguity in favor of the shortest RHS. - # Since we walk the tree from the top down, this - # should effectively resolve in favor of a "shift". - # - return list[0] + # + # An Earley parser, as per J. Earley, "An Efficient Context-Free + # Parsing Algorithm", CACM 13(2), pp. 94-102. Also J. C. Earley, + # "An Efficient Context-Free Parsing Algorithm", Ph.D. thesis, + # Carnegie-Mellon University, August 1968. New formulation of + # the parser according to J. Aycock, "Practical Earley Parsing + # and the SPARK Toolkit", Ph.D. thesis, University of Victoria, + # 2001, and J. Aycock and R. N. Horspool, "Practical Earley + # Parsing", unpublished paper, 2001. + # + + def __init__(self, start): + self.rules = {} + self.rule2func = {} + self.rule2name = {} + self.collectRules() + self.augment(start) + self.ruleschanged = 1 + + _NULLABLE = '\e_' + _START = 'START' + _BOF = '|-' + + # + # When pickling, take the time to generate the full state machine; + # some information is then extraneous, too. Unfortunately we + # can't save the rule2func map. + # + def __getstate__(self): + if self.ruleschanged: + # + # XXX - duplicated from parse() + # + self.computeNull() + self.newrules = {} + self.new2old = {} + self.makeNewRules() + self.ruleschanged = 0 + self.edges, self.cores = {}, {} + self.states = { 0: self.makeState0() } + self.makeState(0, self._BOF) + # + # XXX - should find a better way to do this.. + # + changes = 1 + while changes: + changes = 0 + for k, v in self.edges.items(): + if v is None: + state, sym = k + if self.states.has_key(state): + self.goto(state, sym) + changes = 1 + rv = self.__dict__.copy() + for s in self.states.values(): + del s.items + del rv['rule2func'] + del rv['nullable'] + del rv['cores'] + return rv + + def __setstate__(self, D): + self.rules = {} + self.rule2func = {} + self.rule2name = {} + self.collectRules() + start = D['rules'][self._START][0][1][1] # Blech. + self.augment(start) + D['rule2func'] = self.rule2func + D['makeSet'] = self.makeSet_fast + self.__dict__ = D + + # + # A hook for GenericASTBuilder and GenericASTMatcher. Mess + # thee not with this; nor shall thee toucheth the _preprocess + # argument to addRule. + # + def preprocess(self, rule, func): return rule, func + + def addRule(self, doc, func, _preprocess=1): + fn = func + rules = string.split(doc) + + index = [] + for i in range(len(rules)): + if rules[i] == '::=': + index.append(i-1) + index.append(len(rules)) + + for i in range(len(index)-1): + lhs = rules[index[i]] + rhs = rules[index[i]+2:index[i+1]] + rule = (lhs, tuple(rhs)) + + if _preprocess: + rule, fn = self.preprocess(rule, func) + + if self.rules.has_key(lhs): + self.rules[lhs].append(rule) + else: + self.rules[lhs] = [ rule ] + self.rule2func[rule] = fn + self.rule2name[rule] = func.__name__[2:] + self.ruleschanged = 1 + + def collectRules(self): + for name in _namelist(self): + if name[:2] == 'p_': + func = getattr(self, name) + doc = func.__doc__ + self.addRule(doc, func) + + def augment(self, start): + rule = '%s ::= %s %s' % (self._START, self._BOF, start) + self.addRule(rule, lambda args: args[1], 0) + + def computeNull(self): + self.nullable = {} + tbd = [] + + for rulelist in self.rules.values(): + lhs = rulelist[0][0] + self.nullable[lhs] = 0 + for rule in rulelist: + rhs = rule[1] + if len(rhs) == 0: + self.nullable[lhs] = 1 + continue + # + # We only need to consider rules which + # consist entirely of nonterminal symbols. + # This should be a savings on typical + # grammars. + # + for sym in rhs: + if not self.rules.has_key(sym): + break + else: + tbd.append(rule) + changes = 1 + while changes: + changes = 0 + for lhs, rhs in tbd: + if self.nullable[lhs]: + continue + for sym in rhs: + if not self.nullable[sym]: + break + else: + self.nullable[lhs] = 1 + changes = 1 + + def makeState0(self): + s0 = _State(0, []) + for rule in self.newrules[self._START]: + s0.items.append((rule, 0)) + return s0 + + def finalState(self, tokens): + # + # Yuck. + # + if len(self.newrules[self._START]) == 2 and len(tokens) == 0: + return 1 + start = self.rules[self._START][0][1][1] + return self.goto(1, start) + + def makeNewRules(self): + worklist = [] + for rulelist in self.rules.values(): + for rule in rulelist: + worklist.append((rule, 0, 1, rule)) + + for rule, i, candidate, oldrule in worklist: + lhs, rhs = rule + n = len(rhs) + while i < n: + sym = rhs[i] + if not self.rules.has_key(sym) or \ + not self.nullable[sym]: + candidate = 0 + i = i + 1 + continue + + newrhs = list(rhs) + newrhs[i] = self._NULLABLE+sym + newrule = (lhs, tuple(newrhs)) + worklist.append((newrule, i+1, + candidate, oldrule)) + candidate = 0 + i = i + 1 + else: + if candidate: + lhs = self._NULLABLE+lhs + rule = (lhs, rhs) + if self.newrules.has_key(lhs): + self.newrules[lhs].append(rule) + else: + self.newrules[lhs] = [ rule ] + self.new2old[rule] = oldrule + + def typestring(self, token): + return None + + def error(self, token): + print "Syntax error at or near `%s' token" % token + raise SystemExit + + def parse(self, tokens): + sets = [ [(1,0), (2,0)] ] + self.links = {} + + if self.ruleschanged: + self.computeNull() + self.newrules = {} + self.new2old = {} + self.makeNewRules() + self.ruleschanged = 0 + self.edges, self.cores = {}, {} + self.states = { 0: self.makeState0() } + self.makeState(0, self._BOF) + + for i in xrange(len(tokens)): + sets.append([]) + + if sets[i] == []: + break + self.makeSet(tokens[i], sets, i) + else: + sets.append([]) + self.makeSet(None, sets, len(tokens)) + + #_dump(tokens, sets, self.states) + + finalitem = (self.finalState(tokens), 0) + if finalitem not in sets[-2]: + if len(tokens) > 0: + self.error(tokens[i-1]) + else: + self.error(None) + + return self.buildTree(self._START, finalitem, + tokens, len(sets)-2) + + def isnullable(self, sym): + # + # For symbols in G_e only. If we weren't supporting 1.5, + # could just use sym.startswith(). + # + return self._NULLABLE == sym[0:len(self._NULLABLE)] + + def skip(self, (lhs, rhs), pos=0): + n = len(rhs) + while pos < n: + if not self.isnullable(rhs[pos]): + break + pos = pos + 1 + return pos + + def makeState(self, state, sym): + assert sym is not None + # + # Compute \epsilon-kernel state's core and see if + # it exists already. + # + kitems = [] + for rule, pos in self.states[state].items: + lhs, rhs = rule + if rhs[pos:pos+1] == (sym,): + kitems.append((rule, self.skip(rule, pos+1))) + core = kitems + + core.sort() + tcore = tuple(core) + if self.cores.has_key(tcore): + return self.cores[tcore] + # + # Nope, doesn't exist. Compute it and the associated + # \epsilon-nonkernel state together; we'll need it right away. + # + k = self.cores[tcore] = len(self.states) + K, NK = _State(k, kitems), _State(k+1, []) + self.states[k] = K + predicted = {} + + edges = self.edges + rules = self.newrules + for X in K, NK: + worklist = X.items + for item in worklist: + rule, pos = item + lhs, rhs = rule + if pos == len(rhs): + X.complete.append(rule) + continue + + nextSym = rhs[pos] + key = (X.stateno, nextSym) + if not rules.has_key(nextSym): + if not edges.has_key(key): + edges[key] = None + X.T.append(nextSym) + else: + edges[key] = None + if not predicted.has_key(nextSym): + predicted[nextSym] = 1 + for prule in rules[nextSym]: + ppos = self.skip(prule) + new = (prule, ppos) + NK.items.append(new) + # + # Problem: we know K needs generating, but we + # don't yet know about NK. Can't commit anything + # regarding NK to self.edges until we're sure. Should + # we delay committing on both K and NK to avoid this + # hacky code? This creates other problems.. + # + if X is K: + edges = {} + + if NK.items == []: + return k + + # + # Check for \epsilon-nonkernel's core. Unfortunately we + # need to know the entire set of predicted nonterminals + # to do this without accidentally duplicating states. + # + core = predicted.keys() + core.sort() + tcore = tuple(core) + if self.cores.has_key(tcore): + self.edges[(k, None)] = self.cores[tcore] + return k + + nk = self.cores[tcore] = self.edges[(k, None)] = NK.stateno + self.edges.update(edges) + self.states[nk] = NK + return k + + def goto(self, state, sym): + key = (state, sym) + if not self.edges.has_key(key): + # + # No transitions from state on sym. + # + return None + + rv = self.edges[key] + if rv is None: + # + # Target state isn't generated yet. Remedy this. + # + rv = self.makeState(state, sym) + self.edges[key] = rv + return rv + + def gotoT(self, state, t): + return [self.goto(state, t)] + + def gotoST(self, state, st): + rv = [] + for t in self.states[state].T: + if st == t: + rv.append(self.goto(state, t)) + return rv + + def add(self, set, item, i=None, predecessor=None, causal=None): + if predecessor is None: + if item not in set: + set.append(item) + else: + key = (item, i) + if item not in set: + self.links[key] = [] + set.append(item) + self.links[key].append((predecessor, causal)) + + def makeSet(self, token, sets, i): + cur, next = sets[i], sets[i+1] + + ttype = token is not None and self.typestring(token) or None + if ttype is not None: + fn, arg = self.gotoT, ttype + else: + fn, arg = self.gotoST, token + + for item in cur: + ptr = (item, i) + state, parent = item + add = fn(state, arg) + for k in add: + if k is not None: + self.add(next, (k, parent), i+1, ptr) + nk = self.goto(k, None) + if nk is not None: + self.add(next, (nk, i+1)) + + if parent == i: + continue + + for rule in self.states[state].complete: + lhs, rhs = rule + for pitem in sets[parent]: + pstate, pparent = pitem + k = self.goto(pstate, lhs) + if k is not None: + why = (item, i, rule) + pptr = (pitem, parent) + self.add(cur, (k, pparent), + i, pptr, why) + nk = self.goto(k, None) + if nk is not None: + self.add(cur, (nk, i)) + + def makeSet_fast(self, token, sets, i): + # + # Call *only* when the entire state machine has been built! + # It relies on self.edges being filled in completely, and + # then duplicates and inlines code to boost speed at the + # cost of extreme ugliness. + # + cur, next = sets[i], sets[i+1] + ttype = token is not None and self.typestring(token) or None + + for item in cur: + ptr = (item, i) + state, parent = item + if ttype is not None: + k = self.edges.get((state, ttype), None) + if k is not None: + #self.add(next, (k, parent), i+1, ptr) + #INLINED --v + new = (k, parent) + key = (new, i+1) + if new not in next: + self.links[key] = [] + next.append(new) + self.links[key].append((ptr, None)) + #INLINED --^ + #nk = self.goto(k, None) + nk = self.edges.get((k, None), None) + if nk is not None: + #self.add(next, (nk, i+1)) + #INLINED --v + new = (nk, i+1) + if new not in next: + next.append(new) + #INLINED --^ + else: + add = self.gotoST(state, token) + for k in add: + if k is not None: + self.add(next, (k, parent), i+1, ptr) + #nk = self.goto(k, None) + nk = self.edges.get((k, None), None) + if nk is not None: + self.add(next, (nk, i+1)) + + if parent == i: + continue + + for rule in self.states[state].complete: + lhs, rhs = rule + for pitem in sets[parent]: + pstate, pparent = pitem + #k = self.goto(pstate, lhs) + k = self.edges.get((pstate, lhs), None) + if k is not None: + why = (item, i, rule) + pptr = (pitem, parent) + #self.add(cur, (k, pparent), + # i, pptr, why) + #INLINED --v + new = (k, pparent) + key = (new, i) + if new not in cur: + self.links[key] = [] + cur.append(new) + self.links[key].append((pptr, why)) + #INLINED --^ + #nk = self.goto(k, None) + nk = self.edges.get((k, None), None) + if nk is not None: + #self.add(cur, (nk, i)) + #INLINED --v + new = (nk, i) + if new not in cur: + cur.append(new) + #INLINED --^ + + def predecessor(self, key, causal): + for p, c in self.links[key]: + if c == causal: + return p + assert 0 + + def causal(self, key): + links = self.links[key] + if len(links) == 1: + return links[0][1] + choices = [] + rule2cause = {} + for p, c in links: + rule = c[2] + choices.append(rule) + rule2cause[rule] = c + return rule2cause[self.ambiguity(choices)] + + def deriveEpsilon(self, nt): + if len(self.newrules[nt]) > 1: + rule = self.ambiguity(self.newrules[nt]) + else: + rule = self.newrules[nt][0] + #print rule + + rhs = rule[1] + attr = [None] * len(rhs) + + for i in range(len(rhs)-1, -1, -1): + attr[i] = self.deriveEpsilon(rhs[i]) + return self.rule2func[self.new2old[rule]](attr) + + def buildTree(self, nt, item, tokens, k): + state, parent = item + + choices = [] + for rule in self.states[state].complete: + if rule[0] == nt: + choices.append(rule) + rule = choices[0] + if len(choices) > 1: + rule = self.ambiguity(choices) + #print rule + + rhs = rule[1] + attr = [None] * len(rhs) + + for i in range(len(rhs)-1, -1, -1): + sym = rhs[i] + if not self.newrules.has_key(sym): + if sym != self._BOF: + attr[i] = tokens[k-1] + key = (item, k) + item, k = self.predecessor(key, None) + #elif self.isnullable(sym): + elif self._NULLABLE == sym[0:len(self._NULLABLE)]: + attr[i] = self.deriveEpsilon(sym) + else: + key = (item, k) + why = self.causal(key) + attr[i] = self.buildTree(sym, why[0], + tokens, why[1]) + item, k = self.predecessor(key, why) + return self.rule2func[self.new2old[rule]](attr) + + def ambiguity(self, rules): + # + # XXX - problem here and in collectRules() if the same rule + # appears in >1 method. Also undefined results if rules + # causing the ambiguity appear in the same method. + # + sortlist = [] + name2index = {} + for i in range(len(rules)): + lhs, rhs = rule = rules[i] + name = self.rule2name[self.new2old[rule]] + sortlist.append((len(rhs), name)) + name2index[name] = i + sortlist.sort() + list = map(lambda (a,b): b, sortlist) + return rules[name2index[self.resolve(list)]] + + def resolve(self, list): + # + # Resolve ambiguity in favor of the shortest RHS. + # Since we walk the tree from the top down, this + # should effectively resolve in favor of a "shift". + # + return list[0] # # GenericASTBuilder automagically constructs a concrete/abstract syntax tree @@ -681,32 +681,32 @@ # class GenericASTBuilder(GenericParser): - def __init__(self, AST, start): - GenericParser.__init__(self, start) - self.AST = AST - - def preprocess(self, rule, func): - rebind = lambda lhs, self=self: \ - lambda args, lhs=lhs, self=self: \ - self.buildASTNode(args, lhs) - lhs, rhs = rule - return rule, rebind(lhs) - - def buildASTNode(self, args, lhs): - children = [] - for arg in args: - if isinstance(arg, self.AST): - children.append(arg) - else: - children.append(self.terminal(arg)) - return self.nonterminal(lhs, children) - - def terminal(self, token): return token - - def nonterminal(self, type, args): - rv = self.AST(type) - rv[:len(args)] = args - return rv + def __init__(self, AST, start): + GenericParser.__init__(self, start) + self.AST = AST + + def preprocess(self, rule, func): + rebind = lambda lhs, self=self: \ + lambda args, lhs=lhs, self=self: \ + self.buildASTNode(args, lhs) + lhs, rhs = rule + return rule, rebind(lhs) + + def buildASTNode(self, args, lhs): + children = [] + for arg in args: + if isinstance(arg, self.AST): + children.append(arg) + else: + children.append(self.terminal(arg)) + return self.nonterminal(lhs, children) + + def terminal(self, token): return token + + def nonterminal(self, type, args): + rv = self.AST(type) + rv[:len(args)] = args + return rv # # GenericASTTraversal is a Visitor pattern according to Design Patterns. For @@ -719,57 +719,57 @@ # class GenericASTTraversalPruningException: - pass + pass class GenericASTTraversal: - def __init__(self, ast): - self.ast = ast + def __init__(self, ast): + self.ast = ast - def typestring(self, node): - return node.type + def typestring(self, node): + return node.type - def prune(self): - raise GenericASTTraversalPruningException + def prune(self): + raise GenericASTTraversalPruningException - def preorder(self, node=None): - if node is None: - node = self.ast - - try: - name = 'n_' + self.typestring(node) - if hasattr(self, name): - func = getattr(self, name) - func(node) - else: - self.default(node) - except GenericASTTraversalPruningException: - return - - for kid in node: - self.preorder(kid) - - name = name + '_exit' - if hasattr(self, name): - func = getattr(self, name) - func(node) - - def postorder(self, node=None): - if node is None: - node = self.ast - - for kid in node: - self.postorder(kid) - - name = 'n_' + self.typestring(node) - if hasattr(self, name): - func = getattr(self, name) - func(node) - else: - self.default(node) + def preorder(self, node=None): + if node is None: + node = self.ast + + try: + name = 'n_' + self.typestring(node) + if hasattr(self, name): + func = getattr(self, name) + func(node) + else: + self.default(node) + except GenericASTTraversalPruningException: + return + + for kid in node: + self.preorder(kid) + + name = name + '_exit' + if hasattr(self, name): + func = getattr(self, name) + func(node) + + def postorder(self, node=None): + if node is None: + node = self.ast + + for kid in node: + self.postorder(kid) + + name = 'n_' + self.typestring(node) + if hasattr(self, name): + func = getattr(self, name) + func(node) + else: + self.default(node) - def default(self, node): - pass + def default(self, node): + pass # # GenericASTMatcher. AST nodes must have "__getitem__" and "__cmp__" @@ -779,62 +779,62 @@ # class GenericASTMatcher(GenericParser): - def __init__(self, start, ast): - GenericParser.__init__(self, start) - self.ast = ast - - def preprocess(self, rule, func): - rebind = lambda func, self=self: \ - lambda args, func=func, self=self: \ - self.foundMatch(args, func) - lhs, rhs = rule - rhslist = list(rhs) - rhslist.reverse() - - return (lhs, tuple(rhslist)), rebind(func) - - def foundMatch(self, args, func): - func(args[-1]) - return args[-1] - - def match_r(self, node): - self.input.insert(0, node) - children = 0 - - for child in node: - if children == 0: - self.input.insert(0, '(') - children = children + 1 - self.match_r(child) - - if children > 0: - self.input.insert(0, ')') - - def match(self, ast=None): - if ast is None: - ast = self.ast - self.input = [] - - self.match_r(ast) - self.parse(self.input) - - def resolve(self, list): - # - # Resolve ambiguity in favor of the longest RHS. - # - return list[-1] + def __init__(self, start, ast): + GenericParser.__init__(self, start) + self.ast = ast + + def preprocess(self, rule, func): + rebind = lambda func, self=self: \ + lambda args, func=func, self=self: \ + self.foundMatch(args, func) + lhs, rhs = rule + rhslist = list(rhs) + rhslist.reverse() + + return (lhs, tuple(rhslist)), rebind(func) + + def foundMatch(self, args, func): + func(args[-1]) + return args[-1] + + def match_r(self, node): + self.input.insert(0, node) + children = 0 + + for child in node: + if children == 0: + self.input.insert(0, '(') + children = children + 1 + self.match_r(child) + + if children > 0: + self.input.insert(0, ')') + + def match(self, ast=None): + if ast is None: + ast = self.ast + self.input = [] + + self.match_r(ast) + self.parse(self.input) + + def resolve(self, list): + # + # Resolve ambiguity in favor of the longest RHS. + # + return list[-1] def _dump(tokens, sets, states): - for i in range(len(sets)): - print 'set', i - for item in sets[i]: - print '\t', item - for (lhs, rhs), pos in states[item[0]].items: - print '\t\t', lhs, '::=', - print string.join(rhs[:pos]), - print '.', - print string.join(rhs[pos:]) - if i < len(tokens): - print - print 'token', str(tokens[i]) - print + for i in range(len(sets)): + print 'set', i + for item in sets[i]: + print '\t', item + for (lhs, rhs), pos in states[item[0]].items: + print '\t\t', lhs, '::=', + print string.join(rhs[:pos]), + print '.', + print string.join(rhs[pos:]) + if i < len(tokens): + print + print 'token', str(tokens[i]) + print Modified: python/trunk/Tools/bgen/bgen/bgenGenerator.py ============================================================================== --- python/trunk/Tools/bgen/bgen/bgenGenerator.py (original) +++ python/trunk/Tools/bgen/bgen/bgenGenerator.py Mon Dec 26 00:18:31 2005 @@ -218,10 +218,10 @@ def beginallowthreads(self): pass - + def endallowthreads(self): pass - + def callit(self): args = "" s = "%s%s(" % (self.getrvforcallit(), self.callname) Modified: python/trunk/Tools/bgen/bgen/bgenHeapBuffer.py ============================================================================== --- python/trunk/Tools/bgen/bgen/bgenHeapBuffer.py (original) +++ python/trunk/Tools/bgen/bgen/bgenHeapBuffer.py Mon Dec 26 00:18:31 2005 @@ -111,10 +111,10 @@ def passOutput(self, name): return "%s__out__, %s__len__, &%s__len__" % (name, name, name) - + class MallocHeapOutputBufferType(HeapOutputBufferType): """Output buffer allocated by the called function -- passed as (&buffer, &size). - + Instantiate without parameters. Call from Python without parameters. """ @@ -124,7 +124,7 @@ def getAuxDeclarations(self, name): return [] - + def passOutput(self, name): return "&%s__out__, &%s__len__" % (name, name) @@ -133,10 +133,9 @@ def getargsArgs(self, name): return None - + def mkvalueFormat(self): return "z#" - + def cleanup(self, name): Output("if( %s__out__ ) free(%s__out__);", name, name) - Modified: python/trunk/Tools/compiler/dumppyc.py ============================================================================== --- python/trunk/Tools/compiler/dumppyc.py (original) +++ python/trunk/Tools/compiler/dumppyc.py Mon Dec 26 00:18:31 2005 @@ -43,5 +43,5 @@ buf = open(filename).read() co = compile(buf, filename, "exec") walk(co) - else: + else: load(filename, codename) Modified: python/trunk/Tools/unicode/gencodec.py ============================================================================== --- python/trunk/Tools/unicode/gencodec.py (original) +++ python/trunk/Tools/unicode/gencodec.py Mon Dec 26 00:18:31 2005 @@ -295,8 +295,8 @@ else: l.append('''\ return codecs.charmap_decode(input,errors,decoding_map)''') - - l.append(''' + + l.append(''' class StreamWriter(Codec,codecs.StreamWriter): pass @@ -330,7 +330,7 @@ # Final new-line l.append('\n') - + return '\n'.join(l) def pymap(name,map,pyfile,comments=1): From python-checkins at python.org Mon Dec 26 17:53:16 2005 From: python-checkins at python.org (tim.peters) Date: Mon, 26 Dec 2005 17:53:16 +0100 (CET) Subject: [Python-checkins] commit of r41813 - python/trunk/PCbuild/pcbuild.sln Message-ID: <20051226165316.61AD31E4002@bag.python.org> Author: tim.peters Date: Mon Dec 26 17:53:15 2005 New Revision: 41813 Modified: python/trunk/PCbuild/pcbuild.sln Log: As reported on c.l.py, the _elementtree project should depend on the pythoncore project. Modified: python/trunk/PCbuild/pcbuild.sln ============================================================================== Binary files. No diff available. From python-checkins at python.org Mon Dec 26 19:06:17 2005 From: python-checkins at python.org (armin.rigo) Date: Mon, 26 Dec 2005 19:06:17 +0100 (CET) Subject: [Python-checkins] commit of r41814 - python/trunk/Doc/ref/ref3.tex Message-ID: <20051226180617.EA9241E4002@bag.python.org> Author: armin.rigo Date: Mon Dec 26 19:06:17 2005 New Revision: 41814 Modified: python/trunk/Doc/ref/ref3.tex Log: Updating the short blob about old/new-style classes to reflect (IMHO) more precisely the motivation and the differences. Added links to www.python.org/doc/newstyle.html and a footnote to warn against the statement "x[i] is equivalent to x.__getitem__(i)", which already caused many invalid bug reports on SF. Modified: python/trunk/Doc/ref/ref3.tex ============================================================================== --- python/trunk/Doc/ref/ref3.tex (original) +++ python/trunk/Doc/ref/ref3.tex Mon Dec 26 19:06:17 2005 @@ -24,7 +24,8 @@ object's type, under certain controlled conditions. Until this manual undergoes extensive revision, it must now be taken as authoritative only regarding ``classic classes'', that are still the default, for -compatibility purposes, in Python 2.2 and 2.3.} +compatibility purposes, in Python 2.2 and 2.3. For more information, +see \url{http://www.python.org/doc/newstyle.html}.} An object's type determines the operations that the object supports (e.g., ``does it have a length?'') and also defines the possible values for objects of that type. The @@ -1036,14 +1037,39 @@ Classes and instances come in two flavours: old-style or classic, and new-style. -Old-style classes were the only flavour of class available before Python 2.1. While they supported multiple inheritance, the rules for resolving names were chosen for ease of implementation. These rules turn out to make multiple inheritance hard to use in certain situations. +Up to Python 2.1, old-style classes were the only flavour available to the +user. The concept of (old-style) class is unrelated to the concept of type: if +\var{x} is an instance of an old-style class, then \code{x.__class__} +designates the class of \var{x}, but \code{type(x)} is always \code{}. This reflects the fact that all old-style instances, +independently of their class, are implemented with a single built-in type, +called \code{instance}. + +New-style classes were introduced in Python 2.2 to unify classes and types. A +new-style class neither more nor less than a user-defined type. If \var{x} is +an instance of a new-style class, then \code{type(x)} is the same as +\code{x.__class__}. + +The major motivation for introducing new-style classes is to provide a unified +object model with a full meta-model. It also has a number of immediate +benefits, like the ability to subclass most built-in types, or the introduction +of "descriptors", which enable computed properties. + +For compatibility reasons, classes are still old-style by default. New-style +classes are created by specifying another new-style class (i.e.\ a type) as a +parent class, or the "top-level type" \class{object} if no other parent is +needed. The behaviour of new-style classes differs from that of old-style +classes in a number of important details in addition to what \function{type} +returns. Some of these changes are fundamental to the new object model, like +the way special methods are invoked. Others are "fixes" that could not be +implemented before for compatibility concerns, like the method resolution order +in case of multiple inheritance. -New-style classes were introduced in Python 2.1, and change the method resolution order to make multiple inheritance more usable. +This manuel is not up-to-date with respect to new-style classes. For now, +please see \url{http://www.python.org/doc/newstyle.html} for more information. The plan is to eventually drop old-style classes, leaving only the semantics of new-style classes. This change will probably only be feasible in Python 3.0. - - %========================================================================= \section{Special method names\label{specialnames}} @@ -1054,7 +1080,9 @@ classes to define their own behavior with respect to language operators. For instance, if a class defines a method named \method{__getitem__()}, and \code{x} is an instance of -this class, then \code{x[i]} is equivalent to +this class, then \code{x[i]} is equivalent\footnote{This, and other +statements, are only roughly true for instances of new-style +classes.} to \code{x.__getitem__(i)}. Except where mentioned, attempts to execute an operation raise an exception when no appropriate method is defined. \withsubitem{(mapping object method)}{\ttindex{__getitem__()}} From python-checkins at python.org Mon Dec 26 20:21:42 2005 From: python-checkins at python.org (phillip.eby) Date: Mon, 26 Dec 2005 20:21:42 +0100 (CET) Subject: [Python-checkins] commit of r41815 - sandbox/trunk/setuptools/setuptools/command/easy_install.py sandbox/trunk/setuptools/setuptools/command/install_scripts.py Message-ID: <20051226192142.2E21C1E4002@bag.python.org> Author: phillip.eby Date: Mon Dec 26 20:21:41 2005 New Revision: 41815 Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py sandbox/trunk/setuptools/setuptools/command/install_scripts.py Log: Make the install_scripts command respect the "build_scripts -e" option when installing generated scripts using the --single-version-externally-managed option. Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Mon Dec 26 20:21:41 2005 @@ -9,7 +9,6 @@ __ http://peak.telecommunity.com/DevCenter/EasyInstall """ - import sys, os.path, zipimport, shutil, tempfile, zipfile, re, stat from glob import glob from setuptools import Command @@ -23,6 +22,7 @@ from setuptools.package_index import URL_SCHEME from setuptools.command import bdist_egg, egg_info from pkg_resources import * +sys_executable = os.path.normpath(sys.executable) __all__ = [ 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', @@ -1118,7 +1118,7 @@ Environment.remove(self,dist) -def get_script_header(script_text): +def get_script_header(script_text, executable=sys_executable): """Create a #! line, getting options (if any) from script_text""" from distutils.command.build_scripts import first_line_re first, rest = (script_text+'\n').split('\n',1) @@ -1129,7 +1129,6 @@ options = match.group(1) or '' if options: options = ' '+options - executable = os.path.normpath(sys.executable) return "#!%(executable)s%(options)s\n" % locals() def main(argv=None, **kw): @@ -1146,10 +1145,11 @@ exc = sys.exc_info() raise exc[0], (exc[1][0], exc[1][1] + (" %s %s" % (func,arg))) -def get_script_args(dist): + +def get_script_args(dist, executable=sys_executable): """Yield write_script() argument tuples for a distribution's entrypoints""" spec = str(dist.as_requirement()) - header = get_script_header("") + header = get_script_header("", executable) for group in 'console_scripts', 'gui_scripts': for name,ep in dist.get_entry_map(group).items(): script_text = ( Modified: sandbox/trunk/setuptools/setuptools/command/install_scripts.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install_scripts.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install_scripts.py Mon Dec 26 20:21:41 2005 @@ -1,6 +1,6 @@ from distutils.command.install_scripts import install_scripts \ as _install_scripts -from easy_install import get_script_args +from easy_install import get_script_args, sys_executable from pkg_resources import Distribution, PathMetadata, ensure_directory import os from distutils import log @@ -19,12 +19,12 @@ ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), ei_cmd.egg_name, ei_cmd.egg_version, ) - for args in get_script_args(dist): - self.write_script(*args) + bs_cmd = self.get_finalized_command('build_scripts') + executable = getattr(bs_cmd,'executable',sys_executable) + for args in get_script_args(dist, executable): self.write_script(*args) def write_script(self, script_name, contents, mode="t", *ignored): """Write an executable file to the scripts directory""" - log.info("Installing %s script to %s", script_name, self.install_dir) target = os.path.join(self.install_dir, script_name) self.outfiles.append(target) From python-checkins at python.org Mon Dec 26 23:53:57 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Mon, 26 Dec 2005 23:53:57 +0100 (CET) Subject: [Python-checkins] commit of r41816 - in python/trunk/Lib: macurl2path.py nturl2path.py plat-riscos/rourl2path.py urllib.py Message-ID: <20051226225357.A11BD1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Mon Dec 26 23:53:56 2005 New Revision: 41816 Modified: python/trunk/Lib/macurl2path.py python/trunk/Lib/nturl2path.py python/trunk/Lib/plat-riscos/rourl2path.py python/trunk/Lib/urllib.py Log: Bug #649974: make docstrings for url2pathname consistent Modified: python/trunk/Lib/macurl2path.py ============================================================================== --- python/trunk/Lib/macurl2path.py (original) +++ python/trunk/Lib/macurl2path.py Mon Dec 26 23:53:56 2005 @@ -8,7 +8,8 @@ __all__ = ["url2pathname","pathname2url"] def url2pathname(pathname): - "Convert /-delimited pathname to mac pathname" + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" # # XXXX The .. handling should be fixed... # @@ -49,7 +50,8 @@ return urllib.unquote(rv) def pathname2url(pathname): - "convert mac pathname to /-delimited pathname" + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" if '/' in pathname: raise RuntimeError, "Cannot convert pathname containing slashes" components = pathname.split(':') Modified: python/trunk/Lib/nturl2path.py ============================================================================== --- python/trunk/Lib/nturl2path.py (original) +++ python/trunk/Lib/nturl2path.py Mon Dec 26 23:53:56 2005 @@ -1,14 +1,12 @@ """Convert a NT pathname to a file URL and vice versa.""" def url2pathname(url): - r"""Convert a URL to a DOS path. - - ///C|/foo/bar/spam.foo - - becomes - - C:\foo\bar\spam.foo - """ + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" + # e.g. + # ///C|/foo/bar/spam.foo + # becomes + # C:\foo\bar\spam.foo import string, urllib # Windows itself uses ":" even in URLs. url = url.replace(':', '|') @@ -35,15 +33,12 @@ return path def pathname2url(p): - r"""Convert a DOS path name to a file url. - - C:\foo\bar\spam.foo - - becomes - - ///C|/foo/bar/spam.foo - """ - + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" + # e.g. + # C:\foo\bar\spam.foo + # becomes + # ///C|/foo/bar/spam.foo import urllib if not ':' in p: # No drive specifier, just convert slashes and quote the name Modified: python/trunk/Lib/plat-riscos/rourl2path.py ============================================================================== --- python/trunk/Lib/plat-riscos/rourl2path.py (original) +++ python/trunk/Lib/plat-riscos/rourl2path.py Mon Dec 26 23:53:56 2005 @@ -11,7 +11,8 @@ __slash_dot = string.maketrans("/.", "./") def url2pathname(url): - "Convert URL to a RISC OS path." + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" tp = urllib.splittype(url)[0] if tp and tp <> 'file': raise RuntimeError, 'Cannot convert non-local URL to pathname' @@ -46,7 +47,8 @@ return '.'.join(components) def pathname2url(pathname): - "Convert a RISC OS path name to a file url." + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" return urllib.quote('///' + pathname.translate(__slash_dot), "/$:") def test(): Modified: python/trunk/Lib/urllib.py ============================================================================== --- python/trunk/Lib/urllib.py (original) +++ python/trunk/Lib/urllib.py Mon Dec 26 23:53:56 2005 @@ -50,8 +50,13 @@ from rourl2path import url2pathname, pathname2url else: def url2pathname(pathname): + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" return unquote(pathname) + def pathname2url(pathname): + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" return quote(pathname) # This really consists of two pieces: From python-checkins at python.org Mon Dec 26 23:54:02 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Mon, 26 Dec 2005 23:54:02 +0100 (CET) Subject: [Python-checkins] commit of r41817 - in python/branches/release24-maint/Lib: macurl2path.py nturl2path.py plat-riscos/rourl2path.py urllib.py Message-ID: <20051226225402.60E3F1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Mon Dec 26 23:54:01 2005 New Revision: 41817 Modified: python/branches/release24-maint/Lib/macurl2path.py python/branches/release24-maint/Lib/nturl2path.py python/branches/release24-maint/Lib/plat-riscos/rourl2path.py python/branches/release24-maint/Lib/urllib.py Log: Bug #649974 (backport): make docstrings for url2pathname consistent Modified: python/branches/release24-maint/Lib/macurl2path.py ============================================================================== --- python/branches/release24-maint/Lib/macurl2path.py (original) +++ python/branches/release24-maint/Lib/macurl2path.py Mon Dec 26 23:54:01 2005 @@ -8,7 +8,8 @@ __all__ = ["url2pathname","pathname2url"] def url2pathname(pathname): - "Convert /-delimited pathname to mac pathname" + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" # # XXXX The .. handling should be fixed... # @@ -49,7 +50,8 @@ return urllib.unquote(rv) def pathname2url(pathname): - "convert mac pathname to /-delimited pathname" + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" if '/' in pathname: raise RuntimeError, "Cannot convert pathname containing slashes" components = pathname.split(':') Modified: python/branches/release24-maint/Lib/nturl2path.py ============================================================================== --- python/branches/release24-maint/Lib/nturl2path.py (original) +++ python/branches/release24-maint/Lib/nturl2path.py Mon Dec 26 23:54:01 2005 @@ -1,14 +1,12 @@ """Convert a NT pathname to a file URL and vice versa.""" def url2pathname(url): - r"""Convert a URL to a DOS path. - - ///C|/foo/bar/spam.foo - - becomes - - C:\foo\bar\spam.foo - """ + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" + # e.g. + # ///C|/foo/bar/spam.foo + # becomes + # C:\foo\bar\spam.foo import string, urllib # Windows itself uses ":" even in URLs. url = url.replace(':', '|') @@ -35,15 +33,12 @@ return path def pathname2url(p): - r"""Convert a DOS path name to a file url. - - C:\foo\bar\spam.foo - - becomes - - ///C|/foo/bar/spam.foo - """ - + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" + # e.g. + # C:\foo\bar\spam.foo + # becomes + # ///C|/foo/bar/spam.foo import urllib if not ':' in p: # No drive specifier, just convert slashes and quote the name Modified: python/branches/release24-maint/Lib/plat-riscos/rourl2path.py ============================================================================== --- python/branches/release24-maint/Lib/plat-riscos/rourl2path.py (original) +++ python/branches/release24-maint/Lib/plat-riscos/rourl2path.py Mon Dec 26 23:54:01 2005 @@ -11,7 +11,8 @@ __slash_dot = string.maketrans("/.", "./") def url2pathname(url): - "Convert URL to a RISC OS path." + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" tp = urllib.splittype(url)[0] if tp and tp <> 'file': raise RuntimeError, 'Cannot convert non-local URL to pathname' @@ -46,7 +47,8 @@ return '.'.join(components) def pathname2url(pathname): - "Convert a RISC OS path name to a file url." + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" return urllib.quote('///' + pathname.translate(__slash_dot), "/$:") def test(): Modified: python/branches/release24-maint/Lib/urllib.py ============================================================================== --- python/branches/release24-maint/Lib/urllib.py (original) +++ python/branches/release24-maint/Lib/urllib.py Mon Dec 26 23:54:01 2005 @@ -50,8 +50,13 @@ from rourl2path import url2pathname, pathname2url else: def url2pathname(pathname): + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" return unquote(pathname) + def pathname2url(pathname): + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" return quote(pathname) # This really consists of two pieces: From python-checkins at python.org Tue Dec 27 00:07:46 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:07:46 +0100 (CET) Subject: [Python-checkins] commit of r41818 - python/trunk/Doc/lib/libsocket.tex Message-ID: <20051226230746.BC02C1E4015@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:07:46 2005 New Revision: 41818 Modified: python/trunk/Doc/lib/libsocket.tex Log: Bug #756104: document that bufsize in socket.recv() should be small Modified: python/trunk/Doc/lib/libsocket.tex ============================================================================== --- python/trunk/Doc/lib/libsocket.tex (original) +++ python/trunk/Doc/lib/libsocket.tex Tue Dec 27 00:07:46 2005 @@ -557,6 +557,8 @@ at once is specified by \var{bufsize}. See the \UNIX{} manual page \manpage{recv}{2} for the meaning of the optional argument \var{flags}; it defaults to zero. +\note{For best match with hardware and network realities, the value of +\var{bufsize} should be a relatively small power of 2, for example, 4096.} \end{methoddesc} \begin{methoddesc}[socket]{recvfrom}{bufsize\optional{, flags}} From python-checkins at python.org Tue Dec 27 00:07:52 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:07:52 +0100 (CET) Subject: [Python-checkins] commit of r41819 - python/branches/release24-maint/Doc/lib/libsocket.tex Message-ID: <20051226230752.C191E1E402B@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:07:52 2005 New Revision: 41819 Modified: python/branches/release24-maint/Doc/lib/libsocket.tex Log: Bug #756104 (backport): document that bufsize in socket.recv() should be small Modified: python/branches/release24-maint/Doc/lib/libsocket.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libsocket.tex (original) +++ python/branches/release24-maint/Doc/lib/libsocket.tex Tue Dec 27 00:07:52 2005 @@ -557,6 +557,8 @@ at once is specified by \var{bufsize}. See the \UNIX{} manual page \manpage{recv}{2} for the meaning of the optional argument \var{flags}; it defaults to zero. +\note{For best match with hardware and network realities, the value of +\var{bufsize} should be a relatively small power of 2, for example, 4096.} \end{methoddesc} \begin{methoddesc}[socket]{recvfrom}{bufsize\optional{, flags}} From python-checkins at python.org Tue Dec 27 00:15:48 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:15:48 +0100 (CET) Subject: [Python-checkins] commit of r41820 - python/trunk/Doc/ref/ref5.tex Message-ID: <20051226231548.D28FD1E4036@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:15:48 2005 New Revision: 41820 Modified: python/trunk/Doc/ref/ref5.tex Log: Bug #839585: mention % string operator in language ref Modified: python/trunk/Doc/ref/ref5.tex ============================================================================== --- python/trunk/Doc/ref/ref5.tex (original) +++ python/trunk/Doc/ref/ref5.tex Tue Dec 27 00:15:48 2005 @@ -777,6 +777,12 @@ * y + x \%{} y} be very close to \code{x}. }. +In addition to performing the modulo operation on numbers, the \code{\%} +operator is also overloaded by string and unicode objects to perform +string formatting (also known as interpolation). The syntax for string +formatting is described in the Python Library Reference, section +``Sequence Types''. + \deprecated{2.3}{The floor division operator, the modulo operator, and the \function{divmod()} function are no longer defined for complex numbers. Instead, convert to a floating point number using the From python-checkins at python.org Tue Dec 27 00:15:51 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:15:51 +0100 (CET) Subject: [Python-checkins] commit of r41821 - python/branches/release24-maint/Doc/ref/ref5.tex Message-ID: <20051226231551.3DD2E1E4026@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:15:50 2005 New Revision: 41821 Modified: python/branches/release24-maint/Doc/ref/ref5.tex Log: Bug #839585: mention % string operator in language ref (backport) Modified: python/branches/release24-maint/Doc/ref/ref5.tex ============================================================================== --- python/branches/release24-maint/Doc/ref/ref5.tex (original) +++ python/branches/release24-maint/Doc/ref/ref5.tex Tue Dec 27 00:15:50 2005 @@ -777,6 +777,12 @@ * y + x \%{} y} be very close to \code{x}. }. +In addition to performing the modulo operation on numbers, the \code{\%} +operator is also overloaded by string and unicode objects to perform +string formatting (also known as interpolation). The syntax for string +formatting is described in the Python Library Reference, section +``Sequence Types''. + \deprecated{2.3}{The floor division operator, the modulo operator, and the \function{divmod()} function are no longer defined for complex numbers. Instead, convert to a floating point number using the From python-checkins at python.org Tue Dec 27 00:27:52 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:27:52 +0100 (CET) Subject: [Python-checkins] commit of r41822 - python/trunk/Doc/lib/libpickle.tex Message-ID: <20051226232752.ED7501E4009@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:27:49 2005 New Revision: 41822 Modified: python/trunk/Doc/lib/libpickle.tex Log: Bug #839075: document that highly recursive data cannot be pickled Modified: python/trunk/Doc/lib/libpickle.tex ============================================================================== --- python/trunk/Doc/lib/libpickle.tex (original) +++ python/trunk/Doc/lib/libpickle.tex Tue Dec 27 00:27:49 2005 @@ -372,6 +372,10 @@ Attempts to pickle unpicklable objects will raise the \exception{PicklingError} exception; when this happens, an unspecified number of bytes may have already been written to the underlying file. +Trying to pickle a highly recursive data structure may exceed the +maximum recursion depth, a \exception{RuntimeError} will be raised +in this case. You can carefully raise this limit with +\function{sys.setrecursionlimit()}. Note that functions (built-in and user-defined) are pickled by ``fully qualified'' name reference, not by value. This means that only the From python-checkins at python.org Tue Dec 27 00:27:53 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:27:53 +0100 (CET) Subject: [Python-checkins] commit of r41823 - python/branches/release24-maint/Doc/lib/libpickle.tex Message-ID: <20051226232753.1DC921E400A@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:27:50 2005 New Revision: 41823 Modified: python/branches/release24-maint/Doc/lib/libpickle.tex Log: Bug #839075 (backport): document that highly recursive data cannot be pickled Modified: python/branches/release24-maint/Doc/lib/libpickle.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libpickle.tex (original) +++ python/branches/release24-maint/Doc/lib/libpickle.tex Tue Dec 27 00:27:50 2005 @@ -395,6 +395,10 @@ Attempts to pickle unpicklable objects will raise the \exception{PicklingError} exception; when this happens, an unspecified number of bytes may have already been written to the underlying file. +Trying to pickle a highly recursive data structure may exceed the +maximum recursion depth, a \exception{RuntimeError} will be raised +in this case. You can carefully raise this limit with +\function{sys.setrecursionlimit()}. Note that functions (built-in and user-defined) are pickled by ``fully qualified'' name reference, not by value. This means that only the From python-checkins at python.org Tue Dec 27 00:36:33 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:36:33 +0100 (CET) Subject: [Python-checkins] commit of r41824 - python/trunk/Doc/lib/liburllib2.tex Message-ID: <20051226233633.26E7E1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:36:32 2005 New Revision: 41824 Modified: python/trunk/Doc/lib/liburllib2.tex Log: Bug #954981: urllib2 example wont work w/o ssl Modified: python/trunk/Doc/lib/liburllib2.tex ============================================================================== --- python/trunk/Doc/lib/liburllib2.tex (original) +++ python/trunk/Doc/lib/liburllib2.tex Tue Dec 27 00:36:32 2005 @@ -782,7 +782,8 @@ \end{verbatim} Here we are sending a data-stream to the stdin of a CGI and reading -the data it returns to us: +the data it returns to us. Note that this example will only work when the +Python installation supports SSL. \begin{verbatim} >>> import urllib2 From python-checkins at python.org Tue Dec 27 00:36:50 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:36:50 +0100 (CET) Subject: [Python-checkins] commit of r41825 - python/branches/release24-maint/Doc/lib/liburllib2.tex Message-ID: <20051226233650.36CB21E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:36:49 2005 New Revision: 41825 Modified: python/branches/release24-maint/Doc/lib/liburllib2.tex Log: Bug #954981: urllib2 example wont work w/o ssl (backport) Modified: python/branches/release24-maint/Doc/lib/liburllib2.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/liburllib2.tex (original) +++ python/branches/release24-maint/Doc/lib/liburllib2.tex Tue Dec 27 00:36:49 2005 @@ -771,7 +771,8 @@ \end{verbatim} Here we are sending a data-stream to the stdin of a CGI and reading -the data it returns to us: +the data it returns to us. Note that this example will only work when the +Python installation supports SSL. \begin{verbatim} >>> import urllib2 From python-checkins at python.org Tue Dec 27 00:44:30 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:44:30 +0100 (CET) Subject: [Python-checkins] commit of r41826 - python/trunk/Doc/lib/libprofile.tex Message-ID: <20051226234430.1C6391E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:44:29 2005 New Revision: 41826 Modified: python/trunk/Doc/lib/libprofile.tex Log: Bug #489256: remove note about Python 1.1 profiler Modified: python/trunk/Doc/lib/libprofile.tex ============================================================================== --- python/trunk/Doc/lib/libprofile.tex (original) +++ python/trunk/Doc/lib/libprofile.tex Tue Dec 27 00:44:29 2005 @@ -55,47 +55,47 @@ \index{profiling, deterministic} -\section{How Is This Profiler Different From The Old Profiler?} -\nodename{Profiler Changes} - -(This section is of historical importance only; the old profiler -discussed here was last seen in Python 1.1.) - -The big changes from old profiling module are that you get more -information, and you pay less CPU time. It's not a trade-off, it's a -trade-up. - -To be specific: - -\begin{description} - -\item[Bugs removed:] -Local stack frame is no longer molested, execution time is now charged -to correct functions. - -\item[Accuracy increased:] -Profiler execution time is no longer charged to user's code, -calibration for platform is supported, file reads are not done \emph{by} -profiler \emph{during} profiling (and charged to user's code!). - -\item[Speed increased:] -Overhead CPU cost was reduced by more than a factor of two (perhaps a -factor of five), lightweight profiler module is all that must be -loaded, and the report generating module (\module{pstats}) is not needed -during profiling. - -\item[Recursive functions support:] -Cumulative times in recursive functions are correctly calculated; -recursive entries are counted. - -\item[Large growth in report generating UI:] -Distinct profiles runs can be added together forming a comprehensive -report; functions that import statistics take arbitrary lists of -files; sorting criteria is now based on keywords (instead of 4 integer -options); reports shows what functions were profiled as well as what -profile file was referenced; output format has been improved. - -\end{description} +%\section{How Is This Profiler Different From The Old Profiler?} +%\nodename{Profiler Changes} +% +%(This section is of historical importance only; the old profiler +%discussed here was last seen in Python 1.1.) +% +%The big changes from old profiling module are that you get more +%information, and you pay less CPU time. It's not a trade-off, it's a +%trade-up. +% +%To be specific: +% +%\begin{description} +% +%\item[Bugs removed:] +%Local stack frame is no longer molested, execution time is now charged +%to correct functions. +% +%\item[Accuracy increased:] +%Profiler execution time is no longer charged to user's code, +%calibration for platform is supported, file reads are not done \emph{by} +%profiler \emph{during} profiling (and charged to user's code!). +% +%\item[Speed increased:] +%Overhead CPU cost was reduced by more than a factor of two (perhaps a +%factor of five), lightweight profiler module is all that must be +%loaded, and the report generating module (\module{pstats}) is not needed +%during profiling. +% +%\item[Recursive functions support:] +%Cumulative times in recursive functions are correctly calculated; +%recursive entries are counted. +% +%\item[Large growth in report generating UI:] +%Distinct profiles runs can be added together forming a comprehensive +%report; functions that import statistics take arbitrary lists of +%files; sorting criteria is now based on keywords (instead of 4 integer +%options); reports shows what functions were profiled as well as what +%profile file was referenced; output format has been improved. +% +%\end{description} \section{Instant Users Manual \label{profile-instant}} From python-checkins at python.org Tue Dec 27 00:55:57 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:55:57 +0100 (CET) Subject: [Python-checkins] commit of r41827 - python/trunk/Doc/lib/libstdtypes.tex Message-ID: <20051226235557.8267D1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:55:56 2005 New Revision: 41827 Modified: python/trunk/Doc/lib/libstdtypes.tex Log: Bug #1389673: document correct return value of set methods Modified: python/trunk/Doc/lib/libstdtypes.tex ============================================================================== --- python/trunk/Doc/lib/libstdtypes.tex (original) +++ python/trunk/Doc/lib/libstdtypes.tex Tue Dec 27 00:55:56 2005 @@ -1261,17 +1261,17 @@ \begin{tableiii}{c|c|l}{code}{Operation}{Equivalent}{Result} \lineiii{\var{s}.update(\var{t})} {\var{s} |= \var{t}} - {return set \var{s} with elements added from \var{t}} + {update set \var{s}, adding elements from \var{t}} \lineiii{\var{s}.intersection_update(\var{t})} {\var{s} \&= \var{t}} - {return set \var{s} keeping only elements also found in \var{t}} + {update set \var{s}, keeping only elements found in both \var{s} and \var{t}} \lineiii{\var{s}.difference_update(\var{t})} {\var{s} -= \var{t}} - {return set \var{s} after removing elements found in \var{t}} + {update set \var{s}, removing elements found in \var{t}} \lineiii{\var{s}.symmetric_difference_update(\var{t})} {\var{s} \textasciicircum= \var{t}} - {return set \var{s} with elements from \var{s} or \var{t} - but not both} + {update set \var{s}, keeping only elements found in either \var{s} or \var{t} + but not in both} \hline \lineiii{\var{s}.add(\var{x})}{} From python-checkins at python.org Tue Dec 27 00:56:08 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 00:56:08 +0100 (CET) Subject: [Python-checkins] commit of r41828 - python/branches/release24-maint/Doc/lib/libstdtypes.tex Message-ID: <20051226235608.82BBA1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 00:56:08 2005 New Revision: 41828 Modified: python/branches/release24-maint/Doc/lib/libstdtypes.tex Log: Bug #1389673: document correct return value of set methods (backport) Modified: python/branches/release24-maint/Doc/lib/libstdtypes.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libstdtypes.tex (original) +++ python/branches/release24-maint/Doc/lib/libstdtypes.tex Tue Dec 27 00:56:08 2005 @@ -1261,17 +1261,17 @@ \begin{tableiii}{c|c|l}{code}{Operation}{Equivalent}{Result} \lineiii{\var{s}.update(\var{t})} {\var{s} |= \var{t}} - {return set \var{s} with elements added from \var{t}} + {update set \var{s}, adding elements from \var{t}} \lineiii{\var{s}.intersection_update(\var{t})} {\var{s} \&= \var{t}} - {return set \var{s} keeping only elements also found in \var{t}} + {update set \var{s}, keeping only elements found in both \var{s} and \var{t}} \lineiii{\var{s}.difference_update(\var{t})} {\var{s} -= \var{t}} - {return set \var{s} after removing elements found in \var{t}} + {update set \var{s}, removing elements found in \var{t}} \lineiii{\var{s}.symmetric_difference_update(\var{t})} {\var{s} \textasciicircum= \var{t}} - {return set \var{s} with elements from \var{s} or \var{t} - but not both} + {update set \var{s}, keeping only elements found in either \var{s} or \var{t} + but not in both} \hline \lineiii{\var{s}.add(\var{x})}{} From python-checkins at python.org Tue Dec 27 01:03:19 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 01:03:19 +0100 (CET) Subject: [Python-checkins] commit of r41829 - python/trunk/Doc/lib/libwinreg.tex Message-ID: <20051227000319.28BAD1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 01:03:18 2005 New Revision: 41829 Modified: python/trunk/Doc/lib/libwinreg.tex Log: Bug #1386675: winreg raises WindowsErrors Modified: python/trunk/Doc/lib/libwinreg.tex ============================================================================== --- python/trunk/Doc/lib/libwinreg.tex (original) +++ python/trunk/Doc/lib/libwinreg.tex Tue Dec 27 01:03:18 2005 @@ -42,7 +42,7 @@ \var{key} is the predefined handle to connect to. The return value is the handle of the opened key. - If the function fails, an \exception{EnvironmentError} exception is + If the function fails, an \exception{WindowsError} exception is raised. \end{funcdesc} @@ -63,7 +63,7 @@ If the key already exists, this function opens the existing key The return value is the handle of the opened key. - If the function fails, an \exception{EnvironmentError} exception is + If the function fails, an \exception{WindowsError} exception is raised. \end{funcdesc} @@ -80,7 +80,7 @@ \emph{This method can not delete keys with subkeys.} If the method succeeds, the entire key, including all of its values, - is removed. If the method fails, an \exception{EnvironmentError} + is removed. If the method fails, an \exception{WindowsError} exception is raised. \end{funcdesc} @@ -106,7 +106,7 @@ The function retrieves the name of one subkey each time it is called. It is typically called repeatedly until an - \exception{EnvironmentError} exception + \exception{WindowsError} exception is raised, indicating, no more values are available. \end{funcdesc} @@ -122,7 +122,7 @@ The function retrieves the name of one subkey each time it is called. It is typically called repeatedly, until an - \exception{EnvironmentError} exception is raised, indicating + \exception{WindowsError} exception is raised, indicating no more values. The result is a tuple of 3 items: @@ -201,7 +201,7 @@ The result is a new handle to the specified key - If the function fails, \exception{EnvironmentError} is raised. + If the function fails, \exception{WindowsError} is raised. \end{funcdesc} From python-checkins at python.org Tue Dec 27 01:03:19 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 01:03:19 +0100 (CET) Subject: [Python-checkins] commit of r41830 - python/branches/release24-maint/Doc/lib/libwinreg.tex Message-ID: <20051227000319.CB3831E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 01:03:19 2005 New Revision: 41830 Modified: python/branches/release24-maint/Doc/lib/libwinreg.tex Log: Bug #1386675: winreg raises WindowsErrors (backport) Modified: python/branches/release24-maint/Doc/lib/libwinreg.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libwinreg.tex (original) +++ python/branches/release24-maint/Doc/lib/libwinreg.tex Tue Dec 27 01:03:19 2005 @@ -42,7 +42,7 @@ \var{key} is the predefined handle to connect to. The return value is the handle of the opened key. - If the function fails, an \exception{EnvironmentError} exception is + If the function fails, an \exception{WindowsError} exception is raised. \end{funcdesc} @@ -63,7 +63,7 @@ If the key already exists, this function opens the existing key The return value is the handle of the opened key. - If the function fails, an \exception{EnvironmentError} exception is + If the function fails, an \exception{WindowsError} exception is raised. \end{funcdesc} @@ -80,7 +80,7 @@ \emph{This method can not delete keys with subkeys.} If the method succeeds, the entire key, including all of its values, - is removed. If the method fails, an \exception{EnvironmentError} + is removed. If the method fails, an \exception{WindowsError} exception is raised. \end{funcdesc} @@ -106,7 +106,7 @@ The function retrieves the name of one subkey each time it is called. It is typically called repeatedly until an - \exception{EnvironmentError} exception + \exception{WindowsError} exception is raised, indicating, no more values are available. \end{funcdesc} @@ -122,7 +122,7 @@ The function retrieves the name of one subkey each time it is called. It is typically called repeatedly, until an - \exception{EnvironmentError} exception is raised, indicating + \exception{WindowsError} exception is raised, indicating no more values. The result is a tuple of 3 items: @@ -201,7 +201,7 @@ The result is a new handle to the specified key - If the function fails, \exception{EnvironmentError} is raised. + If the function fails, \exception{WindowsError} is raised. \end{funcdesc} From python-checkins at python.org Tue Dec 27 01:06:19 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 01:06:19 +0100 (CET) Subject: [Python-checkins] commit of r41831 - python/branches/release24-maint/Doc/tut/tut.tex Message-ID: <20051227000619.1303A1E4007@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 01:06:18 2005 New Revision: 41831 Modified: python/branches/release24-maint/Doc/tut/tut.tex Log: Bug #1375599: Correct grammar error in tutorial Modified: python/branches/release24-maint/Doc/tut/tut.tex ============================================================================== --- python/branches/release24-maint/Doc/tut/tut.tex (original) +++ python/branches/release24-maint/Doc/tut/tut.tex Tue Dec 27 01:06:18 2005 @@ -114,7 +114,7 @@ programs, or to test functions during bottom-up program development. It is also a handy desk calculator. -Python enables programs to written compactly and readably. Programs +Python enables programs to be written compactly and readably. Programs written in Python are typically much shorter than equivalent C or \Cpp{} programs, for several reasons: \begin{itemize} From python-checkins at python.org Tue Dec 27 18:25:35 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 18:25:35 +0100 (CET) Subject: [Python-checkins] commit of r41832 - python/trunk/Doc/lib/libwinreg.tex Message-ID: <20051227172535.4BF591E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 18:25:33 2005 New Revision: 41832 Modified: python/trunk/Doc/lib/libwinreg.tex Log: Revert checkin for bug #1386675. Modified: python/trunk/Doc/lib/libwinreg.tex ============================================================================== --- python/trunk/Doc/lib/libwinreg.tex (original) +++ python/trunk/Doc/lib/libwinreg.tex Tue Dec 27 18:25:33 2005 @@ -42,7 +42,7 @@ \var{key} is the predefined handle to connect to. The return value is the handle of the opened key. - If the function fails, an \exception{WindowsError} exception is + If the function fails, an \exception{EnvironmentError} exception is raised. \end{funcdesc} @@ -63,7 +63,7 @@ If the key already exists, this function opens the existing key The return value is the handle of the opened key. - If the function fails, an \exception{WindowsError} exception is + If the function fails, an \exception{EnvironmentError} exception is raised. \end{funcdesc} @@ -80,7 +80,7 @@ \emph{This method can not delete keys with subkeys.} If the method succeeds, the entire key, including all of its values, - is removed. If the method fails, an \exception{WindowsError} + is removed. If the method fails, an \exception{EnvironmentError} exception is raised. \end{funcdesc} @@ -106,7 +106,7 @@ The function retrieves the name of one subkey each time it is called. It is typically called repeatedly until an - \exception{WindowsError} exception + \exception{EnvironmentError} exception is raised, indicating, no more values are available. \end{funcdesc} @@ -122,7 +122,7 @@ The function retrieves the name of one subkey each time it is called. It is typically called repeatedly, until an - \exception{WindowsError} exception is raised, indicating + \exception{EnvironmentError} exception is raised, indicating no more values. The result is a tuple of 3 items: @@ -201,7 +201,7 @@ The result is a new handle to the specified key - If the function fails, \exception{WindowsError} is raised. + If the function fails, \exception{EnvironmentError} is raised. \end{funcdesc} From python-checkins at python.org Tue Dec 27 18:26:17 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 18:26:17 +0100 (CET) Subject: [Python-checkins] commit of r41833 - python/branches/release24-maint/Doc/lib/libwinreg.tex Message-ID: <20051227172617.13CA91E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 18:26:16 2005 New Revision: 41833 Modified: python/branches/release24-maint/Doc/lib/libwinreg.tex Log: Revert checkin for bug #1386675. Modified: python/branches/release24-maint/Doc/lib/libwinreg.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libwinreg.tex (original) +++ python/branches/release24-maint/Doc/lib/libwinreg.tex Tue Dec 27 18:26:16 2005 @@ -42,7 +42,7 @@ \var{key} is the predefined handle to connect to. The return value is the handle of the opened key. - If the function fails, an \exception{WindowsError} exception is + If the function fails, an \exception{EnvironmentError} exception is raised. \end{funcdesc} @@ -63,7 +63,7 @@ If the key already exists, this function opens the existing key The return value is the handle of the opened key. - If the function fails, an \exception{WindowsError} exception is + If the function fails, an \exception{EnvironmentError} exception is raised. \end{funcdesc} @@ -80,7 +80,7 @@ \emph{This method can not delete keys with subkeys.} If the method succeeds, the entire key, including all of its values, - is removed. If the method fails, an \exception{WindowsError} + is removed. If the method fails, an \exception{EnvironmentError} exception is raised. \end{funcdesc} @@ -106,7 +106,7 @@ The function retrieves the name of one subkey each time it is called. It is typically called repeatedly until an - \exception{WindowsError} exception + \exception{EnvironmentError} exception is raised, indicating, no more values are available. \end{funcdesc} @@ -122,7 +122,7 @@ The function retrieves the name of one subkey each time it is called. It is typically called repeatedly, until an - \exception{WindowsError} exception is raised, indicating + \exception{EnvironmentError} exception is raised, indicating no more values. The result is a tuple of 3 items: @@ -201,7 +201,7 @@ The result is a new handle to the specified key - If the function fails, \exception{WindowsError} is raised. + If the function fails, \exception{EnvironmentError} is raised. \end{funcdesc} From python-checkins at python.org Tue Dec 27 18:37:08 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 18:37:08 +0100 (CET) Subject: [Python-checkins] commit of r41834 - in python/trunk: Misc/NEWS Modules/Setup.dist Message-ID: <20051227173708.38FDA1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 18:37:07 2005 New Revision: 41834 Modified: python/trunk/Misc/NEWS python/trunk/Modules/Setup.dist Log: [ 959576 ] Can't build Python on POSIX w/o $HOME Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Tue Dec 27 18:37:07 2005 @@ -12,6 +12,9 @@ Core and builtins ----------------- +- Bug #959576: The pwd module is now builtin. This allows Python to be + built on UNIX platforms without $HOME set. + - Bug #1072182, fix some potential problems if characters are signed. - Bug #889500, fix line number on SyntaxWarning for global declarations. Modified: python/trunk/Modules/Setup.dist ============================================================================== --- python/trunk/Modules/Setup.dist (original) +++ python/trunk/Modules/Setup.dist Tue Dec 27 18:37:07 2005 @@ -111,6 +111,8 @@ posix posixmodule.c # posix (UNIX) system calls errno errnomodule.c # posix (UNIX) errno values +pwd pwdmodule.c # this is needed to find out the user's home dir + # if $HOME is not set _sre _sre.c # Fredrik Lundh's new regular expressions _codecs _codecsmodule.c # access to the builtin codecs and codec registry @@ -186,7 +188,6 @@ # supported...) #fcntl fcntlmodule.c # fcntl(2) and ioctl(2) -#pwd pwdmodule.c # pwd(3) #spwd spwdmodule.c # spwd(3) #grp grpmodule.c # grp(3) #select selectmodule.c # select(2); not on ancient System V From python-checkins at python.org Tue Dec 27 18:37:17 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 18:37:17 +0100 (CET) Subject: [Python-checkins] commit of r41835 - in python/branches/release24-maint: Misc/NEWS Modules/Setup.dist Message-ID: <20051227173717.20A811E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 18:37:16 2005 New Revision: 41835 Modified: python/branches/release24-maint/Misc/NEWS python/branches/release24-maint/Modules/Setup.dist Log: [ 959576 ] Can't build Python on POSIX w/o $HOME (backport) Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Tue Dec 27 18:37:16 2005 @@ -12,6 +12,9 @@ Core and builtins ----------------- +- Bug #959576: The pwd module is now builtin. This allows Python to be + built on UNIX platforms without $HOME set. + - Bug #1379994: Builtin unicode_escape and raw_unicode_escape codec now encodes backslash correctly. Modified: python/branches/release24-maint/Modules/Setup.dist ============================================================================== --- python/branches/release24-maint/Modules/Setup.dist (original) +++ python/branches/release24-maint/Modules/Setup.dist Tue Dec 27 18:37:16 2005 @@ -111,6 +111,8 @@ posix posixmodule.c # posix (UNIX) system calls errno errnomodule.c # posix (UNIX) errno values +pwd pwdmodule.c # this is needed to find out the user's home dir + # if $HOME is not set _sre _sre.c # Fredrik Lundh's new regular expressions _codecs _codecsmodule.c # access to the builtin codecs and codec registry @@ -186,7 +188,6 @@ # supported...) #fcntl fcntlmodule.c # fcntl(2) and ioctl(2) -#pwd pwdmodule.c # pwd(3) #grp grpmodule.c # grp(3) #select selectmodule.c # select(2); not on ancient System V From mala4000 at bol.com.br Tue Dec 27 18:49:56 2005 From: mala4000 at bol.com.br (Roberta Cunha) Date: Tue, 27 Dec 2005 14:49:56 -0300 Subject: [Python-checkins] Cartas Comerciais Message-ID: <20051227175001.2BD78796F@sankara1.bol.com.br> Cartas Comerciais. Modelos prontos de cartas e e-mails comerciais. Visite o site: http://www.gueb.de/cartascomerciais Cartas Comerciais, E veja alguns dos modelos abaixo: http://www.gueb.de/cartascomerciais * Agradecimentos e condol?ncias * Atestados e Declara??es * Cartas de Cobran?as * Cartas de Reclama??o * Cartas em Ingl?s * Comunicados e Avisos * Convites * Documentos * Emprego * Propostas * Solicita??es e pedidos * Viagem Cartas Comerciais Procura??o Carta de Recomenda??o Convite para Exposi??o ou Feira Cartas Comerciais AGRADECIMENTOS E CONDOL?NCIAS ? Agradecimento de convite e felicita??es; ? Agradecimento e convite para solenidade; ? Agradecimento de mensagem de p?sames; ? Agradecimento de pedido; ? Agradecimento e boas vindas a cliente novo; ? Agradecimento por mensagem de felicita??o; ? Confraterniza??o; ? Congratula??es; ? Cumprimentos por resultados comerciais; ? Felicita??es pessoais; ? P?sames; ? Votos de boas festas Voltar ao topo http://www.gueb.de/cartascomerciais CARTAS DE RECLAMA??O Cartas Comerciais ? Reclama??o de compra de produto; ? Reclama??o por atraso; ? Reclama??o por aumento de pre?o; ? Reclama??o por defici?ncia t?cnica; ? Reclama??o por demora na entrega; ? Reclama??o por diverg?ncia; ? Respostas a reclama??es; Voltar ao topo COMUNICADOS E AVISOS ? Advert?ncia a funcion?rio; ? Aviso de aumento de pre?os; ? Aviso de incorpora??o da empresa; ? Aviso de lan?amento de produto e servi?o; ? Aviso de mudan?a de endere?o; ? Aviso de ocorr?ncia de acidente; ? Aviso de t?rmino de contrato; ? Aviso gen?rico; ? Comunica??o de atraso no envio de mercadorias; ? Comunica??o de devolu??o de duplicata; ? Comunica??o de devolu??o de mercadoria; ? Comunica??o de envio de mercadorias; ? Comunica??o de envio de parte do pedido; ? Comunica??o de extravio de mercadorias; ? Comunica??o de f?rias coletivas; ? Comunica??o de liquida??o de d?bito; ? Comunica??o de novo servi?o de televendas; ? Comunica??o de reuni?o; ? Confirma??o de pedido; ? Resposta ao comunicado de reuni?o; Voltar ao topo Cartas Comerciais http://www.gueb.de/cartascomerciais EMPREGO ? Aviso pr?vio de dispensa de empregado: 1, 2, e 3; ? Carta de recomenda??o; ? Pedido de demiss?o: 1 e 2; ? Solicita??o de emprego: 1, 2 e 3; ? Solicita??o de est?gio; Voltar ao topo Cartas Comerciais ATESTADOS E DECLARA??ES ? Atestado de bons antecedentes; ? Atestado m?dico; ? Declara??o negativa de v?nculo empregat?cio; ? Declara??o para cancelamento de protesto; ? Declara??o para fins escolares; Voltar ao topo Cartas Comerciais CARTAS DE COBRAN?A ? Cartas de cobran?a: 1, 2, 3, 4, 5, 6, 7 e 8; ? Encaminhamento de cobran?a a protesto; ? Oferecimento de servi?o de cobran?a; ? Recebimento de d?bito pendente; Voltar ao topo CARTAS EM INGL?S Cartas Comerciais ? Cancelamento de pedido; ? Carta de demiss?o; ? Carta de refer?ncia; ? Curriculum vitae; ? Pedido de produto: 1 e 2; ? Reclama??o de assinatura de publica??o; ? Remessa de valores; ? Resposta a pedido de produto; ? Resposta a solicita??o de emprego; ? Resposta a solicita??o de informa??es; ? Resposta a solicita??o de pre?os; ? Solicita??o de emprego; ? Solicita??o de informa??es comerciais; ? Solicita??o de licen?a; ? Solicita??o de pre?os; Voltar ao topo Cartas Comerciais CONVITES http://www.gueb.de/cartascomerciais ? Convite para batizado; ? Convite para evento social; ? Convite para exposi??o ou feira; ? Convite para lan?amento de produto; ? Resposta negativa a convite; ? Resposta positiva a convite; Voltar ao topo DOCUMENTOS ? Ata; ? Contrato de loca??o de im?vel; ? Contrato firmado acordo; ? Contrato social; ? Edital de convoca??o; ? Procura??o; ? Recibo de venda de autom?vel; Voltar ao topo PROPOSTAS ? Proposta de abertura de conta corrente; ? Proposta de presta??o de servi?os: 1 e 2; ? Proposta de representa??o comercial: 1 e 2; ? Proposta para ocupa??o de cargo; ? Proposta para recupera??o de clientes; ? Resposta negativa ? proposta de representa??o: 1 e 2; ? Resposta positiva ? proposta de representa??o: 1 e 2; Voltar ao topo http://www.gueb.de/cartascomerciais SOLICITA??E E PEDIDOS ? Pedido de desculpas; ? Pedido de mercadorias; ? Resposta a pedido de carta de apresenta??o; ? Resposta a solicita??o de c?pias de documentos; ? Resposta a solicita??o de or?amento; ? Resposta negativa a solicita??o de informa??es comerciais; Cartas Comerciais ? Resposta positiva a solicita??o de informa??es comerciais; ? Solicita??o de atestado de Idoneidade Financeira; ? Solicita??o de cat?logos de pre?os; ? Solicita??o de cr?dito; ? Solicita??o de informa??es comerciais; ? Solicita??o de informa??es sobre curso; ? Solicita??o de listas de pre?os; ? Solicita??es de refer?ncias pessoais; ? Suspens?o de pedido de mercadoria; Cartas Comerciais Voltar ao topo VIAGEM ? Informa??es sobre requisitos de viagem; ? Pedido de reserva em hotel; ? Recupera??o de bagagem extraviada; ? Reclama??o de maus tratos ? bagagem; ? Recupera??o de objeto esquecido em hotel; ? Reserva de passagens; ? Roteiro tur?stico. http://www.gueb.de/cartascomerciais From python-checkins at python.org Tue Dec 27 19:24:28 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 19:24:28 +0100 (CET) Subject: [Python-checkins] commit of r41836 - python/trunk/setup.py Message-ID: <20051227182428.7EA2A1E4002@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 19:24:27 2005 New Revision: 41836 Modified: python/trunk/setup.py Log: Bug #999767: make setup.py obey Setup.local wrt shared modules Modified: python/trunk/setup.py ============================================================================== --- python/trunk/setup.py (original) +++ python/trunk/setup.py Tue Dec 27 19:24:27 2005 @@ -148,17 +148,18 @@ self.extensions.remove(ext) if platform != 'mac': - # Parse Modules/Setup to figure out which modules are turned - # on in the file. - input = text_file.TextFile('Modules/Setup', join_lines=1) + # Parse Modules/Setup and Modules/Setup.local to figure out which + # modules are turned on in the file. remove_modules = [] - while 1: - line = input.readline() - if not line: break - line = line.split() - remove_modules.append( line[0] ) - input.close() - + for filename in ('Modules/Setup', 'Modules/Setup.local'): + input = text_file.TextFile(filename, join_lines=1) + while 1: + line = input.readline() + if not line: break + line = line.split() + remove_modules.append(line[0]) + input.close() + for ext in self.extensions[:]: if ext.name in remove_modules: self.extensions.remove(ext) From python-checkins at python.org Tue Dec 27 19:24:30 2005 From: python-checkins at python.org (reinhold.birkenfeld) Date: Tue, 27 Dec 2005 19:24:30 +0100 (CET) Subject: [Python-checkins] commit of r41837 - python/branches/release24-maint/setup.py Message-ID: <20051227182430.86CF51E4009@bag.python.org> Author: reinhold.birkenfeld Date: Tue Dec 27 19:24:30 2005 New Revision: 41837 Modified: python/branches/release24-maint/setup.py Log: Bug #999767: make setup.py obey Setup.local wrt shared modules Modified: python/branches/release24-maint/setup.py ============================================================================== --- python/branches/release24-maint/setup.py (original) +++ python/branches/release24-maint/setup.py Tue Dec 27 19:24:30 2005 @@ -148,17 +148,18 @@ self.extensions.remove(ext) if platform != 'mac': - # Parse Modules/Setup to figure out which modules are turned - # on in the file. - input = text_file.TextFile('Modules/Setup', join_lines=1) + # Parse Modules/Setup and Modules/Setup.local to figure out which + # modules are turned on in the file. remove_modules = [] - while 1: - line = input.readline() - if not line: break - line = line.split() - remove_modules.append( line[0] ) - input.close() - + for filename in ('Modules/Setup', 'Modules/Setup.local'): + input = text_file.TextFile(filename, join_lines=1) + while 1: + line = input.readline() + if not line: break + line = line.split() + remove_modules.append(line[0]) + input.close() + for ext in self.extensions[:]: if ext.name in remove_modules: self.extensions.remove(ext) From python-checkins at python.org Wed Dec 28 16:37:29 2005 From: python-checkins at python.org (skip.montanaro) Date: Wed, 28 Dec 2005 16:37:29 +0100 (CET) Subject: [Python-checkins] commit of r41838 - in python/trunk/Lib: csv.py test/test_csv.py Message-ID: <20051228153729.CACCA1E4007@bag.python.org> Author: skip.montanaro Date: Wed Dec 28 16:37:25 2005 New Revision: 41838 Modified: python/trunk/Lib/csv.py python/trunk/Lib/test/test_csv.py Log: Fix for problem with Sniffer class. If your delimiter is whitespace and the last field was empty it would strip the delimiter and incorrectly guess that "" was the delimiter. Reported in c.l.py by Laurent Laporte. Will backport. Modified: python/trunk/Lib/csv.py ============================================================================== --- python/trunk/Lib/csv.py (original) +++ python/trunk/Lib/csv.py Wed Dec 28 16:37:25 2005 @@ -271,7 +271,7 @@ for char in ascii: metaFrequency = charFrequency.get(char, {}) # must count even if frequency is 0 - freq = line.strip().count(char) + freq = line.count(char) # value is the mode metaFrequency[freq] = metaFrequency.get(freq, 0) + 1 charFrequency[char] = metaFrequency Modified: python/trunk/Lib/test/test_csv.py ============================================================================== --- python/trunk/Lib/test/test_csv.py (original) +++ python/trunk/Lib/test/test_csv.py Wed Dec 28 16:37:25 2005 @@ -836,7 +836,6 @@ 'Tommy''s Place':'Blue Island':'IL':'12/28/02':'Blue Sunday/White Crow' 'Stonecutters Seafood and Chop House':'Lemont':'IL':'12/19/02':'Week Back' """ - header = '''\ "venue","city","state","date","performers" ''' @@ -852,6 +851,8 @@ 47483648;43.0;170;abc;def ''' + sample5 = "aaa\tbbb\r\nAAA\t\r\nBBB\t\r\n" + def test_has_header(self): sniffer = csv.Sniffer() self.assertEqual(sniffer.has_header(self.sample1), False) @@ -879,6 +880,8 @@ self.assertEqual(dialect.delimiter, "/") dialect = sniffer.sniff(self.sample4) self.assertEqual(dialect.delimiter, ";") + dialect = sniffer.sniff(self.sample5) + self.assertEqual(dialect.delimiter, "\t") if not hasattr(sys, "gettotalrefcount"): if test_support.verbose: print "*** skipping leakage tests ***" From python-checkins at python.org Wed Dec 28 16:43:54 2005 From: python-checkins at python.org (skip.montanaro) Date: Wed, 28 Dec 2005 16:43:54 +0100 (CET) Subject: [Python-checkins] commit of r41839 - in python/branches/release24-maint/Lib: csv.py test/test_csv.py Message-ID: <20051228154354.0AA001E4007@bag.python.org> Author: skip.montanaro Date: Wed Dec 28 16:43:50 2005 New Revision: 41839 Modified: python/branches/release24-maint/Lib/csv.py python/branches/release24-maint/Lib/test/test_csv.py Log: backport Sniffer class fix (rev 41838) Modified: python/branches/release24-maint/Lib/csv.py ============================================================================== --- python/branches/release24-maint/Lib/csv.py (original) +++ python/branches/release24-maint/Lib/csv.py Wed Dec 28 16:43:50 2005 @@ -294,7 +294,7 @@ for char in ascii: metaFrequency = charFrequency.get(char, {}) # must count even if frequency is 0 - freq = line.strip().count(char) + freq = line.count(char) # value is the mode metaFrequency[freq] = metaFrequency.get(freq, 0) + 1 charFrequency[char] = metaFrequency Modified: python/branches/release24-maint/Lib/test/test_csv.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_csv.py (original) +++ python/branches/release24-maint/Lib/test/test_csv.py Wed Dec 28 16:43:50 2005 @@ -738,6 +738,8 @@ 47483648;43.0;170;abc;def ''' + sample5 = "aaa\tbbb\r\nAAA\t\r\nBBB\t\r\n" + def test_has_header(self): sniffer = csv.Sniffer() self.assertEqual(sniffer.has_header(self.sample1), False) @@ -765,6 +767,8 @@ self.assertEqual(dialect.delimiter, "/") dialect = sniffer.sniff(self.sample4) self.assertEqual(dialect.delimiter, ";") + dialect = sniffer.sniff(self.sample5) + self.assertEqual(dialect.delimiter, "\t") if not hasattr(sys, "gettotalrefcount"): if test_support.verbose: print "*** skipping leakage tests ***" From guido at python.org Wed Dec 28 16:49:14 2005 From: guido at python.org (Guido van Rossum) Date: Wed, 28 Dec 2005 07:49:14 -0800 Subject: [Python-checkins] commit of r41834 - in python/trunk: Misc/NEWS Modules/Setup.dist In-Reply-To: <20051227173708.38FDA1E4002@bag.python.org> References: <20051227173708.38FDA1E4002@bag.python.org> Message-ID: Hm. Methinks that the distutils code should have been patched to survive the possibility of "import pwd" failing (or pwd.getpwuid() failing!) rather than hiding the problem by forcing pwd to be built. The latter seems a much less robust solution. --Guido On 12/27/05, reinhold.birkenfeld wrote: > Author: reinhold.birkenfeld > Date: Tue Dec 27 18:37:07 2005 > New Revision: 41834 > > Modified: > python/trunk/Misc/NEWS > python/trunk/Modules/Setup.dist > Log: > [ 959576 ] Can't build Python on POSIX w/o $HOME > > > > Modified: python/trunk/Misc/NEWS > ============================================================================== > --- python/trunk/Misc/NEWS (original) > +++ python/trunk/Misc/NEWS Tue Dec 27 18:37:07 2005 > @@ -12,6 +12,9 @@ > Core and builtins > ----------------- > > +- Bug #959576: The pwd module is now builtin. This allows Python to be > + built on UNIX platforms without $HOME set. > + > - Bug #1072182, fix some potential problems if characters are signed. > > - Bug #889500, fix line number on SyntaxWarning for global declarations. > > Modified: python/trunk/Modules/Setup.dist > ============================================================================== > --- python/trunk/Modules/Setup.dist (original) > +++ python/trunk/Modules/Setup.dist Tue Dec 27 18:37:07 2005 > @@ -111,6 +111,8 @@ > > posix posixmodule.c # posix (UNIX) system calls > errno errnomodule.c # posix (UNIX) errno values > +pwd pwdmodule.c # this is needed to find out the user's home dir > + # if $HOME is not set > _sre _sre.c # Fredrik Lundh's new regular expressions > _codecs _codecsmodule.c # access to the builtin codecs and codec registry > > @@ -186,7 +188,6 @@ > # supported...) > > #fcntl fcntlmodule.c # fcntl(2) and ioctl(2) > -#pwd pwdmodule.c # pwd(3) > #spwd spwdmodule.c # spwd(3) > #grp grpmodule.c # grp(3) > #select selectmodule.c # select(2); not on ancient System V > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-checkins at python.org Wed Dec 28 16:57:00 2005 From: python-checkins at python.org (skip.montanaro) Date: Wed, 28 Dec 2005 16:57:00 +0100 (CET) Subject: [Python-checkins] commit of r41840 - python/trunk/Doc/lib/libcsv.tex Message-ID: <20051228155700.7FFA31E4007@bag.python.org> Author: skip.montanaro Date: Wed Dec 28 16:56:58 2005 New Revision: 41840 Modified: python/trunk/Doc/lib/libcsv.tex Log: typo Modified: python/trunk/Doc/lib/libcsv.tex ============================================================================== --- python/trunk/Doc/lib/libcsv.tex (original) +++ python/trunk/Doc/lib/libcsv.tex Wed Dec 28 16:56:58 2005 @@ -196,7 +196,7 @@ The \class{Sniffer} class is used to deduce the format of a CSV file. \end{classdesc} -The \class{Sniffer} class provides a single method: +The \class{Sniffer} class provides two methods: \begin{methoddesc}{sniff}{sample\optional{,delimiters=None}} Analyze the given \var{sample} and return a \class{Dialect} subclass From guido at python.org Wed Dec 28 17:10:42 2005 From: guido at python.org (Guido van Rossum) Date: Wed, 28 Dec 2005 08:10:42 -0800 Subject: [Python-checkins] commit of r41728 - in python: branches/release24-maint/Lib/test/test_unicode.py branches/release24-maint/Misc/NEWS branches/release24-maint/Objects/unicodeobject.c trunk/Lib/test/test_unicode.py trunk/Misc/NEWS trunk/Objects/uni Message-ID: On 12/16/05, hyeshik.chang wrote: > Author: hyeshik.chang > Date: Sat Dec 17 05:38:31 2005 > New Revision: 41728 > > Modified: > python/branches/release24-maint/Lib/test/test_unicode.py > python/branches/release24-maint/Misc/NEWS > python/branches/release24-maint/Objects/unicodeobject.c > python/trunk/Lib/test/test_unicode.py > python/trunk/Misc/NEWS > python/trunk/Objects/unicodeobject.c > Log: > Bug #1379994: Fix *unicode_escape codecs to encode r'\' as r'\\' > just like string codecs. Minor nit on the checkin comment: there is no such thing as r'\' -- that's an invalid string literal. And I don't believe this code produces r'...' notation either. :-) No need to respond, -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-checkins at python.org Thu Dec 29 15:39:33 2005 From: python-checkins at python.org (armin.rigo) Date: Thu, 29 Dec 2005 15:39:33 +0100 (CET) Subject: [Python-checkins] commit of r41841 - python/trunk/Modules/operator.c Message-ID: <20051229143933.55A0F1E4002@bag.python.org> Author: armin.rigo Date: Thu Dec 29 15:39:28 2005 New Revision: 41841 Modified: python/trunk/Modules/operator.c Log: two missing PyDoc_STR(). Modified: python/trunk/Modules/operator.c ============================================================================== --- python/trunk/Modules/operator.c (original) +++ python/trunk/Modules/operator.c Thu Dec 29 15:39:28 2005 @@ -177,10 +177,10 @@ #undef spam1o #undef spam1o #define spam1(OP,DOC) {#OP, OP, METH_VARARGS, PyDoc_STR(DOC)}, -#define spam2(OP,ALTOP,DOC) {#OP, op_##OP, METH_VARARGS, DOC}, \ +#define spam2(OP,ALTOP,DOC) {#OP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)}, \ {#ALTOP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)}, #define spam1o(OP,DOC) {#OP, OP, METH_O, PyDoc_STR(DOC)}, -#define spam2o(OP,ALTOP,DOC) {#OP, op_##OP, METH_O, DOC}, \ +#define spam2o(OP,ALTOP,DOC) {#OP, op_##OP, METH_O, PyDoc_STR(DOC)}, \ {#ALTOP, op_##OP, METH_O, PyDoc_STR(DOC)}, static struct PyMethodDef operator_methods[] = { From python-checkins at python.org Thu Dec 29 16:59:24 2005 From: python-checkins at python.org (armin.rigo) Date: Thu, 29 Dec 2005 16:59:24 +0100 (CET) Subject: [Python-checkins] commit of r41842 - in python/trunk: Lib/test/test_descr.py Lib/test/test_operator.py Objects/abstract.c Objects/typeobject.c Message-ID: <20051229155924.B55621E4002@bag.python.org> Author: armin.rigo Date: Thu Dec 29 16:59:19 2005 New Revision: 41842 Modified: python/trunk/Lib/test/test_descr.py python/trunk/Lib/test/test_operator.py python/trunk/Objects/abstract.c python/trunk/Objects/typeobject.c Log: SF patch #1390657: * set sq_repeat and sq_concat to NULL for user-defined new-style classes, as a way to fix a number of related problems. See test_descr.notimplemented()). One of these problems was fixed in r25556 and r25557 but many more existed; this is a general fix and thus reverts r25556-r25557. * to avoid having PySequence_Repeat()/PySequence_Concat() failing on user-defined classes, they now fall back to nb_add/nb_mul if sq_concat/sq_repeat are not defined and the arguments appear to be sequences. * added tests. Backport candidate. Modified: python/trunk/Lib/test/test_descr.py ============================================================================== --- python/trunk/Lib/test/test_descr.py (original) +++ python/trunk/Lib/test/test_descr.py Thu Dec 29 16:59:19 2005 @@ -3990,6 +3990,77 @@ verify(l.__add__.__objclass__ is list) vereq(l.__add__.__doc__, list.__add__.__doc__) +def notimplemented(): + # all binary methods should be able to return a NotImplemented + if verbose: + print "Testing NotImplemented..." + + import sys + import types + import operator + + def specialmethod(self, other): + return NotImplemented + + def check(expr, x, y): + try: + exec expr in {'x': x, 'y': y, 'operator': operator} + except TypeError: + pass + else: + raise TestFailed("no TypeError from %r" % (expr,)) + + N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors + N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger + # ValueErrors instead of TypeErrors + for metaclass in [type, types.ClassType]: + for name, expr, iexpr in [ + ('__add__', 'x + y', 'x += y'), + ('__sub__', 'x - y', 'x -= y'), + ('__mul__', 'x * y', 'x *= y'), + ('__truediv__', 'operator.truediv(x, y)', None), + ('__floordiv__', 'operator.floordiv(x, y)', None), + ('__div__', 'x / y', 'x /= y'), + ('__mod__', 'x % y', 'x %= y'), + ('__divmod__', 'divmod(x, y)', None), + ('__pow__', 'x ** y', 'x **= y'), + ('__lshift__', 'x << y', 'x <<= y'), + ('__rshift__', 'x >> y', 'x >>= y'), + ('__and__', 'x & y', 'x &= y'), + ('__or__', 'x | y', 'x |= y'), + ('__xor__', 'x ^ y', 'x ^= y'), + ('__coerce__', 'coerce(x, y)', None)]: + if name == '__coerce__': + rname = name + else: + rname = '__r' + name[2:] + A = metaclass('A', (), {name: specialmethod}) + B = metaclass('B', (), {rname: specialmethod}) + a = A() + b = B() + check(expr, a, a) + check(expr, a, b) + check(expr, b, a) + check(expr, b, b) + check(expr, a, N1) + check(expr, a, N2) + check(expr, N1, b) + check(expr, N2, b) + if iexpr: + check(iexpr, a, a) + check(iexpr, a, b) + check(iexpr, b, a) + check(iexpr, b, b) + check(iexpr, a, N1) + check(iexpr, a, N2) + iname = '__i' + name[2:] + C = metaclass('C', (), {iname: specialmethod}) + c = C() + check(iexpr, c, a) + check(iexpr, c, b) + check(iexpr, c, N1) + check(iexpr, c, N2) + def test_main(): weakref_segfault() # Must be first, somehow do_this_first() @@ -4084,6 +4155,7 @@ vicious_descriptor_nonsense() test_init() methodwrapper() + notimplemented() if verbose: print "All OK" Modified: python/trunk/Lib/test/test_operator.py ============================================================================== --- python/trunk/Lib/test/test_operator.py (original) +++ python/trunk/Lib/test/test_operator.py Thu Dec 29 16:59:19 2005 @@ -3,6 +3,34 @@ from test import test_support +class Seq1: + def __init__(self, lst): + self.lst = lst + def __len__(self): + return len(self.lst) + def __getitem__(self, i): + return self.lst[i] + def __add__(self, other): + return self.lst + other.lst + def __mul__(self, other): + return self.lst * other + def __rmul__(self, other): + return other * self.lst + +class Seq2(object): + def __init__(self, lst): + self.lst = lst + def __len__(self): + return len(self.lst) + def __getitem__(self, i): + return self.lst[i] + def __add__(self, other): + return self.lst + other.lst + def __mul__(self, other): + return self.lst * other + def __rmul__(self, other): + return other * self.lst + class OperatorTestCase(unittest.TestCase): def test_lt(self): @@ -92,6 +120,9 @@ self.failUnlessRaises(TypeError, operator.concat, None, None) self.failUnless(operator.concat('py', 'thon') == 'python') self.failUnless(operator.concat([1, 2], [3, 4]) == [1, 2, 3, 4]) + self.failUnless(operator.concat(Seq1([5, 6]), Seq1([7])) == [5, 6, 7]) + self.failUnless(operator.concat(Seq2([5, 6]), Seq2([7])) == [5, 6, 7]) + self.failUnlessRaises(TypeError, operator.concat, 13, 29) def test_countOf(self): self.failUnlessRaises(TypeError, operator.countOf) @@ -246,6 +277,15 @@ self.failUnless(operator.repeat(a, 2) == a+a) self.failUnless(operator.repeat(a, 1) == a) self.failUnless(operator.repeat(a, 0) == '') + a = Seq1([4, 5, 6]) + self.failUnless(operator.repeat(a, 2) == [4, 5, 6, 4, 5, 6]) + self.failUnless(operator.repeat(a, 1) == [4, 5, 6]) + self.failUnless(operator.repeat(a, 0) == []) + a = Seq2([4, 5, 6]) + self.failUnless(operator.repeat(a, 2) == [4, 5, 6, 4, 5, 6]) + self.failUnless(operator.repeat(a, 1) == [4, 5, 6]) + self.failUnless(operator.repeat(a, 0) == []) + self.failUnlessRaises(TypeError, operator.repeat, 6, 7) def test_rshift(self): self.failUnlessRaises(TypeError, operator.rshift) Modified: python/trunk/Objects/abstract.c ============================================================================== --- python/trunk/Objects/abstract.c (original) +++ python/trunk/Objects/abstract.c Thu Dec 29 16:59:19 2005 @@ -635,14 +635,11 @@ PyObject *result = binary_op1(v, w, NB_SLOT(nb_add)); if (result == Py_NotImplemented) { PySequenceMethods *m = v->ob_type->tp_as_sequence; + Py_DECREF(result); if (m && m->sq_concat) { - Py_DECREF(result); - result = (*m->sq_concat)(v, w); + return (*m->sq_concat)(v, w); } - if (result == Py_NotImplemented) { - Py_DECREF(result); - return binop_type_error(v, w, "+"); - } + result = binop_type_error(v, w, "+"); } return result; } @@ -1144,6 +1141,15 @@ if (m && m->sq_concat) return m->sq_concat(s, o); + /* Instances of user classes defining an __add__() method only + have an nb_add slot, not an sq_concat slot. So we fall back + to nb_add if both arguments appear to be sequences. */ + if (PySequence_Check(s) && PySequence_Check(o)) { + PyObject *result = binary_op1(s, o, NB_SLOT(nb_add)); + if (result != Py_NotImplemented) + return result; + Py_DECREF(result); + } return type_error("object can't be concatenated"); } @@ -1159,6 +1165,20 @@ if (m && m->sq_repeat) return m->sq_repeat(o, count); + /* Instances of user classes defining a __mul__() method only + have an nb_multiply slot, not an sq_repeat slot. so we fall back + to nb_multiply if o appears to be a sequence. */ + if (PySequence_Check(o)) { + PyObject *n, *result; + n = PyInt_FromLong(count); + if (n == NULL) + return NULL; + result = binary_op1(o, n, NB_SLOT(nb_multiply)); + Py_DECREF(n); + if (result != Py_NotImplemented) + return result; + Py_DECREF(result); + } return type_error("object can't be repeated"); } @@ -1176,6 +1196,13 @@ if (m && m->sq_concat) return m->sq_concat(s, o); + if (PySequence_Check(s) && PySequence_Check(o)) { + PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add), + NB_SLOT(nb_add)); + if (result != Py_NotImplemented) + return result; + Py_DECREF(result); + } return type_error("object can't be concatenated"); } @@ -1193,6 +1220,18 @@ if (m && m->sq_repeat) return m->sq_repeat(o, count); + if (PySequence_Check(o)) { + PyObject *n, *result; + n = PyInt_FromLong(count); + if (n == NULL) + return NULL; + result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply), + NB_SLOT(nb_multiply)); + Py_DECREF(n); + if (result != Py_NotImplemented) + return result; + Py_DECREF(result); + } return type_error("object can't be repeated"); } Modified: python/trunk/Objects/typeobject.c ============================================================================== --- python/trunk/Objects/typeobject.c (original) +++ python/trunk/Objects/typeobject.c Thu Dec 29 16:59:19 2005 @@ -4095,9 +4095,6 @@ return len; } -SLOT1(slot_sq_concat, "__add__", PyObject *, "O") -SLOT1(slot_sq_repeat, "__mul__", int, "i") - /* Super-optimized version of slot_sq_item. Other slots could do the same... */ static PyObject * @@ -4211,9 +4208,6 @@ return result; } -SLOT1(slot_sq_inplace_concat, "__iadd__", PyObject *, "O") -SLOT1(slot_sq_inplace_repeat, "__imul__", int, "i") - #define slot_mp_length slot_sq_length SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O") @@ -4926,12 +4920,17 @@ static slotdef slotdefs[] = { SQSLOT("__len__", sq_length, slot_sq_length, wrap_inquiry, "x.__len__() <==> len(x)"), - SQSLOT("__add__", sq_concat, slot_sq_concat, wrap_binaryfunc, - "x.__add__(y) <==> x+y"), - SQSLOT("__mul__", sq_repeat, slot_sq_repeat, wrap_intargfunc, - "x.__mul__(n) <==> x*n"), - SQSLOT("__rmul__", sq_repeat, slot_sq_repeat, wrap_intargfunc, - "x.__rmul__(n) <==> n*x"), + /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL. + The logic in abstract.c always falls back to nb_add/nb_multiply in + this case. Defining both the nb_* and the sq_* slots to call the + user-defined methods has unexpected side-effects, as shown by + test_descr.notimplemented() */ + SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc, + "x.__add__(y) <==> x+y"), + SQSLOT("__mul__", sq_repeat, NULL, wrap_intargfunc, + "x.__mul__(n) <==> x*n"), + SQSLOT("__rmul__", sq_repeat, NULL, wrap_intargfunc, + "x.__rmul__(n) <==> n*x"), SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item, "x.__getitem__(y) <==> x[y]"), SQSLOT("__getslice__", sq_slice, slot_sq_slice, wrap_intintargfunc, @@ -4953,10 +4952,10 @@ Use of negative indices is not supported."), SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc, "x.__contains__(y) <==> y in x"), - SQSLOT("__iadd__", sq_inplace_concat, slot_sq_inplace_concat, - wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"), - SQSLOT("__imul__", sq_inplace_repeat, slot_sq_inplace_repeat, - wrap_intargfunc, "x.__imul__(y) <==> x*=y"), + SQSLOT("__iadd__", sq_inplace_concat, NULL, + wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"), + SQSLOT("__imul__", sq_inplace_repeat, NULL, + wrap_intargfunc, "x.__imul__(y) <==> x*=y"), MPSLOT("__len__", mp_length, slot_mp_length, wrap_inquiry, "x.__len__() <==> len(x)"), From python-checkins at python.org Thu Dec 29 17:04:25 2005 From: python-checkins at python.org (armin.rigo) Date: Thu, 29 Dec 2005 17:04:25 +0100 (CET) Subject: [Python-checkins] commit of r41843 - python/trunk/Doc/lib/liboperator.tex Message-ID: <20051229160425.004C11E4009@bag.python.org> Author: armin.rigo Date: Thu Dec 29 17:04:25 2005 New Revision: 41843 Modified: python/trunk/Doc/lib/liboperator.tex Log: Typo. Modified: python/trunk/Doc/lib/liboperator.tex ============================================================================== --- python/trunk/Doc/lib/liboperator.tex (original) +++ python/trunk/Doc/lib/liboperator.tex Thu Dec 29 17:04:25 2005 @@ -162,7 +162,7 @@ \begin{funcdesc}{truediv}{a, b} \funcline{__truediv__}{a, b} Return \var{a} \code{/} \var{b} when \code{__future__.division} is in -effect. This is also known as division. +effect. This is also known as ``true'' division. \versionadded{2.2} \end{funcdesc} From python-checkins at python.org Thu Dec 29 17:50:50 2005 From: python-checkins at python.org (armin.rigo) Date: Thu, 29 Dec 2005 17:50:50 +0100 (CET) Subject: [Python-checkins] commit of r41844 - in python/trunk: Doc/lib/liboperator.tex Lib/test/test_operator.py Modules/operator.c Message-ID: <20051229165050.10EBC1E4020@bag.python.org> Author: armin.rigo Date: Thu Dec 29 17:50:42 2005 New Revision: 41844 Modified: python/trunk/Doc/lib/liboperator.tex python/trunk/Lib/test/test_operator.py python/trunk/Modules/operator.c Log: adding in-place operators to the operator module. Modified: python/trunk/Doc/lib/liboperator.tex ============================================================================== --- python/trunk/Doc/lib/liboperator.tex (original) +++ python/trunk/Doc/lib/liboperator.tex Thu Dec 29 17:50:42 2005 @@ -237,6 +237,108 @@ \end{funcdesc} +Many operations have an ``in-place'' version. The following functions +provide a more primitive access to in-place operators than the usual +syntax does; for example, the statement \code{x += y} is equivalent to +\code{x = operator.iadd(x, y)}. Another way to put it is to say that +\code{z = operator.iadd(x, y)} is equivalent to the compound statement +\code{z = x; z += y}. + +\begin{funcdesc}{iadd}{a, b} +\funcline{__iadd__}{a, b} +\code{a = iadd(a, b)} is equivalent to \code{a += b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{iand}{a, b} +\funcline{__iand__}{a, b} +\code{a = iand(a, b)} is equivalent to \code{a \&= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{iconcat}{a, b} +\funcline{__iconcat__}{a, b} +\code{a = iconcat(a, b)} is equivalent to \code{a += b} for \var{a} +and \var{b} sequences. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{idiv}{a, b} +\funcline{__idiv__}{a, b} +\code{a = idiv(a, b)} is equivalent to \code{a /= b} when +\code{__future__.division} is not in effect. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{ifloordiv}{a, b} +\funcline{__ifloordiv__}{a, b} +\code{a = ifloordiv(a, b)} is equivalent to \code{a //= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{ilshift}{a, b} +\funcline{__ilshift__}{a, b} +\code{a = ilshift(a, b)} is equivalent to \code{a <}\code{<= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{imod}{a, b} +\funcline{__imod__}{a, b} +\code{a = imod(a, b)} is equivalent to \code{a \%= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{imul}{a, b} +\funcline{__imul__}{a, b} +\code{a = imul(a, b)} is equivalent to \code{a *= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{ior}{a, b} +\funcline{__ior__}{a, b} +\code{a = ior(a, b)} is equivalent to \code{a |= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{ipow}{a, b} +\funcline{__ipow__}{a, b} +\code{a = ipow(a, b)} is equivalent to \code{a **= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{irepeat}{a, b} +\funcline{__irepeat__}{a, b} +\code{a = irepeat(a, b)} is equivalent to \code{a *= b} where +\var{a} is a sequence and \var{b} is an integer. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{irshift}{a, b} +\funcline{__irshift__}{a, b} +\code{a = irshift(a, b)} is equivalent to \code{a >}\code{>= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{isub}{a, b} +\funcline{__isub__}{a, b} +\code{a = isub(a, b)} is equivalent to \code{a -= b}. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{itruediv}{a, b} +\funcline{__itruediv__}{a, b} +\code{a = itruediv(a, b)} is equivalent to \code{a /= b} when +\code{__future__.division} is in effect. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{ixor}{a, b} +\funcline{__ixor__}{a, b} +\code{a = ixor(a, b)} is equivalent to \code{a \textasciicircum= b}. +\versionadded{2.5} +\end{funcdesc} + + The \module{operator} module also defines a few predicates to test the type of objects. \note{Be careful not to misinterpret the results of these functions; only \function{isCallable()} has any Modified: python/trunk/Lib/test/test_operator.py ============================================================================== --- python/trunk/Lib/test/test_operator.py (original) +++ python/trunk/Lib/test/test_operator.py Thu Dec 29 17:50:42 2005 @@ -412,6 +412,53 @@ self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5')) self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data) + def test_inplace(self): + class C(object): + def __iadd__ (self, other): return "iadd" + def __iand__ (self, other): return "iand" + def __idiv__ (self, other): return "idiv" + def __ifloordiv__(self, other): return "ifloordiv" + def __ilshift__ (self, other): return "ilshift" + def __imod__ (self, other): return "imod" + def __imul__ (self, other): return "imul" + def __ior__ (self, other): return "ior" + def __ipow__ (self, other): return "ipow" + def __irshift__ (self, other): return "irshift" + def __isub__ (self, other): return "isub" + def __itruediv__ (self, other): return "itruediv" + def __ixor__ (self, other): return "ixor" + def __getitem__(self, other): return 5 # so that C is a sequence + c = C() + self.assertEqual(operator.iadd (c, 5), "iadd") + self.assertEqual(operator.iand (c, 5), "iand") + self.assertEqual(operator.idiv (c, 5), "idiv") + self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv") + self.assertEqual(operator.ilshift (c, 5), "ilshift") + self.assertEqual(operator.imod (c, 5), "imod") + self.assertEqual(operator.imul (c, 5), "imul") + self.assertEqual(operator.ior (c, 5), "ior") + self.assertEqual(operator.ipow (c, 5), "ipow") + self.assertEqual(operator.irshift (c, 5), "irshift") + self.assertEqual(operator.isub (c, 5), "isub") + self.assertEqual(operator.itruediv (c, 5), "itruediv") + self.assertEqual(operator.ixor (c, 5), "ixor") + self.assertEqual(operator.iconcat (c, c), "iadd") + self.assertEqual(operator.irepeat (c, 5), "imul") + self.assertEqual(operator.__iadd__ (c, 5), "iadd") + self.assertEqual(operator.__iand__ (c, 5), "iand") + self.assertEqual(operator.__idiv__ (c, 5), "idiv") + self.assertEqual(operator.__ifloordiv__(c, 5), "ifloordiv") + self.assertEqual(operator.__ilshift__ (c, 5), "ilshift") + self.assertEqual(operator.__imod__ (c, 5), "imod") + self.assertEqual(operator.__imul__ (c, 5), "imul") + self.assertEqual(operator.__ior__ (c, 5), "ior") + self.assertEqual(operator.__ipow__ (c, 5), "ipow") + self.assertEqual(operator.__irshift__ (c, 5), "irshift") + self.assertEqual(operator.__isub__ (c, 5), "isub") + self.assertEqual(operator.__itruediv__ (c, 5), "itruediv") + self.assertEqual(operator.__ixor__ (c, 5), "ixor") + self.assertEqual(operator.__iconcat__ (c, c), "iadd") + self.assertEqual(operator.__irepeat__ (c, 5), "imul") def test_main(verbose=None): import sys Modified: python/trunk/Modules/operator.c ============================================================================== --- python/trunk/Modules/operator.c (original) +++ python/trunk/Modules/operator.c Thu Dec 29 17:50:42 2005 @@ -80,9 +80,23 @@ spam2(op_and_ , PyNumber_And) spam2(op_xor , PyNumber_Xor) spam2(op_or_ , PyNumber_Or) +spam2(op_iadd , PyNumber_InPlaceAdd) +spam2(op_isub , PyNumber_InPlaceSubtract) +spam2(op_imul , PyNumber_InPlaceMultiply) +spam2(op_idiv , PyNumber_InPlaceDivide) +spam2(op_ifloordiv , PyNumber_InPlaceFloorDivide) +spam2(op_itruediv , PyNumber_InPlaceTrueDivide) +spam2(op_imod , PyNumber_InPlaceRemainder) +spam2(op_ilshift , PyNumber_InPlaceLshift) +spam2(op_irshift , PyNumber_InPlaceRshift) +spam2(op_iand , PyNumber_InPlaceAnd) +spam2(op_ixor , PyNumber_InPlaceXor) +spam2(op_ior , PyNumber_InPlaceOr) spami(isSequenceType , PySequence_Check) spam2(op_concat , PySequence_Concat) spamoi(op_repeat , PySequence_Repeat) +spam2(op_iconcat , PySequence_InPlaceConcat) +spamoi(op_irepeat , PySequence_InPlaceRepeat) spami2b(op_contains , PySequence_Contains) spami2b(sequenceIncludes, PySequence_Contains) spami2(indexOf , PySequence_Index) @@ -108,6 +122,15 @@ } static PyObject* +op_ipow(PyObject *s, PyObject *a) +{ + PyObject *a1, *a2; + if (PyArg_UnpackTuple(a,"ipow", 2, 2, &a1, &a2)) + return PyNumber_InPlacePower(a1, a2, Py_None); + return NULL; +} + +static PyObject* is_(PyObject *s, PyObject *a) { PyObject *a1, *a2, *result = NULL; @@ -224,17 +247,34 @@ spam2(and_,__and__, "and_(a, b) -- Same as a & b.") spam2(xor,__xor__, "xor(a, b) -- Same as a ^ b.") spam2(or_,__or__, "or_(a, b) -- Same as a | b.") +spam2(iadd,__iadd__, "iadd(a, b) -- Same as a += b.") +spam2(isub,__isub__, "isub(a, b) -- Same as a -= b.") +spam2(imul,__imul__, "imul(a, b) -- Same as a *= b.") +spam2(idiv,__idiv__, "idiv(a, b) -- Same as a /= b when __future__.division is not in effect.") +spam2(ifloordiv,__ifloordiv__, "ifloordiv(a, b) -- Same as a //= b.") +spam2(itruediv,__itruediv__, "itruediv(a, b) -- Same as a /= b when __future__.division is in effect.") +spam2(imod,__imod__, "imod(a, b) -- Same as a %= b.") +spam2(ilshift,__ilshift__, "ilshift(a, b) -- Same as a <<= b.") +spam2(irshift,__irshift__, "irshift(a, b) -- Same as a >>= b.") +spam2(iand,__iand__, "iand(a, b) -- Same as a &= b.") +spam2(ixor,__ixor__, "ixor(a, b) -- Same as a ^= b.") +spam2(ior,__ior__, "ior(a, b) -- Same as a |= b.") spam2(concat,__concat__, "concat(a, b) -- Same as a + b, for a and b sequences.") spam2(repeat,__repeat__, "repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.") +spam2(iconcat,__iconcat__, + "iconcat(a, b) -- Same as a += b, for a and b sequences.") +spam2(irepeat,__irepeat__, + "irepeat(a, b) -- Same as a *= b, where a is a sequence, and b is an integer.") spam2(getitem,__getitem__, "getitem(a, b) -- Same as a[b].") spam2(setitem,__setitem__, "setitem(a, b, c) -- Same as a[b] = c.") spam2(delitem,__delitem__, "delitem(a, b) -- Same as del a[b].") -spam2(pow,__pow__, "pow(a, b) -- Same as a**b.") +spam2(pow,__pow__, "pow(a, b) -- Same as a ** b.") +spam2(ipow,__ipow__, "ipow(a, b) -- Same as a **= b.") spam2(getslice,__getslice__, "getslice(a, b, c) -- Same as a[b:c].") spam2(setslice,__setslice__, From python-checkins at python.org Thu Dec 29 18:07:41 2005 From: python-checkins at python.org (armin.rigo) Date: Thu, 29 Dec 2005 18:07:41 +0100 (CET) Subject: [Python-checkins] commit of r41845 - in python/trunk: Lib/test/test_descr.py Objects/typeobject.c Message-ID: <20051229170741.482741E4007@bag.python.org> Author: armin.rigo Date: Thu Dec 29 18:07:39 2005 New Revision: 41845 Modified: python/trunk/Lib/test/test_descr.py python/trunk/Objects/typeobject.c Log: SF bug #1153075: "PyXxx_Check(x) trusts x->ob_type->tp_mro". A patch by mwh to check that user-defined mro's are reasonable enough. Modified: python/trunk/Lib/test/test_descr.py ============================================================================== --- python/trunk/Lib/test/test_descr.py (original) +++ python/trunk/Lib/test/test_descr.py Thu Dec 29 18:07:39 2005 @@ -1635,6 +1635,37 @@ vereq(X.__mro__, (object, A, C, B, D, X)) vereq(X().f(), "A") + try: + class X(object): + class __metaclass__(type): + def mro(self): + return [self, dict, object] + except TypeError: + pass + else: + raise TestFailed, "devious mro() return not caught" + + try: + class X(object): + class __metaclass__(type): + def mro(self): + return [1] + except TypeError: + pass + else: + raise TestFailed, "non-class mro() return not caught" + + try: + class X(object): + class __metaclass__(type): + def mro(self): + return 1 + except TypeError: + pass + else: + raise TestFailed, "non-sequence mro() return not caught" + + def overloading(): if verbose: print "Testing operator overloading..." Modified: python/trunk/Objects/typeobject.c ============================================================================== --- python/trunk/Objects/typeobject.c (original) +++ python/trunk/Objects/typeobject.c Thu Dec 29 18:07:39 2005 @@ -1288,12 +1288,14 @@ mro_internal(PyTypeObject *type) { PyObject *mro, *result, *tuple; + int checkit = 0; if (type->ob_type == &PyType_Type) { result = mro_implementation(type); } else { static PyObject *mro_str; + checkit = 1; mro = lookup_method((PyObject *)type, "mro", &mro_str); if (mro == NULL) return -1; @@ -1304,6 +1306,37 @@ return -1; tuple = PySequence_Tuple(result); Py_DECREF(result); + if (tuple == NULL) + return -1; + if (checkit) { + int i, len; + PyObject *cls; + PyTypeObject *solid; + + solid = solid_base(type); + + len = PyTuple_GET_SIZE(tuple); + + for (i = 0; i < len; i++) { + PyTypeObject *t; + cls = PyTuple_GET_ITEM(tuple, i); + if (PyClass_Check(cls)) + continue; + else if (!PyType_Check(cls)) { + PyErr_Format(PyExc_TypeError, + "mro() returned a non-class ('%.500s')", + cls->ob_type->tp_name); + return -1; + } + t = (PyTypeObject*)cls; + if (!PyType_IsSubtype(solid, solid_base(t))) { + PyErr_Format(PyExc_TypeError, + "mro() returned base with unsuitable layout ('%.500s')", + t->tp_name); + return -1; + } + } + } type->tp_mro = tuple; return 0; } From python-checkins at python.org Thu Dec 29 18:43:08 2005 From: python-checkins at python.org (armin.rigo) Date: Thu, 29 Dec 2005 18:43:08 +0100 (CET) Subject: [Python-checkins] commit of r41846 - python/trunk/Doc/lib/libweakref.tex Message-ID: <20051229174308.D7CC21E4009@bag.python.org> Author: armin.rigo Date: Thu Dec 29 18:43:08 2005 New Revision: 41846 Modified: python/trunk/Doc/lib/libweakref.tex Log: SF patch #1379023: document that a weakref callback is not invoked if the weakref object itself is deleted first. Modified: python/trunk/Doc/lib/libweakref.tex ============================================================================== --- python/trunk/Doc/lib/libweakref.tex (original) +++ python/trunk/Doc/lib/libweakref.tex Thu Dec 29 18:43:08 2005 @@ -75,8 +75,8 @@ retrieved by calling the reference object if the referent is still alive; if the referent is no longer alive, calling the reference object will cause \constant{None} to be returned. If \var{callback} is - provided and not \constant{None}, - it will be called when the object is about to be + provided and not \constant{None}, and the returned weakref object is + still alive, the callback will be called when the object is about to be finalized; the weak reference object will be passed as the only parameter to the callback; the referent will no longer be available. From python-checkins at python.org Thu Dec 29 21:35:55 2005 From: python-checkins at python.org (fredrik.lundh) Date: Thu, 29 Dec 2005 21:35:55 +0100 (CET) Subject: [Python-checkins] commit of r41847 - in python/trunk: Lib/test/test__locale.py Python/ast.c Message-ID: <20051229203555.D029B1E4002@bag.python.org> Author: fredrik.lundh Date: Thu Dec 29 21:35:52 2005 New Revision: 41847 Modified: python/trunk/Lib/test/test__locale.py python/trunk/Python/ast.c Log: SF#1391872 Floating point literals don't work in non-US locale in 2.5. Patch and new locale tests by Hye-Shik Chang. Modified: python/trunk/Lib/test/test__locale.py ============================================================================== --- python/trunk/Lib/test/test__locale.py (original) +++ python/trunk/Lib/test/test__locale.py Thu Dec 29 21:35:52 2005 @@ -97,6 +97,18 @@ loc, set_locale)) + def test_float_parsing(self): + # Bug #1391872: Test whether float parsing is okay on European + # locales. + for loc in candidate_locales: + try: + setlocale(LC_NUMERIC, loc) + except Error: + continue + self.assertEquals(int(eval('3.14') * 100), 314) + self.assertEquals(int(float('3.14') * 100), 314) + + def test_main(): run_unittest(_LocaleTests) Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Thu Dec 29 21:35:52 2005 @@ -2773,7 +2773,7 @@ if (imflag) { c.real = 0.; PyFPE_START_PROTECT("atof", return 0) - c.imag = atof(s); + c.imag = PyOS_ascii_atof(s); PyFPE_END_PROTECT(c) return PyComplex_FromCComplex(c); } @@ -2781,7 +2781,7 @@ #endif { PyFPE_START_PROTECT("atof", return 0) - dx = atof(s); + dx = PyOS_ascii_atof(s); PyFPE_END_PROTECT(dx) return PyFloat_FromDouble(dx); } From python-checkins at python.org Fri Dec 30 06:01:27 2005 From: python-checkins at python.org (skip.montanaro) Date: Fri, 30 Dec 2005 06:01:27 +0100 (CET) Subject: [Python-checkins] commit of r41848 - python/trunk/setup.py Message-ID: <20051230050127.8AB4F1E4022@bag.python.org> Author: skip.montanaro Date: Fri Dec 30 06:01:26 2005 New Revision: 41848 Modified: python/trunk/setup.py Log: typo, use parens for continued expr Modified: python/trunk/setup.py ============================================================================== --- python/trunk/setup.py (original) +++ python/trunk/setup.py Fri Dec 30 06:01:26 2005 @@ -1000,7 +1000,7 @@ join(os.getenv('HOME'), '/Library/Frameworks') ] - # Find the directory that contains the Tcl.framwork and Tk.framework + # Find the directory that contains the Tcl.framework and Tk.framework # bundles. # XXX distutils should support -F! for F in framework_dirs: @@ -1051,8 +1051,8 @@ # AquaTk is a separate method. Only one Tkinter will be built on # Darwin - either AquaTk, if it is found, or X11 based Tk. platform = self.get_platform() - if platform == 'darwin' and \ - self.detect_tkinter_darwin(inc_dirs, lib_dirs): + if (platform == 'darwin' and + self.detect_tkinter_darwin(inc_dirs, lib_dirs)): return # Assume we haven't found any of the libraries or include files From python-checkins at python.org Fri Dec 30 06:09:50 2005 From: python-checkins at python.org (skip.montanaro) Date: Fri, 30 Dec 2005 06:09:50 +0100 (CET) Subject: [Python-checkins] commit of r41849 - in python/trunk/Lib: csv.py test/test_csv.py Message-ID: <20051230050950.C05031E4002@bag.python.org> Author: skip.montanaro Date: Fri Dec 30 06:09:48 2005 New Revision: 41849 Modified: python/trunk/Lib/csv.py python/trunk/Lib/test/test_csv.py Log: Fix a delimiter detection problem in sniffer. Sniffing "a|b|c\r\n" was returning 'a' as the delimiter. It now returns '|', but not because I understood better what the code was supposed to do. Would someone that understands the idea behind _guess_delimiter() (see its doc string) look to see if my fallback choice is better than before or if it's just serendipity that I picked the proper delimiter? Modified: python/trunk/Lib/csv.py ============================================================================== --- python/trunk/Lib/csv.py (original) +++ python/trunk/Lib/csv.py Fri Dec 30 06:09:48 2005 @@ -152,10 +152,13 @@ quotechar, delimiter, skipinitialspace = \ self._guess_quote_and_delimiter(sample, delimiters) - if delimiter is None: + if not delimiter: delimiter, skipinitialspace = self._guess_delimiter(sample, delimiters) + if not delimiter: + raise Error, "Could not determine delimiter" + class dialect(Dialect): _name = "sniffed" lineterminator = '\r\n' @@ -329,8 +332,12 @@ data[0].count("%c " % d)) return (d, skipinitialspace) - # finally, just return the first damn character in the list - delim = delims.keys()[0] + # nothing else indicates a preference, pick the character that + # dominates(?) + items = [(v,k) for (k,v) in delims.items()] + items.sort() + delim = items[-1][1] + skipinitialspace = (data[0].count(delim) == data[0].count("%c " % delim)) return (delim, skipinitialspace) Modified: python/trunk/Lib/test/test_csv.py ============================================================================== --- python/trunk/Lib/test/test_csv.py (original) +++ python/trunk/Lib/test/test_csv.py Fri Dec 30 06:09:48 2005 @@ -852,6 +852,8 @@ ''' sample5 = "aaa\tbbb\r\nAAA\t\r\nBBB\t\r\n" + sample6 = "a|b|c\r\nd|e|f\r\n" + sample7 = "'a'|'b'|'c'\r\n'd'|e|f\r\n" def test_has_header(self): sniffer = csv.Sniffer() @@ -882,6 +884,11 @@ self.assertEqual(dialect.delimiter, ";") dialect = sniffer.sniff(self.sample5) self.assertEqual(dialect.delimiter, "\t") + dialect = sniffer.sniff(self.sample6) + self.assertEqual(dialect.delimiter, "|") + dialect = sniffer.sniff(self.sample7) + self.assertEqual(dialect.delimiter, "|") + self.assertEqual(dialect.quotechar, "'") if not hasattr(sys, "gettotalrefcount"): if test_support.verbose: print "*** skipping leakage tests ***" From python-checkins at python.org Fri Dec 30 11:00:36 2005 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 30 Dec 2005 11:00:36 +0100 (CET) Subject: [Python-checkins] commit of r41850 - python/branches/ssize_t/Modules/_elementtree.c Message-ID: <20051230100036.D530D1E4002@bag.python.org> Author: martin.v.loewis Date: Fri Dec 30 11:00:32 2005 New Revision: 41850 Modified: python/branches/ssize_t/Modules/_elementtree.c Log: Change module to be backwards compatible. Modified: python/branches/ssize_t/Modules/_elementtree.c ============================================================================== --- python/branches/ssize_t/Modules/_elementtree.c (original) +++ python/branches/ssize_t/Modules/_elementtree.c Fri Dec 30 11:00:32 2005 @@ -92,6 +92,9 @@ #endif /* compatibility macros */ +#if (PY_VERSION_HEX < 0x02050000) +typedef int Py_ssize_t; +#endif #if (PY_VERSION_HEX < 0x02040000) #define PyDict_CheckExact PyDict_Check #if (PY_VERSION_HEX < 0x02020000) @@ -916,8 +919,9 @@ } static PyObject* -element_getitem(ElementObject* self, Py_ssize_t index) +element_getitem(PyObject* _self, Py_ssize_t index) { + ElementObject* self = (ElementObject*)_self; if (!self->extra || index < 0 || index >= self->extra->length) { PyErr_SetString( PyExc_IndexError, @@ -931,8 +935,9 @@ } static PyObject* -element_getslice(ElementObject* self, Py_ssize_t start, Py_ssize_t end) +element_getslice(PyObject* _self, Py_ssize_t start, Py_ssize_t end) { + ElementObject* self = (ElementObject*)_self; Py_ssize_t i; PyObject* list; @@ -1158,8 +1163,9 @@ } static int -element_setslice(ElementObject* self, Py_ssize_t start, Py_ssize_t end, PyObject* item) +element_setslice(PyObject* _self, Py_ssize_t start, Py_ssize_t end, PyObject* item) { + ElementObject* self = (ElementObject*)_self; int i, new, old; PyObject* recycle = NULL; @@ -1228,8 +1234,9 @@ } static int -element_setitem(ElementObject* self, Py_ssize_t index, PyObject* item) +element_setitem(PyObject* _self, Py_ssize_t index, PyObject* item) { + ElementObject* self = (ElementObject*)_self; int i; PyObject* old; @@ -1371,10 +1378,10 @@ (inquiry) element_length, 0, /* sq_concat */ 0, /* sq_repeat */ - (ssizeargfunc) element_getitem, - (ssizessizeargfunc) element_getslice, - (ssizeobjargproc) element_setitem, - (ssizessizeobjargproc) element_setslice, + element_getitem, + element_getslice, + element_setitem, + element_setslice, }; statichere PyTypeObject Element_Type = { From python-checkins at python.org Fri Dec 30 11:16:46 2005 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 30 Dec 2005 11:16:46 +0100 (CET) Subject: [Python-checkins] commit of r41851 - in python/branches/ssize_t: Include/longobject.h Objects/intobject.c Objects/listobject.c Objects/longobject.c Objects/stringobject.c Objects/tupleobject.c Objects/unicodeobject.c Message-ID: <20051230101646.0942D1E4002@bag.python.org> Author: martin.v.loewis Date: Fri Dec 30 11:16:44 2005 New Revision: 41851 Modified: python/branches/ssize_t/Include/longobject.h python/branches/ssize_t/Objects/intobject.c python/branches/ssize_t/Objects/listobject.c python/branches/ssize_t/Objects/longobject.c python/branches/ssize_t/Objects/stringobject.c python/branches/ssize_t/Objects/tupleobject.c python/branches/ssize_t/Objects/unicodeobject.c Log: Remove PyLong_AsSsize_t. Modified: python/branches/ssize_t/Include/longobject.h ============================================================================== --- python/branches/ssize_t/Include/longobject.h (original) +++ python/branches/ssize_t/Include/longobject.h Fri Dec 30 11:16:44 2005 @@ -18,11 +18,11 @@ PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); PyAPI_FUNC(long) PyLong_AsLong(PyObject *); -PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); /* For use by intobject.c only */ +PyAPI_FUNC(Py_ssize_t) _PyLong_AsSsize_t(PyObject *); PyAPI_FUNC(PyObject *) _PyLong_FromSize_t(size_t); PyAPI_FUNC(PyObject *) _PyLong_FromSsize_t(Py_ssize_t); Modified: python/branches/ssize_t/Objects/intobject.c ============================================================================== --- python/branches/ssize_t/Objects/intobject.c (original) +++ python/branches/ssize_t/Objects/intobject.c Fri Dec 30 11:16:44 2005 @@ -188,6 +188,8 @@ Py_ssize_t PyInt_AsSsize_t(register PyObject *op) { + if (op && !PyInt_CheckExact(op) && PyLong_Check(op)) + return _PyLong_AsSsize_t(op); #if SIZEOF_SIZE_T==SIZEOF_LONG return PyInt_AsLong(op); #else Modified: python/branches/ssize_t/Objects/listobject.c ============================================================================== --- python/branches/ssize_t/Objects/listobject.c (original) +++ python/branches/ssize_t/Objects/listobject.c Fri Dec 30 11:16:44 2005 @@ -2453,14 +2453,8 @@ static PyObject * list_subscript(PyListObject* self, PyObject* item) { - if (PyInt_Check(item)) { - long i = PyInt_AS_LONG(item); - if (i < 0) - i += PyList_GET_SIZE(self); - return list_item(self, i); - } - else if (PyLong_Check(item)) { - Py_ssize_t i = PyLong_AsSsize_t(item); + if (PyInt_Check(item) || PyLong_Check(item)) { + Py_ssize_t i = PyInt_AsSsize_t(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) Modified: python/branches/ssize_t/Objects/longobject.c ============================================================================== --- python/branches/ssize_t/Objects/longobject.c (original) +++ python/branches/ssize_t/Objects/longobject.c Fri Dec 30 11:16:44 2005 @@ -245,7 +245,7 @@ Returns -1 and sets an error condition if overflow occurs. */ Py_ssize_t -PyLong_AsSsize_t(PyObject *vv) +_PyLong_AsSsize_t(PyObject *vv) { register PyLongObject *v; size_t x, prev; @@ -253,8 +253,6 @@ int sign; if (vv == NULL || !PyLong_Check(vv)) { - if (vv != NULL && PyInt_Check(vv)) - return PyInt_AsSsize_t(vv); PyErr_BadInternalCall(); return -1; } Modified: python/branches/ssize_t/Objects/stringobject.c ============================================================================== --- python/branches/ssize_t/Objects/stringobject.c (original) +++ python/branches/ssize_t/Objects/stringobject.c Fri Dec 30 11:16:44 2005 @@ -1169,14 +1169,8 @@ static PyObject* string_subscript(PyStringObject* self, PyObject* item) { - if (PyInt_Check(item)) { - long i = PyInt_AS_LONG(item); - if (i < 0) - i += PyString_GET_SIZE(self); - return string_item(self,i); - } - else if (PyLong_Check(item)) { - Py_ssize_t i = PyLong_AsSsize_t(item); + if (PyInt_Check(item) || PyLong_Check(item)) { + Py_ssize_t i = PyInt_AsSsize_t(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) Modified: python/branches/ssize_t/Objects/tupleobject.c ============================================================================== --- python/branches/ssize_t/Objects/tupleobject.c (original) +++ python/branches/ssize_t/Objects/tupleobject.c Fri Dec 30 11:16:44 2005 @@ -585,14 +585,8 @@ static PyObject* tuplesubscript(PyTupleObject* self, PyObject* item) { - if (PyInt_Check(item)) { - long i = PyInt_AS_LONG(item); - if (i < 0) - i += PyTuple_GET_SIZE(self); - return tupleitem(self, i); - } - else if (PyLong_Check(item)) { - Py_ssize_t i = PyLong_AsSsize_t(item); + if (PyInt_Check(item) || PyLong_Check(item)) { + Py_ssize_t i = PyInt_AsSsize_t(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) Modified: python/branches/ssize_t/Objects/unicodeobject.c ============================================================================== --- python/branches/ssize_t/Objects/unicodeobject.c (original) +++ python/branches/ssize_t/Objects/unicodeobject.c Fri Dec 30 11:16:44 2005 @@ -6465,13 +6465,8 @@ static PyObject* unicode_subscript(PyUnicodeObject* self, PyObject* item) { - if (PyInt_Check(item)) { - long i = PyInt_AS_LONG(item); - if (i < 0) - i += PyString_GET_SIZE(self); - return unicode_getitem(self, i); - } else if (PyLong_Check(item)) { - Py_ssize_t i = PyLong_AsSsize_t(item); + if (PyInt_Check(item) || PyLong_Check(item)) { + Py_ssize_t i = PyInt_AsSsize_t(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) From python-checkins at python.org Fri Dec 30 13:31:40 2005 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 30 Dec 2005 13:31:40 +0100 (CET) Subject: [Python-checkins] commit of r41852 - in python/trunk: Misc/NEWS configure configure.in Message-ID: <20051230123140.DF4C71E4002@bag.python.org> Author: martin.v.loewis Date: Fri Dec 30 13:31:38 2005 New Revision: 41852 Modified: python/trunk/Misc/NEWS python/trunk/configure python/trunk/configure.in Log: Use -xcode=pic32 for SunPro. Will backport to 2.4. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Dec 30 13:31:38 2005 @@ -630,6 +630,8 @@ Build ----- +- Use -xcode=pic32 for CCSHARED on Solaris with SunPro. + - Bug #1189330: configure did not correctly determine the necessary value of LINKCC if python was built with GCC 4.0. Modified: python/trunk/configure ============================================================================== --- python/trunk/configure (original) +++ python/trunk/configure Fri Dec 30 13:31:38 2005 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 39267 . +# From configure.in Revision: 41764 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for python 2.5. # @@ -10413,6 +10413,7 @@ case $ac_sys_system/$ac_sys_release in SunOS*) if test "$GCC" = yes; then CCSHARED="-fPIC"; + else CCSHARED="-xcode=pic32"; fi;; hp*|HP*) if test "$GCC" = yes; then CCSHARED="-fPIC"; Modified: python/trunk/configure.in ============================================================================== --- python/trunk/configure.in (original) +++ python/trunk/configure.in Fri Dec 30 13:31:38 2005 @@ -1410,6 +1410,7 @@ case $ac_sys_system/$ac_sys_release in SunOS*) if test "$GCC" = yes; then CCSHARED="-fPIC"; + else CCSHARED="-xcode=pic32"; fi;; hp*|HP*) if test "$GCC" = yes; then CCSHARED="-fPIC"; From python-checkins at python.org Fri Dec 30 13:32:49 2005 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 30 Dec 2005 13:32:49 +0100 (CET) Subject: [Python-checkins] commit of r41853 - in python/branches/release24-maint: Misc/NEWS configure configure.in Message-ID: <20051230123249.EFF061E4002@bag.python.org> Author: martin.v.loewis Date: Fri Dec 30 13:32:48 2005 New Revision: 41853 Modified: python/branches/release24-maint/Misc/NEWS python/branches/release24-maint/configure python/branches/release24-maint/configure.in Log: Use -xcode=pic32 for SunPro. Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Fri Dec 30 13:32:48 2005 @@ -105,6 +105,8 @@ Build ----- +- Use -xcode=pic32 for CCSHARED on Solaris with SunPro. + - The Windows .msi files are now compressed using lzx:21. This produces a significantly smaller installer. Modified: python/branches/release24-maint/configure ============================================================================== --- python/branches/release24-maint/configure (original) +++ python/branches/release24-maint/configure Fri Dec 30 13:32:48 2005 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 39265 . +# From configure.in Revision: 41546 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for python 2.4. # @@ -10412,6 +10412,7 @@ case $ac_sys_system/$ac_sys_release in SunOS*) if test "$GCC" = yes; then CCSHARED="-fPIC"; + else CCSHARED="-xcode=pic32"; fi;; hp*|HP*) if test "$GCC" = yes; then CCSHARED="-fPIC"; Modified: python/branches/release24-maint/configure.in ============================================================================== --- python/branches/release24-maint/configure.in (original) +++ python/branches/release24-maint/configure.in Fri Dec 30 13:32:48 2005 @@ -1410,6 +1410,7 @@ case $ac_sys_system/$ac_sys_release in SunOS*) if test "$GCC" = yes; then CCSHARED="-fPIC"; + else CCSHARED="-xcode=pic32"; fi;; hp*|HP*) if test "$GCC" = yes; then CCSHARED="-fPIC"; From python-checkins at python.org Fri Dec 30 13:51:47 2005 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 30 Dec 2005 13:51:47 +0100 (CET) Subject: [Python-checkins] commit of r41854 - python/trunk/Lib/test/test_locale.py Message-ID: <20051230125147.1BD911E4002@bag.python.org> Author: martin.v.loewis Date: Fri Dec 30 13:51:45 2005 New Revision: 41854 Modified: python/trunk/Lib/test/test_locale.py Log: Work around test_locale failing on Solaris. Will backport to 2.4. Modified: python/trunk/Lib/test/test_locale.py ============================================================================== --- python/trunk/Lib/test/test_locale.py (original) +++ python/trunk/Lib/test/test_locale.py Fri Dec 30 13:51:45 2005 @@ -38,13 +38,15 @@ print "yes" try: - testformat("%f", 1024, grouping=1, output='1,024.000000') + # On Solaris 10, the thousands_sep is the empty string + sep = locale.localeconv()['thousands_sep'] + testformat("%f", 1024, grouping=1, output='1%s024.000000' % sep) testformat("%f", 102, grouping=1, output='102.000000') testformat("%f", -42, grouping=1, output='-42.000000') testformat("%+f", -42, grouping=1, output='-42.000000') testformat("%20.f", -42, grouping=1, output=' -42') - testformat("%+10.f", -4200, grouping=1, output=' -4,200') - testformat("%-10.f", 4200, grouping=1, output='4,200 ') + testformat("%+10.f", -4200, grouping=1, output=' -4%s200' % sep) + testformat("%-10.f", 4200, grouping=1, output='4%s200 ' % sep) # Invoke getpreferredencoding to make sure it does not cause exceptions, locale.getpreferredencoding() finally: @@ -65,6 +67,9 @@ print "yes" try: + if sys.platform == 'sunos5': + # On Solaris, in en_US.UTF-8, \xa0 is a space + raise locale.Error oldlocale = locale.setlocale(locale.LC_CTYPE) locale.setlocale(locale.LC_CTYPE, 'en_US.UTF-8') except locale.Error: From python-checkins at python.org Fri Dec 30 13:52:15 2005 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 30 Dec 2005 13:52:15 +0100 (CET) Subject: [Python-checkins] commit of r41855 - python/branches/release24-maint/Lib/test/test_locale.py Message-ID: <20051230125215.3F0A61E4002@bag.python.org> Author: martin.v.loewis Date: Fri Dec 30 13:52:13 2005 New Revision: 41855 Modified: python/branches/release24-maint/Lib/test/test_locale.py Log: Work around test_locale failing on Solaris 10. Modified: python/branches/release24-maint/Lib/test/test_locale.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_locale.py (original) +++ python/branches/release24-maint/Lib/test/test_locale.py Fri Dec 30 13:52:13 2005 @@ -38,13 +38,15 @@ print "yes" try: - testformat("%f", 1024, grouping=1, output='1,024.000000') + # On Solaris 10, the thousands_sep is the empty string + sep = locale.localeconv()['thousands_sep'] + testformat("%f", 1024, grouping=1, output='1%s024.000000' % sep) testformat("%f", 102, grouping=1, output='102.000000') testformat("%f", -42, grouping=1, output='-42.000000') testformat("%+f", -42, grouping=1, output='-42.000000') testformat("%20.f", -42, grouping=1, output=' -42') - testformat("%+10.f", -4200, grouping=1, output=' -4,200') - testformat("%-10.f", 4200, grouping=1, output='4,200 ') + testformat("%+10.f", -4200, grouping=1, output=' -4%s200' % sep) + testformat("%-10.f", 4200, grouping=1, output='4%s200 ' % sep) # Invoke getpreferredencoding to make sure it does not cause exceptions, locale.getpreferredencoding() finally: @@ -65,6 +67,9 @@ print "yes" try: + if sys.platform == 'sunos5': + # On Solaris, in en_US.UTF-8, \xa0 is a space + raise locale.Error oldlocale = locale.setlocale(locale.LC_CTYPE) locale.setlocale(locale.LC_CTYPE, 'en_US.UTF-8') except locale.Error: From python-checkins at python.org Fri Dec 30 17:11:38 2005 From: python-checkins at python.org (phillip.eby) Date: Fri, 30 Dec 2005 17:11:38 +0100 (CET) Subject: [Python-checkins] commit of r41856 - sandbox/trunk/setuptools/setuptools/command/egg_info.py Message-ID: <20051230161138.99F1C1E4002@bag.python.org> Author: phillip.eby Date: Fri Dec 30 17:11:35 2005 New Revision: 41856 Modified: sandbox/trunk/setuptools/setuptools/command/egg_info.py Log: Fix unescaped '-' in .egg-info directory names. Note that this means you must rename any existing .egg-info directory inside a project that has a '-' in it! Modified: sandbox/trunk/setuptools/setuptools/command/egg_info.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/egg_info.py (original) +++ sandbox/trunk/setuptools/setuptools/command/egg_info.py Fri Dec 30 17:11:35 2005 @@ -58,7 +58,7 @@ self.egg_base = (dirs or {}).get('',os.curdir) self.ensure_dirname('egg_base') - self.egg_info = self.egg_name+'.egg-info' + self.egg_info = self.egg_name.replace('-','_')+'.egg-info' if self.egg_base != os.curdir: self.egg_info = os.path.join(self.egg_base, self.egg_info) From python-checkins at python.org Fri Dec 30 17:35:45 2005 From: python-checkins at python.org (phillip.eby) Date: Fri, 30 Dec 2005 17:35:45 +0100 (CET) Subject: [Python-checkins] commit of r41857 - sandbox/trunk/setuptools/setuptools/command/develop.py sandbox/trunk/setuptools/setuptools/command/egg_info.py Message-ID: <20051230163545.4695C1E401F@bag.python.org> Author: phillip.eby Date: Fri Dec 30 17:35:42 2005 New Revision: 41857 Modified: sandbox/trunk/setuptools/setuptools/command/develop.py sandbox/trunk/setuptools/setuptools/command/egg_info.py Log: Allow most commands to work with an existing .egg-info directory w/a '-' in it, but warn about it and refuse to run "develop" until the existing directory is renamed. This should allow older source distributions and checkouts to keep working with 0.6a9. Modified: sandbox/trunk/setuptools/setuptools/command/develop.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/develop.py (original) +++ sandbox/trunk/setuptools/setuptools/command/develop.py Fri Dec 30 17:35:42 2005 @@ -2,6 +2,7 @@ from distutils.util import convert_path from pkg_resources import Distribution, PathMetadata, normalize_path from distutils import log +from distutils.errors import * import sys, os class develop(easy_install): @@ -38,11 +39,14 @@ - def finalize_options(self): ei = self.get_finalized_command("egg_info") - self.args = [ei.egg_name] - + if ei.broken_egg_info: + raise DistutilsError( + "Please rename %r to %r before using 'develop'" + % (ei.egg_info, ei.broken_egg_info) + ) + self.args = [ei.egg_name] easy_install.finalize_options(self) self.egg_link = os.path.join(self.install_dir, ei.egg_name+'.egg-link') self.egg_base = ei.egg_base @@ -76,10 +80,6 @@ - - - - def uninstall_link(self): if os.path.exists(self.egg_link): log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) Modified: sandbox/trunk/setuptools/setuptools/command/egg_info.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/egg_info.py (original) +++ sandbox/trunk/setuptools/setuptools/command/egg_info.py Fri Dec 30 17:35:42 2005 @@ -37,7 +37,7 @@ self.tag_build = None self.tag_svn_revision = 0 self.tag_date = 0 - + self.broken_egg_info = False def finalize_options (self): self.egg_name = safe_name(self.distribution.get_name()) @@ -61,6 +61,7 @@ self.egg_info = self.egg_name.replace('-','_')+'.egg-info' if self.egg_base != os.curdir: self.egg_info = os.path.join(self.egg_base, self.egg_info) + if '-' in self.egg_name: self.check_broken_egg_info() # Set package version for the benefit of dumber commands # (e.g. sdist, bdist_wininst, etc.) @@ -79,7 +80,6 @@ - def write_or_delete_file(self, what, filename, data): """Write `data` to `filename` or delete if empty @@ -170,6 +170,20 @@ mm.run() self.filelist = mm.filelist + def check_broken_egg_info(self): + bei = self.egg_name+'.egg-info' + if self.egg_base != os.curdir: + bei = os.path.join(self.egg_base, bei) + if os.path.exists(bei): + log.warn( + "-"*78+'\n' + "Note: Your current .egg-info directory has a '-' in its name;" + '\nthis will not work correctly with "setup.py develop".\n\n' + 'Please rename %s to %s to correct this problem.\n'+'-'*78, + bei, self.egg_info + ) + self.broken_egg_info = self.egg_info + self.egg_info = bei # make it work for now class FileList(FileList): """File list that accepts only existing, platform-independent paths""" @@ -190,23 +204,10 @@ - - - - - - - - - - - - - class manifest_maker(sdist): template = "MANIFEST.in" - + def initialize_options (self): self.use_defaults = 1 self.prune = 1 @@ -300,7 +301,7 @@ safe = getattr(cmd.distribution,'zip_safe',None) import bdist_egg; bdist_egg.write_safety_flag(cmd.egg_info, safe) - + def warn_depends_obsolete(cmd, basename, filename): if os.path.exists(filename): log.warn( From python-checkins at python.org Fri Dec 30 19:42:45 2005 From: python-checkins at python.org (tim.peters) Date: Fri, 30 Dec 2005 19:42:45 +0100 (CET) Subject: [Python-checkins] commit of r41858 - in python/trunk: Lib/test/test_descr.py setup.py Message-ID: <20051230184245.891371E4002@bag.python.org> Author: tim.peters Date: Fri Dec 30 19:42:42 2005 New Revision: 41858 Modified: python/trunk/Lib/test/test_descr.py python/trunk/setup.py Log: Whitespace normalization. Modified: python/trunk/Lib/test/test_descr.py ============================================================================== --- python/trunk/Lib/test/test_descr.py (original) +++ python/trunk/Lib/test/test_descr.py Fri Dec 30 19:42:42 2005 @@ -1664,7 +1664,7 @@ pass else: raise TestFailed, "non-sequence mro() return not caught" - + def overloading(): if verbose: print "Testing operator overloading..." Modified: python/trunk/setup.py ============================================================================== --- python/trunk/setup.py (original) +++ python/trunk/setup.py Fri Dec 30 19:42:42 2005 @@ -159,7 +159,7 @@ line = line.split() remove_modules.append(line[0]) input.close() - + for ext in self.extensions[:]: if ext.name in remove_modules: self.extensions.remove(ext) From python-checkins at python.org Fri Dec 30 21:46:25 2005 From: python-checkins at python.org (tim.peters) Date: Fri, 30 Dec 2005 21:46:25 +0100 (CET) Subject: [Python-checkins] commit of r41859 - python/trunk/Lib/test/test_logging.py Message-ID: <20051230204625.1370A1E4002@bag.python.org> Author: tim.peters Date: Fri Dec 30 21:46:23 2005 New Revision: 41859 Modified: python/trunk/Lib/test/test_logging.py Log: test_main(): Restore the original root logger level after running the tests. This stops the confusing/annoying: No handlers could be found for logger "cookielib" message we got whenever some test running after test_logging happened to use cookielib.py (when not using regrtest's -r, this happened during test_urllib2; when using -r, it varied). Modified: python/trunk/Lib/test/test_logging.py ============================================================================== --- python/trunk/Lib/test/test_logging.py (original) +++ python/trunk/Lib/test/test_logging.py Fri Dec 30 21:46:23 2005 @@ -487,11 +487,20 @@ # or a Mac OS X box which supports very little locale stuff at all original_locale = None + # Save and restore the original root logger level across the tests. + # Otherwise, e.g., if any test using cookielib runs after test_logging, + # cookielib's debug-level logger tries to log messages, leading to + # confusing: + # No handlers could be found for logger "cookielib" + # output while the tests are running. + root_logger = logging.getLogger("") + original_logging_level = root_logger.getEffectiveLevel() try: test_main_inner() finally: if original_locale is not None: locale.setlocale(locale.LC_ALL, original_locale) + root_logger.setLevel(original_logging_level) if __name__ == "__main__": sys.stdout.write("test_logging\n")