Commit d2449399 authored by jack's avatar jack

Putting pyexpat under cvs

parent 8c08723f
# Universal Makefile to build Python extensions.
#
# Instructions:
#
# 0) Build and install the basic Python 1.4 distribution. You must
# also install the headers ("make inclinstall") and the binary library
# files ("make libainstall").
#
# 1) Edit Makefile.pre.in (not any other file!!!) to change the
# definition of installdir (and possibly exec_installdir). These
# should match the prefix and exec_prefix used when installing Python.
# Alternatively, you can specify a value for installdir on the
# "make -f Makefile.pre.in Makefile" command line (see below). This
# is probably easier since it avoids editing Makefile.pre.in at all...
#
# 2) Copy Setup.in to Setup and edit Setup to change the selection of
# modules you want to use. Read the comments in the core Python's
# Modules/Setup.in for more detailed instructions.
#
# 3) Run "make Makefile -f Makefile.pre.in". This creates Makefile
# (producing Makefile.pre and sedscript as intermediate files) and
# config.c. Values for installdir, srcdir, VPATH, LINKPATH, OPT,
# BASELIB and BASESETUP on the make command line will be incorporated
# in the final Makefile.
#
# 4) Run "make". This creates a Python executable. The set of
# built-in modules and features is a superset of that of the basic
# Python -- additions are taken from ./Setup.
#
# If you don't actually want to install the Python headers and
# binary library files, you can edit the "Fixed definitions" section
# below to point directly into the source and/or build tree.
#
# Note: Each time you edit Makefile.pre.in or Setup, you must run
# "make Makefile" before running "make".
#
# Hint: if you want to use VPATH, you can start in an empty
# subdirectory and say (e.g.):
# make -f ../Makefile.pre.in VERSION=1.4 srcdir=.. VPATH=.. Makefile
# === Variables that you just *have* to customize manually ===
# (You can also specify their values on the command line for
# "make -f Makefile.pre.in VERSION=1.4 Makefile".)
# The prefix used by "make inclinstall libainstall" of core python
installdir= /ufs/jack/src/python/build.irix6/tmp
# The exec_prefix used by the same
exec_installdir=$(installdir)
# Source directory and VPATH in case you want to use VPATH.
# (You will have to edit these two lines yourself -- there is no
# automatic support as the Makefile is not generated by
# config.status.)
srcdir= .
VPATH= .
# === Variables that you may want to customize ===
# Add possible -L options here
LINKPATH=
# You may want to change this to -O
OPT= -g
# Add more -I and -D options here
CFLAGS= $(OPT) -I$(INCLUDEPY) -I$(LIBPL) $(DEFS)
# These two variables can be set in Setup to merge extensions.
# See example[23].
BASELIB=
BASESETUP=
# === Variables set by makesetup ===
MODOBJS= _MODOBJS_
MODLIBS= _MODLIBS_
# === Definitions added by makesetup ===
# === Variables from configure (through sedscript) ===
VERSION= @VERSION@
CC= @CC@
DEFS= @DEFS@
LIBS= @LIBS@
LIBM= @LIBM@
LIBC= @LIBC@
RANLIB= @RANLIB@
MACHDEP= @MACHDEP@
SO= @SO@
LDSHARED= @LDSHARED@
CCSHARED= @CCSHARED@
LINKFORSHARED= @LINKFORSHARED@
# Install prefix for architecture-independent files
prefix= /usr/local
# Install prefix for architecture-dependent files
exec_prefix= $(prefix)
# === Fixed definitions ===
# Expanded directories
BINDIR= $(exec_installdir)/bin
LIBDIR= $(exec_prefix)/lib
MANDIR= $(installdir)/man
INCLUDEDIR= $(installdir)/include
SCRIPTDIR= $(prefix)/lib
# Detailed destination directories
BINLIBDEST= $(LIBDIR)/python$(VERSION)
LIBDEST= $(SCRIPTDIR)/python$(VERSION)
INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)
LIBP= $(exec_installdir)/lib/python$(VERSION)
LIBPL= $(LIBP)/config
PYTHONLIBS= $(LIBPL)/libModules.a \
$(LIBPL)/libPython.a \
$(LIBPL)/libObjects.a \
$(LIBPL)/libParser.a
MAKESETUP= $(LIBPL)/makesetup
MAKEFILE= $(LIBPL)/Makefile
CONFIGC= $(LIBPL)/config.c
CONFIGCIN= $(LIBPL)/config.c.in
SETUP= $(LIBPL)/Setup
SYSLIBS= $(LIBM) $(LIBC)
ADDOBJS= $(LIBPL)/main.o getpath.o config.o
# === Fixed rules ===
all: python
sharedmods: $(SHAREDMODS)
python: $(ADDOBJS) lib.a $(PYTHONLIBS) Makefile $(BASELIB)
$(CC) $(ADDOBJS) lib.a $(PYTHONLIBS) \
$(LINKPATH) $(BASELIB) $(MODLIBS) $(LIBS) $(SYSLIBS) -o python
lib.a: $(MODOBJS)
-rm -f lib.a
ar cr lib.a $(MODOBJS)
-$(RANLIB) lib.a || \
echo "don't worry if ranlib fails -- probably SYSV or equiv"
# This runs makesetup *twice* to use the BASESETUP definition from Setup
config.c Makefile: Makefile.pre Setup $(BASESETUP) $(MAKESETUP)
$(MAKESETUP) \
-m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP)
$(MAKE) -f Makefile do-it-again
do-it-again:
$(MAKESETUP) \
-m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP)
config.o: config.c
$(CC) $(CFLAGS) -c config.c
getpath.o: $(LIBPL)/getpath.c Makefile
$(CC) $(CFLAGS) -DPYTHONPATH=\"$(PYTHONPATH)\" -c $(LIBPL)/getpath.c
# Setup is copied from Setup.in *only* if it doesn't yet exist
Setup:
cp $(srcdir)/Setup.in Setup
Makefile.pre: Makefile.pre.in sedscript
sed -f sedscript $(srcdir)/Makefile.pre.in >Makefile.pre
# Shortcuts to make the sed arguments on one line
P=prefix
E=exec_prefix
H=Generated automatically from Makefile.pre.in by sedscript.
sedscript: $(MAKEFILE)
sed -n \
-e '1s/.*/1i\\/p' \
-e '2s%.*%# $H%p' \
-e '/^VERSION=/s/^VERSION=[ ]*\(.*\)/s%@VERSION[@]%\1%/p' \
-e '/^CC=/s/^CC=[ ]*\(.*\)/s%@CC[@]%\1%/p' \
-e '/^DEFS=/s/^DEFS=[ ]*\(.*\)/s%@DEFS[@]%\1%/p' \
-e '/^LIBS=/s/^LIBS=[ ]*\(.*\)/s%@LIBS[@]%\1%/p' \
-e '/^LIBM=/s/^LIBM=[ ]*\(.*\)/s%@LIBM[@]%\1%/p' \
-e '/^LIBC=/s/^LIBC=[ ]*\(.*\)/s%@LIBC[@]%\1%/p' \
-e '/^RANLIB=/s/^RANLIB=[ ]*\(.*\)/s%@RANLIB[@]%\1%/p' \
-e '/^MACHDEP=/s/^MACHDEP=[ ]*\(.*\)/s%@MACHDEP[@]%\1%/p' \
-e '/^SO=/s/^SO=[ ]*\(.*\)/s%@SO[@]%\1%/p' \
-e '/^LDSHARED=/s/^LDSHARED=[ ]*\(.*\)/s%@LDSHARED[@]%\1%/p' \
-e '/^CCSHARED=/s/^CCSHARED=[ ]*\(.*\)/s%@CCSHARED[@]%\1%/p' \
-e '/^LINKFORSHARED=/s/^LINKFORSHARED=[ ]*\(.*\)/s%@LINKFORSHARED[@]%\1%/p' \
-e '/^$P=/s/^$P=\(.*\)/s%^$P=.*%$P=\1%/p' \
-e '/^$E=/s/^$E=\(.*\)/s%^$E=.*%$E=\1%/p' \
$(MAKEFILE) >sedscript
( \
echo "/^installdir=/s%=.*%= $(installdir)%"; \
echo "/^exec_installdir=/s%=.*%=$(exec_installdir)%"; \
echo "/^srcdir=/s%=.*%= $(srcdir)%"; \
echo "/^VPATH=/s%=.*%= $(VPATH)%"; \
echo "/^LINKPATH=/s%=.*%= $(LINKPATH)%"; \
echo "/^OPT=/s%=.*%= $(OPT)%"; \
echo "/^BASELIB=/s%=.*%= $(BASELIB)%"; \
echo "/^BASESETUP=/s%=.*%= $(BASESETUP)%"; \
) >>sedscript
clean:
-rm -f *.o *~
clobber: clean
-rm -f python lib.a sedscript config.c Makefile.pre
distclean: clobber
-rm -f Makefile Setup
Python Expat wrapper module, version of 19-May-98
=================================================
If you have downloaded the binary distribution for the macintosh you
can skip the "building" sections and go straight to the "using"
bit. If you are using a macintosh and do want to build from source you
should get the pyexpat.tgz distribution (Stuffit Expander with
Expander Enhancer will know how to unpack a gzipped tar file).
Building the pyexpat module under unix
--------------------------------------
- Build libexpat.a in expat. This version is very slightly different
from the original by James Clark (the libexpat.a target was added,
and a few C++ comments were replaced by C comments).
- Edit Makefile.pre.in and set your installdir
- make -f Makefile.pre.in VERSION=1.5.1 Makefile
- make sharedmods
- put the shared module somewhere in your sys.path
(if you want a static Python edit Setup.in, and replace the last line
with "make").
Building the pyexpat module on the macintosh
--------------------------------------------
- Unpack the various .hqx project files.
- All the projects are linked, so building pyexpat.prj should build
everything. If this doesn't work you will find the library
subprojects to build in the expat folder.
- Use EditPythonPrefs to add the current folder to sys.path.
Using the pyexpat module
-----------------------
The pyexpat module exports two functions:
ParserCreate(encoding) Creates a new parser object. The optional
encoding arg (a string) specifies the encoding.
ErrorString(number) Return a string corresponding to the given error
number.
Parser objects have one method:
Parse(data, isfinal) Parse some data. If the optional isfinal arg is 1
this is the last bit of data. Returns true if parsing
succeeded (so far), otherwise the error attributes have
information on the error.
Parser objects have the following attributes:
StartElementHandler, EndElementHandler, CharacterDataHandler,
ProcessingInstructionHandler - The Python handlers called for various
events. See below for the signatures.
ErrorCode, ErrorLineNumber, ErrorColumnNumber, ErrorByteIndex -
Readonly integers giving information on the current parse
error.
Testing it
----------
There's a very minimal test script in expattest.py. It should be easy
to adapt it to generate ESIS (but I'm not familiar enough with ESIS to
do it). This module parsed Hamlet in 2 seconds on an 180 Mhz R5000 SGI
O2.
Feedback
--------
This module currently lives at
ftp://ftp.cwi.nl/pub/jack/python/pyexpatsrc.tgz (source) and
ftp://ftp.cwi.nl/pub/jack/python/pyexpat.hqx (macintosh binary-only).
The author is Jack Jansen, jack@cwi.nl. The expat proper was written
by James Clark and can be found at http://www.jclark.com/xml/ .
Jack Jansen, CWI, Amsterdam
jack@cwi.nl
\ No newline at end of file
*shared*
pyexpat pyexpat.o expat/libexpat.a -Iexpat/xmlparse
"""This file (which is sourced, not imported) checks the version of the
"versioncheck" package. It is also an example of how to format your own
_checkversion.py file"""
import pyversioncheck
_PACKAGE="pyexpat"
_VERSION="1.1"
_URL="http://www.cwi.nl/~jack/pyexpatversion.txt"
try:
_myverbose=VERBOSE
except NameError:
_myverbose=1
pyversioncheck.versioncheck(_PACKAGE, _URL, _VERSION, verbose=_myverbose)
/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI or Corporation for National Research Initiatives or
CNRI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.
While CWI is the initial source for this software, a modified version
is made available by the Corporation for National Research Initiatives
(CNRI) at the Internet address ftp://ftp.python.org.
STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
CENTRUM OR CNRI 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.
******************************************************************/
#include "Python.h"
#include "xmlparse.h"
static PyObject *ErrorObject;
/* ----------------------------------------------------- */
/* Declarations for objects of type xmlparser */
typedef struct {
PyObject_HEAD
XML_Parser itself;
PyObject *StartElementHandler;
PyObject *EndElementHandler;
PyObject *CharacterDataHandler;
PyObject *ProcessingInstructionHandler;
} xmlparseobject;
staticforward PyTypeObject Xmlparsetype;
/* Callback routines */
static void
my_StartElementHandler(userdata, name, atts)
void *userdata;
char *name;
char **atts;
{
xmlparseobject *self = (xmlparseobject *)userdata;
PyObject *args;
PyObject *rv;
PyObject *attrs_obj;
int attrs_len;
char **attrs_p;
if (self->StartElementHandler
&& self->StartElementHandler != Py_None) {
for(attrs_len=0, attrs_p = atts;
*attrs_p;
attrs_p++, attrs_len++);
if( (attrs_obj = PyList_New(attrs_len)) == NULL )
return;
for(attrs_len=0, attrs_p = atts; *attrs_p;
attrs_p++, attrs_len++) {
PyList_SetItem(attrs_obj, attrs_len,
PyString_FromString(*attrs_p));
}
args = Py_BuildValue("(sO)", name, attrs_obj);
if (!args) return;
rv = PyEval_CallObject(self->StartElementHandler, args);
Py_XDECREF(args);
Py_XDECREF(rv);
}
}
static void
my_EndElementHandler(userdata, name)
void *userdata;
char *name;
{
xmlparseobject *self = (xmlparseobject *)userdata;
PyObject *args;
PyObject *rv;
if (self->EndElementHandler
&& self->EndElementHandler != Py_None) {
args = Py_BuildValue("(s)", name);
if (!args) return;
rv = PyEval_CallObject(self->EndElementHandler, args);
Py_XDECREF(args);
Py_XDECREF(rv);
}
}
static void
my_CharacterDataHandler(userdata, data, len)
void *userdata;
char *data;
int len;
{
xmlparseobject *self = (xmlparseobject *)userdata;
PyObject *args;
PyObject *rv;
if (self->CharacterDataHandler
&& self->CharacterDataHandler != Py_None) {
args = Py_BuildValue("(s#)", data, len);
if (!args) return;
rv = PyEval_CallObject(self->CharacterDataHandler, args);
Py_XDECREF(args);
Py_XDECREF(rv);
}
}
static void
my_ProcessingInstructionHandler(userdata, target, data)
void *userdata;
char *target;
char *data;
{
xmlparseobject *self = (xmlparseobject *)userdata;
PyObject *args;
PyObject *rv;
if (self->ProcessingInstructionHandler
&& self->ProcessingInstructionHandler != Py_None) {
args = Py_BuildValue("(ss)", target, data);
if (!args) return;
rv = PyEval_CallObject(self->ProcessingInstructionHandler,
args);
Py_XDECREF(args);
Py_XDECREF(rv);
}
}
/* ---------------------------------------------------------------- */
static char xmlparse_Parse__doc__[] =
"(data [,isfinal]) - Parse XML data"
;
static PyObject *
xmlparse_Parse(self, args)
xmlparseobject *self;
PyObject *args;
{
char *s;
int slen;
int isFinal = 0;
int rv;
if (!PyArg_ParseTuple(args, "s#|i", &s, &slen, &isFinal))
return NULL;
rv = XML_Parse(self->itself, s, slen, isFinal);
return Py_BuildValue("i", rv);
}
static struct PyMethodDef xmlparse_methods[] = {
{"Parse", (PyCFunction)xmlparse_Parse,
METH_VARARGS, xmlparse_Parse__doc__},
{NULL, NULL} /* sentinel */
};
/* ---------- */
static xmlparseobject *
newxmlparseobject(encoding)
char *encoding;
{
xmlparseobject *self;
self = PyObject_NEW(xmlparseobject, &Xmlparsetype);
if (self == NULL)
return NULL;
self->StartElementHandler = Py_None;
Py_INCREF(Py_None);
self->EndElementHandler = Py_None;
Py_INCREF(Py_None);
self->CharacterDataHandler = Py_None;
Py_INCREF(Py_None);
self->ProcessingInstructionHandler = Py_None;
Py_INCREF(Py_None);
if ((self->itself = XML_ParserCreate(encoding)) == NULL ) {
PyErr_SetString(PyExc_RuntimeError, "XML_ParserCreate failed");
Py_DECREF(self);
return NULL;
}
XML_SetUserData(self->itself, (void *)self);
XML_SetElementHandler(self->itself, my_StartElementHandler,
my_EndElementHandler);
XML_SetCharacterDataHandler(self->itself, my_CharacterDataHandler);
XML_SetProcessingInstructionHandler(self->itself,
my_ProcessingInstructionHandler);
return self;
}
static void
xmlparse_dealloc(self)
xmlparseobject *self;
{
Py_XDECREF(self->StartElementHandler);
Py_XDECREF(self->EndElementHandler);
Py_XDECREF(self->CharacterDataHandler);
Py_XDECREF(self->ProcessingInstructionHandler);
if (self->itself)
XML_ParserFree(self->itself);
self->itself = NULL;
PyMem_DEL(self);
}
static PyObject *
xmlparse_getattr(self, name)
xmlparseobject *self;
char *name;
{
long rv;
if (strcmp(name, "StartElementHandler") == 0) {
Py_INCREF(self->StartElementHandler);
return self->StartElementHandler;
}
if (strcmp(name, "EndElementHandler") == 0) {
Py_INCREF(self->EndElementHandler);
return self->EndElementHandler;
}
if (strcmp(name, "CharacterDataHandler") == 0) {
Py_INCREF(self->CharacterDataHandler);
return self->CharacterDataHandler;
}
if (strcmp(name, "ProcessingInstructionHandler") == 0) {
Py_INCREF(self->ProcessingInstructionHandler);
return self->ProcessingInstructionHandler;
}
if (strcmp(name, "ErrorCode") == 0)
return Py_BuildValue("l",
(long)XML_GetErrorCode(self->itself));
if (strcmp(name, "ErrorLineNumber") == 0)
return Py_BuildValue("l",
(long)XML_GetErrorLineNumber(self->itself));
if (strcmp(name, "ErrorColumnNumber") == 0)
return Py_BuildValue("l",
(long)XML_GetErrorColumnNumber(self->itself));
if (strcmp(name, "ErrorByteIndex") == 0)
return Py_BuildValue("l",
XML_GetErrorByteIndex(self->itself));
return Py_FindMethod(xmlparse_methods, (PyObject *)self, name);
}
static int
xmlparse_setattr(self, name, v)
xmlparseobject *self;
char *name;
PyObject *v;
{
/* Set attribute 'name' to value 'v'. v==NULL means delete */
if (v==NULL) {
PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute");
return -1;
}
if (strcmp(name, "StartElementHandler") == 0) {
Py_XDECREF(self->StartElementHandler);
self->StartElementHandler = v;
Py_INCREF(v);
return 0;
}
if (strcmp(name, "EndElementHandler") == 0) {
Py_XDECREF(self->EndElementHandler);
self->EndElementHandler = v;
Py_INCREF(v);
return 0;
}
if (strcmp(name, "CharacterDataHandler") == 0) {
Py_XDECREF(self->CharacterDataHandler);
self->CharacterDataHandler = v;
Py_INCREF(v);
return 0;
}
if (strcmp(name, "ProcessingInstructionHandler") == 0) {
Py_XDECREF(self->ProcessingInstructionHandler);
self->ProcessingInstructionHandler = v;
Py_INCREF(v);
return 0;
}
return -1;
}
static char Xmlparsetype__doc__[] =
"XML parser"
;
static PyTypeObject Xmlparsetype = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"xmlparser", /*tp_name*/
sizeof(xmlparseobject), /*tp_basicsize*/
0, /*tp_itemsize*/
/* methods */
(destructor)xmlparse_dealloc, /*tp_dealloc*/
(printfunc)0, /*tp_print*/
(getattrfunc)xmlparse_getattr, /*tp_getattr*/
(setattrfunc)xmlparse_setattr, /*tp_setattr*/
(cmpfunc)0, /*tp_compare*/
(reprfunc)0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
(hashfunc)0, /*tp_hash*/
(ternaryfunc)0, /*tp_call*/
(reprfunc)0, /*tp_str*/
/* Space for future expansion */
0L,0L,0L,0L,
Xmlparsetype__doc__ /* Documentation string */
};
/* End of code for xmlparser objects */
/* -------------------------------------------------------- */
static char pyexpat_ParserCreate__doc__[] =
"([encoding]) - Return a new XML parser object"
;
static PyObject *
pyexpat_ParserCreate(self, args)
PyObject *self; /* Not used */
PyObject *args;
{
char *encoding = NULL;
if (!PyArg_ParseTuple(args, "|s", encoding))
return NULL;
return (PyObject *)newxmlparseobject(encoding);
}
static char pyexpat_ErrorString__doc__[] =
"(errno) Returns string error for given number"
;
static PyObject *
pyexpat_ErrorString(self, args)
PyObject *self; /* Not used */
PyObject *args;
{
long code;
if (!PyArg_ParseTuple(args, "l", &code))
return NULL;
return Py_BuildValue("z", XML_ErrorString((int)code));
}
/* List of methods defined in the module */
static struct PyMethodDef pyexpat_methods[] = {
{"ParserCreate", (PyCFunction)pyexpat_ParserCreate,
METH_VARARGS, pyexpat_ParserCreate__doc__},
{"ErrorString", (PyCFunction)pyexpat_ErrorString,
METH_VARARGS, pyexpat_ErrorString__doc__},
{NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
};
/* Initialization function for the module (*must* be called initpyexpat) */
static char pyexpat_module_documentation[] =
""
;
void
initpyexpat()
{
PyObject *m, *d;
Xmlparsetype.ob_type = &PyType_Type;
/* Create the module and add the functions */
m = Py_InitModule4("pyexpat", pyexpat_methods,
pyexpat_module_documentation,
(PyObject*)NULL,PYTHON_API_VERSION);
/* Add some symbolic constants to the module */
d = PyModule_GetDict(m);
ErrorObject = PyString_FromString("pyexpat.error");
PyDict_SetItemString(d, "error", ErrorObject);
/* XXXX Add constants here */
#define MYCONST(name) \
PyDict_SetItemString(d, #name, PyInt_FromLong(name))
MYCONST(XML_ERROR_NONE);
MYCONST(XML_ERROR_NO_MEMORY);
MYCONST(XML_ERROR_SYNTAX);
MYCONST(XML_ERROR_NO_ELEMENTS);
MYCONST(XML_ERROR_INVALID_TOKEN);
MYCONST(XML_ERROR_UNCLOSED_TOKEN);
MYCONST(XML_ERROR_PARTIAL_CHAR);
MYCONST(XML_ERROR_TAG_MISMATCH);
MYCONST(XML_ERROR_DUPLICATE_ATTRIBUTE);
MYCONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT);
MYCONST(XML_ERROR_PARAM_ENTITY_REF);
MYCONST(XML_ERROR_UNDEFINED_ENTITY);
MYCONST(XML_ERROR_RECURSIVE_ENTITY_REF);
MYCONST(XML_ERROR_ASYNC_ENTITY);
MYCONST(XML_ERROR_BAD_CHAR_REF);
MYCONST(XML_ERROR_BINARY_ENTITY_REF);
MYCONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF);
MYCONST(XML_ERROR_MISPLACED_XML_PI);
MYCONST(XML_ERROR_UNKNOWN_ENCODING);
MYCONST(XML_ERROR_INCORRECT_ENCODING);
/* Check for errors */
if (PyErr_Occurred())
Py_FatalError("can't initialize module pyexpat");
}
(This file must be converted with BinHex 4.0)
:#h"jCAK`BA3ZF(*U!%e08(*$9dP&!3!!!0H(!*!%@SPMEfpX!!!!!`!!!5J!!-c
R!!$1$`!!#AJ!!!"P!3)"!*!*3fpNC9GKFR*TEh)J8(*[DQ9MG!#3lJ3!N!N'!3$
rr`#3#2rr!C!&!*!%(J%"!*!)QCN!!$rr2rmrr`%!!!%!#3CYEfjKBfm!N"`%!#J
!#J(#!S!!+!!+!F)#J!#3%!%!!!%!V!&A!4N#HJ$J!!#XC3!!IV-!!!#r!!!!`!!
!%VN!!"3!N!5r!*!3@NP3)!%!!!m"!!!'!3!!$3%!!!i"!!!$!!!!"J!!!#3"!!!
!!3!!$`)!!!-#!!!'!J!!#`)!!!d#!!!1!!!!"J!!!#3#!!!!!J!!$J!"!3!!!3%
!!3!!!!)!!!i!!!"4!!!!B!!!"*8!!!J!N!44!(3'3QPd8f9d"N*TG%0XFJeAB@N
!!!!"!3!!$!!!!!3!N!4*!!!!5J#3"!8!!!%!N!4,!!!!6!%!!!m&!3%"!*!%63!
!!%i!N!3&!!!"!*!%6`#3#`%!!`!!QCN!N!4rr`#3"(rr!*!%Irm!!!!'!3%!!3%
!!!!"!3%!!!!"!!!!!3#3"!F"!!%"!!%"!!!!!3!!"!#3$3%"!3#3#3)!N!jrr`#
3"!3!N!N'!3$rr`#3#2rr!C!&!*!%(J%"!*!)QCN!!$rr2rmrr`%!!!%!#3CYEfj
KBfm!N"`%!#J!#J(#!S!!+!!+!F)#J!#3%!%!!!%!@!#Z!-8#'J%h!!#XC3!!(E4
iH#j$4Ndf1%Xk8(*[DQ9MG#"0DA0M!(Ki,N0'66Bi5cT&C'PdEh)!H(JZ3dC00MK
,1NC[ER3!H(JZ3dC00MK,1P"bEfTPBh3J4AKdFQ&c!(Ki,N0'66Bi5cT$GA0dEfd
J5f9jGfpbC(-!H(JZ3dC00MK,1N&MBf9cFb"3BA4SF`"iH#j$4Ndf1%Xk3R9TE'3
J4AKdFQ&c!(Ki,N0'66Bi5cSf1%XJ3fpNC8GPEJ"iH#j$4Ndf1%Xk0MK,)%4TFf&
cFf9YBQaPFJ"iH#j$4Ndf1%Xk0MK,)%aTEQYPFJ"iH#j$4Ndf1%Xk0MK,)&"bEfT
PBh3!H(JZ3dC00MK,1N-[3bXV)%0[EA"TE'9b!(Ki,N0'66Bi5cT$,d-V+b"ABA*
ZD@jRF`"iH#j$4Ndf1%Xk3dC00MK,!(Ki,N0'66Bi5cT3BA0MB@`J3fpYF'PXCA)
!H(JZ3dC00MK,1P"KFf0KE#"ABA*ZD@jRF`"iH#j$4Ndf1%Xk8&"$)%0[C'9(C@i
!H(JZ3dC00MK,1P"33b"%DA0KFh0PE@*XCA)!H(JZ3dC00MK,1P"33b"-D@jVCA)
!H(JZ3dC00MK,1P"33b"348B!H(JZ3dC00MK,1P"33b"3FQpUC@0d!(Ki,N0'66B
i5cT38%0"FfdJ8'&ZC@`!H(JZ3dC00MK,1P*PHL"$Efe`D@aPFJ"iH#j$4Ndf1%X
k9'&bCf9d)&0PG(4TEQGc!(Ki,N0'66Bi5cT'D@aP)%eKF("TEQGc!(Ki,R"`BcT
3FQpUC@0d)%eTFf-!H(JZF("M1N9NDA4[FJ"iH#j`F'-k4QpZG!"iH#j`F'-k8(*
[DQ9MG#"&H(4bBA-!H(JZF("M1N0eFh4[E5",CAPhEh*NF`"iH#j`F'-k3@0MCA0
c)&"KG'Kc!(Ki,R"`BcT#G@PXC#"&H(4bBA-!H(JZF("M1MBi5b"$Ef4P4f9Z!(K
i,R"`BcSf1%XJ4'PcBA0cC@eLE'9b!(Ki,R"`BcSf1%XJ6'PZDf9b!(Ki,R"`BcS
f1%XJ8(*[DQ9MG!"iH#j`F'-k3bp$+bXJ3fpYF'PXCA)!H(JZF("M1N-[3bXV)&G
KFQjTEQGc!(Ki,R"`BcT$4Ndf1%X!H(JZF("M1P"KFf0KE#"$Efe`D@aPFJ"iH#j
`F'-k8'&cBf&X)&GKFQjTEQGc!(Ki,R"`BcT38%-J3fpNC8GPEJ"iH#j`F'-k8&"
$)%4TFf&cFf9YBQaPFJ"iH#j`F'-k8&"$)%aTEQYPFJ"iH#j`F'-k8&"$)&"&4J"
iH#j`F'-k8&"$)&"bEfTPBh3!H(JZF("M1P"33d&cE5"3B@jPE!"iH#j`F'-k8Q9
k)%0[EA"TE'9b!(Ki,R"`BcT8BA*RCA3J8f9dG'PZCh-!H(JZF("M1NCTE'8J6@&
`F'PZCh-!8(*[DQ9MG#"'D@aP)%aTFh3!H(JZ3dC00MK,1NP5)%p`G'PYDATPFJ"
iH#j$4Ndf1%Xk6@&M6e-J6@9bCf8J8'&ZC@`!H(JZF("M1NP5)%p`G'PYDATPFJ"
iH#j`F'-k6@&M6e-J6@9bCf8J8'&ZC@`!H'eXG'pV,N0'66Bi5cT$GA0dEfdJ5f9
jGfpbC(-!H'eXG'pV,N0'66Bi5cT"Bf0PFh-J8'&dD(-!H'eXG'pV,N0'66Bi5cT
8BA*RCA3J8f9dG'PZCh-!H'eXG'pV,N0'66Bi5cT'D@aP)%eKF("TEQGc!(KYE(4
[Dbj$4Ndf1%Xk3R9TE'3J4AKdFQ&c!(KYE(4[Dbj$4Ndf1%Xk0MK,)%0[C'9(C@i
!H'eXG'pV,N0'66Bi5cSf1%XJ4'PcBA0cC@eLE'9b!(KYE(4[Dbj$4Ndf1%Xk0MK
,)%aTEQYPFJ"iE@adEfXZ3dC00MK,1MBi5b"3FQpUC@0d!(KYE(4[Dbj$4Ndf1%X
k3bp$+bXJ3fpYF'PXCA)!H'eXG'pV,N0'66Bi5cT$,d-V+b"ABA*ZD@jRF`"iE@a
dEfXZ3dC00MK,1N0'66Bi5`"iE@adEfXZ3dC00MK,1NP5)%p`G'PYDATPFJ"iE@a
dEfXZ3dC00MK,1NeKBdp6)%ePFQGP)&"KEQ9X!(KYE(4[Dbj$4Ndf1%Xk8'&cBf&
X)%0[EA"TE'9b!(KYE(4[Dbj$4Ndf1%Xk8'&cBf&X)&GKFQjTEQGc!(KYE(4[Dbj
$4Ndf1%Xk8&"$)%0[C'9(C@i!H'eXG'pV,N0'66Bi5cT38%-J4'PcBA0cC@eLE'9
b!(KYE(4[Dbj$4Ndf1%Xk8&"$)%aTEQYPFJ"iE@adEfXZ3dC00MK,1P"33b"348B
!H'eXG'pV,N0'66Bi5cT38%-J8(*[DQ9MG!"iE@adEfXZ3dC00MK,1P"33d&cE5"
3B@jPE!"iE@adEfXZ3dC00MK,1P*PHL"$Efe`D@aPFJ"iE@adEfXZF("M1N0eFh4
[E5",CAPhEh*NF`"iE@adEfXZF("M1N&MBf9cFb"3BA4SF`"iE@adEfXZF("M1P4
KFQGPG#"6CA4dD@jRF`"iE@adEfXZF("M1NCTE'8J6@&`F'PZCh-!H'eXG'pV,R"
`BcT#G@PXC#"&H(4bBA-!H'eXG'pV,R"`BcSf1%XJ3fpNC8GPEJ"iE@adEfXZF("
M1MBi5b"%DA0KFh0PE@*XCA)!H'eXG'pV,R"`BcSf1%XJ6'PZDf9b!(KYE(4[Dbj
`F'-k0MK,)&"bEfTPBh3!H'eXG'pV,R"`BcT$,d-V+b"$Efe`D@aPFJ"iE@adEfX
ZF("M1N-[3bXV)&GKFQjTEQGc!(KYE(4[Dbj`F'-k3dC00MK,!(KYE(4[Dbj`F'-
k59)J6h"dD@eTHQ9b!(KYE(4[Dbj`F'-k6@&M6e-J6@9bCf8J8'&ZC@`!H'eXG'p
V,R"`BcT3BA0MB@`J3fpYF'PXCA)!H'eXG'pV,R"`BcT3BA0MB@`J9f&bEQPZCh-
!H'eXG'pV,R"`BcT38%-J3fpNC8GPEJ"iE@adEfXZF("M1P"33b"%DA0KFh0PE@*
XCA)!H'eXG'pV,R"`BcT38%-J6'PZDf9b!(KYE(4[Dbj`F'-k8&"$)&"&4J"iE@a
dEfXZF("M1P"33b"3FQpUC@0d!(KYE(4[Dbj`F'-k8&"$3A0Y)&"KEQ9X!(KYE(4
[Dbj`F'-k8Q9k)%0[EA"TE'9b!(KYE(4[Dbj$4Ndf1%Xk4'9LG@GRCA)J9'&bCf9
d!(KYE(4[Dbj$4Ndf1%Xk4P43)&"KEQ9X!(KYE(4[Dbj$4Ndf1%Xk5Q&fB5"-B@j
RG@&RC3"iE@adEfXZ3dC00MK,1NTKGQ%J6h9dF(9d!(KYE(4[Dbj$4Ndf1%Xk5Q&
fB5"3FQpUC@0d!(KYE(4[Dbj$4Ndf1%Xk5Q&fB84[Bb"3FQpUC@0d!(KYE(4[Dbj
$4Ndf1%Xk9fPZ8N-J3fpYF'PXCA)!H'eXG'pV,N0'66Bi5cTi1$BJ3fpNC8GPEJ"
iE@adEfXZ3dC00MK,1RJi0L"&H'0PF(4TEfjc)&"KEQ9X!(KYE(4[Dbj$4Ndf1%X
kH$Jf)%aTEQYPFJ"iE@adEfXZ3dC00MK,1RJi0L"3FQpUC@0d!(KYE(4[Dbj`F'-
k4'9LG@GRCA)J9'&bCf9d!(KYE(4[Dbj`F'-k4P43)&"KEQ9X!(KYE(4[Dbj`F'-
k5Q&fB5"-B@jRG@&RC3"iE@adEfXZF("M1NTKGQ%J6h9dF(9d!(KYE(4[Dbj`F'-
k5Q&fB5"3FQpUC@0d!(KYE(4[Dbj`F'-k5Q&fB84[Bb"3FQpUC@0d!(KYE(4[Dbj
`F'-k9fPZ8N-J3fpYF'PXCA)!H'eXG'pV,R"`BcTi1$BJ3fpNC8GPEJ"iE@adEfX
ZF("M1RJi0L"&H'0PF(4TEfjc)&"KEQ9X!(KYE(4[Dbj`F'-kH$Jf)%aTEQYPFJ"
iE@adEfXZF("M1RJi0L"3FQpUC@0d!("jCAK`BA3Z3dC00MK,1N0eFh4[E5",CAP
hEh*NF`"`H@9iF'&d,N0'66Bi5cT"Bf0PFh-J8'&dD(-!F(PPH("KG#j$4Ndf1%X
k9'&bCf9d)&0PG(4TEQGc!("jCAK`BA3Z3dC00MK,1NCTE'8J6@&`F'PZCh-!F(P
PH("KG#j$4Ndf1%Xk3R9TE'3J4AKdFQ&c!("jCAK`BA3Z3dC00MK,1N4PBR9RCf9
b)&4KFQGPG!"`H@9iF'&d,N0'66Bi5cSf1%XJ3fpNC8GPEJ"`H@9iF'&d,N0'66B
i5cSf1%XJ4'PcBA0cC@eLE'9b!("jCAK`BA3Z3dC00MK,1MBi5b"-D@jVCA)!F(P
PH("KG#j$4Ndf1%Xk0MK,)&"bEfTPBh3!F(PPH("KG#j$4Ndf1%Xk3bp$+bXJ3fp
YF'PXCA)!F(PPH("KG#j$4Ndf1%Xk3bp$+bXJ9f&bEQPZCh-!F(PPH("KG#j$4Nd
f1%Xk3dC00MK,!("jCAK`BA3Z3dC00MK,1NC88#"3B@jPE!"`H@9iF'&d,N0'66B
i5cT*8L"2F(4TE@PkCA)!F(PPH("KG#j$4Ndf1%Xk5Q&fB5"-B@jRG@&RC3"`H@9
iF'&d,N0'66Bi5cT+BACK)%peG("eG!"`H@9iF'&d,N0'66Bi5cT+BACK)&"bEfT
PBh3!F(PPH("KG#j$4Ndf1%Xk5Q&fB84[Bb"3FQpUC@0d!("jCAK`BA3Z3dC00MK
,1NeKBdp6)%ePFQGP)&"KEQ9X!("jCAK`BA3Z3dC00MK,1P"KFf0KE#"$Efe`D@a
PFJ"`H@9iF'&d,N0'66Bi5cT3BA0MB@`J9f&bEQPZCh-!F(PPH("KG#j$4Ndf1%X
k8&"$)%0[C'9(C@i!F(PPH("KG#j$4Ndf1%Xk8&"$)%4TFf&cFf9YBQaPFJ"`H@9
iF'&d,N0'66Bi5cT38%-J6'PZDf9b!("jCAK`BA3Z3dC00MK,1P"33b"348B!F(P
PH("KG#j$4Ndf1%Xk8&"$)&"bEfTPBh3!F(PPH("KG#j$4Ndf1%Xk8&"$3A0Y)&"
KEQ9X!("jCAK`BA3Z3dC00MK,1P*PHL"$Efe`D@aPFJ"`H@9iF'&d,N0'66Bi5cT
AD@j53b"$Efe`D@aPFJ"`H@9iF'&d,N0'66Bi5cTi1$BJ3fpNC8GPEJ"`H@9iF'&
d,N0'66Bi5cTi1$BJ4AKMCA"dD@pZFb"3B@jPE!"`H@9iF'&d,N0'66Bi5cTi1$B
J6'PZDf9b!("jCAK`BA3Z3dC00MK,1RJi0L"3FQpUC@0d!("jCAK`BA3ZF("M1N0
eFh4[E5",CAPhEh*NF`"`H@9iF'&d,R"`BcT"Bf0PFh-J8'&dD(-!F(PPH("KG#j
`F'-k9'&bCf9d)&0PG(4TEQGc!("jCAK`BA3ZF("M1NCTE'8J6@&`F'PZCh-!F(P
PH("KG#j`F'-k3R9TE'3J4AKdFQ&c!("jCAK`BA3ZF("M1N4PBR9RCf9b)&4KFQG
PG!"`H@9iF'&d,R"`BcSf1%XJ3fpNC8GPEJ"`H@9iF'&d,R"`BcSf1%XJ4'PcBA0
cC@eLE'9b!("jCAK`BA3ZF("M1MBi5b"-D@jVCA)!F(PPH("KG#j`F'-k0MK,)&"
bEfTPBh3!F(PPH("KG#j`F'-k3bp$+bXJ3fpYF'PXCA)!F(PPH("KG#j`F'-k3bp
$+bXJ9f&bEQPZCh-!F(PPH("KG#j`F'-k3dC00MK,!("jCAK`BA3ZF("M1NC88#"
3B@jPE!"`H@9iF'&d,R"`BcT*8L"2F(4TE@PkCA)!F(PPH("KG#j`F'-k5Q&fB5"
-B@jRG@&RC3"`H@9iF'&d,R"`BcT+BACK)%peG("eG!"`H@9iF'&d,R"`BcT+BAC
K)&"bEfTPBh3!F(PPH("KG#j`F'-k5Q&fB84[Bb"3FQpUC@0d!("jCAK`BA3ZF("
M1NeKBdp6)%ePFQGP)&"KEQ9X!("jCAK`BA3ZF("M1P"KFf0KE#"$Efe`D@aPFJ"
`H@9iF'&d,R"`BcT3BA0MB@`J9f&bEQPZCh-!F(PPH("KG#j`F'-k8&"$)%0[C'9
(C@i!F(PPH("KG#j`F'-k8&"$)%4TFf&cFf9YBQaPFJ"`H@9iF'&d,R"`BcT38%-
J6'PZDf9b!("jCAK`BA3ZF("M1P"33b"348B!F(PPH("KG#j`F'-k8&"$)&"bEfT
PBh3!F(PPH("KG#j`F'-k8&"$3A0Y)&"KEQ9X!("jCAK`BA3ZF("M1P*PHL"$Efe
`D@aPFJ"`H@9iF'&d,R"`BcTAD@j53b"$Efe`D@aPFJ"`H@9iF'&d,R"`BcTi1$B
J3fpNC8GPEJ"`H@9iF'&d,R"`BcTi1$BJ4AKMCA"dD@pZFb"3B@jPE!"`H@9iF'&
d,R"`BcTi1$BJ6'PZDf9b!("jCAK`BA3ZF("M1RJi0L"3FQpUC@0d!*$r!*"--J!
!!)%!!!##!!!!J`!!!)3!!!"m!!!!I`!!!)8!!!#'!!!!K`!!!(X!!!#!!!!!IJ!
!!)J!!!#*!!!!LJ!!!)X!!!#-!!!!M3!!!)i!!!#2!!!!N!!!!!#4!!!!NJ!!!*-
!!!#8!!!!P3!!!*B!!!#A!!!!I3!!!*J!!!#C!!!!QJ!!!*X!!!#F!!!!S`!!!+3
!!!#P!!!!TJ!!!*i!!!#K!!!!T`!!!+J!!!#T!!!!R3!!!+)!!!#J!!!!UJ!!!+X
!!!#X!!!!V3!!!+i!!!#[!!!!X!!!!,%!!!#b!!!!X`!!!,3!!!#e!!!!YJ!!!,F
!!!#i!!!!Z3!!!*m!!!#k!!!!Z`!!!,`!!!#p!!!![J!!!$`!!!!p!!!!2J!!!$m
!!!!i!!!!1`!!!%!!!!""!!!!3J!!!$F!!!"P!!!!1J!!!'B!!!"$!!!!C`!!!'J
!!!"T!!!!DJ!!!%3!!!"&!!!!4J!!!%F!!!")!!!!53!!!%S!!!",!!!!6!!!!%d
!!!!j!!!!D`!!!'`!!!"Y!!!!EJ!!!'m!!!"6!!!!9!!!!&8!!!"@!!!!6`!!!&)
!!!"A!!!!@!!!!&N!!!"1!!!!F!!!!&%!!!"a!!!!@J!!!()!!!"c!!!!G!!!!(8
!!!"E!!!!A!!!!&d!!!"H!!!!A`!!!'!!!!"K!!!!BJ!!!'-!!!"N!!!!8!!!!(B
!!!"h!!!!H!!!!(N!!!"k!!!!"`!!!!J!!!!*!!!!#J!!!!8!!!!'!!!!#`!!!!`
!!!!0!!!!"!!!!!%!!!!B!!!!!J!!!$-!!!!d!!!!$J!!!!m!!!!3!!!!%3!!!")
!!!!6!!!!&!!!!"8!!!!$!*!(&J!!!"F!!!!J!!!!)3!!!#)!!!!M!!!!(J!!!"m
!!!!N!!!!*3!!!#B!!!!G!!!!'J!!!$%!!!!E!!!!03!!!$B!!!!R!!!!+!!!!#N
!!!!U!!!!+`!!!#`!!!!Y!!!!,J!!!"`!!!!C!!!!,`!!!$!!N!F`!!!!-3!!!$)
!!!!c!!!!(`!!!%N!!!",!!!!63!!!"`!!!"#!!!!4!!!!"i!!!!K!!!!)`!!!!X
!!!!6!!!!(3!!!#X!!!"1!!!!$J!!!#i!!!!d!!!!03!!!$B!!!!U!!!!,`!!!#d
!!!!h!!!!$!!!!"3!!!"&!!!!4J!!!%J!!!"+!!!!6!!!!%F!!!!#!!!!*!!!!#8
!!!!S!!!!+3!!!!d!!!!*!!!!"3!!!!m!!!!9!!!!%!!!!"B!!!!4!!!!1!!!!$N
!!!!5!!!!'3!!!$X!!!!m!!!!23!!!$i!!!!r!!!!&`!!!%!!!!"2!!!!33!!!%-
!!!"3!!!!'`!!!!B!!!!+!!!!1J!!!!%!!!!X!!!!'!!!!#B!!!!J!!!!)J!!!#F
!N!F%!!!!"`!!!!J!!!!D!!!!!`#323-!!*QC!*!%Irm!N!4rr`#3"(rr!!!!"3%
!!!%!N2m!!!!'!3#3"`%!N!N"!*!%!3%!!!%"!!%!!!F"!!%"!!%"!!!!!3!!"!#
3$3%"!3#3#3)!N!`&!3!!!3#3r`!!!!-#!!%"!!!"!3-"!*!*!3%"!!!"!3!"!3!
!!3%"!*!*!`!!$dTKGQ&$E'&cFf9c,QTKFJ#3%&T*8#"09eT3!*!&!3!!!!-!!!!
+!!!!!`!!!!LaKbkhrrqMQJ#3r`#3r`#3&`%!!!!$8Np29!#3$!*(8P93!*!(!3G
6Eh9bBf9c!!!!"NC*6%8#!!!04NP-43)!!!j(8P93!*!(!`pPH("KG#"XD@*bBA*
TCA-!N!4'58a&!J!!$%C*6%8#!!!,4NP-43%!!!p(8P93!*!(!JP-D@*bBA*TCA-
!!!!$4NP-43)!!!0'58a&!3!!!dC*6%8#!!!'-bic!19Ni!#3&`%!!!!#!!!!"3!
!!!-!!!!%!!!!"J!!!!F!N(F"!!!!!J!!!!-!!!!%!!!!"3!!!!B!!!!(!*"a#3!
%%R"jCAK`BA3ZBfCY0MKV,R0XBJ#3,9"jG'KcD'aL!*")2j!%!*!*93'3!!%*!RX
!N"3"!*"+$!#3"aCYGf9bDh0IF'aeCfPZAf0[EQCTCbjS!*!,!3#3%38"!!!$!!%
!N"3$!J%"!3!!!3%$!3#3#!%!!!!"!*!(!J!"!"`!N"m"!*!(#J!!!!)!N!F5!!!
!!`#3"a`!!!!%!*!(*`!!!!8!N!Fh!!!!"J#3"e)!!!!(!*!(B`!!!!J!N!GU!!!
!#3#3"hF!!!!+!*!(M!!!!!X!N!HD!!!!$!#3"kN!!!!0!*!(Z!!!!!i!N!I(!!!
!$`#3"p3!!!!3!*!(i3!!!"%!N!I[!!!!%J#3"rB!!!!6!*!'!38!!!!8!*!'!4%
!!!!9!*!'!5!!!!!@!*!'!5d!!!!A!*!'!6X!!!!B!*!'!8)!!!!C!*!'!9-!!!!
D!*!'!@)!!!!E!*!'!@d!!!!F!*!'!AJ!!!!G!*!'!B`!!!!H!*!'!CJ!!!!I!*!
'!D3!!!!J!*!'!DX!!!!K!*!'!EN!!!!L!*!'!F`!!!!M!*!'!GF!!!!N!*!'!HF
!!!!P!*!'!Ii!!!!Q!*!'!KF!!!!R!*!'!L!!!!!S!*!'!Lm!!!!T!*!'!N!!!!!
U!*!'!P%!!!!V!*!'!Q%!!!!X!*!'!Qi!!!!Y!*!'!Ri!!!!Z!*!'!S`!!!![!*!
'!TN!!!!`!*!'!UN!!!!a!*!'!V8!!!!b!*!'!XB!!!!c!*!'!Y%!!!!d!*!'!Yd
!!!!e!*!'!Z`!!!!f!*!'![X!!!!h!*!'!`)!!!!i!*!'!`m!!!!j!*!'!am!!!!
k!*!'!bm!!!!l!*!'!c`!!!!m!*!'!dJ!!!!p!*!'!eN!!!!q!*!'!f3!!!!r!*!
'!f`!!!"!!*!'!hJ!!!""!*!'!i8!!!"#!*!'!j3!!!"$!*!'!kJ!!!"%!*!'!l3
!!!"&!*!'!m8!!!"'!*!'!pi!!!"(!*!'!rB!!!")!*!'"!-!!!"*!*!'""!!!!"
+!*!'"#S!!!",!*!'"$S!!!"-!*!'"&%!!!"0!*!'"&i!!!"1!*!'"(F!!!"2!*!
'"(X!!!"3!*!'")8!!!"4!*#l!3)!!!`!!!!%!*!%53!!!%S!N!3&!!!"!*!%5`!
!!%`!N!3&!!!"!*!%63!!!%i#!!!,"3%"!3#3"%m!N!X"!!3!!3#3$J%!)!#3r`!
!AepTEQPdD@&XDATP!*!eAh0dBA*d!*!jAepdCA*YD@jKG'8!N$J"!!!!#3!!"@%
ZEh9d!*!k2j!%39"36!!!!B"B`!#33Mq3"!#3#98"N!!"#3*l!*!1!B!!N%m-!*!
(&QehCA*VFep`E(9RD@jIBfpZCQPR,QJ!N!X"!3!"!*!1$J#3"`%!N!3+99"*,R"
bC@CTH!#3&J%!N!8"!!%!!`!!$dTKGQ&$E'&cFf9c,QTKFJ#3%&T*8#"09eT3!*!
&!3!"!!!*6@9bCf8J6h9d!*!f2j!%39"36!!"!3!!"%4-4eKMDfPN8(*[DPG68%-
!$J#3"`%!N!3+99"*,R"bC@CTH!#3&J%!N!8"!!%!!J#3)!%"!3!!!3%!!3!"!3%
!!!%"!!%!"3%!!!-!!3#3#(Ki,N0'66Bi5`"6Eh9bBf9c!%aTBR*KFQPPF`"iH'e
[C(9XC5jM!(Ki,N0'66Bi5bke,Q9iF!"08d`J8fK-D@*5G@jdD@eP3dC00MK,,Na
TBJ"3HA4SEfj$Eh*P3dC00MK,!(Ki,R"`B`"iH#j`F'-ZY5jPH(!!690-)&0S6'P
L8R9ZG'PYC5j-D@)!8(PdD'pZ3fpbC9"33`!kH(JZ3dC00MK,,R0XBJ"-D@)J5@e
`Eh*d)$Bi5`"08&FJ5@e`Eh*d)$Bi5`"#B@aXEfpZ)%KPE(!!69FJ3bp$+bXJ0MK
,!%eA)&"KFf0KE#!f1%X!69FJ8Q9k!&"&4L"*EA"[FR3J0MKV!$TiH#j`F'-ZFfa
L!%aTBL"*EA"[FR3J8&"$!%eA)%-[3bXV)&"33`"09b"3BA0MB@`J8&"$!&"33d&
cE3"B3dp'4L"*EA"[FR3J8&"$!&"&4L"*EA"[FR3J8&"$!(Ki,R"bDLjPH(!!8(P
dD'pZ3fpbC3!k6@pNG@aPFcTiH'e[C(9XC5jM!$TiH#j`FQSZCAK`!$T3HA4SEfj
$Eh*P!$TK,QpeG!"iE@adEfXZ3dC00MK,!$TiE@adEfXZBfCY0MKV,R0XBJ"iE@a
dEfXZF("M!$TiE@adEfXZF("M,R0XBJ"XD@*iE@adEfXJ+'0QE6BiDbNZ6'PL!'a
TBRKYE(4[Db!SF("M)%G98dNT,NaTBJ"iE@adEfXZB`"iE@adEfXZF(*U,Q9iF!"
0B@028b!f1%XJ6'PZDf9b!%eKBdp6)&"33b"-D@jVCA)!3h9cG'pY)%YPHAG[FQ4
c!%&MBf9cFb"3BA4SF`"8BA*RCA3J8f9dG'PZCh-!4QPXC5"0BA"`D@jRF`"#G@P
XC#"&H(4bBA-!4'9LG@GRCA)J9'&bCf9d!$Bi5b"$Ef4P4f9Z!$Bi5b"%DA0KFh0
PE@*XCA)!0MK,)%aTEQYPFJ!f1%XJ8(*[DQ9MG!"$,d-V+b"$Efe`D@aPFJ"$,d-
V+b"ABA*ZD@jRF`"$4Ndf1%X!59)J6h"dD@eTHQ9b!&"KFf0KE#"$Efe`D@aPFJ"
3BA0MB@`J9f&bEQPZCh-!8Q9k)%0[EA"TE'9b!&"33b"$Ef4P4f9Z!&"33b"%DA0
KFh0PE@*XCA)!8&"$)%aTEQYPFJ"38%-J8%9'!&"33b"3FQpUC@0d!&"33d&cE5"
3B@jPE!"`H@9iF'&d,N0'66Bi5`!kF(PPH("KG#jMCQdf1'XZFfaL!("jCAK`BA3
ZF("M!$T`H@9iF'&d,R"`BbjcE')!E'PLCAK`BA3J+$4T1'3J4e9655NZ6'PL!'a
TBQ9iF'&d)#K`F'-J4e9655NZ6'PL!'aTBQ9iF'&d,R"bDJ"XD@*PH("KG#!f1'X
!1QaTBQ9iF'&d)#JdD6KN)%G98dNT,NaTBJ"XD@*PH("KG#"MCQdf1'X!1QaTBQ9
iF'&d)#KMCQdf1'XT,NaTBJ"XD@*PH("KG#"`F'-!1QaTBQ9iF'&d)#K`F'-J4e9
655NZ6'PL!'&XE!"`H@9iF'&d,Q-!F(PPH("KG#j`FQSZCAK`!*$r!*$r!*$r!*"
b!J!!!%)"!!!#!*!*"!!"!!!!3l&[T)8!!(1%!*$r!*$m4!)!!!)!N!N%!!%!!!"
&X@qMp2rrp"3!N2m!N2S)!!!!!J!$!!!!"33!!!3!!3!"1J#3r`#3r`!"!!!!rj!
%!!!!!J!"!!%k1MS!N2m!N2i"!!!!rj!%!!!!"!!"!!%kN!4$9dG98dNk!*$r!*$
f!3!!!2q3"!3!!!-!!J!"1NePG(*[Gf9bDh-J8h4KEQ4KFQ3J6'PLFQ&bH6T08d`
J3cS!N2m!N0i"!!!!rj!%3!!!!3!#!!%k6@&M6e-J8h9`F'pbG$S!N2m!N2)"!!!
!rj!%3!!!!J!#!!!!!J!#!*!d!3!!#8ePFQGP)%peG!#30Mq3"%&38%`!!3%!!!4
%6%GBBfYTC&"bEfTA8e"$!!)!!!!#!!)!N#F#!*!K!3#3'3F"!3#3"!%!N$YTEQP
dH'PZDA4iH!#3I3B!!!!#!!%!(!#3'`-!!J!S!*!B!3!!!`!!!!B#!3#3"3%!!J-
!N!`"!fi!N!B"!!!'!!!!(!)"!*!&!3!"!`#3$!%!N!J"!!!-!!!!5!)"!*!&!3!
"!J#3&3%!!!d!!!"3!J%!N!8"!!%"!*!-!3#3#!%!!!i!!!"4!J%!N!8"!!%"!*!
-!3#3#!%!!!m!!!"-"3%!!!%!!!`!!3#3$B%!N!J"!!!1!!!!83)"!*!&!3!"!3#
3$!%!N!J"!!!1!!!!83)"!*!&!3!"!3#3$!%!N"!"!3!!rj!%!*!J!3%!!2q3"!#
3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!
%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$
rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%
!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!
"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#
3)!%"!!$rN!3!N#!"!3!!rj!%!*!C"`!!6@&M6e-J0MK,)%aTEQYPFJ#3r`#3r`#
3mR"jCAK`BA3Z3dC00MK,!*$c!3!"1J#3r`#3r`#3"J%!!3#3r`#3r`#3"`%!N2m
!N2m!N2m!N#`9!3%!N!8$!*$r!*!,!3#3"!J!N2m!N2m!N!4%4Na8$dePG(*[Gf9
bDh-J5Q&fB3#3-%PZG'9bEQ9d)%9iF'a[FQ9b!*$r!*$d4%C-9!#3r`!!!J'3"3!
"!*!&690*43#3r`#3r`!!D(4dF$S[,fTKGQ%ZFh9Z,Q0[E5p`FQpNG@0dFbpUC'X
[-5ia,f4[Bh-[BA"T,`#3d`J!!3#3#$,)!!!bb!!!-XJ'Fh4NGfPZ!*$m"3!"$(K
iE@pNG@aP,R0XBJ#3%e"C9%KcD'aL!*"a!6q3"!#3"`)!8!!"!!%!!3!"!*$r!"3
R3dp%45FJ*d4"9%%R)#G35808*`#3l!%!N"N%!!%!N%%#!!3!N%J"!!!#!!!+6Np
138e&,N9B43#3&N!!N!3%!*!%"!!!"!#3"!3!93'3!!%*!RX!N$S"!!!#!!!+6Np
138e&,N9B43#3&N!!N!3%!*!%"!!!"!#3"!3!93'3!!%*!RX!N"%"!*!(&`!!!!)
!N!FS!!!!!`#3"cF!!!!%!*!(8!!!!!8!N!GU!!!!"J#3"i%!!!!(!*!(Q!!!!!J
!N!HZ!!!!#3#3"mN!!!!+!*!(hJ!!!!X!N!Id!!!!$!#3"J%0!!!!$3#3"J%Q!!!
!$J#3"J%h!!!!$`#3"J&4!!!!%!#3"J&V!!!!%3#3"J'"!!!!%J#3"J'F!!!!%`#
3"J'a!!!!&!#3"J($!!!!&3#3"J(C!!!!&J#3"J(`!!!!&`#3"J)(!!!!'!#3"J)
K!!!!'3#3"J)j!!!!'J#3"J*0!!!!'`#3"J*E!!!!(!#3"J*R!!!!(3#3"J*p!!!
!(J#3"J+8!!!!(`#3"J+S!!!!)!#3"J+m!!!!)3#3"J,2!!!!)J#3"J,R!!!!)`#
3"J,j!!!!*!#3"J--!!!!*3#3"J-L!!!!*J#3"J-i!!!!*`#3"J0'!!!!+!#3"J0
G!!!!+3#3"J0d!!!!+J#3"J1(!!!!+`#3"J1I!!!!,!#3"J1a!!!!,3#3"J2!!!!
!,J#3"J26!!!!,`#3"J2R!!!!-!#3"J2l!!!!-3#3"J35!!!!-J#3"J3R!!!!-`#
3"J3j!!!!0!#3"J43!!!!03#3"J4X!!!!0J#3"J5!!!!!0`#3"J5C!!!!1!#3"J5
h!!!!13#3"J65!!!!1J#3"J6`!!!!1`#3"J8-!!!!2!#3"J8R!!!!23#3"J9"!!!
!2J#3"J9J!!!!2`#3"J9j!!!!3!#3"J@6!!!!33#3"J@`!!!!3J#3"JA0!!!!3`#
3"JAL!!!!4!#3"JAp!!!!43#3"JBG!!!!4J#3"JBl!!!!4`#3"JCC!!!!5!#3"JC
c!!!!53#3"JD5!!!!5J#3"JDV!!!!5`#3"JE"!!!!6!#3"JEE!!!!63#3"JEf!!!
!6J#3"JF4!!!!6`#3"JFX!!!!8!#3"JG%!!!!83#3"JGI!!!!8J#3"JGi!!!!8`#
3"JH3!!!!!&3!N!B(T`!!!&8!N!B(``!!!&B!N!B(f3!!!&F!N!B(m!!!!&J!N!B
)#J!!!&N!N!B)*!!!!&S!N!B)0J!!!&X!N!B)6J!!!&`!N!B)D`!!!&d!N!B)KJ!
!!&i!N!B)S3!!!&m!N!B)Z!!!!'!!N!B)e!!!!'%!N!B)kJ!!!')!N!B)r3!!!'-
!N!B*&!!!!'3!N!B*,!!!!'8!N!B*4!!!!'B!N!B*BJ!!!'F!N!B*HJ!!!'J!N!B
*PJ!!!'N!N!B*X!!!!'S!N!B*b`!!!'X!N!B*k3!!!'`!N!B+"J!!!'d!N!B+)!!
!!'i!N!B+3`!!!'m!N!B+A!!!!(!!N!B+GJ!!!(%!N!B+N3!!!()!N!B+TJ!!!(-
!N!B+[`!!!(3!N!B+eJ!!!(8!N!B+lJ!!!(B!N!B,#3!!!(F!N!B,)`!!!(J!N!B
,1J!!!(N!N!B,@J!!!(S!N!B,F!!!!(X!N!B,K`!!!(`!N!B,TJ!!!(d!N!B,`J!
!!(i!N!B,i3!!!(m!N!B,rJ!!!)!!N!B-'J!!!)%!N!B-13!!!))!N!B-9!!!!)-
!N!B-G!!!!)3!N!B-MJ!!!)8!N!B-U3!!!)B!N!B-a`!!!)F!N!B-j3!!!)J!N!B
-q`!!!)N!N!B0&!!!!)S!N!B0-!!!!)X!N!B063!!!)`!N!B0D!!!!)d!N!B0K!!
!!)i!N!B0S`!!!)m!N!B0a!!!!*!!!*!'$H-!!!#4!*!'$J)!!!#5!*!'$Kd!!!#
6!*!'$Md!!!#8!*!'$PF!!!#9!*!'$Qi!!!#@!*!'$SN!!!#A!*!'$U8!!!#B!*!
'$X%!!!#C!*!'$Ym!!!#D!*!'$[S!!!#E!*!'$ai!!!#F!*!'$cJ!!!#G!*!'$e-
!!!#H!*!'$fm!!!#I!*!'$iJ!!!#J!*!'$k3!!!#K!*!'$li!!!#L!*!'$pF!!!#
M!*!'$r-!!!#N!*!'%!X!!!#P!*!'%#J!!!#Q!*!'%$m!!!#R!*!'%&F!!!#S!*!
'%()!!!#T!*!'%)d!!!#U!*!'%+!!!!#V!*!'%,B!!!#X!*!'%-m!!!#Y!*!'%1N
!!!#Z!*!'%3%!!!#[!*!'%4S!!!#`!*!'%6B!!!#a!*!'%93!!!#b!*!'%A!!!!#
c!*!'%B`!!!#d!*!'%D3!!!#e!*!'%F%!!!#f!*!'%GJ!!!#h!*!'%H`!!!#i!*!
'%J3!!!#j!*!'%Kd!!!#k!*!'%MB!!!#l!*!'%P%!!!#m!*!'%QN!!!#p!*!'%SS
!!!#q!*!'%U%!!!#r!*!4#!!!!!)!!`!!!!8%!!!&!!%!!6S!N2m!N2m!!3!!!2q
3"!!!!!)!!3!"1MSk!*$r!*$q!3!!!2q3"!!!!!3!!3!"1T!%3eG(990*1J"ME(9
NC6S!N2m!N1m"!!!!rj!%"!!!"!!#!!%k6@9dFQphCA*VFb"6G'&ZC'&bC#"-D@*
bBA*j1Ne66#"$1J#3r`#3hJ%!!!$rN!4!!!!#!!)!!6T0B@028b"6GA"`Eh*d1J#
3r`#3mJ%!!!$rN!4!!!!$!!%!!3#3r`#3r`#3"`F"!3#3"!&IAfPZDA4TB@aTHQ8
!N'pIAh4PFPpIG'9bE@PZBA4P!*!a!3!!!!056dp8!*!-!NG599!!N!F""e0[GA*
MCA-!!!!%4NP-43)!!!P'58a&!J!!#NG599!!N!F$$f9iF'&d)'aTBR*KFQPPF`#
3"%C*6%8"!!!,4e*98!#3"`)*6'PLFQ&bD@9c!!!!!dC*6%8#!!!$4NP-43%!!!0
'58a&!J!!"[rrr`Gi)-!(H#j!!*!'-S!(ZU8F!2rrr`$rrrm!rrrr"hJJ`!#3&3F
!!%eKBdp6)&"33b"-D@jVCA)!N2m!N2m!N2*`H@9iF'&d,R"`B`#3pJ%!!6S!N2m
!N2m!N!B#!!C0B@028b"38%-J6'PZDf9b!*!4'N&38%`!N%"J!!!!3A"`E!#33'!
!!!"068a#!*!J6'PL)%PYF'pbG#"38%-!N"C08%a'!*!J6'PL)%PYF'pbG#"38%-
!N"C09d0%!*"!B!!!!&*68N-!N%"J!!!!9%9B9#jLD!"MbUY3!!-`b!!8VG!!!!&
q!FUV8!!8CF!!!!,@3Q&XE'p[EL")C@a`!*!'(33"bUZ!!"4P`!'(PY3!N!4849K
8,Q-!N"j09b"$,d-V+b"38%-!N"K849K8,Q-V+`#3(%eA)%-[3bXV)&"33`#3'&4
&@&3ZBf-!N"e09b"$,d-V+b"38%-!N"K849K8,Q0`!*!G69FJ3bp$+bXJ8&"$!*!
B9%9B9#jMF(!!N"a09b"$,d-V+b"38%-!N"K849K8,Q9iF!#33&4&@&3ZD!#3(Ne
A)%-[3bXV)&"33`#3&"!!!!"849K8,R!!N"j09b"3BA0MB@`J8&"$!*!A9%9B9#j
`BA-!N"a09b"3BA0MB@`J8&"$!*!A9%9B9#j`BfJ!N"a09b"$,d-V+b"38%-!N"5
!!!!!9%9B9#j`BfJV+`#3'NeA)%-[3bXV)&"33`#3&)!!!!"849K8,R)!N"j09b"
5CAS!N"j849K8,R-!D'2+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YC38%0"Ffd
!EL")C@`!N!BG"!(+Ui!!&'A!!BH@e!#3"&K$6dB!N#"B3dp'4L"*EA"[FR3J8&"
$!*!8C'pMG3#33'!!!!"bFh*M!*"!B!!!!(0SE')!N#"348BJ5@e`Eh*d)&"33`#
3&R0dG@)!N#"348BJ5@e`Eh*d)&"33`#3'LjNEf-!N$a3!!!!6@&M6e-J0MK,)%a
TEQYPFJ#3%4T"8&"-!*"!B!!!!%&`F'`!N%"J!!!!68e-3J#3)%aTBL"*EA"[FR3
J0MK,!*!@69"-4J#3)%aTBL"*EA"[FR3J0MK,!*!@69G$4!#33'!!!!"23NSJ!*!
J69"A)%PYF'pbG#!f1%X!N"C58e*$!*"!B!!!!&4&@&3ZBQJ!BmUV8!!$--J!&+h
3!!!"IJ(+Ue!!&'A!!!!#eN*KE'a[EfiJ5'9XF!#3"Kd%!FUVJ!!8CF!"KjE8!*!
%9%9B9#jM!*!H69FJ3bp$+bXJ0MK,!*!B9%9B9#jM+bX!N"a09b"$,d-V+b!f1%X
!N"K849K8,Q0M!*!G69FJ3bp$+bXJ0MK,!*!B9%9B9#jMF!#3(8eA)%-[3bXV)$B
i5`#3'&4&@&3ZBh"`!*!F69FJ3bp$+bXJ0MK,!*!B9%9B9#jPH(!!bUY3!!-`b!!
8VG!!!!&q!FUV8!!8CF!!!!,@!-FUG!aiUi!"bUj%!"199!!!(33"bUZ!!"4P`!'
(SM`!N!4849K8,QJ!N"j09b"$,d-V+b!f1%X!N"33!!!!9%9B9#j`!*!H69FJ8'&
cBf&X)$Bi5`#3&e4&@&3ZF'&c!*!F69FJ8'&cBf&X)$Bi5`#3&e4&@&3ZF'0S!*!
F69FJ3bp$+bXJ0MK,!*!8J!!!!&4&@&3ZF'0S+bX!N"T09b"$,d-V+b!f1%X!N"5
!!!!!9%9B9#jb!*!H69FJ8Q9k!*!H9%9B9#jcC@F!bUY3!!-`b!!8VG!!!!&q!FU
V8!!8CF!!!!,@!-FUG!aiUi!"bUj%!"199!!!(33"bUZ!!"4P`!'(SM`!N!4NEf0
e!*"!B!!!!(*cFQ-!N%"J!!!!FfKXBJ#3)&"&4L"*EA"[FR3J0MKV!*!@Fh4eBJ#
3)&"&4L"*EA"[FR3J0MKV!*!D,Q4[B`#32&!!!!"AD@ic-L"i1$BJ6'PZDf9b!*!
4#94&@&3ZB`#3(NeA)%-[3bXV)(Ji0J#3'&4&@&3ZBbXV!*!F69FJ3bp$+bXJH$J
f!*!B9%9B9#jMF!#3(8eA)%-[3bXV)(Ji0J#3'&4&@&3ZBh"`!*!F69FJ3bp$+bX
JH$Jf!*!B9%9B9#j`BfJ!N"a09b"$,d-V+b"i1$B!N"5!!!!!9%9B9#j`BfJV+`#
3'NeA)%-[3bXV)(Ji0J#3&)!!!!"849K8,R*M!*!G69FJ9fPZ8N-!N#!ZE'PL!*!
F6'PL)%PYF'pbG#"i1$B!N"SZEf*U!*!F6f*U)%PYF'pbG#"i1$B!N"C03b"-D@j
VCA)!N"J)68e$5!#34&4&@&3ZB`#3(Ne$)%-[3bXV!*!F9%9B9#jME(-!N"a03b"
$E'&cFb"$Efe`D@aPFJ#3$i!!!!"849K8,Q4PCJ#33&4&@&3ZC'pM!*!m%!!!!&4
&@&3ZD!#32K!!!!"849K8,R"MD!#3(%e$)%-[3bXV!*!BJ!!!!&4&@&3ZG(-!N%&
1EfjP!*!G!8e08()!N%"!!!!!6@&M6e-J6@9bCf8!N"B(39"36!#33'!!!!""F("
X!*"!B!!!!&*68N-!N%"J!!!!9%9B9#jLD!#3(8*KE'a[EfiJ5'9XF!#3'&4&@&3
ZFJ#3(P*PHJ#3)A*cFQ-!N%"J!!!!FfKXBJ#3433!N"!"!*$r!*"%AepcG'&bG!#
3I!%!!3#3r`#3r`#3r`#3,"8"!3#3"3-!N2m!N!X"!*!%#!#3r`#3r`#3"%4'6&3
26@9dFQphCA*VFb"+BACK!*!`5@jdCA*ZCA3J4AK`E'pbCA)!N2m!N24%4Na8!*$
r!!!#!C!&!!%!N!908dP&!*$r!*$r!!"SG(4`1Lm[DQ&fB5jcG@iZBfpY,h"bEf4
eBh4c,fTNDbma,M%[C'pMFbpKF'N[!*$6#!!"!*!)1Si!!$U1!!!kMJ#3r`#3"!8
!!3p`H@9iF'&d,R"`BbjcE')!N""3HA4SFfKXBJ#3F3%rN!3!N!F#!&!!!3!"!!%
!!3#3r`!8*d024%8R)#G%394"*b!R8%P$9#F!N1`%!!%!N%%#!!3!N%J"!!!#!!!
+6Np138e&,N9B43#3&N!!N!3%!*!%"!!!"!#3"!3!93'3!!%*!RX!N!S#!!!$!!!
!#J)"!*!&!3!"!`#3$!%$EJ#3"J)!!!B!!!!F!J%!N!8"!!%$!*!-!3#3#!)!!!X
!!!"(!J%!N!8"!!%$!*!-J3#3#!)!!!`!!!")!J%!N!8"!!%#!*!9!J!!$3!!!&!
#!3#3"3%!!3%!N!`"!*!)!J!!$J!!!&%#!3#3"3%!!3%!N!`"!*!)!J!!$J!!!&%
#!3#3"3%!!3%!N!`"!*!)!J!!$J!!!&%#!3#3"3%!!3%!N!`"!*!3!3%!!2q3"!#
3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!
%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$
rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%
!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!
"!3!!rj!%!*!J!3%!!2q3"!#3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#
3)!%"!!$rN!3!N#!"!3!!rj!%!*!J!3%!!2q3"!#3'`)!!!"#!3!!!J#3#33!!3!
!!%1aEk2irrr#N!!!N2m!N2a%!J!!!J#3#33!!3!!!%@aEk2drrrd&!#3r`#3q`3
!N!3%!&8"N!!"#3*l!*!0!J!!!#N!!!!U!!!!&`!!!#X!!`#3"5`!#!#3"5d!"`#
3"5i!!J#3"5m!"3#3"6!!!3#3"6%!"J#3"6)!!3#3"6-!"`#3"63!#3#3"68!$!#
3"6B!"!#3"6F!"!#3"6J!!3#3"6N!$J#3"6S!!J#3"6X!!J#3"6`!!`#3"6d!!3#
3"6i!"`#3"6m!#!#3"8!!"3#3"8%!!J!!!!)!"NeKBdp6)&"33b"-D@jVCA)!N"%
D39"36!#33'!!!!""F("X!*"!B!!!!%e06%)!N#"-D@)J5@e`Eh*d)&"33`#3&Ne
36%B!N#"-D@)J5@e`Eh*d)&"33`#3&NeA3d3!N%"J!!!!8P053`#33'!!!!"849K
8,Q*S!'2&ET!!!!-`b!!8VH!!!!&j!F9ZN!!!&'A3!!!#eN*KE'a[EfiJ5'9XF!#
3"L@a!F9Z`!!8CG!"JPD8!*!%9%9B9#jM!*!H69FJ3bp$+bXJ8&"$!*!B9%9B9#j
M+bX!N"a09b"$,d-V+b"38%-!N"K849K8,Q0M!*!G69FJ3bp$+bXJ8&"$!*!B9%9
B9#jMF!#3(8eA)%-[3bXV)&"33`#3'&4&@&3ZBh"`!*!F69FJ3bp$+bXJ8&"$!*!
B9%9B9#jPH(!!a@k3!!!$--J!&+hJ!!!"H3(&ET!!!"4Pd!!!!YB!8Q9kYLKZ`!(
&FB3!N!BPX3(&EX!!&'A3!B*Kr!#3"&4&@&3ZD!#3(NeA)%-[3bXV)&"33`#3&"!
!!!"849K8,R!!N"j09b"3BA0MB@`J8&"$!*!A9%9B9#j`BA-!N"a09b"3BA0MB@`
J8&"$!*!A9%9B9#j`BfJ!N"a09b"$,d-V+b"38%-!N"5!!!!!9%9B9#j`BfJV+`#
3'NeA)%-[3bXV)&"33`#3&)!!!!"849K8,R)!N"j09b"5CAS!N"j849K8,R-!D'2
&ET!!!!-`b!!8VH!!!!&j!F9ZN!!!&'A3!!!#eP"33d&cE3"Z)%KPE!#3"L@a!F9
Z`!!8CG!"JPD8!*!%@%024J#3)&K$6dC')%PYF'pbG#"38%-!N"4NEf0e!*"!B!!
!!(*cFQ-!N%"J!!!!FfKXBJ#3)&"&4L"*EA"[FR3J8&"$!*!@Fh4eBJ#3)&"&4L"
*EA"[FR3J8&"$!*!D,Q4[B`#32&!!!!"0B@028b!f1%XJ6'PZDf9b!*!4'N&38%`
!N%"J!!!!3A"`E!#33'!!!!"068a#!*!J6'PL)%PYF'pbG#!f1%X!N"C08%a'!*!
J6'PL)%PYF'pbG#!f1%X!N"C09d0%!*"!B!!!!%p#5L!!N#"08&FJ5@e`Eh*d)$B
i5`#3&P*68N-!N%"J!!!!9%9B9#jLD!"MhJ!#&,a!J*S+!80Uj3%j9'm!!!!"!*!
%!80#B@aXEfpZ)%KPE(!!bJ&U!)J"194Z!80Uj!!j!@K-FJ#3"&4&@&3ZB`#3(Ne
A)%-[3bXV)$Bi5`#3'&4&@&3ZBbXV!*!F69FJ3bp$+bXJ0MK,!*!B9%9B9#jMB`#
3(8eA)%-[3bXV)$Bi5`#3'&4&@&3ZBh!!N"e09b"$,d-V+b!f1%X!N"K849K8,Q0
`F!#3(%eA)%-[3bXV)$Bi5`#3'&4&@&3ZCAK`!,a!J*S+!6PAl`&$Bpm!N!J"3f2
H)!3!1J%k,S!"1&!L!3!!!!&$Bpi"19IZ!Hi!N!B4!*!&9%9B9#jS!*!H69FJ3bp
$+bXJ0MK,!*!8%!!!!&4&@&3ZF!#3(NeA)&"KFf0KE#!f1%X!N"G849K8,R"KF`#
3(%eA)&"KFf0KE#!f1%X!N"G849K8,R"MD!#3(%eA)%-[3bXV)$Bi5`#3&)!!!!"
849K8,R"MD#XV!*!D69FJ3bp$+bXJ0MK,!*!8J!!!!&4&@&3ZFJ#3(NeA)&*PHJ#
3(P4&@&3ZFf9R!,a!J*S+!6PAl`&$Bpm!N!J"3f2H)!3!1J%k,S!"1&!L!3!!!!&
$Bpi"19IZ!Hi!N!B4!*!&C'pMG3#33'!!!!"bFh*M!*"!B!!!!(0SE')!N#"348B
J5@e`Eh*d)$BiD`#3&R0dG@)!N#"348BJ5@e`Eh*d)$BiD`#3'LjNEf-!N$a3!!!
!9fPZ-c)JH$Jf)%aTEQYPFJ#3%3P849K8,Q-!N"j09b"$,d-V+b"i1$B!N"K849K
8,Q-V+`#3(%eA)%-[3bXV)(Ji0J#3'&4&@&3ZBh!!N"e09b"$,d-V+b"i1$B!N"K
849K8,Q0`F!#3(%eA)%-[3bXV)(Ji0J#3'&4&@&3ZF'0S!*!F69FJ3bp$+bXJH$J
f!*!8J!!!!&4&@&3ZF'0S+bX!N"T09b"$,d-V+b"i1$B!N"5!!!!!9%9B9#jbB`#
3(8eA)&GTEP*$!*!J,QaTBJ#3(%aTBL"*EA"[FR3JH$Jf!*!D,QpLDJ#3(%pLDL"
*EA"[FR3JH$Jf!*!@68-J6'PZDf9b!*!B#%e03dJ!N%4849K8,Q-!N"j03b"$,d-
V+`#3(&4&@&3ZBfac!*!F68-J3faKFh-J3fpYF'PXCA)!N!q!!!!!9%9B9#jNC@B
!N%"849K8,Q4[B`#32"!!!!"849K8,QJ!N$i3!!!!9%9B9#j`BfJ!N"a03b"$,d-
V+`#3')!!!!"849K8,R4c!*""6QpZC3#3(3&069"b!*"!3!!!!%eKBdp6)%ePFQG
P!*!@"d&38%`!N%"J!!!!3A"`E!#33'!!!!"58e*$!*"!B!!!!&4&@&3ZBQJ!N"e
#B@aXEfpZ)%KPE(!!N"K849K8,R)!N"j5CAS!N#&bFh*M!*"!B!!!!(0SE')!N%B
$[`!!&!"YFh4b!*!1CMF!!!N!EA0dE!#3$KHr!!!$!'ecG'i!N!i"`!!!!#KYFh4
T!*!1,IN!!!J!EA0dFJ!!!qJ!N!SN`J!!")"YFh4X!!!$k!#3#KUr!!!"J'ecG'i
!!!2S!*!+!bF!!!!+F(*PCJ#Ja-S!!!!"!*!'!c%!!!!`F(*PCJ#J[K3!!!!#!*!
'!f%!!!"+F(*PCJ#J,r`!!!!$!*!'!kX!!!!8F(*PCJ#JMdd!!!!%!*!'4Q%!!!"
!EA4cE!!!!!%!N!T'S3!!"D"YG("X!!!!!3#3#J(S!!!!&'edE'm!!!!"!*!+!I`
!!!!3EA4`D3!!!!%!N!S"+!!!!!T`FQ9Q!+$U+`!!!"S!N!B"-J!!!$"`FQ9Q!+!
%S3!!!"X!N!B"BJ!!!%T`FQ9Q!+!K$!!!!"`!N!B"V!!!!"4`FQ9Q!+$k[J!!!"d
!N!BNSJ!!!#"YG(0X!!!!!J#3#UcK!!!&S'edF'`!!!!#!*!+!J`!!!!8EA4XE`!
!!!)!N!S#)!!!!""YG("T!!!!!J#3#MAj!!!%0'edCf`!!!2S!*!+(a`!!!)XEA"
cD3!!!qJ!N!SK5!!!!-"36(0d!+!$I!!!!$-!N!B#3!!!!#KYFh4T!!!$k!#3#L)
)!!!!N!"YG("c!!!!!3#3#L+B!!!!N!"YG("c!!!!!J#3#VE2!!!!$'eKE'`!N!k
ff`!!!,aYBA"X!*!1!VJ!!!!DF(*PCJ!'`RS!!!"m!*!'1Ld!!!TJF(*PCJ!')Q8
!!!"p!*!'6%%!!!B-F(*PCJ!'K!8!!!"q!*!'YjF!!"CiF(*PCJ!'`1B!!!"r!*!
'(EF!!!%(F(*PCJ!'QJ)!!!#!!*!'8Nd!!!))F(*PCJ!'C03!!!#"!*!'!Y)!!!!
BF(*PCJ!'dmd!!!##!*!'!M!!!!!+F(*PCJ!'H6`!!!#$!*!'!ZS!!!!1F(*PCJ!
'T6N!!!#%!*!')bJ!!!%'F(*PCJ!'Gr)!!!#&!*!'*#i!!!!mF(*PCJ!'liF!!!#
'!*!'![J!!!!1F(*PCJ!'f`F!!!#(!*!'+C)!!!(DF(*PCJ!'rE!!!!#)!*!'9&8
!!!-bF(*PCJ!'R'-!!!#*!*!'!`B!!!!-F(*PCJ!'H,N!!!#+!*!'9iF!!!%3F(*
PCJ!'p(i!!!#,!*!',1J!!!!bF(*PCJ!'fkX!!!#-!*!'@*F!!!93F(*PCJ!'&2B
!!!#0!*!'AHF!!!-5F(*PCJ!'LYS!!!#1!*!',4S!!!"LF(*PCJ!'*+N!!!#2!*!
',A`!!!!iF(*PCJ!',c8!!!#3!!#3"J-5!!!!$A"bC@B!"RSS!!!!N3#3"Kkq!!!
!&("bC@B!"K,&!!!!NJ#3"Kl5!!!!#R"bC@B!"UcN!!!!N`#3"N@8!!!!a("bC@B
!"`*Z!!!!P!#3"Q$j!!!"'("bC@B!"VCH!!!!P3#3"Q)4!!!!U("bC@B!"JmS!!!
!PJ#3"N50!!!!,R"bC@B!"Q#d!!!!P`#3"Q+j!!!#$("bC@B!"LF$!!!!Q!#3"Lf
d!!!!)R"bC@B!"TM(!!!!Q3#3"L4U!!!!%("bC@B!"TQ'!!!!QJ#3"Q6&!!!!'R"
bC@B!"Rf9!!!!Q`#3"Q6I!!!!NR"bC@B!"LNX!!!!R!#3"Q9a!!!!5R"bC@B!"N@
c!!!!R3#3"K`r!!!!'R"bC@B!"N#*!!!!RJ#3"Qmh!!!+B("bC@B!"PNH!!!!R`#
3"Rdh!!!'$("bC@B!"`Ki!!!!S!#3"S0$!!!@H("bC@B!"M*e!!!!S3#3"KaC!!!
""h"bC@B!"Z@E!!!!SJ#3"RQA!!!##("bC@B!"PHI!!!!S`#3"KeJ!!!!'("bC@B
!"V%J!!!!T!#3"Kei!!!!#R"bC@B!"Z#h!!!!T3#3"Kf#!!!!$R"bC@B!"MT#!!!
!TJ#3"LYZ!!!""R"bC@B!"`F!N!5R!*!',(3!!!!mF(*PCJ!'j-i!!!#S!*!'(C!
!!!!!$R"bC@B!"XJ2!!!!U3#3"TQl!!!"fR"bC@B!"R3F!!!!UJ#3"TZ9!!!$-R"
bC@B!"K-%!!!!U`#3"KfH!!!!$("bC@B!"Tak!!!!V!#3"Tl(!!!"%("bC@B!"Q'
1!!!!V3#3"KlU!!!!-R"bC@B!"YmM!!!!VJ#3"TrA!!!&8("bC@B!"X@c!!!!V`#
3"U8R!!!$%R"bC@B!"V`S!!!!X!#3"N6)!!!!BR"bC@B!"M'(!!!!X3#3"Lb`!!!
!1("bC@B!"ZR[!!!!XJ#3"KfU!!!!$A"bC@B!"S#J!!!!X`#3"L5&!!!!&("bC@B
!"X%T!!!!Y!#3"LhI!!!!#R"bC@B!"Ub%!!!!Y3#3"RZI!!!!a("bC@B!"P#l!!!
!YJ#3"UJj!!!"'("bC@B!"Q2r!!!!Y`#3"UP4!!!!U("bC@B!"KTN!!!!Z!#3"N8
U!!!!,R"bC@B!"Ylp!!!!Z3#3"URj!!!#$("bC@B!"Y*'!!!!ZJ#3"N9B!!!!)R"
bC@B!"MQE!!!!Z`#3"LhT!!!!%("bC@B!"NAI!!!![!#3"N9k!!!!'R"bC@B!"R1
J!!!![3#3"U`&!!!!NR"bC@B!"QEH!!!![J#3"UbA!!!!5R"bC@B!"XL)!!!![`#
3"J*S!!!!8'ecF'N!!!!"!*!++8)!!!"3EA0`D3!!!!)!N!M9r`!!:
# Very simple test - Parse a file and print what happens
import sys
import pyexpat
import sys
import os
class Outputter:
def __init__(self, verbose=0):
self.startcount = 0
self.endcount = 0
self.cdatacount = 0
self.instcount = 0
self.verbose = verbose
def startelt(self, name, attrs):
self.startcount = self.startcount + 1
if self.verbose:
print 'start', name
for i in range(0, len(attrs), 2):
print 'attr', attrs[i], attrs[i+1]
def endelt(self, name):
self.endcount = self.endcount + 1
if self.verbose:
print 'end', name
def cdata(self, data):
self.cdatacount = self.cdatacount + 1
if self.verbose:
print 'cdata', data
def inst(self, target, data):
self.instcount = self.instcount + 1
if self.verbose:
print 'inst', target, data
if len(sys.argv) > 1 and sys.argv[1] == '-v':
out = Outputter(verbose=1)
del sys.argv[1]
else:
out = Outputter()
if len(sys.argv) != 2:
if os.name == 'mac':
import macfs
fss, ok = macfs.StandardGetFile()
if not ok: sys.exit(0)
sys.argv.append(fss.as_pathname())
else:
print 'Usage: pyexpattest [-v] inputfile'
sys.exit(1)
parser = pyexpat.ParserCreate()
parser.StartElementHandler = out.startelt
parser.EndElementHandler = out.endelt
parser.CharacterDataHandler = out.cdata
parser.ProcessingInstructionHandler = out.inst
data = open(sys.argv[1]).read()
rv = parser.Parse(data, 1)
print 'Parser returned', rv
if rv == 0:
print '** Error', parser.ErrorCode
print '** Line', parser.ErrorLineNumber
print '** Column', parser.ErrorColumnNumber
print '** Byte', parser.ErrorByteIndex
print 'Summary of XML parser upcalls:'
print 'start elements:', out.startcount
print 'end elements:', out.endcount
print 'character data:', out.cdatacount
print 'processing instructions:', out.instcount
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment